mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-05-02 04:40:29 +02:00
* check/alu_rsb.ok, check/alu_rsb.tst: New files implementing tests for jit_rsb*. * check/Makefile.am, check/lightning.c, include/lightning.h, lib/jit_aarch64-cpu.c, lib/jit_aarch64-fpu.c, lib/jit_aarch64-sz.c, lib/jit_aarch64.c, lib/jit_alpha-cpu.c, lib/jit_alpha-fpu.c, lib/jit_alpha-sz.c, lib/jit_alpha.c, lib/jit_arm-cpu.c, lib/jit_arm-swf.c, lib/jit_arm-sz.c, lib/jit_arm-vfp.c, lib/jit_arm.c, lib/jit_hppa-cpu.c, lib/jit_hppa-fpu.c, lib/jit_hppa-sz.c, lib/jit_hppa.c, lib/jit_ia64-cpu.c, lib/jit_ia64-fpu.c, lib/jit_ia64-sz.c, lib/jit_ia64.c, lib/jit_mips-cpu.c, lib/jit_mips-fpu.c, lib/jit_mips-sz.c, lib/jit_mips.c, lib/jit_names.c, lib/jit_ppc-cpu.c, lib/jit_ppc-fpu.c, lib/jit_ppc-sz.c, lib/jit_ppc.c, lib/jit_s390x-cpu.c, lib/jit_s390x-fpu.c, lib/jit_s390x-sz.c, lib/jit_s390x.c, lib/jit_sparc-cpu.c, lib/jit_sparc-fpu.c, lib/jit_sparc-sz.c, lib/jit_sparc.c, lib/jit_x86-cpu.c, lib/jit_x86-sse.c, lib/jit_x86-sz.c, lib/jit_x86-x87.c, lib/jit_x86.c, lib/lightning.c: Implement jit_rsb*. This was a missing lightning 1.x interface, that on most backends is synthesized, but on a few backends (hppa and ia64), it can generate better code as on those there is, or the only instruction with an immediate is in "rsb" format (left operand).
1182 lines
37 KiB
C
1182 lines
37 KiB
C
/*
|
|
* Copyright (C) 2012, 2013 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
|
|
#define FA(o,d,a,b,c,x) _FA(_jit,o,d,a,b,c,x,0)
|
|
#define FA_(o,d,a,b,c,x) _FA(_jit,o,d,a,b,c,x,1)
|
|
static void _FA(jit_state_t*,int,int,int,int,int,int,int);
|
|
#define FXFL(o,m,b,x) _FXFL(_jit,o,m,b,x,0)
|
|
#define FXFL_(o,m,b,x) _FXFL(_jit,o,m,b,x,1)
|
|
static void _FXFL(jit_state_t*,int,int,int,int,int) maybe_unused;
|
|
# define FABS(d,b) FX(63,d,0,b,264)
|
|
# define FABS_(d,b) FX_(63,d,0,b,264)
|
|
# define FADD(d,a,b) FA(63,d,a,b,0,21)
|
|
# define FADD_(d,a,b) FA_(63,d,a,b,0,21)
|
|
# define FADDS(d,a,b) FA(59,d,a,b,0,21)
|
|
# define FADDS_(d,a,b) FA_(59,d,a,b,0,21)
|
|
# define FCFID(d,b) FX(63,d,0,b,846)
|
|
# define FCMPO(cr,a,b) FC(63,cr,0,a,b,32)
|
|
# define FCMPU(cr,a,b) FC(63,cr,0,a,b,0)
|
|
# define FCTIW(d,b) FX(63,d,0,b,14)
|
|
# define FCTIW_(d,b) FX_(63,d,0,b,14)
|
|
# define FCTIWZ(d,b) FX(63,d,0,b,15)
|
|
# define FCTIWZ_(d,b) FX_(63,d,0,b,15)
|
|
# define FCTID(d,b) FX(63,d,0,b,814)
|
|
# define FCTID_(d,b) FX_(63,d,0,b,814)
|
|
# define FCTIDZ(d,b) FX(63,d,0,b,815)
|
|
# define FCTIDZ_(d,b) FX_(63,d,0,b,815)
|
|
# define FDIV(d,a,b) FA(63,d,a,b,0,18)
|
|
# define FDIV_(d,a,b) FA_(63,d,a,b,0,18)
|
|
# define FDIVS(d,a,b) FA(59,d,a,b,0,18)
|
|
# define FDIVS_(d,a,b) FA_(59,d,a,b,0,18)
|
|
# define FMADD(d,a,b,c) FA(63,d,a,b,c,29)
|
|
# define FMADD_(d,a,b,c) FA(63,d,a,b,c,29)
|
|
# define FMADDS(d,a,b,c) FA(59,d,a,b,c,29)
|
|
# define FMADDS_(d,a,b,c) FA(59,d,a,b,c,29)
|
|
# define FMR(d,b) FX(63,d,0,b,72)
|
|
# define FMR_(d,b) FX_(63,d,0,b,72)
|
|
# define FMSUB(d,a,b,c) FA(63,d,a,b,c,28)
|
|
# define FMSUB_(d,a,b,c) FA(63,d,a,b,c,28)
|
|
# define FMSUBS(d,a,b,c) FA(59,d,a,b,c,28)
|
|
# define FMSUBS_(d,a,b,c) FA(59,d,a,b,c,28)
|
|
# define FMUL(d,a,c) FA(63,d,a,0,c,25)
|
|
# define FMUL_(d,a,c) FA_(63,d,a,0,c,25)
|
|
# define FMULS(d,a,c) FA(59,d,a,0,c,25)
|
|
# define FMULS_(d,a,c) FA_(59,d,a,0,c,25)
|
|
# define FNABS(d,b) FX(63,d,0,b,136)
|
|
# define FNABS_(d,b) FX_(63,d,0,b,136)
|
|
# define FNEG(d,b) FX(63,d,0,b,40)
|
|
# define FNEG_(d,b) FX_(63,d,0,b,40)
|
|
# define FNMADD(d,a,b,c) FA(63,d,a,b,c,31)
|
|
# define FNMADD_(d,a,b,c) FA_(63,d,a,b,c,31)
|
|
# define FNMADDS(d,a,b,c) FA(59,d,a,b,c,31)
|
|
# define FNMADDS_(d,a,b,c) FA_(59,d,a,b,c,31)
|
|
# define FNMSUB(d,a,b,c) FA(63,d,a,b,c,30)
|
|
# define FNMSUB_(d,a,b,c) FA_(63,d,a,b,c,30)
|
|
# define FNMSUBS(d,a,b,c) FA(59,d,a,b,c,30)
|
|
# define FNMSUBS_(d,a,b,c) FA_(59,d,a,b,c,30)
|
|
# define FRES(d,b) FA(59,d,0,b,0,24)
|
|
# define FRES_(d,b) FA_(59,d,0,b,0,24)
|
|
# define FRSP(d,b) FA(63,d,0,b,0,12)
|
|
# define FRSP_(d,b) FA_(63,d,0,b,0,12)
|
|
# define FRSQTRE(d,b) FA(63,d,0,b,0,26)
|
|
# define FRSQTRE_(d,b) FA_(63,d,0,b,0,26)
|
|
# define FSEL(d,a,b,c) FA(63,d,a,b,c,23)
|
|
# define FSEL_(d,a,b,c) FA_(63,d,a,b,c,23)
|
|
# define FSQRT(d,b) FA(63,d,0,b,0,22)
|
|
# define FSQRT_(d,b) FA_(63,d,0,b,0,22)
|
|
# define FSQRTS(d,b) FA(59,d,0,b,0,22)
|
|
# define FSQRTS_(d,b) FA_(59,d,0,b,0,22)
|
|
# define FSUB(d,a,b) FA(63,d,a,b,0,20)
|
|
# define FSUB_(d,a,b) FA(63,d,a,b,0,20)
|
|
# define FSUBS(d,a,b) FA(59,d,a,b,0,20)
|
|
# define FSUBS_(d,a,b) FA(59,d,a,b,0,20)
|
|
# define LFD(d,a,s) FDs(50,d,a,s)
|
|
# define LFDU(d,a,s) FDs(51,d,a,s)
|
|
# define LFDUX(d,a,b) FX(31,d,a,b,631)
|
|
# define LFDX(d,a,b) FX(31,d,a,b,599)
|
|
# define LFS(d,a,s) FDs(48,d,a,s)
|
|
# define LFSU(d,a,s) FDs(49,d,a,s)
|
|
# define LFSUX(d,a,b) FX(31,d,a,b,567)
|
|
# define LFSX(d,a,b) FX(31,d,a,b,535)
|
|
# define MCRFS(d,s) FXL(63,d<<2,(s)<<2,64)
|
|
# define MFFS(d) FX(63,d,0,0,583)
|
|
# define MFFS_(d) FX_(63,d,0,0,583)
|
|
# define MTFSB0(d) FX(63,d,0,0,70)
|
|
# define MTFSB0_(d) FX_(63,d,0,0,70)
|
|
# define MTFSB1(d) FX(63,d,0,0,38)
|
|
# define MTFSB1_(d) FX_(63,d,0,0,38)
|
|
# define MTFSF(m,b) FXFL(63,m,b,711)
|
|
# define MTFSF_(m,b) FXFL_(63,m,b,711)
|
|
# define MTFSFI(d,i) FX(63,d<<2,0,i<<1,134)
|
|
# define MTFSFI_(d,i) FX_(63,d<<2,0,i<<1,134)
|
|
# define STFD(s,a,d) FDs(54,s,a,d)
|
|
# define STFDU(s,a,d) FDs(55,s,a,d)
|
|
# define STFDUX(s,a,b) FX(31,s,a,b,759)
|
|
# define STFDX(s,a,b) FX(31,s,a,b,727)
|
|
# define STFIWX(s,a,b) FX(31,s,a,b,983)
|
|
# define STFS(s,a,d) FDs(52,s,a,d)
|
|
# define STFSU(s,a,d) FDs(53,s,a,d)
|
|
# define STFSUX(s,a,b) FX(31,s,a,b,695)
|
|
# define STFSX(s,a,b) FX(31,s,a,b,663)
|
|
# define movr_f(r0,r1) movr_d(r0,r1)
|
|
# define movr_d(r0,r1) _movr_d(_jit,r0,r1)
|
|
static void _movr_d(jit_state_t*,jit_int32_t,jit_int32_t);
|
|
# define movi_f(r0,i0) _movi_f(_jit,r0,i0)
|
|
static void _movi_f(jit_state_t*,jit_int32_t,jit_float32_t*);
|
|
# define movi_d(r0,i0) _movi_d(_jit,r0,i0)
|
|
static void _movi_d(jit_state_t*,jit_int32_t,jit_float64_t*);
|
|
# define extr_f(r0,r1) extr_d(r0,r1)
|
|
# define extr_d(r0,r1) _extr_d(_jit,r0,r1)
|
|
static void _extr_d(jit_state_t*,jit_int32_t,jit_int32_t);
|
|
# define truncr_f(r0,r1) truncr_d(r0,r1)
|
|
# define truncr_f_i(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);
|
|
# if __WORDSIZE == 32
|
|
# define truncr_d(r0,r1) truncr_d_i(r0,r1)
|
|
# else
|
|
# define truncr_d(r0,r1) truncr_d_l(r0,r1)
|
|
# define truncr_f_l(r0,r1) truncr_d_l(r0,r1)
|
|
# define truncr_d_l(r0,r1) _truncr_d_l(_jit,r0,r1)
|
|
static void _truncr_d_l(jit_state_t*,jit_int32_t,jit_int32_t);
|
|
# endif
|
|
# define extr_d_f(r0,r1) FRSP(r0,r1)
|
|
# define extr_f_d(r0,r1) movr_d(r0,r1)
|
|
# define absr_f(r0,r1) absr_d(r0,r1)
|
|
# define absr_d(r0,r1) FABS(r0,r1)
|
|
# define negr_f(r0,r1) negr_d(r0,r1)
|
|
# define negr_d(r0,r1) FNEG(r0,r1)
|
|
# define sqrtr_f(r0,r1) FSQRTS(r0,r1)
|
|
# define sqrtr_d(r0,r1) FSQRT(r0,r1)
|
|
# define addr_f(r0,r1,r2) FADDS(r0,r1,r2)
|
|
# define addr_d(r0,r1,r2) FADD(r0,r1,r2)
|
|
# 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 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) FSUBS(r0,r1,r2)
|
|
# 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(r0,r1,r2)
|
|
# 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) FMULS(r0,r1,r2)
|
|
# 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) FMUL(r0,r1,r2)
|
|
# 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) FDIVS(r0,r1,r2)
|
|
# 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(r0,r1,r2)
|
|
# 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 ltr_f(r0,r1,r2) ltr_d(r0,r1,r2)
|
|
# define ltr_d(r0,r1,r2) _ltr_d(_jit,r0,r1,r2)
|
|
static void _ltr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
|
|
# define lti_f(r0,r1,i0) _lti_f(_jit,r0,r1,i0)
|
|
static void _lti_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
|
|
# define lti_d(r0,r1,i0) _lti_d(_jit,r0,r1,i0)
|
|
static void _lti_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
|
|
# define ler_f(r0,r1,r2) ler_d(r0,r1,r2)
|
|
# define ler_d(r0,r1,r2) _ler_d(_jit,r0,r1,r2)
|
|
static void _ler_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
|
|
# define lei_f(r0,r1,i0) _lei_f(_jit,r0,r1,i0)
|
|
static void _lei_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
|
|
# define lei_d(r0,r1,i0) _lei_d(_jit,r0,r1,i0)
|
|
static void _lei_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
|
|
# define eqr_f(r0,r1,r2) eqr_d(r0,r1,r2)
|
|
# define eqr_d(r0,r1,r2) _eqr_d(_jit,r0,r1,r2)
|
|
static void _eqr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
|
|
# define eqi_f(r0,r1,i0) _eqi_f(_jit,r0,r1,i0)
|
|
static void _eqi_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
|
|
# define eqi_d(r0,r1,i0) _eqi_d(_jit,r0,r1,i0)
|
|
static void _eqi_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
|
|
# define ger_f(r0,r1,r2) ger_d(r0,r1,r2)
|
|
# define ger_d(r0,r1,r2) _ger_d(_jit,r0,r1,r2)
|
|
static void _ger_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
|
|
# define gei_f(r0,r1,i0) _gei_f(_jit,r0,r1,i0)
|
|
static void _gei_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
|
|
# define gei_d(r0,r1,i0) _gei_d(_jit,r0,r1,i0)
|
|
static void _gei_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
|
|
# define gtr_f(r0,r1,r2) gtr_d(r0,r1,r2)
|
|
# define gtr_d(r0,r1,r2) _gtr_d(_jit,r0,r1,r2)
|
|
static void _gtr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
|
|
# define gti_f(r0,r1,i0) _gti_f(_jit,r0,r1,i0)
|
|
static void _gti_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
|
|
# define gti_d(r0,r1,i0) _gti_d(_jit,r0,r1,i0)
|
|
static void _gti_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
|
|
# define ner_f(r0,r1,r2) ner_d(r0,r1,r2)
|
|
# define ner_d(r0,r1,r2) _ner_d(_jit,r0,r1,r2)
|
|
static void _ner_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
|
|
# define nei_f(r0,r1,i0) _nei_f(_jit,r0,r1,i0)
|
|
static void _nei_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
|
|
# define nei_d(r0,r1,i0) _nei_d(_jit,r0,r1,i0)
|
|
static void _nei_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
|
|
# define unltr_f(r0,r1,r2) unltr_d(r0,r1,r2)
|
|
# define unltr_d(r0,r1,r2) _unltr_d(_jit,r0,r1,r2)
|
|
static void _unltr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
|
|
# define unlti_f(r0,r1,i0) _unlti_f(_jit,r0,r1,i0)
|
|
static void _unlti_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
|
|
# define unlti_d(r0,r1,i0) _unlti_d(_jit,r0,r1,i0)
|
|
static void _unlti_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
|
|
# define unler_f(r0,r1,r2) unler_d(r0,r1,r2)
|
|
# define unler_d(r0,r1,r2) _unler_d(_jit,r0,r1,r2)
|
|
static void _unler_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
|
|
# define unlei_f(r0,r1,i0) _unlei_f(_jit,r0,r1,i0)
|
|
static void _unlei_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
|
|
# define unlei_d(r0,r1,i0) _unlei_d(_jit,r0,r1,i0)
|
|
static void _unlei_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
|
|
# define uneqr_f(r0,r1,r2) uneqr_d(r0,r1,r2)
|
|
# define uneqr_d(r0,r1,r2) _uneqr_d(_jit,r0,r1,r2)
|
|
static void _uneqr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
|
|
# define uneqi_f(r0,r1,i0) _uneqi_f(_jit,r0,r1,i0)
|
|
static void _uneqi_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
|
|
# define uneqi_d(r0,r1,i0) _uneqi_d(_jit,r0,r1,i0)
|
|
static void _uneqi_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
|
|
# define unger_f(r0,r1,r2) unger_d(r0,r1,r2)
|
|
# define unger_d(r0,r1,r2) _unger_d(_jit,r0,r1,r2)
|
|
static void _unger_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
|
|
# define ungei_f(r0,r1,i0) _ungei_f(_jit,r0,r1,i0)
|
|
static void _ungei_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
|
|
# define ungei_d(r0,r1,i0) _ungei_d(_jit,r0,r1,i0)
|
|
static void _ungei_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
|
|
# define ungtr_f(r0,r1,r2) ungtr_d(r0,r1,r2)
|
|
# define ungtr_d(r0,r1,r2) _ungtr_d(_jit,r0,r1,r2)
|
|
static void _ungtr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
|
|
# define ungti_f(r0,r1,i0) _ungti_f(_jit,r0,r1,i0)
|
|
static void _ungti_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
|
|
# define ungti_d(r0,r1,i0) _ungti_d(_jit,r0,r1,i0)
|
|
static void _ungti_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
|
|
# define ltgtr_f(r0,r1,r2) ltgtr_d(r0,r1,r2)
|
|
# define ltgtr_d(r0,r1,r2) _ltgtr_d(_jit,r0,r1,r2)
|
|
static void _ltgtr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
|
|
# define ltgti_f(r0,r1,i0) _ltgti_f(_jit,r0,r1,i0)
|
|
static void _ltgti_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
|
|
# define ltgti_d(r0,r1,i0) _ltgti_d(_jit,r0,r1,i0)
|
|
static void _ltgti_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
|
|
# define ordr_f(r0,r1,r2) ordr_d(r0,r1,r2)
|
|
# define ordr_d(r0,r1,r2) _ordr_d(_jit,r0,r1,r2)
|
|
static void _ordr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
|
|
# define ordi_f(r0,r1,i0) _ordi_f(_jit,r0,r1,i0)
|
|
static void _ordi_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
|
|
# define ordi_d(r0,r1,i0) _ordi_d(_jit,r0,r1,i0)
|
|
static void _ordi_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
|
|
# define unordr_f(r0,r1,r2) unordr_d(r0,r1,r2)
|
|
# define unordr_d(r0,r1,r2) _unordr_d(_jit,r0,r1,r2)
|
|
static void _unordr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
|
|
# define unordi_f(r0,r1,i0) _unordi_f(_jit,r0,r1,i0)
|
|
static void _unordi_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
|
|
# define unordi_d(r0,r1,i0) _unordi_d(_jit,r0,r1,i0)
|
|
static void _unordi_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
|
|
# define bltr_f(i0,r0,r1) bltr_d(i0,r0,r1)
|
|
# define bltr_d(i0,r0,r1) _bltr_d(_jit,i0,r0,r1)
|
|
static jit_word_t _bltr_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
|
|
# define blti_f(i0,r0,i1) _blti_f(_jit,i0,r0,i1)
|
|
static jit_word_t _blti_f(jit_state_t*,jit_word_t,jit_int32_t,jit_float32_t*);
|
|
# define blti_d(i0,r0,i1) _blti_d(_jit,i0,r0,i1)
|
|
static jit_word_t _blti_d(jit_state_t*,jit_word_t,jit_int32_t,jit_float64_t*);
|
|
# define bler_f(i0,r0,r1) bler_d(i0,r0,r1)
|
|
# define bler_d(i0,r0,r1) _bler_d(_jit,i0,r0,r1)
|
|
static jit_word_t _bler_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
|
|
# define blei_f(i0,r0,i1) _blei_f(_jit,i0,r0,i1)
|
|
static jit_word_t _blei_f(jit_state_t*,jit_word_t,jit_int32_t,jit_float32_t*);
|
|
# define blei_d(i0,r0,i1) _blei_d(_jit,i0,r0,i1)
|
|
static jit_word_t _blei_d(jit_state_t*,jit_word_t,jit_int32_t,jit_float64_t*);
|
|
# define beqr_f(i0,r0,r1) beqr_d(i0,r0,r1)
|
|
# define beqr_d(i0,r0,r1) _beqr_d(_jit,i0,r0,r1)
|
|
static jit_word_t _beqr_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
|
|
# define beqi_f(i0,r0,i1) _beqi_f(_jit,i0,r0,i1)
|
|
static jit_word_t _beqi_f(jit_state_t*,jit_word_t,jit_int32_t,jit_float32_t*);
|
|
# define beqi_d(i0,r0,i1) _beqi_d(_jit,i0,r0,i1)
|
|
static jit_word_t _beqi_d(jit_state_t*,jit_word_t,jit_int32_t,jit_float64_t*);
|
|
# define bger_f(i0,r0,r1) bger_d(i0,r0,r1)
|
|
# define bger_d(i0,r0,r1) _bger_d(_jit,i0,r0,r1)
|
|
static jit_word_t _bger_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
|
|
# define bgei_f(i0,r0,i1) _bgei_f(_jit,i0,r0,i1)
|
|
static jit_word_t _bgei_f(jit_state_t*,jit_word_t,jit_int32_t,jit_float32_t*);
|
|
# define bgei_d(i0,r0,i1) _bgei_d(_jit,i0,r0,i1)
|
|
static jit_word_t _bgei_d(jit_state_t*,jit_word_t,jit_int32_t,jit_float64_t*);
|
|
# define bgtr_f(i0,r0,r1) bgtr_d(i0,r0,r1)
|
|
# define bgtr_d(i0,r0,r1) _bgtr_d(_jit,i0,r0,r1)
|
|
static jit_word_t _bgtr_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
|
|
# define bgti_f(i0,r0,i1) _bgti_f(_jit,i0,r0,i1)
|
|
static jit_word_t _bgti_f(jit_state_t*,jit_word_t,jit_int32_t,jit_float32_t*);
|
|
# define bgti_d(i0,r0,i1) _bgti_d(_jit,i0,r0,i1)
|
|
static jit_word_t _bgti_d(jit_state_t*,jit_word_t,jit_int32_t,jit_float64_t*);
|
|
# define bner_f(i0,r0,r1) bner_d(i0,r0,r1)
|
|
# define bner_d(i0,r0,r1) _bner_d(_jit,i0,r0,r1)
|
|
static jit_word_t _bner_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
|
|
# define bnei_f(i0,r0,i1) _bnei_f(_jit,i0,r0,i1)
|
|
static jit_word_t _bnei_f(jit_state_t*,jit_word_t,jit_int32_t,jit_float32_t*);
|
|
# define bnei_d(i0,r0,i1) _bnei_d(_jit,i0,r0,i1)
|
|
static jit_word_t _bnei_d(jit_state_t*,jit_word_t,jit_int32_t,jit_float64_t*);
|
|
# define bunltr_f(i0,r0,r1) bunltr_d(i0,r0,r1)
|
|
# define bunltr_d(i0,r0,r1) _bunltr_d(_jit,i0,r0,r1)
|
|
static jit_word_t _bunltr_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
|
|
# define bunlti_f(i0,r0,i1) _bunlti_f(_jit,i0,r0,i1)
|
|
static jit_word_t _bunlti_f(jit_state_t*,jit_word_t,jit_int32_t,jit_float32_t*);
|
|
# define bunlti_d(i0,r0,i1) _bunlti_d(_jit,i0,r0,i1)
|
|
static jit_word_t _bunlti_d(jit_state_t*,jit_word_t,jit_int32_t,jit_float64_t*);
|
|
# define bunler_f(i0,r0,r1) bunler_d(i0,r0,r1)
|
|
# define bunler_d(i0,r0,r1) _bunler_d(_jit,i0,r0,r1)
|
|
static jit_word_t _bunler_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
|
|
# define bunlei_f(i0,r0,i1) _bunlei_f(_jit,i0,r0,i1)
|
|
static jit_word_t _bunlei_f(jit_state_t*,jit_word_t,jit_int32_t,jit_float32_t*);
|
|
# define bunlei_d(i0,r0,i1) _bunlei_d(_jit,i0,r0,i1)
|
|
static jit_word_t _bunlei_d(jit_state_t*,jit_word_t,jit_int32_t,jit_float64_t*);
|
|
# define buneqr_f(i0,r0,r1) buneqr_d(i0,r0,r1)
|
|
# define buneqr_d(i0,r0,r1) _buneqr_d(_jit,i0,r0,r1)
|
|
static jit_word_t _buneqr_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
|
|
# define buneqi_f(i0,r0,i1) _buneqi_f(_jit,i0,r0,i1)
|
|
static jit_word_t _buneqi_f(jit_state_t*,jit_word_t,jit_int32_t,jit_float32_t*);
|
|
# define buneqi_d(i0,r0,i1) _buneqi_d(_jit,i0,r0,i1)
|
|
static jit_word_t _buneqi_d(jit_state_t*,jit_word_t,jit_int32_t,jit_float64_t*);
|
|
# define bunger_f(i0,r0,r1) bunger_d(i0,r0,r1)
|
|
# define bunger_d(i0,r0,r1) _bunger_d(_jit,i0,r0,r1)
|
|
static jit_word_t _bunger_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
|
|
# define bungei_f(i0,r0,i1) _bungei_f(_jit,i0,r0,i1)
|
|
static jit_word_t _bungei_f(jit_state_t*,jit_word_t,jit_int32_t,jit_float32_t*);
|
|
# define bungei_d(i0,r0,i1) _bungei_d(_jit,i0,r0,i1)
|
|
static jit_word_t _bungei_d(jit_state_t*,jit_word_t,jit_int32_t,jit_float64_t*);
|
|
# define bungtr_f(i0,r0,r1) bungtr_d(i0,r0,r1)
|
|
# define bungtr_d(i0,r0,r1) _bungtr_d(_jit,i0,r0,r1)
|
|
static jit_word_t _bungtr_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
|
|
# define bungti_f(i0,r0,i1) _bungti_f(_jit,i0,r0,i1)
|
|
static jit_word_t _bungti_f(jit_state_t*,jit_word_t,jit_int32_t,jit_float32_t*);
|
|
# define bungti_d(i0,r0,i1) _bungti_d(_jit,i0,r0,i1)
|
|
static jit_word_t _bungti_d(jit_state_t*,jit_word_t,jit_int32_t,jit_float64_t*);
|
|
# define bltgtr_f(i0,r0,r1) bltgtr_d(i0,r0,r1)
|
|
# define bltgtr_d(i0,r0,r1) _bltgtr_d(_jit,i0,r0,r1)
|
|
static jit_word_t _bltgtr_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
|
|
# define bltgti_f(i0,r0,i1) _bltgti_f(_jit,i0,r0,i1)
|
|
static jit_word_t _bltgti_f(jit_state_t*,jit_word_t,jit_int32_t,jit_float32_t*);
|
|
# define bltgti_d(i0,r0,i1) _bltgti_d(_jit,i0,r0,i1)
|
|
static jit_word_t _bltgti_d(jit_state_t*,jit_word_t,jit_int32_t,jit_float64_t*);
|
|
# define bordr_f(i0,r0,r1) bordr_d(i0,r0,r1)
|
|
# define bordr_d(i0,r0,r1) _bordr_d(_jit,i0,r0,r1)
|
|
static jit_word_t _bordr_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
|
|
# define bordi_f(i0,r0,i1) _bordi_f(_jit,i0,r0,i1)
|
|
static jit_word_t _bordi_f(jit_state_t*,jit_word_t,jit_int32_t,jit_float32_t*);
|
|
# define bordi_d(i0,r0,i1) _bordi_d(_jit,i0,r0,i1)
|
|
static jit_word_t _bordi_d(jit_state_t*,jit_word_t,jit_int32_t,jit_float64_t*);
|
|
# define bunordr_f(i0,r0,r1) bunordr_d(i0,r0,r1)
|
|
# define bunordr_d(i0,r0,r1) _bunordr_d(_jit,i0,r0,r1)
|
|
static jit_word_t _bunordr_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
|
|
# define bunordi_f(i0,r0,i1) _bunordi_f(_jit,i0,r0,i1)
|
|
static jit_word_t _bunordi_f(jit_state_t*,jit_word_t,jit_int32_t,jit_float32_t*);
|
|
# define bunordi_d(i0,r0,i1) _bunordi_d(_jit,i0,r0,i1)
|
|
static jit_word_t _bunordi_d(jit_state_t*,jit_word_t,jit_int32_t,jit_float64_t*);
|
|
# define ldr_f(r0,r1) LFSX(r0, _R0_REGNO, r1)
|
|
# 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) _ldxr_f(_jit,r0,r1,r2)
|
|
static void _ldxr_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
|
|
# 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 str_f(r0,r1) STFSX(r1, _R0_REGNO, r0)
|
|
# define sti_f(i0,r0) _sti_f(_jit,i0,r0)
|
|
static void _sti_f(jit_state_t*,jit_word_t,jit_int32_t);
|
|
# 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 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 ldr_d(r0,r1) LFDX(r0, _R0_REGNO, r1)
|
|
# 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) _ldxr_d(_jit,r0,r1,r2)
|
|
static void _ldxr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_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_d(r0,r1) STFDX(r1, _R0_REGNO, 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 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);
|
|
# 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);
|
|
#endif
|
|
|
|
#if CODE
|
|
# define _u16(v) ((v) & 0xffff)
|
|
static void
|
|
_FA(jit_state_t *_jit, int o, int d, int a, int b, int c, int x, int r)
|
|
{
|
|
assert(!(o & ~((1 << 6) - 1)));
|
|
assert(!(d & ~((1 << 5) - 1)));
|
|
assert(!(a & ~((1 << 5) - 1)));
|
|
assert(!(b & ~((1 << 5) - 1)));
|
|
assert(!(c & ~((1 << 5) - 1)));
|
|
assert(!(x & ~((1 << 5) - 1)));
|
|
assert(!(r & ~((1 << 1) - 1)));
|
|
ii((o<<26)|(d<<21)|(a<<16)|(b<<11)|(c<<6)|(x<<1)|r);
|
|
}
|
|
|
|
static void
|
|
_FXFL(jit_state_t *_jit, int o, int m, int b, int x, int r)
|
|
{
|
|
assert(!(o & ~((1 << 6) - 1)));
|
|
assert(!(m & ~((1 << 8) - 1)));
|
|
assert(!(b & ~((1 << 5) - 1)));
|
|
assert(!(x & ~((1 << 10) - 1)));
|
|
assert(!(r & ~((1 << 1) - 1)));
|
|
ii((o<<26)|(m<<17)|(b<<11)|(x<<1)|r);
|
|
}
|
|
|
|
static void
|
|
_movr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
|
|
{
|
|
if (r0 != r1)
|
|
FMR(r0,r1);
|
|
}
|
|
|
|
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 & 0xffffffff);
|
|
stxi_i(alloca_offset - 4, _FP_REGNO, rn(reg));
|
|
jit_unget_reg(reg);
|
|
ldxi_f(r0, _FP_REGNO, alloca_offset - 4);
|
|
}
|
|
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 i[2];
|
|
jit_word_t w;
|
|
jit_float64_t d;
|
|
} data;
|
|
jit_int32_t reg;
|
|
|
|
if (_jitc->no_data) {
|
|
data.d = *i0;
|
|
reg = jit_get_reg(jit_class_gpr);
|
|
# if __WORDSIZE == 32
|
|
movi(rn(reg), data.i[0]);
|
|
stxi(alloca_offset - 8, _FP_REGNO, rn(reg));
|
|
movi(rn(reg), data.i[1]);
|
|
stxi(alloca_offset - 4, _FP_REGNO, rn(reg));
|
|
# else
|
|
movi(rn(reg), data.w);
|
|
stxi(alloca_offset - 8, _FP_REGNO, rn(reg));
|
|
# endif
|
|
jit_unget_reg(reg);
|
|
ldxi_d(r0, _FP_REGNO, alloca_offset - 8);
|
|
}
|
|
else
|
|
ldi_d(r0, (jit_word_t)i0);
|
|
}
|
|
|
|
/* should only work on newer ppc (fcfid is a ppc64 instruction) */
|
|
static void
|
|
_extr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
|
|
{
|
|
# if __WORDSIZE == 32
|
|
jit_int32_t reg;
|
|
reg = jit_get_reg(jit_class_gpr);
|
|
rshi(rn(reg), r1, 31);
|
|
/* use reserved 8 bytes area */
|
|
stxi(alloca_offset - 4, _FP_REGNO, r1);
|
|
stxi(alloca_offset - 8, _FP_REGNO, rn(reg));
|
|
jit_unget_reg(reg);
|
|
# else
|
|
stxi(alloca_offset - 8, _FP_REGNO, r1);
|
|
# endif
|
|
ldxi_d(r0, _FP_REGNO, alloca_offset - 8);
|
|
FCFID(r0, r0);
|
|
}
|
|
|
|
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);
|
|
FCTIWZ(rn(reg), r1);
|
|
/* use reserved 8 bytes area */
|
|
stxi_d(alloca_offset - 8, _FP_REGNO, rn(reg));
|
|
ldxi_i(r0, _FP_REGNO, alloca_offset - 4);
|
|
jit_unget_reg(reg);
|
|
}
|
|
|
|
# if __WORDSIZE == 64
|
|
static void
|
|
_truncr_d_l(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
|
|
{
|
|
jit_int32_t reg;
|
|
reg = jit_get_reg(jit_class_fpr);
|
|
FCTIDZ(rn(reg), r1);
|
|
/* use reserved 8 bytes area */
|
|
stxi_d(alloca_offset - 8, _FP_REGNO, rn(reg));
|
|
ldxi(r0, _FP_REGNO, alloca_offset - 8);
|
|
jit_unget_reg(reg);
|
|
}
|
|
# endif
|
|
|
|
# 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 fpr_bopi(name, type, size) \
|
|
static jit_word_t \
|
|
_b##name##i_##type(jit_state_t *_jit, \
|
|
jit_word_t i0, jit_int32_t r0, \
|
|
jit_float##size##_t *i1) \
|
|
{ \
|
|
jit_word_t word; \
|
|
jit_int32_t reg = jit_get_reg(jit_class_fpr| \
|
|
jit_class_nospill); \
|
|
movi_##type(rn(reg), i1); \
|
|
word = b##name##r_##type(i0, r0, rn(reg)); \
|
|
jit_unget_reg(reg); \
|
|
return (word); \
|
|
}
|
|
# define fopi(name) fpr_opi(name, f, 32)
|
|
# define fbopi(name) fpr_bopi(name, f, 32)
|
|
# define dopi(name) fpr_opi(name, d, 64)
|
|
# define dbopi(name) fpr_bopi(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
|
|
_ltr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
|
|
{
|
|
FCMPO(CR_0, r1, r2);
|
|
MFCR(r0);
|
|
EXTRWI(r0, r0, 1, CR_LT);
|
|
}
|
|
fopi(lt)
|
|
dopi(lt)
|
|
|
|
static void
|
|
_ler_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
|
|
{
|
|
FCMPO(CR_0, r1, r2);
|
|
CREQV(CR_GT, CR_GT, CR_UN);
|
|
MFCR(r0);
|
|
EXTRWI(r0, r0, 1, CR_GT);
|
|
}
|
|
fopi(le)
|
|
dopi(le)
|
|
|
|
static void
|
|
_eqr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
|
|
{
|
|
FCMPO(CR_0, r1, r2);
|
|
MFCR(r0);
|
|
EXTRWI(r0, r0, 1, CR_EQ);
|
|
}
|
|
fopi(eq)
|
|
dopi(eq)
|
|
|
|
static void
|
|
_ger_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
|
|
{
|
|
FCMPO(CR_0, r1, r2);
|
|
CREQV(CR_LT, CR_LT, CR_UN);
|
|
MFCR(r0);
|
|
EXTRWI(r0, r0, 1, CR_LT);
|
|
}
|
|
fopi(ge)
|
|
dopi(ge)
|
|
|
|
static void
|
|
_gtr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
|
|
{
|
|
FCMPO(CR_0, r1, r2);
|
|
MFCR(r0);
|
|
EXTRWI(r0, r0, 1, CR_GT);
|
|
}
|
|
fopi(gt)
|
|
dopi(gt)
|
|
|
|
static void
|
|
_ner_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
|
|
{
|
|
FCMPO(CR_0, r1, r2);
|
|
CRNOT(CR_EQ, CR_EQ);
|
|
MFCR(r0);
|
|
EXTRWI(r0, r0, 1, CR_EQ);
|
|
}
|
|
fopi(ne)
|
|
dopi(ne)
|
|
|
|
static void
|
|
_unltr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
|
|
{
|
|
FCMPU(CR_0, r1, r2);
|
|
CROR(CR_LT, CR_LT, CR_UN);
|
|
MFCR(r0);
|
|
EXTRWI(r0, r0, 1, CR_LT);
|
|
}
|
|
fopi(unlt)
|
|
dopi(unlt)
|
|
|
|
static void
|
|
_unler_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
|
|
{
|
|
FCMPU(CR_0, r1, r2);
|
|
CRNOT(CR_GT, CR_GT);
|
|
MFCR(r0);
|
|
EXTRWI(r0, r0, 1, CR_GT);
|
|
}
|
|
fopi(unle)
|
|
dopi(unle)
|
|
|
|
static void
|
|
_uneqr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
|
|
{
|
|
FCMPU(CR_0, r1, r2);
|
|
CROR(CR_EQ, CR_EQ, CR_UN);
|
|
MFCR(r0);
|
|
EXTRWI(r0, r0, 1, CR_EQ);
|
|
}
|
|
fopi(uneq)
|
|
dopi(uneq)
|
|
|
|
static void
|
|
_unger_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
|
|
{
|
|
FCMPU(CR_0, r1, r2);
|
|
CRNOT(CR_LT, CR_LT);
|
|
MFCR(r0);
|
|
EXTRWI(r0, r0, 1, CR_LT);
|
|
}
|
|
fopi(unge)
|
|
dopi(unge)
|
|
|
|
static void
|
|
_ungtr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
|
|
{
|
|
FCMPU(CR_0, r1, r2);
|
|
CROR(CR_GT, CR_GT, CR_UN);
|
|
MFCR(r0);
|
|
EXTRWI(r0, r0, 1, CR_GT);
|
|
}
|
|
fopi(ungt)
|
|
dopi(ungt)
|
|
|
|
static void
|
|
_ltgtr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
|
|
{
|
|
FCMPU(CR_0, r1, r2);
|
|
CROR(CR_GT, CR_GT, CR_LT);
|
|
MFCR(r0);
|
|
EXTRWI(r0, r0, 1, CR_GT);
|
|
}
|
|
fopi(ltgt)
|
|
dopi(ltgt)
|
|
|
|
static void
|
|
_ordr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
|
|
{
|
|
FCMPU(CR_0, r1, r2);
|
|
CRNOT(CR_UN, CR_UN);
|
|
MFCR(r0);
|
|
EXTRWI(r0, r0, 1, CR_UN);
|
|
}
|
|
fopi(ord)
|
|
dopi(ord)
|
|
|
|
static void
|
|
_unordr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
|
|
{
|
|
FCMPU(CR_0, r1, r2);
|
|
MFCR(r0);
|
|
EXTRWI(r0, r0, 1, CR_UN);
|
|
}
|
|
fopi(unord)
|
|
dopi(unord)
|
|
|
|
static jit_word_t
|
|
_bltr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
|
|
{
|
|
jit_word_t d, w;
|
|
FCMPO(CR_0, r0, r1);
|
|
w = _jit->pc.w;
|
|
d = (i0 - w) & ~3;
|
|
BLT(d);
|
|
return (w);
|
|
}
|
|
fbopi(lt)
|
|
dbopi(lt)
|
|
|
|
static jit_word_t
|
|
_bler_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
|
|
{
|
|
jit_word_t d, w;
|
|
FCMPO(CR_0, r0, r1);
|
|
CREQV(CR_GT, CR_GT, CR_UN);
|
|
w = _jit->pc.w;
|
|
d = (i0 - w) & ~3;
|
|
BGT(d);
|
|
return (w);
|
|
}
|
|
fbopi(le)
|
|
dbopi(le)
|
|
|
|
static jit_word_t
|
|
_beqr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
|
|
{
|
|
jit_word_t d, w;
|
|
FCMPO(CR_0, r0, r1);
|
|
w = _jit->pc.w;
|
|
d = (i0 - w) & ~3;
|
|
BEQ(d);
|
|
return (w);
|
|
}
|
|
fbopi(eq)
|
|
dbopi(eq)
|
|
|
|
static jit_word_t
|
|
_bger_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
|
|
{
|
|
jit_word_t d, w;
|
|
FCMPO(CR_0, r0, r1);
|
|
CREQV(CR_LT, CR_LT, CR_UN);
|
|
w = _jit->pc.w;
|
|
d = (i0 - w) & ~3;
|
|
BLT(d);
|
|
return (w);
|
|
}
|
|
fbopi(ge)
|
|
dbopi(ge)
|
|
|
|
static jit_word_t
|
|
_bgtr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
|
|
{
|
|
jit_word_t d, w;
|
|
FCMPO(CR_0, r0, r1);
|
|
w = _jit->pc.w;
|
|
d = (i0 - w) & ~3;
|
|
BGT(d);
|
|
return (w);
|
|
}
|
|
fbopi(gt)
|
|
dbopi(gt)
|
|
|
|
static jit_word_t
|
|
_bner_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
|
|
{
|
|
jit_word_t d, w;
|
|
FCMPO(CR_0, r0, r1);
|
|
w = _jit->pc.w;
|
|
d = (i0 - w) & ~3;
|
|
BNE(d);
|
|
return (w);
|
|
}
|
|
fbopi(ne)
|
|
dbopi(ne)
|
|
|
|
static jit_word_t
|
|
_bunltr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
|
|
{
|
|
jit_word_t d, w;
|
|
FCMPU(CR_0, r0, r1);
|
|
CROR(CR_LT, CR_LT, CR_UN);
|
|
w = _jit->pc.w;
|
|
d = (i0 - w) & ~3;
|
|
BLT(d);
|
|
return (w);
|
|
}
|
|
fbopi(unlt)
|
|
dbopi(unlt)
|
|
|
|
static jit_word_t
|
|
_bunler_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
|
|
{
|
|
jit_word_t d, w;
|
|
FCMPU(CR_0, r0, r1);
|
|
w = _jit->pc.w;
|
|
d = (i0 - w) & ~3;
|
|
BLE(d);
|
|
return (w);
|
|
}
|
|
fbopi(unle)
|
|
dbopi(unle)
|
|
|
|
static jit_word_t
|
|
_buneqr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
|
|
{
|
|
jit_word_t d, w;
|
|
FCMPU(CR_0, r0, r1);
|
|
CROR(CR_EQ, CR_EQ, CR_UN);
|
|
w = _jit->pc.w;
|
|
d = (i0 - w) & ~3;
|
|
BEQ(d);
|
|
return (w);
|
|
}
|
|
fbopi(uneq)
|
|
dbopi(uneq)
|
|
|
|
static jit_word_t
|
|
_bunger_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
|
|
{
|
|
jit_word_t d, w;
|
|
FCMPU(CR_0, r0, r1);
|
|
w = _jit->pc.w;
|
|
d = (i0 - w) & ~3;
|
|
BGE(d);
|
|
return (w);
|
|
}
|
|
fbopi(unge)
|
|
dbopi(unge)
|
|
|
|
static jit_word_t
|
|
_bungtr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
|
|
{
|
|
jit_word_t d, w;
|
|
FCMPU(CR_0, r0, r1);
|
|
CROR(CR_GT, CR_GT, CR_UN);
|
|
w = _jit->pc.w;
|
|
d = (i0 - w) & ~3;
|
|
BGT(d);
|
|
return (w);
|
|
}
|
|
fbopi(ungt)
|
|
dbopi(ungt)
|
|
|
|
static jit_word_t
|
|
_bltgtr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
|
|
{
|
|
jit_word_t d, w;
|
|
FCMPU(CR_0, r0, r1);
|
|
CROR(CR_EQ, CR_LT, CR_GT);
|
|
w = _jit->pc.w;
|
|
d = (i0 - w) & ~3;
|
|
BEQ(d);
|
|
return (w);
|
|
}
|
|
fbopi(ltgt)
|
|
dbopi(ltgt)
|
|
|
|
static jit_word_t
|
|
_bordr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
|
|
{
|
|
jit_word_t d, w;
|
|
FCMPU(CR_0, r0, r1);
|
|
w = _jit->pc.w;
|
|
d = (i0 - w) & ~3;
|
|
BNU(d);
|
|
return (w);
|
|
}
|
|
fbopi(ord)
|
|
dbopi(ord)
|
|
|
|
static jit_word_t
|
|
_bunordr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
|
|
{
|
|
jit_word_t d, w;
|
|
FCMPU(CR_0, r0, r1);
|
|
w = _jit->pc.w;
|
|
d = (i0 - w) & ~3;
|
|
BUN(d);
|
|
return (w);
|
|
}
|
|
fbopi(unord)
|
|
dbopi(unord)
|
|
|
|
static void
|
|
_ldi_f(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
|
|
{
|
|
jit_bool_t inv;
|
|
jit_int32_t reg;
|
|
jit_word_t lo, hi;
|
|
if (can_sign_extend_short_p(i0))
|
|
LFS(r0, _R0_REGNO, i0);
|
|
else if (can_sign_extend_int_p(i0)) {
|
|
hi = (jit_int16_t)((i0 >> 16) + ((jit_uint16_t)i0 >> 15));
|
|
lo = (jit_int16_t)(i0 - (hi << 16));
|
|
reg = jit_get_reg(jit_class_gpr);
|
|
if ((inv = reg == _R0)) reg = jit_get_reg(jit_class_gpr);
|
|
LIS(rn(reg), hi);
|
|
LFS(r0, rn(reg), lo);
|
|
jit_unget_reg(reg);
|
|
if (inv) jit_unget_reg(_R0);
|
|
}
|
|
else {
|
|
reg = jit_get_reg(jit_class_gpr);
|
|
movi(rn(reg), i0);
|
|
ldr_f(r0, rn(reg));
|
|
jit_unget_reg(reg);
|
|
}
|
|
}
|
|
|
|
static void
|
|
_ldi_d(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
|
|
{
|
|
jit_bool_t inv;
|
|
jit_int32_t reg;
|
|
jit_word_t lo, hi;
|
|
if (can_sign_extend_short_p(i0))
|
|
LFD(r0, _R0_REGNO, i0);
|
|
else if (can_sign_extend_int_p(i0)) {
|
|
hi = (jit_int16_t)((i0 >> 16) + ((jit_uint16_t)i0 >> 15));
|
|
lo = (jit_int16_t)(i0 - (hi << 16));
|
|
reg = jit_get_reg(jit_class_gpr);
|
|
if ((inv = reg == _R0)) reg = jit_get_reg(jit_class_gpr);
|
|
LIS(rn(reg), hi);
|
|
LFD(r0, rn(reg), lo);
|
|
jit_unget_reg(reg);
|
|
if (inv) jit_unget_reg(_R0);
|
|
}
|
|
else {
|
|
reg = jit_get_reg(jit_class_gpr);
|
|
movi(rn(reg), i0);
|
|
ldr_d(r0, rn(reg));
|
|
jit_unget_reg(reg);
|
|
}
|
|
}
|
|
|
|
static void
|
|
_ldxr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
|
|
{
|
|
jit_int32_t reg;
|
|
if (r1 == _R0_REGNO) {
|
|
if (r2 != _R0_REGNO)
|
|
LFSX(r0, r2, r1);
|
|
else {
|
|
reg = jit_get_reg(jit_class_gpr);
|
|
movr(rn(reg), r1);
|
|
LFSX(r0, rn(reg), r2);
|
|
jit_unget_reg(reg);
|
|
}
|
|
}
|
|
else
|
|
LFSX(r0, r1, r2);
|
|
}
|
|
|
|
static void
|
|
_ldxr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
|
|
{
|
|
jit_int32_t reg;
|
|
if (r1 == _R0_REGNO) {
|
|
if (r2 != _R0_REGNO)
|
|
LFDX(r0, r2, r1);
|
|
else {
|
|
reg = jit_get_reg(jit_class_gpr);
|
|
movr(rn(reg), r1);
|
|
LFDX(r0, rn(reg), r2);
|
|
jit_unget_reg(reg);
|
|
}
|
|
}
|
|
else
|
|
LFDX(r0, r1, r2);
|
|
}
|
|
|
|
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 == 0)
|
|
ldr_f(r0, r1);
|
|
else if (can_sign_extend_short_p(i0)) {
|
|
if (r1 == _R0_REGNO) {
|
|
reg = jit_get_reg(jit_class_gpr);
|
|
movr(rn(reg), r1);
|
|
LFS(r0, rn(reg), i0);
|
|
jit_unget_reg(reg);
|
|
}
|
|
else
|
|
LFS(r0, r1, i0);
|
|
}
|
|
else {
|
|
reg = jit_get_reg(jit_class_gpr);
|
|
movi(rn(reg), i0);
|
|
ldxr_f(r0, r1, 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 == 0)
|
|
ldr_d(r0, r1);
|
|
else if (can_sign_extend_short_p(i0)) {
|
|
if (r1 == _R0_REGNO) {
|
|
reg = jit_get_reg(jit_class_gpr);
|
|
movr(rn(reg), r1);
|
|
LFD(r0, rn(reg), i0);
|
|
jit_unget_reg(reg);
|
|
}
|
|
else
|
|
LFD(r0, r1, i0);
|
|
}
|
|
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_bool_t inv;
|
|
jit_int32_t reg;
|
|
jit_word_t lo, hi;
|
|
if (can_sign_extend_short_p(i0))
|
|
STFS(r0, _R0_REGNO, i0);
|
|
else if (can_sign_extend_int_p(i0)) {
|
|
hi = (jit_int16_t)((i0 >> 16) + ((jit_uint16_t)i0 >> 15));
|
|
lo = (jit_int16_t)(i0 - (hi << 16));
|
|
reg = jit_get_reg(jit_class_gpr);
|
|
if ((inv = reg == _R0)) reg = jit_get_reg(jit_class_gpr);
|
|
LIS(rn(reg), hi);
|
|
STFS(r0, rn(reg), lo);
|
|
jit_unget_reg(reg);
|
|
if (inv) jit_unget_reg(_R0);
|
|
}
|
|
else {
|
|
reg = jit_get_reg(jit_class_gpr);
|
|
movi(rn(reg), i0);
|
|
str_f(rn(reg), r0);
|
|
jit_unget_reg(reg);
|
|
}
|
|
}
|
|
|
|
static void
|
|
_sti_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
|
|
{
|
|
jit_bool_t inv;
|
|
jit_int32_t reg;
|
|
jit_word_t lo, hi;
|
|
if (can_sign_extend_short_p(i0))
|
|
STFD(r0, _R0_REGNO, i0);
|
|
else if (can_sign_extend_int_p(i0)) {
|
|
hi = (jit_int16_t)((i0 >> 16) + ((jit_uint16_t)i0 >> 15));
|
|
lo = (jit_int16_t)(i0 - (hi << 16));
|
|
reg = jit_get_reg(jit_class_gpr);
|
|
if ((inv = reg == _R0)) reg = jit_get_reg(jit_class_gpr);
|
|
LIS(rn(reg), hi);
|
|
STFD(r0, rn(reg), lo);
|
|
jit_unget_reg(reg);
|
|
if (inv) jit_unget_reg(_R0);
|
|
}
|
|
else {
|
|
reg = jit_get_reg(jit_class_gpr);
|
|
movi(rn(reg), i0);
|
|
str_d(rn(reg), r0);
|
|
jit_unget_reg(reg);
|
|
}
|
|
}
|
|
|
|
static void
|
|
_stxr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
|
|
{
|
|
jit_int32_t reg;
|
|
if (r0 == _R0_REGNO) {
|
|
if (r1 != _R0_REGNO)
|
|
STFSX(r2, r1, r0);
|
|
else {
|
|
reg = jit_get_reg(jit_class_gpr);
|
|
movr(rn(reg), r1);
|
|
STFSX(r2, rn(reg), r0);
|
|
jit_unget_reg(reg);
|
|
}
|
|
}
|
|
else
|
|
STFSX(r2, r0, r1);
|
|
}
|
|
|
|
static void
|
|
_stxr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
|
|
{
|
|
jit_int32_t reg;
|
|
if (r0 == _R0_REGNO) {
|
|
if (r1 != _R0_REGNO)
|
|
STFDX(r2, r1, r0);
|
|
else {
|
|
reg = jit_get_reg(jit_class_gpr);
|
|
movr(rn(reg), r0);
|
|
STFDX(r2, rn(reg), r1);
|
|
jit_unget_reg(reg);
|
|
}
|
|
}
|
|
else
|
|
STFDX(r2, r0, r1);
|
|
}
|
|
|
|
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 == 0)
|
|
str_f(r0, r1);
|
|
else if (can_sign_extend_short_p(i0)) {
|
|
if (r0 == _R0_REGNO) {
|
|
reg = jit_get_reg(jit_class_gpr);
|
|
movr(rn(reg), i0);
|
|
STFS(r1, rn(reg), i0);
|
|
jit_unget_reg(reg);
|
|
}
|
|
else
|
|
STFS(r1, r0, i0);
|
|
}
|
|
else {
|
|
reg = jit_get_reg(jit_class_gpr);
|
|
movi(rn(reg), i0);
|
|
stxr_f(rn(reg), r0, r1);
|
|
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 == 0)
|
|
str_d(r0, r1);
|
|
else if (can_sign_extend_short_p(i0)) {
|
|
if (r0 == _R0_REGNO) {
|
|
reg = jit_get_reg(jit_class_gpr);
|
|
movr(rn(reg), i0);
|
|
STFD(r1, rn(reg), i0);
|
|
jit_unget_reg(reg);
|
|
}
|
|
else
|
|
STFD(r1, r0, i0);
|
|
}
|
|
else {
|
|
reg = jit_get_reg(jit_class_gpr);
|
|
movi(rn(reg), i0);
|
|
stxr_d(rn(reg), r0, r1);
|
|
jit_unget_reg(reg);
|
|
}
|
|
}
|
|
#endif
|