1
1
; 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
3
5
4
6
define 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
15
21
entry:
16
22
%call = tail call fast double @ldexp(double %val, i32 %a)
17
23
ret double %call
18
24
}
19
25
20
26
declare double @ldexp(double, i32) memory(none)
21
27
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
+
22
48
define 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
31
65
entry:
32
66
%call = tail call fast float @ldexpf(float %val, i32 %a)
33
67
ret float %call
34
68
}
35
69
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
+
36
102
declare float @ldexpf(float, i32) memory(none)
37
103
38
104
define 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
42
112
entry:
43
113
%call = tail call fast fp128 @ldexpl(fp128 %val, i32 %a)
44
114
ret fp128 %call
@@ -47,14 +117,31 @@ entry:
47
117
declare fp128 @ldexpl(fp128, i32) memory(none)
48
118
49
119
define 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
58
145
entry:
59
146
%0 = tail call fast half @llvm.ldexp.f16.i32(half %val, i32 %a)
60
147
ret half %0
0 commit comments