From 28a9e9b230d25b477d181828dd08ccb4f1724b0b Mon Sep 17 00:00:00 2001 From: Evan Cheng Date: Wed, 29 Nov 2006 08:28:13 +0000 Subject: [PATCH] Custom lower READCYCLECOUNTER for x86-64. llvm-svn: 32017 --- llvm/lib/Target/X86/X86ISelLowering.cpp | 26 +++++++++++++++++++------ llvm/lib/Target/X86/X86InstrInfo.td | 8 ++------ 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 1e5b1759a5bc..23ed5df0a01b 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -4728,12 +4728,26 @@ X86TargetLowering::LowerREADCYCLCECOUNTER(SDOperand Op, SelectionDAG &DAG) { Ops.push_back(Op.getOperand(0)); SDOperand rd = DAG.getNode(X86ISD::RDTSC_DAG, Tys, &Ops[0], Ops.size()); Ops.clear(); - Ops.push_back(DAG.getCopyFromReg(rd, X86::EAX, MVT::i32, rd.getValue(1))); - Ops.push_back(DAG.getCopyFromReg(Ops[0].getValue(1), X86::EDX, - MVT::i32, Ops[0].getValue(2))); - Ops.push_back(Ops[1].getValue(1)); - Tys[0] = Tys[1] = MVT::i32; - Tys.push_back(MVT::Other); + if (Subtarget->is64Bit()) { + SDOperand Copy1 = DAG.getCopyFromReg(rd, X86::RAX, MVT::i64, rd.getValue(1)); + SDOperand Copy2 = DAG.getCopyFromReg(Copy1.getValue(1), X86::RDX, + MVT::i64, Copy1.getValue(2)); + SDOperand Tmp = DAG.getNode(ISD::SHL, MVT::i64, Copy2, + DAG.getConstant(32, MVT::i8)); + Ops.push_back(DAG.getNode(ISD::OR, MVT::i64, Copy1, Tmp)); + Ops.push_back(Copy2.getValue(1)); + Tys[0] = MVT::i64; + Tys[1] = MVT::Other; + } else { + SDOperand Copy1 = DAG.getCopyFromReg(rd, X86::EAX, MVT::i32, rd.getValue(1)); + SDOperand Copy2 = DAG.getCopyFromReg(Copy1.getValue(1), X86::EDX, + MVT::i32, Copy1.getValue(2)); + Ops.push_back(Copy1); + Ops.push_back(Copy2); + Ops.push_back(Copy2.getValue(1)); + Tys[0] = Tys[1] = MVT::i32; + Tys.push_back(MVT::Other); + } return DAG.getNode(ISD::MERGE_VALUES, Tys, &Ops[0], Ops.size()); } diff --git a/llvm/lib/Target/X86/X86InstrInfo.td b/llvm/lib/Target/X86/X86InstrInfo.td index b93d2f7c147a..f50553c077af 100644 --- a/llvm/lib/Target/X86/X86InstrInfo.td +++ b/llvm/lib/Target/X86/X86InstrInfo.td @@ -536,6 +536,8 @@ def REP_STOSD : I<0xAB, RawFrm, (ops), "{rep;stosl|rep stosd}", [(X86rep_stos i32)]>, Imp<[EAX,ECX,EDI], [ECX,EDI]>, REP; +def RDTSC : I<0x31, RawFrm, (ops), "rdtsc", [(X86rdtsc)]>, + TB, Imp<[],[RAX,RDX]>; //===----------------------------------------------------------------------===// // Input/Output Instructions... @@ -2397,12 +2399,6 @@ def CWD : I<0x99, RawFrm, (ops), def CDQ : I<0x99, RawFrm, (ops), "{cltd|cdq}", []>, Imp<[EAX],[EAX,EDX]>; // EDX:EAX = signext(EAX) -//===----------------------------------------------------------------------===// -// Miscellaneous Instructions -//===----------------------------------------------------------------------===// - -def RDTSC : I<0x31, RawFrm, (ops), "rdtsc", [(X86rdtsc)]>, - TB, Imp<[],[EAX,EDX]>; //===----------------------------------------------------------------------===// // Alias Instructions