diff options
| author | Akira Hatanaka <ahatanak@gmail.com> | 2011-07-19 23:30:50 +0000 | 
|---|---|---|
| committer | Akira Hatanaka <ahatanak@gmail.com> | 2011-07-19 23:30:50 +0000 | 
| commit | db54826f20c6cbcb9b195c4b49c946d6488156dd (patch) | |
| tree | 22c9baff4f7abcbbf2bcd0c6e28900e19ac57762 /lib | |
| parent | 70955c2d12bd64dbb2faa626ea8fe18abb621e1c (diff) | |
| download | external_llvm-db54826f20c6cbcb9b195c4b49c946d6488156dd.zip external_llvm-db54826f20c6cbcb9b195c4b49c946d6488156dd.tar.gz external_llvm-db54826f20c6cbcb9b195c4b49c946d6488156dd.tar.bz2  | |
Lower memory barriers to sync instructions.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@135537 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/Target/Mips/MipsISelLowering.cpp | 13 | ||||
| -rw-r--r-- | lib/Target/Mips/MipsISelLowering.h | 5 | ||||
| -rw-r--r-- | lib/Target/Mips/MipsInstrInfo.td | 12 | 
3 files changed, 28 insertions, 2 deletions
diff --git a/lib/Target/Mips/MipsISelLowering.cpp b/lib/Target/Mips/MipsISelLowering.cpp index bb67cb9..106d923 100644 --- a/lib/Target/Mips/MipsISelLowering.cpp +++ b/lib/Target/Mips/MipsISelLowering.cpp @@ -61,6 +61,7 @@ const char *MipsTargetLowering::getTargetNodeName(unsigned Opcode) const {    case MipsISD::ExtractElementF64: return "MipsISD::ExtractElementF64";    case MipsISD::WrapperPIC:        return "MipsISD::WrapperPIC";    case MipsISD::DynAlloc:          return "MipsISD::DynAlloc"; +  case MipsISD::Sync:              return "MipsISD::Sync";    default:                         return NULL;    }  } @@ -159,7 +160,7 @@ MipsTargetLowering(MipsTargetMachine &TM)    // Use the default for now    setOperationAction(ISD::STACKSAVE,         MVT::Other, Expand);    setOperationAction(ISD::STACKRESTORE,      MVT::Other, Expand); -  setOperationAction(ISD::MEMBARRIER,        MVT::Other, Expand); +  setOperationAction(ISD::MEMBARRIER,        MVT::Other, Custom);    if (Subtarget->isSingleFloat())      setOperationAction(ISD::SELECT_CC, MVT::f64, Expand); @@ -527,6 +528,7 @@ LowerOperation(SDValue Op, SelectionDAG &DAG) const      case ISD::VASTART:            return LowerVASTART(Op, DAG);      case ISD::FCOPYSIGN:          return LowerFCOPYSIGN(Op, DAG);      case ISD::FRAMEADDR:          return LowerFRAMEADDR(Op, DAG); +    case ISD::MEMBARRIER:         return LowerMEMBARRIER(Op, DAG);    }    return SDValue();  } @@ -1525,6 +1527,15 @@ LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const {    return FrameAddr;  } +// TODO: set SType according to the desired memory barrier behavior. +SDValue MipsTargetLowering::LowerMEMBARRIER(SDValue Op, +                                            SelectionDAG& DAG) const { +  unsigned SType = 0; +  DebugLoc dl = Op.getDebugLoc(); +  return DAG.getNode(MipsISD::Sync, dl, MVT::Other, Op.getOperand(0), +                     DAG.getConstant(SType, MVT::i32)); +} +  //===----------------------------------------------------------------------===//  //                      Calling Convention Implementation  //===----------------------------------------------------------------------===// diff --git a/lib/Target/Mips/MipsISelLowering.h b/lib/Target/Mips/MipsISelLowering.h index bda26a2..e030435 100644 --- a/lib/Target/Mips/MipsISelLowering.h +++ b/lib/Target/Mips/MipsISelLowering.h @@ -81,7 +81,9 @@ namespace llvm {        WrapperPIC, -      DynAlloc +      DynAlloc, + +      Sync      };    } @@ -128,6 +130,7 @@ namespace llvm {      SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) const;      SDValue LowerFCOPYSIGN(SDValue Op, SelectionDAG &DAG) const;      SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const; +    SDValue LowerMEMBARRIER(SDValue Op, SelectionDAG& DAG) const;      virtual SDValue        LowerFormalArguments(SDValue Chain, diff --git a/lib/Target/Mips/MipsInstrInfo.td b/lib/Target/Mips/MipsInstrInfo.td index 72265d0..57867b5 100644 --- a/lib/Target/Mips/MipsInstrInfo.td +++ b/lib/Target/Mips/MipsInstrInfo.td @@ -41,6 +41,7 @@ def SDT_MipsThreadPointer : SDTypeProfile<1, 0, [SDTCisPtrTy<0>]>;  def SDT_MipsDynAlloc    : SDTypeProfile<1, 1, [SDTCisVT<0, i32>,                                                 SDTCisVT<1, iPTR>]>; +def SDT_Sync             : SDTypeProfile<0, 1, [SDTCisVT<0, i32>]>;  // Call  def MipsJmpLink : SDNode<"MipsISD::JmpLink",SDT_MipsJmpLink, @@ -106,6 +107,8 @@ def MipsWrapperPIC    : SDNode<"MipsISD::WrapperPIC",  SDTIntUnaryOp>;  def MipsDynAlloc  : SDNode<"MipsISD::DynAlloc", SDT_MipsDynAlloc,                             [SDNPHasChain, SDNPInGlue]>; +def MipsSync : SDNode<"MipsISD::Sync", SDT_Sync, [SDNPHasChain]>; +  //===----------------------------------------------------------------------===//  // Mips Instruction Predicate Definitions.  //===----------------------------------------------------------------------===// @@ -589,6 +592,15 @@ def SB      : StoreM<0x28, "sb", truncstorei8>;  def SH      : StoreM<0x29, "sh", truncstorei16>;  def SW      : StoreM<0x2b, "sw", store>; +let hasSideEffects = 1 in +def SYNC : MipsInst<(outs), (ins i32imm:$stype), "sync $stype", +                    [(MipsSync imm:$stype)], NoItinerary> +{ +  let opcode = 0; +  let Inst{25-11} = 0; +  let Inst{5-0} = 15; +} +  /// Load-linked, Store-conditional  let mayLoad = 1, hasDelaySlot = 1 in    def LL    : FI<0x30, (outs CPURegs:$dst), (ins mem:$addr),  | 
