Skip to content

Commit bf7af2d

Browse files
authored
[AArch64][DAG] Allow fptos/ui.sat to scalarized. (#126799)
We we previously running into problems with fp128 types and certain integer sizes. Fixes an issue reported on #124984
1 parent edbc1fb commit bf7af2d

File tree

4 files changed

+285
-0
lines changed

4 files changed

+285
-0
lines changed

llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -880,6 +880,7 @@ class LLVM_LIBRARY_VISIBILITY DAGTypeLegalizer {
880880
bool ScalarizeVectorOperand(SDNode *N, unsigned OpNo);
881881
SDValue ScalarizeVecOp_BITCAST(SDNode *N);
882882
SDValue ScalarizeVecOp_UnaryOp(SDNode *N);
883+
SDValue ScalarizeVecOp_UnaryOpWithExtraInput(SDNode *N);
883884
SDValue ScalarizeVecOp_UnaryOp_StrictFP(SDNode *N);
884885
SDValue ScalarizeVecOp_CONCAT_VECTORS(SDNode *N);
885886
SDValue ScalarizeVecOp_INSERT_SUBVECTOR(SDNode *N, unsigned OpNo);

llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -775,6 +775,10 @@ bool DAGTypeLegalizer::ScalarizeVectorOperand(SDNode *N, unsigned OpNo) {
775775
case ISD::LLRINT:
776776
Res = ScalarizeVecOp_UnaryOp(N);
777777
break;
778+
case ISD::FP_TO_SINT_SAT:
779+
case ISD::FP_TO_UINT_SAT:
780+
Res = ScalarizeVecOp_UnaryOpWithExtraInput(N);
781+
break;
778782
case ISD::STRICT_SINT_TO_FP:
779783
case ISD::STRICT_UINT_TO_FP:
780784
case ISD::STRICT_FP_TO_SINT:
@@ -882,6 +886,20 @@ SDValue DAGTypeLegalizer::ScalarizeVecOp_UnaryOp(SDNode *N) {
882886
return DAG.getNode(ISD::SCALAR_TO_VECTOR, SDLoc(N), N->getValueType(0), Op);
883887
}
884888

889+
/// Same as ScalarizeVecOp_UnaryOp with an extra operand (for example a
890+
/// typesize).
891+
SDValue DAGTypeLegalizer::ScalarizeVecOp_UnaryOpWithExtraInput(SDNode *N) {
892+
assert(N->getValueType(0).getVectorNumElements() == 1 &&
893+
"Unexpected vector type!");
894+
SDValue Elt = GetScalarizedVector(N->getOperand(0));
895+
SDValue Op =
896+
DAG.getNode(N->getOpcode(), SDLoc(N), N->getValueType(0).getScalarType(),
897+
Elt, N->getOperand(1));
898+
// Revectorize the result so the types line up with what the uses of this
899+
// expression expect.
900+
return DAG.getNode(ISD::SCALAR_TO_VECTOR, SDLoc(N), N->getValueType(0), Op);
901+
}
902+
885903
/// If the input is a vector that needs to be scalarized, it must be <1 x ty>.
886904
/// Do the strict FP operation on the element instead.
887905
SDValue DAGTypeLegalizer::ScalarizeVecOp_UnaryOp_StrictFP(SDNode *N) {

llvm/test/CodeGen/AArch64/fptosi-sat-vector.ll

Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5548,3 +5548,151 @@ define <16 x i16> @test_signed_v16f64_v16i16(<16 x double> %f) {
55485548
%x = call <16 x i16> @llvm.fptosi.sat.v16f64.v16i16(<16 x double> %f)
55495549
ret <16 x i16> %x
55505550
}
5551+
5552+
define <2 x i64> @test_signed_v2f128_v2i64(<2 x fp128> %f) {
5553+
; CHECK-SD-LABEL: test_signed_v2f128_v2i64:
5554+
; CHECK-SD: // %bb.0:
5555+
; CHECK-SD-NEXT: sub sp, sp, #96
5556+
; CHECK-SD-NEXT: stp x30, x21, [sp, #64] // 16-byte Folded Spill
5557+
; CHECK-SD-NEXT: stp x20, x19, [sp, #80] // 16-byte Folded Spill
5558+
; CHECK-SD-NEXT: .cfi_def_cfa_offset 96
5559+
; CHECK-SD-NEXT: .cfi_offset w19, -8
5560+
; CHECK-SD-NEXT: .cfi_offset w20, -16
5561+
; CHECK-SD-NEXT: .cfi_offset w21, -24
5562+
; CHECK-SD-NEXT: .cfi_offset w30, -32
5563+
; CHECK-SD-NEXT: mov v2.16b, v1.16b
5564+
; CHECK-SD-NEXT: stp q1, q0, [sp, #32] // 32-byte Folded Spill
5565+
; CHECK-SD-NEXT: adrp x8, .LCPI86_0
5566+
; CHECK-SD-NEXT: ldr q1, [x8, :lo12:.LCPI86_0]
5567+
; CHECK-SD-NEXT: mov v0.16b, v2.16b
5568+
; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Folded Spill
5569+
; CHECK-SD-NEXT: bl __getf2
5570+
; CHECK-SD-NEXT: ldr q0, [sp, #32] // 16-byte Folded Reload
5571+
; CHECK-SD-NEXT: mov w19, w0
5572+
; CHECK-SD-NEXT: bl __fixtfdi
5573+
; CHECK-SD-NEXT: adrp x8, .LCPI86_1
5574+
; CHECK-SD-NEXT: ldr q0, [sp, #32] // 16-byte Folded Reload
5575+
; CHECK-SD-NEXT: cmp w19, #0
5576+
; CHECK-SD-NEXT: ldr q1, [x8, :lo12:.LCPI86_1]
5577+
; CHECK-SD-NEXT: mov x20, #-9223372036854775808 // =0x8000000000000000
5578+
; CHECK-SD-NEXT: csel x19, x20, x0, lt
5579+
; CHECK-SD-NEXT: str q1, [sp] // 16-byte Folded Spill
5580+
; CHECK-SD-NEXT: bl __gttf2
5581+
; CHECK-SD-NEXT: ldr q0, [sp, #32] // 16-byte Folded Reload
5582+
; CHECK-SD-NEXT: mov x21, #9223372036854775807 // =0x7fffffffffffffff
5583+
; CHECK-SD-NEXT: cmp w0, #0
5584+
; CHECK-SD-NEXT: csel x19, x21, x19, gt
5585+
; CHECK-SD-NEXT: mov v1.16b, v0.16b
5586+
; CHECK-SD-NEXT: bl __unordtf2
5587+
; CHECK-SD-NEXT: cmp w0, #0
5588+
; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload
5589+
; CHECK-SD-NEXT: csel x8, xzr, x19, ne
5590+
; CHECK-SD-NEXT: fmov d0, x8
5591+
; CHECK-SD-NEXT: str q0, [sp, #32] // 16-byte Folded Spill
5592+
; CHECK-SD-NEXT: ldr q0, [sp, #48] // 16-byte Folded Reload
5593+
; CHECK-SD-NEXT: bl __getf2
5594+
; CHECK-SD-NEXT: ldr q0, [sp, #48] // 16-byte Folded Reload
5595+
; CHECK-SD-NEXT: mov w19, w0
5596+
; CHECK-SD-NEXT: bl __fixtfdi
5597+
; CHECK-SD-NEXT: ldr q0, [sp, #48] // 16-byte Folded Reload
5598+
; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Folded Reload
5599+
; CHECK-SD-NEXT: cmp w19, #0
5600+
; CHECK-SD-NEXT: csel x19, x20, x0, lt
5601+
; CHECK-SD-NEXT: bl __gttf2
5602+
; CHECK-SD-NEXT: ldr q0, [sp, #48] // 16-byte Folded Reload
5603+
; CHECK-SD-NEXT: cmp w0, #0
5604+
; CHECK-SD-NEXT: csel x19, x21, x19, gt
5605+
; CHECK-SD-NEXT: mov v1.16b, v0.16b
5606+
; CHECK-SD-NEXT: bl __unordtf2
5607+
; CHECK-SD-NEXT: cmp w0, #0
5608+
; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Folded Reload
5609+
; CHECK-SD-NEXT: csel x8, xzr, x19, ne
5610+
; CHECK-SD-NEXT: ldp x20, x19, [sp, #80] // 16-byte Folded Reload
5611+
; CHECK-SD-NEXT: fmov d0, x8
5612+
; CHECK-SD-NEXT: ldp x30, x21, [sp, #64] // 16-byte Folded Reload
5613+
; CHECK-SD-NEXT: mov v0.d[1], v1.d[0]
5614+
; CHECK-SD-NEXT: add sp, sp, #96
5615+
; CHECK-SD-NEXT: ret
5616+
;
5617+
; CHECK-GI-LABEL: test_signed_v2f128_v2i64:
5618+
; CHECK-GI: // %bb.0:
5619+
; CHECK-GI-NEXT: sub sp, sp, #112
5620+
; CHECK-GI-NEXT: stp x30, x23, [sp, #64] // 16-byte Folded Spill
5621+
; CHECK-GI-NEXT: stp x22, x21, [sp, #80] // 16-byte Folded Spill
5622+
; CHECK-GI-NEXT: stp x20, x19, [sp, #96] // 16-byte Folded Spill
5623+
; CHECK-GI-NEXT: .cfi_def_cfa_offset 112
5624+
; CHECK-GI-NEXT: .cfi_offset w19, -8
5625+
; CHECK-GI-NEXT: .cfi_offset w20, -16
5626+
; CHECK-GI-NEXT: .cfi_offset w21, -24
5627+
; CHECK-GI-NEXT: .cfi_offset w22, -32
5628+
; CHECK-GI-NEXT: .cfi_offset w23, -40
5629+
; CHECK-GI-NEXT: .cfi_offset w30, -48
5630+
; CHECK-GI-NEXT: adrp x8, .LCPI86_1
5631+
; CHECK-GI-NEXT: str q1, [sp, #48] // 16-byte Folded Spill
5632+
; CHECK-GI-NEXT: ldr q2, [x8, :lo12:.LCPI86_1]
5633+
; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Folded Spill
5634+
; CHECK-GI-NEXT: mov v1.16b, v2.16b
5635+
; CHECK-GI-NEXT: str q2, [sp, #16] // 16-byte Folded Spill
5636+
; CHECK-GI-NEXT: bl __getf2
5637+
; CHECK-GI-NEXT: ldr q0, [sp, #32] // 16-byte Folded Reload
5638+
; CHECK-GI-NEXT: cmp w0, #0
5639+
; CHECK-GI-NEXT: mov x20, #-4594234569871327232 // =0xc03e000000000000
5640+
; CHECK-GI-NEXT: fmov x8, d0
5641+
; CHECK-GI-NEXT: csel x19, x8, xzr, lt
5642+
; CHECK-GI-NEXT: mov x8, v0.d[1]
5643+
; CHECK-GI-NEXT: mov v0.d[0], x19
5644+
; CHECK-GI-NEXT: csel x21, x8, x20, lt
5645+
; CHECK-GI-NEXT: adrp x8, .LCPI86_0
5646+
; CHECK-GI-NEXT: mov v0.d[1], x21
5647+
; CHECK-GI-NEXT: ldr q1, [x8, :lo12:.LCPI86_0]
5648+
; CHECK-GI-NEXT: str q1, [sp] // 16-byte Folded Spill
5649+
; CHECK-GI-NEXT: bl __gttf2
5650+
; CHECK-GI-NEXT: mov x22, #-1125899906842624 // =0xfffc000000000000
5651+
; CHECK-GI-NEXT: cmp w0, #0
5652+
; CHECK-GI-NEXT: mov x23, #4629137466983448575 // =0x403dffffffffffff
5653+
; CHECK-GI-NEXT: csel x8, x19, x22, gt
5654+
; CHECK-GI-NEXT: mov v0.d[0], x8
5655+
; CHECK-GI-NEXT: csel x8, x21, x23, gt
5656+
; CHECK-GI-NEXT: mov v0.d[1], x8
5657+
; CHECK-GI-NEXT: bl __fixtfdi
5658+
; CHECK-GI-NEXT: ldr q0, [sp, #32] // 16-byte Folded Reload
5659+
; CHECK-GI-NEXT: mov x19, x0
5660+
; CHECK-GI-NEXT: mov v1.16b, v0.16b
5661+
; CHECK-GI-NEXT: bl __unordtf2
5662+
; CHECK-GI-NEXT: ldr q0, [sp, #48] // 16-byte Folded Reload
5663+
; CHECK-GI-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload
5664+
; CHECK-GI-NEXT: cmp w0, #0
5665+
; CHECK-GI-NEXT: csel x21, xzr, x19, ne
5666+
; CHECK-GI-NEXT: bl __getf2
5667+
; CHECK-GI-NEXT: ldr q0, [sp, #48] // 16-byte Folded Reload
5668+
; CHECK-GI-NEXT: cmp w0, #0
5669+
; CHECK-GI-NEXT: ldr q1, [sp] // 16-byte Folded Reload
5670+
; CHECK-GI-NEXT: fmov x8, d0
5671+
; CHECK-GI-NEXT: csel x19, x8, xzr, lt
5672+
; CHECK-GI-NEXT: mov x8, v0.d[1]
5673+
; CHECK-GI-NEXT: mov v0.d[0], x19
5674+
; CHECK-GI-NEXT: csel x20, x8, x20, lt
5675+
; CHECK-GI-NEXT: mov v0.d[1], x20
5676+
; CHECK-GI-NEXT: bl __gttf2
5677+
; CHECK-GI-NEXT: cmp w0, #0
5678+
; CHECK-GI-NEXT: csel x8, x19, x22, gt
5679+
; CHECK-GI-NEXT: mov v0.d[0], x8
5680+
; CHECK-GI-NEXT: csel x8, x20, x23, gt
5681+
; CHECK-GI-NEXT: mov v0.d[1], x8
5682+
; CHECK-GI-NEXT: bl __fixtfdi
5683+
; CHECK-GI-NEXT: ldr q0, [sp, #48] // 16-byte Folded Reload
5684+
; CHECK-GI-NEXT: mov x19, x0
5685+
; CHECK-GI-NEXT: mov v1.16b, v0.16b
5686+
; CHECK-GI-NEXT: bl __unordtf2
5687+
; CHECK-GI-NEXT: mov v0.d[0], x21
5688+
; CHECK-GI-NEXT: cmp w0, #0
5689+
; CHECK-GI-NEXT: csel x8, xzr, x19, ne
5690+
; CHECK-GI-NEXT: ldp x20, x19, [sp, #96] // 16-byte Folded Reload
5691+
; CHECK-GI-NEXT: ldp x22, x21, [sp, #80] // 16-byte Folded Reload
5692+
; CHECK-GI-NEXT: ldp x30, x23, [sp, #64] // 16-byte Folded Reload
5693+
; CHECK-GI-NEXT: mov v0.d[1], x8
5694+
; CHECK-GI-NEXT: add sp, sp, #112
5695+
; CHECK-GI-NEXT: ret
5696+
%x = call <2 x i64> @llvm.fptosi.sat.v2f128.v2i64(<2 x fp128> %f)
5697+
ret <2 x i64> %x
5698+
}

llvm/test/CodeGen/AArch64/fptoui-sat-vector.ll

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4546,3 +4546,121 @@ define <16 x i16> @test_unsigned_v16f64_v16i16(<16 x double> %f) {
45464546
%x = call <16 x i16> @llvm.fptoui.sat.v16f64.v16i16(<16 x double> %f)
45474547
ret <16 x i16> %x
45484548
}
4549+
4550+
define <2 x i64> @test_signed_v2f128_v2i64(<2 x fp128> %f) {
4551+
; CHECK-SD-LABEL: test_signed_v2f128_v2i64:
4552+
; CHECK-SD: // %bb.0:
4553+
; CHECK-SD-NEXT: sub sp, sp, #80
4554+
; CHECK-SD-NEXT: stp x30, x19, [sp, #64] // 16-byte Folded Spill
4555+
; CHECK-SD-NEXT: .cfi_def_cfa_offset 80
4556+
; CHECK-SD-NEXT: .cfi_offset w19, -8
4557+
; CHECK-SD-NEXT: .cfi_offset w30, -16
4558+
; CHECK-SD-NEXT: mov v2.16b, v1.16b
4559+
; CHECK-SD-NEXT: stp q1, q0, [sp, #32] // 32-byte Folded Spill
4560+
; CHECK-SD-NEXT: adrp x8, .LCPI86_0
4561+
; CHECK-SD-NEXT: ldr q1, [x8, :lo12:.LCPI86_0]
4562+
; CHECK-SD-NEXT: mov v0.16b, v2.16b
4563+
; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Folded Spill
4564+
; CHECK-SD-NEXT: bl __getf2
4565+
; CHECK-SD-NEXT: ldr q0, [sp, #32] // 16-byte Folded Reload
4566+
; CHECK-SD-NEXT: mov w19, w0
4567+
; CHECK-SD-NEXT: bl __fixunstfdi
4568+
; CHECK-SD-NEXT: adrp x8, .LCPI86_1
4569+
; CHECK-SD-NEXT: ldr q0, [sp, #32] // 16-byte Folded Reload
4570+
; CHECK-SD-NEXT: cmp w19, #0
4571+
; CHECK-SD-NEXT: ldr q1, [x8, :lo12:.LCPI86_1]
4572+
; CHECK-SD-NEXT: csel x19, xzr, x0, lt
4573+
; CHECK-SD-NEXT: str q1, [sp] // 16-byte Folded Spill
4574+
; CHECK-SD-NEXT: bl __gttf2
4575+
; CHECK-SD-NEXT: cmp w0, #0
4576+
; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload
4577+
; CHECK-SD-NEXT: csinv x8, x19, xzr, le
4578+
; CHECK-SD-NEXT: fmov d0, x8
4579+
; CHECK-SD-NEXT: str q0, [sp, #32] // 16-byte Folded Spill
4580+
; CHECK-SD-NEXT: ldr q0, [sp, #48] // 16-byte Folded Reload
4581+
; CHECK-SD-NEXT: bl __getf2
4582+
; CHECK-SD-NEXT: ldr q0, [sp, #48] // 16-byte Folded Reload
4583+
; CHECK-SD-NEXT: mov w19, w0
4584+
; CHECK-SD-NEXT: bl __fixunstfdi
4585+
; CHECK-SD-NEXT: ldr q0, [sp, #48] // 16-byte Folded Reload
4586+
; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Folded Reload
4587+
; CHECK-SD-NEXT: cmp w19, #0
4588+
; CHECK-SD-NEXT: csel x19, xzr, x0, lt
4589+
; CHECK-SD-NEXT: bl __gttf2
4590+
; CHECK-SD-NEXT: cmp w0, #0
4591+
; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Folded Reload
4592+
; CHECK-SD-NEXT: csinv x8, x19, xzr, le
4593+
; CHECK-SD-NEXT: ldp x30, x19, [sp, #64] // 16-byte Folded Reload
4594+
; CHECK-SD-NEXT: fmov d0, x8
4595+
; CHECK-SD-NEXT: mov v0.d[1], v1.d[0]
4596+
; CHECK-SD-NEXT: add sp, sp, #80
4597+
; CHECK-SD-NEXT: ret
4598+
;
4599+
; CHECK-GI-LABEL: test_signed_v2f128_v2i64:
4600+
; CHECK-GI: // %bb.0:
4601+
; CHECK-GI-NEXT: sub sp, sp, #96
4602+
; CHECK-GI-NEXT: stp x30, x23, [sp, #48] // 16-byte Folded Spill
4603+
; CHECK-GI-NEXT: stp x22, x21, [sp, #64] // 16-byte Folded Spill
4604+
; CHECK-GI-NEXT: stp x20, x19, [sp, #80] // 16-byte Folded Spill
4605+
; CHECK-GI-NEXT: .cfi_def_cfa_offset 96
4606+
; CHECK-GI-NEXT: .cfi_offset w19, -8
4607+
; CHECK-GI-NEXT: .cfi_offset w20, -16
4608+
; CHECK-GI-NEXT: .cfi_offset w21, -24
4609+
; CHECK-GI-NEXT: .cfi_offset w22, -32
4610+
; CHECK-GI-NEXT: .cfi_offset w23, -40
4611+
; CHECK-GI-NEXT: .cfi_offset w30, -48
4612+
; CHECK-GI-NEXT: adrp x8, .LCPI86_1
4613+
; CHECK-GI-NEXT: str q0, [sp] // 16-byte Folded Spill
4614+
; CHECK-GI-NEXT: ldr q2, [x8, :lo12:.LCPI86_1]
4615+
; CHECK-GI-NEXT: stp q2, q1, [sp, #16] // 32-byte Folded Spill
4616+
; CHECK-GI-NEXT: mov v1.16b, v2.16b
4617+
; CHECK-GI-NEXT: bl __getf2
4618+
; CHECK-GI-NEXT: ldr q0, [sp] // 16-byte Folded Reload
4619+
; CHECK-GI-NEXT: cmp w0, #0
4620+
; CHECK-GI-NEXT: fmov x8, d0
4621+
; CHECK-GI-NEXT: csel x19, x8, xzr, lt
4622+
; CHECK-GI-NEXT: mov x8, v0.d[1]
4623+
; CHECK-GI-NEXT: mov v0.d[0], x19
4624+
; CHECK-GI-NEXT: csel x20, x8, xzr, lt
4625+
; CHECK-GI-NEXT: adrp x8, .LCPI86_0
4626+
; CHECK-GI-NEXT: mov v0.d[1], x20
4627+
; CHECK-GI-NEXT: ldr q1, [x8, :lo12:.LCPI86_0]
4628+
; CHECK-GI-NEXT: str q1, [sp] // 16-byte Folded Spill
4629+
; CHECK-GI-NEXT: bl __gttf2
4630+
; CHECK-GI-NEXT: mov x21, #-562949953421312 // =0xfffe000000000000
4631+
; CHECK-GI-NEXT: cmp w0, #0
4632+
; CHECK-GI-NEXT: mov x22, #4629418941960159231 // =0x403effffffffffff
4633+
; CHECK-GI-NEXT: csel x8, x19, x21, gt
4634+
; CHECK-GI-NEXT: mov v0.d[0], x8
4635+
; CHECK-GI-NEXT: csel x8, x20, x22, gt
4636+
; CHECK-GI-NEXT: mov v0.d[1], x8
4637+
; CHECK-GI-NEXT: bl __fixunstfdi
4638+
; CHECK-GI-NEXT: ldp q1, q0, [sp, #16] // 32-byte Folded Reload
4639+
; CHECK-GI-NEXT: mov x19, x0
4640+
; CHECK-GI-NEXT: bl __getf2
4641+
; CHECK-GI-NEXT: ldr q0, [sp, #32] // 16-byte Folded Reload
4642+
; CHECK-GI-NEXT: cmp w0, #0
4643+
; CHECK-GI-NEXT: ldr q1, [sp] // 16-byte Folded Reload
4644+
; CHECK-GI-NEXT: fmov x8, d0
4645+
; CHECK-GI-NEXT: csel x20, x8, xzr, lt
4646+
; CHECK-GI-NEXT: mov x8, v0.d[1]
4647+
; CHECK-GI-NEXT: mov v0.d[0], x20
4648+
; CHECK-GI-NEXT: csel x23, x8, xzr, lt
4649+
; CHECK-GI-NEXT: mov v0.d[1], x23
4650+
; CHECK-GI-NEXT: bl __gttf2
4651+
; CHECK-GI-NEXT: cmp w0, #0
4652+
; CHECK-GI-NEXT: csel x8, x20, x21, gt
4653+
; CHECK-GI-NEXT: mov v0.d[0], x8
4654+
; CHECK-GI-NEXT: csel x8, x23, x22, gt
4655+
; CHECK-GI-NEXT: mov v0.d[1], x8
4656+
; CHECK-GI-NEXT: bl __fixunstfdi
4657+
; CHECK-GI-NEXT: mov v0.d[0], x19
4658+
; CHECK-GI-NEXT: ldp x20, x19, [sp, #80] // 16-byte Folded Reload
4659+
; CHECK-GI-NEXT: ldp x22, x21, [sp, #64] // 16-byte Folded Reload
4660+
; CHECK-GI-NEXT: ldp x30, x23, [sp, #48] // 16-byte Folded Reload
4661+
; CHECK-GI-NEXT: mov v0.d[1], x0
4662+
; CHECK-GI-NEXT: add sp, sp, #96
4663+
; CHECK-GI-NEXT: ret
4664+
%x = call <2 x i64> @llvm.fptoui.sat.v2f128.v2i64(<2 x fp128> %f)
4665+
ret <2 x i64> %x
4666+
}

0 commit comments

Comments
 (0)