[llvm-commits] [llvm] r78025 - in /llvm/trunk/lib/Target/ARM: ARMISelLowering.cpp ARMISelLowering.h ARMInstrNEON.td

Evan Cheng evan.cheng at apple.com
Mon Aug 3 18:21:12 PDT 2009


On Aug 3, 2009, at 5:36 PM, Bob Wilson wrote:

>
>
> +static SDValue LowerNeonVLDIntrinsic(SDValue Op, SelectionDAG &DAG,
> +                                     unsigned Opcode, unsigned  
> NumVecs) {
> +  SDNode *Node = Op.getNode();
> +  MVT VT = Node->getValueType(0);
> +  DebugLoc dl = Op.getDebugLoc();
> +
> +  if (!VT.is64BitVector())
> +    return SDValue(); // unimplemented
> +
> +  SDValue Ops[] = { Node->getOperand(0),
> +                    Node->getOperand(1) };
> +  SDVTList Tys = DAG.getVTList(MVT::Other, MVT::Flag);
> +  SDValue Result = DAG.getNode(Opcode, dl, Tys, Ops, 2);
> +
> +  static const unsigned VLDRegs[] = {
> +    ARM::D0, ARM::D1, ARM::D2, ARM::D3
> +  };

Is this a temporary solution? Perhaps we want to do a post-isel pre- 
allocation pass to be a little bit smarter about what registers to pre- 
allocate to?

Evan

> +
> +  SmallVector<SDValue, 4> ResultVals;
> +  SDValue Chain = Result.getValue(0);
> +  SDValue Flag = Result.getValue(1);
> +  for (unsigned N = 0; N < NumVecs; ++N) {
> +    Chain = DAG.getCopyFromReg(Chain, dl, VLDRegs[N], VT,  
> Flag).getValue(1);
> +    ResultVals.push_back(Chain.getValue(0));
> +    Flag = Chain.getValue(2);
> +  }
> +  ResultVals.push_back(Chain);
> +  return DAG.getNode(ISD::MERGE_VALUES, dl, Node->getVTList(),
> +                     ResultVals.data(), NumVecs + 1);
> +}
> +
> +SDValue
> +ARMTargetLowering::LowerINTRINSIC_W_CHAIN(SDValue Op, SelectionDAG  
> &DAG) {
> +  unsigned IntNo = cast<ConstantSDNode>(Op.getOperand(1))- 
> >getZExtValue();
> +  switch (IntNo) {
> +  case Intrinsic::arm_neon_vld2i:
> +  case Intrinsic::arm_neon_vld2f:
> +    return LowerNeonVLDIntrinsic(Op, DAG, ARMISD::VLD2D, 2);
> +  case Intrinsic::arm_neon_vld3i:
> +  case Intrinsic::arm_neon_vld3f:
> +    return LowerNeonVLDIntrinsic(Op, DAG, ARMISD::VLD3D, 3);
> +  case Intrinsic::arm_neon_vld4i:
> +  case Intrinsic::arm_neon_vld4f:
> +    return LowerNeonVLDIntrinsic(Op, DAG, ARMISD::VLD4D, 4);
> +  case Intrinsic::arm_neon_vst2i:
> +  case Intrinsic::arm_neon_vst2f:
> +  case Intrinsic::arm_neon_vst3i:
> +  case Intrinsic::arm_neon_vst3f:
> +  case Intrinsic::arm_neon_vst4i:
> +  case Intrinsic::arm_neon_vst4f:
> +  default: return SDValue();    // Don't custom lower most  
> intrinsics.
> +  }
> +}
> +
> SDValue
> ARMTargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG  
> &DAG) {
>   unsigned IntNo = cast<ConstantSDNode>(Op.getOperand(0))- 
> >getZExtValue();
> @@ -2354,6 +2412,7 @@
>   case ISD::RETURNADDR:    break;
>   case ISD::FRAMEADDR:     return LowerFRAMEADDR(Op, DAG);
>   case ISD::GLOBAL_OFFSET_TABLE: return LowerGLOBAL_OFFSET_TABLE(Op,  
> DAG);
> +  case ISD::INTRINSIC_W_CHAIN: return LowerINTRINSIC_W_CHAIN(Op,  
> DAG);
>   case ISD::INTRINSIC_WO_CHAIN: return LowerINTRINSIC_WO_CHAIN(Op,  
> DAG);
>   case ISD::BIT_CONVERT:   return ExpandBIT_CONVERT(Op.getNode(),  
> DAG);
>   case ISD::SHL:
>
> Modified: llvm/trunk/lib/Target/ARM/ARMISelLowering.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMISelLowering.h?rev=78025&r1=78024&r2=78025&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm/trunk/lib/Target/ARM/ARMISelLowering.h (original)
> +++ llvm/trunk/lib/Target/ARM/ARMISelLowering.h Mon Aug  3 19:36:16  
> 2009
> @@ -114,7 +114,12 @@
>       VGETLANEs,    // sign-extend vector extract element
>
>       // Vector duplicate lane (128-bit result only; 64-bit is a  
> shuffle)
> -      VDUPLANEQ     // splat a lane from a 64-bit vector to a 128- 
> bit vector
> +      VDUPLANEQ,    // splat a lane from a 64-bit vector to a 128- 
> bit vector
> +
> +      // Vector load/store with (de)interleaving
> +      VLD2D,
> +      VLD3D,
> +      VLD4D
>     };
>   }
>
> @@ -237,6 +242,7 @@
>     SDNode *LowerCallResult(SDValue Chain, SDValue InFlag,  
> CallSDNode *TheCall,
>                             unsigned CallingConv, SelectionDAG &DAG);
>     SDValue LowerCALL(SDValue Op, SelectionDAG &DAG);
> +    SDValue LowerINTRINSIC_W_CHAIN(SDValue Op, SelectionDAG &DAG);
>     SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG);
>     SDValue LowerRET(SDValue Op, SelectionDAG &DAG);
>     SDValue LowerGlobalAddressDarwin(SDValue Op, SelectionDAG &DAG);
>
> Modified: llvm/trunk/lib/Target/ARM/ARMInstrNEON.td
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrNEON.td?rev=78025&r1=78024&r2=78025&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm/trunk/lib/Target/ARM/ARMInstrNEON.td (original)
> +++ llvm/trunk/lib/Target/ARM/ARMInstrNEON.td Mon Aug  3 19:36:16 2009
> @@ -68,6 +68,14 @@
> def NEONvduplaneq : SDNode<"ARMISD::VDUPLANEQ",
>                            SDTypeProfile<1, 2, [SDTCisVT<2, i32>]>>;
>
> +def SDTARMVLD     : SDTypeProfile<0, 1, [SDTCisPtrTy<0>]>;
> +def NEONvld2d     : SDNode<"ARMISD::VLD2D", SDTARMVLD,
> +                           [SDNPHasChain, SDNPOutFlag, SDNPMayLoad]>;
> +def NEONvld3d     : SDNode<"ARMISD::VLD3D", SDTARMVLD,
> +                           [SDNPHasChain, SDNPOutFlag, SDNPMayLoad]>;
> +def NEONvld4d     : SDNode<"ARMISD::VLD4D", SDTARMVLD,
> +                           [SDNPHasChain, SDNPOutFlag, SDNPMayLoad]>;
> +
> // 
> = 
> = 
> = 
> ----------------------------------------------------------------------= 
> ==//
> // NEON operand definitions
> // 
> = 
> = 
> = 
> ----------------------------------------------------------------------= 
> ==//
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits




More information about the llvm-commits mailing list