alpha: Implement fma* and fms* - lightning.git - Portable just-in-time compiler library

index : lightning.git
Portable just-in-time compiler library
summary refs log tree commit diff
diff options
context:
space:
mode:
authorpcpa <paulo.cesar.pereira.de.andrade@gmail.com>2023年04月18日 17:45:43 -0300
committerpcpa <paulo.cesar.pereira.de.andrade@gmail.com>2023年04月18日 17:45:43 -0300
commit33f5fd6f88ee5646b98dbbe0e68db5f46c1a47a1 (patch)
treeabb375e9998dbc6d0796324abb8c1b8aff2648ff
parentf9c34dd53a5f5782891b5c87f710af05ad31adfb (diff)
downloadlightning-33f5fd6f88ee5646b98dbbe0e68db5f46c1a47a1.tar.gz
alpha: Implement fma* and fms*
Nothing special. Just implement fallbacks.
Diffstat
-rw-r--r--lib/jit_alpha-fpu.c 81
-rw-r--r--lib/jit_alpha.c 20
2 files changed, 101 insertions, 0 deletions
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);
generated by cgit v1.2.3 (git 2.39.1) at 2025年09月15日 18:02:59 +0000

AltStyle によって変換されたページ (->オリジナル) /