1*55121Storek /* 2*55121Storek * Copyright (c) 1992 The Regents of the University of California. 3*55121Storek * All rights reserved. 4*55121Storek * 5*55121Storek * This software was developed by the Computer Systems Engineering group 6*55121Storek * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and 7*55121Storek * contributed to Berkeley. 8*55121Storek * 9*55121Storek * %sccs.include.redist.c% 10*55121Storek * 11*55121Storek * @(#)instr.h 7.1 (Berkeley) 07/13/92 12*55121Storek * 13*55121Storek * from: $Header: instr.h,v 1.5 92/06/17 06:10:19 torek Exp $ 14*55121Storek */ 15*55121Storek 16*55121Storek /* see also Appendix F of the SPARC version 8 document */ 17*55121Storek enum IOP { IOP_OP2, IOP_CALL, IOP_reg, IOP_mem }; 18*55121Storek enum IOP2 { IOP2_UNIMP, IOP2_err1, IOP2_Bicc, IOP2_err3, 19*55121Storek IOP2_SETHI, IOP2_err5, IOP2_FBfcc, IOP2_CBccc }; 20*55121Storek enum IOP3_reg { 21*55121Storek IOP3_ADD, IOP3_AND, IOP3_OR, IOP3_XOR, 22*55121Storek IOP3_SUB, IOP3_ANDN, IOP3_ORN, IOP3_XNOR, 23*55121Storek IOP3_ADDX, IOP3_rerr09, IOP3_UMUL, IOP3_SMUL, 24*55121Storek IOP3_SUBX, IOP3_rerr0d, IOP3_UDIV, IOP3_SDIV, 25*55121Storek IOP3_ADDcc, IOP3_ANDcc, IOP3_ORcc, IOP3_XORcc, 26*55121Storek IOP3_SUBcc, IOP3_ANDNcc, IOP3_ORNcc, IOP3_XNORcc, 27*55121Storek IOP3_ADDXcc, IOP3_rerr19, IOP3_UMULcc, IOP3_SMULcc, 28*55121Storek IOP3_SUBXcc, IOP3_rerr1d, IOP3_UDIVcc, IOP3_SDIVcc, 29*55121Storek IOP3_TADDcc, IOP3_TSUBcc, IOP3_TADDccTV, IOP3_TSUBccTV, 30*55121Storek IOP3_MULScc, IOP3_SLL, IOP3_SRL, IOP3_SRA, 31*55121Storek IOP3_RDASR_RDY_STBAR, IOP3_RDPSR, IOP3_RDWIM, IOP3_RDTGBR, 32*55121Storek IOP3_rerr2c, IOP3_rerr2d, IOP3_rerr2e, IOP3_rerr2f, 33*55121Storek IOP3_WRASR_WRY, IOP3_WRPSR, IOP3_WRWIM, IOP3_WRTBR, 34*55121Storek IOP3_FPop1, IOP3_FPop2, IOP3_CPop1, IOP3_CPop2, 35*55121Storek IOP3_JMPL, IOP3_RETT, IOP3_Ticc, IOP3_FLUSH, 36*55121Storek IOP3_SAVE, IOP3_RESTORE, IOP3_rerr3e, IOP3_rerr3f 37*55121Storek }; 38*55121Storek enum IOP3_mem { 39*55121Storek IOP3_LD, IOP3_LDUB, IOP3_LDUH, IOP3_LDD, 40*55121Storek IOP3_ST, IOP3_STB, IOP3_STH, IOP3_STD, 41*55121Storek IOP3_merr08, IOP3_LDSB, IOP3_LDSH, IOP3_merr0b, 42*55121Storek IOP3_merr0c, IOP3_LDSTUB, IOP3_merr0f, IOP3_SWAP, 43*55121Storek IOP3_LDA, IOP3_LDUBA, IOP3_LDUHA, IOP3_LDDA, 44*55121Storek IOP3_STA, IOP3_STBA, IOP3_STHA, IOP3_STDA, 45*55121Storek IOP3_merr18, IOP3_LDSBA, IOP3_LDSHA, IOP3_merr1b, 46*55121Storek IOP3_merr1c, IOP3_LDSTUBA, IOP3_merr1f, IOP3_SWAPA, 47*55121Storek IOP3_LDF, IOP3_LDFSR, IOP3_merr22, IOP3_LDDF, 48*55121Storek IOP3_STF, IOP3_STFSR, IOP3_STDFQ, IOP3_STDF, 49*55121Storek IOP3_merr28, IOP3_merr29, IOP3_merr2a, IOP3_merr2b, 50*55121Storek IOP3_merr2c, IOP3_merr2d, IOP3_merr2e, IOP3_merr2f, 51*55121Storek IOP3_LFC, IOP3_LDCSR, IOP3_merr32, IOP3_LDDC, 52*55121Storek IOP3_STC, IOP3_STCSR, IOP3_STDCQ, IOP3_STDC, 53*55121Storek IOP3_merr38, IOP3_merr39, IOP3_merr3a, IOP3_merr3b, 54*55121Storek IOP3_merr3c, IOP3_merr3d, IOP3_merr3e, IOP3_merr3f 55*55121Storek }; 56*55121Storek 57*55121Storek /* 58*55121Storek * Integer condition codes. 59*55121Storek */ 60*55121Storek #define Icc_N 0x0 /* never */ 61*55121Storek #define Icc_E 0x1 /* equal (equiv. zero) */ 62*55121Storek #define Icc_LE 0x2 /* less or equal */ 63*55121Storek #define Icc_L 0x3 /* less */ 64*55121Storek #define Icc_LEU 0x4 /* less or equal unsigned */ 65*55121Storek #define Icc_CS 0x5 /* carry set (equiv. less unsigned) */ 66*55121Storek #define Icc_NEG 0x6 /* negative */ 67*55121Storek #define Icc_VS 0x7 /* overflow set */ 68*55121Storek #define Icc_A 0x8 /* always */ 69*55121Storek #define Icc_NE 0x9 /* not equal (equiv. not zero) */ 70*55121Storek #define Icc_G 0xa /* greater */ 71*55121Storek #define Icc_GE 0xb /* greater or equal */ 72*55121Storek #define Icc_GU 0xc /* greater unsigned */ 73*55121Storek #define Icc_CC 0xd /* carry clear (equiv. gtr or eq unsigned) */ 74*55121Storek #define Icc_POS 0xe /* positive */ 75*55121Storek #define Icc_VC 0xf /* overflow clear */ 76*55121Storek 77*55121Storek /* 78*55121Storek * Integer registers. 79*55121Storek */ 80*55121Storek #define I_G0 0 81*55121Storek #define I_G1 1 82*55121Storek #define I_G2 2 83*55121Storek #define I_G3 3 84*55121Storek #define I_G4 4 85*55121Storek #define I_G5 5 86*55121Storek #define I_G6 6 87*55121Storek #define I_G7 7 88*55121Storek #define I_O0 8 89*55121Storek #define I_O1 9 90*55121Storek #define I_O2 10 91*55121Storek #define I_O3 11 92*55121Storek #define I_O4 12 93*55121Storek #define I_O5 13 94*55121Storek #define I_O6 14 95*55121Storek #define I_O7 15 96*55121Storek #define I_L0 16 97*55121Storek #define I_L1 17 98*55121Storek #define I_L2 18 99*55121Storek #define I_L3 19 100*55121Storek #define I_L4 20 101*55121Storek #define I_L5 21 102*55121Storek #define I_L6 22 103*55121Storek #define I_L7 23 104*55121Storek #define I_I0 24 105*55121Storek #define I_I1 25 106*55121Storek #define I_I2 26 107*55121Storek #define I_I3 27 108*55121Storek #define I_I4 28 109*55121Storek #define I_I5 29 110*55121Storek #define I_I6 30 111*55121Storek #define I_I7 31 112*55121Storek 113*55121Storek /* 114*55121Storek * An instruction. 115*55121Storek */ 116*55121Storek union instr { 117*55121Storek int i_int; /* as a whole */ 118*55121Storek 119*55121Storek /* 120*55121Storek * The first level of decoding is to use the top 2 bits. 121*55121Storek * This gives us one of three `formats', which usually give 122*55121Storek * a second level of decoding. 123*55121Storek */ 124*55121Storek struct { 125*55121Storek u_int i_op:2; /* first-level decode */ 126*55121Storek u_int :30; 127*55121Storek } i_any; 128*55121Storek 129*55121Storek /* 130*55121Storek * Format 1 instructions: CALL (undifferentiated). 131*55121Storek */ 132*55121Storek struct { 133*55121Storek u_int :2; /* 01 */ 134*55121Storek int i_disp:30; /* displacement */ 135*55121Storek } i_call; 136*55121Storek 137*55121Storek /* 138*55121Storek * Format 2 instructions (SETHI, UNIMP, and branches, plus illegal 139*55121Storek * unused codes). 140*55121Storek */ 141*55121Storek struct { 142*55121Storek u_int :2; /* 00 */ 143*55121Storek u_int :5; 144*55121Storek u_int i_op2:3; /* second-level decode */ 145*55121Storek u_int :22; 146*55121Storek } i_op2; 147*55121Storek 148*55121Storek /* UNIMP, SETHI */ 149*55121Storek struct { 150*55121Storek u_int :2; /* 00 */ 151*55121Storek u_int i_rd:5; /* destination register */ 152*55121Storek u_int i_op2:3; /* opcode: UNIMP or SETHI */ 153*55121Storek u_int i_imm:22; /* immediate value */ 154*55121Storek } i_imm22; 155*55121Storek 156*55121Storek /* branches: Bicc, FBfcc, CBccc */ 157*55121Storek struct { 158*55121Storek u_int :2; /* 00 */ 159*55121Storek u_int i_annul:1; /* annul bit */ 160*55121Storek u_int i_cond:4; /* condition codes */ 161*55121Storek u_int i_op2:3; /* opcode: {Bi,FBf,CBc}cc */ 162*55121Storek int i_disp:22; /* branch displacement */ 163*55121Storek } i_branch; 164*55121Storek 165*55121Storek /* 166*55121Storek * Format 3 instructions (memory reference; arithmetic, logical, 167*55121Storek * shift, and other miscellaneous operations). The second-level 168*55121Storek * decode almost always makes use of an `rd' and `rs1', however 169*55121Storek * (see also IOP3_reg and IOP3_mem). 170*55121Storek * 171*55121Storek * Beyond that, the low 14 bits may be broken up in one of three 172*55121Storek * different ways, if at all: 173*55121Storek * 1 bit of imm=0 + 8 bits of asi + 5 bits of rs2 [reg & mem] 174*55121Storek * 1 bit of imm=1 + 13 bits of signed immediate [reg & mem] 175*55121Storek * 9 bits of copressor `opf' opcode + 5 bits of rs2 [reg only] 176*55121Storek */ 177*55121Storek struct { 178*55121Storek u_int :2; /* 10 or 11 */ 179*55121Storek u_int i_rd:5; /* destination register */ 180*55121Storek u_int i_op3:6; /* second-level decode */ 181*55121Storek u_int i_rs1:5; /* source register 1 */ 182*55121Storek u_int i_low14:14; /* varies */ 183*55121Storek } i_op3; 184*55121Storek 185*55121Storek /* 186*55121Storek * Memory forms. These set i_op=3 and use simm13 or asi layout. 187*55121Storek * Memory references without an ASI should use 0, but the actual 188*55121Storek * ASI field is simply ignored. 189*55121Storek */ 190*55121Storek struct { 191*55121Storek u_int :2; /* 11 only */ 192*55121Storek u_int i_rd:5; /* destination register */ 193*55121Storek u_int i_op3:6; /* second-level decode (see IOP3_mem) */ 194*55121Storek u_int i_i:1; /* immediate vs asi */ 195*55121Storek u_int i_low13:13; /* depend on i bit */ 196*55121Storek } i_loadstore; 197*55121Storek 198*55121Storek /* 199*55121Storek * Memory and register forms. 200*55121Storek * These come in quite a variety and we do not 201*55121Storek * attempt to break them down much. 202*55121Storek */ 203*55121Storek struct { 204*55121Storek u_int :2; /* 10 or 11 */ 205*55121Storek u_int i_rd:5; /* destination register */ 206*55121Storek u_int i_op3:6; /* second-level decode */ 207*55121Storek u_int i_rs1:5; /* source register 1 */ 208*55121Storek u_int i_i:1; /* immediate bit (1) */ 209*55121Storek int i_simm13:13; /* signed immediate */ 210*55121Storek } i_simm13; 211*55121Storek struct { 212*55121Storek u_int :2; /* 10 or 11 */ 213*55121Storek u_int i_rd:5; /* destination register */ 214*55121Storek u_int i_op3:6; /* second-level decode */ 215*55121Storek u_int i_rs1:5; /* source register 1 */ 216*55121Storek u_int i_asi:8; /* asi */ 217*55121Storek u_int i_rs2:5; /* source register 2 */ 218*55121Storek } i_asi; 219*55121Storek struct { 220*55121Storek u_int :2; /* 10 only (register, no memory) */ 221*55121Storek u_int i_rd:5; /* destination register */ 222*55121Storek u_int i_op3:6; /* second-level decode (see IOP3_reg) */ 223*55121Storek u_int i_rs1:5; /* source register 1 */ 224*55121Storek u_int i_opf:9; /* coprocessor 3rd-level decode */ 225*55121Storek u_int i_rs2:5; /* source register 2 */ 226*55121Storek } i_opf; 227*55121Storek 228*55121Storek }; 229*55121Storek 230*55121Storek /* 231*55121Storek * Internal macros for building instructions. These correspond 1-to-1 to 232*55121Storek * the names above. Note that x << y | z == (x << y) | z. 233*55121Storek */ 234*55121Storek #define _I_ANY(op, b) ((op) << 30 | (b)) 235*55121Storek 236*55121Storek #define _I_OP2(high, op2, low) \ 237*55121Storek _I_ANY(IOP_OP2, (high) << 25 | (op2) << 22 | (low)) 238*55121Storek #define _I_IMM22(rd, op2, imm) \ 239*55121Storek _I_ANY(IOP_OP2, (rd) << 25 | (op2) << 22 | (imm)) 240*55121Storek #define _I_BRANCH(a, c, op2, disp) \ 241*55121Storek _I_ANY(IOP_OP2, (a) << 29 | (c) << 25 | (op2) << 22 | (disp)) 242*55121Storek #define _I_FBFCC(a, cond, disp) \ 243*55121Storek _I_BRANCH(a, cond, IOP2_FBfcc, disp) 244*55121Storek #define _I_CBCCC(a, cond, disp) \ 245*55121Storek _I_BRANCH(a, cond, IOP2_CBccc, disp) 246*55121Storek 247*55121Storek #define _I_SIMM(simm) (1 << 13 | ((simm) & 0x1fff)) 248*55121Storek 249*55121Storek #define _I_OP3_GEN(form, rd, op3, rs1, low14) \ 250*55121Storek _I_ANY(form, (rd) << 25 | (op3) << 19 | (rs1) << 14 | (low14)) 251*55121Storek #define _I_OP3_LS_RAR(rd, op3, rs1, asi, rs2) \ 252*55121Storek _I_OP3_GEN(IOP_mem, rd, op3, rs1, (asi) << 5 | (rs2)) 253*55121Storek #define _I_OP3_LS_RI(rd, op3, rs1, simm13) \ 254*55121Storek _I_OP3_GEN(IOP_mem, rd, op3, rs1, _I_SIMM(simm13)) 255*55121Storek #define _I_OP3_LS_RR(rd, op3, rs1, rs2) \ 256*55121Storek _I_OP3_GEN(IOP_mem, rd, op3, rs1, rs2) 257*55121Storek #define _I_OP3_R_RAR(rd, op3, rs1, asi, rs2) \ 258*55121Storek _I_OP3_GEN(IOP_reg, rd, op3, rs1, (asi) << 5 | (rs2)) 259*55121Storek #define _I_OP3_R_RI(rd, op3, rs1, simm13) \ 260*55121Storek _I_OP3_GEN(IOP_reg, rd, op3, rs1, _I_SIMM(simm13)) 261*55121Storek #define _I_OP3_R_RR(rd, op3, rs1, rs2) \ 262*55121Storek _I_OP3_GEN(IOP_reg, rd, op3, rs1, rs2) 263*55121Storek 264*55121Storek #define I_CALL(d) _I_ANY(IOP_CALL, d) 265*55121Storek #define I_UNIMP(v) _I_IMM22(0, IOP2_UNIMP, v) 266*55121Storek #define I_BN(a, d) _I_BRANCH(a, Icc_N, IOP2_Bicc, d) 267*55121Storek #define I_BE(a, d) _I_BRANCH(a, Icc_E, IOP2_Bicc, d) 268*55121Storek #define I_BZ(a, d) _I_BRANCH(a, Icc_E, IOP2_Bicc, d) 269*55121Storek #define I_BLE(a, d) _I_BRANCH(a, Icc_LE, IOP2_Bicc, d) 270*55121Storek #define I_BL(a, d) _I_BRANCH(a, Icc_L, IOP2_Bicc, d) 271*55121Storek #define I_BLEU(a, d) _I_BRANCH(a, Icc_LEU, IOP2_Bicc, d) 272*55121Storek #define I_BCS(a, d) _I_BRANCH(a, Icc_CS, IOP2_Bicc, d) 273*55121Storek #define I_BLU(a, d) _I_BRANCH(a, Icc_CS, IOP2_Bicc, d) 274*55121Storek #define I_BNEG(a, d) _I_BRANCH(a, Icc_NEG, IOP2_Bicc, d) 275*55121Storek #define I_BVS(a, d) _I_BRANCH(a, Icc_VS, IOP2_Bicc, d) 276*55121Storek #define I_BA(a, d) _I_BRANCH(a, Icc_A, IOP2_Bicc, d) 277*55121Storek #define I_B(a, d) _I_BRANCH(a, Icc_A, IOP2_Bicc, d) 278*55121Storek #define I_BNE(a, d) _I_BRANCH(a, Icc_NE, IOP2_Bicc, d) 279*55121Storek #define I_BNZ(a, d) _I_BRANCH(a, Icc_NE, IOP2_Bicc, d) 280*55121Storek #define I_BG(a, d) _I_BRANCH(a, Icc_G, IOP2_Bicc, d) 281*55121Storek #define I_BGE(a, d) _I_BRANCH(a, Icc_GE, IOP2_Bicc, d) 282*55121Storek #define I_BGU(a, d) _I_BRANCH(a, Icc_GU, IOP2_Bicc, d) 283*55121Storek #define I_BCC(a, d) _I_BRANCH(a, Icc_CC, IOP2_Bicc, d) 284*55121Storek #define I_BGEU(a, d) _I_BRANCH(a, Icc_CC, IOP2_Bicc, d) 285*55121Storek #define I_BPOS(a, d) _I_BRANCH(a, Icc_POS, IOP2_Bicc, d) 286*55121Storek #define I_BVC(a, d) _I_BRANCH(a, Icc_VC, IOP2_Bicc, d) 287*55121Storek #define I_SETHI(r, v) _I_IMM22(r, 4, v) 288*55121Storek 289*55121Storek #define I_ORri(rd, rs1, imm) _I_OP3_R_RI(rd, IOP3_OR, rs1, imm) 290*55121Storek #define I_ORrr(rd, rs1, rs2) _I_OP3_R_RR(rd, IOP3_OR, rs1, rs2) 291*55121Storek 292*55121Storek #define I_MOVi(rd, imm) _I_OP3_R_RI(rd, IOP3_OR, I_G0, imm) 293*55121Storek #define I_MOVr(rd, rs) _I_OP3_R_RR(rd, IOP3_OR, I_G0, rs) 294*55121Storek 295*55121Storek #define I_RDPSR(rd) _I_OP3_R_RR(rd, IOP3_RDPSR, 0, 0) 296*55121Storek 297*55121Storek #define I_JMPLri(rd, rs1, imm) _I_OP3_R_RI(rd, IOP3_JMPL, rs1, imm) 298*55121Storek #define I_JMPLrr(rd, rs1, rs2) _I_OP3_R_RR(rd, IOP3_JMPL, rs1, rs2) 299*55121Storek 300*55121Storek /* 301*55121Storek * (Since these are sparse, we skip the enumerations for now.) 302*55121Storek * FPop values. All appear in both FPop1 and FPop2 spaces, but arithmetic 303*55121Storek * ops should happen only with FPop1 and comparison only with FPop2. 304*55121Storek * The type sits in the low two bits; those bits are given as zero here. 305*55121Storek */ 306*55121Storek #define FMOV 0x00 307*55121Storek #define FNEG 0x04 308*55121Storek #define FABS 0x08 309*55121Storek #define FSQRT 0x28 310*55121Storek #define FADD 0x40 311*55121Storek #define FSUB 0x44 312*55121Storek #define FMUL 0x48 313*55121Storek #define FDIV 0x4c 314*55121Storek #define FCMP 0x50 315*55121Storek #define FCMPE 0x54 316*55121Storek #define FSMULD 0x68 317*55121Storek #define FDMULX 0x6c 318*55121Storek #define FTOS 0xc4 319*55121Storek #define FTOD 0xc8 320*55121Storek #define FTOX 0xcc 321*55121Storek #define FTOI 0xd0 322*55121Storek 323*55121Storek /* 324*55121Storek * FPU data types. 325*55121Storek */ 326*55121Storek #define FTYPE_INT 0 /* data = 32-bit signed integer */ 327*55121Storek #define FTYPE_SNG 1 /* data = 32-bit float */ 328*55121Storek #define FTYPE_DBL 2 /* data = 64-bit double */ 329*55121Storek #define FTYPE_EXT 3 /* data = 128-bit extended (quad-prec) */ 330