blob: 22cde0eb69035e234241cb4a33e3024154b22a5b [file] [log] [blame]
Leonard Chan99bda372018-10-15 16:07:02 +00001// RUN: %clang_cc1 -ffixed-point -S -emit-llvm %s -o - | FileCheck %s -check-prefix=DEFAULT
2// RUN: %clang_cc1 -ffixed-point -S -emit-llvm %s -o - -fpadding-on-unsigned-fixed-point | FileCheck %s -check-prefix=SAME
3
4void TestFixedPointCastSameType() {
5 _Accum a = 2.5k;
6 _Accum a2 = a;
Bjorn Petterssonb2534022018-10-26 16:12:12 +00007 // DEFAULT: [[ACCUM:%[0-9a-z]+]] = load i32, i32* %a, align 4
Leonard Chan99bda372018-10-15 16:07:02 +00008 // DEFAULT-NEXT: store i32 [[ACCUM]], i32* %a2, align 4
9
10 a2 = (_Accum)a;
Bjorn Petterssonb2534022018-10-26 16:12:12 +000011 // DEFAULT: [[ACCUM:%[0-9a-z]+]] = load i32, i32* %a, align 4
Leonard Chan99bda372018-10-15 16:07:02 +000012 // DEFAULT-NEXT: store i32 [[ACCUM]], i32* %a2, align 4
13}
14
15void TestFixedPointCastDown() {
16 long _Accum la = 2.5lk;
17 _Accum a = la;
Bjorn Petterssonb2534022018-10-26 16:12:12 +000018 // DEFAULT: [[LACCUM:%[0-9a-z]+]] = load i64, i64* %la, align 8
19 // DEFAULT-NEXT: [[ACCUM_AS_I64:%[0-9a-z]+]] = ashr i64 [[LACCUM]], 16
20 // DEFAULT-NEXT: [[ACCUM:%[0-9a-z]+]] = trunc i64 [[ACCUM_AS_I64]] to i32
Leonard Chan99bda372018-10-15 16:07:02 +000021 // DEFAULT-NEXT: store i32 [[ACCUM]], i32* %a, align 4
22
23 a = (_Accum)la;
Bjorn Petterssonb2534022018-10-26 16:12:12 +000024 // DEFAULT: [[LACCUM:%[0-9a-z]+]] = load i64, i64* %la, align 8
25 // DEFAULT-NEXT: [[ACCUM_AS_I64:%[0-9a-z]+]] = ashr i64 [[LACCUM]], 16
26 // DEFAULT-NEXT: [[ACCUM:%[0-9a-z]+]] = trunc i64 [[ACCUM_AS_I64]] to i32
Leonard Chan99bda372018-10-15 16:07:02 +000027 // DEFAULT-NEXT: store i32 [[ACCUM]], i32* %a, align 4
28
29 short _Accum sa = a;
Bjorn Petterssonb2534022018-10-26 16:12:12 +000030 // DEFAULT: [[ACCUM:%[0-9a-z]+]] = load i32, i32* %a, align 4
31 // DEFAULT-NEXT: [[SACCUM_AS_I32:%[0-9a-z]+]] = ashr i32 [[ACCUM]], 8
32 // DEFAULT-NEXT: [[SACCUM:%[0-9a-z]+]] = trunc i32 [[SACCUM_AS_I32]] to i16
Leonard Chan99bda372018-10-15 16:07:02 +000033 // DEFAULT-NEXT: store i16 [[SACCUM]], i16* %sa, align 2
34
35 sa = (short _Accum)a;
Bjorn Petterssonb2534022018-10-26 16:12:12 +000036 // DEFAULT: [[ACCUM:%[0-9a-z]+]] = load i32, i32* %a, align 4
37 // DEFAULT-NEXT: [[SACCUM_AS_I32:%[0-9a-z]+]] = ashr i32 [[ACCUM]], 8
38 // DEFAULT-NEXT: [[SACCUM:%[0-9a-z]+]] = trunc i32 [[SACCUM_AS_I32]] to i16
Leonard Chan99bda372018-10-15 16:07:02 +000039 // DEFAULT-NEXT: store i16 [[SACCUM]], i16* %sa, align 2
40}
41
42void TestFixedPointCastUp() {
43 short _Accum sa = 2.5hk;
44 _Accum a = sa;
Bjorn Petterssonb2534022018-10-26 16:12:12 +000045 // DEFAULT: [[SACCUM:%[0-9a-z]+]] = load i16, i16* %sa, align 2
46 // DEFAULT-NEXT: [[SACCUM_BUFF:%[0-9a-z]+]] = sext i16 [[SACCUM]] to i32
47 // DEFAULT-NEXT: [[ACCUM:%[0-9a-z]+]] = shl i32 [[SACCUM_BUFF]], 8
Leonard Chan99bda372018-10-15 16:07:02 +000048 // DEFAULT-NEXT: store i32 [[ACCUM]], i32* %a, align 4
49
50 long _Accum la = a;
Bjorn Petterssonb2534022018-10-26 16:12:12 +000051 // DEFAULT: [[ACCUM:%[0-9a-z]+]] = load i32, i32* %a, align 4
52 // DEFAULT-NEXT: [[ACCUM_BUFF:%[0-9a-z]+]] = sext i32 [[ACCUM]] to i64
53 // DEFAULT-NEXT: [[LACCUM:%[0-9a-z]+]] = shl i64 [[ACCUM_BUFF]], 16
Leonard Chan99bda372018-10-15 16:07:02 +000054 // DEFAULT-NEXT: store i64 [[LACCUM]], i64* %la, align 8
55
56 a = (_Accum)sa;
Bjorn Petterssonb2534022018-10-26 16:12:12 +000057 // DEFAULT: [[SACCUM:%[0-9a-z]+]] = load i16, i16* %sa, align 2
58 // DEFAULT-NEXT: [[SACCUM_BUFF:%[0-9a-z]+]] = sext i16 [[SACCUM]] to i32
59 // DEFAULT-NEXT: [[ACCUM:%[0-9a-z]+]] = shl i32 [[SACCUM_BUFF]], 8
Leonard Chan99bda372018-10-15 16:07:02 +000060 // DEFAULT-NEXT: store i32 [[ACCUM]], i32* %a, align 4
61
62 la = (long _Accum)a;
Bjorn Petterssonb2534022018-10-26 16:12:12 +000063 // DEFAULT: [[ACCUM:%[0-9a-z]+]] = load i32, i32* %a, align 4
64 // DEFAULT-NEXT: [[ACCUM_BUFF:%[0-9a-z]+]] = sext i32 [[ACCUM]] to i64
65 // DEFAULT-NEXT: [[LACCUM:%[0-9a-z]+]] = shl i64 [[ACCUM_BUFF]], 16
Leonard Chan99bda372018-10-15 16:07:02 +000066 // DEFAULT-NEXT: store i64 [[LACCUM]], i64* %la, align 8
67}
68
69void TestFixedPointCastSignedness() {
70 _Accum a = 2.5k;
71 unsigned _Accum ua = a;
Bjorn Petterssonb2534022018-10-26 16:12:12 +000072 // DEFAULT: [[ACCUM:%[0-9a-z]+]] = load i32, i32* %a, align 4
73 // DEFAULT-NEXT: [[UACCUM:%[0-9a-z]+]] = shl i32 [[ACCUM]], 1
Leonard Chan99bda372018-10-15 16:07:02 +000074 // DEFAULT-NEXT: store i32 [[UACCUM]], i32* %ua, align 4
75 // SAME: TestFixedPointCastSignedness
Bjorn Petterssonb2534022018-10-26 16:12:12 +000076 // SAME: [[ACCUM:%[0-9a-z]+]] = load i32, i32* %a, align 4
Leonard Chan99bda372018-10-15 16:07:02 +000077 // SAME-NEXT: store i32 [[ACCUM]], i32* %ua, align 4
78
79 a = ua;
Bjorn Petterssonb2534022018-10-26 16:12:12 +000080 // DEFAULT: [[UACCUM:%[0-9a-z]+]] = load i32, i32* %ua, align 4
81 // DEFAULT-NEXT: [[ACCUM:%[0-9a-z]+]] = lshr i32 [[UACCUM]], 1
Leonard Chan99bda372018-10-15 16:07:02 +000082 // DEFAULT-NEXT: store i32 [[ACCUM]], i32* %a, align 4
Bjorn Petterssonb2534022018-10-26 16:12:12 +000083 // SAME: [[ACCUM:%[0-9a-z]+]] = load i32, i32* %ua, align 4
Leonard Chan99bda372018-10-15 16:07:02 +000084 // SAME-NEXT: store i32 [[ACCUM]], i32* %a, align 4
85
86 ua = (unsigned _Accum)a;
Bjorn Petterssonb2534022018-10-26 16:12:12 +000087 // DEFAULT: [[ACCUM:%[0-9a-z]+]] = load i32, i32* %a, align 4
88 // DEFAULT-NEXT: [[UACCUM:%[0-9a-z]+]] = shl i32 [[ACCUM]], 1
Leonard Chan99bda372018-10-15 16:07:02 +000089 // DEFAULT-NEXT: store i32 [[UACCUM]], i32* %ua, align 4
90
91 a = (_Accum)ua;
Bjorn Petterssonb2534022018-10-26 16:12:12 +000092 // DEFAULT: [[UACCUM:%[0-9a-z]+]] = load i32, i32* %ua, align 4
93 // DEFAULT-NEXT: [[ACCUM:%[0-9a-z]+]] = lshr i32 [[UACCUM]], 1
Leonard Chan99bda372018-10-15 16:07:02 +000094 // DEFAULT-NEXT: store i32 [[ACCUM]], i32* %a, align 4
95
96 _Accum a2;
97 unsigned long _Accum ula = a2;
Bjorn Petterssonb2534022018-10-26 16:12:12 +000098 // DEFAULT: [[ACCUM:%[0-9a-z]+]] = load i32, i32* %a2, align 4
99 // DEFAULT-NEXT: [[ACCUM_EXT:%[0-9a-z]+]] = sext i32 [[ACCUM]] to i64
100 // DEFAULT-NEXT: [[LACCUM:%[0-9a-z]+]] = shl i64 [[ACCUM_EXT]], 17
Leonard Chan99bda372018-10-15 16:07:02 +0000101 // DEFAULT-NEXT: store i64 [[LACCUM]], i64* %ula, align 8
Bjorn Petterssonb2534022018-10-26 16:12:12 +0000102 // SAME: [[ACCUM:%[0-9a-z]+]] = load i32, i32* %a2, align 4
103 // SAME-NEXT: [[ACCUM_EXT:%[0-9a-z]+]] = sext i32 [[ACCUM]] to i64
104 // SAME-NEXT: [[LACCUM:%[0-9a-z]+]] = shl i64 [[ACCUM_EXT]], 16
Leonard Chan99bda372018-10-15 16:07:02 +0000105 // SAME-NEXT: store i64 [[LACCUM]], i64* %ula, align 8
106}
107
108void TestFixedPointCastSaturation() {
109 _Accum a;
110 _Sat short _Accum sat_sa;
111 _Sat _Accum sat_a;
112 _Sat long _Accum sat_la;
113 _Sat unsigned short _Accum sat_usa;
114 _Sat unsigned _Accum sat_ua;
115 _Sat unsigned long _Accum sat_ula;
116 _Sat short _Fract sat_sf;
117 _Sat _Fract sat_f;
118 _Sat long _Fract sat_lf;
119
120 // Casting down between types
121 sat_sa = sat_a;
Bjorn Petterssonb2534022018-10-26 16:12:12 +0000122 // DEFAULT: [[OLD_ACCUM:%[0-9a-z]+]] = load i32, i32* %sat_a, align 4
123 // DEFAULT-NEXT: [[ACCUM:%[0-9a-z]+]] = ashr i32 [[OLD_ACCUM]], 8
124 // DEFAULT-NEXT: [[USE_MAX:%[0-9a-z]+]] = icmp sgt i32 [[ACCUM]], 32767
125 // DEFAULT-NEXT: [[RESULT:%[0-9a-z]+]] = select i1 [[USE_MAX]], i32 32767, i32 [[ACCUM]]
126 // DEFAULT-NEXT: [[USE_MIN:%[0-9a-z]+]] = icmp slt i32 [[RESULT]], -32768
127 // DEFAULT-NEXT: [[RESULT2:%[0-9a-z]+]] = select i1 [[USE_MIN]], i32 -32768, i32 [[RESULT]]
128 // DEFAULT-NEXT: [[RESULT_TRUNC:%[0-9a-z]+]] = trunc i32 [[RESULT2]] to i16
Leonard Chan99bda372018-10-15 16:07:02 +0000129 // DEFAULT-NEXT: store i16 [[RESULT_TRUNC]], i16* %sat_sa, align 2
130
131 // Accum to Fract, decreasing scale
132 sat_sf = sat_a;
Bjorn Petterssonb2534022018-10-26 16:12:12 +0000133 // DEFAULT: [[OLD_ACCUM:%[0-9a-z]+]] = load i32, i32* %sat_a, align 4
134 // DEFAULT-NEXT: [[FRACT:%[0-9a-z]+]] = ashr i32 [[OLD_ACCUM]], 8
135 // DEFAULT-NEXT: [[USE_MAX:%[0-9a-z]+]] = icmp sgt i32 [[FRACT]], 127
136 // DEFAULT-NEXT: [[RESULT:%[0-9a-z]+]] = select i1 [[USE_MAX]], i32 127, i32 [[FRACT]]
137 // DEFAULT-NEXT: [[USE_MIN:%[0-9a-z]+]] = icmp slt i32 [[RESULT]], -128
138 // DEFAULT-NEXT: [[RESULT2:%[0-9a-z]+]] = select i1 [[USE_MIN]], i32 -128, i32 [[RESULT]]
139 // DEFAULT-NEXT: [[RESULT_TRUNC:%[0-9a-z]+]] = trunc i32 [[RESULT2]] to i8
Leonard Chan99bda372018-10-15 16:07:02 +0000140 // DEFAULT-NEXT: store i8 [[RESULT_TRUNC]], i8* %sat_sf, align 1
141
142 // Accum to Fract, same scale
143 sat_f = a;
Bjorn Petterssonb2534022018-10-26 16:12:12 +0000144 // DEFAULT: [[ACCUM:%[0-9a-z]+]] = load i32, i32* %a, align 4
145 // DEFAULT-NEXT: [[USE_MAX:%[0-9a-z]+]] = icmp sgt i32 [[ACCUM]], 32767
146 // DEFAULT-NEXT: [[RESULT:%[0-9a-z]+]] = select i1 [[USE_MAX]], i32 32767, i32 [[ACCUM]]
147 // DEFAULT-NEXT: [[USE_MIN:%[0-9a-z]+]] = icmp slt i32 [[RESULT]], -32768
148 // DEFAULT-NEXT: [[RESULT2:%[0-9a-z]+]] = select i1 [[USE_MIN]], i32 -32768, i32 [[RESULT]]
149 // DEFAULT-NEXT: [[RESULT_TRUNC:%[0-9a-z]+]] = trunc i32 [[RESULT2]] to i16
Leonard Chan99bda372018-10-15 16:07:02 +0000150 // DEFAULT-NEXT: store i16 [[RESULT_TRUNC]], i16* %sat_f, align 2
151
152 // Accum to Fract, increasing scale
153 sat_lf = sat_a;
Bjorn Petterssonb2534022018-10-26 16:12:12 +0000154 // DEFAULT: [[OLD_ACCUM:%[0-9a-z]+]] = load i32, i32* %sat_a, align 4
155 // DEFAULT-NEXT: [[ACCUM:%[0-9a-z]+]] = sext i32 [[OLD_ACCUM]] to i48
156 // DEFAULT-NEXT: [[FRACT:%[0-9a-z]+]] = shl i48 [[ACCUM]], 16
157 // DEFAULT-NEXT: [[USE_MAX:%[0-9a-z]+]] = icmp sgt i48 [[FRACT]], 2147483647
158 // DEFAULT-NEXT: [[RESULT:%[0-9a-z]+]] = select i1 [[USE_MAX]], i48 2147483647, i48 [[FRACT]]
159 // DEFAULT-NEXT: [[USE_MIN:%[0-9a-z]+]] = icmp slt i48 [[RESULT]], -2147483648
160 // DEFAULT-NEXT: [[RESULT2:%[0-9a-z]+]] = select i1 [[USE_MIN]], i48 -2147483648, i48 [[RESULT]]
161 // DEFAULT-NEXT: [[RESULT_TRUNC:%[0-9a-z]+]] = trunc i48 [[RESULT2]] to i32
Leonard Chan99bda372018-10-15 16:07:02 +0000162 // DEFAULT-NEXT: store i32 [[RESULT_TRUNC]], i32* %sat_lf, align 4
163
164 // Signed to unsigned, decreasing scale
165 _Sat _Accum sat_a2;
166 sat_usa = sat_a2;
Bjorn Petterssonb2534022018-10-26 16:12:12 +0000167 // DEFAULT: [[OLD_ACCUM:%[0-9a-z]+]] = load i32, i32* %sat_a2, align 4
168 // DEFAULT-NEXT: [[ACCUM:%[0-9a-z]+]] = ashr i32 [[OLD_ACCUM]], 7
169 // DEFAULT-NEXT: [[USE_MAX:%[0-9a-z]+]] = icmp sgt i32 [[ACCUM]], 65535
170 // DEFAULT-NEXT: [[RESULT:%[0-9a-z]+]] = select i1 [[USE_MAX]], i32 65535, i32 [[ACCUM]]
171 // DEFAULT-NEXT: [[USE_MIN:%[0-9a-z]+]] = icmp slt i32 [[RESULT]], 0
172 // DEFAULT-NEXT: [[RESULT2:%[0-9a-z]+]] = select i1 [[USE_MIN]], i32 0, i32 [[RESULT]]
173 // DEFAULT-NEXT: [[RESULT_TRUNC:%[0-9a-z]+]] = trunc i32 [[RESULT2]] to i16
Leonard Chan99bda372018-10-15 16:07:02 +0000174 // DEFAULT-NEXT: store i16 [[RESULT_TRUNC]], i16* %sat_usa, align 2
Bjorn Petterssonb2534022018-10-26 16:12:12 +0000175 // SAME: [[OLD_ACCUM:%[0-9a-z]+]] = load i32, i32* %sat_a2, align 4
176 // SAME-NEXT: [[ACCUM:%[0-9a-z]+]] = ashr i32 [[OLD_ACCUM]], 8
177 // SAME-NEXT: [[USE_MAX:%[0-9a-z]+]] = icmp sgt i32 [[ACCUM]], 32767
178 // SAME-NEXT: [[RESULT:%[0-9a-z]+]] = select i1 [[USE_MAX]], i32 32767, i32 [[ACCUM]]
179 // SAME-NEXT: [[USE_MIN:%[0-9a-z]+]] = icmp slt i32 [[RESULT]], 0
180 // SAME-NEXT: [[RESULT2:%[0-9a-z]+]] = select i1 [[USE_MIN]], i32 0, i32 [[RESULT]]
181 // SAME-NEXT: [[RESULT_TRUNC:%[0-9a-z]+]] = trunc i32 [[RESULT2]] to i16
Leonard Chan99bda372018-10-15 16:07:02 +0000182 // SAME-NEXT: store i16 [[RESULT_TRUNC]], i16* %sat_usa, align 2
183
184 // Signed to unsigned, increasing scale
185 sat_ua = sat_a;
Bjorn Petterssonb2534022018-10-26 16:12:12 +0000186 // DEFAULT: [[OLD_ACCUM:%[0-9a-z]+]] = load i32, i32* %sat_a, align 4
187 // DEFAULT-NEXT: [[ACCUM_EXT:%[0-9a-z]+]] = sext i32 [[OLD_ACCUM]] to i33
188 // DEFAULT-NEXT: [[ACCUM:%[0-9a-z]+]] = shl i33 [[ACCUM_EXT]], 1
189 // DEFAULT-NEXT: [[USE_MIN:%[0-9a-z]+]] = icmp slt i33 [[ACCUM]], 0
190 // DEFAULT-NEXT: [[RESULT2:%[0-9a-z]+]] = select i1 [[USE_MIN]], i33 0, i33 [[ACCUM]]
191 // DEFAULT-NEXT: [[RESULT_TRUNC:%[0-9a-z]+]] = trunc i33 [[RESULT2]] to i32
Leonard Chan99bda372018-10-15 16:07:02 +0000192 // DEFAULT-NEXT: store i32 [[RESULT_TRUNC]], i32* %sat_ua, align 4
Bjorn Petterssonb2534022018-10-26 16:12:12 +0000193 // SAME: [[ACCUM:%[0-9a-z]+]] = load i32, i32* %sat_a, align 4
194 // SAME-NEXT: [[USE_MIN:%[0-9a-z]+]] = icmp slt i32 [[ACCUM]], 0
195 // SAME-NEXT: [[RESULT:%[0-9a-z]+]] = select i1 [[USE_MIN]], i32 0, i32 [[ACCUM]]
Leonard Chan99bda372018-10-15 16:07:02 +0000196 // SAME-NEXT: store i32 [[RESULT]], i32* %sat_ua, align 4
197
198 // Nothing when saturating to the same type and size
199 sat_a = a;
Bjorn Petterssonb2534022018-10-26 16:12:12 +0000200 // DEFAULT: [[ACCUM:%[0-9a-z]+]] = load i32, i32* %a, align 4
Leonard Chan99bda372018-10-15 16:07:02 +0000201 // DEFAULT-NEXT: store i32 [[ACCUM]], i32* %sat_a, align 4
202
203 // Nothing when assigning back
204 a = sat_a;
Bjorn Petterssonb2534022018-10-26 16:12:12 +0000205 // DEFAULT: [[SAT_ACCUM:%[0-9a-z]+]] = load i32, i32* %sat_a, align 4
Leonard Chan99bda372018-10-15 16:07:02 +0000206 // DEFAULT-NEXT: store i32 [[SAT_ACCUM]], i32* %a, align 4
207
208 // No overflow when casting from fract to signed accum
209 sat_a = sat_f;
Bjorn Petterssonb2534022018-10-26 16:12:12 +0000210 // DEFAULT: [[FRACT:%[0-9a-z]+]] = load i16, i16* %sat_f, align 2
211 // DEFAULT-NEXT: [[FRACT_EXT:%[0-9a-z]+]] = sext i16 [[FRACT]] to i32
Leonard Chan99bda372018-10-15 16:07:02 +0000212 // DEFAULT-NEXT: store i32 [[FRACT_EXT]], i32* %sat_a, align 4
213
214 // Only get overflow checking if signed fract to unsigned accum
215 sat_ua = sat_sf;
Bjorn Petterssonb2534022018-10-26 16:12:12 +0000216 // DEFAULT: [[FRACT:%[0-9a-z]+]] = load i8, i8* %sat_sf, align 1
Leonard Chan2044ac82019-01-16 18:13:59 +0000217 // DEFAULT-NEXT: [[FRACT_EXT:%[0-9a-z]+]] = sext i8 [[FRACT]] to i32
218 // DEFAULT-NEXT: [[ACCUM:%[0-9a-z]+]] = shl i32 [[FRACT_EXT]], 9
219 // DEFAULT-NEXT: [[IS_NEG:%[0-9a-z]+]] = icmp slt i32 [[ACCUM]], 0
220 // DEFAULT-NEXT: [[RESULT:%[0-9a-z]+]] = select i1 [[IS_NEG]], i32 0, i32 [[ACCUM]]
221 // DEFAULT-NEXT: store i32 [[RESULT]], i32* %sat_ua, align 4
Bjorn Petterssonb2534022018-10-26 16:12:12 +0000222 // SAME: [[FRACT:%[0-9a-z]+]] = load i8, i8* %sat_sf, align 1
Leonard Chan2044ac82019-01-16 18:13:59 +0000223 // SAME-NEXT: [[FRACT_EXT:%[0-9a-z]+]] = sext i8 [[FRACT]] to i32
224 // SAME-NEXT: [[ACCUM:%[0-9a-z]+]] = shl i32 [[FRACT_EXT]], 8
225 // SAME-NEXT: [[IS_NEG:%[0-9a-z]+]] = icmp slt i32 [[ACCUM]], 0
226 // SAME-NEXT: [[RESULT:%[0-9a-z]+]] = select i1 [[IS_NEG]], i32 0, i32 [[ACCUM]]
227 // SAME-NEXT: store i32 [[RESULT]], i32* %sat_ua, align 4
Leonard Chan99bda372018-10-15 16:07:02 +0000228}
229
230void TestFixedPointCastBetFractAccum() {
231 short _Accum sa;
232 _Accum a;
233 long _Accum la;
234 short _Fract sf;
235 _Fract f;
236 long _Fract lf;
237 unsigned _Accum ua;
238 unsigned _Fract uf;
239
240 // To lower scale
241 sf = a;
Bjorn Petterssonb2534022018-10-26 16:12:12 +0000242 // DEFAULT: [[ACCUM:%[0-9a-z]+]] = load i32, i32* %a, align 4
243 // DEFAULT-NEXT: [[FRACT:%[0-9a-z]+]] = ashr i32 [[ACCUM]], 8
244 // DEFAULT-NEXT: [[FRACT_TRUNC:%[0-9a-z]+]] = trunc i32 [[FRACT]] to i8
Leonard Chan99bda372018-10-15 16:07:02 +0000245 // DEFAULT-NEXT: store i8 [[FRACT_TRUNC]], i8* %sf, align 1
246
247 // To higher scale
248 a = sf;
Bjorn Petterssonb2534022018-10-26 16:12:12 +0000249 // DEFAULT: [[FRACT:%[0-9a-z]+]] = load i8, i8* %sf, align 1
250 // DEFAULT-NEXT: [[FRACT_EXT:%[0-9a-z]+]] = sext i8 [[FRACT]] to i32
251 // DEFAULT-NEXT: [[ACCUM:%[0-9a-z]+]] = shl i32 [[FRACT_EXT]], 8
Leonard Chan99bda372018-10-15 16:07:02 +0000252 // DEFAULT-NEXT: store i32 [[ACCUM]], i32* %a, align 4
253
254 // To same scale
255 f = a;
Bjorn Petterssonb2534022018-10-26 16:12:12 +0000256 // DEFAULT: [[ACCUM:%[0-9a-z]+]] = load i32, i32* %a, align 4
257 // DEFAULT-NEXT: [[FRACT:%[0-9a-z]+]] = trunc i32 [[ACCUM]] to i16
Leonard Chan99bda372018-10-15 16:07:02 +0000258 // DEFAULT-NEXT: store i16 [[FRACT]], i16* %f, align 2
259
260 a = f;
Bjorn Petterssonb2534022018-10-26 16:12:12 +0000261 // DEFAULT: [[FRACT:%[0-9a-z]+]] = load i16, i16* %f, align 2
262 // DEFAULT-NEXT: [[ACCUM:%[0-9a-z]+]] = sext i16 [[FRACT]] to i32
Leonard Chan99bda372018-10-15 16:07:02 +0000263 // DEFAULT-NEXT: store i32 [[ACCUM]], i32* %a, align 4
264
265 // To unsigned
266 ua = uf;
Bjorn Petterssonb2534022018-10-26 16:12:12 +0000267 // DEFAULT: [[FRACT:%[0-9a-z]+]] = load i16, i16* %uf, align 2
268 // DEFAULT-NEXT: [[ACCUM:%[0-9a-z]+]] = zext i16 [[FRACT]] to i32
Leonard Chan99bda372018-10-15 16:07:02 +0000269 // DEFAULT-NEXT: store i32 [[ACCUM]], i32* %ua, align 4
Bjorn Petterssonb2534022018-10-26 16:12:12 +0000270 // SAME: [[FRACT:%[0-9a-z]+]] = load i16, i16* %uf, align 2
271 // SAME-NEXT: [[ACCUM:%[0-9a-z]+]] = zext i16 [[FRACT]] to i32
Leonard Chan99bda372018-10-15 16:07:02 +0000272 // SAME-NEXT: store i32 [[ACCUM]], i32* %ua, align 4
273
274 uf = ua;
Bjorn Petterssonb2534022018-10-26 16:12:12 +0000275 // DEFAULT: [[FRACT:%[0-9a-z]+]] = load i32, i32* %ua, align 4
276 // DEFAULT-NEXT: [[ACCUM:%[0-9a-z]+]] = trunc i32 [[FRACT]] to i16
Leonard Chan99bda372018-10-15 16:07:02 +0000277 // DEFAULT-NEXT: store i16 [[ACCUM]], i16* %uf, align 2
Bjorn Petterssonb2534022018-10-26 16:12:12 +0000278 // SAME: [[FRACT:%[0-9a-z]+]] = load i32, i32* %ua, align 4
279 // SAME-NEXT: [[ACCUM:%[0-9a-z]+]] = trunc i32 [[FRACT]] to i16
Leonard Chan99bda372018-10-15 16:07:02 +0000280 // SAME-NEXT: store i16 [[ACCUM]], i16* %uf, align 2
281}