Sort of implement shrd

This commit is contained in:
Theodore Dubois 2018-05-24 12:19:33 -07:00
parent 82fd6f2226
commit c1f6c4a386
4 changed files with 58 additions and 29 deletions

View File

@ -29,6 +29,29 @@
.gadget_array \type
.endr
.irp arg, imm,cl
.macro x name, reg
.gadget shrd_\arg\()32_\name
.ifc \arg,imm
pushq %rcx
movb (%_ip), %cl
.endif
testb $(32 - 1), %cl
jz 1f
shrd %cl, %\reg, %tmpd
setf_zsp %tmpd, l
1:
.ifc \arg,imm
popq %rcx
gret 1
.else
gret
.endif
.endm
.each_reg x
.purgem x
.gadget_array shrd_\arg
.endr
.macro do_bt arg
movl \arg, %r14d

View File

@ -6,6 +6,10 @@
#define _ip r9
#define _eip r9d
#define _tmp r10d
#define tmp r10
#define tmpd r10d
#define tmpw r10w
#define tmpb r10b
#define _cpu r11
#define _tlb r12
#define _addr r13d
@ -85,19 +89,43 @@
.popsection
.endm
.macro _invoke macro, reg, post
.macro _invoke reg, post, macro:vararg
\macro reg_\reg, e\reg\post
.endm
.macro .each_reg macro
.macro .each_reg macro:vararg
.irp reg, a,b,c,d
_invoke \macro, \reg, x
_invoke \reg, x, \macro
.endr
.irp reg, si,di,bp
_invoke \macro, \reg,
_invoke \reg, , \macro
.endr
\macro reg_sp, _esp
.endm
.macro ss size, macro, args:vararg
.ifnb \args
.if \size == 8
\macro \args, \size, b, b
.elseif \size == 16
\macro \args, \size, w, w
.elseif \size == 32
\macro \args, \size, d, l
.else
.error "bad size"
.endif
.else
.if \size == 8
\macro \size, b, b
.elseif \size == 16
\macro \size, w, w
.elseif \size == 32
\macro \size, d, l
.else
.error "bad size"
.endif
.endif
.endm
.macro setf_c
setc CPU_cf(%_cpu)
.endm

View File

@ -13,30 +13,6 @@
movw %r10w, CPU_gs(%_cpu)
gret
.macro ss size, macro, args:vararg
.ifnb \args
.if \size == 8
\macro \args, \size, b, b
.elseif \size == 16
\macro \args, \size, w, w
.elseif \size == 32
\macro \args, \size, d, l
.else
.error "bad size"
.endif
.else
.if \size == 8
\macro \size, b, b
.elseif \size == 16
\macro \size, w, w
.elseif \size == 32
\macro \size, d, l
.else
.error "bad size"
.endif
.endif
.endm
# this would have been just a few nice compact nested loops, but gas said "nuh uh"
#define ifin(thing, ...) irp da_op, __VA_ARGS__; .ifc thing,\da_op

View File

@ -172,7 +172,9 @@ static inline void gen_op(struct gen_state *state, gadget_t *gadgets, enum arg a
#define SAR(count, val,z) los(sar, count, val, z)
#define SHLD(count, extra, dst,z) UNDEFINED
#define SHRD(count, extra, dst,z) UNDEFINED
#define SHRD(count, extra, dst,z) load(dst,z); \
if (arg_##count == arg_reg_c) op(shrd_cl, extra,z); \
else op(shrd_imm, extra,z); store(dst,z)
#define BT(bit, val,z) lo(bt, bit, val, z)
#define BTC(bit, val,z) UNDEFINED