Ignore:
Timestamp:
Apr 19, 2011, 11:12:07 PM (14 years ago)
Author:
Yuri Dario
Message:

clamav: update trunk to 0.97.

Location:
clamav/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • clamav/trunk

  • TabularUnified clamav/trunk/libclamav/c++/llvm/lib/Target/X86/X86Instr64bit.td

    r189 r319  
    1919
    2020// 64-bits but only 32 bits are significant.
    21 def i64i32imm  : Operand<i64>;
     21def i64i32imm  : Operand<i64> {
     22  let ParserMatchClass = ImmSExti64i32AsmOperand;
     23}
    2224
    2325// 64-bits but only 32 bits are significant, and those bits are treated as being
     
    2527def i64i32imm_pcrel : Operand<i64> {
    2628  let PrintMethod = "print_pcrel_imm";
     29  let ParserMatchClass = X86AbsMemAsmOperand;
    2730}
    2831
     
    3033// 64-bits but only 8 bits are significant.
    3134def 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
     38def lea64_32mem : Operand<i32> {
     39  let PrintMethod = "printi32mem";
     40  let AsmOperandLowerMethod = "lower_lea64_32mem";
     41  let MIOperandInfo = (ops GR32, i8imm, GR32_NOSP, i32imm, i8imm);
    3842  let ParserMatchClass = X86MemAsmOperand;
    3943}
    4044
    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.
     49def i64mem_TC : Operand<i64> {
     50  let PrintMethod = "printi64mem";
     51  let MIOperandInfo = (ops GR64_TC, i8imm, GR64_TC, i32imm, i8imm);
    4552  let ParserMatchClass = X86MemAsmOperand;
    4653}
     
    4956// Complex Pattern Definitions.
    5057//
    51 def lea64addr : ComplexPattern<i64, 4, "SelectLEAAddr",
     58def lea64addr : ComplexPattern<i64, 5, "SelectLEAAddr",
    5259                        [add, sub, mul, X86mul_imm, shl, or, frameindex,
    5360                         X86WrapperRIP], []>;
    5461
    55 def tls64addr : ComplexPattern<i64, 4, "SelectTLSADDRAddr",
     62def tls64addr : ComplexPattern<i64, 5, "SelectTLSADDRAddr",
    5663                               [tglobaltlsaddr], []>;
    57 
     64                               
    5865//===----------------------------------------------------------------------===//
    5966// Pattern fragments.
     
    6774}]>;
    6875
    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 }]>;
     76def i64immSExt32  : PatLeaf<(i64 imm), [{ return i64immSExt32(N); }]>;
    7477
    7578
     
    135138    // that the offset between an arbitrary immediate and the call will fit in
    136139    // the 32-bit pcrel field that we have.
    137     def CALL64pcrel32 : Ii32<0xE8, RawFrm,
     140    def CALL64pcrel32 : Ii32PCRel<0xE8, RawFrm,
    138141                          (outs), (ins i64i32imm_pcrel:$dst, variable_ops),
    139142                          "call{q}\t$dst", []>,
     
    152155  // FIXME: We need to teach codegen about single list of call-clobbered
    153156  // registers.
    154 let isCall = 1 in
     157let isCall = 1, isCodeGenOnly = 1 in
    155158  // All calls clobber the non-callee saved registers. RSP is marked as
    156159  // a use to prevent stack-pointer assignments that appear immediately
     
    162165              XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, EFLAGS],
    163166      Uses = [RSP] in {
    164     def WINCALL64pcrel32 : I<0xE8, RawFrm,
     167    def WINCALL64pcrel32 : Ii32PCRel<0xE8, RawFrm,
    165168                             (outs), (ins i64i32imm_pcrel:$dst, variable_ops),
    166169                             "call\t$dst", []>,
     
    176179
    177180
    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                    []>;     
     181let 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}
    195210
    196211// Branches
     
    199214                       "jmp{q}\t$dst", []>;
    200215  def JMP64r     : I<0xFF, MRM4r, (outs), (ins GR64:$dst), "jmp{q}\t{*}$dst",
    201                      [(brind GR64:$dst)]>;
     216                     [(brind GR64:$dst)]>, Requires<[In64BitMode]>;
    202217  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]>;
    204219  def FARJMP64   : RI<0xFF, MRM5m, (outs), (ins opaque80mem:$dst),
    205220                      "ljmp{q}\t{*}$dst", []>;
     
    223238def POPCNT64rr : RI<0xB8, MRMSrcReg, (outs GR64:$dst), (ins GR64:$src),
    224239                    "popcnt{q}\t{$src, $dst|$dst, $src}", []>, XS;
     240let mayLoad = 1 in
    225241def POPCNT64rm : RI<0xB8, MRMSrcMem, (outs GR64:$dst), (ins i64mem:$src),
    226242                    "popcnt{q}\t{$src, $dst|$dst, $src}", []>, XS;
     
    228244let Defs = [RBP,RSP], Uses = [RBP,RSP], mayLoad = 1, neverHasSideEffects = 1 in
    229245def LEAVE64  : I<0xC9, RawFrm,
    230                  (outs), (ins), "leave", []>;
     246                 (outs), (ins), "leave", []>, Requires<[In64BitMode]>;
    231247let Defs = [RSP], Uses = [RSP], neverHasSideEffects=1 in {
    232248let mayLoad = 1 in {
     
    249265def PUSH64i16  : Ii16<0x68, RawFrm, (outs), (ins i16imm:$imm),
    250266                      "push{q}\t$imm", []>;
    251 def PUSH64i32  : Ii32<0x68, RawFrm, (outs), (ins i32imm:$imm),
     267def PUSH64i32  : Ii32<0x68, RawFrm, (outs), (ins i64i32imm:$imm),
    252268                      "push{q}\t$imm", []>;
    253269}
    254270
    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}", []>;
     271let Defs = [RSP, EFLAGS], Uses = [RSP], mayLoad = 1, neverHasSideEffects=1 in
     272def POPF64   : I<0x9D, RawFrm, (outs), (ins), "popfq", []>,
     273               Requires<[In64BitMode]>;
     274let Defs = [RSP], Uses = [RSP, EFLAGS], mayStore = 1, neverHasSideEffects=1 in
     275def PUSHF64    : I<0x9C, RawFrm, (outs), (ins), "pushfq", []>,
     276                 Requires<[In64BitMode]>;
    259277
    260278def LEA64_32r : I<0x8D, MRMSrcMem,
     
    264282
    265283let isReMaterializable = 1 in
    266 def LEA64r   : RI<0x8D, MRMSrcMem, (outs GR64:$dst), (ins lea64mem:$src),
     284def LEA64r   : RI<0x8D, MRMSrcMem, (outs GR64:$dst), (ins i64mem:$src),
    267285                  "lea{q}\t{$src|$dst}, {$dst|$src}",
    268286                  [(set GR64:$dst, lea64addr:$src)]>;
    269287
    270 let isTwoAddress = 1 in
     288let Constraints = "$src = $dst" in
    271289def BSWAP64r : RI<0xC8, AddRegFrm, (outs GR64:$dst), (ins GR64:$src),
    272290                  "bswap{q}\t$dst",
     
    277295def BSF64rr  : RI<0xBC, MRMSrcReg, (outs GR64:$dst), (ins GR64:$src),
    278296                  "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;
    280298def BSF64rm  : RI<0xBC, MRMSrcMem, (outs GR64:$dst), (ins i64mem:$src),
    281299                  "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;
    284301
    285302def BSR64rr  : RI<0xBD, MRMSrcReg, (outs GR64:$dst), (ins GR64:$src),
    286303                  "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;
    288305def BSR64rm  : RI<0xBD, MRMSrcMem, (outs GR64:$dst), (ins i64mem:$src),
    289306                  "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;
    292308} // Defs = [EFLAGS]
    293309
    294310// Repeat string ops
    295 let Defs = [RCX,RDI,RSI], Uses = [RCX,RDI,RSI] in
     311let Defs = [RCX,RDI,RSI], Uses = [RCX,RDI,RSI], isCodeGenOnly = 1 in
    296312def REP_MOVSQ : RI<0xA5, RawFrm, (outs), (ins), "{rep;movsq|rep movsq}",
    297313                   [(X86rep_movs i64)]>, REP;
    298 let Defs = [RCX,RDI], Uses = [RAX,RCX,RDI] in
     314let Defs = [RCX,RDI], Uses = [RAX,RCX,RDI], isCodeGenOnly = 1 in
    299315def REP_STOSQ : RI<0xAB, RawFrm, (outs), (ins), "{rep;stosq|rep stosq}",
    300316                   [(X86rep_stos i64)]>, REP;
    301317
    302 def SCAS64 : RI<0xAF, RawFrm, (outs), (ins), "scas{q}", []>;
    303 
    304 def CMPS64 : RI<0xA7, RawFrm, (outs), (ins), "cmps{q}", []>;
     318let Defs = [EDI,ESI], Uses = [EDI,ESI,EFLAGS] in
     319def MOVSQ : RI<0xA5, RawFrm, (outs), (ins), "movsq", []>;
     320
     321let Defs = [RCX,RDI], Uses = [RAX,RCX,RDI,EFLAGS] in
     322def STOSQ : RI<0xAB, RawFrm, (outs), (ins), "stosq", []>;
     323
     324def SCAS64 : RI<0xAF, RawFrm, (outs), (ins), "scasq", []>;
     325
     326def CMPS64 : RI<0xA7, RawFrm, (outs), (ins), "cmpsq", []>;
    305327
    306328// Fast system-call instructions
    307329def SYSEXIT64 : RI<0x35, RawFrm,
    308                    (outs), (ins), "sysexit", []>, TB;
     330                   (outs), (ins), "sysexit", []>, TB, Requires<[In64BitMode]>;
    309331
    310332//===----------------------------------------------------------------------===//
     
    325347}
    326348
     349// The assembler accepts movq of a 64-bit immediate as an alternate spelling of
     350// movabsq.
     351let isAsmParserOnly = 1 in {
     352def MOV64ri_alt : RIi64<0xB8, AddRegFrm, (outs GR64:$dst), (ins i64imm:$src),
     353                    "mov{q}\t{$src, $dst|$dst, $src}", []>;
     354}
     355
     356let isCodeGenOnly = 1 in {
    327357def MOV64rr_REV : RI<0x8B, MRMSrcReg, (outs GR64:$dst), (ins GR64:$src),
    328358                     "mov{q}\t{$src, $dst|$dst, $src}", []>;
     359}
    329360
    330361let canFoldAsLoad = 1, isReMaterializable = 1 in
     
    340371                      [(store i64immSExt32:$src, addr:$dst)]>;
    341372
     373/// Versions of MOV64rr, MOV64rm, and MOV64mr for i64mem_TC and GR64_TC.
     374let isCodeGenOnly = 1 in {
     375let neverHasSideEffects = 1 in
     376def MOV64rr_TC : RI<0x89, MRMDestReg, (outs GR64_TC:$dst), (ins GR64_TC:$src),
     377                "mov{q}\t{$src, $dst|$dst, $src}", []>;
     378
     379let mayLoad = 1,
     380    canFoldAsLoad = 1, isReMaterializable = 1 in
     381def MOV64rm_TC : RI<0x8B, MRMSrcMem, (outs GR64_TC:$dst), (ins i64mem_TC:$src),
     382                "mov{q}\t{$src, $dst|$dst, $src}",
     383                []>;
     384
     385let mayStore = 1 in
     386def 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/*
    342396def MOV64o8a : RIi8<0xA0, RawFrm, (outs), (ins offset8:$src),
    343397                      "mov{q}\t{$src, %rax|%rax, $src}", []>;
     
    348402def MOV64ao64 : RIi32<0xA3, RawFrm, (outs offset64:$dst), (ins),
    349403                       "mov{q}\t{%rax, $dst|$dst, %rax}", []>;
     404*/
    350405
    351406// Moves to and from segment registers
     
    366421
    367422// Moves to and from control registers
    368 def MOV64rc : I<0x20, MRMDestReg, (outs GR64:$dst), (ins CONTROL_REG_64:$src),
     423def MOV64rc : I<0x20, MRMDestReg, (outs GR64:$dst), (ins CONTROL_REG:$src),
    369424                "mov{q}\t{$src, $dst|$dst, $src}", []>, TB;
    370 def MOV64cr : I<0x22, MRMSrcReg, (outs CONTROL_REG_64:$dst), (ins GR64:$src),
     425def MOV64cr : I<0x22, MRMSrcReg, (outs CONTROL_REG:$dst), (ins GR64:$src),
    371426                "mov{q}\t{$src, $dst|$dst, $src}", []>, TB;
    372427
     
    446501// we can use a SUBREG_TO_REG.
    447502def : 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)>;
    449504
    450505let neverHasSideEffects = 1 in {
     
    464519let Defs = [EFLAGS] in {
    465520
    466 def ADD64i32 : RI<0x05, RawFrm, (outs), (ins i32imm:$src),
    467                   "add{q}\t{$src, %rax|%rax, $src}", []>;
    468 
    469 let isTwoAddress = 1 in {
     521def ADD64i32 : RIi32<0x05, RawFrm, (outs), (ins i64i32imm:$src),
     522                     "add{q}\t{$src, %rax|%rax, $src}", []>;
     523
     524let Constraints = "$src1 = $dst" in {
    470525let isConvertibleToThreeAddress = 1 in {
    471526let isCommutable = 1 in
     
    474529                    (ins GR64:$src1, GR64:$src2),
    475530                    "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.
     536let 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}
    478541
    479542// Register-Integer Addition
     
    481544                     (ins GR64:$src1, i64i8imm:$src2),
    482545                     "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))]>;
    485548def ADD64ri32 : RIi32<0x81, MRM0r, (outs GR64:$dst),
    486549                      (ins GR64:$src1, i64i32imm:$src2),
    487550                      "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))]>;
    490553} // isConvertibleToThreeAddress
    491554
     
    494557                     (ins GR64:$src1, i64mem:$src2),
    495558                     "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"
    506563
    507564// Memory-Register Addition
     
    521578let Uses = [EFLAGS] in {
    522579
    523 def ADC64i32 : RI<0x15, RawFrm, (outs), (ins i32imm:$src),
    524                   "adc{q}\t{$src, %rax|%rax, $src}", []>;
    525 
    526 let isTwoAddress = 1 in {
     580def ADC64i32 : RIi32<0x15, RawFrm, (outs), (ins i64i32imm:$src),
     581                     "adc{q}\t{$src, %rax|%rax, $src}", []>;
     582
     583let Constraints = "$src1 = $dst" in {
    527584let isCommutable = 1 in
    528585def ADC64rr  : RI<0x11, MRMDestReg, (outs GR64:$dst),
     
    531588                  [(set GR64:$dst, (adde GR64:$src1, GR64:$src2))]>;
    532589
     590let isCodeGenOnly = 1 in {
    533591def ADC64rr_REV : RI<0x13, MRMSrcReg , (outs GR32:$dst),
    534592                     (ins GR64:$src1, GR64:$src2),
    535593                    "adc{q}\t{$src2, $dst|$dst, $src2}", []>;
     594}
    536595
    537596def ADC64rm  : RI<0x13, MRMSrcMem , (outs GR64:$dst),
     
    548607                      "adc{q}\t{$src2, $dst|$dst, $src2}",
    549608                      [(set GR64:$dst, (adde GR64:$src1, i64immSExt32:$src2))]>;
    550 } // isTwoAddress
     609} // Constraints = "$src1 = $dst"
    551610
    552611def ADC64mr  : RI<0x11, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src2),
     
    563622} // Uses = [EFLAGS]
    564623
    565 let isTwoAddress = 1 in {
     624let Constraints = "$src1 = $dst" in {
    566625// Register-Register Subtraction
    567626def SUB64rr  : RI<0x29, MRMDestReg, (outs GR64:$dst),
    568627                  (ins GR64:$src1, GR64:$src2),
    569628                  "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
     632let isCodeGenOnly = 1 in {
    573633def SUB64rr_REV : RI<0x2B, MRMSrcReg, (outs GR64:$dst),
    574634                     (ins GR64:$src1, GR64:$src2),
    575635                     "sub{q}\t{$src2, $dst|$dst, $src2}", []>;
     636}
    576637
    577638// Register-Memory Subtraction
     
    579640                  (ins GR64:$src1, i64mem:$src2),
    580641                  "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)))]>;
    583644
    584645// Register-Integer Subtraction
     
    586647                                 (ins GR64:$src1, i64i8imm:$src2),
    587648                    "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))]>;
    590651def SUB64ri32 : RIi32<0x81, MRM5r, (outs GR64:$dst),
    591652                                   (ins GR64:$src1, i64i32imm:$src2),
    592653                      "sub{q}\t{$src2, $dst|$dst, $src2}",
    593                       [(set GR64:$dst, (sub GR64:$src1, i64immSExt32:$src2)),
    594                        (implicit EFLAGS)]>;
    595 } // isTwoAddress
    596 
    597 def SUB64i32 : RI<0x2D, RawFrm, (outs), (ins i32imm:$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
     658def SUB64i32 : RIi32<0x2D, RawFrm, (outs), (ins i64i32imm:$src),
     659                     "sub{q}\t{$src, %rax|%rax, $src}", []>;
    599660
    600661// Memory-Register Subtraction
     
    617678
    618679let Uses = [EFLAGS] in {
    619 let isTwoAddress = 1 in {
     680let Constraints = "$src1 = $dst" in {
    620681def SBB64rr    : RI<0x19, MRMDestReg, (outs GR64:$dst),
    621682                    (ins GR64:$src1, GR64:$src2),
     
    623684                    [(set GR64:$dst, (sube GR64:$src1, GR64:$src2))]>;
    624685
     686let isCodeGenOnly = 1 in {
    625687def SBB64rr_REV : RI<0x1B, MRMSrcReg, (outs GR64:$dst),
    626688                     (ins GR64:$src1, GR64:$src2),
    627689                     "sbb{q}\t{$src2, $dst|$dst, $src2}", []>;
     690}
    628691                     
    629692def SBB64rm  : RI<0x1B, MRMSrcMem, (outs GR64:$dst),
     
    640703                      "sbb{q}\t{$src2, $dst|$dst, $src2}",
    641704                      [(set GR64:$dst, (sube GR64:$src1, i64immSExt32:$src2))]>;
    642 } // isTwoAddress
    643 
    644 def SBB64i32 : RI<0x1D, RawFrm, (outs), (ins i32imm:$src),
    645                   "sbb{q}\t{$src, %rax|%rax, $src}", []>;
     705} // Constraints = "$src1 = $dst"
     706
     707def SBB64i32 : RIi32<0x1D, RawFrm, (outs), (ins i64i32imm:$src),
     708                     "sbb{q}\t{$src, %rax|%rax, $src}", []>;
    646709
    647710def SBB64mr  : RI<0x19, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src2),
     
    674737
    675738let Defs = [EFLAGS] in {
    676 let isTwoAddress = 1 in {
     739let Constraints = "$src1 = $dst" in {
    677740let isCommutable = 1 in
    678741// Register-Register Signed Integer Multiplication
     
    680743                                   (ins GR64:$src1, GR64:$src2),
    681744                  "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;
    684747
    685748// Register-Memory Signed Integer Multiplication
     
    687750                                   (ins GR64:$src1, i64mem:$src2),
    688751                  "imul{q}\t{$src2, $dst|$dst, $src2}",
    689                   [(set GR64:$dst, (mul GR64:$src1, (load addr:$src2))),
    690                    (implicit EFLAGS)]>, TB;
    691 } // isTwoAddress
     752                  [(set GR64:$dst, EFLAGS,
     753                        (X86smul_flag GR64:$src1, (load addr:$src2)))]>, TB;
     754} // Constraints = "$src1 = $dst"
    692755
    693756// Suprisingly enough, these are not two address instructions!
     
    697760                      (outs GR64:$dst), (ins GR64:$src1, i64i8imm:$src2),
    698761                      "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))]>;
    701764def IMUL64rri32 : RIi32<0x69, MRMSrcReg,                    // GR64 = GR64*I32
    702765                        (outs GR64:$dst), (ins GR64:$src1, i64i32imm:$src2),
    703766                        "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))]>;
    706769
    707770// Memory-Integer Signed Integer Multiplication
     
    709772                      (outs GR64:$dst), (ins i64mem:$src1, i64i8imm: $src2),
    710773                      "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))]>;
    714777def IMUL64rmi32 : RIi32<0x69, MRMSrcMem,                   // GR64 = [mem64]*I32
    715778                        (outs GR64:$dst), (ins i64mem:$src1, i64i32imm:$src2),
    716779                        "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))]>;
    720783} // Defs = [EFLAGS]
    721784
     
    741804// Unary instructions
    742805let Defs = [EFLAGS], CodeSize = 2 in {
    743 let isTwoAddress = 1 in
     806let Constraints = "$src = $dst" in
    744807def NEG64r : RI<0xF7, MRM3r, (outs GR64:$dst), (ins GR64:$src), "neg{q}\t$dst",
    745808                [(set GR64:$dst, (ineg GR64:$src)),
     
    749812                 (implicit EFLAGS)]>;
    750813
    751 let isTwoAddress = 1, isConvertibleToThreeAddress = 1 in
     814let Constraints = "$src = $dst", isConvertibleToThreeAddress = 1 in
    752815def 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))]>;
    755817def INC64m : RI<0xFF, MRM0m, (outs), (ins i64mem:$dst), "inc{q}\t$dst",
    756818                [(store (add (loadi64 addr:$dst), 1), addr:$dst),
    757819                 (implicit EFLAGS)]>;
    758820
    759 let isTwoAddress = 1, isConvertibleToThreeAddress = 1 in
     821let Constraints = "$src = $dst", isConvertibleToThreeAddress = 1 in
    760822def 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))]>;
    763824def DEC64m : RI<0xFF, MRM1m, (outs), (ins i64mem:$dst), "dec{q}\t$dst",
    764825                [(store (add (loadi64 addr:$dst), -1), addr:$dst),
     
    766827
    767828// In 64-bit mode, single byte INC and DEC cannot be encoded.
    768 let isTwoAddress = 1, isConvertibleToThreeAddress = 1 in {
     829let Constraints = "$src = $dst", isConvertibleToThreeAddress = 1 in {
    769830// Can transform into LEA.
    770831def INC64_16r : I<0xFF, MRM0r, (outs GR16:$dst), (ins GR16:$src),
    771832                  "inc{w}\t$dst",
    772                   [(set GR16:$dst, (add GR16:$src, 1)),
    773                    (implicit EFLAGS)]>,
     833                  [(set GR16:$dst, EFLAGS, (X86inc_flag GR16:$src))]>,
    774834                OpSize, Requires<[In64BitMode]>;
    775835def INC64_32r : I<0xFF, MRM0r, (outs GR32:$dst), (ins GR32:$src),
    776836                  "inc{l}\t$dst",
    777                   [(set GR32:$dst, (add GR32:$src, 1)),
    778                    (implicit EFLAGS)]>,
     837                  [(set GR32:$dst, EFLAGS, (X86inc_flag GR32:$src))]>,
    779838                Requires<[In64BitMode]>;
    780839def DEC64_16r : I<0xFF, MRM1r, (outs GR16:$dst), (ins GR16:$src),
    781840                  "dec{w}\t$dst",
    782                   [(set GR16:$dst, (add GR16:$src, -1)),
    783                    (implicit EFLAGS)]>,
     841                  [(set GR16:$dst, EFLAGS, (X86dec_flag GR16:$src))]>,
    784842                OpSize, Requires<[In64BitMode]>;
    785843def DEC64_32r : I<0xFF, MRM1r, (outs GR32:$dst), (ins GR32:$src),
    786844                  "dec{l}\t$dst",
    787                   [(set GR32:$dst, (add GR32:$src, -1)),
    788                    (implicit EFLAGS)]>,
     845                  [(set GR32:$dst, EFLAGS, (X86dec_flag GR32:$src))]>,
    789846                Requires<[In64BitMode]>;
    790 } // isConvertibleToThreeAddress
     847} // Constraints = "$src = $dst", isConvertibleToThreeAddress
    791848
    792849// These are duplicates of their 32-bit counterparts. Only needed so X86 knows
    793850// 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 }
     851def 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]>;
     855def 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]>;
     859def 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]>;
     863def 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]>;
    812867} // Defs = [EFLAGS], CodeSize
    813868
     
    815870let Defs = [EFLAGS] in {
    816871// Shift instructions
    817 let isTwoAddress = 1 in {
     872let Constraints = "$src1 = $dst" in {
    818873let Uses = [CL] in
    819 def SHL64rCL : RI<0xD3, MRM4r, (outs GR64:$dst), (ins GR64:$src),
     874def SHL64rCL : RI<0xD3, MRM4r, (outs GR64:$dst), (ins GR64:$src1),
    820875                  "shl{q}\t{%cl, $dst|$dst, %CL}",
    821                   [(set GR64:$dst, (shl GR64:$src, CL))]>;
     876                  [(set GR64:$dst, (shl GR64:$src1, CL))]>;
    822877let isConvertibleToThreeAddress = 1 in   // Can transform into LEA.
    823878def SHL64ri  : RIi8<0xC1, MRM4r, (outs GR64:$dst),
     
    829884def SHL64r1  : RI<0xD1, MRM4r, (outs GR64:$dst), (ins GR64:$src1),
    830885                 "shl{q}\t$dst", []>;
    831 } // isTwoAddress
     886} // Constraints = "$src1 = $dst"
    832887
    833888let Uses = [CL] in
     
    842897                 [(store (shl (loadi64 addr:$dst), (i8 1)), addr:$dst)]>;
    843898
    844 let isTwoAddress = 1 in {
     899let Constraints = "$src1 = $dst" in {
    845900let Uses = [CL] in
    846 def SHR64rCL : RI<0xD3, MRM5r, (outs GR64:$dst), (ins GR64:$src),
     901def SHR64rCL : RI<0xD3, MRM5r, (outs GR64:$dst), (ins GR64:$src1),
    847902                  "shr{q}\t{%cl, $dst|$dst, %CL}",
    848                   [(set GR64:$dst, (srl GR64:$src, CL))]>;
     903                  [(set GR64:$dst, (srl GR64:$src1, CL))]>;
    849904def SHR64ri : RIi8<0xC1, MRM5r, (outs GR64:$dst), (ins GR64:$src1, i8imm:$src2),
    850905                  "shr{q}\t{$src2, $dst|$dst, $src2}",
     
    853908                 "shr{q}\t$dst",
    854909                 [(set GR64:$dst, (srl GR64:$src1, (i8 1)))]>;
    855 } // isTwoAddress
     910} // Constraints = "$src1 = $dst"
    856911
    857912let Uses = [CL] in
     
    866921                 [(store (srl (loadi64 addr:$dst), (i8 1)), addr:$dst)]>;
    867922
    868 let isTwoAddress = 1 in {
     923let Constraints = "$src1 = $dst" in {
    869924let Uses = [CL] in
    870 def SAR64rCL : RI<0xD3, MRM7r, (outs GR64:$dst), (ins GR64:$src),
     925def SAR64rCL : RI<0xD3, MRM7r, (outs GR64:$dst), (ins GR64:$src1),
    871926                 "sar{q}\t{%cl, $dst|$dst, %CL}",
    872                  [(set GR64:$dst, (sra GR64:$src, CL))]>;
     927                 [(set GR64:$dst, (sra GR64:$src1, CL))]>;
    873928def SAR64ri  : RIi8<0xC1, MRM7r, (outs GR64:$dst),
    874929                    (ins GR64:$src1, i8imm:$src2),
     
    878933                 "sar{q}\t$dst",
    879934                 [(set GR64:$dst, (sra GR64:$src1, (i8 1)))]>;
    880 } // isTwoAddress
     935} // Constraints = "$src = $dst"
    881936
    882937let Uses = [CL] in
     
    893948// Rotate instructions
    894949
    895 let isTwoAddress = 1 in {
     950let Constraints = "$src = $dst" in {
    896951def RCL64r1 : RI<0xD1, MRM2r, (outs GR64:$dst), (ins GR64:$src),
    897952                 "rcl{q}\t{1, $dst|$dst, 1}", []>;
     
    910965                  "rcr{q}\t{%cl, $dst|$dst, CL}", []>;
    911966}
    912 }
    913 
    914 let isTwoAddress = 0 in {
     967} // Constraints = "$src = $dst"
     968
    915969def RCL64m1 : RI<0xD1, MRM2m, (outs), (ins i64mem:$dst),
    916970                 "rcl{q}\t{1, $dst|$dst, 1}", []>;
     
    928982                  "rcr{q}\t{%cl, $dst|$dst, CL}", []>;
    929983}
    930 }
    931 
    932 let isTwoAddress = 1 in {
     984
     985let Constraints = "$src1 = $dst" in {
    933986let Uses = [CL] in
    934 def ROL64rCL : RI<0xD3, MRM0r, (outs GR64:$dst), (ins GR64:$src),
     987def ROL64rCL : RI<0xD3, MRM0r, (outs GR64:$dst), (ins GR64:$src1),
    935988                  "rol{q}\t{%cl, $dst|$dst, %CL}",
    936                   [(set GR64:$dst, (rotl GR64:$src, CL))]>;
     989                  [(set GR64:$dst, (rotl GR64:$src1, CL))]>;
    937990def ROL64ri  : RIi8<0xC1, MRM0r, (outs GR64:$dst),
    938991                    (ins GR64:$src1, i8imm:$src2),
     
    942995                  "rol{q}\t$dst",
    943996                  [(set GR64:$dst, (rotl GR64:$src1, (i8 1)))]>;
    944 } // isTwoAddress
     997} // Constraints = "$src1 = $dst"
    945998
    946999let Uses = [CL] in
     
    9551008               [(store (rotl (loadi64 addr:$dst), (i8 1)), addr:$dst)]>;
    9561009
    957 let isTwoAddress = 1 in {
     1010let Constraints = "$src1 = $dst" in {
    9581011let Uses = [CL] in
    959 def ROR64rCL : RI<0xD3, MRM1r, (outs GR64:$dst), (ins GR64:$src),
     1012def ROR64rCL : RI<0xD3, MRM1r, (outs GR64:$dst), (ins GR64:$src1),
    9601013                  "ror{q}\t{%cl, $dst|$dst, %CL}",
    961                   [(set GR64:$dst, (rotr GR64:$src, CL))]>;
     1014                  [(set GR64:$dst, (rotr GR64:$src1, CL))]>;
    9621015def ROR64ri  : RIi8<0xC1, MRM1r, (outs GR64:$dst),
    9631016                    (ins GR64:$src1, i8imm:$src2),
     
    9671020                  "ror{q}\t$dst",
    9681021                  [(set GR64:$dst, (rotr GR64:$src1, (i8 1)))]>;
    969 } // isTwoAddress
     1022} // Constraints = "$src1 = $dst"
    9701023
    9711024let Uses = [CL] in
     
    9811034
    9821035// Double shift instructions (generalizations of rotate)
    983 let isTwoAddress = 1 in {
     1036let Constraints = "$src1 = $dst" in {
    9841037let Uses = [CL] in {
    9851038def SHLD64rrCL : RI<0xA5, MRMDestReg, (outs GR64:$dst),
     
    10111064                 TB;
    10121065} // isCommutable
    1013 } // isTwoAddress
     1066} // Constraints = "$src1 = $dst"
    10141067
    10151068let Uses = [CL] in {
     
    10411094//
    10421095
    1043 let isTwoAddress = 1 , AddedComplexity = 15 in
     1096let Constraints = "$src = $dst" , AddedComplexity = 15 in
    10441097def NOT64r : RI<0xF7, MRM2r, (outs GR64:$dst), (ins GR64:$src), "not{q}\t$dst",
    10451098                [(set GR64:$dst, (not GR64:$src))]>;
     
    10481101
    10491102let Defs = [EFLAGS] in {
    1050 def AND64i32 : RI<0x25, RawFrm, (outs), (ins i32imm:$src),
    1051                   "and{q}\t{$src, %rax|%rax, $src}", []>;
    1052 
    1053 let isTwoAddress = 1 in {
     1103def AND64i32 : RIi32<0x25, RawFrm, (outs), (ins i64i32imm:$src),
     1104                     "and{q}\t{$src, %rax|%rax, $src}", []>;
     1105
     1106let Constraints = "$src1 = $dst" in {
    10541107let isCommutable = 1 in
    10551108def AND64rr  : RI<0x21, MRMDestReg,
    10561109                  (outs GR64:$dst), (ins GR64:$src1, GR64:$src2),
    10571110                  "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))]>;
     1113let isCodeGenOnly = 1 in {
    10601114def AND64rr_REV : RI<0x23, MRMSrcReg, (outs GR64:$dst),
    10611115                     (ins GR64:$src1, GR64:$src2),
    10621116                     "and{q}\t{$src2, $dst|$dst, $src2}", []>;
     1117}
    10631118def AND64rm  : RI<0x23, MRMSrcMem,
    10641119                  (outs GR64:$dst), (ins GR64:$src1, i64mem:$src2),
    10651120                  "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)))]>;
    10681123def AND64ri8 : RIi8<0x83, MRM4r,
    10691124                    (outs GR64:$dst), (ins GR64:$src1, i64i8imm:$src2),
    10701125                    "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))]>;
    10731128def AND64ri32  : RIi32<0x81, MRM4r,
    10741129                       (outs GR64:$dst), (ins GR64:$src1, i64i32imm:$src2),
    10751130                       "and{q}\t{$src2, $dst|$dst, $src2}",
    1076                        [(set GR64:$dst, (and GR64:$src1, i64immSExt32:$src2)),
    1077                         (implicit EFLAGS)]>;
    1078 } // isTwoAddress
     1131                       [(set GR64:$dst, EFLAGS,
     1132                             (X86and_flag GR64:$src1, i64immSExt32:$src2))]>;
     1133} // Constraints = "$src1 = $dst"
    10791134
    10801135def AND64mr  : RI<0x21, MRMDestMem,
     
    10941149              (implicit EFLAGS)]>;
    10951150
    1096 let isTwoAddress = 1 in {
     1151let Constraints = "$src1 = $dst" in {
    10971152let isCommutable = 1 in
    10981153def OR64rr   : RI<0x09, MRMDestReg, (outs GR64:$dst),
    10991154                  (ins GR64:$src1, GR64:$src2),
    11001155                  "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))]>;
     1158let isCodeGenOnly = 1 in {
    11031159def OR64rr_REV : RI<0x0B, MRMSrcReg, (outs GR64:$dst),
    11041160                    (ins GR64:$src1, GR64:$src2),
    11051161                    "or{q}\t{$src2, $dst|$dst, $src2}", []>;
     1162}
    11061163def OR64rm   : RI<0x0B, MRMSrcMem , (outs GR64:$dst),
    11071164                  (ins GR64:$src1, i64mem:$src2),
    11081165                  "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)))]>;
    11111168def OR64ri8  : RIi8<0x83, MRM1r, (outs GR64:$dst),
    11121169                    (ins GR64:$src1, i64i8imm:$src2),
    11131170                    "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))]>;
    11161173def OR64ri32 : RIi32<0x81, MRM1r, (outs GR64:$dst),
    11171174                     (ins GR64:$src1, i64i32imm:$src2),
    11181175                     "or{q}\t{$src2, $dst|$dst, $src2}",
    1119                   [(set GR64:$dst, (or GR64:$src1, i64immSExt32:$src2)),
    1120                     (implicit EFLAGS)]>;
    1121 } // isTwoAddress
     1176                  [(set GR64:$dst, EFLAGS,
     1177                        (X86or_flag GR64:$src1, i64immSExt32:$src2))]>;
     1178} // Constraints = "$src1 = $dst"
    11221179
    11231180def OR64mr : RI<0x09, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src),
     
    11341191               (implicit EFLAGS)]>;
    11351192
    1136 def OR64i32 : RIi32<0x0D, RawFrm, (outs), (ins i32imm:$src),
     1193def OR64i32 : RIi32<0x0D, RawFrm, (outs), (ins i64i32imm:$src),
    11371194                    "or{q}\t{$src, %rax|%rax, $src}", []>;
    11381195
    1139 let isTwoAddress = 1 in {
     1196let Constraints = "$src1 = $dst" in {
    11401197let isCommutable = 1 in
    11411198def XOR64rr  : RI<0x31, MRMDestReg,  (outs GR64:$dst),
    11421199                  (ins GR64:$src1, GR64:$src2),
    11431200                  "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))]>;
     1203let isCodeGenOnly = 1 in {
    11461204def XOR64rr_REV : RI<0x33, MRMSrcReg, (outs GR64:$dst),
    11471205                     (ins GR64:$src1, GR64:$src2),
    11481206                    "xor{q}\t{$src2, $dst|$dst, $src2}", []>;
     1207}
    11491208def XOR64rm  : RI<0x33, MRMSrcMem, (outs GR64:$dst),
    11501209                  (ins GR64:$src1, i64mem:$src2),
    11511210                  "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)))]>;
    11541213def XOR64ri8 : RIi8<0x83, MRM6r,  (outs GR64:$dst),
    11551214                    (ins GR64:$src1, i64i8imm:$src2),
    11561215                    "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))]>;
    11591218def XOR64ri32 : RIi32<0x81, MRM6r,
    11601219                      (outs GR64:$dst), (ins GR64:$src1, i64i32imm:$src2),
    11611220                      "xor{q}\t{$src2, $dst|$dst, $src2}",
    1162                       [(set GR64:$dst, (xor GR64:$src1, i64immSExt32:$src2)),
    1163                        (implicit EFLAGS)]>;
    1164 } // isTwoAddress
     1221                      [(set GR64:$dst, EFLAGS,
     1222                            (X86xor_flag GR64:$src1, i64immSExt32:$src2))]>;
     1223} // Constraints = "$src1 = $dst"
    11651224
    11661225def XOR64mr  : RI<0x31, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src),
     
    11771236              (implicit EFLAGS)]>;
    11781237             
    1179 def XOR64i32 : RIi32<0x35, RawFrm, (outs), (ins i32imm:$src),
     1238def XOR64i32 : RIi32<0x35, RawFrm, (outs), (ins i64i32imm:$src),
    11801239                     "xor{q}\t{$src, %rax|%rax, $src}", []>;
    11811240
     
    11881247// Integer comparison
    11891248let Defs = [EFLAGS] in {
    1190 def TEST64i32 : RI<0xa9, RawFrm, (outs), (ins i32imm:$src),
    1191                    "test{q}\t{$src, %rax|%rax, $src}", []>;
     1249def TEST64i32 : RIi32<0xa9, RawFrm, (outs), (ins i64i32imm:$src),
     1250                      "test{q}\t{$src, %rax|%rax, $src}", []>;
    11921251let isCommutable = 1 in
    1193 def TEST64rr : RI<0x85, MRMDestReg, (outs), (ins GR64:$src1, GR64:$src2),
     1252def TEST64rr : RI<0x85, MRMSrcReg, (outs), (ins GR64:$src1, GR64:$src2),
    11941253                  "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))]>;
    11971255def TEST64rm : RI<0x85, MRMSrcMem, (outs), (ins GR64:$src1, i64mem:$src2),
    11981256                  "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))]>;
    12011259def TEST64ri32 : RIi32<0xF7, MRM0r, (outs),
    12021260                                        (ins GR64:$src1, i64i32imm:$src2),
    12031261                       "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))]>;
    12061264def TEST64mi32 : RIi32<0xF7, MRM0m, (outs),
    12071265                                        (ins i64mem:$src1, i64i32imm:$src2),
    12081266                       "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), (ins i32imm:$src),
    1214                   "cmp{q}\t{$src, %rax|%rax, $src}", []>;
     1267                [(set EFLAGS, (X86cmp (and (loadi64 addr:$src1),
     1268                                           i64immSExt32:$src2), 0))]>;
     1269
     1270
     1271def CMP64i32 : RIi32<0x3D, RawFrm, (outs), (ins i64i32imm:$src),
     1272                     "cmp{q}\t{$src, %rax|%rax, $src}", []>;
    12151273def CMP64rr : RI<0x39, MRMDestReg, (outs), (ins GR64:$src1, GR64:$src2),
    12161274                 "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.
     1279let 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
    12211284def CMP64mr : RI<0x39, MRMDestMem, (outs), (ins i64mem:$src1, GR64:$src2),
    12221285                 "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))]>;
    12251287def CMP64rm : RI<0x3B, MRMSrcMem, (outs), (ins GR64:$src1, i64mem:$src2),
    12261288                 "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)))]>;
    12291290def CMP64ri8 : RIi8<0x83, MRM7r, (outs), (ins GR64:$src1, i64i8imm:$src2),
    12301291                    "cmp{q}\t{$src2, $src1|$src1, $src2}",
    1231                     [(X86cmp GR64:$src1, i64immSExt8:$src2),
    1232                      (implicit EFLAGS)]>;
     1292                    [(set EFLAGS, (X86cmp GR64:$src1, i64immSExt8:$src2))]>;
    12331293def CMP64ri32 : RIi32<0x81, MRM7r, (outs), (ins GR64:$src1, i64i32imm:$src2),
    12341294                      "cmp{q}\t{$src2, $src1|$src1, $src2}",
    1235                       [(X86cmp GR64:$src1, i64immSExt32:$src2),
    1236                        (implicit EFLAGS)]>;
     1295                      [(set EFLAGS, (X86cmp GR64:$src1, i64immSExt32:$src2))]>;
    12371296def CMP64mi8 : RIi8<0x83, MRM7m, (outs), (ins i64mem:$src1, i64i8imm:$src2),
    12381297                    "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))]>;
    12411300def CMP64mi32 : RIi32<0x81, MRM7m, (outs),
    12421301                                       (ins i64mem:$src1, i64i32imm:$src2),
    12431302                      "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))]>;
    12461305} // Defs = [EFLAGS]
    12471306
     
    12511310def BT64rr : RI<0xA3, MRMDestReg, (outs), (ins GR64:$src1, GR64:$src2),
    12521311               "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;
    12551313
    12561314// Unlike with the register+register form, the memory+register form of the
     
    12641322                >, TB;
    12651323
    1266 def BT64ri8 : Ii8<0xBA, MRM4r, (outs), (ins GR64:$src1, i64i8imm:$src2),
     1324def BT64ri8 : RIi8<0xBA, MRM4r, (outs), (ins GR64:$src1, i64i8imm:$src2),
    12671325                "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;
    12701327// Note that these instructions don't need FastBTMem because that
    12711328// only applies when the other operand is in a register. When it's
    12721329// an immediate, bt is still fast.
    1273 def BT64mi8 : Ii8<0xBA, MRM4m, (outs), (ins i64mem:$src1, i64i8imm:$src2),
     1330def BT64mi8 : RIi8<0xBA, MRM4m, (outs), (ins i64mem:$src1, i64i8imm:$src2),
    12741331                "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;
    12771334
    12781335def BTC64rr : RI<0xBB, MRMDestReg, (outs), (ins GR64:$src1, GR64:$src2),
     
    13051362
    13061363// Conditional moves
    1307 let Uses = [EFLAGS], isTwoAddress = 1 in {
     1364let Uses = [EFLAGS], Constraints = "$src1 = $dst" in {
    13081365let isCommutable = 1 in {
    13091366def CMOVB64rr : RI<0x42, MRMSrcReg,       // if <u, GR64 = GR64
     
    14691526                    [(set GR64:$dst, (X86cmov GR64:$src1, (loadi64 addr:$src2),
    14701527                                     X86_COND_NO, EFLAGS))]>, TB;
    1471 } // isTwoAddress
     1528} // Constraints = "$src1 = $dst"
    14721529
    14731530// Use sbb to materialize carry flag into a GPR.
     
    14851542
    14861543//===----------------------------------------------------------------------===//
    1487 //  Conversion Instructions...
    1488 //
    1489 
    1490 // f64 -> signed i64
    1491 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_cvtsd2si64
    1503                                              (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_cvttsd2si64
    1519                                (load addr:$src)))]>;
    1520 
    1521 // Signed i64 -> f64
    1522 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 } // isTwoAddress
    1543 
    1544 // Signed i64 -> f32
    1545 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 i64
    1569 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_cvtss2si64
    1580                                              (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                              
    15971544// Descriptor-table support instructions
    15981545
     
    16301577//===----------------------------------------------------------------------===//
    16311578
     1579// ELF TLS Support
    16321580// All calls clobber the non-callee saved registers. RSP is marked as
    16331581// a use to prevent stack-pointer assignments that appear immediately
     
    16391587            XMM8, XMM9, XMM10, XMM11, XMM12, XMM13, XMM14, XMM15, EFLAGS],
    16401588    Uses = [RSP] in
    1641 def TLS_addr64 : I<0, Pseudo, (outs), (ins lea64mem:$sym),
     1589def TLS_addr64 : I<0, Pseudo, (outs), (ins i64mem:$sym),
    16421590                   ".byte\t0x66; "
    16431591                   "leaq\t$sym(%rip), %rdi; "
     
    16481596                  Requires<[In64BitMode]>;
    16491597
     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.
     1601let Defs = [RAX],
     1602    Uses = [RDI],
     1603    usesCustomInserter = 1 in
     1604def TLSCall_64 : I<0, Pseudo, (outs), (ins i64mem:$sym),
     1605                  "# TLSCall_64",
     1606                  [(X86TLSCall addr:$sym)]>,
     1607                  Requires<[In64BitMode]>;
     1608
    16501609let AddedComplexity = 5, isCodeGenOnly = 1 in
    16511610def MOV64GSrm : RI<0x8B, MRMSrcMem, (outs GR64:$dst), (ins i64mem:$src),
     
    16611620// Atomic Instructions
    16621621//===----------------------------------------------------------------------===//
     1622
     1623// TODO: Get this to fold the constant into the instruction.           
     1624let hasSideEffects = 1, Defs = [ESP] in
     1625def 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;
    16631630
    16641631let Defs = [RAX, EFLAGS], Uses = [RAX] in {
     
    16881655def XADD64rr  : RI<0xC1, MRMDestReg, (outs GR64:$dst), (ins GR64:$src),
    16891656                   "xadd{q}\t{$src, $dst|$dst, $src}", []>, TB;
     1657let mayLoad = 1, mayStore = 1 in
    16901658def XADD64rm  : RI<0xC1, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src),
    16911659                   "xadd{q}\t{$src, $dst|$dst, $src}", []>, TB;
     
    16931661def CMPXCHG64rr  : RI<0xB1, MRMDestReg, (outs GR64:$dst), (ins GR64:$src),
    16941662                      "cmpxchg{q}\t{$src, $dst|$dst, $src}", []>, TB;
     1663let mayLoad = 1, mayStore = 1 in
    16951664def CMPXCHG64rm  : RI<0xB1, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src),
    16961665                      "cmpxchg{q}\t{$src, $dst|$dst, $src}", []>, TB;
     
    17041673
    17051674// Optimized codegen when the non-memory output is not used.
    1706 let Defs = [EFLAGS] in {
     1675let Defs = [EFLAGS], mayLoad = 1, mayStore = 1 in {
    17071676// FIXME: Use normal add / sub instructions and add lock prefix dynamically.
    1708 def LOCK_ADD64mr : RI<0x03, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src2),
     1677def LOCK_ADD64mr : RI<0x01, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src2),
    17091678                      "lock\n\t"
    17101679                      "add{q}\t{$src2, $dst|$dst, $src2}", []>, LOCK;
     
    18851854
    18861855// tailcall stuff
    1887 def : Pat<(X86tcret GR64:$dst, imm:$off),
    1888           (TCRETURNri64 GR64:$dst, imm:$off)>;
     1856def : Pat<(X86tcret GR64_TC:$dst, imm:$off),
     1857          (TCRETURNri64 GR64_TC:$dst, imm:$off)>,
     1858          Requires<[In64BitMode]>;
     1859
     1860def : Pat<(X86tcret (load addr:$dst), imm:$off),
     1861          (TCRETURNmi64 addr:$dst, imm:$off)>,
     1862          Requires<[In64BitMode]>;
    18891863
    18901864def : Pat<(X86tcret (i64 tglobaladdr:$dst), imm:$off),
    1891           (TCRETURNdi64 tglobaladdr:$dst, imm:$off)>;
     1865          (TCRETURNdi64 tglobaladdr:$dst, imm:$off)>,
     1866          Requires<[In64BitMode]>;
    18921867
    18931868def : 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
     1874def : Pat<(i64 (X86Wrapper tglobaltlsaddr :$dst)),
     1875          (MOV64ri tglobaltlsaddr :$dst)>;
     1876// This corresponds to add $foo@tpoff, %rax
     1877def : Pat<(add GR64:$src1, (X86Wrapper tglobaltlsaddr :$dst)),
     1878          (ADD64ri32 GR64:$src1, tglobaltlsaddr :$dst)>;
     1879// This corresponds to mov foo@tpoff(%rbx), %eax
     1880def : Pat<(load (i64 (X86Wrapper tglobaltlsaddr :$dst))),
     1881          (MOV64rm tglobaltlsaddr :$dst)>;
    18951882
    18961883// Comparisons.
    18971884
    18981885// TEST R,R is smaller than CMP R,0
    1899 def : Pat<(parallel (X86cmp GR64:$src1, 0), (implicit EFLAGS)),
     1886def : Pat<(X86cmp GR64:$src1, 0),
    19001887          (TEST64rr GR64:$src1, GR64:$src1)>;
    19011888
     
    19491936def : Pat<(extloadi64i32 addr:$src),
    19501937          (SUBREG_TO_REG (i64 0), (MOV32rm addr:$src),
    1951                          x86_subreg_32bit)>;
     1938                         sub_32bit)>;
    19521939
    19531940// anyext. Define these to do an explicit zero-extend to
     
    19561943def : Pat<(i64 (anyext GR16:$src)), (MOVZX64rr16 GR16 :$src)>;
    19571944def : 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)>;
    19591946
    19601947//===----------------------------------------------------------------------===//
     
    19831970            (i64 0),
    19841971            (AND32ri
    1985               (EXTRACT_SUBREG GR64:$src, x86_subreg_32bit),
     1972              (EXTRACT_SUBREG GR64:$src, sub_32bit),
    19861973              (i32 (GetLo32XForm imm:$imm))),
    1987             x86_subreg_32bit)>;
     1974            sub_32bit)>;
    19881975
    19891976// r & (2^32-1) ==> movz
    19901977def : Pat<(and GR64:$src, 0x00000000FFFFFFFF),
    1991           (MOVZX64rr32 (EXTRACT_SUBREG GR64:$src, x86_subreg_32bit))>;
     1978          (MOVZX64rr32 (EXTRACT_SUBREG GR64:$src, sub_32bit))>;
    19921979// r & (2^16-1) ==> movz
    19931980def : Pat<(and GR64:$src, 0xffff),
    1994           (MOVZX64rr16 (i16 (EXTRACT_SUBREG GR64:$src, x86_subreg_16bit)))>;
     1981          (MOVZX64rr16 (i16 (EXTRACT_SUBREG GR64:$src, sub_16bit)))>;
    19951982// r & (2^8-1) ==> movz
    19961983def : Pat<(and GR64:$src, 0xff),
    1997           (MOVZX64rr8 (i8 (EXTRACT_SUBREG GR64:$src, x86_subreg_8bit)))>;
     1984          (MOVZX64rr8 (i8 (EXTRACT_SUBREG GR64:$src, sub_8bit)))>;
    19981985// r & (2^8-1) ==> movz
    19991986def : Pat<(and GR32:$src1, 0xff),
    2000            (MOVZX32rr8 (EXTRACT_SUBREG GR32:$src1, x86_subreg_8bit))>,
     1987           (MOVZX32rr8 (EXTRACT_SUBREG GR32:$src1, sub_8bit))>,
    20011988      Requires<[In64BitMode]>;
    20021989// r & (2^8-1) ==> movz
    20031990def : Pat<(and GR16:$src1, 0xff),
    2004            (MOVZX16rr8 (i8 (EXTRACT_SUBREG GR16:$src1, x86_subreg_8bit)))>,
     1991           (MOVZX16rr8 (i8 (EXTRACT_SUBREG GR16:$src1, sub_8bit)))>,
    20051992      Requires<[In64BitMode]>;
    20061993
    20071994// sext_inreg patterns
    20081995def : Pat<(sext_inreg GR64:$src, i32),
    2009           (MOVSX64rr32 (EXTRACT_SUBREG GR64:$src, x86_subreg_32bit))>;
     1996          (MOVSX64rr32 (EXTRACT_SUBREG GR64:$src, sub_32bit))>;
    20101997def : Pat<(sext_inreg GR64:$src, i16),
    2011           (MOVSX64rr16 (EXTRACT_SUBREG GR64:$src, x86_subreg_16bit))>;
     1998          (MOVSX64rr16 (EXTRACT_SUBREG GR64:$src, sub_16bit))>;
    20121999def : Pat<(sext_inreg GR64:$src, i8),
    2013           (MOVSX64rr8 (EXTRACT_SUBREG GR64:$src, x86_subreg_8bit))>;
     2000          (MOVSX64rr8 (EXTRACT_SUBREG GR64:$src, sub_8bit))>;
    20142001def : Pat<(sext_inreg GR32:$src, i8),
    2015           (MOVSX32rr8 (EXTRACT_SUBREG GR32:$src, x86_subreg_8bit))>,
     2002          (MOVSX32rr8 (EXTRACT_SUBREG GR32:$src, sub_8bit))>,
    20162003      Requires<[In64BitMode]>;
    20172004def : 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)))>,
    20192006      Requires<[In64BitMode]>;
    20202007
    20212008// trunc patterns
    20222009def : Pat<(i32 (trunc GR64:$src)),
    2023           (EXTRACT_SUBREG GR64:$src, x86_subreg_32bit)>;
     2010          (EXTRACT_SUBREG GR64:$src, sub_32bit)>;
    20242011def : Pat<(i16 (trunc GR64:$src)),
    2025           (EXTRACT_SUBREG GR64:$src, x86_subreg_16bit)>;
     2012          (EXTRACT_SUBREG GR64:$src, sub_16bit)>;
    20262013def : Pat<(i8 (trunc GR64:$src)),
    2027           (EXTRACT_SUBREG GR64:$src, x86_subreg_8bit)>;
     2014          (EXTRACT_SUBREG GR64:$src, sub_8bit)>;
    20282015def : Pat<(i8 (trunc GR32:$src)),
    2029           (EXTRACT_SUBREG GR32:$src, x86_subreg_8bit)>,
     2016          (EXTRACT_SUBREG GR32:$src, sub_8bit)>,
    20302017      Requires<[In64BitMode]>;
    20312018def : Pat<(i8 (trunc GR16:$src)),
    2032           (EXTRACT_SUBREG GR16:$src, x86_subreg_8bit)>,
     2019          (EXTRACT_SUBREG GR16:$src, sub_8bit)>,
    20332020      Requires<[In64BitMode]>;
    20342021
     
    20462033            (MOVZX32_NOREXrr8
    20472034              (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)>;
    20502037def : Pat<(and (srl_su GR32:$src, (i8 8)), (i32 255)),
    20512038          (MOVZX32_NOREXrr8
    20522039            (EXTRACT_SUBREG (i32 (COPY_TO_REGCLASS GR32:$src, GR32_ABCD)),
    2053                             x86_subreg_8bit_hi))>,
     2040                            sub_8bit_hi))>,
     2041      Requires<[In64BitMode]>;
     2042def : 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))>,
    20542046      Requires<[In64BitMode]>;
    20552047def : Pat<(srl GR16:$src, (i8 8)),
     
    20572049            (MOVZX32_NOREXrr8
    20582050              (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)>,
    20612053      Requires<[In64BitMode]>;
    20622054def : Pat<(i32 (zext (srl_su GR16:$src, (i8 8)))),
    20632055          (MOVZX32_NOREXrr8
    20642056            (EXTRACT_SUBREG (i16 (COPY_TO_REGCLASS GR16:$src, GR16_ABCD)),
    2065                             x86_subreg_8bit_hi))>,
     2057                            sub_8bit_hi))>,
    20662058      Requires<[In64BitMode]>;
    20672059def : Pat<(i32 (anyext (srl_su GR16:$src, (i8 8)))),
    20682060          (MOVZX32_NOREXrr8
    20692061            (EXTRACT_SUBREG (i16 (COPY_TO_REGCLASS GR16:$src, GR16_ABCD)),
    2070                             x86_subreg_8bit_hi))>,
     2062                            sub_8bit_hi))>,
    20712063      Requires<[In64BitMode]>;
    20722064def : Pat<(i64 (zext (srl_su GR16:$src, (i8 8)))),
     
    20752067            (MOVZX32_NOREXrr8
    20762068              (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)>;
    20792071def : Pat<(i64 (anyext (srl_su GR16:$src, (i8 8)))),
    20802072          (SUBREG_TO_REG
     
    20822074            (MOVZX32_NOREXrr8
    20832075              (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)>;
    20862078
    20872079// h-register extract and store.
     
    20902082            addr:$dst,
    20912083            (EXTRACT_SUBREG (i64 (COPY_TO_REGCLASS GR64:$src, GR64_ABCD)),
    2092                             x86_subreg_8bit_hi))>;
     2084                            sub_8bit_hi))>;
    20932085def : Pat<(store (i8 (trunc_su (srl_su GR32:$src, (i8 8)))), addr:$dst),
    20942086          (MOV8mr_NOREX
    20952087            addr:$dst,
    20962088            (EXTRACT_SUBREG (i32 (COPY_TO_REGCLASS GR32:$src, GR32_ABCD)),
    2097                             x86_subreg_8bit_hi))>,
     2089                            sub_8bit_hi))>,
    20982090      Requires<[In64BitMode]>;
    20992091def : Pat<(store (i8 (trunc_su (srl_su GR16:$src, (i8 8)))), addr:$dst),
     
    21012093            addr:$dst,
    21022094            (EXTRACT_SUBREG (i16 (COPY_TO_REGCLASS GR16:$src, GR16_ABCD)),
    2103                             x86_subreg_8bit_hi))>,
     2095                            sub_8bit_hi))>,
    21042096      Requires<[In64BitMode]>;
    21052097
     
    21232115          (SAR64mCL addr:$dst)>;
    21242116
    2125 // Double shift patterns
    2126 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 
    21402117// (or x1, x2) -> (add x1, x2) if two operands are known not to share bits.
    21412118let AddedComplexity = 5 in {  // Try this before the selecting to OR
    2142 def : Pat<(parallel (or_is_add GR64:$src1, i64immSExt8:$src2),
    2143                     (implicit EFLAGS)),
     2119def : Pat<(or_is_add GR64:$src1, i64immSExt8:$src2),
    21442120          (ADD64ri8 GR64:$src1, i64immSExt8:$src2)>;
    2145 def : Pat<(parallel (or_is_add GR64:$src1, i64immSExt32:$src2),
    2146                     (implicit EFLAGS)),
     2121def : Pat<(or_is_add GR64:$src1, i64immSExt32:$src2),
    21472122          (ADD64ri32 GR64:$src1, i64immSExt32:$src2)>;
    2148 def : Pat<(parallel (or_is_add GR64:$src1, GR64:$src2),
    2149                     (implicit EFLAGS)),
     2123def : Pat<(or_is_add GR64:$src1, GR64:$src2),
    21502124          (ADD64rr GR64:$src1, GR64:$src2)>;
    21512125} // AddedComplexity
     
    21742148//===----------------------------------------------------------------------===//
    21752149
    2176 // Register-Register Addition with EFLAGS result
    2177 def : Pat<(parallel (X86add_flag GR64:$src1, GR64:$src2),
    2178                     (implicit EFLAGS)),
     2150// addition
     2151def : Pat<(add GR64:$src1, GR64:$src2),
    21792152          (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)),
     2153def : Pat<(add GR64:$src1, i64immSExt8:$src2),
    21842154          (ADD64ri8 GR64:$src1, i64immSExt8:$src2)>;
    2185 def : Pat<(parallel (X86add_flag GR64:$src1, i64immSExt32:$src2),
    2186                     (implicit EFLAGS)),
     2155def : Pat<(add GR64:$src1, i64immSExt32:$src2),
    21872156          (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)),
     2157def : Pat<(add GR64:$src1, (loadi64 addr:$src2)),
    21922158          (ADD64rm GR64:$src1, addr:$src2)>;
    21932159
    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
     2161def : Pat<(sub GR64:$src1, GR64:$src2),
    22122162          (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)),
     2163def : Pat<(sub GR64:$src1, (loadi64 addr:$src2)),
    22172164          (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)),
     2165def : Pat<(sub GR64:$src1, i64immSExt8:$src2),
    22222166          (SUB64ri8 GR64:$src1, i64immSExt8:$src2)>;
    2223 def : Pat<(parallel (X86sub_flag GR64:$src1, i64immSExt32:$src2),
    2224                     (implicit EFLAGS)),
     2167def : Pat<(sub GR64:$src1, i64immSExt32:$src2),
    22252168          (SUB64ri32 GR64:$src1, i64immSExt32:$src2)>;
    22262169
    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
     2171def : Pat<(mul GR64:$src1, GR64:$src2),
    22482172          (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)),
     2173def : Pat<(mul GR64:$src1, (loadi64 addr:$src2)),
    22532174          (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)),
     2175def : Pat<(mul GR64:$src1, i64immSExt8:$src2),
    22582176          (IMUL64rri8 GR64:$src1, i64immSExt8:$src2)>;
    2259 def : Pat<(parallel (X86smul_flag GR64:$src1, i64immSExt32:$src2),
    2260                     (implicit EFLAGS)),
     2177def : Pat<(mul GR64:$src1, i64immSExt32:$src2),
    22612178          (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)),
     2179def : Pat<(mul (loadi64 addr:$src1), i64immSExt8:$src2),
    22662180          (IMUL64rmi8 addr:$src1, i64immSExt8:$src2)>;
    2267 def : Pat<(parallel (X86smul_flag (loadi64 addr:$src1), i64immSExt32:$src2),
    2268                     (implicit EFLAGS)),
     2181def : Pat<(mul (loadi64 addr:$src1), i64immSExt32:$src2),
    22692182          (IMUL64rmi32 addr:$src1, i64immSExt32:$src2)>;
    22702183
    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
     2185def : Pat<(add GR16:$src, 1),  (INC64_16r GR16:$src)>, Requires<[In64BitMode]>;
     2186def : Pat<(add GR16:$src, -1), (DEC64_16r GR16:$src)>, Requires<[In64BitMode]>;
     2187def : Pat<(add GR32:$src, 1),  (INC64_32r GR32:$src)>, Requires<[In64BitMode]>;
     2188def : Pat<(add GR32:$src, -1), (DEC64_32r GR32:$src)>, Requires<[In64BitMode]>;
     2189def : Pat<(add GR64:$src, 1),  (INC64r GR64:$src)>;
     2190def : Pat<(add GR64:$src, -1), (DEC64r GR64:$src)>;
     2191
     2192// or
     2193def : Pat<(or GR64:$src1, GR64:$src2),
    23082194          (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)),
     2195def : Pat<(or GR64:$src1, i64immSExt8:$src2),
    23132196          (OR64ri8 GR64:$src1, i64immSExt8:$src2)>;
    2314 def : Pat<(parallel (X86or_flag GR64:$src1, i64immSExt32:$src2),
    2315                     (implicit EFLAGS)),
     2197def : Pat<(or GR64:$src1, i64immSExt32:$src2),
    23162198          (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)),
     2199def : Pat<(or GR64:$src1, (loadi64 addr:$src2)),
    23212200          (OR64rm GR64:$src1, addr:$src2)>;
    23222201
    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
     2203def : Pat<(xor GR64:$src1, GR64:$src2),
    23402204          (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)),
     2205def : Pat<(xor GR64:$src1, i64immSExt8:$src2),
    23452206          (XOR64ri8 GR64:$src1, i64immSExt8:$src2)>;
    2346 def : Pat<(parallel (X86xor_flag GR64:$src1, i64immSExt32:$src2),
    2347                     (implicit EFLAGS)),
     2207def : Pat<(xor GR64:$src1, i64immSExt32:$src2),
    23482208          (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)),
     2209def : Pat<(xor GR64:$src1, (loadi64 addr:$src2)),
    23532210          (XOR64rm GR64:$src1, addr:$src2)>;
    23542211
    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
     2213def : Pat<(and GR64:$src1, GR64:$src2),
    23732214          (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)),
     2215def : Pat<(and GR64:$src1, i64immSExt8:$src2),
    23782216          (AND64ri8 GR64:$src1, i64immSExt8:$src2)>;
    2379 def : Pat<(parallel (X86and_flag GR64:$src1, i64immSExt32:$src2),
    2380                     (implicit EFLAGS)),
     2217def : Pat<(and GR64:$src1, i64immSExt32:$src2),
    23812218          (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)),
     2219def : Pat<(and GR64:$src1, (loadi64 addr:$src2)),
    23862220          (AND64rm GR64:$src1, addr:$src2)>;
    2387 
    2388 // Memory-Register Logical And with EFLAGS result
    2389 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)>;
    24022221
    24032222//===----------------------------------------------------------------------===//
     
    24192238                       "mov{d|q}\t{$src, $dst|$dst, $src}",
    24202239                       [(set FR64:$dst, (bitconvert GR64:$src))]>;
    2421 def MOV64toSDrm : RPDI<0x6E, MRMSrcMem, (outs FR64:$dst), (ins i64mem:$src),
     2240def MOV64toSDrm : S3SI<0x7E, MRMSrcMem, (outs FR64:$dst), (ins i64mem:$src),
    24222241                       "movq\t{$src, $dst|$dst, $src}",
    24232242                       [(set FR64:$dst, (bitconvert (loadi64 addr:$src)))]>;
     
    24302249                        [(store (i64 (bitconvert FR64:$src)), addr:$dst)]>;
    24312250
    2432 //===----------------------------------------------------------------------===//
    2433 // X86-64 SSE4.1 Instructions
    2434 //===----------------------------------------------------------------------===//
    2435 
    2436 /// SS41I_extract32 - SSE 4.1 extract 32 bits to int reg or memory destination
    2437 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.