2 * Copyright (C) 2013-2019 Free Software Foundation, Inc.
4 * This file is part of GNU lightning.
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)
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.
17 * Paulo Cesar Pereira de Andrade
21 # define _G2_REGNO 0x02
22 # define _G3_REGNO 0x03
23 # define _G4_REGNO 0x04
24 # define _O0_REGNO 0x08
25 # define _O1_REGNO 0x09
26 # define _SP_REGNO 0x0e
27 # define _FP_REGNO 0x1e
28 # define _O7_REGNO 0x0f
29 # define _L0_REGNO 0x10
30 # define _L1_REGNO 0x11
31 # define _L2_REGNO 0x12
32 # define _L3_REGNO 0x13
33 # define _L4_REGNO 0x14
34 # define _L5_REGNO 0x15
35 # define _L6_REGNO 0x16
36 # define _L7_REGNO 0x17
37 # define _I7_REGNO 0x1f
39 * - previous stack frame
41 * fp- local variables (in lightning, 8 bytes space for float conversion)
44 * sp+ 6 words to save register arguments
45 * sp+ 1 word for hidden address of aggregate return value (32 bits only)
46 * sp+ 16 words for in and local registers
48 * decreasing memory address - next stack frame (not yet allocated)
50 # define stack_framesize ((16 + (__WORDSIZE == 32) + 6) * sizeof(jit_word_t))
52 struct { jit_uint32_t b: 2; } op;
53 struct { jit_uint32_t _: 2; jit_uint32_t b: 1; } a;
54 struct { jit_uint32_t _: 2; jit_uint32_t b: 5; } rd;
55 struct { jit_uint32_t _: 2; jit_uint32_t b: 30; } disp30;
56 struct { jit_uint32_t _: 3; jit_uint32_t b: 4; } cond;
57 struct { jit_uint32_t _: 7; jit_uint32_t b: 3; } op2;
58 struct { jit_uint32_t _: 7; jit_uint32_t b: 6; } op3;
59 struct { jit_uint32_t _: 10; jit_uint32_t b: 1; } cc1;
60 struct { jit_uint32_t _: 10; jit_uint32_t b: 22; } imm22;
61 struct { jit_uint32_t _: 10; jit_uint32_t b: 22; } disp22;
62 struct { jit_uint32_t _: 11; jit_uint32_t b: 1; } cc0;
63 struct { jit_uint32_t _: 12; jit_uint32_t b: 1; } p;
64 struct { jit_uint32_t _: 13; jit_uint32_t b: 19; } disp19;
65 struct { jit_uint32_t _: 13; jit_uint32_t b: 5; } rs1;
66 struct { jit_uint32_t _: 18; jit_uint32_t b: 1; } i;
67 struct { jit_uint32_t _: 18; jit_uint32_t b: 9; } opf;
68 struct { jit_uint32_t _: 19; jit_uint32_t b: 1; } x;
69 struct { jit_uint32_t _: 19; jit_uint32_t b: 8; } asi;
70 struct { jit_uint32_t _: 19; jit_uint32_t b: 6; } res;
71 struct { jit_uint32_t _: 19; jit_uint32_t b: 13; } simm13;
72 struct { jit_uint32_t _: 20; jit_uint32_t b: 7; } asix;
73 struct { jit_uint32_t _: 20; jit_uint32_t b: 6; } asis;
74 struct { jit_uint32_t _: 26; jit_uint32_t b: 6; } shim;
75 struct { jit_uint32_t _: 25; jit_uint32_t b: 7; } imm7;
76 struct { jit_uint32_t _: 27; jit_uint32_t b: 5; } rs2;
79 # define ii(i) *_jit->pc.ui++ = i
80 # define s7_p(imm) ((imm) <= 63 && (imm) >= -64)
81 # define s13_p(imm) ((imm) <= 4095 && (imm) >= -4096)
82 # define s19_p(imm) ((imm) <= 262143 && (imm) >= -262144)
83 # define s22_p(imm) ((imm) <= 2097151 && (imm) >= -20971512)
84 # define s30_p(imm) ((imm) <= 536870911 && (imm) >= -536870912)
85 # define f1(op, disp30) _f1(_jit, op, disp30)
86 static void _f1(jit_state_t*,jit_int32_t,jit_int32_t);
87 # define f2r(op, rd, op2, imm22) _f2r(_jit, op, rd, op2, imm22)
88 static void _f2r(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t);
89 # define f2b(op, a, cond, op2, disp22) _f2b(_jit, op, a, cond, op2, disp22)
91 _f2b(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t);
93 # define f2bp(op,a,cond,op2,cc1,cc0,p,disp19) \
94 _f2bp(_jit,op,a,cond,op2,cc1,cc0,p,disp19)
96 _f2bp(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t,
97 jit_int32_t,jit_int32_t,jit_int32_t);
99 # define f3r(op, rd, op3, rs1, rs2) _f3r(_jit, op, rd, op3, rs1, rs2)
100 static void _f3r(jit_state_t*,
101 jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t);
102 # if __WORDSIZE == 64
103 # define f3rx(op, rd, op3, rs1, rs2) _f3rx(_jit, op, rd, op3, rs1, rs2)
104 static void _f3rx(jit_state_t*,
105 jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t);
107 # define f3i(op, rd, op3, rs1, simm13) _f3i(_jit, op, rd, op3, rs1, simm13)
108 static void _f3i(jit_state_t*,
109 jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t);
110 # define f3s(op, rd, op3, rs1, simm13) _f3s(_jit, op, rd, op3, rs1, simm13)
111 static void _f3s(jit_state_t*,
112 jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t);
113 # define f3t(cond, rs1, i, ri) _f3t(_jit, cond, rs1, i, ri)
114 static void _f3t(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t)
116 # define f3a(op, rd, op3, rs1, rs2) _f3a(_jit, op, rd, op3, rs1, asi, rs2)
117 static void _f3a(jit_state_t*,jit_int32_t,
118 jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t)
120 # define LDSB(rs1, rs2, rd) f3r(3, rd, 9, rs1, rs2)
121 # define LDSBI(rs1, imm, rd) f3i(3, rd, 9, rs1, imm)
122 # define LDSH(rs1, rs2, rd) f3r(3, rd, 10, rs1, rs2)
123 # define LDSHI(rs1, imm, rd) f3i(3, rd, 10, rs1, imm)
124 # define LDUB(rs1, rs2, rd) f3r(3, rd, 1, rs1, rs2)
125 # define LDUBI(rs1, imm, rd) f3i(3, rd, 1, rs1, imm)
126 # define LDUH(rs1, rs2, rd) f3r(3, rd, 2, rs1, rs2)
127 # define LDUHI(rs1, imm, rd) f3i(3, rd, 2, rs1, imm)
128 # if __WORDSIZE == 32
129 # define LD(rs1, rs2, rd) f3r(3, rd, 0, rs1, rs2)
130 # define LDI(rs1, imm, rd) f3i(3, rd, 0, rs1, imm)
131 # define LDD(rs1, rs2, rd) f3r(3, rd, 3, rs1, rs2)
132 # define LDDI(rs1, imm, rd) f3i(3, rd, 3, rs1, imm)
134 # define LDSW(rs1, rs2, rd) f3r(3, rd, 8, rs1, rs2)
135 # define LDSWI(rs1, imm, rd) f3i(3, rd, 8, rs1, imm)
136 # define LDUW(rs1, rs2, rd) f3r(3, rd, 0, rs1, rs2)
137 # define LDUWI(rs1, imm, rd) f3i(3, rd, 0, rs1, imm)
138 # define LDX(rs1, rs2, rd) f3r(3, rd, 11, rs1, rs2)
139 # define LDXI(rs1, imm, rd) f3i(3, rd, 11, rs1, imm)
141 # define LDSBA(rs1, rs2, asi, rd) f3a(3, rd, 25, rs1, asi, rs2)
142 # define LDSHA(rs1, rs2, asi, rd) f3a(3, rd, 26, rs1, asi, rs2)
143 # define LDUBA(rs1, rs2, asi, rd) f3a(3, rd, 17, rs1, asi, rs2)
144 # define LDUHA(rs1, rs2, asi, rd) f3a(3, rd, 18, rs1, asi, rs2)
145 # if __WORDSIZE == 32
146 # define LDA(rs1, rs2, asi, rd) f3a(3, rd, 16, rs1, asi, rs2)
147 # define LDDA(rs1, rs2, asi, rd) f3a(3, rd, 19, rs1, asi, rs2)
149 # define LDSWA(rs1, rs2, asi, rd) f3a(3, rd, 24, rs1, asi, rs2)
150 # define LDUWA(rs1, rs2, asi, rd) f3a(3, rd, 16, rs1, asi, rs2)
151 # define LDXA(rs1, rs2, asi, rd) f3a(3, rd, 27, rs1, asi, rs2)
153 # define LDC(rs1, rs2, rd) f3r(3, rd, 48, rs1, rs2)
154 # define LDCI(rs1, imm, rd) f3i(3, rd, 48, rs1, imm)
155 # define LDDC(rs1, rs2, rd) f3r(3, rd, 51, rs1, rs2)
156 # define LDDCI(rs1, imm, rd) f3i(3, rd, 51, rs1, imm)
157 # define LDCSR(rs1, rs2, rd) f3r(3, rd, 49, rs1, rs2)
158 # define LDCSRI(rs1, imm, rd) f3i(3, rd, 49, rs1, imm)
159 # define STB(rd, rs1, rs2) f3r(3, rd, 5, rs1, rs2)
160 # define STBI(rd, rs1, imm) f3i(3, rd, 5, rs1, imm)
161 # define STH(rd, rs1, rs2) f3r(3, rd, 6, rs1, rs2)
162 # define STHI(rd, rs1, imm) f3i(3, rd, 6, rs1, imm)
163 # if __WORDSIZE == 32
164 # define ST(rd, rs1, rs2) f3r(3, rd, 4, rs1, rs2)
165 # define STI(rd, rs1, imm) f3i(3, rd, 4, rs1, imm)
166 # define STD(rrd, s1, rs2) f3r(3, rd, 7, rs1, rs2)
167 # define STDI(rd, rs1, imm) f3i(3, rd, 7, rs1, imm)
169 # define STW(rd, rs1, rs2) f3r(3, rd, 4, rs1, rs2)
170 # define STWI(rd, rs1, imm) f3i(3, rd, 4, rs1, imm)
171 # define STX(rd, rs1, rs2) f3r(3, rd, 14, rs1, rs2)
172 # define STXI(rd, rs1, imm) f3i(3, rd, 14, rs1, imm)
174 # define STBA(rd, rs1, rs2) f3a(3, rd, 21, rs1, asi, rs2)
175 # define STHA(rd, rs1, rs2) f3a(3, rd, 22, rs1, asi, rs2)
176 # if __WORDSIZE == 32
177 # define STA(rd, rs1, rs2) f3a(3, rd, 20, rs1, asi, rs2)
178 # define STDA(rd, rs1, rs2) f3a(3, rd, 23, rs1, asi, rs2)
180 # define STWA(rd, rs1, rs2) f3a(3, rd, 20, rs1, asi, rs2)
181 # define STXA(rd, rs1, rs2) f3a(3, rd, 30, rs1, asi, rs2)
183 # define STC(rd, rs1, rs2) f3r(3, rd, 52, rs1, rs2)
184 # define STCI(rd, rs1, imm) f3i(3, rd, 52, rs1, imm)
185 # define STDC(rd, rs1, rs2) f3r(3, rd, 55, rs1, rs2)
186 # define STDCI(rd, rs1, imm) f3i(3, rd, 55, rs1, imm)
187 # define STCSR(rd, rs1, rs2) f3r(3, rd, 53, rs1, rs2)
188 # define STCSRI(rd, rs1, imm) f3i(3, rd, 53, rs1, imm)
189 # define STDCQ(rd, rs1, rs2) f3r(3, rd, 54, rs1, rs2)
190 # define STDCQI(rd, rs1, imm) f3i(3, rd, 54, rs1, imm)
191 # define LDSTUB(rs1, rs2, rd) f3r(3, rd, 13, rs1, rs2)
192 # define LDSTUBI(rs1, imm, rd) f3r(3, rd, 13, rs1, imm)
193 # define LDSTUBA(rs1, rs2, asi, rd) f3a(3, rd, 21, rs1, asi, rs2)
194 # define SWAP(rs1, rs2, rd) f3r(3, rd, 15, rs1, rs2)
195 # define SWAPI(rs1, imm, rd) f3r(3, rd, 15, rs1, imm)
196 # define SWAPA(rs1, rs2, asi, rd) f3a(3, rd, 23, rs1, asi, rs2)
197 # define NOP() SETHI(0, 0)
198 # define HI(im) ((im) >> 10)
199 # define LO(im) ((im) & 0x3ff)
200 # define SETHI(im, rd) f2r(0, rd, 4, im)
201 # define AND(rs1, rs2, rd) f3r(2, rd, 1, rs1, rs2)
202 # define ANDI(rs1, imm, rd) f3i(2, rd, 1, rs1, imm)
203 # define ANDcc(rs1, rs2, rd) f3r(2, rd, 17, rs1, rs2)
204 # define ANDIcc(rs1, imm, rd) f3i(2, rd, 17, rs1, imm)
205 # define BTST(rs1, rs2) ANDcc(rs1, rs2, 0)
206 # define BTSTI(rs1, imm) ANDIcc(rs1, imm, 0)
207 # define ANDN(rs1, rs2, rd) f3r(2, rd, 5, rs1, rs2)
208 # define ANDNI(rs1, imm, rd) f3i(2, rd, 5, rs1, imm)
209 # define ANDNcc(rs1, rs2, rd) f3r(2, rd, 21, rs1, rs2)
210 # define ANDNIcc(rs1, imm, rd) f3i(2, rd, 21, rs1, imm)
211 # define OR(rs1, rs2, rd) f3r(2, rd, 2, rs1, rs2)
212 # define ORI(rs1, imm, rd) f3i(2, rd, 2, rs1, imm)
213 # define ORcc(rs1, rs2, rd) f3r(2, rd, 18, rs1, rs2)
214 # define ORIcc(rs1, imm, rd) f3i(2, rd, 18, rs1, imm)
215 # define ORN(rs1, rs2, rd) f3r(2, rd, 6, rs1, rs2)
216 # define ORNI(rs1, imm, rd) f3i(2, rd, 6, rs1, imm)
217 # define ORNcc(rs1, rs2, rd) f3r(2, rd, 22, rs1, rs2)
218 # define ORNIcc(rs1, imm, rd) f3i(2, rd, 22, rs1, imm)
219 # define XOR(rs1, rs2, rd) f3r(2, rd, 3, rs1, rs2)
220 # define XORI(rs1, imm, rd) f3i(2, rd, 3, rs1, imm)
221 # define XORcc(rs1, rs2, rd) f3r(2, rd, 19, rs1, rs2)
222 # define XORIcc(rs1, imm, rd) f3i(2, rd, 19, rs1, imm)
223 # define XNOR(rs1, rs2, rd) f3r(2, rd, 7, rs1, rs2)
224 # define XNORI(rs1, imm, rd) f3i(2, rd, 7, rs1, imm)
225 # define XNORcc(rs1, rs2, rd) f3r(2, rd, 23, rs1, rs2)
226 # define XNORIcc(rs1, imm, rd) f3i(2, rd, 23, rs1, imm)
227 # define SLL(rs1, rs2, rd) f3r(2, rd, 37, rs1, rs2)
228 # define SLLI(rs1, imm, rd) f3i(2, rd, 37, rs1, imm)
229 # define SRL(rs1, rs2, rd) f3r(2, rd, 38, rs1, rs2)
230 # define SRLI(rs1, imm, rd) f3i(2, rd, 38, rs1, imm)
231 # define SRA(rs1, rs2, rd) f3r(2, rd, 39, rs1, rs2)
232 # define SRAI(rs1, imm, rd) f3i(2, rd, 39, rs1, imm)
233 # if __WORDSIZE == 64
234 # define SLLX(rs1, rs2, rd) f3rx(2, rd, 37, rs1, rs2)
235 # define SLLXI(rs1, imm, rd) f3s(2, rd, 37, rs1, imm)
236 # define SRLX(rs1, rs2, rd) f3rx(2, rd, 38, rs1, rs2)
237 # define SRLXI(rs1, imm, rd) f3s(2, rd, 38, rs1, imm)
238 # define SRAX(rs1, rs2, rd) f3rx(2, rd, 39, rs1, rs2)
239 # define SRAXI(rs1, imm, rd) f3s(2, rd, 39, rs1, imm)
241 # define ADD(rs1, rs2, rd) f3r(2, rd, 0, rs1, rs2)
242 # define ADDI(rs1, imm, rd) f3i(2, rd, 0, rs1, imm)
243 # define ADDcc(rs1, rs2, rd) f3r(2, rd, 16, rs1, rs2)
244 # define ADDIcc(rs1, imm, rd) f3i(2, rd, 16, rs1, imm)
245 # define ADDX(rs1, rs2, rd) f3r(2, rd, 8, rs1, rs2)
246 # define ADDXI(rs1, imm, rd) f3i(2, rd, 8, rs1, imm)
247 # define ADDXcc(rs1, rs2, rd) f3r(2, rd, 24, rs1, rs2)
248 # define ADDXIcc(rs1, imm, rd) f3i(2, rd, 24, rs1, imm)
249 # define TADDcc(rs1, rs2, rd) f3r(2, rd, 32, rs1, rs2)
250 # define TADDIcc(rs1, imm, rd) f3i(2, rd, 32, rs1, imm)
251 # define TADDccTV(rs1, rs2, rd) f3r(2, rd, 34, rs1, rs2)
252 # define TADDIccTV(rs1, imm, rd) f3i(2, rd, 34, rs1, imm)
253 # define SUB(rs1, rs2, rd) f3r(2, rd, 4, rs1, rs2)
254 # define NEG(rs1, rd) SUB(0, rs1, rd)
255 # define SUBI(rs1, imm, rd) f3i(2, rd, 4, rs1, imm)
256 # define SUBcc(rs1, rs2, rd) f3r(2, rd, 20, rs1, rs2)
257 # define SUBIcc(rs1, imm, rd) f3i(2, rd, 20, rs1, imm)
258 # define CMP(rs1, rs2) SUBcc(rs1, rs2, 0)
259 # define CMPI(rs1, imm) SUBIcc(rs1, imm, 0)
260 # define SUBX(rs1, rs2, rd) f3r(2, rd, 12, rs1, rs2)
261 # define SUBXI(rs1, imm, rd) f3i(2, rd, 12, rs1, imm)
262 # define SUBXcc(rs1, rs2, rd) f3r(2, rd, 28, rs1, rs2)
263 # define SUBXIcc(rs1, imm, rd) f3i(2, rd, 28, rs1, imm)
264 # define TSUBcc(rs1, rs2, rd) f3r(2, rd, 33, rs1, rs2)
265 # define TDADDIcc(rs1, imm, rd) f3i(2, rd, 33, rs1, imm)
266 # define TSUBccTV(rs1, rs2, rd) f3r(2, rd, 35, rs1, rs2)
267 # define TSUBIccTV(rs1, imm, rd) f3i(2, rd, 35, rs1, imm)
268 # define MULScc(rs1, rs2, rd) f3r(2, rd, 36, rs1, rs2)
269 # define MULSIcc(rs1, imm, rd) f3i(2, rd, 36, rs1, imm)
270 # define UMUL(rs1, rs2, rd) f3r(2, rd, 10, rs1, rs2)
271 # define UMULI(rs1, imm, rd) f3i(2, rd, 10, rs1, imm)
272 # define SMUL(rs1, rs2, rd) f3r(2, rd, 11, rs1, rs2)
273 # define SMULI(rs1, imm, rd) f3i(2, rd, 11, rs1, imm)
274 # define UMULcc(rs1, rs2, rd) f3r(2, rd, 26, rs1, rs2)
275 # define UMULIcc(rs1, imm, rd) f3i(2, rd, 26, rs1, imm)
276 # define SMULcc(rs1, rs2, rd) f3r(2, rd, 27, rs1, rs2)
277 # define SMULIcc(rs1, imm, rd) f3i(2, rd, 27, rs1, imm)
278 # define UDIV(rs1, rs2, rd) f3r(2, rd, 14, rs1, rs2)
279 # define UDIVI(rs1, imm, rd) f3i(2, rd, 14, rs1, imm)
280 # define SDIV(rs1, rs2, rd) f3r(2, rd, 15, rs1, rs2)
281 # define SDIVI(rs1, imm, rd) f3i(2, rd, 15, rs1, imm)
282 # define UDIVcc(rs1, rs2, rd) f3r(2, rd, 30, rs1, rs2)
283 # define UDIVIcc(rs1, imm, rd) f3i(2, rd, 30, rs1, imm)
284 # define SDIVcc(rs1, rs2, rd) f3r(2, rd, 31, rs1, rs2)
285 # define SDIVIcc(rs1, imm, rd) f3i(2, rd, 31, rs1, imm)
286 # if __WORDSIZE == 64
287 # define MULX(rs1, rs2, rd) f3r(2, rd, 9, rs1, rs2)
288 # define MULXI(rs1, imm, rd) f3i(2, rd, 9, rs1, imm)
289 # define SDIVX(rs1, rs2, rd) f3r(2, rd, 45, rs1, rs2)
290 # define SDIVXI(rs1, imm, rd) f3i(2, rd, 45, rs1, imm)
291 # define UDIVX(rs1, rs2, rd) f3r(2, rd, 13, rs1, rs2)
292 # define UDIVXI(rs1, imm, rd) f3i(2, rd, 13, rs1, imm)
294 # define SAVE(rs1, rs2, rd) f3r(2, rd, 60, rs1, rs2)
295 # define SAVEI(rs1, imm, rd) f3i(2, rd, 60, rs1, imm)
296 # define RESTORE(rs1, rs2, rd) f3r(2, rd, 61, rs1, rs2)
297 # define RESTOREI(rs1, imm, rd) f3i(2, rd, 61, rs1, imm)
298 # define SPARC_BA 8 /* always */
299 # define SPARC_BN 0 /* never */
300 # define SPARC_BNE 9 /* not equal - not Z */
301 # define SPARC_BNZ SPARC_BNE
302 # define SPARC_BE 1 /* equal - Z */
303 # define SPARC_BZ SPARC_BE
304 # define SPARC_BG 10 /* greater - not (Z or (N xor V)) */
305 # define SPARC_BLE 2 /* less or equal - Z or (N xor V) */
306 # define SPARC_BGE 11 /* greater or equal - not (N xor V) */
307 # define SPARC_BL 3 /* less - N xor V */
308 # define SPARC_BGU 12 /* greater unsigned - not (C or Z) */
309 # define SPARC_BLEU 4 /* less or equal unsigned - C or Z */
310 # define SPARC_BCC 13 /* carry clear - not C */
311 # define SPARC_BGEU SPARC_BCC
312 # define SPARC_BCS 5 /* carry set - C */
313 # define SPARC_BLU SPARC_BCS
314 # define SPARC_BPOS 14 /* positive - not N */
315 # define SPARC_BNEG 6 /* negative - N */
316 # define SPARC_BVC 15 /* overflow clear - not V */
317 # define SPARC_BVS 7 /* overflow set - V */
318 /* Preferred BPcc integer branch opcodes */
319 # if __WORDSIZE == 64
320 # define SPARC_BPA 8 /* always - 1 */
321 # define SPARC_BPN 0 /* never - 0 */
322 # define SPARC_BPNE 9 /* not equal - not Z */
323 # define SPARC_BPE 1 /* equal - Z */
324 # define SPARC_BPG 10 /* greater - not (Z or (N xor V)) */
325 # define SPARC_BPLE 2 /* less or equal - Z or (N xor V) */
326 # define SPARC_BPGE 11 /* greater or equal - not (N xor V) */
327 # define SPARC_BPL 3 /* less - N xor V */
328 # define SPARC_BPGU 12 /* greater unsigned - not (C or V) */
329 # define SPARC_BPLEU 4 /* less or equal unsigned - C or Z */
330 # define SPARC_BPCC 13 /* carry clear (greater than or equal, unsigned) - not C */
331 # define SPARC_BPCS 5 /* carry set (less than, unsigned) - C */
332 # define SPARC_BPPOS 14 /* positive - not N */
333 # define SPARC_BPNEG 6 /* negative - N */
334 # define SPARC_BPVC 15 /* overflow clear - not V */
335 # define SPARC_BPVS 7 /* overflow set - V */
337 # define B(cc, imm) f2b(0, 0, cc, 2, imm)
338 # define Ba(cc, imm) f2b(0, 1, cc, 2, imm)
339 # define BA(imm) B(SPARC_BA, imm)
340 # define BAa(imm) Ba(SPARC_BA, imm)
341 # define BN(imm) B(SPARC_BN, imm)
342 # define BNa(imm) Ba(SPARC_BN, imm)
343 # define BNE(imm) B(SPARC_BNE, imm)
344 # define BNEa(imm) Ba(SPARC_BNE, imm)
345 # define BNZ(imm) BNE(imm)
346 # define BNZa(imm) BNEa(imm)
347 # define BE(imm) B(SPARC_BE, imm)
348 # define BEa(imm) Ba(SPARC_BE, imm)
349 # define BZ(imm) BE(imm)
350 # define BZa(imm) BEa(imm)
351 # define BG(imm) B(SPARC_BG, imm)
352 # define BGa(imm) Ba(SPARC_BG, imm)
353 # define BLE(imm) B(SPARC_BLE, imm)
354 # define BLEa(imm) Ba(SPARC_BLE, imm)
355 # define BGE(imm) B(SPARC_BGE, imm)
356 # define BGEa(imm) Ba(SPARC_BGE, imm)
357 # define BL(imm) B(SPARC_BL, imm)
358 # define BLa(imm) Ba(SPARC_BL, imm)
359 # define BGU(imm) B(SPARC_BGU, imm)
360 # define BGUa(imm) Ba(SPARC_BGU, imm)
361 # define BLEU(imm) B(SPARC_BLEU, imm)
362 # define BLEUa(imm) Ba(SPARC_BLEU, imm)
363 # define BCC(imm) B(SPARC_BCC, imm)
364 # define BCCa(imm) Ba(SPARC_BCC, imm)
365 # define BGEU(imm) BCC(imm)
366 # define BGEUa(imm) BCCa(imm)
367 # define BCS(imm) B(SPARC_BCS, imm)
368 # define BCSa(imm) Ba(SPARC_BCS, imm)
369 # define BLU(imm) BCS(imm)
370 # define BLUa(imm) BCSa(imm)
371 # define BPOS(imm) B(SPARC_BPOS, imm)
372 # define BPOSa(imm) Ba(SPARC_BPOS, imm)
373 # define BNEG(imm) B(SPARC_BNEG, imm)
374 # define BNEGa(imm) Ba(SPARC_BNEG, imm)
375 # define BVC(imm) B(SPARC_BVC, imm)
376 # define BVCa(imm) Ba(SPARC_BVC, imm)
377 # define BVS(imm) B(SPARC_BVS, imm)
378 # define BVSa(imm) Ba(SPARC_BVS, imm)
379 # if __WORDSIZE == 64
380 # define BPccap(cc,a,cc1, cc2,p,imm) f2bp(0, a, cc, 1, cc1, cc0, p, imm)
381 # define BPap(cc, imm) f2bp(0, 1, cc, 1, 1, 0, p, imm)
382 # define BPa(cc, imm) f2bp(0, 1, cc, 1, 1, 0, 1, imm)
383 # define BP(cc, imm) f2bp(0, 0, cc, 1, 1, 0, 1, imm)
384 # define BPA(imm) BP(SPARC_BPA, imm)
385 # define BPN(imm) BP(SPARC_BPN, imm)
386 # define BNPE(imm) BP(SPARC_BPNE, imm)
387 # define BPE(imm) BP(SPARC_BPE, imm)
388 # define BPG(imm) BP(SPARC_BPG, imm)
389 # define BPLE(imm) BP(SPARC_BPLE, imm)
390 # define BPGE(imm) BP(SPARC_BPGE, imm)
391 # define BPL(imm) BP(SPARC_BPL, imm)
392 # define BPGU(imm) BP(SPARC_BPGU, imm)
393 # define BPLEU(imm) BP(SPARC_BPLEU, imm)
394 # define BPCC(imm) BP(SPARC_BPCC, imm)
395 # define BPCS(imm) BP(SPARC_BPCS, imm)
396 # define BPPOS(imm) BP(SPARC_BPPOS, imm)
397 # define BPNEG(imm) BP(SPARC_BPNEG, imm)
398 # define BPVC(imm) BP(SPARC_BPVC, imm)
399 # define BPVS(imm) BP(SPARC_BPVS, imm)
401 # define SPARC_CBA 8 /* always */
402 # define SPARC_CBN 0 /* never */
403 # define SPARC_CB3 7 /* 3 */
404 # define SPARC_CB2 6 /* 2 */
405 # define SPARC_CB23 5 /* 2 or 3 */
406 # define SPARC_CB1 4 /* 1 */
407 # define SPARC_CB13 3 /* 1 or 3 */
408 # define SPARC_CB12 2 /* 1 or 2 */
409 # define SPARC_CB123 1 /* 1 or 2 or 3 */
410 # define SPARC_CB0 9 /* 0 */
411 # define SPARC_CB03 10 /* 0 or 3 */
412 # define SPARC_CB02 11 /* 0 or 2 */
413 # define SPARC_CB023 12 /* 0 or 2 or 3 */
414 # define SPARC_CB01 13 /* 0 or 1 */
415 # define SPARC_CB013 14 /* 0 or 1 or 3 */
416 # define SPARC_CB012 15 /* 0 or 1 or 2 */
417 # define CB(cc, imm) f2b(0, 0, cc, 7, imm)
418 # define CBa(cc, imm) f2b(0, 1, cc, 7, imm)
419 # define CBA(imm) CB(SPARC_CBA, imm)
420 # define CBAa(imm) CBa(SPARC_CBA, imm)
421 # define CBN(imm) CB(SPARC_CBN, imm)
422 # define CBNa(imm) CBa(SPARC_CBN, imm)
423 # define CB3(imm) CB(SPARC_CB3, imm)
424 # define CB3a(imm) CBa(SPARC_CB3, imm)
425 # define CB2(imm) CB(SPARC_CB2, imm)
426 # define CB2a(imm) CBa(SPARC_CB2, imm)
427 # define CB23(imm) CB(SPARC_CB23, imm)
428 # define CB23a(imm) CBa(SPARC_CB23, imm)
429 # define CB1(imm) CB(SPARC_CB1, imm)
430 # define CB1a(imm) CBa(SPARC_CB1, imm)
431 # define CB13(imm) CB(SPARC_CB13, imm)
432 # define CB13a(imm) CBa(SPARC_CB13, imm)
433 # define CB12(imm) CB(SPARC_CB12, imm)
434 # define CB12a(imm) CBa(SPARC_CB12, imm)
435 # define CB123(imm) CB(SPARC_CB123, imm)
436 # define CB123a(imm) CBa(SPARC_CB123, imm)
437 # define CB0(imm) CB(SPARC_CB0, imm)
438 # define CB0a(imm) CBa(SPARC_CB0, imm)
439 # define CB03(imm) CB(SPARC_CB03, imm)
440 # define CB03a(imm) CBa(SPARC_CB03, imm)
441 # define CB02(imm) CB(SPARC_CB02, imm)
442 # define CB02a(imm) CBa(SPARC_CB02, imm)
443 # define CB023(imm) CB(SPARC_CB103, imm)
444 # define CB023a(imm) CBa(SPARC_CB023, imm)
445 # define CB01(imm) CB(SPARC_CB01, imm)
446 # define CB01a(imm) CBa(SPARC_CB01, imm)
447 # define CB013(imm) CB(SPARC_CB013, imm)
448 # define CB013a(imm) CBa(SPARC_CB013, imm)
449 # define CB012(imm) CB(SPARC_CB012, imm)
450 # define CB012a(imm) CBa(SPARC_CB012, imm)
451 # define CALLI(imm) f1(1, imm)
452 # define CALL(r0) JMPL(_O7_REGNO, r0, 0)
453 # define RETL() JMPLI(0, _O7_REGNO, 8)
454 # define RET() JMPLI(0, _I7_REGNO, 8)
455 # define JMPL(rd, rs1, rs2) f3r(2, rd, 56, rs1, rs2)
456 # define JMPLI(rd, rs1, imm) f3i(2, rd, 56, rs1, imm)
457 # define RETT(rs1, rs2) f3r(2, 0, 57, rs1, rs2)
458 # define RETTI(rs1, imm) f3i(2, 0, 57, rs1, imm)
459 # define SPARC_TA 8 /* always */
460 # define SPARC_TN 0 /* never */
461 # define SPARC_TNE 9 /* not equal - not Z */
462 # define SPARC_TNZ SPARC_BNE
463 # define SPARC_TE 1 /* equal - Z */
464 # define SPARC_TZ SPARC_BE
465 # define SPARC_TG 10 /* greater - not (Z or (N xor V)) */
466 # define SPARC_TLE 2 /* less or equal - Z or (N xor V) */
467 # define SPARC_TGE 11 /* greater or equal - not (N xor V) */
468 # define SPARC_TL 3 /* less - N xor V */
469 # define SPARC_TGU 12 /* greater unsigned - not (C or Z) */
470 # define SPARC_TLEU 4 /* less or equal unsigned - C or Z */
471 # define SPARC_TCC 13 /* carry clear - not C */
472 # define SPARC_TGEU SPARC_BCC
473 # define SPARC_TCS 5 /* carry set - C */
474 # define SPARC_TLU SPARC_BCS
475 # define SPARC_TPOS 14 /* positive - not N */
476 # define SPARC_TNEG 6 /* negative - N */
477 # define SPARC_TVC 15 /* overflow clear - not V */
478 # define SPARC_TVS 7 /* overflow set - V */
479 # define T(cc, rs1, rs2) f3t(cc, rs1, 0, rs2)
480 # define TI(cc, rs1, imm) f3t(cc, rs1, 1, imm)
481 # define TA(rs1, rs2) T(SPARC_TA, rs1, rs2)
482 # define TAI(rs1, imm) TI(SPARC_TA, rs1, imm)
483 # define TN(rs1, rs2) T(SPARC_TN, rs1, rs2)
484 # define TNI(rs1, imm) TI(SPARC_TN, rs1, imm)
485 # define TNE(rs1, rs2) T(SPARC_TNE, rs1, rs2)
486 # define TNEI(rs1, imm) TI(SPARC_TNE, rs1, imm)
487 # define TNZ(rs1, rs2) TNE(rs1, rs2)
488 # define TNZI(rs1, imm) TNEI(rs1, imm)
489 # define TE(rs1, rs2) T(SPARC_TE, rs1, rs2)
490 # define TEI(rs1, imm) TI(SPARC_TE, rs1, imm)
491 # define TZ(rs1, rs2) TE(rs1, rs2)
492 # define TZI(rs1, imm) TEI(rs1, imm)
493 # define TG(rs1, rs2) T(SPARC_TG, rs1, rs2)
494 # define TGI(rs1, imm) TI(SPARC_TG, rs1, imm)
495 # define TLE(rs1, rs2) T(SPARC_TLE, rs1, rs2)
496 # define TLEI(rs1, imm) TI(SPARC_TLE, rs1, imm)
497 # define TGE(rs1, rs2) T(SPARC_TGE, rs1, rs2)
498 # define TGEI(rs1, imm) TI(SPARC_TGE, rs1, imm)
499 # define TL(rs1, rs2) T(SPARC_TL, rs1, rs2)
500 # define TLI(rs1, imm) TI(SPARC_TL, rs1, imm)
501 # define TGU(rs1, rs2) T(SPARC_TGU, rs1, rs2)
502 # define TGUI(rs1, imm) TI(SPARC_TGU, rs1, imm)
503 # define TLEU(rs1, rs2) T(SPARC_TLEU, rs1, rs2)
504 # define TLEUI(rs1, imm) TI(SPARC_TLEU, rs1, imm)
505 # define TCC(rs1, rs2) T(SPARC_TCC, rs1, rs2)
506 # define TCCI(rs1, imm) TI(SPARC_TCC, rs1, imm)
507 # define TGEU(rs1, rs2) TCC(rs1, rs2)
508 # define TGEUI(rs1, imm) TCCI(rs1, imm)
509 # define TCS(rs1, rs2) T(SPARC_TCC, rs1, rs2)
510 # define TCSI(rs1, imm) TI(SPARC_TCC, rs1, imm)
511 # define TLU(rs1, rs2) TCS(rs1, rs2)
512 # define TLUI(rs1, imm) TCSI(rs1, imm)
513 # define TPOS(rs1, rs2) T(SPARC_TPOS, rs1, rs2)
514 # define TPOSI(rs1, imm) TI(SPARC_TPOS, rs1, imm)
515 # define TNEG(rs1, rs2) T(SPARC_TNEG, rs1, rs2)
516 # define TNEGI(rs1, imm) TI(SPARC_TNEG, rs1, imm)
517 # define TVC(rs1, rs2) T(SPARC_TVC, rs1, rs2)
518 # define TVCI(rs1, imm) TI(SPARC_TVC, rs1, imm)
519 # define TVS(rs1, rs2) T(SPARC_TVS, rs1, rs2)
520 # define TVSI(rs1, imm) TI(SPARC_TVS, rs1, imm)
521 # define RDY(rd) f3r(2, rd, 40, 0, 0)
522 # define RDASR(rs1, rd) f3r(2, rd, 40, rs1, 0)
523 # define RDPSR(rd) f3r(2, rd, 41, 0, 0)
524 # define RDWIM(rd) f3r(2, rd, 42, 0, 0)
525 # define RDTBR(rd) f3r(2, rd, 43, 0, 0)
526 # define WRY(rs1, rs2) f3r(2, 0, 48, rs1, rs2)
527 # define WRYI(rs1, imm) f3i(2, 0, 48, rs1, imm)
528 # define WRASR(rs1, rs2, rd) f3r(2, rd, 48, rs1, rs2)
529 # define WRASRI(rs1, imm, rd) f3i(2, rd, 48, rs1, imm)
530 # define WRPSR(rs1, rs2, rd) f3r(2, rd, 49, rs1, rs2)
531 # define WRPSRI(rs1, imm, rd) f3i(2, rd, 49, rs1, imm)
532 # define WRWIM(rs1, rs2, rd) f3r(2, rd, 50, rs1, rs2)
533 # define WRWIMI(rs1, imm, rd) f3i(2, rd, 50, rs1, imm)
534 # define WRTBR(rs1, rs2, rd) f3r(2, rd, 51, rs1, rs2)
535 # define WRTBRI(rs1, imm, rd) f3i(2, rd, 51, rs1, imm)
536 # define STBAR() f3i(2, 0, 40, 15, 0)
537 # define UNIMP(imm) f2r(0, 0, 0, imm)
538 # define FLUSH(rs1, rs2) f3r(2, 0, 59, rs1, rs2)
539 # define FLUSHI(rs1, im) f3i(2, 0, 59, rs1, imm)
540 # define nop(i0) _nop(_jit, i0)
541 static void _nop(jit_state_t*, jit_int32_t);
542 # define movr(r0, r1) _movr(_jit, r0, r1)
543 static void _movr(jit_state_t*, jit_int32_t, jit_int32_t);
544 # define movi(r0, i0) _movi(_jit, r0, i0)
545 static void _movi(jit_state_t*, jit_int32_t, jit_word_t);
546 # define movi_p(r0, i0) _movi_p(_jit, r0, i0)
547 static jit_word_t _movi_p(jit_state_t*, jit_int32_t, jit_word_t);
548 # define bswapr_us(r0, r1) generic_bswapr_us(_jit, r0, r1)
549 # define bswapr_ui(r0, r1) generic_bswapr_ui(_jit, r0, r1)
550 # define bswapr_ul(r0, r1) generic_bswapr_ul(_jit, r0, r1)
551 # define movnr(r0,r1,r2) _movnr(_jit,r0,r1,r2)
552 static void _movnr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
553 # define movzr(r0,r1,r2) _movzr(_jit,r0,r1,r2)
554 static void _movzr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
555 # define casx(r0, r1, r2, r3, i0) _casx(_jit, r0, r1, r2, r3, i0)
556 static void _casx(jit_state_t *_jit,jit_int32_t,jit_int32_t,
557 jit_int32_t,jit_int32_t,jit_word_t);
558 #define casr(r0, r1, r2, r3) casx(r0, r1, r2, r3, 0)
559 #define casi(r0, i0, r1, r2) casx(r0, _NOREG, r1, r2, i0)
560 # define comr(r0, r1) XNOR(r1, 0, r0)
561 # define negr(r0, r1) NEG(r1, r0)
562 # define addr(r0, r1, r2) ADD(r1, r2, r0)
563 # define addi(r0, r1, i0) _addi(_jit, r0, r1, i0)
564 static void _addi(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
565 # if __WORDSIZE == 32
566 # define addcr(r0, r1, r2) ADDcc(r1, r2, r0)
568 # define addcr(r0, r1, r2) _addcr(_jit, r0, r1, r2)
569 static void _addcr(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
571 # define addci(r0, r1, i0) _addci(_jit, r0, r1, i0)
572 static void _addci(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
573 # if __WORDSIZE == 32
574 # define addxr(r0, r1, r2) ADDXcc(r1, r2, r0)
576 # define addxr(r0, r1, r2) _addxr(_jit, r0, r1, r2)
577 static void _addxr(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
579 # define addxi(r0, r1, i0) _addxi(_jit, r0, r1, i0)
580 static void _addxi(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
581 # define subr(r0, r1, r2) SUB(r1, r2, r0)
582 # define subi(r0, r1, i0) _subi(_jit, r0, r1, i0)
583 static void _subi(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
584 # if __WORDSIZE == 32
585 # define subcr(r0, r1, r2) SUBcc(r1, r2, r0)
587 # define subcr(r0, r1, r2) _subcr(_jit, r0, r1, r2)
588 static void _subcr(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
590 # define subci(r0, r1, i0) _subci(_jit, r0, r1, i0)
591 static void _subci(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
592 # if __WORDSIZE == 32
593 # define subxr(r0, r1, r2) SUBXcc(r1, r2, r0)
595 # define subxr(r0, r1, r2) _subxr(_jit, r0, r1, r2)
596 static void _subxr(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
598 # define subxi(r0, r1, i0) _subxi(_jit, r0, r1, i0)
599 static void _subxi(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
600 # define rsbi(r0, r1, i0) _rsbi(_jit, r0, r1, i0)
601 static void _rsbi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
602 # if __WORDSIZE == 32
603 # define mulr(r0, r1, r2) UMUL(r1, r2, r0)
605 # define mulr(r0, r1, r2) MULX(r1, r2, r0)
607 # define muli(r0, r1, i0) _muli(_jit, r0, r1, i0)
608 static void _muli(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
609 # if __WORDSIZE == 32
610 # define qmulr(r0,r1,r2,r3) iqmulr(r0,r1,r2,r3,1)
611 # define qmulr_u(r0,r1,r2,r3) iqmulr(r0,r1,r2,r3,0)
612 # define iqmulr(r0,r1,r2,r3,cc) _iqmulr(_jit,r0,r1,r2,r3,cc)
613 static void _iqmulr(jit_state_t*,jit_int32_t,jit_int32_t,
614 jit_int32_t,jit_int32_t,jit_bool_t);
615 # define qmuli(r0,r1,r2,i0) iqmuli(r0,r1,r2,i0,1)
616 # define qmuli_u(r0,r1,r2,i0) iqmuli(r0,r1,r2,i0,0)
617 # define iqmuli(r0,r1,r2,i0,cc) _iqmuli(_jit,r0,r1,r2,i0,cc)
618 static void _iqmuli(jit_state_t*,jit_int32_t,jit_int32_t,
619 jit_int32_t,jit_word_t,jit_bool_t);
621 # define qmulr(r0,r1,r2,r3) _qmulr(_jit,r0,r1,r2,r3)
622 static void _qmulr(jit_state_t*,jit_int32_t,jit_int32_t,
623 jit_int32_t,jit_int32_t);
624 # define qmuli(r0,r1,r2,i0) _qmuli(_jit,r0,r1,r2,i0)
625 static void _qmuli(jit_state_t*,jit_int32_t,jit_int32_t,
626 jit_int32_t,jit_word_t);
627 # define qmulr_u(r0,r1,r2,r3) _qmulr_u(_jit,r0,r1,r2,r3)
628 static void _qmulr_u(jit_state_t*,jit_int32_t,jit_int32_t,
629 jit_int32_t,jit_int32_t);
630 # define qmuli_u(r0,r1,r2,i0) _qmuli_u(_jit,r0,r1,r2,i0)
631 static void _qmuli_u(jit_state_t*,jit_int32_t,jit_int32_t,
632 jit_int32_t,jit_word_t);
634 # define divr(r0, r1, r2) _divr(_jit, r0, r1, r2)
635 static void _divr(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
636 # define divi(r0, r1, i0) _divi(_jit, r0, r1, i0)
637 static void _divi(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
638 # define divr_u(r0, r1, r2) _divr_u(_jit, r0, r1, r2)
639 static void _divr_u(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
640 # define divi_u(r0, r1, i0) _divi_u(_jit, r0, r1, i0)
641 static void _divi_u(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
642 # define qdivr(r0,r1,r2,r3) iqdivr(r0,r1,r2,r3,1)
643 # define qdivr_u(r0,r1,r2,r3) iqdivr(r0,r1,r2,r3,0)
644 # define iqdivr(r0,r1,r2,r3,cc) _iqdivr(_jit,r0,r1,r2,r3,cc)
645 static void _iqdivr(jit_state_t*,jit_int32_t,jit_int32_t,
646 jit_int32_t,jit_int32_t,jit_bool_t);
647 # define qdivi(r0,r1,r2,i0) iqdivi(r0,r1,r2,i0,1)
648 # define qdivi_u(r0,r1,r2,i0) iqdivi(r0,r1,r2,i0,0)
649 # define iqdivi(r0,r1,r2,i0,cc) _iqdivi(_jit,r0,r1,r2,i0,cc)
650 static void _iqdivi(jit_state_t*,jit_int32_t,jit_int32_t,
651 jit_int32_t,jit_word_t,jit_bool_t);
652 # define remr(r0, r1, r2) _remr(_jit, r0, r1, r2)
653 static void _remr(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
654 # define remi(r0, r1, i0) _remi(_jit, r0, r1, i0)
655 static void _remi(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
656 # define remr_u(r0, r1, r2) _remr_u(_jit, r0, r1, r2)
657 static void _remr_u(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
658 # define remi_u(r0, r1, i0) _remi_u(_jit, r0, r1, i0)
659 static void _remi_u(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
660 # define andr(r0, r1, r2) AND(r1, r2, r0)
661 # define andi(r0, r1, i0) _andi(_jit, r0, r1, i0)
662 static void _andi(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
663 # define orr(r0, r1, r2) OR(r1, r2, r0)
664 # define ori(r0, r1, i0) _ori(_jit, r0, r1, i0)
665 static void _ori(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
666 # define xorr(r0, r1, r2) XOR(r1, r2, r0)
667 # define xori(r0, r1, i0) _xori(_jit, r0, r1, i0)
668 static void _xori(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
669 # if __WORDSIZE == 32
670 # define lshr(r0, r1, r2) SLL(r1, r2, r0)
671 # define lshi(r0, r1, i0) SLLI(r1, i0, r0)
672 # define rshr(r0, r1, r2) SRA(r1, r2, r0)
673 # define rshi(r0, r1, i0) SRAI(r1, i0, r0)
674 # define rshr_u(r0, r1, r2) SRL(r1, r2, r0)
675 # define rshi_u(r0, r1, i0) SRLI(r1, i0, r0)
677 # define lshr(r0, r1, r2) SLLX(r1, r2, r0)
678 # define lshi(r0, r1, i0) SLLXI(r1, i0, r0)
679 # define rshr(r0, r1, r2) SRAX(r1, r2, r0)
680 # define rshi(r0, r1, i0) SRAXI(r1, i0, r0)
681 # define rshr_u(r0, r1, r2) SRLX(r1, r2, r0)
682 # define rshi_u(r0, r1, i0) SRLXI(r1, i0, r0)
684 # define extr_c(r0,r1) _extr_c(_jit,r0,r1)
685 static void _extr_c(jit_state_t*,jit_int32_t,jit_int32_t);
686 # define extr_uc(r0,r1) andi(r0, r1, 0xff)
687 # define extr_s(r0,r1) _extr_s(_jit,r0,r1)
688 static void _extr_s(jit_state_t*,jit_int32_t,jit_int32_t);
689 # define extr_us(r0,r1) _extr_us(_jit,r0,r1)
690 static void _extr_us(jit_state_t*,jit_int32_t,jit_int32_t);
691 # if __WORDSIZE == 64
692 # define extr_i(r0,r1) _extr_i(_jit,r0,r1)
693 static void _extr_i(jit_state_t*,jit_int32_t,jit_int32_t);
694 # define extr_ui(r0,r1) _extr_ui(_jit,r0,r1)
695 static void _extr_ui(jit_state_t*,jit_int32_t,jit_int32_t);
697 # define cr(cc, r0, r1, r2) _cr(_jit, cc, r0, r1, r2)
698 static void _cr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t);
699 # define cw(cc, r0, r1, i0) _cw(_jit, cc, r0, r1, i0)
700 static void _cw(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t,jit_word_t);
701 # if __WORDSIZE == 32
702 # define ltr(r0, r1, r2) cr(SPARC_BL, r0, r1, r2)
703 # define lti(r0, r1, i0) cw(SPARC_BL, r0, r1, i0)
704 # define ltr_u(r0, r1, r2) cr(SPARC_BLU, r0, r1, r2)
705 # define lti_u(r0, r1, i0) cw(SPARC_BLU, r0, r1, i0)
706 # define ler(r0, r1, r2) cr(SPARC_BLE, r0, r1, r2)
707 # define lei(r0, r1, i0) cw(SPARC_BLE, r0, r1, i0)
708 # define ler_u(r0, r1, r2) cr(SPARC_BLEU, r0, r1, r2)
709 # define lei_u(r0, r1, i0) cw(SPARC_BLEU, r0, r1, i0)
710 # define eqr(r0, r1, r2) cr(SPARC_BE, r0, r1, r2)
711 # define eqi(r0, r1, i0) cw(SPARC_BE, r0, r1, i0)
712 # define ger(r0, r1, r2) cr(SPARC_BGE, r0, r1, r2)
713 # define gei(r0, r1, i0) cw(SPARC_BGE, r0, r1, i0)
714 # define ger_u(r0, r1, r2) cr(SPARC_BGEU, r0, r1, r2)
715 # define gei_u(r0, r1, i0) cw(SPARC_BGEU, r0, r1, i0)
716 # define gtr(r0, r1, r2) cr(SPARC_BG, r0, r1, r2)
717 # define gti(r0, r1, i0) cw(SPARC_BG, r0, r1, i0)
718 # define gtr_u(r0, r1, r2) cr(SPARC_BGU, r0, r1, r2)
719 # define gti_u(r0, r1, i0) cw(SPARC_BGU, r0, r1, i0)
720 # define ner(r0, r1, r2) cr(SPARC_BNE, r0, r1, r2)
721 # define nei(r0, r1, i0) cw(SPARC_BNE, r0, r1, i0)
723 # define ltr(r0, r1, r2) cr(SPARC_BPL, r0, r1, r2)
724 # define lti(r0, r1, i0) cw(SPARC_BPL, r0, r1, i0)
725 # define ltr_u(r0, r1, r2) cr(SPARC_BPCS, r0, r1, r2)
726 # define lti_u(r0, r1, i0) cw(SPARC_BPCS, r0, r1, i0)
727 # define ler(r0, r1, r2) cr(SPARC_BPLE, r0, r1, r2)
728 # define lei(r0, r1, i0) cw(SPARC_BPLE, r0, r1, i0)
729 # define ler_u(r0, r1, r2) cr(SPARC_BPLEU, r0, r1, r2)
730 # define lei_u(r0, r1, i0) cw(SPARC_BPLEU, r0, r1, i0)
731 # define eqr(r0, r1, r2) cr(SPARC_BPE, r0, r1, r2)
732 # define eqi(r0, r1, i0) cw(SPARC_BPE, r0, r1, i0)
733 # define ger(r0, r1, r2) cr(SPARC_BPGE, r0, r1, r2)
734 # define gei(r0, r1, i0) cw(SPARC_BPGE, r0, r1, i0)
735 # define ger_u(r0, r1, r2) cr(SPARC_BPCC, r0, r1, r2)
736 # define gei_u(r0, r1, i0) cw(SPARC_BPCC, r0, r1, i0)
737 # define gtr(r0, r1, r2) cr(SPARC_BPG, r0, r1, r2)
738 # define gti(r0, r1, i0) cw(SPARC_BPG, r0, r1, i0)
739 # define gtr_u(r0, r1, r2) cr(SPARC_BPGU, r0, r1, r2)
740 # define gti_u(r0, r1, i0) cw(SPARC_BPGU, r0, r1, i0)
741 # define ner(r0, r1, r2) cr(SPARC_BPNE, r0, r1, r2)
742 # define nei(r0, r1, i0) cw(SPARC_BPNE, r0, r1, i0)
744 # define ldr_c(r0, r1) LDSB(r1, 0, r0)
745 # define ldi_c(r0, i0) _ldi_c(_jit, r0, i0)
746 static void _ldi_c(jit_state_t*,jit_int32_t,jit_word_t);
747 # define ldr_uc(r0, r1) LDUB(r1, 0, r0)
748 # define ldi_uc(r0, i0) _ldi_uc(_jit, r0, i0)
749 static void _ldi_uc(jit_state_t*,jit_int32_t,jit_word_t);
750 # define ldr_s(r0, r1) LDSH(r1, 0, r0)
751 # define ldi_s(r0, i0) _ldi_s(_jit, r0, i0)
752 static void _ldi_s(jit_state_t*,jit_int32_t,jit_word_t);
753 # define ldr_us(r0, r1) LDUH(r1, 0, r0)
754 # define ldi_us(r0, i0) _ldi_us(_jit, r0, i0)
755 static void _ldi_us(jit_state_t*,jit_int32_t,jit_word_t);
756 # if __WORDSIZE == 32
757 # define ldr_i(r0, r1) LD(r1, 0, r0)
758 # define ldr(u, v) ldr_i(u, v)
759 # define ldi(u, v) ldi_i(u, v)
761 # define ldr_i(r0, r1) LDSW(r1, 0, r0)
762 # define ldr_ui(r0, r1) LDUW(r1, 0, r0)
763 # define ldr_l(r0, r1) LDX(r1, 0, r0)
764 # define ldr(u, v) ldr_l(u, v)
765 # define ldi(u, v) ldi_l(u, v)
767 # define ldi_i(r0, i0) _ldi_i(_jit, r0, i0)
768 static void _ldi_i(jit_state_t*,jit_int32_t,jit_word_t);
769 # if __WORDSIZE == 64
770 # define ldi_ui(r0, i0) _ldi_ui(_jit, r0, i0)
771 static void _ldi_ui(jit_state_t*,jit_int32_t,jit_word_t);
772 # define ldi_l(r0, i0) _ldi_l(_jit, r0, i0)
773 static void _ldi_l(jit_state_t*,jit_int32_t,jit_word_t);
775 # define ldxr_c(r0, r1, r2) LDSB(r1, r2, r0)
776 # define ldxi_c(r0, r1, i0) _ldxi_c(_jit, r0, r1, i0)
777 static void _ldxi_c(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
778 # define ldxr_uc(r0, r1, r2) LDUB(r1, r2, r0)
779 # define ldxi_uc(r0, r1, i0) _ldxi_uc(_jit, r0, r1, i0)
780 static void _ldxi_uc(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
781 # define ldxr_s(r0, r1, r2) LDSH(r1, r2, r0)
782 # define ldxi_s(r0, r1, i0) _ldxi_s(_jit, r0, r1, i0)
783 static void _ldxi_s(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
784 # define ldxr_us(r0, r1, r2) LDUH(r1, r2, r0)
785 # define ldxi_us(r0, r1, i0) _ldxi_us(_jit, r0, r1, i0)
786 static void _ldxi_us(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
787 # if __WORDSIZE == 32
788 # define ldxr(u, v, w) ldxr_i(u, v, w)
789 # define ldxr_i(r0, r1, r2) LD(r1, r2, r0)
790 # define ldxi(u, v, w) ldxi_i(u, v, w)
792 # define ldxr(u, v, w) ldxr_l(u, v, w)
793 # define ldxr_i(r0, r1, r2) LDSW(r1, r2, r0)
794 # define ldxr_ui(r0, r1, r2) LDUW(r1, r2, r0)
795 # define ldxr_l(r0, r1, r2) LDX(r1, r2, r0)
796 # define ldxi(u, v, w) ldxi_l(u, v, w)
798 # define ldxi_i(r0, r1, i0) _ldxi_i(_jit, r0, r1, i0)
799 static void _ldxi_i(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
800 # if __WORDSIZE == 64
801 # define ldxi_ui(r0, r1, i0) _ldxi_ui(_jit, r0, r1, i0)
802 static void _ldxi_ui(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
803 # define ldxi_l(r0, r1, i0) _ldxi_l(_jit, r0, r1, i0)
804 static void _ldxi_l(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
806 # define str_c(r0, r1) STB(r1, r0, 0)
807 # define sti_c(i0, r0) _sti_c(_jit, i0, r0)
808 static void _sti_c(jit_state_t*,jit_word_t,jit_int32_t);
809 # define str_s(r0, r1) STH(r1, r0, 0)
810 # define sti_s(i0, r0) _sti_s(_jit, i0, r0)
811 static void _sti_s(jit_state_t*,jit_word_t,jit_int32_t);
812 # if __WORDSIZE == 32
813 # define str(u, v) str_i(u, v)
814 # define str_i(r0, r1) STI(r1, r0, 0)
815 # define sti(u, v) sti_i(u, v)
817 # define str(u, v) str_l(u, v)
818 # define str_i(r0, r1) STW(r1, r0, 0)
819 # define str_l(r0, r1) STX(r1, r0, 0)
820 # define sti(u, v) sti_l(u, v)
822 # define sti_i(i0, r0) _sti_i(_jit, i0, r0)
823 static void _sti_i(jit_state_t*,jit_word_t,jit_int32_t);
824 # if __WORDSIZE == 64
825 # define sti_l(i0, r0) _sti_l(_jit, i0, r0)
826 static void _sti_l(jit_state_t*,jit_word_t,jit_int32_t);
828 # define stxr_c(r0, r1, r2) STB(r2, r1, r0)
829 # define stxi_c(i0, r0, r1) _stxi_c(_jit, i0, r0, r1)
830 static void _stxi_c(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
831 # define stxr_s(r0, r1, r2) STH(r2, r1, r0)
832 # define stxi_s(i0, r0, r1) _stxi_s(_jit, i0, r0, r1)
833 static void _stxi_s(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
834 # if __WORDSIZE == 32
835 # define stxr(u, v, w) stxr_i(u, v, w)
836 # define stxr_i(r0, r1, r2) ST(r2, r1, r0)
837 # define stxi(u, v, w) stxi_i(u, v, w)
839 # define stxr(u, v, w) stxr_l(u, v, w)
840 # define stxr_i(r0, r1, r2) STW(r2, r1, r0)
841 # define stxi(u, v, w) stxi_l(u, v, w)
842 # define stxr_l(r0, r1, r2) STX(r2, r1, r0)
844 # define stxi_i(i0, r0, r1) _stxi_i(_jit, i0, r0, r1)
845 static void _stxi_i(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
846 # if __WORDSIZE == 64
847 # define stxi_l(i0, r0, r1) _stxi_l(_jit, i0, r0, r1)
848 static void _stxi_l(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
850 # define br(cc, i0, r0, r1) _br(_jit, cc, i0, r0, r1)
852 _br(jit_state_t*,jit_int32_t,jit_word_t,jit_int32_t,jit_int32_t);
853 # define bw(cc, i0, r0, i1) _bw(_jit, cc, i0, r0, i1)
855 _bw(jit_state_t*,jit_int32_t,jit_word_t,jit_int32_t,jit_word_t);
856 # if __WORDSIZE == 32
857 # define bltr(i0, r0, r1) br(SPARC_BL, i0, r0, r1)
858 # define blti(i0, r0, i1) bw(SPARC_BL, i0, r0, i1)
859 # define bltr_u(i0, r0, r1) br(SPARC_BLU, i0, r0, r1)
860 # define blti_u(i0, r0, i1) bw(SPARC_BLU, i0, r0, i1)
861 # define bler(i0, r0, r1) br(SPARC_BLE, i0, r0, r1)
862 # define blei(i0, r0, i1) bw(SPARC_BLE, i0, r0, i1)
863 # define bler_u(i0, r0, r1) br(SPARC_BLEU, i0, r0, r1)
864 # define blei_u(i0, r0, i1) bw(SPARC_BLEU, i0, r0, i1)
865 # define beqr(i0, r0, r1) br(SPARC_BE, i0, r0, r1)
866 # define beqi(i0, r0, i1) bw(SPARC_BE, i0, r0, i1)
867 # define bger(i0, r0, r1) br(SPARC_BGE, i0, r0, r1)
868 # define bgei(i0, r0, i1) bw(SPARC_BGE, i0, r0, i1)
869 # define bger_u(i0, r0, r1) br(SPARC_BGEU, i0, r0, r1)
870 # define bgei_u(i0, r0, i1) bw(SPARC_BGEU, i0, r0, i1)
871 # define bgtr(i0, r0, r1) br(SPARC_BG, i0, r0, r1)
872 # define bgti(i0, r0, i1) bw(SPARC_BG, i0, r0, i1)
873 # define bgtr_u(i0, r0, r1) br(SPARC_BGU, i0, r0, r1)
874 # define bgti_u(i0, r0, i1) bw(SPARC_BGU, i0, r0, i1)
875 # define bner(i0, r0, r1) br(SPARC_BNE, i0, r0, r1)
876 # define bnei(i0, r0, i1) bw(SPARC_BNE, i0, r0, i1)
878 # define bltr(i0, r0, r1) br(SPARC_BPL, i0, r0, r1)
879 # define blti(i0, r0, i1) bw(SPARC_BPL, i0, r0, i1)
880 # define bltr_u(i0, r0, r1) br(SPARC_BPCS, i0, r0, r1)
881 # define blti_u(i0, r0, i1) bw(SPARC_BPCS, i0, r0, i1)
882 # define bler(i0, r0, r1) br(SPARC_BPLE, i0, r0, r1)
883 # define blei(i0, r0, i1) bw(SPARC_BPLE, i0, r0, i1)
884 # define bler_u(i0, r0, r1) br(SPARC_BPLEU, i0, r0, r1)
885 # define blei_u(i0, r0, i1) bw(SPARC_BPLEU, i0, r0, i1)
886 # define beqr(i0, r0, r1) br(SPARC_BPE, i0, r0, r1)
887 # define beqi(i0, r0, i1) bw(SPARC_BPE, i0, r0, i1)
888 # define bger(i0, r0, r1) br(SPARC_BPGE, i0, r0, r1)
889 # define bgei(i0, r0, i1) bw(SPARC_BPGE, i0, r0, i1)
890 # define bger_u(i0, r0, r1) br(SPARC_BPCC, i0, r0, r1)
891 # define bgei_u(i0, r0, i1) bw(SPARC_BPCC, i0, r0, i1)
892 # define bgtr(i0, r0, r1) br(SPARC_BPG, i0, r0, r1)
893 # define bgti(i0, r0, i1) bw(SPARC_BPG, i0, r0, i1)
894 # define bgtr_u(i0, r0, r1) br(SPARC_BPGU, i0, r0, r1)
895 # define bgti_u(i0, r0, i1) bw(SPARC_BPGU, i0, r0, i1)
896 # define bner(i0, r0, r1) br(SPARC_BPNE, i0, r0, r1)
897 # define bnei(i0, r0, i1) bw(SPARC_BPNE, i0, r0, i1)
899 # define b_asr(jif,add,sgn,i0,r0,r1) _b_asr(_jit,jif,add,sgn,i0,r0,r1)
901 _b_asr(jit_state_t*,jit_bool_t,jit_bool_t,jit_bool_t,
902 jit_word_t,jit_int32_t,jit_int32_t);
903 # define b_asw(jif,add,sgn,i0,r0,i1) _b_asw(_jit,jif,add,sgn,i0,r0,i1)
905 _b_asw(jit_state_t*,jit_bool_t,jit_bool_t,jit_bool_t,
906 jit_word_t,jit_int32_t,jit_word_t);
907 # define boaddr(i0, r0, r1) b_asr(1, 1, 1, i0, r0, r1)
908 # define boaddi(i0, r0, i1) b_asw(1, 1, 1, i0, r0, i1)
909 # define boaddr_u(i0, r0, r1) b_asr(1, 1, 0, i0, r0, r1)
910 # define boaddi_u(i0, r0, i1) b_asw(1, 1, 0, i0, r0, i1)
911 # define bxaddr(i0, r0, r1) b_asr(0, 1, 1, i0, r0, r1)
912 # define bxaddi(i0, r0, i1) b_asw(0, 1, 1, i0, r0, i1)
913 # define bxaddr_u(i0, r0, r1) b_asr(0, 1, 0, i0, r0, r1)
914 # define bxaddi_u(i0, r0, i1) b_asw(0, 1, 0, i0, r0, i1)
915 # define bosubr(i0, r0, r1) b_asr(1, 0, 1, i0, r0, r1)
916 # define bosubi(i0, r0, i1) b_asw(1, 0, 1, i0, r0, i1)
917 # define bosubr_u(i0, r0, r1) b_asr(1, 0, 0, i0, r0, r1)
918 # define bosubi_u(i0, r0, i1) b_asw(1, 0, 0, i0, r0, i1)
919 # define bxsubr(i0, r0, r1) b_asr(0, 0, 1, i0, r0, r1)
920 # define bxsubi(i0, r0, i1) b_asw(0, 0, 1, i0, r0, i1)
921 # define bxsubr_u(i0, r0, r1) b_asr(0, 0, 0, i0, r0, r1)
922 # define bxsubi_u(i0, r0, i1) b_asw(0, 0, 0, i0, r0, i1)
923 # define bm_r(set, i0, r0, r1) _bm_r(_jit,set,i0,r0,r1)
925 _bm_r(jit_state_t*,jit_bool_t,jit_word_t,jit_int32_t,jit_int32_t);
926 # define bm_w(set,i0,r0,i1) _bm_w(_jit,set,i0,r0,i1)
928 _bm_w(jit_state_t*,jit_bool_t,jit_word_t,jit_int32_t,jit_word_t);
929 # define bmsr(i0, r0, r1) bm_r(1, i0, r0, r1)
930 # define bmsi(i0, r0, i1) bm_w(1, i0, r0, i1)
931 # define bmcr(i0, r0, r1) bm_r(0, i0, r0, r1)
932 # define bmci(i0, r0, i1) bm_w(0, i0, r0, i1)
933 # define jmpr(r0) _jmpr(_jit, r0)
934 static void _jmpr(jit_state_t*,jit_int32_t);
935 # define jmpi(i0) _jmpi(_jit, i0)
936 static void _jmpi(jit_state_t*,jit_word_t);
937 # define jmpi_p(i0) _jmpi_p(_jit, i0)
938 static jit_word_t _jmpi_p(jit_state_t*,jit_word_t);
939 # define callr(r0) _callr(_jit, r0)
940 static void _callr(jit_state_t*,jit_int32_t);
941 # define calli(i0) _calli(_jit, i0)
942 static void _calli(jit_state_t*,jit_word_t);
943 # define calli_p(i0) _calli_p(_jit, i0)
944 static jit_word_t _calli_p(jit_state_t*,jit_word_t);
945 # define prolog(node) _prolog(_jit, node)
946 static void _prolog(jit_state_t*,jit_node_t*);
947 # define epilog(node) _epilog(_jit, node)
948 static void _epilog(jit_state_t*,jit_node_t*);
949 #define vastart(r0) _vastart(_jit, r0)
950 static void _vastart(jit_state_t*, jit_int32_t);
951 #define vaarg(r0, r1) _vaarg(_jit, r0, r1)
952 static void _vaarg(jit_state_t*, jit_int32_t, jit_int32_t);
953 #define patch_at(jump, label) _patch_at(_jit, jump, label)
954 static void _patch_at(jit_state_t*,jit_word_t,jit_word_t);
959 _f2r(jit_state_t *_jit,
960 jit_int32_t op, jit_int32_t rd, jit_int32_t op2, jit_int32_t imm22)
963 assert(!(op & 0xfffffffc));
964 assert(!(rd & 0xffffffe0));
965 assert(!(op2 & 0xfffffff8));
966 assert(s22_p(imm22));
975 _f2b(jit_state_t *_jit,
976 jit_int32_t op, jit_int32_t a, jit_int32_t cond, jit_int32_t op2,
980 assert(!(op & 0xfffffffc));
981 assert(!(a & 0xfffffffe));
982 assert(!(cond & 0xfffffff0));
983 assert(!(op2 & 0xfffffff8));
984 assert(s22_p(disp22));
993 # if __WORDSIZE == 64
995 _f2bp(jit_state_t *_jit,
996 jit_int32_t op, jit_int32_t a, jit_int32_t cond, jit_int32_t op2,
997 jit_int32_t cc1, jit_int32_t cc0, jit_int32_t p, jit_int32_t disp19)
1000 assert(!(op & 0xfffffffc));
1001 assert(!(a & 0xfffffffe));
1002 assert(!(cond & 0xfffffff0));
1003 assert(!(op2 & 0xfffffff8));
1004 assert(s19_p(disp19));
1012 v.disp19.b = disp19;
1018 _f3r(jit_state_t *_jit, jit_int32_t op, jit_int32_t rd,
1019 jit_int32_t op3, jit_int32_t rs1, jit_int32_t rs2)
1022 assert(!(op & 0xfffffffc));
1023 assert(!(rd & 0xffffffe0));
1024 assert(!(op3 & 0xffffffc0));
1025 assert(!(rs1 & 0xffffffe0));
1026 assert(!(rs2 & 0xffffffe0));
1037 # if __WORDSIZE == 64
1039 _f3rx(jit_state_t *_jit, jit_int32_t op, jit_int32_t rd,
1040 jit_int32_t op3, jit_int32_t rs1, jit_int32_t rs2)
1043 assert(!(op & 0xfffffffc));
1044 assert(!(rd & 0xffffffe0));
1045 assert(!(op3 & 0xffffffc0));
1046 assert(!(rs1 & 0xffffffe0));
1047 assert(!(rs2 & 0xffffffe0));
1060 _f3s(jit_state_t *_jit, jit_int32_t op, jit_int32_t rd,
1061 jit_int32_t op3, jit_int32_t rs1, jit_int32_t shim)
1064 assert(!(op & 0xfffffffc));
1065 assert(!(rd & 0xffffffe0));
1066 assert(!(op3 & 0xffffffc0));
1067 assert(!(rs1 & 0xffffffe0));
1068 assert(!(shim & 0xffffffc0));
1082 _f3i(jit_state_t *_jit, jit_int32_t op, jit_int32_t rd,
1083 jit_int32_t op3, jit_int32_t rs1, jit_int32_t simm13)
1086 assert(!(op & 0xfffffffc));
1087 assert(!(rd & 0xffffffe0));
1088 assert(!(op3 & 0xffffffc0));
1089 assert(!(rs1 & 0xffffffe0));
1090 assert(s13_p(simm13));
1096 v.simm13.b = simm13;
1101 _f3t(jit_state_t *_jit, jit_int32_t cond,
1102 jit_int32_t rs1, jit_int32_t i, jit_int32_t rs2_imm7)
1105 assert(!(cond & 0xfffffff0));
1106 assert(!(i & 0xfffffffe));
1107 assert(!(rs1 & 0xffffffe0));
1113 assert(s7_p(rs2_imm7));
1115 v.imm7.b = rs2_imm7;
1118 assert(!(rs2_imm7 & 0xffffffe0));
1126 _f3a(jit_state_t *_jit, jit_int32_t op, jit_int32_t rd,
1127 jit_int32_t op3, jit_int32_t rs1, jit_int32_t asi, jit_int32_t rs2)
1130 assert(!(op & 0xfffffffc));
1131 assert(!(rd & 0xffffffe0));
1132 assert(!(op3 & 0xffffffc0));
1133 assert(!(rs1 & 0xffffffe0));
1134 assert(!(asi & 0xffffff00));
1135 assert(!(rs2 & 0xffffffe0));
1147 _f1(jit_state_t *_jit, jit_int32_t op, jit_int32_t disp30)
1150 assert(!(op & 0xfffffffc));
1151 assert(s30_p(disp30));
1153 v.disp30.b = disp30;
1158 _nop(jit_state_t *_jit, jit_int32_t i0)
1160 for (; i0 > 0; i0 -= 4)
1166 _movr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1173 _movi(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
1178 # if __WORDSIZE == 64
1179 if (i0 & 0xffffffff00000000) {
1180 jit_int32_t reg = jit_get_reg(jit_class_gpr);
1181 movi(rn(reg), (i0 >> 32) & 0xffffffff);
1182 movi(r0, i0 & 0xffffffff);
1183 lshi(rn(reg), rn(reg), 32);
1184 OR(rn(reg), r0, r0);
1189 SETHI(HI((int)i0), r0);
1191 ORI(r0, LO(i0), r0);
1192 # if __WORDSIZE == 64
1199 _movi_p(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
1202 # if __WORDSIZE == 64
1206 # if __WORDSIZE == 64
1207 reg = jit_get_reg(jit_class_gpr);
1208 SETHI(HI((int)i0), r0);
1209 ORI(r0, LO(i0), r0);
1210 i0 = (int)(i0 >> 32);
1211 SETHI(HI(i0), rn(reg));
1212 ORI(rn(reg), LO(i0), rn(reg));
1213 SLLXI(rn(reg), 32, rn(reg));
1214 OR(rn(reg), r0, r0);
1218 ORI(r0, LO(i0), r0);
1224 _movnr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1227 w = beqi(_jit->pc.w, r2, 0);
1229 patch_at(w, _jit->pc.w);
1233 _movzr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1236 w = bnei(_jit->pc.w, r2, 0);
1238 patch_at(w, _jit->pc.w);
1242 _casx(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1,
1243 jit_int32_t r2, jit_int32_t r3, jit_word_t i0)
1245 fallback_casx(r0, r1, r2, r3, i0);
1249 _addi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1255 reg = jit_get_reg(jit_class_gpr);
1257 addr(r0, r1, rn(reg));
1262 # if __WORDSIZE == 64
1264 _addcr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1267 if (jit_carry == _NOREG)
1268 jit_carry = jit_get_reg(jit_class_gpr);
1270 reg = jit_get_reg(jit_class_gpr);
1271 addr(rn(reg), r1, r2);
1272 ltr_u(rn(jit_carry), rn(reg), r1);
1278 ltr_u(rn(jit_carry), r0, r1);
1284 _addci(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1286 # if __WORDSIZE == 32
1291 reg = jit_get_reg(jit_class_gpr);
1293 addcr(r0, r1, rn(reg));
1298 if (jit_carry == _NOREG)
1299 jit_carry = jit_get_reg(jit_class_gpr);
1301 reg = jit_get_reg(jit_class_gpr);
1302 addi(rn(reg), r1, i0);
1303 ltr_u(rn(jit_carry), rn(reg), r1);
1309 ltr_u(rn(jit_carry), r0, r1);
1314 # if __WORDSIZE == 64
1316 _addxr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1319 assert(jit_carry != _NOREG);
1320 reg = jit_get_reg(jit_class_gpr);
1321 movr(rn(reg), rn(jit_carry));
1323 addcr(r0, r0, rn(reg));
1329 _addxi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1331 # if __WORDSIZE == 32
1334 ADDXIcc(r1, i0, r0);
1336 reg = jit_get_reg(jit_class_gpr);
1338 addxr(r0, r1, rn(reg));
1343 assert(jit_carry != _NOREG);
1344 reg = jit_get_reg(jit_class_gpr);
1345 movr(rn(reg), rn(jit_carry));
1347 addcr(r0, r0, rn(reg));
1353 _subi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1359 reg = jit_get_reg(jit_class_gpr);
1361 subr(r0, r1, rn(reg));
1366 # if __WORDSIZE == 64
1368 _subcr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1371 if (jit_carry == _NOREG)
1372 jit_carry = jit_get_reg(jit_class_gpr);
1374 reg = jit_get_reg(jit_class_gpr);
1375 subr(rn(reg), r1, r2);
1376 ltr_u(rn(jit_carry), r1, rn(reg));
1382 ltr_u(rn(jit_carry), r1, r0);
1388 _subci(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1390 # if __WORDSIZE == 32
1395 reg = jit_get_reg(jit_class_gpr);
1397 subcr(r0, r1, rn(reg));
1402 if (jit_carry == _NOREG)
1403 jit_carry = jit_get_reg(jit_class_gpr);
1405 reg = jit_get_reg(jit_class_gpr);
1406 addi(rn(reg), r1, -i0);
1407 ltr_u(rn(jit_carry), r1, rn(reg));
1413 ltr_u(rn(jit_carry), r1, r0);
1418 # if __WORDSIZE == 64
1420 _subxr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1423 assert(jit_carry != _NOREG);
1424 reg = jit_get_reg(jit_class_gpr);
1425 movr(rn(reg), rn(jit_carry));
1427 subcr(r0, r0, rn(reg));
1433 _subxi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1435 # if __WORDSIZE == 32
1438 SUBXIcc(r1, i0, r0);
1440 reg = jit_get_reg(jit_class_gpr);
1442 subxr(r0, r1, rn(reg));
1447 assert(jit_carry != _NOREG);
1448 reg = jit_get_reg(jit_class_gpr);
1449 movr(rn(reg), rn(jit_carry));
1451 subcr(r0, r0, rn(reg));
1457 _rsbi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1464 _muli(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1468 # if __WORDSIZE == 32
1475 reg = jit_get_reg(jit_class_gpr);
1477 mulr(r0, r1, rn(reg));
1482 # if __WORDSIZE == 32
1484 _iqmulr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1,
1485 jit_int32_t r2, jit_int32_t r3, jit_bool_t sign)
1495 _iqmuli(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1,
1496 jit_int32_t r2, jit_word_t i0, jit_bool_t sign)
1507 reg = jit_get_reg(jit_class_gpr);
1509 iqmulr(r0, r1, r2, rn(reg), sign);
1515 static __int128_t __llmul(jit_word_t a, jit_word_t b)
1517 return (__int128_t)a * (__int128_t)b;
1520 # define QMUL_PROLOG() \
1522 (void)jit_get_reg(_O0|jit_class_gpr|jit_class_named); \
1523 (void)jit_get_reg(_O1|jit_class_gpr|jit_class_named); \
1524 if (r0 != _G2_REGNO && r1 != _G2_REGNO) \
1525 stxi(BIAS(-8), _FP_REGNO, _G2_REGNO); \
1526 if (r0 != _G3_REGNO && r1 != _G3_REGNO) \
1527 stxi(BIAS(-16), _FP_REGNO, _G3_REGNO); \
1528 if (r0 != _G4_REGNO && r1 != _G4_REGNO) \
1529 stxi(BIAS(-24), _FP_REGNO, _G4_REGNO); \
1532 # define QMUL_EPILOG() \
1534 if (r0 != _G2_REGNO && r1 != _G2_REGNO) \
1535 ldxi(_G2_REGNO, _FP_REGNO, BIAS(-8)); \
1536 if (r0 != _G3_REGNO && r1 != _G3_REGNO) \
1537 ldxi(_G3_REGNO, _FP_REGNO, BIAS(-16)); \
1538 if (r0 != _G4_REGNO && r1 != _G4_REGNO) \
1539 ldxi(_G4_REGNO, _FP_REGNO, BIAS(-24)); \
1540 (void)jit_unget_reg(_O0); \
1541 (void)jit_unget_reg(_O1); \
1545 _qmulr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1,
1546 jit_int32_t r2, jit_int32_t r3)
1549 movr(_O0_REGNO, r3);
1550 movr(_O1_REGNO, r2);
1551 calli((jit_word_t)__llmul);
1552 movr(r0, _O1_REGNO);
1553 movr(r1, _O0_REGNO);
1558 _qmuli(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1,
1559 jit_int32_t r2, jit_word_t i0)
1562 movi(_O0_REGNO, i0);
1563 movr(_O1_REGNO, r2);
1564 calli((jit_word_t)__llmul);
1565 movr(r0, _O1_REGNO);
1566 movr(r1, _O0_REGNO);
1570 static __uint128_t __ullmul(jit_uword_t a, jit_uword_t b)
1572 return (__uint128_t)a * (__uint128_t)b;
1576 _qmulr_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1,
1577 jit_int32_t r2, jit_int32_t r3)
1580 movr(_O0_REGNO, r3);
1581 movr(_O1_REGNO, r2);
1582 calli((jit_word_t)__ullmul);
1583 movr(r0, _O1_REGNO);
1584 movr(r1, _O0_REGNO);
1589 _qmuli_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1,
1590 jit_int32_t r2, jit_word_t i0)
1593 movi(_O0_REGNO, i0);
1594 movr(_O1_REGNO, r2);
1595 calli((jit_word_t)__ullmul);
1596 movr(r0, _O1_REGNO);
1597 movr(r1, _O0_REGNO);
1603 _divr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1605 # if __WORDSIZE == 32
1607 reg = jit_get_reg(jit_class_gpr);
1608 rshi(rn(reg), r1, 31);
1618 _divi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1621 # if __WORDSIZE == 32
1622 reg = jit_get_reg(jit_class_gpr);
1625 # if __WORDSIZE == 32
1626 rshi(rn(reg), r1, 31);
1634 # if __WORDSIZE == 64
1635 reg = jit_get_reg(jit_class_gpr);
1638 divr(r0, r1, rn(reg));
1639 # if __WORDSIZE == 64
1643 # if __WORDSIZE == 32
1649 _divr_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1651 # if __WORDSIZE == 32
1660 _divi_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1664 # if __WORDSIZE == 32
1672 reg = jit_get_reg(jit_class_gpr);
1674 divr_u(r0, r1, rn(reg));
1680 _iqdivr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1,
1681 jit_int32_t r2, jit_int32_t r3, jit_bool_t sign)
1683 jit_int32_t sv0, rg0;
1684 jit_int32_t sv1, rg1;
1686 if (r0 == r2 || r0 == r3) {
1687 sv0 = jit_get_reg(jit_class_gpr);
1692 if (r1 == r2 || r1 == r3) {
1693 sv1 = jit_get_reg(jit_class_gpr);
1702 divr_u(rg0, r2, r3);
1716 _iqdivi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1,
1717 jit_int32_t r2, jit_word_t i0, jit_bool_t sign)
1720 reg = jit_get_reg(jit_class_gpr);
1722 iqdivr(r0, r1, r2, rn(reg), sign);
1727 _remr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1730 if (r0 == r1 || r0 == r2) {
1731 reg = jit_get_reg(jit_class_gpr);
1732 divr(rn(reg), r1, r2);
1733 mulr(rn(reg), r2, rn(reg));
1734 subr(r0, r1, rn(reg));
1745 _remi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1748 reg = jit_get_reg(jit_class_gpr);
1750 remr(r0, r1, rn(reg));
1755 _remr_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1758 if (r0 == r1 || r0 == r2) {
1759 reg = jit_get_reg(jit_class_gpr);
1760 divr_u(rn(reg), r1, r2);
1761 mulr(rn(reg), r2, rn(reg));
1762 subr(r0, r1, rn(reg));
1773 _remi_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1776 reg = jit_get_reg(jit_class_gpr);
1778 remr_u(r0, r1, rn(reg));
1783 _andi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1789 reg = jit_get_reg(jit_class_gpr);
1791 andr(r0, r1, rn(reg));
1797 _ori(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1803 reg = jit_get_reg(jit_class_gpr);
1805 orr(r0, r1, rn(reg));
1811 _xori(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1817 reg = jit_get_reg(jit_class_gpr);
1819 xorr(r0, r1, rn(reg));
1825 _extr_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1827 lshi(r0, r1, __WORDSIZE - 8);
1828 rshi(r0, r0, __WORDSIZE - 8);
1832 _extr_s(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1834 lshi(r0, r1, __WORDSIZE - 16);
1835 rshi(r0, r0, __WORDSIZE - 16);
1839 _extr_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1841 lshi(r0, r1, __WORDSIZE - 16);
1842 rshi_u(r0, r0, __WORDSIZE - 16);
1845 #if __WORDSIZE == 64
1847 _extr_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1849 lshi(r0, r1, __WORDSIZE - 32);
1850 rshi(r0, r0, __WORDSIZE - 32);
1854 _extr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1856 lshi(r0, r1, __WORDSIZE - 32);
1857 rshi_u(r0, r0, __WORDSIZE - 32);
1862 _cr(jit_state_t *_jit, jit_int32_t cc,
1863 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1866 # if __WORDSIZE == 32
1876 _cw(jit_state_t *_jit, jit_int32_t cc,
1877 jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1882 # if __WORDSIZE == 32
1891 reg = jit_get_reg(jit_class_gpr);
1893 cr(cc, r0, r1, rn(reg));
1899 _ldi_c(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
1905 reg = jit_get_reg(jit_class_gpr);
1913 _ldi_uc(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
1919 reg = jit_get_reg(jit_class_gpr);
1921 ldr_uc(r0, rn(reg));
1927 _ldi_s(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
1933 reg = jit_get_reg(jit_class_gpr);
1941 _ldi_us(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
1947 reg = jit_get_reg(jit_class_gpr);
1949 ldr_us(r0, rn(reg));
1955 _ldi_i(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
1959 # if __WORDSIZE == 32
1966 reg = jit_get_reg(jit_class_gpr);
1973 # if __WORDSIZE == 64
1975 _ldi_ui(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
1981 reg = jit_get_reg(jit_class_gpr);
1983 ldr_ui(r0, rn(reg));
1989 _ldi_l(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
1995 reg = jit_get_reg(jit_class_gpr);
2004 _ldxi_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2010 reg = jit_get_reg(jit_class_gpr);
2012 ldxr_c(r0, r1, rn(reg));
2018 _ldxi_uc(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2024 reg = jit_get_reg(jit_class_gpr);
2026 ldxr_uc(r0, r1, rn(reg));
2032 _ldxi_s(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2038 reg = jit_get_reg(jit_class_gpr);
2040 ldxr_s(r0, r1, rn(reg));
2046 _ldxi_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2052 reg = jit_get_reg(jit_class_gpr);
2054 ldxr_us(r0, r1, rn(reg));
2060 _ldxi_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2064 # if __WORDSIZE == 32
2071 reg = jit_get_reg(jit_class_gpr);
2073 ldxr_i(r0, r1, rn(reg));
2078 # if __WORDSIZE == 64
2080 _ldxi_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2086 reg = jit_get_reg(jit_class_gpr);
2088 ldxr_ui(r0, r1, rn(reg));
2094 _ldxi_l(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2100 reg = jit_get_reg(jit_class_gpr);
2102 ldxr_l(r0, r1, rn(reg));
2109 _sti_c(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
2115 reg = jit_get_reg(jit_class_gpr);
2123 _sti_s(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
2129 reg = jit_get_reg(jit_class_gpr);
2137 _sti_i(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
2141 # if __WORDSIZE == 32
2148 reg = jit_get_reg(jit_class_gpr);
2155 # if __WORDSIZE == 64
2157 _sti_l(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
2163 reg = jit_get_reg(jit_class_gpr);
2172 _stxi_c(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2178 reg = jit_get_reg(jit_class_gpr);
2180 stxr_c(r0, rn(reg), r1);
2186 _stxi_s(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2192 reg = jit_get_reg(jit_class_gpr);
2194 stxr_s(r0, rn(reg), r1);
2200 _stxi_i(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2204 # if __WORDSIZE == 32
2211 reg = jit_get_reg(jit_class_gpr);
2213 stxr_i(r0, rn(reg), r1);
2218 # if __WORDSIZE == 64
2220 _stxi_l(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2226 reg = jit_get_reg(jit_class_gpr);
2228 stxr_l(r0, rn(reg), r1);
2235 _br(jit_state_t *_jit, jit_int32_t cc,
2236 jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2241 # if __WORDSIZE == 32
2242 B(cc, (i0 - w) >> 2);
2244 BP(cc, (i0 - w) >> 2);
2251 _bw(jit_state_t *_jit, jit_int32_t cc,
2252 jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2259 # if __WORDSIZE == 32
2260 B(cc, (i0 - w) >> 2);
2262 B(cc, (i0 - w) >> 2);
2267 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2269 w = br(cc, i0, r0, rn(reg));
2276 _b_asr(jit_state_t *_jit, jit_bool_t jif, jit_bool_t add, jit_bool_t sgn,
2277 jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2285 # if __WORDSIZE == 32
2287 (jif ? SPARC_BVS : SPARC_BVC) :
2288 (jif ? SPARC_BCS : SPARC_BCC),
2292 (jif ? SPARC_BPVS : SPARC_BPVC) :
2293 (jif ? SPARC_BPCS : SPARC_BPCC),
2301 _b_asw(jit_state_t *_jit, jit_bool_t jif, jit_bool_t add, jit_bool_t sgn,
2302 jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2312 # if __WORDSIZE == 32
2314 (jif ? SPARC_BVS : SPARC_BVC) :
2315 (jif ? SPARC_BCS : SPARC_BCC),
2319 (jif ? SPARC_BPVS : SPARC_BPVC) :
2320 (jif ? SPARC_BPCS : SPARC_BPCC),
2326 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2328 w = b_asr(jif, add, sgn, i0, r0, rn(reg));
2335 _bm_r(jit_state_t *_jit, jit_bool_t set,
2336 jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2341 # if __WORDSIZE == 32
2342 B(set ? SPARC_BNZ : SPARC_BZ, (i0 - w) >> 2);
2344 BP(set ? SPARC_BPNE : SPARC_BPE, (i0 - w) >> 2);
2351 _bm_w(jit_state_t *_jit, jit_bool_t set,
2352 jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2359 # if __WORDSIZE == 32
2360 B(set ? SPARC_BNZ : SPARC_BZ, (i0 - w) >> 2);
2362 BP(set ? SPARC_BPNE : SPARC_BPE, (i0 - w) >> 2);
2367 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2369 w = bm_r(set, i0, r0, rn(reg));
2376 _jmpr(jit_state_t *_jit, jit_int32_t r0)
2383 _jmpi(jit_state_t *_jit, jit_word_t i0)
2387 w = (i0 - _jit->pc.w) >> 2;
2393 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2401 _jmpi_p(jit_state_t *_jit, jit_word_t i0)
2405 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2406 w = movi_p(rn(reg), i0);
2413 _callr(jit_state_t *_jit, jit_int32_t r0)
2420 _calli(jit_state_t *_jit, jit_word_t i0)
2423 w = (i0 - _jit->pc.w) >> 2;
2429 _calli_p(jit_state_t *_jit, jit_word_t i0)
2433 reg = jit_get_reg(jit_class_gpr);
2434 w = movi_p(rn(reg), i0);
2440 #define OFF(n) BIAS(((n) * sizeof(jit_word_t)))
2442 _prolog(jit_state_t *_jit, jit_node_t *node)
2445 if (_jitc->function->define_frame || _jitc->function->assume_frame) {
2446 jit_int32_t frame = -_jitc->function->frame;
2447 assert(_jitc->function->self.aoff >= frame);
2448 if (_jitc->function->assume_frame)
2450 _jitc->function->self.aoff = frame;
2452 if (_jitc->function->allocar)
2453 _jitc->function->self.aoff &= -16;
2454 /* align at 16 bytes boundary */
2455 _jitc->function->stack = ((stack_framesize +
2456 _jitc->function->self.alen -
2457 _jitc->function->self.aoff) + 15) & -16;
2458 SAVEI(_SP_REGNO, -_jitc->function->stack, _SP_REGNO);
2460 /* (most) other backends do not save incoming arguments, so,
2461 * only save locals here */
2462 if (jit_regset_tstbit(&_jitc->function->regset, _L0))
2463 stxi(OFF(0), _SP_REGNO, _L0_REGNO);
2464 if (jit_regset_tstbit(&_jitc->function->regset, _L1))
2465 stxi(OFF(1), _SP_REGNO, _L1_REGNO);
2466 if (jit_regset_tstbit(&_jitc->function->regset, _L2))
2467 stxi(OFF(2), _SP_REGNO, _L2_REGNO);
2468 if (jit_regset_tstbit(&_jitc->function->regset, _L3))
2469 stxi(OFF(3), _SP_REGNO, _L3_REGNO);
2470 if (jit_regset_tstbit(&_jitc->function->regset, _L4))
2471 stxi(OFF(4), _SP_REGNO, _L4_REGNO);
2472 if (jit_regset_tstbit(&_jitc->function->regset, _L5))
2473 stxi(OFF(5), _SP_REGNO, _L5_REGNO);
2474 if (jit_regset_tstbit(&_jitc->function->regset, _L6))
2475 stxi(OFF(6), _SP_REGNO, _L6_REGNO);
2476 if (jit_regset_tstbit(&_jitc->function->regset, _L7))
2477 stxi(OFF(7), _SP_REGNO, _L7_REGNO);
2479 if (_jitc->function->allocar) {
2480 reg = jit_get_reg(jit_class_gpr);
2481 movi(rn(reg), BIAS(_jitc->function->self.aoff));
2482 /* Already "biased" by allocai */
2483 stxi_i(_jitc->function->aoffoff, _FP_REGNO, rn(reg));
2487 if (_jitc->function->self.call & jit_call_varargs) {
2488 for (reg = _jitc->function->vagp; jit_arg_reg_p(reg); ++reg)
2489 stxi(BIAS((16 + (__WORDSIZE == 32)) * sizeof(jit_word_t) +
2490 reg * sizeof(jit_word_t)), _FP_REGNO, rn(_I0 + reg));
2495 _epilog(jit_state_t *_jit, jit_node_t *node)
2497 if (_jitc->function->assume_frame)
2499 /* (most) other backends do not save incoming arguments, so,
2500 * only save locals here */
2501 if (jit_regset_tstbit(&_jitc->function->regset, _L0))
2502 ldxi(_L0_REGNO, _FP_REGNO, _jitc->function->stack + OFF(0));
2503 if (jit_regset_tstbit(&_jitc->function->regset, _L1))
2504 ldxi(_L1_REGNO, _FP_REGNO, _jitc->function->stack + OFF(1));
2505 if (jit_regset_tstbit(&_jitc->function->regset, _L2))
2506 ldxi(_L2_REGNO, _FP_REGNO, _jitc->function->stack + OFF(2));
2507 if (jit_regset_tstbit(&_jitc->function->regset, _L3))
2508 ldxi(_L3_REGNO, _FP_REGNO, _jitc->function->stack + OFF(3));
2509 if (jit_regset_tstbit(&_jitc->function->regset, _L4))
2510 ldxi(_L4_REGNO, _FP_REGNO, _jitc->function->stack + OFF(4));
2511 if (jit_regset_tstbit(&_jitc->function->regset, _L5))
2512 ldxi(_L5_REGNO, _FP_REGNO, _jitc->function->stack + OFF(5));
2513 if (jit_regset_tstbit(&_jitc->function->regset, _L6))
2514 ldxi(_L6_REGNO, _FP_REGNO, _jitc->function->stack + OFF(6));
2515 if (jit_regset_tstbit(&_jitc->function->regset, _L7))
2516 ldxi(_L7_REGNO, _FP_REGNO, _jitc->function->stack + OFF(7));
2523 _vastart(jit_state_t *_jit, jit_int32_t r0)
2525 /* Initialize stack pointer to the first stack argument. */
2526 if (jit_arg_reg_p(_jitc->function->vagp))
2527 addi(r0, _FP_REGNO, BIAS((16 + (__WORDSIZE == 32) +
2528 _jitc->function->vagp) *
2529 sizeof(jit_word_t)));
2531 addi(r0, _FP_REGNO, BIAS(_jitc->function->self.size));
2535 _vaarg(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
2537 assert(_jitc->function->self.call & jit_call_varargs);
2539 /* Load argument. */
2542 /* Update vararg stack pointer. */
2543 addi(r1, r1, sizeof(jit_word_t));
2547 _patch_at(jit_state_t *_jit, jit_word_t instr, jit_word_t label)
2558 if (i.op.b == 0) { /* conditional branch */
2559 if (i.op2.b == 2 || i.op2.b == 6) { /* int or float condition */
2560 i.disp22.b = (label - instr) >> 2;
2563 # if __WORDSIZE == 64
2564 else if (i.op2.b == 1) {
2565 i.disp19.b = (label - instr) >> 2;
2569 else if (i.op2.b == 4) { /* movi_p */
2571 i.imm22.b = HI((int)label);
2574 if (i.op.b == 2 && i.op3.b == 2) {
2576 i.simm13.b = LO(label);
2578 # if __WORDSIZE == 64
2580 assert(i.op2.b == 4);
2581 label = (label >> 32) & 0xffffffff;
2582 i.imm22.b = HI((int)label);
2585 assert(i.op.b == 2 && i.op3.b == 2);
2587 i.simm13.b = LO(label);