1
0
mirror of https://github.com/golang/go synced 2024-11-23 20:40:07 -07:00

cmd/asm: add requested amd64 instructions

Add amd64 instructions I promised to add for Go 1.6
at the beginning of January.

These may be the last instructions added by hand.
I intend to generate the whole set mechanically for Go 1.7.

Fixes #13822.

Change-Id: I8c6bae2efd25f717f9ec750402e50f408a911d2b
Reviewed-on: https://go-review.googlesource.com/18853
Reviewed-by: Rob Pike <r@golang.org>
This commit is contained in:
Russ Cox 2016-01-23 22:50:58 -05:00
parent 8d881b811d
commit 863d9b66f8
6 changed files with 239 additions and 149 deletions

View File

@ -162,11 +162,11 @@ func archX86(linkArch *obj.LinkArch) *Arch {
instructions["MOVDQ2Q"] = x86.AMOVQ instructions["MOVDQ2Q"] = x86.AMOVQ
instructions["MOVNTDQ"] = x86.AMOVNTO instructions["MOVNTDQ"] = x86.AMOVNTO
instructions["MOVOA"] = x86.AMOVO instructions["MOVOA"] = x86.AMOVO
instructions["MOVOA"] = x86.AMOVO
instructions["PF2ID"] = x86.APF2IL instructions["PF2ID"] = x86.APF2IL
instructions["PI2FD"] = x86.API2FL instructions["PI2FD"] = x86.API2FL
instructions["PSLLDQ"] = x86.APSLLO instructions["PSLLDQ"] = x86.APSLLO
instructions["PSRLDQ"] = x86.APSRLO instructions["PSRLDQ"] = x86.APSRLO
instructions["PADDD"] = x86.APADDL
return &Arch{ return &Arch{
LinkArch: linkArch, LinkArch: linkArch,

View File

@ -121,5 +121,11 @@ label:
loop: loop:
LOOP loop // LOOP LOOP loop // LOOP
// Intel pseudonyms for our own renamings.
PADDD M2, M1 // PADDL M2, M1
MOVDQ2Q X1, M1 // MOVQ X1, M1
MOVNTDQ X1, (AX) // MOVNTO X1, (AX)
MOVOA (AX), X1 // MOVO (AX), X1
// LTYPE0 nonnon { outcode($1, &$2); } // LTYPE0 nonnon { outcode($1, &$2); }
RET // c3 RET // c3

View File

@ -2148,10 +2148,10 @@ TEXT asmtest(SB),7,$0
//TODO: LARQ (R11), R11 // 4d0f021b //TODO: LARQ (R11), R11 // 4d0f021b
//TODO: LARQ DX, R11 // 4c0f02da //TODO: LARQ DX, R11 // 4c0f02da
//TODO: LARQ R11, R11 // 4d0f02db //TODO: LARQ R11, R11 // 4d0f02db
//TODO: LDDQU (BX), X2 // f20ff013 LDDQU (BX), X2 // f20ff013
//TODO: LDDQU (R11), X2 // f2410ff013 LDDQU (R11), X2 // f2410ff013
//TODO: LDDQU (BX), X11 // f2440ff01b LDDQU (BX), X11 // f2440ff01b
//TODO: LDDQU (R11), X11 // f2450ff01b LDDQU (R11), X11 // f2450ff01b
LDMXCSR (BX) // 0fae13 LDMXCSR (BX) // 0fae13
LDMXCSR (R11) // 410fae13 LDMXCSR (R11) // 410fae13
LEAW (BX), DX // 668d13 LEAW (BX), DX // 668d13
@ -3621,22 +3621,22 @@ TEXT asmtest(SB),7,$0
//TODO: PEXTRW $7, X11, (BX) // 66440f3a151b07 //TODO: PEXTRW $7, X11, (BX) // 66440f3a151b07
//TODO: PEXTRW $7, X2, (R11) // 66410f3a151307 //TODO: PEXTRW $7, X2, (R11) // 66410f3a151307
//TODO: PEXTRW $7, X11, (R11) // 66450f3a151b07 //TODO: PEXTRW $7, X11, (R11) // 66450f3a151b07
//TODO: PHADDD (BX), M2 // 0f380213 PHADDD (BX), M2 // 0f380213
//TODO: PHADDD (R11), M2 // 410f380213 PHADDD (R11), M2 // 410f380213
//TODO: PHADDD M2, M2 // 0f3802d2 PHADDD M2, M2 // 0f3802d2
//TODO: PHADDD M3, M2 // 0f3802d3 PHADDD M3, M2 // 0f3802d3
//TODO: PHADDD (BX), M3 // 0f38021b PHADDD (BX), M3 // 0f38021b
//TODO: PHADDD (R11), M3 // 410f38021b PHADDD (R11), M3 // 410f38021b
//TODO: PHADDD M2, M3 // 0f3802da PHADDD M2, M3 // 0f3802da
//TODO: PHADDD M3, M3 // 0f3802db PHADDD M3, M3 // 0f3802db
//TODO: PHADDD (BX), X2 // 660f380213 PHADDD (BX), X2 // 660f380213
//TODO: PHADDD (R11), X2 // 66410f380213 PHADDD (R11), X2 // 66410f380213
//TODO: PHADDD X2, X2 // 660f3802d2 PHADDD X2, X2 // 660f3802d2
//TODO: PHADDD X11, X2 // 66410f3802d3 PHADDD X11, X2 // 66410f3802d3
//TODO: PHADDD (BX), X11 // 66440f38021b PHADDD (BX), X11 // 66440f38021b
//TODO: PHADDD (R11), X11 // 66450f38021b PHADDD (R11), X11 // 66450f38021b
//TODO: PHADDD X2, X11 // 66440f3802da PHADDD X2, X11 // 66440f3802da
//TODO: PHADDD X11, X11 // 66450f3802db PHADDD X11, X11 // 66450f3802db
//TODO: PHADDSW (BX), M2 // 0f380313 //TODO: PHADDSW (BX), M2 // 0f380313
//TODO: PHADDSW (R11), M2 // 410f380313 //TODO: PHADDSW (R11), M2 // 410f380313
//TODO: PHADDSW M2, M2 // 0f3803d2 //TODO: PHADDSW M2, M2 // 0f3803d2
@ -3933,110 +3933,110 @@ TEXT asmtest(SB),7,$0
PMOVMSKB X11, DX // 66410fd7d3 PMOVMSKB X11, DX // 66410fd7d3
PMOVMSKB X2, R11 // 66440fd7da PMOVMSKB X2, R11 // 66440fd7da
PMOVMSKB X11, R11 // 66450fd7db PMOVMSKB X11, R11 // 66450fd7db
//TODO: PMOVSXBD (BX), X2 // 660f382113 PMOVSXBD (BX), X2 // 660f382113
//TODO: PMOVSXBD (R11), X2 // 66410f382113 PMOVSXBD (R11), X2 // 66410f382113
//TODO: PMOVSXBD X2, X2 // 660f3821d2 PMOVSXBD X2, X2 // 660f3821d2
//TODO: PMOVSXBD X11, X2 // 66410f3821d3 PMOVSXBD X11, X2 // 66410f3821d3
//TODO: PMOVSXBD (BX), X11 // 66440f38211b PMOVSXBD (BX), X11 // 66440f38211b
//TODO: PMOVSXBD (R11), X11 // 66450f38211b PMOVSXBD (R11), X11 // 66450f38211b
//TODO: PMOVSXBD X2, X11 // 66440f3821da PMOVSXBD X2, X11 // 66440f3821da
//TODO: PMOVSXBD X11, X11 // 66450f3821db PMOVSXBD X11, X11 // 66450f3821db
//TODO: PMOVSXBQ (BX), X2 // 660f382213 PMOVSXBQ (BX), X2 // 660f382213
//TODO: PMOVSXBQ (R11), X2 // 66410f382213 PMOVSXBQ (R11), X2 // 66410f382213
//TODO: PMOVSXBQ X2, X2 // 660f3822d2 PMOVSXBQ X2, X2 // 660f3822d2
//TODO: PMOVSXBQ X11, X2 // 66410f3822d3 PMOVSXBQ X11, X2 // 66410f3822d3
//TODO: PMOVSXBQ (BX), X11 // 66440f38221b PMOVSXBQ (BX), X11 // 66440f38221b
//TODO: PMOVSXBQ (R11), X11 // 66450f38221b PMOVSXBQ (R11), X11 // 66450f38221b
//TODO: PMOVSXBQ X2, X11 // 66440f3822da PMOVSXBQ X2, X11 // 66440f3822da
//TODO: PMOVSXBQ X11, X11 // 66450f3822db PMOVSXBQ X11, X11 // 66450f3822db
//TODO: PMOVSXBW (BX), X2 // 660f382013 PMOVSXBW (BX), X2 // 660f382013
//TODO: PMOVSXBW (R11), X2 // 66410f382013 PMOVSXBW (R11), X2 // 66410f382013
//TODO: PMOVSXBW X2, X2 // 660f3820d2 PMOVSXBW X2, X2 // 660f3820d2
//TODO: PMOVSXBW X11, X2 // 66410f3820d3 PMOVSXBW X11, X2 // 66410f3820d3
//TODO: PMOVSXBW (BX), X11 // 66440f38201b PMOVSXBW (BX), X11 // 66440f38201b
//TODO: PMOVSXBW (R11), X11 // 66450f38201b PMOVSXBW (R11), X11 // 66450f38201b
//TODO: PMOVSXBW X2, X11 // 66440f3820da PMOVSXBW X2, X11 // 66440f3820da
//TODO: PMOVSXBW X11, X11 // 66450f3820db PMOVSXBW X11, X11 // 66450f3820db
//TODO: PMOVSXDQ (BX), X2 // 660f382513 PMOVSXDQ (BX), X2 // 660f382513
//TODO: PMOVSXDQ (R11), X2 // 66410f382513 PMOVSXDQ (R11), X2 // 66410f382513
//TODO: PMOVSXDQ X2, X2 // 660f3825d2 PMOVSXDQ X2, X2 // 660f3825d2
//TODO: PMOVSXDQ X11, X2 // 66410f3825d3 PMOVSXDQ X11, X2 // 66410f3825d3
//TODO: PMOVSXDQ (BX), X11 // 66440f38251b PMOVSXDQ (BX), X11 // 66440f38251b
//TODO: PMOVSXDQ (R11), X11 // 66450f38251b PMOVSXDQ (R11), X11 // 66450f38251b
//TODO: PMOVSXDQ X2, X11 // 66440f3825da PMOVSXDQ X2, X11 // 66440f3825da
//TODO: PMOVSXDQ X11, X11 // 66450f3825db PMOVSXDQ X11, X11 // 66450f3825db
//TODO: PMOVSXWD (BX), X2 // 660f382313 PMOVSXWD (BX), X2 // 660f382313
//TODO: PMOVSXWD (R11), X2 // 66410f382313 PMOVSXWD (R11), X2 // 66410f382313
//TODO: PMOVSXWD X2, X2 // 660f3823d2 PMOVSXWD X2, X2 // 660f3823d2
//TODO: PMOVSXWD X11, X2 // 66410f3823d3 PMOVSXWD X11, X2 // 66410f3823d3
//TODO: PMOVSXWD (BX), X11 // 66440f38231b PMOVSXWD (BX), X11 // 66440f38231b
//TODO: PMOVSXWD (R11), X11 // 66450f38231b PMOVSXWD (R11), X11 // 66450f38231b
//TODO: PMOVSXWD X2, X11 // 66440f3823da PMOVSXWD X2, X11 // 66440f3823da
//TODO: PMOVSXWD X11, X11 // 66450f3823db PMOVSXWD X11, X11 // 66450f3823db
//TODO: PMOVSXWQ (BX), X2 // 660f382413 PMOVSXWQ (BX), X2 // 660f382413
//TODO: PMOVSXWQ (R11), X2 // 66410f382413 PMOVSXWQ (R11), X2 // 66410f382413
//TODO: PMOVSXWQ X2, X2 // 660f3824d2 PMOVSXWQ X2, X2 // 660f3824d2
//TODO: PMOVSXWQ X11, X2 // 66410f3824d3 PMOVSXWQ X11, X2 // 66410f3824d3
//TODO: PMOVSXWQ (BX), X11 // 66440f38241b PMOVSXWQ (BX), X11 // 66440f38241b
//TODO: PMOVSXWQ (R11), X11 // 66450f38241b PMOVSXWQ (R11), X11 // 66450f38241b
//TODO: PMOVSXWQ X2, X11 // 66440f3824da PMOVSXWQ X2, X11 // 66440f3824da
//TODO: PMOVSXWQ X11, X11 // 66450f3824db PMOVSXWQ X11, X11 // 66450f3824db
//TODO: PMOVZXBD (BX), X2 // 660f383113 PMOVZXBD (BX), X2 // 660f383113
//TODO: PMOVZXBD (R11), X2 // 66410f383113 PMOVZXBD (R11), X2 // 66410f383113
//TODO: PMOVZXBD X2, X2 // 660f3831d2 PMOVZXBD X2, X2 // 660f3831d2
//TODO: PMOVZXBD X11, X2 // 66410f3831d3 PMOVZXBD X11, X2 // 66410f3831d3
//TODO: PMOVZXBD (BX), X11 // 66440f38311b PMOVZXBD (BX), X11 // 66440f38311b
//TODO: PMOVZXBD (R11), X11 // 66450f38311b PMOVZXBD (R11), X11 // 66450f38311b
//TODO: PMOVZXBD X2, X11 // 66440f3831da PMOVZXBD X2, X11 // 66440f3831da
//TODO: PMOVZXBD X11, X11 // 66450f3831db PMOVZXBD X11, X11 // 66450f3831db
//TODO: PMOVZXBQ (BX), X2 // 660f383213 PMOVZXBQ (BX), X2 // 660f383213
//TODO: PMOVZXBQ (R11), X2 // 66410f383213 PMOVZXBQ (R11), X2 // 66410f383213
//TODO: PMOVZXBQ X2, X2 // 660f3832d2 PMOVZXBQ X2, X2 // 660f3832d2
//TODO: PMOVZXBQ X11, X2 // 66410f3832d3 PMOVZXBQ X11, X2 // 66410f3832d3
//TODO: PMOVZXBQ (BX), X11 // 66440f38321b PMOVZXBQ (BX), X11 // 66440f38321b
//TODO: PMOVZXBQ (R11), X11 // 66450f38321b PMOVZXBQ (R11), X11 // 66450f38321b
//TODO: PMOVZXBQ X2, X11 // 66440f3832da PMOVZXBQ X2, X11 // 66440f3832da
//TODO: PMOVZXBQ X11, X11 // 66450f3832db PMOVZXBQ X11, X11 // 66450f3832db
//TODO: PMOVZXBW (BX), X2 // 660f383013 PMOVZXBW (BX), X2 // 660f383013
//TODO: PMOVZXBW (R11), X2 // 66410f383013 PMOVZXBW (R11), X2 // 66410f383013
//TODO: PMOVZXBW X2, X2 // 660f3830d2 PMOVZXBW X2, X2 // 660f3830d2
//TODO: PMOVZXBW X11, X2 // 66410f3830d3 PMOVZXBW X11, X2 // 66410f3830d3
//TODO: PMOVZXBW (BX), X11 // 66440f38301b PMOVZXBW (BX), X11 // 66440f38301b
//TODO: PMOVZXBW (R11), X11 // 66450f38301b PMOVZXBW (R11), X11 // 66450f38301b
//TODO: PMOVZXBW X2, X11 // 66440f3830da PMOVZXBW X2, X11 // 66440f3830da
//TODO: PMOVZXBW X11, X11 // 66450f3830db PMOVZXBW X11, X11 // 66450f3830db
//TODO: PMOVZXDQ (BX), X2 // 660f383513 PMOVZXDQ (BX), X2 // 660f383513
//TODO: PMOVZXDQ (R11), X2 // 66410f383513 PMOVZXDQ (R11), X2 // 66410f383513
//TODO: PMOVZXDQ X2, X2 // 660f3835d2 PMOVZXDQ X2, X2 // 660f3835d2
//TODO: PMOVZXDQ X11, X2 // 66410f3835d3 PMOVZXDQ X11, X2 // 66410f3835d3
//TODO: PMOVZXDQ (BX), X11 // 66440f38351b PMOVZXDQ (BX), X11 // 66440f38351b
//TODO: PMOVZXDQ (R11), X11 // 66450f38351b PMOVZXDQ (R11), X11 // 66450f38351b
//TODO: PMOVZXDQ X2, X11 // 66440f3835da PMOVZXDQ X2, X11 // 66440f3835da
//TODO: PMOVZXDQ X11, X11 // 66450f3835db PMOVZXDQ X11, X11 // 66450f3835db
//TODO: PMOVZXWD (BX), X2 // 660f383313 PMOVZXWD (BX), X2 // 660f383313
//TODO: PMOVZXWD (R11), X2 // 66410f383313 PMOVZXWD (R11), X2 // 66410f383313
//TODO: PMOVZXWD X2, X2 // 660f3833d2 PMOVZXWD X2, X2 // 660f3833d2
//TODO: PMOVZXWD X11, X2 // 66410f3833d3 PMOVZXWD X11, X2 // 66410f3833d3
//TODO: PMOVZXWD (BX), X11 // 66440f38331b PMOVZXWD (BX), X11 // 66440f38331b
//TODO: PMOVZXWD (R11), X11 // 66450f38331b PMOVZXWD (R11), X11 // 66450f38331b
//TODO: PMOVZXWD X2, X11 // 66440f3833da PMOVZXWD X2, X11 // 66440f3833da
//TODO: PMOVZXWD X11, X11 // 66450f3833db PMOVZXWD X11, X11 // 66450f3833db
//TODO: PMOVZXWQ (BX), X2 // 660f383413 PMOVZXWQ (BX), X2 // 660f383413
//TODO: PMOVZXWQ (R11), X2 // 66410f383413 PMOVZXWQ (R11), X2 // 66410f383413
//TODO: PMOVZXWQ X2, X2 // 660f3834d2 PMOVZXWQ X2, X2 // 660f3834d2
//TODO: PMOVZXWQ X11, X2 // 66410f3834d3 PMOVZXWQ X11, X2 // 66410f3834d3
//TODO: PMOVZXWQ (BX), X11 // 66440f38341b PMOVZXWQ (BX), X11 // 66440f38341b
//TODO: PMOVZXWQ (R11), X11 // 66450f38341b PMOVZXWQ (R11), X11 // 66450f38341b
//TODO: PMOVZXWQ X2, X11 // 66440f3834da PMOVZXWQ X2, X11 // 66440f3834da
//TODO: PMOVZXWQ X11, X11 // 66450f3834db PMOVZXWQ X11, X11 // 66450f3834db
//TODO: PMULDQ (BX), X2 // 660f382813 PMULDQ (BX), X2 // 660f382813
//TODO: PMULDQ (R11), X2 // 66410f382813 PMULDQ (R11), X2 // 66410f382813
//TODO: PMULDQ X2, X2 // 660f3828d2 PMULDQ X2, X2 // 660f3828d2
//TODO: PMULDQ X11, X2 // 66410f3828d3 PMULDQ X11, X2 // 66410f3828d3
//TODO: PMULDQ (BX), X11 // 66440f38281b PMULDQ (BX), X11 // 66440f38281b
//TODO: PMULDQ (R11), X11 // 66450f38281b PMULDQ (R11), X11 // 66450f38281b
//TODO: PMULDQ X2, X11 // 66440f3828da PMULDQ X2, X11 // 66440f3828da
//TODO: PMULDQ X11, X11 // 66450f3828db PMULDQ X11, X11 // 66450f3828db
//TODO: PMULHRSW (BX), M2 // 0f380b13 //TODO: PMULHRSW (BX), M2 // 0f380b13
//TODO: PMULHRSW (R11), M2 // 410f380b13 //TODO: PMULHRSW (R11), M2 // 410f380b13
//TODO: PMULHRSW M2, M2 // 0f380bd2 //TODO: PMULHRSW M2, M2 // 0f380bd2
@ -4085,14 +4085,14 @@ TEXT asmtest(SB),7,$0
PMULHW (R11), X11 // 66450fe51b PMULHW (R11), X11 // 66450fe51b
PMULHW X2, X11 // 66440fe5da PMULHW X2, X11 // 66440fe5da
PMULHW X11, X11 // 66450fe5db PMULHW X11, X11 // 66450fe5db
//TODO: PMULLD (BX), X2 // 660f384013 PMULLD (BX), X2 // 660f384013
//TODO: PMULLD (R11), X2 // 66410f384013 PMULLD (R11), X2 // 66410f384013
//TODO: PMULLD X2, X2 // 660f3840d2 PMULLD X2, X2 // 660f3840d2
//TODO: PMULLD X11, X2 // 66410f3840d3 PMULLD X11, X2 // 66410f3840d3
//TODO: PMULLD (BX), X11 // 66440f38401b PMULLD (BX), X11 // 66440f38401b
//TODO: PMULLD (R11), X11 // 66450f38401b PMULLD (R11), X11 // 66450f38401b
//TODO: PMULLD X2, X11 // 66440f3840da PMULLD X2, X11 // 66440f3840da
//TODO: PMULLD X11, X11 // 66450f3840db PMULLD X11, X11 // 66450f3840db
PMULLW (BX), M2 // 0fd513 PMULLW (BX), M2 // 0fd513
PMULLW (R11), M2 // 410fd513 PMULLW (R11), M2 // 410fd513
PMULLW M2, M2 // 0fd5d2 PMULLW M2, M2 // 0fd5d2

View File

@ -601,15 +601,15 @@ const (
APADDUSB APADDUSB
APADDUSW APADDUSW
APADDW APADDW
APAND
APANDB APANDB
APANDL APANDL
APANDN
APANDSB APANDSB
APANDSW APANDSW
APANDUSB APANDUSB
APANDUSW APANDUSW
APANDW APANDW
APAND
APANDN
APAVGB APAVGB
APAVGW APAVGW
APCMPEQB APCMPEQB
@ -618,10 +618,10 @@ const (
APCMPGTB APCMPGTB
APCMPGTL APCMPGTL
APCMPGTW APCMPGTW
APEXTRW
APEXTRB APEXTRB
APEXTRD APEXTRD
APEXTRQ APEXTRQ
APEXTRW
APFACC APFACC
APFADD APFADD
APFCMPEQ APFCMPEQ
@ -633,42 +633,63 @@ const (
APFNACC APFNACC
APFPNACC APFPNACC
APFRCP APFRCP
APFRCPIT1
APFRCPI2T APFRCPI2T
APFRCPIT1
APFRSQIT1 APFRSQIT1
APFRSQRT APFRSQRT
APFSUB APFSUB
APFSUBR APFSUBR
APINSRW APHADDD
APHADDSW
APHADDW
APHMINPOSUW
APHSUBD
APHSUBSW
APHSUBW
APINSRB APINSRB
APINSRD APINSRD
APINSRQ APINSRQ
APINSRW
APMADDWL APMADDWL
APMAXSW APMAXSW
APMAXUB APMAXUB
APMINSW APMINSW
APMINUB APMINUB
APMOVMSKB APMOVMSKB
APMOVSXBD
APMOVSXBQ
APMOVSXBW
APMOVSXDQ
APMOVSXWD
APMOVSXWQ
APMOVZXBD
APMOVZXBQ
APMOVZXBW
APMOVZXDQ
APMOVZXWD
APMOVZXWQ
APMULDQ
APMULHRW APMULHRW
APMULHUW APMULHUW
APMULHW APMULHW
APMULLD
APMULLW APMULLW
APMULULQ APMULULQ
APOR APOR
APSADBW APSADBW
APSHUFB
APSHUFHW APSHUFHW
APSHUFL APSHUFL
APSHUFLW APSHUFLW
APSHUFW APSHUFW
APSHUFB
APSLLO
APSLLL APSLLL
APSLLO
APSLLQ APSLLQ
APSLLW APSLLW
APSRAL APSRAL
APSRAW APSRAW
APSRLO
APSRLL APSRLL
APSRLO
APSRLQ APSRLQ
APSRLW APSRLW
APSUBB APSUBB

View File

@ -550,15 +550,15 @@ var Anames = []string{
"PADDUSB", "PADDUSB",
"PADDUSW", "PADDUSW",
"PADDW", "PADDW",
"PAND",
"PANDB", "PANDB",
"PANDL", "PANDL",
"PANDN",
"PANDSB", "PANDSB",
"PANDSW", "PANDSW",
"PANDUSB", "PANDUSB",
"PANDUSW", "PANDUSW",
"PANDW", "PANDW",
"PAND",
"PANDN",
"PAVGB", "PAVGB",
"PAVGW", "PAVGW",
"PCMPEQB", "PCMPEQB",
@ -567,10 +567,10 @@ var Anames = []string{
"PCMPGTB", "PCMPGTB",
"PCMPGTL", "PCMPGTL",
"PCMPGTW", "PCMPGTW",
"PEXTRW",
"PEXTRB", "PEXTRB",
"PEXTRD", "PEXTRD",
"PEXTRQ", "PEXTRQ",
"PEXTRW",
"PFACC", "PFACC",
"PFADD", "PFADD",
"PFCMPEQ", "PFCMPEQ",
@ -582,42 +582,63 @@ var Anames = []string{
"PFNACC", "PFNACC",
"PFPNACC", "PFPNACC",
"PFRCP", "PFRCP",
"PFRCPIT1",
"PFRCPI2T", "PFRCPI2T",
"PFRCPIT1",
"PFRSQIT1", "PFRSQIT1",
"PFRSQRT", "PFRSQRT",
"PFSUB", "PFSUB",
"PFSUBR", "PFSUBR",
"PINSRW", "PHADDD",
"PHADDSW",
"PHADDW",
"PHMINPOSUW",
"PHSUBD",
"PHSUBSW",
"PHSUBW",
"PINSRB", "PINSRB",
"PINSRD", "PINSRD",
"PINSRQ", "PINSRQ",
"PINSRW",
"PMADDWL", "PMADDWL",
"PMAXSW", "PMAXSW",
"PMAXUB", "PMAXUB",
"PMINSW", "PMINSW",
"PMINUB", "PMINUB",
"PMOVMSKB", "PMOVMSKB",
"PMOVSXBD",
"PMOVSXBQ",
"PMOVSXBW",
"PMOVSXDQ",
"PMOVSXWD",
"PMOVSXWQ",
"PMOVZXBD",
"PMOVZXBQ",
"PMOVZXBW",
"PMOVZXDQ",
"PMOVZXWD",
"PMOVZXWQ",
"PMULDQ",
"PMULHRW", "PMULHRW",
"PMULHUW", "PMULHUW",
"PMULHW", "PMULHW",
"PMULLD",
"PMULLW", "PMULLW",
"PMULULQ", "PMULULQ",
"POR", "POR",
"PSADBW", "PSADBW",
"PSHUFB",
"PSHUFHW", "PSHUFHW",
"PSHUFL", "PSHUFL",
"PSHUFLW", "PSHUFLW",
"PSHUFW", "PSHUFW",
"PSHUFB",
"PSLLO",
"PSLLL", "PSLLL",
"PSLLO",
"PSLLQ", "PSLLQ",
"PSLLW", "PSLLW",
"PSRAL", "PSRAL",
"PSRAW", "PSRAW",
"PSRLO",
"PSRLL", "PSRLL",
"PSRLO",
"PSRLQ", "PSRLQ",
"PSRLW", "PSRLW",
"PSUBB", "PSUBB",

View File

@ -222,6 +222,7 @@ const (
Pf3 = 0xf3 /* xmm escape 2: f3 0f */ Pf3 = 0xf3 /* xmm escape 2: f3 0f */
Pef3 = 0xf5 /* xmm escape 2 with 16-bit prefix: 66 f3 0f */ Pef3 = 0xf5 /* xmm escape 2 with 16-bit prefix: 66 f3 0f */
Pq3 = 0x67 /* xmm escape 3: 66 48 0f */ Pq3 = 0x67 /* xmm escape 3: 66 48 0f */
Pq4 = 0x68 /* xmm escape 4: 66 0F 38 */
Pfw = 0xf4 /* Pf3 with Rex.w: f3 48 0f */ Pfw = 0xf4 /* Pf3 with Rex.w: f3 48 0f */
Pw = 0x48 /* Rex.w */ Pw = 0x48 /* Rex.w */
Pw8 = 0x90 // symbolic; exact value doesn't matter Pw8 = 0x90 // symbolic; exact value doesn't matter
@ -675,6 +676,10 @@ var yxm = []ytab{
{Yxm, Ynone, Yxr, Zm_r_xm, 1}, {Yxm, Ynone, Yxr, Zm_r_xm, 1},
} }
var yxm_q4 = []ytab{
{Yxm, Ynone, Yxr, Zm_r, 1},
}
var yxcvm1 = []ytab{ var yxcvm1 = []ytab{
{Yxm, Ynone, Yxr, Zm_r_xm, 2}, {Yxm, Ynone, Yxr, Zm_r_xm, 2},
{Yxm, Ynone, Ymr, Zm_r_xm, 2}, {Yxm, Ynone, Ymr, Zm_r_xm, 2},
@ -817,6 +822,10 @@ var yxabort = []ytab{
{Yu8, Ynone, Ynone, Zib_, 1}, {Yu8, Ynone, Ynone, Zib_, 1},
} }
var ylddqu = []ytab{
{Ym, Ynone, Yxr, Zm_r, 1},
}
// VEX instructions that come in two forms: // VEX instructions that come in two forms:
// VTHING xmm2/m128, xmmV, xmm1 // VTHING xmm2/m128, xmmV, xmm1
// VTHING ymm2/m256, ymmV, ymm1 // VTHING ymm2/m256, ymmV, ymm1
@ -873,6 +882,11 @@ var yvex_xxmyxm = []ytab{
{Yyr, Ynone, Yxm, Zvex_r_v_rm, 2}, {Yyr, Ynone, Yxm, Zvex_r_v_rm, 2},
} }
var ymmxmm0f38 = []ytab{
{Ymm, Ynone, Ymr, Zlitm_r, 3},
{Yxm, Ynone, Yxr, Zlitm_r, 5},
}
/* /*
* You are doasm, holding in your hand a Prog* with p->as set to, say, ACRC32, * You are doasm, holding in your hand a Prog* with p->as set to, say, ACRC32,
* and p->from and p->to as operands (Addr*). The linker scans optab to find * and p->from and p->to as operands (Addr*). The linker scans optab to find
@ -1149,6 +1163,7 @@ var optab =
{ALAHF, ynone, Px, [23]uint8{0x9f}}, {ALAHF, ynone, Px, [23]uint8{0x9f}},
{ALARL, yml_rl, Pm, [23]uint8{0x02}}, {ALARL, yml_rl, Pm, [23]uint8{0x02}},
{ALARW, yml_rl, Pq, [23]uint8{0x02}}, {ALARW, yml_rl, Pq, [23]uint8{0x02}},
{ALDDQU, ylddqu, Pf2, [23]uint8{0xf0}},
{ALDMXCSR, ysvrs, Pm, [23]uint8{0xae, 02, 0xae, 02}}, {ALDMXCSR, ysvrs, Pm, [23]uint8{0xae, 02, 0xae, 02}},
{ALEAL, ym_rl, Px, [23]uint8{0x8d}}, {ALEAL, ym_rl, Px, [23]uint8{0x8d}},
{ALEAQ, ym_rl, Pw, [23]uint8{0x8d}}, {ALEAQ, ym_rl, Pw, [23]uint8{0x8d}},
@ -1293,6 +1308,13 @@ var optab =
{APFRSQRT, ymfp, Px, [23]uint8{0x97}}, {APFRSQRT, ymfp, Px, [23]uint8{0x97}},
{APFSUB, ymfp, Px, [23]uint8{0x9a}}, {APFSUB, ymfp, Px, [23]uint8{0x9a}},
{APFSUBR, ymfp, Px, [23]uint8{0xaa}}, {APFSUBR, ymfp, Px, [23]uint8{0xaa}},
{APHADDD, ymmxmm0f38, Px, [23]uint8{0x0F, 0x38, 0x02, 0, 0x66, 0x0F, 0x38, 0x02, 0}},
{APHADDSW, yxm_q4, Pq4, [23]uint8{0x03}},
{APHADDW, yxm_q4, Pq4, [23]uint8{0x01}},
{APHMINPOSUW, yxm_q4, Pq4, [23]uint8{0x41}},
{APHSUBD, yxm_q4, Pq4, [23]uint8{0x06}},
{APHSUBSW, yxm_q4, Pq4, [23]uint8{0x07}},
{APHSUBW, yxm_q4, Pq4, [23]uint8{0x05}},
{APINSRW, yinsrw, Pq, [23]uint8{0xc4, 00}}, {APINSRW, yinsrw, Pq, [23]uint8{0xc4, 00}},
{APINSRB, yinsr, Pq, [23]uint8{0x3a, 0x20, 00}}, {APINSRB, yinsr, Pq, [23]uint8{0x3a, 0x20, 00}},
{APINSRD, yinsr, Pq, [23]uint8{0x3a, 0x22, 00}}, {APINSRD, yinsr, Pq, [23]uint8{0x3a, 0x22, 00}},
@ -1303,9 +1325,23 @@ var optab =
{APMINSW, yxm, Pe, [23]uint8{0xea}}, {APMINSW, yxm, Pe, [23]uint8{0xea}},
{APMINUB, yxm, Pe, [23]uint8{0xda}}, {APMINUB, yxm, Pe, [23]uint8{0xda}},
{APMOVMSKB, ymskb, Px, [23]uint8{Pe, 0xd7, 0xd7}}, {APMOVMSKB, ymskb, Px, [23]uint8{Pe, 0xd7, 0xd7}},
{APMOVSXBD, yxm_q4, Pq4, [23]uint8{0x21}},
{APMOVSXBQ, yxm_q4, Pq4, [23]uint8{0x22}},
{APMOVSXBW, yxm_q4, Pq4, [23]uint8{0x20}},
{APMOVSXDQ, yxm_q4, Pq4, [23]uint8{0x25}},
{APMOVSXWD, yxm_q4, Pq4, [23]uint8{0x23}},
{APMOVSXWQ, yxm_q4, Pq4, [23]uint8{0x24}},
{APMOVZXBD, yxm_q4, Pq4, [23]uint8{0x31}},
{APMOVZXBQ, yxm_q4, Pq4, [23]uint8{0x32}},
{APMOVZXBW, yxm_q4, Pq4, [23]uint8{0x30}},
{APMOVZXDQ, yxm_q4, Pq4, [23]uint8{0x35}},
{APMOVZXWD, yxm_q4, Pq4, [23]uint8{0x33}},
{APMOVZXWQ, yxm_q4, Pq4, [23]uint8{0x34}},
{APMULDQ, yxm_q4, Pq4, [23]uint8{0x28}},
{APMULHRW, ymfp, Px, [23]uint8{0xb7}}, {APMULHRW, ymfp, Px, [23]uint8{0xb7}},
{APMULHUW, ymm, Py1, [23]uint8{0xe4, Pe, 0xe4}}, {APMULHUW, ymm, Py1, [23]uint8{0xe4, Pe, 0xe4}},
{APMULHW, ymm, Py1, [23]uint8{0xe5, Pe, 0xe5}}, {APMULHW, ymm, Py1, [23]uint8{0xe5, Pe, 0xe5}},
{APMULLD, yxm_q4, Pq4, [23]uint8{0x40}},
{APMULLW, ymm, Py1, [23]uint8{0xd5, Pe, 0xd5}}, {APMULLW, ymm, Py1, [23]uint8{0xd5, Pe, 0xd5}},
{APMULULQ, ymm, Py1, [23]uint8{0xf4, Pe, 0xf4}}, {APMULULQ, ymm, Py1, [23]uint8{0xf4, Pe, 0xf4}},
{APOPAL, ynone, P32, [23]uint8{0x61}}, {APOPAL, ynone, P32, [23]uint8{0x61}},
@ -3292,6 +3328,12 @@ func doasm(ctxt *obj.Link, p *obj.Prog) {
ctxt.Andptr[0] = Pm ctxt.Andptr[0] = Pm
ctxt.Andptr = ctxt.Andptr[1:] ctxt.Andptr = ctxt.Andptr[1:]
case Pq4: /* 66 0F 38 */
ctxt.Andptr[0] = 0x66
ctxt.Andptr[1] = 0x0F
ctxt.Andptr[2] = 0x38
ctxt.Andptr = ctxt.Andptr[3:]
case Pf2, /* xmm opcode escape */ case Pf2, /* xmm opcode escape */
Pf3: Pf3:
ctxt.Andptr[0] = byte(o.prefix) ctxt.Andptr[0] = byte(o.prefix)