diff options
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Target/CellSPU/SPUISelDAGToDAG.cpp | 70 | ||||
| -rw-r--r-- | llvm/lib/Target/CellSPU/SPUInstrInfo.td | 4 | ||||
| -rw-r--r-- | llvm/test/CodeGen/CellSPU/arg_ret.ll | 1 | 
3 files changed, 8 insertions, 67 deletions
diff --git a/llvm/lib/Target/CellSPU/SPUISelDAGToDAG.cpp b/llvm/lib/Target/CellSPU/SPUISelDAGToDAG.cpp index d03cf6caf38..d389842b785 100644 --- a/llvm/lib/Target/CellSPU/SPUISelDAGToDAG.cpp +++ b/llvm/lib/Target/CellSPU/SPUISelDAGToDAG.cpp @@ -111,55 +111,6 @@ namespace {      return false;    } -  //===------------------------------------------------------------------===// -  //! EVT to "useful stuff" mapping structure: - -  struct valtype_map_s { -    EVT VT; -    unsigned ldresult_ins;      /// LDRESULT instruction (0 = undefined) -    bool ldresult_imm;          /// LDRESULT instruction requires immediate? -    unsigned lrinst;            /// LR instruction -  }; - -  const valtype_map_s valtype_map[] = { -    { MVT::i8,    SPU::ORBIr8,  true,  SPU::LRr8 }, -    { MVT::i16,   SPU::ORHIr16, true,  SPU::LRr16 }, -    { MVT::i32,   SPU::ORIr32,  true,  SPU::LRr32 }, -    { MVT::i64,   SPU::ORr64,   false, SPU::LRr64 }, -    { MVT::f32,   SPU::ORf32,   false, SPU::LRf32 }, -    { MVT::f64,   SPU::ORf64,   false, SPU::LRf64 }, -    // vector types... (sigh!) -    { MVT::v16i8, 0,            false, SPU::LRv16i8 }, -    { MVT::v8i16, 0,            false, SPU::LRv8i16 }, -    { MVT::v4i32, 0,            false, SPU::LRv4i32 }, -    { MVT::v2i64, 0,            false, SPU::LRv2i64 }, -    { MVT::v4f32, 0,            false, SPU::LRv4f32 }, -    { MVT::v2f64, 0,            false, SPU::LRv2f64 } -  }; - -  const size_t n_valtype_map = sizeof(valtype_map) / sizeof(valtype_map[0]); - -  const valtype_map_s *getValueTypeMapEntry(EVT VT) -  { -    const valtype_map_s *retval = 0; -    for (size_t i = 0; i < n_valtype_map; ++i) { -      if (valtype_map[i].VT == VT) { -        retval = valtype_map + i; -        break; -      } -    } - - -#ifndef NDEBUG -    if (retval == 0) { -      report_fatal_error("SPUISelDAGToDAG.cpp: getValueTypeMapEntry returns" -                         "NULL for " + Twine(VT.getEVTString())); -    } -#endif - -    return retval; -  } -    //! Generate the carry-generate shuffle mask.    SDValue getCarryGenerateShufMask(SelectionDAG &DAG, DebugLoc dl) {      SmallVector<SDValue, 16 > ShufBytes; @@ -882,23 +833,12 @@ SPUDAGToDAGISel::Select(SDNode *N) {      SDValue Arg = N->getOperand(0);      SDValue Chain = N->getOperand(1);      SDNode *Result; -    const valtype_map_s *vtm = getValueTypeMapEntry(VT); - -    if (vtm->ldresult_ins == 0) { -      report_fatal_error("LDRESULT for unsupported type: " + -                         Twine(VT.getEVTString())); -    } - -    Opc = vtm->ldresult_ins; -    if (vtm->ldresult_imm) { -      SDValue Zero = CurDAG->getTargetConstant(0, VT); - -      Result = CurDAG->getMachineNode(Opc, dl, VT, MVT::Other, Arg, Zero, Chain); -    } else { -      Result = CurDAG->getMachineNode(Opc, dl, VT, MVT::Other, Arg, Arg, Chain); -    } - +    +    Result = CurDAG->getMachineNode(TargetOpcode::COPY_TO_REGCLASS, dl, VT, +                                    MVT::Other, Arg, +                                    getRC( VT.getSimpleVT()), Chain);      return Result; +         } else if (Opc == SPUISD::IndirectAddr) {      // Look at the operands: SelectCode() will catch the cases that aren't      // specifically handled here. diff --git a/llvm/lib/Target/CellSPU/SPUInstrInfo.td b/llvm/lib/Target/CellSPU/SPUInstrInfo.td index f671a3cfe46..ff327eb09e2 100644 --- a/llvm/lib/Target/CellSPU/SPUInstrInfo.td +++ b/llvm/lib/Target/CellSPU/SPUInstrInfo.td @@ -4355,7 +4355,7 @@ def : Pat<(i16 (anyext R8C:$rSrc)),  // anyext 8->32: Extend 8->32 bits, irrespective of sign, preserves high bits  def : Pat<(i32 (anyext R8C:$rSrc)), -          (ORIi8i32 R8C:$rSrc, 0)>; +          (COPY_TO_REGCLASS R8C:$rSrc, R32C)>;  // sext 16->64: Sign extend halfword to double word  def : Pat<(sext_inreg R64C:$rSrc, i16), @@ -4379,7 +4379,7 @@ def : Pat<(i32 (zext (and R16C:$rSrc, 0xfff))),  // anyext 16->32: Extend 16->32 bits, irrespective of sign  def : Pat<(i32 (anyext R16C:$rSrc)), -          (ORIi16i32 R16C:$rSrc, 0)>; +          (COPY_TO_REGCLASS R16C:$rSrc, R32C)>;  //===----------------------------------------------------------------------===//  // Truncates: diff --git a/llvm/test/CodeGen/CellSPU/arg_ret.ll b/llvm/test/CodeGen/CellSPU/arg_ret.ll index 743292a58d5..6f07458d006 100644 --- a/llvm/test/CodeGen/CellSPU/arg_ret.ll +++ b/llvm/test/CodeGen/CellSPU/arg_ret.ll @@ -27,6 +27,7 @@ define ccc i32 @test_regs_and_stack( %paramstruct %prm, i32 %stackprm )  define ccc %paramstruct @test_return( i32 %param,  %paramstruct %prm )  {  ;CHECK:  lqd	$75, 80($sp) +;CHECK-NOT:	ori	{{\$[0-9]+, \$[0-9]+, 0}}  ;CHECK:  lr    $3, $4    ret %paramstruct %prm  }  | 

