1 //===- LanaiInstrFormats.td - Lanai Instruction Formats ----*- tablegen -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 class InstLanai<dag outs, dag ins, string asmstr, list<dag> pattern> 11 : Instruction { 12 field bits<32> Inst; 13 field bits<32> SoftFail = 0; 14 let Size = 4; 15 16 let Namespace = "Lanai"; 17 let DecoderNamespace = "Lanai"; 18 19 bits<4> Opcode; 20 let Inst{31 - 28} = Opcode; 21 22 dag OutOperandList = outs; 23 dag InOperandList = ins; 24 let AsmString = asmstr; 25 let Pattern = pattern; 26 } 27 28 //------------------------------------------------------------------------------ 29 // Register Immediate (RI) 30 //------------------------------------------------------------------------------ 31 // Encoding: 32 // ----------------------------------------------------------------- 33 // |0.A.A.A| . . . . | . . . . |F.H| . . . . . . . . . . . . . . . | 34 // ----------------------------------------------------------------- 35 // opcode Rd Rs1 constant (16) 36 // 37 // Action: 38 // Rd <- Rs1 op constant 39 // 40 // Except for shift instructions, `H' determines whether the constant 41 // is in the high (1) or low (0) word. The other halfword is 0x0000, 42 // except for the `AND' instruction (`AAA' = 100), for which the other 43 // halfword is 0xFFFF, and shifts (`AAA' = 111), for which the constant is 44 // sign extended. 45 // 46 // `F' determines whether the instruction modifies (1) or does not 47 // modify (0) the program flags. 48 // 49 // `AAA' specifies the operation: `add' (000), `addc' (001), `sub' 50 // (010), `subb' (011), `and' (100), `or' (101), `xor' (110), or `shift' 51 // (111). For the shift, `H' specifies a logical (0) or arithmetic (1) 52 // shift. The amount and direction of the shift are determined by the 53 // sign extended constant interpreted as a two's complement number. The 54 // shift operation is defined only for the range of: 55 // 31 ... 0 -1 ... -31 56 // \ / \ / 57 // left right 58 // shift shift 59 // 60 // If and only if the `F' bit is 1, RI instructions modify the 61 // condition bits, `Z' (Zero), `N' (Negative), `V' (oVerflow), and `C' 62 // (Carry), according to the result. If the flags are updated, they are 63 // updated as follows: 64 // `Z' 65 // is set if the result is zero and cleared otherwise. 66 // 67 // `N' 68 // is set to the most significant bit of the result. 69 // 70 // `V' 71 // For arithmetic instructions (`add', `addc', `sub', `subb') `V' is 72 // set if the sign (most significant) bits of the input operands are 73 // the same but different from the sign bit of the result and cleared 74 // otherwise. For other RI instructions, `V' is cleared. 75 // 76 // `C' 77 // For arithmetic instructions, `C' is set/cleared if there is/is_not 78 // a carry generated out of the most significant when performing the 79 // twos-complement addition (`sub(a,b) == a + ~b + 1', `subb(a,b) == 80 // a + ~b + `C''). For left shifts, `C' is set to the least 81 // significant bit discarded by the shift operation. For all other 82 // operations, `C' is cleared. 83 // 84 // A Jump is accomplished by `Rd' being `pc', and it has one shadow. 85 // 86 // The all-0s word is the instruction `R0 <- R0 + 0', which is a no-op. 87 class InstRI<bits<3> op, dag outs, dag ins, string asmstr, 88 list<dag> pattern> 89 : InstLanai<outs, ins, asmstr, pattern>, Sched<[WriteALU]> { 90 let Itinerary = IIC_ALU; 91 bits<5> Rd; 92 bits<5> Rs1; 93 bit F; 94 bit H; 95 bits<16> imm16; 96 97 let Opcode{3} = 0; 98 let Opcode{2 - 0} = op; 99 let Inst{27 - 23} = Rd; 100 let Inst{22 - 18} = Rs1; 101 let Inst{17} = F; 102 let Inst{16} = H; 103 let Inst{15 - 0} = imm16; 104 } 105 106 //------------------------------------------------------------------------------ 107 // Register Register (RR) 108 //------------------------------------------------------------------------------ 109 // Encoding: 110 // ----------------------------------------------------------------- 111 // |1.1.0.0| . . . . | . . . . |F.I| . . . . |B.B.B|J.J.J.J.J|D.D.D| 112 // ----------------------------------------------------------------- 113 // opcode Rd Rs1 Rs2 \ operation / 114 // 115 // Action: 116 // `Rd <- Rs1 op Rs2' iff condition DDDI is true. 117 // 118 // `DDDI' is as described for the BR instruction. 119 // 120 // `F' determines whether the instruction modifies (1) or does not 121 // modify (0) the program flags. 122 // 123 // `BBB' determines the operation: `add' (000), `addc' (001), `sub' 124 // (010), `subb' (011), `and' (100), `or' (101), `xor' (110), or "special" 125 // (111). The `JJJJJ' field is irrelevant except for special. 126 // 127 // `JJJJJ' determines which special operation is performed. `10---' 128 // is a logical shift, and `11---' is an arithmetic shift, and 00000` is 129 // the SELECT operation. The amount and direction of the shift are 130 // determined by the contents of `Rs2' interpreted as a two's complement 131 // number (in the same way as shifts in the Register-Immediate 132 // instructions in *Note RI::). For the SELECT operation, Rd gets Rs1 if 133 // condition DDDI is true, Rs2 otherwise. All other `JJJJJ' combinations 134 // are reserved for instructions that may be defined in the future. 135 // 136 // If the `F' bit is 1, RR instructions modify the condition bits, `Z' 137 // (Zero), `N' (Negative), `V' (oVerflow), and `C' (Carry), according to 138 // the result. All RR instructions modify the `Z', `N', and `V' flags. 139 // Except for arithmetic instructions (`add', `addc', `sub', `subb'), `V' 140 // is cleared. Only arithmetic instructions and shifts modify `C'. Right 141 // shifts clear C. 142 // 143 // DDDI is as described in the table for the BR instruction and only used for 144 // the select instruction. 145 // 146 // A Jump is accomplished by `Rd' being `pc', and it has one shadow. 147 class InstRR<bits<3> op, dag outs, dag ins, string asmstr, 148 list<dag> pattern> 149 : InstLanai<outs, ins, asmstr, pattern>, Sched<[WriteALU]> { 150 let Itinerary = IIC_ALU; 151 bits<5> Rd; 152 bits<5> Rs1; 153 bits<5> Rs2; 154 bit F; 155 bits<4> DDDI; 156 bits<5> JJJJJ; 157 158 let Opcode = 0b1100; 159 let Inst{27 - 23} = Rd; 160 let Inst{22 - 18} = Rs1; 161 let Inst{17} = F; 162 let Inst{16} = DDDI{0}; 163 let Inst{15 - 11} = Rs2; 164 let Inst{10 - 8} = op; 165 let Inst{7 - 3} = JJJJJ; 166 let Inst{2 - 0} = DDDI{3 - 1}; 167 } 168 169 //------------------------------------------------------------------------------ 170 // Register Memory (RM) 171 //------------------------------------------------------------------------------ 172 // Encoding: 173 // ----------------------------------------------------------------- 174 // |1.0.0.S| . . . . | . . . . |P.Q| . . . . . . . . . . . . . . . | 175 // ----------------------------------------------------------------- 176 // opcode Rd Rs1 constant (16) 177 // 178 // Action: 179 // Rd <- Memory(ea) (Load) see below for the 180 // Memory(ea) <- Rd (Store) definition of ea. 181 // 182 // `S' determines whether the instruction is a Load (0) or a Store (1). 183 // Loads appear in Rd one cycle after this instruction executes. If the 184 // following instruction reads Rd, that instruction will be delayed by 1 185 // clock cycle. 186 // 187 // PQ operation 188 // -- ------------------------------------------ 189 // 00 ea = Rs1 190 // 01 ea = Rs1, Rs1 <- Rs1 + constant 191 // 10 ea = Rs1 + constant 192 // 11 ea = Rs1 + constant, Rs1 <- Rs1 + constant 193 // 194 // The constant is sign-extended for this instruction. 195 // 196 // A Jump is accomplished by `Rd' being `pc', and it has *two* delay slots. 197 class InstRM<bit S, dag outs, dag ins, string asmstr, list<dag> pattern> 198 : InstLanai<outs, ins, asmstr, pattern> { 199 bits<5> Rd; 200 bits<5> Rs1; 201 bit P; 202 bit Q; 203 bits<16> imm16; 204 // Dummy variables to allow multiclass definition of RM and RRM 205 bits<2> YL; 206 bit E; 207 208 let Opcode{3 - 1} = 0b100; 209 let Opcode{0} = S; 210 let Inst{27 - 23} = Rd; 211 let Inst{22 - 18} = Rs1; 212 let Inst{17} = P; 213 let Inst{16} = Q; 214 let Inst{15 - 0} = imm16; 215 216 let PostEncoderMethod = "adjustPqBitsRmAndRrm"; 217 } 218 219 //------------------------------------------------------------------------------ 220 // Register Register Memory (RRM) 221 //------------------------------------------------------------------------------ 222 // Encoding: 223 // ----------------------------------------------------------------- 224 // |1.0.1.S| . . . . | . . . . |P.Q| . . . . |B.B.B|J.J.J.J.J|Y.L.E| 225 // ----------------------------------------------------------------- 226 // opcode Rd Rs1 Rs2 \ operation / 227 // 228 // Action: 229 // Rd <- Memory(ea) (Load) see below for the 230 // Memory(ea) <- Rd (Store) definition of ea. 231 // 232 // The RRM instruction is identical to the RM (*note RM::.) instruction 233 // except that: 234 // 235 // 1. `Rs1 + constant' is replaced with `Rs1 op Rs2', where `op' is 236 // determined in the same way as in the RR instruction (*note RR::.) 237 // and 238 // 239 // 2. part-word memory accesses are allowed as specified below. 240 // 241 // If `BBB' != 111 (i.e.: For all but shift operations): 242 // If `YLE' = 01- => fuLl-word memory access 243 // If `YLE' = 00- => half-word memory access 244 // If `YLE' = 10- => bYte memory access 245 // If `YLE' = --1 => loads are zEro extended 246 // If `YLE' = --0 => loads are sign extended 247 // 248 // If `BBB' = 111 (For shift operations): 249 // fullword memory access are performed. 250 // 251 // All part-word loads write the least significant part of the 252 // destination register with the higher-order bits zero- or sign-extended. 253 // All part-word stores store the least significant part-word of the 254 // source register in the destination memory location. 255 // 256 // A Jump is accomplished by `Rd' being `pc', and it has *two* delay slots. 257 class InstRRM<bit S, dag outs, dag ins, string asmstr, 258 list<dag> pattern> 259 : InstLanai<outs, ins, asmstr, pattern> { 260 bits<5> Rd; 261 bits<5> Rs1; 262 bits<5> Rs2; 263 bit P; 264 bit Q; 265 bits<3> BBB; 266 bits<5> JJJJJ; 267 bits<2> YL; 268 bit E; 269 270 let Opcode{3 - 1} = 0b101; 271 let Opcode{0} = S; 272 let Inst{27 - 23} = Rd; 273 let Inst{22 - 18} = Rs1; 274 let Inst{17} = P; 275 let Inst{16} = Q; 276 let Inst{15 - 11} = Rs2; 277 let Inst{10 - 8} = BBB; 278 let Inst{7 - 3} = JJJJJ; 279 let Inst{2 - 1} = YL; 280 let Inst{0} = E; 281 282 let PostEncoderMethod = "adjustPqBitsRmAndRrm"; 283 } 284 285 //------------------------------------------------------------------------------ 286 // Conditional Branch (BR) 287 //------------------------------------------------------------------------------ 288 // Encoding: 289 // ----------------------------------------------------------------- 290 // |1.1.1.0|D.D.D| . . . . . . . . . . . . . . . . . . . . . . |0.I| 291 // ----------------------------------------------------------------- 292 // opcode condition constant (23) 293 // 294 // Action: 295 // if (condition) { `pc' <- 4*(zero-extended constant) } 296 // 297 // The BR instruction is an absolute branch. 298 // The constant is scaled as shown by its position in the instruction word such 299 // that it specifies word-aligned addresses in the range [0,2^25-4] 300 // 301 // The `DDDI' field selects the condition that causes the branch to be taken. 302 // (the `I' (Invert sense) bit inverts the sense of the condition): 303 // 304 // DDDI logical function [code, used for...] 305 // ---- -------------------------------------- ------------------------ 306 // 0000 1 [T, true] 307 // 0001 0 [F, false] 308 // 0010 C AND Z' [HI, high] 309 // 0011 C' OR Z [LS, low or same] 310 // 0100 C' [CC, carry cleared] 311 // 0101 C [CS, carry set] 312 // 0110 Z' [NE, not equal] 313 // 0111 Z [EQ, equal] 314 // 1000 V' [VC, oVerflow cleared] 315 // 1001 V [VS, oVerflow set] 316 // 1010 N' [PL, plus] 317 // 1011 N [MI, minus] 318 // 1100 (N AND V) OR (N' AND V') [GE, greater than or equal] 319 // 1101 (N AND V') OR (N' AND V) [LT, less than] 320 // 1110 (N AND V AND Z') OR (N' AND V' AND Z') [GT, greater than] 321 // 1111 (Z) OR (N AND V') OR (N' AND V) [LE, less than or equal] 322 // 323 // If the branch is not taken, the BR instruction is a no-op. If the branch is 324 // taken, the processor starts executing instructions at the branch target 325 // address *after* the processor has executed one more instruction. That is, 326 // the branch has one branch delay slot. Be very careful if you find yourself 327 // wanting to put a branch in a branch delays slot! 328 class InstBR<dag outs, dag ins, string asmstr, list<dag> pattern> 329 : InstLanai<outs, ins, asmstr, pattern> { 330 let Itinerary = IIC_ALU; 331 bits<25> addr; 332 bits<4> DDDI; 333 334 let Opcode = 0b1110; 335 let Inst{27 - 25} = DDDI{3 - 1}; 336 let Inst{24 - 0} = addr; 337 // These instructions overwrite the last two address bits (which are assumed 338 // and ensured to be 0). 339 let Inst{1} = 0; 340 let Inst{0} = DDDI{0}; 341 } 342 343 //------------------------------------------------------------------------------ 344 // Conditional Branch Relative (BRR) 345 //------------------------------------------------------------------------------ 346 // Encoding: 347 // ----------------------------------------------------------------- 348 // |1.1.1.0|D.D.D|1|-| . . . . |-.-| . . . . . . . . . . . . . |1.I| 349 // ----------------------------------------------------------------- 350 // opcode condition Rs1 constant (14) 351 // Action: 352 // if (condition) { pc <- Rs1 + 4*sign-extended constant) } 353 // 354 // BRR behaves like BR, except the branch target address is a 16-bit PC relative 355 // offset. 356 class InstBRR<dag outs, dag ins, string asmstr, list<dag> pattern> 357 : InstLanai<outs, ins, asmstr, pattern> { 358 bits<4> DDDI; 359 bits<5> Rs1; 360 bits<16> imm16; 361 362 let Opcode = 0b1110; 363 let Inst{27 - 25} = DDDI{3 - 1}; 364 let Inst{24} = 1; 365 let Inst{22 - 18} = Rs1; 366 let Inst{17 - 16} = 0; 367 let Inst{15 - 0} = imm16; 368 // Overwrite last two bits which have to be zero 369 let Inst{1} = 1; 370 let Inst{0} = DDDI{0}; 371 372 // Set don't cares to zero 373 let Inst{23} = 0; 374 } 375 376 //------------------------------------------------------------------------------ 377 // Conditional Set (SCC) 378 //------------------------------------------------------------------------------ 379 // Encoding: 380 // ----------------------------------------------------------------- 381 // |1.1.1.0|D.D.D|0.-| . . . . |-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-|1.I| 382 // ----------------------------------------------------------------- 383 // opcode condition Rs1 384 // 385 // Action: 386 // Rs1 <- logical function result 387 // 388 // SCC sets dst_reg to the boolean result of computing the logical function 389 // specified by DDDI, as described in the table for the BR instruction. 390 class InstSCC<dag outs, dag ins, string asmstr, 391 list<dag> pattern> 392 : InstLanai<outs, ins, asmstr, pattern> { 393 let Itinerary = IIC_ALU; 394 bits<5> Rs1; // dst_reg in documentation 395 bits<4> DDDI; 396 397 let Opcode = 0b1110; 398 let Inst{27 - 25} = DDDI{3 - 1}; 399 let Inst{24} = 0; 400 let Inst{22 - 18} = Rs1; 401 let Inst{1} = 1; 402 let Inst{0} = DDDI{0}; 403 404 // Set don't cares to zero 405 let Inst{23} = 0; 406 let Inst{17 - 2} = 0; 407 } 408 409 //------------------------------------------------------------------------------ 410 // Special Load/Store (SLS) 411 //------------------------------------------------------------------------------ 412 // 413 // Encoding: 414 // ----------------------------------------------------------------- 415 // |1.1.1.1| . . . . | . . . . |0.S| . . . . . . . . . . . . . . . | 416 // ----------------------------------------------------------------- 417 // opcode Rd addr 5msb's address 16 lsb's 418 // 419 // Action: 420 // If S = 0 (LOAD): Rd <- Memory(address); 421 // If S = 1 (STORE): Memory(address) <- Rd 422 // 423 // The timing is the same as for RM (*note RM::.) and RRM (*note 424 // RRM::.) instructions. The two low-order bits of the 21-bit address are 425 // ignored. The address is zero extended. Fullword memory accesses are 426 // performed. 427 class InstSLS<bit S, dag outs, dag ins, string asmstr, list<dag> pattern> 428 : InstLanai<outs, ins, asmstr, pattern> { 429 bits<5> Rd; 430 bits<5> msb; 431 bits<16> lsb; 432 433 let Opcode = 0b1111; 434 let Inst{27 - 23} = Rd; 435 let Inst{22 - 18} = msb; 436 let Inst{17} = 0; 437 let Inst{16} = S; 438 let Inst{15 - 0} = lsb; 439 } 440 441 //------------------------------------------------------------------------------ 442 // Special Load Immediate (SLI) 443 //------------------------------------------------------------------------------ 444 // Encoding: 445 // ----------------------------------------------------------------- 446 // |1.1.1.1| . . . . | . . . . |1.0| . . . . . . . . . . . . . . . | 447 // ----------------------------------------------------------------- 448 // opcode Rd const 5msb's constant 16 lsb's 449 // 450 // Action: 451 // Rd <- constant 452 // 453 // The 21-bit constant is zero-extended. The timing is the same as the 454 // RM instruction (*note RM::.). 455 class InstSLI<dag outs, dag ins, string asmstr, list<dag> pattern> 456 : InstLanai<outs, ins, asmstr, pattern> { 457 bits<5> Rd; 458 bits<5> msb; 459 bits<16> lsb; 460 461 let Opcode = 0b1111; 462 let Inst{27 - 23} = Rd; 463 let Inst{22 - 18} = msb; 464 let Inst{17} = 1; 465 let Inst{16} = 0; 466 let Inst{15 - 0} = lsb; 467 } 468 469 //------------------------------------------------------------------------------ 470 // Special Part-Word Load/Store (SPLS) 471 //------------------------------------------------------------------------------ 472 // Encoding: 473 // ----------------------------------------------------------------- 474 // |1.1.1.1| . . . . | . . . . |1.1.0.Y.S.E.P.Q| . . . . . . . . . | 475 // ----------------------------------------------------------------- 476 // opcode Rd Rs1 constant (10) 477 // 478 // Action: 479 // If `YS' = 11 (bYte Store): 480 // Memory(ea) <- (least significant byte of Rr) 481 // If `YS' = 01 (halfword Store): 482 // Memory(ea) <- (least significant half-word of Rr) 483 // If `YS' = 10 (bYte load): Rr <- Memory(ea) 484 // If `YS' = 00 (halfword load): Rr <- Memory(ea) 485 // [Note: here ea is determined as in the the RM instruction. ] 486 // If `SE' = 01 then the value is zEro extended 487 // before being loaded into Rd. 488 // If `SE' = 00 then the value is sign extended 489 // before being loaded into Rd. 490 // 491 // `P' and `Q' are used to determine `ea' as in the RM instruction. The 492 // constant is sign extended. The timing is the same as the RM and RRM 493 // instructions. *Note RM:: and *Note RRM::. 494 // 495 // All part-word loads write the part-word into the least significant 496 // part of the destination register, with the higher-order bits zero- or 497 // sign-extended. All part-word stores store the least significant 498 // part-word of the source register into the destination memory location. 499 class InstSPLS<dag outs, dag ins, string asmstr, 500 list<dag> pattern> 501 : InstLanai<outs, ins, asmstr, pattern> { 502 bits<5> Rd; 503 bits<5> Rs1; 504 bits<5> msb; 505 bit Y; 506 bit S; 507 bit E; 508 bit P; 509 bit Q; 510 bits<10> imm10; 511 512 let Opcode = 0b1111; 513 let Inst{27 - 23} = Rd; 514 let Inst{22 - 18} = Rs1; 515 let Inst{17 - 15} = 0b110; 516 let Inst{14} = Y; 517 let Inst{13} = S; 518 let Inst{12} = E; 519 let Inst{11} = P; 520 let Inst{10} = Q; 521 let Inst{9 - 0} = imm10; 522 523 let PostEncoderMethod = "adjustPqBitsSpls"; 524 } 525 526 //------------------------------------------------------------------------------ 527 // Special instructions (popc, leadz, trailz) 528 //------------------------------------------------------------------------------ 529 // Encoding: 530 // ----------------------------------------------------------------- 531 // |1.1.0.1| Rd | Rs1 |F.-| . . . . | . . | . . . . | OP | 532 // ----------------------------------------------------------------- 533 // opcode Rd Rs1 534 // Action: 535 // Rd <- Perform action encoded in OP on Rs1 536 // OP is one of: 537 // 0b001 POPC Population count; 538 // 0b010 LEADZ Count number of leading zeros; 539 // 0b011 TRAILZ Count number of trailing zeros; 540 class InstSpecial<bits<3> op, dag outs, dag ins, string asmstr, 541 list<dag> pattern> : InstLanai<outs, ins, asmstr, 542 pattern>, Sched<[WriteALU]> { 543 let Itinerary = IIC_ALU; 544 bit F; 545 bits<5> Rd; 546 bits<5> Rs1; 547 548 let Opcode = 0b1101; 549 let Inst{27 - 23} = Rd; 550 let Inst{22 - 18} = Rs1; 551 let Inst{17} = F; 552 let Inst{16 - 3} = 0; 553 let Inst{2 - 0} = op; 554 } 555 556 // Pseudo instructions 557 class Pseudo<dag outs, dag ins, string asmstr, list<dag> pattern> 558 : InstLanai<outs, ins, asmstr, pattern> { 559 let Inst{15 - 0} = 0; 560 let isPseudo = 1; 561 } 562