git subrepo pull (merge) --force deps/lightning
[pcsx_rearmed.git] / deps / lightning / lib / jit_mips-fpu.c
CommitLineData
4a71579b 1/*
79bfeef6 2 * Copyright (C) 2012-2023 Free Software Foundation, Inc.
4a71579b
PC
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 BE_P (__BYTE_ORDER == __BIG_ENDIAN)
22# define LE_P (__BYTE_ORDER == __LITTLE_ENDIAN)
23# define MIPS_fmt_S 0x10 /* float32 */
24# define MIPS_fmt_D 0x11 /* float64 */
25# define MIPS_fmt_W 0x14 /* int32 */
26# define MIPS_fmt_L 0x15 /* int64 */
27# define MIPS_fmt_PS 0x16 /* 2 x float32 */
28# define MIPS_fmt_S_PU 0x20
29# define MIPS_fmt_S_PL 0x26
79bfeef6
PC
30# define MIPS_condn_S 0x14 /* release 6 */
31# define MIPS_condn_D 0x15 /* release 6 */
4a71579b
PC
32# define MIPS_ADD_fmt 0x00
33# define MIPS_LWXC1 0x00
34# define MIPS_SUB_fmt 0x01
35# define MIPS_LDXC1 0x01
36# define MIPS_MUL_fmt 0x02
37# define MIPS_DIV_fmt 0x03
38# define MIPS_SQRT_fmt 0x04
39# define MIPS_ABS_fmt 0x05
40# define MIPS_LUXC1 0x05
41# define MIPS_MOV_fmt 0x06
42# define MIPS_NEG_fmt 0x07
43# define MIPS_SWXC1 0x08
44# define MIPS_ROUND_fmt_L 0x08
45# define MIPS_TRUNC_fmt_L 0x09
46# define MIPS_SDXC1 0x09
47# define MIPS_CEIL_fmt_L 0x0a
48# define MIPS_FLOOR_fmt_L 0x0b
49# define MIPS_ROUND_fmt_W 0x0c
50# define MIPS_TRUNC_fmt_W 0x0d
51# define MIPS_SUXC1 0x0d
52# define MIPS_CEIL_fmt_W 0x0e
53# define MIPS_FLOOR_fmt_W 0x0f
54# define MIPS_RECIP 0x15
55# define MIPS_RSQRT 0x16
ba86ff93
PC
56# define MIPS_MADDF 0x18
57# define MIPS_MSUBF 0x19
4a71579b
PC
58# define MIPS_ALNV_PS 0x1e
59# define MIPS_CVT_fmt_S 0x20
60# define MIPS_CVT_fmt_D 0x21
61# define MIPS_CVT_fmt_W 0x24
62# define MIPS_CVT_fmt_L 0x25
63# define MIPS_PLL 0x2c
64# define MIPS_PLU 0x2d
65# define MIPS_PUL 0x2e
66# define MIPS_PUU 0x2f
ba86ff93
PC
67# define MIPS_MADD_fmt_S 0x20
68# define MIPS_MADD_fmt_D 0x21
69# define MIPS_MADD_fmt_PS 0x22
70# define MIPS_MSUB_fmt_S 0x28
71# define MIPS_MSUB_fmt_D 0x29
72# define MIPS_MSUB_fmt_PS 0x2a
73# define MIPS_NMADD_fmt_S 0x30
74# define MIPS_NMADD_fmt_D 0x31
75# define MIPS_NMADD_fmt_PS 0x32
76# define MIPS_NMSUB_fmt_S 0x38
77# define MIPS_NMSUB_fmt_D 0x39
78# define MIPS_NMSUB_fmt_PS 0x3a
4a71579b
PC
79# define MIPS_cond_F 0x30
80# define MIPS_cond_UN 0x31
81# define MIPS_cond_EQ 0x32
82# define MIPS_cond_UEQ 0x33
83# define MIPS_cond_OLT 0x34
84# define MIPS_cond_ULT 0x35
85# define MIPS_cond_OLE 0x36
86# define MIPS_cond_ULE 0x37
87# define MIPS_cond_SF 0x38
88# define MIPS_cond_NGLE 0x39
89# define MIPS_cond_SEQ 0x3a
90# define MIPS_cond_NGL 0x3b
91# define MIPS_cond_LT 0x3c
92# define MIPS_cond_NGE 0x3d
93# define MIPS_cond_LE 0x3e
94# define MIPS_cond_UGT 0x3f
79bfeef6
PC
95/* Mips release 6 */
96# define MIPS_cmp_AF 0x00
97# define MIPS_cmp_UN 0x01
98# define MIPS_cmp_EQ 0x02
99# define MIPS_cmp_UEQ 0x03
100# define MIPS_cmp_LT 0x04
101# define MIPS_cmp_ULT 0x05
102# define MIPS_cmp_LE 0x06
103# define MIPS_cmp_ULE 0x07
104# define MIPS_cmp_SAF 0x08
105# define MIPS_cmp_SUN 0x09
106# define MIPS_cmp_SEQ 0x0a
107# define MIPS_cmp_SUEQ 0x0b
108# define MIPS_cmp_SLT 0x0c
109# define MIPS_cmp_SULT 0x0d
110# define MIPS_cmp_SLE 0x0e
111# define MIPS_cmp_SULE 0x0f
4a71579b
PC
112# define ADD_S(fd,fs,ft) hrrrit(MIPS_COP1,MIPS_fmt_S,ft,fs,fd,MIPS_ADD_fmt)
113# define ADD_D(fd,fs,ft) hrrrit(MIPS_COP1,MIPS_fmt_D,ft,fs,fd,MIPS_ADD_fmt)
114# define SUB_S(fd,fs,ft) hrrrit(MIPS_COP1,MIPS_fmt_S,ft,fs,fd,MIPS_SUB_fmt)
115# define SUB_D(fd,fs,ft) hrrrit(MIPS_COP1,MIPS_fmt_D,ft,fs,fd,MIPS_SUB_fmt)
116# define MUL_S(fd,fs,ft) hrrrit(MIPS_COP1,MIPS_fmt_S,ft,fs,fd,MIPS_MUL_fmt)
117# define MUL_D(fd,fs,ft) hrrrit(MIPS_COP1,MIPS_fmt_D,ft,fs,fd,MIPS_MUL_fmt)
118# define DIV_S(fd,fs,ft) hrrrit(MIPS_COP1,MIPS_fmt_S,ft,fs,fd,MIPS_DIV_fmt)
119# define DIV_D(fd,fs,ft) hrrrit(MIPS_COP1,MIPS_fmt_D,ft,fs,fd,MIPS_DIV_fmt)
120# define ABS_S(fd,fs) hrrrit(MIPS_COP1,MIPS_fmt_S,0,fs,fd,MIPS_ABS_fmt)
121# define ABS_D(fd,fs) hrrrit(MIPS_COP1,MIPS_fmt_D,0,fs,fd,MIPS_ABS_fmt)
122# define NEG_S(fd,fs) hrrrit(MIPS_COP1,MIPS_fmt_S,0,fs,fd,MIPS_NEG_fmt)
123# define NEG_D(fd,fs) hrrrit(MIPS_COP1,MIPS_fmt_D,0,fs,fd,MIPS_NEG_fmt)
124# define SQRT_S(fd,fs) hrrrit(MIPS_COP1,MIPS_fmt_S,0,fs,fd,MIPS_SQRT_fmt)
125# define SQRT_D(fd,fs) hrrrit(MIPS_COP1,MIPS_fmt_D,0,fs,fd,MIPS_SQRT_fmt)
126# define MFC1(rt, fs) hrrrit(MIPS_COP1,MIPS_MF,rt,fs,0,0)
79bfeef6 127# define MFHC1(rt, fs) hrrrit(MIPS_COP1,MIPS_MFH,rt,fs,0,0)
4a71579b 128# define MTC1(rt, fs) hrrrit(MIPS_COP1,MIPS_MT,rt,fs,0,0)
79bfeef6 129# define MTHC1(rt, fs) hrrrit(MIPS_COP1,MIPS_MTH,rt,fs,0,0)
4a71579b
PC
130# define DMFC1(rt, fs) hrrrit(MIPS_COP1,MIPS_DMF,rt,fs,0,0)
131# define DMTC1(rt, fs) hrrrit(MIPS_COP1,MIPS_DMT,rt,fs,0,0)
132# define CVT_D_S(fd,fs) hrrrit(MIPS_COP1,MIPS_fmt_S,0,fs,fd,MIPS_CVT_fmt_D)
133# define CVT_D_W(fd,fs) hrrrit(MIPS_COP1,MIPS_fmt_W,0,fs,fd,MIPS_CVT_fmt_D)
134# define CVT_D_L(fd,fs) hrrrit(MIPS_COP1,MIPS_fmt_L,0,fs,fd,MIPS_CVT_fmt_D)
135# define CVT_L_S(fd,fs) hrrrit(MIPS_COP1,MIPS_fmt_S,0,fs,fd,MIPS_CVT_fmt_L)
136# define CVT_L_D(fd,fs) hrrrit(MIPS_COP1,MIPS_fmt_D,0,fs,fd,MIPS_CVT_fmt_L)
137# define CVT_PS_S(fd,fs) hrrrit(MIPS_COP1,MIPS_fmt_S,0,fs,fd,MIPS_CVT_fmt_PS)
138# define CVT_S_D(fd,fs) hrrrit(MIPS_COP1,MIPS_fmt_D,0,fs,fd,MIPS_CVT_fmt_S)
139# define CVT_S_W(fd,fs) hrrrit(MIPS_COP1,MIPS_fmt_W,0,fs,fd,MIPS_CVT_fmt_S)
140# define CVT_S_L(fd,fs) hrrrit(MIPS_COP1,MIPS_fmt_L,0,fs,fd,MIPS_CVT_fmt_S)
141# define CVT_S_PL(fd,fs) hrrrit(MIPS_COP1,MIPS_fmt_PS,0,fs,fd,MIPS_CVT_fmt_S_PL)
142# define CVT_S_PU(fd,fs) hrrrit(MIPS_COP1,MIPS_fmt_PS,0,fs,fd,MIPS_CVT_fmt_S_PU)
143# define CVT_W_S(fd,fs) hrrrit(MIPS_COP1,MIPS_fmt_S,0,fs,fd,MIPS_CVT_fmt_W)
144# define CVT_W_D(fd,fs) hrrrit(MIPS_COP1,MIPS_fmt_D,0,fs,fd,MIPS_CVT_fmt_W)
145# define TRUNC_L_S(fd,fs) hrrrit(MIPS_COP1,MIPS_fmt_S,0,fs,fd,MIPS_TRUNC_fmt_L)
146# define TRUNC_L_D(fd,fs) hrrrit(MIPS_COP1,MIPS_fmt_D,0,fs,fd,MIPS_TRUNC_fmt_L)
147# define TRUNC_W_S(fd,fs) hrrrit(MIPS_COP1,MIPS_fmt_S,0,fs,fd,MIPS_TRUNC_fmt_W)
148# define TRUNC_W_D(fd,fs) hrrrit(MIPS_COP1,MIPS_fmt_D,0,fs,fd,MIPS_TRUNC_fmt_W)
ba86ff93
PC
149# define MADD_S(fd,fr,fs,ft) hrrrit(MIPS_COP1X,fr,ft,fs,fd,MIPS_MADD_fmt_S)
150# define MADD_D(fd,fr,fs,ft) hrrrit(MIPS_COP1X,fr,ft,fs,fd,MIPS_MADD_fmt_D)
151# define MSUB_S(fd,fr,fs,ft) hrrrit(MIPS_COP1X,fr,ft,fs,fd,MIPS_MSUB_fmt_S)
152# define MSUB_D(fd,fr,fs,ft) hrrrit(MIPS_COP1X,fr,ft,fs,fd,MIPS_MSUB_fmt_D)
153# define NMADD_S(fd,fr,fs,ft) hrrrit(MIPS_COP1X,fr,ft,fs,fd,MIPS_NMADD_fmt_S)
154# define NMADD_D(fd,fr,fs,ft) hrrrit(MIPS_COP1X,fr,ft,fs,fd,MIPS_NMADD_fmt_D)
155# define NMSUB_S(fd,fr,fs,ft) hrrrit(MIPS_COP1X,fr,ft,fs,fd,MIPS_NMSUB_fmt_S)
156# define NMSUB_D(fd,fr,fs,ft) hrrrit(MIPS_COP1X,fr,ft,fs,fd,MIPS_NMSUB_fmt_D)
157/* fd = fd + (fs * ft) */
158# define MADDF_S(fd,fs,ft) hrrrit(MIPS_COP1,MIPS_fmt_S,ft,fs,fd,MIPS_MADDF)
159# define MADDF_D(fd,fs,ft) hrrrit(MIPS_COP1,MIPS_fmt_D,ft,fs,fd,MIPS_MADDF)
160/* fd = fd - (fs * ft) */
161# define MSUBF_S(fd,fs,ft) hrrrit(MIPS_COP1,MIPS_fmt_S,ft,fs,fd,MIPS_MSUBF)
162# define MSUBF_D(fd,fs,ft) hrrrit(MIPS_COP1,MIPS_fmt_D,ft,fs,fd,MIPS_MSUBF)
4a71579b
PC
163# define LWC1(rt, of, rb) hrri(MIPS_LWC1, rb, rt, of)
164# define SWC1(rt, of, rb) hrri(MIPS_SWC1, rb, rt, of)
165# define LDC1(rt, of, rb) hrri(MIPS_LDC1, rb, rt, of)
166# define SDC1(rt, of, rb) hrri(MIPS_SDC1, rb, rt, of)
167# define MOV_S(fd, fs) hrrrit(MIPS_COP1,MIPS_fmt_S,0,fs,fd,MIPS_MOV_fmt)
168# define MOV_D(fd, fs) hrrrit(MIPS_COP1,MIPS_fmt_D,0,fs,fd,MIPS_MOV_fmt)
169# define BC1F(im) hrri(MIPS_COP1,MIPS_BC,MIPS_BCF,im)
79bfeef6 170# define BC1EQZ(ft,im) hrri(MIPS_COP1,MIPS_BC1EQZ,ft,im)
4a71579b 171# define BC1T(im) hrri(MIPS_COP1,MIPS_BC,MIPS_BCT,im)
79bfeef6 172# define BC1NEZ(ft,im) hrri(MIPS_COP1,MIPS_BC1NEZ,ft,im)
4a71579b
PC
173# define C_F_S(fs,ft) c_cond_fmt(MIPS_fmt_S,ft,fs,MIPS_cond_F)
174# define C_F_D(fs,ft) c_cond_fmt(MIPS_fmt_D,ft,fs,MIPS_cond_F)
175# define C_F_PS(fs,ft) c_cond_fmt(MIPS_fmt_PS,ft,fs,MIPS_cond_F)
176# define C_UN_S(fs,ft) c_cond_fmt(MIPS_fmt_S,ft,fs,MIPS_cond_UN)
177# define C_UN_D(fs,ft) c_cond_fmt(MIPS_fmt_D,ft,fs,MIPS_cond_UN)
178# define C_UN_PS(fs,ft) c_cond_fmt(MIPS_fmt_PS,ft,fs,MIPS_cond_UN)
179# define C_EQ_S(fs,ft) c_cond_fmt(MIPS_fmt_S,ft,fs,MIPS_cond_EQ)
180# define C_EQ_D(fs,ft) c_cond_fmt(MIPS_fmt_D,ft,fs,MIPS_cond_EQ)
181# define C_EQ_PS(fs,ft) c_cond_fmt(MIPS_fmt_PS,ft,fs,MIPS_cond_EQ)
182# define C_UEQ_S(fs,ft) c_cond_fmt(MIPS_fmt_S,ft,fs,MIPS_cond_UEQ)
183# define C_UEQ_D(fs,ft) c_cond_fmt(MIPS_fmt_D,ft,fs,MIPS_cond_UEQ)
184# define C_UEQ_PS(fs,ft) c_cond_fmt(MIPS_fmt_PS,ft,fs,MIPS_cond_UEQ)
185# define C_OLT_S(fs,ft) c_cond_fmt(MIPS_fmt_S,ft,fs,MIPS_cond_OLT)
186# define C_OLT_D(fs,ft) c_cond_fmt(MIPS_fmt_D,ft,fs,MIPS_cond_OLT)
187# define C_OLT_PS(fs,ft) c_cond_fmt(MIPS_fmt_PS,ft,fs,MIPS_cond_OLT)
188# define C_ULT_S(fs,ft) c_cond_fmt(MIPS_fmt_S,ft,fs,MIPS_cond_ULT)
189# define C_ULT_D(fs,ft) c_cond_fmt(MIPS_fmt_D,ft,fs,MIPS_cond_ULT)
190# define C_ULT_PS(fs,ft) c_cond_fmt(MIPS_fmt_PS,ft,fs,MIPS_cond_ULT)
191# define C_OLE_S(fs,ft) c_cond_fmt(MIPS_fmt_S,ft,fs,MIPS_cond_OLE)
192# define C_OLE_D(fs,ft) c_cond_fmt(MIPS_fmt_D,ft,fs,MIPS_cond_OLE)
193# define C_OLE_PS(fs,ft) c_cond_fmt(MIPS_fmt_PS,ft,fs,MIPS_cond_OLE)
194# define C_ULE_S(fs,ft) c_cond_fmt(MIPS_fmt_S,ft,fs,MIPS_cond_ULE)
195# define C_ULE_D(fs,ft) c_cond_fmt(MIPS_fmt_D,ft,fs,MIPS_cond_ULE)
196# define C_ULE_PS(fs,ft) c_cond_fmt(MIPS_fmt_PS,ft,fs,MIPS_cond_ULE)
197# define C_SF_S(fs,ft) c_cond_fmt(MIPS_fmt_S,ft,fs,MIPS_cond_SF)
198# define C_SF_D(fs,ft) c_cond_fmt(MIPS_fmt_D,ft,fs,MIPS_cond_SF)
199# define C_SF_PS(fs,ft) c_cond_fmt(MIPS_fmt_PS,ft,fs,MIPS_cond_SF)
200# define C_NGLE_S(fs,ft) c_cond_fmt(MIPS_fmt_S,ft,fs,MIPS_cond_NGLE)
201# define C_NGLE_D(fs,ft) c_cond_fmt(MIPS_fmt_D,ft,fs,MIPS_cond_NGLE)
202# define C_NGLE_PS(fs,ft) c_cond_fmt(MIPS_fmt_PS,ft,fs,MIPS_cond_NGLE)
203# define C_SEQ_S(fs,ft) c_cond_fmt(MIPS_fmt_S,ft,fs,MIPS_cond_SEQ)
204# define C_SEQ_D(fs,ft) c_cond_fmt(MIPS_fmt_D,ft,fs,MIPS_cond_SEQ)
205# define C_SEQ_PS(fs,ft) c_cond_fmt(MIPS_fmt_PS,ft,fs,MIPS_cond_SEQ)
206# define C_NGL_S(fs,ft) c_cond_fmt(MIPS_fmt_S,ft,fs,MIPS_cond_NGL)
207# define C_NGL_D(fs,ft) c_cond_fmt(MIPS_fmt_D,ft,fs,MIPS_cond_NGL)
208# define C_NGL_PS(fs,ft) c_cond_fmt(MIPS_fmt_PS,ft,fs,MIPS_cond_NGL)
209# define C_NLT_S(fs,ft) c_cond_fmt(MIPS_fmt_S,ft,fs,MIPS_cond_NLT)
210# define C_NLT_D(fs,ft) c_cond_fmt(MIPS_fmt_D,ft,fs,MIPS_cond_NLT)
211# define C_NLT_PS(fs,ft) c_cond_fmt(MIPS_fmt_PS,ft,fs,MIPS_cond_NLT)
212# define C_NGE_S(fs,ft) c_cond_fmt(MIPS_fmt_S,ft,fs,MIPS_cond_NGE)
213# define C_NGE_D(fs,ft) c_cond_fmt(MIPS_fmt_D,ft,fs,MIPS_cond_NGE)
214# define C_NGE_PS(fs,ft) c_cond_fmt(MIPS_fmt_PS,ft,fs,MIPS_cond_NGE)
215# define C_NLE_S(fs,ft) c_cond_fmt(MIPS_fmt_S,ft,fs,MIPS_cond_NLE)
216# define C_NLE_D(fs,ft) c_cond_fmt(MIPS_fmt_D,ft,fs,MIPS_cond_NLE)
217# define C_NLE_PS(fs,ft) c_cond_fmt(MIPS_fmt_PS,ft,fs,MIPS_cond_NLE)
218# define C_UGT_S(fs,ft) c_cond_fmt(MIPS_fmt_S,ft,fs,MIPS_cond_UGT)
219# define C_UGT_D(fs,ft) c_cond_fmt(MIPS_fmt_D,ft,fs,MIPS_cond_UGT)
220# define C_UGT_PS(fs,ft) c_cond_fmt(MIPS_fmt_PS,ft,fs,MIPS_cond_UGT)
221# define c_cond_fmt(fm,ft,fs,cc) _c_cond_fmt(_jit,fm,ft,fs,cc)
222static void
223_c_cond_fmt(jit_state_t *_jit, jit_int32_t fm,
224 jit_int32_t ft, jit_int32_t fs, jit_int32_t cc);
79bfeef6
PC
225# define CMP_AF_S(fd,fs,ft) cmp_cond_fmt(MIPS_condn_S,fd,ft,fs,MIPS_cmp_AF)
226# define CMP_AF_D(fd,fs,ft) cmp_cond_fmt(MIPS_condn_D,fd,ft,fs,MIPS_cmp_AF)
227# define CMP_UN_S(fd,fs,ft) cmp_cond_fmt(MIPS_condn_S,fd,ft,fs,MIPS_cmp_UN)
228# define CMP_UN_D(fd,fs,ft) cmp_cond_fmt(MIPS_condn_D,fd,ft,fs,MIPS_cmp_UN)
229# define CMP_EQ_S(fd,fs,ft) cmp_cond_fmt(MIPS_condn_S,fd,ft,fs,MIPS_cmp_EQ)
230# define CMP_EQ_D(fd,fs,ft) cmp_cond_fmt(MIPS_condn_D,fd,ft,fs,MIPS_cmp_EQ)
231# define CMP_UEQ_S(fd,fs,ft) cmp_cond_fmt(MIPS_condn_S,fd,ft,fs,MIPS_cmp_UEQ)
232# define CMP_UEQ_D(fd,fs,ft) cmp_cond_fmt(MIPS_condn_D,fd,ft,fs,MIPS_cmp_UEQ)
233# define CMP_LT_S(fd,fs,ft) cmp_cond_fmt(MIPS_condn_S,fd,ft,fs,MIPS_cmp_LT)
234# define CMP_LT_D(fd,fs,ft) cmp_cond_fmt(MIPS_condn_D,fd,ft,fs,MIPS_cmp_LT)
235# define CMP_ULT_S(fd,fs,ft) cmp_cond_fmt(MIPS_condn_S,fd,ft,fs,MIPS_cmp_ULT)
236# define CMP_ULT_D(fd,fs,ft) cmp_cond_fmt(MIPS_condn_D,fd,ft,fs,MIPS_cmp_ULT)
237# define CMP_LE_S(fd,fs,ft) cmp_cond_fmt(MIPS_condn_S,fd,ft,fs,MIPS_cmp_LE)
238# define CMP_LE_D(fd,fs,ft) cmp_cond_fmt(MIPS_condn_D,fd,ft,fs,MIPS_cmp_LE)
239# define CMP_ULE_S(fd,fs,ft) cmp_cond_fmt(MIPS_condn_S,fd,ft,fs,MIPS_cmp_ULE)
240# define CMP_ULE_D(fd,fs,ft) cmp_cond_fmt(MIPS_condn_D,fd,ft,fs,MIPS_cmp_ULE)
241# define CMP_SAF_S(fd,fs,ft) cmp_cond_fmt(MIPS_condn_S,fd,ft,fs,MIPS_cmp_SAF)
242# define CMP_SAF_D(fd,fs,ft) cmp_cond_fmt(MIPS_condn_D,fd,ft,fs,MIPS_cmp_SAF)
243# define CMP_SUN_S(fd,fs,ft) cmp_cond_fmt(MIPS_condn_S,fd,ft,fs,MIPS_cmp_SUN)
244# define CMP_SUN_D(fd,fs,ft) cmp_cond_fmt(MIPS_condn_D,fd,ft,fs,MIPS_cmp_SUN)
245# define CMP_SEQ_S(fd,fs,ft) cmp_cond_fmt(MIPS_condn_S,fd,ft,fs,MIPS_cmp_SEQ)
246# define CMP_SEQ_D(fd,fs,ft) cmp_cond_fmt(MIPS_condn_D,fd,ft,fs,MIPS_cmp_SEQ)
247# define CMP_SUEQ_S(fd,fs,ft) cmp_cond_fmt(MIPS_condn_S,fd,ft,fs,MIPS_cmp_SUEQ)
248# define CMP_SUEQ_D(fd,fs,ft) cmp_cond_fmt(MIPS_condn_D,fd,ft,fs,MIPS_cmp_SUEQ)
249# define CMP_SLT_S(fd,fs,ft) cmp_cond_fmt(MIPS_condn_S,fd,ft,fs,MIPS_cmp_SLT)
250# define CMP_SLT_D(fd,fs,ft) cmp_cond_fmt(MIPS_condn_D,fd,ft,fs,MIPS_cmp_SLT)
251# define CMP_SULT_S(fd,fs,ft) cmp_cond_fmt(MIPS_condn_S,fd,ft,fs,MIPS_cmp_SULT)
252# define CMP_SULT_D(fd,fs,ft) cmp_cond_fmt(MIPS_condn_D,fd,ft,fs,MIPS_cmp_SULT)
253# define CMP_SLE_S(fd,fs,ft) cmp_cond_fmt(MIPS_condn_S,fd,ft,fs,MIPS_cmp_SLE)
254# define CMP_SLE_D(fd,fs,ft) cmp_cond_fmt(MIPS_condn_D,fd,ft,fs,MIPS_cmp_SLE)
255# define CMP_SULE_S(fd,fs,ft) cmp_cond_fmt(MIPS_condn_S,fd,ft,fs,MIPS_cmp_SULE)
256# define CMP_SULE_D(fd,fs,ft) cmp_cond_fmt(MIPS_condn_D,fd,ft,fs,MIPS_cmp_SULE)
257# define cmp_cond_fmt(fm,fd,ft,fs,cn) _cmp_cond_fmt(_jit,fm,fd,ft,fs,cn)
258static void
259_cmp_cond_fmt(jit_state_t *_jit, jit_int32_t fm, jit_int32_t fd,
260 jit_int32_t ft, jit_int32_t fs, jit_int32_t cn);
4a71579b
PC
261# define addr_f(r0,r1,r2) ADD_S(r0,r1,r2)
262# define addi_f(r0,r1,i0) _addi_f(_jit,r0,r1,i0)
263static void _addi_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
264# define addr_d(r0,r1,r2) ADD_D(r0,r1,r2)
265# define addi_d(r0,r1,i0) _addi_d(_jit,r0,r1,i0)
266static void _addi_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
267# define subr_f(r0,r1,r2) SUB_S(r0,r1,r2)
268# define subi_f(r0,r1,i0) _subi_f(_jit,r0,r1,i0)
269static void _subi_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
270# define subr_d(r0,r1,r2) SUB_D(r0,r1,r2)
271# define subi_d(r0,r1,i0) _subi_d(_jit,r0,r1,i0)
272static void _subi_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
273# define rsbr_f(r0,r1,r2) subr_f(r0,r2,r1)
274# define rsbi_f(r0,r1,i0) _rsbi_f(_jit,r0,r1,i0)
275static void _rsbi_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
276# define rsbr_d(r0,r1,r2) subr_d(r0,r2,r1)
277# define rsbi_d(r0,r1,i0) _rsbi_d(_jit,r0,r1,i0)
278static void _rsbi_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
279# define mulr_f(r0,r1,r2) MUL_S(r0,r1,r2)
280# define muli_f(r0,r1,i0) _muli_f(_jit,r0,r1,i0)
281static void _muli_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
282# define mulr_d(r0,r1,r2) MUL_D(r0,r1,r2)
283# define muli_d(r0,r1,i0) _muli_d(_jit,r0,r1,i0)
284static void _muli_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
285# define divr_f(r0,r1,r2) DIV_S(r0,r1,r2)
286# define divi_f(r0,r1,i0) _divi_f(_jit,r0,r1,i0)
287static void _divi_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
288# define divr_d(r0,r1,r2) DIV_D(r0,r1,r2)
289# define divi_d(r0,r1,i0) _divi_d(_jit,r0,r1,i0)
290static void _divi_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
291# define absr_f(r0,r1) ABS_S(r0,r1)
292# define absr_d(r0,r1) ABS_D(r0,r1)
293# define negr_f(r0,r1) NEG_S(r0,r1)
294# define negr_d(r0,r1) NEG_D(r0,r1)
295# define sqrtr_f(r0,r1) SQRT_S(r0,r1)
296# define sqrtr_d(r0,r1) SQRT_D(r0,r1)
297# define movr_w_f(r0, r1) MTC1(r1, r0)
79bfeef6 298# define movr_f_w(r0, r1) MFC1(r0, r1)
ba86ff93
PC
299# define movi_w_f(r0, i0) _movi_w_f(_jit, r0, i0)
300static void _movi_w_f(jit_state_t*, jit_int32_t, jit_word_t);
4a71579b
PC
301# define extr_f(r0, r1) _extr_f(_jit, r0, r1)
302static void _extr_f(jit_state_t*,jit_int32_t,jit_int32_t);
303# define truncr_f_i(r0, r1) _truncr_f_i(_jit, r0, r1)
304static void _truncr_f_i(jit_state_t*,jit_int32_t,jit_int32_t);
305# if __WORDSIZE == 64
306# define truncr_f_l(r0, r1) _truncr_f_l(_jit, r0, r1)
307static void _truncr_f_l(jit_state_t*,jit_int32_t,jit_int32_t);
308# endif
309# define extr_d_f(r0, r1) CVT_S_D(r0, r1)
310# define ldr_f(r0, r1) LWC1(r0, 0, r1)
311# define ldi_f(r0, i0) _ldi_f(_jit, r0, i0)
312static void _ldi_f(jit_state_t*,jit_int32_t,jit_word_t);
313# define ldxr_f(r0, r1, r2) _ldxr_f(_jit, r0, r1, r2)
314static void _ldxr_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
315# define ldxi_f(r0, r1, i0) _ldxi_f(_jit, r0, r1, i0)
316static void _ldxi_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
ba86ff93
PC
317# define unldr_x(r0, r1, i0) _unldr_x(_jit, r0, r1, i0)
318static void _unldr_x(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
319# define unldi_x(r0, i0, i1) _unldi_x(_jit, r0, i0, i1)
320static void _unldi_x(jit_state_t*, jit_int32_t, jit_word_t, jit_word_t);
4a71579b
PC
321# define str_f(r0, r1) SWC1(r1, 0, r0)
322# define sti_f(i0, r0) _sti_f(_jit, i0, r0)
323static void _sti_f(jit_state_t*,jit_word_t,jit_int32_t);
324# define stxr_f(r0, r1, r2) _stxr_f(_jit, r0, r1, r2)
325static void _stxr_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
326# define stxi_f(i0, r0, r1) _stxi_f(_jit, i0, r0, r1)
327static void _stxi_f(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
ba86ff93
PC
328# define unstr_x(r0, r1, i0) _unstr_x(_jit, r0, r1, i0)
329static void _unstr_x(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
330# define unsti_x(i0, r0, i1) _unsti_x(_jit, i0, r0, i1)
331static void _unsti_x(jit_state_t*, jit_word_t, jit_int32_t, jit_word_t);
332# define fmar_f(r0, r1, r2, r3) _fmar_f(_jit, r0, r1, r2, r3)
333static void _fmar_f(jit_state_t*,
334 jit_int32_t, jit_int32_t, jit_int32_t, jit_int32_t);
335# define fmsr_f(r0, r1, r2, r3) _fmsr_f(_jit, r0, r1, r2, r3)
336static void _fmsr_f(jit_state_t*,
337 jit_int32_t, jit_int32_t, jit_int32_t, jit_int32_t);
338# define fnmar_f(r0, r1, r2, r3) _fnmar_f(_jit, r0, r1, r2, r3)
339static void _fnmar_f(jit_state_t*,
340 jit_int32_t, jit_int32_t, jit_int32_t, jit_int32_t);
341# define fnmsr_f(r0, r1, r2, r3) _fnmsr_f(_jit, r0, r1, r2, r3)
342static void _fnmsr_f(jit_state_t*,
343 jit_int32_t, jit_int32_t, jit_int32_t, jit_int32_t);
4a71579b
PC
344# define movr_f(r0, r1) _movr_f(_jit, r0, r1)
345static void _movr_f(jit_state_t*,jit_int32_t,jit_int32_t);
346# define movi_f(r0, i0) _movi_f(_jit, r0, i0)
347static void _movi_f(jit_state_t*,jit_int32_t,jit_float32_t*);
ba86ff93
PC
348# if NEW_ABI && __WORDSIZE == 32
349# define movi64(r0, i0) _movi64(_jit, r0, i0)
4a71579b 350static void _movi64(jit_state_t*,jit_int32_t,jit_int64_t);
ba86ff93
PC
351# define movi_d_w(r0, i0) _movi_d_w(_jit, r0, i0)
352static void _movi_d_w(jit_state_t*,jit_int32_t,jit_int64_t);
353# elif __WORDSIZE == 64
354# define movi64(r0, i0) movi(r0, i0)
355# endif
356# if __WORDSIZE == 64 || NEW_ABI
4a71579b
PC
357# define movr_w_d(r0, r1) DMTC1(r1, r0)
358# define movr_d_w(r0, r1) DMFC1(r0, r1)
ba86ff93
PC
359# define movi_w_d(r0, i0) _movi_w_d(_jit, r0, i0)
360static void _movi_w_d(jit_state_t*, jit_int32_t, jit_word_t);
361# endif
362# if __WORDSIZE == 32
4a71579b
PC
363# define movr_ww_d(r0, r1, r2) _movr_ww_d(_jit, r0, r1, r2)
364static void _movr_ww_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
365# define movr_d_ww(r0, r1, r2) _movr_d_ww(_jit, r0, r1, r2)
366static void _movr_d_ww(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
ba86ff93
PC
367# define movi_ww_d(r0, i0, i1) _movi_ww_d(_jit, r0, i0, i1)
368static void _movi_ww_d(jit_state_t*, jit_int32_t, jit_word_t, jit_word_t);
4a71579b
PC
369# endif
370# define extr_d(r0, r1) _extr_d(_jit, r0, r1)
371static void _extr_d(jit_state_t*,jit_int32_t,jit_int32_t);
372# define truncr_d_i(r0, r1) _truncr_d_i(_jit, r0, r1)
373static void _truncr_d_i(jit_state_t*,jit_int32_t,jit_int32_t);
374# if __WORDSIZE == 64
375# define truncr_d_l(r0, r1) _truncr_d_l(_jit, r0, r1)
376static void _truncr_d_l(jit_state_t*,jit_int32_t,jit_int32_t);
377# endif
378# define ldr_d(r0, r1) _ldr_d(_jit, r0, r1)
379static void _ldr_d(jit_state_t*,jit_int32_t,jit_int32_t);
380# define ldi_d(r0, i0) _ldi_d(_jit, r0, i0)
381static void _ldi_d(jit_state_t*,jit_int32_t,jit_word_t);
382# define ldxr_d(r0, r1, r2) _ldxr_d(_jit, r0, r1, r2)
383static void _ldxr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
384# define ldxi_d(r0, r1, i0) _ldxi_d(_jit, r0, r1, i0)
385static void _ldxi_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
386# define str_d(r0, r1) _str_d(_jit, r0, r1)
387static void _str_d(jit_state_t*,jit_int32_t,jit_int32_t);
388# define sti_d(i0, r0) _sti_d(_jit, i0, r0)
389static void _sti_d(jit_state_t*,jit_word_t,jit_int32_t);
390# define stxr_d(r0, r1, r2) _stxr_d(_jit, r0, r1, r2)
391static void _stxr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
392# define stxi_d(i0, r0, r1) _stxi_d(_jit, i0, r0, r1)
393static void _stxi_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
ba86ff93
PC
394# define fmar_d(r0, r1, r2, r3) _fmar_d(_jit, r0, r1, r2, r3)
395static void _fmar_d(jit_state_t*,
396 jit_int32_t, jit_int32_t, jit_int32_t, jit_int32_t);
397# define fmsr_d(r0, r1, r2, r3) _fmsr_d(_jit, r0, r1, r2, r3)
398static void _fmsr_d(jit_state_t*,
399 jit_int32_t, jit_int32_t, jit_int32_t, jit_int32_t);
400# define fnmar_d(r0, r1, r2, r3) _fnmar_d(_jit, r0, r1, r2, r3)
401static void _fnmar_d(jit_state_t*,
402 jit_int32_t, jit_int32_t, jit_int32_t, jit_int32_t);
403# define fnmsr_d(r0, r1, r2, r3) _fnmsr_d(_jit, r0, r1, r2, r3)
404static void _fnmsr_d(jit_state_t*,
405 jit_int32_t, jit_int32_t, jit_int32_t, jit_int32_t);
4a71579b
PC
406# define movr_d(r0, r1) _movr_d(_jit, r0, r1)
407static void _movr_d(jit_state_t*,jit_int32_t,jit_int32_t);
408# define movi_d(r0, i0) _movi_d(_jit, r0, i0)
409static void _movi_d(jit_state_t*,jit_int32_t,jit_float64_t*);
410# define ltr_f(r0, r1, r2) _ltr_f(_jit, r0, r1, r2)
411static void _ltr_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
412# define lti_f(r0, r1, i2) _lti_f(_jit, r0, r1, i2)
413static void _lti_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
414# define ler_f(r0, r1, r2) _ler_f(_jit, r0, r1, r2)
415static void _ler_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
416# define lei_f(r0, r1, i2) _lei_f(_jit, r0, r1, i2)
417static void _lei_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
418# define eqr_f(r0, r1, r2) _eqr_f(_jit, r0, r1, r2)
419static void _eqr_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
420# define eqi_f(r0, r1, i2) _eqi_f(_jit, r0, r1, i2)
421static void _eqi_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
422# define ger_f(r0, r1, r2) _ger_f(_jit, r0, r1, r2)
423static void _ger_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
424# define gei_f(r0, r1, i2) _gei_f(_jit, r0, r1, i2)
425static void _gei_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
426# define gtr_f(r0, r1, r2) _gtr_f(_jit, r0, r1, r2)
427static void _gtr_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
428# define gti_f(r0, r1, i2) _gti_f(_jit, r0, r1, i2)
429static void _gti_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
430# define ner_f(r0, r1, r2) _ner_f(_jit, r0, r1, r2)
431static void _ner_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
432# define nei_f(r0, r1, i2) _nei_f(_jit, r0, r1, i2)
433static void _nei_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
434# define unltr_f(r0, r1, r2) _unltr_f(_jit, r0, r1, r2)
435static void _unltr_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
436# define unlti_f(r0, r1, i2) _unlti_f(_jit, r0, r1, i2)
437static void _unlti_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
438# define unler_f(r0, r1, r2) _unler_f(_jit, r0, r1, r2)
439static void _unler_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
440# define unlei_f(r0, r1, i2) _unlei_f(_jit, r0, r1, i2)
441static void _unlei_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
442# define uneqr_f(r0, r1, r2) _uneqr_f(_jit, r0, r1, r2)
443static void _uneqr_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
444# define uneqi_f(r0, r1, i2) _uneqi_f(_jit, r0, r1, i2)
445static void _uneqi_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
446# define unger_f(r0, r1, r2) _unger_f(_jit, r0, r1, r2)
447static void _unger_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
448# define ungei_f(r0, r1, i2) _ungei_f(_jit, r0, r1, i2)
449static void _ungei_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
450# define ungtr_f(r0, r1, r2) _ungtr_f(_jit, r0, r1, r2)
451static void _ungtr_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
452# define ungti_f(r0, r1, i2) _ungti_f(_jit, r0, r1, i2)
453static void _ungti_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
454# define ltgtr_f(r0, r1, r2) _ltgtr_f(_jit, r0, r1, r2)
455static void _ltgtr_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
456# define ltgti_f(r0, r1, i2) _ltgti_f(_jit, r0, r1, i2)
457static void _ltgti_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
458# define ordr_f(r0, r1, r2) _ordr_f(_jit, r0, r1, r2)
459static void _ordr_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
460# define ordi_f(r0, r1, i2) _ordi_f(_jit, r0, r1, i2)
461static void _ordi_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
462# define unordr_f(r0, r1, r2) _unordr_f(_jit, r0, r1, r2)
463static void _unordr_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
464# define unordi_f(r0, r1, i2) _unordi_f(_jit, r0, r1, i2)
465static void _unordi_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t*);
466# define bltr_f(i0, r0, r1) _bltr_f(_jit, i0, r0, r1)
467static jit_word_t _bltr_f(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
468# define blti_f(i0, r0, i1) _blti_f(_jit, i0, r0, i1)
469static jit_word_t
470_blti_f(jit_state_t*, jit_word_t, jit_int32_t, jit_float32_t*);
471# define bler_f(i0, r0, r1) _bler_f(_jit, i0, r0, r1)
472static jit_word_t _bler_f(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
473# define blei_f(i0, r0, i1) _blei_f(_jit, i0, r0, i1)
474static jit_word_t
475_blei_f(jit_state_t*, jit_word_t, jit_int32_t, jit_float32_t*);
476# define beqr_f(i0, r0, r1) _beqr_f(_jit, i0, r0, r1)
477static jit_word_t _beqr_f(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
478# define beqi_f(i0, r0, i1) _beqi_f(_jit, i0, r0, i1)
479static jit_word_t
480_beqi_f(jit_state_t*, jit_word_t, jit_int32_t, jit_float32_t*);
481# define bger_f(i0, r0, r1) _bger_f(_jit, i0, r0, r1)
482static jit_word_t _bger_f(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
483# define bgei_f(i0, r0, i1) _bgei_f(_jit, i0, r0, i1)
484static jit_word_t
485_bgei_f(jit_state_t*, jit_word_t, jit_int32_t, jit_float32_t*);
486# define bgtr_f(i0, r0, r1) _bgtr_f(_jit, i0, r0, r1)
487static jit_word_t _bgtr_f(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
488# define bgti_f(i0, r0, i1) _bgti_f(_jit, i0, r0, i1)
489static jit_word_t
490_bgti_f(jit_state_t*, jit_word_t, jit_int32_t, jit_float32_t*);
491# define bner_f(i0, r0, r1) _bner_f(_jit, i0, r0, r1)
492static jit_word_t _bner_f(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
493# define bnei_f(i0, r0, i1) _bnei_f(_jit, i0, r0, i1)
494static jit_word_t
495_bnei_f(jit_state_t*, jit_word_t, jit_int32_t, jit_float32_t*);
496# define bunltr_f(i0, r0, r1) _bunltr_f(_jit, i0, r0, r1)
497static jit_word_t _bunltr_f(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
498# define bunlti_f(i0, r0, i1) _bunlti_f(_jit, i0, r0, i1)
499static jit_word_t
500_bunlti_f(jit_state_t*, jit_word_t, jit_int32_t, jit_float32_t*);
501# define bunler_f(i0, r0, r1) _bunler_f(_jit, i0, r0, r1)
502static jit_word_t _bunler_f(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
503# define bunlei_f(i0, r0, i1) _bunlei_f(_jit, i0, r0, i1)
504static jit_word_t
505_bunlei_f(jit_state_t*, jit_word_t, jit_int32_t, jit_float32_t*);
506# define buneqr_f(i0, r0, r1) _buneqr_f(_jit, i0, r0, r1)
507static jit_word_t _buneqr_f(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
508# define buneqi_f(i0, r0, i1) _buneqi_f(_jit, i0, r0, i1)
509static jit_word_t
510_buneqi_f(jit_state_t*, jit_word_t, jit_int32_t, jit_float32_t*);
511# define bunger_f(i0, r0, r1) _bunger_f(_jit, i0, r0, r1)
512static jit_word_t _bunger_f(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
513# define bungei_f(i0, r0, i1) _bungei_f(_jit, i0, r0, i1)
514static jit_word_t
515_bungei_f(jit_state_t*, jit_word_t, jit_int32_t, jit_float32_t*);
516# define bungtr_f(i0, r0, r1) _bungtr_f(_jit, i0, r0, r1)
517static jit_word_t _bungtr_f(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
518# define bungti_f(i0, r0, i1) _bungti_f(_jit, i0, r0, i1)
519static jit_word_t
520_bungti_f(jit_state_t*, jit_word_t, jit_int32_t, jit_float32_t*);
521# define bltgtr_f(i0, r0, r1) _bltgtr_f(_jit, i0, r0, r1)
522static jit_word_t _bltgtr_f(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
523# define bltgti_f(i0, r0, i1) _bltgti_f(_jit, i0, r0, i1)
524static jit_word_t
525_bltgti_f(jit_state_t*, jit_word_t, jit_int32_t, jit_float32_t*);
526# define bordr_f(i0, r0, r1) _bordr_f(_jit, i0, r0, r1)
527static jit_word_t _bordr_f(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
528# define bordi_f(i0, r0, i1) _bordi_f(_jit, i0, r0, i1)
529static jit_word_t
530_bordi_f(jit_state_t*, jit_word_t, jit_int32_t, jit_float32_t*);
531# define bunordr_f(i0, r0, r1) _bunordr_f(_jit, i0, r0, r1)
532static jit_word_t _bunordr_f(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
533# define bunordi_f(i0, r0, i1) _bunordi_f(_jit, i0, r0, i1)
534static jit_word_t
535_bunordi_f(jit_state_t*, jit_word_t, jit_int32_t, jit_float32_t*);
536# define extr_f_d(r0, r1) CVT_D_S(r0, r1)
537# define ltr_d(r0, r1, r2) _ltr_d(_jit, r0, r1, r2)
538static void _ltr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
539# define lti_d(r0, r1, i2) _lti_d(_jit, r0, r1, i2)
540static void _lti_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
541# define ler_d(r0, r1, r2) _ler_d(_jit, r0, r1, r2)
542static void _ler_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
543# define lei_d(r0, r1, i2) _lei_d(_jit, r0, r1, i2)
544static void _lei_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
545# define eqr_d(r0, r1, r2) _eqr_d(_jit, r0, r1, r2)
546static void _eqr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
547# define eqi_d(r0, r1, i2) _eqi_d(_jit, r0, r1, i2)
548static void _eqi_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
549# define ger_d(r0, r1, r2) _ger_d(_jit, r0, r1, r2)
550static void _ger_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
551# define gei_d(r0, r1, i2) _gei_d(_jit, r0, r1, i2)
552static void _gei_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
553# define gtr_d(r0, r1, r2) _gtr_d(_jit, r0, r1, r2)
554static void _gtr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
555# define gti_d(r0, r1, i2) _gti_d(_jit, r0, r1, i2)
556static void _gti_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
557# define ner_d(r0, r1, r2) _ner_d(_jit, r0, r1, r2)
558static void _ner_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
559# define nei_d(r0, r1, i2) _nei_d(_jit, r0, r1, i2)
560static void _nei_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
561# define unltr_d(r0, r1, r2) _unltr_d(_jit, r0, r1, r2)
562static void _unltr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
563# define unlti_d(r0, r1, i2) _unlti_d(_jit, r0, r1, i2)
564static void _unlti_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
565# define unler_d(r0, r1, r2) _unler_d(_jit, r0, r1, r2)
566static void _unler_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
567# define unlei_d(r0, r1, i2) _unlei_d(_jit, r0, r1, i2)
568static void _unlei_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
569# define uneqr_d(r0, r1, r2) _uneqr_d(_jit, r0, r1, r2)
570static void _uneqr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
571# define uneqi_d(r0, r1, i2) _uneqi_d(_jit, r0, r1, i2)
572static void _uneqi_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
573# define unger_d(r0, r1, r2) _unger_d(_jit, r0, r1, r2)
574static void _unger_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
575# define ungei_d(r0, r1, i2) _ungei_d(_jit, r0, r1, i2)
576static void _ungei_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
577# define ungtr_d(r0, r1, r2) _ungtr_d(_jit, r0, r1, r2)
578static void _ungtr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
579# define ungti_d(r0, r1, i2) _ungti_d(_jit, r0, r1, i2)
580static void _ungti_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
581# define ltgtr_d(r0, r1, r2) _ltgtr_d(_jit, r0, r1, r2)
582static void _ltgtr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
583# define ltgti_d(r0, r1, i2) _ltgti_d(_jit, r0, r1, i2)
584static void _ltgti_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
585# define ordr_d(r0, r1, r2) _ordr_d(_jit, r0, r1, r2)
586static void _ordr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
587# define ordi_d(r0, r1, i2) _ordi_d(_jit, r0, r1, i2)
588static void _ordi_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
589# define unordr_d(r0, r1, r2) _unordr_d(_jit, r0, r1, r2)
590static void _unordr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
591# define unordi_d(r0, r1, i2) _unordi_d(_jit, r0, r1, i2)
592static void _unordi_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
593# define bltr_d(i0, r0, r1) _bltr_d(_jit, i0, r0, r1)
594static jit_word_t _bltr_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
595# define blti_d(i0, r0, i1) _blti_d(_jit, i0, r0, i1)
596static jit_word_t
597_blti_d(jit_state_t*, jit_word_t, jit_int32_t, jit_float64_t*);
598# define bler_d(i0, r0, r1) _bler_d(_jit, i0, r0, r1)
599static jit_word_t _bler_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
600# define blei_d(i0, r0, i1) _blei_d(_jit, i0, r0, i1)
601static jit_word_t
602_blei_d(jit_state_t*, jit_word_t, jit_int32_t, jit_float64_t*);
603# define beqr_d(i0, r0, r1) _beqr_d(_jit, i0, r0, r1)
604static jit_word_t _beqr_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
605# define beqi_d(i0, r0, i1) _beqi_d(_jit, i0, r0, i1)
606static jit_word_t
607_beqi_d(jit_state_t*, jit_word_t, jit_int32_t, jit_float64_t*);
608# define bger_d(i0, r0, r1) _bger_d(_jit, i0, r0, r1)
609static jit_word_t _bger_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
610# define bgei_d(i0, r0, i1) _bgei_d(_jit, i0, r0, i1)
611static jit_word_t
612_bgei_d(jit_state_t*, jit_word_t, jit_int32_t, jit_float64_t*);
613# define bgtr_d(i0, r0, r1) _bgtr_d(_jit, i0, r0, r1)
614static jit_word_t _bgtr_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
615# define bgti_d(i0, r0, i1) _bgti_d(_jit, i0, r0, i1)
616static jit_word_t
617_bgti_d(jit_state_t*, jit_word_t, jit_int32_t, jit_float64_t*);
618# define bner_d(i0, r0, r1) _bner_d(_jit, i0, r0, r1)
619static jit_word_t _bner_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
620# define bnei_d(i0, r0, i1) _bnei_d(_jit, i0, r0, i1)
621static jit_word_t
622_bnei_d(jit_state_t*, jit_word_t, jit_int32_t, jit_float64_t*);
623# define bunltr_d(i0, r0, r1) _bunltr_d(_jit, i0, r0, r1)
624static jit_word_t _bunltr_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
625# define bunlti_d(i0, r0, i1) _bunlti_d(_jit, i0, r0, i1)
626static jit_word_t
627_bunlti_d(jit_state_t*, jit_word_t, jit_int32_t, jit_float64_t*);
628# define bunler_d(i0, r0, r1) _bunler_d(_jit, i0, r0, r1)
629static jit_word_t _bunler_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
630# define bunlei_d(i0, r0, i1) _bunlei_d(_jit, i0, r0, i1)
631static jit_word_t
632_bunlei_d(jit_state_t*, jit_word_t, jit_int32_t, jit_float64_t*);
633# define buneqr_d(i0, r0, r1) _buneqr_d(_jit, i0, r0, r1)
634static jit_word_t _buneqr_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
635# define buneqi_d(i0, r0, i1) _buneqi_d(_jit, i0, r0, i1)
636static jit_word_t
637_buneqi_d(jit_state_t*, jit_word_t, jit_int32_t, jit_float64_t*);
638# define bunger_d(i0, r0, r1) _bunger_d(_jit, i0, r0, r1)
639static jit_word_t _bunger_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
640# define bungei_d(i0, r0, i1) _bungei_d(_jit, i0, r0, i1)
641static jit_word_t
642_bungei_d(jit_state_t*, jit_word_t, jit_int32_t, jit_float64_t*);
643# define bungtr_d(i0, r0, r1) _bungtr_d(_jit, i0, r0, r1)
644static jit_word_t _bungtr_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
645# define bungti_d(i0, r0, i1) _bungti_d(_jit, i0, r0, i1)
646static jit_word_t
647_bungti_d(jit_state_t*, jit_word_t, jit_int32_t, jit_float64_t*);
648# define bltgtr_d(i0, r0, r1) _bltgtr_d(_jit, i0, r0, r1)
649static jit_word_t _bltgtr_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
650# define bltgti_d(i0, r0, i1) _bltgti_d(_jit, i0, r0, i1)
651static jit_word_t
652_bltgti_d(jit_state_t*, jit_word_t, jit_int32_t, jit_float64_t*);
653# define bordr_d(i0, r0, r1) _bordr_d(_jit, i0, r0, r1)
654static jit_word_t _bordr_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
655# define bordi_d(i0, r0, i1) _bordi_d(_jit, i0, r0, i1)
656static jit_word_t
657_bordi_d(jit_state_t*, jit_word_t, jit_int32_t, jit_float64_t*);
658# define bunordr_d(i0, r0, r1) _bunordr_d(_jit, i0, r0, r1)
659static jit_word_t _bunordr_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
660# define bunordi_d(i0, r0, i1) _bunordi_d(_jit, i0, r0, i1)
661static jit_word_t
662_bunordi_d(jit_state_t*, jit_word_t, jit_int32_t, jit_float64_t*);
663# define vaarg_d(r0, r1) _vaarg_d(_jit, r0, r1)
664static void _vaarg_d(jit_state_t*, jit_int32_t, jit_int32_t);
665#endif
666
667#if CODE
668static void
669_c_cond_fmt(jit_state_t *_jit, jit_int32_t fm,
670 jit_int32_t ft, jit_int32_t fs, jit_int32_t cc)
671{
672 jit_instr_t i;
673 i.cc.b = cc;
674 i.fs.b = fs;
675 i.ft.b = ft;
676 i.fm.b = fm;
677 i.hc.b = MIPS_COP1;
79bfeef6
PC
678 instr(i.op);
679}
680
681static void
682_cmp_cond_fmt(jit_state_t *_jit, jit_int32_t fm, jit_int32_t fd,
683 jit_int32_t ft, jit_int32_t fs, jit_int32_t cn)
684{
685 jit_instr_t i;
686 i.op = 0; /* must have bit 6 zero ed */
687 i.cn.b = cn;
688 i.ft.b = ft;
689 i.fs.b = fs;
690 i.fd.b = fd;
691 i.fm.b = fm;
692 i.hc.b = MIPS_COP1;
693 instr(i.op);
4a71579b
PC
694}
695
696# define fpr_opi(name, type, size) \
697static void \
698_##name##i_##type(jit_state_t *_jit, \
699 jit_int32_t r0, jit_int32_t r1, \
700 jit_float##size##_t *i0) \
701{ \
702 jit_int32_t reg = jit_get_reg(jit_class_fpr); \
703 movi_##type(rn(reg), i0); \
704 name##r_##type(r0, r1, rn(reg)); \
705 jit_unget_reg(reg); \
706}
707# define fpr_bopi(name, type, size) \
708static jit_word_t \
709_b##name##i_##type(jit_state_t *_jit, \
710 jit_word_t i0, jit_int32_t r0, \
711 jit_float##size##_t *i1) \
712{ \
713 jit_word_t word; \
714 jit_int32_t reg = jit_get_reg(jit_class_fpr| \
715 jit_class_nospill); \
716 movi_##type(rn(reg), i1); \
717 word = b##name##r_##type(i0, r0, rn(reg)); \
718 jit_unget_reg(reg); \
719 return (word); \
720}
721# define fopi(name) fpr_opi(name, f, 32)
722# define fbopi(name) fpr_bopi(name, f, 32)
723# define dopi(name) fpr_opi(name, d, 64)
724# define dbopi(name) fpr_bopi(name, d, 64)
725
726fopi(add)
727fopi(sub)
728fopi(rsb)
729fopi(mul)
730fopi(div)
731
4a71579b
PC
732static void
733_extr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
734{
735 jit_int32_t t0;
736 t0 = jit_get_reg(jit_class_fpr);
737# if __WORDSIZE == 32
738 MTC1(r1, rn(t0));
739 CVT_S_W(r0, rn(t0));
740# else
741 DMTC1(r1, rn(t0));
742 CVT_S_L(r0, rn(t0));
743# endif
744 jit_unget_reg(t0);
745}
746
747static void
748_truncr_f_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
749{
750 jit_int32_t t0;
751 t0 = jit_get_reg(jit_class_fpr);
752 TRUNC_W_S(rn(t0), r1);
753 MFC1(r0, rn(t0));
754 jit_unget_reg(t0);
755}
756
757# if __WORDSIZE == 64
758static void
759_truncr_f_l(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
760{
761 jit_int32_t t0;
762 t0 = jit_get_reg(jit_class_fpr);
763 TRUNC_L_S(rn(t0), r1);
764 DMFC1(r0, rn(t0));
765 jit_unget_reg(t0);
766}
767# endif
768
769static void
770_ldi_f(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
771{
772 jit_int32_t reg;
773 if (can_sign_extend_short_p(i0))
774 LWC1(r0, i0, _ZERO_REGNO);
775 else {
776 reg = jit_get_reg(jit_class_gpr);
777 movi(rn(reg), i0);
778 ldr_f(r0, rn(reg));
779 jit_unget_reg(reg);
780 }
781}
782
783static void
784_ldxr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
785{
786 jit_int32_t reg;
787 reg = jit_get_reg(jit_class_gpr);
788 addr(rn(reg), r1, r2);
789 ldr_f(r0, rn(reg));
790 jit_unget_reg(reg);
791}
792
793static void
794_ldxi_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
795{
796 jit_int32_t reg;
797 if (can_sign_extend_short_p(i0))
798 LWC1(r0, i0, r1);
799 else {
800 reg = jit_get_reg(jit_class_gpr);
801 addi(rn(reg), r1, i0);
802 ldr_f(r0, rn(reg));
803 jit_unget_reg(reg);
804 }
805}
806
ba86ff93
PC
807static void
808_unldr_x(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
809{
810 jit_int32_t t0, r2;
811# if __WORDSIZE == 32
812 jit_int32_t t1, r3;
813# endif
814 if (jit_unaligned_p()) {
815 assert(i0 == 4 || i0 == 8);
816 t0 = jit_get_reg(jit_class_gpr);
817 r2 = rn(t0);
818 if (i0 == 4) {
819 unldr(r2, r1, 4);
820 movr_w_f(r0, r2);
821 }
822 else {
823# if __WORDSIZE == 32
824 t1 = jit_get_reg(jit_class_gpr);
825 r3 = rn(t1);
826# if __BYTE_ORDER == __LITTLE_ENDIAN
827 unldr(r2, r1, 4);
828 addi(r3, r1, 4);
829 unldr(r3, r3, 4);
830# else
831 unldr(r3, r1, 4);
832 addi(r2, r1, 4);
833 unldr(r2, r2, 4);
834# endif
835 movr_ww_d(r0, r2, r3);
836 jit_unget_reg(t1);
837# else
838 unldr(r2, r1, 8);
839 movr_w_d(r0, r2);
840# endif
841 }
842 jit_unget_reg(t0);
843 }
844 else
845 generic_unldr_x(r0, r1, i0);
846}
847
848static void
849_unldi_x(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0, jit_word_t i1)
850{
851 jit_int32_t t0, r2;
852# if __WORDSIZE == 32
853 jit_int32_t t1, r3;
854# endif
855 if (jit_unaligned_p()) {
856 assert(i1 == 4 || i1 == 8);
857 t0 = jit_get_reg(jit_class_gpr);
858 r2 = rn(t0);
859 if (i1 == 4) {
860 unldi(r2, i0, 4);
861 movr_w_f(r0, r2);
862 }
863 else {
864# if __WORDSIZE == 32
865 t1 = jit_get_reg(jit_class_gpr);
866 r3 = rn(t1);
867# if __BYTE_ORDER == __LITTLE_ENDIAN
868 unldi(r2, i0, 4);
869 unldi(r3, i0 + 4, 4);
870# else
871 unldi(r3, i0, 4);
872 unldi(r2, i0 + 4, 4);
873# endif
874 movr_ww_d(r0, r3, r2);
875 jit_unget_reg(t1);
876# else
877 unldi(r2, i0, 8);
878 movr_w_d(r0, r2);
879# endif
880 }
881 jit_unget_reg(t0);
882 }
883 else
884 generic_unldi_x(r0, i0, i1);
885}
886
4a71579b
PC
887static void
888_sti_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
889{
890 jit_int32_t reg;
891 if (can_sign_extend_short_p(i0))
892 SWC1(r0, i0, _ZERO_REGNO);
893 else {
894 reg = jit_get_reg(jit_class_gpr);
895 movi(rn(reg), i0);
896 str_f(rn(reg), r0);
897 jit_unget_reg(reg);
898 }
899}
900
901static void
902_stxr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
903{
904 jit_int32_t reg;
905 reg = jit_get_reg(jit_class_gpr);
906 addr(rn(reg), r0, r1);
907 str_f(rn(reg), r2);
908 jit_unget_reg(reg);
909}
910
911static void
912_stxi_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
913{
914 jit_int32_t reg;
915 if (can_sign_extend_short_p(i0))
916 SWC1(r1, i0, r0);
917 else {
918 reg = jit_get_reg(jit_class_gpr);
919 addi(rn(reg), r0, i0);
920 str_f(rn(reg), r1);
921 jit_unget_reg(reg);
922 }
923}
924
ba86ff93
PC
925static void
926_unstr_x(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
927{
928 if (jit_unaligned_p())
929 fallback_unstr_x(r0, r1, i0);
930 else
931 generic_unstr_x(r0, r1, i0);
932}
933
934static void
935_unsti_x(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
936{
937 if (jit_unaligned_p())
938 fallback_unsti_x(i0, r0, i1);
939 else
940 fallback_unsti_x(i0, r0, i1);
941}
942
943
944static void
945_fmar_f(jit_state_t *_jit,
946 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3)
947{
948 jit_int32_t t0;
949 if (jit_mips2_p()) {
950 if (jit_mips6_p()) {
951 if (r0 == r3)
952 MADDF_S(r0, r2, r1);
953 else {
954 t0 = jit_get_reg(jit_class_fpr);
955 movr_f(rn(t0), r3);
956 MADDF_S(rn(t0), r2, r1);
957 movr_f(r0, rn(t0));
958 jit_unget_reg(t0);
959 }
960 }
961 else
962 MADD_S(r0, r3, r2, r1);
963 }
964 else {
965 if (r0 != r3) {
966 mulr_f(r0, r1, r2);
967 addr_f(r0, r0, r3);
968 }
969 else {
970 t0 = jit_get_reg(jit_class_fpr);
971 mulr_f(rn(t0), r1, r2);
972 addr_f(r0, rn(t0), r3);
973 jit_unget_reg(t0);
974 }
975 }
976}
977
978static void
979_fmsr_f(jit_state_t *_jit,
980 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3)
981{
982 jit_int32_t t0;
983 if (jit_mips2_p()) {
984 if (jit_mips6_p()) {
985 if (r0 == r3)
986 MSUBF_S(r0, r2, r1);
987 else {
988 t0 = jit_get_reg(jit_class_fpr);
989 movr_f(rn(t0), r3);
990 MSUBF_S(rn(t0), r2, r1);
991 movr_f(r0, rn(t0));
992 jit_unget_reg(t0);
993 }
994 negr_f(r0, r0);
995 }
996 else
997 MSUB_S(r0, r3, r2, r1);
998 }
999 else {
1000 if (r0 != r3) {
1001 mulr_f(r0, r1, r2);
1002 subr_f(r0, r0, r3);
1003 }
1004 else {
1005 t0 = jit_get_reg(jit_class_fpr);
1006 mulr_f(rn(t0), r1, r2);
1007 subr_f(r0, rn(t0), r3);
1008 jit_unget_reg(t0);
1009 }
1010 }
1011}
1012
1013static void
1014_fnmar_f(jit_state_t *_jit,
1015 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3)
1016{
1017 jit_int32_t t0;
1018 if (jit_mips2_p()) {
1019 if (jit_mips6_p()) {
1020 if (r0 == r3)
1021 MADDF_S(r0, r2, r1);
1022 else {
1023 t0 = jit_get_reg(jit_class_fpr);
1024 movr_f(rn(t0), r3);
1025 MADDF_S(rn(t0), r2, r1);
1026 movr_f(r0, rn(t0));
1027 jit_unget_reg(t0);
1028 }
1029 negr_f(r0, r0);
1030 }
1031 else
1032 NMADD_S(r0, r3, r2, r1);
1033 }
1034 else {
1035 t0 = jit_get_reg(jit_class_fpr);
1036 negr_f(rn(t0), r1);
1037 mulr_f(rn(t0), rn(t0), r2);
1038 subr_f(r0, rn(t0), r3);
1039 jit_unget_reg(t0);
1040 }
1041}
1042
1043static void
1044_fnmsr_f(jit_state_t *_jit,
1045 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3)
1046{
1047 jit_int32_t t0;
1048 if (jit_mips2_p()) {
1049 if (jit_mips6_p()) {
1050 if (r0 == r3)
1051 MSUBF_S(r0, r2, r1);
1052 else {
1053 t0 = jit_get_reg(jit_class_fpr);
1054 movr_f(rn(t0), r3);
1055 MSUBF_S(rn(t0), r2, r1);
1056 movr_f(r0, rn(t0));
1057 jit_unget_reg(t0);
1058 }
1059 }
1060 else
1061 NMSUB_S(r0, r3, r2, r1);
1062 }
1063 else {
1064 t0 = jit_get_reg(jit_class_fpr);
1065 negr_f(rn(t0), r1);
1066 mulr_f(rn(t0), rn(t0), r2);
1067 addr_f(r0, rn(t0), r3);
1068 jit_unget_reg(t0);
1069 }
1070}
1071
4a71579b
PC
1072static void
1073_movr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1074{
1075 if (r0 != r1)
1076 MOV_S(r0, r1);
1077}
1078
1079static void
1080_movi_f(jit_state_t *_jit, jit_int32_t r0, jit_float32_t *i0)
1081{
1082 union {
1083 jit_int32_t i;
1084 jit_float32_t f;
1085 } data;
1086 jit_int32_t reg;
1087
1088 data.f = *i0;
1089 if (data.i) {
1090 if (_jitc->no_data) {
1091 reg = jit_get_reg(jit_class_gpr);
1092 movi(rn(reg), data.i);
1093 MTC1(rn(reg), r0);
1094 jit_unget_reg(reg);
1095 }
1096 else
1097 ldi_f(r0, (jit_word_t)i0);
1098 }
1099 else
1100 MTC1(_ZERO_REGNO, r0);
1101}
1102
ba86ff93
PC
1103static void
1104_movi_w_f(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
1105{
1106 jit_int32_t reg;
1107 reg = jit_get_reg(jit_class_gpr);
1108 movi(rn(reg), i0);
1109 movr_w_f(r0, rn(reg));
1110 jit_unget_reg(reg);
1111}
1112
4a71579b
PC
1113dopi(add)
1114dopi(sub)
1115dopi(rsb)
1116dopi(mul)
1117dopi(div)
1118
ba86ff93 1119#if NEW_ABI && __WORDSIZE == 32
4a71579b
PC
1120/* n32 abi requires 64 bit cpu */
1121static void
1122_movi64(jit_state_t *_jit, jit_int32_t r0, jit_int64_t i0)
1123{
1124 if (i0 == 0)
1125 OR(r0, _ZERO_REGNO, _ZERO_REGNO);
1126 else if (i0 >= -32678 && i0 <= 32767)
1127 DADDIU(r0, _ZERO_REGNO, i0);
1128 else if (i0 >= 0 && i0 <= 65535)
1129 ORI(r0, _ZERO_REGNO, i0);
1130 else {
1131 if (i0 >= 0 && i0 <= 0x7fffffffLL)
1132 LUI(r0, i0 >> 16);
1133 else if (i0 >= 0 && i0 <= 0xffffffffLL) {
1134 if (i0 & 0xffff0000LL) {
1135 ORI(r0, _ZERO_REGNO, (jit_word_t)(i0 >> 16));
1136 DSLL(r0, r0, 16);
1137 }
1138 }
1139 else {
1140 movi(r0, (jit_word_t)(i0 >> 32));
1141 if (i0 & 0xffff0000LL) {
1142 DSLL(r0, r0, 16);
1143 ORI(r0, r0, (jit_word_t)(i0 >> 16));
1144 DSLL(r0, r0, 16);
1145 }
1146 else
1147 DSLL32(r0, r0, 0);
1148 }
1149 if ((jit_word_t)i0 & 0xffff)
1150 ORI(r0, r0, (jit_word_t)i0 & 0xffff);
1151 }
1152}
1153
1154static void
ba86ff93 1155_movi_d_w(jit_state_t *_jit, jit_int32_t r0, jit_int64_t i0)
4a71579b 1156{
4a71579b
PC
1157 union {
1158 jit_int64_t l;
1159 jit_float64_t d;
1160 } data;
ba86ff93
PC
1161 data.d = i0;
1162 movi64(r0, data.l);
1163}
1164#endif
1165
1166#if __WORDSIZE == 64 || NEW_ABI
1167static void
1168_movi_w_d(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
1169{
1170 jit_int32_t reg;
1171 reg = jit_get_reg(jit_class_gpr);
1172 movi64(rn(reg), i0);
1173 movr_w_d(r0, rn(reg));
1174 jit_unget_reg(reg);
4a71579b 1175}
ba86ff93 1176#endif
4a71579b 1177
ba86ff93 1178#if __WORDSIZE == 32
4a71579b
PC
1179static void
1180_movr_ww_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1181{
79bfeef6
PC
1182 if (jit_mips6_p()) {
1183 MTC1(r1, r0);
1184 MTHC1(r2, r0);
1185 }
1186 else {
1187 MTC1(r1, r0 + BE_P);
1188 MTC1(r2, r0 + LE_P);
1189 }
4a71579b
PC
1190}
1191
1192static void
1193_movr_d_ww(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1194{
79bfeef6
PC
1195 if (jit_mips6_p()) {
1196 MFC1(r0, r2);
1197 MFHC1(r1, r2);
1198 }
1199 else {
1200 MFC1(r0, r2 + BE_P);
1201 MFC1(r1, r2 + LE_P);
1202 }
4a71579b
PC
1203}
1204
1205static void
ba86ff93 1206_movi_ww_d(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0, jit_word_t i1)
4a71579b 1207{
ba86ff93
PC
1208 jit_int32_t t0, t1;
1209 t0 = jit_get_reg(jit_class_gpr);
1210 t1 = jit_get_reg(jit_class_gpr);
1211 movi(rn(t0), i0);
1212 movi(rn(t1), i1);
1213 MTC1(rn(t0), r0);
1214 MTC1(rn(t1), r0 + 1);
1215 jit_unget_reg(t1);
1216 jit_unget_reg(t0);
4a71579b
PC
1217}
1218#endif
1219
1220static void
1221_extr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1222{
1223 jit_int32_t t0;
1224 t0 = jit_get_reg(jit_class_fpr);
1225# if __WORDSIZE == 32
1226 MTC1(r1, rn(t0));
1227 CVT_D_W(r0, rn(t0));
1228# else
1229 DMTC1(r1, rn(t0));
1230 CVT_D_L(r0, rn(t0));
1231# endif
1232 jit_unget_reg(t0);
1233}
1234
1235static void
1236_truncr_d_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1237{
1238 jit_int32_t t0;
1239 t0 = jit_get_reg(jit_class_fpr);
1240 TRUNC_W_D(rn(t0), r1);
1241 MFC1(r0, rn(t0));
1242 jit_unget_reg(t0);
1243}
1244
1245# if __WORDSIZE == 64
1246static void
1247_truncr_d_l(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1248{
1249 jit_int32_t t0;
1250 t0 = jit_get_reg(jit_class_fpr);
1251 TRUNC_L_D(rn(t0), r1);
1252 DMFC1(r0, rn(t0));
1253 jit_unget_reg(t0);
1254}
1255# endif
1256
1257static void
1258_ldr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1259{
79bfeef6
PC
1260 if (jit_mips6_p() || __WORDSIZE == 64 || NEW_ABI)
1261 LDC1(r0, 0, r1);
1262 else {
1263 LWC1(r0 + BE_P, 0, r1);
1264 LWC1(r0 + LE_P, 4, r1);
1265 }
4a71579b
PC
1266}
1267
1268static void
1269_ldi_d(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
1270{
1271 jit_int32_t reg;
79bfeef6
PC
1272 if (jit_mips6_p() || __WORDSIZE == 64 || NEW_ABI) {
1273 if (can_sign_extend_short_p(i0))
1274 LDC1(r0, i0, _ZERO_REGNO);
1275 else {
1276 reg = jit_get_reg(jit_class_gpr);
1277 movi(rn(reg), i0);
1278 LDC1(r0, 0, rn(reg));
1279 jit_unget_reg(reg);
1280 }
4a71579b
PC
1281 }
1282 else {
79bfeef6
PC
1283 if (can_sign_extend_short_p(i0) && can_sign_extend_short_p(i0 + 4)) {
1284 LWC1(r0 + BE_P, i0, _ZERO_REGNO);
1285 LWC1(r0 + LE_P, i0 + 4, _ZERO_REGNO);
1286 }
1287 else {
1288 reg = jit_get_reg(jit_class_gpr);
1289 movi(rn(reg), i0);
1290 ldr_d(r0, rn(reg));
1291 jit_unget_reg(reg);
1292 }
4a71579b 1293 }
4a71579b
PC
1294}
1295
1296static void
1297_ldxr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1298{
1299 jit_int32_t reg;
1300 reg = jit_get_reg(jit_class_gpr);
1301 addr(rn(reg), r1, r2);
1302 ldr_d(r0, rn(reg));
1303 jit_unget_reg(reg);
1304}
1305
1306static void
1307_ldxi_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1308{
1309 jit_int32_t reg;
79bfeef6
PC
1310 if (jit_mips6_p() || __WORDSIZE == 64 || NEW_ABI) {
1311 if (can_sign_extend_short_p(i0))
1312 LDC1(r0, i0, r1);
1313 else
1314 goto fallback;
4a71579b 1315 }
4a71579b 1316 else {
79bfeef6
PC
1317 if (can_sign_extend_short_p(i0) && can_sign_extend_short_p(i0 + 4)) {
1318 LWC1(r0 + BE_P, i0, r1);
1319 LWC1(r0 + LE_P, i0 + 4, r1);
1320 }
1321 else {
1322 fallback:
1323 reg = jit_get_reg(jit_class_gpr);
1324 addi(rn(reg), r1, i0);
1325 ldr_d(r0, rn(reg));
1326 jit_unget_reg(reg);
1327 }
4a71579b
PC
1328 }
1329}
1330
1331static void
1332_str_d(jit_state_t *_jit,jit_int32_t r0, jit_int32_t r1)
1333{
79bfeef6
PC
1334 if (jit_mips6_p() || __WORDSIZE == 64 || NEW_ABI)
1335 SDC1(r1, 0, r0);
1336 else {
1337 SWC1(r1 + BE_P, 0, r0);
1338 SWC1(r1 + LE_P, 4, r0);
1339 }
4a71579b
PC
1340}
1341
1342static void
1343_sti_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
1344{
1345 jit_int32_t reg;
79bfeef6
PC
1346 if (jit_mips6_p() || __WORDSIZE == 64 || NEW_ABI) {
1347 if (can_sign_extend_short_p(i0))
1348 SDC1(r0, i0, _ZERO_REGNO);
1349 else
1350 goto fallback;
4a71579b 1351 }
4a71579b 1352 else {
79bfeef6
PC
1353 if (can_sign_extend_short_p(i0) && can_sign_extend_short_p(i0 + 4)) {
1354 SWC1(r0 + BE_P, i0, _ZERO_REGNO);
1355 SWC1(r0 + LE_P, i0 + 4, _ZERO_REGNO);
1356 }
1357 else {
1358 fallback:
1359 reg = jit_get_reg(jit_class_gpr);
1360 movi(rn(reg), i0);
1361 str_d(rn(reg), r0);
1362 jit_unget_reg(reg);
1363 }
4a71579b
PC
1364 }
1365}
1366
1367static void
1368_stxr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1369{
1370 jit_int32_t reg;
1371 reg = jit_get_reg(jit_class_gpr);
1372 addr(rn(reg), r0, r1);
1373 str_d(rn(reg), r2);
1374 jit_unget_reg(reg);
1375}
1376
1377static void
1378_stxi_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
1379{
1380 jit_int32_t reg;
79bfeef6
PC
1381 if (jit_mips6_p() || __WORDSIZE == 64 || NEW_ABI) {
1382 if (can_sign_extend_short_p(i0))
1383 SDC1(r1, i0, r0);
1384 else
1385 goto fallback;
4a71579b 1386 }
4a71579b 1387 else {
79bfeef6
PC
1388 if (can_sign_extend_short_p(i0) && can_sign_extend_short_p(i0 + 4)) {
1389 SWC1(r1 + BE_P, i0, r0);
1390 SWC1(r1 + LE_P, i0 + 4, r0);
1391 }
1392 else {
1393 fallback:
1394 reg = jit_get_reg(jit_class_gpr);
1395 addi(rn(reg), r0, i0);
1396 str_d(rn(reg), r1);
1397 jit_unget_reg(reg);
1398 }
4a71579b
PC
1399 }
1400}
1401
ba86ff93
PC
1402static void
1403_fmar_d(jit_state_t *_jit,
1404 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3)
1405{
1406 jit_int32_t t0;
1407 if (jit_mips2_p()) {
1408 if (jit_mips6_p()) {
1409 if (r0 == r3)
1410 MADDF_D(r0, r2, r1);
1411 else {
1412 t0 = jit_get_reg(jit_class_fpr);
1413 movr_d(rn(t0), r3);
1414 MADDF_D(rn(t0), r2, r1);
1415 movr_d(r0, rn(t0));
1416 jit_unget_reg(t0);
1417 }
1418 }
1419 else
1420 MADD_D(r0, r3, r2, r1);
1421 }
1422 else {
1423 if (r0 != r3) {
1424 mulr_d(r0, r1, r2);
1425 addr_d(r0, r0, r3);
1426 }
1427 else {
1428 t0 = jit_get_reg(jit_class_fpr);
1429 mulr_d(rn(t0), r1, r2);
1430 addr_d(r0, rn(t0), r3);
1431 jit_unget_reg(t0);
1432 }
1433 }
1434}
1435
1436static void
1437_fmsr_d(jit_state_t *_jit,
1438 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3)
1439{
1440 jit_int32_t t0;
1441 if (jit_mips2_p()) {
1442 if (jit_mips6_p()) {
1443 if (r0 == r3)
1444 MSUBF_D(r0, r2, r1);
1445 else {
1446 t0 = jit_get_reg(jit_class_fpr);
1447 movr_d(rn(t0), r3);
1448 MSUBF_D(rn(t0), r2, r1);
1449 movr_d(r0, rn(t0));
1450 jit_unget_reg(t0);
1451 }
1452 negr_d(r0, r0);
1453 }
1454 else
1455 MSUB_D(r0, r3, r2, r1);
1456 }
1457 else {
1458 if (r0 != r3) {
1459 mulr_d(r0, r1, r2);
1460 subr_d(r0, r0, r3);
1461 }
1462 else {
1463 t0 = jit_get_reg(jit_class_fpr);
1464 mulr_d(rn(t0), r1, r2);
1465 subr_d(r0, rn(t0), r3);
1466 jit_unget_reg(t0);
1467 }
1468 }
1469}
1470
1471static void
1472_fnmar_d(jit_state_t *_jit,
1473 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3)
1474{
1475 jit_int32_t t0;
1476 if (jit_mips2_p()) {
1477 if (jit_mips6_p()) {
1478 if (r0 == r3)
1479 MADDF_D(r0, r2, r1);
1480 else {
1481 t0 = jit_get_reg(jit_class_fpr);
1482 movr_d(rn(t0), r3);
1483 MADDF_D(rn(t0), r2, r1);
1484 movr_d(r0, rn(t0));
1485 jit_unget_reg(t0);
1486 }
1487 negr_d(r0, r0);
1488 }
1489 else
1490 NMADD_D(r0, r3, r2, r1);
1491 }
1492 else {
1493 t0 = jit_get_reg(jit_class_fpr);
1494 negr_d(rn(t0), r1);
1495 mulr_d(rn(t0), rn(t0), r2);
1496 subr_d(r0, rn(t0), r3);
1497 jit_unget_reg(t0);
1498 }
1499}
1500
1501static void
1502_fnmsr_d(jit_state_t *_jit,
1503 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3)
1504{
1505 jit_int32_t t0;
1506 if (jit_mips2_p()) {
1507 if (jit_mips6_p()) {
1508 if (r0 == r3)
1509 MSUBF_D(r0, r2, r1);
1510 else {
1511 t0 = jit_get_reg(jit_class_fpr);
1512 movr_d(rn(t0), r3);
1513 MSUBF_D(rn(t0), r2, r1);
1514 movr_d(r0, rn(t0));
1515 jit_unget_reg(t0);
1516 }
1517 }
1518 else
1519 NMSUB_D(r0, r3, r2, r1);
1520 }
1521 else {
1522 t0 = jit_get_reg(jit_class_fpr);
1523 negr_d(rn(t0), r1);
1524 mulr_d(rn(t0), rn(t0), r2);
1525 addr_d(r0, rn(t0), r3);
1526 jit_unget_reg(t0);
1527 }
1528}
1529
4a71579b
PC
1530static void
1531_movr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1532{
1533 if (r0 != r1)
1534 MOV_D(r0, r1);
1535}
1536
1537static void
1538_movi_d(jit_state_t *_jit, jit_int32_t r0, jit_float64_t *i0)
1539{
1540 union {
1541 jit_int32_t i[2];
1542 jit_int64_t l;
1543 jit_float64_t d;
1544 } data;
1545 jit_int32_t reg;
1546
1547 data.d = *i0;
1548# if __WORDSIZE == 64 || NEW_ABI
1549 if (data.l) {
1550 if (_jitc->no_data) {
1551 reg = jit_get_reg(jit_class_gpr);
1552 movi64(rn(reg), data.l);
1553 DMTC1(rn(reg), r0);
1554 jit_unget_reg(reg);
1555 }
1556 else
1557 ldi_d(r0, (jit_word_t)i0);
1558 }
1559 else
1560 DMTC1(_ZERO_REGNO, r0);
1561# else
79bfeef6 1562 if (jit_mips6_p()) {
4a71579b 1563 if (_jitc->no_data) {
79bfeef6
PC
1564 reg = jit_get_reg(jit_class_gpr);
1565# if __WORDSIZE == 64
1566 movi(rn(reg), data.l);
1567 DMTC1(rn(reg), r0);
1568# else
1569 movi(rn(reg), data.i[0 + BE_P]);
1570 MTC1(rn(reg), r0);
1571 movi(rn(reg), data.i[0 + LE_P]);
1572 MTHC1(rn(reg), r0);
1573# endif
1574 jit_unget_reg(reg);
4a71579b
PC
1575 }
1576 else
79bfeef6 1577 ldi_d(r0, (jit_word_t)i0);
4a71579b 1578 }
79bfeef6
PC
1579 else {
1580 if (_jitc->no_data)
1581 reg = jit_get_reg(jit_class_gpr);
1582 if (data.i[0]) {
1583 if (_jitc->no_data) {
1584 movi(rn(reg), data.i[0]);
1585 MTC1(rn(reg), r0 + BE_P);
1586 }
1587 else
1588 ldi_f(r0 + BE_P, (jit_word_t)i0);
4a71579b
PC
1589 }
1590 else
79bfeef6
PC
1591 MTC1(_ZERO_REGNO, r0 + BE_P);
1592 if (data.i[1]) {
1593 if (_jitc->no_data) {
1594 movi(rn(reg), data.i[1]);
1595 MTC1(rn(reg), r0 + LE_P);
1596 }
1597 else
1598 ldi_f(r0 + LE_P, ((jit_word_t)i0) + 4);
1599 }
1600 else
1601 MTC1(_ZERO_REGNO, r0 + LE_P);
1602 if (_jitc->no_data)
1603 jit_unget_reg(reg);
4a71579b 1604 }
4a71579b
PC
1605# endif
1606}
1607
1608static void
1609_ltr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1610{
1611 jit_word_t w;
79bfeef6
PC
1612 jit_int32_t reg;
1613 if (jit_mips6_p()) {
1614 reg = jit_get_reg(jit_class_fpr);
1615 CMP_LT_S(rn(reg), r1, r2);
1616 MFC1(r0, rn(reg));
1617 jit_unget_reg(reg);
1618 andi(r0, r0, 1);
1619 }
1620 else {
1621 C_OLT_S(r1, r2);
1622 /* cannot optimize delay slot */
1623 flush();
1624 w = _jit->pc.w;
1625 BC1T(0);
1626 /* delay slot */
1627 movi(r0, 1);
1628 movi(r0, 0);
1629 flush();
1630 patch_at(w, _jit->pc.w);
1631 }
4a71579b
PC
1632}
1633fopi(lt)
1634
1635static void
1636_ler_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1637{
1638 jit_word_t w;
79bfeef6
PC
1639 jit_int32_t reg;
1640 if (jit_mips6_p()) {
1641 reg = jit_get_reg(jit_class_fpr);
1642 CMP_LE_S(rn(reg), r1, r2);
1643 MFC1(r0, rn(reg));
1644 jit_unget_reg(reg);
1645 andi(r0, r0, 1);
1646 }
1647 else {
1648 C_OLE_S(r1, r2);
1649 /* cannot optimize delay slot */
1650 flush();
1651 w = _jit->pc.w;
1652 BC1T(0);
1653 /* delay slot */
1654 movi(r0, 1);
1655 movi(r0, 0);
1656 flush();
1657 patch_at(w, _jit->pc.w);
1658 }
4a71579b
PC
1659}
1660fopi(le)
1661
1662static void
1663_eqr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1664{
1665 jit_word_t w;
79bfeef6
PC
1666 jit_int32_t reg;
1667 if (jit_mips6_p()) {
1668 reg = jit_get_reg(jit_class_fpr);
1669 CMP_EQ_S(rn(reg), r1, r2);
1670 MFC1(r0, rn(reg));
1671 jit_unget_reg(reg);
1672 andi(r0, r0, 1);
1673 }
1674 else {
1675 C_EQ_S(r1, r2);
1676 /* cannot optimize delay slot */
1677 flush();
1678 w = _jit->pc.w;
1679 BC1T(0);
1680 /* delay slot */
1681 movi(r0, 1);
1682 movi(r0, 0);
1683 flush();
1684 patch_at(w, _jit->pc.w);
1685 }
4a71579b
PC
1686}
1687fopi(eq)
1688
1689static void
1690_ger_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1691{
1692 jit_word_t w;
79bfeef6
PC
1693 jit_int32_t reg;
1694 if (jit_mips6_p()) {
1695 reg = jit_get_reg(jit_class_fpr);
1696 CMP_ULT_S(rn(reg), r1, r2);
1697 MFC1(r0, rn(reg));
1698 jit_unget_reg(reg);
1699 addi(r0, r0, 1);
1700 }
1701 else {
1702 C_ULT_S(r1, r2);
1703 /* cannot optimize delay slot */
1704 flush();
1705 w = _jit->pc.w;
1706 BC1F(0);
1707 /* delay slot */
1708 movi(r0, 1);
1709 movi(r0, 0);
1710 flush();
1711 patch_at(w, _jit->pc.w);
1712 }
4a71579b
PC
1713}
1714fopi(ge)
1715
1716static void
1717_gtr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1718{
1719 jit_word_t w;
79bfeef6
PC
1720 jit_int32_t reg;
1721 if (jit_mips6_p()) {
1722 reg = jit_get_reg(jit_class_fpr);
1723 CMP_ULE_S(rn(reg), r1, r2);
1724 MFC1(r0, rn(reg));
1725 jit_unget_reg(reg);
1726 addi(r0, r0, 1);
1727 }
1728 else {
1729 C_ULE_S(r1, r2);
1730 /* cannot optimize delay slot */
1731 flush();
1732 w = _jit->pc.w;
1733 BC1F(0);
1734 /* delay slot */
1735 movi(r0, 1);
1736 movi(r0, 0);
1737 flush();
1738 patch_at(w, _jit->pc.w);
1739 }
4a71579b
PC
1740}
1741fopi(gt)
1742
1743static void
1744_ner_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1745{
1746 jit_word_t w;
79bfeef6
PC
1747 jit_int32_t reg;
1748 if (jit_mips6_p()) {
1749 reg = jit_get_reg(jit_class_fpr);
1750 CMP_EQ_S(rn(reg), r1, r2);
1751 MFC1(r0, rn(reg));
1752 jit_unget_reg(reg);
1753 addi(r0, r0, 1);
1754 }
1755 else {
1756 C_EQ_S(r1, r2);
1757 /* cannot optimize delay slot */
1758 flush();
1759 w = _jit->pc.w;
1760 BC1F(0);
1761 /* delay slot */
1762 movi(r0, 1);
1763 movi(r0, 0);
1764 flush();
1765 patch_at(w, _jit->pc.w);
1766 }
4a71579b
PC
1767}
1768fopi(ne)
1769
1770static void
1771_unltr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1772{
1773 jit_word_t w;
79bfeef6
PC
1774 jit_int32_t reg;
1775 if (jit_mips6_p()) {
1776 reg = jit_get_reg(jit_class_fpr);
1777 CMP_ULT_S(rn(reg), r1, r2);
1778 MFC1(r0, rn(reg));
1779 jit_unget_reg(reg);
1780 andi(r0, r0, 1);
1781 }
1782 else {
1783 C_ULT_S(r1, r2);
1784 /* cannot optimize delay slot */
1785 flush();
1786 w = _jit->pc.w;
1787 BC1T(0);
1788 /* delay slot */
1789 movi(r0, 1);
1790 movi(r0, 0);
1791 flush();
1792 patch_at(w, _jit->pc.w);
1793 }
4a71579b
PC
1794}
1795fopi(unlt)
1796
1797static void
1798_unler_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1799{
1800 jit_word_t w;
79bfeef6
PC
1801 jit_int32_t reg;
1802 if (jit_mips6_p()) {
1803 reg = jit_get_reg(jit_class_fpr);
1804 CMP_ULE_S(rn(reg), r1, r2);
1805 MFC1(r0, rn(reg));
1806 jit_unget_reg(reg);
1807 andi(r0, r0, 1);
1808 }
1809 else {
1810 C_ULE_S(r1, r2);
1811 /* cannot optimize delay slot */
1812 flush();
1813 w = _jit->pc.w;
1814 BC1T(0);
1815 /* delay slot */
1816 movi(r0, 1);
1817 movi(r0, 0);
1818 flush();
1819 patch_at(w, _jit->pc.w);
1820 }
4a71579b
PC
1821}
1822fopi(unle)
1823
1824static void
1825_uneqr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1826{
1827 jit_word_t w;
79bfeef6
PC
1828 jit_int32_t reg;
1829 if (jit_mips6_p()) {
1830 reg = jit_get_reg(jit_class_fpr);
1831 CMP_UEQ_S(rn(reg), r1, r2);
1832 MFC1(r0, rn(reg));
1833 jit_unget_reg(reg);
1834 andi(r0, r0, 1);
1835 }
1836 else {
1837 C_UEQ_S(r1, r2);
1838 /* cannot optimize delay slot */
1839 flush();
1840 w = _jit->pc.w;
1841 BC1T(0);
1842 /* delay slot */
1843 movi(r0, 1);
1844 movi(r0, 0);
1845 flush();
1846 patch_at(w, _jit->pc.w);
1847 }
4a71579b
PC
1848}
1849fopi(uneq)
1850
1851static void
1852_unger_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1853{
1854 jit_word_t w;
79bfeef6
PC
1855 jit_int32_t reg;
1856 if (jit_mips6_p()) {
1857 reg = jit_get_reg(jit_class_fpr);
1858 CMP_LT_S(rn(reg), r1, r2);
1859 MFC1(r0, rn(reg));
1860 jit_unget_reg(reg);
1861 addi(r0, r0, 1);
1862 }
1863 else {
1864 C_OLT_S(r1, r2);
1865 /* cannot optimize delay slot */
1866 flush();
1867 w = _jit->pc.w;
1868 BC1F(0);
1869 /* delay slot */
1870 movi(r0, 1);
1871 movi(r0, 0);
1872 flush();
1873 patch_at(w, _jit->pc.w);
1874 }
4a71579b
PC
1875}
1876fopi(unge)
1877
1878static void
1879_ungtr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1880{
1881 jit_word_t w;
79bfeef6
PC
1882 jit_int32_t reg;
1883 if (jit_mips6_p()) {
1884 reg = jit_get_reg(jit_class_fpr);
1885 CMP_LE_S(rn(reg), r1, r2);
1886 MFC1(r0, rn(reg));
1887 jit_unget_reg(reg);
1888 addi(r0, r0, 1);
1889 }
1890 else {
1891 C_OLE_S(r1, r2);
1892 /* cannot optimize delay slot */
1893 flush();
1894 w = _jit->pc.w;
1895 BC1F(0);
1896 /* delay slot */
1897 movi(r0, 1);
1898 movi(r0, 0);
1899 flush();
1900 patch_at(w, _jit->pc.w);
1901 }
4a71579b
PC
1902}
1903fopi(ungt)
1904
1905static void
1906_ltgtr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1907{
1908 jit_word_t w;
79bfeef6
PC
1909 jit_int32_t reg;
1910 if (jit_mips6_p()) {
1911 reg = jit_get_reg(jit_class_fpr);
1912 CMP_UEQ_S(rn(reg), r1, r2);
1913 MFC1(r0, rn(reg));
1914 jit_unget_reg(reg);
1915 addi(r0, r0, 1);
1916 }
1917 else {
1918 C_UEQ_S(r1, r2);
1919 /* cannot optimize delay slot */
1920 flush();
1921 w = _jit->pc.w;
1922 BC1F(0);
1923 /* delay slot */
1924 movi(r0, 1);
1925 movi(r0, 0);
1926 flush();
1927 patch_at(w, _jit->pc.w);
1928 }
4a71579b
PC
1929}
1930fopi(ltgt)
1931
1932static void
1933_ordr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1934{
1935 jit_word_t w;
79bfeef6
PC
1936 jit_int32_t reg;
1937 if (jit_mips6_p()) {
1938 reg = jit_get_reg(jit_class_fpr);
1939 CMP_UN_S(rn(reg), r1, r2);
1940 MFC1(r0, rn(reg));
1941 jit_unget_reg(reg);
1942 addi(r0, r0, 1);
1943 }
1944 else {
1945 C_UN_S(r1, r2);
1946 flush();
1947 /* cannot optimize delay slot */
1948 w = _jit->pc.w;
1949 BC1F(0);
1950 /* delay slot */
1951 movi(r0, 1);
1952 movi(r0, 0);
1953 flush();
1954 patch_at(w, _jit->pc.w);
1955 }
4a71579b
PC
1956}
1957fopi(ord)
1958
1959static void
1960_unordr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1961{
1962 jit_word_t w;
79bfeef6
PC
1963 jit_int32_t reg;
1964 if (jit_mips6_p()) {
1965 reg = jit_get_reg(jit_class_fpr);
1966 CMP_UN_S(rn(reg), r1, r2);
1967 MFC1(r0, rn(reg));
1968 jit_unget_reg(reg);
1969 andi(r0, r0, 1);
1970 }
1971 else {
1972 C_UN_S(r1, r2);
1973 /* cannot optimize delay slot */
1974 flush();
1975 w = _jit->pc.w;
1976 BC1T(0);
1977 /* delay slot */
1978 movi(r0, 1);
1979 movi(r0, 0);
1980 flush();
1981 patch_at(w, _jit->pc.w);
1982 }
4a71579b
PC
1983}
1984fopi(unord)
1985
1986static jit_word_t
1987_bltr_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
1988{
1989 jit_word_t w;
79bfeef6
PC
1990 jit_int32_t op, reg;
1991 if (jit_mips6_p()) {
1992 reg = jit_get_reg_for_delay_slot(jit_class_fpr, r1, r2);
1993 op = pending();
1994 CMP_LT_S(rn(reg), r1, r2);
1995 flush();
1996 w = _jit->pc.w;
1997 BC1NEZ(rn(reg), ((i0 - w) >> 2) - 1);
1998 }
1999 else {
2000 reg = jit_get_reg_for_delay_slot(jit_class_fpr|jit_class_chk, r1, r2);
2001 op = pending();
2002 C_OLT_S(r1, r2);
2003 flush();
2004 w = _jit->pc.w;
2005 BC1T(((i0 - w) >> 2) - 1);
2006 }
2007 delay(op);
2008 jit_unget_reg(reg);
4a71579b
PC
2009 return (w);
2010}
2011fbopi(lt)
2012
2013static jit_word_t
2014_bler_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
2015{
2016 jit_word_t w;
79bfeef6
PC
2017 jit_int32_t op, reg;
2018 if (jit_mips6_p()) {
2019 reg = jit_get_reg_for_delay_slot(jit_class_fpr, r1, r2);
2020 op = pending();
2021 CMP_LE_S(rn(reg), r1, r2);
2022 flush();
2023 w = _jit->pc.w;
2024 BC1NEZ(rn(reg), ((i0 - w) >> 2) - 1);
2025 }
2026 else {
2027 reg = jit_get_reg_for_delay_slot(jit_class_fpr|jit_class_chk, r1, r2);
2028 op = pending();
2029 C_OLE_S(r1, r2);
2030 flush();
2031 w = _jit->pc.w;
2032 BC1T(((i0 - w) >> 2) - 1);
2033 }
2034 delay(op);
2035 jit_unget_reg(reg);
4a71579b
PC
2036 return (w);
2037}
2038fbopi(le)
2039
2040static jit_word_t
2041_beqr_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
2042{
2043 jit_word_t w;
79bfeef6
PC
2044 jit_int32_t op, reg;
2045 if (jit_mips6_p()) {
2046 reg = jit_get_reg_for_delay_slot(jit_class_fpr, r1, r2);
2047 op = pending();
2048 CMP_EQ_S(rn(reg), r1, r2);
2049 flush();
2050 w = _jit->pc.w;
2051 BC1NEZ(rn(reg), ((i0 - w) >> 2) - 1);
2052 }
2053 else {
2054 reg = jit_get_reg_for_delay_slot(jit_class_fpr|jit_class_chk, r1, r2);
2055 op = pending();
2056 C_EQ_S(r1, r2);
2057 flush();
2058 w = _jit->pc.w;
2059 BC1T(((i0 - w) >> 2) - 1);
2060 }
2061 delay(op);
2062 jit_unget_reg(reg);
4a71579b
PC
2063 return (w);
2064}
2065fbopi(eq)
2066
2067static jit_word_t
2068_bger_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
2069{
2070 jit_word_t w;
79bfeef6
PC
2071 jit_int32_t op, reg;
2072 if (jit_mips6_p()) {
2073 reg = jit_get_reg_for_delay_slot(jit_class_fpr, r1, r2);
2074 op = pending();
2075 CMP_ULT_S(rn(reg), r1, r2);
2076 flush();
2077 w = _jit->pc.w;
2078 BC1EQZ(rn(reg), ((i0 - w) >> 2) - 1);
2079 }
2080 else {
2081 reg = jit_get_reg_for_delay_slot(jit_class_fpr|jit_class_chk, r1, r2);
2082 op = pending();
2083 C_ULT_S(r1, r2);
2084 flush();
2085 w = _jit->pc.w;
2086 BC1F(((i0 - w) >> 2) - 1);
2087 }
2088 delay(op);
2089 jit_unget_reg(reg);
4a71579b
PC
2090 return (w);
2091}
2092fbopi(ge)
2093
2094static jit_word_t
2095_bgtr_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
2096{
2097 jit_word_t w;
79bfeef6
PC
2098 jit_int32_t op, reg;
2099 if (jit_mips6_p()) {
2100 reg = jit_get_reg_for_delay_slot(jit_class_fpr, r1, r2);
2101 op = pending();
2102 CMP_ULE_S(rn(reg), r1, r2);
2103 flush();
2104 w = _jit->pc.w;
2105 BC1EQZ(rn(reg), ((i0 - w) >> 2) - 1);
2106 }
2107 else {
2108 reg = jit_get_reg_for_delay_slot(jit_class_fpr|jit_class_chk, r1, r2);
2109 op = pending();
2110 C_ULE_S(r1, r2);
2111 flush();
2112 w = _jit->pc.w;
2113 BC1F(((i0 - w) >> 2) - 1);
2114 }
2115 delay(op);
2116 jit_unget_reg(reg);
4a71579b
PC
2117 return (w);
2118}
2119fbopi(gt)
2120
2121static jit_word_t
2122_bner_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
2123{
2124 jit_word_t w;
79bfeef6
PC
2125 jit_int32_t op, reg;
2126 if (jit_mips6_p()) {
2127 reg = jit_get_reg_for_delay_slot(jit_class_fpr, r1, r2);
2128 op = pending();
2129 CMP_EQ_S(rn(reg), r1, r2);
2130 flush();
2131 w = _jit->pc.w;
2132 BC1EQZ(rn(reg), ((i0 - w) >> 2) - 1);
2133 }
2134 else {
2135 reg = jit_get_reg_for_delay_slot(jit_class_fpr|jit_class_chk, r1, r2);
2136 op = pending();
2137 C_EQ_S(r1, r2);
2138 flush();
2139 w = _jit->pc.w;
2140 BC1F(((i0 - w) >> 2) - 1);
2141 }
2142 delay(op);
2143 jit_unget_reg(reg);
4a71579b
PC
2144 return (w);
2145}
2146fbopi(ne)
2147
2148static jit_word_t
2149_bunltr_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
2150{
2151 jit_word_t w;
79bfeef6
PC
2152 jit_int32_t op, reg;
2153 if (jit_mips6_p()) {
2154 reg = jit_get_reg_for_delay_slot(jit_class_fpr, r1, r2);
2155 op = pending();
2156 CMP_ULT_S(rn(reg), r1, r2);
2157 flush();
2158 w = _jit->pc.w;
2159 BC1NEZ(rn(reg), ((i0 - w) >> 2) - 1);
2160 }
2161 else {
2162 reg = jit_get_reg_for_delay_slot(jit_class_fpr|jit_class_chk, r1, r2);
2163 op = pending();
2164 C_ULT_S(r1, r2);
2165 flush();
2166 w = _jit->pc.w;
2167 BC1T(((i0 - w) >> 2) - 1);
2168 }
2169 delay(op);
2170 jit_unget_reg(reg);
4a71579b
PC
2171 return (w);
2172}
2173fbopi(unlt)
2174
2175static jit_word_t
2176_bunler_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
2177{
2178 jit_word_t w;
79bfeef6
PC
2179 jit_int32_t op, reg;
2180 if (jit_mips6_p()) {
2181 reg = jit_get_reg_for_delay_slot(jit_class_fpr, r1, r2);
2182 op = pending();
2183 CMP_ULE_S(rn(reg), r1, r2);
2184 flush();
2185 w = _jit->pc.w;
2186 BC1NEZ(rn(reg), ((i0 - w) >> 2) - 1);
2187 }
2188 else {
2189 reg = jit_get_reg_for_delay_slot(jit_class_fpr|jit_class_chk, r1, r2);
2190 op = pending();
2191 C_ULE_S(r1, r2);
2192 flush();
2193 w = _jit->pc.w;
2194 BC1T(((i0 - w) >> 2) - 1);
2195 }
2196 delay(op);
2197 jit_unget_reg(reg);
4a71579b
PC
2198 return (w);
2199}
2200fbopi(unle)
2201
2202static jit_word_t
2203_buneqr_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
2204{
2205 jit_word_t w;
79bfeef6
PC
2206 jit_int32_t op, reg;
2207 if (jit_mips6_p()) {
2208 reg = jit_get_reg_for_delay_slot(jit_class_fpr, r1, r2);
2209 op = pending();
2210 CMP_UEQ_S(rn(reg), r1, r2);
2211 flush();
2212 w = _jit->pc.w;
2213 BC1NEZ(rn(reg), ((i0 - w) >> 2) - 1);
2214 }
2215 else {
2216 reg = jit_get_reg_for_delay_slot(jit_class_fpr|jit_class_chk, r1, r2);
2217 op = pending();
2218 C_UEQ_S(r1, r2);
2219 flush();
2220 w = _jit->pc.w;
2221 BC1T(((i0 - w) >> 2) - 1);
2222 }
2223 delay(op);
2224 jit_unget_reg(reg);
4a71579b
PC
2225 return (w);
2226}
2227fbopi(uneq)
2228
2229static jit_word_t
2230_bunger_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
2231{
2232 jit_word_t w;
79bfeef6
PC
2233 jit_int32_t op, reg;
2234 if (jit_mips6_p()) {
2235 reg = jit_get_reg_for_delay_slot(jit_class_fpr, r1, r2);
2236 op = pending();
2237 CMP_LT_S(rn(reg), r1, r2);
2238 flush();
2239 w = _jit->pc.w;
2240 BC1EQZ(rn(reg), ((i0 - w) >> 2) - 1);
2241 }
2242 else {
2243 reg = jit_get_reg_for_delay_slot(jit_class_fpr|jit_class_chk, r1, r2);
2244 op = pending();
2245 C_OLT_S(r1, r2);
2246 flush();
2247 w = _jit->pc.w;
2248 BC1F(((i0 - w) >> 2) - 1);
2249 }
2250 delay(op);
2251 jit_unget_reg(reg);
4a71579b
PC
2252 return (w);
2253}
2254fbopi(unge)
2255
2256static jit_word_t
2257_bungtr_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
2258{
2259 jit_word_t w;
79bfeef6
PC
2260 jit_int32_t op, reg;
2261 if (jit_mips6_p()) {
2262 reg = jit_get_reg_for_delay_slot(jit_class_fpr, r1, r2);
2263 op = pending();
2264 CMP_LE_S(rn(reg), r1, r2);
2265 flush();
2266 w = _jit->pc.w;
2267 BC1EQZ(rn(reg), ((i0 - w) >> 2) - 1);
2268 }
2269 else {
2270 reg = jit_get_reg_for_delay_slot(jit_class_fpr|jit_class_chk, r1, r2);
2271 op = pending();
2272 C_OLE_S(r1, r2);
2273 flush();
2274 w = _jit->pc.w;
2275 BC1F(((i0 - w) >> 2) - 1);
2276 }
2277 delay(op);
2278 jit_unget_reg(reg);
4a71579b
PC
2279 return (w);
2280}
2281fbopi(ungt)
2282
2283static jit_word_t
2284_bltgtr_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
2285{
2286 jit_word_t w;
79bfeef6
PC
2287 jit_int32_t op, reg;
2288 if (jit_mips6_p()) {
2289 reg = jit_get_reg_for_delay_slot(jit_class_fpr, r1, r2);
2290 op = pending();
2291 CMP_UEQ_S(rn(reg), r1, r2);
2292 flush();
2293 w = _jit->pc.w;
2294 BC1EQZ(rn(reg), ((i0 - w) >> 2) - 1);
2295 }
2296 else {
2297 reg = jit_get_reg_for_delay_slot(jit_class_fpr|jit_class_chk, r1, r2);
2298 op = pending();
2299 C_UEQ_S(r1, r2);
2300 flush();
2301 w = _jit->pc.w;
2302 BC1F(((i0 - w) >> 2) - 1);
2303 }
2304 delay(op);
2305 jit_unget_reg(reg);
4a71579b
PC
2306 return (w);
2307}
2308fbopi(ltgt)
2309
2310static jit_word_t
2311_bordr_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
2312{
2313 jit_word_t w;
79bfeef6
PC
2314 jit_int32_t op, reg;
2315 if (jit_mips6_p()) {
2316 reg = jit_get_reg_for_delay_slot(jit_class_fpr, r1, r2);
2317 op = pending();
2318 CMP_UN_S(rn(reg), r1, r2);
2319 flush();
2320 w = _jit->pc.w;
2321 BC1EQZ(rn(reg), ((i0 - w) >> 2) - 1);
2322 }
2323 else {
2324 reg = jit_get_reg_for_delay_slot(jit_class_fpr|jit_class_chk, r1, r2);
2325 op = pending();
2326 C_UN_S(r1, r2);
2327 flush();
2328 w = _jit->pc.w;
2329 BC1F(((i0 - w) >> 2) - 1);
2330 }
2331 delay(op);
2332 jit_unget_reg(reg);
4a71579b
PC
2333 return (w);
2334}
2335fbopi(ord)
2336
2337static jit_word_t
2338_bunordr_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
2339{
2340 jit_word_t w;
79bfeef6
PC
2341 jit_int32_t op, reg;
2342 if (jit_mips6_p()) {
2343 reg = jit_get_reg_for_delay_slot(jit_class_fpr, r1, r2);
2344 op = pending();
2345 CMP_UN_S(rn(reg), r1, r2);
2346 flush();
2347 w = _jit->pc.w;
2348 BC1NEZ(rn(reg), ((i0 - w) >> 2) - 1);
2349 }
2350 else {
2351 reg = jit_get_reg_for_delay_slot(jit_class_fpr|jit_class_chk, r1, r2);
2352 op = pending();
2353 C_UN_S(r1, r2);
2354 flush();
2355 w = _jit->pc.w;
2356 BC1T(((i0 - w) >> 2) - 1);
2357 }
2358 delay(op);
2359 jit_unget_reg(reg);
4a71579b
PC
2360 return (w);
2361}
2362fbopi(unord)
2363
2364static void
2365_ltr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2366{
2367 jit_word_t w;
79bfeef6
PC
2368 jit_int32_t reg;
2369 if (jit_mips6_p()) {
2370 reg = jit_get_reg(jit_class_fpr);
2371 CMP_LT_D(rn(reg), r1, r2);
2372 MFC1(r0, rn(reg));
2373 jit_unget_reg(reg);
2374 andi(r0, r0, 1);
2375 }
2376 else {
2377 C_OLT_D(r1, r2);
2378 /* cannot optimize delay slot */
2379 flush();
2380 w = _jit->pc.w;
2381 BC1T(0);
2382 /* delay slot */
2383 movi(r0, 1);
2384 movi(r0, 0);
2385 flush();
2386 patch_at(w, _jit->pc.w);
2387 }
4a71579b
PC
2388}
2389dopi(lt)
2390
2391static void
2392_ler_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2393{
2394 jit_word_t w;
79bfeef6
PC
2395 jit_int32_t reg;
2396 if (jit_mips6_p()) {
2397 reg = jit_get_reg(jit_class_fpr);
2398 CMP_LE_D(rn(reg), r1, r2);
2399 MFC1(r0, rn(reg));
2400 jit_unget_reg(reg);
2401 andi(r0, r0, 1);
2402 }
2403 else {
2404 C_OLE_D(r1, r2);
2405 /* cannot optimize delay slot */
2406 flush();
2407 w = _jit->pc.w;
2408 BC1T(0);
2409 /* delay slot */
2410 movi(r0, 1);
2411 movi(r0, 0);
2412 flush();
2413 patch_at(w, _jit->pc.w);
2414 }
4a71579b
PC
2415}
2416dopi(le)
2417
2418static void
2419_eqr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2420{
2421 jit_word_t w;
79bfeef6
PC
2422 jit_int32_t reg;
2423 if (jit_mips6_p()) {
2424 reg = jit_get_reg(jit_class_fpr);
2425 CMP_EQ_D(rn(reg), r1, r2);
2426 MFC1(r0, rn(reg));
2427 jit_unget_reg(reg);
2428 andi(r0, r0, 1);
2429 }
2430 else {
2431 C_EQ_D(r1, r2);
2432 /* cannot optimize delay slot */
2433 flush();
2434 w = _jit->pc.w;
2435 BC1T(0);
2436 /* delay slot */
2437 movi(r0, 1);
2438 movi(r0, 0);
2439 flush();
2440 patch_at(w, _jit->pc.w);
2441 }
4a71579b
PC
2442}
2443dopi(eq)
2444
2445static void
2446_ger_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2447{
2448 jit_word_t w;
79bfeef6
PC
2449 jit_int32_t reg;
2450 if (jit_mips6_p()) {
2451 reg = jit_get_reg(jit_class_fpr);
2452 CMP_ULT_D(rn(reg), r1, r2);
2453 MFC1(r0, rn(reg));
2454 jit_unget_reg(reg);
2455 addi(r0, r0, 1);
2456 }
2457 else {
2458 C_ULT_D(r1, r2);
2459 /* cannot optimize delay slot */
2460 flush();
2461 w = _jit->pc.w;
2462 BC1F(0);
2463 /* delay slot */
2464 movi(r0, 1);
2465 movi(r0, 0);
2466 flush();
2467 patch_at(w, _jit->pc.w);
2468 }
4a71579b
PC
2469}
2470dopi(ge)
2471
2472static void
2473_gtr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2474{
2475 jit_word_t w;
79bfeef6
PC
2476 jit_int32_t reg;
2477 if (jit_mips6_p()) {
2478 reg = jit_get_reg(jit_class_fpr);
2479 CMP_ULE_D(rn(reg), r1, r2);
2480 MFC1(r0, rn(reg));
2481 jit_unget_reg(reg);
2482 addi(r0, r0, 1);
2483 }
2484 else {
2485 C_ULE_D(r1, r2);
2486 /* cannot optimize delay slot */
2487 flush();
2488 w = _jit->pc.w;
2489 BC1F(0);
2490 /* delay slot */
2491 movi(r0, 1);
2492 movi(r0, 0);
2493 flush();
2494 patch_at(w, _jit->pc.w);
2495 }
4a71579b
PC
2496}
2497dopi(gt)
2498
2499static void
2500_ner_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2501{
2502 jit_word_t w;
79bfeef6
PC
2503 jit_int32_t reg;
2504 if (jit_mips6_p()) {
2505 reg = jit_get_reg(jit_class_fpr);
2506 CMP_EQ_D(rn(reg), r1, r2);
2507 MFC1(r0, rn(reg));
2508 jit_unget_reg(reg);
2509 addi(r0, r0, 1);
2510 }
2511 else {
2512 C_EQ_D(r1, r2);
2513 /* cannot optimize delay slot */
2514 flush();
2515 w = _jit->pc.w;
2516 BC1F(0);
2517 /* delay slot */
2518 movi(r0, 1);
2519 movi(r0, 0);
2520 flush();
2521 patch_at(w, _jit->pc.w);
2522 }
4a71579b
PC
2523}
2524dopi(ne)
2525
2526static void
2527_unltr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2528{
2529 jit_word_t w;
79bfeef6
PC
2530 jit_int32_t reg;
2531 if (jit_mips6_p()) {
2532 reg = jit_get_reg(jit_class_fpr);
2533 CMP_ULT_D(rn(reg), r1, r2);
2534 MFC1(r0, rn(reg));
2535 jit_unget_reg(reg);
2536 andi(r0, r0, 1);
2537 }
2538 else {
2539 C_ULT_D(r1, r2);
2540 /* cannot optimize delay slot */
2541 flush();
2542 w = _jit->pc.w;
2543 BC1T(0);
2544 /* delay slot */
2545 movi(r0, 1);
2546 movi(r0, 0);
2547 flush();
2548 patch_at(w, _jit->pc.w);
2549 }
4a71579b
PC
2550}
2551dopi(unlt)
2552
2553static void
2554_unler_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2555{
2556 jit_word_t w;
79bfeef6
PC
2557 jit_int32_t reg;
2558 if (jit_mips6_p()) {
2559 reg = jit_get_reg(jit_class_fpr);
2560 CMP_ULE_D(rn(reg), r1, r2);
2561 MFC1(r0, rn(reg));
2562 jit_unget_reg(reg);
2563 andi(r0, r0, 1);
2564 }
2565 else {
2566 C_ULE_D(r1, r2);
2567 /* cannot optimize delay slot */
2568 flush();
2569 w = _jit->pc.w;
2570 BC1T(0);
2571 /* delay slot */
2572 movi(r0, 1);
2573 movi(r0, 0);
2574 flush();
2575 patch_at(w, _jit->pc.w);
2576 }
4a71579b
PC
2577}
2578dopi(unle)
2579
2580static void
2581_uneqr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2582{
2583 jit_word_t w;
79bfeef6
PC
2584 jit_int32_t reg;
2585 if (jit_mips6_p()) {
2586 reg = jit_get_reg(jit_class_fpr);
2587 CMP_UEQ_D(rn(reg), r1, r2);
2588 MFC1(r0, rn(reg));
2589 jit_unget_reg(reg);
2590 andi(r0, r0, 1);
2591 }
2592 else {
2593 C_UEQ_D(r1, r2);
2594 /* cannot optimize delay slot */
2595 flush();
2596 w = _jit->pc.w;
2597 BC1T(0);
2598 /* delay slot */
2599 movi(r0, 1);
2600 movi(r0, 0);
2601 flush();
2602 patch_at(w, _jit->pc.w);
2603 }
4a71579b
PC
2604}
2605dopi(uneq)
2606
2607static void
2608_unger_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2609{
2610 jit_word_t w;
79bfeef6
PC
2611 jit_int32_t reg;
2612 if (jit_mips6_p()) {
2613 reg = jit_get_reg(jit_class_fpr);
2614 CMP_LT_D(rn(reg), r1, r2);
2615 MFC1(r0, rn(reg));
2616 jit_unget_reg(reg);
2617 addi(r0, r0, 1);
2618 }
2619 else {
2620 C_OLT_D(r1, r2);
2621 /* cannot optimize delay slot */
2622 flush();
2623 w = _jit->pc.w;
2624 BC1F(0);
2625 /* delay slot */
2626 movi(r0, 1);
2627 movi(r0, 0);
2628 flush();
2629 patch_at(w, _jit->pc.w);
2630 }
4a71579b
PC
2631}
2632dopi(unge)
2633
2634static void
2635_ungtr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2636{
2637 jit_word_t w;
79bfeef6
PC
2638 jit_int32_t reg;
2639 if (jit_mips6_p()) {
2640 reg = jit_get_reg(jit_class_fpr);
2641 CMP_LE_D(rn(reg), r1, r2);
2642 MFC1(r0, rn(reg));
2643 jit_unget_reg(reg);
2644 addi(r0, r0, 1);
2645 }
2646 else {
2647 C_OLE_D(r1, r2);
2648 /* cannot optimize delay slot */
2649 flush();
2650 w = _jit->pc.w;
2651 BC1F(0);
2652 /* delay slot */
2653 movi(r0, 1);
2654 movi(r0, 0);
2655 flush();
2656 patch_at(w, _jit->pc.w);
2657 }
4a71579b
PC
2658}
2659dopi(ungt)
2660
2661static void
2662_ltgtr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2663{
2664 jit_word_t w;
79bfeef6
PC
2665 jit_int32_t reg;
2666 if (jit_mips6_p()) {
2667 reg = jit_get_reg(jit_class_fpr);
2668 CMP_UEQ_D(rn(reg), r1, r2);
2669 MFC1(r0, rn(reg));
2670 jit_unget_reg(reg);
2671 addi(r0, r0, 1);
2672 }
2673 else {
2674 C_UEQ_D(r1, r2);
2675 /* cannot optimize delay slot */
2676 flush();
2677 w = _jit->pc.w;
2678 BC1F(0);
2679 /* delay slot */
2680 movi(r0, 1);
2681 movi(r0, 0);
2682 flush();
2683 patch_at(w, _jit->pc.w);
2684 }
4a71579b
PC
2685}
2686dopi(ltgt)
2687
2688static void
2689_ordr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2690{
2691 jit_word_t w;
79bfeef6
PC
2692 jit_int32_t reg;
2693 if (jit_mips6_p()) {
2694 reg = jit_get_reg(jit_class_fpr);
2695 CMP_UN_D(rn(reg), r1, r2);
2696 MFC1(r0, rn(reg));
2697 jit_unget_reg(reg);
2698 addi(r0, r0, 1);
2699 }
2700 else {
2701 C_UN_D(r1, r2);
2702 /* cannot optimize delay slot */
2703 flush();
2704 w = _jit->pc.w;
2705 BC1F(0);
2706 /* delay slot */
2707 movi(r0, 1);
2708 movi(r0, 0);
2709 flush();
2710 patch_at(w, _jit->pc.w);
2711 }
4a71579b
PC
2712}
2713dopi(ord)
2714
2715static void
2716_unordr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2717{
2718 jit_word_t w;
79bfeef6
PC
2719 jit_int32_t reg;
2720 if (jit_mips6_p()) {
2721 reg = jit_get_reg(jit_class_fpr);
2722 CMP_UN_D(rn(reg), r1, r2);
2723 MFC1(r0, rn(reg));
2724 jit_unget_reg(reg);
2725 andi(r0, r0, 1);
2726 }
2727 else {
2728 C_UN_D(r1, r2);
2729 /* cannot optimize delay slot */
2730 flush();
2731 w = _jit->pc.w;
2732 BC1T(0);
2733 /* delay slot */
2734 movi(r0, 1);
2735 movi(r0, 0);
2736 flush();
2737 patch_at(w, _jit->pc.w);
2738 }
4a71579b
PC
2739}
2740dopi(unord)
2741
2742static jit_word_t
2743_bltr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
2744{
2745 jit_word_t w;
79bfeef6
PC
2746 jit_int32_t op, reg;
2747 if (jit_mips6_p()) {
2748 reg = jit_get_reg_for_delay_slot(jit_class_fpr, r1, r2);
2749 op = pending();
2750 CMP_LT_D(rn(reg), r1, r2);
2751 flush();
2752 w = _jit->pc.w;
2753 BC1NEZ(rn(reg), ((i0 - w) >> 2) - 1);
2754 }
2755 else {
2756 reg = jit_get_reg_for_delay_slot(jit_class_fpr|jit_class_chk, r1, r2);
2757 op = pending();
2758 C_OLT_D(r1, r2);
2759 flush();
2760 w = _jit->pc.w;
2761 BC1T(((i0 - w) >> 2) - 1);
2762 }
2763 delay(op);
2764 jit_unget_reg(reg);
4a71579b
PC
2765 return (w);
2766}
2767dbopi(lt)
2768
2769static jit_word_t
2770_bler_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
2771{
2772 jit_word_t w;
79bfeef6
PC
2773 jit_int32_t op, reg;
2774 if (jit_mips6_p()) {
2775 reg = jit_get_reg_for_delay_slot(jit_class_fpr, r1, r2);
2776 op = pending();
2777 CMP_LE_D(rn(reg), r1, r2);
2778 flush();
2779 w = _jit->pc.w;
2780 BC1NEZ(rn(reg), ((i0 - w) >> 2) - 1);
2781 }
2782 else {
2783 reg = jit_get_reg_for_delay_slot(jit_class_fpr|jit_class_chk, r1, r2);
2784 op = pending();
2785 C_OLE_D(r1, r2);
2786 flush();
2787 w = _jit->pc.w;
2788 BC1T(((i0 - w) >> 2) - 1);
2789 }
2790 delay(op);
2791 jit_unget_reg(reg);
4a71579b
PC
2792 return (w);
2793}
2794dbopi(le)
2795
2796static jit_word_t
2797_beqr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
2798{
2799 jit_word_t w;
79bfeef6
PC
2800 jit_int32_t op, reg;
2801 if (jit_mips6_p()) {
2802 reg = jit_get_reg_for_delay_slot(jit_class_fpr, r1, r2);
2803 op = pending();
2804 CMP_EQ_D(rn(reg), r1, r2);
2805 flush();
2806 w = _jit->pc.w;
2807 BC1NEZ(rn(reg), ((i0 - w) >> 2) - 1);
2808 }
2809 else {
2810 reg = jit_get_reg_for_delay_slot(jit_class_fpr|jit_class_chk, r1, r2);
2811 op = pending();
2812 C_EQ_D(r1, r2);
2813 flush();
2814 w = _jit->pc.w;
2815 BC1T(((i0 - w) >> 2) - 1);
2816 }
2817 delay(op);
2818 jit_unget_reg(reg);
4a71579b
PC
2819 return (w);
2820}
2821dbopi(eq)
2822
2823static jit_word_t
2824_bger_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
2825{
2826 jit_word_t w;
79bfeef6
PC
2827 jit_int32_t op, reg;
2828 if (jit_mips6_p()) {
2829 reg = jit_get_reg_for_delay_slot(jit_class_fpr, r1, r2);
2830 op = pending();
2831 CMP_ULT_D(rn(reg), r1, r2);
2832 flush();
2833 w = _jit->pc.w;
2834 BC1EQZ(rn(reg), ((i0 - w) >> 2) - 1);
2835 }
2836 else {
2837 reg = jit_get_reg_for_delay_slot(jit_class_fpr|jit_class_chk, r1, r2);
2838 op = pending();
2839 C_ULT_D(r1, r2);
2840 flush();
2841 w = _jit->pc.w;
2842 BC1F(((i0 - w) >> 2) - 1);
2843 }
2844 delay(op);
2845 jit_unget_reg(reg);
4a71579b
PC
2846 return (w);
2847}
2848dbopi(ge)
2849
2850static jit_word_t
2851_bgtr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
2852{
2853 jit_word_t w;
79bfeef6
PC
2854 jit_int32_t op, reg;
2855 if (jit_mips6_p()) {
2856 reg = jit_get_reg_for_delay_slot(jit_class_fpr, r1, r2);
2857 op = pending();
2858 CMP_ULE_D(rn(reg), r1, r2);
2859 flush();
2860 w = _jit->pc.w;
2861 BC1EQZ(rn(reg), ((i0 - w) >> 2) - 1);
2862 }
2863 else {
2864 reg = jit_get_reg_for_delay_slot(jit_class_fpr|jit_class_chk, r1, r2);
2865 op = pending();
2866 C_ULE_D(r1, r2);
2867 flush();
2868 w = _jit->pc.w;
2869 BC1F(((i0 - w) >> 2) - 1);
2870 }
2871 delay(op);
2872 jit_unget_reg(reg);
4a71579b
PC
2873 return (w);
2874}
2875dbopi(gt)
2876
2877static jit_word_t
2878_bner_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
2879{
2880 jit_word_t w;
79bfeef6
PC
2881 jit_int32_t op, reg;
2882 if (jit_mips6_p()) {
2883 reg = jit_get_reg_for_delay_slot(jit_class_fpr, r1, r2);
2884 op = pending();
2885 CMP_EQ_D(rn(reg), r1, r2);
2886 flush();
2887 w = _jit->pc.w;
2888 BC1EQZ(rn(reg), ((i0 - w) >> 2) - 1);
2889 }
2890 else {
2891 reg = jit_get_reg_for_delay_slot(jit_class_fpr|jit_class_chk, r1, r2);
2892 op = pending();
2893 C_EQ_D(r1, r2);
2894 flush();
2895 w = _jit->pc.w;
2896 BC1F(((i0 - w) >> 2) - 1);
2897 }
2898 delay(op);
2899 jit_unget_reg(reg);
4a71579b
PC
2900 return (w);
2901}
2902dbopi(ne)
2903
2904static jit_word_t
2905_bunltr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
2906{
2907 jit_word_t w;
79bfeef6
PC
2908 jit_int32_t op, reg;
2909 if (jit_mips6_p()) {
2910 reg = jit_get_reg_for_delay_slot(jit_class_fpr, r1, r2);
2911 op = pending();
2912 CMP_ULT_D(rn(reg), r1, r2);
2913 flush();
2914 w = _jit->pc.w;
2915 BC1NEZ(rn(reg), ((i0 - w) >> 2) - 1);
2916 }
2917 else {
2918 reg = jit_get_reg_for_delay_slot(jit_class_fpr|jit_class_chk, r1, r2);
2919 op = pending();
2920 C_ULT_D(r1, r2);
2921 flush();
2922 w = _jit->pc.w;
2923 BC1T(((i0 - w) >> 2) - 1);
2924 }
2925 delay(op);
2926 jit_unget_reg(reg);
4a71579b
PC
2927 return (w);
2928}
2929dbopi(unlt)
2930
2931static jit_word_t
2932_bunler_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
2933{
2934 jit_word_t w;
79bfeef6
PC
2935 jit_int32_t op, reg;
2936 if (jit_mips6_p()) {
2937 reg = jit_get_reg_for_delay_slot(jit_class_fpr, r1, r2);
2938 op = pending();
2939 CMP_ULE_D(rn(reg), r1, r2);
2940 flush();
2941 w = _jit->pc.w;
2942 BC1NEZ(rn(reg), ((i0 - w) >> 2) - 1);
2943 }
2944 else {
2945 reg = jit_get_reg_for_delay_slot(jit_class_fpr|jit_class_chk, r1, r2);
2946 op = pending();
2947 C_ULE_D(r1, r2);
2948 flush();
2949 w = _jit->pc.w;
2950 BC1T(((i0 - w) >> 2) - 1);
2951 }
2952 delay(op);
2953 jit_unget_reg(reg);
4a71579b
PC
2954 return (w);
2955}
2956dbopi(unle)
2957
2958static jit_word_t
2959_buneqr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
2960{
2961 jit_word_t w;
79bfeef6
PC
2962 jit_int32_t op, reg;
2963 if (jit_mips6_p()) {
2964 reg = jit_get_reg_for_delay_slot(jit_class_fpr, r1, r2);
2965 op = pending();
2966 CMP_UEQ_D(rn(reg), r1, r2);
2967 flush();
2968 w = _jit->pc.w;
2969 BC1NEZ(rn(reg), ((i0 - w) >> 2) - 1);
2970 }
2971 else {
2972 reg = jit_get_reg_for_delay_slot(jit_class_fpr|jit_class_chk, r1, r2);
2973 op = pending();
2974 C_UEQ_D(r1, r2);
2975 flush();
2976 w = _jit->pc.w;
2977 BC1T(((i0 - w) >> 2) - 1);
2978 }
2979 delay(op);
2980 jit_unget_reg(reg);
4a71579b
PC
2981 return (w);
2982}
2983dbopi(uneq)
2984
2985static jit_word_t
2986_bunger_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
2987{
2988 jit_word_t w;
79bfeef6
PC
2989 jit_int32_t op, reg;
2990 if (jit_mips6_p()) {
2991 reg = jit_get_reg_for_delay_slot(jit_class_fpr, r1, r2);
2992 op = pending();
2993 CMP_LT_D(rn(reg), r1, r2);
2994 flush();
2995 w = _jit->pc.w;
2996 BC1EQZ(rn(reg), ((i0 - w) >> 2) - 1);
2997 }
2998 else {
2999 reg = jit_get_reg_for_delay_slot(jit_class_fpr|jit_class_chk, r1, r2);
3000 op = pending();
3001 C_OLT_D(r1, r2);
3002 flush();
3003 w = _jit->pc.w;
3004 BC1F(((i0 - w) >> 2) - 1);
3005 }
3006 delay(op);
3007 jit_unget_reg(reg);
4a71579b
PC
3008 return (w);
3009}
3010dbopi(unge)
3011
3012static jit_word_t
3013_bungtr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
3014{
3015 jit_word_t w;
79bfeef6
PC
3016 jit_int32_t op, reg;
3017 if (jit_mips6_p()) {
3018 reg = jit_get_reg_for_delay_slot(jit_class_fpr, r1, r2);
3019 op = pending();
3020 CMP_LE_D(rn(reg), r1, r2);
3021 flush();
3022 w = _jit->pc.w;
3023 BC1EQZ(rn(reg), ((i0 - w) >> 2) - 1);
3024 }
3025 else {
3026 reg = jit_get_reg_for_delay_slot(jit_class_fpr|jit_class_chk, r1, r2);
3027 op = pending();
3028 C_OLE_D(r1, r2);
3029 flush();
3030 w = _jit->pc.w;
3031 BC1F(((i0 - w) >> 2) - 1);
3032 }
3033 delay(op);
3034 jit_unget_reg(reg);
4a71579b
PC
3035 return (w);
3036}
3037dbopi(ungt)
3038
3039static jit_word_t
3040_bltgtr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
3041{
3042 jit_word_t w;
79bfeef6
PC
3043 jit_int32_t op, reg;
3044 if (jit_mips6_p()) {
3045 reg = jit_get_reg_for_delay_slot(jit_class_fpr, r1, r2);
3046 op = pending();
3047 CMP_UEQ_D(rn(reg), r1, r2);
3048 flush();
3049 w = _jit->pc.w;
3050 BC1EQZ(rn(reg), ((i0 - w) >> 2) - 1);
3051 }
3052 else {
3053 reg = jit_get_reg_for_delay_slot(jit_class_fpr|jit_class_chk, r1, r2);
3054 op = pending();
3055 C_UEQ_D(r1, r2);
3056 flush();
3057 w = _jit->pc.w;
3058 BC1F(((i0 - w) >> 2) - 1);
3059 }
3060 delay(op);
3061 jit_unget_reg(reg);
4a71579b
PC
3062 return (w);
3063}
3064dbopi(ltgt)
3065
3066static jit_word_t
3067_bordr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
3068{
3069 jit_word_t w;
79bfeef6
PC
3070 jit_int32_t op, reg;
3071 if (jit_mips6_p()) {
3072 reg = jit_get_reg_for_delay_slot(jit_class_fpr, r1, r2);
3073 op = pending();
3074 CMP_UN_D(rn(reg), r1, r2);
3075 flush();
3076 w = _jit->pc.w;
3077 BC1EQZ(rn(reg), ((i0 - w) >> 2) - 1);
3078 }
3079 else {
3080 reg = jit_get_reg_for_delay_slot(jit_class_fpr|jit_class_chk, r1, r2);
3081 op = pending();
3082 C_UN_D(r1, r2);
3083 flush();
3084 w = _jit->pc.w;
3085 BC1F(((i0 - w) >> 2) - 1);
3086 }
3087 delay(op);
3088 jit_unget_reg(reg);
4a71579b
PC
3089 return (w);
3090}
3091dbopi(ord)
3092
3093static jit_word_t
3094_bunordr_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r1, jit_int32_t r2)
3095{
3096 jit_word_t w;
79bfeef6
PC
3097 jit_int32_t op, reg;
3098 if (jit_mips6_p()) {
3099 reg = jit_get_reg_for_delay_slot(jit_class_fpr, r1, r2);
3100 op = pending();
3101 CMP_UN_D(rn(reg), r1, r2);
3102 flush();
3103 w = _jit->pc.w;
3104 BC1NEZ(rn(reg), ((i0 - w) >> 2) - 1);
3105 }
3106 else {
3107 reg = jit_get_reg_for_delay_slot(jit_class_fpr|jit_class_chk, r1, r2);
3108 op = pending();
3109 C_UN_D(r1, r2);
3110 flush();
3111 w = _jit->pc.w;
3112 BC1T(((i0 - w) >> 2) - 1);
3113 }
3114 delay(op);
3115 jit_unget_reg(reg);
4a71579b
PC
3116 return (w);
3117}
3118dbopi(unord)
3119
3120static void
3121_vaarg_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
3122{
3123#if !NEW_ABI
3124 jit_int32_t reg;
3125#endif
3126 assert(_jitc->function->self.call & jit_call_varargs);
3127#if !NEW_ABI
3128 /* Align, if required. */
3129 reg = jit_get_reg(jit_class_gpr);
3130 andi(rn(reg), r1, 7);
3131 addr(r1, r1, rn(reg));
3132 jit_unget_reg(reg);
3133#endif
3134
3135 /* Load argument. */
3136 ldr_d(r0, r1);
3137
3138 /* Update va_list. */
3139 addi(r1, r1, sizeof(jit_float64_t));
3140}
3141
3142# undef fopi
3143# undef fbopi
3144# undef dopi
3145# undef dbopi
3146# undef fpr_bopi
3147# undef fpr_opi
3148#endif