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