mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-23 14:25:07 +00:00
[mips][msa] Add copy_{u,s}.d.
These instructions are only available on Mips64 cores that implement the MSA ASE. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@200398 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -1616,25 +1616,34 @@ SDValue MipsSETargetLowering::lowerINTRINSIC_WO_CHAIN(SDValue Op,
|
||||
case Intrinsic::mips_copy_s_w:
|
||||
return lowerMSACopyIntr(Op, DAG, MipsISD::VEXTRACT_SEXT_ELT);
|
||||
case Intrinsic::mips_copy_s_d:
|
||||
// Don't lower directly into VEXTRACT_SEXT_ELT since i64 might be illegal.
|
||||
// Instead lower to the generic EXTRACT_VECTOR_ELT node and let the type
|
||||
// legalizer and EXTRACT_VECTOR_ELT lowering sort it out.
|
||||
return DAG.getNode(ISD::EXTRACT_VECTOR_ELT, SDLoc(Op), Op->getValueType(0),
|
||||
Op->getOperand(1), Op->getOperand(2));
|
||||
if (HasMips64)
|
||||
// Lower directly into VEXTRACT_SEXT_ELT since i64 is legal on Mips64.
|
||||
return lowerMSACopyIntr(Op, DAG, MipsISD::VEXTRACT_SEXT_ELT);
|
||||
else {
|
||||
// Lower into the generic EXTRACT_VECTOR_ELT node and let the type
|
||||
// legalizer and EXTRACT_VECTOR_ELT lowering sort it out.
|
||||
return DAG.getNode(ISD::EXTRACT_VECTOR_ELT, SDLoc(Op),
|
||||
Op->getValueType(0), Op->getOperand(1),
|
||||
Op->getOperand(2));
|
||||
}
|
||||
case Intrinsic::mips_copy_u_b:
|
||||
case Intrinsic::mips_copy_u_h:
|
||||
case Intrinsic::mips_copy_u_w:
|
||||
return lowerMSACopyIntr(Op, DAG, MipsISD::VEXTRACT_ZEXT_ELT);
|
||||
case Intrinsic::mips_copy_u_d:
|
||||
// Don't lower directly into VEXTRACT_ZEXT_ELT since i64 might be illegal.
|
||||
// Instead lower to the generic EXTRACT_VECTOR_ELT node and let the type
|
||||
// legalizer and EXTRACT_VECTOR_ELT lowering sort it out.
|
||||
//
|
||||
// Note: When i64 is illegal, this results in copy_s.w instructions instead
|
||||
// of copy_u.w instructions. This makes no difference to the behaviour
|
||||
// since i64 is only illegal when the register file is 32-bit.
|
||||
return DAG.getNode(ISD::EXTRACT_VECTOR_ELT, SDLoc(Op), Op->getValueType(0),
|
||||
Op->getOperand(1), Op->getOperand(2));
|
||||
if (HasMips64)
|
||||
// Lower directly into VEXTRACT_ZEXT_ELT since i64 is legal on Mips64.
|
||||
return lowerMSACopyIntr(Op, DAG, MipsISD::VEXTRACT_ZEXT_ELT);
|
||||
else {
|
||||
// Lower into the generic EXTRACT_VECTOR_ELT node and let the type
|
||||
// legalizer and EXTRACT_VECTOR_ELT lowering sort it out.
|
||||
// Note: When i64 is illegal, this results in copy_s.w instructions
|
||||
// instead of copy_u.w instructions. This makes no difference to the
|
||||
// behaviour since i64 is only illegal when the register file is 32-bit.
|
||||
return DAG.getNode(ISD::EXTRACT_VECTOR_ELT, SDLoc(Op),
|
||||
Op->getValueType(0), Op->getOperand(1),
|
||||
Op->getOperand(2));
|
||||
}
|
||||
case Intrinsic::mips_div_s_b:
|
||||
case Intrinsic::mips_div_s_h:
|
||||
case Intrinsic::mips_div_s_w:
|
||||
|
Reference in New Issue
Block a user