[InstCombine] Signed saturation patterns
[llvm-complete.git] / test / CodeGen / X86 / GlobalISel / x86_64-select-fptosi.mir
blob6ff271d487e525725dbda035f1db8e04a311dbf7
1 # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2 # RUN: llc -mtriple=x86_64-linux-gnu -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck %s
4 --- |
6   define signext i8 @float_to_int8(float %val) {
7   entry:
8     %conv = fptosi float %val to i8
9     ret i8 %conv
10   }
12   define signext i16 @float_to_int16(float %val) {
13   entry:
14     %conv = fptosi float %val to i16
15     ret i16 %conv
16   }
18   define i32 @float_to_int32(float %val) {
19   entry:
20     %conv = fptosi float %val to i32
21     ret i32 %conv
22   }
24   define i64 @float_to_int64(float %val) {
25   entry:
26     %conv = fptosi float %val to i64
27     ret i64 %conv
28   }
30   define signext i8 @double_to_int8(double %val) {
31   entry:
32     %conv = fptosi double %val to i8
33     ret i8 %conv
34   }
36   define signext i16 @double_to_int16(double %val) {
37   entry:
38     %conv = fptosi double %val to i16
39     ret i16 %conv
40   }
42   define i32 @double_to_int32(double %val) {
43   entry:
44     %conv = fptosi double %val to i32
45     ret i32 %conv
46   }
48   define i64 @double_to_int64(double %val) {
49   entry:
50     %conv = fptosi double %val to i64
51     ret i64 %conv
52   }
54 ...
55 ---
56 name:            float_to_int8
57 alignment:       16
58 legalized:       true
59 regBankSelected: true
60 tracksRegLiveness: true
61 registers:
62   - { id: 0, class: vecr }
63   - { id: 1, class: vecr }
64   - { id: 2, class: gpr }
65   - { id: 3, class: gpr }
66 body:             |
67   bb.1.entry:
68     liveins: $xmm0
70     ; CHECK-LABEL: name: float_to_int8
71     ; CHECK: liveins: $xmm0
72     ; CHECK: [[COPY:%[0-9]+]]:vr128 = COPY $xmm0
73     ; CHECK: [[COPY1:%[0-9]+]]:fr32 = COPY [[COPY]]
74     ; CHECK: [[CVTTSS2SIrr:%[0-9]+]]:gr32 = CVTTSS2SIrr [[COPY1]]
75     ; CHECK: [[COPY2:%[0-9]+]]:gr8 = COPY [[CVTTSS2SIrr]].sub_8bit
76     ; CHECK: $al = COPY [[COPY2]]
77     ; CHECK: RET 0, implicit $al
78     %1:vecr(s128) = COPY $xmm0
79     %0:vecr(s32) = G_TRUNC %1(s128)
80     %3:gpr(s32) = G_FPTOSI %0(s32)
81     %2:gpr(s8) = G_TRUNC %3(s32)
82     $al = COPY %2(s8)
83     RET 0, implicit $al
85 ...
86 ---
87 name:            float_to_int16
88 alignment:       16
89 legalized:       true
90 regBankSelected: true
91 tracksRegLiveness: true
92 registers:
93   - { id: 0, class: vecr }
94   - { id: 1, class: vecr }
95   - { id: 2, class: gpr }
96   - { id: 3, class: gpr }
97 body:             |
98   bb.1.entry:
99     liveins: $xmm0
101     ; CHECK-LABEL: name: float_to_int16
102     ; CHECK: liveins: $xmm0
103     ; CHECK: [[COPY:%[0-9]+]]:vr128 = COPY $xmm0
104     ; CHECK: [[COPY1:%[0-9]+]]:fr32 = COPY [[COPY]]
105     ; CHECK: [[CVTTSS2SIrr:%[0-9]+]]:gr32 = CVTTSS2SIrr [[COPY1]]
106     ; CHECK: [[COPY2:%[0-9]+]]:gr16 = COPY [[CVTTSS2SIrr]].sub_16bit
107     ; CHECK: $ax = COPY [[COPY2]]
108     ; CHECK: RET 0, implicit $ax
109     %1:vecr(s128) = COPY $xmm0
110     %0:vecr(s32) = G_TRUNC %1(s128)
111     %3:gpr(s32) = G_FPTOSI %0(s32)
112     %2:gpr(s16) = G_TRUNC %3(s32)
113     $ax = COPY %2(s16)
114     RET 0, implicit $ax
118 name:            float_to_int32
119 alignment:       16
120 legalized:       true
121 regBankSelected: true
122 tracksRegLiveness: true
123 registers:
124   - { id: 0, class: vecr }
125   - { id: 1, class: vecr }
126   - { id: 2, class: gpr }
127 body:             |
128   bb.1.entry:
129     liveins: $xmm0
131     ; CHECK-LABEL: name: float_to_int32
132     ; CHECK: liveins: $xmm0
133     ; CHECK: [[COPY:%[0-9]+]]:vr128 = COPY $xmm0
134     ; CHECK: [[COPY1:%[0-9]+]]:fr32 = COPY [[COPY]]
135     ; CHECK: [[CVTTSS2SIrr:%[0-9]+]]:gr32 = CVTTSS2SIrr [[COPY1]]
136     ; CHECK: $eax = COPY [[CVTTSS2SIrr]]
137     ; CHECK: RET 0, implicit $eax
138     %1:vecr(s128) = COPY $xmm0
139     %0:vecr(s32) = G_TRUNC %1(s128)
140     %2:gpr(s32) = G_FPTOSI %0(s32)
141     $eax = COPY %2(s32)
142     RET 0, implicit $eax
146 name:            float_to_int64
147 alignment:       16
148 legalized:       true
149 regBankSelected: true
150 tracksRegLiveness: true
151 registers:
152   - { id: 0, class: vecr }
153   - { id: 1, class: vecr }
154   - { id: 2, class: gpr }
155 body:             |
156   bb.1.entry:
157     liveins: $xmm0
159     ; CHECK-LABEL: name: float_to_int64
160     ; CHECK: liveins: $xmm0
161     ; CHECK: [[COPY:%[0-9]+]]:vr128 = COPY $xmm0
162     ; CHECK: [[COPY1:%[0-9]+]]:fr32 = COPY [[COPY]]
163     ; CHECK: [[CVTTSS2SI64rr:%[0-9]+]]:gr64 = CVTTSS2SI64rr [[COPY1]]
164     ; CHECK: $rax = COPY [[CVTTSS2SI64rr]]
165     ; CHECK: RET 0, implicit $rax
166     %1:vecr(s128) = COPY $xmm0
167     %0:vecr(s32) = G_TRUNC %1(s128)
168     %2:gpr(s64) = G_FPTOSI %0(s32)
169     $rax = COPY %2(s64)
170     RET 0, implicit $rax
174 name:            double_to_int8
175 alignment:       16
176 legalized:       true
177 regBankSelected: true
178 tracksRegLiveness: true
179 registers:
180   - { id: 0, class: vecr }
181   - { id: 1, class: vecr }
182   - { id: 2, class: gpr }
183   - { id: 3, class: gpr }
184 body:             |
185   bb.1.entry:
186     liveins: $xmm0
188     ; CHECK-LABEL: name: double_to_int8
189     ; CHECK: liveins: $xmm0
190     ; CHECK: [[COPY:%[0-9]+]]:vr128 = COPY $xmm0
191     ; CHECK: [[COPY1:%[0-9]+]]:fr64 = COPY [[COPY]]
192     ; CHECK: [[CVTTSD2SIrr:%[0-9]+]]:gr32 = CVTTSD2SIrr [[COPY1]]
193     ; CHECK: [[COPY2:%[0-9]+]]:gr8 = COPY [[CVTTSD2SIrr]].sub_8bit
194     ; CHECK: $al = COPY [[COPY2]]
195     ; CHECK: RET 0, implicit $al
196     %1:vecr(s128) = COPY $xmm0
197     %0:vecr(s64) = G_TRUNC %1(s128)
198     %3:gpr(s32) = G_FPTOSI %0(s64)
199     %2:gpr(s8) = G_TRUNC %3(s32)
200     $al = COPY %2(s8)
201     RET 0, implicit $al
205 name:            double_to_int16
206 alignment:       16
207 legalized:       true
208 regBankSelected: true
209 tracksRegLiveness: true
210 registers:
211   - { id: 0, class: vecr }
212   - { id: 1, class: vecr }
213   - { id: 2, class: gpr }
214   - { id: 3, class: gpr }
215 body:             |
216   bb.1.entry:
217     liveins: $xmm0
219     ; CHECK-LABEL: name: double_to_int16
220     ; CHECK: liveins: $xmm0
221     ; CHECK: [[COPY:%[0-9]+]]:vr128 = COPY $xmm0
222     ; CHECK: [[COPY1:%[0-9]+]]:fr64 = COPY [[COPY]]
223     ; CHECK: [[CVTTSD2SIrr:%[0-9]+]]:gr32 = CVTTSD2SIrr [[COPY1]]
224     ; CHECK: [[COPY2:%[0-9]+]]:gr16 = COPY [[CVTTSD2SIrr]].sub_16bit
225     ; CHECK: $ax = COPY [[COPY2]]
226     ; CHECK: RET 0, implicit $ax
227     %1:vecr(s128) = COPY $xmm0
228     %0:vecr(s64) = G_TRUNC %1(s128)
229     %3:gpr(s32) = G_FPTOSI %0(s64)
230     %2:gpr(s16) = G_TRUNC %3(s32)
231     $ax = COPY %2(s16)
232     RET 0, implicit $ax
236 name:            double_to_int32
237 alignment:       16
238 legalized:       true
239 regBankSelected: true
240 tracksRegLiveness: true
241 registers:
242   - { id: 0, class: vecr }
243   - { id: 1, class: vecr }
244   - { id: 2, class: gpr }
245 body:             |
246   bb.1.entry:
247     liveins: $xmm0
249     ; CHECK-LABEL: name: double_to_int32
250     ; CHECK: liveins: $xmm0
251     ; CHECK: [[COPY:%[0-9]+]]:vr128 = COPY $xmm0
252     ; CHECK: [[COPY1:%[0-9]+]]:fr64 = COPY [[COPY]]
253     ; CHECK: [[CVTTSD2SIrr:%[0-9]+]]:gr32 = CVTTSD2SIrr [[COPY1]]
254     ; CHECK: $eax = COPY [[CVTTSD2SIrr]]
255     ; CHECK: RET 0, implicit $eax
256     %1:vecr(s128) = COPY $xmm0
257     %0:vecr(s64) = G_TRUNC %1(s128)
258     %2:gpr(s32) = G_FPTOSI %0(s64)
259     $eax = COPY %2(s32)
260     RET 0, implicit $eax
264 name:            double_to_int64
265 alignment:       16
266 legalized:       true
267 regBankSelected: true
268 tracksRegLiveness: true
269 registers:
270   - { id: 0, class: vecr }
271   - { id: 1, class: vecr }
272   - { id: 2, class: gpr }
273 body:             |
274   bb.1.entry:
275     liveins: $xmm0
277     ; CHECK-LABEL: name: double_to_int64
278     ; CHECK: liveins: $xmm0
279     ; CHECK: [[COPY:%[0-9]+]]:vr128 = COPY $xmm0
280     ; CHECK: [[COPY1:%[0-9]+]]:fr64 = COPY [[COPY]]
281     ; CHECK: [[CVTTSD2SI64rr:%[0-9]+]]:gr64 = CVTTSD2SI64rr [[COPY1]]
282     ; CHECK: $rax = COPY [[CVTTSD2SI64rr]]
283     ; CHECK: RET 0, implicit $rax
284     %1:vecr(s128) = COPY $xmm0
285     %0:vecr(s64) = G_TRUNC %1(s128)
286     %2:gpr(s64) = G_FPTOSI %0(s64)
287     $rax = COPY %2(s64)
288     RET 0, implicit $rax