>From ac986ca27fdce35d75c9b6b4a898014ed0aff97d Mon Sep 17 00:00:00 2001 From: Paulo Cesar Pereira de Andrade Date: Mon, 23 Aug 2010 21:17:59 -0300 Subject: [PATCH] RFC patch about handling 32 and 64 bits registers and immediates. This patch adds initial extra jit_namex_{r,i}r macros for operations that are expected to zero/sign extend a register value, but clobber it to 32 bits precision if required, that is, on 64 bits, in most cases, treat i/ui as l/ul, possibly truncating, without zero extending, to 32 bits. --- lightning/i386/core-32.h | 7 +++++++ lightning/i386/core-64.h | 7 +++++++ lightning/i386/core.h | 10 +++++----- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/lightning/i386/core-32.h b/lightning/i386/core-32.h index 313564f..2cf86dd 100644 --- a/lightning/i386/core-32.h +++ b/lightning/i386/core-32.h @@ -142,6 +142,13 @@ struct jit_local_state { ((dd != _ECX && db != _ECX && di != _ECX) ? _CL : _DL)), \ dd, db, di, ds))) +#define jit_movx_rr(rs, rd) MOVLrr((rs), (rd)) +#define jit_movx_ir(is, rd) MOVLir((is), (rd)) +#define jit_xorx_rr(rs, rd) XORLrr((rs), (rd)) +#define jit_cmpx_rr(s2, s1) CMPLrr(s2, s1) +#define jit_cmpx_ir(s2, s1) CMPLir(s2, s1) +#define jit_testx_rr(s2, s1) TESTLrr(s2, s1) + #define jit_ldr_c(d, rs) MOVSBLmr(0, (rs), 0, 0, (d)) #define jit_ldxr_c(d, s1, s2) MOVSBLmr(0, (s1), (s2), 1, (d)) diff --git a/lightning/i386/core-64.h b/lightning/i386/core-64.h index 83eccb9..e659f5e 100644 --- a/lightning/i386/core-64.h +++ b/lightning/i386/core-64.h @@ -173,6 +173,13 @@ static int jit_arg_reg_order[] = { _EDI, _ESI, _EDX, _ECX, _R8D, _R9D }; : MOVQir((is), (d))) \ : XORQrr ((d), (d)) ) +#define jit_movx_rr(rs, rd) MOVQrr((rs), (rd)) +#define jit_movx_ir(is, rd) MOVQir((is), (rd)) +#define jit_xorx_rr(rs, rd) XORQrr((rs), (rd)) +#define jit_cmpx_rr(s2, s1) CMPQrr(s2, s1) +#define jit_cmpx_ir(s2, s1) CMPQir(s2, s1) +#define jit_testx_rr(s2, s1) TESTQrr(s2, s1) + #define jit_bmsr_l(label, s1, s2) (TESTQrr((s1), (s2)), JNZm(label), _jit.x.pc) #define jit_bmcr_l(label, s1, s2) (TESTQrr((s1), (s2)), JZm(label), _jit.x.pc) #define jit_boaddr_l(label, s1, s2) (ADDQrr((s2), (s1)), JOm(label), _jit.x.pc) diff --git a/lightning/i386/core.h b/lightning/i386/core.h index cd55d51..7b1d6d5 100644 --- a/lightning/i386/core.h +++ b/lightning/i386/core.h @@ -81,12 +81,12 @@ : (jit_replace8(d, TESTLrr(rs, rs), op0))) /* For BLT, BLE, ... */ -#define jit_bra_r(s1, s2, op) (CMPLrr(s2, s1), op, _jit.x.pc) -#define jit_bra_i(rs, is, op) (CMPLir(is, rs), op, _jit.x.pc) +#define jit_bra_r(s1, s2, op) (jit_cmpx_rr(s2, s1), op, _jit.x.pc) +#define jit_bra_i(rs, is, op) (jit_cmpx_ir(is, rs), op, _jit.x.pc) /* When CMP with 0 can be replaced with TEST */ #define jit_bra_i0(rs, is, op, op0) \ - ( (is) == 0 ? (TESTLrr(rs, rs), op0, _jit.x.pc) : (CMPLir(is, rs), op, _jit.x.pc)) + ( (is) == 0 ? (jit_testx_rr(rs, rs), op0, _jit.x.pc) : (jit_cmpx_ir(is, rs), op, _jit.x.pc)) /* Reduce arguments of XOR/OR/TEST */ #define jit_reduce_(op) op @@ -263,8 +263,8 @@ /* Unary */ #define jit_negr_i(d, rs) jit_opi_((d), (rs), NEGLr(d), (XORLrr((d), (d)), SUBLrr((rs), (d))) ) -#define jit_movr_i(d, rs) ((void)((rs) == (d) ? 0 : MOVLrr((rs), (d)))) -#define jit_movi_i(d, is) ((is) ? MOVLir((is), (d)) : XORLrr ((d), (d)) ) +#define jit_movr_i(d, rs) ((void)((rs) == (d) ? 0 : jit_movx_rr((rs), (d)))) +#define jit_movi_i(d, is) ((is) ? jit_movx_ir((is), (d)) : jit_xorx_rr ((d), (d)) ) #define jit_patch_movi(pa,pv) (*_PSL((pa) - sizeof(long)) = _jit_SL((pv))) #define jit_ntoh_ui(d, rs) jit_op_((d), (rs), BSWAPLr(d)) -- 1.7.2.1