[AArch64][llvm] Allow FPRCVT insns to run in streaming mode if safe (#177334)
For FEAT_FPRCVT instructions, allow them to run in streaming mode if safe
This commit is contained in:
parent
16ef4ed48f
commit
2de6d980de
@ -20686,6 +20686,9 @@ tryToReplaceScalarFPConversionWithSVE(SDNode *N, SelectionDAG &DAG,
|
||||
if (DCI.isBeforeLegalizeOps())
|
||||
return SDValue();
|
||||
|
||||
if (Subtarget->hasFPRCVT())
|
||||
return SDValue();
|
||||
|
||||
if (!Subtarget->isSVEorStreamingSVEAvailable() ||
|
||||
(!Subtarget->isStreaming() && !Subtarget->isStreamingCompatible()))
|
||||
return SDValue();
|
||||
|
||||
@ -5360,7 +5360,7 @@ defm FCVTZU : FPToIntegerUnscaled<0b11, 0b001, "fcvtzu", any_fp_to_uint>;
|
||||
defm FCVTZS : FPToIntegerScaled<0b11, 0b000, "fcvtzs", any_fp_to_sint>;
|
||||
defm FCVTZU : FPToIntegerScaled<0b11, 0b001, "fcvtzu", any_fp_to_uint>;
|
||||
|
||||
let Predicates = [HasNEON, HasFPRCVT] in{
|
||||
let Predicates = [HasFPRCVT] in{
|
||||
defm FCVTAS : FPToIntegerSIMDScalar<0b11, 0b010, "fcvtas", int_aarch64_neon_fcvtas>;
|
||||
defm FCVTAU : FPToIntegerSIMDScalar<0b11, 0b011, "fcvtau", int_aarch64_neon_fcvtau>;
|
||||
defm FCVTMS : FPToIntegerSIMDScalar<0b10, 0b100, "fcvtms", int_aarch64_neon_fcvtms>;
|
||||
@ -5403,7 +5403,7 @@ def : Pat<(i64 (any_llround f64:$Rn)),
|
||||
defm SCVTF : IntegerToFP<0b00, 0b010, "scvtf", any_sint_to_fp>;
|
||||
defm UCVTF : IntegerToFP<0b00, 0b011, "ucvtf", any_uint_to_fp>;
|
||||
|
||||
let Predicates = [HasNEON, HasFPRCVT] in {
|
||||
let Predicates = [HasFPRCVT] in {
|
||||
defm SCVTF : IntegerToFPSIMDScalar<0b11, 0b100, "scvtf", any_sint_to_fp>;
|
||||
defm UCVTF : IntegerToFPSIMDScalar<0b11, 0b101, "ucvtf", any_uint_to_fp>;
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -51,16 +51,12 @@ define half @scvtf_bitcast_f32_to_f16(float %f) nounwind {
|
||||
;
|
||||
; CHECK-SME-LABEL: scvtf_bitcast_f32_to_f16:
|
||||
; CHECK-SME: // %bb.0:
|
||||
; CHECK-SME-NEXT: ptrue p0.s
|
||||
; CHECK-SME-NEXT: scvtf z0.h, p0/m, z0.s
|
||||
; CHECK-SME-NEXT: scvtf h0, s0
|
||||
; CHECK-SME-NEXT: ret
|
||||
;
|
||||
; CHECK-SVE-LABEL: scvtf_bitcast_f32_to_f16:
|
||||
; CHECK-SVE: // %bb.0:
|
||||
; CHECK-SVE-NEXT: ptrue p0.s
|
||||
; CHECK-SVE-NEXT: // kill: def $s0 killed $s0 def $z0
|
||||
; CHECK-SVE-NEXT: scvtf z0.h, p0/m, z0.s
|
||||
; CHECK-SVE-NEXT: // kill: def $h0 killed $h0 killed $z0
|
||||
; CHECK-SVE-NEXT: scvtf h0, s0
|
||||
; CHECK-SVE-NEXT: ret
|
||||
%i = bitcast float %f to i32
|
||||
%r = sitofp i32 %i to half
|
||||
@ -75,16 +71,12 @@ define half @ucvtf_bitcast_f32_to_f16(float %f) nounwind {
|
||||
;
|
||||
; CHECK-SME-LABEL: ucvtf_bitcast_f32_to_f16:
|
||||
; CHECK-SME: // %bb.0:
|
||||
; CHECK-SME-NEXT: ptrue p0.s
|
||||
; CHECK-SME-NEXT: ucvtf z0.h, p0/m, z0.s
|
||||
; CHECK-SME-NEXT: ucvtf h0, s0
|
||||
; CHECK-SME-NEXT: ret
|
||||
;
|
||||
; CHECK-SVE-LABEL: ucvtf_bitcast_f32_to_f16:
|
||||
; CHECK-SVE: // %bb.0:
|
||||
; CHECK-SVE-NEXT: ptrue p0.s
|
||||
; CHECK-SVE-NEXT: // kill: def $s0 killed $s0 def $z0
|
||||
; CHECK-SVE-NEXT: ucvtf z0.h, p0/m, z0.s
|
||||
; CHECK-SVE-NEXT: // kill: def $h0 killed $h0 killed $z0
|
||||
; CHECK-SVE-NEXT: ucvtf h0, s0
|
||||
; CHECK-SVE-NEXT: ret
|
||||
%i = bitcast float %f to i32
|
||||
%r = uitofp i32 %i to half
|
||||
@ -99,16 +91,12 @@ define float @scvtf_bitcast_f64_to_f32(double %d) nounwind {
|
||||
;
|
||||
; CHECK-SME-LABEL: scvtf_bitcast_f64_to_f32:
|
||||
; CHECK-SME: // %bb.0:
|
||||
; CHECK-SME-NEXT: ptrue p0.d
|
||||
; CHECK-SME-NEXT: scvtf z0.s, p0/m, z0.d
|
||||
; CHECK-SME-NEXT: scvtf s0, d0
|
||||
; CHECK-SME-NEXT: ret
|
||||
;
|
||||
; CHECK-SVE-LABEL: scvtf_bitcast_f64_to_f32:
|
||||
; CHECK-SVE: // %bb.0:
|
||||
; CHECK-SVE-NEXT: ptrue p0.d
|
||||
; CHECK-SVE-NEXT: // kill: def $d0 killed $d0 def $z0
|
||||
; CHECK-SVE-NEXT: scvtf z0.s, p0/m, z0.d
|
||||
; CHECK-SVE-NEXT: // kill: def $s0 killed $s0 killed $z0
|
||||
; CHECK-SVE-NEXT: scvtf s0, d0
|
||||
; CHECK-SVE-NEXT: ret
|
||||
%i = bitcast double %d to i64
|
||||
%r = sitofp i64 %i to float
|
||||
@ -123,16 +111,12 @@ define float @ucvtf_bitcast_f64_to_f32(double %d) nounwind {
|
||||
;
|
||||
; CHECK-SME-LABEL: ucvtf_bitcast_f64_to_f32:
|
||||
; CHECK-SME: // %bb.0:
|
||||
; CHECK-SME-NEXT: ptrue p0.d
|
||||
; CHECK-SME-NEXT: ucvtf z0.s, p0/m, z0.d
|
||||
; CHECK-SME-NEXT: ucvtf s0, d0
|
||||
; CHECK-SME-NEXT: ret
|
||||
;
|
||||
; CHECK-SVE-LABEL: ucvtf_bitcast_f64_to_f32:
|
||||
; CHECK-SVE: // %bb.0:
|
||||
; CHECK-SVE-NEXT: ptrue p0.d
|
||||
; CHECK-SVE-NEXT: // kill: def $d0 killed $d0 def $z0
|
||||
; CHECK-SVE-NEXT: ucvtf z0.s, p0/m, z0.d
|
||||
; CHECK-SVE-NEXT: // kill: def $s0 killed $s0 killed $z0
|
||||
; CHECK-SVE-NEXT: ucvtf s0, d0
|
||||
; CHECK-SVE-NEXT: ret
|
||||
%i = bitcast double %d to i64
|
||||
%r = uitofp i64 %i to float
|
||||
@ -147,16 +131,12 @@ define half @scvtf_bitcast_f64_to_f16(double %d) nounwind {
|
||||
;
|
||||
; CHECK-SME-LABEL: scvtf_bitcast_f64_to_f16:
|
||||
; CHECK-SME: // %bb.0:
|
||||
; CHECK-SME-NEXT: ptrue p0.d
|
||||
; CHECK-SME-NEXT: scvtf z0.h, p0/m, z0.d
|
||||
; CHECK-SME-NEXT: scvtf h0, d0
|
||||
; CHECK-SME-NEXT: ret
|
||||
;
|
||||
; CHECK-SVE-LABEL: scvtf_bitcast_f64_to_f16:
|
||||
; CHECK-SVE: // %bb.0:
|
||||
; CHECK-SVE-NEXT: ptrue p0.d
|
||||
; CHECK-SVE-NEXT: // kill: def $d0 killed $d0 def $z0
|
||||
; CHECK-SVE-NEXT: scvtf z0.h, p0/m, z0.d
|
||||
; CHECK-SVE-NEXT: // kill: def $h0 killed $h0 killed $z0
|
||||
; CHECK-SVE-NEXT: scvtf h0, d0
|
||||
; CHECK-SVE-NEXT: ret
|
||||
%i = bitcast double %d to i64
|
||||
%r = sitofp i64 %i to half
|
||||
@ -171,16 +151,12 @@ define half @ucvtf_bitcast_f64_to_f16(double %d) nounwind {
|
||||
;
|
||||
; CHECK-SME-LABEL: ucvtf_bitcast_f64_to_f16:
|
||||
; CHECK-SME: // %bb.0:
|
||||
; CHECK-SME-NEXT: ptrue p0.d
|
||||
; CHECK-SME-NEXT: ucvtf z0.h, p0/m, z0.d
|
||||
; CHECK-SME-NEXT: ucvtf h0, d0
|
||||
; CHECK-SME-NEXT: ret
|
||||
;
|
||||
; CHECK-SVE-LABEL: ucvtf_bitcast_f64_to_f16:
|
||||
; CHECK-SVE: // %bb.0:
|
||||
; CHECK-SVE-NEXT: ptrue p0.d
|
||||
; CHECK-SVE-NEXT: // kill: def $d0 killed $d0 def $z0
|
||||
; CHECK-SVE-NEXT: ucvtf z0.h, p0/m, z0.d
|
||||
; CHECK-SVE-NEXT: // kill: def $h0 killed $h0 killed $z0
|
||||
; CHECK-SVE-NEXT: ucvtf h0, d0
|
||||
; CHECK-SVE-NEXT: ret
|
||||
%i = bitcast double %d to i64
|
||||
%r = uitofp i64 %i to half
|
||||
@ -195,16 +171,12 @@ define float @scvtf_bitcast_f32_to_f32(float %f) nounwind {
|
||||
;
|
||||
; CHECK-SME-LABEL: scvtf_bitcast_f32_to_f32:
|
||||
; CHECK-SME: // %bb.0:
|
||||
; CHECK-SME-NEXT: ptrue p0.s
|
||||
; CHECK-SME-NEXT: scvtf z0.s, p0/m, z0.s
|
||||
; CHECK-SME-NEXT: scvtf s0, s0
|
||||
; CHECK-SME-NEXT: ret
|
||||
;
|
||||
; CHECK-SVE-LABEL: scvtf_bitcast_f32_to_f32:
|
||||
; CHECK-SVE: // %bb.0:
|
||||
; CHECK-SVE-NEXT: ptrue p0.s
|
||||
; CHECK-SVE-NEXT: // kill: def $s0 killed $s0 def $z0
|
||||
; CHECK-SVE-NEXT: scvtf z0.s, p0/m, z0.s
|
||||
; CHECK-SVE-NEXT: // kill: def $s0 killed $s0 killed $z0
|
||||
; CHECK-SVE-NEXT: scvtf s0, s0
|
||||
; CHECK-SVE-NEXT: ret
|
||||
%i = bitcast float %f to i32
|
||||
%r = sitofp i32 %i to float
|
||||
@ -219,16 +191,12 @@ define float @ucvtf_bitcast_f32_to_f32(float %f) nounwind {
|
||||
;
|
||||
; CHECK-SME-LABEL: ucvtf_bitcast_f32_to_f32:
|
||||
; CHECK-SME: // %bb.0:
|
||||
; CHECK-SME-NEXT: ptrue p0.s
|
||||
; CHECK-SME-NEXT: ucvtf z0.s, p0/m, z0.s
|
||||
; CHECK-SME-NEXT: ucvtf s0, s0
|
||||
; CHECK-SME-NEXT: ret
|
||||
;
|
||||
; CHECK-SVE-LABEL: ucvtf_bitcast_f32_to_f32:
|
||||
; CHECK-SVE: // %bb.0:
|
||||
; CHECK-SVE-NEXT: ptrue p0.s
|
||||
; CHECK-SVE-NEXT: // kill: def $s0 killed $s0 def $z0
|
||||
; CHECK-SVE-NEXT: ucvtf z0.s, p0/m, z0.s
|
||||
; CHECK-SVE-NEXT: // kill: def $s0 killed $s0 killed $z0
|
||||
; CHECK-SVE-NEXT: ucvtf s0, s0
|
||||
; CHECK-SVE-NEXT: ret
|
||||
%i = bitcast float %f to i32
|
||||
%r = uitofp i32 %i to float
|
||||
@ -243,16 +211,12 @@ define double @scvtf_bitcast_f64_to_f64(double %d) nounwind {
|
||||
;
|
||||
; CHECK-SME-LABEL: scvtf_bitcast_f64_to_f64:
|
||||
; CHECK-SME: // %bb.0:
|
||||
; CHECK-SME-NEXT: ptrue p0.d
|
||||
; CHECK-SME-NEXT: scvtf z0.d, p0/m, z0.d
|
||||
; CHECK-SME-NEXT: scvtf d0, d0
|
||||
; CHECK-SME-NEXT: ret
|
||||
;
|
||||
; CHECK-SVE-LABEL: scvtf_bitcast_f64_to_f64:
|
||||
; CHECK-SVE: // %bb.0:
|
||||
; CHECK-SVE-NEXT: ptrue p0.d
|
||||
; CHECK-SVE-NEXT: // kill: def $d0 killed $d0 def $z0
|
||||
; CHECK-SVE-NEXT: scvtf z0.d, p0/m, z0.d
|
||||
; CHECK-SVE-NEXT: // kill: def $d0 killed $d0 killed $z0
|
||||
; CHECK-SVE-NEXT: scvtf d0, d0
|
||||
; CHECK-SVE-NEXT: ret
|
||||
%i = bitcast double %d to i64
|
||||
%r = sitofp i64 %i to double
|
||||
@ -267,16 +231,12 @@ define double @ucvtf_bitcast_f64_to_f64(double %d) nounwind {
|
||||
;
|
||||
; CHECK-SME-LABEL: ucvtf_bitcast_f64_to_f64:
|
||||
; CHECK-SME: // %bb.0:
|
||||
; CHECK-SME-NEXT: ptrue p0.d
|
||||
; CHECK-SME-NEXT: ucvtf z0.d, p0/m, z0.d
|
||||
; CHECK-SME-NEXT: ucvtf d0, d0
|
||||
; CHECK-SME-NEXT: ret
|
||||
;
|
||||
; CHECK-SVE-LABEL: ucvtf_bitcast_f64_to_f64:
|
||||
; CHECK-SVE: // %bb.0:
|
||||
; CHECK-SVE-NEXT: ptrue p0.d
|
||||
; CHECK-SVE-NEXT: // kill: def $d0 killed $d0 def $z0
|
||||
; CHECK-SVE-NEXT: ucvtf z0.d, p0/m, z0.d
|
||||
; CHECK-SVE-NEXT: // kill: def $d0 killed $d0 killed $z0
|
||||
; CHECK-SVE-NEXT: ucvtf d0, d0
|
||||
; CHECK-SVE-NEXT: ret
|
||||
%i = bitcast double %d to i64
|
||||
%r = uitofp i64 %i to double
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user