- Timestamp:
- Apr 19, 2011, 11:12:07 PM (14 years ago)
- Location:
- clamav/trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
clamav/trunk ¶
-
Property svn:mergeinfo
set to
/clamav/vendor/0.97 merged eligible
-
Property svn:mergeinfo
set to
-
TabularUnified clamav/trunk/libclamav/c++/llvm/lib/Target/X86/X86Instr64bit.td ¶
r189 r319 19 19 20 20 // 64-bits but only 32 bits are significant. 21 def i64i32imm : Operand<i64>; 21 def i64i32imm : Operand<i64> { 22 let ParserMatchClass = ImmSExti64i32AsmOperand; 23 } 22 24 23 25 // 64-bits but only 32 bits are significant, and those bits are treated as being … … 25 27 def i64i32imm_pcrel : Operand<i64> { 26 28 let PrintMethod = "print_pcrel_imm"; 29 let ParserMatchClass = X86AbsMemAsmOperand; 27 30 } 28 31 … … 30 33 // 64-bits but only 8 bits are significant. 31 34 def i64i8imm : Operand<i64> { 32 let ParserMatchClass = ImmSExt8AsmOperand; 33 } 34 35 def lea64mem : Operand<i64> { 36 let PrintMethod = "printlea64mem"; 37 let MIOperandInfo = (ops GR64, i8imm, GR64_NOSP, i32imm); 35 let ParserMatchClass = ImmSExti64i8AsmOperand; 36 } 37 38 def lea64_32mem : Operand<i32> { 39 let PrintMethod = "printi32mem"; 40 let AsmOperandLowerMethod = "lower_lea64_32mem"; 41 let MIOperandInfo = (ops GR32, i8imm, GR32_NOSP, i32imm, i8imm); 38 42 let ParserMatchClass = X86MemAsmOperand; 39 43 } 40 44 41 def lea64_32mem : Operand<i32> { 42 let PrintMethod = "printlea64_32mem"; 43 let AsmOperandLowerMethod = "lower_lea64_32mem"; 44 let MIOperandInfo = (ops GR32, i8imm, GR32_NOSP, i32imm); 45 46 // Special i64mem for addresses of load folding tail calls. These are not 47 // allowed to use callee-saved registers since they must be scheduled 48 // after callee-saved register are popped. 49 def i64mem_TC : Operand<i64> { 50 let PrintMethod = "printi64mem"; 51 let MIOperandInfo = (ops GR64_TC, i8imm, GR64_TC, i32imm, i8imm); 45 52 let ParserMatchClass = X86MemAsmOperand; 46 53 } … … 49 56 // Complex Pattern Definitions. 50 57 // 51 def lea64addr : ComplexPattern<i64, 4, "SelectLEAAddr",58 def lea64addr : ComplexPattern<i64, 5, "SelectLEAAddr", 52 59 [add, sub, mul, X86mul_imm, shl, or, frameindex, 53 60 X86WrapperRIP], []>; 54 61 55 def tls64addr : ComplexPattern<i64, 4, "SelectTLSADDRAddr",62 def tls64addr : ComplexPattern<i64, 5, "SelectTLSADDRAddr", 56 63 [tglobaltlsaddr], []>; 57 64 58 65 //===----------------------------------------------------------------------===// 59 66 // Pattern fragments. … … 67 74 }]>; 68 75 69 def i64immSExt32 : PatLeaf<(i64 imm), [{ 70 // i64immSExt32 predicate - True if the 64-bit immediate fits in a 32-bit 71 // sign extended field. 72 return (int64_t)N->getZExtValue() == (int32_t)N->getZExtValue(); 73 }]>; 76 def i64immSExt32 : PatLeaf<(i64 imm), [{ return i64immSExt32(N); }]>; 74 77 75 78 … … 135 138 // that the offset between an arbitrary immediate and the call will fit in 136 139 // the 32-bit pcrel field that we have. 137 def CALL64pcrel32 : Ii32 <0xE8, RawFrm,140 def CALL64pcrel32 : Ii32PCRel<0xE8, RawFrm, 138 141 (outs), (ins i64i32imm_pcrel:$dst, variable_ops), 139 142 "call{q}\t$dst", []>, … … 152 155 // FIXME: We need to teach codegen about single list of call-clobbered 153 156 // registers. 154 let isCall = 1 in157 let isCall = 1, isCodeGenOnly = 1 in 155 158 // All calls clobber the non-callee saved registers. RSP is marked as 156 159 // a use to prevent stack-pointer assignments that appear immediately … … 162 165 XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, EFLAGS], 163 166 Uses = [RSP] in { 164 def WINCALL64pcrel32 : I <0xE8, RawFrm,167 def WINCALL64pcrel32 : Ii32PCRel<0xE8, RawFrm, 165 168 (outs), (ins i64i32imm_pcrel:$dst, variable_ops), 166 169 "call\t$dst", []>, … … 176 179 177 180 178 let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1 in 179 def TCRETURNdi64 : I<0, Pseudo, (outs), (ins i64imm:$dst, i32imm:$offset, 180 variable_ops), 181 "#TC_RETURN $dst $offset", 182 []>; 183 184 let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1 in 185 def TCRETURNri64 : I<0, Pseudo, (outs), (ins GR64:$dst, i32imm:$offset, 186 variable_ops), 187 "#TC_RETURN $dst $offset", 188 []>; 189 190 191 let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1 in 192 def TAILJMPr64 : I<0xFF, MRM4r, (outs), (ins GR64:$dst, variable_ops), 193 "jmp{q}\t{*}$dst # TAILCALL", 194 []>; 181 let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1, 182 isCodeGenOnly = 1 in 183 let Defs = [RAX, RCX, RDX, RSI, RDI, R8, R9, R10, R11, 184 FP0, FP1, FP2, FP3, FP4, FP5, FP6, ST0, ST1, 185 MM0, MM1, MM2, MM3, MM4, MM5, MM6, MM7, 186 XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7, 187 XMM8, XMM9, XMM10, XMM11, XMM12, XMM13, XMM14, XMM15, EFLAGS], 188 Uses = [RSP] in { 189 def TCRETURNdi64 : I<0, Pseudo, (outs), 190 (ins i64i32imm_pcrel:$dst, i32imm:$offset, variable_ops), 191 "#TC_RETURN $dst $offset", []>; 192 def TCRETURNri64 : I<0, Pseudo, (outs), (ins GR64_TC:$dst, i32imm:$offset, 193 variable_ops), 194 "#TC_RETURN $dst $offset", []>; 195 let mayLoad = 1 in 196 def TCRETURNmi64 : I<0, Pseudo, (outs), 197 (ins i64mem_TC:$dst, i32imm:$offset, variable_ops), 198 "#TC_RETURN $dst $offset", []>; 199 200 def TAILJMPd64 : Ii32PCRel<0xE9, RawFrm, (outs), 201 (ins i64i32imm_pcrel:$dst, variable_ops), 202 "jmp\t$dst # TAILCALL", []>; 203 def TAILJMPr64 : I<0xFF, MRM4r, (outs), (ins GR64_TC:$dst, variable_ops), 204 "jmp{q}\t{*}$dst # TAILCALL", []>; 205 206 let mayLoad = 1 in 207 def TAILJMPm64 : I<0xFF, MRM4m, (outs), (ins i64mem_TC:$dst, variable_ops), 208 "jmp{q}\t{*}$dst # TAILCALL", []>; 209 } 195 210 196 211 // Branches … … 199 214 "jmp{q}\t$dst", []>; 200 215 def JMP64r : I<0xFF, MRM4r, (outs), (ins GR64:$dst), "jmp{q}\t{*}$dst", 201 [(brind GR64:$dst)]> ;216 [(brind GR64:$dst)]>, Requires<[In64BitMode]>; 202 217 def JMP64m : I<0xFF, MRM4m, (outs), (ins i64mem:$dst), "jmp{q}\t{*}$dst", 203 [(brind (loadi64 addr:$dst))]> ;218 [(brind (loadi64 addr:$dst))]>, Requires<[In64BitMode]>; 204 219 def FARJMP64 : RI<0xFF, MRM5m, (outs), (ins opaque80mem:$dst), 205 220 "ljmp{q}\t{*}$dst", []>; … … 223 238 def POPCNT64rr : RI<0xB8, MRMSrcReg, (outs GR64:$dst), (ins GR64:$src), 224 239 "popcnt{q}\t{$src, $dst|$dst, $src}", []>, XS; 240 let mayLoad = 1 in 225 241 def POPCNT64rm : RI<0xB8, MRMSrcMem, (outs GR64:$dst), (ins i64mem:$src), 226 242 "popcnt{q}\t{$src, $dst|$dst, $src}", []>, XS; … … 228 244 let Defs = [RBP,RSP], Uses = [RBP,RSP], mayLoad = 1, neverHasSideEffects = 1 in 229 245 def LEAVE64 : I<0xC9, RawFrm, 230 (outs), (ins), "leave", []> ;246 (outs), (ins), "leave", []>, Requires<[In64BitMode]>; 231 247 let Defs = [RSP], Uses = [RSP], neverHasSideEffects=1 in { 232 248 let mayLoad = 1 in { … … 249 265 def PUSH64i16 : Ii16<0x68, RawFrm, (outs), (ins i16imm:$imm), 250 266 "push{q}\t$imm", []>; 251 def PUSH64i32 : Ii32<0x68, RawFrm, (outs), (ins i 32imm:$imm),267 def PUSH64i32 : Ii32<0x68, RawFrm, (outs), (ins i64i32imm:$imm), 252 268 "push{q}\t$imm", []>; 253 269 } 254 270 255 let Defs = [RSP, EFLAGS], Uses = [RSP], mayLoad = 1 in 256 def POPFQ : I<0x9D, RawFrm, (outs), (ins), "popf{q}", []>, REX_W; 257 let Defs = [RSP], Uses = [RSP, EFLAGS], mayStore = 1 in 258 def PUSHFQ64 : I<0x9C, RawFrm, (outs), (ins), "pushf{q}", []>; 271 let Defs = [RSP, EFLAGS], Uses = [RSP], mayLoad = 1, neverHasSideEffects=1 in 272 def POPF64 : I<0x9D, RawFrm, (outs), (ins), "popfq", []>, 273 Requires<[In64BitMode]>; 274 let Defs = [RSP], Uses = [RSP, EFLAGS], mayStore = 1, neverHasSideEffects=1 in 275 def PUSHF64 : I<0x9C, RawFrm, (outs), (ins), "pushfq", []>, 276 Requires<[In64BitMode]>; 259 277 260 278 def LEA64_32r : I<0x8D, MRMSrcMem, … … 264 282 265 283 let isReMaterializable = 1 in 266 def LEA64r : RI<0x8D, MRMSrcMem, (outs GR64:$dst), (ins lea64mem:$src),284 def LEA64r : RI<0x8D, MRMSrcMem, (outs GR64:$dst), (ins i64mem:$src), 267 285 "lea{q}\t{$src|$dst}, {$dst|$src}", 268 286 [(set GR64:$dst, lea64addr:$src)]>; 269 287 270 let isTwoAddress = 1in288 let Constraints = "$src = $dst" in 271 289 def BSWAP64r : RI<0xC8, AddRegFrm, (outs GR64:$dst), (ins GR64:$src), 272 290 "bswap{q}\t$dst", … … 277 295 def BSF64rr : RI<0xBC, MRMSrcReg, (outs GR64:$dst), (ins GR64:$src), 278 296 "bsf{q}\t{$src, $dst|$dst, $src}", 279 [(set GR64:$dst, (X86bsf GR64:$src)), (implicit EFLAGS)]>, TB;297 [(set GR64:$dst, EFLAGS, (X86bsf GR64:$src))]>, TB; 280 298 def BSF64rm : RI<0xBC, MRMSrcMem, (outs GR64:$dst), (ins i64mem:$src), 281 299 "bsf{q}\t{$src, $dst|$dst, $src}", 282 [(set GR64:$dst, (X86bsf (loadi64 addr:$src))), 283 (implicit EFLAGS)]>, TB; 300 [(set GR64:$dst, EFLAGS, (X86bsf (loadi64 addr:$src)))]>, TB; 284 301 285 302 def BSR64rr : RI<0xBD, MRMSrcReg, (outs GR64:$dst), (ins GR64:$src), 286 303 "bsr{q}\t{$src, $dst|$dst, $src}", 287 [(set GR64:$dst, (X86bsr GR64:$src)), (implicit EFLAGS)]>, TB;304 [(set GR64:$dst, EFLAGS, (X86bsr GR64:$src))]>, TB; 288 305 def BSR64rm : RI<0xBD, MRMSrcMem, (outs GR64:$dst), (ins i64mem:$src), 289 306 "bsr{q}\t{$src, $dst|$dst, $src}", 290 [(set GR64:$dst, (X86bsr (loadi64 addr:$src))), 291 (implicit EFLAGS)]>, TB; 307 [(set GR64:$dst, EFLAGS, (X86bsr (loadi64 addr:$src)))]>, TB; 292 308 } // Defs = [EFLAGS] 293 309 294 310 // Repeat string ops 295 let Defs = [RCX,RDI,RSI], Uses = [RCX,RDI,RSI] in311 let Defs = [RCX,RDI,RSI], Uses = [RCX,RDI,RSI], isCodeGenOnly = 1 in 296 312 def REP_MOVSQ : RI<0xA5, RawFrm, (outs), (ins), "{rep;movsq|rep movsq}", 297 313 [(X86rep_movs i64)]>, REP; 298 let Defs = [RCX,RDI], Uses = [RAX,RCX,RDI] in314 let Defs = [RCX,RDI], Uses = [RAX,RCX,RDI], isCodeGenOnly = 1 in 299 315 def REP_STOSQ : RI<0xAB, RawFrm, (outs), (ins), "{rep;stosq|rep stosq}", 300 316 [(X86rep_stos i64)]>, REP; 301 317 302 def SCAS64 : RI<0xAF, RawFrm, (outs), (ins), "scas{q}", []>; 303 304 def CMPS64 : RI<0xA7, RawFrm, (outs), (ins), "cmps{q}", []>; 318 let Defs = [EDI,ESI], Uses = [EDI,ESI,EFLAGS] in 319 def MOVSQ : RI<0xA5, RawFrm, (outs), (ins), "movsq", []>; 320 321 let Defs = [RCX,RDI], Uses = [RAX,RCX,RDI,EFLAGS] in 322 def STOSQ : RI<0xAB, RawFrm, (outs), (ins), "stosq", []>; 323 324 def SCAS64 : RI<0xAF, RawFrm, (outs), (ins), "scasq", []>; 325 326 def CMPS64 : RI<0xA7, RawFrm, (outs), (ins), "cmpsq", []>; 305 327 306 328 // Fast system-call instructions 307 329 def SYSEXIT64 : RI<0x35, RawFrm, 308 (outs), (ins), "sysexit", []>, TB ;330 (outs), (ins), "sysexit", []>, TB, Requires<[In64BitMode]>; 309 331 310 332 //===----------------------------------------------------------------------===// … … 325 347 } 326 348 349 // The assembler accepts movq of a 64-bit immediate as an alternate spelling of 350 // movabsq. 351 let isAsmParserOnly = 1 in { 352 def MOV64ri_alt : RIi64<0xB8, AddRegFrm, (outs GR64:$dst), (ins i64imm:$src), 353 "mov{q}\t{$src, $dst|$dst, $src}", []>; 354 } 355 356 let isCodeGenOnly = 1 in { 327 357 def MOV64rr_REV : RI<0x8B, MRMSrcReg, (outs GR64:$dst), (ins GR64:$src), 328 358 "mov{q}\t{$src, $dst|$dst, $src}", []>; 359 } 329 360 330 361 let canFoldAsLoad = 1, isReMaterializable = 1 in … … 340 371 [(store i64immSExt32:$src, addr:$dst)]>; 341 372 373 /// Versions of MOV64rr, MOV64rm, and MOV64mr for i64mem_TC and GR64_TC. 374 let isCodeGenOnly = 1 in { 375 let neverHasSideEffects = 1 in 376 def MOV64rr_TC : RI<0x89, MRMDestReg, (outs GR64_TC:$dst), (ins GR64_TC:$src), 377 "mov{q}\t{$src, $dst|$dst, $src}", []>; 378 379 let mayLoad = 1, 380 canFoldAsLoad = 1, isReMaterializable = 1 in 381 def MOV64rm_TC : RI<0x8B, MRMSrcMem, (outs GR64_TC:$dst), (ins i64mem_TC:$src), 382 "mov{q}\t{$src, $dst|$dst, $src}", 383 []>; 384 385 let mayStore = 1 in 386 def MOV64mr_TC : RI<0x89, MRMDestMem, (outs), (ins i64mem_TC:$dst, GR64_TC:$src), 387 "mov{q}\t{$src, $dst|$dst, $src}", 388 []>; 389 } 390 391 // FIXME: These definitions are utterly broken 392 // Just leave them commented out for now because they're useless outside 393 // of the large code model, and most compilers won't generate the instructions 394 // in question. 395 /* 342 396 def MOV64o8a : RIi8<0xA0, RawFrm, (outs), (ins offset8:$src), 343 397 "mov{q}\t{$src, %rax|%rax, $src}", []>; … … 348 402 def MOV64ao64 : RIi32<0xA3, RawFrm, (outs offset64:$dst), (ins), 349 403 "mov{q}\t{%rax, $dst|$dst, %rax}", []>; 404 */ 350 405 351 406 // Moves to and from segment registers … … 366 421 367 422 // Moves to and from control registers 368 def MOV64rc : I<0x20, MRMDestReg, (outs GR64:$dst), (ins CONTROL_REG _64:$src),423 def MOV64rc : I<0x20, MRMDestReg, (outs GR64:$dst), (ins CONTROL_REG:$src), 369 424 "mov{q}\t{$src, $dst|$dst, $src}", []>, TB; 370 def MOV64cr : I<0x22, MRMSrcReg, (outs CONTROL_REG _64:$dst), (ins GR64:$src),425 def MOV64cr : I<0x22, MRMSrcReg, (outs CONTROL_REG:$dst), (ins GR64:$src), 371 426 "mov{q}\t{$src, $dst|$dst, $src}", []>, TB; 372 427 … … 446 501 // we can use a SUBREG_TO_REG. 447 502 def : Pat<(i64 (zext def32:$src)), 448 (SUBREG_TO_REG (i64 0), GR32:$src, x86_subreg_32bit)>;503 (SUBREG_TO_REG (i64 0), GR32:$src, sub_32bit)>; 449 504 450 505 let neverHasSideEffects = 1 in { … … 464 519 let Defs = [EFLAGS] in { 465 520 466 def ADD64i32 : RI <0x05, RawFrm, (outs), (insi32imm:$src),467 "add{q}\t{$src, %rax|%rax, $src}", []>;468 469 let isTwoAddress = 1in {521 def ADD64i32 : RIi32<0x05, RawFrm, (outs), (ins i64i32imm:$src), 522 "add{q}\t{$src, %rax|%rax, $src}", []>; 523 524 let Constraints = "$src1 = $dst" in { 470 525 let isConvertibleToThreeAddress = 1 in { 471 526 let isCommutable = 1 in … … 474 529 (ins GR64:$src1, GR64:$src2), 475 530 "add{q}\t{$src2, $dst|$dst, $src2}", 476 [(set GR64:$dst, (add GR64:$src1, GR64:$src2)), 477 (implicit EFLAGS)]>; 531 [(set GR64:$dst, EFLAGS, 532 (X86add_flag GR64:$src1, GR64:$src2))]>; 533 534 // These are alternate spellings for use by the disassembler, we mark them as 535 // code gen only to ensure they aren't matched by the assembler. 536 let isCodeGenOnly = 1 in { 537 def ADD64rr_alt : RI<0x03, MRMSrcReg, (outs GR64:$dst), 538 (ins GR64:$src1, GR64:$src2), 539 "add{l}\t{$src2, $dst|$dst, $src2}", []>; 540 } 478 541 479 542 // Register-Integer Addition … … 481 544 (ins GR64:$src1, i64i8imm:$src2), 482 545 "add{q}\t{$src2, $dst|$dst, $src2}", 483 [(set GR64:$dst, (add GR64:$src1, i64immSExt8:$src2)),484 (implicit EFLAGS)]>;546 [(set GR64:$dst, EFLAGS, 547 (X86add_flag GR64:$src1, i64immSExt8:$src2))]>; 485 548 def ADD64ri32 : RIi32<0x81, MRM0r, (outs GR64:$dst), 486 549 (ins GR64:$src1, i64i32imm:$src2), 487 550 "add{q}\t{$src2, $dst|$dst, $src2}", 488 [(set GR64:$dst, (add GR64:$src1, i64immSExt32:$src2)),489 (implicit EFLAGS)]>;551 [(set GR64:$dst, EFLAGS, 552 (X86add_flag GR64:$src1, i64immSExt32:$src2))]>; 490 553 } // isConvertibleToThreeAddress 491 554 … … 494 557 (ins GR64:$src1, i64mem:$src2), 495 558 "add{q}\t{$src2, $dst|$dst, $src2}", 496 [(set GR64:$dst, (add GR64:$src1, (load addr:$src2))), 497 (implicit EFLAGS)]>; 498 499 // Register-Register Addition - Equivalent to the normal rr form (ADD64rr), but 500 // differently encoded. 501 def ADD64mrmrr : RI<0x03, MRMSrcReg, (outs GR64:$dst), 502 (ins GR64:$src1, GR64:$src2), 503 "add{l}\t{$src2, $dst|$dst, $src2}", []>; 504 505 } // isTwoAddress 559 [(set GR64:$dst, EFLAGS, 560 (X86add_flag GR64:$src1, (load addr:$src2)))]>; 561 562 } // Constraints = "$src1 = $dst" 506 563 507 564 // Memory-Register Addition … … 521 578 let Uses = [EFLAGS] in { 522 579 523 def ADC64i32 : RI <0x15, RawFrm, (outs), (insi32imm:$src),524 "adc{q}\t{$src, %rax|%rax, $src}", []>;525 526 let isTwoAddress = 1in {580 def ADC64i32 : RIi32<0x15, RawFrm, (outs), (ins i64i32imm:$src), 581 "adc{q}\t{$src, %rax|%rax, $src}", []>; 582 583 let Constraints = "$src1 = $dst" in { 527 584 let isCommutable = 1 in 528 585 def ADC64rr : RI<0x11, MRMDestReg, (outs GR64:$dst), … … 531 588 [(set GR64:$dst, (adde GR64:$src1, GR64:$src2))]>; 532 589 590 let isCodeGenOnly = 1 in { 533 591 def ADC64rr_REV : RI<0x13, MRMSrcReg , (outs GR32:$dst), 534 592 (ins GR64:$src1, GR64:$src2), 535 593 "adc{q}\t{$src2, $dst|$dst, $src2}", []>; 594 } 536 595 537 596 def ADC64rm : RI<0x13, MRMSrcMem , (outs GR64:$dst), … … 548 607 "adc{q}\t{$src2, $dst|$dst, $src2}", 549 608 [(set GR64:$dst, (adde GR64:$src1, i64immSExt32:$src2))]>; 550 } // isTwoAddress609 } // Constraints = "$src1 = $dst" 551 610 552 611 def ADC64mr : RI<0x11, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src2), … … 563 622 } // Uses = [EFLAGS] 564 623 565 let isTwoAddress = 1in {624 let Constraints = "$src1 = $dst" in { 566 625 // Register-Register Subtraction 567 626 def SUB64rr : RI<0x29, MRMDestReg, (outs GR64:$dst), 568 627 (ins GR64:$src1, GR64:$src2), 569 628 "sub{q}\t{$src2, $dst|$dst, $src2}", 570 [(set GR64:$dst, (sub GR64:$src1, GR64:$src2)), 571 (implicit EFLAGS)]>; 572 629 [(set GR64:$dst, EFLAGS, 630 (X86sub_flag GR64:$src1, GR64:$src2))]>; 631 632 let isCodeGenOnly = 1 in { 573 633 def SUB64rr_REV : RI<0x2B, MRMSrcReg, (outs GR64:$dst), 574 634 (ins GR64:$src1, GR64:$src2), 575 635 "sub{q}\t{$src2, $dst|$dst, $src2}", []>; 636 } 576 637 577 638 // Register-Memory Subtraction … … 579 640 (ins GR64:$src1, i64mem:$src2), 580 641 "sub{q}\t{$src2, $dst|$dst, $src2}", 581 [(set GR64:$dst, (sub GR64:$src1, (load addr:$src2))),582 (implicit EFLAGS)]>;642 [(set GR64:$dst, EFLAGS, 643 (X86sub_flag GR64:$src1, (load addr:$src2)))]>; 583 644 584 645 // Register-Integer Subtraction … … 586 647 (ins GR64:$src1, i64i8imm:$src2), 587 648 "sub{q}\t{$src2, $dst|$dst, $src2}", 588 [(set GR64:$dst, (sub GR64:$src1, i64immSExt8:$src2)),589 (implicit EFLAGS)]>;649 [(set GR64:$dst, EFLAGS, 650 (X86sub_flag GR64:$src1, i64immSExt8:$src2))]>; 590 651 def SUB64ri32 : RIi32<0x81, MRM5r, (outs GR64:$dst), 591 652 (ins GR64:$src1, i64i32imm:$src2), 592 653 "sub{q}\t{$src2, $dst|$dst, $src2}", 593 [(set GR64:$dst, (sub GR64:$src1, i64immSExt32:$src2)),594 (implicit EFLAGS)]>;595 } // isTwoAddress596 597 def SUB64i32 : RI <0x2D, RawFrm, (outs), (insi32imm:$src),598 "sub{q}\t{$src, %rax|%rax, $src}", []>;654 [(set GR64:$dst, EFLAGS, 655 (X86sub_flag GR64:$src1, i64immSExt32:$src2))]>; 656 } // Constraints = "$src1 = $dst" 657 658 def SUB64i32 : RIi32<0x2D, RawFrm, (outs), (ins i64i32imm:$src), 659 "sub{q}\t{$src, %rax|%rax, $src}", []>; 599 660 600 661 // Memory-Register Subtraction … … 617 678 618 679 let Uses = [EFLAGS] in { 619 let isTwoAddress = 1in {680 let Constraints = "$src1 = $dst" in { 620 681 def SBB64rr : RI<0x19, MRMDestReg, (outs GR64:$dst), 621 682 (ins GR64:$src1, GR64:$src2), … … 623 684 [(set GR64:$dst, (sube GR64:$src1, GR64:$src2))]>; 624 685 686 let isCodeGenOnly = 1 in { 625 687 def SBB64rr_REV : RI<0x1B, MRMSrcReg, (outs GR64:$dst), 626 688 (ins GR64:$src1, GR64:$src2), 627 689 "sbb{q}\t{$src2, $dst|$dst, $src2}", []>; 690 } 628 691 629 692 def SBB64rm : RI<0x1B, MRMSrcMem, (outs GR64:$dst), … … 640 703 "sbb{q}\t{$src2, $dst|$dst, $src2}", 641 704 [(set GR64:$dst, (sube GR64:$src1, i64immSExt32:$src2))]>; 642 } // isTwoAddress643 644 def SBB64i32 : RI <0x1D, RawFrm, (outs), (insi32imm:$src),645 "sbb{q}\t{$src, %rax|%rax, $src}", []>;705 } // Constraints = "$src1 = $dst" 706 707 def SBB64i32 : RIi32<0x1D, RawFrm, (outs), (ins i64i32imm:$src), 708 "sbb{q}\t{$src, %rax|%rax, $src}", []>; 646 709 647 710 def SBB64mr : RI<0x19, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src2), … … 674 737 675 738 let Defs = [EFLAGS] in { 676 let isTwoAddress = 1in {739 let Constraints = "$src1 = $dst" in { 677 740 let isCommutable = 1 in 678 741 // Register-Register Signed Integer Multiplication … … 680 743 (ins GR64:$src1, GR64:$src2), 681 744 "imul{q}\t{$src2, $dst|$dst, $src2}", 682 [(set GR64:$dst, (mul GR64:$src1, GR64:$src2)),683 (implicit EFLAGS)]>, TB;745 [(set GR64:$dst, EFLAGS, 746 (X86smul_flag GR64:$src1, GR64:$src2))]>, TB; 684 747 685 748 // Register-Memory Signed Integer Multiplication … … 687 750 (ins GR64:$src1, i64mem:$src2), 688 751 "imul{q}\t{$src2, $dst|$dst, $src2}", 689 [(set GR64:$dst, (mul GR64:$src1, (load addr:$src2))),690 (implicit EFLAGS)]>, TB;691 } // isTwoAddress752 [(set GR64:$dst, EFLAGS, 753 (X86smul_flag GR64:$src1, (load addr:$src2)))]>, TB; 754 } // Constraints = "$src1 = $dst" 692 755 693 756 // Suprisingly enough, these are not two address instructions! … … 697 760 (outs GR64:$dst), (ins GR64:$src1, i64i8imm:$src2), 698 761 "imul{q}\t{$src2, $src1, $dst|$dst, $src1, $src2}", 699 [(set GR64:$dst, (mul GR64:$src1, i64immSExt8:$src2)),700 (implicit EFLAGS)]>;762 [(set GR64:$dst, EFLAGS, 763 (X86smul_flag GR64:$src1, i64immSExt8:$src2))]>; 701 764 def IMUL64rri32 : RIi32<0x69, MRMSrcReg, // GR64 = GR64*I32 702 765 (outs GR64:$dst), (ins GR64:$src1, i64i32imm:$src2), 703 766 "imul{q}\t{$src2, $src1, $dst|$dst, $src1, $src2}", 704 [(set GR64:$dst, (mul GR64:$src1, i64immSExt32:$src2)),705 (implicit EFLAGS)]>;767 [(set GR64:$dst, EFLAGS, 768 (X86smul_flag GR64:$src1, i64immSExt32:$src2))]>; 706 769 707 770 // Memory-Integer Signed Integer Multiplication … … 709 772 (outs GR64:$dst), (ins i64mem:$src1, i64i8imm: $src2), 710 773 "imul{q}\t{$src2, $src1, $dst|$dst, $src1, $src2}", 711 [(set GR64:$dst, (mul (load addr:$src1),712 i64immSExt8:$src2)),713 (implicit EFLAGS)]>;774 [(set GR64:$dst, EFLAGS, 775 (X86smul_flag (load addr:$src1), 776 i64immSExt8:$src2))]>; 714 777 def IMUL64rmi32 : RIi32<0x69, MRMSrcMem, // GR64 = [mem64]*I32 715 778 (outs GR64:$dst), (ins i64mem:$src1, i64i32imm:$src2), 716 779 "imul{q}\t{$src2, $src1, $dst|$dst, $src1, $src2}", 717 [(set GR64:$dst, (mul (load addr:$src1),718 i64immSExt32:$src2)),719 (implicit EFLAGS)]>;780 [(set GR64:$dst, EFLAGS, 781 (X86smul_flag (load addr:$src1), 782 i64immSExt32:$src2))]>; 720 783 } // Defs = [EFLAGS] 721 784 … … 741 804 // Unary instructions 742 805 let Defs = [EFLAGS], CodeSize = 2 in { 743 let isTwoAddress = 1in806 let Constraints = "$src = $dst" in 744 807 def NEG64r : RI<0xF7, MRM3r, (outs GR64:$dst), (ins GR64:$src), "neg{q}\t$dst", 745 808 [(set GR64:$dst, (ineg GR64:$src)), … … 749 812 (implicit EFLAGS)]>; 750 813 751 let isTwoAddress = 1, isConvertibleToThreeAddress = 1 in814 let Constraints = "$src = $dst", isConvertibleToThreeAddress = 1 in 752 815 def INC64r : RI<0xFF, MRM0r, (outs GR64:$dst), (ins GR64:$src), "inc{q}\t$dst", 753 [(set GR64:$dst, (add GR64:$src, 1)), 754 (implicit EFLAGS)]>; 816 [(set GR64:$dst, EFLAGS, (X86inc_flag GR64:$src))]>; 755 817 def INC64m : RI<0xFF, MRM0m, (outs), (ins i64mem:$dst), "inc{q}\t$dst", 756 818 [(store (add (loadi64 addr:$dst), 1), addr:$dst), 757 819 (implicit EFLAGS)]>; 758 820 759 let isTwoAddress = 1, isConvertibleToThreeAddress = 1 in821 let Constraints = "$src = $dst", isConvertibleToThreeAddress = 1 in 760 822 def DEC64r : RI<0xFF, MRM1r, (outs GR64:$dst), (ins GR64:$src), "dec{q}\t$dst", 761 [(set GR64:$dst, (add GR64:$src, -1)), 762 (implicit EFLAGS)]>; 823 [(set GR64:$dst, EFLAGS, (X86dec_flag GR64:$src))]>; 763 824 def DEC64m : RI<0xFF, MRM1m, (outs), (ins i64mem:$dst), "dec{q}\t$dst", 764 825 [(store (add (loadi64 addr:$dst), -1), addr:$dst), … … 766 827 767 828 // In 64-bit mode, single byte INC and DEC cannot be encoded. 768 let isTwoAddress = 1, isConvertibleToThreeAddress = 1 in {829 let Constraints = "$src = $dst", isConvertibleToThreeAddress = 1 in { 769 830 // Can transform into LEA. 770 831 def INC64_16r : I<0xFF, MRM0r, (outs GR16:$dst), (ins GR16:$src), 771 832 "inc{w}\t$dst", 772 [(set GR16:$dst, (add GR16:$src, 1)), 773 (implicit EFLAGS)]>, 833 [(set GR16:$dst, EFLAGS, (X86inc_flag GR16:$src))]>, 774 834 OpSize, Requires<[In64BitMode]>; 775 835 def INC64_32r : I<0xFF, MRM0r, (outs GR32:$dst), (ins GR32:$src), 776 836 "inc{l}\t$dst", 777 [(set GR32:$dst, (add GR32:$src, 1)), 778 (implicit EFLAGS)]>, 837 [(set GR32:$dst, EFLAGS, (X86inc_flag GR32:$src))]>, 779 838 Requires<[In64BitMode]>; 780 839 def DEC64_16r : I<0xFF, MRM1r, (outs GR16:$dst), (ins GR16:$src), 781 840 "dec{w}\t$dst", 782 [(set GR16:$dst, (add GR16:$src, -1)), 783 (implicit EFLAGS)]>, 841 [(set GR16:$dst, EFLAGS, (X86dec_flag GR16:$src))]>, 784 842 OpSize, Requires<[In64BitMode]>; 785 843 def DEC64_32r : I<0xFF, MRM1r, (outs GR32:$dst), (ins GR32:$src), 786 844 "dec{l}\t$dst", 787 [(set GR32:$dst, (add GR32:$src, -1)), 788 (implicit EFLAGS)]>, 845 [(set GR32:$dst, EFLAGS, (X86dec_flag GR32:$src))]>, 789 846 Requires<[In64BitMode]>; 790 } // isConvertibleToThreeAddress847 } // Constraints = "$src = $dst", isConvertibleToThreeAddress 791 848 792 849 // These are duplicates of their 32-bit counterparts. Only needed so X86 knows 793 850 // how to unfold them. 794 let isTwoAddress = 0, CodeSize = 2 in { 795 def INC64_16m : I<0xFF, MRM0m, (outs), (ins i16mem:$dst), "inc{w}\t$dst", 796 [(store (add (loadi16 addr:$dst), 1), addr:$dst), 797 (implicit EFLAGS)]>, 798 OpSize, Requires<[In64BitMode]>; 799 def INC64_32m : I<0xFF, MRM0m, (outs), (ins i32mem:$dst), "inc{l}\t$dst", 800 [(store (add (loadi32 addr:$dst), 1), addr:$dst), 801 (implicit EFLAGS)]>, 802 Requires<[In64BitMode]>; 803 def DEC64_16m : I<0xFF, MRM1m, (outs), (ins i16mem:$dst), "dec{w}\t$dst", 804 [(store (add (loadi16 addr:$dst), -1), addr:$dst), 805 (implicit EFLAGS)]>, 806 OpSize, Requires<[In64BitMode]>; 807 def DEC64_32m : I<0xFF, MRM1m, (outs), (ins i32mem:$dst), "dec{l}\t$dst", 808 [(store (add (loadi32 addr:$dst), -1), addr:$dst), 809 (implicit EFLAGS)]>, 810 Requires<[In64BitMode]>; 811 } 851 def INC64_16m : I<0xFF, MRM0m, (outs), (ins i16mem:$dst), "inc{w}\t$dst", 852 [(store (add (loadi16 addr:$dst), 1), addr:$dst), 853 (implicit EFLAGS)]>, 854 OpSize, Requires<[In64BitMode]>; 855 def INC64_32m : I<0xFF, MRM0m, (outs), (ins i32mem:$dst), "inc{l}\t$dst", 856 [(store (add (loadi32 addr:$dst), 1), addr:$dst), 857 (implicit EFLAGS)]>, 858 Requires<[In64BitMode]>; 859 def DEC64_16m : I<0xFF, MRM1m, (outs), (ins i16mem:$dst), "dec{w}\t$dst", 860 [(store (add (loadi16 addr:$dst), -1), addr:$dst), 861 (implicit EFLAGS)]>, 862 OpSize, Requires<[In64BitMode]>; 863 def DEC64_32m : I<0xFF, MRM1m, (outs), (ins i32mem:$dst), "dec{l}\t$dst", 864 [(store (add (loadi32 addr:$dst), -1), addr:$dst), 865 (implicit EFLAGS)]>, 866 Requires<[In64BitMode]>; 812 867 } // Defs = [EFLAGS], CodeSize 813 868 … … 815 870 let Defs = [EFLAGS] in { 816 871 // Shift instructions 817 let isTwoAddress = 1in {872 let Constraints = "$src1 = $dst" in { 818 873 let Uses = [CL] in 819 def SHL64rCL : RI<0xD3, MRM4r, (outs GR64:$dst), (ins GR64:$src ),874 def SHL64rCL : RI<0xD3, MRM4r, (outs GR64:$dst), (ins GR64:$src1), 820 875 "shl{q}\t{%cl, $dst|$dst, %CL}", 821 [(set GR64:$dst, (shl GR64:$src , CL))]>;876 [(set GR64:$dst, (shl GR64:$src1, CL))]>; 822 877 let isConvertibleToThreeAddress = 1 in // Can transform into LEA. 823 878 def SHL64ri : RIi8<0xC1, MRM4r, (outs GR64:$dst), … … 829 884 def SHL64r1 : RI<0xD1, MRM4r, (outs GR64:$dst), (ins GR64:$src1), 830 885 "shl{q}\t$dst", []>; 831 } // isTwoAddress886 } // Constraints = "$src1 = $dst" 832 887 833 888 let Uses = [CL] in … … 842 897 [(store (shl (loadi64 addr:$dst), (i8 1)), addr:$dst)]>; 843 898 844 let isTwoAddress = 1in {899 let Constraints = "$src1 = $dst" in { 845 900 let Uses = [CL] in 846 def SHR64rCL : RI<0xD3, MRM5r, (outs GR64:$dst), (ins GR64:$src ),901 def SHR64rCL : RI<0xD3, MRM5r, (outs GR64:$dst), (ins GR64:$src1), 847 902 "shr{q}\t{%cl, $dst|$dst, %CL}", 848 [(set GR64:$dst, (srl GR64:$src , CL))]>;903 [(set GR64:$dst, (srl GR64:$src1, CL))]>; 849 904 def SHR64ri : RIi8<0xC1, MRM5r, (outs GR64:$dst), (ins GR64:$src1, i8imm:$src2), 850 905 "shr{q}\t{$src2, $dst|$dst, $src2}", … … 853 908 "shr{q}\t$dst", 854 909 [(set GR64:$dst, (srl GR64:$src1, (i8 1)))]>; 855 } // isTwoAddress910 } // Constraints = "$src1 = $dst" 856 911 857 912 let Uses = [CL] in … … 866 921 [(store (srl (loadi64 addr:$dst), (i8 1)), addr:$dst)]>; 867 922 868 let isTwoAddress = 1in {923 let Constraints = "$src1 = $dst" in { 869 924 let Uses = [CL] in 870 def SAR64rCL : RI<0xD3, MRM7r, (outs GR64:$dst), (ins GR64:$src ),925 def SAR64rCL : RI<0xD3, MRM7r, (outs GR64:$dst), (ins GR64:$src1), 871 926 "sar{q}\t{%cl, $dst|$dst, %CL}", 872 [(set GR64:$dst, (sra GR64:$src , CL))]>;927 [(set GR64:$dst, (sra GR64:$src1, CL))]>; 873 928 def SAR64ri : RIi8<0xC1, MRM7r, (outs GR64:$dst), 874 929 (ins GR64:$src1, i8imm:$src2), … … 878 933 "sar{q}\t$dst", 879 934 [(set GR64:$dst, (sra GR64:$src1, (i8 1)))]>; 880 } // isTwoAddress935 } // Constraints = "$src = $dst" 881 936 882 937 let Uses = [CL] in … … 893 948 // Rotate instructions 894 949 895 let isTwoAddress = 1in {950 let Constraints = "$src = $dst" in { 896 951 def RCL64r1 : RI<0xD1, MRM2r, (outs GR64:$dst), (ins GR64:$src), 897 952 "rcl{q}\t{1, $dst|$dst, 1}", []>; … … 910 965 "rcr{q}\t{%cl, $dst|$dst, CL}", []>; 911 966 } 912 } 913 914 let isTwoAddress = 0 in { 967 } // Constraints = "$src = $dst" 968 915 969 def RCL64m1 : RI<0xD1, MRM2m, (outs), (ins i64mem:$dst), 916 970 "rcl{q}\t{1, $dst|$dst, 1}", []>; … … 928 982 "rcr{q}\t{%cl, $dst|$dst, CL}", []>; 929 983 } 930 } 931 932 let isTwoAddress = 1 in { 984 985 let Constraints = "$src1 = $dst" in { 933 986 let Uses = [CL] in 934 def ROL64rCL : RI<0xD3, MRM0r, (outs GR64:$dst), (ins GR64:$src ),987 def ROL64rCL : RI<0xD3, MRM0r, (outs GR64:$dst), (ins GR64:$src1), 935 988 "rol{q}\t{%cl, $dst|$dst, %CL}", 936 [(set GR64:$dst, (rotl GR64:$src , CL))]>;989 [(set GR64:$dst, (rotl GR64:$src1, CL))]>; 937 990 def ROL64ri : RIi8<0xC1, MRM0r, (outs GR64:$dst), 938 991 (ins GR64:$src1, i8imm:$src2), … … 942 995 "rol{q}\t$dst", 943 996 [(set GR64:$dst, (rotl GR64:$src1, (i8 1)))]>; 944 } // isTwoAddress997 } // Constraints = "$src1 = $dst" 945 998 946 999 let Uses = [CL] in … … 955 1008 [(store (rotl (loadi64 addr:$dst), (i8 1)), addr:$dst)]>; 956 1009 957 let isTwoAddress = 1in {1010 let Constraints = "$src1 = $dst" in { 958 1011 let Uses = [CL] in 959 def ROR64rCL : RI<0xD3, MRM1r, (outs GR64:$dst), (ins GR64:$src ),1012 def ROR64rCL : RI<0xD3, MRM1r, (outs GR64:$dst), (ins GR64:$src1), 960 1013 "ror{q}\t{%cl, $dst|$dst, %CL}", 961 [(set GR64:$dst, (rotr GR64:$src , CL))]>;1014 [(set GR64:$dst, (rotr GR64:$src1, CL))]>; 962 1015 def ROR64ri : RIi8<0xC1, MRM1r, (outs GR64:$dst), 963 1016 (ins GR64:$src1, i8imm:$src2), … … 967 1020 "ror{q}\t$dst", 968 1021 [(set GR64:$dst, (rotr GR64:$src1, (i8 1)))]>; 969 } // isTwoAddress1022 } // Constraints = "$src1 = $dst" 970 1023 971 1024 let Uses = [CL] in … … 981 1034 982 1035 // Double shift instructions (generalizations of rotate) 983 let isTwoAddress = 1in {1036 let Constraints = "$src1 = $dst" in { 984 1037 let Uses = [CL] in { 985 1038 def SHLD64rrCL : RI<0xA5, MRMDestReg, (outs GR64:$dst), … … 1011 1064 TB; 1012 1065 } // isCommutable 1013 } // isTwoAddress1066 } // Constraints = "$src1 = $dst" 1014 1067 1015 1068 let Uses = [CL] in { … … 1041 1094 // 1042 1095 1043 let isTwoAddress = 1, AddedComplexity = 15 in1096 let Constraints = "$src = $dst" , AddedComplexity = 15 in 1044 1097 def NOT64r : RI<0xF7, MRM2r, (outs GR64:$dst), (ins GR64:$src), "not{q}\t$dst", 1045 1098 [(set GR64:$dst, (not GR64:$src))]>; … … 1048 1101 1049 1102 let Defs = [EFLAGS] in { 1050 def AND64i32 : RI <0x25, RawFrm, (outs), (insi32imm:$src),1051 "and{q}\t{$src, %rax|%rax, $src}", []>;1052 1053 let isTwoAddress = 1in {1103 def AND64i32 : RIi32<0x25, RawFrm, (outs), (ins i64i32imm:$src), 1104 "and{q}\t{$src, %rax|%rax, $src}", []>; 1105 1106 let Constraints = "$src1 = $dst" in { 1054 1107 let isCommutable = 1 in 1055 1108 def AND64rr : RI<0x21, MRMDestReg, 1056 1109 (outs GR64:$dst), (ins GR64:$src1, GR64:$src2), 1057 1110 "and{q}\t{$src2, $dst|$dst, $src2}", 1058 [(set GR64:$dst, (and GR64:$src1, GR64:$src2)), 1059 (implicit EFLAGS)]>; 1111 [(set GR64:$dst, EFLAGS, 1112 (X86and_flag GR64:$src1, GR64:$src2))]>; 1113 let isCodeGenOnly = 1 in { 1060 1114 def AND64rr_REV : RI<0x23, MRMSrcReg, (outs GR64:$dst), 1061 1115 (ins GR64:$src1, GR64:$src2), 1062 1116 "and{q}\t{$src2, $dst|$dst, $src2}", []>; 1117 } 1063 1118 def AND64rm : RI<0x23, MRMSrcMem, 1064 1119 (outs GR64:$dst), (ins GR64:$src1, i64mem:$src2), 1065 1120 "and{q}\t{$src2, $dst|$dst, $src2}", 1066 [(set GR64:$dst, (and GR64:$src1, (load addr:$src2))),1067 (implicit EFLAGS)]>;1121 [(set GR64:$dst, EFLAGS, 1122 (X86and_flag GR64:$src1, (load addr:$src2)))]>; 1068 1123 def AND64ri8 : RIi8<0x83, MRM4r, 1069 1124 (outs GR64:$dst), (ins GR64:$src1, i64i8imm:$src2), 1070 1125 "and{q}\t{$src2, $dst|$dst, $src2}", 1071 [(set GR64:$dst, (and GR64:$src1, i64immSExt8:$src2)),1072 (implicit EFLAGS)]>;1126 [(set GR64:$dst, EFLAGS, 1127 (X86and_flag GR64:$src1, i64immSExt8:$src2))]>; 1073 1128 def AND64ri32 : RIi32<0x81, MRM4r, 1074 1129 (outs GR64:$dst), (ins GR64:$src1, i64i32imm:$src2), 1075 1130 "and{q}\t{$src2, $dst|$dst, $src2}", 1076 [(set GR64:$dst, (and GR64:$src1, i64immSExt32:$src2)),1077 (implicit EFLAGS)]>;1078 } // isTwoAddress1131 [(set GR64:$dst, EFLAGS, 1132 (X86and_flag GR64:$src1, i64immSExt32:$src2))]>; 1133 } // Constraints = "$src1 = $dst" 1079 1134 1080 1135 def AND64mr : RI<0x21, MRMDestMem, … … 1094 1149 (implicit EFLAGS)]>; 1095 1150 1096 let isTwoAddress = 1in {1151 let Constraints = "$src1 = $dst" in { 1097 1152 let isCommutable = 1 in 1098 1153 def OR64rr : RI<0x09, MRMDestReg, (outs GR64:$dst), 1099 1154 (ins GR64:$src1, GR64:$src2), 1100 1155 "or{q}\t{$src2, $dst|$dst, $src2}", 1101 [(set GR64:$dst, (or GR64:$src1, GR64:$src2)), 1102 (implicit EFLAGS)]>; 1156 [(set GR64:$dst, EFLAGS, 1157 (X86or_flag GR64:$src1, GR64:$src2))]>; 1158 let isCodeGenOnly = 1 in { 1103 1159 def OR64rr_REV : RI<0x0B, MRMSrcReg, (outs GR64:$dst), 1104 1160 (ins GR64:$src1, GR64:$src2), 1105 1161 "or{q}\t{$src2, $dst|$dst, $src2}", []>; 1162 } 1106 1163 def OR64rm : RI<0x0B, MRMSrcMem , (outs GR64:$dst), 1107 1164 (ins GR64:$src1, i64mem:$src2), 1108 1165 "or{q}\t{$src2, $dst|$dst, $src2}", 1109 [(set GR64:$dst, (or GR64:$src1, (load addr:$src2))),1110 (implicit EFLAGS)]>;1166 [(set GR64:$dst, EFLAGS, 1167 (X86or_flag GR64:$src1, (load addr:$src2)))]>; 1111 1168 def OR64ri8 : RIi8<0x83, MRM1r, (outs GR64:$dst), 1112 1169 (ins GR64:$src1, i64i8imm:$src2), 1113 1170 "or{q}\t{$src2, $dst|$dst, $src2}", 1114 [(set GR64:$dst, (or GR64:$src1, i64immSExt8:$src2)),1115 (implicit EFLAGS)]>;1171 [(set GR64:$dst, EFLAGS, 1172 (X86or_flag GR64:$src1, i64immSExt8:$src2))]>; 1116 1173 def OR64ri32 : RIi32<0x81, MRM1r, (outs GR64:$dst), 1117 1174 (ins GR64:$src1, i64i32imm:$src2), 1118 1175 "or{q}\t{$src2, $dst|$dst, $src2}", 1119 [(set GR64:$dst, (or GR64:$src1, i64immSExt32:$src2)),1120 (implicit EFLAGS)]>;1121 } // isTwoAddress1176 [(set GR64:$dst, EFLAGS, 1177 (X86or_flag GR64:$src1, i64immSExt32:$src2))]>; 1178 } // Constraints = "$src1 = $dst" 1122 1179 1123 1180 def OR64mr : RI<0x09, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src), … … 1134 1191 (implicit EFLAGS)]>; 1135 1192 1136 def OR64i32 : RIi32<0x0D, RawFrm, (outs), (ins i 32imm:$src),1193 def OR64i32 : RIi32<0x0D, RawFrm, (outs), (ins i64i32imm:$src), 1137 1194 "or{q}\t{$src, %rax|%rax, $src}", []>; 1138 1195 1139 let isTwoAddress = 1in {1196 let Constraints = "$src1 = $dst" in { 1140 1197 let isCommutable = 1 in 1141 1198 def XOR64rr : RI<0x31, MRMDestReg, (outs GR64:$dst), 1142 1199 (ins GR64:$src1, GR64:$src2), 1143 1200 "xor{q}\t{$src2, $dst|$dst, $src2}", 1144 [(set GR64:$dst, (xor GR64:$src1, GR64:$src2)), 1145 (implicit EFLAGS)]>; 1201 [(set GR64:$dst, EFLAGS, 1202 (X86xor_flag GR64:$src1, GR64:$src2))]>; 1203 let isCodeGenOnly = 1 in { 1146 1204 def XOR64rr_REV : RI<0x33, MRMSrcReg, (outs GR64:$dst), 1147 1205 (ins GR64:$src1, GR64:$src2), 1148 1206 "xor{q}\t{$src2, $dst|$dst, $src2}", []>; 1207 } 1149 1208 def XOR64rm : RI<0x33, MRMSrcMem, (outs GR64:$dst), 1150 1209 (ins GR64:$src1, i64mem:$src2), 1151 1210 "xor{q}\t{$src2, $dst|$dst, $src2}", 1152 [(set GR64:$dst, (xor GR64:$src1, (load addr:$src2))),1153 (implicit EFLAGS)]>;1211 [(set GR64:$dst, EFLAGS, 1212 (X86xor_flag GR64:$src1, (load addr:$src2)))]>; 1154 1213 def XOR64ri8 : RIi8<0x83, MRM6r, (outs GR64:$dst), 1155 1214 (ins GR64:$src1, i64i8imm:$src2), 1156 1215 "xor{q}\t{$src2, $dst|$dst, $src2}", 1157 [(set GR64:$dst, (xor GR64:$src1, i64immSExt8:$src2)),1158 (implicit EFLAGS)]>;1216 [(set GR64:$dst, EFLAGS, 1217 (X86xor_flag GR64:$src1, i64immSExt8:$src2))]>; 1159 1218 def XOR64ri32 : RIi32<0x81, MRM6r, 1160 1219 (outs GR64:$dst), (ins GR64:$src1, i64i32imm:$src2), 1161 1220 "xor{q}\t{$src2, $dst|$dst, $src2}", 1162 [(set GR64:$dst, (xor GR64:$src1, i64immSExt32:$src2)),1163 (implicit EFLAGS)]>;1164 } // isTwoAddress1221 [(set GR64:$dst, EFLAGS, 1222 (X86xor_flag GR64:$src1, i64immSExt32:$src2))]>; 1223 } // Constraints = "$src1 = $dst" 1165 1224 1166 1225 def XOR64mr : RI<0x31, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src), … … 1177 1236 (implicit EFLAGS)]>; 1178 1237 1179 def XOR64i32 : RIi32<0x35, RawFrm, (outs), (ins i 32imm:$src),1238 def XOR64i32 : RIi32<0x35, RawFrm, (outs), (ins i64i32imm:$src), 1180 1239 "xor{q}\t{$src, %rax|%rax, $src}", []>; 1181 1240 … … 1188 1247 // Integer comparison 1189 1248 let Defs = [EFLAGS] in { 1190 def TEST64i32 : RI <0xa9, RawFrm, (outs), (insi32imm:$src),1191 "test{q}\t{$src, %rax|%rax, $src}", []>;1249 def TEST64i32 : RIi32<0xa9, RawFrm, (outs), (ins i64i32imm:$src), 1250 "test{q}\t{$src, %rax|%rax, $src}", []>; 1192 1251 let isCommutable = 1 in 1193 def TEST64rr : RI<0x85, MRM DestReg, (outs), (ins GR64:$src1, GR64:$src2),1252 def TEST64rr : RI<0x85, MRMSrcReg, (outs), (ins GR64:$src1, GR64:$src2), 1194 1253 "test{q}\t{$src2, $src1|$src1, $src2}", 1195 [(X86cmp (and GR64:$src1, GR64:$src2), 0), 1196 (implicit EFLAGS)]>; 1254 [(set EFLAGS, (X86cmp (and GR64:$src1, GR64:$src2), 0))]>; 1197 1255 def TEST64rm : RI<0x85, MRMSrcMem, (outs), (ins GR64:$src1, i64mem:$src2), 1198 1256 "test{q}\t{$src2, $src1|$src1, $src2}", 1199 [( X86cmp (and GR64:$src1, (loadi64 addr:$src2)), 0),1200 (implicit EFLAGS)]>;1257 [(set EFLAGS, (X86cmp (and GR64:$src1, (loadi64 addr:$src2)), 1258 0))]>; 1201 1259 def TEST64ri32 : RIi32<0xF7, MRM0r, (outs), 1202 1260 (ins GR64:$src1, i64i32imm:$src2), 1203 1261 "test{q}\t{$src2, $src1|$src1, $src2}", 1204 [( X86cmp (and GR64:$src1, i64immSExt32:$src2), 0),1205 (implicit EFLAGS)]>;1262 [(set EFLAGS, (X86cmp (and GR64:$src1, i64immSExt32:$src2), 1263 0))]>; 1206 1264 def TEST64mi32 : RIi32<0xF7, MRM0m, (outs), 1207 1265 (ins i64mem:$src1, i64i32imm:$src2), 1208 1266 "test{q}\t{$src2, $src1|$src1, $src2}", 1209 [( X86cmp (and (loadi64 addr:$src1), i64immSExt32:$src2), 0),1210 (implicit EFLAGS)]>;1211 1212 1213 def CMP64i32 : RI <0x3D, RawFrm, (outs), (insi32imm:$src),1214 "cmp{q}\t{$src, %rax|%rax, $src}", []>;1267 [(set EFLAGS, (X86cmp (and (loadi64 addr:$src1), 1268 i64immSExt32:$src2), 0))]>; 1269 1270 1271 def CMP64i32 : RIi32<0x3D, RawFrm, (outs), (ins i64i32imm:$src), 1272 "cmp{q}\t{$src, %rax|%rax, $src}", []>; 1215 1273 def CMP64rr : RI<0x39, MRMDestReg, (outs), (ins GR64:$src1, GR64:$src2), 1216 1274 "cmp{q}\t{$src2, $src1|$src1, $src2}", 1217 [(X86cmp GR64:$src1, GR64:$src2), 1218 (implicit EFLAGS)]>; 1219 def CMP64mrmrr : RI<0x3B, MRMSrcReg, (outs), (ins GR64:$src1, GR64:$src2), 1220 "cmp{q}\t{$src2, $src1|$src1, $src2}", []>; 1275 [(set EFLAGS, (X86cmp GR64:$src1, GR64:$src2))]>; 1276 1277 // These are alternate spellings for use by the disassembler, we mark them as 1278 // code gen only to ensure they aren't matched by the assembler. 1279 let isCodeGenOnly = 1 in { 1280 def CMP64mrmrr : RI<0x3B, MRMSrcReg, (outs), (ins GR64:$src1, GR64:$src2), 1281 "cmp{q}\t{$src2, $src1|$src1, $src2}", []>; 1282 } 1283 1221 1284 def CMP64mr : RI<0x39, MRMDestMem, (outs), (ins i64mem:$src1, GR64:$src2), 1222 1285 "cmp{q}\t{$src2, $src1|$src1, $src2}", 1223 [(X86cmp (loadi64 addr:$src1), GR64:$src2), 1224 (implicit EFLAGS)]>; 1286 [(set EFLAGS, (X86cmp (loadi64 addr:$src1), GR64:$src2))]>; 1225 1287 def CMP64rm : RI<0x3B, MRMSrcMem, (outs), (ins GR64:$src1, i64mem:$src2), 1226 1288 "cmp{q}\t{$src2, $src1|$src1, $src2}", 1227 [(X86cmp GR64:$src1, (loadi64 addr:$src2)), 1228 (implicit EFLAGS)]>; 1289 [(set EFLAGS, (X86cmp GR64:$src1, (loadi64 addr:$src2)))]>; 1229 1290 def CMP64ri8 : RIi8<0x83, MRM7r, (outs), (ins GR64:$src1, i64i8imm:$src2), 1230 1291 "cmp{q}\t{$src2, $src1|$src1, $src2}", 1231 [(X86cmp GR64:$src1, i64immSExt8:$src2), 1232 (implicit EFLAGS)]>; 1292 [(set EFLAGS, (X86cmp GR64:$src1, i64immSExt8:$src2))]>; 1233 1293 def CMP64ri32 : RIi32<0x81, MRM7r, (outs), (ins GR64:$src1, i64i32imm:$src2), 1234 1294 "cmp{q}\t{$src2, $src1|$src1, $src2}", 1235 [(X86cmp GR64:$src1, i64immSExt32:$src2), 1236 (implicit EFLAGS)]>; 1295 [(set EFLAGS, (X86cmp GR64:$src1, i64immSExt32:$src2))]>; 1237 1296 def CMP64mi8 : RIi8<0x83, MRM7m, (outs), (ins i64mem:$src1, i64i8imm:$src2), 1238 1297 "cmp{q}\t{$src2, $src1|$src1, $src2}", 1239 [( X86cmp (loadi64 addr:$src1), i64immSExt8:$src2),1240 (implicit EFLAGS)]>;1298 [(set EFLAGS, (X86cmp (loadi64 addr:$src1), 1299 i64immSExt8:$src2))]>; 1241 1300 def CMP64mi32 : RIi32<0x81, MRM7m, (outs), 1242 1301 (ins i64mem:$src1, i64i32imm:$src2), 1243 1302 "cmp{q}\t{$src2, $src1|$src1, $src2}", 1244 [( X86cmp (loadi64 addr:$src1), i64immSExt32:$src2),1245 (implicit EFLAGS)]>;1303 [(set EFLAGS, (X86cmp (loadi64 addr:$src1), 1304 i64immSExt32:$src2))]>; 1246 1305 } // Defs = [EFLAGS] 1247 1306 … … 1251 1310 def BT64rr : RI<0xA3, MRMDestReg, (outs), (ins GR64:$src1, GR64:$src2), 1252 1311 "bt{q}\t{$src2, $src1|$src1, $src2}", 1253 [(X86bt GR64:$src1, GR64:$src2), 1254 (implicit EFLAGS)]>, TB; 1312 [(set EFLAGS, (X86bt GR64:$src1, GR64:$src2))]>, TB; 1255 1313 1256 1314 // Unlike with the register+register form, the memory+register form of the … … 1264 1322 >, TB; 1265 1323 1266 def BT64ri8 : Ii8<0xBA, MRM4r, (outs), (ins GR64:$src1, i64i8imm:$src2),1324 def BT64ri8 : RIi8<0xBA, MRM4r, (outs), (ins GR64:$src1, i64i8imm:$src2), 1267 1325 "bt{q}\t{$src2, $src1|$src1, $src2}", 1268 [(X86bt GR64:$src1, i64immSExt8:$src2), 1269 (implicit EFLAGS)]>, TB; 1326 [(set EFLAGS, (X86bt GR64:$src1, i64immSExt8:$src2))]>, TB; 1270 1327 // Note that these instructions don't need FastBTMem because that 1271 1328 // only applies when the other operand is in a register. When it's 1272 1329 // an immediate, bt is still fast. 1273 def BT64mi8 : Ii8<0xBA, MRM4m, (outs), (ins i64mem:$src1, i64i8imm:$src2),1330 def BT64mi8 : RIi8<0xBA, MRM4m, (outs), (ins i64mem:$src1, i64i8imm:$src2), 1274 1331 "bt{q}\t{$src2, $src1|$src1, $src2}", 1275 [( X86bt (loadi64 addr:$src1), i64immSExt8:$src2),1276 (implicit EFLAGS)]>, TB;1332 [(set EFLAGS, (X86bt (loadi64 addr:$src1), 1333 i64immSExt8:$src2))]>, TB; 1277 1334 1278 1335 def BTC64rr : RI<0xBB, MRMDestReg, (outs), (ins GR64:$src1, GR64:$src2), … … 1305 1362 1306 1363 // Conditional moves 1307 let Uses = [EFLAGS], isTwoAddress = 1in {1364 let Uses = [EFLAGS], Constraints = "$src1 = $dst" in { 1308 1365 let isCommutable = 1 in { 1309 1366 def CMOVB64rr : RI<0x42, MRMSrcReg, // if <u, GR64 = GR64 … … 1469 1526 [(set GR64:$dst, (X86cmov GR64:$src1, (loadi64 addr:$src2), 1470 1527 X86_COND_NO, EFLAGS))]>, TB; 1471 } // isTwoAddress1528 } // Constraints = "$src1 = $dst" 1472 1529 1473 1530 // Use sbb to materialize carry flag into a GPR. … … 1485 1542 1486 1543 //===----------------------------------------------------------------------===// 1487 // Conversion Instructions...1488 //1489 1490 // f64 -> signed i641491 def CVTSD2SI64rr: RSDI<0x2D, MRMSrcReg, (outs GR64:$dst), (ins FR64:$src),1492 "cvtsd2si{q}\t{$src, $dst|$dst, $src}", []>;1493 def CVTSD2SI64rm: RSDI<0x2D, MRMSrcMem, (outs GR64:$dst), (ins f64mem:$src),1494 "cvtsd2si{q}\t{$src, $dst|$dst, $src}", []>;1495 def Int_CVTSD2SI64rr: RSDI<0x2D, MRMSrcReg, (outs GR64:$dst), (ins VR128:$src),1496 "cvtsd2si{q}\t{$src, $dst|$dst, $src}",1497 [(set GR64:$dst,1498 (int_x86_sse2_cvtsd2si64 VR128:$src))]>;1499 def Int_CVTSD2SI64rm: RSDI<0x2D, MRMSrcMem, (outs GR64:$dst),1500 (ins f128mem:$src),1501 "cvtsd2si{q}\t{$src, $dst|$dst, $src}",1502 [(set GR64:$dst, (int_x86_sse2_cvtsd2si641503 (load addr:$src)))]>;1504 def CVTTSD2SI64rr: RSDI<0x2C, MRMSrcReg, (outs GR64:$dst), (ins FR64:$src),1505 "cvttsd2si{q}\t{$src, $dst|$dst, $src}",1506 [(set GR64:$dst, (fp_to_sint FR64:$src))]>;1507 def CVTTSD2SI64rm: RSDI<0x2C, MRMSrcMem, (outs GR64:$dst), (ins f64mem:$src),1508 "cvttsd2si{q}\t{$src, $dst|$dst, $src}",1509 [(set GR64:$dst, (fp_to_sint (loadf64 addr:$src)))]>;1510 def Int_CVTTSD2SI64rr: RSDI<0x2C, MRMSrcReg, (outs GR64:$dst), (ins VR128:$src),1511 "cvttsd2si{q}\t{$src, $dst|$dst, $src}",1512 [(set GR64:$dst,1513 (int_x86_sse2_cvttsd2si64 VR128:$src))]>;1514 def Int_CVTTSD2SI64rm: RSDI<0x2C, MRMSrcMem, (outs GR64:$dst),1515 (ins f128mem:$src),1516 "cvttsd2si{q}\t{$src, $dst|$dst, $src}",1517 [(set GR64:$dst,1518 (int_x86_sse2_cvttsd2si641519 (load addr:$src)))]>;1520 1521 // Signed i64 -> f641522 def CVTSI2SD64rr: RSDI<0x2A, MRMSrcReg, (outs FR64:$dst), (ins GR64:$src),1523 "cvtsi2sd{q}\t{$src, $dst|$dst, $src}",1524 [(set FR64:$dst, (sint_to_fp GR64:$src))]>;1525 def CVTSI2SD64rm: RSDI<0x2A, MRMSrcMem, (outs FR64:$dst), (ins i64mem:$src),1526 "cvtsi2sd{q}\t{$src, $dst|$dst, $src}",1527 [(set FR64:$dst, (sint_to_fp (loadi64 addr:$src)))]>;1528 1529 let isTwoAddress = 1 in {1530 def Int_CVTSI2SD64rr: RSDI<0x2A, MRMSrcReg,1531 (outs VR128:$dst), (ins VR128:$src1, GR64:$src2),1532 "cvtsi2sd{q}\t{$src2, $dst|$dst, $src2}",1533 [(set VR128:$dst,1534 (int_x86_sse2_cvtsi642sd VR128:$src1,1535 GR64:$src2))]>;1536 def Int_CVTSI2SD64rm: RSDI<0x2A, MRMSrcMem,1537 (outs VR128:$dst), (ins VR128:$src1, i64mem:$src2),1538 "cvtsi2sd{q}\t{$src2, $dst|$dst, $src2}",1539 [(set VR128:$dst,1540 (int_x86_sse2_cvtsi642sd VR128:$src1,1541 (loadi64 addr:$src2)))]>;1542 } // isTwoAddress1543 1544 // Signed i64 -> f321545 def CVTSI2SS64rr: RSSI<0x2A, MRMSrcReg, (outs FR32:$dst), (ins GR64:$src),1546 "cvtsi2ss{q}\t{$src, $dst|$dst, $src}",1547 [(set FR32:$dst, (sint_to_fp GR64:$src))]>;1548 def CVTSI2SS64rm: RSSI<0x2A, MRMSrcMem, (outs FR32:$dst), (ins i64mem:$src),1549 "cvtsi2ss{q}\t{$src, $dst|$dst, $src}",1550 [(set FR32:$dst, (sint_to_fp (loadi64 addr:$src)))]>;1551 1552 let isTwoAddress = 1 in {1553 def Int_CVTSI2SS64rr : RSSI<0x2A, MRMSrcReg,1554 (outs VR128:$dst), (ins VR128:$src1, GR64:$src2),1555 "cvtsi2ss{q}\t{$src2, $dst|$dst, $src2}",1556 [(set VR128:$dst,1557 (int_x86_sse_cvtsi642ss VR128:$src1,1558 GR64:$src2))]>;1559 def Int_CVTSI2SS64rm : RSSI<0x2A, MRMSrcMem,1560 (outs VR128:$dst),1561 (ins VR128:$src1, i64mem:$src2),1562 "cvtsi2ss{q}\t{$src2, $dst|$dst, $src2}",1563 [(set VR128:$dst,1564 (int_x86_sse_cvtsi642ss VR128:$src1,1565 (loadi64 addr:$src2)))]>;1566 }1567 1568 // f32 -> signed i641569 def CVTSS2SI64rr: RSSI<0x2D, MRMSrcReg, (outs GR64:$dst), (ins FR32:$src),1570 "cvtss2si{q}\t{$src, $dst|$dst, $src}", []>;1571 def CVTSS2SI64rm: RSSI<0x2D, MRMSrcMem, (outs GR64:$dst), (ins f32mem:$src),1572 "cvtss2si{q}\t{$src, $dst|$dst, $src}", []>;1573 def Int_CVTSS2SI64rr: RSSI<0x2D, MRMSrcReg, (outs GR64:$dst), (ins VR128:$src),1574 "cvtss2si{q}\t{$src, $dst|$dst, $src}",1575 [(set GR64:$dst,1576 (int_x86_sse_cvtss2si64 VR128:$src))]>;1577 def Int_CVTSS2SI64rm: RSSI<0x2D, MRMSrcMem, (outs GR64:$dst), (ins f32mem:$src),1578 "cvtss2si{q}\t{$src, $dst|$dst, $src}",1579 [(set GR64:$dst, (int_x86_sse_cvtss2si641580 (load addr:$src)))]>;1581 def CVTTSS2SI64rr: RSSI<0x2C, MRMSrcReg, (outs GR64:$dst), (ins FR32:$src),1582 "cvttss2si{q}\t{$src, $dst|$dst, $src}",1583 [(set GR64:$dst, (fp_to_sint FR32:$src))]>;1584 def CVTTSS2SI64rm: RSSI<0x2C, MRMSrcMem, (outs GR64:$dst), (ins f32mem:$src),1585 "cvttss2si{q}\t{$src, $dst|$dst, $src}",1586 [(set GR64:$dst, (fp_to_sint (loadf32 addr:$src)))]>;1587 def Int_CVTTSS2SI64rr: RSSI<0x2C, MRMSrcReg, (outs GR64:$dst), (ins VR128:$src),1588 "cvttss2si{q}\t{$src, $dst|$dst, $src}",1589 [(set GR64:$dst,1590 (int_x86_sse_cvttss2si64 VR128:$src))]>;1591 def Int_CVTTSS2SI64rm: RSSI<0x2C, MRMSrcMem, (outs GR64:$dst),1592 (ins f32mem:$src),1593 "cvttss2si{q}\t{$src, $dst|$dst, $src}",1594 [(set GR64:$dst,1595 (int_x86_sse_cvttss2si64 (load addr:$src)))]>;1596 1597 1544 // Descriptor-table support instructions 1598 1545 … … 1630 1577 //===----------------------------------------------------------------------===// 1631 1578 1579 // ELF TLS Support 1632 1580 // All calls clobber the non-callee saved registers. RSP is marked as 1633 1581 // a use to prevent stack-pointer assignments that appear immediately … … 1639 1587 XMM8, XMM9, XMM10, XMM11, XMM12, XMM13, XMM14, XMM15, EFLAGS], 1640 1588 Uses = [RSP] in 1641 def TLS_addr64 : I<0, Pseudo, (outs), (ins lea64mem:$sym),1589 def TLS_addr64 : I<0, Pseudo, (outs), (ins i64mem:$sym), 1642 1590 ".byte\t0x66; " 1643 1591 "leaq\t$sym(%rip), %rdi; " … … 1648 1596 Requires<[In64BitMode]>; 1649 1597 1598 // Darwin TLS Support 1599 // For x86_64, the address of the thunk is passed in %rdi, on return 1600 // the address of the variable is in %rax. All other registers are preserved. 1601 let Defs = [RAX], 1602 Uses = [RDI], 1603 usesCustomInserter = 1 in 1604 def TLSCall_64 : I<0, Pseudo, (outs), (ins i64mem:$sym), 1605 "# TLSCall_64", 1606 [(X86TLSCall addr:$sym)]>, 1607 Requires<[In64BitMode]>; 1608 1650 1609 let AddedComplexity = 5, isCodeGenOnly = 1 in 1651 1610 def MOV64GSrm : RI<0x8B, MRMSrcMem, (outs GR64:$dst), (ins i64mem:$src), … … 1661 1620 // Atomic Instructions 1662 1621 //===----------------------------------------------------------------------===// 1622 1623 // TODO: Get this to fold the constant into the instruction. 1624 let hasSideEffects = 1, Defs = [ESP] in 1625 def Int_MemBarrierNoSSE64 : RI<0x09, MRM1r, (outs), (ins GR64:$zero), 1626 "lock\n\t" 1627 "or{q}\t{$zero, (%rsp)|(%rsp), $zero}", 1628 [(X86MemBarrierNoSSE GR64:$zero)]>, 1629 Requires<[In64BitMode]>, LOCK; 1663 1630 1664 1631 let Defs = [RAX, EFLAGS], Uses = [RAX] in { … … 1688 1655 def XADD64rr : RI<0xC1, MRMDestReg, (outs GR64:$dst), (ins GR64:$src), 1689 1656 "xadd{q}\t{$src, $dst|$dst, $src}", []>, TB; 1657 let mayLoad = 1, mayStore = 1 in 1690 1658 def XADD64rm : RI<0xC1, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src), 1691 1659 "xadd{q}\t{$src, $dst|$dst, $src}", []>, TB; … … 1693 1661 def CMPXCHG64rr : RI<0xB1, MRMDestReg, (outs GR64:$dst), (ins GR64:$src), 1694 1662 "cmpxchg{q}\t{$src, $dst|$dst, $src}", []>, TB; 1663 let mayLoad = 1, mayStore = 1 in 1695 1664 def CMPXCHG64rm : RI<0xB1, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src), 1696 1665 "cmpxchg{q}\t{$src, $dst|$dst, $src}", []>, TB; … … 1704 1673 1705 1674 // Optimized codegen when the non-memory output is not used. 1706 let Defs = [EFLAGS] in {1675 let Defs = [EFLAGS], mayLoad = 1, mayStore = 1 in { 1707 1676 // FIXME: Use normal add / sub instructions and add lock prefix dynamically. 1708 def LOCK_ADD64mr : RI<0x0 3, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src2),1677 def LOCK_ADD64mr : RI<0x01, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src2), 1709 1678 "lock\n\t" 1710 1679 "add{q}\t{$src2, $dst|$dst, $src2}", []>, LOCK; … … 1885 1854 1886 1855 // tailcall stuff 1887 def : Pat<(X86tcret GR64:$dst, imm:$off), 1888 (TCRETURNri64 GR64:$dst, imm:$off)>; 1856 def : Pat<(X86tcret GR64_TC:$dst, imm:$off), 1857 (TCRETURNri64 GR64_TC:$dst, imm:$off)>, 1858 Requires<[In64BitMode]>; 1859 1860 def : Pat<(X86tcret (load addr:$dst), imm:$off), 1861 (TCRETURNmi64 addr:$dst, imm:$off)>, 1862 Requires<[In64BitMode]>; 1889 1863 1890 1864 def : Pat<(X86tcret (i64 tglobaladdr:$dst), imm:$off), 1891 (TCRETURNdi64 tglobaladdr:$dst, imm:$off)>; 1865 (TCRETURNdi64 tglobaladdr:$dst, imm:$off)>, 1866 Requires<[In64BitMode]>; 1892 1867 1893 1868 def : Pat<(X86tcret (i64 texternalsym:$dst), imm:$off), 1894 (TCRETURNdi64 texternalsym:$dst, imm:$off)>; 1869 (TCRETURNdi64 texternalsym:$dst, imm:$off)>, 1870 Requires<[In64BitMode]>; 1871 1872 // tls has some funny stuff here... 1873 // This corresponds to movabs $foo@tpoff, %rax 1874 def : Pat<(i64 (X86Wrapper tglobaltlsaddr :$dst)), 1875 (MOV64ri tglobaltlsaddr :$dst)>; 1876 // This corresponds to add $foo@tpoff, %rax 1877 def : Pat<(add GR64:$src1, (X86Wrapper tglobaltlsaddr :$dst)), 1878 (ADD64ri32 GR64:$src1, tglobaltlsaddr :$dst)>; 1879 // This corresponds to mov foo@tpoff(%rbx), %eax 1880 def : Pat<(load (i64 (X86Wrapper tglobaltlsaddr :$dst))), 1881 (MOV64rm tglobaltlsaddr :$dst)>; 1895 1882 1896 1883 // Comparisons. 1897 1884 1898 1885 // TEST R,R is smaller than CMP R,0 1899 def : Pat<( parallel (X86cmp GR64:$src1, 0), (implicit EFLAGS)),1886 def : Pat<(X86cmp GR64:$src1, 0), 1900 1887 (TEST64rr GR64:$src1, GR64:$src1)>; 1901 1888 … … 1949 1936 def : Pat<(extloadi64i32 addr:$src), 1950 1937 (SUBREG_TO_REG (i64 0), (MOV32rm addr:$src), 1951 x86_subreg_32bit)>;1938 sub_32bit)>; 1952 1939 1953 1940 // anyext. Define these to do an explicit zero-extend to … … 1956 1943 def : Pat<(i64 (anyext GR16:$src)), (MOVZX64rr16 GR16 :$src)>; 1957 1944 def : Pat<(i64 (anyext GR32:$src)), 1958 (SUBREG_TO_REG (i64 0), GR32:$src, x86_subreg_32bit)>;1945 (SUBREG_TO_REG (i64 0), GR32:$src, sub_32bit)>; 1959 1946 1960 1947 //===----------------------------------------------------------------------===// … … 1983 1970 (i64 0), 1984 1971 (AND32ri 1985 (EXTRACT_SUBREG GR64:$src, x86_subreg_32bit),1972 (EXTRACT_SUBREG GR64:$src, sub_32bit), 1986 1973 (i32 (GetLo32XForm imm:$imm))), 1987 x86_subreg_32bit)>;1974 sub_32bit)>; 1988 1975 1989 1976 // r & (2^32-1) ==> movz 1990 1977 def : Pat<(and GR64:$src, 0x00000000FFFFFFFF), 1991 (MOVZX64rr32 (EXTRACT_SUBREG GR64:$src, x86_subreg_32bit))>;1978 (MOVZX64rr32 (EXTRACT_SUBREG GR64:$src, sub_32bit))>; 1992 1979 // r & (2^16-1) ==> movz 1993 1980 def : Pat<(and GR64:$src, 0xffff), 1994 (MOVZX64rr16 (i16 (EXTRACT_SUBREG GR64:$src, x86_subreg_16bit)))>;1981 (MOVZX64rr16 (i16 (EXTRACT_SUBREG GR64:$src, sub_16bit)))>; 1995 1982 // r & (2^8-1) ==> movz 1996 1983 def : Pat<(and GR64:$src, 0xff), 1997 (MOVZX64rr8 (i8 (EXTRACT_SUBREG GR64:$src, x86_subreg_8bit)))>;1984 (MOVZX64rr8 (i8 (EXTRACT_SUBREG GR64:$src, sub_8bit)))>; 1998 1985 // r & (2^8-1) ==> movz 1999 1986 def : Pat<(and GR32:$src1, 0xff), 2000 (MOVZX32rr8 (EXTRACT_SUBREG GR32:$src1, x86_subreg_8bit))>,1987 (MOVZX32rr8 (EXTRACT_SUBREG GR32:$src1, sub_8bit))>, 2001 1988 Requires<[In64BitMode]>; 2002 1989 // r & (2^8-1) ==> movz 2003 1990 def : Pat<(and GR16:$src1, 0xff), 2004 (MOVZX16rr8 (i8 (EXTRACT_SUBREG GR16:$src1, x86_subreg_8bit)))>,1991 (MOVZX16rr8 (i8 (EXTRACT_SUBREG GR16:$src1, sub_8bit)))>, 2005 1992 Requires<[In64BitMode]>; 2006 1993 2007 1994 // sext_inreg patterns 2008 1995 def : Pat<(sext_inreg GR64:$src, i32), 2009 (MOVSX64rr32 (EXTRACT_SUBREG GR64:$src, x86_subreg_32bit))>;1996 (MOVSX64rr32 (EXTRACT_SUBREG GR64:$src, sub_32bit))>; 2010 1997 def : Pat<(sext_inreg GR64:$src, i16), 2011 (MOVSX64rr16 (EXTRACT_SUBREG GR64:$src, x86_subreg_16bit))>;1998 (MOVSX64rr16 (EXTRACT_SUBREG GR64:$src, sub_16bit))>; 2012 1999 def : Pat<(sext_inreg GR64:$src, i8), 2013 (MOVSX64rr8 (EXTRACT_SUBREG GR64:$src, x86_subreg_8bit))>;2000 (MOVSX64rr8 (EXTRACT_SUBREG GR64:$src, sub_8bit))>; 2014 2001 def : Pat<(sext_inreg GR32:$src, i8), 2015 (MOVSX32rr8 (EXTRACT_SUBREG GR32:$src, x86_subreg_8bit))>,2002 (MOVSX32rr8 (EXTRACT_SUBREG GR32:$src, sub_8bit))>, 2016 2003 Requires<[In64BitMode]>; 2017 2004 def : Pat<(sext_inreg GR16:$src, i8), 2018 (MOVSX16rr8 (i8 (EXTRACT_SUBREG GR16:$src, x86_subreg_8bit)))>,2005 (MOVSX16rr8 (i8 (EXTRACT_SUBREG GR16:$src, sub_8bit)))>, 2019 2006 Requires<[In64BitMode]>; 2020 2007 2021 2008 // trunc patterns 2022 2009 def : Pat<(i32 (trunc GR64:$src)), 2023 (EXTRACT_SUBREG GR64:$src, x86_subreg_32bit)>;2010 (EXTRACT_SUBREG GR64:$src, sub_32bit)>; 2024 2011 def : Pat<(i16 (trunc GR64:$src)), 2025 (EXTRACT_SUBREG GR64:$src, x86_subreg_16bit)>;2012 (EXTRACT_SUBREG GR64:$src, sub_16bit)>; 2026 2013 def : Pat<(i8 (trunc GR64:$src)), 2027 (EXTRACT_SUBREG GR64:$src, x86_subreg_8bit)>;2014 (EXTRACT_SUBREG GR64:$src, sub_8bit)>; 2028 2015 def : Pat<(i8 (trunc GR32:$src)), 2029 (EXTRACT_SUBREG GR32:$src, x86_subreg_8bit)>,2016 (EXTRACT_SUBREG GR32:$src, sub_8bit)>, 2030 2017 Requires<[In64BitMode]>; 2031 2018 def : Pat<(i8 (trunc GR16:$src)), 2032 (EXTRACT_SUBREG GR16:$src, x86_subreg_8bit)>,2019 (EXTRACT_SUBREG GR16:$src, sub_8bit)>, 2033 2020 Requires<[In64BitMode]>; 2034 2021 … … 2046 2033 (MOVZX32_NOREXrr8 2047 2034 (EXTRACT_SUBREG (i64 (COPY_TO_REGCLASS GR64:$src, GR64_ABCD)), 2048 x86_subreg_8bit_hi)),2049 x86_subreg_32bit)>;2035 sub_8bit_hi)), 2036 sub_32bit)>; 2050 2037 def : Pat<(and (srl_su GR32:$src, (i8 8)), (i32 255)), 2051 2038 (MOVZX32_NOREXrr8 2052 2039 (EXTRACT_SUBREG (i32 (COPY_TO_REGCLASS GR32:$src, GR32_ABCD)), 2053 x86_subreg_8bit_hi))>, 2040 sub_8bit_hi))>, 2041 Requires<[In64BitMode]>; 2042 def : Pat<(srl (and_su GR32:$src, 0xff00), (i8 8)), 2043 (MOVZX32_NOREXrr8 (EXTRACT_SUBREG (i32 (COPY_TO_REGCLASS GR32:$src, 2044 GR32_ABCD)), 2045 sub_8bit_hi))>, 2054 2046 Requires<[In64BitMode]>; 2055 2047 def : Pat<(srl GR16:$src, (i8 8)), … … 2057 2049 (MOVZX32_NOREXrr8 2058 2050 (EXTRACT_SUBREG (i16 (COPY_TO_REGCLASS GR16:$src, GR16_ABCD)), 2059 x86_subreg_8bit_hi)),2060 x86_subreg_16bit)>,2051 sub_8bit_hi)), 2052 sub_16bit)>, 2061 2053 Requires<[In64BitMode]>; 2062 2054 def : Pat<(i32 (zext (srl_su GR16:$src, (i8 8)))), 2063 2055 (MOVZX32_NOREXrr8 2064 2056 (EXTRACT_SUBREG (i16 (COPY_TO_REGCLASS GR16:$src, GR16_ABCD)), 2065 x86_subreg_8bit_hi))>,2057 sub_8bit_hi))>, 2066 2058 Requires<[In64BitMode]>; 2067 2059 def : Pat<(i32 (anyext (srl_su GR16:$src, (i8 8)))), 2068 2060 (MOVZX32_NOREXrr8 2069 2061 (EXTRACT_SUBREG (i16 (COPY_TO_REGCLASS GR16:$src, GR16_ABCD)), 2070 x86_subreg_8bit_hi))>,2062 sub_8bit_hi))>, 2071 2063 Requires<[In64BitMode]>; 2072 2064 def : Pat<(i64 (zext (srl_su GR16:$src, (i8 8)))), … … 2075 2067 (MOVZX32_NOREXrr8 2076 2068 (EXTRACT_SUBREG (i16 (COPY_TO_REGCLASS GR16:$src, GR16_ABCD)), 2077 x86_subreg_8bit_hi)),2078 x86_subreg_32bit)>;2069 sub_8bit_hi)), 2070 sub_32bit)>; 2079 2071 def : Pat<(i64 (anyext (srl_su GR16:$src, (i8 8)))), 2080 2072 (SUBREG_TO_REG … … 2082 2074 (MOVZX32_NOREXrr8 2083 2075 (EXTRACT_SUBREG (i16 (COPY_TO_REGCLASS GR16:$src, GR16_ABCD)), 2084 x86_subreg_8bit_hi)),2085 x86_subreg_32bit)>;2076 sub_8bit_hi)), 2077 sub_32bit)>; 2086 2078 2087 2079 // h-register extract and store. … … 2090 2082 addr:$dst, 2091 2083 (EXTRACT_SUBREG (i64 (COPY_TO_REGCLASS GR64:$src, GR64_ABCD)), 2092 x86_subreg_8bit_hi))>;2084 sub_8bit_hi))>; 2093 2085 def : Pat<(store (i8 (trunc_su (srl_su GR32:$src, (i8 8)))), addr:$dst), 2094 2086 (MOV8mr_NOREX 2095 2087 addr:$dst, 2096 2088 (EXTRACT_SUBREG (i32 (COPY_TO_REGCLASS GR32:$src, GR32_ABCD)), 2097 x86_subreg_8bit_hi))>,2089 sub_8bit_hi))>, 2098 2090 Requires<[In64BitMode]>; 2099 2091 def : Pat<(store (i8 (trunc_su (srl_su GR16:$src, (i8 8)))), addr:$dst), … … 2101 2093 addr:$dst, 2102 2094 (EXTRACT_SUBREG (i16 (COPY_TO_REGCLASS GR16:$src, GR16_ABCD)), 2103 x86_subreg_8bit_hi))>,2095 sub_8bit_hi))>, 2104 2096 Requires<[In64BitMode]>; 2105 2097 … … 2123 2115 (SAR64mCL addr:$dst)>; 2124 2116 2125 // Double shift patterns2126 def : Pat<(shrd GR64:$src1, (i8 imm:$amt1), GR64:$src2, (i8 imm)),2127 (SHRD64rri8 GR64:$src1, GR64:$src2, (i8 imm:$amt1))>;2128 2129 def : Pat<(store (shrd (loadi64 addr:$dst), (i8 imm:$amt1),2130 GR64:$src2, (i8 imm)), addr:$dst),2131 (SHRD64mri8 addr:$dst, GR64:$src2, (i8 imm:$amt1))>;2132 2133 def : Pat<(shld GR64:$src1, (i8 imm:$amt1), GR64:$src2, (i8 imm)),2134 (SHLD64rri8 GR64:$src1, GR64:$src2, (i8 imm:$amt1))>;2135 2136 def : Pat<(store (shld (loadi64 addr:$dst), (i8 imm:$amt1),2137 GR64:$src2, (i8 imm)), addr:$dst),2138 (SHLD64mri8 addr:$dst, GR64:$src2, (i8 imm:$amt1))>;2139 2140 2117 // (or x1, x2) -> (add x1, x2) if two operands are known not to share bits. 2141 2118 let AddedComplexity = 5 in { // Try this before the selecting to OR 2142 def : Pat<(parallel (or_is_add GR64:$src1, i64immSExt8:$src2), 2143 (implicit EFLAGS)), 2119 def : Pat<(or_is_add GR64:$src1, i64immSExt8:$src2), 2144 2120 (ADD64ri8 GR64:$src1, i64immSExt8:$src2)>; 2145 def : Pat<(parallel (or_is_add GR64:$src1, i64immSExt32:$src2), 2146 (implicit EFLAGS)), 2121 def : Pat<(or_is_add GR64:$src1, i64immSExt32:$src2), 2147 2122 (ADD64ri32 GR64:$src1, i64immSExt32:$src2)>; 2148 def : Pat<(parallel (or_is_add GR64:$src1, GR64:$src2), 2149 (implicit EFLAGS)), 2123 def : Pat<(or_is_add GR64:$src1, GR64:$src2), 2150 2124 (ADD64rr GR64:$src1, GR64:$src2)>; 2151 2125 } // AddedComplexity … … 2174 2148 //===----------------------------------------------------------------------===// 2175 2149 2176 // Register-Register Addition with EFLAGS result 2177 def : Pat<(parallel (X86add_flag GR64:$src1, GR64:$src2), 2178 (implicit EFLAGS)), 2150 // addition 2151 def : Pat<(add GR64:$src1, GR64:$src2), 2179 2152 (ADD64rr GR64:$src1, GR64:$src2)>; 2180 2181 // Register-Integer Addition with EFLAGS result 2182 def : Pat<(parallel (X86add_flag GR64:$src1, i64immSExt8:$src2), 2183 (implicit EFLAGS)), 2153 def : Pat<(add GR64:$src1, i64immSExt8:$src2), 2184 2154 (ADD64ri8 GR64:$src1, i64immSExt8:$src2)>; 2185 def : Pat<(parallel (X86add_flag GR64:$src1, i64immSExt32:$src2), 2186 (implicit EFLAGS)), 2155 def : Pat<(add GR64:$src1, i64immSExt32:$src2), 2187 2156 (ADD64ri32 GR64:$src1, i64immSExt32:$src2)>; 2188 2189 // Register-Memory Addition with EFLAGS result 2190 def : Pat<(parallel (X86add_flag GR64:$src1, (loadi64 addr:$src2)), 2191 (implicit EFLAGS)), 2157 def : Pat<(add GR64:$src1, (loadi64 addr:$src2)), 2192 2158 (ADD64rm GR64:$src1, addr:$src2)>; 2193 2159 2194 // Memory-Register Addition with EFLAGS result 2195 def : Pat<(parallel (store (X86add_flag (loadi64 addr:$dst), GR64:$src2), 2196 addr:$dst), 2197 (implicit EFLAGS)), 2198 (ADD64mr addr:$dst, GR64:$src2)>; 2199 def : Pat<(parallel (store (X86add_flag (loadi64 addr:$dst), i64immSExt8:$src2), 2200 addr:$dst), 2201 (implicit EFLAGS)), 2202 (ADD64mi8 addr:$dst, i64immSExt8:$src2)>; 2203 def : Pat<(parallel (store (X86add_flag (loadi64 addr:$dst), 2204 i64immSExt32:$src2), 2205 addr:$dst), 2206 (implicit EFLAGS)), 2207 (ADD64mi32 addr:$dst, i64immSExt32:$src2)>; 2208 2209 // Register-Register Subtraction with EFLAGS result 2210 def : Pat<(parallel (X86sub_flag GR64:$src1, GR64:$src2), 2211 (implicit EFLAGS)), 2160 // subtraction 2161 def : Pat<(sub GR64:$src1, GR64:$src2), 2212 2162 (SUB64rr GR64:$src1, GR64:$src2)>; 2213 2214 // Register-Memory Subtraction with EFLAGS result 2215 def : Pat<(parallel (X86sub_flag GR64:$src1, (loadi64 addr:$src2)), 2216 (implicit EFLAGS)), 2163 def : Pat<(sub GR64:$src1, (loadi64 addr:$src2)), 2217 2164 (SUB64rm GR64:$src1, addr:$src2)>; 2218 2219 // Register-Integer Subtraction with EFLAGS result 2220 def : Pat<(parallel (X86sub_flag GR64:$src1, i64immSExt8:$src2), 2221 (implicit EFLAGS)), 2165 def : Pat<(sub GR64:$src1, i64immSExt8:$src2), 2222 2166 (SUB64ri8 GR64:$src1, i64immSExt8:$src2)>; 2223 def : Pat<(parallel (X86sub_flag GR64:$src1, i64immSExt32:$src2), 2224 (implicit EFLAGS)), 2167 def : Pat<(sub GR64:$src1, i64immSExt32:$src2), 2225 2168 (SUB64ri32 GR64:$src1, i64immSExt32:$src2)>; 2226 2169 2227 // Memory-Register Subtraction with EFLAGS result 2228 def : Pat<(parallel (store (X86sub_flag (loadi64 addr:$dst), GR64:$src2), 2229 addr:$dst), 2230 (implicit EFLAGS)), 2231 (SUB64mr addr:$dst, GR64:$src2)>; 2232 2233 // Memory-Integer Subtraction with EFLAGS result 2234 def : Pat<(parallel (store (X86sub_flag (loadi64 addr:$dst), 2235 i64immSExt8:$src2), 2236 addr:$dst), 2237 (implicit EFLAGS)), 2238 (SUB64mi8 addr:$dst, i64immSExt8:$src2)>; 2239 def : Pat<(parallel (store (X86sub_flag (loadi64 addr:$dst), 2240 i64immSExt32:$src2), 2241 addr:$dst), 2242 (implicit EFLAGS)), 2243 (SUB64mi32 addr:$dst, i64immSExt32:$src2)>; 2244 2245 // Register-Register Signed Integer Multiplication with EFLAGS result 2246 def : Pat<(parallel (X86smul_flag GR64:$src1, GR64:$src2), 2247 (implicit EFLAGS)), 2170 // Multiply 2171 def : Pat<(mul GR64:$src1, GR64:$src2), 2248 2172 (IMUL64rr GR64:$src1, GR64:$src2)>; 2249 2250 // Register-Memory Signed Integer Multiplication with EFLAGS result 2251 def : Pat<(parallel (X86smul_flag GR64:$src1, (loadi64 addr:$src2)), 2252 (implicit EFLAGS)), 2173 def : Pat<(mul GR64:$src1, (loadi64 addr:$src2)), 2253 2174 (IMUL64rm GR64:$src1, addr:$src2)>; 2254 2255 // Register-Integer Signed Integer Multiplication with EFLAGS result 2256 def : Pat<(parallel (X86smul_flag GR64:$src1, i64immSExt8:$src2), 2257 (implicit EFLAGS)), 2175 def : Pat<(mul GR64:$src1, i64immSExt8:$src2), 2258 2176 (IMUL64rri8 GR64:$src1, i64immSExt8:$src2)>; 2259 def : Pat<(parallel (X86smul_flag GR64:$src1, i64immSExt32:$src2), 2260 (implicit EFLAGS)), 2177 def : Pat<(mul GR64:$src1, i64immSExt32:$src2), 2261 2178 (IMUL64rri32 GR64:$src1, i64immSExt32:$src2)>; 2262 2263 // Memory-Integer Signed Integer Multiplication with EFLAGS result 2264 def : Pat<(parallel (X86smul_flag (loadi64 addr:$src1), i64immSExt8:$src2), 2265 (implicit EFLAGS)), 2179 def : Pat<(mul (loadi64 addr:$src1), i64immSExt8:$src2), 2266 2180 (IMUL64rmi8 addr:$src1, i64immSExt8:$src2)>; 2267 def : Pat<(parallel (X86smul_flag (loadi64 addr:$src1), i64immSExt32:$src2), 2268 (implicit EFLAGS)), 2181 def : Pat<(mul (loadi64 addr:$src1), i64immSExt32:$src2), 2269 2182 (IMUL64rmi32 addr:$src1, i64immSExt32:$src2)>; 2270 2183 2271 // INC and DEC with EFLAGS result. Note that these do not set CF. 2272 def : Pat<(parallel (X86inc_flag GR16:$src), (implicit EFLAGS)), 2273 (INC64_16r GR16:$src)>, Requires<[In64BitMode]>; 2274 def : Pat<(parallel (store (i16 (X86inc_flag (loadi16 addr:$dst))), addr:$dst), 2275 (implicit EFLAGS)), 2276 (INC64_16m addr:$dst)>, Requires<[In64BitMode]>; 2277 def : Pat<(parallel (X86dec_flag GR16:$src), (implicit EFLAGS)), 2278 (DEC64_16r GR16:$src)>, Requires<[In64BitMode]>; 2279 def : Pat<(parallel (store (i16 (X86dec_flag (loadi16 addr:$dst))), addr:$dst), 2280 (implicit EFLAGS)), 2281 (DEC64_16m addr:$dst)>, Requires<[In64BitMode]>; 2282 2283 def : Pat<(parallel (X86inc_flag GR32:$src), (implicit EFLAGS)), 2284 (INC64_32r GR32:$src)>, Requires<[In64BitMode]>; 2285 def : Pat<(parallel (store (i32 (X86inc_flag (loadi32 addr:$dst))), addr:$dst), 2286 (implicit EFLAGS)), 2287 (INC64_32m addr:$dst)>, Requires<[In64BitMode]>; 2288 def : Pat<(parallel (X86dec_flag GR32:$src), (implicit EFLAGS)), 2289 (DEC64_32r GR32:$src)>, Requires<[In64BitMode]>; 2290 def : Pat<(parallel (store (i32 (X86dec_flag (loadi32 addr:$dst))), addr:$dst), 2291 (implicit EFLAGS)), 2292 (DEC64_32m addr:$dst)>, Requires<[In64BitMode]>; 2293 2294 def : Pat<(parallel (X86inc_flag GR64:$src), (implicit EFLAGS)), 2295 (INC64r GR64:$src)>; 2296 def : Pat<(parallel (store (i64 (X86inc_flag (loadi64 addr:$dst))), addr:$dst), 2297 (implicit EFLAGS)), 2298 (INC64m addr:$dst)>; 2299 def : Pat<(parallel (X86dec_flag GR64:$src), (implicit EFLAGS)), 2300 (DEC64r GR64:$src)>; 2301 def : Pat<(parallel (store (i64 (X86dec_flag (loadi64 addr:$dst))), addr:$dst), 2302 (implicit EFLAGS)), 2303 (DEC64m addr:$dst)>; 2304 2305 // Register-Register Logical Or with EFLAGS result 2306 def : Pat<(parallel (X86or_flag GR64:$src1, GR64:$src2), 2307 (implicit EFLAGS)), 2184 // inc/dec 2185 def : Pat<(add GR16:$src, 1), (INC64_16r GR16:$src)>, Requires<[In64BitMode]>; 2186 def : Pat<(add GR16:$src, -1), (DEC64_16r GR16:$src)>, Requires<[In64BitMode]>; 2187 def : Pat<(add GR32:$src, 1), (INC64_32r GR32:$src)>, Requires<[In64BitMode]>; 2188 def : Pat<(add GR32:$src, -1), (DEC64_32r GR32:$src)>, Requires<[In64BitMode]>; 2189 def : Pat<(add GR64:$src, 1), (INC64r GR64:$src)>; 2190 def : Pat<(add GR64:$src, -1), (DEC64r GR64:$src)>; 2191 2192 // or 2193 def : Pat<(or GR64:$src1, GR64:$src2), 2308 2194 (OR64rr GR64:$src1, GR64:$src2)>; 2309 2310 // Register-Integer Logical Or with EFLAGS result 2311 def : Pat<(parallel (X86or_flag GR64:$src1, i64immSExt8:$src2), 2312 (implicit EFLAGS)), 2195 def : Pat<(or GR64:$src1, i64immSExt8:$src2), 2313 2196 (OR64ri8 GR64:$src1, i64immSExt8:$src2)>; 2314 def : Pat<(parallel (X86or_flag GR64:$src1, i64immSExt32:$src2), 2315 (implicit EFLAGS)), 2197 def : Pat<(or GR64:$src1, i64immSExt32:$src2), 2316 2198 (OR64ri32 GR64:$src1, i64immSExt32:$src2)>; 2317 2318 // Register-Memory Logical Or with EFLAGS result 2319 def : Pat<(parallel (X86or_flag GR64:$src1, (loadi64 addr:$src2)), 2320 (implicit EFLAGS)), 2199 def : Pat<(or GR64:$src1, (loadi64 addr:$src2)), 2321 2200 (OR64rm GR64:$src1, addr:$src2)>; 2322 2201 2323 // Memory-Register Logical Or with EFLAGS result 2324 def : Pat<(parallel (store (X86or_flag (loadi64 addr:$dst), GR64:$src2), 2325 addr:$dst), 2326 (implicit EFLAGS)), 2327 (OR64mr addr:$dst, GR64:$src2)>; 2328 def : Pat<(parallel (store (X86or_flag (loadi64 addr:$dst), i64immSExt8:$src2), 2329 addr:$dst), 2330 (implicit EFLAGS)), 2331 (OR64mi8 addr:$dst, i64immSExt8:$src2)>; 2332 def : Pat<(parallel (store (X86or_flag (loadi64 addr:$dst), i64immSExt32:$src2), 2333 addr:$dst), 2334 (implicit EFLAGS)), 2335 (OR64mi32 addr:$dst, i64immSExt32:$src2)>; 2336 2337 // Register-Register Logical XOr with EFLAGS result 2338 def : Pat<(parallel (X86xor_flag GR64:$src1, GR64:$src2), 2339 (implicit EFLAGS)), 2202 // xor 2203 def : Pat<(xor GR64:$src1, GR64:$src2), 2340 2204 (XOR64rr GR64:$src1, GR64:$src2)>; 2341 2342 // Register-Integer Logical XOr with EFLAGS result 2343 def : Pat<(parallel (X86xor_flag GR64:$src1, i64immSExt8:$src2), 2344 (implicit EFLAGS)), 2205 def : Pat<(xor GR64:$src1, i64immSExt8:$src2), 2345 2206 (XOR64ri8 GR64:$src1, i64immSExt8:$src2)>; 2346 def : Pat<(parallel (X86xor_flag GR64:$src1, i64immSExt32:$src2), 2347 (implicit EFLAGS)), 2207 def : Pat<(xor GR64:$src1, i64immSExt32:$src2), 2348 2208 (XOR64ri32 GR64:$src1, i64immSExt32:$src2)>; 2349 2350 // Register-Memory Logical XOr with EFLAGS result 2351 def : Pat<(parallel (X86xor_flag GR64:$src1, (loadi64 addr:$src2)), 2352 (implicit EFLAGS)), 2209 def : Pat<(xor GR64:$src1, (loadi64 addr:$src2)), 2353 2210 (XOR64rm GR64:$src1, addr:$src2)>; 2354 2211 2355 // Memory-Register Logical XOr with EFLAGS result 2356 def : Pat<(parallel (store (X86xor_flag (loadi64 addr:$dst), GR64:$src2), 2357 addr:$dst), 2358 (implicit EFLAGS)), 2359 (XOR64mr addr:$dst, GR64:$src2)>; 2360 def : Pat<(parallel (store (X86xor_flag (loadi64 addr:$dst), i64immSExt8:$src2), 2361 addr:$dst), 2362 (implicit EFLAGS)), 2363 (XOR64mi8 addr:$dst, i64immSExt8:$src2)>; 2364 def : Pat<(parallel (store (X86xor_flag (loadi64 addr:$dst), 2365 i64immSExt32:$src2), 2366 addr:$dst), 2367 (implicit EFLAGS)), 2368 (XOR64mi32 addr:$dst, i64immSExt32:$src2)>; 2369 2370 // Register-Register Logical And with EFLAGS result 2371 def : Pat<(parallel (X86and_flag GR64:$src1, GR64:$src2), 2372 (implicit EFLAGS)), 2212 // and 2213 def : Pat<(and GR64:$src1, GR64:$src2), 2373 2214 (AND64rr GR64:$src1, GR64:$src2)>; 2374 2375 // Register-Integer Logical And with EFLAGS result 2376 def : Pat<(parallel (X86and_flag GR64:$src1, i64immSExt8:$src2), 2377 (implicit EFLAGS)), 2215 def : Pat<(and GR64:$src1, i64immSExt8:$src2), 2378 2216 (AND64ri8 GR64:$src1, i64immSExt8:$src2)>; 2379 def : Pat<(parallel (X86and_flag GR64:$src1, i64immSExt32:$src2), 2380 (implicit EFLAGS)), 2217 def : Pat<(and GR64:$src1, i64immSExt32:$src2), 2381 2218 (AND64ri32 GR64:$src1, i64immSExt32:$src2)>; 2382 2383 // Register-Memory Logical And with EFLAGS result 2384 def : Pat<(parallel (X86and_flag GR64:$src1, (loadi64 addr:$src2)), 2385 (implicit EFLAGS)), 2219 def : Pat<(and GR64:$src1, (loadi64 addr:$src2)), 2386 2220 (AND64rm GR64:$src1, addr:$src2)>; 2387 2388 // Memory-Register Logical And with EFLAGS result2389 def : Pat<(parallel (store (X86and_flag (loadi64 addr:$dst), GR64:$src2),2390 addr:$dst),2391 (implicit EFLAGS)),2392 (AND64mr addr:$dst, GR64:$src2)>;2393 def : Pat<(parallel (store (X86and_flag (loadi64 addr:$dst), i64immSExt8:$src2),2394 addr:$dst),2395 (implicit EFLAGS)),2396 (AND64mi8 addr:$dst, i64immSExt8:$src2)>;2397 def : Pat<(parallel (store (X86and_flag (loadi64 addr:$dst),2398 i64immSExt32:$src2),2399 addr:$dst),2400 (implicit EFLAGS)),2401 (AND64mi32 addr:$dst, i64immSExt32:$src2)>;2402 2221 2403 2222 //===----------------------------------------------------------------------===// … … 2419 2238 "mov{d|q}\t{$src, $dst|$dst, $src}", 2420 2239 [(set FR64:$dst, (bitconvert GR64:$src))]>; 2421 def MOV64toSDrm : RPDI<0x6E, MRMSrcMem, (outs FR64:$dst), (ins i64mem:$src),2240 def MOV64toSDrm : S3SI<0x7E, MRMSrcMem, (outs FR64:$dst), (ins i64mem:$src), 2422 2241 "movq\t{$src, $dst|$dst, $src}", 2423 2242 [(set FR64:$dst, (bitconvert (loadi64 addr:$src)))]>; … … 2430 2249 [(store (i64 (bitconvert FR64:$src)), addr:$dst)]>; 2431 2250 2432 //===----------------------------------------------------------------------===//2433 // X86-64 SSE4.1 Instructions2434 //===----------------------------------------------------------------------===//2435 2436 /// SS41I_extract32 - SSE 4.1 extract 32 bits to int reg or memory destination2437 multiclass SS41I_extract64<bits<8> opc, string OpcodeStr> {2438 def rr : SS4AIi8<opc, MRMDestReg, (outs GR64:$dst),2439 (ins VR128:$src1, i32i8imm:$src2),2440 !strconcat(OpcodeStr,2441 "\t{$src2, $src1, $dst|$dst, $src1, $src2}"),2442 [(set GR64:$dst,2443 (extractelt (v2i64 VR128:$src1), imm:$src2))]>, OpSize, REX_W;2444 def mr : SS4AIi8<opc, MRMDestMem, (outs),2445 (ins i64mem:$dst, VR128:$src1, i32i8imm:$src2),2446 !strconcat(OpcodeStr,2447 "\t{$src2, $src1, $dst|$dst, $src1, $src2}"),2448 [(store (extractelt (v2i64 VR128:$src1), imm:$src2),2449 addr:$dst)]>, OpSize, REX_W;2450 }2451 2452 defm PEXTRQ : SS41I_extract64<0x16, "pextrq">;2453 2454 let isTwoAddress = 1 in {2455 multiclass SS41I_insert64<bits<8> opc, string OpcodeStr> {2456 def rr : SS4AIi8<opc, MRMSrcReg, (outs VR128:$dst),2457 (ins VR128:$src1, GR64:$src2, i32i8imm:$src3),2458 !strconcat(OpcodeStr,2459 "\t{$src3, $src2, $dst|$dst, $src2, $src3}"),2460 [(set VR128:$dst,2461 (v2i64 (insertelt VR128:$src1, GR64:$src2, imm:$src3)))]>,2462 OpSize, REX_W;2463 def rm : SS4AIi8<opc, MRMSrcMem, (outs VR128:$dst),2464 (ins VR128:$src1, i64mem:$src2, i32i8imm:$src3),2465 !strconcat(OpcodeStr,2466 "\t{$src3, $src2, $dst|$dst, $src2, $src3}"),2467 [(set VR128:$dst,2468 (v2i64 (insertelt VR128:$src1, (loadi64 addr:$src2),2469 imm:$src3)))]>, OpSize, REX_W;2470 }2471 }2472 2473 defm PINSRQ : SS41I_insert64<0x22, "pinsrq">;2474 2475 // -disable-16bit support.2476 def : Pat<(truncstorei16 (i64 imm:$src), addr:$dst),2477 (MOV16mi addr:$dst, imm:$src)>;2478 def : Pat<(truncstorei16 GR64:$src, addr:$dst),2479 (MOV16mr addr:$dst, (EXTRACT_SUBREG GR64:$src, x86_subreg_16bit))>;2480 def : Pat<(i64 (sextloadi16 addr:$dst)),2481 (MOVSX64rm16 addr:$dst)>;2482 def : Pat<(i64 (zextloadi16 addr:$dst)),2483 (MOVZX64rm16 addr:$dst)>;2484 def : Pat<(i64 (extloadi16 addr:$dst)),2485 (MOVZX64rm16 addr:$dst)>;
Note:
See TracChangeset
for help on using the changeset viewer.