1 /* asm-ppc.h -- dynamic assembler for PowerPC
2  *
3  * Copyright (C) 1999, 2000 Ian Piumarta <ian.piumarta@inria.fr>
4  *
5  * This file is part of CCG.
6  *
7  * CCG is free software; you can redistribute it and/or modify it
8  * under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * CCG is distributed in the hope that it will be useful, but WITHOUT
13  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14  * or FITNESS FOR A PARTICULAR PURPOSE.
15  *
16  * See the file COPYING for more details.
17  *
18  * Last edited: Thu Jan 13 14:58:28 2000 by piumarta (Ian Piumarta) on pingu
19  */
20 
21 #ifndef __ccg_asm_ppc_h
22 #define __ccg_asm_ppc_h
23 
24 /*** a brief NOTE about halfwords and "shifted" operands
25  *
26  * this file extends the intrinsic assembler syntax with pseudo-ops for...
27  *
28  *	exp@lo	= the LS 16 bits of exp, unsigned and unextended
29  *
30  *	exp@hi	= the MS 16 bits of exp, unsigned and unextended
31  *
32  *	var@l	= the LS 16 bits of &var, sign-extended to 32 bits
33  *
34  *	var@ha	= the MS 16 bits of &var, sign-extended to 32 bits
35  *		  and IN EXCESS by the sign bit of var@l
36  *
37  * LOGICAL insns require UNSIGNED args in 0..65535, whether or not shifted
38  *
39  * ARITHMETIC insns require SIGNED args in -32768..32767, even when shifted
40  *
41  * as a special case: "lis/addis" also accepts UNSIGNED arguments in
42  * 0..65535 since it is often used immediately before "ori" to load a 32-bit
43  * constant (this is consistent with the GNU rs/6000 and PowerPC assemblers)
44  *
45  * thus:	lis	rD, expression@hi
46  *		ori	rD, rD, expression@lo	; load 32-bit constant
47  *
48  *		lis	rD, varName@ha
49  *		addi	rD, rD, varName@l	; load 32-bit variable address
50  *
51  *		lis	rB, varName@ha
52  *		lwz/stw rDS, varName@l(rB)	; load/store variable's contents
53  */
54 
55 #if !defined(__PPC__) && !defined(_POWER) && !defined(_IBMR2)
56 # warning:
57 # warning: FOREIGN ARCHITECTURE SELECTED
58 # warning:
59 #endif
60 
61 typedef unsigned int insn;
62 
63 #include "asm-common.h"
64 
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 
79 
80 #define _suiP16(I)	((((int)(I)) >= -32768) && (((int)(I)) < 65536))
81 
82 #define _UL(X)		((unsigned long)(X))
83 #define _SL(X)		((long)(X))
84 
85 #define _ck_s(W,I)	(_siP(W,I) ? (_UL(I) & _MASK(W)) : ASMFAIL(  "signed integer `"#I"' too large for "#W"-bit field"))
86 #define _ck_u(W,I)    	(_uiP(W,I) ? (_UL(I) & _MASK(W)) : ASMFAIL("unsigned integer `"#I"' too large for "#W"-bit field"))
87 
88 #define _ck_su16(I)    	(_suiP16(I) ? (_UL(I) & _MASK(16)) : ASMFAIL("shifted integer `"#I"' too large for 16-bit field"))
89 
90 #define __ck_d(W,D)	(_siP(W,D) ? (_UL(D) & (_MASK(W)-3)) : ASMFAIL(    "displacement `"#D"' too large for "#W"-bit field"))
91 #define _ck_d(W,I)    	((asm_pass==1) ? ((_UL(I)-_UL(asm_pc)) & (_MASK(W)-3)) : __ck_d(W,_UL(I)-_UL(asm_pc)))
92 
93 #define _s16(I)         _ck_s(16,I)
94 
95 #define _su16(I)	_ck_su16(I)
96 
97 #define _u1(I)          _ck_u( 1,I)
98 #define _u5(I)          _ck_u( 5,I)
99 #define _u6(I)          _ck_u( 6,I)
100 #define _u9(I)          _ck_u( 9,I)
101 #define _u10(I)         _ck_u(10,I)
102 #define _u16(I)         _ck_u(16,I)
103 
104 #define _d16(D)		_ck_d(16,D)
105 #define _d26(D)		_ck_d(26,D)
106 
107 #define _GEN(X)		((*asm_pc= (X)), ++asm_pc)
108 
109 /* primitive instruction forms [1, Section A.4] */
110 
111 #define _I(   OP,         BD,AA,LK )	_GEN((_u6(OP)<<26)|                                              _d26(BD)|   (_u1(AA)<<1)|_u1(LK))
112 #define _B(   OP,BO,BI,   BD,AA,LK )  	_GEN((_u6(OP)<<26)|(_u5(BO)<<21)|(_u5(BI)<<16)|                  _d16(BD)|   (_u1(AA)<<1)|_u1(LK))
113 #define _D(   OP,RD,RA,         DD )  	_GEN((_u6(OP)<<26)|(_u5(RD)<<21)|(_u5(RA)<<16)|                  _s16(DD)                        )
114 #define _Du(  OP,RD,RA,         DD )  	_GEN((_u6(OP)<<26)|(_u5(RD)<<21)|(_u5(RA)<<16)|                  _u16(DD)                        )
115 #define _Ds(  OP,RD,RA,         DD )  	_GEN((_u6(OP)<<26)|(_u5(RD)<<21)|(_u5(RA)<<16)|                 _su16(DD)                        )
116 #define _X(   OP,RD,RA,RB,   XO,RC )  	_GEN((_u6(OP)<<26)|(_u5(RD)<<21)|(_u5(RA)<<16)|( _u5(RB)<<11)|              (_u10(XO)<<1)|_u1(RC))
117 #define _XL(  OP,BO,BI,      XO,LK )  	_GEN((_u6(OP)<<26)|(_u5(BO)<<21)|(_u5(BI)<<16)|( _u5(00)<<11)|              (_u10(XO)<<1)|_u1(LK))
118 #define _XFX( OP,RD,         SR,XO )  	_GEN((_u6(OP)<<26)|(_u5(RD)<<21)|              (_u10(SR)<<11)|              (_u10(XO)<<1)|_u1(00))
119 #define _XO(  OP,RD,RA,RB,OE,XO,RC )  	_GEN((_u6(OP)<<26)|(_u5(RD)<<21)|(_u5(RA)<<16)|( _u5(RB)<<11)|(_u1(OE)<<10)|( _u9(XO)<<1)|_u1(RC))
120 #define _M(   OP,RS,RA,SH,MB,ME,RC )  	_GEN((_u6(OP)<<26)|(_u5(RS)<<21)|(_u5(RA)<<16)|( _u5(SH)<<11)|(_u5(MB)<< 6)|( _u5(ME)<<1)|_u1(RC))
121 
122 /* special purpose registers (form XFX) [1, Section 8.2, page 8-138] */
123 
124 #define SPR_LR		((8<<5)|(0))
125 
126 /* +++ intrinsic instructions */
127 
128 #define ADDrrr(RD, RA, RB)		_XO	(31, RD, RA, RB, 0, 266, 0)
129 #define ADDOrrr(RD, RA, RB)		_XO	(31, RD, RA, RB, 1, 266, 0)
130 #define ADDIrri(RD, RA, IMM)		_D	(14, RD, RA, IMM)
131 #define ADDISrri(RD, RA, IMM)		_Ds	(15, RD, RA, IMM)
132 
133 #define ANDrrr(RA, RS, RB)		_X	(31, RS, RA, RB,  28, 0)
134 #define AND_rrr(RA, RS, RB)		_X	(31, RS, RA, RB,  28, 1)
135 #define ANDCrrr(RA, RS, RB)		_X	(31, RS, RA, RB,  60, 0)
136 #define ANDC_rrr(RA, RS, RB)		_X	(31, RS, RA, RB,  60, 1)
137 #define ANDI_rri(RA, RS, IMM)		_Du	(28, RS, RA, IMM)
138 #define ANDIS_rri(RA, RS, IMM)		_Du	(29, RS, RA, IMM)
139 
140 #define Bi(BD)				_I	(18, BD, 0, 0)
141 #define BAi(BD)				_I	(18, BD, 1, 0)
142 #define BLi(BD)				_I	(18, BD, 0, 1)
143 #define BLAi(BD)			_I	(18, BD, 1, 1)
144 
145 #define BCiii(BO,BI,BD)			_B	(16, BO, BI, BD, 0, 0)
146 #define BCAiii(BO,BI,BD)		_B	(16, BO, BI, BD, 1, 0)
147 #define BCLiii(BO,BI,BD)		_B	(16, BO, BI, BD, 0, 1)
148 #define BCLAiii(BO,BI,BD)		_B	(16, BO, BI, BD, 1, 1)
149 
150 #define BCCTRii(BO,BI)			_XL	(19, BO, BI, 528, 0)
151 #define BCCTRLii(BO,BI)			_XL	(19, BO, BI, 528, 1)
152 
153 #define BCLRii(BO,BI)			_XL	(19, BO, BI,  16, 0)
154 #define BCLRLii(BO,BI)			_XL	(19, BO, BI,  16, 1)
155 
156 #define CMPiirr(CR, LL, RA, RB)		_X	(31, ((CR)<<2)|(LL), RA, RB, 0, 0)
157 #define CMPIiiri(CR, LL, RA, IMM)	_D	(11, ((CR)<<2)|(LL), RA, IMM)
158 
159 #define CMPLiirr(CR, LL, RA, RB)	_X	(31, ((CR)<<2)|(LL), RA, RB, 32, 0)
160 #define CMPLIiiri(CR, LL, RA, IMM)	_D	(10, ((CR)<<2)|(LL), RA, IMM)
161 
162 #define CRANDiii(CRD,CRA,CRB)		_X	(19, CRD, CRA, CRB, 257, 0)
163 #define CRANDCiii(CRD,CRA,CRB)		_X	(19, CRD, CRA, CRB, 129, 0)
164 #define CREQViii(CRD,CRA,CRB)		_X	(19, CRD, CRA, CRB, 289, 0)
165 #define CRNANDiii(CRD,CRA,CRB)		_X	(19, CRD, CRA, CRB, 225, 0)
166 #define CRNORiii(CRD,CRA,CRB)		_X	(19, CRD, CRA, CRB,  33, 0)
167 #define CRORiii(CRD,CRA,CRB)		_X	(19, CRD, CRA, CRB, 449, 0)
168 #define CRORCiii(CRD,CRA,CRB)		_X	(19, CRD, CRA, CRB, 417, 0)
169 #define CRXORiii(CRD,CRA,CRB)		_X	(19, CRD, CRA, CRB, 193, 0)
170 
171 #define DCBSTrr(RA,RB)			_X	(31, 00, RA, RB,  54, 0)
172 
173 #define DIVWrrr(RD, RA, RB)		_XO	(31, RD, RA, RB, 0, 491, 0)
174 #define DIVW_rrr(RD, RA, RB)		_XO	(31, RD, RA, RB, 0, 491, 1)
175 #define DIVWOrrr(RD, RA, RB)		_XO	(31, RD, RA, RB, 1, 491, 0)
176 #define DIVWO_rrr(RD, RA, RB)		_XO	(31, RD, RA, RB, 1, 491, 1)
177 
178 #define DIVWUrrr(RD, RA, RB)		_XO	(31, RD, RA, RB, 0, 459, 0)
179 #define DIVWU_rrr(RD, RA, RB)		_XO	(31, RD, RA, RB, 0, 459, 1)
180 #define DIVWUOrrr(RD, RA, RB)		_XO	(31, RD, RA, RB, 1, 459, 0)
181 #define DIVWUO_rrr(RD, RA, RB)		_XO	(31, RD, RA, RB, 1, 459, 1)
182 
183 #define EQVrrr(Ra,RS,RB)		_X	(31, RS, RA, RB, 284, 0)
184 #define EQV_rrr(Ra,RS,RB)		_X	(31, RS, RA, RB, 284, 1)
185 
186 #define EXTSBrr(RA,RS)			_X	(31, RS, RA,  0, 954, 0)
187 #define EXTSB_rr(RA,RS)			_X	(31, RS, RA,  0, 954, 1)
188 
189 #define EXTSHrr(RA,RS)			_X	(31, RS, RA,  0, 922, 0)
190 #define EXTSH_rr(RA,RS)			_X	(31, RS, RA,  0, 922, 1)
191 
192 #define ICBIrr(RA,RB)			_X	(31, 00, RA, RB, 982, 0)
193 
194 #define ISYNC()				_X	(19, 00, 00, 00, 150, 0)
195 
196 #define LBZrm(RD,ID,RA)			_D	(34, RD, RA, ID)
197 #define LBZUrm(RD,ID,RA)		_D	(35, RD, RA, ID)
198 #define LBZUXrrr(RD,RA,RB)		_X	(31, RD, RA, RB, 119, 0)
199 #define LBZXrrr(RD,RA,RB)		_X	(31, RD, RA, RB,  87, 0)
200 
201 #define LHArm(RD,ID,RA)			_D	(42, RD, RA, ID)
202 #define LHAUrm(RD,ID,RA)		_D	(43, RD, RA, ID)
203 #define LHAUXrrr(RD,RA,RB)		_X	(31, RD, RA, RB, 375, 0)
204 #define LHAXrrr(RD,RA,RB)		_X	(31, RD, RA, RB, 343, 0)
205 #define LHBRXrrr(RD,RA,RB)		_X	(31, RD, RA, RB, 790, 0)
206 
207 #define LHZrm(RD,ID,RA)			_D	(40, RD, RA, ID)
208 #define LHZUrm(RD,ID,RA)		_D	(41, RD, RA, ID)
209 #define LHZUXrrr(RD,RA,RB)		_X	(31, RD, RA, RB, 311, 0)
210 #define LHZXrrr(RD,RA,RB)		_X	(31, RD, RA, RB, 279, 0)
211 
212 #define LMWrm(RD,ID,RA)			_D	(46, RD, RA, ID)
213 
214 #define LWBRXrrr(RD,RA,RB)		_X	(31, RD, RA, RB, 534, 0)
215 
216 #define LWZrm(RD, DISP, RA)		_D	(32, RD, RA, DISP)
217 #define LWZUrm(RD, DISP, RA)		_D	(33, RD, RA, DISP)
218 #define LWZUXrrr(RD, RA, RB)		_X	(31, RD, RA, RB,  56, 0)
219 #define LWZXrrr(RD, RA, RB)		_X	(31, RD, RA, RB,  23, 0)
220 
221 #define MCRFii(CD,CS)			_X	(19, ((CD)<<2), ((CS)<<2), 0, 0, 0)
222 
223 #define MFCRr(RD)			_X	(31, RD, 0, 0, 19, 0)
224 
225 #define MFSPRri(RD, SPR)		_XFX	(31, RD, (SPR)<<5, 339)
226 #define MTSPRir(SPR, RS)		_XFX	(31, RS, (SPR)<<5, 467)
227 
228 #define MULHWrrr(RD,RA,RB)		_XO	(31, RD, RA, RB, 0,  75, 0)
229 #define MULHW_rrr(RD,RA,RB)		_XO	(31, RD, RA, RB, 0,  75, 1)
230 #define MULHWUrrr(RD,RA,RB)		_XO	(31, RD, RA, RB, 0,  11, 0)
231 #define MULHWU_rrr(RD,RA,RB)		_XO	(31, RD, RA, RB, 0,  11, 1)
232 
233 #define MULLIrri(RD,RA,IM)		_D	(07, RD, RA, IM)
234 
235 #define MULLWrrr(RD,RA,RB)		_XO	(31, RD, RA, RB, 0, 235, 0)
236 #define MULLW_rrr(RD,RA,RB)		_XO	(31, RD, RA, RB, 0, 235, 1)
237 #define MULLWOrrr(RD,RA,RB)		_XO	(31, RD, RA, RB, 1, 235, 0)
238 #define MULLWO_rrr(RD,RA,RB)		_XO	(31, RD, RA, RB, 1, 235, 1)
239 
240 #define NANDrrr(RA,RS,RB)		_X	(31, RS, RA, RB, 476, 0)
241 #define NAND_rrr(RA,RS,RB)		_X	(31, RS, RA, RB, 476, 1)
242 
243 #define NEGrr(RD,RA)			_XO	(31, RD, RA, 0, 0, 104, 0)
244 #define NEG_rr(RD,RA)			_XO	(31, RD, RA, 0, 0, 104, 1)
245 #define NEGOrr(RD,RA)			_XO	(31, RD, RA, 0, 1, 104, 0)
246 #define NEGO_rr(RD,RA)			_XO	(31, RD, RA, 0, 1, 104, 1)
247 
248 #define NORrrr(RA,RS,RB)		_X	(31, RS, RA, RB, 124, 0)
249 #define NOR_rrr(RA,RS,RB)		_X	(31, RS, RA, RB, 124, 1)
250 
251 #define ORrrr(RA,RS,RB)			_X	(31, RS, RA, RB, 444, 0)
252 #define OR_rrr(RA,RS,RB)		_X	(31, RS, RA, RB, 444, 1)
253 #define ORCrrr(RA,RS,RB)		_X	(31, RS, RA, RB, 412, 0)
254 #define ORC_rrr(RA,RS,RB)		_X	(31, RS, RA, RB, 412, 1)
255 #define ORIrri(RA,RS,IM)		_Du	(24, RS, RA, IM)
256 #define ORISrri(RA,RS,IM)		_Du	(25, RS, RA, IM)
257 
258 #define RLWIMIrriii(RA,RS,SH,MB,ME)	_M	(20, RS, RA, SH, MB, ME, 0)
259 #define RLWIMI_rriii(RA,RS,SH,MB,ME)	_M	(20, RS, RA, SH, MB, ME, 1)
260 
261 #define RLWINMrriii(RA,RS,SH,MB,ME)	_M	(21, RS, RA, SH, MB, ME, 0)
262 #define RLWINM_rriii(RA,RS,SH,MB,ME)	_M	(21, RS, RA, SH, MB, ME, 1)
263 
264 #define RLWNMrrrii(RA,RS,RB,MB,ME)	_M	(23, RS, RA, RB, MB, ME, 0)
265 #define RLWNM_rrrii(RA,RS,RB,MB,ME)	_M	(23, RS, RA, RB, MB, ME, 1)
266 
267 #define SLWrrr(RA,RS,RB)		_X	(31, RS, RA, RB,  24, 0)
268 #define SLW_rrr(RA,RS,RB)		_X	(31, RS, RA, RB,  24, 1)
269 
270 #define SRAWrrr(RA,RS,RB)		_X	(31, RS, RA, RB, 792, 0)
271 #define SRAW_rrr(RA,RS,RB)		_X	(31, RS, RA, RB, 792, 1)
272 
273 #define SRAWIrri(RD, RS, SH)		_X	(31, RS, RD, SH, 824, 0)
274 #define SRAWI_rri(RD, RS, SH)		_X	(31, RS, RD, SH, 824, 1)
275 
276 #define SRWrrr(RA,RS,RB)		_X	(31, RS, RA, RB, 536, 0)
277 #define SRW_rrr(RA,RS,RB)		_X	(31, RS, RA, RB, 536, 1)
278 
279 #define STBrm(RS,ID,RA)			_D	(38, RS, RA, ID)
280 #define STBUrm(RS,ID,RA)		_D	(39, RS, RA, ID)
281 #define STBUXrrr(RS,RA,RB)		_X	(31, RS, RA, RB, 247, 0)
282 #define STBXrrr(RS,RA,RB)		_X	(31, RS, RA, RB, 215, 0)
283 
284 #define STHrm(RS,ID,RA)			_D	(44, RS, RA, ID)
285 #define STHUrm(RS,ID,RA)		_D	(45, RS, RA, ID)
286 #define STHBRXrrr(RS,RA,RB)		_X	(31, RS, RA, RB, 918, 0)
287 #define STHUXrrr(RS,RA,RB)		_X	(31, RS, RA, RB, 439, 0)
288 #define STHXrrr(RS,RA,RB)		_X	(31, RS, RA, RB, 407, 0)
289 
290 #define STMWrm(RD,ID,RA)		_D	(47, RD, RA, ID)
291 
292 #define STWrm(RS,ID,RA)			_D	(36, RS, RA, ID)
293 #define STWBRXrrr(RS,RA,RB)		_X	(31, RS, RA, RB, 662, 0)
294 #define STWCXrrr(RS,RA,RB)		_X	(31, RS, RA, RB, 150, 0)
295 #define STWCX_rrr(RS,RA,RB)		_X	(31, RS, RA, RB, 150, 1)
296 #define STWUrm(RS,ID,RA)		_D	(37, RS, RA, ID)
297 #define STWUXrrr(RS,RA,RB)		_X	(31, RS, RA, RB, 183, 0)
298 #define STWXrrr(RS,RA,RB)		_X	(31, RS, RA, RB, 151, 0)
299 
300 #define SUBFrrr(RD, RA, RB)		_XO	(31, RD, RA, RB, 0, 40, 0)
301 #define SUBF_rrr(RD, RA, RB)		_XO	(31, RD, RA, RB, 0, 40, 1)
302 #define SUBFOrrr(RD, RA, RB)		_XO	(31, RD, RA, RB, 1, 40, 0)
303 #define SUBFO_rrr(RD, RA, RB)		_XO	(31, RD, RA, RB, 1, 40, 1)
304 
305 #define SYNC()				_X	(31, 00, 00, 00, 598, 0)
306 
307 #define TWirr(TO,RA,RB)			_X	(31, TO, RA, RB,   4, 0)
308 #define TWIiri(TO,RA,IM)		_D	(03, TO, RA, IM)
309 
310 #define XORrrr(RA,RS,RB)		_X	(31, RS, RA, RB, 316, 0)
311 #define XOR_rrr(RA,RS,RB)		_X	(31, RS, RA, RB, 316, 1)
312 #define XORIrri(RA,RS,IM)		_Du	(26, RS, RA, IM)
313 #define XORISrri(RA,RS,IM)		_Du	(27, RS, RA, IM)
314 
315 /* simplified mnemonics [1, Appendix F] */
316 
317 #define SUBIrri(RD,RA,IM)		ADDIrri(RD,RA,-(IM))	/* [1, Section F.2.1] */
318 #define SUBISrri(RD,RA,IM)		ADDISrri(RD,RA,-(IM))
319 #define SUBICrri(RD,RA,IM)		ADDICrri(RD,RA,-(IM))
320 #define SUBIC_rri(RD,RA,IM)		ADDIC_rri(RD,RA,-(IM))
321 
322 #define SUBrrr(RD,RA,RB)		SUBFrrr(RD,RB,RA)	/* [1, Section F.2.2] */
323 #define SUBOrrr(RD,RA,RB)		SUBFOrrr(RD,RB,RA)
324 #define SUB_rrr(RD,RA,RB)		SUBF_rrr(RD,RB,RA)
325 #define SUBCrrr(RD,RA,RB)		SUBFCrrr(RD,RB,RA)
326 #define SUBCOrrr(RD,RA,RB)		SUBFCOrrr(RD,RB,RA)
327 #define SUBC_rrr(RD,RA,RB)		SUBFC_rrr(RD,RB,RA)
328 
329 #define CMPWIiri(C,RA,IM)		CMPIiiri(C,0,RA,IM)	/* [1, Table F-2] */
330 #define CMPWirr(C,RA,RB)		CMPiirr(C,0,RA,RB)
331 #define CMPLWIiri(C,RA,IM)		CMPLIiiri(C,0,RA,IM)
332 #define CMPLWirr(C,RA,RB)		CMPLiirr(C,0,RA,RB)
333 
334 #define CMPWIri(RA,IM)			CMPWIiri(0,RA,IM)	/* with implicit cr0 */
335 #define CMPWrr(RA,RB)			CMPWirr(0,RA,RB)
336 #define CMPLWIri(RA,IM)			CMPLWIiri(0,RA,IM)
337 #define CMPLWrr(RA,RB)			CMPLWirr(0,RA,RB)
338 
339 #define EXTLWIrrii(RA,RS,N,B)		RLWINMrriii(RA, RS,            B,	0,     (N)-1)	/* [1, Table F-3] */
340 #define EXTRWIrrii(RA,RS,N,B)		RLWINMrriii(RA, RS,      (B)+(N),  32-(N),        31)
341 #define INSLWIrrii(RA,RS,N,B)		RLWIMIrriii(RA, RS,       32-(B),	B, (B)+(N)-1)
342 #define INSRWIrrii(RA,RS,N,B)		RLWIMIrriii(RA, RS, 32-((B)+(N)),	B, (B)+(N)-1)
343 #define ROTLWIrri(RA,RS,N)		RLWINMrriii(RA, RS,            N,	0,        31)
344 #define ROTRWIrri(RA,RS,N)		RLWINMrriii(RA, RS,       32-(N),	0,        31)
345 #define ROTLWrrr(RA,RS,RB)		RLWNMrrrii( RA, RS,           RB,	0,        31)
346 #define SLWIrri(RA,RS,N)		RLWINMrriii(RA, RS,            N,	0,    31-(N))
347 #define SRWIrri(RA,RS,N)		RLWINMrriii(RA, RS,       32-(N),	N,        31)
348 #define CLRLWIrri(RA,RS,N)		RLWINMrriii(RA, RS,            0,	N,        31)
349 #define CLRRWIrri(RA,RS,N)		RLWINMrriii(RA, RS,            0,	0,    31-(N))
350 #define CLRLSLWIrrii(RA,RS,B,N)		RLWINMrriii(RA, RS,            N, (B)-(N),    31-(N))
351 
352 #define BTii(C,D)			BC(12, C, D)		/* [1, Table F-5] */
353 #define BFii(C,D)			BC( 4, C, D)
354 #define BDNZi(D)			BC(16, 0, D)
355 #define BDNZTii(C,D)			BC( 8, C, D)
356 #define BDNZFii(C,D)			BC( 0, C, D)
357 #define BDZi(D)				BC(18, 0, D)
358 #define BDZTii(C,D)			BC(10, C, D)
359 #define BDZFii(C,D)			BC( 2, C, D)
360 
361 #define BCTR()				BCCTRii(20, 0)		/* [1, Table F-6] */
362 #define BCTRL()				BCCTRLii(20, 0)
363 
364 #define BLR()				BCLRii(20, 0)		/* [1, Table F-6] */
365 #define BLRL()				BCLRLii(20, 0)
366 
367 
368 #define BLTLRi(CR)			BCLRii(12, ((CR)<<2)+0)	/* [1, Table F-10] */
369 #define BLELRi(CR)			BCLRii( 4  ((CR)<<2)+1)
370 #define BEQLRi(CR)			BCLRii(12, ((CR)<<2)+2)
371 #define BGELRi(CR)			BCLRii( 4, ((CR)<<2)+0)
372 #define BGTLRi(CR)			BCLRii(12, ((CR)<<2)+1)
373 #define BNLLRi(CR)			BCLRii( 4, ((CR)<<2)+0)
374 #define BNELRi(CR)			BCLRii( 4, ((CR)<<2)+2)
375 #define BNGLRi(CR)			BCLRii( 4, ((CR)<<2)+1)
376 #define BSOLRi(CR)			BCLRii(12, ((CR)<<2)+3)
377 #define BNSLRi(CR)			BCLRii( 4, ((CR)<<2)+3)
378 #define BUNLRi(CR)			BCLRii(12, ((CR)<<2)+3)
379 #define BNULRi(CR)			BCLRii( 4, ((CR)<<2)+3)
380 
381 #define BLTLRLi(CR)			BCLRLii(12, ((CR)<<2)+0)	/* [1, Table F-10] */
382 #define BLELRLi(CR)			BCLRLii( 4, ((CR)<<2)+1)
383 #define BEQLRLi(CR)			BCLRLii(12, ((CR)<<2)+2)
384 #define BGELRLi(CR)			BCLRLii( 4, ((CR)<<2)+0)
385 #define BGTLRLi(CR)			BCLRLii(12, ((CR)<<2)+1)
386 #define BNLLRLi(CR)			BCLRLii( 4, ((CR)<<2)+0)
387 #define BNELRLi(CR)			BCLRLii( 4, ((CR)<<2)+2)
388 #define BNGLRLi(CR)			BCLRLii( 4, ((CR)<<2)+1)
389 #define BSOLRLi(CR)			BCLRLii(12, ((CR)<<2)+3)
390 #define BNSLRLi(CR)			BCLRLii( 4, ((CR)<<2)+3)
391 #define BUNLRLi(CR)			BCLRLii(12, ((CR)<<2)+3)
392 #define BNULRLi(CR)			BCLRLii( 4, ((CR)<<2)+3)
393 
394 #define BLTCTRi(CR)			BCCTRii(12, ((CR)<<2)+0)	/* [1, Table F-10] */
395 #define BLECTRi(CR)			BCCTRii( 4  ((CR)<<2)+1)
396 #define BEQCTRi(CR)			BCCTRii(12, ((CR)<<2)+2)
397 #define BGECTRi(CR)			BCCTRii( 4, ((CR)<<2)+0)
398 #define BGTCTRi(CR)			BCCTRii(12, ((CR)<<2)+1)
399 #define BNLCTRi(CR)			BCCTRii( 4, ((CR)<<2)+0)
400 #define BNECTRi(CR)			BCCTRii( 4, ((CR)<<2)+2)
401 #define BNGCTRi(CR)			BCCTRii( 4, ((CR)<<2)+1)
402 #define BSOCTRi(CR)			BCCTRii(12, ((CR)<<2)+3)
403 #define BNSCTRi(CR)			BCCTRii( 4, ((CR)<<2)+3)
404 #define BUNCTRi(CR)			BCCTRii(12, ((CR)<<2)+3)
405 #define BNUCTRi(CR)			BCCTRii( 4, ((CR)<<2)+3)
406 
407 #define BLTCTRLi(CR)			BCCTRLii(12, ((CR)<<2)+0)	/* [1, Table F-10] */
408 #define BLECTRLi(CR)			BCCTRLii( 4, ((CR)<<2)+1)
409 #define BEQCTRLi(CR)			BCCTRLii(12, ((CR)<<2)+2)
410 #define BGECTRLi(CR)			BCCTRLii( 4, ((CR)<<2)+0)
411 #define BGTCTRLi(CR)			BCCTRLii(12, ((CR)<<2)+1)
412 #define BNLCTRLi(CR)			BCCTRLii( 4, ((CR)<<2)+0)
413 #define BNECTRLi(CR)			BCCTRLii( 4, ((CR)<<2)+2)
414 #define BNGCTRLi(CR)			BCCTRLii( 4, ((CR)<<2)+1)
415 #define BSOCTRLi(CR)			BCCTRLii(12, ((CR)<<2)+3)
416 #define BNSCTRLi(CR)			BCCTRLii( 4, ((CR)<<2)+3)
417 #define BUNCTRLi(CR)			BCCTRLii(12, ((CR)<<2)+3)
418 #define BNUCTRLi(CR)			BCCTRLii( 4, ((CR)<<2)+3)
419 
420 
421 #define BLTLR()				BLTLRi(0)  	/* with implicit cr0 */
422 #define BLELR()				BLELRi(0)
423 #define BEQLR()				BEQLRi(0)
424 #define BGELR()				BGELRi(0)
425 #define BGTLR()				BGTLRi(0)
426 #define BNLLR()				BNLLRi(0)
427 #define BNELR()				BNELRi(0)
428 #define BNGLR()				BNGLRi(0)
429 #define BSOLR()				BSOLRi(0)
430 #define BNSLR()				BNSLRi(0)
431 #define BUNLR()				BUNLRi(0)
432 #define BNULR()				BNULRi(0)
433 
434 #define BLTLRL()			BLTLRLi(0)
435 #define BLELRL()			BLELRLi(0)
436 #define BEQLRL()			BEQLRLi(0)
437 #define BGELRL()			BGELRLi(0)
438 #define BGTLRL()			BGTLRLi(0)
439 #define BNLLRL()			BNLLRLi(0)
440 #define BNELRL()			BNELRLi(0)
441 #define BNGLRL()			BNGLRLi(0)
442 #define BSOLRL()			BSOLRLi(0)
443 #define BNSLRL()			BNSLRLi(0)
444 #define BUNLRL()			BUNLRLi(0)
445 #define BNULRL()			BNULRLi(0)
446 
447 #define BLTCTR()			BLTCTRi(0)
448 #define BLECTR()			BLECTRi(0)
449 #define BEQCTR()			BEQCTRi(0)
450 #define BGECTR()			BGECTRi(0)
451 #define BGTCTR()			BGTCTRi(0)
452 #define BNLCTR()			BNLCTRi(0)
453 #define BNECTR()			BNECTRi(0)
454 #define BNGCTR()			BNGCTRi(0)
455 #define BSOCTR()			BSOCTRi(0)
456 #define BNSCTR()			BNSCTRi(0)
457 #define BUNCTR()			BUNCTRi(0)
458 #define BNUCTR()			BNUCTRi(0)
459 
460 #define BLTCTRL()			BLTCTRLi(0)
461 #define BLECTRL()			BLECTRLi(0)
462 #define BEQCTRL()			BEQCTRLi(0)
463 #define BGECTRL()			BGECTRLi(0)
464 #define BGTCTRL()			BGTCTRLi(0)
465 #define BNLCTRL()			BNLCTRLi(0)
466 #define BNECTRL()			BNECTRLi(0)
467 #define BNGCTRL()			BNGCTRLi(0)
468 #define BSOCTRL()			BSOCTRLi(0)
469 #define BNSCTRL()			BNSCTRLi(0)
470 #define BUNCTRL()			BUNCTRLi(0)
471 #define BNUCTRL()			BNUCTRLi(0)
472 
473 
474 #define BLTii(C,D)			BCiii(12, ((C)<<2)+0, D)	/* [1, Table F-11] */
475 #define BLEii(C,D)			BCiii( 4, ((C)<<2)+1, D)
476 #define BEQii(C,D)			BCiii(12, ((C)<<2)+2, D)
477 #define BGEii(C,D)			BCiii( 4, ((C)<<2)+0, D)
478 #define BGTii(C,D)			BCiii(12, ((C)<<2)+1, D)
479 #define BNLii(C,D)			BCiii( 4, ((C)<<2)+0, D)
480 #define BNEii(C,D)			BCiii( 4, ((C)<<2)+2, D)
481 #define BNGii(C,D)			BCiii( 4, ((C)<<2)+1, D)
482 #define BSOii(C,D)			BCiii(12, ((C)<<2)+3, D)
483 #define BNSii(C,D)			BCiii( 4, ((C)<<2)+3, D)
484 #define BUNii(C,D)			BCiii(12, ((C)<<2)+3, D)
485 #define BNUii(C,D)			BCiii( 4, ((C)<<2)+3, D)
486 
487 #define BLTi(D)				BLTii(0,D)	/* with implicit cr0 */
488 #define BLEi(D)				BLEii(0,D)
489 #define BEQi(D)				BEQii(0,D)
490 #define BGEi(D)				BGEii(0,D)
491 #define BGTi(D)				BGTii(0,D)
492 #define BNLi(D)				BNLii(0,D)
493 #define BNEi(D)				BNEii(0,D)
494 #define BNGi(D)				BNGii(0,D)
495 #define BSOi(D)				BSOii(0,D)
496 #define BNSi(D)				BNSii(0,D)
497 #define BUNi(D)				BUNii(0,D)
498 #define BNUi(D)				BNUii(0,D)
499 
500 #define BLTLii(C,D)			BCLiii(12, ((C)<<2)+0, D)	/* [1, Table F-??] */
501 #define BLELii(C,D)			BCLiii( 4  ((C)<<2)+1, D)
502 #define BEQLii(C,D)			BCLiii(12, ((C)<<2)+2, D)
503 #define BGELii(C,D)			BCLiii( 4, ((C)<<2)+0, D)
504 #define BGTLii(C,D)			BCLiii(12, ((C)<<2)+1, D)
505 #define BNLLii(C,D)			BCLiii( 4, ((C)<<2)+0, D)
506 #define BNELii(C,D)			BCLiii( 4, ((C)<<2)+2, D)
507 #define BNGLii(C,D)			BCLiii( 4, ((C)<<2)+1, D)
508 #define BSOLii(C,D)			BCLiii(12, ((C)<<2)+3, D)
509 #define BNSLii(C,D)			BCLiii( 4, ((C)<<2)+3, D)
510 #define BUNLii(C,D)			BCLiii(12, ((C)<<2)+3, D)
511 #define BNULii(C,D)			BCLiii( 4, ((C)<<2)+3, D)
512 
513 #define BLTLi(D)			BLTLii(0,D)	/* with implicit cr0 */
514 #define BLELi(D)			BLELii(0,D)
515 #define BEQLi(D)			BEQLii(0,D)
516 #define BGELi(D)			BGELii(0,D)
517 #define BGTLi(D)			BGTLii(0,D)
518 #define BNLLi(D)			BNLLii(0,D)
519 #define BNELi(D)			BNELii(0,D)
520 #define BNGLi(D)			BNGLii(0,D)
521 #define BSOLi(D)			BSOLii(0,D)
522 #define BNSLi(D)			BNSLii(0,D)
523 #define BUNLi(D)			BUNLii(0,D)
524 #define BNULi(D)			BNULii(0,D)
525 
526 /* Note: there are many tens of other simplified branches that are not (yet?) defined here */
527 
528 #define CRSETi(BX)			CREQViii(BX, BX, BX)	/* [1, Table F-15] */
529 #define CRCLRi(BX)			CRXORiii(BX, BX, BX)
530 #define CRMOVEii(BX,BY)			CRORiii(BX, BY, BY)
531 #define CRNOTii(BX,BY)			CRNORiii(BX, BY, BY)
532 
533 #define MTLRr(RS)			MTSPRir(8, RS)		/* [1, Table F-20] */
534 #define MFLRr(RD)			MFSPRri(RD, 8)
535 #define MTCTRr(RS)			MTSPRir(9, RS)
536 #define MFCTRr(RD)			MFSPRri(RD, 9)
537 #define MTXERr(RS)			MTSPRir(1, RS)
538 #define MFXERr(RD)			MFSPRri(RD, 1)
539 
540 #define NOP()				ORIrri(0, 0, 0)		/* [1, Section F.9] */
541 #define LIri(RD,IM)			ADDIrri(RD, 0, IM)
542 #define LISri(RD,IM)			ADDISrri(RD, 0, IM)
543 #define LArm(RD,D,RA)			ADDIrri(RD, RA, D)
544 #define LArrr(RD,RB,RA)			ADDIrrr(RD, RA, RB)
545 #define MRrr(RA,RS)			ORrrr(RA, RS, RS)
546 #define NOTrr(RA,RS)			NORrrr(RA, RS, RS)
547 
548 /* alternative parenthesised forms of extended indexed load/store insns */
549 
550 #define LBZUrx(RD,RA,RB)		LBZUXrrr(RD,RA,RB)
551 #define LBZrx(RD,RA,RB)			LBZXrrr(RD,RA,RB)
552 #define LHAUrx(RD,RA,RB)		LHAUXrrr(RD,RA,RB)
553 #define LHArx(RD,RA,RB)			LHAXrrr(RD,RA,RB)
554 #define LHBRrx(RD,RA,RB)		LHBRXrrr(RD,RA,RB)
555 #define LHZUrx(RD,RA,RB)		LHZUXrrr(RD,RA,RB)
556 #define LHZrx(RD,RA,RB)			LHZXrrr(RD,RA,RB)
557 #define LWBRrx(RD,RA,RB)		LWBRXrrr(RD,RA,RB)
558 #define LWZUrx(RD, RA, RB)		LWZUXrrr(RD, RA, RB)
559 #define LWZrx(RD, RA, RB)		LWZXrrr(RD, RA, RB)
560 #define STBUrx(RD,RA,RB)		STBUXrrr(RD,RA,RB)
561 #define STBrx(RD,RA,RB)			STBXrrr(RD,RA,RB)
562 #define STHBRrx(RS,RA,RB)		STHBRXrrr(RS,RA,RB)
563 #define STHUrx(RS,RA,RB)		STHUXrrr(RS,RA,RB)
564 #define STHrx(RS,RA,RB)			STHXrrr(RS,RA,RB)
565 #define STWBRrx(RS,RA,RB)		STWBRXrrr(RS,RA,RB)
566 #define STWCrx(RS,RA,RB)		STWCXrrr(RS,RA,RB)
567 #define STWCX_rx(RS,RA,RB)		STWCX_rrr(RS,RA,RB)
568 #define STWUrx(RS,RA,RB)		STWUXrrr(RS,RA,RB)
569 #define STWrx(RS,RA,RB)			STWXrrr(RS,RA,RB)
570 #define LArx(RD,RB,RA)			LArrr(RD,RB,RA)
571 
572 
573 /* +++ postfix operators for literal operands */
574 
575 #define _LO(I)          (_UL(I) & _MASK(16))
576 #define _HI(I)          (_UL(I) >>     (16))
577 
578 #define _L(V)		((long)((short)(&V)))
579 #define _HA(V)		( (((long)&V) >> 16) + ((((long)&V) >> 15) & 1) )
580 
581 
582 
583 /*** References:
584  *
585  * [1] "PowerPC Microprocessor Family: The Programming Environments For 32-Bit Microprocessors", Motorola, 1997.
586  */
587 
588 
589 #endif /* __ccg_asm_ppc_h */
590