bool AMDGPULegalizerInfo::legalizeFrint( MachineInstr &MI, MachineRegisterInfo &MRI, MachineIRBuilder &MIRBuilder) const { MIRBuilder.setInstr(MI); unsigned Src = MI.getOperand(1).getReg(); LLT Ty = MRI.getType(Src); assert(Ty.isScalar() && Ty.getSizeInBits() == 64); APFloat C1Val(APFloat::IEEEdouble(), "0x1.0p+52"); APFloat C2Val(APFloat::IEEEdouble(), "0x1.fffffffffffffp+51"); auto C1 = MIRBuilder.buildFConstant(Ty, C1Val); auto CopySign = MIRBuilder.buildFCopysign(Ty, C1, Src); // TODO: Should this propagate fast-math-flags? auto Tmp1 = MIRBuilder.buildFAdd(Ty, Src, CopySign); auto Tmp2 = MIRBuilder.buildFSub(Ty, Tmp1, CopySign); auto C2 = MIRBuilder.buildFConstant(Ty, C2Val); auto Fabs = MIRBuilder.buildFAbs(Ty, Src); auto Cond = MIRBuilder.buildFCmp(CmpInst::FCMP_OGT, LLT::scalar(1), Fabs, C2); MIRBuilder.buildSelect(MI.getOperand(0).getReg(), Cond, Src, Tmp2); return true; }
X86GenRegisterBankInfo::PartialMappingIdx X86GenRegisterBankInfo::getPartialMappingIdx(const LLT &Ty, bool isFP) { if ((Ty.isScalar() && !isFP) || Ty.isPointer()) { switch (Ty.getSizeInBits()) { case 1: case 8: return PMI_GPR8; case 16: return PMI_GPR16; case 32: return PMI_GPR32; case 64: return PMI_GPR64; case 128: return PMI_VEC128; break; default: llvm_unreachable("Unsupported register size."); } } else if (Ty.isScalar()) { switch (Ty.getSizeInBits()) { case 32: return PMI_FP32; case 64: return PMI_FP64; case 128: return PMI_VEC128; default: llvm_unreachable("Unsupported register size."); } } else { switch (Ty.getSizeInBits()) { case 128: return PMI_VEC128; case 256: return PMI_VEC256; case 512: return PMI_VEC512; default: llvm_unreachable("Unsupported register size."); } } return PMI_None; }
void MachineIRBuilder::validateTruncExt(unsigned Dst, unsigned Src, bool IsExtend) { #ifndef NDEBUG LLT SrcTy = MRI->getType(Src); LLT DstTy = MRI->getType(Dst); if (DstTy.isVector()) { assert(SrcTy.isVector() && "mismatched cast between vecot and non-vector"); assert(SrcTy.getNumElements() == DstTy.getNumElements() && "different number of elements in a trunc/ext"); } else assert(DstTy.isScalar() && SrcTy.isScalar() && "invalid extend/trunc"); if (IsExtend) assert(DstTy.getSizeInBits() > SrcTy.getSizeInBits() && "invalid narrowing extend"); else assert(DstTy.getSizeInBits() < SrcTy.getSizeInBits() && "invalid widening trunc"); #endif }