55 lines
1.4 KiB
PHP
55 lines
1.4 KiB
PHP
|
|
||
|
include 'sse4.1.inc'
|
||
|
|
||
|
iterate <instr,supp>, pcmpgtq,37h
|
||
|
macro instr? dest*,src*
|
||
|
SSE.basic_instruction 66h,<38h,supp>,16,dest,src
|
||
|
end macro
|
||
|
end iterate
|
||
|
|
||
|
iterate <instr,supp>, pcmpestrm,60h, pcmpestri,61h, pcmpistrm,62h, pcmpistri,63h
|
||
|
macro instr? dest*,src*,imm*
|
||
|
SSE.basic_instruction_imm8 66h,<3Ah,supp>,16,dest,src,imm
|
||
|
end macro
|
||
|
end iterate
|
||
|
|
||
|
macro crc32? dest*,src*
|
||
|
x86.parse_operand@dest dest
|
||
|
x86.parse_operand@src src
|
||
|
if @dest.type = 'reg' & ( @src.type = 'reg' | @src.type = 'mem' )
|
||
|
if @dest.size <> 4 & ( @dest.size <> 8 | x86.mode <> 64 )
|
||
|
err 'invalid operand size'
|
||
|
end if
|
||
|
@src.opcode_prefix = 0F2h
|
||
|
if @src.size > 1
|
||
|
x86.select_operand_prefix@src @src.size
|
||
|
x86.store_instruction@src <0Fh,38h,0F1h>,@dest.rm
|
||
|
else if @src.size > 0
|
||
|
x86.store_instruction@src <0Fh,38h,0F0h>,@dest.rm
|
||
|
else
|
||
|
err 'operand size not specified'
|
||
|
end if
|
||
|
else
|
||
|
err 'invalid combination of operands'
|
||
|
end if
|
||
|
end macro
|
||
|
|
||
|
macro popcnt? dest*,src*
|
||
|
x86.parse_operand@dest dest
|
||
|
x86.parse_operand@src src
|
||
|
if @dest.type = 'reg' & ( @src.type = 'reg' | @src.type = 'mem' )
|
||
|
if @src.size and not @dest.size
|
||
|
err 'operand sizes do not match'
|
||
|
end if
|
||
|
@src.opcode_prefix = 0F3h
|
||
|
if @dest.size > 1
|
||
|
x86.select_operand_prefix@src @dest.size
|
||
|
x86.store_instruction@src <0Fh,0B8h>,@dest.rm
|
||
|
else
|
||
|
err 'invalid operand size'
|
||
|
end if
|
||
|
else
|
||
|
err 'invalid combination of operands'
|
||
|
end if
|
||
|
end macro
|