diff options
Diffstat (limited to 'deps/lightning/lib/jit_hppa-fpu.c')
-rw-r--r-- | deps/lightning/lib/jit_hppa-fpu.c | 1070 |
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 |