1//=- HexagonIsetDx.td - Target Desc. for Hexagon Target -*- 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// This file describes the Hexagon duplex instructions. 11// 12//===----------------------------------------------------------------------===// 13 14// SA1_combine1i: Combines. 15let isCodeGenOnly = 1, hasSideEffects = 0 in 16def V4_SA1_combine1i: SUBInst < 17 (outs DoubleRegs:$Rdd), 18 (ins u2Imm:$u2), 19 "$Rdd = combine(#1, #$u2)"> { 20 bits<3> Rdd; 21 bits<2> u2; 22 23 let Inst{12-10} = 0b111; 24 let Inst{8} = 0b0; 25 let Inst{4-3} = 0b01; 26 let Inst{2-0} = Rdd; 27 let Inst{6-5} = u2; 28 } 29 30// SL2_jumpr31_f: Indirect conditional jump if false. 31// SL2_jumpr31_f -> SL2_jumpr31_fnew 32let Defs = [PC], Uses = [P0, R31], isCodeGenOnly = 1, isPredicated = 1, isPredicatedFalse = 1, isBranch = 1, isIndirectBranch = 1, hasSideEffects = 0 in 33def V4_SL2_jumpr31_f: SUBInst < 34 (outs ), 35 (ins ), 36 "if (!p0) jumpr r31"> { 37 let Inst{12-6} = 0b1111111; 38 let Inst{2-0} = 0b101; 39 } 40 41// SL2_deallocframe: Deallocate stack frame. 42let Defs = [R31, R29, R30], Uses = [R30], isCodeGenOnly = 1, mayLoad = 1, accessSize = DoubleWordAccess in 43def V4_SL2_deallocframe: SUBInst < 44 (outs ), 45 (ins ), 46 "deallocframe"> { 47 let Inst{12-6} = 0b1111100; 48 let Inst{2} = 0b0; 49 } 50 51// SL2_return_f: Deallocate stack frame and return. 52// SL2_return_f -> SL2_return_fnew 53let Defs = [PC, R31, R29, R30], Uses = [R30, P0], isCodeGenOnly = 1, isPredicated = 1, isPredicatedFalse = 1, mayLoad = 1, accessSize = DoubleWordAccess, isBranch = 1, isIndirectBranch = 1 in 54def V4_SL2_return_f: SUBInst < 55 (outs ), 56 (ins ), 57 "if (!p0) dealloc_return"> { 58 let Inst{12-6} = 0b1111101; 59 let Inst{2-0} = 0b101; 60 } 61 62// SA1_combine3i: Combines. 63let isCodeGenOnly = 1, hasSideEffects = 0 in 64def V4_SA1_combine3i: SUBInst < 65 (outs DoubleRegs:$Rdd), 66 (ins u2Imm:$u2), 67 "$Rdd = combine(#3, #$u2)"> { 68 bits<3> Rdd; 69 bits<2> u2; 70 71 let Inst{12-10} = 0b111; 72 let Inst{8} = 0b0; 73 let Inst{4-3} = 0b11; 74 let Inst{2-0} = Rdd; 75 let Inst{6-5} = u2; 76 } 77 78// SS2_storebi0: Store byte. 79let isCodeGenOnly = 1, mayStore = 1, accessSize = ByteAccess in 80def V4_SS2_storebi0: SUBInst < 81 (outs ), 82 (ins IntRegs:$Rs, u4_0Imm:$u4_0), 83 "memb($Rs + #$u4_0)=#0"> { 84 bits<4> Rs; 85 bits<4> u4_0; 86 87 let Inst{12-8} = 0b10010; 88 let Inst{7-4} = Rs; 89 let Inst{3-0} = u4_0; 90 } 91 92// SA1_clrtnew: Clear if true. 93let Uses = [P0], isCodeGenOnly = 1, isPredicated = 1, isPredicatedNew = 1, hasSideEffects = 0, hasNewValue = 1, opNewValue = 0 in 94def V4_SA1_clrtnew: SUBInst < 95 (outs IntRegs:$Rd), 96 (ins ), 97 "if (p0.new) $Rd = #0"> { 98 bits<4> Rd; 99 100 let Inst{12-9} = 0b1101; 101 let Inst{6-4} = 0b100; 102 let Inst{3-0} = Rd; 103 } 104 105// SL2_loadruh_io: Load half. 106let isCodeGenOnly = 1, mayLoad = 1, accessSize = HalfWordAccess, hasNewValue = 1, opNewValue = 0 in 107def V4_SL2_loadruh_io: SUBInst < 108 (outs IntRegs:$Rd), 109 (ins IntRegs:$Rs, u3_1Imm:$u3_1), 110 "$Rd = memuh($Rs + #$u3_1)"> { 111 bits<4> Rd; 112 bits<4> Rs; 113 bits<4> u3_1; 114 115 let Inst{12-11} = 0b01; 116 let Inst{3-0} = Rd; 117 let Inst{7-4} = Rs; 118 let Inst{10-8} = u3_1{3-1}; 119 } 120 121// SL2_jumpr31_tnew: Indirect conditional jump if true. 122let Defs = [PC], Uses = [P0, R31], isCodeGenOnly = 1, isPredicated = 1, isPredicatedNew = 1, isBranch = 1, isIndirectBranch = 1, hasSideEffects = 0 in 123def V4_SL2_jumpr31_tnew: SUBInst < 124 (outs ), 125 (ins ), 126 "if (p0.new) jumpr:nt r31"> { 127 let Inst{12-6} = 0b1111111; 128 let Inst{2-0} = 0b110; 129 } 130 131// SA1_addi: Add. 132let isCodeGenOnly = 1, hasSideEffects = 0, hasNewValue = 1, opNewValue = 0, isExtendable = 1, isExtentSigned = 1, opExtentBits = 7, opExtendable = 2 in 133def V4_SA1_addi: SUBInst < 134 (outs IntRegs:$Rx), 135 (ins IntRegs:$_src_, s7Ext:$s7), 136 "$Rx = add($_src_, #$s7)" , 137 [] , 138 "$_src_ = $Rx"> { 139 bits<4> Rx; 140 bits<7> s7; 141 142 let Inst{12-11} = 0b00; 143 let Inst{3-0} = Rx; 144 let Inst{10-4} = s7; 145 } 146 147// SL1_loadrub_io: Load byte. 148let isCodeGenOnly = 1, mayLoad = 1, accessSize = ByteAccess, hasNewValue = 1, opNewValue = 0 in 149def V4_SL1_loadrub_io: SUBInst < 150 (outs IntRegs:$Rd), 151 (ins IntRegs:$Rs, u4_0Imm:$u4_0), 152 "$Rd = memub($Rs + #$u4_0)"> { 153 bits<4> Rd; 154 bits<4> Rs; 155 bits<4> u4_0; 156 157 let Inst{12} = 0b1; 158 let Inst{3-0} = Rd; 159 let Inst{7-4} = Rs; 160 let Inst{11-8} = u4_0; 161 } 162 163// SL1_loadri_io: Load word. 164let isCodeGenOnly = 1, mayLoad = 1, accessSize = WordAccess, hasNewValue = 1, opNewValue = 0 in 165def V4_SL1_loadri_io: SUBInst < 166 (outs IntRegs:$Rd), 167 (ins IntRegs:$Rs, u4_2Imm:$u4_2), 168 "$Rd = memw($Rs + #$u4_2)"> { 169 bits<4> Rd; 170 bits<4> Rs; 171 bits<6> u4_2; 172 173 let Inst{12} = 0b0; 174 let Inst{3-0} = Rd; 175 let Inst{7-4} = Rs; 176 let Inst{11-8} = u4_2{5-2}; 177 } 178 179// SA1_cmpeqi: Compareimmed. 180let Defs = [P0], isCodeGenOnly = 1, hasSideEffects = 0 in 181def V4_SA1_cmpeqi: SUBInst < 182 (outs ), 183 (ins IntRegs:$Rs, u2Imm:$u2), 184 "p0 = cmp.eq($Rs, #$u2)"> { 185 bits<4> Rs; 186 bits<2> u2; 187 188 let Inst{12-8} = 0b11001; 189 let Inst{7-4} = Rs; 190 let Inst{1-0} = u2; 191 } 192 193// SA1_combinerz: Combines. 194let isCodeGenOnly = 1, hasSideEffects = 0 in 195def V4_SA1_combinerz: SUBInst < 196 (outs DoubleRegs:$Rdd), 197 (ins IntRegs:$Rs), 198 "$Rdd = combine($Rs, #0)"> { 199 bits<3> Rdd; 200 bits<4> Rs; 201 202 let Inst{12-10} = 0b111; 203 let Inst{8} = 0b1; 204 let Inst{3} = 0b1; 205 let Inst{2-0} = Rdd; 206 let Inst{7-4} = Rs; 207 } 208 209// SL2_return_t: Deallocate stack frame and return. 210// SL2_return_t -> SL2_return_tnew 211let Defs = [PC, R31, R29, R30], Uses = [R30, P0], isCodeGenOnly = 1, isPredicated = 1, mayLoad = 1, accessSize = DoubleWordAccess, isBranch = 1, isIndirectBranch = 1 in 212def V4_SL2_return_t: SUBInst < 213 (outs ), 214 (ins ), 215 "if (p0) dealloc_return"> { 216 let Inst{12-6} = 0b1111101; 217 let Inst{2-0} = 0b100; 218 } 219 220// SS2_allocframe: Allocate stack frame. 221let Defs = [R29, R30], Uses = [R30, R31, R29], isCodeGenOnly = 1, mayStore = 1, accessSize = DoubleWordAccess in 222def V4_SS2_allocframe: SUBInst < 223 (outs ), 224 (ins u5_3Imm:$u5_3), 225 "allocframe(#$u5_3)"> { 226 bits<8> u5_3; 227 228 let Inst{12-9} = 0b1110; 229 let Inst{8-4} = u5_3{7-3}; 230 } 231 232// SS2_storeh_io: Store half. 233let isCodeGenOnly = 1, mayStore = 1, accessSize = HalfWordAccess in 234def V4_SS2_storeh_io: SUBInst < 235 (outs ), 236 (ins IntRegs:$Rs, u3_1Imm:$u3_1, IntRegs:$Rt), 237 "memh($Rs + #$u3_1) = $Rt"> { 238 bits<4> Rs; 239 bits<4> u3_1; 240 bits<4> Rt; 241 242 let Inst{12-11} = 0b00; 243 let Inst{7-4} = Rs; 244 let Inst{10-8} = u3_1{3-1}; 245 let Inst{3-0} = Rt; 246 } 247 248// SS2_storewi0: Store word. 249let isCodeGenOnly = 1, mayStore = 1, accessSize = WordAccess in 250def V4_SS2_storewi0: SUBInst < 251 (outs ), 252 (ins IntRegs:$Rs, u4_2Imm:$u4_2), 253 "memw($Rs + #$u4_2)=#0"> { 254 bits<4> Rs; 255 bits<6> u4_2; 256 257 let Inst{12-8} = 0b10000; 258 let Inst{7-4} = Rs; 259 let Inst{3-0} = u4_2{5-2}; 260 } 261 262// SS2_storewi1: Store word. 263let isCodeGenOnly = 1, mayStore = 1, accessSize = WordAccess in 264def V4_SS2_storewi1: SUBInst < 265 (outs ), 266 (ins IntRegs:$Rs, u4_2Imm:$u4_2), 267 "memw($Rs + #$u4_2)=#1"> { 268 bits<4> Rs; 269 bits<6> u4_2; 270 271 let Inst{12-8} = 0b10001; 272 let Inst{7-4} = Rs; 273 let Inst{3-0} = u4_2{5-2}; 274 } 275 276// SL2_jumpr31: Indirect conditional jump if true. 277let Defs = [PC], Uses = [R31], isCodeGenOnly = 1, isBranch = 1, isIndirectBranch = 1, hasSideEffects = 0 in 278def V4_SL2_jumpr31: SUBInst < 279 (outs ), 280 (ins ), 281 "jumpr r31"> { 282 let Inst{12-6} = 0b1111111; 283 let Inst{2} = 0b0; 284 } 285 286// SA1_combinezr: Combines. 287let isCodeGenOnly = 1, hasSideEffects = 0 in 288def V4_SA1_combinezr: SUBInst < 289 (outs DoubleRegs:$Rdd), 290 (ins IntRegs:$Rs), 291 "$Rdd = combine(#0, $Rs)"> { 292 bits<3> Rdd; 293 bits<4> Rs; 294 295 let Inst{12-10} = 0b111; 296 let Inst{8} = 0b1; 297 let Inst{3} = 0b0; 298 let Inst{2-0} = Rdd; 299 let Inst{7-4} = Rs; 300 } 301 302// SL2_loadrh_io: Load half. 303let isCodeGenOnly = 1, mayLoad = 1, accessSize = HalfWordAccess, hasNewValue = 1, opNewValue = 0 in 304def V4_SL2_loadrh_io: SUBInst < 305 (outs IntRegs:$Rd), 306 (ins IntRegs:$Rs, u3_1Imm:$u3_1), 307 "$Rd = memh($Rs + #$u3_1)"> { 308 bits<4> Rd; 309 bits<4> Rs; 310 bits<4> u3_1; 311 312 let Inst{12-11} = 0b00; 313 let Inst{3-0} = Rd; 314 let Inst{7-4} = Rs; 315 let Inst{10-8} = u3_1{3-1}; 316 } 317 318// SA1_addrx: Add. 319let isCodeGenOnly = 1, hasSideEffects = 0, hasNewValue = 1, opNewValue = 0 in 320def V4_SA1_addrx: SUBInst < 321 (outs IntRegs:$Rx), 322 (ins IntRegs:$_src_, IntRegs:$Rs), 323 "$Rx = add($_src_, $Rs)" , 324 [] , 325 "$_src_ = $Rx"> { 326 bits<4> Rx; 327 bits<4> Rs; 328 329 let Inst{12-8} = 0b11000; 330 let Inst{3-0} = Rx; 331 let Inst{7-4} = Rs; 332 } 333 334// SA1_setin1: Set to -1. 335let isCodeGenOnly = 1, hasSideEffects = 0, hasNewValue = 1, opNewValue = 0 in 336def V4_SA1_setin1: SUBInst < 337 (outs IntRegs:$Rd), 338 (ins ), 339 "$Rd = #-1"> { 340 bits<4> Rd; 341 342 let Inst{12-9} = 0b1101; 343 let Inst{6} = 0b0; 344 let Inst{3-0} = Rd; 345 } 346 347// SA1_sxth: Sxth. 348let isCodeGenOnly = 1, hasSideEffects = 0, hasNewValue = 1, opNewValue = 0 in 349def V4_SA1_sxth: SUBInst < 350 (outs IntRegs:$Rd), 351 (ins IntRegs:$Rs), 352 "$Rd = sxth($Rs)"> { 353 bits<4> Rd; 354 bits<4> Rs; 355 356 let Inst{12-8} = 0b10100; 357 let Inst{3-0} = Rd; 358 let Inst{7-4} = Rs; 359 } 360 361// SA1_combine0i: Combines. 362let isCodeGenOnly = 1, hasSideEffects = 0 in 363def V4_SA1_combine0i: SUBInst < 364 (outs DoubleRegs:$Rdd), 365 (ins u2Imm:$u2), 366 "$Rdd = combine(#0, #$u2)"> { 367 bits<3> Rdd; 368 bits<2> u2; 369 370 let Inst{12-10} = 0b111; 371 let Inst{8} = 0b0; 372 let Inst{4-3} = 0b00; 373 let Inst{2-0} = Rdd; 374 let Inst{6-5} = u2; 375 } 376 377// SA1_combine2i: Combines. 378let isCodeGenOnly = 1, hasSideEffects = 0 in 379def V4_SA1_combine2i: SUBInst < 380 (outs DoubleRegs:$Rdd), 381 (ins u2Imm:$u2), 382 "$Rdd = combine(#2, #$u2)"> { 383 bits<3> Rdd; 384 bits<2> u2; 385 386 let Inst{12-10} = 0b111; 387 let Inst{8} = 0b0; 388 let Inst{4-3} = 0b10; 389 let Inst{2-0} = Rdd; 390 let Inst{6-5} = u2; 391 } 392 393// SA1_sxtb: Sxtb. 394let isCodeGenOnly = 1, hasSideEffects = 0, hasNewValue = 1, opNewValue = 0 in 395def V4_SA1_sxtb: SUBInst < 396 (outs IntRegs:$Rd), 397 (ins IntRegs:$Rs), 398 "$Rd = sxtb($Rs)"> { 399 bits<4> Rd; 400 bits<4> Rs; 401 402 let Inst{12-8} = 0b10101; 403 let Inst{3-0} = Rd; 404 let Inst{7-4} = Rs; 405 } 406 407// SA1_clrf: Clear if false. 408// SA1_clrf -> SA1_clrfnew 409let Uses = [P0], isCodeGenOnly = 1, isPredicated = 1, isPredicatedFalse = 1, hasSideEffects = 0, hasNewValue = 1, opNewValue = 0 in 410def V4_SA1_clrf: SUBInst < 411 (outs IntRegs:$Rd), 412 (ins ), 413 "if (!p0) $Rd = #0"> { 414 bits<4> Rd; 415 416 let Inst{12-9} = 0b1101; 417 let Inst{6-4} = 0b111; 418 let Inst{3-0} = Rd; 419 } 420 421// SL2_loadrb_io: Load byte. 422let isCodeGenOnly = 1, mayLoad = 1, accessSize = ByteAccess, hasNewValue = 1, opNewValue = 0 in 423def V4_SL2_loadrb_io: SUBInst < 424 (outs IntRegs:$Rd), 425 (ins IntRegs:$Rs, u3_0Imm:$u3_0), 426 "$Rd = memb($Rs + #$u3_0)"> { 427 bits<4> Rd; 428 bits<4> Rs; 429 bits<3> u3_0; 430 431 let Inst{12-11} = 0b10; 432 let Inst{3-0} = Rd; 433 let Inst{7-4} = Rs; 434 let Inst{10-8} = u3_0; 435 } 436 437// SA1_tfr: Tfr. 438let isCodeGenOnly = 1, hasSideEffects = 0, hasNewValue = 1, opNewValue = 0 in 439def V4_SA1_tfr: SUBInst < 440 (outs IntRegs:$Rd), 441 (ins IntRegs:$Rs), 442 "$Rd = $Rs"> { 443 bits<4> Rd; 444 bits<4> Rs; 445 446 let Inst{12-8} = 0b10000; 447 let Inst{3-0} = Rd; 448 let Inst{7-4} = Rs; 449 } 450 451// SL2_loadrd_sp: Load dword. 452let Uses = [R29], isCodeGenOnly = 1, mayLoad = 1, accessSize = DoubleWordAccess in 453def V4_SL2_loadrd_sp: SUBInst < 454 (outs DoubleRegs:$Rdd), 455 (ins u5_3Imm:$u5_3), 456 "$Rdd = memd(r29 + #$u5_3)"> { 457 bits<3> Rdd; 458 bits<8> u5_3; 459 460 let Inst{12-8} = 0b11110; 461 let Inst{2-0} = Rdd; 462 let Inst{7-3} = u5_3{7-3}; 463 } 464 465// SA1_and1: And #1. 466let isCodeGenOnly = 1, hasSideEffects = 0, hasNewValue = 1, opNewValue = 0 in 467def V4_SA1_and1: SUBInst < 468 (outs IntRegs:$Rd), 469 (ins IntRegs:$Rs), 470 "$Rd = and($Rs, #1)"> { 471 bits<4> Rd; 472 bits<4> Rs; 473 474 let Inst{12-8} = 0b10010; 475 let Inst{3-0} = Rd; 476 let Inst{7-4} = Rs; 477 } 478 479// SS2_storebi1: Store byte. 480let isCodeGenOnly = 1, mayStore = 1, accessSize = ByteAccess in 481def V4_SS2_storebi1: SUBInst < 482 (outs ), 483 (ins IntRegs:$Rs, u4_0Imm:$u4_0), 484 "memb($Rs + #$u4_0)=#1"> { 485 bits<4> Rs; 486 bits<4> u4_0; 487 488 let Inst{12-8} = 0b10011; 489 let Inst{7-4} = Rs; 490 let Inst{3-0} = u4_0; 491 } 492 493// SA1_inc: Inc. 494let isCodeGenOnly = 1, hasSideEffects = 0, hasNewValue = 1, opNewValue = 0 in 495def V4_SA1_inc: SUBInst < 496 (outs IntRegs:$Rd), 497 (ins IntRegs:$Rs), 498 "$Rd = add($Rs, #1)"> { 499 bits<4> Rd; 500 bits<4> Rs; 501 502 let Inst{12-8} = 0b10001; 503 let Inst{3-0} = Rd; 504 let Inst{7-4} = Rs; 505 } 506 507// SS2_stored_sp: Store dword. 508let Uses = [R29], isCodeGenOnly = 1, mayStore = 1, accessSize = DoubleWordAccess in 509def V4_SS2_stored_sp: SUBInst < 510 (outs ), 511 (ins s6_3Imm:$s6_3, DoubleRegs:$Rtt), 512 "memd(r29 + #$s6_3) = $Rtt"> { 513 bits<9> s6_3; 514 bits<3> Rtt; 515 516 let Inst{12-9} = 0b0101; 517 let Inst{8-3} = s6_3{8-3}; 518 let Inst{2-0} = Rtt; 519 } 520 521// SS2_storew_sp: Store word. 522let Uses = [R29], isCodeGenOnly = 1, mayStore = 1, accessSize = WordAccess in 523def V4_SS2_storew_sp: SUBInst < 524 (outs ), 525 (ins u5_2Imm:$u5_2, IntRegs:$Rt), 526 "memw(r29 + #$u5_2) = $Rt"> { 527 bits<7> u5_2; 528 bits<4> Rt; 529 530 let Inst{12-9} = 0b0100; 531 let Inst{8-4} = u5_2{6-2}; 532 let Inst{3-0} = Rt; 533 } 534 535// SL2_jumpr31_fnew: Indirect conditional jump if false. 536let Defs = [PC], Uses = [P0, R31], isCodeGenOnly = 1, isPredicated = 1, isPredicatedFalse = 1, isPredicatedNew = 1, isBranch = 1, isIndirectBranch = 1, hasSideEffects = 0 in 537def V4_SL2_jumpr31_fnew: SUBInst < 538 (outs ), 539 (ins ), 540 "if (!p0.new) jumpr:nt r31"> { 541 let Inst{12-6} = 0b1111111; 542 let Inst{2-0} = 0b111; 543 } 544 545// SA1_clrt: Clear if true. 546// SA1_clrt -> SA1_clrtnew 547let Uses = [P0], isCodeGenOnly = 1, isPredicated = 1, hasSideEffects = 0, hasNewValue = 1, opNewValue = 0 in 548def V4_SA1_clrt: SUBInst < 549 (outs IntRegs:$Rd), 550 (ins ), 551 "if (p0) $Rd = #0"> { 552 bits<4> Rd; 553 554 let Inst{12-9} = 0b1101; 555 let Inst{6-4} = 0b110; 556 let Inst{3-0} = Rd; 557 } 558 559// SL2_return: Deallocate stack frame and return. 560let Defs = [PC, R31, R29, R30], Uses = [R30], isCodeGenOnly = 1, mayLoad = 1, accessSize = DoubleWordAccess, isBranch = 1, isIndirectBranch = 1 in 561def V4_SL2_return: SUBInst < 562 (outs ), 563 (ins ), 564 "dealloc_return"> { 565 let Inst{12-6} = 0b1111101; 566 let Inst{2} = 0b0; 567 } 568 569// SA1_dec: Dec. 570let isCodeGenOnly = 1, hasSideEffects = 0, hasNewValue = 1, opNewValue = 0 in 571def V4_SA1_dec: SUBInst < 572 (outs IntRegs:$Rd), 573 (ins IntRegs:$Rs), 574 "$Rd = add($Rs,#-1)"> { 575 bits<4> Rd; 576 bits<4> Rs; 577 578 let Inst{12-8} = 0b10011; 579 let Inst{3-0} = Rd; 580 let Inst{7-4} = Rs; 581 } 582 583// SA1_seti: Set immed. 584let isCodeGenOnly = 1, hasSideEffects = 0, hasNewValue = 1, opNewValue = 0, isExtendable = 1, isExtentSigned = 0, opExtentBits = 6, opExtendable = 1 in 585def V4_SA1_seti: SUBInst < 586 (outs IntRegs:$Rd), 587 (ins u6Ext:$u6), 588 "$Rd = #$u6"> { 589 bits<4> Rd; 590 bits<6> u6; 591 592 let Inst{12-10} = 0b010; 593 let Inst{3-0} = Rd; 594 let Inst{9-4} = u6; 595 } 596 597// SL2_jumpr31_t: Indirect conditional jump if true. 598// SL2_jumpr31_t -> SL2_jumpr31_tnew 599let Defs = [PC], Uses = [P0, R31], isCodeGenOnly = 1, isPredicated = 1, isBranch = 1, isIndirectBranch = 1, hasSideEffects = 0 in 600def V4_SL2_jumpr31_t: SUBInst < 601 (outs ), 602 (ins ), 603 "if (p0) jumpr r31"> { 604 let Inst{12-6} = 0b1111111; 605 let Inst{2-0} = 0b100; 606 } 607 608// SA1_clrfnew: Clear if false. 609let Uses = [P0], isCodeGenOnly = 1, isPredicated = 1, isPredicatedFalse = 1, isPredicatedNew = 1, hasSideEffects = 0, hasNewValue = 1, opNewValue = 0 in 610def V4_SA1_clrfnew: SUBInst < 611 (outs IntRegs:$Rd), 612 (ins ), 613 "if (!p0.new) $Rd = #0"> { 614 bits<4> Rd; 615 616 let Inst{12-9} = 0b1101; 617 let Inst{6-4} = 0b101; 618 let Inst{3-0} = Rd; 619 } 620 621// SS1_storew_io: Store word. 622let isCodeGenOnly = 1, mayStore = 1, accessSize = WordAccess in 623def V4_SS1_storew_io: SUBInst < 624 (outs ), 625 (ins IntRegs:$Rs, u4_2Imm:$u4_2, IntRegs:$Rt), 626 "memw($Rs + #$u4_2) = $Rt"> { 627 bits<4> Rs; 628 bits<6> u4_2; 629 bits<4> Rt; 630 631 let Inst{12} = 0b0; 632 let Inst{7-4} = Rs; 633 let Inst{11-8} = u4_2{5-2}; 634 let Inst{3-0} = Rt; 635 } 636 637// SA1_zxtb: Zxtb. 638let isCodeGenOnly = 1, hasSideEffects = 0, hasNewValue = 1, opNewValue = 0 in 639def V4_SA1_zxtb: SUBInst < 640 (outs IntRegs:$Rd), 641 (ins IntRegs:$Rs), 642 "$Rd = and($Rs, #255)"> { 643 bits<4> Rd; 644 bits<4> Rs; 645 646 let Inst{12-8} = 0b10111; 647 let Inst{3-0} = Rd; 648 let Inst{7-4} = Rs; 649 } 650 651// SA1_addsp: Add. 652let Uses = [R29], isCodeGenOnly = 1, hasSideEffects = 0, hasNewValue = 1, opNewValue = 0 in 653def V4_SA1_addsp: SUBInst < 654 (outs IntRegs:$Rd), 655 (ins u6_2Imm:$u6_2), 656 "$Rd = add(r29, #$u6_2)"> { 657 bits<4> Rd; 658 bits<8> u6_2; 659 660 let Inst{12-10} = 0b011; 661 let Inst{3-0} = Rd; 662 let Inst{9-4} = u6_2{7-2}; 663 } 664 665// SL2_loadri_sp: Load word. 666let Uses = [R29], isCodeGenOnly = 1, mayLoad = 1, accessSize = WordAccess, hasNewValue = 1, opNewValue = 0 in 667def V4_SL2_loadri_sp: SUBInst < 668 (outs IntRegs:$Rd), 669 (ins u5_2Imm:$u5_2), 670 "$Rd = memw(r29 + #$u5_2)"> { 671 bits<4> Rd; 672 bits<7> u5_2; 673 674 let Inst{12-9} = 0b1110; 675 let Inst{3-0} = Rd; 676 let Inst{8-4} = u5_2{6-2}; 677 } 678 679// SS1_storeb_io: Store byte. 680let isCodeGenOnly = 1, mayStore = 1, accessSize = ByteAccess in 681def V4_SS1_storeb_io: SUBInst < 682 (outs ), 683 (ins IntRegs:$Rs, u4_0Imm:$u4_0, IntRegs:$Rt), 684 "memb($Rs + #$u4_0) = $Rt"> { 685 bits<4> Rs; 686 bits<4> u4_0; 687 bits<4> Rt; 688 689 let Inst{12} = 0b1; 690 let Inst{7-4} = Rs; 691 let Inst{11-8} = u4_0; 692 let Inst{3-0} = Rt; 693 } 694 695// SL2_return_tnew: Deallocate stack frame and return. 696let Defs = [PC, R31, R29, R30], Uses = [R30, P0], isCodeGenOnly = 1, isPredicated = 1, isPredicatedNew = 1, mayLoad = 1, accessSize = DoubleWordAccess, isBranch = 1, isIndirectBranch = 1 in 697def V4_SL2_return_tnew: SUBInst < 698 (outs ), 699 (ins ), 700 "if (p0.new) dealloc_return:nt"> { 701 let Inst{12-6} = 0b1111101; 702 let Inst{2-0} = 0b110; 703 } 704 705// SL2_return_fnew: Deallocate stack frame and return. 706let Defs = [PC, R31, R29, R30], Uses = [R30, P0], isCodeGenOnly = 1, isPredicated = 1, isPredicatedFalse = 1, isPredicatedNew = 1, mayLoad = 1, accessSize = DoubleWordAccess, isBranch = 1, isIndirectBranch = 1 in 707def V4_SL2_return_fnew: SUBInst < 708 (outs ), 709 (ins ), 710 "if (!p0.new) dealloc_return:nt"> { 711 let Inst{12-6} = 0b1111101; 712 let Inst{2-0} = 0b111; 713 } 714 715// SA1_zxth: Zxth. 716let isCodeGenOnly = 1, hasSideEffects = 0, hasNewValue = 1, opNewValue = 0 in 717def V4_SA1_zxth: SUBInst < 718 (outs IntRegs:$Rd), 719 (ins IntRegs:$Rs), 720 "$Rd = zxth($Rs)"> { 721 bits<4> Rd; 722 bits<4> Rs; 723 724 let Inst{12-8} = 0b10110; 725 let Inst{3-0} = Rd; 726 let Inst{7-4} = Rs; 727 } 728 729