mirror of
https://github.com/ish-app/ish.git
synced 2026-02-01 14:32:26 +00:00
Sort of implement shrd
This commit is contained in:
parent
82fd6f2226
commit
c1f6c4a386
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user