[llvm-commits] [llvm] r111083 - in /llvm/trunk/lib/Target/X86: X86ISelLowering.cpp X86InstrInfo.td
Eric Christopher
echristo at apple.com
Sat Aug 14 14:51:50 PDT 2010
Author: echristo
Date: Sat Aug 14 16:51:50 2010
New Revision: 111083
URL: http://llvm.org/viewvc/llvm-project?rev=111083&view=rev
Log:
Rework how the non-sse2 memory barrier is lowered so that the
encoding is correct for the built-in assembler.
Based on a patch from Chris.
Modified:
llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
llvm/trunk/lib/Target/X86/X86InstrInfo.td
Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=111083&r1=111082&r2=111083&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp (original)
+++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Sat Aug 14 16:51:50 2010
@@ -7706,10 +7706,22 @@
DebugLoc dl = Op.getDebugLoc();
if (!Subtarget->hasSSE2()) {
- SDValue Zero = DAG.getConstant(0,
+ SDValue Chain = Op.getOperand(0);
+ SDValue Zero = DAG.getConstant(0,
Subtarget->is64Bit() ? MVT::i64 : MVT::i32);
- return DAG.getNode(X86ISD::MEMBARRIER, dl, MVT::Other, Op.getOperand(0),
- Zero);
+ SDValue Ops[] = {
+ DAG.getRegister(X86::ESP, MVT::i32), // Base
+ DAG.getTargetConstant(1, MVT::i8), // Scale
+ DAG.getRegister(0, MVT::i32), // Index
+ DAG.getTargetConstant(0, MVT::i32), // Disp
+ DAG.getRegister(0, MVT::i32), // Segment.
+ Zero,
+ Chain
+ };
+ SDNode *Res =
+ DAG.getMachineNode(X86::OR32mrLocked, dl, MVT::Other, Ops,
+ array_lengthof(Ops));
+ return SDValue(Res, 0);
}
unsigned isDev = cast<ConstantSDNode>(Op.getOperand(5))->getZExtValue();
Modified: llvm/trunk/lib/Target/X86/X86InstrInfo.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86InstrInfo.td?rev=111083&r1=111082&r2=111083&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/X86InstrInfo.td (original)
+++ llvm/trunk/lib/Target/X86/X86InstrInfo.td Sat Aug 14 16:51:50 2010
@@ -3928,18 +3928,17 @@
//
// Memory barriers
+
+// TODO: Get this to fold the constant into the instruction.
+def OR32mrLocked : I<0x09, MRMDestMem, (outs), (ins i32mem:$dst, GR32:$zero),
+ "lock\n\t"
+ "or{l}\t{$zero, $dst|$dst, $zero}",
+ []>, Requires<[In32BitMode]>, LOCK;
+
let hasSideEffects = 1 in {
def Int_MemBarrier : I<0, Pseudo, (outs), (ins),
"#MEMBARRIER",
[(X86MemBarrier)]>, Requires<[HasSSE2]>;
-
-// TODO: Get this to fold the constant into the instruction.
-let Defs = [ESP] in
-def Int_MemBarrierNoSSE : I<0x09, MRM1r, (outs), (ins GR32:$zero),
- "lock\n\t"
- "or{l}\t{$zero, (%esp)|(%esp), $zero}",
- [(X86MemBarrierNoSSE GR32:$zero)]>,
- Requires<[In32BitMode]>, LOCK;
}
// Atomic swap. These are just normal xchg instructions. But since a memory
More information about the llvm-commits
mailing list