Skip to content

Commit 65058a8

Browse files
authored
[AArch64][SelectionDAG] Expand v1f64-typed sin,cos,pow,log,exp intrinsics (#83745)
This patch makes NEON-enabled AArch64 backend expand the `sin, cos, pow, log, log2, log10, exp, exp2, exp10` intrinsics for `v1f64` data type, all of which caused selection failure before this patch. Fixes #83729
1 parent 8f878c5 commit 65058a8

File tree

6 files changed

+176
-5
lines changed

6 files changed

+176
-5
lines changed

llvm/lib/Target/AArch64/AArch64ISelLowering.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1131,6 +1131,9 @@ AArch64TargetLowering::AArch64TargetLowering(const TargetMachine &TM,
11311131
ISD::FMUL, ISD::FDIV, ISD::FMA,
11321132
ISD::FNEG, ISD::FABS, ISD::FCEIL,
11331133
ISD::FSQRT, ISD::FFLOOR, ISD::FNEARBYINT,
1134+
ISD::FSIN, ISD::FCOS, ISD::FPOW,
1135+
ISD::FLOG, ISD::FLOG2, ISD::FLOG10,
1136+
ISD::FEXP, ISD::FEXP2, ISD::FEXP10,
11341137
ISD::FRINT, ISD::FROUND, ISD::FROUNDEVEN,
11351138
ISD::FTRUNC, ISD::FMINNUM, ISD::FMAXNUM,
11361139
ISD::FMINIMUM, ISD::FMAXIMUM, ISD::STRICT_FADD,

llvm/test/CodeGen/AArch64/fexplog.ll

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,19 @@ entry:
3636
ret half %c
3737
}
3838

39+
define <1 x double> @exp_v1f64(<1 x double> %x) {
40+
; CHECK-LABEL: exp_v1f64:
41+
; CHECK: // %bb.0:
42+
; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
43+
; CHECK-NEXT: .cfi_def_cfa_offset 16
44+
; CHECK-NEXT: .cfi_offset w30, -16
45+
; CHECK-NEXT: bl exp
46+
; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
47+
; CHECK-NEXT: ret
48+
%c = call <1 x double> @llvm.exp.v1f64(<1 x double> %x)
49+
ret <1 x double> %c
50+
}
51+
3952
define <2 x double> @exp_v2f64(<2 x double> %a) {
4053
; CHECK-SD-LABEL: exp_v2f64:
4154
; CHECK-SD: // %bb.0: // %entry
@@ -1293,6 +1306,19 @@ entry:
12931306
ret half %c
12941307
}
12951308

1309+
define <1 x double> @exp2_v1f64(<1 x double> %x) {
1310+
; CHECK-LABEL: exp2_v1f64:
1311+
; CHECK: // %bb.0:
1312+
; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
1313+
; CHECK-NEXT: .cfi_def_cfa_offset 16
1314+
; CHECK-NEXT: .cfi_offset w30, -16
1315+
; CHECK-NEXT: bl exp2
1316+
; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
1317+
; CHECK-NEXT: ret
1318+
%c = call <1 x double> @llvm.exp2.v1f64(<1 x double> %x)
1319+
ret <1 x double> %c
1320+
}
1321+
12961322
define <2 x double> @exp2_v2f64(<2 x double> %a) {
12971323
; CHECK-SD-LABEL: exp2_v2f64:
12981324
; CHECK-SD: // %bb.0: // %entry
@@ -2550,6 +2576,19 @@ entry:
25502576
ret half %c
25512577
}
25522578

2579+
define <1 x double> @log_v1f64(<1 x double> %x) {
2580+
; CHECK-LABEL: log_v1f64:
2581+
; CHECK: // %bb.0:
2582+
; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
2583+
; CHECK-NEXT: .cfi_def_cfa_offset 16
2584+
; CHECK-NEXT: .cfi_offset w30, -16
2585+
; CHECK-NEXT: bl log
2586+
; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
2587+
; CHECK-NEXT: ret
2588+
%c = call <1 x double> @llvm.log.v1f64(<1 x double> %x)
2589+
ret <1 x double> %c
2590+
}
2591+
25532592
define <2 x double> @log_v2f64(<2 x double> %a) {
25542593
; CHECK-SD-LABEL: log_v2f64:
25552594
; CHECK-SD: // %bb.0: // %entry
@@ -3807,6 +3846,19 @@ entry:
38073846
ret half %c
38083847
}
38093848

3849+
define <1 x double> @log2_v1f64(<1 x double> %x) {
3850+
; CHECK-LABEL: log2_v1f64:
3851+
; CHECK: // %bb.0:
3852+
; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
3853+
; CHECK-NEXT: .cfi_def_cfa_offset 16
3854+
; CHECK-NEXT: .cfi_offset w30, -16
3855+
; CHECK-NEXT: bl log2
3856+
; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
3857+
; CHECK-NEXT: ret
3858+
%c = call <1 x double> @llvm.log2.v1f64(<1 x double> %x)
3859+
ret <1 x double> %c
3860+
}
3861+
38103862
define <2 x double> @log2_v2f64(<2 x double> %a) {
38113863
; CHECK-SD-LABEL: log2_v2f64:
38123864
; CHECK-SD: // %bb.0: // %entry
@@ -5064,6 +5116,19 @@ entry:
50645116
ret half %c
50655117
}
50665118

5119+
define <1 x double> @log10_v1f64(<1 x double> %x) {
5120+
; CHECK-LABEL: log10_v1f64:
5121+
; CHECK: // %bb.0:
5122+
; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
5123+
; CHECK-NEXT: .cfi_def_cfa_offset 16
5124+
; CHECK-NEXT: .cfi_offset w30, -16
5125+
; CHECK-NEXT: bl log10
5126+
; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
5127+
; CHECK-NEXT: ret
5128+
%c = call <1 x double> @llvm.log10.v1f64(<1 x double> %x)
5129+
ret <1 x double> %c
5130+
}
5131+
50675132
define <2 x double> @log10_v2f64(<2 x double> %a) {
50685133
; CHECK-SD-LABEL: log10_v2f64:
50695134
; CHECK-SD: // %bb.0: // %entry

llvm/test/CodeGen/AArch64/fp-intrinsics.ll

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1477,6 +1477,61 @@ define fp128 @fpext_f128_f64(double %x) #0 {
14771477
ret fp128 %val
14781478
}
14791479

1480+
; CHECK-LABEL: sin_v1f64:
1481+
; CHECK: bl sin
1482+
define <1 x double> @sin_v1f64(<1 x double> %x, <1 x double> %y) {
1483+
%val = call <1 x double> @llvm.experimental.constrained.sin.v1f64(<1 x double> %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0
1484+
ret <1 x double> %val
1485+
}
1486+
1487+
; CHECK-LABEL: cos_v1f64:
1488+
; CHECK: bl cos
1489+
define <1 x double> @cos_v1f64(<1 x double> %x, <1 x double> %y) {
1490+
%val = call <1 x double> @llvm.experimental.constrained.cos.v1f64(<1 x double> %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0
1491+
ret <1 x double> %val
1492+
}
1493+
1494+
; CHECK-LABEL: pow_v1f64:
1495+
; CHECK: bl pow
1496+
define <1 x double> @pow_v1f64(<1 x double> %x, <1 x double> %y) {
1497+
%val = call <1 x double> @llvm.experimental.constrained.pow.v1f64(<1 x double> %x, <1 x double> %y, metadata !"round.tonearest", metadata !"fpexcept.strict") #0
1498+
ret <1 x double> %val
1499+
}
1500+
1501+
; CHECK-LABEL: log_v1f64:
1502+
; CHECK: bl log
1503+
define <1 x double> @log_v1f64(<1 x double> %x, <1 x double> %y) {
1504+
%val = call <1 x double> @llvm.experimental.constrained.log.v1f64(<1 x double> %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0
1505+
ret <1 x double> %val
1506+
}
1507+
1508+
; CHECK-LABEL: log2_v1f64:
1509+
; CHECK: bl log2
1510+
define <1 x double> @log2_v1f64(<1 x double> %x, <1 x double> %y) {
1511+
%val = call <1 x double> @llvm.experimental.constrained.log2.v1f64(<1 x double> %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0
1512+
ret <1 x double> %val
1513+
}
1514+
1515+
; CHECK-LABEL: log10_v1f64:
1516+
; CHECK: bl log10
1517+
define <1 x double> @log10_v1f64(<1 x double> %x, <1 x double> %y) {
1518+
%val = call <1 x double> @llvm.experimental.constrained.log10.v1f64(<1 x double> %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0
1519+
ret <1 x double> %val
1520+
}
1521+
1522+
; CHECK-LABEL: exp_v1f64:
1523+
; CHECK: bl exp
1524+
define <1 x double> @exp_v1f64(<1 x double> %x, <1 x double> %y) {
1525+
%val = call <1 x double> @llvm.experimental.constrained.exp.v1f64(<1 x double> %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0
1526+
ret <1 x double> %val
1527+
}
1528+
1529+
; CHECK-LABEL: exp2_v1f64:
1530+
; CHECK: bl exp2
1531+
define <1 x double> @exp2_v1f64(<1 x double> %x, <1 x double> %y) {
1532+
%val = call <1 x double> @llvm.experimental.constrained.exp2.v1f64(<1 x double> %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0
1533+
ret <1 x double> %val
1534+
}
14801535

14811536
attributes #0 = { strictfp }
14821537

llvm/test/CodeGen/AArch64/fpow.ll

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,21 @@ entry:
3737
ret half %c
3838
}
3939

40+
define <1 x double> @pow_v1f64(<1 x double> %x) {
41+
; CHECK-LABEL: pow_v1f64:
42+
; CHECK: // %bb.0:
43+
; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
44+
; CHECK-NEXT: .cfi_def_cfa_offset 16
45+
; CHECK-NEXT: .cfi_offset w30, -16
46+
; CHECK-NEXT: adrp x8, .LCPI3_0
47+
; CHECK-NEXT: ldr d1, [x8, :lo12:.LCPI3_0]
48+
; CHECK-NEXT: bl pow
49+
; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
50+
; CHECK-NEXT: ret
51+
%c = call <1 x double> @llvm.pow.v1f64(<1 x double> %x, <1 x double> <double 3.140000e+00>)
52+
ret <1 x double> %c
53+
}
54+
4055
define <2 x double> @pow_v2f64(<2 x double> %a, <2 x double> %b) {
4156
; CHECK-SD-LABEL: pow_v2f64:
4257
; CHECK-SD: // %bb.0: // %entry

llvm/test/CodeGen/AArch64/fsincos.ll

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,19 @@ entry:
3636
ret half %c
3737
}
3838

39+
define <1 x double> @sin_v1f64(<1 x double> %x) {
40+
; CHECK-LABEL: sin_v1f64:
41+
; CHECK: // %bb.0:
42+
; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
43+
; CHECK-NEXT: .cfi_def_cfa_offset 16
44+
; CHECK-NEXT: .cfi_offset w30, -16
45+
; CHECK-NEXT: bl sin
46+
; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
47+
; CHECK-NEXT: ret
48+
%c = call <1 x double> @llvm.sin.v1f64(<1 x double> %x)
49+
ret <1 x double> %c
50+
}
51+
3952
define <2 x double> @sin_v2f64(<2 x double> %a) {
4053
; CHECK-SD-LABEL: sin_v2f64:
4154
; CHECK-SD: // %bb.0: // %entry
@@ -1293,6 +1306,19 @@ entry:
12931306
ret half %c
12941307
}
12951308

1309+
define <1 x double> @cos_v1f64(<1 x double> %x) {
1310+
; CHECK-LABEL: cos_v1f64:
1311+
; CHECK: // %bb.0:
1312+
; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
1313+
; CHECK-NEXT: .cfi_def_cfa_offset 16
1314+
; CHECK-NEXT: .cfi_offset w30, -16
1315+
; CHECK-NEXT: bl cos
1316+
; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
1317+
; CHECK-NEXT: ret
1318+
%c = call <1 x double> @llvm.cos.v1f64(<1 x double> %x)
1319+
ret <1 x double> %c
1320+
}
1321+
12961322
define <2 x double> @cos_v2f64(<2 x double> %a) {
12971323
; CHECK-SD-LABEL: cos_v2f64:
12981324
; CHECK-SD: // %bb.0: // %entry

llvm/test/CodeGen/AArch64/llvm.exp10.ll

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -532,11 +532,18 @@ define double @exp10_f64(double %x) {
532532
ret double %r
533533
}
534534

535-
; FIXME: Broken
536-
; define <1 x double> @exp10_v1f64(<1 x double> %x) {
537-
; %r = call <1 x double> @llvm.exp10.v1f64(<1 x double> %x)
538-
; ret <1 x double> %r
539-
; }
535+
define <1 x double> @exp10_v1f64(<1 x double> %x) {
536+
; CHECK-LABEL: exp10_v1f64:
537+
; CHECK: // %bb.0:
538+
; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
539+
; CHECK-NEXT: .cfi_def_cfa_offset 16
540+
; CHECK-NEXT: .cfi_offset w30, -16
541+
; CHECK-NEXT: bl exp10
542+
; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
543+
; CHECK-NEXT: ret
544+
%r = call <1 x double> @llvm.exp10.v1f64(<1 x double> %x)
545+
ret <1 x double> %r
546+
}
540547

541548
define <2 x double> @exp10_v2f64(<2 x double> %x) {
542549
; SDAG-LABEL: exp10_v2f64:

0 commit comments

Comments
 (0)