+;;;; We call these "2byte" instructions due to their two opcode bytes.
+;;;; Intel and AMD call them three-byte instructions, as they count the
+;;;; 0x0f byte for determining the number of opcode bytes.
+
+;;; Instructions that take XMM-XMM/MEM and XMM-XMM/MEM-IMM arguments.
+
+(macrolet ((regular-2byte-sse-inst (name prefix op1 op2)
+ `(define-instruction ,name (segment dst src)
+ (:printer-list
+ ',(2byte-sse-inst-printer-list '2byte-xmm-xmm/mem prefix op1 op2))
+ (:emitter
+ (emit-regular-2byte-sse-inst segment dst src ,prefix ,op1 ,op2))))
+ (regular-2byte-sse-inst-imm (name prefix op1 op2)
+ `(define-instruction ,name (segment dst src imm)
+ (:printer-list
+ ',(2byte-sse-inst-printer-list '2byte-xmm-xmm/mem prefix op1 op2
+ :more-fields '((imm nil :type imm-byte))
+ :printer `(:name :tab reg ", " reg/mem ", " imm)))
+ (:emitter
+ (aver (typep imm '(unsigned-byte 8)))
+ (emit-regular-2byte-sse-inst segment dst src ,prefix ,op1 ,op2
+ :remaining-bytes 1)
+ (emit-byte segment imm)))))
+ (regular-2byte-sse-inst pshufb #x66 #x38 #x00)
+ (regular-2byte-sse-inst phaddw #x66 #x38 #x01)
+ (regular-2byte-sse-inst phaddd #x66 #x38 #x02)
+ (regular-2byte-sse-inst phaddsw #x66 #x38 #x03)
+ (regular-2byte-sse-inst pmaddubsw #x66 #x38 #x04)
+ (regular-2byte-sse-inst phsubw #x66 #x38 #x05)
+ (regular-2byte-sse-inst phsubd #x66 #x38 #x06)
+ (regular-2byte-sse-inst phsubsw #x66 #x38 #x07)
+ (regular-2byte-sse-inst psignb #x66 #x38 #x08)
+ (regular-2byte-sse-inst psignw #x66 #x38 #x09)
+ (regular-2byte-sse-inst psignd #x66 #x38 #x0a)
+ (regular-2byte-sse-inst pmulhrsw #x66 #x38 #x0b)
+
+ (regular-2byte-sse-inst ptest #x66 #x38 #x17)
+ (regular-2byte-sse-inst pabsb #x66 #x38 #x1c)
+ (regular-2byte-sse-inst pabsw #x66 #x38 #x1d)
+ (regular-2byte-sse-inst pabsd #x66 #x38 #x1e)
+
+ (regular-2byte-sse-inst pmuldq #x66 #x38 #x28)
+ (regular-2byte-sse-inst pcmpeqq #x66 #x38 #x29)
+ (regular-2byte-sse-inst packusdw #x66 #x38 #x2b)
+
+ (regular-2byte-sse-inst pcmpgtq #x66 #x38 #x37)
+ (regular-2byte-sse-inst pminsb #x66 #x38 #x38)
+ (regular-2byte-sse-inst pminsd #x66 #x38 #x39)
+ (regular-2byte-sse-inst pminuw #x66 #x38 #x3a)
+ (regular-2byte-sse-inst pminud #x66 #x38 #x3b)
+ (regular-2byte-sse-inst pmaxsb #x66 #x38 #x3c)
+ (regular-2byte-sse-inst pmaxsd #x66 #x38 #x3d)
+ (regular-2byte-sse-inst pmaxuw #x66 #x38 #x3e)
+ (regular-2byte-sse-inst pmaxud #x66 #x38 #x3f)
+
+ (regular-2byte-sse-inst pmulld #x66 #x38 #x40)
+ (regular-2byte-sse-inst phminposuw #x66 #x38 #x41)
+
+ (regular-2byte-sse-inst aesimc #x66 #x38 #xdb)
+ (regular-2byte-sse-inst aesenc #x66 #x38 #xdc)
+ (regular-2byte-sse-inst aesenclast #x66 #x38 #xdd)
+ (regular-2byte-sse-inst aesdec #x66 #x38 #xde)
+ (regular-2byte-sse-inst aesdeclast #x66 #x38 #xdf)
+
+ (regular-2byte-sse-inst pmovsxbw #x66 #x38 #x20)
+ (regular-2byte-sse-inst pmovsxbd #x66 #x38 #x21)
+ (regular-2byte-sse-inst pmovsxbq #x66 #x38 #x22)
+ (regular-2byte-sse-inst pmovsxwd #x66 #x38 #x23)
+ (regular-2byte-sse-inst pmovsxwq #x66 #x38 #x24)
+ (regular-2byte-sse-inst pmovsxdq #x66 #x38 #x25)
+
+ (regular-2byte-sse-inst pmovzxbw #x66 #x38 #x30)
+ (regular-2byte-sse-inst pmovzxbd #x66 #x38 #x31)
+ (regular-2byte-sse-inst pmovzxbq #x66 #x38 #x32)
+ (regular-2byte-sse-inst pmovzxwd #x66 #x38 #x33)
+ (regular-2byte-sse-inst pmovzxwq #x66 #x38 #x34)
+ (regular-2byte-sse-inst pmovzxdq #x66 #x38 #x35)
+
+ (regular-2byte-sse-inst-imm roundps #x66 #x3a #x08)
+ (regular-2byte-sse-inst-imm roundpd #x66 #x3a #x09)
+ (regular-2byte-sse-inst-imm roundss #x66 #x3a #x0a)
+ (regular-2byte-sse-inst-imm roundsd #x66 #x3a #x0b)
+ (regular-2byte-sse-inst-imm blendps #x66 #x3a #x0c)
+ (regular-2byte-sse-inst-imm blendpd #x66 #x3a #x0d)
+ (regular-2byte-sse-inst-imm pblendw #x66 #x3a #x0e)
+ (regular-2byte-sse-inst-imm palignr #x66 #x3a #x0f)
+ (regular-2byte-sse-inst-imm dpps #x66 #x3a #x40)
+ (regular-2byte-sse-inst-imm dppd #x66 #x3a #x41)
+
+ (regular-2byte-sse-inst-imm mpsadbw #x66 #x3a #x42)
+ (regular-2byte-sse-inst-imm pclmulqdq #x66 #x3a #x44)
+
+ (regular-2byte-sse-inst-imm pcmpestrm #x66 #x3a #x60)
+ (regular-2byte-sse-inst-imm pcmpestri #x66 #x3a #x61)
+ (regular-2byte-sse-inst-imm pcmpistrm #x66 #x3a #x62)
+ (regular-2byte-sse-inst-imm pcmpistri #x66 #x3a #x63)
+
+ (regular-2byte-sse-inst-imm aeskeygenassist #x66 #x3a #xdf))
+