Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(128)

Side by Side Diff: lib/Target/X86/X86ISelLowering.cpp

Issue 3661004: x86-64 va_arg (Closed) Base URL: http://llvm.org/svn/llvm-project/llvm/trunk/
Patch Set: long double doesn't work how I thought Created 10 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « lib/Target/X86/X86ISelLowering.h ('k') | lib/Target/X86/X86InstrCompiler.td » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 //===-- X86ISelLowering.cpp - X86 DAG Lowering Implementation -------------===// 1 //===-- X86ISelLowering.cpp - X86 DAG Lowering Implementation -------------===//
2 // 2 //
3 // The LLVM Compiler Infrastructure 3 // The LLVM Compiler Infrastructure
4 // 4 //
5 // This file is distributed under the University of Illinois Open Source 5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details. 6 // License. See LICENSE.TXT for details.
7 // 7 //
8 //===----------------------------------------------------------------------===// 8 //===----------------------------------------------------------------------===//
9 // 9 //
10 // This file defines the interfaces that X86 uses to lower LLVM code into a 10 // This file defines the interfaces that X86 uses to lower LLVM code into a
(...skipping 7552 matching lines...) Expand 10 before | Expand all | Expand 10 after
7563 SDValue RSFIN = DAG.getFrameIndex(FuncInfo->getRegSaveFrameIndex(), 7563 SDValue RSFIN = DAG.getFrameIndex(FuncInfo->getRegSaveFrameIndex(),
7564 getPointerTy()); 7564 getPointerTy());
7565 Store = DAG.getStore(Op.getOperand(0), DL, RSFIN, FIN, 7565 Store = DAG.getStore(Op.getOperand(0), DL, RSFIN, FIN,
7566 MachinePointerInfo(SV, 16), false, false, 0); 7566 MachinePointerInfo(SV, 16), false, false, 0);
7567 MemOps.push_back(Store); 7567 MemOps.push_back(Store);
7568 return DAG.getNode(ISD::TokenFactor, DL, MVT::Other, 7568 return DAG.getNode(ISD::TokenFactor, DL, MVT::Other,
7569 &MemOps[0], MemOps.size()); 7569 &MemOps[0], MemOps.size());
7570 } 7570 }
7571 7571
7572 SDValue X86TargetLowering::LowerVAARG(SDValue Op, SelectionDAG &DAG) const { 7572 SDValue X86TargetLowering::LowerVAARG(SDValue Op, SelectionDAG &DAG) const {
7573 // X86-64 va_list is a struct { i32, i32, i8*, i8* }. 7573 assert(Subtarget->is64Bit() &&
7574 assert(Subtarget->is64Bit() && "This code only handles 64-bit va_arg!"); 7574 "LowerVAARG only handles 64-bit va_arg!");
7575 assert((Subtarget->isTargetLinux() ||
7576 Subtarget->isTargetDarwin()) &&
7577 "Unhandled target in LowerVAARG");
7578 assert(Op.getNode()->getNumOperands() == 4);
7579 SDValue Chain = Op.getOperand(0);
7580 SDValue SrcPtr = Op.getOperand(1);
7581 const Value *SV = cast<SrcValueSDNode>(Op.getOperand(2))->getValue();
7582 unsigned Align = Op.getConstantOperandVal(3);
7583 DebugLoc dl = Op.getDebugLoc();
7575 7584
7576 report_fatal_error("VAArgInst is not yet implemented for x86-64!"); 7585 EVT ArgVT = Op.getNode()->getValueType(0);
7577 return SDValue(); 7586 const Type *ArgTy = ArgVT.getTypeForEVT(*DAG.getContext());
7587 uint32_t ArgSize = getTargetData()->getTypeAllocSize(ArgTy);
7588 uint8_t ArgMode;
7589
7590 // Decide which area this value should be read from.
7591 // TODO: Implement the AMD64 ABI in its entirety. This simple
7592 // selection mechanism works only for the basic types.
7593 if (ArgVT == MVT::f80) {
7594 llvm_unreachable("va_arg for f80 not yet implemented");
7595 } else if (ArgVT.isFloatingPoint() && ArgSize <= 16 /*bytes*/) {
7596 ArgMode = 2; // Argument passed in XMM register. Use fp_offset.
7597 } else if (ArgVT.isInteger() && ArgSize <= 32 /*bytes*/) {
7598 ArgMode = 1; // Argument passed in GPR64 register(s). Use gp_offset.
7599 } else {
7600 llvm_unreachable("Unhandled argument type in LowerVAARG");
7601 }
7602
7603 if (ArgMode == 2) {
7604 // Sanity Check: Make sure using fp_offset makes sense.
7605 const Function *Fn = DAG.getMachineFunction().getFunction();
7606 bool NoImplicitFloatOps = Fn->hasFnAttr(Attribute::NoImplicitFloat);
7607 assert(!UseSoftFloat && !NoImplicitFloatOps && Subtarget->hasSSE1());
7608 }
7609
7610 // Insert VAARG_64 node into the DAG
7611 // VAARG_64 returns two values: Variable Argument Address, Chain
7612 SmallVector<SDValue, 11> InstOps;
7613 InstOps.push_back(Chain);
7614 InstOps.push_back(SrcPtr);
7615 InstOps.push_back(DAG.getConstant(ArgSize, MVT::i32));
7616 InstOps.push_back(DAG.getConstant(ArgMode, MVT::i8));
7617 InstOps.push_back(DAG.getConstant(Align, MVT::i32));
7618 SDVTList VTs = DAG.getVTList(getPointerTy(), MVT::Other);
7619 SDValue VAARG = DAG.getMemIntrinsicNode(X86ISD::VAARG_64, dl,
7620 VTs, &InstOps[0], InstOps.size(),
7621 MVT::i64,
7622 MachinePointerInfo(SV),
7623 /*Align=*/0,
7624 /*Volatile=*/false,
7625 /*ReadMem=*/true,
7626 /*WriteMem=*/true);
7627 Chain = VAARG.getValue(1);
7628
7629 // Load the next argument and return it
7630 return DAG.getLoad(ArgVT, dl,
7631 Chain,
7632 VAARG,
7633 MachinePointerInfo(),
7634 false, false, 0);
7578 } 7635 }
7579 7636
7580 SDValue X86TargetLowering::LowerVACOPY(SDValue Op, SelectionDAG &DAG) const { 7637 SDValue X86TargetLowering::LowerVACOPY(SDValue Op, SelectionDAG &DAG) const {
7581 // X86-64 va_list is a struct { i32, i32, i8*, i8* }. 7638 // X86-64 va_list is a struct { i32, i32, i8*, i8* }.
7582 assert(Subtarget->is64Bit() && "This code only handles 64-bit va_copy!"); 7639 assert(Subtarget->is64Bit() && "This code only handles 64-bit va_copy!");
7583 SDValue Chain = Op.getOperand(0); 7640 SDValue Chain = Op.getOperand(0);
7584 SDValue DstPtr = Op.getOperand(1); 7641 SDValue DstPtr = Op.getOperand(1);
7585 SDValue SrcPtr = Op.getOperand(2); 7642 SDValue SrcPtr = Op.getOperand(2);
7586 const Value *DstSV = cast<SrcValueSDNode>(Op.getOperand(3))->getValue(); 7643 const Value *DstSV = cast<SrcValueSDNode>(Op.getOperand(3))->getValue();
7587 const Value *SrcSV = cast<SrcValueSDNode>(Op.getOperand(4))->getValue(); 7644 const Value *SrcSV = cast<SrcValueSDNode>(Op.getOperand(4))->getValue();
(...skipping 1255 matching lines...) Expand 10 before | Expand all | Expand 10 after
8843 case X86ISD::UNPCKHPD: return "X86ISD::UNPCKHPD"; 8900 case X86ISD::UNPCKHPD: return "X86ISD::UNPCKHPD";
8844 case X86ISD::PUNPCKLBW: return "X86ISD::PUNPCKLBW"; 8901 case X86ISD::PUNPCKLBW: return "X86ISD::PUNPCKLBW";
8845 case X86ISD::PUNPCKLWD: return "X86ISD::PUNPCKLWD"; 8902 case X86ISD::PUNPCKLWD: return "X86ISD::PUNPCKLWD";
8846 case X86ISD::PUNPCKLDQ: return "X86ISD::PUNPCKLDQ"; 8903 case X86ISD::PUNPCKLDQ: return "X86ISD::PUNPCKLDQ";
8847 case X86ISD::PUNPCKLQDQ: return "X86ISD::PUNPCKLQDQ"; 8904 case X86ISD::PUNPCKLQDQ: return "X86ISD::PUNPCKLQDQ";
8848 case X86ISD::PUNPCKHBW: return "X86ISD::PUNPCKHBW"; 8905 case X86ISD::PUNPCKHBW: return "X86ISD::PUNPCKHBW";
8849 case X86ISD::PUNPCKHWD: return "X86ISD::PUNPCKHWD"; 8906 case X86ISD::PUNPCKHWD: return "X86ISD::PUNPCKHWD";
8850 case X86ISD::PUNPCKHDQ: return "X86ISD::PUNPCKHDQ"; 8907 case X86ISD::PUNPCKHDQ: return "X86ISD::PUNPCKHDQ";
8851 case X86ISD::PUNPCKHQDQ: return "X86ISD::PUNPCKHQDQ"; 8908 case X86ISD::PUNPCKHQDQ: return "X86ISD::PUNPCKHQDQ";
8852 case X86ISD::VASTART_SAVE_XMM_REGS: return "X86ISD::VASTART_SAVE_XMM_REGS"; 8909 case X86ISD::VASTART_SAVE_XMM_REGS: return "X86ISD::VASTART_SAVE_XMM_REGS";
8910 case X86ISD::VAARG_64: return "X86ISD::VAARG_64";
8853 case X86ISD::MINGW_ALLOCA: return "X86ISD::MINGW_ALLOCA"; 8911 case X86ISD::MINGW_ALLOCA: return "X86ISD::MINGW_ALLOCA";
8854 } 8912 }
8855 } 8913 }
8856 8914
8857 // isLegalAddressingMode - Return true if the addressing mode represented 8915 // isLegalAddressingMode - Return true if the addressing mode represented
8858 // by AM is legal for this target, for a load/store of the specified type. 8916 // by AM is legal for this target, for a load/store of the specified type.
8859 bool X86TargetLowering::isLegalAddressingMode(const AddrMode &AM, 8917 bool X86TargetLowering::isLegalAddressingMode(const AddrMode &AM,
8860 const Type *Ty) const { 8918 const Type *Ty) const {
8861 // X86 supports extremely general addressing modes. 8919 // X86 supports extremely general addressing modes.
8862 CodeModel::Model M = getTargetMachine().getCodeModel(); 8920 CodeModel::Model M = getTargetMachine().getCodeModel();
(...skipping 541 matching lines...) Expand 10 before | Expand all | Expand 10 after
9404 9462
9405 BuildMI(BB, dl, TII->get(X86::MOVAPSrr), MI->getOperand(0).getReg()) 9463 BuildMI(BB, dl, TII->get(X86::MOVAPSrr), MI->getOperand(0).getReg())
9406 .addReg(X86::XMM0); 9464 .addReg(X86::XMM0);
9407 9465
9408 MI->eraseFromParent(); 9466 MI->eraseFromParent();
9409 9467
9410 return BB; 9468 return BB;
9411 } 9469 }
9412 9470
9413 MachineBasicBlock * 9471 MachineBasicBlock *
9472 X86TargetLowering::EmitVAARG64WithCustomInserter(
9473 MachineInstr *MI,
9474 MachineBasicBlock *MBB) const {
9475 // Emit va_arg instruction on X86-64.
9476
9477 // Operands to this pseudo-instruction:
9478 // 0 ) Output : destination address (reg)
9479 // 1-5) Input : va_list address (addr, i64mem)
9480 // 6 ) ArgSize : Size (in bytes) of vararg type
9481 // 7 ) ArgMode : 0=overflow only, 1=use gp_offset, 2=use fp_offset
9482 // 8 ) Align : Alignment of type
9483 // 9 ) EFLAGS (implicit-def)
9484
9485 assert(MI->getNumOperands() == 10 && "VAARG_64 should have 10 operands!");
9486 assert(X86::AddrNumOperands == 5 && "VAARG_64 assumes 5 address operands");
9487
9488 unsigned DestReg = MI->getOperand(0).getReg();
9489 MachineOperand &Base = MI->getOperand(1);
9490 MachineOperand &Scale = MI->getOperand(2);
9491 MachineOperand &Index = MI->getOperand(3);
9492 MachineOperand &Disp = MI->getOperand(4);
9493 MachineOperand &Segment = MI->getOperand(5);
9494 unsigned ArgSize = MI->getOperand(6).getImm();
9495 unsigned ArgMode = MI->getOperand(7).getImm();
9496 unsigned Align = MI->getOperand(8).getImm();
9497
9498 // Memory Reference
9499 assert(MI->hasOneMemOperand() && "Expected VAARG_64 to have one memoperand");
9500 MachineInstr::mmo_iterator MMOBegin = MI->memoperands_begin();
9501 MachineInstr::mmo_iterator MMOEnd = MI->memoperands_end();
9502
9503 // Machine Information
9504 const TargetInstrInfo *TII = getTargetMachine().getInstrInfo();
9505 MachineRegisterInfo &MRI = MBB->getParent()->getRegInfo();
9506 const TargetRegisterClass *AddrRegClass = getRegClassFor(MVT::i64);
9507 const TargetRegisterClass *OffsetRegClass = getRegClassFor(MVT::i32);
9508 DebugLoc DL = MI->getDebugLoc();
9509
9510 // struct va_list {
9511 // i32 gp_offset
9512 // i32 fp_offset
9513 // i64 overflow_area (address)
9514 // i64 reg_save_area (address)
9515 // }
9516 // sizeof(va_list) = 24
9517 // alignment(va_list) = 8
9518
9519 unsigned TotalNumIntRegs = 6;
9520 unsigned TotalNumXMMRegs = 8;
9521 bool UseGPOffset = (ArgMode == 1);
9522 bool UseFPOffset = (ArgMode == 2);
9523 unsigned MaxOffset = TotalNumIntRegs * 8 +
9524 (UseFPOffset ? TotalNumXMMRegs * 16 : 0);
9525
9526 /* Align ArgSize to a multiple of 8 */
9527 unsigned ArgSizeA8 = (ArgSize + 7) & ~7;
9528 bool NeedsAlign = (Align > 8);
9529
9530 MachineBasicBlock *thisMBB = MBB;
9531 MachineBasicBlock *overflowMBB;
9532 MachineBasicBlock *offsetMBB;
9533 MachineBasicBlock *endMBB;
9534
9535 unsigned OffsetDestReg = 0; // Argument address computed by offsetMBB
9536 unsigned OverflowDestReg = 0; // Argument address computed by overflowMBB
9537 unsigned OffsetReg = 0;
9538
9539 if (!UseGPOffset && !UseFPOffset) {
9540 // If we only pull from the overflow region, we don't create a branch.
9541 // We don't need to alter control flow.
9542 OffsetDestReg = 0; // unused
9543 OverflowDestReg = DestReg;
9544
9545 offsetMBB = NULL;
9546 overflowMBB = thisMBB;
9547 endMBB = thisMBB;
9548 } else {
9549 // First emit code to check if gp_offset (or fp_offset) is below the bound.
9550 // If so, pull the argument from reg_save_area. (branch to offsetMBB)
9551 // If not, pull from overflow_area. (branch to overflowMBB)
9552 //
9553 // thisMBB
9554 // | .
9555 // | .
9556 // offsetMBB overflowMBB
9557 // | .
9558 // | .
9559 // endMBB
9560
9561 // Registers for the PHI in endMBB
9562 OffsetDestReg = MRI.createVirtualRegister(AddrRegClass);
9563 OverflowDestReg = MRI.createVirtualRegister(AddrRegClass);
9564
9565 const BasicBlock *LLVM_BB = MBB->getBasicBlock();
9566 MachineFunction *MF = MBB->getParent();
9567 overflowMBB = MF->CreateMachineBasicBlock(LLVM_BB);
9568 offsetMBB = MF->CreateMachineBasicBlock(LLVM_BB);
9569 endMBB = MF->CreateMachineBasicBlock(LLVM_BB);
9570
9571 MachineFunction::iterator MBBIter = MBB;
9572 ++MBBIter;
9573
9574 // Insert the new basic blocks
9575 MF->insert(MBBIter, offsetMBB);
9576 MF->insert(MBBIter, overflowMBB);
9577 MF->insert(MBBIter, endMBB);
9578
9579 // Transfer the remainder of MBB and its successor edges to endMBB.
9580 endMBB->splice(endMBB->begin(), thisMBB,
9581 llvm::next(MachineBasicBlock::iterator(MI)),
9582 thisMBB->end());
9583 endMBB->transferSuccessorsAndUpdatePHIs(thisMBB);
9584
9585 // Make offsetMBB and overflowMBB successors of thisMBB
9586 thisMBB->addSuccessor(offsetMBB);
9587 thisMBB->addSuccessor(overflowMBB);
9588
9589 // endMBB is a successor of both offsetMBB and overflowMBB
9590 offsetMBB->addSuccessor(endMBB);
9591 overflowMBB->addSuccessor(endMBB);
9592
9593 // Load the offset value into a register
9594 OffsetReg = MRI.createVirtualRegister(OffsetRegClass);
9595 BuildMI(thisMBB, DL, TII->get(X86::MOV32rm), OffsetReg)
9596 .addOperand(Base)
9597 .addOperand(Scale)
9598 .addOperand(Index)
9599 .addDisp(Disp, UseFPOffset ? 4 : 0)
9600 .addOperand(Segment)
9601 .setMemRefs(MMOBegin, MMOEnd);
9602
9603 // Check if there is enough room left to pull this argument.
9604 BuildMI(thisMBB, DL, TII->get(X86::CMP32ri))
9605 .addReg(OffsetReg)
9606 .addImm(MaxOffset + 8 - ArgSizeA8);
9607
9608 // Branch to "overflowMBB" if offset >= max
9609 // Fall through to "offsetMBB" otherwise
9610 BuildMI(thisMBB, DL, TII->get(X86::GetCondBranchFromCond(X86::COND_AE)))
9611 .addMBB(overflowMBB);
9612 }
9613
9614 // In offsetMBB, emit code to use the reg_save_area.
9615 if (offsetMBB) {
9616 assert(OffsetReg != 0);
9617
9618 // Read the reg_save_area address.
9619 unsigned RegSaveReg = MRI.createVirtualRegister(AddrRegClass);
9620 BuildMI(offsetMBB, DL, TII->get(X86::MOV64rm), RegSaveReg)
9621 .addOperand(Base)
9622 .addOperand(Scale)
9623 .addOperand(Index)
9624 .addDisp(Disp, 16)
9625 .addOperand(Segment)
9626 .setMemRefs(MMOBegin, MMOEnd);
9627
9628 // Zero-extend the offset
9629 unsigned OffsetReg64 = MRI.createVirtualRegister(AddrRegClass);
9630 BuildMI(offsetMBB, DL, TII->get(X86::SUBREG_TO_REG), OffsetReg64)
9631 .addImm(0)
9632 .addReg(OffsetReg)
9633 .addImm(X86::sub_32bit);
9634
9635 // Add the offset to the reg_save_area to get the final address.
9636 BuildMI(offsetMBB, DL, TII->get(X86::ADD64rr), OffsetDestReg)
9637 .addReg(OffsetReg64)
9638 .addReg(RegSaveReg);
9639
9640 // Compute the offset for the next argument
9641 unsigned NextOffsetReg = MRI.createVirtualRegister(OffsetRegClass);
9642 BuildMI(offsetMBB, DL, TII->get(X86::ADD32ri), NextOffsetReg)
9643 .addReg(OffsetReg)
9644 .addImm(UseFPOffset ? 16 : 8);
9645
9646 // Store it back into the va_list.
9647 BuildMI(offsetMBB, DL, TII->get(X86::MOV32mr))
9648 .addOperand(Base)
9649 .addOperand(Scale)
9650 .addOperand(Index)
9651 .addDisp(Disp, UseFPOffset ? 4 : 0)
9652 .addOperand(Segment)
9653 .addReg(NextOffsetReg)
9654 .setMemRefs(MMOBegin, MMOEnd);
9655
9656 // Jump to endMBB
9657 BuildMI(offsetMBB, DL, TII->get(X86::JMP_4))
9658 .addMBB(endMBB);
9659 }
9660
9661 //
9662 // Emit code to use overflow area
9663 //
9664
9665 // Load the overflow_area address into a register.
9666 unsigned OverflowAddrReg = MRI.createVirtualRegister(AddrRegClass);
9667 BuildMI(overflowMBB, DL, TII->get(X86::MOV64rm), OverflowAddrReg)
9668 .addOperand(Base)
9669 .addOperand(Scale)
9670 .addOperand(Index)
9671 .addDisp(Disp, 8)
9672 .addOperand(Segment)
9673 .setMemRefs(MMOBegin, MMOEnd);
9674
9675 // If we need to align it, do so. Otherwise, just copy the address
9676 // to OverflowDestReg.
9677 if (NeedsAlign) {
9678 // Align the overflow address
9679 assert((Align & (Align-1)) == 0 && "Alignment must be a power of 2");
9680 unsigned TmpReg = MRI.createVirtualRegister(AddrRegClass);
9681
9682 // aligned_addr = (addr + (align-1)) & ~(align-1)
9683 BuildMI(overflowMBB, DL, TII->get(X86::ADD64ri32), TmpReg)
9684 .addReg(OverflowAddrReg)
9685 .addImm(Align-1);
9686
9687 BuildMI(overflowMBB, DL, TII->get(X86::AND64ri32), OverflowDestReg)
9688 .addReg(TmpReg)
9689 .addImm(~(uint64_t)(Align-1));
9690 } else {
9691 BuildMI(overflowMBB, DL, TII->get(TargetOpcode::COPY), OverflowDestReg)
9692 .addReg(OverflowAddrReg);
9693 }
9694
9695 // Compute the next overflow address after this argument.
9696 // (the overflow address should be kept 8-byte aligned)
9697 unsigned NextAddrReg = MRI.createVirtualRegister(AddrRegClass);
9698 BuildMI(overflowMBB, DL, TII->get(X86::ADD64ri32), NextAddrReg)
9699 .addReg(OverflowDestReg)
9700 .addImm(ArgSizeA8);
9701
9702 // Store the new overflow address.
9703 BuildMI(overflowMBB, DL, TII->get(X86::MOV64mr))
9704 .addOperand(Base)
9705 .addOperand(Scale)
9706 .addOperand(Index)
9707 .addDisp(Disp, 8)
9708 .addOperand(Segment)
9709 .addReg(NextAddrReg)
9710 .setMemRefs(MMOBegin, MMOEnd);
9711
9712 // If we branched, emit the PHI to the front of endMBB.
9713 if (offsetMBB) {
9714 BuildMI(*endMBB, endMBB->begin(), DL,
9715 TII->get(X86::PHI), DestReg)
9716 .addReg(OffsetDestReg).addMBB(offsetMBB)
9717 .addReg(OverflowDestReg).addMBB(overflowMBB);
9718 }
9719
9720 // Erase the pseudo instruction
9721 MI->eraseFromParent();
9722
9723 return endMBB;
9724 }
9725
9726 MachineBasicBlock *
9414 X86TargetLowering::EmitVAStartSaveXMMRegsWithCustomInserter( 9727 X86TargetLowering::EmitVAStartSaveXMMRegsWithCustomInserter(
9415 MachineInstr *MI, 9728 MachineInstr *MI,
9416 MachineBasicBlock *MBB) const { 9729 MachineBasicBlock *MBB) const {
9417 // Emit code to save XMM registers to the stack. The ABI says that the 9730 // Emit code to save XMM registers to the stack. The ABI says that the
9418 // number of registers to save is given in %al, so it's theoretically 9731 // number of registers to save is given in %al, so it's theoretically
9419 // possible to do an indirect jump trick to avoid saving all of them, 9732 // possible to do an indirect jump trick to avoid saving all of them,
9420 // however this code takes a simpler approach and just executes all 9733 // however this code takes a simpler approach and just executes all
9421 // of the stores if %al is non-zero. It's less code, and it's probably 9734 // of the stores if %al is non-zero. It's less code, and it's probably
9422 // easier on the hardware branch predictor, and stores aren't all that 9735 // easier on the hardware branch predictor, and stores aren't all that
9423 // expensive anyway. 9736 // expensive anyway.
(...skipping 484 matching lines...) Expand 10 before | Expand all | Expand 10 after
9908 X86::SUB32rr, X86::SBB32rr, 10221 X86::SUB32rr, X86::SBB32rr,
9909 X86::SUB32ri, X86::SBB32ri, 10222 X86::SUB32ri, X86::SBB32ri,
9910 false); 10223 false);
9911 case X86::ATOMSWAP6432: 10224 case X86::ATOMSWAP6432:
9912 return EmitAtomicBit6432WithCustomInserter(MI, BB, 10225 return EmitAtomicBit6432WithCustomInserter(MI, BB,
9913 X86::MOV32rr, X86::MOV32rr, 10226 X86::MOV32rr, X86::MOV32rr,
9914 X86::MOV32ri, X86::MOV32ri, 10227 X86::MOV32ri, X86::MOV32ri,
9915 false); 10228 false);
9916 case X86::VASTART_SAVE_XMM_REGS: 10229 case X86::VASTART_SAVE_XMM_REGS:
9917 return EmitVAStartSaveXMMRegsWithCustomInserter(MI, BB); 10230 return EmitVAStartSaveXMMRegsWithCustomInserter(MI, BB);
10231
10232 case X86::VAARG_64:
10233 return EmitVAARG64WithCustomInserter(MI, BB);
9918 } 10234 }
9919 } 10235 }
9920 10236
9921 //===----------------------------------------------------------------------===// 10237 //===----------------------------------------------------------------------===//
9922 // X86 Optimization Hooks 10238 // X86 Optimization Hooks
9923 //===----------------------------------------------------------------------===// 10239 //===----------------------------------------------------------------------===//
9924 10240
9925 void X86TargetLowering::computeMaskedBitsForTargetNode(const SDValue Op, 10241 void X86TargetLowering::computeMaskedBitsForTargetNode(const SDValue Op,
9926 const APInt &Mask, 10242 const APInt &Mask,
9927 APInt &KnownZero, 10243 APInt &KnownZero,
(...skipping 1683 matching lines...) Expand 10 before | Expand all | Expand 10 after
11611 if (VT == MVT::f32) 11927 if (VT == MVT::f32)
11612 Res.second = X86::FR32RegisterClass; 11928 Res.second = X86::FR32RegisterClass;
11613 else if (VT == MVT::f64) 11929 else if (VT == MVT::f64)
11614 Res.second = X86::FR64RegisterClass; 11930 Res.second = X86::FR64RegisterClass;
11615 else if (X86::VR128RegisterClass->hasType(VT)) 11931 else if (X86::VR128RegisterClass->hasType(VT))
11616 Res.second = X86::VR128RegisterClass; 11932 Res.second = X86::VR128RegisterClass;
11617 } 11933 }
11618 11934
11619 return Res; 11935 return Res;
11620 } 11936 }
OLDNEW
« no previous file with comments | « lib/Target/X86/X86ISelLowering.h ('k') | lib/Target/X86/X86InstrCompiler.td » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698