1
+ ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
1
2
; RUN: llc < %s -mtriple=sparc64-pc-openbsd -disable-sparc-leaf-proc | FileCheck %s
2
3
; Testing 64-bit conditionals. The sparc64 triple is an alias for sparcv9.
3
4
4
- ; CHECK: cmpri
5
- ; CHECK: cmp %i1, 1
6
- ; CHECK: be %xcc,
7
- define void @cmpri (ptr %p , i64 %x ) {
5
+ define void @cmpri (ptr %p , i64 %x ) nounwind {
6
+ ; CHECK-LABEL: cmpri:
7
+ ; CHECK: ! %bb.0: ! %entry
8
+ ; CHECK-NEXT: save %sp, -128, %sp
9
+ ; CHECK-NEXT: cmp %i1, 1
10
+ ; CHECK-NEXT: be %xcc, .LBB0_2
11
+ ; CHECK-NEXT: nop
12
+ ; CHECK-NEXT: ! %bb.1: ! %if.then
13
+ ; CHECK-NEXT: stx %i1, [%i0]
14
+ ; CHECK-NEXT: .LBB0_2: ! %if.end
15
+ ; CHECK-NEXT: ret
16
+ ; CHECK-NEXT: restore
8
17
entry:
9
18
%tobool = icmp eq i64 %x , 1
10
19
br i1 %tobool , label %if.end , label %if.then
@@ -17,10 +26,18 @@ if.end:
17
26
ret void
18
27
}
19
28
20
- ; CHECK: cmprr
21
- ; CHECK: cmp %i1, %i2
22
- ; CHECK: bgu %xcc,
23
- define void @cmprr (ptr %p , i64 %x , i64 %y ) {
29
+ define void @cmprr (ptr %p , i64 %x , i64 %y ) nounwind {
30
+ ; CHECK-LABEL: cmprr:
31
+ ; CHECK: ! %bb.0: ! %entry
32
+ ; CHECK-NEXT: save %sp, -128, %sp
33
+ ; CHECK-NEXT: cmp %i1, %i2
34
+ ; CHECK-NEXT: bgu %xcc, .LBB1_2
35
+ ; CHECK-NEXT: nop
36
+ ; CHECK-NEXT: ! %bb.1: ! %if.then
37
+ ; CHECK-NEXT: stx %i1, [%i0]
38
+ ; CHECK-NEXT: .LBB1_2: ! %if.end
39
+ ; CHECK-NEXT: ret
40
+ ; CHECK-NEXT: restore
24
41
entry:
25
42
%tobool = icmp ugt i64 %x , %y
26
43
br i1 %tobool , label %if.end , label %if.then
@@ -33,94 +50,126 @@ if.end:
33
50
ret void
34
51
}
35
52
36
- ; CHECK: selecti32_xcc
37
- ; CHECK: cmp %i0, %i1
38
- ; CHECK: movg %xcc, %i2, %i3
39
- ; CHECK: restore %g0, %i3, %o0
40
- define i32 @selecti32_xcc (i64 %x , i64 %y , i32 %a , i32 %b ) {
53
+ define i32 @selecti32_xcc (i64 %x , i64 %y , i32 %a , i32 %b ) nounwind {
54
+ ; CHECK-LABEL: selecti32_xcc:
55
+ ; CHECK: ! %bb.0: ! %entry
56
+ ; CHECK-NEXT: save %sp, -128, %sp
57
+ ; CHECK-NEXT: cmp %i0, %i1
58
+ ; CHECK-NEXT: movg %xcc, %i2, %i3
59
+ ; CHECK-NEXT: ret
60
+ ; CHECK-NEXT: restore %g0, %i3, %o0
41
61
entry:
42
62
%tobool = icmp sgt i64 %x , %y
43
63
%rv = select i1 %tobool , i32 %a , i32 %b
44
64
ret i32 %rv
45
65
}
46
66
47
- ; CHECK: selecti64_xcc
48
- ; CHECK: cmp %i0, %i1
49
- ; CHECK: movg %xcc, %i2, %i3
50
- ; CHECK: restore %g0, %i3, %o0
51
- define i64 @selecti64_xcc (i64 %x , i64 %y , i64 %a , i64 %b ) {
67
+ define i64 @selecti64_xcc (i64 %x , i64 %y , i64 %a , i64 %b ) nounwind {
68
+ ; CHECK-LABEL: selecti64_xcc:
69
+ ; CHECK: ! %bb.0: ! %entry
70
+ ; CHECK-NEXT: save %sp, -128, %sp
71
+ ; CHECK-NEXT: cmp %i0, %i1
72
+ ; CHECK-NEXT: movg %xcc, %i2, %i3
73
+ ; CHECK-NEXT: ret
74
+ ; CHECK-NEXT: restore %g0, %i3, %o0
52
75
entry:
53
76
%tobool = icmp sgt i64 %x , %y
54
77
%rv = select i1 %tobool , i64 %a , i64 %b
55
78
ret i64 %rv
56
79
}
57
80
58
- ; CHECK: selecti64_icc
59
- ; CHECK: cmp %i0, %i1
60
- ; CHECK: movg %icc, %i2, %i3
61
- ; CHECK: restore %g0, %i3, %o0
62
- define i64 @selecti64_icc (i32 %x , i32 %y , i64 %a , i64 %b ) {
81
+ define i64 @selecti64_icc (i32 %x , i32 %y , i64 %a , i64 %b ) nounwind {
82
+ ; CHECK-LABEL: selecti64_icc:
83
+ ; CHECK: ! %bb.0: ! %entry
84
+ ; CHECK-NEXT: save %sp, -128, %sp
85
+ ; CHECK-NEXT: cmp %i0, %i1
86
+ ; CHECK-NEXT: movg %icc, %i2, %i3
87
+ ; CHECK-NEXT: ret
88
+ ; CHECK-NEXT: restore %g0, %i3, %o0
63
89
entry:
64
90
%tobool = icmp sgt i32 %x , %y
65
91
%rv = select i1 %tobool , i64 %a , i64 %b
66
92
ret i64 %rv
67
93
}
68
94
69
- ; CHECK: selecti64_fcc
70
- ; CHECK: mov %i3, %i0
71
- ; CHECK: fcmps %fcc0, %f1, %f3
72
- ; CHECK: movul %fcc0, %i2, %i0
73
- ; CHECK: restore
74
- define i64 @selecti64_fcc (float %x , float %y , i64 %a , i64 %b ) {
95
+ define i64 @selecti64_fcc (float %x , float %y , i64 %a , i64 %b ) nounwind {
96
+ ; CHECK-LABEL: selecti64_fcc:
97
+ ; CHECK: ! %bb.0: ! %entry
98
+ ; CHECK-NEXT: save %sp, -128, %sp
99
+ ; CHECK-NEXT: mov %i3, %i0
100
+ ; CHECK-NEXT: fcmps %fcc0, %f1, %f3
101
+ ; CHECK-NEXT: movul %fcc0, %i2, %i0
102
+ ; CHECK-NEXT: ret
103
+ ; CHECK-NEXT: restore
75
104
entry:
76
105
%tobool = fcmp ult float %x , %y
77
106
%rv = select i1 %tobool , i64 %a , i64 %b
78
107
ret i64 %rv
79
108
}
80
109
81
- ; CHECK: selectf32_xcc
82
- ; CHECK: fmovs %f7, %f0
83
- ; CHECK: cmp %i0, %i1
84
- ; CHECK: fmovsg %xcc, %f5, %f0
85
- define float @selectf32_xcc (i64 %x , i64 %y , float %a , float %b ) {
110
+ define float @selectf32_xcc (i64 %x , i64 %y , float %a , float %b ) nounwind {
111
+ ; CHECK-LABEL: selectf32_xcc:
112
+ ; CHECK: ! %bb.0: ! %entry
113
+ ; CHECK-NEXT: save %sp, -128, %sp
114
+ ; CHECK-NEXT: fmovs %f7, %f0
115
+ ; CHECK-NEXT: cmp %i0, %i1
116
+ ; CHECK-NEXT: fmovsg %xcc, %f5, %f0
117
+ ; CHECK-NEXT: ret
118
+ ; CHECK-NEXT: restore
86
119
entry:
87
120
%tobool = icmp sgt i64 %x , %y
88
121
%rv = select i1 %tobool , float %a , float %b
89
122
ret float %rv
90
123
}
91
124
92
- ; CHECK: selectf64_xcc
93
- ; CHECK: fmovd %f6, %f0
94
- ; CHECK: cmp %i0, %i1
95
- ; CHECK: fmovdg %xcc, %f4, %f0
96
- define double @selectf64_xcc (i64 %x , i64 %y , double %a , double %b ) {
125
+ define double @selectf64_xcc (i64 %x , i64 %y , double %a , double %b ) nounwind {
126
+ ; CHECK-LABEL: selectf64_xcc:
127
+ ; CHECK: ! %bb.0: ! %entry
128
+ ; CHECK-NEXT: save %sp, -128, %sp
129
+ ; CHECK-NEXT: fmovd %f6, %f0
130
+ ; CHECK-NEXT: cmp %i0, %i1
131
+ ; CHECK-NEXT: fmovdg %xcc, %f4, %f0
132
+ ; CHECK-NEXT: ret
133
+ ; CHECK-NEXT: restore
97
134
entry:
98
135
%tobool = icmp sgt i64 %x , %y
99
136
%rv = select i1 %tobool , double %a , double %b
100
137
ret double %rv
101
138
}
102
139
103
140
; The MOVXCC instruction can't use %g0 for its tied operand.
104
- ; CHECK: select_consti64_xcc
105
- ; CHECK: cmp
106
- ; CHECK: movg %xcc, 123, %i{{[0-2]}}
107
- define i64 @select_consti64_xcc (i64 %x , i64 %y ) {
141
+ define i64 @select_consti64_xcc (i64 %x , i64 %y ) nounwind {
142
+ ; CHECK-LABEL: select_consti64_xcc:
143
+ ; CHECK: ! %bb.0: ! %entry
144
+ ; CHECK-NEXT: save %sp, -128, %sp
145
+ ; CHECK-NEXT: mov %g0, %i2
146
+ ; CHECK-NEXT: cmp %i0, %i1
147
+ ; CHECK-NEXT: movg %xcc, 123, %i2
148
+ ; CHECK-NEXT: ret
149
+ ; CHECK-NEXT: restore %g0, %i2, %o0
108
150
entry:
109
151
%tobool = icmp sgt i64 %x , %y
110
152
%rv = select i1 %tobool , i64 123 , i64 0
111
153
ret i64 %rv
112
154
}
113
155
114
- ; CHECK-LABEL: setcc_resultty
115
- ; CHECK-DAG: mov %g0, %o0
116
- ; CHECK-DAG: mov %i0, %o1
117
- ; CHECK-DAG: mov %g0, %o2
118
- ; CHECK-DAG: mov 32, %o3
119
- ; CHECK-DAG: call __multi3
120
- ; CHECK: movrnz %o0, 1, [[R:%[gilo][0-7]]]
121
- ; CHECK: or [[R]], %i1, %i0
122
-
123
- define i1 @setcc_resultty (i64 %a , i1 %b ) {
156
+ define i1 @setcc_resultty (i64 %a , i1 %b ) nounwind {
157
+ ; CHECK-LABEL: setcc_resultty:
158
+ ; CHECK: ! %bb.0:
159
+ ; CHECK-NEXT: save %sp, -128, %sp
160
+ ; CHECK-NEXT: mov %g0, %i2
161
+ ; CHECK-NEXT: sethi 4194303, %i3
162
+ ; CHECK-NEXT: or %i3, 1023, %i3
163
+ ; CHECK-NEXT: sethi 131071, %i4
164
+ ; CHECK-NEXT: or %i4, 1023, %i4
165
+ ; CHECK-NEXT: sllx %i4, 32, %i4
166
+ ; CHECK-NEXT: or %i4, %i3, %i3
167
+ ; CHECK-NEXT: and %i0, %i3, %i3
168
+ ; CHECK-NEXT: cmp %i3, %i0
169
+ ; CHECK-NEXT: movne %xcc, 1, %i2
170
+ ; CHECK-NEXT: or %i2, %i1, %i0
171
+ ; CHECK-NEXT: ret
172
+ ; CHECK-NEXT: restore
124
173
%a0 = tail call { i64 , i1 } @llvm.umul.with.overflow.i64 (i64 %a , i64 32 )
125
174
%a1 = extractvalue { i64 , i1 } %a0 , 1
126
175
%a4 = or i1 %a1 , %b
0 commit comments