-rw-r--r-- | lib/jit_hppa-cpu.c | 53 | ||||
-rw-r--r-- | lib/jit_hppa-sz.c | 5 | ||||
-rw-r--r-- | lib/jit_hppa.c | 10 |
diff --git a/lib/jit_hppa-cpu.c b/lib/jit_hppa-cpu.c index fb02efe..5640e4f 100644 --- a/lib/jit_hppa-cpu.c +++ b/lib/jit_hppa-cpu.c @@ -663,6 +663,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 ext(r0,r1,i0,i1) _ext(_jit,r0,r1,i0,i1) +static void _ext(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t,jit_word_t); +#define ext_u(r0,r1,i0,i1) _ext_u(_jit,r0,r1,i0,i1) +static void _ext_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t,jit_word_t); +#define dep(r0,r1,i0,i1) _dep(_jit,r0,r1,i0,i1) +static void _dep(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) @@ -1704,6 +1710,53 @@ _movzr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2) } static void +_ext(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 +_ext_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 +_dep(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) { diff --git a/lib/jit_hppa-sz.c b/lib/jit_hppa-sz.c index 211474b..48f66dc 100644 --- a/lib/jit_hppa-sz.c +++ b/lib/jit_hppa-sz.c @@ -451,9 +451,12 @@ 76, /* ctor */ 56, /* ctzr */ 68, /* rbitr */ - 0, /* popcntr */ + 64, /* popcntr */ 32, /* lrotr */ 8, /* lroti */ 32, /* rrotr */ 8, /* rroti */ + 4, /* ext */ + 4, /* ext_u */ + 4, /* dep */ #endif /* __WORDSIZE */ diff --git a/lib/jit_hppa.c b/lib/jit_hppa.c index 389e5d0..a65be62 100644 --- a/lib/jit_hppa.c +++ b/lib/jit_hppa.c @@ -1083,6 +1083,16 @@ _emit_code(jit_state_t *_jit) case_rr(cto,); case_rr(ctz,); case_rr(rbit,); + case_rr(popcnt,); + case jit_code_ext: + ext(rn(node->u.w), rn(node->v.w), node->w.q.l, node->w.q.h); + break; + case jit_code_ext_u: + ext_u(rn(node->u.w), rn(node->v.w), node->w.q.l, node->w.q.h); + break; + case jit_code_dep: + dep(rn(node->u.w), rn(node->v.w), node->w.q.l, node->w.q.h); + break; case_rr(ext, _c); case_rr(ext, _uc); case_rr(ext, _s); |