mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-05-01 04:10:18 +02:00
* libguile/lightning/: New directory, made by the following commands: git remote add lightning https://git.savannah.gnu.org/git/lightning.git git merge -s ours --no-commit --allow-unrelated-histories lightning/master git read-tree --prefix=libguile/lightning/ -u lightning/master In theory we will be able to update via: git merge -s subtree lightning/master
1039 lines
35 KiB
C
1039 lines
35 KiB
C
/*
|
|
* Copyright (C) 2013-2017 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 if using these instructions */
|
|
#if defined(__hpux)
|
|
# define FSTXR 0
|
|
#else
|
|
# define FSTXR 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);
|
|
#define ldxr_f(r0,r1,r2) FLDW(r2,r1,r0)
|
|
#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 ldxr_d(r0,r1,r2) FLDD(r2,r1,r0)
|
|
#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);
|
|
}
|
|
}
|
|
|
|
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 (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 (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 (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 (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
|