OLD | NEW |
| (Empty) |
1 ; This tries to be a comprehensive test of f32 and f64 operations. | |
2 ; The CHECK lines are only checking for basic instruction patterns | |
3 ; that should be present regardless of the optimization level, so | |
4 ; there are no special OPTM1 match lines. | |
5 | |
6 ; RUN: %p2i --filetype=obj --disassemble -i %s --args -O2 | FileCheck %s | |
7 ; RUN: %p2i --filetype=obj --disassemble -i %s --args -Om1 | FileCheck %s | |
8 | |
9 @__init_array_start = internal constant [0 x i8] zeroinitializer, align 4 | |
10 @__fini_array_start = internal constant [0 x i8] zeroinitializer, align 4 | |
11 @__tls_template_start = internal constant [0 x i8] zeroinitializer, align 8 | |
12 @__tls_template_alignment = internal constant [4 x i8] c"\01\00\00\00", align 4 | |
13 | |
14 define internal i32 @doubleArgs(double %a, i32 %b, double %c) { | |
15 entry: | |
16 ret i32 %b | |
17 } | |
18 ; CHECK-LABEL: doubleArgs | |
19 ; CHECK: mov eax,DWORD PTR [esp+0xc] | |
20 ; CHECK-NEXT: ret | |
21 | |
22 define internal i32 @floatArgs(float %a, i32 %b, float %c) { | |
23 entry: | |
24 ret i32 %b | |
25 } | |
26 ; CHECK-LABEL: floatArgs | |
27 ; CHECK: mov eax,DWORD PTR [esp+0x8] | |
28 ; CHECK-NEXT: ret | |
29 | |
30 define internal i32 @passFpArgs(float %a, double %b, float %c, double %d, float
%e, double %f) { | |
31 entry: | |
32 %call = call i32 @ignoreFpArgsNoInline(float %a, i32 123, double %b) | |
33 %call1 = call i32 @ignoreFpArgsNoInline(float %c, i32 123, double %d) | |
34 %call2 = call i32 @ignoreFpArgsNoInline(float %e, i32 123, double %f) | |
35 %add = add i32 %call1, %call | |
36 %add3 = add i32 %add, %call2 | |
37 ret i32 %add3 | |
38 } | |
39 ; CHECK-LABEL: passFpArgs | |
40 ; CHECK: mov DWORD PTR [esp+0x4],0x7b | |
41 ; CHECK: call {{.*}} R_{{.*}} ignoreFpArgsNoInline | |
42 ; CHECK: mov DWORD PTR [esp+0x4],0x7b | |
43 ; CHECK: call {{.*}} R_{{.*}} ignoreFpArgsNoInline | |
44 ; CHECK: mov DWORD PTR [esp+0x4],0x7b | |
45 ; CHECK: call {{.*}} R_{{.*}} ignoreFpArgsNoInline | |
46 | |
47 declare i32 @ignoreFpArgsNoInline(float %x, i32 %y, double %z) | |
48 | |
49 define internal i32 @passFpConstArg(float %a, double %b) { | |
50 entry: | |
51 %call = call i32 @ignoreFpArgsNoInline(float %a, i32 123, double 2.340000e+00) | |
52 ret i32 %call | |
53 } | |
54 ; CHECK-LABEL: passFpConstArg | |
55 ; CHECK: mov DWORD PTR [esp+0x4],0x7b | |
56 ; CHECK: call {{.*}} R_{{.*}} ignoreFpArgsNoInline | |
57 | |
58 define internal i32 @passFp32ConstArg(float %a) { | |
59 entry: | |
60 %call = call i32 @ignoreFp32ArgsNoInline(float %a, i32 123, float 2.0) | |
61 ret i32 %call | |
62 } | |
63 ; CHECK-LABEL: passFp32ConstArg | |
64 ; CHECK: mov DWORD PTR [esp+0x4],0x7b | |
65 ; CHECK: movss DWORD PTR [esp+0x8] | |
66 ; CHECK: call {{.*}} R_{{.*}} ignoreFp32ArgsNoInline | |
67 | |
68 declare i32 @ignoreFp32ArgsNoInline(float %x, i32 %y, float %z) | |
69 | |
70 define internal float @returnFloatArg(float %a) { | |
71 entry: | |
72 ret float %a | |
73 } | |
74 ; CHECK-LABEL: returnFloatArg | |
75 ; CHECK: fld DWORD PTR [esp | |
76 | |
77 define internal double @returnDoubleArg(double %a) { | |
78 entry: | |
79 ret double %a | |
80 } | |
81 ; CHECK-LABEL: returnDoubleArg | |
82 ; CHECK: fld QWORD PTR [esp | |
83 | |
84 define internal float @returnFloatConst() { | |
85 entry: | |
86 ret float 0x3FF3AE1480000000 | |
87 } | |
88 ; CHECK-LABEL: returnFloatConst | |
89 ; CHECK: fld | |
90 | |
91 define internal double @returnDoubleConst() { | |
92 entry: | |
93 ret double 1.230000e+00 | |
94 } | |
95 ; CHECK-LABEL: returnDoubleConst | |
96 ; CHECK: fld | |
97 | |
98 define internal float @addFloat(float %a, float %b) { | |
99 entry: | |
100 %add = fadd float %a, %b | |
101 ret float %add | |
102 } | |
103 ; CHECK-LABEL: addFloat | |
104 ; CHECK: addss | |
105 ; CHECK: fld | |
106 | |
107 define internal double @addDouble(double %a, double %b) { | |
108 entry: | |
109 %add = fadd double %a, %b | |
110 ret double %add | |
111 } | |
112 ; CHECK-LABEL: addDouble | |
113 ; CHECK: addsd | |
114 ; CHECK: fld | |
115 | |
116 define internal float @subFloat(float %a, float %b) { | |
117 entry: | |
118 %sub = fsub float %a, %b | |
119 ret float %sub | |
120 } | |
121 ; CHECK-LABEL: subFloat | |
122 ; CHECK: subss | |
123 ; CHECK: fld | |
124 | |
125 define internal double @subDouble(double %a, double %b) { | |
126 entry: | |
127 %sub = fsub double %a, %b | |
128 ret double %sub | |
129 } | |
130 ; CHECK-LABEL: subDouble | |
131 ; CHECK: subsd | |
132 ; CHECK: fld | |
133 | |
134 define internal float @mulFloat(float %a, float %b) { | |
135 entry: | |
136 %mul = fmul float %a, %b | |
137 ret float %mul | |
138 } | |
139 ; CHECK-LABEL: mulFloat | |
140 ; CHECK: mulss | |
141 ; CHECK: fld | |
142 | |
143 define internal double @mulDouble(double %a, double %b) { | |
144 entry: | |
145 %mul = fmul double %a, %b | |
146 ret double %mul | |
147 } | |
148 ; CHECK-LABEL: mulDouble | |
149 ; CHECK: mulsd | |
150 ; CHECK: fld | |
151 | |
152 define internal float @divFloat(float %a, float %b) { | |
153 entry: | |
154 %div = fdiv float %a, %b | |
155 ret float %div | |
156 } | |
157 ; CHECK-LABEL: divFloat | |
158 ; CHECK: divss | |
159 ; CHECK: fld | |
160 | |
161 define internal double @divDouble(double %a, double %b) { | |
162 entry: | |
163 %div = fdiv double %a, %b | |
164 ret double %div | |
165 } | |
166 ; CHECK-LABEL: divDouble | |
167 ; CHECK: divsd | |
168 ; CHECK: fld | |
169 | |
170 define internal float @remFloat(float %a, float %b) { | |
171 entry: | |
172 %div = frem float %a, %b | |
173 ret float %div | |
174 } | |
175 ; CHECK-LABEL: remFloat | |
176 ; CHECK: call {{.*}} R_{{.*}} fmodf | |
177 | |
178 define internal double @remDouble(double %a, double %b) { | |
179 entry: | |
180 %div = frem double %a, %b | |
181 ret double %div | |
182 } | |
183 ; CHECK-LABEL: remDouble | |
184 ; CHECK: call {{.*}} R_{{.*}} fmod | |
185 | |
186 define internal float @fptrunc(double %a) { | |
187 entry: | |
188 %conv = fptrunc double %a to float | |
189 ret float %conv | |
190 } | |
191 ; CHECK-LABEL: fptrunc | |
192 ; CHECK: cvtsd2ss | |
193 ; CHECK: fld | |
194 | |
195 define internal double @fpext(float %a) { | |
196 entry: | |
197 %conv = fpext float %a to double | |
198 ret double %conv | |
199 } | |
200 ; CHECK-LABEL: fpext | |
201 ; CHECK: cvtss2sd | |
202 ; CHECK: fld | |
203 | |
204 define internal i64 @doubleToSigned64(double %a) { | |
205 entry: | |
206 %conv = fptosi double %a to i64 | |
207 ret i64 %conv | |
208 } | |
209 ; CHECK-LABEL: doubleToSigned64 | |
210 ; CHECK: call {{.*}} R_{{.*}} __Sz_fptosi_f64_i64 | |
211 | |
212 define internal i64 @floatToSigned64(float %a) { | |
213 entry: | |
214 %conv = fptosi float %a to i64 | |
215 ret i64 %conv | |
216 } | |
217 ; CHECK-LABEL: floatToSigned64 | |
218 ; CHECK: call {{.*}} R_{{.*}} __Sz_fptosi_f32_i64 | |
219 | |
220 define internal i64 @doubleToUnsigned64(double %a) { | |
221 entry: | |
222 %conv = fptoui double %a to i64 | |
223 ret i64 %conv | |
224 } | |
225 ; CHECK-LABEL: doubleToUnsigned64 | |
226 ; CHECK: call {{.*}} R_{{.*}} __Sz_fptoui_f64_i64 | |
227 | |
228 define internal i64 @floatToUnsigned64(float %a) { | |
229 entry: | |
230 %conv = fptoui float %a to i64 | |
231 ret i64 %conv | |
232 } | |
233 ; CHECK-LABEL: floatToUnsigned64 | |
234 ; CHECK: call {{.*}} R_{{.*}} __Sz_fptoui_f32_i64 | |
235 | |
236 define internal i32 @doubleToSigned32(double %a) { | |
237 entry: | |
238 %conv = fptosi double %a to i32 | |
239 ret i32 %conv | |
240 } | |
241 ; CHECK-LABEL: doubleToSigned32 | |
242 ; CHECK: cvttsd2si | |
243 | |
244 define internal i32 @doubleToSigned32Const() { | |
245 entry: | |
246 %conv = fptosi double 867.5309 to i32 | |
247 ret i32 %conv | |
248 } | |
249 ; CHECK-LABEL: doubleToSigned32Const | |
250 ; CHECK: cvttsd2si | |
251 | |
252 define internal i32 @floatToSigned32(float %a) { | |
253 entry: | |
254 %conv = fptosi float %a to i32 | |
255 ret i32 %conv | |
256 } | |
257 ; CHECK-LABEL: floatToSigned32 | |
258 ; CHECK: cvttss2si | |
259 | |
260 define internal i32 @doubleToUnsigned32(double %a) { | |
261 entry: | |
262 %conv = fptoui double %a to i32 | |
263 ret i32 %conv | |
264 } | |
265 ; CHECK-LABEL: doubleToUnsigned32 | |
266 ; CHECK: call {{.*}} R_{{.*}} __Sz_fptoui_f64_i32 | |
267 | |
268 define internal i32 @floatToUnsigned32(float %a) { | |
269 entry: | |
270 %conv = fptoui float %a to i32 | |
271 ret i32 %conv | |
272 } | |
273 ; CHECK-LABEL: floatToUnsigned32 | |
274 ; CHECK: call {{.*}} R_{{.*}} __Sz_fptoui_f32_i32 | |
275 | |
276 define internal i32 @doubleToSigned16(double %a) { | |
277 entry: | |
278 %conv = fptosi double %a to i16 | |
279 %conv.ret_ext = sext i16 %conv to i32 | |
280 ret i32 %conv.ret_ext | |
281 } | |
282 ; CHECK-LABEL: doubleToSigned16 | |
283 ; CHECK: cvttsd2si | |
284 ; CHECK: movsx | |
285 | |
286 define internal i32 @floatToSigned16(float %a) { | |
287 entry: | |
288 %conv = fptosi float %a to i16 | |
289 %conv.ret_ext = sext i16 %conv to i32 | |
290 ret i32 %conv.ret_ext | |
291 } | |
292 ; CHECK-LABEL: floatToSigned16 | |
293 ; CHECK: cvttss2si | |
294 ; CHECK: movsx | |
295 | |
296 define internal i32 @doubleToUnsigned16(double %a) { | |
297 entry: | |
298 %conv = fptoui double %a to i16 | |
299 %conv.ret_ext = zext i16 %conv to i32 | |
300 ret i32 %conv.ret_ext | |
301 } | |
302 ; CHECK-LABEL: doubleToUnsigned16 | |
303 ; CHECK: cvttsd2si | |
304 ; CHECK: movzx | |
305 | |
306 define internal i32 @floatToUnsigned16(float %a) { | |
307 entry: | |
308 %conv = fptoui float %a to i16 | |
309 %conv.ret_ext = zext i16 %conv to i32 | |
310 ret i32 %conv.ret_ext | |
311 } | |
312 ; CHECK-LABEL: floatToUnsigned16 | |
313 ; CHECK: cvttss2si | |
314 ; CHECK: movzx | |
315 | |
316 define internal i32 @doubleToSigned8(double %a) { | |
317 entry: | |
318 %conv = fptosi double %a to i8 | |
319 %conv.ret_ext = sext i8 %conv to i32 | |
320 ret i32 %conv.ret_ext | |
321 } | |
322 ; CHECK-LABEL: doubleToSigned8 | |
323 ; CHECK: cvttsd2si | |
324 ; CHECK: movsx | |
325 | |
326 define internal i32 @floatToSigned8(float %a) { | |
327 entry: | |
328 %conv = fptosi float %a to i8 | |
329 %conv.ret_ext = sext i8 %conv to i32 | |
330 ret i32 %conv.ret_ext | |
331 } | |
332 ; CHECK-LABEL: floatToSigned8 | |
333 ; CHECK: cvttss2si | |
334 ; CHECK: movsx | |
335 | |
336 define internal i32 @doubleToUnsigned8(double %a) { | |
337 entry: | |
338 %conv = fptoui double %a to i8 | |
339 %conv.ret_ext = zext i8 %conv to i32 | |
340 ret i32 %conv.ret_ext | |
341 } | |
342 ; CHECK-LABEL: doubleToUnsigned8 | |
343 ; CHECK: cvttsd2si | |
344 ; CHECK: movzx | |
345 | |
346 define internal i32 @floatToUnsigned8(float %a) { | |
347 entry: | |
348 %conv = fptoui float %a to i8 | |
349 %conv.ret_ext = zext i8 %conv to i32 | |
350 ret i32 %conv.ret_ext | |
351 } | |
352 ; CHECK-LABEL: floatToUnsigned8 | |
353 ; CHECK: cvttss2si | |
354 ; CHECK: movzx | |
355 | |
356 define internal i32 @doubleToUnsigned1(double %a) { | |
357 entry: | |
358 %tobool = fptoui double %a to i1 | |
359 %tobool.ret_ext = zext i1 %tobool to i32 | |
360 ret i32 %tobool.ret_ext | |
361 } | |
362 ; CHECK-LABEL: doubleToUnsigned1 | |
363 ; CHECK: cvttsd2si | |
364 ; CHECK: and eax,0x1 | |
365 | |
366 define internal i32 @floatToUnsigned1(float %a) { | |
367 entry: | |
368 %tobool = fptoui float %a to i1 | |
369 %tobool.ret_ext = zext i1 %tobool to i32 | |
370 ret i32 %tobool.ret_ext | |
371 } | |
372 ; CHECK-LABEL: floatToUnsigned1 | |
373 ; CHECK: cvttss2si | |
374 ; CHECK: and eax,0x1 | |
375 | |
376 define internal double @signed64ToDouble(i64 %a) { | |
377 entry: | |
378 %conv = sitofp i64 %a to double | |
379 ret double %conv | |
380 } | |
381 ; CHECK-LABEL: signed64ToDouble | |
382 ; CHECK: call {{.*}} R_{{.*}} __Sz_sitofp_i64_f64 | |
383 ; CHECK: fstp QWORD | |
384 | |
385 define internal float @signed64ToFloat(i64 %a) { | |
386 entry: | |
387 %conv = sitofp i64 %a to float | |
388 ret float %conv | |
389 } | |
390 ; CHECK-LABEL: signed64ToFloat | |
391 ; CHECK: call {{.*}} R_{{.*}} __Sz_sitofp_i64_f32 | |
392 ; CHECK: fstp DWORD | |
393 | |
394 define internal double @unsigned64ToDouble(i64 %a) { | |
395 entry: | |
396 %conv = uitofp i64 %a to double | |
397 ret double %conv | |
398 } | |
399 ; CHECK-LABEL: unsigned64ToDouble | |
400 ; CHECK: call {{.*}} R_{{.*}} __Sz_uitofp_i64_f64 | |
401 ; CHECK: fstp | |
402 | |
403 define internal float @unsigned64ToFloat(i64 %a) { | |
404 entry: | |
405 %conv = uitofp i64 %a to float | |
406 ret float %conv | |
407 } | |
408 ; CHECK-LABEL: unsigned64ToFloat | |
409 ; CHECK: call {{.*}} R_{{.*}} __Sz_uitofp_i64_f32 | |
410 ; CHECK: fstp | |
411 | |
412 define internal double @unsigned64ToDoubleConst() { | |
413 entry: | |
414 %conv = uitofp i64 12345678901234 to double | |
415 ret double %conv | |
416 } | |
417 ; CHECK-LABEL: unsigned64ToDouble | |
418 ; CHECK: mov DWORD PTR [esp+0x4],0xb3a | |
419 ; CHECK: mov DWORD PTR [esp],0x73ce2ff2 | |
420 ; CHECK: call {{.*}} R_{{.*}} __Sz_uitofp_i64_f64 | |
421 ; CHECK: fstp | |
422 | |
423 define internal double @signed32ToDouble(i32 %a) { | |
424 entry: | |
425 %conv = sitofp i32 %a to double | |
426 ret double %conv | |
427 } | |
428 ; CHECK-LABEL: signed32ToDouble | |
429 ; CHECK: cvtsi2sd | |
430 ; CHECK: fld | |
431 | |
432 define internal double @signed32ToDoubleConst() { | |
433 entry: | |
434 %conv = sitofp i32 123 to double | |
435 ret double %conv | |
436 } | |
437 ; CHECK-LABEL: signed32ToDoubleConst | |
438 ; CHECK: cvtsi2sd {{.*[^1]}} | |
439 ; CHECK: fld | |
440 | |
441 define internal float @signed32ToFloat(i32 %a) { | |
442 entry: | |
443 %conv = sitofp i32 %a to float | |
444 ret float %conv | |
445 } | |
446 ; CHECK-LABEL: signed32ToFloat | |
447 ; CHECK: cvtsi2ss | |
448 ; CHECK: fld | |
449 | |
450 define internal double @unsigned32ToDouble(i32 %a) { | |
451 entry: | |
452 %conv = uitofp i32 %a to double | |
453 ret double %conv | |
454 } | |
455 ; CHECK-LABEL: unsigned32ToDouble | |
456 ; CHECK: call {{.*}} R_{{.*}} __Sz_uitofp_i32_f64 | |
457 ; CHECK: fstp QWORD | |
458 | |
459 define internal float @unsigned32ToFloat(i32 %a) { | |
460 entry: | |
461 %conv = uitofp i32 %a to float | |
462 ret float %conv | |
463 } | |
464 ; CHECK-LABEL: unsigned32ToFloat | |
465 ; CHECK: call {{.*}} R_{{.*}} __Sz_uitofp_i32_f32 | |
466 ; CHECK: fstp DWORD | |
467 | |
468 define internal double @signed16ToDouble(i32 %a) { | |
469 entry: | |
470 %a.arg_trunc = trunc i32 %a to i16 | |
471 %conv = sitofp i16 %a.arg_trunc to double | |
472 ret double %conv | |
473 } | |
474 ; CHECK-LABEL: signed16ToDouble | |
475 ; CHECK: cvtsi2sd | |
476 ; CHECK: fld QWORD | |
477 | |
478 define internal float @signed16ToFloat(i32 %a) { | |
479 entry: | |
480 %a.arg_trunc = trunc i32 %a to i16 | |
481 %conv = sitofp i16 %a.arg_trunc to float | |
482 ret float %conv | |
483 } | |
484 ; CHECK-LABEL: signed16ToFloat | |
485 ; CHECK: cvtsi2ss | |
486 ; CHECK: fld DWORD | |
487 | |
488 define internal double @unsigned16ToDouble(i32 %a) { | |
489 entry: | |
490 %a.arg_trunc = trunc i32 %a to i16 | |
491 %conv = uitofp i16 %a.arg_trunc to double | |
492 ret double %conv | |
493 } | |
494 ; CHECK-LABEL: unsigned16ToDouble | |
495 ; CHECK: cvtsi2sd | |
496 ; CHECK: fld | |
497 | |
498 define internal double @unsigned16ToDoubleConst() { | |
499 entry: | |
500 %conv = uitofp i16 12345 to double | |
501 ret double %conv | |
502 } | |
503 ; CHECK-LABEL: unsigned16ToDoubleConst | |
504 ; CHECK: cvtsi2sd | |
505 ; CHECK: fld | |
506 | |
507 define internal float @unsigned16ToFloat(i32 %a) { | |
508 entry: | |
509 %a.arg_trunc = trunc i32 %a to i16 | |
510 %conv = uitofp i16 %a.arg_trunc to float | |
511 ret float %conv | |
512 } | |
513 ; CHECK-LABEL: unsigned16ToFloat | |
514 ; CHECK: cvtsi2ss | |
515 ; CHECK: fld | |
516 | |
517 define internal double @signed8ToDouble(i32 %a) { | |
518 entry: | |
519 %a.arg_trunc = trunc i32 %a to i8 | |
520 %conv = sitofp i8 %a.arg_trunc to double | |
521 ret double %conv | |
522 } | |
523 ; CHECK-LABEL: signed8ToDouble | |
524 ; CHECK: cvtsi2sd | |
525 ; CHECK: fld | |
526 | |
527 define internal float @signed8ToFloat(i32 %a) { | |
528 entry: | |
529 %a.arg_trunc = trunc i32 %a to i8 | |
530 %conv = sitofp i8 %a.arg_trunc to float | |
531 ret float %conv | |
532 } | |
533 ; CHECK-LABEL: signed8ToFloat | |
534 ; CHECK: cvtsi2ss | |
535 ; CHECK: fld | |
536 | |
537 define internal double @unsigned8ToDouble(i32 %a) { | |
538 entry: | |
539 %a.arg_trunc = trunc i32 %a to i8 | |
540 %conv = uitofp i8 %a.arg_trunc to double | |
541 ret double %conv | |
542 } | |
543 ; CHECK-LABEL: unsigned8ToDouble | |
544 ; CHECK: cvtsi2sd | |
545 ; CHECK: fld | |
546 | |
547 define internal float @unsigned8ToFloat(i32 %a) { | |
548 entry: | |
549 %a.arg_trunc = trunc i32 %a to i8 | |
550 %conv = uitofp i8 %a.arg_trunc to float | |
551 ret float %conv | |
552 } | |
553 ; CHECK-LABEL: unsigned8ToFloat | |
554 ; CHECK: cvtsi2ss | |
555 ; CHECK: fld | |
556 | |
557 define internal double @unsigned1ToDouble(i32 %a) { | |
558 entry: | |
559 %a.arg_trunc = trunc i32 %a to i1 | |
560 %conv = uitofp i1 %a.arg_trunc to double | |
561 ret double %conv | |
562 } | |
563 ; CHECK-LABEL: unsigned1ToDouble | |
564 ; CHECK: cvtsi2sd | |
565 ; CHECK: fld | |
566 | |
567 define internal float @unsigned1ToFloat(i32 %a) { | |
568 entry: | |
569 %a.arg_trunc = trunc i32 %a to i1 | |
570 %conv = uitofp i1 %a.arg_trunc to float | |
571 ret float %conv | |
572 } | |
573 ; CHECK-LABEL: unsigned1ToFloat | |
574 ; CHECK: cvtsi2ss | |
575 ; CHECK: fld | |
576 | |
577 define internal float @int32BitcastToFloat(i32 %a) { | |
578 entry: | |
579 %conv = bitcast i32 %a to float | |
580 ret float %conv | |
581 } | |
582 ; CHECK-LABEL: int32BitcastToFloat | |
583 ; CHECK: mov | |
584 | |
585 define internal float @int32BitcastToFloatConst() { | |
586 entry: | |
587 %conv = bitcast i32 8675309 to float | |
588 ret float %conv | |
589 } | |
590 ; CHECK-LABEL: int32BitcastToFloatConst | |
591 ; CHECK: mov | |
592 | |
593 define internal double @int64BitcastToDouble(i64 %a) { | |
594 entry: | |
595 %conv = bitcast i64 %a to double | |
596 ret double %conv | |
597 } | |
598 ; CHECK-LABEL: int64BitcastToDouble | |
599 ; CHECK: mov | |
600 | |
601 define internal double @int64BitcastToDoubleConst() { | |
602 entry: | |
603 %conv = bitcast i64 9035768 to double | |
604 ret double %conv | |
605 } | |
606 ; CHECK-LABEL: int64BitcastToDoubleConst | |
607 ; CHECK: mov | |
608 | |
609 define internal void @fcmpEq(float %a, float %b, double %c, double %d) { | |
610 entry: | |
611 %cmp = fcmp oeq float %a, %b | |
612 br i1 %cmp, label %if.then, label %if.end | |
613 | |
614 if.then: ; preds = %entry | |
615 call void @func() | |
616 br label %if.end | |
617 | |
618 if.end: ; preds = %if.then, %entry | |
619 %cmp1 = fcmp oeq double %c, %d | |
620 br i1 %cmp1, label %if.then2, label %if.end3 | |
621 | |
622 if.then2: ; preds = %if.end | |
623 call void @func() | |
624 br label %if.end3 | |
625 | |
626 if.end3: ; preds = %if.then2, %if.end | |
627 ret void | |
628 } | |
629 ; CHECK-LABEL: fcmpEq | |
630 ; CHECK: ucomiss | |
631 ; CHECK: jne | |
632 ; CHECK-NEXT: jp | |
633 ; CHECK: call {{.*}} R_{{.*}} func | |
634 ; CHECK: ucomisd | |
635 ; CHECK: jne | |
636 ; CHECK-NEXT: jp | |
637 ; CHECK: call {{.*}} R_{{.*}} func | |
638 | |
639 declare void @func() | |
640 | |
641 define internal void @fcmpNe(float %a, float %b, double %c, double %d) { | |
642 entry: | |
643 %cmp = fcmp une float %a, %b | |
644 br i1 %cmp, label %if.then, label %if.end | |
645 | |
646 if.then: ; preds = %entry | |
647 call void @func() | |
648 br label %if.end | |
649 | |
650 if.end: ; preds = %if.then, %entry | |
651 %cmp1 = fcmp une double %c, %d | |
652 br i1 %cmp1, label %if.then2, label %if.end3 | |
653 | |
654 if.then2: ; preds = %if.end | |
655 call void @func() | |
656 br label %if.end3 | |
657 | |
658 if.end3: ; preds = %if.then2, %if.end | |
659 ret void | |
660 } | |
661 ; CHECK-LABEL: fcmpNe | |
662 ; CHECK: ucomiss | |
663 ; CHECK: jne | |
664 ; CHECK-NEXT: jp | |
665 ; CHECK: call {{.*}} R_{{.*}} func | |
666 ; CHECK: ucomisd | |
667 ; CHECK: jne | |
668 ; CHECK-NEXT: jp | |
669 ; CHECK: call {{.*}} R_{{.*}} func | |
670 | |
671 define internal void @fcmpGt(float %a, float %b, double %c, double %d) { | |
672 entry: | |
673 %cmp = fcmp ogt float %a, %b | |
674 br i1 %cmp, label %if.then, label %if.end | |
675 | |
676 if.then: ; preds = %entry | |
677 call void @func() | |
678 br label %if.end | |
679 | |
680 if.end: ; preds = %if.then, %entry | |
681 %cmp1 = fcmp ogt double %c, %d | |
682 br i1 %cmp1, label %if.then2, label %if.end3 | |
683 | |
684 if.then2: ; preds = %if.end | |
685 call void @func() | |
686 br label %if.end3 | |
687 | |
688 if.end3: ; preds = %if.then2, %if.end | |
689 ret void | |
690 } | |
691 ; CHECK-LABEL: fcmpGt | |
692 ; CHECK: ucomiss | |
693 ; CHECK: seta | |
694 ; CHECK: call {{.*}} R_{{.*}} func | |
695 ; CHECK: ucomisd | |
696 ; CHECK: seta | |
697 ; CHECK: call {{.*}} R_{{.*}} func | |
698 | |
699 define internal void @fcmpGe(float %a, float %b, double %c, double %d) { | |
700 entry: | |
701 %cmp = fcmp ult float %a, %b | |
702 br i1 %cmp, label %if.end, label %if.then | |
703 | |
704 if.then: ; preds = %entry | |
705 call void @func() | |
706 br label %if.end | |
707 | |
708 if.end: ; preds = %entry, %if.then | |
709 %cmp1 = fcmp ult double %c, %d | |
710 br i1 %cmp1, label %if.end3, label %if.then2 | |
711 | |
712 if.then2: ; preds = %if.end | |
713 call void @func() | |
714 br label %if.end3 | |
715 | |
716 if.end3: ; preds = %if.end, %if.then2 | |
717 ret void | |
718 } | |
719 ; CHECK-LABEL: fcmpGe | |
720 ; CHECK: ucomiss | |
721 ; CHECK: setb | |
722 ; CHECK: call {{.*}} R_{{.*}} func | |
723 ; CHECK: ucomisd | |
724 ; CHECK: setb | |
725 ; CHECK: call {{.*}} R_{{.*}} func | |
726 | |
727 define internal void @fcmpLt(float %a, float %b, double %c, double %d) { | |
728 entry: | |
729 %cmp = fcmp olt float %a, %b | |
730 br i1 %cmp, label %if.then, label %if.end | |
731 | |
732 if.then: ; preds = %entry | |
733 call void @func() | |
734 br label %if.end | |
735 | |
736 if.end: ; preds = %if.then, %entry | |
737 %cmp1 = fcmp olt double %c, %d | |
738 br i1 %cmp1, label %if.then2, label %if.end3 | |
739 | |
740 if.then2: ; preds = %if.end | |
741 call void @func() | |
742 br label %if.end3 | |
743 | |
744 if.end3: ; preds = %if.then2, %if.end | |
745 ret void | |
746 } | |
747 ; CHECK-LABEL: fcmpLt | |
748 ; CHECK: ucomiss | |
749 ; CHECK: seta | |
750 ; CHECK: call {{.*}} R_{{.*}} func | |
751 ; CHECK: ucomisd | |
752 ; CHECK: seta | |
753 ; CHECK: call {{.*}} R_{{.*}} func | |
754 | |
755 define internal void @fcmpLe(float %a, float %b, double %c, double %d) { | |
756 entry: | |
757 %cmp = fcmp ugt float %a, %b | |
758 br i1 %cmp, label %if.end, label %if.then | |
759 | |
760 if.then: ; preds = %entry | |
761 call void @func() | |
762 br label %if.end | |
763 | |
764 if.end: ; preds = %entry, %if.then | |
765 %cmp1 = fcmp ugt double %c, %d | |
766 br i1 %cmp1, label %if.end3, label %if.then2 | |
767 | |
768 if.then2: ; preds = %if.end | |
769 call void @func() | |
770 br label %if.end3 | |
771 | |
772 if.end3: ; preds = %if.end, %if.then2 | |
773 ret void | |
774 } | |
775 ; CHECK-LABEL: fcmpLe | |
776 ; CHECK: ucomiss | |
777 ; CHECK: setb | |
778 ; CHECK: call {{.*}} R_{{.*}} func | |
779 ; CHECK: ucomisd | |
780 ; CHECK: setb | |
781 ; CHECK: call {{.*}} R_{{.*}} func | |
782 | |
783 define internal i32 @fcmpFalseFloat(float %a, float %b) { | |
784 entry: | |
785 %cmp = fcmp false float %a, %b | |
786 %cmp.ret_ext = zext i1 %cmp to i32 | |
787 ret i32 %cmp.ret_ext | |
788 } | |
789 ; CHECK-LABEL: fcmpFalseFloat | |
790 ; CHECK: mov {{.*}},0x0 | |
791 | |
792 define internal i32 @fcmpFalseDouble(double %a, double %b) { | |
793 entry: | |
794 %cmp = fcmp false double %a, %b | |
795 %cmp.ret_ext = zext i1 %cmp to i32 | |
796 ret i32 %cmp.ret_ext | |
797 } | |
798 ; CHECK-LABEL: fcmpFalseDouble | |
799 ; CHECK: mov {{.*}},0x0 | |
800 | |
801 define internal i32 @fcmpOeqFloat(float %a, float %b) { | |
802 entry: | |
803 %cmp = fcmp oeq float %a, %b | |
804 %cmp.ret_ext = zext i1 %cmp to i32 | |
805 ret i32 %cmp.ret_ext | |
806 } | |
807 ; CHECK-LABEL: fcmpOeqFloat | |
808 ; CHECK: ucomiss | |
809 ; CHECK: jne | |
810 ; CHECK: jp | |
811 | |
812 define internal i32 @fcmpOeqDouble(double %a, double %b) { | |
813 entry: | |
814 %cmp = fcmp oeq double %a, %b | |
815 %cmp.ret_ext = zext i1 %cmp to i32 | |
816 ret i32 %cmp.ret_ext | |
817 } | |
818 ; CHECK-LABEL: fcmpOeqDouble | |
819 ; CHECK: ucomisd | |
820 ; CHECK: jne | |
821 ; CHECK: jp | |
822 | |
823 define internal i32 @fcmpOgtFloat(float %a, float %b) { | |
824 entry: | |
825 %cmp = fcmp ogt float %a, %b | |
826 %cmp.ret_ext = zext i1 %cmp to i32 | |
827 ret i32 %cmp.ret_ext | |
828 } | |
829 ; CHECK-LABEL: fcmpOgtFloat | |
830 ; CHECK: ucomiss | |
831 ; CHECK: seta | |
832 | |
833 define internal i32 @fcmpOgtDouble(double %a, double %b) { | |
834 entry: | |
835 %cmp = fcmp ogt double %a, %b | |
836 %cmp.ret_ext = zext i1 %cmp to i32 | |
837 ret i32 %cmp.ret_ext | |
838 } | |
839 ; CHECK-LABEL: fcmpOgtDouble | |
840 ; CHECK: ucomisd | |
841 ; CHECK: seta | |
842 | |
843 define internal i32 @fcmpOgeFloat(float %a, float %b) { | |
844 entry: | |
845 %cmp = fcmp oge float %a, %b | |
846 %cmp.ret_ext = zext i1 %cmp to i32 | |
847 ret i32 %cmp.ret_ext | |
848 } | |
849 ; CHECK-LABEL: fcmpOgeFloat | |
850 ; CHECK: ucomiss | |
851 ; CHECK: setae | |
852 | |
853 define internal i32 @fcmpOgeDouble(double %a, double %b) { | |
854 entry: | |
855 %cmp = fcmp oge double %a, %b | |
856 %cmp.ret_ext = zext i1 %cmp to i32 | |
857 ret i32 %cmp.ret_ext | |
858 } | |
859 ; CHECK-LABEL: fcmpOgeDouble | |
860 ; CHECK: ucomisd | |
861 ; CHECK: setae | |
862 | |
863 define internal i32 @fcmpOltFloat(float %a, float %b) { | |
864 entry: | |
865 %cmp = fcmp olt float %a, %b | |
866 %cmp.ret_ext = zext i1 %cmp to i32 | |
867 ret i32 %cmp.ret_ext | |
868 } | |
869 ; CHECK-LABEL: fcmpOltFloat | |
870 ; CHECK: ucomiss | |
871 ; CHECK: seta | |
872 | |
873 define internal i32 @fcmpOltDouble(double %a, double %b) { | |
874 entry: | |
875 %cmp = fcmp olt double %a, %b | |
876 %cmp.ret_ext = zext i1 %cmp to i32 | |
877 ret i32 %cmp.ret_ext | |
878 } | |
879 ; CHECK-LABEL: fcmpOltDouble | |
880 ; CHECK: ucomisd | |
881 ; CHECK: seta | |
882 | |
883 define internal i32 @fcmpOleFloat(float %a, float %b) { | |
884 entry: | |
885 %cmp = fcmp ole float %a, %b | |
886 %cmp.ret_ext = zext i1 %cmp to i32 | |
887 ret i32 %cmp.ret_ext | |
888 } | |
889 ; CHECK-LABEL: fcmpOleFloat | |
890 ; CHECK: ucomiss | |
891 ; CHECK: setae | |
892 | |
893 define internal i32 @fcmpOleDouble(double %a, double %b) { | |
894 entry: | |
895 %cmp = fcmp ole double %a, %b | |
896 %cmp.ret_ext = zext i1 %cmp to i32 | |
897 ret i32 %cmp.ret_ext | |
898 } | |
899 ; CHECK-LABEL: fcmpOleDouble | |
900 ; CHECK: ucomisd | |
901 ; CHECK: setae | |
902 | |
903 define internal i32 @fcmpOneFloat(float %a, float %b) { | |
904 entry: | |
905 %cmp = fcmp one float %a, %b | |
906 %cmp.ret_ext = zext i1 %cmp to i32 | |
907 ret i32 %cmp.ret_ext | |
908 } | |
909 ; CHECK-LABEL: fcmpOneFloat | |
910 ; CHECK: ucomiss | |
911 ; CHECK: setne | |
912 | |
913 define internal i32 @fcmpOneDouble(double %a, double %b) { | |
914 entry: | |
915 %cmp = fcmp one double %a, %b | |
916 %cmp.ret_ext = zext i1 %cmp to i32 | |
917 ret i32 %cmp.ret_ext | |
918 } | |
919 ; CHECK-LABEL: fcmpOneDouble | |
920 ; CHECK: ucomisd | |
921 ; CHECK: setne | |
922 | |
923 define internal i32 @fcmpOrdFloat(float %a, float %b) { | |
924 entry: | |
925 %cmp = fcmp ord float %a, %b | |
926 %cmp.ret_ext = zext i1 %cmp to i32 | |
927 ret i32 %cmp.ret_ext | |
928 } | |
929 ; CHECK-LABEL: fcmpOrdFloat | |
930 ; CHECK: ucomiss | |
931 ; CHECK: setnp | |
932 | |
933 define internal i32 @fcmpOrdDouble(double %a, double %b) { | |
934 entry: | |
935 %cmp = fcmp ord double %a, %b | |
936 %cmp.ret_ext = zext i1 %cmp to i32 | |
937 ret i32 %cmp.ret_ext | |
938 } | |
939 ; CHECK-LABEL: fcmpOrdDouble | |
940 ; CHECK: ucomisd | |
941 ; CHECK: setnp | |
942 | |
943 define internal i32 @fcmpUeqFloat(float %a, float %b) { | |
944 entry: | |
945 %cmp = fcmp ueq float %a, %b | |
946 %cmp.ret_ext = zext i1 %cmp to i32 | |
947 ret i32 %cmp.ret_ext | |
948 } | |
949 ; CHECK-LABEL: fcmpUeqFloat | |
950 ; CHECK: ucomiss | |
951 ; CHECK: sete | |
952 | |
953 define internal i32 @fcmpUeqDouble(double %a, double %b) { | |
954 entry: | |
955 %cmp = fcmp ueq double %a, %b | |
956 %cmp.ret_ext = zext i1 %cmp to i32 | |
957 ret i32 %cmp.ret_ext | |
958 } | |
959 ; CHECK-LABEL: fcmpUeqDouble | |
960 ; CHECK: ucomisd | |
961 ; CHECK: sete | |
962 | |
963 define internal i32 @fcmpUgtFloat(float %a, float %b) { | |
964 entry: | |
965 %cmp = fcmp ugt float %a, %b | |
966 %cmp.ret_ext = zext i1 %cmp to i32 | |
967 ret i32 %cmp.ret_ext | |
968 } | |
969 ; CHECK-LABEL: fcmpUgtFloat | |
970 ; CHECK: ucomiss | |
971 ; CHECK: setb | |
972 | |
973 define internal i32 @fcmpUgtDouble(double %a, double %b) { | |
974 entry: | |
975 %cmp = fcmp ugt double %a, %b | |
976 %cmp.ret_ext = zext i1 %cmp to i32 | |
977 ret i32 %cmp.ret_ext | |
978 } | |
979 ; CHECK-LABEL: fcmpUgtDouble | |
980 ; CHECK: ucomisd | |
981 ; CHECK: setb | |
982 | |
983 define internal i32 @fcmpUgeFloat(float %a, float %b) { | |
984 entry: | |
985 %cmp = fcmp uge float %a, %b | |
986 %cmp.ret_ext = zext i1 %cmp to i32 | |
987 ret i32 %cmp.ret_ext | |
988 } | |
989 ; CHECK-LABEL: fcmpUgeFloat | |
990 ; CHECK: ucomiss | |
991 ; CHECK: setbe | |
992 | |
993 define internal i32 @fcmpUgeDouble(double %a, double %b) { | |
994 entry: | |
995 %cmp = fcmp uge double %a, %b | |
996 %cmp.ret_ext = zext i1 %cmp to i32 | |
997 ret i32 %cmp.ret_ext | |
998 } | |
999 ; CHECK-LABEL: fcmpUgeDouble | |
1000 ; CHECK: ucomisd | |
1001 ; CHECK: setbe | |
1002 | |
1003 define internal i32 @fcmpUltFloat(float %a, float %b) { | |
1004 entry: | |
1005 %cmp = fcmp ult float %a, %b | |
1006 %cmp.ret_ext = zext i1 %cmp to i32 | |
1007 ret i32 %cmp.ret_ext | |
1008 } | |
1009 ; CHECK-LABEL: fcmpUltFloat | |
1010 ; CHECK: ucomiss | |
1011 ; CHECK: setb | |
1012 | |
1013 define internal i32 @fcmpUltDouble(double %a, double %b) { | |
1014 entry: | |
1015 %cmp = fcmp ult double %a, %b | |
1016 %cmp.ret_ext = zext i1 %cmp to i32 | |
1017 ret i32 %cmp.ret_ext | |
1018 } | |
1019 ; CHECK-LABEL: fcmpUltDouble | |
1020 ; CHECK: ucomisd | |
1021 ; CHECK: setb | |
1022 | |
1023 define internal i32 @fcmpUleFloat(float %a, float %b) { | |
1024 entry: | |
1025 %cmp = fcmp ule float %a, %b | |
1026 %cmp.ret_ext = zext i1 %cmp to i32 | |
1027 ret i32 %cmp.ret_ext | |
1028 } | |
1029 ; CHECK-LABEL: fcmpUleFloat | |
1030 ; CHECK: ucomiss | |
1031 ; CHECK: setbe | |
1032 | |
1033 define internal i32 @fcmpUleDouble(double %a, double %b) { | |
1034 entry: | |
1035 %cmp = fcmp ule double %a, %b | |
1036 %cmp.ret_ext = zext i1 %cmp to i32 | |
1037 ret i32 %cmp.ret_ext | |
1038 } | |
1039 ; CHECK-LABEL: fcmpUleDouble | |
1040 ; CHECK: ucomisd | |
1041 ; CHECK: setbe | |
1042 | |
1043 define internal i32 @fcmpUneFloat(float %a, float %b) { | |
1044 entry: | |
1045 %cmp = fcmp une float %a, %b | |
1046 %cmp.ret_ext = zext i1 %cmp to i32 | |
1047 ret i32 %cmp.ret_ext | |
1048 } | |
1049 ; CHECK-LABEL: fcmpUneFloat | |
1050 ; CHECK: ucomiss | |
1051 ; CHECK: jne | |
1052 ; CHECK: jp | |
1053 | |
1054 define internal i32 @fcmpUneDouble(double %a, double %b) { | |
1055 entry: | |
1056 %cmp = fcmp une double %a, %b | |
1057 %cmp.ret_ext = zext i1 %cmp to i32 | |
1058 ret i32 %cmp.ret_ext | |
1059 } | |
1060 ; CHECK-LABEL: fcmpUneDouble | |
1061 ; CHECK: ucomisd | |
1062 ; CHECK: jne | |
1063 ; CHECK: jp | |
1064 | |
1065 define internal i32 @fcmpUnoFloat(float %a, float %b) { | |
1066 entry: | |
1067 %cmp = fcmp uno float %a, %b | |
1068 %cmp.ret_ext = zext i1 %cmp to i32 | |
1069 ret i32 %cmp.ret_ext | |
1070 } | |
1071 ; CHECK-LABEL: fcmpUnoFloat | |
1072 ; CHECK: ucomiss | |
1073 ; CHECK: setp | |
1074 | |
1075 define internal i32 @fcmpUnoDouble(double %a, double %b) { | |
1076 entry: | |
1077 %cmp = fcmp uno double %a, %b | |
1078 %cmp.ret_ext = zext i1 %cmp to i32 | |
1079 ret i32 %cmp.ret_ext | |
1080 } | |
1081 ; CHECK-LABEL: fcmpUnoDouble | |
1082 ; CHECK: ucomisd | |
1083 ; CHECK: setp | |
1084 | |
1085 define internal i32 @fcmpTrueFloat(float %a, float %b) { | |
1086 entry: | |
1087 %cmp = fcmp true float %a, %b | |
1088 %cmp.ret_ext = zext i1 %cmp to i32 | |
1089 ret i32 %cmp.ret_ext | |
1090 } | |
1091 ; CHECK-LABEL: fcmpTrueFloat | |
1092 ; CHECK: mov {{.*}},0x1 | |
1093 | |
1094 define internal i32 @fcmpTrueDouble(double %a, double %b) { | |
1095 entry: | |
1096 %cmp = fcmp true double %a, %b | |
1097 %cmp.ret_ext = zext i1 %cmp to i32 | |
1098 ret i32 %cmp.ret_ext | |
1099 } | |
1100 ; CHECK-LABEL: fcmpTrueDouble | |
1101 ; CHECK: mov {{.*}},0x1 | |
1102 | |
1103 define internal float @loadFloat(i32 %a) { | |
1104 entry: | |
1105 %__1 = inttoptr i32 %a to float* | |
1106 %v0 = load float, float* %__1, align 4 | |
1107 ret float %v0 | |
1108 } | |
1109 ; CHECK-LABEL: loadFloat | |
1110 ; CHECK: movss | |
1111 ; CHECK: fld | |
1112 | |
1113 define internal double @loadDouble(i32 %a) { | |
1114 entry: | |
1115 %__1 = inttoptr i32 %a to double* | |
1116 %v0 = load double, double* %__1, align 8 | |
1117 ret double %v0 | |
1118 } | |
1119 ; CHECK-LABEL: loadDouble | |
1120 ; CHECK: movsd | |
1121 ; CHECK: fld | |
1122 | |
1123 define internal void @storeFloat(i32 %a, float %value) { | |
1124 entry: | |
1125 %__2 = inttoptr i32 %a to float* | |
1126 store float %value, float* %__2, align 4 | |
1127 ret void | |
1128 } | |
1129 ; CHECK-LABEL: storeFloat | |
1130 ; CHECK: movss | |
1131 ; CHECK: movss | |
1132 | |
1133 define internal void @storeDouble(i32 %a, double %value) { | |
1134 entry: | |
1135 %__2 = inttoptr i32 %a to double* | |
1136 store double %value, double* %__2, align 8 | |
1137 ret void | |
1138 } | |
1139 ; CHECK-LABEL: storeDouble | |
1140 ; CHECK: movsd | |
1141 ; CHECK: movsd | |
1142 | |
1143 define internal void @storeFloatConst(i32 %a) { | |
1144 entry: | |
1145 %a.asptr = inttoptr i32 %a to float* | |
1146 store float 0x3FF3AE1480000000, float* %a.asptr, align 4 | |
1147 ret void | |
1148 } | |
1149 ; CHECK-LABEL: storeFloatConst | |
1150 ; CHECK: movss | |
1151 ; CHECK: movss | |
1152 | |
1153 define internal void @storeDoubleConst(i32 %a) { | |
1154 entry: | |
1155 %a.asptr = inttoptr i32 %a to double* | |
1156 store double 1.230000e+00, double* %a.asptr, align 8 | |
1157 ret void | |
1158 } | |
1159 ; CHECK-LABEL: storeDoubleConst | |
1160 ; CHECK: movsd | |
1161 ; CHECK: movsd | |
1162 | |
1163 define internal float @selectFloatVarVar(float %a, float %b) { | |
1164 entry: | |
1165 %cmp = fcmp olt float %a, %b | |
1166 %cond = select i1 %cmp, float %a, float %b | |
1167 ret float %cond | |
1168 } | |
1169 ; CHECK-LABEL: selectFloatVarVar | |
1170 ; CHECK: ucomiss | |
1171 ; CHECK: seta | |
1172 ; CHECK: fld | |
1173 | |
1174 define internal double @selectDoubleVarVar(double %a, double %b) { | |
1175 entry: | |
1176 %cmp = fcmp olt double %a, %b | |
1177 %cond = select i1 %cmp, double %a, double %b | |
1178 ret double %cond | |
1179 } | |
1180 ; CHECK-LABEL: selectDoubleVarVar | |
1181 ; CHECK: ucomisd | |
1182 ; CHECK: seta | |
1183 ; CHECK: fld | |
OLD | NEW |