diff options
-rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 61 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.h | 6 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86InstrInfo.td | 9 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86InstrSystem.td | 13 | ||||
-rw-r--r-- | llvm/test/CodeGen/X86/pku.ll | 4 |
5 files changed, 39 insertions, 54 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 99cf13262f3..b17d7276e0b 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -23035,6 +23035,22 @@ static SDValue LowerINTRINSIC_W_CHAIN(SDValue Op, const X86Subtarget &Subtarget, return MarkEHRegistrationNode(Op, DAG); case llvm::Intrinsic::x86_seh_ehguard: return MarkEHGuard(Op, DAG); + case llvm::Intrinsic::x86_rdpkru: { + SDLoc dl(Op); + SDVTList VTs = DAG.getVTList(MVT::i32, MVT::Other); + // Create a RDPKRU node and pass 0 to the ECX parameter. + return DAG.getNode(X86ISD::RDPKRU, dl, VTs, Op.getOperand(0), + DAG.getConstant(0, dl, MVT::i32)); + } + case llvm::Intrinsic::x86_wrpkru: { + SDLoc dl(Op); + // Create a WRPKRU node, pass the input to the EAX parameter, and pass 0 + // to the EDX and ECX parameters. + return DAG.getNode(X86ISD::WRPKRU, dl, MVT::Other, + Op.getOperand(0), Op.getOperand(2), + DAG.getConstant(0, dl, MVT::i32), + DAG.getConstant(0, dl, MVT::i32)); + } case llvm::Intrinsic::x86_flags_read_u32: case llvm::Intrinsic::x86_flags_read_u64: case llvm::Intrinsic::x86_flags_write_u32: @@ -27808,6 +27824,8 @@ const char *X86TargetLowering::getTargetNodeName(unsigned Opcode) const { case X86ISD::SAHF: return "X86ISD::SAHF"; case X86ISD::RDRAND: return "X86ISD::RDRAND"; case X86ISD::RDSEED: return "X86ISD::RDSEED"; + case X86ISD::RDPKRU: return "X86ISD::RDPKRU"; + case X86ISD::WRPKRU: return "X86ISD::WRPKRU"; case X86ISD::VPMADDUBSW: return "X86ISD::VPMADDUBSW"; case X86ISD::VPMADDWD: return "X86ISD::VPMADDWD"; case X86ISD::VPSHA: return "X86ISD::VPSHA"; @@ -28268,44 +28286,6 @@ static MachineBasicBlock *emitXBegin(MachineInstr &MI, MachineBasicBlock *MBB, return sinkMBB; } -static MachineBasicBlock *emitWRPKRU(MachineInstr &MI, MachineBasicBlock *BB, - const X86Subtarget &Subtarget) { - DebugLoc dl = MI.getDebugLoc(); - const TargetInstrInfo *TII = Subtarget.getInstrInfo(); - - // insert input VAL into EAX - BuildMI(*BB, MI, dl, TII->get(TargetOpcode::COPY), X86::EAX) - .addReg(MI.getOperand(0).getReg()); - // insert zero to ECX - BuildMI(*BB, MI, dl, TII->get(X86::MOV32r0), X86::ECX); - - // insert zero to EDX - BuildMI(*BB, MI, dl, TII->get(X86::MOV32r0), X86::EDX); - - // insert WRPKRU instruction - BuildMI(*BB, MI, dl, TII->get(X86::WRPKRUr)); - - MI.eraseFromParent(); // The pseudo is gone now. - return BB; -} - -static MachineBasicBlock *emitRDPKRU(MachineInstr &MI, MachineBasicBlock *BB, - const X86Subtarget &Subtarget) { - DebugLoc dl = MI.getDebugLoc(); - const TargetInstrInfo *TII = Subtarget.getInstrInfo(); - - // insert zero to ECX - BuildMI(*BB, MI, dl, TII->get(X86::MOV32r0), X86::ECX); - - // insert RDPKRU instruction - BuildMI(*BB, MI, dl, TII->get(X86::RDPKRUr)); - BuildMI(*BB, MI, dl, TII->get(TargetOpcode::COPY), MI.getOperand(0).getReg()) - .addReg(X86::EAX); - - MI.eraseFromParent(); // The pseudo is gone now. - return BB; -} - MachineBasicBlock * @@ -30418,11 +30398,6 @@ X86TargetLowering::EmitInstrWithCustomInserter(MachineInstr &MI, return BB; } - // PKU feature - case X86::WRPKRU: - return emitWRPKRU(MI, BB, Subtarget); - case X86::RDPKRU: - return emitRDPKRU(MI, BB, Subtarget); // xbegin case X86::XBEGIN: return emitXBegin(MI, BB, Subtarget.getInstrInfo()); diff --git a/llvm/lib/Target/X86/X86ISelLowering.h b/llvm/lib/Target/X86/X86ISelLowering.h index 0f7065b3503..7042a2981ec 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.h +++ b/llvm/lib/Target/X86/X86ISelLowering.h @@ -538,6 +538,12 @@ namespace llvm { // indicate whether it is valid in CF. RDSEED, + // Protection keys + // RDPKRU - Operand 0 is chain. Operand 1 is value for ECX. + // WRPKRU - Operand 0 is chain. Operand 1 is value for EDX. Operand 2 is + // value for ECX. + RDPKRU, WRPKRU, + // SSE42 string comparisons. // These nodes produce 3 results, index, mask, and flags. X86ISelDAGToDAG // will emit one or two instructions based on which results are used. If diff --git a/llvm/lib/Target/X86/X86InstrInfo.td b/llvm/lib/Target/X86/X86InstrInfo.td index e399f8b862e..e07553f10d6 100644 --- a/llvm/lib/Target/X86/X86InstrInfo.td +++ b/llvm/lib/Target/X86/X86InstrInfo.td @@ -63,6 +63,10 @@ def SDTX86sahf : SDTypeProfile<1, 1, [SDTCisVT<0, i32>, SDTCisVT<1, i8>]>; def SDTX86rdrand : SDTypeProfile<2, 0, [SDTCisInt<0>, SDTCisVT<1, i32>]>; +def SDTX86rdpkru : SDTypeProfile<1, 1, [SDTCisVT<0, i32>, SDTCisVT<1, i32>]>; +def SDTX86wrpkru : SDTypeProfile<0, 3, [SDTCisVT<0, i32>, SDTCisVT<1, i32>, + SDTCisVT<2, i32>]>; + def SDTX86cas : SDTypeProfile<0, 3, [SDTCisPtrTy<0>, SDTCisInt<1>, SDTCisVT<2, i8>]>; def SDTX86caspair : SDTypeProfile<0, 1, [SDTCisPtrTy<0>]>; @@ -151,6 +155,11 @@ def X86rdrand : SDNode<"X86ISD::RDRAND", SDTX86rdrand, def X86rdseed : SDNode<"X86ISD::RDSEED", SDTX86rdrand, [SDNPHasChain, SDNPSideEffect]>; +def X86rdpkru : SDNode<"X86ISD::RDPKRU", SDTX86rdpkru, + [SDNPHasChain, SDNPSideEffect]>; +def X86wrpkru : SDNode<"X86ISD::WRPKRU", SDTX86wrpkru, + [SDNPHasChain, SDNPSideEffect]>; + def X86cas : SDNode<"X86ISD::LCMPXCHG_DAG", SDTX86cas, [SDNPHasChain, SDNPInGlue, SDNPOutGlue, SDNPMayStore, SDNPMayLoad, SDNPMemOperand]>; diff --git a/llvm/lib/Target/X86/X86InstrSystem.td b/llvm/lib/Target/X86/X86InstrSystem.td index e08c508e2c1..7050e191749 100644 --- a/llvm/lib/Target/X86/X86InstrSystem.td +++ b/llvm/lib/Target/X86/X86InstrSystem.td @@ -587,18 +587,13 @@ let Defs = [RAX, RDX, RSI], Uses = [RAX, RSI] in //==-----------------------------------------------------------------------===// // PKU - enable protection key -let usesCustomInserter = 1, hasNoSchedulingInfo = 1 in { - def WRPKRU : PseudoI<(outs), (ins GR32:$src), - [(int_x86_wrpkru GR32:$src)]>; - def RDPKRU : PseudoI<(outs GR32:$dst), (ins), - [(set GR32:$dst, (int_x86_rdpkru))]>; -} - let SchedRW = [WriteSystem] in { let Defs = [EAX, EDX], Uses = [ECX] in - def RDPKRUr : I<0x01, MRM_EE, (outs), (ins), "rdpkru", []>, TB; + def RDPKRUr : I<0x01, MRM_EE, (outs), (ins), "rdpkru", + [(set EAX, (X86rdpkru ECX)), (implicit EDX)]>, TB; let Uses = [EAX, ECX, EDX] in - def WRPKRUr : I<0x01, MRM_EF, (outs), (ins), "wrpkru", []>, TB; + def WRPKRUr : I<0x01, MRM_EF, (outs), (ins), "wrpkru", + [(X86wrpkru EAX, EDX, ECX)]>, TB; } // SchedRW //===----------------------------------------------------------------------===// diff --git a/llvm/test/CodeGen/X86/pku.ll b/llvm/test/CodeGen/X86/pku.ll index e5b47ecca26..b6b2f98e299 100644 --- a/llvm/test/CodeGen/X86/pku.ll +++ b/llvm/test/CodeGen/X86/pku.ll @@ -9,16 +9,16 @@ define void @test_x86_wrpkru(i32 %src) { ; X86-LABEL: test_x86_wrpkru: ; X86: ## %bb.0: ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax ## encoding: [0x8b,0x44,0x24,0x04] -; X86-NEXT: xorl %ecx, %ecx ## encoding: [0x31,0xc9] ; X86-NEXT: xorl %edx, %edx ## encoding: [0x31,0xd2] +; X86-NEXT: xorl %ecx, %ecx ## encoding: [0x31,0xc9] ; X86-NEXT: wrpkru ## encoding: [0x0f,0x01,0xef] ; X86-NEXT: retl ## encoding: [0xc3] ; ; X64-LABEL: test_x86_wrpkru: ; X64: ## %bb.0: ; X64-NEXT: movl %edi, %eax ## encoding: [0x89,0xf8] -; X64-NEXT: xorl %ecx, %ecx ## encoding: [0x31,0xc9] ; X64-NEXT: xorl %edx, %edx ## encoding: [0x31,0xd2] +; X64-NEXT: xorl %ecx, %ecx ## encoding: [0x31,0xc9] ; X64-NEXT: wrpkru ## encoding: [0x0f,0x01,0xef] ; X64-NEXT: retq ## encoding: [0xc3] call void @llvm.x86.wrpkru(i32 %src) |