1 /******************************** -*- C -*- ****************************
2  *
3  *	Run-time assembler for the PowerPC
4  *
5  ***********************************************************************/
6 
7 
8 /***********************************************************************
9  *
10  * Copyright 1999, 2000, 2001, 2002 Ian Piumarta
11  *
12  * This file is part of GNU lightning.
13  *
14  * GNU lightning is free software; you can redistribute it and/or modify it
15  * under the terms of the GNU Lesser General Public License as published
16  * by the Free Software Foundation; either version 2.1, or (at your option)
17  * any later version.
18  *
19  * GNU lightning is distributed in the hope that it will be useful, but
20  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
21  * or  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
22  * License for more details.
23  *
24  * You should have received a copy of the GNU Lesser General Public License
25  * along with GNU lightning; see the file COPYING.LESSER; if not, write to the
26  * Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
27  * MA 02110-1301, USA.
28  *
29  ***********************************************************************/
30 
31 #ifndef __lightning_asm_h
32 #define __lightning_asm_h
33 
34 /* <imm> = [0-9]+ | (.+)	-> add i, one parameter (imm)
35  * <reg> = r<imm>		-> add r, one parameter (imm)
36  * <mem> = <imm>(<reg>)		-> add m, two parameters (imm,reg)
37  * <idx> = <reg>(<reg>)		-> add x, two parameters (reg,reg)
38  *
39  * `x' operands have two forms. For example `stwu source, rega(regb)'
40  * could be written as either
41  *	STWUrx(source, rega, regb)
42  * or
43  *	STWUXrrr(source, rega, regb)
44  */
45 
46 
47 
48 /*** a brief NOTE about halfwords and "shifted" operands
49  *
50  * LOGICAL insns require UNSIGNED args in 0..65535, whether or not shifted
51  *
52  * ARITHMETIC insns require SIGNED args in -32768..32767, even when shifted
53  *
54  * as a special case: "lis/addis" also accepts UNSIGNED arguments in
55  * 0..65535 since it is often used immediately before "ori" to load a 32-bit
56  * constant (this is consistent with the GNU rs/6000 and PowerPC assemblers)
57  *
58  * thus:	lis	rD, expression@hi
59  *		ori	rD, rD, expression@lo	; load 32-bit constant
60  */
61 
62 typedef unsigned int jit_insn;
63 
64 #ifndef LIGHTNING_DEBUG
65 #define _cr0	0
66 #define _cr1	1
67 #define _cr2	2
68 #define _cr3	3
69 #define _cr4	4
70 #define _cr5	5
71 #define _cr6	6
72 #define _cr7	7
73 
74 #define _lt	0
75 #define _gt	1
76 #define _eq	2
77 #define _so	3
78 #define _un	3
79 
80 #define _d16(D)		(_ck_d(16,(_jit_UL(D)-_jit_UL(_jit.x.pc))) & ~3)
81 #define _d26(D)		(_ck_d(26,(_jit_UL(D)-_jit_UL(_jit.x.pc))) & ~3)
82 
83 /* primitive instruction forms [1, Section A.4] */
84 
85 #define _FB(  OP,         BD,AA,LK )    (_jit_I_noinc((_u6(OP)<<26)|                                            _d26(BD)|     (_u1(AA)<<1)|_u1(LK)), _jit.x.pc++, 0)
86 #define _FBA( OP,         BD,AA,LK )	_jit_I((_u6(OP)<<26)|                                           (_u26(BD)&~3)| (_u1(AA)<<1)|_u1(LK))
87 #define _BB(   OP,BO,BI,   BD,AA,LK )   (_jit_I_noinc((_u6(OP)<<26)|(_u5(BO)<<21)|(_u5(BI)<<16)|                _d16(BD)|     (_u1(AA)<<1)|_u1(LK)), _jit.x.pc++, 0)
88 #define _D(   OP,RD,RA,         DD )  	_jit_I((_u6(OP)<<26)|(_u5(RD)<<21)|(_u5(RA)<<16)|                _s16(DD)                          )
89 #define _Du(  OP,RD,RA,         DD )  	_jit_I((_u6(OP)<<26)|(_u5(RD)<<21)|(_u5(RA)<<16)|                _u16(DD)                          )
90 #define _Ds(  OP,RD,RA,         DD )  	_jit_I((_u6(OP)<<26)|(_u5(RD)<<21)|(_u5(RA)<<16)|                _su16(DD)                         )
91 #define _X(   OP,RD,RA,RB,   XO,RC )  	_jit_I((_u6(OP)<<26)|(_u5(RD)<<21)|(_u5(RA)<<16)|( _u5(RB)<<11)|              (_u10(XO)<<1)|_u1(RC))
92 #define _XL(  OP,BO,BI,      XO,LK )  	_jit_I((_u6(OP)<<26)|(_u5(BO)<<21)|(_u5(BI)<<16)|( _u5(00)<<11)|              (_u10(XO)<<1)|_u1(LK))
93 #define _XFX( OP,RD,         SR,XO )  	_jit_I((_u6(OP)<<26)|(_u5(RD)<<21)|              (_u10(SR)<<11)|              (_u10(XO)<<1)|_u1(00))
94 #define _XO(  OP,RD,RA,RB,OE,XO,RC )  	_jit_I((_u6(OP)<<26)|(_u5(RD)<<21)|(_u5(RA)<<16)|( _u5(RB)<<11)|(_u1(OE)<<10)|( _u9(XO)<<1)|_u1(RC))
95 #define _M(   OP,RS,RA,SH,MB,ME,RC )  	_jit_I((_u6(OP)<<26)|(_u5(RS)<<21)|(_u5(RA)<<16)|( _u5(SH)<<11)|(_u5(MB)<< 6)|( _u5(ME)<<1)|_u1(RC))
96 
97 
98 /* special purpose registers (form XFX) [1, Section 8.2, page 8-138] */
99 
100 #define SPR_LR		((8<<5)|(0))
101 
102 /* +++ intrinsic instructions */
103 
104 #define ADDrrr(RD, RA, RB)		_XO	(31, RD, RA, RB, 0, 266, 0)
105 #define ADD_rrr(RD, RA, RB)		_XO	(31, RD, RA, RB, 0, 266, 1)
106 #define ADDCrrr(RD, RA, RB)		_XO	(31, RD, RA, RB, 0, 10, 0)
107 #define ADDC_rrr(RD, RA, RB)		_XO	(31, RD, RA, RB, 0, 10, 1)
108 #define ADDErrr(RD, RA, RB)		_XO	(31, RD, RA, RB, 0, 138, 0)
109 #define ADDE_rrr(RD, RA, RB)		_XO	(31, RD, RA, RB, 0, 138, 1)
110 #define ADDOrrr(RD, RA, RB)		_XO	(31, RD, RA, RB, 1, 266, 0)
111 #define ADDO_rrr(RD, RA, RB)		_XO	(31, RD, RA, RB, 1, 266, 1)
112 #define ADDIrri(RD, RA, IMM)		_D	(14, RD, RA, IMM)
113 #define ADDICrri(RD, RA, IMM)		_D	(12, RD, RA, IMM)
114 #define ADDIC_rri(RD, RA, IMM)		_D	(13, RD, RA, IMM)
115 #define ADDISrri(RD, RA, IMM)		_Ds	(15, RD, RA, IMM)
116 
117 #define ANDrrr(RA, RS, RB)		_X	(31, RS, RA, RB,  28, 0)
118 #define AND_rrr(RA, RS, RB)		_X	(31, RS, RA, RB,  28, 1)
119 #define ANDCrrr(RA, RS, RB)		_X	(31, RS, RA, RB,  60, 0)
120 #define ANDC_rrr(RA, RS, RB)		_X	(31, RS, RA, RB,  60, 1)
121 #define ANDI_rri(RA, RS, IMM)		_Du	(28, RS, RA, IMM)
122 #define ANDIS_rri(RA, RS, IMM)		_Du	(29, RS, RA, IMM)
123 
124 #define Bi(BD)				_FB	(18, BD, 0, 0)
125 #define BAi(BD)				_FBA	(18, BD, 1, 0)
126 #define BLi(BD)				_FB     (18, BD, 0, 1)
127 #define BLAi(BD)			_FBA	(18, BD, 1, 1)
128 
129 #define BCiii(BO,BI,BD)			_BB	(16, BO, BI, BD, 0, 0)
130 #define BCAiii(BO,BI,BD)		_BB	(16, BO, BI, BD, 1, 0)
131 #define BCLiii(BO,BI,BD)		_BB	(16, BO, BI, BD, 0, 1)
132 #define BCLAiii(BO,BI,BD)		_BB	(16, BO, BI, BD, 1, 1)
133 
134 #define BCCTRii(BO,BI)			_XL	(19, BO, BI, 528, 0)
135 #define BCCTRLii(BO,BI)			_XL	(19, BO, BI, 528, 1)
136 
137 #define BCLRii(BO,BI)			_XL	(19, BO, BI,  16, 0)
138 #define BCLRLii(BO,BI)			_XL	(19, BO, BI,  16, 1)
139 
140 #define CMPiirr(CR, LL, RA, RB)		_X	(31, ((CR)<<2)|(LL), RA, RB, 0, 0)
141 #define CMPIiiri(CR, LL, RA, IMM)	_D	(11, ((CR)<<2)|(LL), RA, IMM)
142 
143 #define CMPLiirr(CR, LL, RA, RB)	_X	(31, ((CR)<<2)|(LL), RA, RB, 32, 0)
144 #define CMPLIiiri(CR, LL, RA, IMM)	_D	(10, ((CR)<<2)|(LL), RA, IMM)
145 
146 #define CRANDiii(CRD,CRA,CRB)		_X	(19, CRD, CRA, CRB, 257, 0)
147 #define CRANDCiii(CRD,CRA,CRB)		_X	(19, CRD, CRA, CRB, 129, 0)
148 #define CREQViii(CRD,CRA,CRB)		_X	(19, CRD, CRA, CRB, 289, 0)
149 #define CRNANDiii(CRD,CRA,CRB)		_X	(19, CRD, CRA, CRB, 225, 0)
150 #define CRNORiii(CRD,CRA,CRB)		_X	(19, CRD, CRA, CRB,  33, 0)
151 #define CRORiii(CRD,CRA,CRB)		_X	(19, CRD, CRA, CRB, 449, 0)
152 #define CRORCiii(CRD,CRA,CRB)		_X	(19, CRD, CRA, CRB, 417, 0)
153 #define CRXORiii(CRD,CRA,CRB)		_X	(19, CRD, CRA, CRB, 193, 0)
154 
155 #define DCBSTrr(RA,RB)			_X	(31, 00, RA, RB,  54, 0)
156 
157 #define DIVWrrr(RD, RA, RB)		_XO	(31, RD, RA, RB, 0, 491, 0)
158 #define DIVW_rrr(RD, RA, RB)		_XO	(31, RD, RA, RB, 0, 491, 1)
159 #define DIVWOrrr(RD, RA, RB)		_XO	(31, RD, RA, RB, 1, 491, 0)
160 #define DIVWO_rrr(RD, RA, RB)		_XO	(31, RD, RA, RB, 1, 491, 1)
161 
162 #define DIVWUrrr(RD, RA, RB)		_XO	(31, RD, RA, RB, 0, 459, 0)
163 #define DIVWU_rrr(RD, RA, RB)		_XO	(31, RD, RA, RB, 0, 459, 1)
164 #define DIVWUOrrr(RD, RA, RB)		_XO	(31, RD, RA, RB, 1, 459, 0)
165 #define DIVWUO_rrr(RD, RA, RB)		_XO	(31, RD, RA, RB, 1, 459, 1)
166 
167 #define EQVrrr(Ra,RS,RB)		_X	(31, RS, RA, RB, 284, 0)
168 #define EQV_rrr(Ra,RS,RB)		_X	(31, RS, RA, RB, 284, 1)
169 
170 #define EXTSBrr(RA,RS)			_X	(31, RS, RA,  0, 954, 0)
171 #define EXTSB_rr(RA,RS)			_X	(31, RS, RA,  0, 954, 1)
172 
173 #define EXTSHrr(RA,RS)			_X	(31, RS, RA,  0, 922, 0)
174 #define EXTSH_rr(RA,RS)			_X	(31, RS, RA,  0, 922, 1)
175 
176 #define ICBIrr(RA,RB)			_X	(31, 00, RA, RB, 982, 0)
177 
178 #define ISYNC()				_X	(19, 00, 00, 00, 150, 0)
179 
180 #define LBZrm(RD,ID,RA)			_D	(34, RD, RA, ID)
181 #define LBZUrm(RD,ID,RA)		_D	(35, RD, RA, ID)
182 #define LBZUXrrr(RD,RA,RB)		_X	(31, RD, RA, RB, 119, 0)
183 #define LBZXrrr(RD,RA,RB)		_X	(31, RD, RA, RB,  87, 0)
184 
185 #define LHArm(RD,ID,RA)			_D	(42, RD, RA, ID)
186 #define LHAUrm(RD,ID,RA)		_D	(43, RD, RA, ID)
187 #define LHAUXrrr(RD,RA,RB)		_X	(31, RD, RA, RB, 375, 0)
188 #define LHAXrrr(RD,RA,RB)		_X	(31, RD, RA, RB, 343, 0)
189 #define LHBRXrrr(RD,RA,RB)		_X	(31, RD, RA, RB, 790, 0)
190 
191 #define LHZrm(RD,ID,RA)			_D	(40, RD, RA, ID)
192 #define LHZUrm(RD,ID,RA)		_D	(41, RD, RA, ID)
193 #define LHZUXrrr(RD,RA,RB)		_X	(31, RD, RA, RB, 311, 0)
194 #define LHZXrrr(RD,RA,RB)		_X	(31, RD, RA, RB, 279, 0)
195 
196 #define LMWrm(RD,ID,RA)			_D	(46, RD, RA, ID)
197 
198 #define LWBRXrrr(RD,RA,RB)		_X	(31, RD, RA, RB, 534, 0)
199 
200 #define LWZrm(RD, DISP, RA)		_D	(32, RD, RA, DISP)
201 #define LWZUrm(RD, DISP, RA)		_D	(33, RD, RA, DISP)
202 #define LWZUXrrr(RD, RA, RB)		_X	(31, RD, RA, RB,  56, 0)
203 #define LWZXrrr(RD, RA, RB)		_X	(31, RD, RA, RB,  23, 0)
204 
205 #define MCRFii(CD,CS)			_X	(19, ((CD)<<2), ((CS)<<2), 0, 0, 0)
206 
207 #define MFCRr(RD)			_X	(31, RD, 0, 0, 19, 0)
208 #define MCRXRi(RD) 			_XFX	(31, (RD)<<2,   0, 512)
209 
210 #define MFSPRri(RD, SPR)		_XFX	(31, RD, (SPR)<<5, 339)
211 #define MTSPRir(SPR, RS)		_XFX	(31, RS, (SPR)<<5, 467)
212 
213 #define MULHWrrr(RD,RA,RB)		_XO	(31, RD, RA, RB, 0,  75, 0)
214 #define MULHW_rrr(RD,RA,RB)		_XO	(31, RD, RA, RB, 0,  75, 1)
215 #define MULHWUrrr(RD,RA,RB)		_XO	(31, RD, RA, RB, 0,  11, 0)
216 #define MULHWU_rrr(RD,RA,RB)		_XO	(31, RD, RA, RB, 0,  11, 1)
217 
218 #define MULLIrri(RD,RA,IM)		_D	(07, RD, RA, IM)
219 
220 #define MULLWrrr(RD,RA,RB)		_XO	(31, RD, RA, RB, 0, 235, 0)
221 #define MULLW_rrr(RD,RA,RB)		_XO	(31, RD, RA, RB, 0, 235, 1)
222 #define MULLWOrrr(RD,RA,RB)		_XO	(31, RD, RA, RB, 1, 235, 0)
223 #define MULLWO_rrr(RD,RA,RB)		_XO	(31, RD, RA, RB, 1, 235, 1)
224 
225 #define NANDrrr(RA,RS,RB)		_X	(31, RS, RA, RB, 476, 0)
226 #define NAND_rrr(RA,RS,RB)		_X	(31, RS, RA, RB, 476, 1)
227 
228 #define NEGrr(RD,RA)			_XO	(31, RD, RA, 0, 0, 104, 0)
229 #define NEG_rr(RD,RA)			_XO	(31, RD, RA, 0, 0, 104, 1)
230 #define NEGOrr(RD,RA)			_XO	(31, RD, RA, 0, 1, 104, 0)
231 #define NEGO_rr(RD,RA)			_XO	(31, RD, RA, 0, 1, 104, 1)
232 
233 #define NORrrr(RA,RS,RB)		_X	(31, RS, RA, RB, 124, 0)
234 #define NOR_rrr(RA,RS,RB)		_X	(31, RS, RA, RB, 124, 1)
235 
236 #define ORrrr(RA,RS,RB)			_X	(31, RS, RA, RB, 444, 0)
237 #define OR_rrr(RA,RS,RB)		_X	(31, RS, RA, RB, 444, 1)
238 #define ORCrrr(RA,RS,RB)		_X	(31, RS, RA, RB, 412, 0)
239 #define ORC_rrr(RA,RS,RB)		_X	(31, RS, RA, RB, 412, 1)
240 #define ORIrri(RA,RS,IM)		_Du	(24, RS, RA, IM)
241 #define ORISrri(RA,RS,IM)		_Du	(25, RS, RA, IM)
242 
243 #define RLWIMIrriii(RA,RS,SH,MB,ME)	_M	(20, RS, RA, SH, MB, ME, 0)
244 #define RLWIMI_rriii(RA,RS,SH,MB,ME)	_M	(20, RS, RA, SH, MB, ME, 1)
245 
246 #define RLWINMrriii(RA,RS,SH,MB,ME)	_M	(21, RS, RA, SH, MB, ME, 0)
247 #define RLWINM_rriii(RA,RS,SH,MB,ME)	_M	(21, RS, RA, SH, MB, ME, 1)
248 
249 #define RLWNMrrrii(RA,RS,RB,MB,ME)	_M	(23, RS, RA, RB, MB, ME, 0)
250 #define RLWNM_rrrii(RA,RS,RB,MB,ME)	_M	(23, RS, RA, RB, MB, ME, 1)
251 
252 #define SLWrrr(RA,RS,RB)		_X	(31, RS, RA, RB,  24, 0)
253 #define SLW_rrr(RA,RS,RB)		_X	(31, RS, RA, RB,  24, 1)
254 
255 #define SRAWrrr(RA,RS,RB)		_X	(31, RS, RA, RB, 792, 0)
256 #define SRAW_rrr(RA,RS,RB)		_X	(31, RS, RA, RB, 792, 1)
257 
258 #define SRAWIrri(RD, RS, SH)		_X	(31, RS, RD, SH, 824, 0)
259 #define SRAWI_rri(RD, RS, SH)		_X	(31, RS, RD, SH, 824, 1)
260 
261 #define SRWrrr(RA,RS,RB)		_X	(31, RS, RA, RB, 536, 0)
262 #define SRW_rrr(RA,RS,RB)		_X	(31, RS, RA, RB, 536, 1)
263 
264 #define STBrm(RS,ID,RA)			_D	(38, RS, RA, ID)
265 #define STBUrm(RS,ID,RA)		_D	(39, RS, RA, ID)
266 #define STBUXrrr(RS,RA,RB)		_X	(31, RS, RA, RB, 247, 0)
267 #define STBXrrr(RS,RA,RB)		_X	(31, RS, RA, RB, 215, 0)
268 
269 #define STHrm(RS,ID,RA)			_D	(44, RS, RA, ID)
270 #define STHUrm(RS,ID,RA)		_D	(45, RS, RA, ID)
271 #define STHBRXrrr(RS,RA,RB)		_X	(31, RS, RA, RB, 918, 0)
272 #define STHUXrrr(RS,RA,RB)		_X	(31, RS, RA, RB, 439, 0)
273 #define STHXrrr(RS,RA,RB)		_X	(31, RS, RA, RB, 407, 0)
274 
275 #define STMWrm(RS,ID,RA)		_D	(47, RS, RA, ID)
276 
277 #define STWrm(RS,ID,RA)			_D	(36, RS, RA, ID)
278 #define STWBRXrrr(RS,RA,RB)		_X	(31, RS, RA, RB, 662, 0)
279 #define STWCXrrr(RS,RA,RB)		_X	(31, RS, RA, RB, 150, 0)
280 #define STWCX_rrr(RS,RA,RB)		_X	(31, RS, RA, RB, 150, 1)
281 #define STWUrm(RS,ID,RA)		_D	(37, RS, RA, ID)
282 #define STWUXrrr(RS,RA,RB)		_X	(31, RS, RA, RB, 183, 0)
283 #define STWXrrr(RS,RA,RB)		_X	(31, RS, RA, RB, 151, 0)
284 
285 #define SUBFrrr(RD, RA, RB)		_XO	(31, RD, RA, RB, 0, 40, 0)
286 #define SUBF_rrr(RD, RA, RB)		_XO	(31, RD, RA, RB, 0, 40, 1)
287 #define SUBFrrr(RD, RA, RB)		_XO	(31, RD, RA, RB, 0, 40, 0)
288 #define SUBF_rrr(RD, RA, RB)		_XO	(31, RD, RA, RB, 0, 40, 1)
289 #define SUBFErrr(RD, RA, RB)		_XO	(31, RD, RA, RB, 1, 136, 0)
290 #define SUBFE_rrr(RD, RA, RB)		_XO	(31, RD, RA, RB, 1, 136, 1)
291 #define SUBFCrrr(RD, RA, RB)		_XO	(31, RD, RA, RB, 0,  8, 0)
292 #define SUBFC_rrr(RD, RA, RB)		_XO	(31, RD, RA, RB, 0,  8, 1)
293 #define SUBFCOrrr(RD, RA, RB)		_XO	(31, RD, RA, RB, 1,  8, 0)
294 #define SUBFCO_rrr(RD, RA, RB)		_XO	(31, RD, RA, RB, 1,  8, 1)
295 #define SUBFICrri(RD, RA, IMM)		_D	(8, RD, RA, IMM)
296 
297 #define ADDrrr(RD, RA, RB)		_XO	(31, RD, RA, RB, 0, 266, 0)
298 #define ADDOrrr(RD, RA, RB)		_XO	(31, RD, RA, RB, 1, 266, 0)
299 #define ADDIrri(RD, RA, IMM)		_D	(14, RD, RA, IMM)
300 #define ADDISrri(RD, RA, IMM)		_Ds	(15, RD, RA, IMM)
301 
302 #define SYNC()				_X	(31, 00, 00, 00, 598, 0)
303 
304 #define TWirr(TO,RA,RB)			_X	(31, TO, RA, RB,   4, 0)
305 #define TWIiri(TO,RA,IM)		_D	(03, TO, RA, IM)
306 
307 #define XORrrr(RA,RS,RB)		_X	(31, RS, RA, RB, 316, 0)
308 #define XOR_rrr(RA,RS,RB)		_X	(31, RS, RA, RB, 316, 1)
309 #define XORIrri(RA,RS,IM)		_Du	(26, RS, RA, IM)
310 #define XORISrri(RA,RS,IM)		_Du	(27, RS, RA, IM)
311 
312 /* simplified mnemonics [1, Appendix F] */
313 
314 #define MOVEIri2(R,H,L)			(LISri(R,H), (L ? ORIrri(R,R,L) : 0))
315 #define MOVEIri(R,I)			(_siP(16,I) ? LIri(R,I) :	\
316 					MOVEIri2(R, _HI(I), _LO(I)) )
317 
318 #define SUBIrri(RD,RA,IM)		ADDIrri(RD,RA,-_LO((IM)))	/* [1, Section F.2.1] */
319 #define SUBISrri(RD,RA,IM)		ADDISrri(RD,RA,-_LO((IM)))
320 #define SUBICrri(RD,RA,IM)		ADDICrri(RD,RA,-_LO((IM)))
321 #define SUBIC_rri(RD,RA,IM)		ADDIC_rri(RD,RA,-_LO((IM)))
322 
323 #define SUBrrr(RD,RA,RB)		SUBFrrr(RD,RB,RA)	/* [1, Section F.2.2] */
324 #define SUBOrrr(RD,RA,RB)		SUBFOrrr(RD,RB,RA)
325 #define SUB_rrr(RD,RA,RB)		SUBF_rrr(RD,RB,RA)
326 #define SUBCrrr(RD,RA,RB)		SUBFCrrr(RD,RB,RA)
327 #define SUBCOrrr(RD,RA,RB)		SUBFCOrrr(RD,RB,RA)
328 #define SUBC_rrr(RD,RA,RB)		SUBFC_rrr(RD,RB,RA)
329 #define SUBErrr(RD,RA,RB)		SUBFErrr(RD,RB,RA)
330 #define SUBE_rrr(RD,RA,RB)		SUBFE_rrr(RD,RB,RA)
331 
332 #define CMPWIiri(C,RA,IM)		CMPIiiri(C,0,RA,IM)	/* [1, Table F-2] */
333 #define CMPWirr(C,RA,RB)		CMPiirr(C,0,RA,RB)
334 #define CMPLWIiri(C,RA,IM)		CMPLIiiri(C,0,RA,IM)
335 #define CMPLWirr(C,RA,RB)		CMPLiirr(C,0,RA,RB)
336 
337 #define CMPWIri(RA,IM)			CMPWIiri(0,RA,IM)	/* with implicit _cr0 */
338 #define CMPWrr(RA,RB)			CMPWirr(0,RA,RB)
339 #define CMPLWIri(RA,IM)			CMPLWIiri(0,RA,IM)
340 #define CMPLWrr(RA,RB)			CMPLWirr(0,RA,RB)
341 
342 #define EXTLWIrrii(RA,RS,N,B)		RLWINMrriii(RA, RS,            B,	0,     (N)-1)	/* [1, Table F-3] */
343 #define EXTRWIrrii(RA,RS,N,B)		RLWINMrriii(RA, RS,      (B)+(N),  32-(N),        31)
344 #define INSLWIrrii(RA,RS,N,B)		RLWIMIrriii(RA, RS,       32-(B),	B, (B)+(N)-1)
345 #define INSRWIrrii(RA,RS,N,B)		RLWIMIrriii(RA, RS, 32-((B)+(N)),	B, (B)+(N)-1)
346 #define ROTLWIrri(RA,RS,N)		RLWINMrriii(RA, RS,            N,	0,        31)
347 #define ROTRWIrri(RA,RS,N)		RLWINMrriii(RA, RS,       32-(N),	0,        31)
348 #define ROTLWrrr(RA,RS,RB)		RLWNMrrrii( RA, RS,           RB,	0,        31)
349 #define SLWIrri(RA,RS,N)		RLWINMrriii(RA, RS,            N,	0,    31-(N))
350 #define SRWIrri(RA,RS,N)		RLWINMrriii(RA, RS,       32-(N),	N,        31)
351 #define CLRLWIrri(RA,RS,N)		RLWINMrriii(RA, RS,            0,	N,        31)
352 #define CLRRWIrri(RA,RS,N)		RLWINMrriii(RA, RS,            0,	0,    31-(N))
353 #define CLRLSLWIrrii(RA,RS,B,N)		RLWINMrriii(RA, RS,            N, (B)-(N),    31-(N))
354 
355 
356 /* 9 below inverts the branch condition and the branch prediction.
357  * This has an incestuous knowledge of JIT_AUX */
358 #define BC_EXT(A, C, D)  (_siP(16, _jit_UL(D)-_jit_UL(_jit.x.pc)) \
359   ? BCiii((A), (C), (D)) \
360   : (BCiii((A)^9, (C), _jit.x.pc+5), \
361      LISri(JIT_AUX,_HI(D)), \
362      ORIrri(JIT_AUX,JIT_AUX,_LO(D)), \
363      MTLRr(JIT_AUX), BLR() ))
364 
365 #define B_EXT(D)         (_siP(16, _jit_UL(D)-_jit_UL(_jit.x.pc)) \
366   ? Bi((D)) \
367   : (LISri(JIT_AUX,_HI(D)), \
368      ORIrri(JIT_AUX,JIT_AUX,_LO(D)), \
369      MTLRr(JIT_AUX), BLR()) )
370 
371 #define BTii(C,D)			BC_EXT(12, C, D)		/* [1, Table F-5] */
372 #define BFii(C,D)			BC_EXT( 4, C, D)
373 #define BDNZi(D)			BCiii(16, 0, D)
374 #define BDNZTii(C,D)			BC_EXT( 8, C, D)
375 #define BDNZFii(C,D)			BC_EXT( 0, C, D)
376 #define BDZi(D)				BCiii(18, 0, D)
377 #define BDZTii(C,D)			BC_EXT(10, C, D)
378 #define BDZFii(C,D)			BC_EXT( 2, C, D)
379 
380 #define BCTR()				BCCTRii(20, 0)		/* [1, Table F-6] */
381 #define BCTRL()				BCCTRLii(20, 0)
382 
383 #define BLR()				BCLRii(20, 0)		/* [1, Table F-6] */
384 #define BLRL()				BCLRLii(20, 0)
385 
386 
387 #define BLTLRi(CR)			BCLRii(12, ((CR)<<2)+0)	/* [1, Table F-10] */
388 #define BLELRi(CR)			BCLRii( 4, ((CR)<<2)+1)
389 #define BEQLRi(CR)			BCLRii(12, ((CR)<<2)+2)
390 #define BGELRi(CR)			BCLRii( 4, ((CR)<<2)+0)
391 #define BGTLRi(CR)			BCLRii(12, ((CR)<<2)+1)
392 #define BNLLRi(CR)			BCLRii( 4, ((CR)<<2)+0)
393 #define BNELRi(CR)			BCLRii( 4, ((CR)<<2)+2)
394 #define BNGLRi(CR)			BCLRii( 4, ((CR)<<2)+1)
395 #define BSOLRi(CR)			BCLRii(12, ((CR)<<2)+3)
396 #define BNSLRi(CR)			BCLRii( 4, ((CR)<<2)+3)
397 #define BUNLRi(CR)			BCLRii(12, ((CR)<<2)+3)
398 #define BNULRi(CR)			BCLRii( 4, ((CR)<<2)+3)
399 
400 #define BLTLRLi(CR)			BCLRLii(12, ((CR)<<2)+0)	/* [1, Table F-10] */
401 #define BLELRLi(CR)			BCLRLii( 4, ((CR)<<2)+1)
402 #define BEQLRLi(CR)			BCLRLii(12, ((CR)<<2)+2)
403 #define BGELRLi(CR)			BCLRLii( 4, ((CR)<<2)+0)
404 #define BGTLRLi(CR)			BCLRLii(12, ((CR)<<2)+1)
405 #define BNLLRLi(CR)			BCLRLii( 4, ((CR)<<2)+0)
406 #define BNELRLi(CR)			BCLRLii( 4, ((CR)<<2)+2)
407 #define BNGLRLi(CR)			BCLRLii( 4, ((CR)<<2)+1)
408 #define BSOLRLi(CR)			BCLRLii(12, ((CR)<<2)+3)
409 #define BNSLRLi(CR)			BCLRLii( 4, ((CR)<<2)+3)
410 #define BUNLRLi(CR)			BCLRLii(12, ((CR)<<2)+3)
411 #define BNULRLi(CR)			BCLRLii( 4, ((CR)<<2)+3)
412 
413 #define BLTCTRi(CR)			BCCTRii(12, ((CR)<<2)+0)	/* [1, Table F-10] */
414 #define BLECTRi(CR)			BCCTRii( 4, ((CR)<<2)+1)
415 #define BEQCTRi(CR)			BCCTRii(12, ((CR)<<2)+2)
416 #define BGECTRi(CR)			BCCTRii( 4, ((CR)<<2)+0)
417 #define BGTCTRi(CR)			BCCTRii(12, ((CR)<<2)+1)
418 #define BNLCTRi(CR)			BCCTRii( 4, ((CR)<<2)+0)
419 #define BNECTRi(CR)			BCCTRii( 4, ((CR)<<2)+2)
420 #define BNGCTRi(CR)			BCCTRii( 4, ((CR)<<2)+1)
421 #define BSOCTRi(CR)			BCCTRii(12, ((CR)<<2)+3)
422 #define BNSCTRi(CR)			BCCTRii( 4, ((CR)<<2)+3)
423 #define BUNCTRi(CR)			BCCTRii(12, ((CR)<<2)+3)
424 #define BNUCTRi(CR)			BCCTRii( 4, ((CR)<<2)+3)
425 
426 #define BLTCTRLi(CR)			BCCTRLii(12, ((CR)<<2)+0)	/* [1, Table F-10] */
427 #define BLECTRLi(CR)			BCCTRLii( 4, ((CR)<<2)+1)
428 #define BEQCTRLi(CR)			BCCTRLii(12, ((CR)<<2)+2)
429 #define BGECTRLi(CR)			BCCTRLii( 4, ((CR)<<2)+0)
430 #define BGTCTRLi(CR)			BCCTRLii(12, ((CR)<<2)+1)
431 #define BNLCTRLi(CR)			BCCTRLii( 4, ((CR)<<2)+0)
432 #define BNECTRLi(CR)			BCCTRLii( 4, ((CR)<<2)+2)
433 #define BNGCTRLi(CR)			BCCTRLii( 4, ((CR)<<2)+1)
434 #define BSOCTRLi(CR)			BCCTRLii(12, ((CR)<<2)+3)
435 #define BNSCTRLi(CR)			BCCTRLii( 4, ((CR)<<2)+3)
436 #define BUNCTRLi(CR)			BCCTRLii(12, ((CR)<<2)+3)
437 #define BNUCTRLi(CR)			BCCTRLii( 4, ((CR)<<2)+3)
438 
439 
440 #define BLTLR()				BLTLRi(0)  	/* with implicit _cr0 */
441 #define BLELR()				BLELRi(0)
442 #define BEQLR()				BEQLRi(0)
443 #define BGELR()				BGELRi(0)
444 #define BGTLR()				BGTLRi(0)
445 #define BNLLR()				BNLLRi(0)
446 #define BNELR()				BNELRi(0)
447 #define BNGLR()				BNGLRi(0)
448 #define BSOLR()				BSOLRi(0)
449 #define BNSLR()				BNSLRi(0)
450 #define BUNLR()				BUNLRi(0)
451 #define BNULR()				BNULRi(0)
452 
453 #define BLTLRL()			BLTLRLi(0)
454 #define BLELRL()			BLELRLi(0)
455 #define BEQLRL()			BEQLRLi(0)
456 #define BGELRL()			BGELRLi(0)
457 #define BGTLRL()			BGTLRLi(0)
458 #define BNLLRL()			BNLLRLi(0)
459 #define BNELRL()			BNELRLi(0)
460 #define BNGLRL()			BNGLRLi(0)
461 #define BSOLRL()			BSOLRLi(0)
462 #define BNSLRL()			BNSLRLi(0)
463 #define BUNLRL()			BUNLRLi(0)
464 #define BNULRL()			BNULRLi(0)
465 
466 #define BLTCTR()			BLTCTRi(0)
467 #define BLECTR()			BLECTRi(0)
468 #define BEQCTR()			BEQCTRi(0)
469 #define BGECTR()			BGECTRi(0)
470 #define BGTCTR()			BGTCTRi(0)
471 #define BNLCTR()			BNLCTRi(0)
472 #define BNECTR()			BNECTRi(0)
473 #define BNGCTR()			BNGCTRi(0)
474 #define BSOCTR()			BSOCTRi(0)
475 #define BNSCTR()			BNSCTRi(0)
476 #define BUNCTR()			BUNCTRi(0)
477 #define BNUCTR()			BNUCTRi(0)
478 
479 #define BLTCTRL()			BLTCTRLi(0)
480 #define BLECTRL()			BLECTRLi(0)
481 #define BEQCTRL()			BEQCTRLi(0)
482 #define BGECTRL()			BGECTRLi(0)
483 #define BGTCTRL()			BGTCTRLi(0)
484 #define BNLCTRL()			BNLCTRLi(0)
485 #define BNECTRL()			BNECTRLi(0)
486 #define BNGCTRL()			BNGCTRLi(0)
487 #define BSOCTRL()			BSOCTRLi(0)
488 #define BNSCTRL()			BNSCTRLi(0)
489 #define BUNCTRL()			BUNCTRLi(0)
490 #define BNUCTRL()			BNUCTRLi(0)
491 
492 
493 #define BLTii(C,D)			BC_EXT(12, ((C)<<2)+0, D)	/* [1, Table F-11] */
494 #define BNLii(C,D)			BC_EXT( 4, ((C)<<2)+0, D)
495 #define BGEii(C,D)			BC_EXT( 4, ((C)<<2)+0, D)
496 #define BGTii(C,D)			BC_EXT(12, ((C)<<2)+1, D)
497 #define BNGii(C,D)			BC_EXT( 4, ((C)<<2)+1, D)
498 #define BLEii(C,D)			BC_EXT( 4, ((C)<<2)+1, D)
499 #define BEQii(C,D)			BC_EXT(12, ((C)<<2)+2, D)
500 #define BNEii(C,D)			BC_EXT( 4, ((C)<<2)+2, D)
501 #define BSOii(C,D)			BC_EXT(12, ((C)<<2)+3, D)
502 #define BNSii(C,D)			BC_EXT( 4, ((C)<<2)+3, D)
503 #define BUNii(C,D)			BC_EXT(12, ((C)<<2)+3, D)
504 #define BNUii(C,D)			BC_EXT( 4, ((C)<<2)+3, D)
505 
506 #define BLTi(D)				BLTii(0,D)	/* with implicit _cr0 */
507 #define BLEi(D)				BLEii(0,D)
508 #define BEQi(D)				BEQii(0,D)
509 #define BGEi(D)				BGEii(0,D)
510 #define BGTi(D)				BGTii(0,D)
511 #define BNLi(D)				BNLii(0,D)
512 #define BNEi(D)				BNEii(0,D)
513 #define BNGi(D)				BNGii(0,D)
514 #define BSOi(D)				BSOii(0,D)
515 #define BNSi(D)				BNSii(0,D)
516 #define BUNi(D)				BUNii(0,D)
517 #define BNUi(D)				BNUii(0,D)
518 
519 #define BLTLii(C,D)			BCLiii(12, ((C)<<2)+0, D)	/* [1, Table F-??] */
520 #define BLELii(C,D)			BCLiii( 4, ((C)<<2)+1, D)
521 #define BEQLii(C,D)			BCLiii(12, ((C)<<2)+2, D)
522 #define BGELii(C,D)			BCLiii( 4, ((C)<<2)+0, D)
523 #define BGTLii(C,D)			BCLiii(12, ((C)<<2)+1, D)
524 #define BNLLii(C,D)			BCLiii( 4, ((C)<<2)+0, D)
525 #define BNELii(C,D)			BCLiii( 4, ((C)<<2)+2, D)
526 #define BNGLii(C,D)			BCLiii( 4, ((C)<<2)+1, D)
527 #define BSOLii(C,D)			BCLiii(12, ((C)<<2)+3, D)
528 #define BNSLii(C,D)			BCLiii( 4, ((C)<<2)+3, D)
529 #define BUNLii(C,D)			BCLiii(12, ((C)<<2)+3, D)
530 #define BNULii(C,D)			BCLiii( 4, ((C)<<2)+3, D)
531 
532 #define BLTLi(D)			BLTLii(0,D)	/* with implicit _cr0 */
533 #define BLELi(D)			BLELii(0,D)
534 #define BEQLi(D)			BEQLii(0,D)
535 #define BGELi(D)			BGELii(0,D)
536 #define BGTLi(D)			BGTLii(0,D)
537 #define BNLLi(D)			BNLLii(0,D)
538 #define BNELi(D)			BNELii(0,D)
539 #define BNGLi(D)			BNGLii(0,D)
540 #define BSOLi(D)			BSOLii(0,D)
541 #define BNSLi(D)			BNSLii(0,D)
542 #define BUNLi(D)			BUNLii(0,D)
543 #define BNULi(D)			BNULii(0,D)
544 
545 /* Note: there are many tens of other simplified branches that are not (yet?) defined here */
546 
547 #define CRSETi(BX)			CREQViii(BX, BX, BX)	/* [1, Table F-15] */
548 #define CRCLRi(BX)			CRXORiii(BX, BX, BX)
549 #define CRMOVEii(BX,BY)			CRORiii(BX, BY, BY)
550 #define CRNOTii(BX,BY)			CRNORiii(BX, BY, BY)
551 
552 #define MTLRr(RS)			MTSPRir(8, RS)		/* [1, Table F-20] */
553 #define MFLRr(RD)			MFSPRri(RD, 8)
554 #define MTCTRr(RS)			MTSPRir(9, RS)
555 #define MFCTRr(RD)			MFSPRri(RD, 9)
556 #define MTXERr(RS)			MTSPRir(1, RS)
557 #define MFXERr(RD)			MFSPRri(RD, 1)
558 
559 #define NOP()				ORIrri(0, 0, 0)		/* [1, Section F.9] */
560 #define LIri(RD,IM)			ADDIrri(RD, 0, IM)
561 #define LISri(RD,IM)			ADDISrri(RD, 0, IM)
562 #define LArm(RD,D,RA)			ADDIrri(RD, RA, D)
563 #define LArrr(RD,RB,RA)			ADDIrrr(RD, RA, RB)
564 #define MRrr(RA,RS)			ORrrr(RA, RS, RS)
565 #define NOTrr(RA,RS)			NORrrr(RA, RS, RS)
566 
567 /* alternative parenthesised forms of extended indexed load/store insns */
568 
569 #define LBZUrx(RD,RA,RB)		LBZUXrrr(RD,RA,RB)
570 #define LBZrx(RD,RA,RB)			LBZXrrr(RD,RA,RB)
571 #define LHAUrx(RD,RA,RB)		LHAUXrrr(RD,RA,RB)
572 #define LHArx(RD,RA,RB)			LHAXrrr(RD,RA,RB)
573 #define LHBRrx(RD,RA,RB)		LHBRXrrr(RD,RA,RB)
574 #define LHZUrx(RD,RA,RB)		LHZUXrrr(RD,RA,RB)
575 #define LHZrx(RD,RA,RB)			LHZXrrr(RD,RA,RB)
576 #define LWBRrx(RD,RA,RB)		LWBRXrrr(RD,RA,RB)
577 #define LWZUrx(RD, RA, RB)		LWZUXrrr(RD, RA, RB)
578 #define LWZrx(RD, RA, RB)		LWZXrrr(RD, RA, RB)
579 #define STBUrx(RD,RA,RB)		STBUXrrr(RD,RA,RB)
580 #define STBrx(RD,RA,RB)			STBXrrr(RD,RA,RB)
581 #define STHBRrx(RS,RA,RB)		STHBRXrrr(RS,RA,RB)
582 #define STHUrx(RS,RA,RB)		STHUXrrr(RS,RA,RB)
583 #define STHrx(RS,RA,RB)			STHXrrr(RS,RA,RB)
584 #define STWBRrx(RS,RA,RB)		STWBRXrrr(RS,RA,RB)
585 #define STWCrx(RS,RA,RB)		STWCXrrr(RS,RA,RB)
586 #define STWCX_rx(RS,RA,RB)		STWCX_rrr(RS,RA,RB)
587 #define STWUrx(RS,RA,RB)		STWUXrrr(RS,RA,RB)
588 #define STWrx(RS,RA,RB)			STWXrrr(RS,RA,RB)
589 #define LArx(RD,RB,RA)			LArrr(RD,RB,RA)
590 
591 
592 #define _LO(I)          (_jit_UL(I) & _MASK(16))
593 #define _HI(I)          (_jit_UL(I) >>     (16))
594 
595 #define _A(OP,RD,RA,RB,RC,XO,RCx)    _jit_I((_u6(OP)<<26)|(_u5(RD)<<21)|(_u5(RA)<<16)|( _u5(RB)<<11)|_u5(RC)<<6|(_u5(XO)<<1)|_u1(RCx))
596 
597 #define LFDrri(RD,RA,imm)       _D(50,RD,RA,imm)
598 #define LFDUrri(RD,RA,imm)      _D(51,RD,RA,imm)
599 #define LFDUxrrr(RD,RA,RB)      _X(31,RD,RA,RB,631,0)
600 #define LFDxrrr(RD,RA,RB)       _X(31,RD,RA,RB,599,0)
601 
602 #define LFSrri(RD,RA,imm)       _D(48,RD,RA,imm)
603 #define LFSUrri(RD,RA,imm)      _D(49,RD,RA,imm)
604 #define LFSUxrrr(RD,RA,RB)      _X(31,RD,RA,RB,567,0)
605 #define LFSxrrr(RD,RA,RB)       _X(31,RD,RA,RB,535,0)
606 
607 #define STFDrri(RS,RA,imm)      _D(54,RS,RA,imm)
608 #define STFDUrri(RS,RA,imm)     _D(55,RS,RA,imm)
609 #define STFDUxrrr(RS,RA,RB)     _X(31,RS,RA,RB,759,0)
610 #define STFDxrrr(RS,RA,RB)      _X(31,RS,RA,RB,727,0)
611 
612 #define STFSrri(RS,RA,imm)      _D(52,RS,RA,imm)
613 #define STFSUrri(RS,RA,imm)     _D(53,RS,RA,imm)
614 #define STFSUxrrr(RS,RA,RB)     _X(31,RS,RA,RB,695,0)
615 #define STFSxrrr(RS,RA,RB)      _X(31,RS,RA,RB,663,0)
616 #define STFIWXrrr(RS,RA,RB)     _X(31,RS,RA,RB,983,0)
617 
618 #define FADDDrrr(RD,RA,RB)       _A(63,RD,RA,RB,0,21,0)
619 #define FADDSrrr(RD,RA,RB)       _A(59,RD,RA,RB,0,21,0)
620 #define FSUBDrrr(RD,RA,RB)       _A(63,RD,RA,RB,0,20,0)
621 #define FSUBSrrr(RD,RA,RB)       _A(59,RD,RA,RB,0,20,0)
622 #define FMULDrrr(RD,RA,RC)       _A(63,RD,RA,0,RC,25,0)
623 #define FMULSrrr(RD,RA,RC)       _A(59,RD,RA,0,RC,25,0)
624 #define FDIVDrrr(RD,RA,RB)       _A(63,RD,RA,RB,0,18,0)
625 #define FDIVSrrr(RD,RA,RB)       _A(59,RD,RA,RB,0,25,0)
626 #define FSQRTDrr(RD,RB)          _A(63,RD,0,RB,0,22,0)
627 #define FSQRTSrr(RD,RB)          _A(59,RD,0,RB,0,22,0)
628 #define FSELrrrr(RD,RA,RB,RC)    _A(63,RD,RA,RB,RC,23,0)
629 #define FCTIWrr(RD,RB)           _X(63,RD,0,RB,14,0)
630 #define FCTIWZrr(RD,RB)          _X(63,RD,0,RB,15,0)
631 #define FRSPrr(RD,RB)            _X(63,RD,0,RB,12,0)
632 #define FABSrr(RD,RB)            _X(63,RD,0,RB,264,0)
633 #define FNABSrr(RD,RB)           _X(63,RD,0,RB,136,0)
634 #define FNEGrr(RD,RB)            _X(63,RD,0,RB,40,0)
635 #define FMOVErr(RD,RB)           _X(63,RD,0,RB,72,0)
636 #define FCMPOrrr(CR,RA,RB)       _X(63,_u3((CR)<<2),RA,RB,32,0)
637 #define FCMPUrrr(CR,RA,RB)       _X(63,_u3((CR)<<2),RA,RB,0,0)
638 #define MTFSFIri(CR,IMM)          _X(63,_u5((CR)<<2),0,_u5((IMM)<<1),134,0)
639 
640 /*** References:
641  *
642  * [1] "PowerPC Microprocessor Family: The Programming Environments For 32-Bit Microprocessors", Motorola, 1997.
643  */
644 
645 
646 #endif
647 #endif /* __ccg_asm_ppc_h */
648