1 //===- HexagonOperands.td - Hexagon immediate processing -*- tablegen -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illnois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 // Immediate operands. 11 12 let PrintMethod = "printImmOperand" in { 13 // f32Ext type is used to identify constant extended floating point immediates. 14 def f32Ext : Operand<f32>; 15 def s32Imm : Operand<i32>; 16 def s26_6Imm : Operand<i32>; 17 def s16Imm : Operand<i32>; 18 def s12Imm : Operand<i32>; 19 def s11Imm : Operand<i32>; 20 def s11_0Imm : Operand<i32>; 21 def s11_1Imm : Operand<i32>; 22 def s11_2Imm : Operand<i32>; 23 def s11_3Imm : Operand<i32>; 24 def s10Imm : Operand<i32>; 25 def s9Imm : Operand<i32>; 26 def m9Imm : Operand<i32>; 27 def s8Imm : Operand<i32>; 28 def s8Imm64 : Operand<i64>; 29 def s6Imm : Operand<i32>; 30 def s4Imm : Operand<i32>; 31 def s4_0Imm : Operand<i32>; 32 def s4_1Imm : Operand<i32>; 33 def s4_2Imm : Operand<i32>; 34 def s4_3Imm : Operand<i32>; 35 def u64Imm : Operand<i64>; 36 def u32Imm : Operand<i32>; 37 def u26_6Imm : Operand<i32>; 38 def u16Imm : Operand<i32>; 39 def u16_0Imm : Operand<i32>; 40 def u16_1Imm : Operand<i32>; 41 def u16_2Imm : Operand<i32>; 42 def u11_3Imm : Operand<i32>; 43 def u10Imm : Operand<i32>; 44 def u9Imm : Operand<i32>; 45 def u8Imm : Operand<i32>; 46 def u7Imm : Operand<i32>; 47 def u6Imm : Operand<i32>; 48 def u6_0Imm : Operand<i32>; 49 def u6_1Imm : Operand<i32>; 50 def u6_2Imm : Operand<i32>; 51 def u6_3Imm : Operand<i32>; 52 def u5Imm : Operand<i32>; 53 def u4Imm : Operand<i32>; 54 def u3Imm : Operand<i32>; 55 def u2Imm : Operand<i32>; 56 def u1Imm : Operand<i32>; 57 def n8Imm : Operand<i32>; 58 def m6Imm : Operand<i32>; 59 } 60 61 let PrintMethod = "printNOneImmOperand" in 62 def nOneImm : Operand<i32>; 63 64 // 65 // Immediate predicates 66 // 67 def s32ImmPred : PatLeaf<(i32 imm), [{ 68 // s32ImmPred predicate - True if the immediate fits in a 32-bit sign extended 69 // field. 70 int64_t v = (int64_t)N->getSExtValue(); 71 return isInt<32>(v); 72 }]>; 73 74 def s32_24ImmPred : PatLeaf<(i32 imm), [{ 75 // s32_24ImmPred predicate - True if the immediate fits in a 32-bit sign 76 // extended field that is a multiple of 0x1000000. 77 int64_t v = (int64_t)N->getSExtValue(); 78 return isShiftedInt<32,24>(v); 79 }]>; 80 81 def s32_16s8ImmPred : PatLeaf<(i32 imm), [{ 82 // s32_16s8ImmPred predicate - True if the immediate fits in a 32-bit sign 83 // extended field that is a multiple of 0x10000. 84 int64_t v = (int64_t)N->getSExtValue(); 85 return isShiftedInt<24,16>(v); 86 }]>; 87 88 def s26_6ImmPred : PatLeaf<(i32 imm), [{ 89 // s26_6ImmPred predicate - True if the immediate fits in a 32-bit 90 // sign extended field. 91 int64_t v = (int64_t)N->getSExtValue(); 92 return isShiftedInt<26,6>(v); 93 }]>; 94 95 96 def s16ImmPred : PatLeaf<(i32 imm), [{ 97 // s16ImmPred predicate - True if the immediate fits in a 16-bit sign extended 98 // field. 99 int64_t v = (int64_t)N->getSExtValue(); 100 return isInt<16>(v); 101 }]>; 102 103 104 def s13ImmPred : PatLeaf<(i32 imm), [{ 105 // s13ImmPred predicate - True if the immediate fits in a 13-bit sign extended 106 // field. 107 int64_t v = (int64_t)N->getSExtValue(); 108 return isInt<13>(v); 109 }]>; 110 111 112 def s12ImmPred : PatLeaf<(i32 imm), [{ 113 // s12ImmPred predicate - True if the immediate fits in a 12-bit 114 // sign extended field. 115 int64_t v = (int64_t)N->getSExtValue(); 116 return isInt<12>(v); 117 }]>; 118 119 def s11_0ImmPred : PatLeaf<(i32 imm), [{ 120 // s11_0ImmPred predicate - True if the immediate fits in a 11-bit 121 // sign extended field. 122 int64_t v = (int64_t)N->getSExtValue(); 123 return isInt<11>(v); 124 }]>; 125 126 127 def s11_1ImmPred : PatLeaf<(i32 imm), [{ 128 // s11_1ImmPred predicate - True if the immediate fits in a 12-bit 129 // sign extended field and is a multiple of 2. 130 int64_t v = (int64_t)N->getSExtValue(); 131 return isShiftedInt<11,1>(v); 132 }]>; 133 134 135 def s11_2ImmPred : PatLeaf<(i32 imm), [{ 136 // s11_2ImmPred predicate - True if the immediate fits in a 13-bit 137 // sign extended field and is a multiple of 4. 138 int64_t v = (int64_t)N->getSExtValue(); 139 return isShiftedInt<11,2>(v); 140 }]>; 141 142 143 def s11_3ImmPred : PatLeaf<(i32 imm), [{ 144 // s11_3ImmPred predicate - True if the immediate fits in a 14-bit 145 // sign extended field and is a multiple of 8. 146 int64_t v = (int64_t)N->getSExtValue(); 147 return isShiftedInt<11,3>(v); 148 }]>; 149 150 151 def s10ImmPred : PatLeaf<(i32 imm), [{ 152 // s10ImmPred predicate - True if the immediate fits in a 10-bit sign extended 153 // field. 154 int64_t v = (int64_t)N->getSExtValue(); 155 return isInt<10>(v); 156 }]>; 157 158 159 def s9ImmPred : PatLeaf<(i32 imm), [{ 160 // s9ImmPred predicate - True if the immediate fits in a 9-bit sign extended 161 // field. 162 int64_t v = (int64_t)N->getSExtValue(); 163 return isInt<9>(v); 164 }]>; 165 166 def m9ImmPred : PatLeaf<(i32 imm), [{ 167 // m9ImmPred predicate - True if the immediate fits in a 9-bit magnitude 168 // field. The range of m9 is -255 to 255. 169 int64_t v = (int64_t)N->getSExtValue(); 170 return isInt<9>(v) && (v != -256); 171 }]>; 172 173 def s8ImmPred : PatLeaf<(i32 imm), [{ 174 // s8ImmPred predicate - True if the immediate fits in a 8-bit sign extended 175 // field. 176 int64_t v = (int64_t)N->getSExtValue(); 177 return isInt<8>(v); 178 }]>; 179 180 181 def s8Imm64Pred : PatLeaf<(i64 imm), [{ 182 // s8ImmPred predicate - True if the immediate fits in a 8-bit sign extended 183 // field. 184 int64_t v = (int64_t)N->getSExtValue(); 185 return isInt<8>(v); 186 }]>; 187 188 189 def s6ImmPred : PatLeaf<(i32 imm), [{ 190 // s6ImmPred predicate - True if the immediate fits in a 6-bit sign extended 191 // field. 192 int64_t v = (int64_t)N->getSExtValue(); 193 return isInt<6>(v); 194 }]>; 195 196 197 def s4_0ImmPred : PatLeaf<(i32 imm), [{ 198 // s4_0ImmPred predicate - True if the immediate fits in a 4-bit sign extended 199 // field. 200 int64_t v = (int64_t)N->getSExtValue(); 201 return isInt<4>(v); 202 }]>; 203 204 205 def s4_1ImmPred : PatLeaf<(i32 imm), [{ 206 // s4_1ImmPred predicate - True if the immediate fits in a 4-bit sign extended 207 // field of 2. 208 int64_t v = (int64_t)N->getSExtValue(); 209 return isShiftedInt<4,1>(v); 210 }]>; 211 212 213 def s4_2ImmPred : PatLeaf<(i32 imm), [{ 214 // s4_2ImmPred predicate - True if the immediate fits in a 4-bit sign extended 215 // field that is a multiple of 4. 216 int64_t v = (int64_t)N->getSExtValue(); 217 return isShiftedInt<4,2>(v); 218 }]>; 219 220 221 def s4_3ImmPred : PatLeaf<(i32 imm), [{ 222 // s4_3ImmPred predicate - True if the immediate fits in a 4-bit sign extended 223 // field that is a multiple of 8. 224 int64_t v = (int64_t)N->getSExtValue(); 225 return isShiftedInt<4,3>(v); 226 }]>; 227 228 229 def u64ImmPred : PatLeaf<(i64 imm), [{ 230 // Adding "N ||" to suppress gcc unused warning. 231 return (N || true); 232 }]>; 233 234 def u32ImmPred : PatLeaf<(i32 imm), [{ 235 // u32ImmPred predicate - True if the immediate fits in a 32-bit field. 236 int64_t v = (int64_t)N->getSExtValue(); 237 return isUInt<32>(v); 238 }]>; 239 240 def u26_6ImmPred : PatLeaf<(i32 imm), [{ 241 // u26_6ImmPred - True if the immediate fits in a 32-bit field and 242 // is a multiple of 64. 243 int64_t v = (int64_t)N->getSExtValue(); 244 return isShiftedUInt<26,6>(v); 245 }]>; 246 247 def u16ImmPred : PatLeaf<(i32 imm), [{ 248 // u16ImmPred predicate - True if the immediate fits in a 16-bit unsigned 249 // field. 250 int64_t v = (int64_t)N->getSExtValue(); 251 return isUInt<16>(v); 252 }]>; 253 254 def u16_s8ImmPred : PatLeaf<(i32 imm), [{ 255 // u16_s8ImmPred predicate - True if the immediate fits in a 16-bit sign 256 // extended s8 field. 257 int64_t v = (int64_t)N->getSExtValue(); 258 return isShiftedUInt<16,8>(v); 259 }]>; 260 261 def u9ImmPred : PatLeaf<(i32 imm), [{ 262 // u9ImmPred predicate - True if the immediate fits in a 9-bit unsigned 263 // field. 264 int64_t v = (int64_t)N->getSExtValue(); 265 return isUInt<9>(v); 266 }]>; 267 268 269 def u8ImmPred : PatLeaf<(i32 imm), [{ 270 // u8ImmPred predicate - True if the immediate fits in a 8-bit unsigned 271 // field. 272 int64_t v = (int64_t)N->getSExtValue(); 273 return isUInt<8>(v); 274 }]>; 275 276 def u7StrictPosImmPred : ImmLeaf<i32, [{ 277 // u7StrictPosImmPred predicate - True if the immediate fits in an 7-bit 278 // unsigned field and is strictly greater than 0. 279 return isUInt<7>(Imm) && Imm > 0; 280 }]>; 281 282 def u7ImmPred : PatLeaf<(i32 imm), [{ 283 // u7ImmPred predicate - True if the immediate fits in a 7-bit unsigned 284 // field. 285 int64_t v = (int64_t)N->getSExtValue(); 286 return isUInt<7>(v); 287 }]>; 288 289 290 def u6ImmPred : PatLeaf<(i32 imm), [{ 291 // u6ImmPred predicate - True if the immediate fits in a 6-bit unsigned 292 // field. 293 int64_t v = (int64_t)N->getSExtValue(); 294 return isUInt<6>(v); 295 }]>; 296 297 def u6_0ImmPred : PatLeaf<(i32 imm), [{ 298 // u6_0ImmPred predicate - True if the immediate fits in a 6-bit unsigned 299 // field. Same as u6ImmPred. 300 int64_t v = (int64_t)N->getSExtValue(); 301 return isUInt<6>(v); 302 }]>; 303 304 def u6_1ImmPred : PatLeaf<(i32 imm), [{ 305 // u6_1ImmPred predicate - True if the immediate fits in a 7-bit unsigned 306 // field that is 1 bit alinged - multiple of 2. 307 int64_t v = (int64_t)N->getSExtValue(); 308 return isShiftedUInt<6,1>(v); 309 }]>; 310 311 def u6_2ImmPred : PatLeaf<(i32 imm), [{ 312 // u6_2ImmPred predicate - True if the immediate fits in a 8-bit unsigned 313 // field that is 2 bits alinged - multiple of 4. 314 int64_t v = (int64_t)N->getSExtValue(); 315 return isShiftedUInt<6,2>(v); 316 }]>; 317 318 def u6_3ImmPred : PatLeaf<(i32 imm), [{ 319 // u6_3ImmPred predicate - True if the immediate fits in a 9-bit unsigned 320 // field that is 3 bits alinged - multiple of 8. 321 int64_t v = (int64_t)N->getSExtValue(); 322 return isShiftedUInt<6,3>(v); 323 }]>; 324 325 def u5ImmPred : PatLeaf<(i32 imm), [{ 326 // u5ImmPred predicate - True if the immediate fits in a 5-bit unsigned 327 // field. 328 int64_t v = (int64_t)N->getSExtValue(); 329 return isUInt<5>(v); 330 }]>; 331 332 333 def u3ImmPred : PatLeaf<(i32 imm), [{ 334 // u3ImmPred predicate - True if the immediate fits in a 3-bit unsigned 335 // field. 336 int64_t v = (int64_t)N->getSExtValue(); 337 return isUInt<3>(v); 338 }]>; 339 340 341 def u2ImmPred : PatLeaf<(i32 imm), [{ 342 // u2ImmPred predicate - True if the immediate fits in a 2-bit unsigned 343 // field. 344 int64_t v = (int64_t)N->getSExtValue(); 345 return isUInt<2>(v); 346 }]>; 347 348 349 def u1ImmPred : PatLeaf<(i1 imm), [{ 350 // u1ImmPred predicate - True if the immediate fits in a 1-bit unsigned 351 // field. 352 int64_t v = (int64_t)N->getSExtValue(); 353 return isUInt<1>(v); 354 }]>; 355 356 def m5BImmPred : PatLeaf<(i32 imm), [{ 357 // m5BImmPred predicate - True if the (char) number is in range -1 .. -31 358 // and will fit in a 5 bit field when made positive, for use in memops. 359 // this is specific to the zero extending of a negative by CombineInstr 360 int8_t v = (int8_t)N->getSExtValue(); 361 return (-31 <= v && v <= -1); 362 }]>; 363 364 def m5HImmPred : PatLeaf<(i32 imm), [{ 365 // m5HImmPred predicate - True if the (short) number is in range -1 .. -31 366 // and will fit in a 5 bit field when made positive, for use in memops. 367 // this is specific to the zero extending of a negative by CombineInstr 368 int16_t v = (int16_t)N->getSExtValue(); 369 return (-31 <= v && v <= -1); 370 }]>; 371 372 def m5ImmPred : PatLeaf<(i32 imm), [{ 373 // m5ImmPred predicate - True if the number is in range -1 .. -31 374 // and will fit in a 5 bit field when made positive, for use in memops. 375 int64_t v = (int64_t)N->getSExtValue(); 376 return (-31 <= v && v <= -1); 377 }]>; 378 379 //InN means negative integers in [-(2^N - 1), 0] 380 def n8ImmPred : PatLeaf<(i32 imm), [{ 381 // n8ImmPred predicate - True if the immediate fits in a 8-bit signed 382 // field. 383 int64_t v = (int64_t)N->getSExtValue(); 384 return (-255 <= v && v <= 0); 385 }]>; 386 387 def nOneImmPred : PatLeaf<(i32 imm), [{ 388 // nOneImmPred predicate - True if the immediate is -1. 389 int64_t v = (int64_t)N->getSExtValue(); 390 return (-1 == v); 391 }]>; 392 393 def Set5ImmPred : PatLeaf<(i32 imm), [{ 394 // Set5ImmPred predicate - True if the number is in the series of values. 395 // [ 2^0, 2^1, ... 2^31 ] 396 // For use in setbit immediate. 397 uint32_t v = (int32_t)N->getSExtValue(); 398 // Constrain to 32 bits, and then check for single bit. 399 return ImmIsSingleBit(v); 400 }]>; 401 402 def Clr5ImmPred : PatLeaf<(i32 imm), [{ 403 // Clr5ImmPred predicate - True if the number is in the series of 404 // bit negated values. 405 // [ 2^0, 2^1, ... 2^31 ] 406 // For use in clrbit immediate. 407 // Note: we are bit NOTing the value. 408 uint32_t v = ~ (int32_t)N->getSExtValue(); 409 // Constrain to 32 bits, and then check for single bit. 410 return ImmIsSingleBit(v); 411 }]>; 412 413 def SetClr5ImmPred : PatLeaf<(i32 imm), [{ 414 // SetClr5ImmPred predicate - True if the immediate is in range 0..31. 415 int32_t v = (int32_t)N->getSExtValue(); 416 return (v >= 0 && v <= 31); 417 }]>; 418 419 def Set4ImmPred : PatLeaf<(i32 imm), [{ 420 // Set4ImmPred predicate - True if the number is in the series of values: 421 // [ 2^0, 2^1, ... 2^15 ]. 422 // For use in setbit immediate. 423 uint16_t v = (int16_t)N->getSExtValue(); 424 // Constrain to 16 bits, and then check for single bit. 425 return ImmIsSingleBit(v); 426 }]>; 427 428 def Clr4ImmPred : PatLeaf<(i32 imm), [{ 429 // Clr4ImmPred predicate - True if the number is in the series of 430 // bit negated values: 431 // [ 2^0, 2^1, ... 2^15 ]. 432 // For use in setbit and clrbit immediate. 433 uint16_t v = ~ (int16_t)N->getSExtValue(); 434 // Constrain to 16 bits, and then check for single bit. 435 return ImmIsSingleBit(v); 436 }]>; 437 438 def SetClr4ImmPred : PatLeaf<(i32 imm), [{ 439 // SetClr4ImmPred predicate - True if the immediate is in the range 0..15. 440 int16_t v = (int16_t)N->getSExtValue(); 441 return (v >= 0 && v <= 15); 442 }]>; 443 444 def Set3ImmPred : PatLeaf<(i32 imm), [{ 445 // Set3ImmPred predicate - True if the number is in the series of values: 446 // [ 2^0, 2^1, ... 2^7 ]. 447 // For use in setbit immediate. 448 uint8_t v = (int8_t)N->getSExtValue(); 449 // Constrain to 8 bits, and then check for single bit. 450 return ImmIsSingleBit(v); 451 }]>; 452 453 def Clr3ImmPred : PatLeaf<(i32 imm), [{ 454 // Clr3ImmPred predicate - True if the number is in the series of 455 // bit negated values: 456 // [ 2^0, 2^1, ... 2^7 ]. 457 // For use in setbit and clrbit immediate. 458 uint8_t v = ~ (int8_t)N->getSExtValue(); 459 // Constrain to 8 bits, and then check for single bit. 460 return ImmIsSingleBit(v); 461 }]>; 462 463 def SetClr3ImmPred : PatLeaf<(i32 imm), [{ 464 // SetClr3ImmPred predicate - True if the immediate is in the range 0..7. 465 int8_t v = (int8_t)N->getSExtValue(); 466 return (v >= 0 && v <= 7); 467 }]>; 468 469 470 // Extendable immediate operands. 471 472 let PrintMethod = "printExtOperand" in { 473 def s16Ext : Operand<i32>; 474 def s12Ext : Operand<i32>; 475 def s10Ext : Operand<i32>; 476 def s9Ext : Operand<i32>; 477 def s8Ext : Operand<i32>; 478 def s6Ext : Operand<i32>; 479 def s11_0Ext : Operand<i32>; 480 def s11_1Ext : Operand<i32>; 481 def s11_2Ext : Operand<i32>; 482 def s11_3Ext : Operand<i32>; 483 def u6Ext : Operand<i32>; 484 def u7Ext : Operand<i32>; 485 def u8Ext : Operand<i32>; 486 def u9Ext : Operand<i32>; 487 def u10Ext : Operand<i32>; 488 def u6_0Ext : Operand<i32>; 489 def u6_1Ext : Operand<i32>; 490 def u6_2Ext : Operand<i32>; 491 def u6_3Ext : Operand<i32>; 492 } 493 494 let PrintMethod = "printImmOperand" in 495 def u0AlwaysExt : Operand<i32>; 496 497 // Predicates for constant extendable operands 498 def s16ExtPred : PatLeaf<(i32 imm), [{ 499 int64_t v = (int64_t)N->getSExtValue(); 500 if (!Subtarget.hasV4TOps()) 501 // Return true if the immediate can fit in a 16-bit sign extended field. 502 return isInt<16>(v); 503 else { 504 if (isInt<16>(v)) 505 return true; 506 507 // Return true if extending this immediate is profitable and the value 508 // can fit in a 32-bit signed field. 509 return isConstExtProfitable(Node) && isInt<32>(v); 510 } 511 }]>; 512 513 def s10ExtPred : PatLeaf<(i32 imm), [{ 514 int64_t v = (int64_t)N->getSExtValue(); 515 if (!Subtarget.hasV4TOps()) 516 // Return true if the immediate can fit in a 10-bit sign extended field. 517 return isInt<10>(v); 518 else { 519 if (isInt<10>(v)) 520 return true; 521 522 // Return true if extending this immediate is profitable and the value 523 // can fit in a 32-bit signed field. 524 return isConstExtProfitable(Node) && isInt<32>(v); 525 } 526 }]>; 527 528 def s9ExtPred : PatLeaf<(i32 imm), [{ 529 int64_t v = (int64_t)N->getSExtValue(); 530 if (!Subtarget.hasV4TOps()) 531 // Return true if the immediate can fit in a 9-bit sign extended field. 532 return isInt<9>(v); 533 else { 534 if (isInt<9>(v)) 535 return true; 536 537 // Return true if extending this immediate is profitable and the value 538 // can fit in a 32-bit unsigned field. 539 return isConstExtProfitable(Node) && isInt<32>(v); 540 } 541 }]>; 542 543 def s8ExtPred : PatLeaf<(i32 imm), [{ 544 int64_t v = (int64_t)N->getSExtValue(); 545 if (!Subtarget.hasV4TOps()) 546 // Return true if the immediate can fit in a 8-bit sign extended field. 547 return isInt<8>(v); 548 else { 549 if (isInt<8>(v)) 550 return true; 551 552 // Return true if extending this immediate is profitable and the value 553 // can fit in a 32-bit signed field. 554 return isConstExtProfitable(Node) && isInt<32>(v); 555 } 556 }]>; 557 558 def s8_16ExtPred : PatLeaf<(i32 imm), [{ 559 int64_t v = (int64_t)N->getSExtValue(); 560 if (!Subtarget.hasV4TOps()) 561 // Return true if the immediate fits in a 8-bit sign extended field. 562 return isInt<8>(v); 563 else { 564 if (isInt<8>(v)) 565 return true; 566 567 // Return true if extending this immediate is profitable and the value 568 // can't fit in a 16-bit signed field. This is required to avoid 569 // unnecessary constant extenders. 570 return isConstExtProfitable(Node) && !isInt<16>(v); 571 } 572 }]>; 573 574 def s6ExtPred : PatLeaf<(i32 imm), [{ 575 int64_t v = (int64_t)N->getSExtValue(); 576 if (!Subtarget.hasV4TOps()) 577 // Return true if the immediate can fit in a 6-bit sign extended field. 578 return isInt<6>(v); 579 else { 580 if (isInt<6>(v)) 581 return true; 582 583 // Return true if extending this immediate is profitable and the value 584 // can fit in a 32-bit unsigned field. 585 return isConstExtProfitable(Node) && isInt<32>(v); 586 } 587 }]>; 588 589 def s6_16ExtPred : PatLeaf<(i32 imm), [{ 590 int64_t v = (int64_t)N->getSExtValue(); 591 if (!Subtarget.hasV4TOps()) 592 // Return true if the immediate fits in a 6-bit sign extended field. 593 return isInt<6>(v); 594 else { 595 if (isInt<6>(v)) 596 return true; 597 598 // Return true if extending this immediate is profitable and the value 599 // can't fit in a 16-bit signed field. This is required to avoid 600 // unnecessary constant extenders. 601 return isConstExtProfitable(Node) && !isInt<16>(v); 602 } 603 }]>; 604 605 def s6_10ExtPred : PatLeaf<(i32 imm), [{ 606 int64_t v = (int64_t)N->getSExtValue(); 607 if (!Subtarget.hasV4TOps()) 608 // Return true if the immediate can fit in a 6-bit sign extended field. 609 return isInt<6>(v); 610 else { 611 if (isInt<6>(v)) 612 return true; 613 614 // Return true if extending this immediate is profitable and the value 615 // can't fit in a 10-bit signed field. This is required to avoid 616 // unnecessary constant extenders. 617 return isConstExtProfitable(Node) && !isInt<10>(v); 618 } 619 }]>; 620 621 def s11_0ExtPred : PatLeaf<(i32 imm), [{ 622 int64_t v = (int64_t)N->getSExtValue(); 623 if (!Subtarget.hasV4TOps()) 624 // Return true if the immediate can fit in a 11-bit sign extended field. 625 return isShiftedInt<11,0>(v); 626 else { 627 if (isInt<11>(v)) 628 return true; 629 630 // Return true if extending this immediate is profitable and the value 631 // can fit in a 32-bit signed field. 632 return isConstExtProfitable(Node) && isInt<32>(v); 633 } 634 }]>; 635 636 def s11_1ExtPred : PatLeaf<(i32 imm), [{ 637 int64_t v = (int64_t)N->getSExtValue(); 638 if (!Subtarget.hasV4TOps()) 639 // Return true if the immediate can fit in a 12-bit sign extended field and 640 // is 2 byte aligned. 641 return isShiftedInt<11,1>(v); 642 else { 643 if (isInt<12>(v)) 644 return isShiftedInt<11,1>(v); 645 646 // Return true if extending this immediate is profitable and the low 1 bit 647 // is zero (2-byte aligned). 648 return isConstExtProfitable(Node) && isInt<32>(v) && ((v % 2) == 0); 649 } 650 }]>; 651 652 def s11_2ExtPred : PatLeaf<(i32 imm), [{ 653 int64_t v = (int64_t)N->getSExtValue(); 654 if (!Subtarget.hasV4TOps()) 655 // Return true if the immediate can fit in a 13-bit sign extended field and 656 // is 4-byte aligned. 657 return isShiftedInt<11,2>(v); 658 else { 659 if (isInt<13>(v)) 660 return isShiftedInt<11,2>(v); 661 662 // Return true if extending this immediate is profitable and the low 2-bits 663 // are zero (4-byte aligned). 664 return isConstExtProfitable(Node) && isInt<32>(v) && ((v % 4) == 0); 665 } 666 }]>; 667 668 def s11_3ExtPred : PatLeaf<(i32 imm), [{ 669 int64_t v = (int64_t)N->getSExtValue(); 670 if (!Subtarget.hasV4TOps()) 671 // Return true if the immediate can fit in a 14-bit sign extended field and 672 // is 8-byte aligned. 673 return isShiftedInt<11,3>(v); 674 else { 675 if (isInt<14>(v)) 676 return isShiftedInt<11,3>(v); 677 678 // Return true if extending this immediate is profitable and the low 3-bits 679 // are zero (8-byte aligned). 680 return isConstExtProfitable(Node) && isInt<32>(v) && ((v % 8) == 0); 681 } 682 }]>; 683 684 def u0AlwaysExtPred : PatLeaf<(i32 imm), [{ 685 // Predicate for an unsigned 32-bit value that always needs to be extended. 686 if (Subtarget.hasV4TOps()) { 687 if (isConstExtProfitable(Node)) { 688 int64_t v = (int64_t)N->getSExtValue(); 689 return isUInt<32>(v); 690 } 691 } 692 return false; 693 }]>; 694 695 def u6ExtPred : PatLeaf<(i32 imm), [{ 696 int64_t v = (int64_t)N->getSExtValue(); 697 if (!Subtarget.hasV4TOps()) 698 // Return true if the immediate can fit in a 6-bit unsigned field. 699 return isUInt<6>(v); 700 else { 701 if (isUInt<6>(v)) 702 return true; 703 704 // Return true if extending this immediate is profitable and the value 705 // can fit in a 32-bit unsigned field. 706 return isConstExtProfitable(Node) && isUInt<32>(v); 707 } 708 }]>; 709 710 def u7ExtPred : PatLeaf<(i32 imm), [{ 711 int64_t v = (int64_t)N->getSExtValue(); 712 if (!Subtarget.hasV4TOps()) 713 // Return true if the immediate can fit in a 7-bit unsigned field. 714 return isUInt<7>(v); 715 else { 716 if (isUInt<7>(v)) 717 return true; 718 719 // Return true if extending this immediate is profitable and the value 720 // can fit in a 32-bit unsigned field. 721 return isConstExtProfitable(Node) && isUInt<32>(v); 722 } 723 }]>; 724 725 def u8ExtPred : PatLeaf<(i32 imm), [{ 726 int64_t v = (int64_t)N->getSExtValue(); 727 if (!Subtarget.hasV4TOps()) 728 // Return true if the immediate can fit in a 8-bit unsigned field. 729 return isUInt<8>(v); 730 else { 731 if (isUInt<8>(v)) 732 return true; 733 734 // Return true if extending this immediate is profitable and the value 735 // can fit in a 32-bit unsigned field. 736 return isConstExtProfitable(Node) && isUInt<32>(v); 737 } 738 }]>; 739 740 def u9ExtPred : PatLeaf<(i32 imm), [{ 741 int64_t v = (int64_t)N->getSExtValue(); 742 if (!Subtarget.hasV4TOps()) 743 // Return true if the immediate can fit in a 9-bit unsigned field. 744 return isUInt<9>(v); 745 else { 746 if (isUInt<9>(v)) 747 return true; 748 749 // Return true if extending this immediate is profitable and the value 750 // can fit in a 32-bit unsigned field. 751 return isConstExtProfitable(Node) && isUInt<32>(v); 752 } 753 }]>; 754 755 def u6_1ExtPred : PatLeaf<(i32 imm), [{ 756 int64_t v = (int64_t)N->getSExtValue(); 757 if (!Subtarget.hasV4TOps()) 758 // Return true if the immediate can fit in a 7-bit unsigned field and 759 // is 2-byte aligned. 760 return isShiftedUInt<6,1>(v); 761 else { 762 if (isUInt<7>(v)) 763 return isShiftedUInt<6,1>(v); 764 765 // Return true if extending this immediate is profitable and the value 766 // can fit in a 32-bit unsigned field. 767 return isConstExtProfitable(Node) && isUInt<32>(v) && ((v % 2) == 0); 768 } 769 }]>; 770 771 def u6_2ExtPred : PatLeaf<(i32 imm), [{ 772 int64_t v = (int64_t)N->getSExtValue(); 773 if (!Subtarget.hasV4TOps()) 774 // Return true if the immediate can fit in a 8-bit unsigned field and 775 // is 4-byte aligned. 776 return isShiftedUInt<6,2>(v); 777 else { 778 if (isUInt<8>(v)) 779 return isShiftedUInt<6,2>(v); 780 781 // Return true if extending this immediate is profitable and the value 782 // can fit in a 32-bit unsigned field. 783 return isConstExtProfitable(Node) && isUInt<32>(v) && ((v % 4) == 0); 784 } 785 }]>; 786 787 def u6_3ExtPred : PatLeaf<(i32 imm), [{ 788 int64_t v = (int64_t)N->getSExtValue(); 789 if (!Subtarget.hasV4TOps()) 790 // Return true if the immediate can fit in a 9-bit unsigned field and 791 // is 8-byte aligned. 792 return isShiftedUInt<6,3>(v); 793 else { 794 if (isUInt<9>(v)) 795 return isShiftedUInt<6,3>(v); 796 797 // Return true if extending this immediate is profitable and the value 798 // can fit in a 32-bit unsigned field. 799 return isConstExtProfitable(Node) && isUInt<32>(v) && ((v % 8) == 0); 800 } 801 }]>; 802 803 // Addressing modes. 804 805 def ADDRrr : ComplexPattern<i32, 2, "SelectADDRrr", [], []>; 806 def ADDRri : ComplexPattern<i32, 2, "SelectADDRri", [frameindex], []>; 807 def ADDRriS11_0 : ComplexPattern<i32, 2, "SelectADDRriS11_0", [frameindex], []>; 808 def ADDRriS11_1 : ComplexPattern<i32, 2, "SelectADDRriS11_1", [frameindex], []>; 809 def ADDRriS11_2 : ComplexPattern<i32, 2, "SelectADDRriS11_2", [frameindex], []>; 810 def ADDRriS11_3 : ComplexPattern<i32, 2, "SelectADDRriS11_3", [frameindex], []>; 811 def ADDRriU6_0 : ComplexPattern<i32, 2, "SelectADDRriU6_0", [frameindex], []>; 812 def ADDRriU6_1 : ComplexPattern<i32, 2, "SelectADDRriU6_1", [frameindex], []>; 813 def ADDRriU6_2 : ComplexPattern<i32, 2, "SelectADDRriU6_2", [frameindex], []>; 814 815 // Address operands. 816 817 def MEMrr : Operand<i32> { 818 let PrintMethod = "printMEMrrOperand"; 819 let MIOperandInfo = (ops IntRegs, IntRegs); 820 } 821 822 def MEMri : Operand<i32> { 823 let PrintMethod = "printMEMriOperand"; 824 let MIOperandInfo = (ops IntRegs, IntRegs); 825 } 826 827 def MEMri_s11_2 : Operand<i32>, 828 ComplexPattern<i32, 2, "SelectMEMriS11_2", []> { 829 let PrintMethod = "printMEMriOperand"; 830 let MIOperandInfo = (ops IntRegs, s11Imm); 831 } 832 833 def FrameIndex : Operand<i32> { 834 let PrintMethod = "printFrameIndexOperand"; 835 let MIOperandInfo = (ops IntRegs, s11Imm); 836 } 837 838 let PrintMethod = "printGlobalOperand" in { 839 def globaladdress : Operand<i32>; 840 def globaladdressExt : Operand<i32>; 841 } 842 843 let PrintMethod = "printJumpTable" in 844 def jumptablebase : Operand<i32>; 845 846 def brtarget : Operand<OtherVT>; 847 def brtargetExt : Operand<OtherVT>; 848 def calltarget : Operand<i32>; 849 850 def bblabel : Operand<i32>; 851 def bbl : SDNode<"ISD::BasicBlock", SDTPtrLeaf , [], "BasicBlockSDNode">; 852 853 def symbolHi32 : Operand<i32> { 854 let PrintMethod = "printSymbolHi"; 855 } 856 def symbolLo32 : Operand<i32> { 857 let PrintMethod = "printSymbolLo"; 858 } 859