Update lightrec 20220910 (#686)
[pcsx_rearmed.git] / deps / lightning / lib / jit_sparc-cpu.c
1 /*
2  * Copyright (C) 2013-2019  Free Software Foundation, Inc.
3  *
4  * This file is part of GNU lightning.
5  *
6  * GNU lightning is free software; you can redistribute it and/or modify it
7  * under the terms of the GNU Lesser General Public License as published
8  * by the Free Software Foundation; either version 3, or (at your option)
9  * any later version.
10  *
11  * GNU lightning is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
14  * License for more details.
15  *
16  * Authors:
17  *      Paulo Cesar Pereira de Andrade
18  */
19
20 #if PROTO
21 #  define _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
38 /*
39  *                                      - previous stack frame
40  * fp   ----
41  * fp-  local variables (in lightning, 8 bytes space for float conversion)
42  * fp-  alloca
43  * sp+  stack arguments
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
47  * sp   ----
48  *      decreasing memory address       - next stack frame (not yet allocated)
49  */
50 #  define stack_framesize                       ((16 + (__WORDSIZE == 32) + 6) * sizeof(jit_word_t))
51 typedef union {
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;
77     jit_int32_t                                                   v;
78 } jit_instr_t;
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)
90 static void
91 _f2b(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t);
92 #  if __WORDSIZE == 64
93 #    define f2bp(op,a,cond,op2,cc1,cc0,p,disp19)                                \
94         _f2bp(_jit,op,a,cond,op2,cc1,cc0,p,disp19)
95 static void
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);
98 #  endif
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);
106 #  endif
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)
115     maybe_unused;
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)
119     maybe_unused;
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)
133 #  else
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)
140 #  endif
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)
148 #  else
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)
152 #  endif
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)
168 #  else
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)
173 #  endif
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)
179 #  else
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)
182 #  endif
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)
240 #  endif
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)
293 #  endif
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 */
336 #  endif
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)
400 #  endif
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)
567 #  else
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);
570 #  endif
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)
575 #  else
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);
578 #  endif
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)
586 #  else
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);
589 #  endif
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)
594 #  else
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);
597 #  endif
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)
604 #  else
605 #    define mulr(r0, r1, r2)            MULX(r1, r2, r0)
606 #  endif
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);
620 #  else
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);
633 #  endif
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)
676 #  else
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)
683 #  endif
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);
696 #  endif
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)
722 #  else
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)
743 #  endif
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)
760 #  else
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)
766 #  endif
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);
774 #  endif
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)
791 #  else
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)
797 #  endif
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);
805 #  endif
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)
816 #  else
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)
821 #  endif
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);
827 #  endif
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)
838 #  else
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)
843 #  endif
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);
849 #  endif
850 #  define br(cc, i0, r0, r1)            _br(_jit, cc, i0, r0, r1)
851 static jit_word_t
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)
854 static jit_word_t
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)
877 #  else
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)
898 #  endif
899 #  define b_asr(jif,add,sgn,i0,r0,r1)   _b_asr(_jit,jif,add,sgn,i0,r0,r1)
900 static jit_word_t
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)
904 static jit_word_t
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)
924 static jit_word_t
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)
927 static jit_word_t
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);
955 #endif
956
957 #if CODE
958 static void
959 _f2r(jit_state_t *_jit,
960      jit_int32_t op, jit_int32_t rd, jit_int32_t op2, jit_int32_t imm22)
961 {
962     jit_instr_t         v;
963     assert(!(op  & 0xfffffffc));
964     assert(!(rd  & 0xffffffe0));
965     assert(!(op2 & 0xfffffff8));
966     assert(s22_p(imm22));
967     v.op.b    = op;
968     v.rd.b    = rd;
969     v.op2.b   = op2;
970     v.imm22.b = imm22;
971     ii(v.v);
972 }
973
974 static void
975 _f2b(jit_state_t *_jit,
976      jit_int32_t op, jit_int32_t a, jit_int32_t cond, jit_int32_t op2,
977      jit_int32_t disp22)
978 {
979     jit_instr_t         v;
980     assert(!(op   & 0xfffffffc));
981     assert(!(a    & 0xfffffffe));
982     assert(!(cond & 0xfffffff0));
983     assert(!(op2  & 0xfffffff8));
984     assert(s22_p(disp22));
985     v.op.b     = op;
986     v.a.b      = a;
987     v.cond.b   = cond;
988     v.op2.b    = op2;
989     v.disp22.b = disp22;
990     ii(v.v);
991 }
992
993 #  if __WORDSIZE == 64
994 static void
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)
998 {
999     jit_instr_t         v;
1000     assert(!(op   & 0xfffffffc));
1001     assert(!(a    & 0xfffffffe));
1002     assert(!(cond & 0xfffffff0));
1003     assert(!(op2  & 0xfffffff8));
1004     assert(s19_p(disp19));
1005     v.op.b     = op;
1006     v.a.b      = a;
1007     v.cond.b   = cond;
1008     v.op2.b    = op2;
1009     v.cc1.b    = cc1;
1010     v.cc0.b    = cc0;
1011     v.p.b      = p;
1012     v.disp19.b = disp19;
1013     ii(v.v);
1014 }
1015 #  endif
1016
1017 static void
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)
1020 {
1021     jit_instr_t         v;
1022     assert(!(op  & 0xfffffffc));
1023     assert(!(rd  & 0xffffffe0));
1024     assert(!(op3 & 0xffffffc0));
1025     assert(!(rs1 & 0xffffffe0));
1026     assert(!(rs2 & 0xffffffe0));
1027     v.op.b  = op;
1028     v.rd.b  = rd;
1029     v.op3.b = op3;
1030     v.rs1.b = rs1;
1031     v.i.b   = 0;
1032     v.asi.b = 0;
1033     v.rs2.b = rs2;
1034     ii(v.v);
1035 }
1036
1037 #  if __WORDSIZE == 64
1038 static void
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)
1041 {
1042     jit_instr_t         v;
1043     assert(!(op  & 0xfffffffc));
1044     assert(!(rd  & 0xffffffe0));
1045     assert(!(op3 & 0xffffffc0));
1046     assert(!(rs1 & 0xffffffe0));
1047     assert(!(rs2 & 0xffffffe0));
1048     v.op.b   = op;
1049     v.rd.b   = rd;
1050     v.op3.b  = op3;
1051     v.rs1.b  = rs1;
1052     v.i.b    = 0;
1053     v.x.b    = 1;
1054     v.asix.b = 0;
1055     v.rs2.b  = rs2;
1056     ii(v.v);
1057 }
1058
1059 static void
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)
1062 {
1063     jit_instr_t         v;
1064     assert(!(op   & 0xfffffffc));
1065     assert(!(rd   & 0xffffffe0));
1066     assert(!(op3  & 0xffffffc0));
1067     assert(!(rs1  & 0xffffffe0));
1068     assert(!(shim & 0xffffffc0));
1069     v.op.b   = op;
1070     v.rd.b   = rd;
1071     v.op3.b  = op3;
1072     v.rs1.b  = rs1;
1073     v.i.b    = 1;
1074     v.x.b    = 1;
1075     v.asis.b = 0;
1076     v.shim.b = shim;
1077     ii(v.v);
1078 }
1079 #  endif
1080
1081 static void
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)
1084 {
1085     jit_instr_t         v;
1086     assert(!(op  & 0xfffffffc));
1087     assert(!(rd  & 0xffffffe0));
1088     assert(!(op3 & 0xffffffc0));
1089     assert(!(rs1 & 0xffffffe0));
1090     assert(s13_p(simm13));
1091     v.op.b     = op;
1092     v.rd.b     = rd;
1093     v.op3.b    = op3;
1094     v.rs1.b    = rs1;
1095     v.i.b      = 1;
1096     v.simm13.b = simm13;
1097     ii(v.v);
1098 }
1099
1100 static void
1101 _f3t(jit_state_t *_jit, jit_int32_t cond,
1102      jit_int32_t rs1, jit_int32_t i, jit_int32_t rs2_imm7)
1103 {
1104     jit_instr_t         v;
1105     assert(!(cond & 0xfffffff0));
1106     assert(!(i    & 0xfffffffe));
1107     assert(!(rs1 & 0xffffffe0));
1108     v.op.b     = 2;
1109     v.rd.b     = cond;
1110     v.op3.b    = 58;
1111     v.i.b      = i;
1112     if (i) {
1113         assert(s7_p(rs2_imm7));
1114         v.res.b  = 0;
1115         v.imm7.b = rs2_imm7;
1116     }
1117     else {
1118         assert(!(rs2_imm7 & 0xffffffe0));
1119         v.asi.b = 0;
1120         v.rs2.b = rs2_imm7;
1121     }
1122     ii(v.v);
1123 }
1124
1125 static void
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)
1128 {
1129     jit_instr_t         v;
1130     assert(!(op  & 0xfffffffc));
1131     assert(!(rd  & 0xffffffe0));
1132     assert(!(op3 & 0xffffffc0));
1133     assert(!(rs1 & 0xffffffe0));
1134     assert(!(asi & 0xffffff00));
1135     assert(!(rs2 & 0xffffffe0));
1136     v.op.b    = op;
1137     v.rd.b    = rd;
1138     v.op3.b   = op3;
1139     v.rs1.b   = rs1;
1140     v.i.b     = 0;
1141     v.asi.b   = asi;
1142     v.rs2.b   = rs2;
1143     ii(v.v);
1144 }
1145
1146 static void
1147 _f1(jit_state_t *_jit, jit_int32_t op, jit_int32_t disp30)
1148 {
1149     jit_instr_t         v;
1150     assert(!(op  & 0xfffffffc));
1151     assert(s30_p(disp30));
1152     v.op.b     = op;
1153     v.disp30.b = disp30;
1154     ii(v.v);
1155 }
1156
1157 static void
1158 _nop(jit_state_t *_jit, jit_int32_t i0)
1159 {
1160     for (; i0 > 0; i0 -= 4)
1161         NOP();
1162     assert(i0 == 0);
1163 }
1164
1165 static void
1166 _movr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1167 {
1168     if (r0 != r1)
1169         ORI(r1, 0, r0);
1170 }
1171
1172 static void
1173 _movi(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
1174 {
1175     if (s13_p(i0))
1176         ORI(0, i0, r0);
1177     else {
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);
1185             jit_unget_reg(reg);
1186         }
1187         else {
1188 #  endif
1189             SETHI(HI((int)i0), r0);
1190             if (LO(i0))
1191                 ORI(r0, LO(i0), r0);
1192 #  if __WORDSIZE == 64
1193         }
1194 #  endif
1195     }
1196 }
1197
1198 static jit_word_t
1199 _movi_p(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
1200 {
1201     jit_word_t          w;
1202 #  if __WORDSIZE == 64
1203     jit_int32_t         reg;
1204 #  endif
1205     w = _jit->pc.w;
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);
1215     jit_unget_reg(reg);
1216 #  else
1217     SETHI(HI(i0), r0);
1218     ORI(r0, LO(i0), r0);
1219 #  endif
1220     return (w);
1221 }
1222
1223 static void
1224 _movnr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1225 {
1226     jit_word_t  w;
1227     w = beqi(_jit->pc.w, r2, 0);
1228     ORI(r1, 0, r0);
1229     patch_at(w, _jit->pc.w);
1230 }
1231
1232 static void
1233 _movzr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1234 {
1235     jit_word_t  w;
1236     w = bnei(_jit->pc.w, r2, 0);
1237     ORI(r1, 0, r0);
1238     patch_at(w, _jit->pc.w);
1239 }
1240
1241 static void
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)
1244 {
1245     fallback_casx(r0, r1, r2, r3, i0);
1246 }
1247
1248 static void
1249 _addi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1250 {
1251     jit_int32_t         reg;
1252     if (s13_p(i0))
1253         ADDI(r1, i0, r0);
1254     else {
1255         reg = jit_get_reg(jit_class_gpr);
1256         movi(rn(reg), i0);
1257         addr(r0, r1, rn(reg));
1258         jit_unget_reg(reg);
1259     }
1260 }
1261
1262 #  if __WORDSIZE == 64
1263 static void
1264 _addcr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1265 {
1266     jit_int32_t         reg;
1267     if (jit_carry == _NOREG)
1268         jit_carry = jit_get_reg(jit_class_gpr);
1269     if (r0 == r1) {
1270         reg = jit_get_reg(jit_class_gpr);
1271         addr(rn(reg), r1, r2);
1272         ltr_u(rn(jit_carry), rn(reg), r1);
1273         movr(r0, rn(reg));
1274         jit_unget_reg(reg);
1275     }
1276     else {
1277         addr(r0, r1, r2);
1278         ltr_u(rn(jit_carry), r0, r1);
1279     }
1280 }
1281 #  endif
1282
1283 static void
1284 _addci(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1285 {
1286 #  if __WORDSIZE == 32
1287     jit_int32_t         reg;
1288     if (s13_p(i0))
1289         ADDIcc(r1, i0, r0);
1290     else {
1291         reg = jit_get_reg(jit_class_gpr);
1292         movi(rn(reg), i0);
1293         addcr(r0, r1, rn(reg));
1294         jit_unget_reg(reg);
1295     }
1296 #  else
1297     jit_int32_t         reg;
1298     if (jit_carry == _NOREG)
1299         jit_carry = jit_get_reg(jit_class_gpr);
1300     if (r0 == r1) {
1301         reg = jit_get_reg(jit_class_gpr);
1302         addi(rn(reg), r1, i0);
1303         ltr_u(rn(jit_carry), rn(reg), r1);
1304         movr(r0, rn(reg));
1305         jit_unget_reg(reg);
1306     }
1307     else {
1308         addi(r0, r1, i0);
1309         ltr_u(rn(jit_carry), r0, r1);
1310     }
1311 #  endif
1312 }
1313
1314 #  if __WORDSIZE == 64
1315 static void
1316 _addxr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1317 {
1318     jit_int32_t         reg;
1319     assert(jit_carry != _NOREG);
1320     reg = jit_get_reg(jit_class_gpr);
1321     movr(rn(reg), rn(jit_carry));
1322     addcr(r0, r1, r2);
1323     addcr(r0, r0, rn(reg));
1324     jit_unget_reg(reg);
1325 }
1326 #  endif
1327
1328 static void
1329 _addxi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1330 {
1331 #  if __WORDSIZE == 32
1332     jit_int32_t         reg;
1333     if (s13_p(i0))
1334         ADDXIcc(r1, i0, r0);
1335     else {
1336         reg = jit_get_reg(jit_class_gpr);
1337         movi(rn(reg), i0);
1338         addxr(r0, r1, rn(reg));
1339         jit_unget_reg(reg);
1340     }
1341 #  else
1342     jit_int32_t         reg;
1343     assert(jit_carry != _NOREG);
1344     reg = jit_get_reg(jit_class_gpr);
1345     movr(rn(reg), rn(jit_carry));
1346     addci(r0, r1, i0);
1347     addcr(r0, r0, rn(reg));
1348     jit_unget_reg(reg);
1349 #  endif
1350 }
1351
1352 static void
1353 _subi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1354 {
1355     jit_int32_t         reg;
1356     if (s13_p(i0))
1357         SUBI(r1, i0, r0);
1358     else {
1359         reg = jit_get_reg(jit_class_gpr);
1360         movi(rn(reg), i0);
1361         subr(r0, r1, rn(reg));
1362         jit_unget_reg(reg);
1363     }
1364 }
1365
1366 #  if __WORDSIZE == 64
1367 static void
1368 _subcr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1369 {
1370     jit_int32_t         reg;
1371     if (jit_carry == _NOREG)
1372         jit_carry = jit_get_reg(jit_class_gpr);
1373     if (r0 == r1) {
1374         reg = jit_get_reg(jit_class_gpr);
1375         subr(rn(reg), r1, r2);
1376         ltr_u(rn(jit_carry), r1, rn(reg));
1377         movr(r0, rn(reg));
1378         jit_unget_reg(reg);
1379     }
1380     else {
1381         subr(r0, r1, r2);
1382         ltr_u(rn(jit_carry), r1, r0);
1383     }
1384 }
1385 #  endif
1386
1387 static void
1388 _subci(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1389 {
1390 #  if __WORDSIZE == 32
1391     jit_int32_t         reg;
1392     if (s13_p(i0))
1393         SUBIcc(r1, i0, r0);
1394     else {
1395         reg = jit_get_reg(jit_class_gpr);
1396         movi(rn(reg), i0);
1397         subcr(r0, r1, rn(reg));
1398         jit_unget_reg(reg);
1399     }
1400 #  else
1401     jit_int32_t         reg;
1402     if (jit_carry == _NOREG)
1403         jit_carry = jit_get_reg(jit_class_gpr);
1404     if (r0 == r1) {
1405         reg = jit_get_reg(jit_class_gpr);
1406         addi(rn(reg), r1, -i0);
1407         ltr_u(rn(jit_carry), r1, rn(reg));
1408         movr(r0, rn(reg));
1409         jit_unget_reg(reg);
1410     }
1411     else {
1412         addi(r0, r1, -i0);
1413         ltr_u(rn(jit_carry), r1, r0);
1414     }
1415 #  endif
1416 }
1417
1418 #  if __WORDSIZE == 64
1419 static void
1420 _subxr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1421 {
1422     jit_int32_t         reg;
1423     assert(jit_carry != _NOREG);
1424     reg = jit_get_reg(jit_class_gpr);
1425     movr(rn(reg), rn(jit_carry));
1426     subcr(r0, r1, r2);
1427     subcr(r0, r0, rn(reg));
1428     jit_unget_reg(reg);
1429 }
1430 #endif
1431
1432 static void
1433 _subxi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1434 {
1435 #  if __WORDSIZE == 32
1436     jit_int32_t         reg;
1437     if (s13_p(i0))
1438         SUBXIcc(r1, i0, r0);
1439     else {
1440         reg = jit_get_reg(jit_class_gpr);
1441         movi(rn(reg), i0);
1442         subxr(r0, r1, rn(reg));
1443         jit_unget_reg(reg);
1444     }
1445 #  else
1446     jit_int32_t         reg;
1447     assert(jit_carry != _NOREG);
1448     reg = jit_get_reg(jit_class_gpr);
1449     movr(rn(reg), rn(jit_carry));
1450     subci(r0, r1, i0);
1451     subcr(r0, r0, rn(reg));
1452     jit_unget_reg(reg);
1453 #  endif
1454 }
1455
1456 static void
1457 _rsbi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1458 {
1459     subi(r0, r1, i0);
1460     negr(r0, r0);
1461 }
1462
1463 static void
1464 _muli(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1465 {
1466     jit_int32_t         reg;
1467     if (s13_p(i0)) {
1468 #  if __WORDSIZE == 32
1469         UMULI(r1, i0, r0);
1470 #  else
1471         MULXI(r1, i0, r0);
1472 #  endif
1473     }
1474     else {
1475         reg = jit_get_reg(jit_class_gpr);
1476         movi(rn(reg), i0);
1477         mulr(r0, r1, rn(reg));
1478         jit_unget_reg(reg);
1479     }
1480 }
1481
1482 #  if __WORDSIZE == 32
1483 static void
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)
1486 {
1487     if (sign)
1488         SMUL(r2, r3, r0);
1489     else
1490         UMUL(r2, r3, r0);
1491     RDY(r1);
1492 }
1493
1494 static void
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)
1497 {
1498     jit_int32_t         reg;
1499     if (s13_p(i0)) {
1500         if (sign)
1501             SMULI(r2, i0, r0);
1502         else
1503             UMULI(r2, i0, r0);
1504         RDY(r1);
1505     }
1506     else {
1507         reg = jit_get_reg(jit_class_gpr);
1508         movi(rn(reg), i0);
1509         iqmulr(r0, r1, r2, rn(reg), sign);
1510         jit_unget_reg(reg);
1511     }
1512 }
1513
1514 #  else
1515 static __int128_t __llmul(jit_word_t a, jit_word_t b)
1516 {
1517     return (__int128_t)a * (__int128_t)b;
1518 }
1519
1520 #  define QMUL_PROLOG()                                         \
1521     do {                                                        \
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);              \
1530     } while (0)
1531
1532 #  define QMUL_EPILOG()                                         \
1533     do {                                                        \
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);                               \
1542     } while (0)
1543
1544 static void
1545 _qmulr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1,
1546        jit_int32_t r2, jit_int32_t r3)
1547 {
1548     QMUL_PROLOG();
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);
1554     QMUL_EPILOG();
1555 }
1556
1557 static void
1558 _qmuli(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1,
1559        jit_int32_t r2, jit_word_t i0)
1560 {
1561     QMUL_PROLOG();
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);
1567     QMUL_EPILOG();
1568 }
1569
1570 static __uint128_t __ullmul(jit_uword_t a, jit_uword_t b)
1571 {
1572     return (__uint128_t)a * (__uint128_t)b;
1573 }
1574
1575 static void
1576 _qmulr_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1,
1577          jit_int32_t r2, jit_int32_t r3)
1578 {
1579     QMUL_PROLOG();
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);
1585     QMUL_EPILOG();
1586 }
1587
1588 static void
1589 _qmuli_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1,
1590          jit_int32_t r2, jit_word_t i0)
1591 {
1592     QMUL_PROLOG();
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);
1598     QMUL_EPILOG();
1599 }
1600 #  endif
1601
1602 static void
1603 _divr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1604 {
1605 #  if __WORDSIZE == 32
1606     jit_int32_t         reg;
1607     reg = jit_get_reg(jit_class_gpr);
1608     rshi(rn(reg), r1, 31);
1609     WRY(rn(reg), 0);
1610     SDIV(r1, r2, r0);
1611     jit_unget_reg(reg);
1612 #  else
1613     SDIVX(r1, r2, r0);
1614 #  endif
1615 }
1616
1617 static void
1618 _divi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1619 {
1620     jit_int32_t         reg;
1621 #  if __WORDSIZE == 32
1622     reg = jit_get_reg(jit_class_gpr);
1623 #  endif
1624     if (s13_p(i0)) {
1625 #  if __WORDSIZE == 32
1626         rshi(rn(reg), r1, 31);
1627         WRY(rn(reg), 0);
1628         SDIVI(r1, i0, r0);
1629 #  else
1630         SDIVXI(r1, i0, r0);
1631 #  endif
1632     }
1633     else {
1634 #  if __WORDSIZE == 64
1635         reg = jit_get_reg(jit_class_gpr);
1636 #  endif
1637         movi(rn(reg), i0);
1638         divr(r0, r1, rn(reg));
1639 #  if __WORDSIZE == 64
1640         jit_unget_reg(reg);
1641 #  endif
1642     }
1643 #  if __WORDSIZE == 32
1644     jit_unget_reg(reg);
1645 #  endif
1646 }
1647
1648 static void
1649 _divr_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1650 {
1651 #  if __WORDSIZE == 32
1652     WRYI(0, 0);
1653     UDIV(r1, r2, r0);
1654 #  else
1655     UDIVX(r1, r2, r0);
1656 #  endif
1657 }
1658
1659 static void
1660 _divi_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1661 {
1662     jit_int32_t         reg;
1663     if (s13_p(i0)) {
1664 #  if __WORDSIZE == 32
1665         WRYI(0, 0);
1666         UDIVI(r1, i0, r0);
1667 #  else
1668         UDIVXI(r1, i0, r0);
1669 #  endif
1670     }
1671     else {
1672         reg = jit_get_reg(jit_class_gpr);
1673         movi(rn(reg), i0);
1674         divr_u(r0, r1, rn(reg));
1675         jit_unget_reg(reg);
1676     }
1677 }
1678
1679 static void
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)
1682 {
1683     jit_int32_t         sv0, rg0;
1684     jit_int32_t         sv1, rg1;
1685
1686     if (r0 == r2 || r0 == r3) {
1687         sv0 = jit_get_reg(jit_class_gpr);
1688         rg0 = rn(sv0);
1689     }
1690     else
1691         rg0 = r0;
1692     if (r1 == r2 || r1 == r3) {
1693         sv1 = jit_get_reg(jit_class_gpr);
1694         rg1 = rn(sv1);
1695     }
1696     else
1697         rg1 = r1;
1698
1699     if (sign)
1700         divr(rg0, r2, r3);
1701     else
1702         divr_u(rg0, r2, r3);
1703     mulr(rg1, r3, rg0);
1704     subr(rg1, r2, rg1);
1705     if (rg0 != r0) {
1706         movr(r0, rg0);
1707         jit_unget_reg(sv0);
1708     }
1709     if (rg1 != r1) {
1710         movr(r1, rg1);
1711         jit_unget_reg(sv1);
1712     }
1713 }
1714
1715 static void
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)
1718 {
1719     jit_int32_t         reg;
1720     reg = jit_get_reg(jit_class_gpr);
1721     movi(rn(reg), i0);
1722     iqdivr(r0, r1, r2, rn(reg), sign);
1723     jit_unget_reg(reg);
1724 }
1725
1726 static void
1727 _remr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1728 {
1729     jit_int32_t         reg;
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));
1735         jit_unget_reg(reg);
1736     }
1737     else {
1738         divr(r0, r1, r2);
1739         mulr(r0, r2, r0);
1740         subr(r0, r1, r0);
1741     }
1742 }
1743
1744 static void
1745 _remi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1746 {
1747     jit_int32_t         reg;
1748     reg = jit_get_reg(jit_class_gpr);
1749     movi(rn(reg), i0);
1750     remr(r0, r1, rn(reg));
1751     jit_unget_reg(reg);
1752 }
1753
1754 static void
1755 _remr_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1756 {
1757     jit_int32_t         reg;
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));
1763         jit_unget_reg(reg);
1764     }
1765     else {
1766         divr_u(r0, r1, r2);
1767         mulr(r0, r2, r0);
1768         subr(r0, r1, r0);
1769     }
1770 }
1771
1772 static void
1773 _remi_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1774 {
1775     jit_int32_t         reg;
1776     reg = jit_get_reg(jit_class_gpr);
1777     movi(rn(reg), i0);
1778     remr_u(r0, r1, rn(reg));
1779     jit_unget_reg(reg);
1780 }
1781
1782 static void
1783 _andi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1784 {
1785     jit_int32_t         reg;
1786     if (s13_p(i0))
1787         ANDI(r1, i0, r0);
1788     else {
1789         reg = jit_get_reg(jit_class_gpr);
1790         movi(rn(reg), i0);
1791         andr(r0, r1, rn(reg));
1792         jit_unget_reg(reg);
1793     }
1794 }
1795
1796 static void
1797 _ori(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1798 {
1799     jit_int32_t         reg;
1800     if (s13_p(i0))
1801         ORI(r1, i0, r0);
1802     else {
1803         reg = jit_get_reg(jit_class_gpr);
1804         movi(rn(reg), i0);
1805         orr(r0, r1, rn(reg));
1806         jit_unget_reg(reg);
1807     }
1808 }
1809
1810 static void
1811 _xori(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1812 {
1813     jit_int32_t         reg;
1814     if (s13_p(i0))
1815         XORI(r1, i0, r0);
1816     else {
1817         reg = jit_get_reg(jit_class_gpr);
1818         movi(rn(reg), i0);
1819         xorr(r0, r1, rn(reg));
1820         jit_unget_reg(reg);
1821     }
1822 }
1823
1824 static void
1825 _extr_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1826 {
1827     lshi(r0, r1, __WORDSIZE - 8);
1828     rshi(r0, r0, __WORDSIZE - 8);
1829 }
1830
1831 static void
1832 _extr_s(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1833 {
1834     lshi(r0, r1, __WORDSIZE - 16);
1835     rshi(r0, r0, __WORDSIZE - 16);
1836 }
1837
1838 static void
1839 _extr_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1840 {
1841     lshi(r0, r1, __WORDSIZE - 16);
1842     rshi_u(r0, r0, __WORDSIZE - 16);
1843 }
1844
1845 #if __WORDSIZE == 64
1846 static void
1847 _extr_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1848 {
1849     lshi(r0, r1, __WORDSIZE - 32);
1850     rshi(r0, r0, __WORDSIZE - 32);
1851 }
1852
1853 static void
1854 _extr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1855 {
1856     lshi(r0, r1, __WORDSIZE - 32);
1857     rshi_u(r0, r0, __WORDSIZE - 32);
1858 }
1859 #endif
1860
1861 static void
1862 _cr(jit_state_t *_jit, jit_int32_t cc,
1863     jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
1864 {
1865     CMP(r1, r2);
1866 #  if __WORDSIZE == 32
1867     Ba(cc, 3);
1868 #  else
1869     BPa(cc, 3);
1870 #  endif
1871     movi(r0, 1);
1872     movi(r0, 0);
1873 }
1874
1875 static void
1876 _cw(jit_state_t *_jit, jit_int32_t cc,
1877     jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
1878 {
1879     jit_int32_t         reg;
1880     if (s13_p(i0)) {
1881         CMPI(r1, i0);
1882 #  if __WORDSIZE == 32
1883         Ba(cc, 3);
1884 #  else
1885         BPa(cc, 3);
1886 #  endif
1887         movi(r0, 1);
1888         movi(r0, 0);
1889     }
1890     else {
1891         reg = jit_get_reg(jit_class_gpr);
1892         movi(rn(reg), i0);
1893         cr(cc, r0, r1, rn(reg));
1894         jit_unget_reg(reg);
1895     }
1896 }
1897
1898 static void
1899 _ldi_c(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
1900 {
1901     jit_int32_t         reg;
1902     if (s13_p(i0))
1903         LDSBI(0, i0, r0);
1904     else {
1905         reg = jit_get_reg(jit_class_gpr);
1906         movi(rn(reg), i0);
1907         ldr_c(r0, rn(reg));
1908         jit_unget_reg(reg);
1909     }
1910 }
1911
1912 static void
1913 _ldi_uc(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
1914 {
1915     jit_int32_t         reg;
1916     if (s13_p(i0))
1917         LDUBI(0, i0, r0);
1918     else {
1919         reg = jit_get_reg(jit_class_gpr);
1920         movi(rn(reg), i0);
1921         ldr_uc(r0, rn(reg));
1922         jit_unget_reg(reg);
1923     }
1924 }
1925
1926 static void
1927 _ldi_s(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
1928 {
1929     jit_int32_t         reg;
1930     if (s13_p(i0))
1931         LDSHI(0, i0, r0);
1932     else {
1933         reg = jit_get_reg(jit_class_gpr);
1934         movi(rn(reg), i0);
1935         ldr_s(r0, rn(reg));
1936         jit_unget_reg(reg);
1937     }
1938 }
1939
1940 static void
1941 _ldi_us(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
1942 {
1943     jit_int32_t         reg;
1944     if (s13_p(i0))
1945         LDUHI(0, i0, r0);
1946     else {
1947         reg = jit_get_reg(jit_class_gpr);
1948         movi(rn(reg), i0);
1949         ldr_us(r0, rn(reg));
1950         jit_unget_reg(reg);
1951     }
1952 }
1953
1954 static void
1955 _ldi_i(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
1956 {
1957     jit_int32_t         reg;
1958     if (s13_p(i0)) {
1959 #  if __WORDSIZE == 32
1960         LDI(0, i0, r0);
1961 #  else
1962         LDSWI(0, i0, r0);
1963 #  endif
1964     }
1965     else {
1966         reg = jit_get_reg(jit_class_gpr);
1967         movi(rn(reg), i0);
1968         ldr_i(r0, rn(reg));
1969         jit_unget_reg(reg);
1970     }
1971 }
1972
1973 #  if __WORDSIZE == 64
1974 static void
1975 _ldi_ui(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
1976 {
1977     jit_int32_t         reg;
1978     if (s13_p(i0))
1979         LDUWI(0, i0, r0);
1980     else {
1981         reg = jit_get_reg(jit_class_gpr);
1982         movi(rn(reg), i0);
1983         ldr_ui(r0, rn(reg));
1984         jit_unget_reg(reg);
1985     }
1986 }
1987
1988 static void
1989 _ldi_l(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
1990 {
1991     jit_int32_t         reg;
1992     if (s13_p(i0))
1993         LDXI(0, i0, r0);
1994     else {
1995         reg = jit_get_reg(jit_class_gpr);
1996         movi(rn(reg), i0);
1997         ldr_l(r0, rn(reg));
1998         jit_unget_reg(reg);
1999     }
2000 }
2001 #  endif
2002
2003 static void
2004 _ldxi_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2005 {
2006     jit_int32_t         reg;
2007     if (s13_p(i0))
2008         LDSBI(r1, i0, r0);
2009     else {
2010         reg = jit_get_reg(jit_class_gpr);
2011         movi(rn(reg), i0);
2012         ldxr_c(r0, r1, rn(reg));
2013         jit_unget_reg(reg);
2014     }
2015 }
2016
2017 static void
2018 _ldxi_uc(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2019 {
2020     jit_int32_t         reg;
2021     if (s13_p(i0))
2022         LDUBI(r1, i0, r0);
2023     else {
2024         reg = jit_get_reg(jit_class_gpr);
2025         movi(rn(reg), i0);
2026         ldxr_uc(r0, r1, rn(reg));
2027         jit_unget_reg(reg);
2028     }
2029 }
2030
2031 static void
2032 _ldxi_s(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2033 {
2034     jit_int32_t         reg;
2035     if (s13_p(i0))
2036         LDSHI(r1, i0, r0);
2037     else {
2038         reg = jit_get_reg(jit_class_gpr);
2039         movi(rn(reg), i0);
2040         ldxr_s(r0, r1, rn(reg));
2041         jit_unget_reg(reg);
2042     }
2043 }
2044
2045 static void
2046 _ldxi_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2047 {
2048     jit_int32_t         reg;
2049     if (s13_p(i0))
2050         LDUHI(r1, i0, r0);
2051     else {
2052         reg = jit_get_reg(jit_class_gpr);
2053         movi(rn(reg), i0);
2054         ldxr_us(r0, r1, rn(reg));
2055         jit_unget_reg(reg);
2056     }
2057 }
2058
2059 static void
2060 _ldxi_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2061 {
2062     jit_int32_t         reg;
2063     if (s13_p(i0)) {
2064 #  if __WORDSIZE == 32
2065         LDI(r1, i0, r0);
2066 #  else
2067         LDSWI(r1, i0, r0);
2068 #  endif
2069     }
2070     else {
2071         reg = jit_get_reg(jit_class_gpr);
2072         movi(rn(reg), i0);
2073         ldxr_i(r0, r1, rn(reg));
2074         jit_unget_reg(reg);
2075     }
2076 }
2077
2078 #  if __WORDSIZE == 64
2079 static void
2080 _ldxi_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2081 {
2082     jit_int32_t         reg;
2083     if (s13_p(i0))
2084         LDUWI(r1, i0, r0);
2085     else {
2086         reg = jit_get_reg(jit_class_gpr);
2087         movi(rn(reg), i0);
2088         ldxr_ui(r0, r1, rn(reg));
2089         jit_unget_reg(reg);
2090     }
2091 }
2092
2093 static void
2094 _ldxi_l(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2095 {
2096     jit_int32_t         reg;
2097     if (s13_p(i0))
2098         LDXI(r1, i0, r0);
2099     else {
2100         reg = jit_get_reg(jit_class_gpr);
2101         movi(rn(reg), i0);
2102         ldxr_l(r0, r1, rn(reg));
2103         jit_unget_reg(reg);
2104     }
2105 }
2106 #  endif
2107
2108 static void
2109 _sti_c(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
2110 {
2111     jit_int32_t         reg;
2112     if (s13_p(i0))
2113         STBI(r0, 0, i0);
2114     else {
2115         reg = jit_get_reg(jit_class_gpr);
2116         movi(rn(reg), i0);
2117         str_c(rn(reg), r0);
2118         jit_unget_reg(reg);
2119     }
2120 }
2121
2122 static void
2123 _sti_s(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
2124 {
2125     jit_int32_t         reg;
2126     if (s13_p(i0))
2127         STHI(r0, 0, i0);
2128     else {
2129         reg = jit_get_reg(jit_class_gpr);
2130         movi(rn(reg), i0);
2131         str_s(rn(reg), r0);
2132         jit_unget_reg(reg);
2133     }
2134 }
2135
2136 static void
2137 _sti_i(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
2138 {
2139     jit_int32_t         reg;
2140     if (s13_p(i0)) {
2141 #  if __WORDSIZE == 32
2142         STI(r0, 0, i0);
2143 #  else
2144         STWI(r0, 0, i0);
2145 #  endif
2146     }
2147     else {
2148         reg = jit_get_reg(jit_class_gpr);
2149         movi(rn(reg), i0);
2150         str_i(rn(reg), r0);
2151         jit_unget_reg(reg);
2152     }
2153 }
2154
2155 #  if __WORDSIZE == 64
2156 static void
2157 _sti_l(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
2158 {
2159     jit_int32_t         reg;
2160     if (s13_p(i0))
2161         STXI(r0, 0, i0);
2162     else {
2163         reg = jit_get_reg(jit_class_gpr);
2164         movi(rn(reg), i0);
2165         str_l(rn(reg), r0);
2166         jit_unget_reg(reg);
2167     }
2168 }
2169 #  endif
2170
2171 static void
2172 _stxi_c(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2173 {
2174     jit_int32_t         reg;
2175     if (s13_p(i0))
2176         STBI(r1, r0, i0);
2177     else {
2178         reg = jit_get_reg(jit_class_gpr);
2179         movi(rn(reg), i0);
2180         stxr_c(r0, rn(reg), r1);
2181         jit_unget_reg(reg);
2182     }
2183 }
2184
2185 static void
2186 _stxi_s(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2187 {
2188     jit_int32_t         reg;
2189     if (s13_p(i0))
2190         STHI(r1, r0, i0);
2191     else {
2192         reg = jit_get_reg(jit_class_gpr);
2193         movi(rn(reg), i0);
2194         stxr_s(r0, rn(reg), r1);
2195         jit_unget_reg(reg);
2196     }
2197 }
2198
2199 static void
2200 _stxi_i(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2201 {
2202     jit_int32_t         reg;
2203     if (s13_p(i0)) {
2204 #  if __WORDSIZE == 32
2205         STI(r1, r0, i0);
2206 #  else
2207         STWI(r1, r0, i0);
2208 #  endif
2209     }
2210     else {
2211         reg = jit_get_reg(jit_class_gpr);
2212         movi(rn(reg), i0);
2213         stxr_i(r0, rn(reg), r1);
2214         jit_unget_reg(reg);
2215     }
2216 }
2217
2218 #  if __WORDSIZE == 64
2219 static void
2220 _stxi_l(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2221 {
2222     jit_int32_t         reg;
2223     if (s13_p(i0))
2224         STXI(r1, r0, i0);
2225     else {
2226         reg = jit_get_reg(jit_class_gpr);
2227         movi(rn(reg), i0);
2228         stxr_l(r0, rn(reg), r1);
2229         jit_unget_reg(reg);
2230     }
2231 }
2232 #  endif
2233
2234 static jit_word_t
2235 _br(jit_state_t *_jit, jit_int32_t cc,
2236     jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2237 {
2238     jit_word_t          w;
2239     CMP(r0, r1);
2240     w = _jit->pc.w;
2241 #  if __WORDSIZE == 32
2242     B(cc, (i0 - w) >> 2);
2243 #  else
2244     BP(cc, (i0 - w) >> 2);
2245 #  endif
2246     NOP();
2247     return (w);
2248 }
2249
2250 static jit_word_t
2251 _bw(jit_state_t *_jit, jit_int32_t cc,
2252     jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2253 {
2254     jit_word_t          w;
2255     jit_int32_t         reg;
2256     if (s13_p(i1)) {
2257         CMPI(r0, i1);
2258         w = _jit->pc.w;
2259 #  if __WORDSIZE == 32
2260         B(cc, (i0 - w) >> 2);
2261 #  else
2262         B(cc, (i0 - w) >> 2);
2263 #  endif
2264         NOP();
2265     }
2266     else {
2267         reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2268         movi(rn(reg), i1);
2269         w = br(cc, i0, r0, rn(reg));
2270         jit_unget_reg(reg);
2271     }
2272     return (w);
2273 }
2274
2275 static jit_word_t
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)
2278 {
2279     jit_word_t          w;
2280     if (add)
2281         ADDcc(r0, r1, r0);
2282     else
2283         SUBcc(r0, r1, r0);
2284     w = _jit->pc.w;
2285 #  if __WORDSIZE == 32
2286     B(sgn ?
2287       (jif ? SPARC_BVS : SPARC_BVC) :
2288       (jif ? SPARC_BCS : SPARC_BCC),
2289       (i0 - w) >> 2);
2290 #  else
2291     BP(sgn ?
2292        (jif ? SPARC_BPVS : SPARC_BPVC) :
2293        (jif ? SPARC_BPCS : SPARC_BPCC),
2294        (i0 - w) >> 2);
2295 #  endif
2296     NOP();
2297     return (w);
2298 }
2299
2300 static jit_word_t
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)
2303 {
2304     jit_word_t          w;
2305     jit_int32_t         reg;
2306     if (s13_p(i1)) {
2307         if (add)
2308             ADDIcc(r0, i1, r0);
2309         else
2310             SUBIcc(r0, i1, r0);
2311         w = _jit->pc.w;
2312 #  if __WORDSIZE == 32
2313         B(sgn ?
2314           (jif ? SPARC_BVS : SPARC_BVC) :
2315           (jif ? SPARC_BCS : SPARC_BCC),
2316           (i0 - w) >> 2);
2317 #  else
2318         BP(sgn ?
2319            (jif ? SPARC_BPVS : SPARC_BPVC) :
2320            (jif ? SPARC_BPCS : SPARC_BPCC),
2321            (i0 - w) >> 2);
2322 #  endif
2323         NOP();
2324     }
2325     else {
2326         reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2327         movi(rn(reg), i1);
2328         w = b_asr(jif, add, sgn, i0, r0, rn(reg));
2329         jit_unget_reg(reg);
2330     }
2331     return (w);
2332 }
2333
2334 static jit_word_t
2335 _bm_r(jit_state_t *_jit, jit_bool_t set,
2336       jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2337 {
2338     jit_word_t          w;
2339     BTST(r0, r1);
2340     w = _jit->pc.w;
2341 #  if __WORDSIZE == 32
2342     B(set ? SPARC_BNZ : SPARC_BZ, (i0 - w) >> 2);
2343 #  else
2344     BP(set ? SPARC_BPNE : SPARC_BPE, (i0 - w) >> 2);
2345 #  endif
2346     NOP();
2347     return (w);
2348 }
2349
2350 static jit_word_t
2351 _bm_w(jit_state_t *_jit, jit_bool_t set,
2352       jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2353 {
2354     jit_word_t          w;
2355     jit_int32_t         reg;
2356     if (s13_p(i1)) {
2357         BTSTI(r0, i1);
2358         w = _jit->pc.w;
2359 #  if __WORDSIZE == 32
2360         B(set ? SPARC_BNZ : SPARC_BZ, (i0 - w) >> 2);
2361 #  else
2362         BP(set ? SPARC_BPNE : SPARC_BPE, (i0 - w) >> 2);
2363 #  endif
2364         NOP();
2365     }
2366     else {
2367         reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2368         movi(rn(reg), i1);
2369         w = bm_r(set, i0, r0, rn(reg));
2370         jit_unget_reg(reg);
2371     }
2372     return (w);
2373 }
2374
2375 static void
2376 _jmpr(jit_state_t *_jit, jit_int32_t r0)
2377 {
2378     JMPL(0, r0, 0);
2379     NOP();
2380 }
2381
2382 static void
2383 _jmpi(jit_state_t *_jit, jit_word_t i0)
2384 {
2385     jit_word_t          w;
2386     jit_int32_t         reg;
2387     w = (i0 - _jit->pc.w) >> 2;
2388     if (s22_p(w)) {
2389         BA(w);
2390         NOP();
2391     }
2392     else {
2393         reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2394         movi(rn(reg), i0);
2395         jmpr(rn(reg));
2396         jit_unget_reg(reg);
2397     }
2398 }
2399
2400 static jit_word_t
2401 _jmpi_p(jit_state_t *_jit, jit_word_t i0)
2402 {
2403     jit_word_t          w;
2404     jit_int32_t         reg;
2405     reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2406     w = movi_p(rn(reg), i0);
2407     jmpr(rn(reg));
2408     jit_unget_reg(reg);
2409     return (w);
2410 }
2411
2412 static void
2413 _callr(jit_state_t *_jit, jit_int32_t r0)
2414 {
2415     CALL(r0);
2416     NOP();
2417 }
2418
2419 static void
2420 _calli(jit_state_t *_jit, jit_word_t i0)
2421 {
2422     jit_word_t          w;
2423     w = (i0 - _jit->pc.w) >> 2;
2424     CALLI(w);
2425     NOP();
2426 }
2427
2428 static jit_word_t
2429 _calli_p(jit_state_t *_jit, jit_word_t i0)
2430 {
2431     jit_word_t          w;
2432     jit_int32_t         reg;
2433     reg = jit_get_reg(jit_class_gpr);
2434     w = movi_p(rn(reg), i0);
2435     callr(rn(reg));
2436     jit_unget_reg(reg);
2437     return (w);
2438 }
2439
2440 #define OFF(n)          BIAS(((n) * sizeof(jit_word_t)))
2441 static void
2442 _prolog(jit_state_t *_jit, jit_node_t *node)
2443 {
2444     jit_int32_t         reg;
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)
2449             return;
2450         _jitc->function->self.aoff = frame;
2451     }
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);
2459
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);
2478
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));
2484         jit_unget_reg(reg);
2485     }
2486
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));
2491     }
2492 }
2493
2494 static void
2495 _epilog(jit_state_t *_jit, jit_node_t *node)
2496 {
2497     if (_jitc->function->assume_frame)
2498         return;
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));
2517     RESTOREI(0, 0, 0);
2518     RETL();
2519     NOP();
2520 }
2521
2522 static void
2523 _vastart(jit_state_t *_jit, jit_int32_t r0)
2524 {
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)));
2530     else
2531         addi(r0, _FP_REGNO, BIAS(_jitc->function->self.size));
2532 }
2533
2534 static void
2535 _vaarg(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
2536 {
2537     assert(_jitc->function->self.call & jit_call_varargs);
2538
2539     /* Load argument. */
2540     ldr(r0, r1);
2541
2542     /* Update vararg stack pointer. */
2543     addi(r1, r1, sizeof(jit_word_t));
2544 }
2545
2546 static void
2547 _patch_at(jit_state_t *_jit, jit_word_t instr, jit_word_t label)
2548 {
2549     jit_instr_t          i;
2550     union {
2551         jit_int32_t     *i;
2552         jit_word_t       w;
2553     } u;
2554
2555     u.w = instr;
2556     i.v = u.i[0];
2557
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;
2561             u.i[0] = i.v;
2562         }
2563 #  if __WORDSIZE == 64
2564         else if (i.op2.b == 1) {
2565             i.disp19.b = (label - instr) >> 2;
2566             u.i[0] = i.v;
2567         }
2568 #  endif
2569         else if (i.op2.b == 4) {        /* movi_p */
2570             /* SETHI */
2571             i.imm22.b = HI((int)label);
2572             u.i[0] = i.v;
2573             i.v = u.i[1];
2574             if (i.op.b == 2 && i.op3.b == 2) {
2575                 /* ORI */
2576                 i.simm13.b = LO(label);
2577                 u.i[1] = i.v;
2578 #  if __WORDSIZE == 64
2579                 i.v = u.i[2];
2580                 assert(i.op2.b == 4);
2581                 label = (label >> 32) & 0xffffffff;
2582                 i.imm22.b = HI((int)label);
2583                 u.i[2] = i.v;
2584                 i.v = u.i[3];
2585                 assert(i.op.b == 2 && i.op3.b == 2);
2586                 /* ORI */
2587                 i.simm13.b = LO(label);
2588                 u.i[3] = i.v;
2589 #  endif
2590             }
2591             else
2592                 abort();
2593         }
2594         else
2595             abort();
2596     }
2597     else
2598         abort();
2599 }
2600 #endif