Implement two-argument form of imul

This commit is contained in:
Theodore Dubois 2018-05-25 14:18:22 -07:00
parent d1a0ebbed5
commit ef287904a0
2 changed files with 27 additions and 27 deletions

View File

@ -18,26 +18,30 @@
.macro _do_op op, arg, size, s, ss
.ifc \op,load
mov\ss \arg, %tmp\s
.exitm
.else; .ifc \op,store
mov\ss %tmp\s, \arg
.else
.ifin(\op, add,sub,adc,sbb)
mov\ss \arg, %r14\s
setf_a src=%r14\s, dst=%tmp\s, ss=\ss
.endifin
.ifin(\op, and,or,xor)
clearf_a
clearf_oc
.endifin
.ifin(\op, adc,sbb)
btw $0, CPU_cf(%_cpu)
.endifin
\op\ss \arg, %tmp\s
.ifin(\op, add,sub,adc,sbb)
setf_oc
.endifin
setf_zsp %tmp\s, \ss
.exitm
.endif; .endif
.ifin(\op, add,sub,adc,sbb)
mov\ss \arg, %r14\s
setf_a src=%r14\s, dst=%tmp\s, ss=\ss
.endifin
.ifin(\op, and,or,xor)
clearf_a
clearf_oc
.endifin
.ifin(\op, adc,sbb)
btw $0, CPU_cf(%_cpu)
.endifin
\op\ss \arg, %tmp\s
.ifin(\op, add,sub,adc,sbb)
setf_oc
.endifin
.ifnc \op,imul
setf_zsp %tmp\s, \ss
.endif
.endm
.macro do_op op, size, arg
ss \size, _do_op, \op, \arg
@ -112,6 +116,9 @@
.endr
.gadget_array \op
.endr
do_op_size imul, 16
do_op_size imul, 32
.gadget_array imul
# unary operations (well, only one explicit operand)
.irp op, inc,dec
@ -133,13 +140,6 @@
idiv\ss %r10\s
gret
.endm
.macro do_imul size, s, ss
.if \size != 8
.gadget imul_\size
imul\ss (%_ip), %r10\s
gret 1
.endif
.endm
.macro do_neg size, s, ss
.gadget neg_\size
setf_a src=$0 dst=%r10\s ss=\ss
@ -154,7 +154,7 @@
gret
.endm
.irp op, idiv,div,imul,neg,not
.irp op, idiv,div,neg,not
.irp size, SIZE_LIST
ss \size, do_\op
.endr

View File

@ -189,8 +189,8 @@ static inline void gen_op(struct gen_state *state, gadget_t *gadgets, enum arg a
#define MUL18(val,z) UNDEFINED
#define MUL1(val,z) UNDEFINED
#define IMUL1(val,z) UNDEFINED
#define IMUL2(val, reg,z) UNDEFINED
#define IMUL3(imm, src, dst,z) load(src,z); gag(imul, sz(z), imm); store(dst,z)
#define IMUL2(val, reg,z) los(imul, val, reg, z)
#define IMUL3(imm, src, dst,z) load(src, z); op(imul, imm, z); store(dst, z)
#define DIV(val, z) load(val, z); ga(div, sz(z)); store(val, z)
#define IDIV(val, z) load(val, z); ga(idiv, sz(z)); store(val, z)