author | pcpa <paulo.cesar.pereira.de.andrade@gmail.com> | 2023年04月18日 17:45:43 -0300 |
---|---|---|
committer | pcpa <paulo.cesar.pereira.de.andrade@gmail.com> | 2023年04月18日 17:45:43 -0300 |
commit | 33f5fd6f88ee5646b98dbbe0e68db5f46c1a47a1 (patch) | |
tree | abb375e9998dbc6d0796324abb8c1b8aff2648ff | |
parent | f9c34dd53a5f5782891b5c87f710af05ad31adfb (diff) | |
download | lightning-33f5fd6f88ee5646b98dbbe0e68db5f46c1a47a1.tar.gz |
-rw-r--r-- | lib/jit_alpha-fpu.c | 81 | ||||
-rw-r--r-- | lib/jit_alpha.c | 20 |
diff --git a/lib/jit_alpha-fpu.c b/lib/jit_alpha-fpu.c index ce49f10..66b8e13 100644 --- a/lib/jit_alpha-fpu.c +++ b/lib/jit_alpha-fpu.c @@ -315,8 +315,20 @@ static void _movi_w_d(jit_state_t*, jit_int32_t, jit_word_t); # define negr_d(r0,r1) FNEGT(r1,r0) # define sqrtr_f(r0,r1) _sqrtr_f(_jit,r0,r1) static void _sqrtr_f(jit_state_t*,jit_int32_t,jit_int32_t); +# define fmar_f(r0,r1,r2,r3) _fmar_f(_jit,r0,r1,r2,r3) +static void _fmar_f(jit_state_t*, + jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t); +# define fmsr_f(r0,r1,r2,r3) _fmsr_f(_jit,r0,r1,r2,r3) +static void _fmsr_f(jit_state_t*, + jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t); # define sqrtr_d(r0,r1) _sqrtr_d(_jit,r0,r1) static void _sqrtr_d(jit_state_t*,jit_int32_t,jit_int32_t); +# define fmar_d(r0,r1,r2,r3) _fmar_d(_jit,r0,r1,r2,r3) +static void _fmar_d(jit_state_t*, + jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t); +# define fmsr_d(r0,r1,r2,r3) _fmsr_d(_jit,r0,r1,r2,r3) +static void _fmsr_d(jit_state_t*, + jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t); # define extr_f_d(r0,r1) movr_d(r0,r1) # define extr_d_f(r0,r1) movr_f(r0,r1) # define truncr_f_i(r0,r1) truncr_d_i(r0,r1) @@ -714,6 +726,41 @@ _sqrtr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1) TRAPB(); } + +static void +_fmar_f(jit_state_t *_jit, + jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3) +{ + jit_int32_t t0; + if (r0 != r3) { + mulr_f(r0, r1, r2); + addr_f(r0, r0, r3); + } + else { + t0 = jit_get_reg(jit_class_fpr); + mulr_f(rn(t0), r1, r2); + addr_f(r0, rn(t0), r3); + jit_unget_reg(t0); + } +} + +static void +_fmsr_f(jit_state_t *_jit, + jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3) +{ + jit_int32_t t0; + if (r0 != r3) { + mulr_f(r0, r1, r2); + subr_f(r0, r0, r3); + } + else { + t0 = jit_get_reg(jit_class_fpr); + mulr_f(rn(t0), r1, r2); + subr_f(r0, rn(t0), r3); + jit_unget_reg(t0); + } +} + static void _sqrtr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1) { @@ -722,6 +769,40 @@ _sqrtr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1) } static void +_fmar_d(jit_state_t *_jit, + jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3) +{ + jit_int32_t t0; + if (r0 != r3) { + mulr_d(r0, r1, r2); + addr_d(r0, r0, r3); + } + else { + t0 = jit_get_reg(jit_class_fpr); + mulr_d(rn(t0), r1, r2); + addr_d(r0, rn(t0), r3); + jit_unget_reg(t0); + } +} + +static void +_fmsr_d(jit_state_t *_jit, + jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3) +{ + jit_int32_t t0; + if (r0 != r3) { + mulr_d(r0, r1, r2); + subr_d(r0, r0, r3); + } + else { + t0 = jit_get_reg(jit_class_fpr); + mulr_d(rn(t0), r1, r2); + subr_d(r0, rn(t0), r3); + jit_unget_reg(t0); + } +} + +static void _extr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1) { stxi_l(-8, _FP_REGNO, r1); diff --git a/lib/jit_alpha.c b/lib/jit_alpha.c index bdd07ec..91b892a 100644 --- a/lib/jit_alpha.c +++ b/lib/jit_alpha.c @@ -1256,6 +1256,16 @@ _emit_code(jit_state_t *_jit) case_rr(abs, _f); case_rr(neg, _f); case_rr(sqrt, _f); + case jit_code_fmar_f: + fmar_f(rn(node->u.w), rn(node->v.q.l), + rn(node->v.q.h), rn(node->w.w)); + case jit_code_fmai_f: + break; + case jit_code_fmsr_f: + fmsr_f(rn(node->u.w), rn(node->v.q.l), + rn(node->v.q.h), rn(node->w.w)); + case jit_code_fmsi_f: + break; case_rr(ext, _f); case_rr(ld, _f); case_rw(ld, _f); @@ -1359,6 +1369,16 @@ _emit_code(jit_state_t *_jit) case_rr(abs, _d); case_rr(neg, _d); case_rr(sqrt, _d); + case jit_code_fmar_d: + fmar_d(rn(node->u.w), rn(node->v.q.l), + rn(node->v.q.h), rn(node->w.w)); + case jit_code_fmai_d: + break; + case jit_code_fmsr_d: + fmsr_d(rn(node->u.w), rn(node->v.q.l), + rn(node->v.q.h), rn(node->w.w)); + case jit_code_fmsi_d: + break; case_rr(ext, _d); case_rr(ld, _d); case_rw(ld, _d); |