diff --git a/llvm/lib/Target/PowerPC/PPCISelLowering.h b/llvm/lib/Target/PowerPC/PPCISelLowering.h --- a/llvm/lib/Target/PowerPC/PPCISelLowering.h +++ b/llvm/lib/Target/PowerPC/PPCISelLowering.h @@ -78,10 +78,6 @@ FCTIDUZ, FCTIWUZ, - /// Floating-point-to-integer conversion instructions - FP_TO_UINT_IN_VSR, - FP_TO_SINT_IN_VSR, - /// VEXTS, ByteWidth - takes an input in VSFRC and produces an output in /// VSFRC that is sign-extended from ByteWidth to a 64-byte integer. VEXTS, diff --git a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp --- a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp +++ b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp @@ -1627,10 +1627,6 @@ case PPCISD::FCTIWZ: return "PPCISD::FCTIWZ"; case PPCISD::FCTIDUZ: return "PPCISD::FCTIDUZ"; case PPCISD::FCTIWUZ: return "PPCISD::FCTIWUZ"; - case PPCISD::FP_TO_UINT_IN_VSR: - return "PPCISD::FP_TO_UINT_IN_VSR,"; - case PPCISD::FP_TO_SINT_IN_VSR: - return "PPCISD::FP_TO_SINT_IN_VSR"; case PPCISD::FRE: return "PPCISD::FRE"; case PPCISD::FRSQRTE: return "PPCISD::FRSQRTE"; case PPCISD::FTSQRT: @@ -8075,9 +8071,11 @@ } else Src = DAG.getNode(ISD::FP_EXTEND, dl, MVT::f64, Src); } - SDValue Conv; + MVT DestTy = Op.getSimpleValueType(); + if ((DestTy == MVT::i8 || DestTy == MVT::i16) && Subtarget.hasP9Vector()) + DestTy = MVT::i32; unsigned Opc = ISD::DELETED_NODE; - switch (Op.getSimpleValueType().SimpleTy) { + switch (DestTy.SimpleTy) { default: llvm_unreachable("Unhandled FP_TO_INT type in custom expander!"); case MVT::i32: Opc = IsSigned ? PPCISD::FCTIWZ @@ -8088,12 +8086,14 @@ "i64 FP_TO_UINT is supported only with FPCVT"); Opc = IsSigned ? PPCISD::FCTIDZ : PPCISD::FCTIDUZ; } + EVT ConvTy = Src.getValueType() == MVT::f128 ? MVT::f128 : MVT::f64; + SDValue Conv; if (IsStrict) { Opc = getPPCStrictOpcode(Opc); - Conv = DAG.getNode(Opc, dl, DAG.getVTList(MVT::f64, MVT::Other), - {Chain, Src}, Flags); + Conv = DAG.getNode(Opc, dl, DAG.getVTList(ConvTy, MVT::Other), {Chain, Src}, + Flags); } else { - Conv = DAG.getNode(Opc, dl, MVT::f64, Src); + Conv = DAG.getNode(Opc, dl, ConvTy, Src); } return Conv; } @@ -14862,20 +14862,7 @@ cast(N)->isTruncatingStore() || !ValidTypeForStoreFltAsInt) return SDValue(); - // Extend f32 values to f64 - if (ResVT.getScalarSizeInBits() == 32) { - Val = DAG.getNode(ISD::FP_EXTEND, dl, MVT::f64, Val); - DCI.AddToWorklist(Val.getNode()); - } - - // Set signed or unsigned conversion opcode. - unsigned ConvOpcode = (Opcode == ISD::FP_TO_SINT) ? - PPCISD::FP_TO_SINT_IN_VSR : - PPCISD::FP_TO_UINT_IN_VSR; - - Val = DAG.getNode(ConvOpcode, - dl, ResVT == MVT::f128 ? MVT::f128 : MVT::f64, Val); - DCI.AddToWorklist(Val.getNode()); + Val = convertFPToInt(N->getOperand(1), DAG, Subtarget); // Set number of bytes being converted. unsigned ByteSize = Op1VT.getScalarSizeInBits() / 8; @@ -14888,7 +14875,6 @@ cast(N)->getMemoryVT(), cast(N)->getMemOperand()); - DCI.AddToWorklist(Val.getNode()); return Val; } diff --git a/llvm/lib/Target/PowerPC/PPCInstrInfo.td b/llvm/lib/Target/PowerPC/PPCInstrInfo.td --- a/llvm/lib/Target/PowerPC/PPCInstrInfo.td +++ b/llvm/lib/Target/PowerPC/PPCInstrInfo.td @@ -164,10 +164,6 @@ [(PPCfcfidus node:$op), (PPCstrict_fcfidus node:$op)]>; -def PPCcv_fp_to_uint_in_vsr: - SDNode<"PPCISD::FP_TO_UINT_IN_VSR", SDT_PPCcv_fp_to_int, []>; -def PPCcv_fp_to_sint_in_vsr: - SDNode<"PPCISD::FP_TO_SINT_IN_VSR", SDT_PPCcv_fp_to_int, []>; def PPCstore_scal_int_from_vsr: SDNode<"PPCISD::ST_VSR_SCAL_INT", SDT_PPCstore_scal_int_from_vsr, [SDNPHasChain, SDNPMayStore]>; diff --git a/llvm/lib/Target/PowerPC/PPCInstrP10.td b/llvm/lib/Target/PowerPC/PPCInstrP10.td --- a/llvm/lib/Target/PowerPC/PPCInstrP10.td +++ b/llvm/lib/Target/PowerPC/PPCInstrP10.td @@ -1252,23 +1252,15 @@ (PSTDpc $RS, $ga, 0)>; // Special Cases For PPCstore_scal_int_from_vsr - def : Pat<(PPCstore_scal_int_from_vsr - (f64 (PPCcv_fp_to_sint_in_vsr f64:$src)), - (PPCmatpcreladdr PCRelForm:$dst), 8), - (PSTXSDpc (XSCVDPSXDS f64:$src), $dst, 0)>; - def : Pat<(PPCstore_scal_int_from_vsr - (f64 (PPCcv_fp_to_sint_in_vsr f128:$src)), - (PPCmatpcreladdr PCRelForm:$dst), 8), - (PSTXSDpc (COPY_TO_REGCLASS (XSCVQPSDZ f128:$src), VFRC), $dst, 0)>; - - def : Pat<(PPCstore_scal_int_from_vsr - (f64 (PPCcv_fp_to_uint_in_vsr f64:$src)), - (PPCmatpcreladdr PCRelForm:$dst), 8), - (PSTXSDpc (XSCVDPUXDS f64:$src), $dst, 0)>; - def : Pat<(PPCstore_scal_int_from_vsr - (f64 (PPCcv_fp_to_uint_in_vsr f128:$src)), - (PPCmatpcreladdr PCRelForm:$dst), 8), - (PSTXSDpc (COPY_TO_REGCLASS (XSCVQPUDZ f128:$src), VFRC), $dst, 0)>; + def : Pat<(PPCstore_scal_int_from_vsr f64:$src, (PPCmatpcreladdr PCRelForm:$dst), 8), + (PSTXSDpc $src, $dst, 0)>; + def : Pat<(PPCstore_scal_int_from_vsr f64:$src, (PPCmatpcreladdr PCRelForm:$dst), 8), + (PSTXSDpc (COPY_TO_REGCLASS $src, VFRC), $dst, 0)>; + + def : Pat<(PPCstore_scal_int_from_vsr f64:$src, (PPCmatpcreladdr PCRelForm:$dst), 8), + (PSTXSDpc $src, $dst, 0)>; + def : Pat<(PPCstore_scal_int_from_vsr f64:$src, (PPCmatpcreladdr PCRelForm:$dst), 8), + (PSTXSDpc (COPY_TO_REGCLASS $src, VFRC), $dst, 0)>; def : Pat<(v4f32 (PPCldvsxlh (PPCmatpcreladdr PCRelForm:$addr))), (SUBREG_TO_REG (i64 1), (PLFDpc $addr, 0), sub_64)>; @@ -2209,20 +2201,14 @@ def : Pat<(store v2f64:$XS, PDForm:$dst), (PSTXV $XS, memri34:$dst)>; // Cases For PPCstore_scal_int_from_vsr - def : Pat<(PPCstore_scal_int_from_vsr - (f64 (PPCcv_fp_to_uint_in_vsr f64:$src)), PDForm:$dst, 8), - (PSTXSD (XSCVDPUXDS f64:$src), PDForm:$dst)>; - def : Pat<(PPCstore_scal_int_from_vsr - (f64 (PPCcv_fp_to_sint_in_vsr f64:$src)), PDForm:$dst, 8), - (PSTXSD (XSCVDPSXDS f64:$src), PDForm:$dst)>; - def : Pat<(PPCstore_scal_int_from_vsr - (f64 (PPCcv_fp_to_uint_in_vsr f128:$src)), PDForm:$dst, 8), - (PSTXSD (COPY_TO_REGCLASS (XSCVQPUDZ f128:$src), VFRC), - PDForm:$dst)>; - def : Pat<(PPCstore_scal_int_from_vsr - (f64 (PPCcv_fp_to_sint_in_vsr f128:$src)), PDForm:$dst, 8), - (PSTXSD (COPY_TO_REGCLASS (XSCVQPSDZ f128:$src), VFRC), - PDForm:$dst)>; + def : Pat<(PPCstore_scal_int_from_vsr f64:$src, PDForm:$dst, 8), + (PSTXSD $src, PDForm:$dst)>; + def : Pat<(PPCstore_scal_int_from_vsr f64:$src, PDForm:$dst, 8), + (PSTXSD $src, PDForm:$dst)>; + def : Pat<(PPCstore_scal_int_from_vsr f64:$src, PDForm:$dst, 8), + (PSTXSD (COPY_TO_REGCLASS $src, VFRC), PDForm:$dst)>; + def : Pat<(PPCstore_scal_int_from_vsr f64:$src, PDForm:$dst, 8), + (PSTXSD (COPY_TO_REGCLASS $src, VFRC), PDForm:$dst)>; } let Predicates = [PrefixInstrs] in { diff --git a/llvm/lib/Target/PowerPC/PPCInstrVSX.td b/llvm/lib/Target/PowerPC/PPCInstrVSX.td --- a/llvm/lib/Target/PowerPC/PPCInstrVSX.td +++ b/llvm/lib/Target/PowerPC/PPCInstrVSX.td @@ -1489,10 +1489,14 @@ // Truncate & Convert QP -> (Un)Signed (D)Word (dword[1] is set to zero) let mayRaiseFPException = 1 in { - def XSCVQPSDZ : X_VT5_XO5_VB5<63, 25, 836, "xscvqpsdz", []>; - def XSCVQPSWZ : X_VT5_XO5_VB5<63, 9, 836, "xscvqpswz", []>; - def XSCVQPUDZ : X_VT5_XO5_VB5<63, 17, 836, "xscvqpudz", []>; - def XSCVQPUWZ : X_VT5_XO5_VB5<63, 1, 836, "xscvqpuwz", []>; + def XSCVQPSDZ : X_VT5_XO5_VB5<63, 25, 836, "xscvqpsdz", + [(set f128:$RST, (PPCany_fctidz f128:$RB))]>; + def XSCVQPSWZ : X_VT5_XO5_VB5<63, 9, 836, "xscvqpswz", + [(set f128:$RST, (PPCany_fctiwz f128:$RB))]>; + def XSCVQPUDZ : X_VT5_XO5_VB5<63, 17, 836, "xscvqpudz", + [(set f128:$RST, (PPCany_fctiduz f128:$RB))]>; + def XSCVQPUWZ : X_VT5_XO5_VB5<63, 1, 836, "xscvqpuwz", + [(set f128:$RST, (PPCany_fctiwuz f128:$RB))]>; } // Convert (Un)Signed DWord -> QP. @@ -3160,12 +3164,8 @@ // Any pre-Power9 VSX subtarget. let Predicates = [HasVSX, NoP9Vector] in { -def : Pat<(PPCstore_scal_int_from_vsr - (f64 (PPCcv_fp_to_sint_in_vsr f64:$src)), ForceXForm:$dst, 8), - (STXSDX (XSCVDPSXDS f64:$src), ForceXForm:$dst)>; -def : Pat<(PPCstore_scal_int_from_vsr - (f64 (PPCcv_fp_to_uint_in_vsr f64:$src)), ForceXForm:$dst, 8), - (STXSDX (XSCVDPUXDS f64:$src), ForceXForm:$dst)>; +def : Pat<(PPCstore_scal_int_from_vsr f64:$src, ForceXForm:$dst, 8), + (STXSDX $src, ForceXForm:$dst)>; // Load-and-splat with fp-to-int conversion (using X-Form VSX/FP loads). defm : ScalToVecWPermute< @@ -3294,12 +3294,8 @@ (COPY_TO_REGCLASS $S, VSFRC)), VSSRC))>; // Instructions for converting float to i32 feeding a store. -def : Pat<(PPCstore_scal_int_from_vsr - (f64 (PPCcv_fp_to_sint_in_vsr f64:$src)), ForceXForm:$dst, 4), - (STIWX (XSCVDPSXWS f64:$src), ForceXForm:$dst)>; -def : Pat<(PPCstore_scal_int_from_vsr - (f64 (PPCcv_fp_to_uint_in_vsr f64:$src)), ForceXForm:$dst, 4), - (STIWX (XSCVDPUXWS f64:$src), ForceXForm:$dst)>; +def : Pat<(PPCstore_scal_int_from_vsr f64:$src, ForceXForm:$dst, 4), + (STIWX $src, ForceXForm:$dst)>; def : Pat<(v2i64 (smax v2i64:$src1, v2i64:$src2)), (v2i64 (VMAXSD (COPY_TO_REGCLASS $src1, VRRC), @@ -4034,66 +4030,44 @@ // Instructions for store(fptosi). // The 8-byte version is repeated here due to availability of D-Form STXSD. -def : Pat<(PPCstore_scal_int_from_vsr - (f64 (PPCcv_fp_to_sint_in_vsr f128:$src)), XForm:$dst, 8), - (STXSDX (COPY_TO_REGCLASS (XSCVQPSDZ f128:$src), VFRC), - XForm:$dst)>; -def : Pat<(PPCstore_scal_int_from_vsr - (f64 (PPCcv_fp_to_sint_in_vsr f128:$src)), DSForm:$dst, 8), - (STXSD (COPY_TO_REGCLASS (XSCVQPSDZ f128:$src), VFRC), - DSForm:$dst)>; -def : Pat<(PPCstore_scal_int_from_vsr - (f64 (PPCcv_fp_to_sint_in_vsr f128:$src)), ForceXForm:$dst, 4), - (STXSIWX (COPY_TO_REGCLASS (XSCVQPSWZ $src), VFRC), ForceXForm:$dst)>; -def : Pat<(PPCstore_scal_int_from_vsr - (f64 (PPCcv_fp_to_sint_in_vsr f128:$src)), ForceXForm:$dst, 2), - (STXSIHX (COPY_TO_REGCLASS (XSCVQPSWZ $src), VFRC), ForceXForm:$dst)>; -def : Pat<(PPCstore_scal_int_from_vsr - (f64 (PPCcv_fp_to_sint_in_vsr f128:$src)), ForceXForm:$dst, 1), - (STXSIBX (COPY_TO_REGCLASS (XSCVQPSWZ $src), VFRC), ForceXForm:$dst)>; -def : Pat<(PPCstore_scal_int_from_vsr - (f64 (PPCcv_fp_to_sint_in_vsr f64:$src)), XForm:$dst, 8), - (STXSDX (XSCVDPSXDS f64:$src), XForm:$dst)>; -def : Pat<(PPCstore_scal_int_from_vsr - (f64 (PPCcv_fp_to_sint_in_vsr f64:$src)), DSForm:$dst, 8), - (STXSD (XSCVDPSXDS f64:$src), DSForm:$dst)>; -def : Pat<(PPCstore_scal_int_from_vsr - (f64 (PPCcv_fp_to_sint_in_vsr f64:$src)), ForceXForm:$dst, 2), - (STXSIHX (XSCVDPSXWS f64:$src), ForceXForm:$dst)>; -def : Pat<(PPCstore_scal_int_from_vsr - (f64 (PPCcv_fp_to_sint_in_vsr f64:$src)), ForceXForm:$dst, 1), - (STXSIBX (XSCVDPSXWS f64:$src), ForceXForm:$dst)>; +def : Pat<(PPCstore_scal_int_from_vsr f64:$src, XForm:$dst, 8), + (STXSDX (COPY_TO_REGCLASS $src, VFRC), XForm:$dst)>; +def : Pat<(PPCstore_scal_int_from_vsr f64:$src, DSForm:$dst, 8), + (STXSD (COPY_TO_REGCLASS $src, VFRC), DSForm:$dst)>; +def : Pat<(PPCstore_scal_int_from_vsr f64:$src, ForceXForm:$dst, 4), + (STXSIWX (COPY_TO_REGCLASS $src, VFRC), ForceXForm:$dst)>; +def : Pat<(PPCstore_scal_int_from_vsr f64:$src, ForceXForm:$dst, 2), + (STXSIHX (COPY_TO_REGCLASS $src, VFRC), ForceXForm:$dst)>; +def : Pat<(PPCstore_scal_int_from_vsr f64:$src, ForceXForm:$dst, 1), + (STXSIBX (COPY_TO_REGCLASS $src, VFRC), ForceXForm:$dst)>; +def : Pat<(PPCstore_scal_int_from_vsr f64:$src, XForm:$dst, 8), + (STXSDX $src, XForm:$dst)>; +def : Pat<(PPCstore_scal_int_from_vsr f64:$src, DSForm:$dst, 8), + (STXSD $src, DSForm:$dst)>; +def : Pat<(PPCstore_scal_int_from_vsr f64:$src, ForceXForm:$dst, 2), + (STXSIHX $src, ForceXForm:$dst)>; +def : Pat<(PPCstore_scal_int_from_vsr f64:$src, ForceXForm:$dst, 1), + (STXSIBX $src, ForceXForm:$dst)>; // Instructions for store(fptoui). -def : Pat<(PPCstore_scal_int_from_vsr - (f64 (PPCcv_fp_to_uint_in_vsr f128:$src)), XForm:$dst, 8), - (STXSDX (COPY_TO_REGCLASS (XSCVQPUDZ f128:$src), VFRC), - XForm:$dst)>; -def : Pat<(PPCstore_scal_int_from_vsr - (f64 (PPCcv_fp_to_uint_in_vsr f128:$src)), DSForm:$dst, 8), - (STXSD (COPY_TO_REGCLASS (XSCVQPUDZ f128:$src), VFRC), - DSForm:$dst)>; -def : Pat<(PPCstore_scal_int_from_vsr - (f64 (PPCcv_fp_to_uint_in_vsr f128:$src)), ForceXForm:$dst, 4), - (STXSIWX (COPY_TO_REGCLASS (XSCVQPUWZ $src), VFRC), ForceXForm:$dst)>; -def : Pat<(PPCstore_scal_int_from_vsr - (f64 (PPCcv_fp_to_uint_in_vsr f128:$src)), ForceXForm:$dst, 2), - (STXSIHX (COPY_TO_REGCLASS (XSCVQPUWZ $src), VFRC), ForceXForm:$dst)>; -def : Pat<(PPCstore_scal_int_from_vsr - (f64 (PPCcv_fp_to_uint_in_vsr f128:$src)), ForceXForm:$dst, 1), - (STXSIBX (COPY_TO_REGCLASS (XSCVQPUWZ $src), VFRC), ForceXForm:$dst)>; -def : Pat<(PPCstore_scal_int_from_vsr - (f64 (PPCcv_fp_to_uint_in_vsr f64:$src)), XForm:$dst, 8), - (STXSDX (XSCVDPUXDS f64:$src), XForm:$dst)>; -def : Pat<(PPCstore_scal_int_from_vsr - (f64 (PPCcv_fp_to_uint_in_vsr f64:$src)), DSForm:$dst, 8), - (STXSD (XSCVDPUXDS f64:$src), DSForm:$dst)>; -def : Pat<(PPCstore_scal_int_from_vsr - (f64 (PPCcv_fp_to_uint_in_vsr f64:$src)), ForceXForm:$dst, 2), - (STXSIHX (XSCVDPUXWS f64:$src), ForceXForm:$dst)>; -def : Pat<(PPCstore_scal_int_from_vsr - (f64 (PPCcv_fp_to_uint_in_vsr f64:$src)), ForceXForm:$dst, 1), - (STXSIBX (XSCVDPUXWS f64:$src), ForceXForm:$dst)>; +def : Pat<(PPCstore_scal_int_from_vsr f64:$src, XForm:$dst, 8), + (STXSDX (COPY_TO_REGCLASS $src, VFRC), XForm:$dst)>; +def : Pat<(PPCstore_scal_int_from_vsr f64:$src, DSForm:$dst, 8), + (STXSD (COPY_TO_REGCLASS $src, VFRC), DSForm:$dst)>; +def : Pat<(PPCstore_scal_int_from_vsr f64:$src, ForceXForm:$dst, 4), + (STXSIWX (COPY_TO_REGCLASS $src, VFRC), ForceXForm:$dst)>; +def : Pat<(PPCstore_scal_int_from_vsr f64:$src, ForceXForm:$dst, 2), + (STXSIHX (COPY_TO_REGCLASS $src, VFRC), ForceXForm:$dst)>; +def : Pat<(PPCstore_scal_int_from_vsr f64:$src, ForceXForm:$dst, 1), + (STXSIBX (COPY_TO_REGCLASS $src, VFRC), ForceXForm:$dst)>; +def : Pat<(PPCstore_scal_int_from_vsr f64:$src, XForm:$dst, 8), + (STXSDX $src, XForm:$dst)>; +def : Pat<(PPCstore_scal_int_from_vsr f64:$src, DSForm:$dst, 8), + (STXSD $src, DSForm:$dst)>; +def : Pat<(PPCstore_scal_int_from_vsr f64:$src, ForceXForm:$dst, 2), + (STXSIHX $src, ForceXForm:$dst)>; +def : Pat<(PPCstore_scal_int_from_vsr f64:$src, ForceXForm:$dst, 1), + (STXSIBX $src, ForceXForm:$dst)>; // Round & Convert QP -> DP/SP def : Pat<(f64 (any_fpround f128:$src)), (f64 (XSCVQPDP $src))>; diff --git a/llvm/test/CodeGen/PowerPC/scalar-double-ldst.ll b/llvm/test/CodeGen/PowerPC/scalar-double-ldst.ll --- a/llvm/test/CodeGen/PowerPC/scalar-double-ldst.ll +++ b/llvm/test/CodeGen/PowerPC/scalar-double-ldst.ll @@ -3900,9 +3900,9 @@ define dso_local void @st_not_disjoint64_double_uint8_t(i64 %ptr, double %str) { ; CHECK-P10-LABEL: st_not_disjoint64_double_uint8_t: ; CHECK-P10: # %bb.0: # %entry +; CHECK-P10-NEXT: xscvdpuxws f0, f1 ; CHECK-P10-NEXT: pli r4, 232 ; CHECK-P10-NEXT: pli r5, 3567587329 -; CHECK-P10-NEXT: xscvdpuxws f0, f1 ; CHECK-P10-NEXT: rldimi r5, r4, 32, 0 ; CHECK-P10-NEXT: or r3, r3, r5 ; CHECK-P10-NEXT: stxsibx f0, 0, r3 @@ -4339,9 +4339,9 @@ define dso_local void @st_not_disjoint64_double_int8_t(i64 %ptr, double %str) { ; CHECK-P10-LABEL: st_not_disjoint64_double_int8_t: ; CHECK-P10: # %bb.0: # %entry +; CHECK-P10-NEXT: xscvdpsxws f0, f1 ; CHECK-P10-NEXT: pli r4, 232 ; CHECK-P10-NEXT: pli r5, 3567587329 -; CHECK-P10-NEXT: xscvdpsxws f0, f1 ; CHECK-P10-NEXT: rldimi r5, r4, 32, 0 ; CHECK-P10-NEXT: or r3, r3, r5 ; CHECK-P10-NEXT: stxsibx f0, 0, r3 @@ -4778,9 +4778,9 @@ define dso_local void @st_not_disjoint64_double_uint16_t(i64 %ptr, double %str) { ; CHECK-P10-LABEL: st_not_disjoint64_double_uint16_t: ; CHECK-P10: # %bb.0: # %entry +; CHECK-P10-NEXT: xscvdpuxws f0, f1 ; CHECK-P10-NEXT: pli r4, 232 ; CHECK-P10-NEXT: pli r5, 3567587329 -; CHECK-P10-NEXT: xscvdpuxws f0, f1 ; CHECK-P10-NEXT: rldimi r5, r4, 32, 0 ; CHECK-P10-NEXT: or r3, r3, r5 ; CHECK-P10-NEXT: stxsihx f0, 0, r3 @@ -5217,9 +5217,9 @@ define dso_local void @st_not_disjoint64_double_int16_t(i64 %ptr, double %str) { ; CHECK-P10-LABEL: st_not_disjoint64_double_int16_t: ; CHECK-P10: # %bb.0: # %entry +; CHECK-P10-NEXT: xscvdpsxws f0, f1 ; CHECK-P10-NEXT: pli r4, 232 ; CHECK-P10-NEXT: pli r5, 3567587329 -; CHECK-P10-NEXT: xscvdpsxws f0, f1 ; CHECK-P10-NEXT: rldimi r5, r4, 32, 0 ; CHECK-P10-NEXT: or r3, r3, r5 ; CHECK-P10-NEXT: stxsihx f0, 0, r3 @@ -5582,9 +5582,9 @@ define dso_local void @st_not_disjoint64_double_uint32_t(i64 %ptr, double %str) { ; CHECK-P10-LABEL: st_not_disjoint64_double_uint32_t: ; CHECK-P10: # %bb.0: # %entry +; CHECK-P10-NEXT: xscvdpuxws f0, f1 ; CHECK-P10-NEXT: pli r4, 232 ; CHECK-P10-NEXT: pli r5, 3567587329 -; CHECK-P10-NEXT: xscvdpuxws f0, f1 ; CHECK-P10-NEXT: rldimi r5, r4, 32, 0 ; CHECK-P10-NEXT: or r3, r3, r5 ; CHECK-P10-NEXT: stfiwx f0, 0, r3 @@ -5910,9 +5910,9 @@ define dso_local void @st_not_disjoint64_double_int32_t(i64 %ptr, double %str) { ; CHECK-P10-LABEL: st_not_disjoint64_double_int32_t: ; CHECK-P10: # %bb.0: # %entry +; CHECK-P10-NEXT: xscvdpsxws f0, f1 ; CHECK-P10-NEXT: pli r4, 232 ; CHECK-P10-NEXT: pli r5, 3567587329 -; CHECK-P10-NEXT: xscvdpsxws f0, f1 ; CHECK-P10-NEXT: rldimi r5, r4, 32, 0 ; CHECK-P10-NEXT: or r3, r3, r5 ; CHECK-P10-NEXT: stfiwx f0, 0, r3 diff --git a/llvm/test/CodeGen/PowerPC/scalar-float-ldst.ll b/llvm/test/CodeGen/PowerPC/scalar-float-ldst.ll --- a/llvm/test/CodeGen/PowerPC/scalar-float-ldst.ll +++ b/llvm/test/CodeGen/PowerPC/scalar-float-ldst.ll @@ -3922,9 +3922,9 @@ define dso_local void @st_not_disjoint64_float_uint8_t(i64 %ptr, float %str) { ; CHECK-P10-LABEL: st_not_disjoint64_float_uint8_t: ; CHECK-P10: # %bb.0: # %entry +; CHECK-P10-NEXT: xscvdpuxws f0, f1 ; CHECK-P10-NEXT: pli r4, 232 ; CHECK-P10-NEXT: pli r5, 3567587329 -; CHECK-P10-NEXT: xscvdpuxws f0, f1 ; CHECK-P10-NEXT: rldimi r5, r4, 32, 0 ; CHECK-P10-NEXT: or r3, r3, r5 ; CHECK-P10-NEXT: stxsibx f0, 0, r3 @@ -4361,9 +4361,9 @@ define dso_local void @st_not_disjoint64_float_int8_t(i64 %ptr, float %str) { ; CHECK-P10-LABEL: st_not_disjoint64_float_int8_t: ; CHECK-P10: # %bb.0: # %entry +; CHECK-P10-NEXT: xscvdpsxws f0, f1 ; CHECK-P10-NEXT: pli r4, 232 ; CHECK-P10-NEXT: pli r5, 3567587329 -; CHECK-P10-NEXT: xscvdpsxws f0, f1 ; CHECK-P10-NEXT: rldimi r5, r4, 32, 0 ; CHECK-P10-NEXT: or r3, r3, r5 ; CHECK-P10-NEXT: stxsibx f0, 0, r3 @@ -4800,9 +4800,9 @@ define dso_local void @st_not_disjoint64_float_uint16_t(i64 %ptr, float %str) { ; CHECK-P10-LABEL: st_not_disjoint64_float_uint16_t: ; CHECK-P10: # %bb.0: # %entry +; CHECK-P10-NEXT: xscvdpuxws f0, f1 ; CHECK-P10-NEXT: pli r4, 232 ; CHECK-P10-NEXT: pli r5, 3567587329 -; CHECK-P10-NEXT: xscvdpuxws f0, f1 ; CHECK-P10-NEXT: rldimi r5, r4, 32, 0 ; CHECK-P10-NEXT: or r3, r3, r5 ; CHECK-P10-NEXT: stxsihx f0, 0, r3 @@ -5239,9 +5239,9 @@ define dso_local void @st_not_disjoint64_float_int16_t(i64 %ptr, float %str) { ; CHECK-P10-LABEL: st_not_disjoint64_float_int16_t: ; CHECK-P10: # %bb.0: # %entry +; CHECK-P10-NEXT: xscvdpsxws f0, f1 ; CHECK-P10-NEXT: pli r4, 232 ; CHECK-P10-NEXT: pli r5, 3567587329 -; CHECK-P10-NEXT: xscvdpsxws f0, f1 ; CHECK-P10-NEXT: rldimi r5, r4, 32, 0 ; CHECK-P10-NEXT: or r3, r3, r5 ; CHECK-P10-NEXT: stxsihx f0, 0, r3 @@ -5604,9 +5604,9 @@ define dso_local void @st_not_disjoint64_float_uint32_t(i64 %ptr, float %str) { ; CHECK-P10-LABEL: st_not_disjoint64_float_uint32_t: ; CHECK-P10: # %bb.0: # %entry +; CHECK-P10-NEXT: xscvdpuxws f0, f1 ; CHECK-P10-NEXT: pli r4, 232 ; CHECK-P10-NEXT: pli r5, 3567587329 -; CHECK-P10-NEXT: xscvdpuxws f0, f1 ; CHECK-P10-NEXT: rldimi r5, r4, 32, 0 ; CHECK-P10-NEXT: or r3, r3, r5 ; CHECK-P10-NEXT: stfiwx f0, 0, r3 @@ -5932,9 +5932,9 @@ define dso_local void @st_not_disjoint64_float_int32_t(i64 %ptr, float %str) { ; CHECK-P10-LABEL: st_not_disjoint64_float_int32_t: ; CHECK-P10: # %bb.0: # %entry +; CHECK-P10-NEXT: xscvdpsxws f0, f1 ; CHECK-P10-NEXT: pli r4, 232 ; CHECK-P10-NEXT: pli r5, 3567587329 -; CHECK-P10-NEXT: xscvdpsxws f0, f1 ; CHECK-P10-NEXT: rldimi r5, r4, 32, 0 ; CHECK-P10-NEXT: or r3, r3, r5 ; CHECK-P10-NEXT: stfiwx f0, 0, r3 diff --git a/llvm/test/CodeGen/PowerPC/store_fptoi.ll b/llvm/test/CodeGen/PowerPC/store_fptoi.ll --- a/llvm/test/CodeGen/PowerPC/store_fptoi.ll +++ b/llvm/test/CodeGen/PowerPC/store_fptoi.ll @@ -478,8 +478,8 @@ ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: lfs 0, 0(3) ; CHECK-NEXT: xscvdpsxds 0, 0 -; CHECK-NEXT: sldi 5, 5, 3 -; CHECK-NEXT: stxsdx 0, 4, 5 +; CHECK-NEXT: sldi 3, 5, 3 +; CHECK-NEXT: stxsdx 0, 4, 3 ; CHECK-NEXT: blr ; ; CHECK-PWR8-LABEL: spConv2sdw_x: @@ -507,8 +507,8 @@ ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: lfs 0, 0(3) ; CHECK-NEXT: xscvdpsxws 0, 0 -; CHECK-NEXT: sldi 5, 5, 2 -; CHECK-NEXT: stfiwx 0, 4, 5 +; CHECK-NEXT: sldi 3, 5, 2 +; CHECK-NEXT: stfiwx 0, 4, 3 ; CHECK-NEXT: blr ; ; CHECK-PWR8-LABEL: spConv2sw_x: @@ -536,8 +536,8 @@ ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: lfs 0, 0(3) ; CHECK-NEXT: xscvdpsxws 0, 0 -; CHECK-NEXT: sldi 5, 5, 1 -; CHECK-NEXT: stxsihx 0, 4, 5 +; CHECK-NEXT: sldi 3, 5, 1 +; CHECK-NEXT: stxsihx 0, 4, 3 ; CHECK-NEXT: blr ; ; CHECK-PWR8-LABEL: spConv2shw_x: @@ -910,8 +910,8 @@ ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: lfs 0, 0(3) ; CHECK-NEXT: xscvdpuxds 0, 0 -; CHECK-NEXT: sldi 5, 5, 3 -; CHECK-NEXT: stxsdx 0, 4, 5 +; CHECK-NEXT: sldi 3, 5, 3 +; CHECK-NEXT: stxsdx 0, 4, 3 ; CHECK-NEXT: blr ; ; CHECK-PWR8-LABEL: spConv2udw_x: @@ -939,8 +939,8 @@ ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: lfs 0, 0(3) ; CHECK-NEXT: xscvdpuxws 0, 0 -; CHECK-NEXT: sldi 5, 5, 2 -; CHECK-NEXT: stfiwx 0, 4, 5 +; CHECK-NEXT: sldi 3, 5, 2 +; CHECK-NEXT: stfiwx 0, 4, 3 ; CHECK-NEXT: blr ; ; CHECK-PWR8-LABEL: spConv2uw_x: @@ -968,8 +968,8 @@ ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: lfs 0, 0(3) ; CHECK-NEXT: xscvdpuxws 0, 0 -; CHECK-NEXT: sldi 5, 5, 1 -; CHECK-NEXT: stxsihx 0, 4, 5 +; CHECK-NEXT: sldi 3, 5, 1 +; CHECK-NEXT: stxsihx 0, 4, 3 ; CHECK-NEXT: blr ; ; CHECK-PWR8-LABEL: spConv2uhw_x: @@ -1019,3 +1019,27 @@ } + +define void @multiple_store(double %m, ptr %addr1, ptr %addr2, ptr %addr3) { +; CHECK-LABEL: multiple_store: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: xscvdpsxds 2, 1 +; CHECK-NEXT: stxsd 2, 0(4) +; CHECK-NEXT: stxsd 2, 0(5) +; CHECK-NEXT: stxsd 2, 0(6) +; CHECK-NEXT: blr +; +; CHECK-PWR8-LABEL: multiple_store: +; CHECK-PWR8: # %bb.0: # %entry +; CHECK-PWR8-NEXT: xscvdpsxds 0, 1 +; CHECK-PWR8-NEXT: stxsdx 0, 0, 4 +; CHECK-PWR8-NEXT: stxsdx 0, 0, 5 +; CHECK-PWR8-NEXT: stxsdx 0, 0, 6 +; CHECK-PWR8-NEXT: blr +entry: + %conv1 = fptosi double %m to i64 + store i64 %conv1, ptr %addr1, align 8 + store i64 %conv1, ptr %addr2, align 8 + store i64 %conv1, ptr %addr3, align 8 + ret void +}