X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=deps%2Flightning%2Flib%2Fjit_hppa-cpu.c;h=4db79d8d1d4fbb4ae11fa7ed349d93537b24c273;hb=016c6e93f6db684211f5c8b05433cb500715ba50;hp=ebb01fd275303855980cea27216b2b207c0f2c1a;hpb=384af87540d751ef274e5956d58f4bbc153a34a9;p=pcsx_rearmed.git diff --git a/deps/lightning/lib/jit_hppa-cpu.c b/deps/lightning/lib/jit_hppa-cpu.c index ebb01fd2..4db79d8d 100644 --- a/deps/lightning/lib/jit_hppa-cpu.c +++ b/deps/lightning/lib/jit_hppa-cpu.c @@ -28,6 +28,8 @@ typedef struct udiv { unsigned int rem; } udiv_t; +#define jit_imm_idx_p() jit_cpu.imm_idx + /* 16 spill bytes; -52 for first actual stack argument */ #define params_offset -32 /* Assume all callee save registers may need to be spilled */ @@ -47,6 +49,14 @@ typedef struct udiv { #define _R31_REGNO 31 #define _CR11_REGNO 11 #define ii(v) *_jit->pc.ui++ = v +#define ldr(r0,r1) ldr_ui(r0,r1) +#define ldi(r0,i0) ldi_ui(r0,i0) +#define ldxr(r0,r1,r2) ldxr_ui(r0,r1,r2) +#define ldxi(r0,r1,i0) ldxi_ui(r0,r1,i0) +#define str(r0,r1) str_i(r0,r1) +#define sti(i0,r0) sti_i(i0,r0) +#define stxr(r0,r1,r2) stxr_i(r0,r1,r2) +#define stxi(i0,r0,r1) stxi_i(i0,r0,r1) #define f1(o,b,t,i) _f1(_jit,o,b,t,i) static void _f1(jit_state_t*,jit_int32_t, jit_int32_t,jit_int32_t,jit_int32_t); @@ -663,6 +673,12 @@ static void _casx(jit_state_t *_jit,jit_int32_t,jit_int32_t, #define casi(r0, i0, r1, r2) casx(r0, _NOREG, r1, r2, i0) #define comr(r0,r1) UADDCM(_R0_REGNO,r1,r0) #define negr(r0,r1) SUB(_R0_REGNO,r1,r0) +#define extr(r0,r1,i0,i1) _extr(_jit,r0,r1,i0,i1) +static void _extr(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t,jit_word_t); +#define extr_u(r0,r1,i0,i1) _extr_u(_jit,r0,r1,i0,i1) +static void _extr_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t,jit_word_t); +#define depr(r0,r1,i0,i1) _depr(_jit,r0,r1,i0,i1) +static void _depr(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t,jit_word_t); #define extr_c(r0,r1) EXTRWR(r1,31,8,r0) #define extr_uc(r0,r1) EXTRWR_U(r1,31,8,r0) #define extr_s(r0,r1) EXTRWR(r1,31,16,r0) @@ -691,6 +707,10 @@ static void _rsbi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t); static void _mulr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t); #define muli(r0,r1,i0) _muli(_jit,r0,r1,i0) static void _muli(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t); +#define hmulr(r0, r1, r2) qmulr(JIT_NOREG, r0, r1, r2) +#define hmuli(r0, r1, i0) qmuli(JIT_NOREG, r0, r1, i0) +#define hmulr_u(r0, r1, r2) qmulr_u(JIT_NOREG, r0, r1, r2) +#define hmuli_u(r0, r1, i0) qmuli_u(JIT_NOREG, r0, r1, i0) static long long __llmul(int, int); #define qmulr(r0,r1,r2,r3) _qmulr(_jit,r0,r1,r2,r3) static void _qmulr(jit_state_t*, @@ -756,6 +776,13 @@ static void _rshr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t); #define rshr_u(r0,r1,r2) _rshr_u(_jit,r0,r1,r2) static void _rshr_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t); #define rshi_u(r0,r1,i0) SHRWI_U(r1,i0,r0) +#define lrotr(r0,r1,r2) _lrotr(_jit,r0,r1,r2) +static void _lrotr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t); +#define lroti(r0,r1,i0) rroti(r0,r1,32-i0) +#define rrotr(r0,r1,r2) _rrotr(_jit,r0,r1,r2) +static void _rrotr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t); +#define rroti(r0,r1,i0) _rroti(_jit,r0,r1,i0) +static void _rroti(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t); #define cmpr(c,r0,r1,r2) _cmpr(_jit,c,r0,r1,r2) static void _cmpr(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t,jit_int32_t); #define cmpi(c,ci,r0,r1,i0) _cmpi(_jit,c,ci,r0,r1,i0) @@ -809,7 +836,6 @@ static void _ldi_us(jit_state_t*,jit_int32_t,jit_word_t); #define ldxr_us(r0,r1,r2) LDH(r2,r1,r0) #define ldxi_us(r0,r1,i0) _ldxi_us(_jit,r0,r1,i0) static void _ldxi_us(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t); -#define ldr(r0,r1) ldr_ui(r0,r1) #define ldr_i(r0,r1) ldr_ui(r0,r1) #define ldr_ui(r0,r1) LDWI(_R0_REGNO,r1,r0) #define ldi_i(r0,i0) ldi_ui(r0,i0) @@ -817,7 +843,6 @@ static void _ldxi_us(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t); static void _ldi_ui(jit_state_t*,jit_int32_t,jit_word_t); #define ldxr_i(r0,r1,r2) ldxr_ui(r0,r1,r2) #define ldxr_ui(r0,r1,r2) LDW(r2,r1,r0) -#define ldxi(r0,r1,i0) ldxi_ui(r0,r1,i0) #define ldxi_i(r0,r1,i0) ldxi_ui(r0,r1,i0) #define ldxi_ui(r0,r1,i0) _ldxi_ui(_jit,r0,r1,i0) static void _ldxi_ui(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t); @@ -840,7 +865,6 @@ static void _stxi_s(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t); static void _sti_i(jit_state_t*,jit_word_t,jit_int32_t); #define stxr_i(r0,r1,r2) _stxr_i(_jit,r0,r1,r2) static void _stxr_i(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t); -#define stxi(i0,r0,r1) stxi_i(i0,r0,r1) #define stxi_i(i0,r0,r1) _stxi_i(_jit,i0,r0,r1) static void _stxi_i(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t); #define bcmpr(c,i0,r0,r1) _bcmpr(_jit,c,i0,r0,r1) @@ -933,6 +957,8 @@ static void _vastart(jit_state_t*, jit_int32_t); static void _vaarg(jit_state_t*, jit_int32_t, jit_int32_t); #define patch_at(i,l) _patch_at(_jit,i,l) static void _patch_at(jit_state_t*,jit_word_t,jit_word_t); + +# define NEED_FALLBACK_CASX 1 #endif #if CODE @@ -1694,6 +1720,53 @@ _movzr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2) patch_at(w, _jit->pc.w); } +static void +_extr(jit_state_t *_jit, + jit_int32_t r0, jit_int32_t r1, jit_word_t i0, jit_word_t i1) +{ + assert(i0 >= 0 && i1 >= 1 && i0 + i1 <= __WORDSIZE); + if ( i1 == __WORDSIZE) + movr(r0, r1); + else { +# if __BYTE_ORDER == __BIG_ENDIAN + i0 = __WORDSIZE - (i0 + i1); +# endif + EXTRWR(r1, 32 - (i0 + 1), i1, r0); + } +} + +static void +_extr_u(jit_state_t *_jit, + jit_int32_t r0, jit_int32_t r1, jit_word_t i0, jit_word_t i1) +{ + assert(i0 >= 0 && i1 >= 1 && i0 + i1 <= __WORDSIZE); + if (i1 == __WORDSIZE) + movr(r0, r1); + else { +# if __BYTE_ORDER == __BIG_ENDIAN + i0 = __WORDSIZE - (i0 + i1); +# endif + EXTRWR_U(r1, 32 - (i0 + 1), i1, r0); + } +} + +static void +_depr(jit_state_t *_jit, + jit_int32_t r0, jit_int32_t r1, jit_word_t i0, jit_word_t i1) +{ + jit_int32_t t0; + jit_word_t mask; + assert(i0 >= 0 && i1 >= 1 && i0 + i1 <= __WORDSIZE); + if (i1 == __WORDSIZE) + movr(r0, r1); + else { +# if __BYTE_ORDER == __BIG_ENDIAN + i0 = __WORDSIZE - (i0 + i1); +# endif + DEPWR(r1, 32 - (i0 + 1), i1, r0); + } +} + static void _casx(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3, jit_word_t i0) @@ -1870,7 +1943,8 @@ _qmulr(jit_state_t *_jit, movr(_R26_REGNO, r2); movr(_R25_REGNO, r3); calli((jit_word_t)__llmul); - movr(r0, _R29_REGNO); + if (r0 != JIT_NOREG) + movr(r0, _R29_REGNO); movr(r1, _R28_REGNO); } @@ -1881,7 +1955,8 @@ _qmuli(jit_state_t *_jit, movr(_R26_REGNO, r2); movi(_R25_REGNO, i0); calli((jit_word_t)__llmul); - movr(r0, _R29_REGNO); + if (r0 != JIT_NOREG) + movr(r0, _R29_REGNO); movr(r1, _R28_REGNO); } @@ -1898,7 +1973,8 @@ _qmulr_u(jit_state_t *_jit, ldxi_f(rn(t1), _FP_REGNO, alloca_offset - 8); XMPYU(rn(t0), rn(t1), rn(t0)); stxi_d(alloca_offset - 8, _FP_REGNO, rn(t0)); - ldxi(r0, _FP_REGNO, alloca_offset - 4); + if (r0 != JIT_NOREG) + ldxi(r0, _FP_REGNO, alloca_offset - 4); ldxi(r1, _FP_REGNO, alloca_offset - 8); jit_unget_reg(t1); jit_unget_reg(t0); @@ -2127,6 +2203,25 @@ _rshr_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1 ,jit_int32_t r2) EXTRW_U(r1, 32, r0); } +static void +_lrotr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1 ,jit_int32_t r2) +{ + fallback_lrotr(r0, r1, r2); +} + +static void +_rrotr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1 ,jit_int32_t r2) +{ + fallback_rrotr(r0, r1, r2); +} + +static void +_rroti(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1 ,jit_word_t i0) +{ + movr(r0, r1); + SHRPWI(r0, r0, i0, r0); +} + static void _cmpr(jit_state_t *_jit, jit_word_t c, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2) @@ -2183,12 +2278,20 @@ static void _ldi_uc(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0) { jit_int32_t reg; - if (i0 >= -8182 && i0 <= 8191) - LDBL(i0, _R0_REGNO, r0); + if (jit_imm_idx_p()) { + if (i0 >= -8182 && i0 <= 8191) + LDBL(i0, _R0_REGNO, r0); + else { + reg = jit_get_reg(jit_class_gpr); + LDIL(i0 & ~0x7ff, rn(reg)); + LDBL(sign_extend(i0, 11), rn(reg), r0); + jit_unget_reg(reg); + } + } else { reg = jit_get_reg(jit_class_gpr); - LDIL(i0 & ~0x7ff, rn(reg)); - LDBL(sign_extend(i0, 11), rn(reg), r0); + movi(rn(reg), i0); + ldr_uc(r0, rn(reg)); jit_unget_reg(reg); } } @@ -2197,9 +2300,9 @@ static void _ldxi_uc(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0) { jit_int32_t reg; - if (i0 >= -16 && i0 <= 15) + if (jit_imm_idx_p() && (i0 >= -16 && i0 <= 15)) LDBI(i0, r1, r0); - else if (i0 >= -8182 && i0 <= 8191) + else if (jit_imm_idx_p() && (i0 >= -8182 && i0 <= 8191)) LDBL(i0, r1, r0); else { reg = jit_get_reg(jit_class_gpr); @@ -2241,12 +2344,20 @@ static void _ldi_us(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0) { jit_int32_t reg; - if (i0 >= -8182 && i0 <= 8191) - LDHL(i0, _R0_REGNO, r0); + if (jit_imm_idx_p()) { + if (i0 >= -8182 && i0 <= 8191) + LDHL(i0, _R0_REGNO, r0); + else { + reg = jit_get_reg(jit_class_gpr); + LDIL(i0 & ~0x7ff, rn(reg)); + LDHL(sign_extend(i0, 11), rn(reg), r0); + jit_unget_reg(reg); + } + } else { reg = jit_get_reg(jit_class_gpr); - LDIL(i0 & ~0x7ff, rn(reg)); - LDHL(sign_extend(i0, 11), rn(reg), r0); + movi(rn(reg), i0); + ldr_us(r0, rn(reg)); jit_unget_reg(reg); } } @@ -2255,9 +2366,9 @@ static void _ldxi_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0) { jit_int32_t reg; - if (i0 >= -16 && i0 <= 15) + if (jit_imm_idx_p() && (i0 >= -16 && i0 <= 15)) LDHI(i0, r1, r0); - else if (i0 >= -8182 && i0 <= 8191) + else if (jit_imm_idx_p() && (i0 >= -8182 && i0 <= 8191)) LDHL(i0, r1, r0); else { reg = jit_get_reg(jit_class_gpr); @@ -2271,12 +2382,20 @@ static void _ldi_ui(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0) { jit_int32_t reg; - if (i0 >= -8182 && i0 <= 8191) - LDWL(i0, _R0_REGNO, r0); + if (jit_imm_idx_p()) { + if (i0 >= -8182 && i0 <= 8191) + LDWL(i0, _R0_REGNO, r0); + else { + reg = jit_get_reg(jit_class_gpr); + LDIL(i0 & ~0x7ff, rn(reg)); + LDWL(sign_extend(i0, 11), rn(reg), r0); + jit_unget_reg(reg); + } + } else { reg = jit_get_reg(jit_class_gpr); - LDIL(i0 & ~0x7ff, rn(reg)); - LDWL(sign_extend(i0, 11), rn(reg), r0); + movi(rn(reg), i0); + ldr_ui(r0, rn(reg)); jit_unget_reg(reg); } } @@ -2285,9 +2404,9 @@ static void _ldxi_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0) { jit_int32_t reg; - if (i0 >= -16 && i0 <= 15) + if (jit_imm_idx_p() && (i0 >= -16 && i0 <= 15)) LDWI(i0, r1, r0); - else if (i0 >= -8182 && i0 <= 8191) + else if (jit_imm_idx_p() && (i0 >= -8182 && i0 <= 8191)) LDWL(i0, r1, r0); else { reg = jit_get_reg(jit_class_gpr); @@ -2301,12 +2420,20 @@ static void _sti_c(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0) { jit_int32_t reg; - if (i0 >= -8182 && i0 <= 8191) - STBL(r0, i0, _R0_REGNO); + if (jit_imm_idx_p()) { + if (i0 >= -8182 && i0 <= 8191) + STBL(r0, i0, _R0_REGNO); + else { + reg = jit_get_reg(jit_class_gpr); + LDIL(i0 & ~0x7ff, rn(reg)); + STBL(r0, sign_extend(i0, 11), rn(reg)); + jit_unget_reg(reg); + } + } else { reg = jit_get_reg(jit_class_gpr); - LDIL(i0 & ~0x7ff, rn(reg)); - STBL(r0, sign_extend(i0, 11), rn(reg)); + movi(rn(reg), i0); + str_c(rn(reg), r0); jit_unget_reg(reg); } } @@ -2325,9 +2452,9 @@ static void _stxi_c(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1) { jit_int32_t reg; - if (i0 >= -16 && i0 <= 15) + if (jit_imm_idx_p() && (i0 >= -16 && i0 <= 15)) STBI(r1, i0, r0); - else if (i0 >= -8182 && i0 <= 8191) + else if (jit_imm_idx_p() && (i0 >= -8182 && i0 <= 8191)) STBL(r1, i0, r0); else { reg = jit_get_reg(jit_class_gpr); @@ -2341,12 +2468,20 @@ static void _sti_s(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0) { jit_int32_t reg; - if (i0 >= -8182 && i0 <= 8191) - STHL(r0, i0, _R0_REGNO); + if (jit_imm_idx_p()) { + if (i0 >= -8182 && i0 <= 8191) + STHL(r0, i0, _R0_REGNO); + else { + reg = jit_get_reg(jit_class_gpr); + LDIL(i0 & ~0x7ff, rn(reg)); + STHL(r0, sign_extend(i0, 11), rn(reg)); + jit_unget_reg(reg); + } + } else { reg = jit_get_reg(jit_class_gpr); - LDIL(i0 & ~0x7ff, rn(reg)); - STHL(r0, sign_extend(i0, 11), rn(reg)); + movi(rn(reg), i0); + str_s(rn(reg), r0); jit_unget_reg(reg); } } @@ -2365,9 +2500,9 @@ static void _stxi_s(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1) { jit_int32_t reg; - if (i0 >= -16 && i0 <= 15) + if (jit_imm_idx_p() && (i0 >= -16 && i0 <= 15)) STHI(r1, i0, r0); - else if (i0 >= -8182 && i0 <= 8191) + else if (jit_imm_idx_p() && (i0 >= -8182 && i0 <= 8191)) STHL(r1, i0, r0); else { reg = jit_get_reg(jit_class_gpr); @@ -2381,12 +2516,20 @@ static void _sti_i(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0) { jit_int32_t reg; - if (i0 >= -8182 && i0 <= 8191) - STWL(r0, i0, _R0_REGNO); + if (jit_imm_idx_p()) { + if (i0 >= -8182 && i0 <= 8191) + STWL(r0, i0, _R0_REGNO); + else { + reg = jit_get_reg(jit_class_gpr); + LDIL(i0 & ~0x7ff, rn(reg)); + STWL(r0, sign_extend(i0, 11), rn(reg)); + jit_unget_reg(reg); + } + } else { reg = jit_get_reg(jit_class_gpr); - LDIL(i0 & ~0x7ff, rn(reg)); - STWL(r0, sign_extend(i0, 11), rn(reg)); + movi(rn(reg), i0); + str_i(rn(reg), r0); jit_unget_reg(reg); } } @@ -2405,9 +2548,9 @@ static void _stxi_i(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1) { jit_int32_t reg; - if (i0 >= -16 && i0 <= 15) + if (jit_imm_idx_p() && (i0 >= -16 && i0 <= 15)) STWI(r1, i0, r0); - else if (i0 >= -8182 && i0 <= 8191) + else if (jit_imm_idx_p() && (i0 >= -8182 && i0 <= 8191)) STWL(r1, i0, r0); else { reg = jit_get_reg(jit_class_gpr);