aboutsummaryrefslogtreecommitdiff
path: root/deps/lightning/lib/jit_hppa-fpu.c
diff options
context:
space:
mode:
Diffstat (limited to 'deps/lightning/lib/jit_hppa-fpu.c')
-rw-r--r--deps/lightning/lib/jit_hppa-fpu.c1070
1 files changed, 1070 insertions, 0 deletions
diff --git a/deps/lightning/lib/jit_hppa-fpu.c b/deps/lightning/lib/jit_hppa-fpu.c
new file mode 100644
index 0000000..5fa6856
--- /dev/null
+++ b/deps/lightning/lib/jit_hppa-fpu.c
@@ -0,0 +1,1070 @@
+/*
+ * Copyright (C) 2013-2019 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU lightning.
+ *
+ * GNU lightning is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * GNU lightning is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * Authors:
+ * Paulo Cesar Pereira de Andrade
+ */
+
+#if PROTO
+
+/* FIXME should actually be hw model/version/etc or other constraint
+ * that causes a SIGSEGV/SIGILL if using these instructions */
+#if 1 //defined(__hpux)
+# define FSTXR 0
+# define FLDXR 0
+#else
+# define FSTXR 1
+# define FLDXR 1
+#endif
+
+#define f39(o,b,x,t) _f39(_jit,o,b,x,t)
+static void _f39(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t);
+#define f40(o,b,x,r) _f40(_jit,o,b,x,r)
+static void _f40(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t)
+ maybe_unused;
+#define f41(o,b,x,t) _f41(_jit,o,b,x,t)
+static void _f41(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t);
+#define f42(o,b,i,r) _f42(_jit,o,b,i,r)
+static void _f42(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t);
+#define f43(o,b,t,i) f1(o,b,t,i)
+#define f45(o,r,a,b,fmt,c,d,e,t) _f45(_jit,o,r,a,b,fmt,c,d,e,t)
+static void _f45(jit_state_t*,jit_int32_t,
+ jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t,
+ jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t) maybe_unused;
+#define f46(o,r,a,s,df,sf,b,c,d,t) _f46(_jit,o,r,a,s,df,sf,b,c,d,t)
+static void _f46(jit_state_t*,jit_int32_t,jit_int32_t,
+ jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t,
+ jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t);
+#define f47(o,r1,r2,a,fmt,b,c,d,t) f47_48(o,r1,r2,a,fmt,b,c,d,t)
+#define f48(o,r1,r2,a,fmt,b,c,d,t) f47_48(o,r1,r2,a,fmt,b,c,d,t)
+#define f47_48(o,r1,r2,y,fmt,b,c,d,t) _f47_48(_jit,o,r1,r2,y,fmt,b,c,d,t)
+static void _f47_48(jit_state_t*,jit_int32_t,
+ jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t,
+ jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t);
+#define f49(o,r,a,b,c,f,d,e,g,h,i,t) f49_52(o,r,a,b,c,f,d,e,g,h,i,t)
+#define f51(o,r1,r2,y,a,f,b,d,e,g,h,c) f49_52(o,r1,r2,y,a,f,b,d,e,g,h,c)
+#define f52(o,r1,r2,a,b,f,c,d,e,g,h,t) f49_52(o,r1,r2,a,b,f,c,d,e,g,h,t)
+#define f49_52(o,r1,r2,y,v,f,a,b,u,c,d,t) _f49_52(_jit,o,r1,r2,y,v,f,a,b,u,c,d,t)
+static void _f49_52(jit_state_t*,jit_int32_t,
+ jit_int32_t,jit_int32_t,jit_int32_t,
+ jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t,
+ jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t);
+#define f53(o,r1,r2,ta,ra,f,tm) _f53(_jit,o,r1,r2,ta,ra,f,tm)
+static void _f53(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t,
+ jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t) maybe_unused;
+#define f54(o,r1,r2,a,b,f,c,d,e,g,t) _f54(_jit,o,r1,r2,a,b,f,c,d,e,g,t)
+static void _f54(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t,
+ jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t,
+ jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t) maybe_unused;
+#define FABS_(f,r,t) f49(0xe,r,0,3,0,f,0,0,0,0,0,t)
+#define FABS_S(r,t) FABS_(0,r,t)
+#define FABS_D(r,t) FABS_(1,r,t)
+#define FABS_Q(r,t) f45(0xc,r,0,3,3,0,0,0,t)
+#define FADD_(f,r1,r2,t) f52(0xe,r1,r2,0,0,f,3,0,0,0,0,t)
+#define FADD_S(r1,r2,t) FADD_(0,r1,r2,t)
+#define FADD_D(r1,r2,t) FADD_(1,r1,r2,t)
+#define FADD_Q(r1,r2,t) f48(0xc,r1,r2,0,3,3,0,0,t)
+#define FPSR_GT 1
+#define FPSR_LT 2
+#define FPSR_EQ 4
+#define FPSR_UN 8
+/*
+ Actually these are reversed, but easier for the FTEST after the FCMP
+ fcmp,dbl,false? fr4,fr12 0
+ fcmp,dbl,false fr4,fr12 1
+ fcmp,dbl,? fr4,fr12 2
+ fcmp,dbl,!<=> fr4,fr12 3 ORD
+ fcmp,dbl,= fr4,fr12 4 NE
+ fcmp,dbl,=t fr4,fr12 5
+ fcmp,dbl,?= fr4,fr12 6
+ fcmp,dbl,!<> fr4,fr12 7 LTGT
+ fcmp,dbl,!?>= fr4,fr12 8
+ fcmp,dbl,< fr4,fr12 9 UNGE
+ fcmp,dbl,?< fr4,fr12 10
+ fcmp,dbl,!>= fr4,fr12 11 GE
+ fcmp,dbl,!?> fr4,fr12 12
+ fcmp,dbl,<= fr4,fr12 13 UNGT
+ fcmp,dbl,?<= fr4,fr12 14
+ fcmp,dbl,!> fr4,fr12 15 GT
+ fcmp,dbl,!?<= fr4,fr12 16
+ fcmp,dbl,> fr4,fr12 17 UNLE
+ fcmp,dbl,?> fr4,fr12 18
+ fcmp,dbl,!<= fr4,fr12 19 LE
+ fcmp,dbl,!?< fr4,fr12 20
+ fcmp,dbl,>= fr4,fr12 21 UNLT
+ fcmp,dbl,?>= fr4,fr12 22
+ fcmp,dbl,!< fr4,fr12 23 LT
+ fcmp,dbl,!?= fr4,fr12 24
+ fcmp,dbl,<> fr4,fr12 25 UNEQ
+ fcmp,dbl,!= fr4,fr12 26 EQ
+ fcmp,dbl,!=t fr4,fr12 27
+ fcmp,dbl,!? fr4,fr12 28
+ fcmp,dbl,<=> fr4,fr12 29 UNORD
+ fcmp,dbl,true? fr4,fr12 30
+ fcmp,dbl,true fr4,fr12 31
+ */
+#define FCMP_LT 23
+#define FCMP_LE 19
+#define FCMP_EQ 26
+#define FCMP_GE 11
+#define FCMP_GT 15
+#define FCMP_NE 4
+#define FCMP_UNLT 21
+#define FCMP_UNLE 17
+#define FCMP_UNEQ 25
+#define FCMP_UNGE 9
+#define FCMP_UNGT 13
+#define FCMP_LTGT 7
+#define FCMP_ORD 3
+#define FCMP_UNORD 29
+#define FCMP_(f,r1,r2,c) f51(0xe,r1,r2,0,0,f,2,0,0,0,0,c)
+#define FCMP_S_(r1,r2,c) FCMP_(0,r1,r2,c)
+#define FCMP_D_(r1,r2,c) FCMP_(1,r1,r2,c)
+#define FCMP_Q_(r1,r2,c) f47(0xc,r1,r2,0,3,2,0,0,c)
+#define FCMP_S_LT(r1,r2) FCMP_S_(r1,r2,FCMP_LT)
+#define FCMP_D_LT(r1,r2) FCMP_D_(r1,r2,FCMP_LT)
+#define FCMP_Q_LT(r1,r2) FCMP_Q_(r1,r2,FCMP_LT)
+#define FCMP_S_LE(r1,r2) FCMP_S_(r1,r2,FCMP_LE)
+#define FCMP_D_LE(r1,r2) FCMP_D_(r1,r2,FCMP_LE)
+#define FCMP_Q_LE(r1,r2) FCMP_Q_(r1,r2,FCMP_LE)
+#define FCMP_S_EQ(r1,r2) FCMP_S_(r1,r2,FCMP_EQ)
+#define FCMP_D_EQ(r1,r2) FCMP_D_(r1,r2,FCMP_EQ)
+#define FCMP_Q_EQ(r1,r2) FCMP_Q_(r1,r2,FCMP_EQ)
+#define FCMP_S_GE(r1,r2) FCMP_S_(r1,r2,FCMP_GE)
+#define FCMP_D_GE(r1,r2) FCMP_D_(r1,r2,FCMP_GE)
+#define FCMP_Q_GE(r1,r2) FCMP_Q_(r1,r2,FCMP_GE)
+#define FCMP_S_GT(r1,r2) FCMP_S_(r1,r2,FCMP_GT)
+#define FCMP_D_GT(r1,r2) FCMP_D_(r1,r2,FCMP_GT)
+#define FCMP_Q_GT(r1,r2) FCMP_Q_(r1,r2,FCMP_GT)
+#define FCMP_S_NE(r1,r2) FCMP_S_(r1,r2,FCMP_NE)
+#define FCMP_D_NE(r1,r2) FCMP_D_(r1,r2,FCMP_NE)
+#define FCMP_Q_NE(r1,r2) FCMP_Q_(r1,r2,FCMP_NE)
+#define FCMP_S_UNLT(r1,r2) FCMP_S_(r1,r2,FCMP_UNLT)
+#define FCMP_D_UNLT(r1,r2) FCMP_D_(r1,r2,FCMP_UNLT)
+#define FCMP_Q_UNLT(r1,r2) FCMP_Q_(r1,r2,FCMP_UNLT)
+#define FCMP_S_UNLE(r1,r2) FCMP_S_(r1,r2,FCMP_UNLE)
+#define FCMP_D_UNLE(r1,r2) FCMP_D_(r1,r2,FCMP_UNLE)
+#define FCMP_Q_UNLE(r1,r2) FCMP_Q_(r1,r2,FCMP_UNLE)
+#define FCMP_S_UNEQ(r1,r2) FCMP_S_(r1,r2,FCMP_UNEQ)
+#define FCMP_D_UNEQ(r1,r2) FCMP_D_(r1,r2,FCMP_UNEQ)
+#define FCMP_Q_UNEQ(r1,r2) FCMP_Q_(r1,r2,FCMP_UNEQ)
+#define FCMP_S_UNGE(r1,r2) FCMP_S_(r1,r2,FCMP_UNGE)
+#define FCMP_D_UNGE(r1,r2) FCMP_D_(r1,r2,FCMP_UNGE)
+#define FCMP_Q_UNGE(r1,r2) FCMP_Q_(r1,r2,FCMP_UNGE)
+#define FCMP_S_UNGT(r1,r2) FCMP_S_(r1,r2,FCMP_UNGT)
+#define FCMP_D_UNGT(r1,r2) FCMP_D_(r1,r2,FCMP_UNGT)
+#define FCMP_Q_UNGT(r1,r2) FCMP_Q_(r1,r2,FCMP_UNGT)
+#define FCMP_S_LTGT(r1,r2) FCMP_S_(r1,r2,FCMP_LTGT)
+#define FCMP_D_LTGT(r1,r2) FCMP_D_(r1,r2,FCMP_LTGT)
+#define FCMP_Q_LTGT(r1,r2) FCMP_Q_(r1,r2,FCMP_LTGT)
+#define FCMP_S_ORD(r1,r2) FCMP_S_(r1,r2,FCMP_ORD)
+#define FCMP_D_ORD(r1,r2) FCMP_D_(r1,r2,FCMP_ORD)
+#define FCMP_Q_ORD(r1,r2) FCMP_Q_(r1,r2,FCMP_ORD)
+#define FCMP_S_UNORD(r1,r2) FCMP_S_(r1,r2,FCMP_UNORD)
+#define FCMP_D_UNORD(r1,r2) FCMP_D_(r1,r2,FCMP_UNORD)
+#define FCMP_Q_UNORD(r1,r2) FCMP_Q_(r1,r2,FCMP_UNORD)
+#define XFNVFF(s,d,r,t) f46(0xc,r,0,0,d,s,1,0,0,t)
+#define FCNVFF_Q_S(r,t) XFNVFF(3,0,r,t)
+#define FCNVFF_Q_D(r,t) XFNVFF(3,1,r,t)
+#define FCNVFF_S_Q(r,t) XFNVFF(0,3,r,t)
+#define FCNVFF_D_Q(r,t) XFNVFF(1,3,r,t)
+#define FCNVFF_(s,d,r,t) f46(0xc,r,0,0,d,s,1,0,0,t)
+#define FCNVFF_S_D(r,t) FCNVFF_(0,1,r,t)
+#define FCNVFF_D_S(r,t) FCNVFF_(1,0,r,t)
+#define FCNVXF_(s,d,r,t) f46(0xc,r,0,1,d,s,1,0,0,t)
+#define FCNVXF_S_S(r,t) FCNVXF_(0,0,r,t)
+#define FCNVXF_S_D(r,t) FCNVXF_(0,1,r,t)
+#define FCNVXT_(s,d,r,t) f46(0xc,r,0,3,d,s,1,0,0,t)
+#define FCNVXT_S_S(r,t) FCNVXT_(0,0,r,t)
+#define FCNVXT_D_S(r,t) FCNVXT_(1,0,r,t)
+#define FCPY_(f,r,t) f49(0xe,r,0,2,0,f,0,0,0,0,0,t)
+#define FCPY_S(r,t) FCPY_(0,r,t)
+#define FCPY_D(r,t) FCPY_(1,r,t)
+#define FCPY_Q(r,t) f45(0xc,r,0,2,2,0,0,0,t)
+#define FDIV_(f,r1,r2,t) f52(0xe,r1,r2,3,0,f,3,0,0,0,0,t)
+#define FDIV_S(r1,r2,t) FDIV_(0,r1,r2,t)
+#define FDIV_D(r1,r2,t) FDIV_(1,r1,r2,t)
+#define FDIV_Q(r1,r2,t) f48(0xc,r1,r2,3,3,3,0,0,t)
+#define FID() f45(0xc,0,0,0,2,0,0,0,0)
+#define FLDDL(i,b,t) f3(0x14,b,t,i,1)
+#define FLDD(x,b,t) f39(0xb,b,x,t)
+#define FLDDI(i,b,t) f41(0xb,b,i,t)
+#define FLDWL(i,b,t) f43(0x17,b,t,i)
+#define FLDW(x,b,t) f39(0x9,b,x,t)
+#define FLDWI(i,b,t) f41(0x9,b,i,t)
+#define FMPY_(f,r1,r2,t) f52(0xe,r1,r2,2,0,f,3,0,0,0,0,t)
+#define FMPY_S(r1,r2,t) FMPY_(0,r1,r2,t)
+#define FMPY_D(r1,r2,t) FMPY_(1,r1,r2,t)
+#define FMPY_Q(r1,r2,t) f48(0xc,r1,r2,2,3,3,0,0,t)
+/* FIXME not disassembled */
+#define FMPYADD_(f,r1,r2,ta,ra,tm) f53(0x6,r1,r2,ta,ra,f,tm)
+#define FMPYADD_S(r1,r2,ta,ra,tm) FMPYADD_(0,r1,r2,ta,ra,tm)
+#define FMPYADD_D(r1,r2,ta,ra,tm) FMPYADD_(1,r1,r2,ta,ra,tm)
+#define FMPYFADD_(f,r1,r2,ra,t) f54(0x2e,r1,r2,ra>>3,0,f,(ra)&7,0,0,0,t)
+#define FMPYFADD_S(r1,r2,ra,t) FMPYFADD_(0,r1,r2,ra,t)
+#define FMPYFADD_D(r1,r2,ra,t) FMPYFADD_(1,r1,r2,ra,t)
+#define FMPYNFADD_(f,r1,r2,ra,t) f54(0x2e,r1,r2,ra>>3,0,f,(ra)&7,0,0,1,t)
+#define FMPYNFADD_S(r1,r2,ra,t) FMPYNFADD_(0,r1,r2,ra,t)
+#define FMPYNFADD_D(r1,r2,ra,t) FMPYNFADD_(1,r1,r2,ra,t)
+#define FMPYSUB_(f,r1,r2,ta,ra,tm) f53(0x26,r1,r2,ta,ra,f,tm)
+#define FMPYSUB_S(r1,r2,ta,ra,tm) FMPYSUB_(0,r1,r2,ta,ra,tm)
+#define FMPYSUB_D(r1,r2,ta,ra,tm) FMPYSUB_(1,r1,r2,ta,ra,tm)
+#define FNEG_(f,r,t) f49(0xe,r,0,6,0,f,0,0,0,0,0,t)
+#define FNEG_S(r,t) FNEG_(0,r,t)
+#define FNEG_D(r,t) FNEG_(1,r,t)
+/* FIXME not disassembled */
+#define FNEG_Q(r,t) f45(0xc,r,0,6,3,0,0,0,t)
+#define FNEGABS_(f,r,t) f49(0xe,r,0,7,0,f,0,0,0,0,0,t)
+#define FNEGABS_S(r,t) FNEGABS_(0,r,t)
+#define FNEGABS_D(r,t) FNEGABS_(1,r,t)
+#define FNEGABS_Q(r,t) f45(0xc,r,0,7,3,0,0,0,t)
+#define FRND_(f,r,t) f49(0xe,r,0,5,0,f,0,0,0,0,0,t)
+#define FRND_S(r,t) FRND_(0,r,t)
+#define FRND_D(r,t) FRND_(1,r,t)
+#define FRND_Q(r,t) f45(0xc,r,0,5,3,0,0,0,t)
+#define FSQRT_(f,r,t) f49(0xe,r,0,4,0,f,0,0,0,0,0,t)
+#define FSQRT_S(r,t) FSQRT_(0,r,t)
+#define FSQRT_D(r,t) FSQRT_(1,r,t)
+#define FSQRT_Q(r,t) f45(0xc,r,0,4,3,0,0,0,t)
+#define FSTDL(r,i,b) f3(0x1c,b,r,i,1)
+#define FSTD(r,x,b) f40(0xb,b,x,r)
+#define FSTDI(r,i,b) f42(0xb,b,i,r)
+#define FSTWL(r,i,b) f43(0x1f,b,r,i)
+#define FSTW(r,x,b) f40(0x9,b,x,r)
+#define FSTWI(r,i,b) f42(0x9,b,i,r)
+#define FSUB_(f,r1,r2,t) f52(0xe,r1,r2,1,0,f,3,0,0,0,0,t)
+#define FSUB_S(r1,r2,t) FSUB_(0,r1,r2,t)
+#define FSUB_D(r1,r2,t) FSUB_(1,r1,r2,t)
+#define FSUB_Q(r1,r2,t) f48(0xc,r1,r2,1,3,3,0,0,t)
+#define FTEST_(c) f47(0xc,0,0,0,0,2,0,1,c)
+#define FTEST() f47(0xc,0,0,1,0,2,0,1,0)
+#define FTEST_LT() FTEST_(FCMP_LT)
+#define FTEST_LE() FTEST_(FCMP_LE)
+#define FTEST_EQ() FTEST_(FCMP_EQ)
+#define FTEST_GE() FTEST_(FCMP_GE)
+#define FTEST_GT() FTEST_(FCMP_GT)
+#define FTEST_NE() FTEST_(FCMP_NE)
+#define FTEST_UNLT() FTEST_(FCMP_UNLT)
+#define FTEST_UNLE() FTEST_(FCMP_UNLE)
+#define FTEST_UNEQ() FTEST_(FCMP_UNEQ)
+#define FTEST_UNGE() FTEST_(FCMP_UNGE)
+#define FTEST_UNGT() FTEST_(FCMP_UNGT)
+#define FTEST_LTGT() FTEST_(FCMP_LTGT)
+#define FTEST_ORD() FTEST_(FCMP_ORD)
+#define FTEST_UNORD() FTEST_(FCMP_UNORD)
+#define XMPYU(r1,r2,t) f52(0xe,r1,r2,2,0,0,3,1,0,0,0,t)
+#define XMPYU_L_R(r1,r2,t) f52(0xe,r1,r2,2,1,0,3,1,0,0,0,t)
+#define XMPYU_R_L(r1,r2,t) f52(0xe,r1,r2,2,0,0,3,1,1,0,0,t)
+#define XMPYU_R_R(r1,r2,t) f52(0xe,r1,r2,2,1,0,3,1,1,0,0,t)
+#define negr_f(r0,r1) FNEG_S(r1,r0)
+#define negr_d(r0,r1) FNEG_D(r1,r0)
+#define sqrtr_f(r0,r1) FSQRT_S(r1,r0)
+#define sqrtr_d(r0,r1) FSQRT_D(r1,r0)
+#define extr_f(r0,r1) _extr_f(_jit,r0,r1)
+static void _extr_f(jit_state_t*,jit_int32_t,jit_int32_t);
+#define extr_d(r0,r1) _extr_d(_jit,r0,r1)
+static void _extr_d(jit_state_t*,jit_int32_t,jit_int32_t);
+#define extr_f_d(r0,r1) FCNVFF_S_D(r1,r0)
+#define extr_d_f(r0,r1) FCNVFF_D_S(r1,r0)
+#define truncr_f(r0,r1) truncr_f_i(r0,r1)
+#define truncr_f_i(r0,r1) _truncr_f_i(_jit,r0,r1)
+static void _truncr_f_i(jit_state_t*,jit_int32_t,jit_int32_t);
+#define truncr_d(r0,r1) truncr_d_i(r0,r1)
+#define truncr_d_i(r0,r1) _truncr_d_i(_jit,r0,r1)
+static void _truncr_d_i(jit_state_t*,jit_int32_t,jit_int32_t);
+#define movr_f(r0,r1) FCPY_S(r1,r0)
+#define movi_f(r0,i0) _movi_f(_jit,r0,i0)
+static void _movi_f(jit_state_t*,jit_int32_t,jit_float32_t*);
+#define movr_d(r0,r1) FCPY_D(r1,r0)
+#define movi_d(r0,i0) _movi_d(_jit,r0,i0)
+static void _movi_d(jit_state_t*,jit_int32_t,jit_float64_t*);
+#define absr_f(r0,r1) FABS_S(r1,r0)
+#define absr_d(r0,r1) FABS_D(r1,r0)
+#define addr_f(r0,r1,r2) FADD_S(r1,r2,r0)
+#define addi_f(r0,r1,i0) _addi_f(_jit,r0,r1,i0)
+static void _addi_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
+#define addr_d(r0,r1,r2) FADD_D(r1,r2,r0)
+#define addi_d(r0,r1,i0) _addi_d(_jit,r0,r1,i0)
+static void _addi_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
+#define subr_f(r0,r1,r2) FSUB_S(r1,r2,r0)
+#define subi_f(r0,r1,i0) _subi_f(_jit,r0,r1,i0)
+static void _subi_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
+#define subr_d(r0,r1,r2) FSUB_D(r1,r2,r0)
+#define subi_d(r0,r1,i0) _subi_d(_jit,r0,r1,i0)
+static void _subi_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
+#define rsbr_f(r0,r1,r2) subr_f(r0,r2,r1)
+#define rsbi_f(r0,r1,i0) _rsbi_f(_jit,r0,r1,i0)
+static void _rsbi_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
+#define rsbr_d(r0,r1,r2) subr_d(r0,r2,r1)
+#define rsbi_d(r0,r1,i0) _rsbi_d(_jit,r0,r1,i0)
+static void _rsbi_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
+#define mulr_f(r0,r1,r2) FMPY_S(r1,r2,r0)
+#define muli_f(r0,r1,i0) _muli_f(_jit,r0,r1,i0)
+static void _muli_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
+#define mulr_d(r0,r1,r2) FMPY_D(r1,r2,r0)
+#define muli_d(r0,r1,i0) _muli_d(_jit,r0,r1,i0)
+static void _muli_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
+#define divr_f(r0,r1,r2) FDIV_S(r1,r2,r0)
+#define divi_f(r0,r1,i0) _divi_f(_jit,r0,r1,i0)
+static void _divi_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
+#define divr_d(r0,r1,r2) FDIV_D(r1,r2,r0)
+#define divi_d(r0,r1,i0) _divi_d(_jit,r0,r1,i0)
+static void _divi_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
+#define cmpr_f(c,r0,r1,r2) _cmpr_f(_jit,c,r0,r1,r2)
+static void _cmpr_f(jit_state_t*,jit_word_t,
+ jit_int32_t,jit_int32_t,jit_int32_t);
+#define cmpi_f(c,r0,r1,i0) _cmpi_f(_jit,c,r0,r1,i0)
+static void _cmpi_f(jit_state_t*,jit_word_t,
+ jit_int32_t,jit_int32_t,jit_float32_t*);
+#define cmpr_d(c,r0,r1,r2) _cmpr_d(_jit,c,r0,r1,r2)
+static void _cmpr_d(jit_state_t*,jit_word_t,
+ jit_int32_t,jit_int32_t,jit_int32_t);
+#define cmpi_d(c,r0,r1,i0) _cmpi_d(_jit,c,r0,r1,i0)
+static void _cmpi_d(jit_state_t*,jit_word_t,
+ jit_int32_t,jit_int32_t,jit_float64_t*);
+#define ltr_f(r0,r1,r2) cmpr_f(FCMP_LT,r0,r1,r2)
+#define lti_f(r0,r1,i0) cmpi_f(FCMP_LT,r0,r1,i0)
+#define ltr_d(r0,r1,r2) cmpr_d(FCMP_LT,r0,r1,r2)
+#define lti_d(r0,r1,i0) cmpi_d(FCMP_LT,r0,r1,i0)
+#define ler_f(r0,r1,r2) cmpr_f(FCMP_LE,r0,r1,r2)
+#define lei_f(r0,r1,i0) cmpi_f(FCMP_LE,r0,r1,i0)
+#define ler_d(r0,r1,r2) cmpr_d(FCMP_LE,r0,r1,r2)
+#define lei_d(r0,r1,i0) cmpi_d(FCMP_LE,r0,r1,i0)
+#define eqr_f(r0,r1,r2) cmpr_f(FCMP_EQ,r0,r1,r2)
+#define eqi_f(r0,r1,i0) cmpi_f(FCMP_EQ,r0,r1,i0)
+#define eqr_d(r0,r1,r2) cmpr_d(FCMP_EQ,r0,r1,r2)
+#define eqi_d(r0,r1,i0) cmpi_d(FCMP_EQ,r0,r1,i0)
+#define ger_f(r0,r1,r2) cmpr_f(FCMP_GE,r0,r1,r2)
+#define gei_f(r0,r1,i0) cmpi_f(FCMP_GE,r0,r1,i0)
+#define ger_d(r0,r1,r2) cmpr_d(FCMP_GE,r0,r1,r2)
+#define gei_d(r0,r1,i0) cmpi_d(FCMP_GE,r0,r1,i0)
+#define gtr_f(r0,r1,r2) cmpr_f(FCMP_GT,r0,r1,r2)
+#define gti_f(r0,r1,i0) cmpi_f(FCMP_GT,r0,r1,i0)
+#define gtr_d(r0,r1,r2) cmpr_d(FCMP_GT,r0,r1,r2)
+#define gti_d(r0,r1,i0) cmpi_d(FCMP_GT,r0,r1,i0)
+#define ner_f(r0,r1,r2) cmpr_f(FCMP_NE,r0,r1,r2)
+#define nei_f(r0,r1,i0) cmpi_f(FCMP_NE,r0,r1,i0)
+#define ner_d(r0,r1,r2) cmpr_d(FCMP_NE,r0,r1,r2)
+#define nei_d(r0,r1,i0) cmpi_d(FCMP_NE,r0,r1,i0)
+#define unltr_f(r0,r1,r2) cmpr_f(FCMP_UNLT,r0,r1,r2)
+#define unlti_f(r0,r1,i0) cmpi_f(FCMP_UNLT,r0,r1,i0)
+#define unltr_d(r0,r1,r2) cmpr_d(FCMP_UNLT,r0,r1,r2)
+#define unlti_d(r0,r1,i0) cmpi_d(FCMP_UNLT,r0,r1,i0)
+#define unler_f(r0,r1,r2) cmpr_f(FCMP_UNLE,r0,r1,r2)
+#define unlei_f(r0,r1,i0) cmpi_f(FCMP_UNLE,r0,r1,i0)
+#define unler_d(r0,r1,r2) cmpr_d(FCMP_UNLE,r0,r1,r2)
+#define unlei_d(r0,r1,i0) cmpi_d(FCMP_UNLE,r0,r1,i0)
+#define uneqr_f(r0,r1,r2) cmpr_f(FCMP_UNEQ,r0,r1,r2)
+#define uneqi_f(r0,r1,i0) cmpi_f(FCMP_UNEQ,r0,r1,i0)
+#define uneqr_d(r0,r1,r2) cmpr_d(FCMP_UNEQ,r0,r1,r2)
+#define uneqi_d(r0,r1,i0) cmpi_d(FCMP_UNEQ,r0,r1,i0)
+#define unger_f(r0,r1,r2) cmpr_f(FCMP_UNGE,r0,r1,r2)
+#define ungei_f(r0,r1,i0) cmpi_f(FCMP_UNGE,r0,r1,i0)
+#define unger_d(r0,r1,r2) cmpr_d(FCMP_UNGE,r0,r1,r2)
+#define ungei_d(r0,r1,i0) cmpi_d(FCMP_UNGE,r0,r1,i0)
+#define ungtr_f(r0,r1,r2) cmpr_f(FCMP_UNGT,r0,r1,r2)
+#define ungti_f(r0,r1,i0) cmpi_f(FCMP_UNGT,r0,r1,i0)
+#define ungtr_d(r0,r1,r2) cmpr_d(FCMP_UNGT,r0,r1,r2)
+#define ungti_d(r0,r1,i0) cmpi_d(FCMP_UNGT,r0,r1,i0)
+#define ltgtr_f(r0,r1,r2) cmpr_f(FCMP_LTGT,r0,r1,r2)
+#define ltgti_f(r0,r1,i0) cmpi_f(FCMP_LTGT,r0,r1,i0)
+#define ltgtr_d(r0,r1,r2) cmpr_d(FCMP_LTGT,r0,r1,r2)
+#define ltgti_d(r0,r1,i0) cmpi_d(FCMP_LTGT,r0,r1,i0)
+#define ordr_f(r0,r1,r2) cmpr_f(FCMP_ORD,r0,r1,r2)
+#define ordi_f(r0,r1,i0) cmpi_f(FCMP_ORD,r0,r1,i0)
+#define ordr_d(r0,r1,r2) cmpr_d(FCMP_ORD,r0,r1,r2)
+#define ordi_d(r0,r1,i0) cmpi_d(FCMP_ORD,r0,r1,i0)
+#define unordr_f(r0,r1,r2) cmpr_f(FCMP_UNORD,r0,r1,r2)
+#define unordi_f(r0,r1,i0) cmpi_f(FCMP_UNORD,r0,r1,i0)
+#define unordr_d(r0,r1,r2) cmpr_d(FCMP_UNORD,r0,r1,r2)
+#define unordi_d(r0,r1,i0) cmpi_d(FCMP_UNORD,r0,r1,i0)
+#define ldr_f(r0,r1) FLDWI(0,r1,r0)
+#define ldi_f(r0,i0) _ldi_f(_jit,r0,i0)
+static void _ldi_f(jit_state_t*,jit_int32_t,jit_word_t);
+#if FLDXR
+# define ldxr_f(r0,r1,r2) FLDW(r2,r1,r0)
+# define ldxr_d(r0,r1,r2) FLDD(r2,r1,r0)
+#else
+#define ldxr_f(r0,r1,r2) _ldxr_f(_jit,r0,r1,r2)
+static void _ldxr_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
+#define ldxr_d(r0,r1,r2) _ldxr_d(_jit,r0,r1,r2)
+static void _ldxr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
+#endif
+#define ldxi_f(r0,r1,i0) _ldxi_f(_jit,r0,r1,i0)
+static void _ldxi_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
+#define ldr_d(r0,r1) FLDDI(0,r1,r0)
+#define ldi_d(r0,i0) _ldi_d(_jit,r0,i0)
+static void _ldi_d(jit_state_t*,jit_int32_t,jit_word_t);
+#define ldxi_d(r0,r1,i0) _ldxi_d(_jit,r0,r1,i0)
+static void _ldxi_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
+#define str_f(r0,r1) FSTWI(r1,0,r0)
+#define sti_f(i0,r0) _sti_f(_jit,i0,r0)
+static void _sti_f(jit_state_t*,jit_word_t,jit_int32_t);
+#if FSTXR
+# define stxr_f(r0,r1,r2) FSTW(r2,r1,r0)
+# define stxr_d(r0,r1,r2) FSTD(r2,r1,r0)
+#else
+# define stxr_f(r0,r1,r2) _stxr_f(_jit,r0,r1,r2)
+static void _stxr_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
+# define stxr_d(r0,r1,r2) _stxr_d(_jit,r0,r1,r2)
+static void _stxr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
+#endif
+#define stxi_f(i0,r0,r1) _stxi_f(_jit,i0,r0,r1)
+static void _stxi_f(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
+#define str_d(r0,r1) FSTDI(r1,0,r0)
+#define sti_d(i0,r0) _sti_d(_jit,i0,r0)
+static void _sti_d(jit_state_t*,jit_word_t,jit_int32_t);
+#define stxi_d(i0,r0,r1) _stxi_d(_jit,i0,r0,r1)
+static void _stxi_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
+#define bcmpr_f(c,i0,r0,r1) _bcmpr_f(_jit,c,i0,r0,r1)
+static jit_word_t _bcmpr_f(jit_state_t*,jit_word_t,
+ jit_word_t,jit_int32_t,jit_int32_t);
+#define bcmpi_f(c,i0,r0,i1) _bcmpi_f(_jit,c,i0,r0,i1)
+static jit_word_t _bcmpi_f(jit_state_t*,jit_word_t,
+ jit_word_t,jit_int32_t,jit_float32_t*);
+#define bcmpr_d(c,i0,r0,r1) _bcmpr_d(_jit,c,i0,r0,r1)
+static jit_word_t _bcmpr_d(jit_state_t*,jit_word_t,
+ jit_word_t,jit_int32_t,jit_int32_t);
+#define bcmpi_d(c,i0,r0,i1) _bcmpi_d(_jit,c,i0,r0,i1)
+static jit_word_t _bcmpi_d(jit_state_t*,jit_word_t,
+ jit_word_t,jit_int32_t,jit_float64_t*);
+#define bltr_f(i0,r0,r1) bcmpr_f(FCMP_LT,i0,r0,r1)
+#define blti_f(i0,r0,i1) bcmpi_f(FCMP_LT,i0,r0,i1)
+#define bltr_d(i0,r0,r1) bcmpr_d(FCMP_LT,i0,r0,r1)
+#define blti_d(i0,r0,i1) bcmpi_d(FCMP_LT,i0,r0,i1)
+#define bler_f(i0,r0,r1) bcmpr_f(FCMP_LE,i0,r0,r1)
+#define blei_f(i0,r0,i1) bcmpi_f(FCMP_LE,i0,r0,i1)
+#define bler_d(i0,r0,r1) bcmpr_d(FCMP_LE,i0,r0,r1)
+#define blei_d(i0,r0,i1) bcmpi_d(FCMP_LE,i0,r0,i1)
+#define beqr_f(i0,r0,r1) bcmpr_f(FCMP_EQ,i0,r0,r1)
+#define beqi_f(i0,r0,i1) bcmpi_f(FCMP_EQ,i0,r0,i1)
+#define beqr_d(i0,r0,r1) bcmpr_d(FCMP_EQ,i0,r0,r1)
+#define beqi_d(i0,r0,i1) bcmpi_d(FCMP_EQ,i0,r0,i1)
+#define bger_f(i0,r0,r1) bcmpr_f(FCMP_GE,i0,r0,r1)
+#define bgei_f(i0,r0,i1) bcmpi_f(FCMP_GE,i0,r0,i1)
+#define bger_d(i0,r0,r1) bcmpr_d(FCMP_GE,i0,r0,r1)
+#define bgei_d(i0,r0,i1) bcmpi_d(FCMP_GE,i0,r0,i1)
+#define bgtr_f(i0,r0,r1) bcmpr_f(FCMP_GT,i0,r0,r1)
+#define bgti_f(i0,r0,i1) bcmpi_f(FCMP_GT,i0,r0,i1)
+#define bgtr_d(i0,r0,r1) bcmpr_d(FCMP_GT,i0,r0,r1)
+#define bgti_d(i0,r0,i1) bcmpi_d(FCMP_GT,i0,r0,i1)
+#define bner_f(i0,r0,r1) bcmpr_f(FCMP_NE,i0,r0,r1)
+#define bnei_f(i0,r0,i1) bcmpi_f(FCMP_NE,i0,r0,i1)
+#define bner_d(i0,r0,r1) bcmpr_d(FCMP_NE,i0,r0,r1)
+#define bnei_d(i0,r0,i1) bcmpi_d(FCMP_NE,i0,r0,i1)
+#define bunltr_f(i0,r0,r1) bcmpr_f(FCMP_UNLT,i0,r0,r1)
+#define bunlti_f(i0,r0,i1) bcmpi_f(FCMP_UNLT,i0,r0,i1)
+#define bunltr_d(i0,r0,r1) bcmpr_d(FCMP_UNLT,i0,r0,r1)
+#define bunlti_d(i0,r0,i1) bcmpi_d(FCMP_UNLT,i0,r0,i1)
+#define bunler_f(i0,r0,r1) bcmpr_f(FCMP_UNLE,i0,r0,r1)
+#define bunlei_f(i0,r0,i1) bcmpi_f(FCMP_UNLE,i0,r0,i1)
+#define bunler_d(i0,r0,r1) bcmpr_d(FCMP_UNLE,i0,r0,r1)
+#define bunlei_d(i0,r0,i1) bcmpi_d(FCMP_UNLE,i0,r0,i1)
+#define buneqr_f(i0,r0,r1) bcmpr_f(FCMP_UNEQ,i0,r0,r1)
+#define buneqi_f(i0,r0,i1) bcmpi_f(FCMP_UNEQ,i0,r0,i1)
+#define buneqr_d(i0,r0,r1) bcmpr_d(FCMP_UNEQ,i0,r0,r1)
+#define buneqi_d(i0,r0,i1) bcmpi_d(FCMP_UNEQ,i0,r0,i1)
+#define bunger_f(i0,r0,r1) bcmpr_f(FCMP_UNGE,i0,r0,r1)
+#define bungei_f(i0,r0,i1) bcmpi_f(FCMP_UNGE,i0,r0,i1)
+#define bunger_d(i0,r0,r1) bcmpr_d(FCMP_UNGE,i0,r0,r1)
+#define bungei_d(i0,r0,i1) bcmpi_d(FCMP_UNGE,i0,r0,i1)
+#define bungtr_f(i0,r0,r1) bcmpr_f(FCMP_UNGT,i0,r0,r1)
+#define bungti_f(i0,r0,i1) bcmpi_f(FCMP_UNGT,i0,r0,i1)
+#define bungtr_d(i0,r0,r1) bcmpr_d(FCMP_UNGT,i0,r0,r1)
+#define bungti_d(i0,r0,i1) bcmpi_d(FCMP_UNGT,i0,r0,i1)
+#define bltgtr_f(i0,r0,r1) bcmpr_f(FCMP_LTGT,i0,r0,r1)
+#define bltgti_f(i0,r0,i1) bcmpi_f(FCMP_LTGT,i0,r0,i1)
+#define bltgtr_d(i0,r0,r1) bcmpr_d(FCMP_LTGT,i0,r0,r1)
+#define bltgti_d(i0,r0,i1) bcmpi_d(FCMP_LTGT,i0,r0,i1)
+#define bordr_f(i0,r0,r1) bcmpr_f(FCMP_ORD,i0,r0,r1)
+#define bordi_f(i0,r0,i1) bcmpi_f(FCMP_ORD,i0,r0,i1)
+#define bordr_d(i0,r0,r1) bcmpr_d(FCMP_ORD,i0,r0,r1)
+#define bordi_d(i0,r0,i1) bcmpi_d(FCMP_ORD,i0,r0,i1)
+#define bunordr_f(i0,r0,r1) bcmpr_f(FCMP_UNORD,i0,r0,r1)
+#define bunordi_f(i0,r0,i1) bcmpi_f(FCMP_UNORD,i0,r0,i1)
+#define bunordr_d(i0,r0,r1) bcmpr_d(FCMP_UNORD,i0,r0,r1)
+#define bunordi_d(i0,r0,i1) bcmpi_d(FCMP_UNORD,i0,r0,i1)
+#define vaarg_d(r0, r1) _vaarg_d(_jit, r0, r1)
+static void _vaarg_d(jit_state_t*, jit_int32_t, jit_int32_t);
+#endif
+
+#if CODE
+static void
+_f39(jit_state_t *_jit, jit_int32_t o,
+ jit_int32_t b, jit_int32_t x, jit_int32_t t)
+{
+ assert(!(o & ~0x3f));
+ assert(!(b & ~0x1f));
+ assert(!(x & ~0x1f));
+ assert(!(t & ~0x1f));
+ ii((o<<26)|(b<<21)|(x<<16)|t);
+}
+
+static void
+_f40(jit_state_t *_jit, jit_int32_t o,
+ jit_int32_t b, jit_int32_t x, jit_int32_t r)
+{
+ assert(!(o & ~0x3f));
+ assert(!(b & ~0x1f));
+ assert(!(x & ~0x1f));
+ assert(!(r & ~0x1f));
+ ii((o<<26)|(b<<21)|(x<<16)|(1<<9)|r);
+}
+
+static void
+_f41(jit_state_t *_jit, jit_int32_t o,
+ jit_int32_t b, jit_int32_t x, jit_int32_t t)
+{
+ assert(!(o & ~0x3f));
+ assert(!(b & ~0x1f));
+ assert(x >= -16 && x < 15);
+ assert(!(t & ~0x1f));
+ ii((o<<26)|(b<<21)|(low_sign_unext(x,5)<<16)|(1<<12)|t);
+}
+
+static void
+_f42(jit_state_t *_jit, jit_int32_t o,
+ jit_int32_t b, jit_int32_t i, jit_int32_t r)
+{
+ assert(!(o & ~0x3f));
+ assert(!(b & ~0x1f));
+ assert(i >= -16 && i < 15);
+ assert(!(r & ~0x1f));
+ ii((o<<26)|(b<<21)|(low_sign_unext(i,5)<<16)|(1<<12)|(1<<9)|r);
+}
+
+static void
+_f45(jit_state_t *_jit, jit_int32_t o,
+ jit_int32_t r, jit_int32_t a, jit_int32_t b, jit_int32_t fmt,
+ jit_int32_t c, jit_int32_t d, jit_int32_t e, jit_int32_t t)
+{
+ assert(!(o & ~0x3f));
+ assert(!(r & ~0x1f));
+ assert(!(a & ~0x1f));
+ assert(!(b & ~0x7));
+ assert(!(fmt & ~0x3));
+ assert(!(c & ~0x3));
+ assert(!(d & ~0x7));
+ assert(!(e & ~0x1));
+ assert(!(t & ~0x1f));
+ ii((o<<26)|(r<<21)|(a<<16)|(fmt<<13)|(b<<11)|(c<<9)|(d<<6)|(e<<5)|t);
+}
+
+static void
+_f46(jit_state_t *_jit, jit_int32_t o, jit_int32_t r,
+ jit_int32_t a, jit_int32_t s, jit_int32_t df, jit_int32_t sf,
+ jit_int32_t b, jit_int32_t c, jit_int32_t d, jit_int32_t t)
+{
+ assert(!(o & ~0x3f));
+ assert(!(r & ~0x1f));
+ assert(!(a & ~0x7));
+ assert(!(s & ~0x7));
+ assert(!(df & ~0x3));
+ assert(!(sf & ~0x3));
+ assert(!(b & ~0x3));
+ assert(!(c & ~0x7));
+ assert(!(d & ~0x1));
+ assert(!(t & ~0x1f));
+ ii((o<<26)|(r<<21)|(a<<18)|(s<<15)|
+ (df<<13)|(sf<<11)|(b<<9)|(c<<6)|(d<<5)|t);
+}
+
+static void
+_f47_48(jit_state_t *_jit, jit_int32_t o,
+ jit_int32_t r2, jit_int32_t r1, jit_int32_t y, jit_int32_t fmt,
+ jit_int32_t a, jit_int32_t b, jit_int32_t c, jit_int32_t t)
+{
+ assert(!(o & ~0x3f));
+ assert(!(r2 & ~0x1f));
+ assert(!(r1 & ~0x1f));
+ assert(!(y & ~0x7));
+ assert(!(fmt & ~0x3));
+ assert(!(a & ~0x3));
+ assert(!(b & ~0x7));
+ assert(!(c & ~0x1));
+ assert(!(t & ~0x1f));
+ ii((o<<26)|(r2<<21)|(r1<<16)|(y<<13)|(fmt<<11)|(a<<9)|(b<<6)|(c<<5)|t);
+}
+
+static void
+_f49_52(jit_state_t *_jit, jit_int32_t o,
+ jit_int32_t r1, jit_int32_t r2, jit_int32_t y,
+ jit_int32_t v, jit_int32_t f, jit_int32_t a, jit_int32_t b,
+ jit_int32_t u, jit_int32_t c, jit_int32_t d, jit_int32_t t)
+{
+ assert(!(o & ~0x3f));
+ assert(!(r1 & ~0x1f));
+ assert(!(r2 & ~0x3f));
+ assert(!(y & ~0x7));
+ assert(!(v & ~0x1));
+ assert(!(f & ~0x1));
+ assert(!(a & ~0x3));
+ assert(!(b & ~0x1));
+ assert(!(u & ~0x1));
+ assert(!(c & ~0x1));
+ assert(!(d & ~0x1));
+ assert(!(t & ~0x1f));
+ ii((o<<26)|(r1<<21)|(r2<<16)|(y<<13)|(v<<12)|
+ (f<<11)|(a<<9)|(b<<8)|(u<<7)|(c<<6)|(d<<5)|t);
+}
+
+static void
+_f53(jit_state_t *_jit, jit_int32_t o, jit_int32_t r1, jit_int32_t r2,
+ jit_int32_t ta, jit_int32_t ra, jit_int32_t f, jit_int32_t tm)
+{
+ assert(!(o & ~0x3f));
+ assert(!(r1 & ~0x1f));
+ assert(!(r2 & ~0x1f));
+ assert(!(ta & ~0x1f));
+ assert(!(ra & ~0x1f));
+ assert(!(f & ~0x1));
+ assert(!(tm & ~0x1f));
+ assert(ra != tm ||
+ (ta == r1 || ta == r2 || ta == tm) ||
+ (f && ra == 1) || (!f && !ra));
+ ii((o<<26)|(r1<<21)|(r2<<16)|(ta<<11)|(ra<<6)|(f<<5)|tm);
+}
+
+static void
+_f54(jit_state_t *_jit, jit_int32_t o, jit_int32_t r1, jit_int32_t r2,
+ jit_int32_t a, jit_int32_t b, jit_int32_t f, jit_int32_t c,
+ jit_int32_t d, jit_int32_t e, jit_int32_t g, jit_int32_t t)
+{
+ assert(!(o & ~0x3f));
+ assert(!(r1 & ~0x1f));
+ assert(!(r2 & ~0x1f));
+ assert(!(a & ~0x7));
+ assert(!(b & ~0x1));
+ assert(!(f & ~0x1));
+ assert(!(c & ~0x7));
+ assert(!(e & ~0x1));
+ assert(!(e & ~0x1));
+ assert(!(g & ~0x1));
+ assert(!(t & ~0x1f));
+ ii((o<<26)|(r1<<21)|(r2<<16)|(a<<13)|
+ (b<<12)|(f<11)|(c<<8)|(d<<7)|(e<<6)|(g<<5)|t);
+}
+
+static void
+_extr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
+{
+ stxi(alloca_offset - 8, _FP_REGNO, r1);
+ ldxi_f(r0, _FP_REGNO, alloca_offset - 8);
+ FCNVXF_S_S(r0, r0);
+}
+
+static void
+_extr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
+{
+ stxi(alloca_offset - 8, _FP_REGNO, r1);
+ ldxi_f(r0, _FP_REGNO, alloca_offset - 8);
+ FCNVXF_S_D(r0, r0);
+}
+
+static void
+_truncr_f_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
+{
+ jit_int32_t reg;
+ reg = jit_get_reg(jit_class_fpr);
+ FCNVXT_S_S(r1, rn(reg));
+ stxi_f(alloca_offset - 8, _FP_REGNO, rn(reg));
+ ldxi(r0, _FP_REGNO, alloca_offset - 8);
+ jit_unget_reg(reg);
+}
+
+static void
+_truncr_d_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
+{
+ jit_int32_t reg;
+ reg = jit_get_reg(jit_class_fpr);
+ FCNVXT_D_S(r1, rn(reg));
+ stxi_d(alloca_offset - 8, _FP_REGNO, rn(reg));
+ ldxi(r0, _FP_REGNO, alloca_offset - 8);
+ jit_unget_reg(reg);
+}
+
+static void
+_movi_f(jit_state_t *_jit, jit_int32_t r0, jit_float32_t *i0)
+{
+ union {
+ jit_int32_t i;
+ jit_float32_t f;
+ } data;
+ jit_int32_t reg;
+
+ if (_jitc->no_data) {
+ data.f = *i0;
+ reg = jit_get_reg(jit_class_gpr);
+ movi(rn(reg), data.i);
+ stxi_i(alloca_offset - 8, _FP_REGNO, rn(reg));
+ jit_unget_reg(reg);
+ ldxi_f(r0, _FP_REGNO, alloca_offset - 8);
+ }
+ else
+ ldi_f(r0, (jit_word_t)i0);
+}
+
+static void
+_movi_d(jit_state_t *_jit, jit_int32_t r0, jit_float64_t *i0)
+{
+ union {
+ jit_int32_t ii[2];
+ jit_word_t w;
+ jit_float64_t d;
+ } data;
+ jit_int32_t reg;
+
+ data.d = *i0;
+ if (_jitc->no_data) {
+ data.d = *i0;
+ reg = jit_get_reg(jit_class_gpr);
+ movi(rn(reg), data.ii[0]);
+ stxi_i(alloca_offset - 8, _FP_REGNO, rn(reg));
+ movi(rn(reg), data.ii[1]);
+ stxi_i(alloca_offset - 4, _FP_REGNO, rn(reg));
+ jit_unget_reg(reg);
+ ldxi_d(r0, _FP_REGNO, alloca_offset - 8);
+ }
+ else
+ ldi_d(r0, (jit_word_t)i0);
+}
+
+#define fpr_opi(name, type, size) \
+static void \
+_##name##i_##type(jit_state_t *_jit, \
+ jit_int32_t r0, jit_int32_t r1, \
+ jit_float##size##_t *i0) \
+{ \
+ jit_int32_t reg = jit_get_reg(jit_class_fpr); \
+ movi_##type(rn(reg), i0); \
+ name##r_##type(r0, r1, rn(reg)); \
+ jit_unget_reg(reg); \
+}
+#define fopi(name) fpr_opi(name, f, 32)
+#define dopi(name) fpr_opi(name, d, 64)
+
+fopi(add)
+dopi(add)
+fopi(sub)
+dopi(sub)
+fopi(rsb)
+dopi(rsb)
+fopi(mul)
+dopi(mul)
+fopi(div)
+dopi(div)
+
+static void
+_cmpr_f(jit_state_t *_jit, jit_word_t c,
+ jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
+{
+ LDI(0, r0);
+ FCMP_S_(r1, r2, c);
+ FTEST();
+ LDI(1, r0);
+}
+
+static void
+_cmpi_f(jit_state_t *_jit, jit_word_t c,
+ jit_int32_t r0, jit_int32_t r1, jit_float32_t *i0)
+{
+ jit_int32_t reg = jit_get_reg(jit_class_fpr);
+ movi_f(rn(reg), i0);
+ cmpr_f(c, r0, r1, rn(reg));
+ jit_unget_reg(reg);
+}
+
+static void
+_cmpr_d(jit_state_t *_jit, jit_word_t c,
+ jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
+{
+ LDI(0, r0);
+ FCMP_D_(r1, r2, c);
+ FTEST();
+ LDI(1, r0);
+}
+
+static void
+_cmpi_d(jit_state_t *_jit, jit_word_t c,
+ jit_int32_t r0, jit_int32_t r1, jit_float64_t *i0)
+{
+ jit_int32_t reg = jit_get_reg(jit_class_fpr);
+ movi_d(rn(reg), i0);
+ cmpr_d(c, r0, r1, rn(reg));
+ jit_unget_reg(reg);
+}
+
+static void
+_ldi_f(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
+{
+ jit_int32_t reg;
+ assert(!(i0 & 3));
+ if (i0 >= -8192 && i0 <= 8191 && !(re_assemble_16(i0) & 6))
+ FLDWL(i0, _R0_REGNO, r0);
+ else {
+ reg = jit_get_reg(jit_class_gpr);
+ movi(rn(reg), i0);
+ ldr_f(r0, rn(reg));
+ jit_unget_reg(reg);
+ }
+}
+
+#if !FLDXR
+static void
+_ldxr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
+{
+ jit_int32_t reg;
+ reg = jit_get_reg(jit_class_gpr);
+ addr(rn(reg), r1, r2);
+ ldr_f(r0, rn(reg));
+ jit_unget_reg(reg);
+}
+
+static void
+_ldxr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
+{
+ jit_int32_t reg;
+ reg = jit_get_reg(jit_class_gpr);
+ addr(rn(reg), r1, r2);
+ ldr_d(r0, rn(reg));
+ jit_unget_reg(reg);
+}
+#endif
+
+static void
+_ldxi_f(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)
+ FLDWI(i0, r1, r0);
+ /* |im11a|0|t|i| */
+ else if (FLDXR && i0 >= -8192 && i0 <= 8191 && !(re_assemble_16(i0) & 6))
+ FLDWL(i0, r1, r0);
+ else {
+ reg = jit_get_reg(jit_class_gpr);
+ movi(rn(reg), i0);
+ ldxr_f(r0, r1, rn(reg));
+ jit_unget_reg(reg);
+ }
+}
+
+static void
+_ldi_d(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
+{
+ jit_int32_t reg;
+ assert(!(i0 & 7));
+ if (i0 >= -8192 && i0 <= 8191 && !(re_assemble_16(i0) & 14))
+ FLDDL(i0, _R0_REGNO, r0);
+ else {
+ reg = jit_get_reg(jit_class_gpr);
+ movi(rn(reg), i0);
+ ldr_d(r0, rn(reg));
+ jit_unget_reg(reg);
+ }
+}
+
+static void
+_ldxi_d(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)
+ FLDDI(i0, r1, r0);
+ /* |im10a|m|a|1|i| */
+ else if (FLDXR && i0 >= -8192 && i0 <= 8191 && !(re_assemble_16(i0) & 14))
+ FLDDL(i0, r1, r0);
+ else {
+ reg = jit_get_reg(jit_class_gpr);
+ movi(rn(reg), i0);
+ ldxr_d(r0, r1, rn(reg));
+ jit_unget_reg(reg);
+ }
+}
+
+static void
+_sti_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
+{
+ jit_int32_t reg;
+ assert(!(i0 & 3));
+ if (i0 >= -8192 && i0 <= 8191 && !(re_assemble_16(i0) & 6))
+ FSTWL(r0, i0, _R0_REGNO);
+ else {
+ reg = jit_get_reg(jit_class_gpr);
+ movi(rn(reg), i0);
+ str_f(rn(reg), r0);
+ jit_unget_reg(reg);
+ }
+}
+
+#if !FSTXR
+static void
+_stxr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
+{
+ jit_int32_t reg;
+ reg = jit_get_reg(jit_class_gpr);
+ addr(rn(reg), r0, r1);
+ str_f(rn(reg), r2);
+ jit_unget_reg(reg);
+}
+
+static void
+_stxr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
+{
+ jit_int32_t reg;
+ reg = jit_get_reg(jit_class_gpr);
+ addr(rn(reg), r0, r1);
+ str_d(rn(reg), r2);
+ jit_unget_reg(reg);
+}
+#endif
+
+static void
+_stxi_f(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)
+ FSTWI(r1, i0, r0);
+ /* |im11a|0|t|i| */
+ else if (FSTXR && i0 >= -8192 && i0 <= 8191 && !(re_assemble_16(i0) & 6))
+ FSTWL(r1, i0, r0);
+ else {
+ reg = jit_get_reg(jit_class_gpr);
+#if FSTXR
+ movi(rn(reg), i0);
+ stxr_f(rn(reg), r0, r1);
+#else
+ addi(rn(reg), r0, i0);
+ str_f(rn(reg), r1);
+#endif
+ jit_unget_reg(reg);
+ }
+}
+
+static void
+_sti_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
+{
+ jit_int32_t reg;
+ assert(!(i0 & 7));
+ if (i0 >= -8192 && i0 <= 8191 && !(re_assemble_16(i0) & 14))
+ FSTDL(r0, i0, _R0_REGNO);
+ else {
+ reg = jit_get_reg(jit_class_gpr);
+ movi(rn(reg), i0);
+ str_d(rn(reg), r0);
+ jit_unget_reg(reg);
+ }
+}
+
+static void
+_stxi_d(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)
+ FSTDI(r1, i0, r0);
+ /* |im10a|m|a|1|i| */
+ else if (FSTXR && i0 >= -8192 && i0 <= 8191 && !(re_assemble_16(i0) & 14))
+ FSTDL(r1, i0, r0);
+ else {
+ reg = jit_get_reg(jit_class_gpr);
+#if FSTXR
+ movi(rn(reg), i0);
+ stxr_d(rn(reg), r0, r1);
+#else
+ addi(rn(reg), r0, i0);
+ str_d(rn(reg), r1);
+#endif
+ jit_unget_reg(reg);
+ }
+}
+
+static jit_word_t
+_bcmpr_f(jit_state_t *_jit, jit_word_t c,
+ jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
+{
+ jit_word_t w;
+ FCMP_S_(r0, r1, c);
+ FTEST();
+ w = _jit->pc.w;
+ B_N(((i0 - w) >> 2) - 2, _R0_REGNO);
+ NOP();
+ return (w);
+}
+
+static jit_word_t
+_bcmpi_f(jit_state_t *_jit, jit_word_t c,
+ jit_word_t i0, jit_int32_t r0, jit_float32_t *i1)
+{
+ jit_word_t w;
+ jit_int32_t reg;
+ reg = jit_get_reg(jit_class_fpr|jit_class_nospill);
+ movi_f(rn(reg), i1);
+ FCMP_S_(r0, rn(reg), c);
+ FTEST();
+ w = _jit->pc.w;
+ B_N(((i0 - w) >> 2) - 2, _R0_REGNO);
+ NOP();
+ jit_unget_reg(reg);
+ return (w);
+}
+
+static jit_word_t
+_bcmpr_d(jit_state_t *_jit, jit_word_t c,
+ jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
+{
+ jit_word_t w;
+ FCMP_D_(r0, r1, c);
+ FTEST();
+ w = _jit->pc.w;
+ B_N(((i0 - w) >> 2) - 2, _R0_REGNO);
+ NOP();
+ return (w);
+}
+
+static jit_word_t
+_bcmpi_d(jit_state_t *_jit, jit_word_t c,
+ jit_word_t i0, jit_int32_t r0, jit_float64_t *i1)
+{
+ jit_word_t w;
+ jit_int32_t reg;
+ reg = jit_get_reg(jit_class_fpr|jit_class_nospill);
+ movi_d(rn(reg), i1);
+ FCMP_D_(r0, rn(reg), c);
+ FTEST();
+ w = _jit->pc.w;
+ B_N(((i0 - w) >> 2) - 2, _R0_REGNO);
+ NOP();
+ jit_unget_reg(reg);
+ return (w);
+}
+
+static void
+_vaarg_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
+{
+ jit_int32_t reg;
+
+ assert(_jitc->function->self.call & jit_call_varargs);
+
+ /* Align pointer if required. */
+ reg = jit_get_reg(jit_class_gpr);
+ andi(rn(reg), r1, 7);
+ subr(r1, r1, rn(reg));
+ jit_unget_reg(reg);
+
+ /* Adjust vararg stack pointer. */
+ subi(r1, r1, 8);
+
+ /* Load argument. */
+ ldr_d(r0, r1);
+}
+#endif