================ @@ -6464,6 +6522,70 @@ static SDValue lowerAddrSpaceCast(SDValue Op, SelectionDAG &DAG) { return Op; } +SDValue SystemZTargetLowering::lowerFP_EXTEND(SDValue Op, + SelectionDAG &DAG) const { + SDValue In = Op.getOperand(Op->isStrictFPOpcode() ? 1 : 0); + if (In.getSimpleValueType() != MVT::f16) + return Op; // Legal + return SDValue(); // Let legalizer emit the libcall. +} + +SDValue SystemZTargetLowering::lowerLoadF16(SDValue Op, + SelectionDAG &DAG) const { + MVT RegVT = Op.getSimpleValueType(); + assert(RegVT == MVT::f16 && "Expected to lower an f16 load."); + + SDLoc DL(Op); + SDValue NewLd; + if (auto *AtomicLd = dyn_cast<AtomicSDNode>(Op.getNode())) { + assert(EVT(RegVT) == AtomicLd->getMemoryVT() && "Unhandled f16 load"); + NewLd = DAG.getAtomic(ISD::ATOMIC_LOAD, DL, MVT::i16, MVT::i32, + AtomicLd->getChain(), AtomicLd->getBasePtr(), + AtomicLd->getMemOperand()); + cast<AtomicSDNode>(NewLd)->setExtensionType(ISD::EXTLOAD); + } else { + LoadSDNode *Ld = cast<LoadSDNode>(Op.getNode()); + assert(EVT(RegVT) == Ld->getMemoryVT() && "Unhandled f16 load"); + NewLd = + DAG.getExtLoad(ISD::EXTLOAD, DL, MVT::i32, Ld->getChain(), + Ld->getBasePtr(), Ld->getPointerInfo(), MVT::i16, + Ld->getOriginalAlign(), Ld->getMemOperand()->getFlags()); + } + // Load as integer, shift and then insert into upper 2 bytes of the FP + // register. + SDValue Shft = DAG.getNode(ISD::SHL, DL, MVT::i32, NewLd, + DAG.getConstant(16, DL, MVT::i32)); + SDValue BCast = DAG.getNode(ISD::BITCAST, DL, MVT::f32, Shft); + SDValue F16Val = + DAG.getTargetExtractSubreg(SystemZ::subreg_h16, DL, MVT::f16, BCast); ---------------- uweigand wrote:
I guess this would be a generic BITCAST implementation, but it's only used here - should this be made more generic? Also, if we do have vector support, we could do better than the shift sequence ... https://github.com/llvm/llvm-project/pull/109164 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits