blob: 160d893d74ccb12307faa5eb9da4d899db3fc599 [file] [log] [blame]
Dan Gohmancdd48b82017-11-28 01:13:40 +00001; RUN: llc < %s -asm-verbose=false -disable-wasm-fallthrough-return-opt -disable-wasm-explicit-locals -mattr=-nontrapping-fptoint | FileCheck %s
2
3; Test that basic conversion operations assemble as expected using
4; the trapping opcodes and explicit code to suppress the trapping.
5
6target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
7target triple = "wasm32-unknown-unknown-wasm"
8
9; CHECK-LABEL: i32_trunc_s_f32:
10; CHECK-NEXT: .param f32{{$}}
11; CHECK-NEXT: .result i32{{$}}
12; CHECK-NEXT: block
13; CHECK-NEXT: f32.abs $push[[ABS:[0-9]+]]=, $0{{$}}
14; CHECK-NEXT: f32.const $push[[LIMIT:[0-9]+]]=, 0x1p31{{$}}
15; CHECK-NEXT: f32.lt $push[[LT:[0-9]+]]=, $pop[[ABS]], $pop[[LIMIT]]{{$}}
16; CHECK-NEXT: i32.eqz $push[[EQZ:[0-9]+]]=, $pop[[LT]]{{$}}
17; CHECK-NEXT: br_if 0, $pop[[EQZ]]{{$}}
18; CHECK-NEXT: i32.trunc_s/f32 $push[[NUM:[0-9]+]]=, $0{{$}}
19; CHECK-NEXT: return $pop[[NUM]]{{$}}
20; CHECK-NEXT: BB
21; CHECK-NEXT: end_block
22; CHECK-NEXT: i32.const $push[[ALT:[0-9]+]]=, -2147483648{{$}}
23; CHECK-NEXT: return $pop[[ALT]]{{$}}
24define i32 @i32_trunc_s_f32(float %x) {
25 %a = fptosi float %x to i32
26 ret i32 %a
27}
28
29; CHECK-LABEL: i32_trunc_u_f32:
30; CHECK-NEXT: .param f32{{$}}
31; CHECK-NEXT: .result i32{{$}}
32; CHECK-NEXT: block
33; CHECK-NEXT: f32.const $push[[LIMIT:[0-9]+]]=, 0x1p32{{$}}
34; CHECK-NEXT: f32.lt $push[[LT:[0-9]+]]=, $0, $pop[[LIMIT]]{{$}}
35; CHECK-NEXT: i32.eqz $push[[EQZ:[0-9]+]]=, $pop[[LT]]{{$}}
36; CHECK-NEXT: br_if 0, $pop[[EQZ]]{{$}}
37; CHECK-NEXT: i32.trunc_u/f32 $push[[NUM:[0-9]+]]=, $0{{$}}
38; CHECK-NEXT: return $pop[[NUM]]{{$}}
39; CHECK-NEXT: BB
40; CHECK-NEXT: end_block
41; CHECK-NEXT: i32.const $push[[ALT:[0-9]+]]=, 0{{$}}
42; CHECK-NEXT: return $pop[[ALT]]{{$}}
43define i32 @i32_trunc_u_f32(float %x) {
44 %a = fptoui float %x to i32
45 ret i32 %a
46}
47
48; CHECK-LABEL: i32_trunc_s_f64:
49; CHECK-NEXT: .param f64{{$}}
50; CHECK-NEXT: .result i32{{$}}
51; CHECK-NEXT: block
52; CHECK-NEXT: f64.abs $push[[ABS:[0-9]+]]=, $0{{$}}
53; CHECK-NEXT: f64.const $push[[LIMIT:[0-9]+]]=, 0x1p31{{$}}
54; CHECK-NEXT: f64.lt $push[[LT:[0-9]+]]=, $pop[[ABS]], $pop[[LIMIT]]{{$}}
55; CHECK-NEXT: i32.eqz $push[[EQZ:[0-9]+]]=, $pop[[LT]]{{$}}
56; CHECK-NEXT: br_if 0, $pop[[EQZ]]{{$}}
57; CHECK-NEXT: i32.trunc_s/f64 $push[[NUM:[0-9]+]]=, $0{{$}}
58; CHECK-NEXT: return $pop[[NUM]]{{$}}
59; CHECK-NEXT: BB
60; CHECK-NEXT: end_block
61; CHECK-NEXT: i32.const $push[[ALT:[0-9]+]]=, -2147483648{{$}}
62; CHECK-NEXT: return $pop[[ALT]]{{$}}
63define i32 @i32_trunc_s_f64(double %x) {
64 %a = fptosi double %x to i32
65 ret i32 %a
66}
67
68; CHECK-LABEL: i32_trunc_u_f64:
69; CHECK-NEXT: .param f64{{$}}
70; CHECK-NEXT: .result i32{{$}}
71; CHECK-NEXT: block
72; CHECK-NEXT: f64.const $push[[LIMIT:[0-9]+]]=, 0x1p32{{$}}
73; CHECK-NEXT: f64.lt $push[[LT:[0-9]+]]=, $0, $pop[[LIMIT]]{{$}}
74; CHECK-NEXT: i32.eqz $push[[EQZ:[0-9]+]]=, $pop[[LT]]{{$}}
75; CHECK-NEXT: br_if 0, $pop[[EQZ]]{{$}}
76; CHECK-NEXT: i32.trunc_u/f64 $push[[NUM:[0-9]+]]=, $0{{$}}
77; CHECK-NEXT: return $pop[[NUM]]{{$}}
78; CHECK-NEXT: BB
79; CHECK-NEXT: end_block
80; CHECK-NEXT: i32.const $push[[ALT:[0-9]+]]=, 0{{$}}
81; CHECK-NEXT: return $pop[[ALT]]{{$}}
82define i32 @i32_trunc_u_f64(double %x) {
83 %a = fptoui double %x to i32
84 ret i32 %a
85}
86
87; CHECK-LABEL: i64_trunc_s_f32:
88; CHECK-NEXT: .param f32{{$}}
89; CHECK-NEXT: .result i64{{$}}
90; CHECK-NEXT: block
91; CHECK-NEXT: f32.abs $push[[ABS:[0-9]+]]=, $0{{$}}
92; CHECK-NEXT: f32.const $push[[LIMIT:[0-9]+]]=, 0x1p63{{$}}
93; CHECK-NEXT: f32.lt $push[[LT:[0-9]+]]=, $pop[[ABS]], $pop[[LIMIT]]{{$}}
94; CHECK-NEXT: i32.eqz $push[[EQZ:[0-9]+]]=, $pop[[LT]]{{$}}
95; CHECK-NEXT: br_if 0, $pop[[EQZ]]{{$}}
96; CHECK-NEXT: i64.trunc_s/f32 $push[[NUM:[0-9]+]]=, $0{{$}}
97; CHECK-NEXT: return $pop[[NUM]]{{$}}
98; CHECK-NEXT: BB
99; CHECK-NEXT: end_block
100; CHECK-NEXT: i64.const $push[[ALT:[0-9]+]]=, -9223372036854775808{{$}}
101; CHECK-NEXT: return $pop[[ALT]]{{$}}
102define i64 @i64_trunc_s_f32(float %x) {
103 %a = fptosi float %x to i64
104 ret i64 %a
105}
106
107; CHECK-LABEL: i64_trunc_u_f32:
108; CHECK-NEXT: .param f32{{$}}
109; CHECK-NEXT: .result i64{{$}}
110; CHECK-NEXT: block
111; CHECK-NEXT: f32.const $push[[LIMIT:[0-9]+]]=, 0x1p64{{$}}
112; CHECK-NEXT: f32.lt $push[[LT:[0-9]+]]=, $0, $pop[[LIMIT]]{{$}}
113; CHECK-NEXT: i32.eqz $push[[EQZ:[0-9]+]]=, $pop[[LT]]{{$}}
114; CHECK-NEXT: br_if 0, $pop[[EQZ]]{{$}}
115; CHECK-NEXT: i64.trunc_u/f32 $push[[NUM:[0-9]+]]=, $0{{$}}
116; CHECK-NEXT: return $pop[[NUM]]{{$}}
117; CHECK-NEXT: BB
118; CHECK-NEXT: end_block
119; CHECK-NEXT: i64.const $push[[ALT:[0-9]+]]=, 0{{$}}
120; CHECK-NEXT: return $pop[[ALT]]{{$}}
121define i64 @i64_trunc_u_f32(float %x) {
122 %a = fptoui float %x to i64
123 ret i64 %a
124}
125
126; CHECK-LABEL: i64_trunc_s_f64:
127; CHECK-NEXT: .param f64{{$}}
128; CHECK-NEXT: .result i64{{$}}
129; CHECK-NEXT: block
130; CHECK-NEXT: f64.abs $push[[ABS:[0-9]+]]=, $0{{$}}
131; CHECK-NEXT: f64.const $push[[LIMIT:[0-9]+]]=, 0x1p63{{$}}
132; CHECK-NEXT: f64.lt $push[[LT:[0-9]+]]=, $pop[[ABS]], $pop[[LIMIT]]{{$}}
133; CHECK-NEXT: i32.eqz $push[[EQZ:[0-9]+]]=, $pop[[LT]]{{$}}
134; CHECK-NEXT: br_if 0, $pop[[EQZ]]{{$}}
135; CHECK-NEXT: i64.trunc_s/f64 $push[[NUM:[0-9]+]]=, $0{{$}}
136; CHECK-NEXT: return $pop[[NUM]]{{$}}
137; CHECK-NEXT: BB
138; CHECK-NEXT: end_block
139; CHECK-NEXT: i64.const $push[[ALT:[0-9]+]]=, -9223372036854775808{{$}}
140; CHECK-NEXT: return $pop[[ALT]]{{$}}
141define i64 @i64_trunc_s_f64(double %x) {
142 %a = fptosi double %x to i64
143 ret i64 %a
144}
145
146; CHECK-LABEL: i64_trunc_u_f64:
147; CHECK-NEXT: .param f64{{$}}
148; CHECK-NEXT: .result i64{{$}}
149; CHECK-NEXT: block
150; CHECK-NEXT: f64.const $push[[LIMIT:[0-9]+]]=, 0x1p64{{$}}
151; CHECK-NEXT: f64.lt $push[[LT:[0-9]+]]=, $0, $pop[[LIMIT]]{{$}}
152; CHECK-NEXT: i32.eqz $push[[EQZ:[0-9]+]]=, $pop[[LT]]{{$}}
153; CHECK-NEXT: br_if 0, $pop[[EQZ]]{{$}}
154; CHECK-NEXT: i64.trunc_u/f64 $push[[NUM:[0-9]+]]=, $0{{$}}
155; CHECK-NEXT: return $pop[[NUM]]{{$}}
156; CHECK-NEXT: BB
157; CHECK-NEXT: end_block
158; CHECK-NEXT: i64.const $push[[ALT:[0-9]+]]=, 0{{$}}
159; CHECK-NEXT: return $pop[[ALT]]{{$}}
160define i64 @i64_trunc_u_f64(double %x) {
161 %a = fptoui double %x to i64
162 ret i64 %a
163}