summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew Lenharth <andrewl@lenharth.org>2005-11-20 21:41:10 +0000
committerAndrew Lenharth <andrewl@lenharth.org>2005-11-20 21:41:10 +0000
commit0bf68ae4348c35c209ffa978684a7297044130da (patch)
tree6c928e6081e6439fa18acb36cddf9c45923f4146
parent627cbd49b164b85aa38310e9bdd93c9e4369632f (diff)
downloadbcm5719-llvm-0bf68ae4348c35c209ffa978684a7297044130da.tar.gz
bcm5719-llvm-0bf68ae4348c35c209ffa978684a7297044130da.zip
The second patch of X86 support for read cycle counter.
llvm-svn: 24430
-rw-r--r--llvm/lib/Target/X86/X86ISelLowering.cpp7
-rw-r--r--llvm/lib/Target/X86/X86ISelLowering.h4
-rw-r--r--llvm/lib/Target/X86/X86ISelPattern.cpp5
-rw-r--r--llvm/lib/Target/X86/X86InstrInfo.td4
4 files changed, 20 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index e33bf956860..aa221fbda3d 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -101,6 +101,7 @@ X86TargetLowering::X86TargetLowering(TargetMachine &TM)
setOperationAction(ISD::CTPOP , MVT::i32 , Expand);
setOperationAction(ISD::CTTZ , MVT::i32 , Expand);
setOperationAction(ISD::CTLZ , MVT::i32 , Expand);
+ setOperationAction(ISD::READCYCLECOUNTER , MVT::i64 , Custom);
setOperationAction(ISD::READIO , MVT::i1 , Expand);
setOperationAction(ISD::READIO , MVT::i8 , Expand);
@@ -912,5 +913,11 @@ SDOperand X86TargetLowering::LowerOperation(SDOperand Op, SelectionDAG &DAG) {
return DAG.getLoad(Op.getValueType(), FIST, StackSlot,
DAG.getSrcValue(NULL));
}
+ case ISD::READCYCLECOUNTER: {
+ SDOperand rd = DAG.getNode(X86ISD::RDTSC_DAG, MVT::Other, Op.getOperand(0));
+ SDOperand Lo = DAG.getCopyFromReg(rd, X86::EAX, MVT::i32);
+ SDOperand Hi = DAG.getCopyFromReg(rd, X86::EDX, MVT::i32);
+ return DAG.getNode(ISD::BUILD_PAIR, MVT::i64, Lo, Hi);
+ }
}
}
diff --git a/llvm/lib/Target/X86/X86ISelLowering.h b/llvm/lib/Target/X86/X86ISelLowering.h
index b4468ac8a33..ccec6ea23f7 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.h
+++ b/llvm/lib/Target/X86/X86ISelLowering.h
@@ -62,6 +62,10 @@ namespace llvm {
/// LLVM.
CALL,
TAILCALL,
+
+ /// RDTSC_DAG - This operation implements the lowering for
+ /// readcyclecounter
+ RDTSC_DAG,
};
}
diff --git a/llvm/lib/Target/X86/X86ISelPattern.cpp b/llvm/lib/Target/X86/X86ISelPattern.cpp
index 58c60692b9d..5c4594aa9ec 100644
--- a/llvm/lib/Target/X86/X86ISelPattern.cpp
+++ b/llvm/lib/Target/X86/X86ISelPattern.cpp
@@ -3090,6 +3090,11 @@ void ISel::Select(SDOperand N) {
default:
Node->dump(); std::cerr << "\n";
assert(0 && "Node not handled yet!");
+ case X86ISD::RDTSC_DAG:
+ Select(Node->getOperand(0)); //Chain
+ BuildMI(BB, X86::RDTSC, 0);
+ return;
+
case ISD::EntryToken: return; // Noop
case ISD::TokenFactor:
if (Node->getNumOperands() == 2) {
diff --git a/llvm/lib/Target/X86/X86InstrInfo.td b/llvm/lib/Target/X86/X86InstrInfo.td
index 40b2481ab4a..0eaf337fd4f 100644
--- a/llvm/lib/Target/X86/X86InstrInfo.td
+++ b/llvm/lib/Target/X86/X86InstrInfo.td
@@ -167,6 +167,10 @@ class Ii32<bits<8> o, Format f, dag ops, string asm, list<dag> pattern>
def PHI : I<0, Pseudo, (ops variable_ops), "PHINODE">; // PHI node.
def NOOP : I<0x90, RawFrm, (ops), "nop">; // nop
+//FIXME: encode this correctly
+let Defs = [EAX, EDX] in
+ def RDTSC : I<0, Pseudo, (ops ), "rdtsc">; //in binary, this inst is 0x0f 0x31
+
def ADJCALLSTACKDOWN : I<0, Pseudo, (ops i32imm:$amt), "#ADJCALLSTACKDOWN">;
def ADJCALLSTACKUP : I<0, Pseudo, (ops i32imm:$amt1, i32imm:$amt2),
"#ADJCALLSTACKUP">;
OpenPOWER on IntegriCloud