git subrepo pull (merge) --force deps/lightning
[pcsx_rearmed.git] / deps / lightning / lib / jit_s390-cpu.c
CommitLineData
4a71579b 1/*
79bfeef6 2 * Copyright (C) 2013-2023 Free Software Foundation, Inc.
4a71579b
PC
3 *
4 * This file is part of GNU lightning.
5 *
6 * GNU lightning is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU Lesser General Public License as published
8 * by the Free Software Foundation; either version 3, or (at your option)
9 * any later version.
10 *
11 * GNU lightning is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
14 * License for more details.
15 *
16 * Authors:
17 * Paulo Cesar Pereira de Andrade
18 */
19
20#if PROTO
21# if __WORDSIZE == 32
22# define ldr(r0,r1) ldr_i(r0,r1)
23# define ldxr(r0,r1,r2) ldxr_i(r0,r1,r2)
24# define ldxi(r0,r1,i0) ldxi_i(r0,r1,i0)
25# define stxi(i0,r0,r1) stxi_i(i0,r0,r1)
26# else
27# define ldr(r0,r1) ldr_l(r0,r1)
28# define ldxr(r0,r1,r2) ldxr_l(r0,r1,r2)
29# define ldxi(r0,r1,i0) ldxi_l(r0,r1,i0)
30# define stxi(i0,r0,r1) stxi_l(i0,r0,r1)
31# endif
32# define is(i) *_jit->pc.us++ = i
33# if __WORDSIZE == 32
34# define stack_framesize 96
35# else
36# define stack_framesize 160
37# endif
38# define _R0_REGNO 0
39# define _R1_REGNO 1
40# define _R7_REGNO 7
41# define _R13_REGNO 13
42# define _FP_REGNO _R13_REGNO
43# define _R14_REGNO 14
44# define _R15_REGNO 15
45# define u12_p(i0) ((i0) >= 0 && (i0) <= 4095)
46# define s16_p(i0) ((i0) >= -32768 && (i0) <= 32767)
47# define x16(i0) ((i0) & 0xffff)
48# define s20_p(i0) ((i0) >= -524288 && (i0) <= 524287)
49# define x20(i0) ((i0) & 0xfffff)
50# if __WORDSIZE == 32
51# define s32_p(i0) 1
52# else
53# define s32_p(i0) \
54 ((i0) >= -2147483648L && (i0) < 2147483647L)
55# endif
56
57/*
58 Condition Code Instruction (Mask) Bit Mask Value
59 0 8 8
60 1 9 4
61 2 10 2
62 3 11 1
63
64AGR:
65 0 Zero
66 1 < zero
67 2 > zero
68 3 Overflow
69--
701 -> overflow CC_O
7114 -> no overflow CC_NO
72
73ALGR:
74 0 Zero, no carry
75 1 Not zero, no carry
76 2 Zero, carry
77 3 Not zero, carry
78--
792|1 -> carry CC_NLE
808|4 -> no carry CC_LE
81
82SGR:
83 0 Zero
84 1 < zero
85 2 > zero
86 3 Overflow
87--
881 -> overflow CC_O
8914 -> no overflow CC_NO
90
91SLGR:
92 0 --
93 1 Not zero, borrow
94 2 Zero, no borrow
95 3 Not zero, no borrow
96--
974 -> borrow CC_L
9811 -> no borrow CC_NL
99 */
100
101# define CC_NV 0x0
102# define CC_O 0x1
103# define CC_H 0x2
104# define CC_NLE 0x3
105# define CC_L 0x4
106# define CC_NHE 0x5
107# define CC_LH 0x6
108# define CC_NE 0x7
109# define CC_E 0x8
110# define CC_NLH 0x9
111# define CC_HE 0xA
112# define CC_NL 0xB
113# define CC_LE 0xC
114# define CC_NH 0xD
115# define CC_NO 0xE
116# define CC_AL 0xF
117# define _us jit_uint16_t
118# define _ui jit_uint32_t
119# define E_(Op) _E(_jit,Op)
120static void _E(jit_state_t*,_ui);
121# define I_(Op,I) _I(_jit,Op,I)
122static void _I(jit_state_t*,_ui,_ui);
123# define RR_(Op,R1,R2) _RR(_jit,Op,R1,R2)
124static void _RR(jit_state_t*,_ui,_ui,_ui);
125# define RRE_(Op,R1,R2) _RRE(_jit,Op,R1,R2)
126static void _RRE(jit_state_t*,_ui,_ui,_ui);
127# define RRF_(Op,R3,M4,R1,R2) _RRF(_jit,Op,R3,M4,R1,R2)
128static void _RRF(jit_state_t*,_ui,_ui,_ui,_ui,_ui);
129# define RX_(Op,R1,X2,B2,D2) _RX(_jit,Op,R1,X2,B2,D2)
130static void _RX(jit_state_t*,_ui,_ui,_ui,_ui,_ui);
131# define RXE_(Op,R1,X2,B2,D2,Op2) _RXE(_jit,Op,R1,X2,B2,D2,Op2)
132static void _RXE(jit_state_t*,_ui,_ui,_ui,_ui,_ui,_ui);
133# define RXF_(Op,R3,X2,B2,D2,R1,Op2) _RXF(_jit,Op,R3,X2,B2,D2,R1,Op2)
134static void _RXF(jit_state_t*,_ui,_ui,_ui,_ui,_ui,_ui,_ui);
135# define RXY_(Op,R1,X2,B2,D2,Op2) _RXY(_jit,Op,R1,X2,B2,D2,Op2)
136static void _RXY(jit_state_t*,_ui,_ui,_ui,_ui,_ui,_ui);
137# define RS_(Op,R1,R3,B2,D2) _RS(_jit,Op,R1,R3,B2,D2)
138static void _RS(jit_state_t*,_ui,_ui,_ui,_ui,_ui);
139# define RSY_(Op,R1,R3,B2,D2,Op2) RXY_(Op,R1,R3,B2,D2,Op2)
140# define RSL_(Op,L1,B1,D1,Op2) _RSL(_jit,Op,L1,B1,D1,Op2)
141static void _RSL(jit_state_t*,_ui,_ui,_ui,_ui,_ui);
142# define RSI_(Op,R1,R3,I2) _RSI(_jit,Op,R1,R3,I2)
143static void _RSI(jit_state_t*,_ui,_ui,_ui,_ui);
144# define RI_(Op,R1,Op2,I2) RSI_(Op,R1,Op2,I2)
145# define RIE_(Op,R1,R3,I2,Op2) _RIE(_jit,Op,R1,R3,I2,Op2)
146static void _RIE(jit_state_t*,_ui,_ui,_ui,_ui,_ui);
147# define RIL_(Op,R1,Op2,I2) _RIL(_jit,Op,R1,Op2,I2)
148static void _RIL(jit_state_t*,_ui,_ui,_ui,_ui);
149# define SI_(Op,I2,B1,D1) _SI(_jit,Op,I2,B1,D1)
150static void _SI(jit_state_t*,_ui,_ui,_ui,_ui);
151# define SIY_(Op,I2,B1,D1,Op2) _SIY(_jit,Op,I2,B1,D1,Op2)
152static void _SIY(jit_state_t*,_ui,_ui,_ui,_ui,_ui);
153# define S_(Op,B2,D2) _S(_jit,Op,B2,D2)
154static void _S(jit_state_t*,_ui,_ui,_ui);
155# define SSL_(Op,L,B1,D1,B2,D2) SS_(Op,(L)>>4,(L)&0xF,B1,D1,B2,D2)
156# define SS_(Op,LL,LH,B1,D1,B2,D2) _SS(_jit,Op,LL,LH,B1,D1,B2,D2)
157static void _SS(jit_state_t*,_ui,_ui,_ui,_ui,_ui,_ui,_ui);
158# define SSE_(Op,B1,D1,B2,D2) _SSE(_jit,Op,B1,D1,B2,D2)
159static void _SSE(jit_state_t*,_ui,_ui,_ui,_ui,_ui);
160# undef _us
161# undef _ui
162# define nop(c) _nop(_jit,c)
163static void _nop(jit_state_t*,jit_int32_t);
164# if __WORDSIZE == 32
165# define ADD_(r0,r1) AR(r0,r1)
166# define ADDI_(r0,i0) AHI(r0,i0)
167# define ADDC_(r0,r1) ALR(r0,r1)
168# define ADDX_(r0,r1) ALCR(r0,r1)
169# define AND_(r0,r1) NR(r0,r1)
170# define CMP_(r0,r1) CR(r0,r1)
171# define CMPU_(r0,r1) CLR(r0,r1)
172# define DIVREM_(r0,r1) DR(r0,r1)
173# define DIVREMU_(r0,r1) DLR(r0,r1)
174# define OR_(r0,r1) OR(r0,r1)
175# define MUL_(r0,r1) MSR(r0,r1)
176# define MULI_(r0,i0) MHI(r0,i0)
177# define MULU_(r0,r1) MLR(r0,r1)
178# define SUB_(r0,r1) SR(r0,r1)
179# define SUBC_(r0,r1) SLR(r0,r1)
180# define SUBX_(r0,r1) SLBR(r0,r1)
181# define TEST_(r0,r1) LTR(r0,r1)
182# define XOR_(r0,r1) XR(r0,r1)
183# else
184# define ADD_(r0,r1) AGR(r0,r1)
185# define ADDI_(r0,i0) AGHI(r0,i0)
186# define ADDC_(r0,r1) ALGR(r0,r1)
187# define ADDX_(r0,r1) ALCGR(r0,r1)
188# define AND_(r0,r1) NGR(r0,r1)
189# define CMP_(r0,r1) CGR(r0,r1)
190# define CMPU_(r0,r1) CLGR(r0,r1)
191# define DIVREM_(r0,r1) DSGR(r0,r1)
192# define DIVREMU_(r0,r1) DLGR(r0,r1)
193# define MUL_(r0,r1) MSGR(r0,r1)
194# define MULI_(r0,i0) MGHI(r0,i0)
195# define MULU_(r0,r1) MLGR(r0,r1)
196# define OR_(r0,r1) OGR(r0,r1)
197# define SUB_(r0,r1) SGR(r0,r1)
198# define SUBC_(r0,r1) SLGR(r0,r1)
199# define SUBX_(r0,r1) SLBGR(r0,r1)
200# define TEST_(r0,r1) LTGR(r0,r1)
201# define XOR_(r0,r1) XGR(r0,r1)
202# endif
203/****************************************************************
204 * General Instructions *
205 ****************************************************************/
206/* ADD */
207# define AR(R1,R2) RR_(0x1A,R1,R2)
208# define AGR(R1,R2) RRE_(0xB908,R1,R2)
209# define AGFR(R1,R2) RRE_(0xB918,R1,R2)
210# define A(R1,D2,X2,B2) RX_(0x5A,R1,X2,B2,D2)
211# define AY(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x5A)
212# define AG(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x08)
213# define AGF(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x18)
214/* ADD HALFWORD */
215# define AH(R1,D2,X2,B2) RX_(0x4A,R1,X2,B2,D2)
216# define AHY(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x7A)
217/* ADD HALFWORD IMMEDIATE */
218# define AHI(R1,I2) RI_(0xA7,R1,0xA,I2)
219# define AGHI(R1,I2) RI_(0xA7,R1,0xB,I2)
220/* ADD LOGICAL */
221# define ALR(R1,R2) RR_(0x1E,R1,R2)
222# define ALGR(R1,R2) RRE_(0xB90A,R1,R2)
223# define ALGFR(R1,R2) RRE_(0xB91A,R1,R2)
224# define AL(R1,D2,X2,B2) RX_(0x5E,R1,X2,B2,D2)
225# define ALY(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x5E)
226# define ALG(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x0A)
227# define ALGF(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x1A)
228/* ADD LOGICAL WITH CARRY */
229# define ALCR(R1,R2) RRE_(0xB998,R1,R2)
230# define ALCGR(R1,R2) RRE_(0xB988,R1,R2)
231# define ALC(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x98)
232# define ALCG(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x88)
233/* AND */
234# define NR(R1,R2) RR_(0x14,R1,R2)
235# define NGR(R1,R2) RRE_(0xB980,R1,R2)
236# define N(R1,D2,X2,B2) RX_(0x54,R1,X2,B2,D2)
237# define NY(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x54)
238# define NG(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x80)
239# define NI(D1,B1,I2) SI_(0x94,I2,B1,D1)
240# define NIY(D1,B1,I2) SIY_(0xEB,I2,B1,D1,0x54)
241# define NC(D1,L,B1,D2,B2) SSL_(0xD4,L,B1,D1,B2,D2)
242/* AND IMMEDIATE */
243# define NIHH(R1,I2) RI_(0xA5,R1,0x4,I2)
244# define NIHL(R1,I2) RI_(0xA5,R1,0x5,I2)
245# define NILH(R1,I2) RI_(0xA5,R1,0x6,I2)
246# define NILL(R1,I2) RI_(0xA5,R1,0x7,I2)
247/* BRANCH AND LINK */
248# define BALR(R1,R2) RR_(0x05,R1,R2)
249# define BAL(R1,D2,X2,B2) RX_(0x45,R1,X2,B2,D2)
250/* BRANCH AND SAVE */
251# define BASR(R1,R2) RR_(0x0D,R1,R2)
252# define BAS(R1,D2,X2,B2) RX_(0x4D,R1,X2,B2,D2)
253/* BRANCH AND SAVE AND SET MODE */
254# define BASSM(R1,R2) RR_(0x0C,R1,R2)
255/* BRANCH AND SET MODE */
256# define BSM(R1,R2) RR_(0x0B,R1,R2)
257/* BRANCH ON CONDITION */
258# define BCR(M1,R2) RR_(0x07,M1,R2)
259# define BR(R2) BCR(CC_AL,R2)
260# define NOPR(R2) BCR(CC_NV,R2)
261# define BC(M1,D2,X2,B2) RX_(0x47,M1,X2,B2,D2)
262/* BRANCH ON COUNT */
263# define BCTR(R1,R2) RR_(0x06,R1,R2)
264# define BCTGR(R1,R2) RRE_(0xB946,R1,R2)
265# define BCT(R1,D2,X2,B2) RX_(0x46,R1,X2,B2,D2)
266# define BCTG(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x46)
267/* BRANCH ON INDEX HIGH */
268# define BXH(R1,R3,D2,B2) RS_(0x86,R1,R3,B2,D2)
269# define BXHG(R1,R3,B2,D2) RSY_(0xEB,R1,R3,B2,D2,0x44)
270/* BRANCH ON INDEX LOW OR EQUAL */
271# define BXLE(R1,R3,D2,B2) RS_(0x87,R1,R3,B2,D2)
272# define BXLEG(R1,R3,B2,D2) RSY_(0xEB,R1,R3,B2,D2,0x45)
273/* BRANCH RELATIVE AND SAVE */
274# define BRAS(R1,I2) RI_(0xA7,R1,0x5,I2)
275/* BRANCH RELATIVE AND SAVE LONG */
276# define BRASL(R1,I2) RIL_(0xC0,R1,0x5,I2)
277/* BRANCH RELATIVE ON CONDITION */
278# define BRC(M1,I2) RI_(0xA7,M1,0x4,I2)
279# define J(I2) BRC(CC_AL,I2)
280/* BRANCH RELATIVE ON CONDITION LONG */
281# define BRCL(M1,I2) RIL_(0xC0,M1,0x4,I2)
282# define BRL(I2) BRCL(CC_AL,I2)
283/* BRANCH RELATIVE ON COUNT */
284# define BRCT(M1,I2) RI_(0xA7,M1,0x6,I2)
285# define BRCTG(M1,I2) RI_(0xA7,M1,0x7,I2)
286/* BRANCH RELATIVE ON INDEX HIGH */
287# define BRXH(R1,R3,I2) RSI_(0x84,R1,R3,I2)
288# define BRXHG(R1,R3,I2) RIE_(0xEC,R1,R3,I2,0x44)
289/* BRANCH RELATIVE ON INDEX LOW OR EQUAL */
290# define BRXLE(R1,R3,I2) RSI_(0x85,R1,R3,I2)
291# define BRXLEG(R1,R3,I2) RIE_(0xEC,R1,R3,I2,0x45)
292/* CHECKSUM */
293# define CKSUM(R1,R2) RRE_(0xB241,R1,R2)
294/* CIPHER MESAGE (KM) */
295# define KM(R1,R2) RRE_(0xB92E,R1,R2)
296/* CIPHER MESAGE WITH CHAINING (KMC) */
297# define KMC(R1,R2) RRE_(0xB92F,R1,R2)
298/* COMPARE */
299# define CR(R1,R2) RR_(0x19,R1,R2)
300# define CGR(R1,R2) RRE_(0xB920,R1,R2)
301# define CGFR(R1,R2) RRE_(0xB930,R1,R2)
302# define C(R1,D2,X2,B2) RX_(0x59,R1,X2,B2,D2)
303# define CY(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x59)
304# define CG(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x20)
305# define CGF(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x30)
306/* COMPARE AND FORM CODEWORD */
307# define CFC(D2,B2) S_(0xB21A,B2,D2)
308/* COMPARE AND SWAP */
309# define CS(R1,R3,D2,B2) RS_(0xBA,R1,R3,B2,D2)
310# define CSY(R1,R3,D2,B2) RSY_(0xEB,R1,R3,B2,D2,0x14)
311# define CSG(R1,R3,D2,B2) RSY_(0xEB,R1,R3,B2,D2,0x30)
312/* COMPARE DOUBLE AND SWAP */
313# define CDS(R1,R3,D2,B2) RS_(0xBB,R1,R3,B2,D2)
314# define CSDY(R1,R3,D2,B2) RSY_(0xEB,R1,R3,B2,D2,0x31)
315# define CSDG(R1,R3,D2,B2) RSY_(0xEB,R1,R3,B2,D2,0x3E)
316/* COMPARE HALFWORD */
317# define CH(R1,D2,X2,B2) RX_(0x49,R1,X2,B2,D2)
318# define CHY(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x79)
319/* COMPARE HALFWORD IMMEDIATE */
320# define CHI(R1,I2) RI_(0xA7,R1,0xE,I2)
321# define CGHI(R1,I2) RI_(0xA7,R1,0xF,I2)
322/* COMPARE LOGICAL */
323# define CLR(R1,R2) RR_(0x15,R1,R2)
324# define CLGR(R1,R2) RRE_(0xB921,R1,R2)
325# define CLGFR(R1,R2) RRE_(0xB931,R1,R2)
326# define CL(R1,D2,X2,B2) RX_(0x55,R1,X2,B2,D2)
327# define CLY(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x55)
328# define CLG(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x21)
329# define CLGF(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x31)
330# define CLI(D1,B1,I2) SI_(0x95,I2,B1,D1)
331# define CLIY(D1,B1,I2) SIY_(0xEB,I2,B1,D1,0x55)
332# define CLC(D1,L,B1,D2,B2) SSL_(0xD5,L,B1,D1,B2,D2)
333/* COMPARE LOGICAL CHARACTERS UNDER MASK */
334# define CLM(R1,M3,D2,B2) RS_(0xBD,R1,M3,B2,D2)
335# define CLMY(R1,M3,D2,B2) RSY_(0xEB,R1,M3,B2,D2,0x21)
336# define CLMH(R1,M3,D2,B2) RSY_(0xEB,R1,M3,B2,D2,0x20)
337/* COMPARE LOGICAL LONG */
338# define CLCL(R1,R2) RR_(0x0F,R1,R2)
339/* COMPARE LOGICAL LONG EXTENDED */
340# define CLCLE(R1,R3,D2,B2) RS_(0xA9,R1,R3,B2,D2)
341/* COMPARE LOGICAL LONG UNICODE */
342# define CLCLU(R1,R3,D2,B2) RSY_(0xEB,R1,R3,B2,D2,0x8F)
343/* COMPARE LOGICAL STRING */
344# define CLST(R1,R2) RRE_(0xB25D,R1,R2)
345/* COMPARE UNTIL SUBSTRING EQUAL */
346# define CUSE(R1,R2) RRE_(0xB257,R1,R2)
347/* COMPRESSION CALL */
348# define CMPSC(R1,R2) RRE_(0xB263,R1,R2)
349/* COMPUTE INTERMEDIATE MESSAGE DIGEST (KIMD) */
350# define KIMD(R1,R2) RRE_(0xB93E,R1,R2)
351/* COMPUTE LAST MESSAGE DIGEST (KIMD) */
352# define KLMD(R1,R2) RRE_(0xB93F,R1,R2)
353/* COMPUTE MESSAGE AUTHENTICATION CODE (KMAC) */
354# define KMAC(R1,R2) RRE_(0xB91E,R1,R2)
355/* CONVERT TO BINARY */
356# define CVB(R1,D2,X2,B2) RX_(0x4F,R1,X2,B2,D2)
357# define CVBY(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x06)
358# define CVBG(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x0e)
359/* CONVERT TO DECIMAL */
360# define CVD(R1,D2,X2,B2) RX_(0x4E,R1,X2,B2,D2)
361# define CVDY(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x26)
362# define CVDG(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x2E)
363/* CONVERT UNICODE TO UTF-8 */
364# define CUUTF(R1,R2) RRE_(0xB2A6,R1,R2)
365/* CONVERT UTF-8 TO UNICODE */
366# define CUTFU(R1,R2) RRE_(0xB2A7,R1,R2)
367/* COPY ACCESS */
368# define CPYA(R1,R2) RRE_(0xB24D,R1,R2)
369/* DIVIDE */
370# define DR(R1,R2) RR_(0x1D,R1,R2)
371# define D(R1,D2,X2,B2) RX_(0x5D,R1,X2,B2,D2)
372/* DIVIDE LOGICAL */
373# define DLR(R1,R2) RRE_(0xB997,R1,R2)
374# define DLGR(R1,R2) RRE_(0xB987,R1,R2)
375# define DL(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x97)
376# define DLG(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x87)
377/* DIVIDE SINGLE */
378# define DSGR(R1,R2) RRE_(0xB90D,R1,R2)
379# define DSGFR(R1,R2) RRE_(0xB91D,R1,R2)
380# define DSG(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x0D)
381# define DSGF(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x1D)
382/* EXCLUSIVE OR */
383# define XR(R1,R2) RR_(0x17,R1,R2)
384# define XGR(R1,R2) RRE_(0xB982,R1,R2)
385# define X(R1,D2,X2,B2) RX_(0x57,R1,X2,B2,D2)
386# define XY(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x57)
387# define XG(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x82)
388# define XI(D1,B1,I2) SI_(0x97,I2,B1,D1)
389# define XIY(D1,B1,I2) SIY_(0xEB,I2,B1,D1,0x57)
390# define XC(D1,L,B1,D2,B2) SSL_(0xD7,L,B1,D1,B2,D2)
391/* EXECUTE */
392# define EX(R1,D2,X2,B2) RX_(0x44,R1,X2,B2,D2)
393/* EXTRACT ACCESS */
394# define EAR(R1,R2) RRE_(0xB24F,R1,R2)
395/* EXTRACT PSW */
396# define EPSW(R1,R2) RRE_(0xB98D,R1,R2)
79bfeef6
PC
397/* FIND LEFTMOST ONE */
398# define FLOGR(R1,R2) RRE_(0xB983,R1,R2)
4a71579b
PC
399/* INSERT CHARACTER */
400# define IC(R1,D2,X2,B2) RX_(0x43,R1,X2,B2,D2)
401# define ICY(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x73)
402/* INSERT CHARACTERS UNDER MASK */
403# define ICM(R1,M3,D2,B2) RS_(0xBF,R1,M3,B2,D2)
404# define ICMY(R1,M3,D2,B2) RSY_(0xEB,R1,M3,B2,D2,0x81)
405# define ICMH(R1,M3,D2,B2) RSY_(0xEB,R1,M3,B2,D2,0x80)
406/* INSERT IMMEDIATE */
407# define IIHH(R1,I2) RI_(0xA5,R1,0x0,I2)
408# define IIHL(R1,I2) RI_(0xA5,R1,0x1,I2)
409# define IILH(R1,I2) RI_(0xA5,R1,0x2,I2)
410# define IILL(R1,I2) RI_(0xA5,R1,0x3,I2)
411/* INSERT PROGRAM MASK */
412# define IPM(R1) RRE_(0xB222,R1,0)
413/* LOAD */
414# define LR(R1,R2) RR_(0x18,R1,R2)
415# define LGR(R1,R2) RRE_(0xB904,R1,R2)
416# define LGFR(R1,R2) RRE_(0xB914,R1,R2)
417# define L(R1,D2,X2,B2) RX_(0x58,R1,X2,B2,D2)
418# define LY(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x58)
419# define LG(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x04)
420# define LGF(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x14)
421/* LOAD ACCESS MULTIPLE */
422# define LAM(R1,R3,D2,B2) RS_(0x9A,R1,R3,B2,D2)
423# define LAMY(R1,R3,D2,B2) RSY_(0xEB,R1,R3,B2,D2,0x9A)
424/* LOAD ADDRESS */
425# define LA(R1,D2,X2,B2) RX_(0x41,R1,X2,B2,D2)
426# define LAY(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x71)
427/* LOAD ADDRESS EXTENDED */
428# define LAE(R1,D2,X2,B2) RX_(0x51,R1,X2,B2,D2)
429/* LOAD ADDRESS RELATIVE LONG */
430# define LARL(R1,I2) RIL_(0xC0,R1,0x0,I2)
431/* LOAD AND TEST */
432# define LTR(R1,R2) RR_(0x12,R1,R2)
433# define LTGR(R1,R2) RRE_(0xB902,R1,R2)
434# define LTGFR(R1,R2) RRE_(0xB912,R1,R2)
435/* LOAD BYTE */
436# define LGBR(R1,R2) RRE_(0xB906,R1,R2) /* disasm */
437# define LB(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x76)
438# define LGB(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x77)
439/* LOAD COMPLEMENT */
440# define LCR(R1,R2) RR_(0x13,R1,R2)
441# define LCGR(R1,R2) RRE_(0xB903,R1,R2)
442# define LCGFR(R1,R2) RRE_(0xB913,R1,R2)
443/* LOAD HALFWORD */
444# define LH(R1,D2,X2,B2) RX_(0x48,R1,X2,B2,D2)
445# define LHY(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x78)
446# define LGHR(R1,R2) RRE_(0xB907,R1,R2) /* disasm */
447# define LGH(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x15)
448/* LOAD HALFWORD IMMEDIATE */
449# define LHI(R1,I2) RI_(0xA7,R1,0x8,I2)
450# define LGHI(R1,I2) RI_(0xA7,R1,0x9,I2)
451/* LOAD LOGICAL */
452# define LLGFR(R1,R2) RRE_(0xB916,R1,R2)
453# define LLGF(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x16)
454/* LOAD LOGICAL CHARACTER */
455# define LLGCR(R1,R2) RRE_(0xB984,R1,R2) /* disasm */
456# define LLGC(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x90)
457/* LOAD LOGICAL HALFWORD */
458# define LLGHR(R1,R2) RRE_(0xB985,R1,R2) /* disasm */
459# define LLGH(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x91)
460/* LOAD LOGICAL IMMEDIATE */
461# define LLIHH(R1,I2) RI_(0xA5,R1,0xC,I2)
462# define LLIHL(R1,I2) RI_(0xA5,R1,0xD,I2)
463# define LLILH(R1,I2) RI_(0xA5,R1,0xE,I2)
464# define LLILL(R1,I2) RI_(0xA5,R1,0xF,I2)
465/* LOAD LOGICAL THIRTY ONE BITS */
466# define LLGTR(R1,R2) RRE_(0xB917,R1,R2)
467# define LLGT(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x17)
468/* LOAD MULTIPLE */
469# define LM(R1,R3,D2,B2) RS_(0x98,R1,R3,B2,D2)
470# define LMY(R1,R3,D2,B2) RSY_(0xEB,R1,R3,B2,D2,0x98)
471# define LMG(R1,R3,D2,B2) RSY_(0xEB,R1,R3,B2,D2,0x04)
472/* LOAD MULTIPLE DISJOINT */
473# define LMD(R1,R3,D2,B2,D4,B4) SS_(0xEF,R1,R3,B2,D2,B4,D4)
474/* LOAD MULTIPLE HIGH */
475# define LMH(R1,R3,D2,B2) RSY_(0xEB,R1,R3,B2,D2,0x96)
476/* LOAD NEGATIVE */
477# define LNR(R1,R2) RR_(0x11,R1,R2)
478# define LNGR(R1,R2) RRE_(0xB901,R1,R2)
479# define LNGFR(R1,R2) RRE_(0xB911,R1,R2)
480/* LOAD PAIR FROM QUADWORD */
481# define LPQ(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x8F)
482/* LOAD POSITIVE */
483# define LPR(R1,R2) RR_(0x10,R1,R2)
484# define LPGR(R1,R2) RRE_(0xB900,R1,R2)
485# define LPGFR(R1,R2) RRE_(0xB910,R1,R2)
486/* LOAD REVERSED */
487# define LRVR(R1,R2) RRE_(0xB91F,R1,R2)
488# define LRVGR(R1,R2) RRE_(0xB90F,R1,R2)
489# define LRVH(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x1F)
490# define LRV(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x1E)
491# define LRVG(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x0F)
492/* MONITOR CALL */
493# define MC(D1,B1,I2) SI_(0xAF,I2,B1,D1)
494/* MOVE */
495# define MVI(D1,B1,I2) SI_(0x92,I2,B1,D1)
496# define MVIY(D1,B1,I2) SIY_(0xEB,I2,B1,D1,0x52)
497# define MVC(D1,L,B1,D2,B2) SSL_(0xD2,L,B1,D1,B2,D2)
498/* MOVE INVERSE */
499# define MVCIN(D1,L,B1,D2,B2) SSL_(0xE8,L,B1,D1,B2,D2)
500/* MOVE LONG */
501# define MVCL(R1,R2) RR_(0x0E,R1,R2)
502/* MOVE LONG EXTENDED */
503# define MVCLE(R1,R3,D2,B2) RS_(0xA8,R1,R3,B2,D2)
504/* MOVE LONG UNICODE */
505# define MVCLU(R1,R3,D2,B2) RSY_(0xEB,R1,R3,B2,D2,0x8E)
506/* MOVE NUMERICS */
507# define MVN(D1,L,B1,D2,B2) SSL_(0xD1,L,B1,D1,B2,D2)
508/* MOVE STRING */
509# define MVST(R1,R2) RRE_(0xB255,R1,R2)
510/* MOVE WITH OFFSET */
511# define MVO(D1,L1,B1,D2,L2,B2) SS_(0xF1,L1,L2,B1,D1,B2,D2)
512/* MOVE ZONES */
513# define MVZ(D1,L,B1,D2,B2) SSL_(0xD3,L,B1,D1,B2,D2)
514/* MULTIPLY */
515# define MR(R1,R2) RR_(0x1C,R1,R2)
516# define M(R1,D2,X2,B2) RX_(0x5C,R1,X2,B2,D2)
517/* MULTIPLY HALFWORD */
518# define MH(R1,D2,X2,B2) RX_(0x4C,R1,X2,B2,D2)
519/* MULTIPLY HALFWORD IMMEDIATE */
520# define MHI(R1,I2) RI_(0xA7,R1,0xC,I2)
521# define MGHI(R1,I2) RI_(0xA7,R1,0xD,I2)
522/* MULTIPLY LOGICAL */
523# define MLR(R1,R2) RRE_(0xB996,R1,R2)
524# define MLGR(R1,R2) RRE_(0xB986,R1,R2)
525# define ML(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x96)
526# define MLG(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x86)
527/* MULTIPLY SINGLE */
528# define MSR(R1,R2) RRE_(0xB252,R1,R2)
529# define MSGR(R1,R2) RRE_(0xB90C,R1,R2)
530# define MSGFR(R1,R2) RRE_(0xB91C,R1,R2)
531# define MS(R1,D2,X2,B2) RX_(0x71,R1,X2,B2,D2)
532# define MSY(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x51)
533# define MSG(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x0C)
534# define MSGF(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x1C)
535/* OR */
536# define OR(R1,R2) RR_(0x16,R1,R2)
537# define OGR(R1,R2) RRE_(0xB981,R1,R2)
538# define O(R1,D2,X2,B2) RX_(0x56,R1,X2,B2,D2)
539# define OY(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x56)
540# define OG(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x81)
541# define OI(D1,B1,I2) SI_(0x96,I2,B1,D1)
542# define OIY(D1,B1,I2) SIY_(0xEB,I2,B1,D1,0x56)
543# define OC(D1,L,B1,D2,B2) SSL_(0xD6,L,B1,D1,B2,D2)
544/* OR IMMEDIATE */
545# define OIHH(R1,I2) RI_(0xA5,R1,0x8,I2)
546# define OIHL(R1,I2) RI_(0xA5,R1,0x9,I2)
547# define OILH(R1,I2) RI_(0xA5,R1,0xA,I2)
548# define OILL(R1,I2) RI_(0xA5,R1,0xB,I2)
549/* PACK */
550# define PACK(D1,L1,B1,D2,L2,B2) SS_(0xF2,L1,L2,B1,D1,B2,D2)
551/* PACK ASCII */
552# define PKA(D1,B1,D2,L2,B2) SSL_(0xE9,L2,B1,D1,B2,D2)
553/* PACK UNICODE */
554# define PKU(D1,B1,D2,L2,B2) SSL_(0xE1,L2,B1,D1,B2,D2)
555/* PERFORM LOCKED OPERATION */
556# define PLO(R1,D2,B2,R3,D4,B4) SS_(0xEE,R1,R3,B2,D2,B4,D4)
557/* ROTATE LEFT SINGLE LOGICAL */
558# define RLL(R1,R3,D2,B2) RSY_(0xEB,R1,R3,B2,D2,0x1D)
559# define RLLG(R1,R3,D2,B2) RSY_(0xEB,R1,R3,B2,D2,0x1C)
560/* SEARCH STRING */
561# define SRST(R1,R2) RRE_(0xB25E,R1,R2)
562/* SET ACCESS */
563# define SAR(R1,R2) RRE_(0xB24E,R1,R2)
564/* SET ADDRESSING MODE */
565# define SAM24() E_(0x10C)
566# define SAM31() E_(0x10D)
567# define SAM64() E_(0x10E)
568/* SET PROGRAM MASK */
569# define SPM(R1) RR_(0x04,R1,0)
570/* SHIFT LEFT DOUBLE */
571# define SLDA(R1,D2,B2) RS_(0x8F,R1,0,B2,D2)
572/* SHIFT LEFT DOUBLE LOGICAL */
573# define SLDL(R1,D2,B2) RS_(0x8D,R1,0,B2,D2)
574/* SHIFT LEFT SINGLE */
575# define SLA(R1,D2,B2) RS_(0x8B,R1,0,B2,D2)
576# define SLAG(R1,R3,D2,B2) RSY_(0xEB,R1,R3,B2,D2,0x0B)
577/* SHIFT LEFT SINGLE LOGICAL */
578# define SLL(R1,D2,B2) RS_(0x89,R1,0,B2,D2)
579# define SLLG(R1,R3,D2,B2) RSY_(0xEB,R1,R3,B2,D2,0x0D)
580/* SHIFT RIGHT DOUBLE */
581# define SRDA(R1,D2,B2) RS_(0x8E,R1,0,B2,D2)
582/* SHIFT RIGHT DOUBLE LOGICAL */
583# define SRDL(R1,D2,B2) RS_(0x8C,R1,0,B2,D2)
584/* SHIFT RIGHT SINGLE */
585# define SRA(R1,D2,B2) RS_(0x8A,R1,0,B2,D2)
586# define SRAG(R1,R3,D2,B2) RSY_(0xEB,R1,R3,B2,D2,0x0A)
587/* SHIFT RIGHT SINGLE LOGICAL */
588# define SRL(R1,D2,B2) RS_(0x88,R1,0,B2,D2)
589# define SRLG(R1,R3,D2,B2) RSY_(0xEB,R1,R3,B2,D2,0x0C)
590/* STORE */
591# define ST(R1,D2,X2,B2) RX_(0x50,R1,X2,B2,D2)
592# define STY(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x50)
593# define STG(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x24)
594/* STORE ACCESS MULTIPLE */
595# define STAM(R1,R3,D2,B2) RS_(0x9B,R1,R3,B2,D2)
596# define STAMY(R1,R3,D2,B2) RSY_(0xEB,R1,R3,B2,D2,0x9B)
597/* STORE CHARACTER */
598# define STC(R1,D2,X2,B2) RX_(0x42,R1,X2,B2,D2)
599# define STCY(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x72)
600/* STORE CHARACTERS UNDER MASK */
601# define STCM(R1,M3,D2,B2) RS_(0xBE,R1,M3,B2,D2)
602# define STCMY(R1,M3,D2,B2) RSY_(0xEB,R1,M3,B2,D2,0x2D)
603# define STCMH(R1,M3,D2,B2) RSY_(0xEB,R1,M3,B2,D2,0x2C)
604/* STORE CLOCK */
605# define STCK(D2,B2) S_(0xB205,B2,D2)
606/* STORE CLOCK EXTENDED */
607# define STCKE(D2,B2) S_(0xB278,B2,D2)
608/* STORE HALFWORD */
609# define STH(R1,D2,X2,B2) RX_(0x40,R1,X2,B2,D2)
610# define STHY(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x70)
611/* STORE MULTIPLE */
612# define STM(R1,R3,D2,B2) RS_(0x90,R1,R3,B2,D2)
613# define STMY(R1,R3,D2,B2) RSY_(0xEB,R1,R3,B2,D2,0x90)
614# define STMG(R1,R3,D2,B2) RSY_(0xEB,R1,R3,B2,D2,0x24)
615/* STORE MULTIPLE HIGH */
616# define STMH(R1,R3,D2,B2) RSY_(0xEB,R1,R3,B2,D2,0x26)
617/* STORE PAIR TO QUADWORD */
618# define STPQ(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x8E)
619/* STORE REVERSED */
620# define STRVH(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x3F)
621# define STRV(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x3E)
622# define STRVG(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x2F)
623/* SUBTRACT */
624# define SR(R1,R2) RR_(0x1B,R1,R2)
625# define SGR(R1,R2) RRE_(0xB909,R1,R2)
626# define SGFR(R1,R2) RRE_(0xB919,R1,R2)
627# define S(R1,D2,X2,B2) RX_(0x5B,R1,X2,B2,D2)
628# define SY(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x5B)
629# define SG(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x09)
630# define SGF(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x19)
631/* SUBTRACT HALFWORD */
632# define SH(R1,D2,X2,B2) RX_(0x4B,R1,X2,B2,D2)
633# define SHY(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x7B)
634/* SUBTRACT LOGICAL */
635# define SLR(R1,R2) RR_(0x1F,R1,R2)
636# define SLGR(R1,R2) RRE_(0xB90B,R1,R2)
637# define SLGFR(R1,R2) RRE_(0xB91B,R1,R2)
638# define SL(R1,D2,X2,B2) RX_(0x5F,R1,X2,B2,D2)
639# define SLY(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x5F)
640# define SLG(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x0B)
641# define SLGF(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x1B)
642/* SUBTRACT LOGICAL WITH BORROW */
643# define SLBR(R1,R2) RRE_(0xB999,R1,R2)
644# define SLBGR(R1,R2) RRE_(0xB989,R1,R2)
645# define SLB(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x99)
646# define SLBG(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x89)
647/* SUPERVISOR CALL */
648# define SVC(I) I_(0xA,I)
649/* TEST ADDRESSING MODE */
650# define TAM() E_(0x10B)
651/* TEST AND SET */
652# define TS(D2,B2) RS_(0x93,0,0,B2,D2)
653/* TEST UNDER MASK (TEST UNDER MASK HIGH, TEST UNDER MASK LOW) */
654# define TM(D1,B1,I2) SI_(0x91,I2,B1,D1)
655# define TMY(D1,B1,I2) SIY_(0xEB,I2,B1,D1,0x51)
656# define TMHH(R1,I2) RI_(0xA7,R1,0x2,I2)
657# define TMHL(R1,I2) RI_(0xA7,R1,0x3,I2)
658# define TMLH(R1,I2) RI_(0xA7,R1,0x0,I2)
659# define TMH(R1,I2) TMLH(R1,I2)
660# define TMLL(R1,I2) RI_(0xA7,R1,0x1,I2)
661# define TML(R1,I2) TMLL(R1,I2)
662/* TRANSLATE */
663# define TR(D1,L,B1,D2,B2) SSL_(0xDC,L,B1,D1,B2,D2)
664/* TRANSLATE AND TEST */
665# define TRT(D1,L,B1,D2,B2) SSL_(0xDD,L,B1,D1,B2,D2)
666/* TRANSLATE EXTENDED */
667# define TRE(R1,R2) RRE_(0xB2A5,R1,R2)
668/* TRANSLATE ONE TO ONE */
669# define TROO(R1,R2) RRE_(0xB993,R1,R2)
670/* TRANSLATE ONE TO TWO */
671# define TROT(R1,R2) RRE_(0xB992,R1,R2)
672/* TRANSLATE TWO TO ONE */
673# define TRTO(R1,R2) RRE_(0xB991,R1,R2)
674/* TRANSLATE TWO TO TWO */
675# define TRTT(R1,R2) RRE_(0xB990,R1,R2)
676/* UNPACK */
677# define UNPK(D1,L1,B1,D2,L2,B2) SS_(0xF3,L1,L2,B1,D1,B2,D2)
678/* UNPACK ASCII */
679# define UNPKA(D1,L1,B1,D2,L2,B2) SS_(0xEA,L1,L2,B1,D1,B2,D2)
680/* UNPACK UNICODE */
681# define UNPKU(D1,L1,B1,D2,L2,B2) SS_(0xE2,L1,L2,B1,D1,B2,D2)
682/* UPDATE TREE */
683# define UPT() E_(0x0102)
684/****************************************************************
685 * Decimal Instructions *
686 ****************************************************************/
687/* ADD DECIMAL */
688# define AP(D1,L1,B1,D2,L2,B2) SS_(0xFA,L1,L2,B1,D1,B2,D2)
689/* COMPARE DECIMAL */
690# define CP(D1,L1,B1,D2,L2,B2) SS_(0xF9,L1,L2,B1,D1,B2,D2)
691/* DIVIDE DECIMAL */
692# define DP(D1,L1,B1,D2,L2,B2) SS_(0xFD,L1,L2,B1,D1,B2,D2)
693/* EDIT */
694# define ED(D1,L,B1,D2,B2) SSL_(0xDE,L,B1,D1,B2,D2)
695/* EDIT AND MARK */
696# define EDMK(D1,L,B1,D2,B2) SSL_(0xDE,L,B1,D1,B2,D2)
697/* MULTIPLY DECIMAL */
698# define MP(D1,L1,B1,D2,L2,B2) SS_(0xFC,L1,L2,B1,D1,B2,D2)
699/* SHIFT AND ROUND DECIMAL */
700# define SRP(D1,L1,B1,D2,L2,B2) SS_(0xF0,L1,L2,B1,D1,B2,D2)
701/* SUBTRACE DECIMAL */
702# define SP(D1,L1,B1,D2,L2,B2) SS_(0xFB,L1,L2,B1,D1,B2,D2)
703/* TEST DECIMAL */
704# define TP(D1,L1,B1) RSL_(0xEB,L1,B1,D1,0xC0)
705/* ZERO AND ADD */
706# define ZAP(D1,L1,B1,D2,L2,B2) SS_(0xF8,L1,L2,B1,D1,B2,D2)
707/****************************************************************
708 * Control Instructions *
709 ****************************************************************/
710/* BRANCH AND SET AUTHORITY */
711# define BSA(R1,R2) RRE_(0xB25A,R1,R2)
712/* BRANCH AND STACK */
713# define BAKR(R1,R2) RRE_(0xB240,R1,R2)
714/* BRANCH IN SUBSPACE GROUP */
715# define BSG(R1,R2) RRE_(0xB258,R1,R2)
716/* COMPARE AND SWAP AND PURGE */
717# define CSP(R1,R2) RRE_(0xB250,R1,R2)
718# define CSPG(R1,R2) RRE_(0xB98A,R1,R2)
719/* DIAGNOSE */
720# define DIAG() SI_(0x83,0,0,0)
721/* EXTRACT AND SET EXTENDED AUTHORITY */
722# define ESEA(R1) RRE_(0xB99D,R1,0)
723/* EXTRACT PRIMARY ASN */
724# define EPAR(R1) RRE_(0xB226,R1,0)
725/* EXTRACT SECONDARY ASN */
726# define ESAR(R1) RRE_(0xB227,R1,0)
727/* EXTRACT STACKED REGISTERS */
728# define EREG(R1,R2) RRE_(0xB249,R1,R2)
729# define EREGG(R1,R2) RRE_(0xB90E,R1,R2)
730/* EXTRACT STACKED STATE */
731# define ESTA(R1,R2) RRE_(0xB24A,R1,R2)
732/* INSERT ADDRESS SPACE CONTROL */
733# define IAC(R1) RRE_(0xB224,R1,0)
734/* INSERT PSW KEY */
735# define IPK() S_(0xB20B,0,0)
736/* INSERT STORAGE KEY EXTENDED */
737# define ISKE(R1,R2) RRE_(0xB229,R1,R2)
738/* INSERT VIRTUAL STORAGE KEY */
739# define IVSK(R1,R2) RRE_(0xB223,R1,R2)
740/* INVALIDATE DAT TABLE ENTRY */
741# define IDTE(R1,R2,R3) RRF_(0xB98E,R3,0,R1,R2)
742/* INVALIDATE PAGE TABLE ENTRY */
743# define IPTE(R1,R2) RRE_(0xB221,R1,R2)
744/* LOAD ADDRESS SPACE PARAMETER */
745# define LASP(D1,B1,D2,B2) SSE_(0xE500,B1,D1,B2,D2)
746/* LOAD CONTROL */
747# define LCTL(R1,R3,D2,B2) RS_(0xB7,R1,R3,B2,D2)
748# define LCTLG(R1,R3,D2,B2) RSY_(0xEB,R1,R3,B2,D2,0x2F)
749/* LOAD PSW */
750# define LPSW(D2,B2) SI_(0x82,0,B2,D2)
751/* LOAD PSW EXTENDED */
752# define LPSWE(D2,B2) S_(0xB2B2,B2,D2)
753/* LOAD REAL ADDRESS */
754# define LRA(R1,D2,X2,B2) RX_(0xB1,R1,X2,B2,D2)
755# define LRAY(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x13)
756# define LRAG(R1,D2,X2,B2) RXY_(0xE3,R1,X2,B2,D2,0x03)
757/* LOAD USING REAL ADDRESS */
758# define LURA(R1,R2) RRE_(0xB24B,R1,R2)
759# define LURAG(R1,R2) RRE_(0xB905,R1,R2)
760/* MODIFY STACKED STATE */
761# define MSTA(R1) RRE_(0xB247,R1,0)
762/* MOVE PAGE */
763# define MVPG(R1,R2) RRE_(0xB254,R1,R2)
764/* MOVE TO PRIMARY */
765# define MVCP(D1,R1,B1,D2,B2,R3) SS_(0xDA,R1,R3,B1,D1,B2,D2)
766/* MOVE TO SECONDARY */
767# define MVCS(D1,R1,B1,D2,B2,R3) SS_(0xDB,R1,R3,B1,D1,B2,D2)
768/* MOVE WITH DESTINATION KEY */
769# define MVCDK(D1,B1,D2,B2) SSE_(0xE50F,B1,D1,B2,D2)
770/* MOVE WITH KEY */
771# define MVCK(D1,R1,B1,D2,B2,R3) SS_(0xD9,R1,R3,B1,D1,B2,D2)
772/* MOVE WITH SOURCE KEY */
773# define MVCSK(D1,B1,D2,B2) SSE_(0xE50E,B1,D1,B2,D2)
774/* PAGE IN */
775# define PGIN(R1,R2) RRE_(0xB22E,R1,R2)
776/* PAGE OUT */
777# define PGOUT(R1,R2) RRE_(0xB22F,R1,R2)
778/* PROGRAM CALL */
779# define PC(D2,B2) S_(0xB218,B2,D2)
780/* PROGRAM RETURN */
781# define PR() E_(0x0101)
782/* PROGRAM TRANSFER */
783# define PT(R1,R2) RRE_(0xB228,R1,R2)
784/* PURGE ALB */
785# define PALB() RRE_(0xB248,0,0)
786/* PURGE TLB */
787# define PTLB() S_(0xB20D,0,0)
788/* RESET REFERENCE BIT EXTENDED */
789# define RRBE(R1,R2) RRE_(0xB22A,R1,R2)
790/* RESUME PROGRAM */
791# define RP(D2,B2) S_(0xB277,B2,D2)
792/* SET ADDRESS SPACE CONTROL */
793# define SAC(D2,B2) S_(0xB219,B2,D2)
794/* SET ADDRESS SPACE CONTROL FAST */
795# define SACF(D2,B2) S_(0xB279,B2,D2)
796/* SET CLOCK */
797# define SCK(D2,B2) S_(0xB204,B2,D2)
798/* SET CLOCK COMPARATOR */
799# define SCKC(D2,B2) S_(0xB206,B2,D2)
800/* SET CLOCK PROGRAMMABLE FIELD */
801# define SCKPF() E_(0x0107)
802/* SET CPU TIMER */
803# define SPT(D2,B2) S_(0xB208,B2,D2)
804/* SET PREFIX */
805# define SPX(D2,B2) S_(0xB210,B2,D2)
806/* SET PSW FROM ADDRESS */
807# define SPKA(D2,B2) S_(0xB20A,B2,D2)
808/* SET SECONDARY ASN */
809# define SSAR(R1) RRE_(0xB225,R1,0)
810/* SET STORAGE KEY EXTENDED */
811# define SSKE(R1,R2) RRE_(0xB22B,R1,R2)
812/* SET SYSTEM MASK */
813# define SSM(D2,B2) SI_(0x80,0,B2,D2)
814/* SIGNAL PROCESSOR */
815# define SIGP(R1,R3,D2,B2) RS_(0xAE,R1,R3,B2,D2)
816/* STORE CLOCK COMPARATOR */
817# define STCKC(D2,B2) S_(0xB207,B2,D2)
818/* STORE CONTROL */
819# define STCTL(R1,R3,D2,B2) RS_(0xB6,R1,R3,B2,D2)
820# define STCTG(R1,R3,D2,B2) RSY_(0xEB,R1,R3,B2,D2,0x25)
821/* STORE CPU ADDRESS */
822# define STAP(D2,B2) S_(0xB212,B2,D2)
823/* STORE CPU ID */
824# define STIDP(D2,B2) S_(0xB202,B2,D2)
825/* STORE CPU TIMER */
826# define STPT(D2,B2) S_(0xB209,B2,D2)
827/* STORE FACILITY LIST */
828# define STFL(D2,B2) S_(0xB2B1,B2,D2)
829/* STORE PREFIX */
830# define STPX(D2,B2) S_(0xB211,B2,D2)
831/* STORE REAL ADDRES */
832# define STRAG(D1,B1,D2,B2) SSE_(0xE502,B1,D1,B2,D2)
833/* STORE SYSTEM INFORMATION */
834# define STSI(D2,B2) S_(0xB27D,B2,D2)
835/* STORE THEN AND SYSTEM MASK */
836# define STNSM(D1,B1,I2) SI_(0xAC,I2,B1,D1)
837/* STORE THEN OR SYSTEM MASK */
838# define STOSM(D1,B1,I2) SI_(0xAD,I2,B1,D1)
839/* STORE USING REAL ADDRESS */
840# define STURA(R1,R2) RRE_(0xB246,R1,R2)
841# define STURG(R1,R2) RRE_(0xB925,R1,R2)
842/* TEST ACCESS */
843# define TAR(R1,R2) RRE_(0xB24C,R1,R2)
844/* TEST BLOCK */
845# define TB(R1,R2) RRE_(0xB22C,R1,R2)
846/* TEST PROTECTION */
847# define TPROT(D1,B1,D2,B2) SSE_(0xE501,B1,D1,B2,D2)
848/* TRACE */
849# define TRACE(R1,R3,D2,B2) RS_(0x99,R1,R3,B2,D2)
850# define TRACG(R1,R3,D2,B2) RSY_(0xEB,R1,R3,B2,D2,0x0F)
851/* TRAP */
852# define TRAP2() E_(0x01FF)
853# define TRAP4(D2,B2) S_(0xB2FF,B2,D2)
854/****************************************************************
855 * I/O Instructions *
856 ****************************************************************/
857/* CANCEL SUBCHANNEL */
858# define XSCH() S_(0xB276,0,0)
859/* CLEAR SUBCHANNEL */
860# define CSCH() S_(0xB230,0,0)
861/* HALT SUBCHANNEL */
862# define HSCH() S_(0xB231,0,0)
863/* MODIFY SUBCHANNEL */
864# define MSCH(D2,B2) S_(0xB232,B2,D2)
865/* RESET CHANNEL PATH */
866# define RCHP() S_(0xB23B,0,0)
867/* RESUME SUBCHANNEL */
868# define RSCH() S_(0xB238,0,0)
869/* SET ADDRESS LIMIT */
870# define SAL() S_(0xB237,0,0)
871/* SET CHANNEL MONITOR */
872# define SCHM() S_(0xB23C,0,0)
873/* START SUBCHANNEL */
874# define SSCH(D2,B2) S_(0xB233,B2,D2)
875/* STORE CHANNEL PATH STATUS */
876# define STCPS(D2,B2) S_(0xB23A,B2,D2)
877/* STORE CHANNEL REPORT WORD */
878# define STCRW(D2,B2) S_(0xB239,B2,D2)
879/* STORE SUBCHANNEL */
880# define STSCH(D2,B2) S_(0xB234,B2,D2)
881/* TEST PENDING INTERRUPTION */
882# define TPI(D2,B2) S_(0xB236,B2,D2)
883/* TEST SUBCHANNEL */
884# define TSCH(D2,B2) S_(0xB235,B2,D2)
885# define xdivr(r0,r1) _xdivr(_jit,r0,r1)
886static jit_int32_t _xdivr(jit_state_t*,jit_int32_t,jit_int32_t);
887# define xdivr_u(r0,r1) _xdivr_u(_jit,r0,r1)
888static jit_int32_t _xdivr_u(jit_state_t*,jit_int32_t,jit_int32_t);
889# define xdivi(r0,i0) _xdivi(_jit,r0,i0)
890static jit_int32_t _xdivi(jit_state_t*,jit_int32_t,jit_word_t);
891# define xdivi_u(r0,i0) _xdivi_u(_jit,r0,i0)
892static jit_int32_t _xdivi_u(jit_state_t*,jit_int32_t,jit_word_t);
893# define crr(cc,r0,r1,r2) _crr(_jit,cc,r0,r1,r2)
894static void _crr(jit_state_t*,
895 jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t);
896# define cri(cc,r0,r1,i0) _cri(_jit,cc,r0,r1,i0)
897static void _cri(jit_state_t*,
898 jit_int32_t,jit_int32_t,jit_int32_t,jit_word_t);
899# define crr_u(cc,r0,r1,r2) _crr_u(_jit,cc,r0,r1,r2)
900static void _crr_u(jit_state_t*,
901 jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t);
902# define cri_u(cc,r0,r1,i0) _cri_u(_jit,cc,r0,r1,i0)
903static void _cri_u(jit_state_t*,
904 jit_int32_t,jit_int32_t,jit_int32_t,jit_word_t);
905# define brr(cc,i0,r0,r1) _brr(_jit,cc,i0,r0,r1)
906static void _brr(jit_state_t*,jit_int32_t,
907 jit_word_t,jit_int32_t,jit_int32_t);
908# define brr_p(cc,i0,r0,r1) _brr_p(_jit,cc,i0,r0,r1)
909static jit_word_t _brr_p(jit_state_t*,jit_int32_t,
910 jit_word_t,jit_int32_t,jit_int32_t);
911# define bri(cc,i0,r0,i1) _bri(_jit,cc,i0,r0,i1)
912static void _bri(jit_state_t*,jit_int32_t,
913 jit_word_t,jit_int32_t,jit_word_t);
914# define bri_p(cc,i0,r0,i1) _bri_p(_jit,cc,i0,r0,i1)
915static jit_word_t _bri_p(jit_state_t*,jit_int32_t,
916 jit_word_t,jit_int32_t,jit_word_t);
917# define brr_u(cc,i0,r0,r1) _brr_u(_jit,cc,i0,r0,r1)
918static void _brr_u(jit_state_t*,jit_int32_t,
919 jit_word_t,jit_int32_t,jit_int32_t);
920# define brr_u_p(cc,i0,r0,r1) _brr_u_p(_jit,cc,i0,r0,r1)
921static jit_word_t _brr_u_p(jit_state_t*,jit_int32_t,
922 jit_word_t,jit_int32_t,jit_int32_t);
923# define bri_u(cc,i0,r0,i1) _bri_u(_jit,cc,i0,r0,i1)
924static void _bri_u(jit_state_t*,jit_int32_t,
925 jit_word_t,jit_int32_t,jit_word_t);
926# define bri_u_p(cc,i0,r0,i1) _bri_u_p(_jit,cc,i0,r0,i1)
927static jit_word_t _bri_u_p(jit_state_t*,jit_int32_t,
928 jit_word_t,jit_int32_t,jit_word_t);
929# define baddr(c,s,i0,r0,r1) _baddr(_jit,c,s,i0,r0,r1)
930static void _baddr(jit_state_t*,jit_int32_t,jit_bool_t,
931 jit_word_t,jit_int32_t,jit_int32_t);
932# define baddr_p(c,s,i0,r0,r1) _baddr_p(_jit,c,s,i0,r0,r1)
933static jit_word_t _baddr_p(jit_state_t*,jit_int32_t,jit_bool_t,
934 jit_word_t,jit_int32_t,jit_int32_t);
935# define baddi(c,s,i0,r0,i1) _baddi(_jit,c,s,i0,r0,i1)
936static void _baddi(jit_state_t*,jit_int32_t,jit_bool_t,
937 jit_word_t,jit_int32_t,jit_word_t);
938# define baddi_p(c,s,i0,r0,i1) _baddi_p(_jit,c,s,i0,r0,i1)
939static jit_word_t _baddi_p(jit_state_t*,jit_int32_t,jit_bool_t,
940 jit_word_t,jit_int32_t,jit_word_t);
941# define bsubr(c,s,i0,r0,r1) _bsubr(_jit,c,s,i0,r0,r1)
942static void _bsubr(jit_state_t*,jit_int32_t,jit_bool_t,
943 jit_word_t,jit_int32_t,jit_int32_t);
944# define bsubr_p(c,s,i0,r0,r1) _bsubr_p(_jit,c,s,i0,r0,r1)
945static jit_word_t _bsubr_p(jit_state_t*,jit_int32_t,jit_bool_t,
946 jit_word_t,jit_int32_t,jit_int32_t);
947# define bsubi(c,s,i0,r0,i1) _bsubi(_jit,c,s,i0,r0,i1)
948static void _bsubi(jit_state_t*,jit_int32_t,jit_bool_t,
949 jit_word_t,jit_int32_t,jit_word_t);
950# define bsubi_p(c,s,i0,r0,i1) _bsubi_p(_jit,c,s,i0,r0,i1)
951static jit_word_t _bsubi_p(jit_state_t*,jit_int32_t,jit_bool_t,
952 jit_word_t,jit_int32_t,jit_word_t);
953# define bmxr(cc,i0,r0,r1) _bmxr(_jit,cc,i0,r0,r1)
954static void _bmxr(jit_state_t*,jit_int32_t,
955 jit_word_t,jit_int32_t,jit_int32_t);
956# define bmxr_p(cc,i0,r0,r1) _bmxr_p(_jit,cc,i0,r0,r1)
957static jit_word_t _bmxr_p(jit_state_t*,jit_int32_t,
958 jit_word_t,jit_int32_t,jit_int32_t);
959# define bmxi(cc,i0,r0,i1) _bmxi(_jit,cc,i0,r0,i1)
960static void _bmxi(jit_state_t*,jit_int32_t,
961 jit_word_t,jit_int32_t,jit_word_t);
962# define bmxi_p(cc,i0,r0,i1) _bmxi_p(_jit,cc,i0,r0,i1)
963static jit_word_t _bmxi_p(jit_state_t*,jit_int32_t,
964 jit_word_t,jit_int32_t,jit_word_t);
965# define movr(r0,r1) _movr(_jit,r0,r1)
966static void _movr(jit_state_t*,jit_int32_t,jit_int32_t);
967# define movi(r0,i0) _movi(_jit,r0,i0)
968static void _movi(jit_state_t*,jit_int32_t,jit_word_t);
969# define movi_p(r0,i0) _movi_p(_jit,r0,i0)
970static jit_word_t _movi_p(jit_state_t*,jit_int32_t,jit_word_t);
79bfeef6
PC
971# define bswapr_us(r0, r1) _bswapr_us(_jit, r0, r1)
972static void _bswapr_us(jit_state_t*,jit_int32_t,jit_int32_t);
973# define bswapr_ui(r0, r1) _bswapr_ui(_jit, r0, r1)
974static void _bswapr_ui(jit_state_t*,jit_int32_t,jit_int32_t);
975# if __WORDSIZE == 64
976#define bswapr_ul(r0, r1) _bswapr_ul(_jit, r0, r1)
977static void _bswapr_ul(jit_state_t*,jit_int32_t,jit_int32_t);
978#endif
40a44dcb
PC
979# define movnr(r0,r1,r2) _movnr(_jit,r0,r1,r2)
980static void _movnr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
981# define movzr(r0,r1,r2) _movzr(_jit,r0,r1,r2)
982static void _movzr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
ba3814c1
PC
983# define casx(r0, r1, r2, r3, i0) _casx(_jit, r0, r1, r2, r3, i0)
984static void _casx(jit_state_t *_jit,jit_int32_t,jit_int32_t,
985 jit_int32_t,jit_int32_t,jit_word_t);
986#define casr(r0, r1, r2, r3) casx(r0, r1, r2, r3, 0)
987#define casi(r0, i0, r1, r2) casx(r0, _NOREG, r1, r2, i0)
4a71579b
PC
988# define addr(r0,r1,r2) _addr(_jit,r0,r1,r2)
989static void _addr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
990# define addi(r0,r1,i0) _addi(_jit,r0,r1,i0)
991static void _addi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
992# define addcr(r0,r1,r2) _addcr(_jit,r0,r1,r2)
993static void _addcr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
994# define addci(r0,r1,i0) _addci(_jit,r0,r1,i0)
995static void _addci(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
996# define addxr(r0,r1,r2) _addxr(_jit,r0,r1,r2)
997static void _addxr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
998# define addxi(r0,r1,i0) _addxi(_jit,r0,r1,i0)
999static void _addxi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
1000# define subr(r0,r1,r2) _subr(_jit,r0,r1,r2)
1001static void _subr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
1002# define subi(r0,r1,i0) _subi(_jit,r0,r1,i0)
1003static void _subi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
1004# define subcr(r0,r1,r2) _subcr(_jit,r0,r1,r2)
1005static void _subcr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
1006# define subci(r0,r1,i0) _subci(_jit,r0,r1,i0)
1007static void _subci(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
1008# define subxr(r0,r1,r2) _subxr(_jit,r0,r1,r2)
1009static void _subxr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
1010# define subxi(r0,r1,i0) _subxi(_jit,r0,r1,i0)
1011static void _subxi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
1012# define rsbi(r0, r1, i0) _rsbi(_jit, r0, r1, i0)
1013static void _rsbi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
1014# define mulr(r0,r1,r2) _mulr(_jit,r0,r1,r2)
1015static void _mulr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
1016# define muli(r0,r1,i0) _muli(_jit,r0,r1,i0)
1017static void _muli(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
1018# define qmulr(r0,r1,r2,r3) _qmulr(_jit,r0,r1,r2,r3)
1019static void _qmulr(jit_state_t*,jit_int32_t,
1020 jit_int32_t,jit_int32_t,jit_int32_t);
1021# define qmuli(r0,r1,r2,i0) _qmuli(_jit,r0,r1,r2,i0)
1022static void _qmuli(jit_state_t*,jit_int32_t,
1023 jit_int32_t,jit_int32_t,jit_word_t);
1024# define qmulr_u(r0,r1,r2,r3) _qmulr_u(_jit,r0,r1,r2,r3)
1025static void _qmulr_u(jit_state_t*,jit_int32_t,
1026 jit_int32_t,jit_int32_t,jit_int32_t);
1027# define qmuli_u(r0,r1,r2,i0) _qmuli_u(_jit,r0,r1,r2,i0)
1028static void _qmuli_u(jit_state_t*,jit_int32_t,
1029 jit_int32_t,jit_int32_t,jit_word_t);
1030# define divr(r0,r1,r2) _divr(_jit,r0,r1,r2)
1031static void _divr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
1032# define divi(r0,r1,i0) _divi(_jit,r0,r1,i0)
1033static void _divi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
1034# define divr_u(r0,r1,r2) _divr_u(_jit,r0,r1,r2)
1035static void _divr_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
1036# define divi_u(r0,r1,i0) _divi_u(_jit,r0,r1,i0)
1037static void _divi_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
1038# define remr(r0,r1,r2) _remr(_jit,r0,r1,r2)
1039static void _remr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
1040# define remi(r0,r1,i0) _remi(_jit,r0,r1,i0)
1041static void _remi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
1042# define remr_u(r0,r1,r2) _remr_u(_jit,r0,r1,r2)
1043static void _remr_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
1044# define remi_u(r0,r1,i0) _remi_u(_jit,r0,r1,i0)
1045static void _remi_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
1046# define qdivr(r0,r1,r2,r3) _qdivr(_jit,r0,r1,r2,r3)
1047static void _qdivr(jit_state_t*,jit_int32_t,
1048 jit_int32_t,jit_int32_t,jit_int32_t);
1049# define qdivi(r0,r1,r2,i0) _qdivi(_jit,r0,r1,r2,i0)
1050static void _qdivi(jit_state_t*,jit_int32_t,
1051 jit_int32_t,jit_int32_t,jit_word_t);
1052# define qdivr_u(r0,r1,r2,r3) _qdivr_u(_jit,r0,r1,r2,r3)
1053static void _qdivr_u(jit_state_t*,jit_int32_t,
1054 jit_int32_t,jit_int32_t,jit_int32_t);
1055# define qdivi_u(r0,r1,r2,i0) _qdivi_u(_jit,r0,r1,r2,i0)
1056static void _qdivi_u(jit_state_t*,jit_int32_t,
1057 jit_int32_t,jit_int32_t,jit_word_t);
1058# if __WORDSIZE == 32
1059# define lshr(r0,r1,r2) _lshr(_jit,r0,r1,r2)
1060static void _lshr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
79bfeef6 1061# define lshi(r0,r1,i0) _lshi(_jit,r0,r1,i0)
4a71579b 1062static void _lshi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
4a71579b
PC
1063# define rshr(r0,r1,r2) _rshr(_jit,r0,r1,r2)
1064static void _rshr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
79bfeef6 1065# define rshi(r0,r1,i0) _rshi(_jit,r0,r1,i0);
4a71579b 1066static void _rshi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
4a71579b
PC
1067# define rshr_u(r0,r1,r2) _rshr_u(_jit,r0,r1,r2)
1068static void _rshr_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
79bfeef6
PC
1069# define rshi_u(r0,r1,i0) _rshi_u(_jit,r0,r1,i0)
1070static void _rshi_u(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
4a71579b 1071# else
79bfeef6
PC
1072# define lshr(r0,r1,r2) SLLG(r0,r1,0,r2)
1073# define lshi(r0,r1,i0) SLLG(r0,r1,i0,0)
1074# define rshr(r0,r1,r2) SRAG(r0,r1,0,r2)
1075# define rshi(r0,r1,i0) SRAG(r0,r1,i0,0)
4a71579b 1076# define rshr_u(r0,r1,r2) SRLG(r0,r1,0,r2)
79bfeef6 1077# define rshi_u(r0,r1,i0) SRLG(r0,r1,i0,0)
4a71579b 1078# endif
4a71579b
PC
1079# if __WORDSIZE == 32
1080# define negr(r0,r1) LCR(r0,r1)
1081# else
1082# define negr(r0,r1) LCGR(r0,r1)
1083# endif
79bfeef6
PC
1084# define bitswap(r0, r1) _bitswap(_jit, r0, r1)
1085static void _bitswap(jit_state_t*, jit_int32_t, jit_int32_t);
1086# define clor(r0, r1) _clor(_jit, r0, r1)
1087static void _clor(jit_state_t*, jit_int32_t, jit_int32_t);
1088# define clzr(r0, r1) _clzr(_jit, r0, r1)
1089static void _clzr(jit_state_t*, jit_int32_t, jit_int32_t);
1090# define ctor(r0, r1) _ctor(_jit, r0, r1)
1091static void _ctor(jit_state_t*, jit_int32_t, jit_int32_t);
1092# define ctzr(r0, r1) _ctzr(_jit, r0, r1)
1093static void _ctzr(jit_state_t*, jit_int32_t, jit_int32_t);
4a71579b
PC
1094# define comr(r0,r1) _comr(_jit,r0,r1)
1095static void _comr(jit_state_t*,jit_int32_t,jit_int32_t);
1096# define andr(r0,r1,r2) _andr(_jit,r0,r1,r2)
1097static void _andr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
1098# define andi(r0,r1,i0) _andi(_jit,r0,r1,i0)
1099static void _andi(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
1100# define orr(r0,r1,r2) _orr(_jit,r0,r1,r2)
1101static void _orr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
1102# define ori(r0,r1,i0) _ori(_jit,r0,r1,i0)
1103static void _ori(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
1104# define xorr(r0,r1,r2) _xorr(_jit,r0,r1,r2)
1105static void _xorr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
1106# define xori(r0,r1,i0) _xori(_jit,r0,r1,i0)
1107static void _xori(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
4a71579b
PC
1108# define extr_c(r0,r1) LGBR(r0,r1)
1109# define extr_uc(r0,r1) LLGCR(r0,r1)
1110# define extr_s(r0,r1) LGHR(r0,r1)
1111# define extr_us(r0,r1) LLGHR(r0,r1)
1112# if __WORDSIZE == 64
1113# define extr_i(r0,r1) LGFR(r0,r1)
1114# define extr_ui(r0,r1) LLGFR(r0,r1)
1115# endif
1116# define ldr_c(r0,r1) LGB(r0,0,0,r1)
1117# define ldi_c(r0,i0) _ldi_c(_jit,r0,i0)
1118static void _ldi_c(jit_state_t*,jit_int32_t,jit_word_t);
1119# define ldxr_c(r0,r1,r2) _ldxr_c(_jit,r0,r1,r2)
1120static void _ldxr_c(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
1121# define ldxi_c(r0,r1,i0) _ldxi_c(_jit,r0,r1,i0)
1122static void _ldxi_c(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
1123# define ldr_uc(r0,r1) LLGC(r0,0,0,r1)
1124# define ldi_uc(r0,i0) _ldi_uc(_jit,r0,i0)
1125static void _ldi_uc(jit_state_t*,jit_int32_t,jit_word_t);
1126# define ldxr_uc(r0,r1,r2) _ldxr_uc(_jit,r0,r1,r2)
1127static void _ldxr_uc(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
1128# define ldxi_uc(r0,r1,i0) _ldxi_uc(_jit,r0,r1,i0)
1129static void _ldxi_uc(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
1130# if __WORDSIZE == 32
1131# define ldr_s(r0,r1) LH(r0,0,0,r1)
1132# else
1133# define ldr_s(r0,r1) LGH(r0,0,0,r1)
1134# endif
1135# define ldi_s(r0,i0) _ldi_s(_jit,r0,i0)
1136static void _ldi_s(jit_state_t*,jit_int32_t,jit_word_t);
1137# define ldxr_s(r0,r1,r2) _ldxr_s(_jit,r0,r1,r2)
1138static void _ldxr_s(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
1139# define ldxi_s(r0,r1,i0) _ldxi_s(_jit,r0,r1,i0)
1140static void _ldxi_s(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
1141# define ldr_us(r0,r1) LLGH(r0,0,0,r1)
1142# define ldi_us(r0,i0) _ldi_us(_jit,r0,i0)
1143static void _ldi_us(jit_state_t*,jit_int32_t,jit_word_t);
1144# define ldxr_us(r0,r1,r2) _ldxr_us(_jit,r0,r1,r2)
1145static void _ldxr_us(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
1146# define ldxi_us(r0,r1,i0) _ldxi_us(_jit,r0,r1,i0)
1147static void _ldxi_us(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
1148# if __WORDSIZE == 32
1149# define ldr_i(r0,r1) LLGF(r0,0,0,r1)
1150# else
1151# define ldr_i(r0,r1) LGF(r0,0,0,r1)
1152# endif
1153# define ldi_i(r0,i0) _ldi_i(_jit,r0,i0)
1154static void _ldi_i(jit_state_t*,jit_int32_t,jit_word_t);
1155# define ldxr_i(r0,r1,r2) _ldxr_i(_jit,r0,r1,r2)
1156static void _ldxr_i(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
1157# define ldxi_i(r0,r1,i0) _ldxi_i(_jit,r0,r1,i0)
1158static void _ldxi_i(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
1159# if __WORDSIZE == 64
1160# define ldr_ui(r0,r1) LLGF(r0,0,0,r1)
1161# define ldi_ui(r0,i0) _ldi_ui(_jit,r0,i0)
1162static void _ldi_ui(jit_state_t*,jit_int32_t,jit_word_t);
1163# define ldxr_ui(r0,r1,r2) _ldxr_ui(_jit,r0,r1,r2)
1164static void _ldxr_ui(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
1165# define ldxi_ui(r0,r1,i0) _ldxi_ui(_jit,r0,r1,i0)
1166static void _ldxi_ui(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
1167# define ldr_l(r0,r1) LG(r0,0,0,r1)
1168# define ldi_l(r0,i0) _ldi_l(_jit,r0,i0)
1169static void _ldi_l(jit_state_t*,jit_int32_t,jit_word_t);
1170# define ldxr_l(r0,r1,r2) _ldxr_l(_jit,r0,r1,r2)
1171static void _ldxr_l(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
1172# define ldxi_l(r0,r1,i0) _ldxi_l(_jit,r0,r1,i0)
1173static void _ldxi_l(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
1174# endif
1175# define str_c(r0,r1) STC(r1,0,0,r0)
1176# define sti_c(i0,r0) _sti_c(_jit,i0,r0)
1177static void _sti_c(jit_state_t*,jit_word_t,jit_int32_t);
1178# define stxr_c(r0,r1,r2) _stxr_c(_jit,r0,r1,r2)
1179static void _stxr_c(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
1180# define stxi_c(i0,r0,r1) _stxi_c(_jit,i0,r0,r1)
1181static void _stxi_c(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
1182# define str_s(r0,r1) STH(r1,0,0,r0)
1183# define sti_s(i0,r0) _sti_s(_jit,i0,r0)
1184static void _sti_s(jit_state_t*,jit_word_t,jit_int32_t);
1185# define stxr_s(r0,r1,r2) _stxr_s(_jit,r0,r1,r2)
1186static void _stxr_s(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
1187# define stxi_s(i0,r0,r1) _stxi_s(_jit,i0,r0,r1)
1188static void _stxi_s(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
1189# define str_i(r0,r1) ST(r1,0,0,r0)
1190# define sti_i(i0,r0) _sti_i(_jit,i0,r0)
1191static void _sti_i(jit_state_t*,jit_word_t,jit_int32_t);
1192# define stxr_i(r0,r1,r2) _stxr_i(_jit,r0,r1,r2)
1193static void _stxr_i(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
1194# define stxi_i(i0,r0,r1) _stxi_i(_jit,i0,r0,r1)
1195static void _stxi_i(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
1196# if __WORDSIZE == 64
1197# define str_l(r0,r1) STG(r1,0,0,r0)
1198# define sti_l(i0,r0) _sti_l(_jit,i0,r0)
1199static void _sti_l(jit_state_t*,jit_word_t,jit_int32_t);
1200# define stxr_l(r0,r1,r2) _stxr_l(_jit,r0,r1,r2)
1201static void _stxr_l(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
1202# define stxi_l(i0,r0,r1) _stxi_l(_jit,i0,r0,r1)
1203static void _stxi_l(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
1204# endif
1205# define ltr(r0,r1,r2) crr(CC_L,r0,r1,r2)
1206# define lti(r0,r1,i0) cri(CC_L,r0,r1,i0)
1207# define ltr_u(r0,r1,r2) crr_u(CC_L,r0,r1,r2)
1208# define lti_u(r0,r1,i0) cri_u(CC_L,r0,r1,i0)
1209# define ler(r0,r1,r2) crr(CC_LE,r0,r1,r2)
1210# define lei(r0,r1,i0) cri(CC_LE,r0,r1,i0)
1211# define ler_u(r0,r1,r2) crr_u(CC_LE,r0,r1,r2)
1212# define lei_u(r0,r1,i0) cri_u(CC_LE,r0,r1,i0)
1213# define eqr(r0,r1,r2) crr(CC_E,r0,r1,r2)
1214# define eqi(r0,r1,i0) cri(CC_E,r0,r1,i0)
1215# define ger(r0,r1,r2) crr(CC_HE,r0,r1,r2)
1216# define gei(r0,r1,i0) cri(CC_HE,r0,r1,i0)
1217# define ger_u(r0,r1,r2) crr_u(CC_HE,r0,r1,r2)
1218# define gei_u(r0,r1,i0) cri_u(CC_HE,r0,r1,i0)
1219# define gtr(r0,r1,r2) crr(CC_H,r0,r1,r2)
1220# define gti(r0,r1,i0) cri(CC_H,r0,r1,i0)
1221# define gtr_u(r0,r1,r2) crr_u(CC_H,r0,r1,r2)
1222# define gti_u(r0,r1,i0) cri_u(CC_H,r0,r1,i0)
1223# define ner(r0,r1,r2) crr(CC_NE,r0,r1,r2)
1224# define nei(r0,r1,i0) cri(CC_NE,r0,r1,i0)
1225# define bltr(i0,r0,r1) brr(CC_L,i0,r0,r1)
1226# define bltr_p(i0,r0,r1) brr_p(CC_L,i0,r0,r1)
1227# define blti(i0,r0,i1) bri(CC_L,i0,r0,i1)
1228# define blti_p(i0,r0,i1) bri_p(CC_L,i0,r0,i1)
1229# define bltr_u(i0,r0,r1) brr_u(CC_L,i0,r0,r1)
1230# define bltr_u_p(i0,r0,r1) brr_u_p(CC_L,i0,r0,r1)
1231# define blti_u(i0,r0,i1) bri_u(CC_L,i0,r0,i1)
1232# define blti_u_p(i0,r0,i1) bri_u_p(CC_L,i0,r0,i1)
1233# define bler(i0,r0,r1) brr(CC_LE,i0,r0,r1)
1234# define bler_p(i0,r0,r1) brr_p(CC_LE,i0,r0,r1)
1235# define blei(i0,r0,i1) bri(CC_LE,i0,r0,i1)
1236# define blei_p(i0,r0,i1) bri_p(CC_LE,i0,r0,i1)
1237# define bler_u(i0,r0,r1) brr_u(CC_LE,i0,r0,r1)
1238# define bler_u_p(i0,r0,r1) brr_u_p(CC_LE,i0,r0,r1)
1239# define blei_u(i0,r0,i1) bri_u(CC_LE,i0,r0,i1)
1240# define blei_u_p(i0,r0,i1) bri_u_p(CC_LE,i0,r0,i1)
1241# define beqr(i0,r0,r1) brr(CC_E,i0,r0,r1)
1242# define beqr_p(i0,r0,r1) brr_p(CC_E,i0,r0,r1)
1243# define beqi(i0,r0,i1) bri(CC_E,i0,r0,i1)
1244# define beqi_p(i0,r0,i1) bri_p(CC_E,i0,r0,i1)
1245# define bger(i0,r0,r1) brr(CC_HE,i0,r0,r1)
1246# define bger_p(i0,r0,r1) brr_p(CC_HE,i0,r0,r1)
1247# define bgei(i0,r0,i1) bri(CC_HE,i0,r0,i1)
1248# define bgei_p(i0,r0,i1) bri_p(CC_HE,i0,r0,i1)
1249# define bger_u(i0,r0,r1) brr_u(CC_HE,i0,r0,r1)
1250# define bger_u_p(i0,r0,r1) brr_u_p(CC_HE,i0,r0,r1)
1251# define bgei_u(i0,r0,i1) bri_u(CC_HE,i0,r0,i1)
1252# define bgei_u_p(i0,r0,i1) bri_u_p(CC_HE,i0,r0,i1)
1253# define bgtr(i0,r0,r1) brr(CC_H,i0,r0,r1)
1254# define bgtr_p(i0,r0,r1) brr_p(CC_H,i0,r0,r1)
1255# define bgti(i0,r0,i1) bri(CC_H,i0,r0,i1)
1256# define bgti_p(i0,r0,i1) bri_p(CC_H,i0,r0,i1)
1257# define bgtr_u(i0,r0,r1) brr_u(CC_H,i0,r0,r1)
1258# define bgtr_u_p(i0,r0,r1) brr_u_p(CC_H,i0,r0,r1)
1259# define bgti_u(i0,r0,i1) bri_u(CC_H,i0,r0,i1)
1260# define bgti_u_p(i0,r0,i1) bri_u_p(CC_H,i0,r0,i1)
1261# define bner(i0,r0,r1) brr(CC_NE,i0,r0,r1)
1262# define bner_p(i0,r0,r1) brr_p(CC_NE,i0,r0,r1)
1263# define bnei(i0,r0,i1) bri(CC_NE,i0,r0,i1)
1264# define bnei_p(i0,r0,i1) bri_p(CC_NE,i0,r0,i1)
1265# define boaddr(i0,r0,r1) baddr(CC_O,1,i0,r0,r1)
1266# define boaddr_p(i0,r0,r1) baddr_p(CC_O,1,i0,r0,r1)
1267# define boaddi(i0,r0,i1) baddi(CC_O,1,i0,r0,i1)
1268# define boaddi_p(i0,r0,i1) baddi_p(CC_O,1,i0,r0,i1)
1269# define boaddr_u(i0,r0,r1) baddr(CC_NLE,0,i0,r0,r1)
1270# define boaddr_u_p(i0,r0,r1) baddr_p(CC_NLE,0,i0,r0,r1)
1271# define boaddi_u(i0,r0,i1) baddi(CC_NLE,0,i0,r0,i1)
1272# define boaddi_u_p(i0,r0,i1) baddi_p(CC_NLE,0,i0,r0,i1)
1273# define bxaddr(i0,r0,r1) baddr(CC_NO,1,i0,r0,r1)
1274# define bxaddr_p(i0,r0,r1) baddr_p(CC_NO,1,i0,r0,r1)
1275# define bxaddi(i0,r0,i1) baddi(CC_NO,1,i0,r0,i1)
1276# define bxaddi_p(i0,r0,i1) baddi_p(CC_NO,1,i0,r0,i1)
1277# define bxaddr_u(i0,r0,r1) baddr(CC_LE,0,i0,r0,r1)
1278# define bxaddr_u_p(i0,r0,r1) baddr_p(CC_LE,0,i0,r0,r1)
1279# define bxaddi_u(i0,r0,i1) baddi(CC_LE,0,i0,r0,i1)
1280# define bxaddi_u_p(i0,r0,i1) baddi_p(CC_LE,0,i0,r0,i1)
1281# define bosubr(i0,r0,r1) bsubr(CC_O,1,i0,r0,r1)
1282# define bosubr_p(i0,r0,r1) bsubr_p(CC_O,1,i0,r0,r1)
1283# define bosubi(i0,r0,i1) bsubi(CC_O,1,i0,r0,i1)
1284# define bosubi_p(i0,r0,i1) bsubi_p(CC_O,1,i0,r0,i1)
1285# define bosubr_u(i0,r0,r1) bsubr(CC_L,0,i0,r0,r1)
1286# define bosubr_u_p(i0,r0,r1) bsubr_p(CC_L,0,i0,r0,r1)
1287# define bosubi_u(i0,r0,i1) bsubi(CC_L,0,i0,r0,i1)
1288# define bosubi_u_p(i0,r0,i1) bsubi_p(CC_L,0,i0,r0,i1)
1289# define bxsubr(i0,r0,r1) bsubr(CC_NO,1,i0,r0,r1)
1290# define bxsubr_p(i0,r0,r1) bsubr_p(CC_NO,1,i0,r0,r1)
1291# define bxsubi(i0,r0,i1) bsubi(CC_NO,1,i0,r0,i1)
1292# define bxsubi_p(i0,r0,i1) bsubi_p(CC_NO,1,i0,r0,i1)
1293# define bxsubr_u(i0,r0,r1) bsubr(CC_NL,0,i0,r0,r1)
1294# define bxsubr_u_p(i0,r0,r1) bsubr_p(CC_NL,0,i0,r0,r1)
1295# define bxsubi_u(i0,r0,i1) bsubi(CC_NL,0,i0,r0,i1)
1296# define bxsubi_u_p(i0,r0,i1) bsubi_p(CC_NL,0,i0,r0,i1)
1297# define bmsr(i0,r0,r1) bmxr(CC_NE,i0,r0,r1)
1298# define bmsr_p(i0,r0,r1) bmxr_p(CC_NE,i0,r0,r1)
1299# define bmsi(i0,r0,i1) bmxi(CC_NE,i0,r0,i1)
1300# define bmsi_p(i0,r0,i1) bmxi_p(CC_NE,i0,r0,i1)
1301# define bmcr(i0,r0,r1) bmxr(CC_E,i0,r0,r1)
1302# define bmcr_p(i0,r0,r1) bmxr_p(CC_E,i0,r0,r1)
1303# define bmci(i0,r0,i1) bmxi(CC_E,i0,r0,i1)
1304# define bmci_p(i0,r0,i1) bmxi_p(CC_E,i0,r0,i1)
1305# define jmpr(r0) BR(r0)
79bfeef6
PC
1306# define jmpi(i0,i1) _jmpi(_jit,i0,i1)
1307static jit_word_t _jmpi(jit_state_t*,jit_word_t, jit_bool_t);
4a71579b
PC
1308# define jmpi_p(i0) _jmpi_p(_jit,i0)
1309static jit_word_t _jmpi_p(jit_state_t*,jit_word_t);
1310# define callr(r0) BALR(_R14_REGNO,r0)
79bfeef6
PC
1311# define calli(i0,i1) _calli(_jit,i0,i1)
1312static jit_word_t _calli(jit_state_t*,jit_word_t, jit_bool_t);
4a71579b
PC
1313# define calli_p(i0) _calli_p(_jit,i0)
1314static jit_word_t _calli_p(jit_state_t*,jit_word_t);
1315# define prolog(i0) _prolog(_jit,i0)
1316static void _prolog(jit_state_t*,jit_node_t*);
1317# define epilog(i0) _epilog(_jit,i0)
1318static void _epilog(jit_state_t*,jit_node_t*);
1319# define vastart(r0) _vastart(_jit, r0)
1320static void _vastart(jit_state_t*, jit_int32_t);
1321# define vaarg(r0, r1) _vaarg(_jit, r0, r1)
1322static void _vaarg(jit_state_t*, jit_int32_t, jit_int32_t);
1323# define patch_at(instr,label) _patch_at(_jit,instr,label)
1324static void _patch_at(jit_state_t*,jit_word_t,jit_word_t);
1325#endif
1326
1327#if CODE
1328# define _us jit_uint16_t
1329# define _ui jit_uint32_t
1330static void
1331_E(jit_state_t *_jit, _ui Op)
1332{
1333 union {
1334 struct {
1335 _us op;
1336 } b;
1337 _us s;
1338 } i0;
1339 i0.b.op = Op;
1340 assert(i0.b.op == Op);
1341 is(i0.s);
1342}
1343
1344static void
1345_I(jit_state_t *_jit, _ui Op, _ui I)
1346{
1347 union {
1348 struct {
1349 _us op : 8;
1350 _us i : 8;
1351 } b;
1352 _us s;
1353 } i0;
1354 i0.b.op = Op;
1355 i0.b.i = I;
1356 assert(i0.b.op == Op);
1357 assert(i0.b.i == I);
1358 is(i0.s);
1359}
1360
1361static void
1362_RR(jit_state_t *_jit, _ui Op, _ui R1, _ui R2)
1363{
1364 union {
1365 struct {
1366 _us op : 8;
1367 _us r1 : 4;
1368 _us r2 : 4;
1369 } b;
1370 _us s;
1371 } i0;
1372 i0.b.op = Op;
1373 i0.b.r1 = R1;
1374 i0.b.r2 = R2;
1375 assert(i0.b.op == Op);
1376 assert(i0.b.r1 == R1);
1377 assert(i0.b.r2 == R2);
1378 is(i0.s);
1379}
1380
1381static void
1382_RRE(jit_state_t *_jit, _ui Op, _ui R1, _ui R2)
1383{
1384 union {
1385 struct {
1386 _us op;
1387 } b;
1388 _us s;
1389 } i0;
1390 union {
1391 struct {
1392 _us _ : 8;
1393 _us r1 : 4;
1394 _us r2 : 4;
1395 } b;
1396 _us s;
1397 } i1;
1398 i0.b.op = Op;
1399 i1.b._ = 0;
1400 i1.b.r1 = R1;
1401 i1.b.r2 = R2;
1402 assert(i0.b.op == Op);
1403 assert(i1.b.r1 == R1);
1404 assert(i1.b.r2 == R2);
1405 is(i0.s);
1406 is(i1.s);
1407}
1408
1409static void
1410_RRF(jit_state_t *_jit, _ui Op, _ui R3, _ui M4, _ui R1, _ui R2)
1411{
1412 union {
1413 struct {
1414 _us op;
1415 } b;
1416 _us s;
1417 } i0;
1418 union {
1419 struct {
1420 _us r3 : 4;
1421 _us m4 : 4;
1422 _us r1 : 4;
1423 _us r2 : 4;
1424 } b;
1425 _us s;
1426 } i1;
1427 i0.b.op = Op;
1428 i1.b.r3 = R3;
1429 i1.b.m4 = M4;
1430 i1.b.r1 = R1;
1431 i1.b.r2 = R2;
1432 assert(i0.b.op == Op);
1433 assert(i1.b.r3 == R3);
1434 assert(i1.b.m4 == M4);
1435 assert(i1.b.r1 == R1);
1436 assert(i1.b.r2 == R2);
1437 is(i0.s);
1438 is(i1.s);
1439}
1440
1441static void
1442_RX(jit_state_t *_jit, _ui Op, _ui R1, _ui X2, _ui B2, _ui D2)
1443{
1444 union {
1445 struct {
1446 _us op : 8;
1447 _us r1 : 4;
1448 _us x2 : 4;
1449 } b;
1450 _us s;
1451 } i0;
1452 union {
1453 struct {
1454 _us b2 : 4;
1455 _us d2 : 12;
1456 } b;
1457 _us s;
1458 } i1;
1459 i0.b.op = Op;
1460 i0.b.r1 = R1;
1461 i0.b.x2 = X2;
1462 i1.b.b2 = B2;
1463 i1.b.d2 = D2;
1464 assert(i0.b.op == Op);
1465 assert(i0.b.r1 == R1);
1466 assert(i0.b.x2 == X2);
1467 assert(i1.b.b2 == B2);
1468 assert(i1.b.d2 == D2);
1469 is(i0.s);
1470 is(i1.s);
1471}
1472
1473static void
1474_RXE(jit_state_t *_jit, _ui Op, _ui R1, _ui X2, _ui B2, _ui D2, _ui Op2)
1475{
1476 union {
1477 struct {
1478 _us op : 8;
1479 _us r1 : 4;
1480 _us x2 : 4;
1481 } b;
1482 _us s;
1483 } i0;
1484 union {
1485 struct {
1486 _us b2 : 4;
1487 _us d2 : 12;
1488 } b;
1489 _ui s;
1490 } i1;
1491 union {
1492 struct {
1493 _us _ : 8;
1494 _us op : 8;
1495 } b;
1496 _us s;
1497 } i2;
1498 i2.b._ = 0;
1499 i0.b.op = Op;
1500 i0.b.r1 = R1;
1501 i0.b.x2 = X2;
1502 i1.b.b2 = B2;
1503 i1.b.d2 = D2;
1504 i2.b.op = Op2;
1505 assert(i0.b.op == Op);
1506 assert(i0.b.r1 == R1);
1507 assert(i0.b.x2 == X2);
1508 assert(i1.b.b2 == B2);
1509 assert(i1.b.d2 == D2);
1510 assert(i2.b.op == Op2);
1511 is(i0.s);
1512 is(i1.s);
1513 is(i2.s);
1514}
1515
1516static void
1517_RXF(jit_state_t *_jit, _ui Op, _ui R3, _ui X2, _ui B2, _ui D2, _ui R1, _ui Op2)
1518{
1519 union {
1520 struct {
1521 _us op : 8;
1522 _us r3 : 4;
1523 _us x2 : 4;
1524 } b;
1525 _us s;
1526 } i0;
1527 union {
1528 struct {
1529 _us b2 : 4;
1530 _us d2 : 12;
1531 } b;
1532 _us s;
1533 } i1;
1534 union {
1535 struct {
1536 _us r1 : 4;
1537 _us _ : 4;
1538 _us op : 8;
1539 } b;
1540 _us s;
1541 } i2;
1542 i2.b._ = 0;
1543 i0.b.op = Op;
1544 i0.b.r3 = R3;
1545 i0.b.x2 = X2;
1546 i1.b.b2 = B2;
1547 i1.b.d2 = D2;
1548 i2.b.r1 = R1;
1549 i2.b.op = Op2;
1550 assert(i0.b.op == Op);
1551 assert(i0.b.r3 == R3);
1552 assert(i0.b.x2 == X2);
1553 assert(i1.b.b2 == B2);
1554 assert(i1.b.d2 == D2);
1555 assert(i2.b.r1 == R1);
1556 assert(i2.b.op == Op2);
1557 is(i0.s);
1558 is(i1.s);
1559 is(i2.s);
1560}
1561
1562static void
1563_RXY(jit_state_t *_jit, _ui Op, _ui R1, _ui X2, _ui B2, _ui D2, _ui Op2)
1564{
1565 union {
1566 struct {
1567 _us op : 8;
1568 _us r1 : 4;
1569 _us x2 : 4;
1570 } b;
1571 _us s;
1572 } i0;
1573 union {
1574 struct {
1575 _us b2 : 4;
1576 _us dl : 12;
1577 } b;
1578 _us s;
1579 } i1;
1580 union {
1581 struct {
1582 _us dh : 8;
1583 _us op : 8;
1584 } b;
1585 _us s;
1586 } i2;
1587 i0.s = i1.s = i2.s = 0;
1588 i0.b.op = Op;
1589 i0.b.r1 = R1;
1590 i0.b.x2 = X2;
1591 i1.b.b2 = B2;
1592 i1.b.dl = D2 & 0xfff;
1593 i2.b.dh = D2 >> 12;
1594 i2.b.op = Op2;
1595 assert(i0.b.op == Op);
1596 assert(i0.b.r1 == R1);
1597 assert(i0.b.x2 == X2);
1598 assert(i1.b.b2 == B2);
1599 assert(i2.b.dh == D2 >> 12);
1600 assert(i2.b.op == Op2);
1601 is(i0.s);
1602 is(i1.s);
1603 is(i2.s);
1604}
1605
1606static void
1607_RS(jit_state_t *_jit, _ui Op, _ui R1, _ui R3, _ui B2, _ui D2)
1608{
1609 union {
1610 struct {
1611 _us op : 8;
1612 _us r1 : 4;
1613 _us r3 : 4;
1614 } b;
1615 _us s;
1616 } i0;
1617 union {
1618 struct {
1619 _us b2 : 4;
1620 _us d2 : 12;
1621 } b;
1622 _us s;
1623 } i1;
1624 i0.s = i1.s = 0;
1625 i0.b.op = Op;
1626 i0.b.r1 = R1;
1627 i0.b.r3 = R3;
1628 i1.b.b2 = B2;
1629 i1.b.d2 = D2;
1630 assert(i0.b.op == Op);
1631 assert(i0.b.r1 == R1);
1632 assert(i0.b.r3 == R3);
1633 assert(i1.b.b2 == B2);
1634 assert(i1.b.d2 == D2);
1635 is(i0.s);
1636 is(i1.s);
1637}
1638
1639static void
1640_RSL(jit_state_t *_jit, _ui Op, _ui L1, _ui B1, _ui D1, _ui Op2)
1641{
1642 union {
1643 struct {
1644 _us op : 8;
1645 _us l1 : 4;
1646 _us _ : 4;
1647 } b;
1648 _us s;
1649 } i0;
1650 union {
1651 struct {
1652 _us b1 : 4;
1653 _us d1 : 12;
1654 } b;
1655 _us s;
1656 } i1;
1657 union {
1658 struct {
1659 _us _ : 8;
1660 _us op : 8;
1661 } b;
1662 _us s;
1663 } i2;
1664 i0.b._ = 0;
1665 i2.b._ = 0;
1666 i0.b.op = Op;
1667 i0.b.l1 = L1;
1668 i1.b.b1 = B1;
1669 i1.b.d1 = D1;
1670 i2.b.op = Op2;
1671 assert(i0.b.op == Op);
1672 assert(i0.b.l1 == L1);
1673 assert(i1.b.b1 == B1);
1674 assert(i1.b.d1 == D1);
1675 assert(i2.b.op == Op2);
1676 is(i0.s);
1677 is(i1.s);
1678 is(i2.s);
1679}
1680
1681static void
1682_RSI(jit_state_t *_jit, _ui Op, _ui R1, _ui R3, _ui I2)
1683{
1684 union {
1685 struct {
1686 _us op : 8;
1687 _us r1 : 4;
1688 _us r3 : 4;
1689 } b;
1690 _us s;
1691 } i0;
1692 union {
1693 struct {
1694 _us i2;
1695 } b;
1696 _us s;
1697 } i1;
1698 i0.b.op = Op;
1699 i0.b.r1 = R1;
1700 i0.b.r3 = R3;
1701 i1.b.i2 = I2;
1702 assert(i0.b.op == Op);
1703 assert(i0.b.r1 == R1);
1704 assert(i0.b.r3 == R3);
1705 assert(i1.b.i2 == I2);
1706 is(i0.s);
1707 is(i1.s);
1708}
1709
1710static void
1711_RIE(jit_state_t *_jit, _ui Op, _ui R1, _ui R3, _ui I2, _ui Op2)
1712{
1713 union {
1714 struct {
1715 _us op : 8;
1716 _us r1 : 4;
1717 _us r3 : 4;
1718 } b;
1719 _us s;
1720 } i0;
1721 union {
1722 struct {
1723 _us i2;
1724 } b;
1725 _us s;
1726 } i1;
1727 union {
1728 struct {
1729 _us _ : 8;
1730 _us op : 8;
1731 } b;
1732 _us s;
1733 } i2;
1734 i2.b._ = 0;
1735 i0.b.op = Op;
1736 i0.b.r1 = R1;
1737 i0.b.r3 = R3;
1738 i1.b.i2 = I2;
1739 i2.b.op = Op2;
1740 assert(i0.b.op == Op);
1741 assert(i0.b.r1 == R1);
1742 assert(i0.b.r3 == R3);
1743 assert(i1.b.i2 == I2);
1744 assert(i2.b.op == Op2);
1745 is(i0.s);
1746 is(i1.s);
1747 is(i2.s);
1748}
1749
1750static void
1751_RIL(jit_state_t *_jit, _ui Op, _ui R1, _ui Op2, _ui I2)
1752{
1753 union {
1754 struct {
1755 _us o1 : 8;
1756 _us r1 : 4;
1757 _us o2 : 4;
1758 } b;
1759 _us s;
1760 } i0;
1761 union {
1762 struct {
1763 _ui ih : 16;
1764 _ui il : 16;
1765 } b;
1766 _ui i;
1767 } i12;
1768 i0.b.o1 = Op;
1769 i0.b.r1 = R1;
1770 i0.b.o2 = Op2;
1771 i12.i = I2;
1772 assert(i0.b.o1 == Op);
1773 assert(i0.b.r1 == R1);
1774 assert(i0.b.o2 == Op2);
1775 is(i0.s);
1776 is(i12.b.ih);
1777 is(i12.b.il);
1778}
1779
1780static void
1781_SI(jit_state_t *_jit, _ui Op, _ui I2, _ui B1, _ui D1)
1782{
1783 union {
1784 struct {
1785 _us op : 8;
1786 _us i2 : 8;
1787 } b;
1788 _us s;
1789 } i0;
1790 union {
1791 struct {
1792 _us b1 : 4;
1793 _us d1 : 12;
1794 } b;
1795 _us s;
1796 } i1;
1797 i0.b.op = Op;
1798 i0.b.i2 = I2;
1799 i1.b.b1 = B1;
1800 i1.b.d1 = D1;
1801 assert(i0.b.op == Op);
1802 assert(i0.b.i2 == I2);
1803 assert(i1.b.b1 == B1);
1804 assert(i1.b.d1 == D1);
1805 is(i0.s);
1806 is(i1.s);
1807}
1808
1809static void
1810_SIY(jit_state_t *_jit, _ui Op, _ui I2, _ui B1, _ui D1, _ui Op2)
1811{
1812 union {
1813 struct {
1814 _us op : 8;
1815 _us i2 : 8;
1816 } b;
1817 _us s;
1818 } i0;
1819 union {
1820 struct {
1821 _us b1 : 4;
1822 _us dl : 12;
1823 } b;
1824 _us s;
1825 } i1;
1826 union {
1827 struct {
1828 _us dh : 8;
1829 _us op : 8;
1830 } b;
1831 _us s;
1832 } i2;
1833 i0.b.op = Op;
1834 i0.b.i2 = I2;
1835 i1.b.b1 = B1;
1836 i1.b.dl = D1 & 0xfff;
1837 i2.b.dh = D1 >> 8;
1838 i2.b.op = Op2;
1839 assert(i0.b.op == Op);
1840 assert(i0.b.i2 == I2);
1841 assert(i1.b.b1 == B1);
1842 assert(i2.b.dh == D1 >> 8);
1843 assert(i2.b.op == Op2);
1844 is(i0.s);
1845 is(i1.s);
1846 is(i2.s);
1847}
1848
1849static void
1850_S(jit_state_t *_jit, _ui Op, _ui B2, _ui D2)
1851{
1852 union {
1853 struct {
1854 _us op;
1855 } b;
1856 _us s;
1857 } i0;
1858 union {
1859 struct {
1860 _us b2 : 4;
1861 _us d2 : 12;
1862 } b;
1863 _us s;
1864 } i1;
1865 i0.b.op = Op;
1866 i1.b.b2 = B2;
1867 i1.b.d2 = D2;
1868 assert(i0.b.op == Op);
1869 assert(i1.b.b2 == B2);
1870 assert(i1.b.d2 == D2);
1871 is(i0.s);
1872 is(i1.s);
1873}
1874
1875static void
1876_SS(jit_state_t *_jit, _ui Op, _ui LL, _ui LH, _ui B1, _ui D1, _ui B2, _ui D2)
1877{
1878 union {
1879 struct {
1880 _us op : 8;
1881 _us ll : 4;
1882 _us lh : 4;
1883 } b;
1884 _us s;
1885 } i0;
1886 union {
1887 struct {
1888 _us b1 : 4;
1889 _us d1 : 12;
1890 } b;
1891 _us s;
1892 } i1;
1893 union {
1894 struct {
1895 _us b2 : 4;
1896 _us d2 : 12;
1897 } b;
1898 _us s;
1899 } i2;
1900 i0.b.op = Op;
1901 i0.b.ll = LL;
1902 i0.b.lh = LH;
1903 i1.b.b1 = B1;
1904 i1.b.d1 = D1;
1905 i2.b.b2 = B2;
1906 i2.b.d2 = D2;
1907 assert(i0.b.op == Op);
1908 assert(i0.b.ll == LL);
1909 assert(i0.b.lh == LH);
1910 assert(i1.b.b1 == B1);
1911 assert(i1.b.d1 == D1);
1912 assert(i2.b.b2 == B2);
1913 assert(i2.b.d2 == D2);
1914 is(i0.s);
1915 is(i1.s);
1916 is(i2.s);
1917}
1918
1919static void
1920_SSE(jit_state_t *_jit, _ui Op, _ui B1, _ui D1, _ui B2, _ui D2)
1921{
1922 union {
1923 struct {
1924 _us op;
1925 } b;
1926 _us s;
1927 } i0;
1928 union {
1929 struct {
1930 _us b1 : 4;
1931 _us d1 : 12;
1932 } b;
1933 _us s;
1934 } i1;
1935 union {
1936 struct {
1937 _us b2 : 4;
1938 _us d2 : 12;
1939 } b;
1940 _us s;
1941 } i2;
1942 i0.b.op = Op;
1943 i1.b.b1 = B1;
1944 i1.b.d1 = D1;
1945 i2.b.b2 = B2;
1946 i2.b.d2 = D2;
1947 assert(i0.b.op == Op);
1948 assert(i1.b.b1 == B1);
1949 assert(i1.b.d1 == D1);
1950 assert(i2.b.b2 == B2);
1951 assert(i2.b.d2 == D2);
1952 is(i0.s);
1953 is(i1.s);
1954 is(i2.s);
1955}
1956# undef _us
1957# undef _ui
1958
1959static void
1960_nop(jit_state_t *_jit, jit_int32_t c)
1961{
1962 assert(c >= 0 && !(c & 1));
1963 while (c) {
1964 NOPR(_R7_REGNO);
1965 c -= 2;
1966 }
1967}
1968
1969static jit_int32_t
1970_xdivr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1971{
1972 jit_int32_t regno;
1973 regno = jit_get_reg_pair();
1974#if __WORDSIZE == 32
1975 movr(rn(regno), r0);
1976 SRDA(rn(regno), 32, 0);
1977#else
1978 movr(rn(regno) + 1, r0);
1979#endif
1980 DIVREM_(rn(regno), r1);
1981 jit_unget_reg_pair(regno);
1982 return (regno);
1983}
1984
1985static jit_int32_t
1986_xdivr_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
1987{
1988 jit_int32_t regno;
1989 regno = jit_get_reg_pair();
1990#if __WORDSIZE == 32
1991 movr(rn(regno), r0);
1992 SRDL(rn(regno), 32, 0);
1993#else
1994 movr(rn(regno) + 1, r0);
1995#endif
1996 movi(rn(regno), 0);
1997 DIVREMU_(rn(regno), r1);
1998 jit_unget_reg_pair(regno);
1999 return (regno);
2000}
2001
2002static jit_int32_t
2003_xdivi(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
2004{
2005 jit_int32_t imm, regno;
2006 regno = jit_get_reg_pair();
2007 imm = jit_get_reg(jit_class_gpr);
2008#if __WORDSIZE == 32
2009 movr(rn(regno), r0);
2010 SRDA(rn(regno), 32, 0);
2011#else
2012 movr(rn(regno) + 1, r0);
2013#endif
2014 movi(rn(imm), i0);
2015 DIVREM_(rn(regno), rn(imm));
2016 jit_unget_reg(imm);
2017 jit_unget_reg_pair(regno);
2018 return (regno);
2019}
2020
2021static jit_int32_t
2022_xdivi_u(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
2023{
2024 /* cannot overlap because operand is 128-bit */
2025 jit_int32_t imm, regno;
2026 regno = jit_get_reg_pair();
2027 imm = jit_get_reg(jit_class_gpr);
2028#if __WORDSIZE == 32
2029 movr(rn(regno), r0);
2030 SRDL(rn(regno), 32, 0);
2031#else
2032 movr(rn(regno) + 1, r0);
2033#endif
2034 movi(rn(regno), 0);
2035 movi(rn(imm), i0);
2036 DIVREMU_(rn(regno), rn(imm));
2037 jit_unget_reg(imm);
2038 jit_unget_reg_pair(regno);
2039 return (regno);
2040}
2041
2042static void
2043_crr(jit_state_t *_jit, jit_int32_t cc,
2044 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2045{
2046 jit_word_t w;
2047 jit_int32_t reg, rg;
2048 if (r0 == r1 || r0 == r2) {
2049 reg = jit_get_reg(jit_class_gpr);
2050 rg = rn(reg);
2051 }
2052 else
2053 rg = r0;
2054 movi(rg, 1);
2055 CMP_(r1, r2);
2056 w = _jit->pc.w;
2057 BRC(cc, 0);
2058 movi(rg, 0);
2059 patch_at(w, _jit->pc.w);
2060 if (r0 == r1 || r0 == r2) {
2061 movr(r0, rg);
2062 jit_unget_reg(reg);
2063 }
2064}
2065
2066static void
2067_cri(jit_state_t *_jit, jit_int32_t cc,
2068 jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2069{
2070 jit_int32_t reg;
2071 reg = jit_get_reg(jit_class_gpr);
2072 movi(rn(reg), i0);
2073 crr(cc, r0, r1, rn(reg));
2074 jit_unget_reg(reg);
2075}
2076
2077static void
2078_crr_u(jit_state_t *_jit, jit_int32_t cc,
2079 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2080{
2081 jit_word_t w;
2082 jit_int32_t reg, rg;
2083 if (r0 == r1 || r0 == r2) {
2084 reg = jit_get_reg(jit_class_gpr);
2085 rg = rn(reg);
2086 }
2087 else
2088 rg = r0;
2089 movi(rg, 1);
2090 CMPU_(r1, r2);
2091 w = _jit->pc.w;
2092 BRC(cc, 0);
2093 movi(rg, 0);
2094 patch_at(w, _jit->pc.w);
2095 if (r0 == r1 || r0 == r2) {
2096 movr(r0, rg);
2097 jit_unget_reg(reg);
2098 }
2099}
2100
2101static void
2102_cri_u(jit_state_t *_jit, jit_int32_t cc,
2103 jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2104{
2105 jit_int32_t reg;
2106 reg = jit_get_reg(jit_class_gpr);
2107 movi(rn(reg), i0);
2108 crr_u(cc, r0, r1, rn(reg));
2109 jit_unget_reg(reg);
2110}
2111
2112static void
2113_brr(jit_state_t *_jit, jit_int32_t cc,
2114 jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2115{
2116 jit_word_t d;
2117 CMP_(r0, r1);
2118 d = (i0 - _jit->pc.w) >> 1;
2119 if (s16_p(d))
2120 BRC(cc, x16(d));
2121 else {
2122 assert(s32_p(d));
2123 BRCL(cc, d);
2124 }
2125}
2126
2127static jit_word_t
2128_brr_p(jit_state_t *_jit, jit_int32_t cc,
2129 jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2130{
2131 jit_word_t w;
2132 CMP_(r0, r1);
2133 w = _jit->pc.w;
2134 BRCL(cc, 0);
2135 return (w);
2136}
2137
2138static void
2139_bri(jit_state_t *_jit, jit_int32_t cc,
2140 jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2141{
2142 jit_int32_t reg;
2143 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2144 movi(rn(reg), i1);
2145 brr(cc, i0, r0, rn(reg));
2146 jit_unget_reg(reg);
2147}
2148
2149static jit_word_t
2150_bri_p(jit_state_t *_jit, jit_int32_t cc,
2151 jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2152{
2153 jit_word_t w;
2154 jit_int32_t reg;
2155 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2156 movi(rn(reg), i1);
2157 w = brr_p(cc, i0, r0, rn(reg));
2158 jit_unget_reg(reg);
2159 return (w);
2160}
2161
2162static void
2163_brr_u(jit_state_t *_jit, jit_int32_t cc,
2164 jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2165{
2166 jit_word_t d;
2167 CMPU_(r0, r1);
2168 d = (i0 - _jit->pc.w) >> 1;
2169 if (s16_p(d))
2170 BRC(cc, x16(d));
2171 else {
2172 assert(s32_p(d));
2173 BRCL(cc, d);
2174 }
2175}
2176
2177static jit_word_t
2178_brr_u_p(jit_state_t *_jit, jit_int32_t cc,
2179 jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2180{
2181 jit_word_t w;
2182 CMPU_(r0, r1);
2183 w = _jit->pc.w;
2184 BRCL(cc, 0);
2185 return (w);
2186}
2187
2188static void
2189_bri_u(jit_state_t *_jit, jit_int32_t cc,
2190 jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2191{
2192 jit_int32_t reg;
2193 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2194 movi(rn(reg), i1);
2195 brr_u(cc, i0, r0, rn(reg));
2196 jit_unget_reg(reg);
2197}
2198
2199static jit_word_t
2200_bri_u_p(jit_state_t *_jit, jit_int32_t cc,
2201 jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2202{
2203 jit_word_t w;
2204 jit_int32_t reg;
2205 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2206 movi(rn(reg), i1);
2207 w = brr_u_p(cc, i0, r0, rn(reg));
2208 jit_unget_reg(reg);
2209 return (w);
2210}
2211
2212static void
2213_baddr(jit_state_t *_jit, jit_int32_t c, jit_bool_t s,
2214 jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2215{
2216 jit_word_t d;
2217 if (s) addr(r0, r0, r1);
2218 else addcr(r0, r0, r1);
2219 d = (i0 - _jit->pc.w) >> 1;
2220 if (s16_p(d))
2221 BRC(c, x16(d));
2222 else {
2223 assert(s32_p(d));
2224 BRCL(c, d);
2225 }
2226}
2227
2228static void
2229_baddi(jit_state_t *_jit, jit_int32_t c, jit_bool_t s,
2230 jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2231{
2232 jit_int32_t reg;
2233 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2234 movi(rn(reg), i1);
2235 baddr(c, s, i0, r0, rn(reg));
2236 jit_unget_reg(reg);
2237}
2238
2239static jit_word_t
2240_baddr_p(jit_state_t *_jit, jit_int32_t c, jit_bool_t s,
2241 jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2242{
2243 jit_word_t d, w;
2244 if (s) addr(r0, r0, r1);
2245 else addcr(r0, r0, r1);
2246 d = (i0 - _jit->pc.w) >> 1;
2247 w = _jit->pc.w;
2248 BRCL(c, d);
2249 return (w);
2250}
2251
2252static jit_word_t
2253_baddi_p(jit_state_t *_jit, jit_int32_t c, jit_bool_t s,
2254 jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2255{
2256 jit_word_t w;
2257 jit_int32_t reg;
2258 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2259 movi(rn(reg), i1);
2260 w = baddr_p(c, s, i0, r0, rn(reg));
2261 jit_unget_reg(reg);
2262 return (w);
2263}
2264
2265static void
2266_bsubr(jit_state_t *_jit, jit_int32_t c, jit_bool_t s,
2267 jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2268{
2269 jit_word_t d;
2270 if (s) subr(r0, r0, r1);
2271 else subcr(r0, r0, r1);
2272 d = (i0 - _jit->pc.w) >> 1;
2273 if (s16_p(d))
2274 BRC(c, x16(d));
2275 else {
2276 assert(s32_p(d));
2277 BRCL(c, d);
2278 }
2279}
2280
2281static void
2282_bsubi(jit_state_t *_jit, jit_int32_t c, jit_bool_t s,
2283 jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2284{
2285 jit_int32_t reg;
2286 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2287 movi(rn(reg), i1);
2288 bsubr(c, s, i0, r0, rn(reg));
2289 jit_unget_reg(reg);
2290}
2291
2292static jit_word_t
2293_bsubr_p(jit_state_t *_jit, jit_int32_t c, jit_bool_t s,
2294 jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2295{
2296 jit_word_t d, w;
2297 if (s) subr(r0, r0, r1);
2298 else subcr(r0, r0, r1);
2299 d = (i0 - _jit->pc.w) >> 1;
2300 w = _jit->pc.w;
2301 BRCL(c, d);
2302 return (w);
2303}
2304
2305static jit_word_t
2306_bsubi_p(jit_state_t *_jit, jit_int32_t c, jit_bool_t s,
2307 jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2308{
2309 jit_word_t w;
2310 jit_int32_t reg;
2311 reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
2312 movi(rn(reg), i1);
2313 w = bsubr_p(c, s, i0, r0, rn(reg));
2314 jit_unget_reg(reg);
2315 return (w);
2316}
2317
2318static void
2319_bmxr(jit_state_t *_jit, jit_int32_t cc,
2320 jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2321{
2322 jit_word_t d;
2323 jit_int32_t reg;
2324 reg = jit_get_reg(jit_class_gpr);
2325 movr(rn(reg), r0);
2326 andr(rn(reg), rn(reg), r1);
2327 TEST_(rn(reg), rn(reg));
2328 jit_unget_reg(reg);
2329 d = (i0 - _jit->pc.w) >> 1;
2330 if (s16_p(d))
2331 BRC(cc, x16(d));
2332 else {
2333 assert(s32_p(d));
2334 BRCL(cc, d);
2335 }
2336}
2337
2338static jit_word_t
2339_bmxr_p(jit_state_t *_jit, jit_int32_t cc,
2340 jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
2341{
2342 jit_word_t w;
2343 jit_int32_t reg;
2344 reg = jit_get_reg(jit_class_gpr);
2345 movr(rn(reg), r0);
2346 andr(rn(reg), rn(reg), r1);
2347 TEST_(rn(reg), rn(reg));
2348 jit_unget_reg(reg);
2349 w = _jit->pc.w;
2350 BRCL(cc, 0);
2351 return (w);
2352}
2353
2354static void
2355_bmxi(jit_state_t *_jit, jit_int32_t cc,
2356 jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2357{
2358 jit_word_t d;
2359 jit_int32_t reg;
2360 reg = jit_get_reg(jit_class_gpr);
2361 movi(rn(reg), i1);
2362 andr(rn(reg), rn(reg), r0);
2363 TEST_(rn(reg), rn(reg));
2364 jit_unget_reg(reg);
2365 d = (i0 - _jit->pc.w) >> 1;
2366 if (s16_p(d))
2367 BRC(cc, x16(d));
2368 else {
2369 assert(s32_p(d));
2370 BRCL(cc, d);
2371 }
2372}
2373
2374static jit_word_t
2375_bmxi_p(jit_state_t *_jit, jit_int32_t cc,
2376 jit_word_t i0, jit_int32_t r0, jit_word_t i1)
2377{
2378 jit_word_t w;
2379 jit_int32_t reg;
2380 reg = jit_get_reg(jit_class_gpr);
2381 movi(rn(reg), i1);
2382 andr(rn(reg), rn(reg), r0);
2383 TEST_(rn(reg), rn(reg));
2384 jit_unget_reg(reg);
2385 w = _jit->pc.w;
2386 BRCL(cc, 0);
2387 return (w);
2388}
2389
2390static void
2391_movr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
2392{
2393#if __WORDSIZE == 32
2394 if (r0 != r1)
2395 LR(r0, r1);
2396#else
2397 if (r0 != r1)
2398 LGR(r0, r1);
2399#endif
2400}
2401
2402static void
2403_movi(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
2404{
2405 jit_word_t d;
2406#if __WORDSIZE == 64
2407 jit_int32_t bits;
2408#endif
2409 d = (i0 - _jit->pc.w) >> 1;
2410 if (s16_p(i0)) {
2411#if __WORDSIZE == 32
2412 LHI(r0, x16(i0));
2413#else
2414 LGHI(r0, x16(i0));
2415#endif
2416 }
2417 /* easy way of loading a large amount of 32 bit values and
2418 * usually address of constants */
2419 else if (!(i0 & 1) &&
2420#if __WORDSIZE == 32
2421 i0 > 0
2422#else
2423 s32_p(d)
2424#endif
2425 )
2426 LARL(r0, d);
2427 else {
2428#if __WORDSIZE == 32
2429 LHI(r0, x16(i0));
2430 IILH(r0, x16((jit_uword_t)i0 >> 16));
2431#else
2432 bits = 0;
2433 if (i0 & 0xffffL) bits |= 1;
2434 if (i0 & 0xffff0000L) bits |= 2;
2435 if (i0 & 0xffff00000000L) bits |= 4;
2436 if (i0 & 0xffff000000000000L) bits |= 8;
2437 if (bits != 15) LGHI(r0, 0);
2438 if (bits & 1) IILL(r0, x16(i0));
2439 if (bits & 2) IILH(r0, x16((jit_uword_t)i0 >> 16));
2440 if (bits & 4) IIHL(r0, x16((jit_uword_t)i0 >> 32));
2441 if (bits & 8) IIHH(r0, x16((jit_uword_t)i0 >> 48));
2442#endif
2443 }
2444}
2445
2446static jit_word_t
2447_movi_p(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
2448{
2449 jit_word_t w;
2450 w = _jit->pc.w;
2451#if __WORDSIZE == 32
2452 LHI(r0, x16(i0));
2453#else
2454 IILL(r0, x16(i0));
2455#endif
2456 IILH(r0, x16((jit_uword_t)i0 >> 16));
2457#if __WORDSIZE == 64
2458 IIHL(r0, x16((jit_uword_t)i0 >> 32));
2459 IIHH(r0, x16((jit_uword_t)i0 >> 48));
2460#endif
2461 return (w);
2462}
2463
40a44dcb
PC
2464static void
2465_movnr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2466{
2467 jit_word_t w;
2468 w = beqi_p(_jit->pc.w, r2, 0);
2469#if __WORDSIZE == 32
2470 LR(r0, r1);
2471#else
2472 LGR(r0, r1);
2473#endif
2474 patch_at(w, _jit->pc.w);
2475}
2476
2477static void
2478_movzr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2479{
2480 jit_word_t w;
2481 w = bnei_p(_jit->pc.w, r2, 0);
2482#if __WORDSIZE == 32
2483 LR(r0, r1);
2484#else
2485 LGR(r0, r1);
2486#endif
2487 patch_at(w, _jit->pc.w);
2488}
2489
79bfeef6
PC
2490static void
2491_bswapr_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
2492{
2493 LRVR(r0, r1);
2494 SRL(r0, 16, 0);
2495 LLGHR(r0, r0);
2496}
2497
2498static void
2499_bswapr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
2500{
2501 LRVR(r0, r1);
2502# if __WORDSIZE == 64
2503 LLGFR(r0, r0);
2504# endif
2505}
2506
2507#if __WORDSIZE == 64
2508static void
2509_bswapr_ul(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
2510{
2511 LRVGR(r0, r1);
2512}
2513#endif
2514
ba3814c1
PC
2515static void
2516_casx(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1,
2517 jit_int32_t r2, jit_int32_t r3, jit_word_t i0)
2518{
c0c16242
PC
2519 jit_int32_t iscasi, r1_reg;
2520 if ((iscasi = (r1 == _NOREG))) {
2521 r1_reg = jit_get_reg_but_zero(0);
2522 r1 = rn(r1_reg);
2523 movi(r1, i0);
2524 }
2525 /* Do not clobber r2 */
2526 movr(r0, r2);
2527 /* The CS and CSG instructions below effectively do atomically:
2528 * if (*r1 == r0)
2529 * *r1 = r3;
2530 * else
2531 * r0 = *r1
2532 * So, we do not need to check cpu flags to know if it did work,
2533 * just compare if values are different.
2534 * Obviously it is somewhat of undefined behavior if old_value (r2)
2535 * and new_value (r3) have the same value, but should still work
2536 * as expected as a noop.
2537 */
2538# if __WORDSIZE == 32
2539 CS(r0, r3, 0, r1);
2540# else
2541 CSG(r0, r3, 0, r1);
2542# endif
2543 eqr(r0, r0, r2);
2544 if (iscasi)
2545 jit_unget_reg(r1_reg);
ba3814c1
PC
2546}
2547
4a71579b
PC
2548static void
2549_addr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2550{
2551 if (r0 == r2)
2552 ADD_(r0, r1);
2553 else {
2554 movr(r0, r1);
2555 ADD_(r0, r2);
2556 }
2557}
2558
2559static void
2560_addi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2561{
2562 jit_int32_t reg;
2563 if (r0 == r1 && s16_p(i0))
2564 ADDI_(r0, x16(i0));
2565#if __WORDSIZE == 64
2566 else if (s20_p(i0))
2567 LAY(r0, x20(i0), 0, r1);
2568#endif
2569 else {
2570 reg = jit_get_reg(jit_class_gpr);
2571 movi(rn(reg), i0);
2572 addr(r0, r1, rn(reg));
2573 jit_unget_reg(reg);
2574 }
2575}
2576
2577static void
2578_addcr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2579{
2580 if (r0 == r2)
2581 ADDC_(r0, r1);
2582 else {
2583 movr(r0, r1);
2584 ADDC_(r0, r2);
2585 }
2586}
2587
2588static void
2589_addci(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2590{
2591 jit_int32_t reg;
2592 reg = jit_get_reg(jit_class_gpr);
2593 movi(rn(reg), i0);
2594 addcr(r0, r1, rn(reg));
2595 jit_unget_reg(reg);
2596}
2597
2598static void
2599_addxr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2600{
2601 if (r0 == r2)
2602 ADDX_(r0, r1);
2603 else {
2604 movr(r0, r1);
2605 ADDX_(r0, r2);
2606 }
2607}
2608
2609static void
2610_addxi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2611{
2612 jit_int32_t reg;
2613 reg = jit_get_reg(jit_class_gpr);
2614 movi(rn(reg), i0);
2615 addxr(r0, r1, rn(reg));
2616 jit_unget_reg(reg);
2617}
2618
2619static void
2620_subr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2621{
2622 jit_int32_t reg;
2623 if (r0 == r2) {
2624 reg = jit_get_reg(jit_class_gpr);
2625 movr(rn(reg), r2);
2626 movr(r0, r1);
2627 SUB_(r0, rn(reg));
2628 jit_unget_reg(reg);
2629 }
2630 else {
2631 movr(r0, r1);
2632 SUB_(r0, r2);
2633 }
2634}
2635
2636static void
2637_subi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2638{
2639 jit_int32_t reg;
2640 if (r0 == r1 && s16_p(-i0))
2641 ADDI_(r0, x16(-i0));
2642#if __WORDSIZE == 64
2643 else if (s20_p(-i0))
2644 LAY(r0, x20(-i0), 0, r1);
2645#endif
2646 else {
2647 reg = jit_get_reg(jit_class_gpr);
2648 movi(rn(reg), i0);
2649 subr(r0, r1, rn(reg));
2650 jit_unget_reg(reg);
2651 }
2652}
2653
2654static void
2655_subcr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2656{
2657 jit_int32_t reg;
2658 if (r0 == r2) {
2659 reg = jit_get_reg(jit_class_gpr);
2660 movr(rn(reg), r2);
2661 movr(r0, r1);
2662 SUBC_(r0, rn(reg));
2663 jit_unget_reg(reg);
2664 }
2665 else {
2666 movr(r0, r1);
2667 SUBC_(r0, r2);
2668 }
2669}
2670
2671static void
2672_subci(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2673{
2674 jit_int32_t reg;
2675 reg = jit_get_reg(jit_class_gpr);
2676 movi(rn(reg), i0);
2677 subcr(r0, r1, rn(reg));
2678 jit_unget_reg(reg);
2679}
2680
2681static void
2682_subxr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2683{
2684 jit_int32_t reg;
2685 if (r0 == r2) {
2686 reg = jit_get_reg(jit_class_gpr);
2687 movr(rn(reg), r2);
2688 movr(r0, r1);
2689 SUBX_(r0, rn(reg));
2690 jit_unget_reg(reg);
2691 }
2692 else {
2693 movr(r0, r1);
2694 SUBX_(r0, r2);
2695 }
2696}
2697
2698static void
2699_subxi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2700{
2701 jit_int32_t reg;
2702 reg = jit_get_reg(jit_class_gpr);
2703 movi(rn(reg), i0);
2704 subxr(r0, r1, rn(reg));
2705 jit_unget_reg(reg);
2706}
2707
2708static void
2709_rsbi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2710{
2711 subi(r0, r1, i0);
2712 negr(r0, r0);
2713}
2714
2715static void
2716_mulr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2717{
2718 if (r0 == r2)
2719 MUL_(r0, r1);
2720 else {
2721 movr(r0, r1);
2722 MUL_(r0, r2);
2723 }
2724}
2725
2726static void
2727_muli(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2728{
2729 jit_int32_t reg;
2730 if (s16_p(i0)) {
2731 movr(r0, r1);
2732 MULI_(r0, x16(i0));
2733 }
2734 else {
2735 reg = jit_get_reg(jit_class_gpr);
2736 movi(rn(reg), i0);
2737 mulr(r0, r1, rn(reg));
2738 jit_unget_reg(reg);
2739 }
2740}
2741
2742static void
2743_qmulr(jit_state_t *_jit,
2744 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3)
2745{
2746 jit_int32_t reg;
2747 /* The only invalid condition is r0 == r1 */
2748 jit_int32_t t2, t3, s2, s3;
2749 if (r2 == r0 || r2 == r1) {
2750 s2 = jit_get_reg(jit_class_gpr);
2751 t2 = rn(s2);
2752 movr(t2, r2);
2753 }
2754 else
2755 t2 = r2;
2756 if (r3 == r0 || r3 == r1) {
2757 s3 = jit_get_reg(jit_class_gpr);
2758 t3 = rn(s3);
2759 movr(t3, r3);
2760 }
2761 else
2762 t3 = r3;
2763 qmulr_u(r0, r1, r2, r3);
2764 reg = jit_get_reg(jit_class_gpr);
2765 /**/
2766 rshi(rn(reg), t2, 63);
2767 mulr(rn(reg), rn(reg), t3);
2768 addr(r1, r1, rn(reg));
2769 /**/
2770 rshi(rn(reg), t3, 63);
2771 mulr(rn(reg), rn(reg), t2);
2772 addr(r1, r1, rn(reg));
2773 jit_unget_reg(reg);
2774 if (t2 != r2)
2775 jit_unget_reg(s2);
2776 if (t3 != r3)
2777 jit_unget_reg(s3);
2778}
2779
2780static void
2781_qmuli(jit_state_t *_jit,
2782 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_word_t i0)
2783{
2784 jit_int32_t reg;
2785 reg = jit_get_reg(jit_class_gpr);
2786 movi(rn(reg), i0);
2787 qmulr(r0, r1, r2, rn(reg));
2788 jit_unget_reg(reg);
2789}
2790
2791static void
2792_qmulr_u(jit_state_t *_jit,
2793 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3)
2794{
2795 jit_int32_t regno;
2796 regno = jit_get_reg_pair();
2797 movr(rn(regno) + 1, r2);
2798 MULU_(rn(regno), r3);
2799 movr(r0, rn(regno) + 1);
2800 movr(r1, rn(regno));
2801 jit_unget_reg_pair(regno);
2802}
2803
2804static void
2805_qmuli_u(jit_state_t *_jit,
2806 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_word_t i0)
2807{
2808 jit_int32_t regno;
2809 regno = jit_get_reg_pair();
2810 movr(rn(regno) + 1, r2);
2811 movi(rn(regno), i0);
2812 MULU_(rn(regno), rn(regno));
2813 movr(r0, rn(regno) + 1);
2814 movr(r1, rn(regno));
2815 jit_unget_reg_pair(regno);
2816}
2817
2818static void
2819_divr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2820{
2821 jit_int32_t regno;
2822 regno = xdivr(r1, r2);
2823 movr(r0, rn(regno) + 1);
2824}
2825
2826static void
2827_divi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2828{
2829 jit_int32_t regno;
2830 regno = xdivi(r1, i0);
2831 movr(r0, rn(regno) + 1);
2832}
2833
2834static void
2835_divr_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2836{
2837 jit_int32_t regno;
2838 regno = xdivr_u(r1, r2);
2839 movr(r0, rn(regno) + 1);
2840}
2841
2842static void
2843_divi_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2844{
2845 jit_int32_t regno;
2846 regno = xdivi_u(r1, i0);
2847 movr(r0, rn(regno) + 1);
2848}
2849
2850static void
2851_remr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2852{
2853 jit_int32_t regno;
2854 regno = xdivr(r1, r2);
2855 movr(r0, rn(regno));
2856}
2857
2858static void
2859_remi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2860{
2861 jit_int32_t regno;
2862 regno = xdivi(r1, i0);
2863 movr(r0, rn(regno));
2864}
2865
2866static void
2867_remr_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2868{
2869 jit_int32_t regno;
2870 regno = xdivr_u(r1, r2);
2871 movr(r0, rn(regno));
2872}
2873
2874static void
2875_remi_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2876{
2877 jit_int32_t regno;
2878 regno = xdivi_u(r1, i0);
2879 movr(r0, rn(regno));
2880}
2881
2882static void
2883_qdivr(jit_state_t *_jit,
2884 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3)
2885{
2886 jit_int32_t regno;
2887 regno = xdivr(r2, r3);
2888 movr(r0, rn(regno) + 1);
2889 movr(r1, rn(regno));
2890}
2891
2892static void
2893_qdivi(jit_state_t *_jit,
2894 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_word_t i0)
2895{
2896 jit_int32_t regno;
2897 regno = xdivi(r2, i0);
2898 movr(r0, rn(regno) + 1);
2899 movr(r1, rn(regno));
2900}
2901
2902static void
2903_qdivr_u(jit_state_t *_jit,
2904 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3)
2905{
2906 jit_int32_t regno;
2907 regno = xdivr_u(r2, r3);
2908 movr(r0, rn(regno) + 1);
2909 movr(r1, rn(regno));
2910}
2911
2912static void
2913_qdivi_u(jit_state_t *_jit,
2914 jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_word_t i0)
2915{
2916 jit_int32_t regno;
2917 regno = xdivi_u(r2, i0);
2918 movr(r0, rn(regno) + 1);
2919 movr(r1, rn(regno));
2920}
2921
2922# if __WORDSIZE == 32
2923static void
2924_lshr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2925{
2926 jit_int32_t reg;
2927 if (r0 == r2) {
2928 reg = jit_get_reg_but_zero(0);
2929 movr(rn(reg), r2);
2930 movr(r0, r1);
2931 SLL(r0, 0, rn(reg));
2932 jit_unget_reg_but_zero(reg);
2933 }
2934 else {
2935 movr(r0, r1);
2936 SLL(r0, 0, r2);
2937 }
2938}
4a71579b
PC
2939
2940static void
2941_lshi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2942{
79bfeef6
PC
2943 movr(r0, r1);
2944 SLL(r0, i0, 0);
4a71579b
PC
2945}
2946
4a71579b
PC
2947static void
2948_rshr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2949{
2950 jit_int32_t reg;
2951 if (r0 == r2) {
2952 reg = jit_get_reg_but_zero(0);
2953 movr(rn(reg), r2);
2954 movr(r0, r1);
2955 SRA(r0, 0, rn(reg));
2956 jit_unget_reg_but_zero(reg);
2957 }
2958 else {
2959 movr(r0, r1);
2960 SRA(r0, 0, r2);
2961 }
2962}
4a71579b
PC
2963
2964static void
2965_rshi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2966{
79bfeef6
PC
2967 movr(r0, r1);
2968 SRA(r0, i0, 0);
4a71579b
PC
2969}
2970
4a71579b
PC
2971static void
2972_rshr_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
2973{
2974 jit_int32_t reg;
2975 if (r0 == r2) {
2976 reg = jit_get_reg_but_zero(0);
2977 movr(rn(reg), r2);
2978 movr(r0, r1);
2979 SRL(r0, 0, rn(reg));
2980 jit_unget_reg_but_zero(reg);
2981 }
2982 else {
2983 movr(r0, r1);
2984 SRL(r0, 0, r2);
2985 }
2986}
4a71579b
PC
2987
2988static void
2989_rshi_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
2990{
79bfeef6
PC
2991 movr(r0, r1);
2992 SRL(r0, i0, 0);
2993}
2994#endif
2995
2996static void
2997_bitswap(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
2998{
2999 jit_int32_t t0, t1, t2, t3, t4;
3000 movr(r0, r1);
3001 t0 = jit_get_reg(jit_class_gpr);
3002 t1 = jit_get_reg(jit_class_gpr);
3003 t2 = jit_get_reg(jit_class_gpr);
3004 movi(rn(t0), __WORDSIZE == 32 ? 0x55555555L : 0x5555555555555555L);
3005 rshi_u(rn(t1), r0, 1); /* t1 = v >> 1 */
3006 andr(rn(t1), rn(t1), rn(t0)); /* t1 &= t0 */
3007 andr(rn(t2), r0, rn(t0)); /* t2 = v & t0*/
3008 lshi(rn(t2), rn(t2), 1); /* t2 <<= 1 */
3009 orr(r0, rn(t1), rn(t2)); /* v = t1 | t2 */
3010 movi(rn(t0), __WORDSIZE == 32 ? 0x33333333L : 0x3333333333333333L);
3011 rshi_u(rn(t1), r0, 2); /* t1 = v >> 2 */
3012 andr(rn(t1), rn(t1), rn(t0)); /* t1 &= t0 */
3013 andr(rn(t2), r0, rn(t0)); /* t2 = v & t0*/
3014 lshi(rn(t2), rn(t2), 2); /* t2 <<= 2 */
3015 orr(r0, rn(t1), rn(t2)); /* v = t1 | t2 */
3016 movi(rn(t0), __WORDSIZE == 32 ? 0x0f0f0f0fL : 0x0f0f0f0f0f0f0f0fL);
3017 rshi_u(rn(t1), r0, 4); /* t1 = v >> 4 */
3018 andr(rn(t1), rn(t1), rn(t0)); /* t1 &= t0 */
3019 andr(rn(t2), r0, rn(t0)); /* t2 = v & t0*/
3020 lshi(rn(t2), rn(t2), 4); /* t2 <<= 4 */
3021 orr(r0, rn(t1), rn(t2)); /* v = t1 | t2 */
3022 movi(rn(t0), __WORDSIZE == 32 ? 0x00ff00ffL : 0x00ff00ff00ff00ffL);
3023 rshi_u(rn(t1), r0, 8); /* t1 = v >> 8 */
3024 andr(rn(t1), rn(t1), rn(t0)); /* t1 &= t0 */
3025 andr(rn(t2), r0, rn(t0)); /* t2 = v & t0*/
3026 lshi(rn(t2), rn(t2), 8); /* t2 <<= 8 */
3027 orr(r0, rn(t1), rn(t2)); /* v = t1 | t2 */
3028# if __WORDSIZE == 32
3029 rshi_u(rn(t1), r0, 16); /* t1 = v >> 16 */
3030 lshi(rn(t2), r0, 16); /* t2 = v << 16 */
3031 orr(r0, rn(t1), rn(t2)); /* v = t1 | t2 */
3032# else
3033 movi(rn(t0), 0x0000ffff0000ffffL);
3034 rshi_u(rn(t1), r0, 16); /* t1 = v >> 16 */
3035 andr(rn(t1), rn(t1), rn(t0)); /* t1 &= t0 */
3036 andr(rn(t2), r0, rn(t0)); /* t2 = v & t0*/
3037 lshi(rn(t2), rn(t2), 16); /* t2 <<= 16 */
3038 orr(r0, rn(t1), rn(t2)); /* v = t1 | t2 */
3039 rshi_u(rn(t1), r0, 32); /* t1 = v >> 32 */
3040 lshi(rn(t2), r0, 32); /* t2 = v << 32 */
3041 orr(r0, rn(t1), rn(t2)); /* v = t1 | t2 */
3042# endif
3043 jit_unget_reg(t2);
3044 jit_unget_reg(t1);
3045 jit_unget_reg(t0);
3046}
3047
3048static void
3049_clor(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
3050{
3051#if CHECK_FLOGR
3052 if (jit_cpu.flogr) {
3053#endif
3054 comr(r0, r1);
3055 clzr(r0, r0);
3056#if CHECK_FLOGR
3057 }
3058 else
3059 fallback_clo(r0, r1);
3060#endif
3061}
3062
3063static void
3064_clzr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
3065{
3066#if CHECK_FLOGR
3067 if (jit_cpu.flogr) {
3068#endif
3069#if __WORDSIZE == 32
3070 jit_word_t w;
3071#endif
3072 jit_int32_t regno;
3073 regno = jit_get_reg_pair();
3074#if __WORDSIZE == 32
3075 SLLG(rn(regno), r1, 32, 0);
3076#else
3077 movr(rn(regno), r1);
3078#endif
3079 FLOGR(rn(regno), rn(regno));
3080 movr(r0, rn(regno));
3081#if __WORDSIZE == 32
3082 w = blei_p(_jit->pc.w, r0, 31);
3083 rshi(r0, r0, 1); /* r0 is 64 */
3084 patch_at(w, _jit->pc.w);
3085#endif
3086 jit_unget_reg_pair(regno);
3087#if CHECK_FLOGR
3088 }
3089 else
3090 fallback_clz(r0, r1);
3091#endif
3092}
3093
3094static void
3095_ctor(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
3096{
3097#if CHECK_FLOGR
3098 if (jit_cpu.flogr) {
3099#endif
3100 bitswap(r0, r1);
3101 clor(r0, r0);
3102#if CHECK_FLOGR
3103 }
3104 else
3105 fallback_cto(r0, r1);
3106#endif
3107}
3108
3109static void
3110_ctzr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
3111{
3112#if CHECK_FLOGR
3113 if (jit_cpu.flogr) {
3114#endif
3115 bitswap(r0, r1);
3116 clzr(r0, r0);
3117#if CHECK_FLOGR
3118 }
3119 else
3120 fallback_ctz(r0, r1);
3121#endif
4a71579b
PC
3122}
3123
3124static void
3125_comr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
3126{
3127 jit_int32_t reg;
3128 reg = jit_get_reg(jit_class_gpr);
3129 movi(rn(reg), -1);
3130 movr(r0, r1);
3131 XOR_(r0, rn(reg));
3132 jit_unget_reg(reg);
3133}
3134
3135static void
3136_andr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
3137{
3138 if (r0 == r2)
3139 AND_(r0, r1);
3140 else {
3141 movr(r0, r1);
3142 AND_(r0, r2);
3143 }
3144}
3145
3146static void
3147_andi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
3148{
3149 movr(r0, r1);
3150 NILL(r0, x16(i0));
3151 NILH(r0, x16((jit_uword_t)i0 >> 16));
3152#if __WORDSIZE == 64
3153 NIHL(r0, x16((jit_uword_t)i0 >> 32));
3154 NIHH(r0, x16((jit_uword_t)i0 >> 48));
3155#endif
3156}
3157
3158static void
3159_orr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
3160{
3161 if (r0 == r2)
3162 OR_(r0, r1);
3163 else {
3164 movr(r0, r1);
3165 OR_(r0, r2);
3166 }
3167}
3168
3169static void
3170_ori(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
3171{
3172 movr(r0, r1);
3173 OILL(r0, x16(i0));
3174 OILH(r0, x16((jit_uword_t)i0 >> 16));
3175#if __WORDSIZE == 64
3176 OIHL(r0, x16((jit_uword_t)i0 >> 32));
3177 OIHH(r0, x16((jit_uword_t)i0 >> 48));
3178#endif
3179}
3180
3181static void
3182_xorr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
3183{
3184 if (r0 == r2)
3185 XOR_(r0, r1);
3186 else {
3187 movr(r0, r1);
3188 XOR_(r0, r2);
3189 }
3190}
3191
3192static void
3193_xori(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
3194{
3195 jit_int32_t reg;
3196 reg = jit_get_reg(jit_class_gpr);
3197 movi(rn(reg), i0);
3198 xorr(r0, r1, rn(reg));
3199 jit_unget_reg(reg);
3200}
3201
3202static void
3203_ldi_c(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
3204{
3205 movi(r0, i0);
3206 ldr_c(r0, r0);
3207}
3208
3209static void
3210_ldxr_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
3211{
3212 if (r0 == r2) {
3213 addr(r0, r0, r1);
3214 ldr_c(r0, r0);
3215 }
3216 else {
3217 movr(r0, r1);
3218 addr(r0, r0, r2);
3219 ldr_c(r0, r0);
3220 }
3221}
3222
3223static void
3224_ldxi_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
3225{
3226 jit_int32_t reg;
3227 if (s20_p(i0)) {
3228#if __WORDSIZE == 32
3229 LB(r0, x20(i0), 0, r1);
3230#else
3231 LGB(r0, x20(i0), 0, r1);
3232#endif
3233 }
3234 else if (r0 != r1) {
3235 movi(r0, i0);
3236 addr(r0, r0, r1);
3237 ldr_c(r0, r0);
3238 }
3239 else {
3240 reg = jit_get_reg_but_zero(0);
3241 movi(rn(reg), i0);
3242 addr(rn(reg), rn(reg), r1);
3243 ldr_c(r0, rn(reg));
3244 jit_unget_reg_but_zero(reg);
3245 }
3246}
3247
3248static void
3249_ldi_uc(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
3250{
3251 movi(r0, i0);
3252 ldr_uc(r0, r0);
3253}
3254
3255static void
3256_ldxr_uc(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
3257{
3258 if (r0 == r2) {
3259 addr(r0, r0, r1);
3260 ldr_uc(r0, r0);
3261 }
3262 else {
3263 movr(r0, r1);
3264 addr(r0, r0, r2);
3265 ldr_uc(r0, r0);
3266 }
3267}
3268
3269static void
3270_ldxi_uc(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
3271{
3272 jit_int32_t reg;
3273 if (s20_p(i0))
3274 LLGC(r0, x20(i0), 0, r1);
3275 else if (r0 != r1) {
3276 movi(r0, i0);
3277 addr(r0, r0, r1);
3278 ldr_uc(r0, r0);
3279 }
3280 else {
3281 reg = jit_get_reg_but_zero(0);
3282 movi(rn(reg), i0);
3283 addr(rn(reg), rn(reg), r1);
3284 ldr_uc(r0, rn(reg));
3285 jit_unget_reg_but_zero(reg);
3286 }
3287}
3288
3289static void
3290_ldi_s(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
3291{
3292 movi(r0, i0);
3293 ldr_s(r0, r0);
3294}
3295
3296static void
3297_ldxr_s(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
3298{
3299 if (r0 == r2) {
3300 addr(r0, r0, r1);
3301 ldr_s(r0, r0);
3302 }
3303 else {
3304 movr(r0, r1);
3305 addr(r0, r0, r2);
3306 ldr_s(r0, r0);
3307 }
3308}
3309
3310static void
3311_ldxi_s(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
3312{
3313 jit_int32_t reg;
3314#if __WORDSIZE == 32
3315 if (u12_p(i0))
3316 LH(r0, i0, 0, r1);
3317 else
3318#endif
3319 if (s20_p(i0)) {
3320#if __WORDSIZE == 32
3321 LHY(r0, x20(i0), 0, r1);
3322#else
3323 LGH(r0, x20(i0), 0, r1);
3324#endif
3325 }
3326 else if (r0 != r1) {
3327 movi(r0, i0);
3328 addr(r0, r0, r1);
3329 ldr_s(r0, r0);
3330 }
3331 else {
3332 reg = jit_get_reg_but_zero(0);
3333 movi(rn(reg), i0);
3334 addr(rn(reg), rn(reg), r1);
3335 ldr_s(r0, rn(reg));
3336 jit_unget_reg_but_zero(reg);
3337 }
3338}
3339
3340static void
3341_ldi_us(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
3342{
3343 movi(r0, i0);
3344 ldr_us(r0, r0);
3345}
3346
3347static void
3348_ldxr_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
3349{
3350 if (r0 == r2) {
3351 addr(r0, r0, r1);
3352 ldr_us(r0, r0);
3353 }
3354 else {
3355 movr(r0, r1);
3356 addr(r0, r0, r2);
3357 ldr_us(r0, r0);
3358 }
3359}
3360
3361static void
3362_ldxi_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
3363{
3364 jit_int32_t reg;
3365 if (s20_p(i0))
3366 LLGH(r0, x20(i0), 0, r1);
3367 else if (r0 != r1) {
3368 movi(r0, i0);
3369 addr(r0, r0, r1);
3370 ldr_us(r0, r0);
3371 }
3372 else {
3373 reg = jit_get_reg_but_zero(0);
3374 movi(rn(reg), i0);
3375 addr(rn(reg), rn(reg), r1);
3376 ldr_us(r0, rn(reg));
3377 jit_unget_reg_but_zero(reg);
3378 }
3379}
3380
3381static void
3382_ldi_i(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
3383{
3384 movi(r0, i0);
3385 ldr_i(r0, r0);
3386}
3387
3388static void
3389_ldxr_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
3390{
3391 if (r0 == r2) {
3392 addr(r0, r0, r1);
3393 ldr_i(r0, r0);
3394 }
3395 else {
3396 movr(r0, r1);
3397 addr(r0, r0, r2);
3398 ldr_i(r0, r0);
3399 }
3400}
3401
3402static void
3403_ldxi_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
3404{
3405 jit_int32_t reg;
3406 if (s20_p(i0))
3407 LGF(r0, x20(i0), 0, r1);
3408 else if (r0 != r1) {
3409 movi(r0, i0);
3410 addr(r0, r0, r1);
3411 ldr_i(r0, r0);
3412 }
3413 else {
3414 reg = jit_get_reg_but_zero(0);
3415 movi(rn(reg), i0);
3416 addr(rn(reg), rn(reg), r1);
3417 ldr_i(r0, rn(reg));
3418 jit_unget_reg_but_zero(reg);
3419 }
3420}
3421
3422#if __WORDSIZE == 64
3423static void
3424_ldi_ui(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
3425{
3426 movi(r0, i0);
3427 ldr_ui(r0, r0);
3428}
3429
3430static void
3431_ldxr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
3432{
3433 if (r0 == r2) {
3434 addr(r0, r0, r1);
3435 ldr_ui(r0, r0);
3436 }
3437 else {
3438 movr(r0, r1);
3439 addr(r0, r0, r2);
3440 ldr_ui(r0, r0);
3441 }
3442}
3443
3444static void
3445_ldxi_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
3446{
3447 jit_int32_t reg;
3448 if (s20_p(i0))
3449 LLGF(r0, x20(i0), 0, r1);
3450 else if (r0 != r1) {
3451 movi(r0, i0);
3452 addr(r0, r0, r1);
3453 ldr_ui(r0, r0);
3454 }
3455 else {
3456 reg = jit_get_reg_but_zero(0);
3457 movi(rn(reg), i0);
3458 addr(rn(reg), rn(reg), r1);
3459 ldr_ui(r0, rn(reg));
3460 jit_unget_reg_but_zero(reg);
3461 }
3462}
3463
3464static void
3465_ldi_l(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
3466{
3467 movi(r0, i0);
3468 ldr_l(r0, r0);
3469}
3470
3471static void
3472_ldxr_l(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
3473{
3474 if (r0 == r2) {
3475 addr(r0, r0, r1);
3476 ldr_l(r0, r0);
3477 }
3478 else {
3479 movr(r0, r1);
3480 addr(r0, r0, r2);
3481 ldr_l(r0, r0);
3482 }
3483}
3484
3485static void
3486_ldxi_l(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
3487{
3488 jit_int32_t reg;
3489 if (s20_p(i0))
3490 LG(r0, x20(i0), 0, r1);
3491 else if (r0 != r1) {
3492 movi(r0, i0);
3493 addr(r0, r0, r1);
3494 ldr_l(r0, r0);
3495 }
3496 else {
3497 reg = jit_get_reg_but_zero(0);
3498 movi(rn(reg), i0);
3499 addr(rn(reg), rn(reg), r1);
3500 ldr_l(r0, rn(reg));
3501 jit_unget_reg_but_zero(reg);
3502 }
3503}
3504#endif
3505
3506static void
3507_sti_c(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
3508{
3509 jit_int32_t reg;
3510 reg = jit_get_reg_but_zero(0);
3511 movi(rn(reg), i0);
3512 str_c(rn(reg), r0);
3513 jit_unget_reg_but_zero(reg);
3514}
3515
3516static void
3517_stxr_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
3518{
3519 jit_int32_t reg;
3520 reg = jit_get_reg_but_zero(0);
3521 movr(rn(reg), r0);
3522 addr(rn(reg), rn(reg), r1);
3523 str_c(rn(reg), r2);
3524 jit_unget_reg_but_zero(reg);
3525}
3526
3527static void
3528_stxi_c(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
3529{
3530 jit_int32_t reg;
3531 if (u12_p(i0))
3532 STC(r1, i0, 0, r0);
3533 else if (s20_p(i0))
3534 STCY(r1, x20(i0), 0, r0);
3535 else {
3536 reg = jit_get_reg_but_zero(0);
3537 addi(rn(reg), r0, i0);
3538 str_c(rn(reg), r1);
3539 jit_unget_reg_but_zero(reg);
3540 }
3541}
3542
3543static void
3544_sti_s(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
3545{
3546 jit_int32_t reg;
3547 reg = jit_get_reg_but_zero(0);
3548 movi(rn(reg), i0);
3549 str_s(rn(reg), r0);
3550 jit_unget_reg_but_zero(reg);
3551}
3552
3553static void
3554_stxr_s(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
3555{
3556 jit_int32_t reg;
3557 reg = jit_get_reg_but_zero(0);
3558 movr(rn(reg), r0);
3559 addr(rn(reg), rn(reg), r1);
3560 str_s(rn(reg), r2);
3561 jit_unget_reg_but_zero(reg);
3562}
3563
3564static void
3565_stxi_s(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
3566{
3567 jit_int32_t reg;
3568 if (u12_p(i0))
3569 STH(r1, i0, 0, r0);
3570 else if (s20_p(i0))
3571 STHY(r1, x20(i0), 0, r0);
3572 else {
3573 reg = jit_get_reg_but_zero(0);
3574 addi(rn(reg), r0, i0);
3575 str_s(rn(reg), r1);
3576 jit_unget_reg_but_zero(reg);
3577 }
3578}
3579
3580static void
3581_sti_i(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
3582{
3583 jit_int32_t reg;
3584 reg = jit_get_reg_but_zero(0);
3585 movi(rn(reg), i0);
3586 str_i(rn(reg), r0);
3587 jit_unget_reg_but_zero(reg);
3588}
3589
3590static void
3591_stxr_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
3592{
3593 jit_int32_t reg;
3594 reg = jit_get_reg_but_zero(0);
3595 movr(rn(reg), r0);
3596 addr(rn(reg), rn(reg), r1);
3597 str_i(rn(reg), r2);
3598 jit_unget_reg_but_zero(reg);
3599}
3600
3601static void
3602_stxi_i(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
3603{
3604 jit_int32_t reg;
3605 if (u12_p(i0))
3606 ST(r1, i0, 0, r0);
3607 else if (s20_p(i0))
3608 STY(r1, x20(i0), 0, r0);
3609 else {
3610 reg = jit_get_reg_but_zero(0);
3611 addi(rn(reg), r0, i0);
3612 str_i(rn(reg), r1);
3613 jit_unget_reg_but_zero(reg);
3614 }
3615}
3616
3617#if __WORDSIZE == 64
3618static void
3619_sti_l(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
3620{
3621 jit_int32_t reg;
3622 reg = jit_get_reg_but_zero(0);
3623 movi(rn(reg), i0);
3624 str_l(rn(reg), r0);
3625 jit_unget_reg_but_zero(reg);
3626}
3627
3628static void
3629_stxr_l(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
3630{
3631 jit_int32_t reg;
3632 reg = jit_get_reg_but_zero(0);
3633 movr(rn(reg), r0);
3634 addr(rn(reg), rn(reg), r1);
3635 str_l(rn(reg), r2);
3636 jit_unget_reg_but_zero(reg);
3637}
3638
3639static void
3640_stxi_l(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
3641{
3642 jit_int32_t reg;
3643 if (s20_p(i0))
3644 STG(r1, x20(i0), 0, r0);
3645 else {
3646 reg = jit_get_reg_but_zero(0);
3647 addi(rn(reg), r0, i0);
3648 str_l(rn(reg), r1);
3649 jit_unget_reg_but_zero(reg);
3650 }
3651}
3652#endif
3653
79bfeef6
PC
3654static jit_word_t
3655_jmpi(jit_state_t *_jit, jit_word_t i0, jit_bool_t i1)
4a71579b 3656{
4a71579b 3657 jit_int32_t reg;
79bfeef6
PC
3658 jit_word_t d, w;
3659 w = _jit->pc.w;
3660 d = (i0 - w) >> 1;
3661 if (i1 && s16_p(d))
4a71579b
PC
3662 J(x16(d));
3663 else if (s32_p(d))
3664 BRL(d);
3665 else {
3666 reg = jit_get_reg_but_zero(jit_class_nospill);
3667 movi(rn(reg), i0);
3668 jmpr(rn(reg));
3669 jit_unget_reg_but_zero(reg);
3670 }
79bfeef6 3671 return (w);
4a71579b
PC
3672}
3673
3674static jit_word_t
3675_jmpi_p(jit_state_t *_jit, jit_word_t i0)
3676{
3677 jit_word_t w;
3678 jit_int32_t reg;
3679 reg = jit_get_reg_but_zero(jit_class_nospill);
3680 w = movi_p(rn(reg), i0);
3681 jmpr(rn(reg));
3682 jit_unget_reg_but_zero(reg);
3683 return (w);
3684}
3685
79bfeef6
PC
3686static jit_word_t
3687_calli(jit_state_t *_jit, jit_word_t i0, jit_bool_t i1)
4a71579b 3688{
4a71579b 3689 jit_int32_t reg;
79bfeef6
PC
3690 jit_word_t d, w;
3691 w = _jit->pc.w;
3692 d = (i0 - w) >> 1;
3693 if (i1 && s16_p(d))
3694 BRAS(_R14_REGNO, x16(d));
3695 else if (s32_p(d))
4a71579b
PC
3696 BRASL(_R14_REGNO, d);
3697 else {
3698 reg = jit_get_reg_but_zero(0);
3699 movi(rn(reg), i0);
3700 callr(rn(reg));
3701 jit_unget_reg_but_zero(reg);
3702 }
79bfeef6 3703 return (w);
4a71579b
PC
3704}
3705
3706static jit_word_t
3707_calli_p(jit_state_t *_jit, jit_word_t i0)
3708{
3709 jit_word_t w;
3710 jit_int32_t reg;
3711 reg = jit_get_reg_but_zero(0);
3712 w = movi_p(rn(reg), i0);
3713 callr(rn(reg));
3714 jit_unget_reg_but_zero(reg);
3715 return (w);
3716}
3717
3718static jit_int32_t gprs[] = {
3719 _R2, _R3, _R4, _R5,
3720 _R6, _R7, _R8, _R9, _R10, _R11, _R12, _R13
3721};
3722
3723static void
3724_prolog(jit_state_t *_jit, jit_node_t *i0)
3725{
3726 jit_int32_t regno, offset;
3727 if (_jitc->function->define_frame || _jitc->function->assume_frame) {
3728 jit_int32_t frame = -_jitc->function->frame;
3729 assert(_jitc->function->self.aoff >= frame);
3730 if (_jitc->function->assume_frame)
3731 return;
3732 _jitc->function->self.aoff = frame;
3733 }
3734 if (_jitc->function->allocar)
3735 _jitc->function->self.aoff &= -8;
3736 _jitc->function->stack = ((_jitc->function->self.alen -
3737 /* align stack at 8 bytes */
3738 _jitc->function->self.aoff) + 7) & -8;
3739 /* *IFF* a non variadic function,
3740 * Lightning does not reserve stack space for spilling arguments
3741 * in registers.
3742 * S390x, as per gcc, has 8 stack slots for spilling arguments,
3743 * (%r6 is callee save) and uses an alloca like approach to save
3744 * callee save fpr registers.
3745 * Since argument registers are not saved in any lightning port,
3746 * use the 8 slots to spill any modified fpr register, and still
3747 * use the same stack frame logic as gcc.
3748 * Save at least %r13 to %r15, as %r13 is used as frame pointer.
3749 * *IFF* a variadic function, a "standard" stack frame, with
3750 * fpr registers saved in an alloca'ed area, is used.
3751 */
3752 if ((_jitc->function->self.call & jit_call_varargs) &&
3753 jit_arg_reg_p(_jitc->function->vagp))
3754 regno = _jitc->function->vagp;
3755 else {
3756 for (regno = 4; regno < jit_size(gprs) - 1; regno++) {
3757 if (jit_regset_tstbit(&_jitc->function->regset, gprs[regno]))
3758 break;
3759 }
3760 }
3761#if __WORDSIZE == 32
3762# define FP_OFFSET 64
3763 if (_jitc->function->self.call & jit_call_varargs)
3764 offset = regno * 4 + 8;
3765 else
3766 offset = (regno - 4) * 4 + 32;
3767 STM(rn(gprs[regno]), _R15_REGNO, x20(offset), _R15_REGNO);
3768#else
3769# define FP_OFFSET 128
3770 if (_jitc->function->self.call & jit_call_varargs)
3771 offset = regno * 8 + 16;
3772 else
3773 offset = (regno - 4) * 8 + 48;
3774 STMG(rn(gprs[regno]), _R15_REGNO, x20(offset), _R15_REGNO);
3775#endif
3776
3777#define SPILL(R, O) \
3778 do { \
3779 if (jit_regset_tstbit(&_jitc->function->regset, R)) \
3780 stxi_d(O, _R15_REGNO, rn(R)); \
3781 } while (0)
3782 if (_jitc->function->self.call & jit_call_varargs) {
3783 for (regno = _jitc->function->vafp; jit_arg_f_reg_p(regno); ++regno)
3784 stxi_d(FP_OFFSET + regno * 8, _R15_REGNO, rn(_F0 - regno));
3785 SPILL(_F8, _jitc->function->vaoff + offsetof(jit_va_list_t, f8));
3786 SPILL(_F9, _jitc->function->vaoff + offsetof(jit_va_list_t, f9));
3787 SPILL(_F10, _jitc->function->vaoff + offsetof(jit_va_list_t, f10));
3788 SPILL(_F11, _jitc->function->vaoff + offsetof(jit_va_list_t, f11));
3789 SPILL(_F12, _jitc->function->vaoff + offsetof(jit_va_list_t, f12));
3790 SPILL(_F13, _jitc->function->vaoff + offsetof(jit_va_list_t, f13));
3791 SPILL(_F14, _jitc->function->vaoff + offsetof(jit_va_list_t, f14));
3792 }
3793 else {
3794 /* First 4 in low address */
3795#if __WORDSIZE == 32
3796 SPILL(_F10, 0);
3797 SPILL(_F11, 8);
3798 SPILL(_F12, 16);
3799 SPILL(_F13, 24);
3800 /* gpr registers here */
3801 SPILL(_F14, 72);
3802 SPILL(_F8, 80);
3803 SPILL(_F9, 88);
3804#else
3805 SPILL(_F10, 16);
3806 SPILL(_F11, 24);
3807 SPILL(_F12, 32);
3808 SPILL(_F13, 48);
3809 /* Last 3 in high address */
3810 SPILL(_F14, 136);
3811 SPILL(_F8, 144);
3812 SPILL(_F9, 152);
3813#endif
3814 }
3815#undef SPILL
3816 movr(_R13_REGNO, _R15_REGNO);
3817 subi(_R15_REGNO, _R15_REGNO, stack_framesize + _jitc->function->stack);
3818 if (_jitc->function->allocar) {
3819 regno = jit_get_reg(jit_class_gpr);
3820 movi(rn(regno), _jitc->function->self.aoff);
3821 stxi_i(_jitc->function->aoffoff, _R13_REGNO, rn(regno));
3822 jit_unget_reg(regno);
3823 }
3824}
3825
3826static void
3827_epilog(jit_state_t *_jit, jit_node_t *i0)
3828{
3829 jit_int32_t regno, offset;
3830 if (_jitc->function->assume_frame)
3831 return;
3832 if ((_jitc->function->self.call & jit_call_varargs) &&
3833 jit_arg_reg_p(_jitc->function->vagp))
3834 regno = _jitc->function->vagp;
3835 else {
3836 for (regno = 4; regno < jit_size(gprs) - 1; regno++) {
3837 if (jit_regset_tstbit(&_jitc->function->regset, gprs[regno]))
3838 break;
3839 }
3840 }
3841#if __WORDSIZE == 32
3842 if (_jitc->function->self.call & jit_call_varargs)
3843 offset = regno * 4 + 8;
3844 else
3845 offset = (regno - 4) * 4 + 32;
3846#else
3847 if (_jitc->function->self.call & jit_call_varargs)
3848 offset = regno * 8 + 16;
3849 else
3850 offset = (regno - 4) * 8 + 48;
3851#endif
3852 movr(_R15_REGNO, _R13_REGNO);
3853
3854#define LOAD(R, O) \
3855 do { \
3856 if (jit_regset_tstbit(&_jitc->function->regset, R)) \
3857 ldxi_d(rn(R), _R15_REGNO, O); \
3858 } while (0)
3859 if (_jitc->function->self.call & jit_call_varargs) {
3860 LOAD(_F8, _jitc->function->vaoff + offsetof(jit_va_list_t, f8));
3861 LOAD(_F9, _jitc->function->vaoff + offsetof(jit_va_list_t, f9));
3862 LOAD(_F10, _jitc->function->vaoff + offsetof(jit_va_list_t, f10));
3863 LOAD(_F11, _jitc->function->vaoff + offsetof(jit_va_list_t, f11));
3864 LOAD(_F12, _jitc->function->vaoff + offsetof(jit_va_list_t, f12));
3865 LOAD(_F13, _jitc->function->vaoff + offsetof(jit_va_list_t, f13));
3866 LOAD(_F14, _jitc->function->vaoff + offsetof(jit_va_list_t, f14));
3867 }
3868 else {
3869#if __WORDSIZE == 32
3870 LOAD(_F10, 0);
3871 LOAD(_F11, 8);
3872 LOAD(_F12, 16);
3873 LOAD(_F13, 24);
3874 LOAD(_F14, 72);
3875 LOAD(_F8, 80);
3876 LOAD(_F9, 88);
3877#else
3878 LOAD(_F10, 16);
3879 LOAD(_F11, 24);
3880 LOAD(_F12, 32);
3881 LOAD(_F13, 48);
3882 LOAD(_F14, 136);
3883 LOAD(_F8, 144);
3884 LOAD(_F9, 152);
3885#endif
3886 }
3887#undef LOAD
3888#if __WORDSIZE == 32
3889 LM(rn(gprs[regno]), _R15_REGNO, x20(offset), _R15_REGNO);
3890#else
3891 LMG(rn(gprs[regno]), _R15_REGNO, x20(offset), _R15_REGNO);
3892#endif
3893 BR(_R14_REGNO);
3894}
3895
3896static void
3897_vastart(jit_state_t *_jit, jit_int32_t r0)
3898{
3899 jit_int32_t reg;
3900
3901 assert(_jitc->function->self.call & jit_call_varargs);
3902
3903 /* Return jit_va_list_t in the register argument */
3904 addi(r0, _R13_REGNO, _jitc->function->vaoff);
3905 reg = jit_get_reg(jit_class_gpr);
3906
3907 /* Initialize gp offset in the save area. */
3908 movi(rn(reg), _jitc->function->vagp);
3909 stxi(offsetof(jit_va_list_t, gpoff), r0, rn(reg));
3910
3911 /* Initialize fp offset in the save area. */
3912 movi(rn(reg), _jitc->function->vafp);
3913 stxi(offsetof(jit_va_list_t, fpoff), r0, rn(reg));
3914
3915 /* Initialize overflow pointer to the first stack argument. */
3916 addi(rn(reg), _R13_REGNO, _jitc->function->self.size);
3917 stxi(offsetof(jit_va_list_t, over), r0, rn(reg));
3918
3919 /* Initialize register save area pointer. */
3920 stxi(offsetof(jit_va_list_t, save), r0, _R13_REGNO);
3921
3922 jit_unget_reg(reg);
3923}
3924
3925static void
3926_vaarg(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
3927{
3928 jit_int32_t rg0;
3929 jit_int32_t rg1;
3930 jit_int32_t rg2;
3931 jit_word_t ge_code;
3932 jit_word_t lt_code;
3933
3934 assert(_jitc->function->self.call & jit_call_varargs);
3935
3936 rg0 = jit_get_reg_but_zero(0);
3937 rg1 = jit_get_reg_but_zero(0);
3938
3939 /* Load the gp offset in save area in the first temporary. */
3940 ldxi(rn(rg0), r1, offsetof(jit_va_list_t, gpoff));
3941
3942 /* Jump over if there are no remaining arguments in the save area. */
3943 ge_code = bgei_p(_jit->pc.w, rn(rg0), 5);
3944
3945 /* Load the save area pointer in the second temporary. */
3946 ldxi(rn(rg1), r1, offsetof(jit_va_list_t, save));
3947
3948 /* Scale offset */
3949 rg2 = jit_get_reg_but_zero(0);
3950 lshi(rn(rg2), rn(rg0),
3951#if __WORDSIZE == 32
3952 2
3953#else
3954 3
3955#endif
3956 );
3957 /* Add offset to saved area. */
3958 addi(rn(rg2), rn(rg2), 2 * sizeof(jit_word_t));
3959
3960 /* Load the vararg argument in the first argument. */
3961 ldxr(r0, rn(rg1), rn(rg2));
3962 jit_unget_reg_but_zero(rg2);
3963
3964 /* Update the gp offset. */
3965 addi(rn(rg0), rn(rg0), 1);
3966 stxi(offsetof(jit_va_list_t, gpoff), r1, rn(rg0));
3967
3968 /* Will only need one temporary register below. */
3969 jit_unget_reg_but_zero(rg1);
3970
3971 /* Jump over overflow code. */
3972 lt_code = jmpi_p(_jit->pc.w);
3973
3974 /* Where to land if argument is in overflow area. */
3975 patch_at(ge_code, _jit->pc.w);
3976
3977 /* Load overflow pointer. */
3978 ldxi(rn(rg0), r1, offsetof(jit_va_list_t, over));
3979
3980 /* Load argument. */
3981 ldr(r0, rn(rg0));
3982
3983 /* Update overflow pointer. */
3984 addi(rn(rg0), rn(rg0), sizeof(jit_word_t));
3985 stxi(offsetof(jit_va_list_t, over), r1, rn(rg0));
3986
3987 /* Where to land if argument is in save area. */
3988 patch_at(lt_code, _jit->pc.w);
3989
3990 jit_unget_reg_but_zero(rg0);
3991}
3992
3993static void
3994_patch_at(jit_state_t *_jit, jit_word_t instr, jit_word_t label)
3995{
3996 jit_word_t d;
3997 union {
3998 jit_uint16_t *s;
3999 jit_word_t w;
4000 } u;
4001 u.w = instr;
4002 union {
4003 struct {
4004 jit_uint16_t op : 8;
4005 jit_uint16_t r1 : 4;
4006 jit_uint16_t r3 : 4;
4007 } b;
4008 jit_uint16_t s;
4009 } i0;
4010 union {
4011 struct {
4012 jit_uint16_t i2;
4013 } b;
4014 jit_uint16_t s;
4015 } i1;
4016 union {
4017 struct {
4018 jit_uint32_t ih : 16;
4019 jit_uint32_t il : 16;
4020 } b;
4021 jit_uint32_t i;
4022 } i12;
4023 i0.s = u.s[0];
4024 /* movi_p */
4025 if (i0.b.op ==
4026#if __WORDSIZE == 32
4027 0xA7 && i0.b.r3 == 8
4028#else
4029 0xA5
4030#endif
4031 ) {
4032#if __WORDSIZE == 64
4033 assert(i0.b.r3 == 3);
4034#endif
4035 i1.b.i2 = (jit_uword_t)label;
4036 u.s[1] = i1.s;
4037 i0.s = u.s[2];
4038 assert(i0.b.op == 0xA5 && i0.b.r3 == 2);
4039 i1.b.i2 = (jit_uword_t)label >> 16;
4040 u.s[3] = i1.s;
4041#if __WORDSIZE == 64
4042 i0.s = u.s[4];
4043 assert(i0.b.op == 0xA5 && i0.b.r3 == 1);
4044 i1.b.i2 = (jit_uword_t)label >> 32;
4045 u.s[5] = i1.s;
4046 i0.s = u.s[6];
4047 assert(i0.b.op == 0xA5 && i0.b.r3 == 0);
4048 i1.b.i2 = (jit_uword_t)label >> 48;
4049 u.s[7] = i1.s;
4050#endif
4051 }
79bfeef6 4052 /* BRC or BRL */
4a71579b 4053 else if (i0.b.op == 0xA7) {
79bfeef6 4054 assert(i0.b.r3 == 0x4 || i0.b.r3 == 0x5);
4a71579b
PC
4055 d = (label - instr) >> 1;
4056 assert(s16_p(d));
4057 i1.b.i2 = d;
4058 u.s[1] = i1.s;
4059 }
79bfeef6 4060 /* BRCL or BRASL */
4a71579b 4061 else if (i0.b.op == 0xC0) {
79bfeef6 4062 assert(i0.b.r3 == 0x4 || i0.b.r3 == 0x5);
4a71579b
PC
4063 d = (label - instr) >> 1;
4064 assert(s32_p(d));
4065 i12.i = d;
4066 u.s[1] = i12.b.ih;
4067 u.s[2] = i12.b.il;
4068 }
4069 else
4070 abort();
4071}
4072#endif