author | pcpa <paulo.cesar.pereira.de.andrade@gmail.com> | 2015年02月15日 23:14:27 -0200 |
---|---|---|
committer | pcpa <paulo.cesar.pereira.de.andrade@gmail.com> | 2015年02月15日 23:14:27 -0200 |
commit | 3a03feae5d5f0ad7766882f772e79a1c8b61bc39 (patch) | |
tree | 296735e8b2d470fd4a3043737caced503402c1e7 /lib | |
parent | 7fdbc5b84a41b9daa98144036a168b24fd281508 (diff) | |
download | lightning-3a03feae5d5f0ad7766882f772e79a1c8b61bc39.tar.gz |
-rw-r--r-- | lib/jit_x86-cpu.c | 49 | ||||
-rw-r--r-- | lib/jit_x86-sse.c | 88 | ||||
-rw-r--r-- | lib/jit_x86-x87.c | 48 |
diff --git a/lib/jit_x86-cpu.c b/lib/jit_x86-cpu.c index 50ab0e3..fa4eade 100644 --- a/lib/jit_x86-cpu.c +++ b/lib/jit_x86-cpu.c @@ -2466,10 +2466,15 @@ _ldi_l(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0) static void _ldxr_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2) { +#if __X64_32 + addr(r0, r1, r2); + ldr_c(r0, r0); +#else rex(0, WIDE, r0, r1, r2); ic(0x0f); ic(0xbe); rx(r0, 0, r2, r1, _SCL1); +#endif } static void @@ -2493,10 +2498,15 @@ _ldxi_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0) static void _ldxr_uc(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2) { +#if __X64_32 + addr(r0, r1, r2); + ldr_uc(r0, r0); +#else rex(0, WIDE, r0, r1, r2); ic(0x0f); ic(0xb6); rx(r0, 0, r2, r1, _SCL1); +#endif } static void @@ -2520,10 +2530,15 @@ _ldxi_uc(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0) static void _ldxr_s(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2) { +#if __X64_32 + addr(r0, r1, r2); + ldr_s(r0, r0); +#else rex(0, WIDE, r0, r1, r2); ic(0x0f); ic(0xbf); rx(r0, 0, r2, r1, _SCL1); +#endif } static void @@ -2547,10 +2562,15 @@ _ldxi_s(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0) static void _ldxr_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2) { +#if __X64_32 + addr(r0, r1, r2); + ldr_us(r0, r0); +#else rex(0, WIDE, r0, r1, r2); ic(0x0f); ic(0xb7); rx(r0, 0, r2, r1, _SCL1); +#endif } static void @@ -2610,9 +2630,15 @@ _ldxi_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0) static void _ldxr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2) { +#if __X64_32 + addr(r0, r1, r2); + /* to avoid confusion with macro renames */ + _ldr_ui(_jit, r0, r0); +#else rex(0, 0, r0, r1, r2); ic(0x8b); rx(r0, 0, r2, r1, _SCL1); +#endif } static void @@ -2789,6 +2815,12 @@ static void _stxr_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2) { jit_int32_t reg; +#if __X64_32 + reg = jit_get_reg(jit_class_gpr); + addr(rn(reg), r0, r1); + str_c(rn(reg), r2); + jit_unget_reg(reg); +#else if (reg8_p(r2)) { rex(0, 0, r2, r1, r0); ic(0x88); @@ -2802,6 +2834,7 @@ _stxr_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2) rx(rn(reg), 0, r0, r1, _SCL1); jit_unget_reg(reg); } +#endif } static void @@ -2834,10 +2867,18 @@ _stxi_c(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1) static void _stxr_s(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2) { +#if __X64_32 + jit_int32_t reg; + reg = jit_get_reg(jit_class_gpr); + addr(rn(reg), r0, r1); + str_s(rn(reg), r2); + jit_unget_reg(reg); +#else ic(0x66); rex(0, 0, r2, r1, r0); ic(0x89); rx(r2, 0, r0, r1, _SCL1); +#endif } static void @@ -2861,9 +2902,17 @@ _stxi_s(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1) static void _stxr_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2) { +#if __X64_32 + jit_int32_t reg; + reg = jit_get_reg(jit_class_gpr); + addr(rn(reg), r0, r1); + str_i(rn(reg), r2); + jit_unget_reg(reg); +#else rex(0, 0, r2, r1, r0); ic(0x89); rx(r2, 0, r0, r1, _SCL1); +#endif } static void diff --git a/lib/jit_x86-sse.c b/lib/jit_x86-sse.c index cea1632..d29ee4c 100644 --- a/lib/jit_x86-sse.c +++ b/lib/jit_x86-sse.c @@ -232,13 +232,15 @@ static void _sse_unordi_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*); # define sse_ldr_f(r0, r1) movssmr(0, r1, _NOREG, _SCL1, r0) # define sse_ldi_f(r0, i0) _sse_ldi_f(_jit, r0, i0) static void _sse_ldi_f(jit_state_t*, jit_int32_t, jit_word_t); -# define sse_ldxr_f(r0, r1, r2) movssmr(0, r1, r2, _SCL1, r0) +# define sse_ldxr_f(r0, r1, r2) _sse_ldxr_f(_jit, r0, r1, r2) +static void _sse_ldxr_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t); # define sse_ldxi_f(r0, r1, i0) _sse_ldxi_f(_jit, r0, r1, i0) static void _sse_ldxi_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t); # define sse_str_f(r0, r1) movssrm(r1, 0, r0, _NOREG, _SCL1) # define sse_sti_f(i0, r0) _sse_sti_f(_jit, i0, r0) static void _sse_sti_f(jit_state_t*, jit_word_t,jit_int32_t); -# define sse_stxr_f(r0, r1, r2) movssrm(r2, 0, r0, r1, _SCL1) +# define sse_stxr_f(r0, r1, r2) _sse_stxr_f(_jit, r0, r1, r2) +static void _sse_stxr_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t); # define sse_stxi_f(i0, r0, r1) _sse_stxi_f(_jit, i0, r0, r1) static void _sse_stxi_f(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t); # define sse_bltr_f(i0, r0, r1) _sse_bltr_f(_jit, i0, r0, r1) @@ -366,14 +368,16 @@ static void _sse_unordi_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*); # define sse_ldr_d(r0, r1) movsdmr(0, r1, _NOREG, _SCL1, r0) # define sse_ldi_d(r0, i0) _sse_ldi_d(_jit, r0, i0) static void _sse_ldi_d(jit_state_t*, jit_int32_t, jit_word_t); -# define sse_ldxr_d(r0, r1, r2) movsdmr(0, r1, r2, _SCL1, r0) +# define sse_ldxr_d(r0, r1, r2) _sse_ldxr_d(_jit, r0, r1, r2) +static void _sse_ldxr_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t); # define sse_ldxi_d(r0, r1, i0) _sse_ldxi_d(_jit, r0, r1, i0) static void _sse_ldxi_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t); # define sse_bltr_d(i0, r0, r1) _sse_bltr_d(_jit, i0, r0, r1) # define sse_str_d(r0, r1) movsdrm(r1, 0, r0, _NOREG, _SCL1) # define sse_sti_d(i0, r0) _sse_sti_d(_jit, i0, r0) static void _sse_sti_d(jit_state_t*, jit_word_t,jit_int32_t); -# define sse_stxr_d(r0, r1, r2) movsdrm(r2, 0, r0, r1, _SCL1) +# define sse_stxr_d(r0, r1, r2) _sse_stxr_d(_jit, r0, r1, r2) +static void _sse_stxr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t); # define sse_stxi_d(i0, r0, r1) _sse_stxi_d(_jit, i0, r0, r1) static void _sse_stxi_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t); static jit_word_t _sse_bltr_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t); @@ -935,6 +939,20 @@ _sse_ldi_f(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0) } static void +_sse_ldxr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2) +{ +#if __X64_32 + jit_int32_t reg; + reg = jit_get_reg(jit_class_gpr); + addr(rn(reg), r1, r2); + sse_ldr_f(r0, rn(reg)); + jit_unget_reg(reg); +#else + movssmr(0, r1, r2, _SCL1, r0); +#endif +} + +static void _sse_ldxi_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0) { jit_int32_t reg; @@ -942,8 +960,13 @@ _sse_ldxi_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0) movssmr(i0, r1, _NOREG, _SCL1, r0); else { reg = jit_get_reg(jit_class_gpr); +#if __X64_32 + addi(rn(reg), r1, i0); + sse_ldr_f(r0, rn(reg)); +#else movi(rn(reg), i0); sse_ldxr_f(r0, r1, rn(reg)); +#endif jit_unget_reg(reg); } } @@ -963,6 +986,20 @@ _sse_sti_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0) } static void +_sse_stxr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2) +{ +#if __X64_32 + jit_int32_t reg; + reg = jit_get_reg(jit_class_gpr); + addr(rn(reg), r0, r1); + sse_str_f(rn(reg), r2); + jit_unget_reg(reg); +#else + movssrm(r2, 0, r0, r1, _SCL1); +#endif +} + +static void _sse_stxi_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1) { jit_int32_t reg; @@ -970,8 +1007,13 @@ _sse_stxi_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1) movssrm(r1, i0, r0, _NOREG, _SCL1); else { reg = jit_get_reg(jit_class_gpr); +#if __X64_32 + addi(rn(reg), r0, i0); + sse_str_f(rn(reg), r1); +#else movi(rn(reg), i0); sse_stxr_f(rn(reg), r0, r1); +#endif jit_unget_reg(reg); } } @@ -1290,6 +1332,20 @@ _sse_ldi_d(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0) } static void +_sse_ldxr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2) +{ +#if __X64_32 + jit_int32_t reg; + reg = jit_get_reg(jit_class_gpr); + addr(rn(reg), r1, r2); + sse_ldr_d(r0, rn(reg)); + jit_unget_reg(reg); +#else + movsdmr(0, r1, r2, _SCL1, r0); +#endif +} + +static void _sse_ldxi_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0) { jit_int32_t reg; @@ -1297,8 +1353,13 @@ _sse_ldxi_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0) movsdmr(i0, r1, _NOREG, _SCL1, r0); else { reg = jit_get_reg(jit_class_gpr); +#if __X64_32 + addi(rn(reg), r1, i0); + sse_ldr_d(r0, rn(reg)); +#else movi(rn(reg), i0); sse_ldxr_d(r0, r1, rn(reg)); +#endif jit_unget_reg(reg); } } @@ -1318,6 +1379,20 @@ _sse_sti_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0) } static void +_sse_stxr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2) +{ +#if __X64_32 + jit_int32_t reg; + reg = jit_get_reg(jit_class_gpr); + addr(rn(reg), r0, r1); + sse_str_d(rn(reg), r2); + jit_unget_reg(reg); +#else + movsdrm(r2, 0, r0, r1, _SCL1); +#endif +} + +static void _sse_stxi_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1) { jit_int32_t reg; @@ -1325,8 +1400,13 @@ _sse_stxi_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1) movsdrm(r1, i0, r0, _NOREG, _SCL1); else { reg = jit_get_reg(jit_class_gpr); +#if __X64_32 + addi(rn(reg), r0, i0); + sse_str_d(rn(reg), r1); +#else movi(rn(reg), i0); sse_stxr_f(rn(reg), r0, r1); +#endif jit_unget_reg(reg); } } diff --git a/lib/jit_x86-x87.c b/lib/jit_x86-x87.c index 75bde5c..5b45c26 100644 --- a/lib/jit_x86-x87.c +++ b/lib/jit_x86-x87.c @@ -887,8 +887,15 @@ _x87_ldi_f(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0) static void _x87_ldxr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2) { +#if __X64_32 + jit_int32_t reg; + reg = jit_get_reg(jit_class_gpr); + addr(rn(reg), r1, r2); + x87_ldr_f(r0, rn(reg)); +#else fldsm(0, r1, r2, _SCL1); fstpr(r0 + 1); +#endif } static void @@ -901,8 +908,13 @@ _x87_ldxi_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0) } else { reg = jit_get_reg(jit_class_gpr); +#if __X64_32 + addi(rn(reg), r1, i0); + x87_ldr_f(r0, rn(reg)); +#else movi(rn(reg), i0); x87_ldxr_f(r0, r1, rn(reg)); +#endif jit_unget_reg(reg); } } @@ -941,6 +953,12 @@ _x87_sti_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0) static void _x87_stxr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2) { +#if __X64_32 + jit_int32_t reg; + reg = jit_get_reg(jit_class_gpr); + addr(rn(reg), r0, r1); + x87_str_f(rn(reg), r2); +#else if (r2 == _ST0_REGNO) fstsm(0, r0, r1, _SCL1); else { @@ -948,6 +966,7 @@ _x87_stxr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2) fstsm(0, r0, r1, _SCL1); fxchr(r2); } +#endif } static void @@ -956,8 +975,13 @@ _x87_stxi_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1) jit_int32_t reg; if (!can_sign_extend_int_p(i0)) { reg = jit_get_reg(jit_class_gpr); +#if __X64_32 + addi(rn(reg), r0, i0); + x87_str_f(rn(reg), r1); +#else movi(rn(reg), i0); x87_stxr_f(rn(reg), r0, r1); +#endif jit_unget_reg(reg); } else if (r1 == _ST0_REGNO) @@ -1144,8 +1168,15 @@ _x87_ldi_d(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0) static void _x87_ldxr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2) { +#if __X64_32 + jit_int32_t reg; + reg = jit_get_reg(jit_class_gpr); + addr(rn(reg), r1, r2); + x87_ldr_d(r0, rn(reg)); +#else fldlm(0, r1, r2, _SCL1); fstpr(r0 + 1); +#endif } static void @@ -1158,8 +1189,13 @@ _x87_ldxi_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0) } else { reg = jit_get_reg(jit_class_gpr); +#if __X64_32 + addi(rn(reg), r1, i0); + x87_ldr_d(r0, rn(reg)); +#else movi(rn(reg), i0); x87_ldxr_d(r0, r1, rn(reg)); +#endif jit_unget_reg(reg); } } @@ -1198,6 +1234,12 @@ _x87_sti_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0) static void _x87_stxr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2) { +#if __X64_32 + jit_int32_t reg; + reg = jit_get_reg(jit_class_gpr); + addr(rn(reg), r0, r1); + x87_str_d(rn(reg), r2); +#else if (r2 == _ST0_REGNO) fstlm(0, r0, r1, _SCL1); else { @@ -1205,6 +1247,7 @@ _x87_stxr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2) fstlm(0, r0, r1, _SCL1); fxchr(r2); } +#endif } static void @@ -1213,8 +1256,13 @@ _x87_stxi_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1) jit_int32_t reg; if (!can_sign_extend_int_p(i0)) { reg = jit_get_reg(jit_class_gpr); +#if __X64_32 + addi(rn(reg), r0, i0); + x87_str_d(rn(reg), r1); +#else movi(rn(reg), i0); x87_stxr_d(rn(reg), r0, r1); +#endif jit_unget_reg(reg); } else if (r1 == _ST0_REGNO) |