Merge pull request #389 from notaz/master
[pcsx_rearmed.git] / deps / lightning / lib / jit_ppc-fpu.c
CommitLineData
4a71579b
PC
1/*
2 * Copyright (C) 2012-2019 Free Software Foundation, Inc.
3 *
4 * This file is part of GNU lightning.
5 *
6 * GNU lightning is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU Lesser General Public License as published
8 * by the Free Software Foundation; either version 3, or (at your option)
9 * any later version.
10 *
11 * GNU lightning is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
14 * License for more details.
15 *
16 * Authors:
17 * Paulo Cesar Pereira de Andrade
18 */
19
20#if PROTO
21#define FA(o,d,a,b,c,x) _FA(_jit,o,d,a,b,c,x,0)
22#define FA_(o,d,a,b,c,x) _FA(_jit,o,d,a,b,c,x,1)
23static void _FA(jit_state_t*,int,int,int,int,int,int,int);
24#define FXFL(o,m,b,x) _FXFL(_jit,o,m,b,x,0)
25#define FXFL_(o,m,b,x) _FXFL(_jit,o,m,b,x,1)
26static void _FXFL(jit_state_t*,int,int,int,int,int) maybe_unused;
27# define FABS(d,b) FX(63,d,0,b,264)
28# define FABS_(d,b) FX_(63,d,0,b,264)
29# define FADD(d,a,b) FA(63,d,a,b,0,21)
30# define FADD_(d,a,b) FA_(63,d,a,b,0,21)
31# define FADDS(d,a,b) FA(59,d,a,b,0,21)
32# define FADDS_(d,a,b) FA_(59,d,a,b,0,21)
33# define FCFID(d,b) FX(63,d,0,b,846)
34# define FCMPO(cr,a,b) FC(63,cr,0,a,b,32)
35# define FCMPU(cr,a,b) FC(63,cr,0,a,b,0)
36# define FCTIW(d,b) FX(63,d,0,b,14)
37# define FCTIW_(d,b) FX_(63,d,0,b,14)
38# define FCTIWZ(d,b) FX(63,d,0,b,15)
39# define FCTIWZ_(d,b) FX_(63,d,0,b,15)
40# define FCTID(d,b) FX(63,d,0,b,814)
41# define FCTID_(d,b) FX_(63,d,0,b,814)
42# define FCTIDZ(d,b) FX(63,d,0,b,815)
43# define FCTIDZ_(d,b) FX_(63,d,0,b,815)
44# define FDIV(d,a,b) FA(63,d,a,b,0,18)
45# define FDIV_(d,a,b) FA_(63,d,a,b,0,18)
46# define FDIVS(d,a,b) FA(59,d,a,b,0,18)
47# define FDIVS_(d,a,b) FA_(59,d,a,b,0,18)
48# define FMADD(d,a,b,c) FA(63,d,a,b,c,29)
49# define FMADD_(d,a,b,c) FA(63,d,a,b,c,29)
50# define FMADDS(d,a,b,c) FA(59,d,a,b,c,29)
51# define FMADDS_(d,a,b,c) FA(59,d,a,b,c,29)
52# define FMR(d,b) FX(63,d,0,b,72)
53# define FMR_(d,b) FX_(63,d,0,b,72)
54# define FMSUB(d,a,b,c) FA(63,d,a,b,c,28)
55# define FMSUB_(d,a,b,c) FA(63,d,a,b,c,28)
56# define FMSUBS(d,a,b,c) FA(59,d,a,b,c,28)
57# define FMSUBS_(d,a,b,c) FA(59,d,a,b,c,28)
58# define FMUL(d,a,c) FA(63,d,a,0,c,25)
59# define FMUL_(d,a,c) FA_(63,d,a,0,c,25)
60# define FMULS(d,a,c) FA(59,d,a,0,c,25)
61# define FMULS_(d,a,c) FA_(59,d,a,0,c,25)
62# define FNABS(d,b) FX(63,d,0,b,136)
63# define FNABS_(d,b) FX_(63,d,0,b,136)
64# define FNEG(d,b) FX(63,d,0,b,40)
65# define FNEG_(d,b) FX_(63,d,0,b,40)
66# define FNMADD(d,a,b,c) FA(63,d,a,b,c,31)
67# define FNMADD_(d,a,b,c) FA_(63,d,a,b,c,31)
68# define FNMADDS(d,a,b,c) FA(59,d,a,b,c,31)
69# define FNMADDS_(d,a,b,c) FA_(59,d,a,b,c,31)
70# define FNMSUB(d,a,b,c) FA(63,d,a,b,c,30)
71# define FNMSUB_(d,a,b,c) FA_(63,d,a,b,c,30)
72# define FNMSUBS(d,a,b,c) FA(59,d,a,b,c,30)
73# define FNMSUBS_(d,a,b,c) FA_(59,d,a,b,c,30)
74# define FRES(d,b) FA(59,d,0,b,0,24)
75# define FRES_(d,b) FA_(59,d,0,b,0,24)
76# define FRSP(d,b) FA(63,d,0,b,0,12)
77# define FRSP_(d,b) FA_(63,d,0,b,0,12)
78# define FRSQTRE(d,b) FA(63,d,0,b,0,26)
79# define FRSQTRE_(d,b) FA_(63,d,0,b,0,26)
80# define FSEL(d,a,b,c) FA(63,d,a,b,c,23)
81# define FSEL_(d,a,b,c) FA_(63,d,a,b,c,23)
82# define FSQRT(d,b) FA(63,d,0,b,0,22)
83# define FSQRT_(d,b) FA_(63,d,0,b,0,22)
84# define FSQRTS(d,b) FA(59,d,0,b,0,22)
85# define FSQRTS_(d,b) FA_(59,d,0,b,0,22)
86# define FSUB(d,a,b) FA(63,d,a,b,0,20)
87# define FSUB_(d,a,b) FA(63,d,a,b,0,20)
88# define FSUBS(d,a,b) FA(59,d,a,b,0,20)
89# define FSUBS_(d,a,b) FA(59,d,a,b,0,20)
90# define LFD(d,a,s) FDs(50,d,a,s)
91# define LFDU(d,a,s) FDs(51,d,a,s)
92# define LFDUX(d,a,b) FX(31,d,a,b,631)
93# define LFDX(d,a,b) FX(31,d,a,b,599)
94# define LFS(d,a,s) FDs(48,d,a,s)
95# define LFSU(d,a,s) FDs(49,d,a,s)
96# define LFSUX(d,a,b) FX(31,d,a,b,567)
97# define LFSX(d,a,b) FX(31,d,a,b,535)
98# define MCRFS(d,s) FXL(63,d<<2,(s)<<2,64)
99# define MFFS(d) FX(63,d,0,0,583)
100# define MFFS_(d) FX_(63,d,0,0,583)
101# define MTFSB0(d) FX(63,d,0,0,70)
102# define MTFSB0_(d) FX_(63,d,0,0,70)
103# define MTFSB1(d) FX(63,d,0,0,38)
104# define MTFSB1_(d) FX_(63,d,0,0,38)
105# define MTFSF(m,b) FXFL(63,m,b,711)
106# define MTFSF_(m,b) FXFL_(63,m,b,711)
107# define MTFSFI(d,i) FX(63,d<<2,0,i<<1,134)
108# define MTFSFI_(d,i) FX_(63,d<<2,0,i<<1,134)
109# define STFD(s,a,d) FDs(54,s,a,d)
110# define STFDU(s,a,d) FDs(55,s,a,d)
111# define STFDUX(s,a,b) FX(31,s,a,b,759)
112# define STFDX(s,a,b) FX(31,s,a,b,727)
113# define STFIWX(s,a,b) FX(31,s,a,b,983)
114# define STFS(s,a,d) FDs(52,s,a,d)
115# define STFSU(s,a,d) FDs(53,s,a,d)
116# define STFSUX(s,a,b) FX(31,s,a,b,695)
117# define STFSX(s,a,b) FX(31,s,a,b,663)
118# define movr_f(r0,r1) movr_d(r0,r1)
119# define movr_d(r0,r1) _movr_d(_jit,r0,r1)
120static void _movr_d(jit_state_t*,jit_int32_t,jit_int32_t);
121# define movi_f(r0,i0) _movi_f(_jit,r0,i0)
122static void _movi_f(jit_state_t*,jit_int32_t,jit_float32_t*);
123# define movi_d(r0,i0) _movi_d(_jit,r0,i0)
124static void _movi_d(jit_state_t*,jit_int32_t,jit_float64_t*);
125# define extr_f(r0,r1) extr_d(r0,r1)
126# define extr_d(r0,r1) _extr_d(_jit,r0,r1)
127static void _extr_d(jit_state_t*,jit_int32_t,jit_int32_t);
128# define truncr_f(r0,r1) truncr_d(r0,r1)
129# define truncr_f_i(r0,r1) truncr_d_i(r0,r1)
130# define truncr_d_i(r0,r1) _truncr_d_i(_jit,r0,r1)
131static void _truncr_d_i(jit_state_t*,jit_int32_t,jit_int32_t);
132# if __WORDSIZE == 32
133# define truncr_d(r0,r1) truncr_d_i(r0,r1)
134# else
135# define truncr_d(r0,r1) truncr_d_l(r0,r1)
136# define truncr_f_l(r0,r1) truncr_d_l(r0,r1)
137# define truncr_d_l(r0,r1) _truncr_d_l(_jit,r0,r1)
138static void _truncr_d_l(jit_state_t*,jit_int32_t,jit_int32_t);
139# endif
140# define extr_d_f(r0,r1) FRSP(r0,r1)
141# define extr_f_d(r0,r1) movr_d(r0,r1)
142# define absr_f(r0,r1) absr_d(r0,r1)
143# define absr_d(r0,r1) FABS(r0,r1)
144# define negr_f(r0,r1) negr_d(r0,r1)
145# define negr_d(r0,r1) FNEG(r0,r1)
146# define sqrtr_f(r0,r1) FSQRTS(r0,r1)
147# define sqrtr_d(r0,r1) FSQRT(r0,r1)
148# define addr_f(r0,r1,r2) FADDS(r0,r1,r2)
149# define addr_d(r0,r1,r2) FADD(r0,r1,r2)
150# define addi_f(r0,r1,i0) _addi_f(_jit,r0,r1,i0)
151static void _addi_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
152# define addi_d(r0,r1,i0) _addi_d(_jit,r0,r1,i0)
153static void _addi_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
154# define subr_f(r0,r1,r2) FSUBS(r0,r1,r2)
155# define subi_f(r0,r1,i0) _subi_f(_jit,r0,r1,i0)
156static void _subi_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
157# define subr_d(r0,r1,r2) FSUB(r0,r1,r2)
158# define subi_d(r0,r1,i0) _subi_d(_jit,r0,r1,i0)
159static void _subi_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
160# define rsbr_f(r0,r1,r2) subr_f(r0,r2,r1)
161# define rsbi_f(r0,r1,i0) _rsbi_f(_jit,r0,r1,i0)
162static void _rsbi_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
163# define rsbr_d(r0,r1,r2) subr_d(r0,r2,r1)
164# define rsbi_d(r0,r1,i0) _rsbi_d(_jit,r0,r1,i0)
165static void _rsbi_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
166# define mulr_f(r0,r1,r2) FMULS(r0,r1,r2)
167# define muli_f(r0,r1,i0) _muli_f(_jit,r0,r1,i0)
168static void _muli_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
169# define mulr_d(r0,r1,r2) FMUL(r0,r1,r2)
170# define muli_d(r0,r1,i0) _muli_d(_jit,r0,r1,i0)
171static void _muli_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
172# define divr_f(r0,r1,r2) FDIVS(r0,r1,r2)
173# define divi_f(r0,r1,i0) _divi_f(_jit,r0,r1,i0)
174static void _divi_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
175# define divr_d(r0,r1,r2) FDIV(r0,r1,r2)
176# define divi_d(r0,r1,i0) _divi_d(_jit,r0,r1,i0)
177static void _divi_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
178# define ltr_f(r0,r1,r2) ltr_d(r0,r1,r2)
179# define ltr_d(r0,r1,r2) _ltr_d(_jit,r0,r1,r2)
180static void _ltr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
181# define lti_f(r0,r1,i0) _lti_f(_jit,r0,r1,i0)
182static void _lti_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
183# define lti_d(r0,r1,i0) _lti_d(_jit,r0,r1,i0)
184static void _lti_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
185# define ler_f(r0,r1,r2) ler_d(r0,r1,r2)
186# define ler_d(r0,r1,r2) _ler_d(_jit,r0,r1,r2)
187static void _ler_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
188# define lei_f(r0,r1,i0) _lei_f(_jit,r0,r1,i0)
189static void _lei_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
190# define lei_d(r0,r1,i0) _lei_d(_jit,r0,r1,i0)
191static void _lei_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
192# define eqr_f(r0,r1,r2) eqr_d(r0,r1,r2)
193# define eqr_d(r0,r1,r2) _eqr_d(_jit,r0,r1,r2)
194static void _eqr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
195# define eqi_f(r0,r1,i0) _eqi_f(_jit,r0,r1,i0)
196static void _eqi_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
197# define eqi_d(r0,r1,i0) _eqi_d(_jit,r0,r1,i0)
198static void _eqi_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
199# define ger_f(r0,r1,r2) ger_d(r0,r1,r2)
200# define ger_d(r0,r1,r2) _ger_d(_jit,r0,r1,r2)
201static void _ger_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
202# define gei_f(r0,r1,i0) _gei_f(_jit,r0,r1,i0)
203static void _gei_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
204# define gei_d(r0,r1,i0) _gei_d(_jit,r0,r1,i0)
205static void _gei_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
206# define gtr_f(r0,r1,r2) gtr_d(r0,r1,r2)
207# define gtr_d(r0,r1,r2) _gtr_d(_jit,r0,r1,r2)
208static void _gtr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
209# define gti_f(r0,r1,i0) _gti_f(_jit,r0,r1,i0)
210static void _gti_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
211# define gti_d(r0,r1,i0) _gti_d(_jit,r0,r1,i0)
212static void _gti_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
213# define ner_f(r0,r1,r2) ner_d(r0,r1,r2)
214# define ner_d(r0,r1,r2) _ner_d(_jit,r0,r1,r2)
215static void _ner_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
216# define nei_f(r0,r1,i0) _nei_f(_jit,r0,r1,i0)
217static void _nei_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
218# define nei_d(r0,r1,i0) _nei_d(_jit,r0,r1,i0)
219static void _nei_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
220# define unltr_f(r0,r1,r2) unltr_d(r0,r1,r2)
221# define unltr_d(r0,r1,r2) _unltr_d(_jit,r0,r1,r2)
222static void _unltr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
223# define unlti_f(r0,r1,i0) _unlti_f(_jit,r0,r1,i0)
224static void _unlti_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
225# define unlti_d(r0,r1,i0) _unlti_d(_jit,r0,r1,i0)
226static void _unlti_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
227# define unler_f(r0,r1,r2) unler_d(r0,r1,r2)
228# define unler_d(r0,r1,r2) _unler_d(_jit,r0,r1,r2)
229static void _unler_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
230# define unlei_f(r0,r1,i0) _unlei_f(_jit,r0,r1,i0)
231static void _unlei_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
232# define unlei_d(r0,r1,i0) _unlei_d(_jit,r0,r1,i0)
233static void _unlei_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
234# define uneqr_f(r0,r1,r2) uneqr_d(r0,r1,r2)
235# define uneqr_d(r0,r1,r2) _uneqr_d(_jit,r0,r1,r2)
236static void _uneqr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
237# define uneqi_f(r0,r1,i0) _uneqi_f(_jit,r0,r1,i0)
238static void _uneqi_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
239# define uneqi_d(r0,r1,i0) _uneqi_d(_jit,r0,r1,i0)
240static void _uneqi_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
241# define unger_f(r0,r1,r2) unger_d(r0,r1,r2)
242# define unger_d(r0,r1,r2) _unger_d(_jit,r0,r1,r2)
243static void _unger_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
244# define ungei_f(r0,r1,i0) _ungei_f(_jit,r0,r1,i0)
245static void _ungei_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
246# define ungei_d(r0,r1,i0) _ungei_d(_jit,r0,r1,i0)
247static void _ungei_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
248# define ungtr_f(r0,r1,r2) ungtr_d(r0,r1,r2)
249# define ungtr_d(r0,r1,r2) _ungtr_d(_jit,r0,r1,r2)
250static void _ungtr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
251# define ungti_f(r0,r1,i0) _ungti_f(_jit,r0,r1,i0)
252static void _ungti_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
253# define ungti_d(r0,r1,i0) _ungti_d(_jit,r0,r1,i0)
254static void _ungti_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
255# define ltgtr_f(r0,r1,r2) ltgtr_d(r0,r1,r2)
256# define ltgtr_d(r0,r1,r2) _ltgtr_d(_jit,r0,r1,r2)
257static void _ltgtr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
258# define ltgti_f(r0,r1,i0) _ltgti_f(_jit,r0,r1,i0)
259static void _ltgti_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
260# define ltgti_d(r0,r1,i0) _ltgti_d(_jit,r0,r1,i0)
261static void _ltgti_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
262# define ordr_f(r0,r1,r2) ordr_d(r0,r1,r2)
263# define ordr_d(r0,r1,r2) _ordr_d(_jit,r0,r1,r2)
264static void _ordr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
265# define ordi_f(r0,r1,i0) _ordi_f(_jit,r0,r1,i0)
266static void _ordi_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
267# define ordi_d(r0,r1,i0) _ordi_d(_jit,r0,r1,i0)
268static void _ordi_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
269# define unordr_f(r0,r1,r2) unordr_d(r0,r1,r2)
270# define unordr_d(r0,r1,r2) _unordr_d(_jit,r0,r1,r2)
271static void _unordr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
272# define unordi_f(r0,r1,i0) _unordi_f(_jit,r0,r1,i0)
273static void _unordi_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
274# define unordi_d(r0,r1,i0) _unordi_d(_jit,r0,r1,i0)
275static void _unordi_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
276# define bltr_f(i0,r0,r1) bltr_d(i0,r0,r1)
277# define bltr_d(i0,r0,r1) _bltr_d(_jit,i0,r0,r1)
278static jit_word_t _bltr_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
279# define blti_f(i0,r0,i1) _blti_f(_jit,i0,r0,i1)
280static jit_word_t _blti_f(jit_state_t*,jit_word_t,jit_int32_t,jit_float32_t*);
281# define blti_d(i0,r0,i1) _blti_d(_jit,i0,r0,i1)
282static jit_word_t _blti_d(jit_state_t*,jit_word_t,jit_int32_t,jit_float64_t*);
283# define bler_f(i0,r0,r1) bler_d(i0,r0,r1)
284# define bler_d(i0,r0,r1) _bler_d(_jit,i0,r0,r1)
285static jit_word_t _bler_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
286# define blei_f(i0,r0,i1) _blei_f(_jit,i0,r0,i1)
287static jit_word_t _blei_f(jit_state_t*,jit_word_t,jit_int32_t,jit_float32_t*);
288# define blei_d(i0,r0,i1) _blei_d(_jit,i0,r0,i1)
289static jit_word_t _blei_d(jit_state_t*,jit_word_t,jit_int32_t,jit_float64_t*);
290# define beqr_f(i0,r0,r1) beqr_d(i0,r0,r1)
291# define beqr_d(i0,r0,r1) _beqr_d(_jit,i0,r0,r1)
292static jit_word_t _beqr_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
293# define beqi_f(i0,r0,i1) _beqi_f(_jit,i0,r0,i1)
294static jit_word_t _beqi_f(jit_state_t*,jit_word_t,jit_int32_t,jit_float32_t*);
295# define beqi_d(i0,r0,i1) _beqi_d(_jit,i0,r0,i1)
296static jit_word_t _beqi_d(jit_state_t*,jit_word_t,jit_int32_t,jit_float64_t*);
297# define bger_f(i0,r0,r1) bger_d(i0,r0,r1)
298# define bger_d(i0,r0,r1) _bger_d(_jit,i0,r0,r1)
299static jit_word_t _bger_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
300# define bgei_f(i0,r0,i1) _bgei_f(_jit,i0,r0,i1)
301static jit_word_t _bgei_f(jit_state_t*,jit_word_t,jit_int32_t,jit_float32_t*);
302# define bgei_d(i0,r0,i1) _bgei_d(_jit,i0,r0,i1)
303static jit_word_t _bgei_d(jit_state_t*,jit_word_t,jit_int32_t,jit_float64_t*);
304# define bgtr_f(i0,r0,r1) bgtr_d(i0,r0,r1)
305# define bgtr_d(i0,r0,r1) _bgtr_d(_jit,i0,r0,r1)
306static jit_word_t _bgtr_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
307# define bgti_f(i0,r0,i1) _bgti_f(_jit,i0,r0,i1)
308static jit_word_t _bgti_f(jit_state_t*,jit_word_t,jit_int32_t,jit_float32_t*);
309# define bgti_d(i0,r0,i1) _bgti_d(_jit,i0,r0,i1)
310static jit_word_t _bgti_d(jit_state_t*,jit_word_t,jit_int32_t,jit_float64_t*);
311# define bner_f(i0,r0,r1) bner_d(i0,r0,r1)
312# define bner_d(i0,r0,r1) _bner_d(_jit,i0,r0,r1)
313static jit_word_t _bner_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
314# define bnei_f(i0,r0,i1) _bnei_f(_jit,i0,r0,i1)
315static jit_word_t _bnei_f(jit_state_t*,jit_word_t,jit_int32_t,jit_float32_t*);
316# define bnei_d(i0,r0,i1) _bnei_d(_jit,i0,r0,i1)
317static jit_word_t _bnei_d(jit_state_t*,jit_word_t,jit_int32_t,jit_float64_t*);
318# define bunltr_f(i0,r0,r1) bunltr_d(i0,r0,r1)
319# define bunltr_d(i0,r0,r1) _bunltr_d(_jit,i0,r0,r1)
320static jit_word_t _bunltr_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
321# define bunlti_f(i0,r0,i1) _bunlti_f(_jit,i0,r0,i1)
322static jit_word_t _bunlti_f(jit_state_t*,jit_word_t,jit_int32_t,jit_float32_t*);
323# define bunlti_d(i0,r0,i1) _bunlti_d(_jit,i0,r0,i1)
324static jit_word_t _bunlti_d(jit_state_t*,jit_word_t,jit_int32_t,jit_float64_t*);
325# define bunler_f(i0,r0,r1) bunler_d(i0,r0,r1)
326# define bunler_d(i0,r0,r1) _bunler_d(_jit,i0,r0,r1)
327static jit_word_t _bunler_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
328# define bunlei_f(i0,r0,i1) _bunlei_f(_jit,i0,r0,i1)
329static jit_word_t _bunlei_f(jit_state_t*,jit_word_t,jit_int32_t,jit_float32_t*);
330# define bunlei_d(i0,r0,i1) _bunlei_d(_jit,i0,r0,i1)
331static jit_word_t _bunlei_d(jit_state_t*,jit_word_t,jit_int32_t,jit_float64_t*);
332# define buneqr_f(i0,r0,r1) buneqr_d(i0,r0,r1)
333# define buneqr_d(i0,r0,r1) _buneqr_d(_jit,i0,r0,r1)
334static jit_word_t _buneqr_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
335# define buneqi_f(i0,r0,i1) _buneqi_f(_jit,i0,r0,i1)
336static jit_word_t _buneqi_f(jit_state_t*,jit_word_t,jit_int32_t,jit_float32_t*);
337# define buneqi_d(i0,r0,i1) _buneqi_d(_jit,i0,r0,i1)
338static jit_word_t _buneqi_d(jit_state_t*,jit_word_t,jit_int32_t,jit_float64_t*);
339# define bunger_f(i0,r0,r1) bunger_d(i0,r0,r1)
340# define bunger_d(i0,r0,r1) _bunger_d(_jit,i0,r0,r1)
341static jit_word_t _bunger_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
342# define bungei_f(i0,r0,i1) _bungei_f(_jit,i0,r0,i1)
343static jit_word_t _bungei_f(jit_state_t*,jit_word_t,jit_int32_t,jit_float32_t*);
344# define bungei_d(i0,r0,i1) _bungei_d(_jit,i0,r0,i1)
345static jit_word_t _bungei_d(jit_state_t*,jit_word_t,jit_int32_t,jit_float64_t*);
346# define bungtr_f(i0,r0,r1) bungtr_d(i0,r0,r1)
347# define bungtr_d(i0,r0,r1) _bungtr_d(_jit,i0,r0,r1)
348static jit_word_t _bungtr_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
349# define bungti_f(i0,r0,i1) _bungti_f(_jit,i0,r0,i1)
350static jit_word_t _bungti_f(jit_state_t*,jit_word_t,jit_int32_t,jit_float32_t*);
351# define bungti_d(i0,r0,i1) _bungti_d(_jit,i0,r0,i1)
352static jit_word_t _bungti_d(jit_state_t*,jit_word_t,jit_int32_t,jit_float64_t*);
353# define bltgtr_f(i0,r0,r1) bltgtr_d(i0,r0,r1)
354# define bltgtr_d(i0,r0,r1) _bltgtr_d(_jit,i0,r0,r1)
355static jit_word_t _bltgtr_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
356# define bltgti_f(i0,r0,i1) _bltgti_f(_jit,i0,r0,i1)
357static jit_word_t _bltgti_f(jit_state_t*,jit_word_t,jit_int32_t,jit_float32_t*);
358# define bltgti_d(i0,r0,i1) _bltgti_d(_jit,i0,r0,i1)
359static jit_word_t _bltgti_d(jit_state_t*,jit_word_t,jit_int32_t,jit_float64_t*);
360# define bordr_f(i0,r0,r1) bordr_d(i0,r0,r1)
361# define bordr_d(i0,r0,r1) _bordr_d(_jit,i0,r0,r1)
362static jit_word_t _bordr_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
363# define bordi_f(i0,r0,i1) _bordi_f(_jit,i0,r0,i1)
364static jit_word_t _bordi_f(jit_state_t*,jit_word_t,jit_int32_t,jit_float32_t*);
365# define bordi_d(i0,r0,i1) _bordi_d(_jit,i0,r0,i1)
366static jit_word_t _bordi_d(jit_state_t*,jit_word_t,jit_int32_t,jit_float64_t*);
367# define bunordr_f(i0,r0,r1) bunordr_d(i0,r0,r1)
368# define bunordr_d(i0,r0,r1) _bunordr_d(_jit,i0,r0,r1)
369static jit_word_t _bunordr_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
370# define bunordi_f(i0,r0,i1) _bunordi_f(_jit,i0,r0,i1)
371static jit_word_t _bunordi_f(jit_state_t*,jit_word_t,jit_int32_t,jit_float32_t*);
372# define bunordi_d(i0,r0,i1) _bunordi_d(_jit,i0,r0,i1)
373static jit_word_t _bunordi_d(jit_state_t*,jit_word_t,jit_int32_t,jit_float64_t*);
374# define ldr_f(r0,r1) LFSX(r0, _R0_REGNO, r1)
375# define ldi_f(r0,i0) _ldi_f(_jit,r0,i0)
376static void _ldi_f(jit_state_t*,jit_int32_t,jit_word_t);
377# define ldxr_f(r0,r1,r2) _ldxr_f(_jit,r0,r1,r2)
378static void _ldxr_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
379# define ldxi_f(r0,r1,i0) _ldxi_f(_jit,r0,r1,i0)
380static void _ldxi_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
381# define str_f(r0,r1) STFSX(r1, _R0_REGNO, r0)
382# define sti_f(i0,r0) _sti_f(_jit,i0,r0)
383static void _sti_f(jit_state_t*,jit_word_t,jit_int32_t);
384# define stxr_f(r0,r1,r2) _stxr_f(_jit,r0,r1,r2)
385static void _stxr_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
386# define stxi_f(i0,r0,r1) _stxi_f(_jit,i0,r0,r1)
387static void _stxi_f(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
388# define ldr_d(r0,r1) LFDX(r0, _R0_REGNO, r1)
389# define ldi_d(r0,i0) _ldi_d(_jit,r0,i0)
390static void _ldi_d(jit_state_t*,jit_int32_t,jit_word_t);
391# define ldxr_d(r0,r1,r2) _ldxr_d(_jit,r0,r1,r2)
392static void _ldxr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
393# define ldxi_d(r0,r1,i0) _ldxi_d(_jit,r0,r1,i0)
394static void _ldxi_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
395# define str_d(r0,r1) STFDX(r1, _R0_REGNO, r0)
396# define sti_d(i0,r0) _sti_d(_jit,i0,r0)
397static void _sti_d(jit_state_t*,jit_word_t,jit_int32_t);
398# define stxr_d(r0,r1,r2) _stxr_d(_jit,r0,r1,r2)
399static void _stxr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
400# define stxi_d(i0,r0,r1) _stxi_d(_jit,i0,r0,r1)
401static void _stxi_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
402#endif
403
404#if CODE
405# define _u16(v) ((v) & 0xffff)
406static void
407_FA(jit_state_t *_jit, int o, int d, int a, int b, int c, int x, int r)
408{
409 assert(!(o & ~((1 << 6) - 1)));
410 assert(!(d & ~((1 << 5) - 1)));
411 assert(!(a & ~((1 << 5) - 1)));
412 assert(!(b & ~((1 << 5) - 1)));
413 assert(!(c & ~((1 << 5) - 1)));
414 assert(!(x & ~((1 << 5) - 1)));
415 assert(!(r & ~((1 << 1) - 1)));
416 ii((o<<26)|(d<<21)|(a<<16)|(b<<11)|(c<<6)|(x<<1)|r);
417}
418
419static void
420_FXFL(jit_state_t *_jit, int o, int m, int b, int x, int r)
421{
422 assert(!(o & ~((1 << 6) - 1)));
423 assert(!(m & ~((1 << 8) - 1)));
424 assert(!(b & ~((1 << 5) - 1)));
425 assert(!(x & ~((1 << 10) - 1)));
426 assert(!(r & ~((1 << 1) - 1)));
427 ii((o<<26)|(m<<17)|(b<<11)|(x<<1)|r);
428}
429
430static void
431_movr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
432{
433 if (r0 != r1)
434 FMR(r0,r1);
435}
436
437static void
438_movi_f(jit_state_t *_jit, jit_int32_t r0, jit_float32_t *i0)
439{
440 union {
441 jit_int32_t i;
442 jit_float32_t f;
443 } data;
444 jit_int32_t reg;
445
446 if (_jitc->no_data) {
447 data.f = *i0;
448 reg = jit_get_reg(jit_class_gpr);
449 movi(rn(reg), data.i & 0xffffffff);
450 stxi_i(alloca_offset - 4, _FP_REGNO, rn(reg));
451 jit_unget_reg(reg);
452 ldxi_f(r0, _FP_REGNO, alloca_offset - 4);
453 }
454 else
455 ldi_f(r0, (jit_word_t)i0);
456}
457
458static void
459_movi_d(jit_state_t *_jit, jit_int32_t r0, jit_float64_t *i0)
460{
461 union {
462 jit_int32_t i[2];
463 jit_word_t w;
464 jit_float64_t d;
465 } data;
466 jit_int32_t reg;
467
468 if (_jitc->no_data) {
469 data.d = *i0;
470 reg = jit_get_reg(jit_class_gpr);
471# if __WORDSIZE == 32
472 movi(rn(reg), data.i[0]);
473 stxi(alloca_offset - 8, _FP_REGNO, rn(reg));
474 movi(rn(reg), data.i[1]);
475 stxi(alloca_offset - 4, _FP_REGNO, rn(reg));
476# else
477 movi(rn(reg), data.w);
478 stxi(alloca_offset - 8, _FP_REGNO, rn(reg));
479# endif
480 jit_unget_reg(reg);
481 ldxi_d(r0, _FP_REGNO, alloca_offset - 8);
482 }
483 else
484 ldi_d(r0, (jit_word_t)i0);
485}
486
487/* should only work on newer ppc (fcfid is a ppc64 instruction) */
488static void
489_extr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
490{
491# if __WORDSIZE == 32
492 jit_int32_t reg;
493 reg = jit_get_reg(jit_class_gpr);
494 rshi(rn(reg), r1, 31);
495 /* use reserved 8 bytes area */
496 stxi(alloca_offset - 4, _FP_REGNO, r1);
497 stxi(alloca_offset - 8, _FP_REGNO, rn(reg));
498 jit_unget_reg(reg);
499# else
500 stxi(alloca_offset - 8, _FP_REGNO, r1);
501# endif
502 ldxi_d(r0, _FP_REGNO, alloca_offset - 8);
503 FCFID(r0, r0);
504}
505
506static void
507_truncr_d_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
508{
509 jit_int32_t reg;
510 reg = jit_get_reg(jit_class_fpr);
511 FCTIWZ(rn(reg), r1);
512 /* use reserved 8 bytes area */
513 stxi_d(alloca_offset - 8, _FP_REGNO, rn(reg));
514 ldxi_i(r0, _FP_REGNO, alloca_offset - 4);
515 jit_unget_reg(reg);
516}
517
518# if __WORDSIZE == 64
519static void
520_truncr_d_l(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
521{
522 jit_int32_t reg;
523 reg = jit_get_reg(jit_class_fpr);
524 FCTIDZ(rn(reg), r1);
525 /* use reserved 8 bytes area */
526 stxi_d(alloca_offset - 8, _FP_REGNO, rn(reg));
527 ldxi(r0, _FP_REGNO, alloca_offset - 8);
528 jit_unget_reg(reg);
529}
530# endif
531
532# define fpr_opi(name, type, size) \
533static void \
534_##name##i_##type(jit_state_t *_jit, \
535 jit_int32_t r0, jit_int32_t r1, \
536 jit_float##size##_t *i0) \
537{ \
538 jit_int32_t reg = jit_get_reg(jit_class_fpr); \
539 movi_##type(rn(reg), i0); \
540 name##r_##type(r0, r1, rn(reg)); \
541 jit_unget_reg(reg); \
542}
543# define fpr_bopi(name, type, size) \
544static jit_word_t \
545_b##name##i_##type(jit_state_t *_jit, \
546 jit_word_t i0, jit_int32_t r0, \
547 jit_float##size##_t *i1) \
548{ \
549 jit_word_t word; \
550 jit_int32_t reg = jit_get_reg(jit_class_fpr| \
551 jit_class_nospill); \
552 movi_##type(rn(reg), i1); \
553 word = b##name##r_##type(i0, r0, rn(reg)); \
554 jit_unget_reg(reg); \
555 return (word); \
556}
557# define fopi(name) fpr_opi(name, f, 32)
558# define fbopi(name) fpr_bopi(name, f, 32)
559# define dopi(name) fpr_opi(name, d, 64)
560# define dbopi(name) fpr_bopi(name, d, 64)
561
562fopi(add)
563dopi(add)
564fopi(sub)
565dopi(sub)
566fopi(rsb)
567dopi(rsb)
568fopi(mul)
569dopi(mul)
570fopi(div)
571dopi(div)
572
573static void
574_ltr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
575{
576 FCMPO(CR_0, r1, r2);
577 MFCR(r0);
578 EXTRWI(r0, r0, 1, CR_LT);
579}
580fopi(lt)
581dopi(lt)
582
583static void
584_ler_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
585{
586 FCMPO(CR_0, r1, r2);
587 CREQV(CR_GT, CR_GT, CR_UN);
588 MFCR(r0);
589 EXTRWI(r0, r0, 1, CR_GT);
590}
591fopi(le)
592dopi(le)
593
594static void
595_eqr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
596{
597 FCMPO(CR_0, r1, r2);
598 MFCR(r0);
599 EXTRWI(r0, r0, 1, CR_EQ);
600}
601fopi(eq)
602dopi(eq)
603
604static void
605_ger_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
606{
607 FCMPO(CR_0, r1, r2);
608 CREQV(CR_LT, CR_LT, CR_UN);
609 MFCR(r0);
610 EXTRWI(r0, r0, 1, CR_LT);
611}
612fopi(ge)
613dopi(ge)
614
615static void
616_gtr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
617{
618 FCMPO(CR_0, r1, r2);
619 MFCR(r0);
620 EXTRWI(r0, r0, 1, CR_GT);
621}
622fopi(gt)
623dopi(gt)
624
625static void
626_ner_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
627{
628 FCMPO(CR_0, r1, r2);
629 CRNOT(CR_EQ, CR_EQ);
630 MFCR(r0);
631 EXTRWI(r0, r0, 1, CR_EQ);
632}
633fopi(ne)
634dopi(ne)
635
636static void
637_unltr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
638{
639 FCMPU(CR_0, r1, r2);
640 CROR(CR_LT, CR_LT, CR_UN);
641 MFCR(r0);
642 EXTRWI(r0, r0, 1, CR_LT);
643}
644fopi(unlt)
645dopi(unlt)
646
647static void
648_unler_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
649{
650 FCMPU(CR_0, r1, r2);
651 CRNOT(CR_GT, CR_GT);
652 MFCR(r0);
653 EXTRWI(r0, r0, 1, CR_GT);
654}
655fopi(unle)
656dopi(unle)
657
658static void
659_uneqr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
660{
661 FCMPU(CR_0, r1, r2);
662 CROR(CR_EQ, CR_EQ, CR_UN);
663 MFCR(r0);
664 EXTRWI(r0, r0, 1, CR_EQ);
665}
666fopi(uneq)
667dopi(uneq)
668
669static void
670_unger_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
671{
672 FCMPU(CR_0, r1, r2);
673 CRNOT(CR_LT, CR_LT);
674 MFCR(r0);
675 EXTRWI(r0, r0, 1, CR_LT);
676}
677fopi(unge)
678dopi(unge)
679
680static void
681_ungtr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
682{
683 FCMPU(CR_0, r1, r2);
684 CROR(CR_GT, CR_GT, CR_UN);
685 MFCR(r0);
686 EXTRWI(r0, r0, 1, CR_GT);
687}
688fopi(ungt)
689dopi(ungt)
690
691static void
692_ltgtr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
693{
694 FCMPU(CR_0, r1, r2);
695 CROR(CR_GT, CR_GT, CR_LT);
696 MFCR(r0);
697 EXTRWI(r0, r0, 1, CR_GT);
698}
699fopi(ltgt)
700dopi(ltgt)
701
702static void
703_ordr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
704{
705 FCMPU(CR_0, r1, r2);
706 CRNOT(CR_UN, CR_UN);
707 MFCR(r0);
708 EXTRWI(r0, r0, 1, CR_UN);
709}
710fopi(ord)
711dopi(ord)
712
713static void
714_unordr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
715{
716 FCMPU(CR_0, r1, r2);
717 MFCR(r0);
718 EXTRWI(r0, r0, 1, CR_UN);
719}
720fopi(unord)
721dopi(unord)
722
723static jit_word_t
724_bltr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
725{
726 jit_word_t d, w;
727 FCMPO(CR_0, r0, r1);
728 w = _jit->pc.w;
729 d = (i0 - w) & ~3;
730 BLT(d);
731 return (w);
732}
733fbopi(lt)
734dbopi(lt)
735
736static jit_word_t
737_bler_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
738{
739 jit_word_t d, w;
740 FCMPO(CR_0, r0, r1);
741 CREQV(CR_GT, CR_GT, CR_UN);
742 w = _jit->pc.w;
743 d = (i0 - w) & ~3;
744 BGT(d);
745 return (w);
746}
747fbopi(le)
748dbopi(le)
749
750static jit_word_t
751_beqr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
752{
753 jit_word_t d, w;
754 FCMPO(CR_0, r0, r1);
755 w = _jit->pc.w;
756 d = (i0 - w) & ~3;
757 BEQ(d);
758 return (w);
759}
760fbopi(eq)
761dbopi(eq)
762
763static jit_word_t
764_bger_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
765{
766 jit_word_t d, w;
767 FCMPO(CR_0, r0, r1);
768 CREQV(CR_LT, CR_LT, CR_UN);
769 w = _jit->pc.w;
770 d = (i0 - w) & ~3;
771 BLT(d);
772 return (w);
773}
774fbopi(ge)
775dbopi(ge)
776
777static jit_word_t
778_bgtr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
779{
780 jit_word_t d, w;
781 FCMPO(CR_0, r0, r1);
782 w = _jit->pc.w;
783 d = (i0 - w) & ~3;
784 BGT(d);
785 return (w);
786}
787fbopi(gt)
788dbopi(gt)
789
790static jit_word_t
791_bner_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
792{
793 jit_word_t d, w;
794 FCMPO(CR_0, r0, r1);
795 w = _jit->pc.w;
796 d = (i0 - w) & ~3;
797 BNE(d);
798 return (w);
799}
800fbopi(ne)
801dbopi(ne)
802
803static jit_word_t
804_bunltr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
805{
806 jit_word_t d, w;
807 FCMPU(CR_0, r0, r1);
808 CROR(CR_LT, CR_LT, CR_UN);
809 w = _jit->pc.w;
810 d = (i0 - w) & ~3;
811 BLT(d);
812 return (w);
813}
814fbopi(unlt)
815dbopi(unlt)
816
817static jit_word_t
818_bunler_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
819{
820 jit_word_t d, w;
821 FCMPU(CR_0, r0, r1);
822 w = _jit->pc.w;
823 d = (i0 - w) & ~3;
824 BLE(d);
825 return (w);
826}
827fbopi(unle)
828dbopi(unle)
829
830static jit_word_t
831_buneqr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
832{
833 jit_word_t d, w;
834 FCMPU(CR_0, r0, r1);
835 CROR(CR_EQ, CR_EQ, CR_UN);
836 w = _jit->pc.w;
837 d = (i0 - w) & ~3;
838 BEQ(d);
839 return (w);
840}
841fbopi(uneq)
842dbopi(uneq)
843
844static jit_word_t
845_bunger_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
846{
847 jit_word_t d, w;
848 FCMPU(CR_0, r0, r1);
849 w = _jit->pc.w;
850 d = (i0 - w) & ~3;
851 BGE(d);
852 return (w);
853}
854fbopi(unge)
855dbopi(unge)
856
857static jit_word_t
858_bungtr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
859{
860 jit_word_t d, w;
861 FCMPU(CR_0, r0, r1);
862 CROR(CR_GT, CR_GT, CR_UN);
863 w = _jit->pc.w;
864 d = (i0 - w) & ~3;
865 BGT(d);
866 return (w);
867}
868fbopi(ungt)
869dbopi(ungt)
870
871static jit_word_t
872_bltgtr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
873{
874 jit_word_t d, w;
875 FCMPU(CR_0, r0, r1);
876 CROR(CR_EQ, CR_LT, CR_GT);
877 w = _jit->pc.w;
878 d = (i0 - w) & ~3;
879 BEQ(d);
880 return (w);
881}
882fbopi(ltgt)
883dbopi(ltgt)
884
885static jit_word_t
886_bordr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
887{
888 jit_word_t d, w;
889 FCMPU(CR_0, r0, r1);
890 w = _jit->pc.w;
891 d = (i0 - w) & ~3;
892 BNU(d);
893 return (w);
894}
895fbopi(ord)
896dbopi(ord)
897
898static jit_word_t
899_bunordr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
900{
901 jit_word_t d, w;
902 FCMPU(CR_0, r0, r1);
903 w = _jit->pc.w;
904 d = (i0 - w) & ~3;
905 BUN(d);
906 return (w);
907}
908fbopi(unord)
909dbopi(unord)
910
911static void
912_ldi_f(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
913{
914 jit_bool_t inv;
915 jit_int32_t reg;
916 jit_word_t lo, hi;
917 if (can_sign_extend_short_p(i0))
918 LFS(r0, _R0_REGNO, i0);
919 else if (can_sign_extend_int_p(i0)) {
920 hi = (jit_int16_t)((i0 >> 16) + ((jit_uint16_t)i0 >> 15));
921 lo = (jit_int16_t)(i0 - (hi << 16));
922 reg = jit_get_reg(jit_class_gpr);
923 if ((inv = reg == _R0)) reg = jit_get_reg(jit_class_gpr);
924 LIS(rn(reg), hi);
925 LFS(r0, rn(reg), lo);
926 jit_unget_reg(reg);
927 if (inv) jit_unget_reg(_R0);
928 }
929 else {
930 reg = jit_get_reg(jit_class_gpr);
931 movi(rn(reg), i0);
932 ldr_f(r0, rn(reg));
933 jit_unget_reg(reg);
934 }
935}
936
937static void
938_ldi_d(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
939{
940 jit_bool_t inv;
941 jit_int32_t reg;
942 jit_word_t lo, hi;
943 if (can_sign_extend_short_p(i0))
944 LFD(r0, _R0_REGNO, i0);
945 else if (can_sign_extend_int_p(i0)) {
946 hi = (jit_int16_t)((i0 >> 16) + ((jit_uint16_t)i0 >> 15));
947 lo = (jit_int16_t)(i0 - (hi << 16));
948 reg = jit_get_reg(jit_class_gpr);
949 if ((inv = reg == _R0)) reg = jit_get_reg(jit_class_gpr);
950 LIS(rn(reg), hi);
951 LFD(r0, rn(reg), lo);
952 jit_unget_reg(reg);
953 if (inv) jit_unget_reg(_R0);
954 }
955 else {
956 reg = jit_get_reg(jit_class_gpr);
957 movi(rn(reg), i0);
958 ldr_d(r0, rn(reg));
959 jit_unget_reg(reg);
960 }
961}
962
963static void
964_ldxr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
965{
966 jit_int32_t reg;
967 if (r1 == _R0_REGNO) {
968 if (r2 != _R0_REGNO)
969 LFSX(r0, r2, r1);
970 else {
971 reg = jit_get_reg(jit_class_gpr);
972 movr(rn(reg), r1);
973 LFSX(r0, rn(reg), r2);
974 jit_unget_reg(reg);
975 }
976 }
977 else
978 LFSX(r0, r1, r2);
979}
980
981static void
982_ldxr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
983{
984 jit_int32_t reg;
985 if (r1 == _R0_REGNO) {
986 if (r2 != _R0_REGNO)
987 LFDX(r0, r2, r1);
988 else {
989 reg = jit_get_reg(jit_class_gpr);
990 movr(rn(reg), r1);
991 LFDX(r0, rn(reg), r2);
992 jit_unget_reg(reg);
993 }
994 }
995 else
996 LFDX(r0, r1, r2);
997}
998
999static void
1000_ldxi_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1001{
1002 jit_int32_t reg;
1003 if (i0 == 0)
1004 ldr_f(r0, r1);
1005 else if (can_sign_extend_short_p(i0)) {
1006 if (r1 == _R0_REGNO) {
1007 reg = jit_get_reg(jit_class_gpr);
1008 movr(rn(reg), r1);
1009 LFS(r0, rn(reg), i0);
1010 jit_unget_reg(reg);
1011 }
1012 else
1013 LFS(r0, r1, i0);
1014 }
1015 else {
1016 reg = jit_get_reg(jit_class_gpr);
1017 movi(rn(reg), i0);
1018 ldxr_f(r0, r1, rn(reg));
1019 jit_unget_reg(reg);
1020 }
1021}
1022
1023static void
1024_ldxi_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1025{
1026 jit_int32_t reg;
1027 if (i0 == 0)
1028 ldr_d(r0, r1);
1029 else if (can_sign_extend_short_p(i0)) {
1030 if (r1 == _R0_REGNO) {
1031 reg = jit_get_reg(jit_class_gpr);
1032 movr(rn(reg), r1);
1033 LFD(r0, rn(reg), i0);
1034 jit_unget_reg(reg);
1035 }
1036 else
1037 LFD(r0, r1, i0);
1038 }
1039 else {
1040 reg = jit_get_reg(jit_class_gpr);
1041 movi(rn(reg), i0);
1042 ldxr_d(r0, r1, rn(reg));
1043 jit_unget_reg(reg);
1044 }
1045}
1046
1047static void
1048_sti_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
1049{
1050 jit_bool_t inv;
1051 jit_int32_t reg;
1052 jit_word_t lo, hi;
1053 if (can_sign_extend_short_p(i0))
1054 STFS(r0, _R0_REGNO, i0);
1055 else if (can_sign_extend_int_p(i0)) {
1056 hi = (jit_int16_t)((i0 >> 16) + ((jit_uint16_t)i0 >> 15));
1057 lo = (jit_int16_t)(i0 - (hi << 16));
1058 reg = jit_get_reg(jit_class_gpr);
1059 if ((inv = reg == _R0)) reg = jit_get_reg(jit_class_gpr);
1060 LIS(rn(reg), hi);
1061 STFS(r0, rn(reg), lo);
1062 jit_unget_reg(reg);
1063 if (inv) jit_unget_reg(_R0);
1064 }
1065 else {
1066 reg = jit_get_reg(jit_class_gpr);
1067 movi(rn(reg), i0);
1068 str_f(rn(reg), r0);
1069 jit_unget_reg(reg);
1070 }
1071}
1072
1073static void
1074_sti_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
1075{
1076 jit_bool_t inv;
1077 jit_int32_t reg;
1078 jit_word_t lo, hi;
1079 if (can_sign_extend_short_p(i0))
1080 STFD(r0, _R0_REGNO, i0);
1081 else if (can_sign_extend_int_p(i0)) {
1082 hi = (jit_int16_t)((i0 >> 16) + ((jit_uint16_t)i0 >> 15));
1083 lo = (jit_int16_t)(i0 - (hi << 16));
1084 reg = jit_get_reg(jit_class_gpr);
1085 if ((inv = reg == _R0)) reg = jit_get_reg(jit_class_gpr);
1086 LIS(rn(reg), hi);
1087 STFD(r0, rn(reg), lo);
1088 jit_unget_reg(reg);
1089 if (inv) jit_unget_reg(_R0);
1090 }
1091 else {
1092 reg = jit_get_reg(jit_class_gpr);
1093 movi(rn(reg), i0);
1094 str_d(rn(reg), r0);
1095 jit_unget_reg(reg);
1096 }
1097}
1098
1099static void
1100_stxr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1101{
1102 jit_int32_t reg;
1103 if (r0 == _R0_REGNO) {
1104 if (r1 != _R0_REGNO)
1105 STFSX(r2, r1, r0);
1106 else {
1107 reg = jit_get_reg(jit_class_gpr);
1108 movr(rn(reg), r1);
1109 STFSX(r2, rn(reg), r0);
1110 jit_unget_reg(reg);
1111 }
1112 }
1113 else
1114 STFSX(r2, r0, r1);
1115}
1116
1117static void
1118_stxr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1119{
1120 jit_int32_t reg;
1121 if (r0 == _R0_REGNO) {
1122 if (r1 != _R0_REGNO)
1123 STFDX(r2, r1, r0);
1124 else {
1125 reg = jit_get_reg(jit_class_gpr);
1126 movr(rn(reg), r0);
1127 STFDX(r2, rn(reg), r1);
1128 jit_unget_reg(reg);
1129 }
1130 }
1131 else
1132 STFDX(r2, r0, r1);
1133}
1134
1135static void
1136_stxi_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1137{
1138 jit_int32_t reg;
1139 if (i0 == 0)
1140 str_f(r0, r1);
1141 else if (can_sign_extend_short_p(i0)) {
1142 if (r0 == _R0_REGNO) {
1143 reg = jit_get_reg(jit_class_gpr);
1144 movr(rn(reg), i0);
1145 STFS(r1, rn(reg), i0);
1146 jit_unget_reg(reg);
1147 }
1148 else
1149 STFS(r1, r0, i0);
1150 }
1151 else {
1152 reg = jit_get_reg(jit_class_gpr);
1153 movi(rn(reg), i0);
1154 stxr_f(rn(reg), r0, r1);
1155 jit_unget_reg(reg);
1156 }
1157}
1158
1159static void
1160_stxi_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1161{
1162 jit_int32_t reg;
1163 if (i0 == 0)
1164 str_d(r0, r1);
1165 else if (can_sign_extend_short_p(i0)) {
1166 if (r0 == _R0_REGNO) {
1167 reg = jit_get_reg(jit_class_gpr);
1168 movr(rn(reg), i0);
1169 STFD(r1, rn(reg), i0);
1170 jit_unget_reg(reg);
1171 }
1172 else
1173 STFD(r1, r0, i0);
1174 }
1175 else {
1176 reg = jit_get_reg(jit_class_gpr);
1177 movi(rn(reg), i0);
1178 stxr_d(rn(reg), r0, r1);
1179 jit_unget_reg(reg);
1180 }
1181}
1182#endif