1 1.12 rin /* $NetBSD: instr.h,v 1.12 2022/08/30 11:05:59 rin Exp $ */ 2 1.1 simonb 3 1.1 simonb /* 4 1.1 simonb * Copyright (c) 1992, 1993 5 1.1 simonb * The Regents of the University of California. All rights reserved. 6 1.1 simonb * 7 1.1 simonb * This software was developed by the Computer Systems Engineering group 8 1.1 simonb * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and 9 1.1 simonb * contributed to Berkeley. 10 1.1 simonb * 11 1.1 simonb * All advertising materials mentioning features or use of this software 12 1.1 simonb * must display the following acknowledgement: 13 1.1 simonb * This product includes software developed by the University of 14 1.1 simonb * California, Lawrence Berkeley Laboratory. 15 1.1 simonb * 16 1.1 simonb * Redistribution and use in source and binary forms, with or without 17 1.1 simonb * modification, are permitted provided that the following conditions 18 1.1 simonb * are met: 19 1.1 simonb * 1. Redistributions of source code must retain the above copyright 20 1.1 simonb * notice, this list of conditions and the following disclaimer. 21 1.1 simonb * 2. Redistributions in binary form must reproduce the above copyright 22 1.1 simonb * notice, this list of conditions and the following disclaimer in the 23 1.1 simonb * documentation and/or other materials provided with the distribution. 24 1.2 agc * 3. Neither the name of the University nor the names of its contributors 25 1.1 simonb * may be used to endorse or promote products derived from this software 26 1.1 simonb * without specific prior written permission. 27 1.1 simonb * 28 1.1 simonb * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 29 1.1 simonb * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 30 1.1 simonb * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 31 1.1 simonb * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 32 1.1 simonb * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 33 1.1 simonb * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 34 1.1 simonb * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 35 1.1 simonb * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 36 1.1 simonb * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 37 1.1 simonb * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 38 1.1 simonb * SUCH DAMAGE. 39 1.1 simonb * 40 1.1 simonb * @(#)instr.h 8.1 (Berkeley) 6/11/93 41 1.1 simonb */ 42 1.1 simonb 43 1.5 matt #ifndef _POWERPC_INSTR_H_ 44 1.5 matt #define _POWERPC_INSTR_H_ 45 1.5 matt 46 1.1 simonb /* 47 1.1 simonb * An instruction. 48 1.1 simonb */ 49 1.1 simonb union instr { 50 1.1 simonb int i_int; /* as a whole */ 51 1.1 simonb 52 1.1 simonb 53 1.1 simonb /* 54 1.1 simonb * Any instruction type. 55 1.1 simonb */ 56 1.1 simonb struct { 57 1.1 simonb u_int i_opcd:6; /* first-level decode */ 58 1.1 simonb u_int :25; 59 1.1 simonb u_int i_rc:1; 60 1.1 simonb } i_any; 61 1.1 simonb 62 1.1 simonb /* 63 1.1 simonb * Format A 64 1.1 simonb */ 65 1.1 simonb struct { 66 1.1 simonb u_int i_opcd:6; 67 1.1 simonb u_int i_frt:5; 68 1.1 simonb u_int i_fra:5; 69 1.1 simonb u_int i_frb:5; 70 1.1 simonb u_int i_frc:5; 71 1.1 simonb u_int i_xo:5; 72 1.1 simonb u_int i_rc:1; 73 1.1 simonb } i_a; 74 1.1 simonb 75 1.1 simonb /* 76 1.1 simonb * Format B 77 1.1 simonb */ 78 1.1 simonb struct { 79 1.1 simonb u_int i_opcd:6; 80 1.5 matt u_int i_bo:5; 81 1.5 matt u_int i_bi:5; 82 1.1 simonb int i_bd:14; 83 1.5 matt u_int i_aa:1; 84 1.5 matt u_int i_lk:1; 85 1.1 simonb } i_b; 86 1.1 simonb 87 1.1 simonb /* 88 1.1 simonb * Format D 89 1.1 simonb */ 90 1.1 simonb struct { 91 1.1 simonb u_int i_opcd:6; 92 1.1 simonb u_int i_rs:5; 93 1.1 simonb u_int i_ra:5; 94 1.1 simonb int i_d:16; 95 1.1 simonb } i_d; 96 1.1 simonb 97 1.1 simonb /* 98 1.1 simonb * Format DE 99 1.1 simonb */ 100 1.1 simonb struct { 101 1.1 simonb u_int i_opcd:6; 102 1.1 simonb u_int i_rs:5; 103 1.1 simonb u_int i_ra:5; 104 1.1 simonb int i_d:12; 105 1.1 simonb u_int i_xo:4; 106 1.1 simonb } i_de; 107 1.1 simonb 108 1.1 simonb /* 109 1.1 simonb * Format I 110 1.1 simonb */ 111 1.1 simonb struct { 112 1.1 simonb u_int i_opcd:6; 113 1.1 simonb int i_li:24; 114 1.1 simonb int i_aa:1; 115 1.1 simonb int i_lk:1; 116 1.1 simonb } i_i; 117 1.1 simonb 118 1.1 simonb /* 119 1.1 simonb * Format M 120 1.1 simonb */ 121 1.1 simonb struct { 122 1.1 simonb u_int i_opcd:6; 123 1.1 simonb u_int i_rs:5; 124 1.1 simonb u_int i_ra:5; 125 1.1 simonb u_int i_rb:5; 126 1.1 simonb int i_mb:5; 127 1.1 simonb int i_me:5; 128 1.1 simonb u_int i_rc:1; 129 1.1 simonb } i_m; 130 1.1 simonb 131 1.1 simonb /* 132 1.1 simonb * Format MD 133 1.1 simonb */ 134 1.1 simonb struct { 135 1.1 simonb u_int i_opcd:6; 136 1.1 simonb u_int i_rs:5; 137 1.1 simonb u_int i_ra:5; 138 1.1 simonb int i_sh1_5:5; 139 1.1 simonb int i_mb:6; 140 1.1 simonb u_int i_xo:3; 141 1.10 rin int i_sh0:1; 142 1.1 simonb u_int i_rc:1; 143 1.1 simonb } i_md; 144 1.1 simonb 145 1.1 simonb /* 146 1.1 simonb * Format MDS 147 1.1 simonb */ 148 1.1 simonb struct { 149 1.1 simonb u_int i_opcd:6; 150 1.1 simonb u_int i_rs:5; 151 1.1 simonb u_int i_ra:5; 152 1.1 simonb u_int i_rb:5; 153 1.1 simonb int i_mb:6; 154 1.1 simonb u_int i_xo:4; 155 1.1 simonb u_int i_rc:1; 156 1.1 simonb } i_mds; 157 1.1 simonb 158 1.1 simonb 159 1.1 simonb /* 160 1.1 simonb * Format S 161 1.1 simonb */ 162 1.1 simonb struct { 163 1.1 simonb u_int i_opcd:6; 164 1.1 simonb int :24; 165 1.1 simonb int i_i:1; 166 1.1 simonb int :1; 167 1.1 simonb } i_s; 168 1.1 simonb 169 1.1 simonb /* 170 1.1 simonb * Format X 171 1.1 simonb */ 172 1.1 simonb struct { 173 1.1 simonb u_int i_opcd:6; 174 1.1 simonb u_int i_rs:5; 175 1.1 simonb u_int i_ra:5; 176 1.1 simonb u_int i_rb:5; 177 1.1 simonb u_int i_xo:10; 178 1.1 simonb u_int i_rc:1; 179 1.1 simonb } i_x; 180 1.1 simonb 181 1.1 simonb /* 182 1.1 simonb * Format XFL 183 1.1 simonb */ 184 1.1 simonb struct { 185 1.1 simonb u_int i_opcd:6; 186 1.1 simonb int :1; 187 1.1 simonb int i_flm:8; 188 1.1 simonb int :1; 189 1.1 simonb int i_frb:5; 190 1.1 simonb u_int i_xo:10; 191 1.1 simonb int :1; 192 1.1 simonb } i_xfl; 193 1.1 simonb 194 1.1 simonb /* 195 1.1 simonb * Format XFX 196 1.1 simonb */ 197 1.1 simonb struct { 198 1.1 simonb u_int i_opcd:6; 199 1.1 simonb int i_dcrn:10; 200 1.1 simonb u_int i_xo:10; 201 1.1 simonb int :1; 202 1.1 simonb } i_xfx; 203 1.1 simonb 204 1.1 simonb /* 205 1.1 simonb * Format XL 206 1.1 simonb */ 207 1.1 simonb struct { 208 1.1 simonb u_int i_opcd:6; 209 1.1 simonb int i_bt:5; 210 1.1 simonb int i_ba:5; 211 1.1 simonb int i_bb:5; 212 1.1 simonb u_int i_xo:10; 213 1.1 simonb int i_lk:1; 214 1.1 simonb } i_xl; 215 1.1 simonb 216 1.1 simonb /* 217 1.1 simonb * Format XS 218 1.1 simonb */ 219 1.1 simonb struct { 220 1.1 simonb u_int i_opcd:6; 221 1.1 simonb u_int i_rs:5; 222 1.1 simonb u_int i_ra:5; 223 1.1 simonb int i_sh0_4:5; 224 1.1 simonb u_int i_xo:9; 225 1.1 simonb int i_sh5:1; 226 1.1 simonb u_int i_rc:1; 227 1.1 simonb } i_xs; 228 1.1 simonb 229 1.1 simonb }; 230 1.1 simonb 231 1.1 simonb #define i_rt i_rs 232 1.1 simonb 233 1.1 simonb /* 234 1.1 simonb * Primary opcode numbers: 235 1.1 simonb */ 236 1.1 simonb 237 1.1 simonb #define OPC_TDI 0x02 238 1.1 simonb #define OPC_TWI 0x03 239 1.1 simonb #define OPC_MULLI 0x07 240 1.1 simonb #define OPC_SUBFIC 0x08 241 1.1 simonb #define OPC_BCE 0x09 242 1.1 simonb #define OPC_CMPLI 0x0a 243 1.1 simonb #define OPC_CMPI 0x0b 244 1.1 simonb #define OPC_ADDIC 0x0c 245 1.1 simonb #define OPC_ADDIC_DOT 0x0d 246 1.1 simonb #define OPC_ADDI 0x0e 247 1.1 simonb #define OPC_ADDIS 0x0f 248 1.1 simonb #define OPC_BC 0x10 249 1.1 simonb #define OPC_SC 0x11 250 1.1 simonb #define OPC_B 0x12 251 1.1 simonb #define OPC_branch_19 0x13 252 1.1 simonb #define OPC_RLWIMI 0x14 253 1.1 simonb #define OPC_RLWINM 0x15 254 1.1 simonb #define OPC_BE 0x16 255 1.1 simonb #define OPC_RLWNM 0x17 256 1.1 simonb #define OPC_ORI 0x18 257 1.1 simonb #define OPC_ORIS 0x19 258 1.1 simonb #define OPC_XORI 0x1a 259 1.1 simonb #define OPC_XORIS 0x1b 260 1.1 simonb #define OPC_ANDI 0x1c 261 1.1 simonb #define OPC_ANDIS 0x1d 262 1.1 simonb #define OPC_dwe_rot_30 0x1e 263 1.1 simonb #define OPC_integer_31 0x1f 264 1.1 simonb #define OPC_LWZ 0x20 265 1.1 simonb #define OPC_LWZU 0x21 266 1.1 simonb #define OPC_LBZ 0x22 267 1.1 simonb #define OPC_LBZU 0x23 268 1.1 simonb #define OPC_STW 0x24 269 1.1 simonb #define OPC_STWU 0x25 270 1.1 simonb #define OPC_STB 0x26 271 1.1 simonb #define OPC_STBU 0x27 272 1.1 simonb #define OPC_LHZ 0x28 273 1.1 simonb #define OPC_LHZU 0x29 274 1.1 simonb #define OPC_LHA 0x2a 275 1.1 simonb #define OPC_LHAU 0x2b 276 1.1 simonb #define OPC_STH 0x2c 277 1.1 simonb #define OPC_STHU 0x2d 278 1.1 simonb #define OPC_LMW 0x2e 279 1.1 simonb #define OPC_STMW 0x2f 280 1.1 simonb #define OPC_LFS 0x30 281 1.1 simonb #define OPC_LFSU 0x31 282 1.1 simonb #define OPC_LFD 0x32 283 1.1 simonb #define OPC_LFDU 0x33 284 1.1 simonb #define OPC_STFS 0x34 285 1.1 simonb #define OPC_STFSU 0x35 286 1.1 simonb #define OPC_STFD 0x36 287 1.1 simonb #define OPC_STFDU 0x37 288 1.1 simonb #define OPC_load_st_58 0x3a 289 1.1 simonb #define OPC_sp_fp_59 0x3b 290 1.1 simonb #define OPC_load_st_62 0x3e 291 1.1 simonb #define OPC_dp_fp_63 0x3f 292 1.1 simonb 293 1.1 simonb /* 294 1.1 simonb * Opcode 31 sub-types (FP only) 295 1.1 simonb */ 296 1.1 simonb #define OPC31_TW 0x004 297 1.1 simonb #define OPC31_LFSX 0x217 298 1.1 simonb #define OPC31_LFSUX 0x237 299 1.1 simonb #define OPC31_LFDX 0x257 300 1.1 simonb #define OPC31_LFDUX 0x277 301 1.1 simonb #define OPC31_STFSX 0x297 302 1.1 simonb #define OPC31_STFSUX 0x2b7 303 1.1 simonb #define OPC31_STFDX 0x2d7 304 1.1 simonb #define OPC31_STFDUX 0x2f7 305 1.1 simonb #define OPC31_STFIWX 0x3d7 306 1.1 simonb 307 1.1 simonb /* Mask for all valid indexed FP load/store ops (except stfiwx) */ 308 1.1 simonb #define OPC31_FPMASK 0x31f 309 1.1 simonb #define OPC31_FPOP 0x217 310 1.1 simonb 311 1.5 matt /* m[ft]spr are also opcode 31; ra/rb encode the spr */ 312 1.5 matt #define OPC31_MFSPR 0x153 313 1.5 matt #define OPC31_MTSPR 0x1d3 314 1.5 matt 315 1.1 simonb /* 316 1.7 matt * Opcode 31 sub-types (integer only) 317 1.7 matt */ 318 1.7 matt #define OPC31_OR 0x1bc 319 1.7 matt 320 1.7 matt /* 321 1.11 rin * Opcode 31 sub-types (load/store multiple bytes) 322 1.11 rin */ 323 1.11 rin #define OPC31_LWZX 0x017 324 1.11 rin #define OPC31_LWZUX 0x037 325 1.11 rin #define OPC31_STWX 0x097 326 1.11 rin #define OPC31_STWUX 0x0b7 327 1.11 rin #define OPC31_LHZX 0x117 328 1.11 rin #define OPC31_LHZUX 0x137 329 1.11 rin #define OPC31_LHAX 0x157 330 1.11 rin #define OPC31_LHAUX 0x177 331 1.11 rin #define OPC31_STHX 0x197 332 1.11 rin #define OPC31_STHUX 0x1b7 333 1.11 rin #define OPC31_LWBRX 0x216 334 1.11 rin #define OPC31_STWBRX 0x296 335 1.11 rin #define OPC31_LHBRX 0x316 336 1.11 rin #define OPC31_STHBRX 0x396 337 1.11 rin 338 1.11 rin /* 339 1.1 simonb * Opcode 59 sub-types: 340 1.1 simonb */ 341 1.1 simonb 342 1.1 simonb #define OPC59_FDIVS 0x12 343 1.1 simonb #define OPC59_FSUBS 0x14 344 1.1 simonb #define OPC59_FADDS 0x15 345 1.1 simonb #define OPC59_FSQRTS 0x16 346 1.1 simonb #define OPC59_FRES 0x18 347 1.1 simonb #define OPC59_FMULS 0x19 348 1.1 simonb #define OPC59_FMSUBS 0x1c 349 1.1 simonb #define OPC59_FMADDS 0x1d 350 1.1 simonb #define OPC59_FNMSUBS 0x1e 351 1.1 simonb #define OPC59_FNMADDS 0x1f 352 1.1 simonb 353 1.1 simonb /* 354 1.1 simonb * Opcode 62 sub-types: 355 1.1 simonb */ 356 1.1 simonb #define OPC62_LDE 0x0 357 1.1 simonb #define OPC62_LDEU 0x1 358 1.1 simonb #define OPC62_LFSE 0x4 359 1.1 simonb #define OPC62_LFSEU 0x5 360 1.1 simonb #define OPC62_LFDE 0x6 361 1.1 simonb #define OPC62_LFDEU 0x7 362 1.1 simonb #define OPC62_STDE 0x8 363 1.1 simonb #define OPC62_STDEU 0x9 364 1.1 simonb #define OPC62_STFSE 0xc 365 1.1 simonb #define OPC62_STFSEU 0xd 366 1.1 simonb #define OPC62_STFDE 0xe 367 1.1 simonb #define OPC62_STFDEU 0xf 368 1.1 simonb 369 1.1 simonb /* 370 1.1 simonb * Opcode 63 sub-types: 371 1.1 simonb * 372 1.1 simonb * (The first group are masks....) 373 1.1 simonb */ 374 1.1 simonb 375 1.1 simonb #define OPC63M_MASK 0x10 376 1.1 simonb #define OPC63M_FDIV 0x12 377 1.1 simonb #define OPC63M_FSUB 0x14 378 1.1 simonb #define OPC63M_FADD 0x15 379 1.1 simonb #define OPC63M_FSQRT 0x16 380 1.1 simonb #define OPC63M_FSEL 0x17 381 1.1 simonb #define OPC63M_FMUL 0x19 382 1.1 simonb #define OPC63M_FRSQRTE 0x1a 383 1.1 simonb #define OPC63M_FMSUB 0x1c 384 1.1 simonb #define OPC63M_FMADD 0x1d 385 1.1 simonb #define OPC63M_FNMSUB 0x1e 386 1.1 simonb #define OPC63M_FNMADD 0x1f 387 1.1 simonb 388 1.1 simonb #define OPC63_FCMPU 0x00 389 1.1 simonb #define OPC63_FRSP 0x0c 390 1.1 simonb #define OPC63_FCTIW 0x0e 391 1.1 simonb #define OPC63_FCTIWZ 0x0f 392 1.1 simonb #define OPC63_FCMPO 0x20 393 1.1 simonb #define OPC63_MTFSB1 0x26 394 1.1 simonb #define OPC63_FNEG 0x28 395 1.1 simonb #define OPC63_MCRFS 0x40 396 1.1 simonb #define OPC63_MTFSB0 0x46 397 1.1 simonb #define OPC63_FMR 0x48 398 1.1 simonb #define OPC63_MTFSFI 0x86 399 1.1 simonb #define OPC63_FNABS 0x88 400 1.1 simonb #define OPC63_FABS 0x108 401 1.1 simonb #define OPC63_MFFS 0x247 402 1.1 simonb #define OPC63_MTFSF 0x2c7 403 1.1 simonb #define OPC63_FCTID 0x32e 404 1.1 simonb #define OPC63_FCTIDZ 0x32f 405 1.1 simonb #define OPC63_FCFID 0x34e 406 1.1 simonb 407 1.1 simonb /* 408 1.5 matt * Branch instruction modifiers. 409 1.5 matt */ 410 1.5 matt #define B_LK 0x01 /* Link flag (LR=CIA+4) */ 411 1.5 matt #define B_AA 0x02 /* Absolute flag */ 412 1.5 matt 413 1.5 matt /* 414 1.5 matt * Helpers for decoding mfspr 415 1.5 matt */ 416 1.5 matt #define OPC_MFSPR_CODE 0x7c0002a6 417 1.5 matt #define OPC_MFSPR_MASK (~(0x1f << 21)) 418 1.5 matt #define OPC_MFSPR(spr) (OPC_MFSPR_CODE |\ 419 1.5 matt (((spr) & 0x1f) << 16) |\ 420 1.5 matt (((spr) & 0x3e0) << 6)) 421 1.5 matt #define OPC_MFSPR_REG(o) (((o) >> 21) & 0x1f) 422 1.5 matt #define OPC_MFSPR_P(o, spr) (((o) & OPC_MFSPR_MASK) == OPC_MFSPR(spr)) 423 1.5 matt 424 1.5 matt /* 425 1.5 matt * booke doesn't have lwsync even though gcc emits it so we have to emulate it. 426 1.5 matt */ 427 1.5 matt #define OPC_LWSYNC 0x7c2004ac 428 1.5 matt 429 1.5 matt /* 430 1.1 simonb * FPCSR rounding modes. 431 1.1 simonb */ 432 1.1 simonb #define FSR_RD_RN 0 /* round to nearest */ 433 1.1 simonb #define FSR_RD_RZ 1 /* round towards 0 */ 434 1.1 simonb #define FSR_RD_RP 2 /* round towards +inf */ 435 1.1 simonb #define FSR_RD_RM 3 /* round towards -inf */ 436 1.5 matt 437 1.5 matt /* 438 1.5 matt * Convert an address to an offset used in a PowerPC branch instruction. 439 1.5 matt * We simply shift away the low bits since we are going convert the bl 440 1.5 matt * to a bla. 441 1.5 matt */ 442 1.5 matt #define fixup_addr2offset(x) ((uintptr_t)(x) >> 2) 443 1.5 matt struct powerpc_jump_fixup_info { 444 1.5 matt uint32_t jfi_stub; 445 1.5 matt uint32_t jfi_real; 446 1.5 matt }; 447 1.5 matt 448 1.6 matt void powerpc_fixup_stubs(uint32_t *, uint32_t *, uint32_t *, uint32_t *); 449 1.5 matt 450 1.5 matt 451 1.5 matt #endif /* !_POWERPC_INSTR_H_ */ 452