| OLD | NEW |
| 1 //===- subzero/src/IceInstX86BaseImpl.h - Generic X86 instructions -*- C++ -*=// | 1 //===- subzero/src/IceInstX86BaseImpl.h - Generic X86 instructions -*- C++ -*=// |
| 2 // | 2 // |
| 3 // The Subzero Code Generator | 3 // The Subzero Code Generator |
| 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 /// \file | 10 /// \file |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 50 InstArithmetic::OpKind Op, | 50 InstArithmetic::OpKind Op, |
| 51 Variable *Beacon) | 51 Variable *Beacon) |
| 52 : InstX86Base<Machine>(Func, InstX86Base<Machine>::FakeRMW, 3, nullptr), | 52 : InstX86Base<Machine>(Func, InstX86Base<Machine>::FakeRMW, 3, nullptr), |
| 53 Op(Op) { | 53 Op(Op) { |
| 54 this->addSource(Data); | 54 this->addSource(Data); |
| 55 this->addSource(Addr); | 55 this->addSource(Addr); |
| 56 this->addSource(Beacon); | 56 this->addSource(Beacon); |
| 57 } | 57 } |
| 58 | 58 |
| 59 template <class Machine> | 59 template <class Machine> |
| 60 InstX86AdjustStack<Machine>::InstX86AdjustStack(Cfg *Func, SizeT Amount, | 60 InstX86AdjustStack<Machine>::InstX86AdjustStack(Cfg *Func, int32_t Amount, |
| 61 Variable *Esp) | 61 Variable *Esp) |
| 62 : InstX86Base<Machine>(Func, InstX86Base<Machine>::Adjuststack, 1, Esp), | 62 : InstX86Base<Machine>(Func, InstX86Base<Machine>::Adjuststack, 1, Esp), |
| 63 Amount(Amount) { | 63 Amount(Amount) { |
| 64 this->addSource(Esp); | 64 this->addSource(Esp); |
| 65 } | 65 } |
| 66 | 66 |
| 67 template <class Machine> | 67 template <class Machine> |
| 68 InstX86Mul<Machine>::InstX86Mul(Cfg *Func, Variable *Dest, Variable *Source1, | 68 InstX86Mul<Machine>::InstX86Mul(Cfg *Func, Variable *Dest, Variable *Source1, |
| 69 Operand *Source2) | 69 Operand *Source2) |
| 70 : InstX86Base<Machine>(Func, InstX86Base<Machine>::Mul, 2, Dest) { | 70 : InstX86Base<Machine>(Func, InstX86Base<Machine>::Mul, 2, Dest) { |
| (...skipping 503 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 574 if (const auto *CI = llvm::dyn_cast<ConstantInteger32>(CallTarget)) { | 574 if (const auto *CI = llvm::dyn_cast<ConstantInteger32>(CallTarget)) { |
| 575 // Emit without a leading '$'. | 575 // Emit without a leading '$'. |
| 576 Str << CI->getValue(); | 576 Str << CI->getValue(); |
| 577 } else if (const auto DirectCallTarget = | 577 } else if (const auto DirectCallTarget = |
| 578 llvm::dyn_cast<ConstantRelocatable>(CallTarget)) { | 578 llvm::dyn_cast<ConstantRelocatable>(CallTarget)) { |
| 579 DirectCallTarget->emitWithoutPrefix(Target); | 579 DirectCallTarget->emitWithoutPrefix(Target); |
| 580 } else { | 580 } else { |
| 581 Str << "*"; | 581 Str << "*"; |
| 582 CallTarget->emit(Func); | 582 CallTarget->emit(Func); |
| 583 } | 583 } |
| 584 Target->resetStackAdjustment(); | |
| 585 } | 584 } |
| 586 | 585 |
| 587 template <class Machine> | 586 template <class Machine> |
| 588 void InstX86Call<Machine>::emitIAS(const Cfg *Func) const { | 587 void InstX86Call<Machine>::emitIAS(const Cfg *Func) const { |
| 589 typename InstX86Base<Machine>::Traits::Assembler *Asm = | 588 typename InstX86Base<Machine>::Traits::Assembler *Asm = |
| 590 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); | 589 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
| 591 Operand *CallTarget = getCallTarget(); | 590 Operand *CallTarget = getCallTarget(); |
| 592 auto *Target = InstX86Base<Machine>::getTarget(Func); | 591 auto *Target = InstX86Base<Machine>::getTarget(Func); |
| 593 if (const auto *Var = llvm::dyn_cast<Variable>(CallTarget)) { | 592 if (const auto *Var = llvm::dyn_cast<Variable>(CallTarget)) { |
| 594 if (Var->hasReg()) { | 593 if (Var->hasReg()) { |
| 595 Asm->call(InstX86Base<Machine>::Traits::getEncodedGPR(Var->getRegNum())); | 594 Asm->call(InstX86Base<Machine>::Traits::getEncodedGPR(Var->getRegNum())); |
| 596 } else { | 595 } else { |
| 597 Asm->call(Target->stackVarToAsmOperand(Var)); | 596 Asm->call(Target->stackVarToAsmOperand(Var)); |
| 598 } | 597 } |
| 599 } else if (const auto *Mem = llvm::dyn_cast< | 598 } else if (const auto *Mem = llvm::dyn_cast< |
| 600 typename InstX86Base<Machine>::Traits::X86OperandMem>( | 599 typename InstX86Base<Machine>::Traits::X86OperandMem>( |
| 601 CallTarget)) { | 600 CallTarget)) { |
| 602 assert(Mem->getSegmentRegister() == | 601 assert(Mem->getSegmentRegister() == |
| 603 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); | 602 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); |
| 604 Asm->call(Mem->toAsmAddress(Asm, Target)); | 603 Asm->call(Mem->toAsmAddress(Asm, Target)); |
| 605 } else if (const auto *CR = llvm::dyn_cast<ConstantRelocatable>(CallTarget)) { | 604 } else if (const auto *CR = llvm::dyn_cast<ConstantRelocatable>(CallTarget)) { |
| 606 assert(CR->getOffset() == 0 && "We only support calling a function"); | 605 assert(CR->getOffset() == 0 && "We only support calling a function"); |
| 607 Asm->call(CR); | 606 Asm->call(CR); |
| 608 } else if (const auto *Imm = llvm::dyn_cast<ConstantInteger32>(CallTarget)) { | 607 } else if (const auto *Imm = llvm::dyn_cast<ConstantInteger32>(CallTarget)) { |
| 609 Asm->call(Immediate(Imm->getValue())); | 608 Asm->call(Immediate(Imm->getValue())); |
| 610 } else { | 609 } else { |
| 611 llvm_unreachable("Unexpected operand type"); | 610 llvm_unreachable("Unexpected operand type"); |
| 612 } | 611 } |
| 613 Target->resetStackAdjustment(); | |
| 614 } | 612 } |
| 615 | 613 |
| 616 template <class Machine> | 614 template <class Machine> |
| 617 void InstX86Call<Machine>::dump(const Cfg *Func) const { | 615 void InstX86Call<Machine>::dump(const Cfg *Func) const { |
| 618 if (!BuildDefs::dump()) | 616 if (!BuildDefs::dump()) |
| 619 return; | 617 return; |
| 620 Ostream &Str = Func->getContext()->getStrDump(); | 618 Ostream &Str = Func->getContext()->getStrDump(); |
| 621 if (this->getDest()) { | 619 if (this->getDest()) { |
| 622 this->dumpDest(Func); | 620 this->dumpDest(Func); |
| 623 Str << " = "; | 621 Str << " = "; |
| (...skipping 966 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1590 typename InstX86Base<Machine>::Traits::Assembler *Asm = | 1588 typename InstX86Base<Machine>::Traits::Assembler *Asm = |
| 1591 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); | 1589 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
| 1592 auto *Target = InstX86Base<Machine>::getTarget(Func); | 1590 auto *Target = InstX86Base<Machine>::getTarget(Func); |
| 1593 if (const auto *SrcVar = llvm::dyn_cast<Variable>(Src)) { | 1591 if (const auto *SrcVar = llvm::dyn_cast<Variable>(Src)) { |
| 1594 if (SrcVar->hasReg()) { | 1592 if (SrcVar->hasReg()) { |
| 1595 Asm->cmov( | 1593 Asm->cmov( |
| 1596 SrcTy, Condition, InstX86Base<Machine>::Traits::getEncodedGPR( | 1594 SrcTy, Condition, InstX86Base<Machine>::Traits::getEncodedGPR( |
| 1597 this->getDest()->getRegNum()), | 1595 this->getDest()->getRegNum()), |
| 1598 InstX86Base<Machine>::Traits::getEncodedGPR(SrcVar->getRegNum())); | 1596 InstX86Base<Machine>::Traits::getEncodedGPR(SrcVar->getRegNum())); |
| 1599 } else { | 1597 } else { |
| 1600 Asm->cmov( | 1598 Asm->cmov(SrcTy, Condition, InstX86Base<Machine>::Traits::getEncodedGPR( |
| 1601 SrcTy, Condition, InstX86Base<Machine>::Traits::getEncodedGPR( | 1599 this->getDest()->getRegNum()), |
| 1602 this->getDest()->getRegNum()), | 1600 Target->stackVarToAsmOperand(SrcVar)); |
| 1603 Target->stackVarToAsmOperand(SrcVar)); | |
| 1604 } | 1601 } |
| 1605 } else if (const auto *Mem = llvm::dyn_cast< | 1602 } else if (const auto *Mem = llvm::dyn_cast< |
| 1606 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { | 1603 typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { |
| 1607 assert(Mem->getSegmentRegister() == | 1604 assert(Mem->getSegmentRegister() == |
| 1608 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); | 1605 InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); |
| 1609 Asm->cmov(SrcTy, Condition, InstX86Base<Machine>::Traits::getEncodedGPR( | 1606 Asm->cmov(SrcTy, Condition, InstX86Base<Machine>::Traits::getEncodedGPR( |
| 1610 this->getDest()->getRegNum()), | 1607 this->getDest()->getRegNum()), |
| 1611 Mem->toAsmAddress(Asm, Target)); | 1608 Mem->toAsmAddress(Asm, Target)); |
| 1612 } else { | 1609 } else { |
| 1613 llvm_unreachable("Unexpected operand type"); | 1610 llvm_unreachable("Unexpected operand type"); |
| (...skipping 1014 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2628 Ostream &Str = Func->getContext()->getStrEmit(); | 2625 Ostream &Str = Func->getContext()->getStrEmit(); |
| 2629 assert(this->getSrcSize() == 0); | 2626 assert(this->getSrcSize() == 0); |
| 2630 // TODO(jvoung,stichnot): Utilize this by setting Dest to nullptr to | 2627 // TODO(jvoung,stichnot): Utilize this by setting Dest to nullptr to |
| 2631 // "partially" delete the fstp if the Dest is unused. Even if Dest is unused, | 2628 // "partially" delete the fstp if the Dest is unused. Even if Dest is unused, |
| 2632 // the fstp should be kept for the SideEffects of popping the stack. | 2629 // the fstp should be kept for the SideEffects of popping the stack. |
| 2633 if (!this->getDest()) { | 2630 if (!this->getDest()) { |
| 2634 Str << "\tfstp\tst(0)"; | 2631 Str << "\tfstp\tst(0)"; |
| 2635 return; | 2632 return; |
| 2636 } | 2633 } |
| 2637 Type Ty = this->getDest()->getType(); | 2634 Type Ty = this->getDest()->getType(); |
| 2638 size_t Width = typeWidthInBytes(Ty); | |
| 2639 if (!this->getDest()->hasReg()) { | 2635 if (!this->getDest()->hasReg()) { |
| 2640 Str << "\tfstp" << this->getFldString(Ty) << "\t"; | 2636 Str << "\tfstp" << this->getFldString(Ty) << "\t"; |
| 2641 this->getDest()->emit(Func); | 2637 this->getDest()->emit(Func); |
| 2642 return; | 2638 return; |
| 2643 } | 2639 } |
| 2644 // Dest is a physical (xmm) register, so st(0) needs to go through memory. | 2640 // Dest is a physical (xmm) register, so st(0) needs to go through memory. |
| 2645 // Hack this by creating a temporary stack slot, spilling st(0) there, | 2641 // Hack this by using caller-reserved memory at the top of stack, spilling |
| 2646 // loading it into the xmm register, and deallocating the stack slot. | 2642 // st(0) there, and loading it into the xmm register. |
| 2647 Str << "\tsubl\t$" << Width << ", %esp\n"; | |
| 2648 Str << "\tfstp" << this->getFldString(Ty) << "\t" | 2643 Str << "\tfstp" << this->getFldString(Ty) << "\t" |
| 2649 << "(%esp)\n"; | 2644 << "(%esp)\n"; |
| 2650 Str << "\tmov" << InstX86Base<Machine>::Traits::TypeAttributes[Ty].SdSsString | 2645 Str << "\tmov" << InstX86Base<Machine>::Traits::TypeAttributes[Ty].SdSsString |
| 2651 << "\t" | 2646 << "\t" |
| 2652 << "(%esp), "; | 2647 << "(%esp), "; |
| 2653 this->getDest()->emit(Func); | 2648 this->getDest()->emit(Func); |
| 2654 Str << "\n"; | 2649 Str << "\n"; |
| 2655 Str << "\taddl\t$" << Width << ", %esp"; | |
| 2656 } | 2650 } |
| 2657 | 2651 |
| 2658 template <class Machine> | 2652 template <class Machine> |
| 2659 void InstX86Fstp<Machine>::emitIAS(const Cfg *Func) const { | 2653 void InstX86Fstp<Machine>::emitIAS(const Cfg *Func) const { |
| 2660 typename InstX86Base<Machine>::Traits::Assembler *Asm = | 2654 typename InstX86Base<Machine>::Traits::Assembler *Asm = |
| 2661 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); | 2655 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
| 2662 assert(this->getSrcSize() == 0); | 2656 assert(this->getSrcSize() == 0); |
| 2663 const Variable *Dest = this->getDest(); | 2657 const Variable *Dest = this->getDest(); |
| 2664 // TODO(jvoung,stichnot): Utilize this by setting Dest to nullptr to | 2658 // TODO(jvoung,stichnot): Utilize this by setting Dest to nullptr to |
| 2665 // "partially" delete the fstp if the Dest is unused. Even if Dest is unused, | 2659 // "partially" delete the fstp if the Dest is unused. Even if Dest is unused, |
| 2666 // the fstp should be kept for the SideEffects of popping the stack. | 2660 // the fstp should be kept for the SideEffects of popping the stack. |
| 2667 if (!Dest) { | 2661 if (!Dest) { |
| 2668 Asm->fstp(InstX86Base<Machine>::Traits::RegisterSet::getEncodedSTReg(0)); | 2662 Asm->fstp(InstX86Base<Machine>::Traits::RegisterSet::getEncodedSTReg(0)); |
| 2669 return; | 2663 return; |
| 2670 } | 2664 } |
| 2671 auto *Target = InstX86Base<Machine>::getTarget(Func); | 2665 auto *Target = InstX86Base<Machine>::getTarget(Func); |
| 2672 Type Ty = Dest->getType(); | 2666 Type Ty = Dest->getType(); |
| 2673 if (!Dest->hasReg()) { | 2667 if (!Dest->hasReg()) { |
| 2674 typename InstX86Base<Machine>::Traits::Address StackAddr( | 2668 typename InstX86Base<Machine>::Traits::Address StackAddr( |
| 2675 Target->stackVarToAsmOperand(Dest)); | 2669 Target->stackVarToAsmOperand(Dest)); |
| 2676 Asm->fstp(Ty, StackAddr); | 2670 Asm->fstp(Ty, StackAddr); |
| 2677 } else { | 2671 } else { |
| 2678 // Dest is a physical (xmm) register, so st(0) needs to go through memory. | 2672 // Dest is a physical (xmm) register, so st(0) needs to go through memory. |
| 2679 // Hack this by creating a temporary stack slot, spilling st(0) there, | 2673 // Hack this by using caller-reserved memory at the top of stack, spilling |
| 2680 // loading it into the xmm register, and deallocating the stack slot. | 2674 // st(0) there, and loading it into the xmm register. |
| 2681 Immediate Width(typeWidthInBytes(Ty)); | |
| 2682 Asm->sub(IceType_i32, | |
| 2683 InstX86Base<Machine>::Traits::RegisterSet::Encoded_Reg_esp, Width); | |
| 2684 typename InstX86Base<Machine>::Traits::Address StackSlot = | 2675 typename InstX86Base<Machine>::Traits::Address StackSlot = |
| 2685 typename InstX86Base<Machine>::Traits::Address( | 2676 typename InstX86Base<Machine>::Traits::Address( |
| 2686 InstX86Base<Machine>::Traits::RegisterSet::Encoded_Reg_esp, 0, | 2677 InstX86Base<Machine>::Traits::RegisterSet::Encoded_Reg_esp, 0, |
| 2687 AssemblerFixup::NoFixup); | 2678 AssemblerFixup::NoFixup); |
| 2688 Asm->fstp(Ty, StackSlot); | 2679 Asm->fstp(Ty, StackSlot); |
| 2689 Asm->movss(Ty, | 2680 Asm->movss(Ty, |
| 2690 InstX86Base<Machine>::Traits::getEncodedXmm(Dest->getRegNum()), | 2681 InstX86Base<Machine>::Traits::getEncodedXmm(Dest->getRegNum()), |
| 2691 StackSlot); | 2682 StackSlot); |
| 2692 Asm->add(IceType_i32, | |
| 2693 InstX86Base<Machine>::Traits::RegisterSet::Encoded_Reg_esp, Width); | |
| 2694 } | 2683 } |
| 2695 } | 2684 } |
| 2696 | 2685 |
| 2697 template <class Machine> | 2686 template <class Machine> |
| 2698 void InstX86Fstp<Machine>::dump(const Cfg *Func) const { | 2687 void InstX86Fstp<Machine>::dump(const Cfg *Func) const { |
| 2699 if (!BuildDefs::dump()) | 2688 if (!BuildDefs::dump()) |
| 2700 return; | 2689 return; |
| 2701 Ostream &Str = Func->getContext()->getStrDump(); | 2690 Ostream &Str = Func->getContext()->getStrDump(); |
| 2702 this->dumpDest(Func); | 2691 this->dumpDest(Func); |
| 2703 Str << " = fstp." << this->getDest()->getType() << ", st(0)"; | 2692 Str << " = fstp." << this->getDest()->getType() << ", st(0)"; |
| (...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2925 Ostream &Str = Func->getContext()->getStrDump(); | 2914 Ostream &Str = Func->getContext()->getStrDump(); |
| 2926 this->dumpDest(Func); | 2915 this->dumpDest(Func); |
| 2927 Str << " = pop." << this->getDest()->getType() << " "; | 2916 Str << " = pop." << this->getDest()->getType() << " "; |
| 2928 } | 2917 } |
| 2929 | 2918 |
| 2930 template <class Machine> | 2919 template <class Machine> |
| 2931 void InstX86AdjustStack<Machine>::emit(const Cfg *Func) const { | 2920 void InstX86AdjustStack<Machine>::emit(const Cfg *Func) const { |
| 2932 if (!BuildDefs::dump()) | 2921 if (!BuildDefs::dump()) |
| 2933 return; | 2922 return; |
| 2934 Ostream &Str = Func->getContext()->getStrEmit(); | 2923 Ostream &Str = Func->getContext()->getStrEmit(); |
| 2935 Str << "\tsubl\t$" << Amount << ", %esp"; | 2924 if (Amount > 0) |
| 2925 Str << "\tsubl\t$" << Amount << ", %esp"; |
| 2926 else |
| 2927 Str << "\taddl\t$" << -Amount << ", %esp"; |
| 2936 auto *Target = InstX86Base<Machine>::getTarget(Func); | 2928 auto *Target = InstX86Base<Machine>::getTarget(Func); |
| 2937 Target->updateStackAdjustment(Amount); | 2929 Target->updateStackAdjustment(Amount); |
| 2938 } | 2930 } |
| 2939 | 2931 |
| 2940 template <class Machine> | 2932 template <class Machine> |
| 2941 void InstX86AdjustStack<Machine>::emitIAS(const Cfg *Func) const { | 2933 void InstX86AdjustStack<Machine>::emitIAS(const Cfg *Func) const { |
| 2942 typename InstX86Base<Machine>::Traits::Assembler *Asm = | 2934 typename InstX86Base<Machine>::Traits::Assembler *Asm = |
| 2943 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); | 2935 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
| 2944 Asm->sub(IceType_i32, | 2936 if (Amount > 0) |
| 2945 InstX86Base<Machine>::Traits::RegisterSet::Encoded_Reg_esp, | 2937 Asm->sub(IceType_i32, |
| 2946 Immediate(Amount)); | 2938 InstX86Base<Machine>::Traits::RegisterSet::Encoded_Reg_esp, |
| 2939 Immediate(Amount)); |
| 2940 else |
| 2941 Asm->add(IceType_i32, |
| 2942 InstX86Base<Machine>::Traits::RegisterSet::Encoded_Reg_esp, |
| 2943 Immediate(-Amount)); |
| 2947 auto *Target = InstX86Base<Machine>::getTarget(Func); | 2944 auto *Target = InstX86Base<Machine>::getTarget(Func); |
| 2948 Target->updateStackAdjustment(Amount); | 2945 Target->updateStackAdjustment(Amount); |
| 2949 } | 2946 } |
| 2950 | 2947 |
| 2951 template <class Machine> | 2948 template <class Machine> |
| 2952 void InstX86AdjustStack<Machine>::dump(const Cfg *Func) const { | 2949 void InstX86AdjustStack<Machine>::dump(const Cfg *Func) const { |
| 2953 if (!BuildDefs::dump()) | 2950 if (!BuildDefs::dump()) |
| 2954 return; | 2951 return; |
| 2955 Ostream &Str = Func->getContext()->getStrDump(); | 2952 Ostream &Str = Func->getContext()->getStrDump(); |
| 2956 Str << "esp = sub.i32 esp, " << Amount; | 2953 if (Amount > 0) |
| 2954 Str << "esp = sub.i32 esp, " << Amount; |
| 2955 else |
| 2956 Str << "esp = add.i32 esp, " << -Amount; |
| 2957 } | 2957 } |
| 2958 | 2958 |
| 2959 template <class Machine> | 2959 template <class Machine> |
| 2960 void InstX86Push<Machine>::emit(const Cfg *Func) const { | 2960 void InstX86Push<Machine>::emit(const Cfg *Func) const { |
| 2961 if (!BuildDefs::dump()) | 2961 if (!BuildDefs::dump()) |
| 2962 return; | 2962 return; |
| 2963 Ostream &Str = Func->getContext()->getStrEmit(); | 2963 Ostream &Str = Func->getContext()->getStrEmit(); |
| 2964 assert(this->getSrcSize() == 1); | 2964 assert(this->getSrcSize() == 1); |
| 2965 // Push is currently only used for saving GPRs. | 2965 // Push is currently only used for saving GPRs. |
| 2966 const auto *Var = llvm::cast<Variable>(this->getSrc(0)); | 2966 const auto *Var = llvm::cast<Variable>(this->getSrc(0)); |
| (...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3244 return; | 3244 return; |
| 3245 Ostream &Str = Func->getContext()->getStrDump(); | 3245 Ostream &Str = Func->getContext()->getStrDump(); |
| 3246 Str << "IACA_END"; | 3246 Str << "IACA_END"; |
| 3247 } | 3247 } |
| 3248 | 3248 |
| 3249 } // end of namespace X86Internal | 3249 } // end of namespace X86Internal |
| 3250 | 3250 |
| 3251 } // end of namespace Ice | 3251 } // end of namespace Ice |
| 3252 | 3252 |
| 3253 #endif // SUBZERO_SRC_ICEINSTX86BASEIMPL_H | 3253 #endif // SUBZERO_SRC_ICEINSTX86BASEIMPL_H |
| OLD | NEW |