11; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 3
2- ; RUN: llc -mtriple=aarch64 -mattr=+sve < %s -o - | FileCheck %s
2+ ; RUN: llc -mtriple=aarch64 -mattr=+sve < %s -o - | FileCheck -check-prefixes=SVE,SVELINUX %s
3+ ; RUN: llc -mtriple=aarch64-windows-msvc -mattr=+sve < %s -o - | FileCheck -check-prefixes=SVE,SVEWINDOWS %s
4+ ; RUN: llc -mtriple=aarch64-windows-msvc < %s -o - | FileCheck -check-prefixes=WINDOWS %s
35
46define double @testExp (double %val , i32 %a ) {
5- ; CHECK-LABEL: testExp:
6- ; CHECK: // %bb.0: // %entry
7- ; CHECK-NEXT: // kill: def $w0 killed $w0 def $x0
8- ; CHECK-NEXT: sxtw x8, w0
9- ; CHECK-NEXT: ptrue p0.d
10- ; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0
11- ; CHECK-NEXT: fmov d1, x8
12- ; CHECK-NEXT: fscale z0.d, p0/m, z0.d, z1.d
13- ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
14- ; CHECK-NEXT: ret
7+ ; SVE-LABEL: testExp:
8+ ; SVE: // %bb.0: // %entry
9+ ; SVE-NEXT: // kill: def $w0 killed $w0 def $x0
10+ ; SVE-NEXT: sxtw x8, w0
11+ ; SVE-NEXT: ptrue p0.d
12+ ; SVE-NEXT: // kill: def $d0 killed $d0 def $z0
13+ ; SVE-NEXT: fmov d1, x8
14+ ; SVE-NEXT: fscale z0.d, p0/m, z0.d, z1.d
15+ ; SVE-NEXT: // kill: def $d0 killed $d0 killed $z0
16+ ; SVE-NEXT: ret
17+ ;
18+ ; WINDOWS-LABEL: testExp:
19+ ; WINDOWS: // %bb.0: // %entry
20+ ; WINDOWS-NEXT: b ldexp
1521entry:
1622 %call = tail call fast double @ldexp (double %val , i32 %a )
1723 ret double %call
1824}
1925
2026declare double @ldexp (double , i32 ) memory(none)
2127
28+ define double @testExpIntrinsic (double %val , i32 %a ) {
29+ ; SVE-LABEL: testExpIntrinsic:
30+ ; SVE: // %bb.0: // %entry
31+ ; SVE-NEXT: // kill: def $w0 killed $w0 def $x0
32+ ; SVE-NEXT: sxtw x8, w0
33+ ; SVE-NEXT: ptrue p0.d
34+ ; SVE-NEXT: // kill: def $d0 killed $d0 def $z0
35+ ; SVE-NEXT: fmov d1, x8
36+ ; SVE-NEXT: fscale z0.d, p0/m, z0.d, z1.d
37+ ; SVE-NEXT: // kill: def $d0 killed $d0 killed $z0
38+ ; SVE-NEXT: ret
39+ ;
40+ ; WINDOWS-LABEL: testExpIntrinsic:
41+ ; WINDOWS: // %bb.0: // %entry
42+ ; WINDOWS-NEXT: b ldexp
43+ entry:
44+ %call = tail call fast double @llvm.ldexp.f64 (double %val , i32 %a )
45+ ret double %call
46+ }
47+
2248define float @testExpf (float %val , i32 %a ) {
23- ; CHECK-LABEL: testExpf:
24- ; CHECK: // %bb.0: // %entry
25- ; CHECK-NEXT: fmov s1, w0
26- ; CHECK-NEXT: ptrue p0.s
27- ; CHECK-NEXT: // kill: def $s0 killed $s0 def $z0
28- ; CHECK-NEXT: fscale z0.s, p0/m, z0.s, z1.s
29- ; CHECK-NEXT: // kill: def $s0 killed $s0 killed $z0
30- ; CHECK-NEXT: ret
49+ ; SVELINUX-LABEL: testExpf:
50+ ; SVELINUX: // %bb.0: // %entry
51+ ; SVELINUX-NEXT: fmov s1, w0
52+ ; SVELINUX-NEXT: ptrue p0.s
53+ ; SVELINUX-NEXT: // kill: def $s0 killed $s0 def $z0
54+ ; SVELINUX-NEXT: fscale z0.s, p0/m, z0.s, z1.s
55+ ; SVELINUX-NEXT: // kill: def $s0 killed $s0 killed $z0
56+ ; SVELINUX-NEXT: ret
57+ ;
58+ ; SVEWINDOWS-LABEL: testExpf:
59+ ; SVEWINDOWS: // %bb.0: // %entry
60+ ; SVEWINDOWS-NEXT: b ldexpf
61+ ;
62+ ; WINDOWS-LABEL: testExpf:
63+ ; WINDOWS: // %bb.0: // %entry
64+ ; WINDOWS-NEXT: b ldexpf
3165entry:
3266 %call = tail call fast float @ldexpf (float %val , i32 %a )
3367 ret float %call
3468}
3569
70+ define float @testExpfIntrinsic (float %val , i32 %a ) {
71+ ; SVE-LABEL: testExpfIntrinsic:
72+ ; SVE: // %bb.0: // %entry
73+ ; SVE-NEXT: fmov s1, w0
74+ ; SVE-NEXT: ptrue p0.s
75+ ; SVE-NEXT: // kill: def $s0 killed $s0 def $z0
76+ ; SVE-NEXT: fscale z0.s, p0/m, z0.s, z1.s
77+ ; SVE-NEXT: // kill: def $s0 killed $s0 killed $z0
78+ ; SVE-NEXT: ret
79+ ;
80+ ; WINDOWS-LABEL: testExpfIntrinsic:
81+ ; WINDOWS: .seh_proc testExpfIntrinsic
82+ ; WINDOWS-NEXT: // %bb.0: // %entry
83+ ; WINDOWS-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
84+ ; WINDOWS-NEXT: .seh_save_reg_x x30, 16
85+ ; WINDOWS-NEXT: .seh_endprologue
86+ ; WINDOWS-NEXT: fcvt d0, s0
87+ ; WINDOWS-NEXT: bl ldexp
88+ ; WINDOWS-NEXT: fcvt s0, d0
89+ ; WINDOWS-NEXT: .seh_startepilogue
90+ ; WINDOWS-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
91+ ; WINDOWS-NEXT: .seh_save_reg_x x30, 16
92+ ; WINDOWS-NEXT: .seh_endepilogue
93+ ; WINDOWS-NEXT: ret
94+ ; WINDOWS-NEXT: .seh_endfunclet
95+ ; WINDOWS-NEXT: .seh_endproc
96+ entry:
97+ %call = tail call fast float @llvm.ldexp.f32 (float %val , i32 %a )
98+ ret float %call
99+ }
100+
101+
36102declare float @ldexpf (float , i32 ) memory(none)
37103
38104define fp128 @testExpl (fp128 %val , i32 %a ) {
39- ; CHECK-LABEL: testExpl:
40- ; CHECK: // %bb.0: // %entry
41- ; CHECK-NEXT: b ldexpl
105+ ; SVE-LABEL: testExpl:
106+ ; SVE: // %bb.0: // %entry
107+ ; SVE-NEXT: b ldexpl
108+ ;
109+ ; WINDOWS-LABEL: testExpl:
110+ ; WINDOWS: // %bb.0: // %entry
111+ ; WINDOWS-NEXT: b ldexpl
42112entry:
43113 %call = tail call fast fp128 @ldexpl (fp128 %val , i32 %a )
44114 ret fp128 %call
@@ -47,14 +117,31 @@ entry:
47117declare fp128 @ldexpl (fp128 , i32 ) memory(none)
48118
49119define half @testExpf16 (half %val , i32 %a ) {
50- ; CHECK-LABEL: testExpf16:
51- ; CHECK: // %bb.0: // %entry
52- ; CHECK-NEXT: fcvt s0, h0
53- ; CHECK-NEXT: fmov s1, w0
54- ; CHECK-NEXT: ptrue p0.s
55- ; CHECK-NEXT: fscale z0.s, p0/m, z0.s, z1.s
56- ; CHECK-NEXT: fcvt h0, s0
57- ; CHECK-NEXT: ret
120+ ; SVE-LABEL: testExpf16:
121+ ; SVE: // %bb.0: // %entry
122+ ; SVE-NEXT: fcvt s0, h0
123+ ; SVE-NEXT: fmov s1, w0
124+ ; SVE-NEXT: ptrue p0.s
125+ ; SVE-NEXT: fscale z0.s, p0/m, z0.s, z1.s
126+ ; SVE-NEXT: fcvt h0, s0
127+ ; SVE-NEXT: ret
128+ ;
129+ ; WINDOWS-LABEL: testExpf16:
130+ ; WINDOWS: .seh_proc testExpf16
131+ ; WINDOWS-NEXT: // %bb.0: // %entry
132+ ; WINDOWS-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
133+ ; WINDOWS-NEXT: .seh_save_reg_x x30, 16
134+ ; WINDOWS-NEXT: .seh_endprologue
135+ ; WINDOWS-NEXT: fcvt d0, h0
136+ ; WINDOWS-NEXT: bl ldexp
137+ ; WINDOWS-NEXT: fcvt h0, d0
138+ ; WINDOWS-NEXT: .seh_startepilogue
139+ ; WINDOWS-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
140+ ; WINDOWS-NEXT: .seh_save_reg_x x30, 16
141+ ; WINDOWS-NEXT: .seh_endepilogue
142+ ; WINDOWS-NEXT: ret
143+ ; WINDOWS-NEXT: .seh_endfunclet
144+ ; WINDOWS-NEXT: .seh_endproc
58145entry:
59146 %0 = tail call fast half @llvm.ldexp.f16.i32 (half %val , i32 %a )
60147 ret half %0
0 commit comments