Implement movsx

This commit is contained in:
Theodore Dubois 2018-05-25 14:26:52 -07:00
parent ef287904a0
commit 8d05e5e8b6
2 changed files with 17 additions and 18 deletions

View File

@ -130,33 +130,32 @@ do_op_size imul, 32
gret
.endr
.macro do_extend size, s, ss
.if \size != 32
movs\ss\()l %tmp\s, %tmpd
.endif
.endm
.macro do_div size, s, ss
.gadget div_\size
div\ss %r10\s
gret
div\ss %tmp\s
.endm
.macro do_idiv size, s, ss
.gadget idiv_\size
idiv\ss %r10\s
gret
idiv\ss %tmp\s
.endm
.macro do_neg size, s, ss
.gadget neg_\size
setf_a src=$0 dst=%r10\s ss=\ss
neg\ss %r10\s
setf_oc
setf_zsp %r10\s, \ss
gret
setf_a src=$0 dst=%tmp\s ss=\ss
neg\ss %tmp\s
setf_oc
setf_zsp %tmp\s, \ss
.endm
.macro do_not size, s, ss
.gadget not_\size
not\ss %r10\s
gret
not\ss %tmp\s
.endm
.irp op, idiv,div,neg,not
.irp op, extend,idiv,div,neg,not
.irp size, SIZE_LIST
ss \size, do_\op
.gadget \op\()_\size
ss \size, do_\op
gret
.endr
.gadget_list \op, SIZE_LIST
.endr

View File

@ -133,7 +133,7 @@ static inline void gen_op(struct gen_state *state, gadget_t *gadgets, enum arg a
#define MOV(src, dst,z) load(src, z); store(dst, z)
#define MOVZX(src, dst,zs,zd) load(src, zs); store(dst, zd)
#define MOVSX(src, dst,zs,zd) UNDEFINED
#define MOVSX(src, dst,zs,zd) load(src, zs); ga(extend, sz(zs)); store(dst, zd)
#define XCHG(src, dst,z) UNDEFINED
#define ADD(src, dst,z) los(add, src, dst, z)