144ebc2c8SBevin Hansson // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
2*c5de4dd1SFangrui Song // RUN: %clang_cc1 -ffixed-point -triple x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefixes=CHECK,SIGNED
3*c5de4dd1SFangrui Song // RUN: %clang_cc1 -ffixed-point -triple x86_64-unknown-linux-gnu -fpadding-on-unsigned-fixed-point -emit-llvm %s -o - | FileCheck %s --check-prefixes=CHECK,UNSIGNED
40b9922e6SBevin Hansson
50b9922e6SBevin Hansson short _Accum sa;
644ebc2c8SBevin Hansson _Accum a, a2, a3, a4;
70b9922e6SBevin Hansson long _Accum la;
80b9922e6SBevin Hansson unsigned short _Accum usa;
90b9922e6SBevin Hansson unsigned _Accum ua;
100b9922e6SBevin Hansson unsigned long _Accum ula;
110b9922e6SBevin Hansson
120b9922e6SBevin Hansson short _Fract sf;
130b9922e6SBevin Hansson _Fract f;
140b9922e6SBevin Hansson long _Fract lf;
150b9922e6SBevin Hansson unsigned short _Fract usf;
160b9922e6SBevin Hansson unsigned _Fract uf;
170b9922e6SBevin Hansson unsigned long _Fract ulf;
180b9922e6SBevin Hansson
190b9922e6SBevin Hansson _Sat short _Accum sa_sat;
200b9922e6SBevin Hansson _Sat _Accum a_sat;
210b9922e6SBevin Hansson _Sat long _Accum la_sat;
220b9922e6SBevin Hansson _Sat unsigned short _Accum usa_sat;
230b9922e6SBevin Hansson _Sat unsigned _Accum ua_sat;
240b9922e6SBevin Hansson _Sat unsigned long _Accum ula_sat;
250b9922e6SBevin Hansson _Sat unsigned _Fract uf_sat;
260b9922e6SBevin Hansson
270b9922e6SBevin Hansson int i;
280b9922e6SBevin Hansson unsigned int ui;
2944ebc2c8SBevin Hansson _Bool b;
300b9922e6SBevin Hansson
3144ebc2c8SBevin Hansson // CHECK-LABEL: @sdiv_sasasa(
3244ebc2c8SBevin Hansson // CHECK-NEXT: entry:
339466b491SNikita Popov // CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr @sa, align 2
349466b491SNikita Popov // CHECK-NEXT: [[TMP1:%.*]] = load i16, ptr @sa, align 2
3544ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP2:%.*]] = call i16 @llvm.sdiv.fix.i16(i16 [[TMP0]], i16 [[TMP1]], i32 7)
369466b491SNikita Popov // CHECK-NEXT: store i16 [[TMP2]], ptr @sa, align 2
3744ebc2c8SBevin Hansson // CHECK-NEXT: ret void
3844ebc2c8SBevin Hansson //
sdiv_sasasa(void)397de71613SAaron Ballman void sdiv_sasasa(void) {
4044ebc2c8SBevin Hansson sa = sa / sa;
4144ebc2c8SBevin Hansson }
4244ebc2c8SBevin Hansson
4344ebc2c8SBevin Hansson // CHECK-LABEL: @sdiv_asaa(
4444ebc2c8SBevin Hansson // CHECK-NEXT: entry:
459466b491SNikita Popov // CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr @sa, align 2
469466b491SNikita Popov // CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @a, align 4
4744ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE:%.*]] = sext i16 [[TMP0]] to i32
4844ebc2c8SBevin Hansson // CHECK-NEXT: [[UPSCALE:%.*]] = shl i32 [[RESIZE]], 8
4944ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP2:%.*]] = call i32 @llvm.sdiv.fix.i32(i32 [[UPSCALE]], i32 [[TMP1]], i32 15)
509466b491SNikita Popov // CHECK-NEXT: store i32 [[TMP2]], ptr @a, align 4
5144ebc2c8SBevin Hansson // CHECK-NEXT: ret void
5244ebc2c8SBevin Hansson //
sdiv_asaa(void)537de71613SAaron Ballman void sdiv_asaa(void) {
5444ebc2c8SBevin Hansson a = sa / a;
5544ebc2c8SBevin Hansson }
5644ebc2c8SBevin Hansson
5744ebc2c8SBevin Hansson // CHECK-LABEL: @sdiv_sasasf(
5844ebc2c8SBevin Hansson // CHECK-NEXT: entry:
599466b491SNikita Popov // CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr @sa, align 2
609466b491SNikita Popov // CHECK-NEXT: [[TMP1:%.*]] = load i8, ptr @sf, align 1
6144ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE:%.*]] = sext i8 [[TMP1]] to i16
6244ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP2:%.*]] = call i16 @llvm.sdiv.fix.i16(i16 [[TMP0]], i16 [[RESIZE]], i32 7)
639466b491SNikita Popov // CHECK-NEXT: store i16 [[TMP2]], ptr @sa, align 2
6444ebc2c8SBevin Hansson // CHECK-NEXT: ret void
6544ebc2c8SBevin Hansson //
sdiv_sasasf(void)667de71613SAaron Ballman void sdiv_sasasf(void) {
6744ebc2c8SBevin Hansson sa = sa / sf;
6844ebc2c8SBevin Hansson }
6944ebc2c8SBevin Hansson
7044ebc2c8SBevin Hansson // CHECK-LABEL: @sdiv_sasaf(
7144ebc2c8SBevin Hansson // CHECK-NEXT: entry:
729466b491SNikita Popov // CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr @sa, align 2
739466b491SNikita Popov // CHECK-NEXT: [[TMP1:%.*]] = load i16, ptr @f, align 2
7444ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE:%.*]] = sext i16 [[TMP0]] to i24
7544ebc2c8SBevin Hansson // CHECK-NEXT: [[UPSCALE:%.*]] = shl i24 [[RESIZE]], 8
7644ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE1:%.*]] = sext i16 [[TMP1]] to i24
7744ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP2:%.*]] = call i24 @llvm.sdiv.fix.i24(i24 [[UPSCALE]], i24 [[RESIZE1]], i32 15)
7844ebc2c8SBevin Hansson // CHECK-NEXT: [[DOWNSCALE:%.*]] = ashr i24 [[TMP2]], 8
7944ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE2:%.*]] = trunc i24 [[DOWNSCALE]] to i16
809466b491SNikita Popov // CHECK-NEXT: store i16 [[RESIZE2]], ptr @sa, align 2
8144ebc2c8SBevin Hansson // CHECK-NEXT: ret void
8244ebc2c8SBevin Hansson //
sdiv_sasaf(void)837de71613SAaron Ballman void sdiv_sasaf(void) {
8444ebc2c8SBevin Hansson sa = sa / f;
8544ebc2c8SBevin Hansson }
8644ebc2c8SBevin Hansson
8744ebc2c8SBevin Hansson // CHECK-LABEL: @sdiv_aasf(
8844ebc2c8SBevin Hansson // CHECK-NEXT: entry:
899466b491SNikita Popov // CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @a, align 4
909466b491SNikita Popov // CHECK-NEXT: [[TMP1:%.*]] = load i8, ptr @sf, align 1
9144ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE:%.*]] = sext i8 [[TMP1]] to i32
9244ebc2c8SBevin Hansson // CHECK-NEXT: [[UPSCALE:%.*]] = shl i32 [[RESIZE]], 8
9344ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP2:%.*]] = call i32 @llvm.sdiv.fix.i32(i32 [[TMP0]], i32 [[UPSCALE]], i32 15)
949466b491SNikita Popov // CHECK-NEXT: store i32 [[TMP2]], ptr @a, align 4
9544ebc2c8SBevin Hansson // CHECK-NEXT: ret void
9644ebc2c8SBevin Hansson //
sdiv_aasf(void)977de71613SAaron Ballman void sdiv_aasf(void) {
9844ebc2c8SBevin Hansson a = a / sf;
9944ebc2c8SBevin Hansson }
10044ebc2c8SBevin Hansson
10144ebc2c8SBevin Hansson // CHECK-LABEL: @sdiv_aalf(
10244ebc2c8SBevin Hansson // CHECK-NEXT: entry:
1039466b491SNikita Popov // CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @a, align 4
1049466b491SNikita Popov // CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @lf, align 4
10544ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE:%.*]] = sext i32 [[TMP0]] to i48
10644ebc2c8SBevin Hansson // CHECK-NEXT: [[UPSCALE:%.*]] = shl i48 [[RESIZE]], 16
10744ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE1:%.*]] = sext i32 [[TMP1]] to i48
10844ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP2:%.*]] = call i48 @llvm.sdiv.fix.i48(i48 [[UPSCALE]], i48 [[RESIZE1]], i32 31)
10944ebc2c8SBevin Hansson // CHECK-NEXT: [[DOWNSCALE:%.*]] = ashr i48 [[TMP2]], 16
11044ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE2:%.*]] = trunc i48 [[DOWNSCALE]] to i32
1119466b491SNikita Popov // CHECK-NEXT: store i32 [[RESIZE2]], ptr @a, align 4
11244ebc2c8SBevin Hansson // CHECK-NEXT: ret void
11344ebc2c8SBevin Hansson //
sdiv_aalf(void)1147de71613SAaron Ballman void sdiv_aalf(void) {
11544ebc2c8SBevin Hansson a = a / lf;
11644ebc2c8SBevin Hansson }
11744ebc2c8SBevin Hansson
11844ebc2c8SBevin Hansson // SIGNED-LABEL: @sdiv_sasausa(
11944ebc2c8SBevin Hansson // SIGNED-NEXT: entry:
1209466b491SNikita Popov // SIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @sa, align 2
1219466b491SNikita Popov // SIGNED-NEXT: [[TMP1:%.*]] = load i16, ptr @usa, align 2
12244ebc2c8SBevin Hansson // SIGNED-NEXT: [[RESIZE:%.*]] = sext i16 [[TMP0]] to i17
12344ebc2c8SBevin Hansson // SIGNED-NEXT: [[UPSCALE:%.*]] = shl i17 [[RESIZE]], 1
12444ebc2c8SBevin Hansson // SIGNED-NEXT: [[RESIZE1:%.*]] = zext i16 [[TMP1]] to i17
12544ebc2c8SBevin Hansson // SIGNED-NEXT: [[TMP2:%.*]] = call i17 @llvm.sdiv.fix.i17(i17 [[UPSCALE]], i17 [[RESIZE1]], i32 8)
12644ebc2c8SBevin Hansson // SIGNED-NEXT: [[DOWNSCALE:%.*]] = ashr i17 [[TMP2]], 1
12744ebc2c8SBevin Hansson // SIGNED-NEXT: [[RESIZE2:%.*]] = trunc i17 [[DOWNSCALE]] to i16
1289466b491SNikita Popov // SIGNED-NEXT: store i16 [[RESIZE2]], ptr @sa, align 2
12944ebc2c8SBevin Hansson // SIGNED-NEXT: ret void
13044ebc2c8SBevin Hansson //
13144ebc2c8SBevin Hansson // UNSIGNED-LABEL: @sdiv_sasausa(
13244ebc2c8SBevin Hansson // UNSIGNED-NEXT: entry:
1339466b491SNikita Popov // UNSIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @sa, align 2
1349466b491SNikita Popov // UNSIGNED-NEXT: [[TMP1:%.*]] = load i16, ptr @usa, align 2
13544ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[TMP2:%.*]] = call i16 @llvm.sdiv.fix.i16(i16 [[TMP0]], i16 [[TMP1]], i32 7)
1369466b491SNikita Popov // UNSIGNED-NEXT: store i16 [[TMP2]], ptr @sa, align 2
13744ebc2c8SBevin Hansson // UNSIGNED-NEXT: ret void
13844ebc2c8SBevin Hansson //
sdiv_sasausa(void)1397de71613SAaron Ballman void sdiv_sasausa(void) {
14044ebc2c8SBevin Hansson sa = sa / usa;
14144ebc2c8SBevin Hansson }
14244ebc2c8SBevin Hansson
14344ebc2c8SBevin Hansson // SIGNED-LABEL: @sdiv_asaua(
14444ebc2c8SBevin Hansson // SIGNED-NEXT: entry:
1459466b491SNikita Popov // SIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @sa, align 2
1469466b491SNikita Popov // SIGNED-NEXT: [[TMP1:%.*]] = load i32, ptr @ua, align 4
14744ebc2c8SBevin Hansson // SIGNED-NEXT: [[RESIZE:%.*]] = sext i16 [[TMP0]] to i33
14844ebc2c8SBevin Hansson // SIGNED-NEXT: [[UPSCALE:%.*]] = shl i33 [[RESIZE]], 9
14944ebc2c8SBevin Hansson // SIGNED-NEXT: [[RESIZE1:%.*]] = zext i32 [[TMP1]] to i33
15044ebc2c8SBevin Hansson // SIGNED-NEXT: [[TMP2:%.*]] = call i33 @llvm.sdiv.fix.i33(i33 [[UPSCALE]], i33 [[RESIZE1]], i32 16)
15144ebc2c8SBevin Hansson // SIGNED-NEXT: [[DOWNSCALE:%.*]] = ashr i33 [[TMP2]], 1
15244ebc2c8SBevin Hansson // SIGNED-NEXT: [[RESIZE2:%.*]] = trunc i33 [[DOWNSCALE]] to i32
1539466b491SNikita Popov // SIGNED-NEXT: store i32 [[RESIZE2]], ptr @a, align 4
15444ebc2c8SBevin Hansson // SIGNED-NEXT: ret void
15544ebc2c8SBevin Hansson //
15644ebc2c8SBevin Hansson // UNSIGNED-LABEL: @sdiv_asaua(
15744ebc2c8SBevin Hansson // UNSIGNED-NEXT: entry:
1589466b491SNikita Popov // UNSIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @sa, align 2
1599466b491SNikita Popov // UNSIGNED-NEXT: [[TMP1:%.*]] = load i32, ptr @ua, align 4
16044ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[RESIZE:%.*]] = sext i16 [[TMP0]] to i32
16144ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[UPSCALE:%.*]] = shl i32 [[RESIZE]], 8
16244ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[TMP2:%.*]] = call i32 @llvm.sdiv.fix.i32(i32 [[UPSCALE]], i32 [[TMP1]], i32 15)
1639466b491SNikita Popov // UNSIGNED-NEXT: store i32 [[TMP2]], ptr @a, align 4
16444ebc2c8SBevin Hansson // UNSIGNED-NEXT: ret void
16544ebc2c8SBevin Hansson //
sdiv_asaua(void)1667de71613SAaron Ballman void sdiv_asaua(void) {
16744ebc2c8SBevin Hansson a = sa / ua;
16844ebc2c8SBevin Hansson }
16944ebc2c8SBevin Hansson
17044ebc2c8SBevin Hansson // SIGNED-LABEL: @sdiv_sasausf(
17144ebc2c8SBevin Hansson // SIGNED-NEXT: entry:
1729466b491SNikita Popov // SIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @sa, align 2
1739466b491SNikita Popov // SIGNED-NEXT: [[TMP1:%.*]] = load i8, ptr @usf, align 1
17444ebc2c8SBevin Hansson // SIGNED-NEXT: [[RESIZE:%.*]] = sext i16 [[TMP0]] to i17
17544ebc2c8SBevin Hansson // SIGNED-NEXT: [[UPSCALE:%.*]] = shl i17 [[RESIZE]], 1
17644ebc2c8SBevin Hansson // SIGNED-NEXT: [[RESIZE1:%.*]] = zext i8 [[TMP1]] to i17
17744ebc2c8SBevin Hansson // SIGNED-NEXT: [[TMP2:%.*]] = call i17 @llvm.sdiv.fix.i17(i17 [[UPSCALE]], i17 [[RESIZE1]], i32 8)
17844ebc2c8SBevin Hansson // SIGNED-NEXT: [[DOWNSCALE:%.*]] = ashr i17 [[TMP2]], 1
17944ebc2c8SBevin Hansson // SIGNED-NEXT: [[RESIZE2:%.*]] = trunc i17 [[DOWNSCALE]] to i16
1809466b491SNikita Popov // SIGNED-NEXT: store i16 [[RESIZE2]], ptr @sa, align 2
18144ebc2c8SBevin Hansson // SIGNED-NEXT: ret void
18244ebc2c8SBevin Hansson //
18344ebc2c8SBevin Hansson // UNSIGNED-LABEL: @sdiv_sasausf(
18444ebc2c8SBevin Hansson // UNSIGNED-NEXT: entry:
1859466b491SNikita Popov // UNSIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @sa, align 2
1869466b491SNikita Popov // UNSIGNED-NEXT: [[TMP1:%.*]] = load i8, ptr @usf, align 1
18744ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[RESIZE:%.*]] = zext i8 [[TMP1]] to i16
18844ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[TMP2:%.*]] = call i16 @llvm.sdiv.fix.i16(i16 [[TMP0]], i16 [[RESIZE]], i32 7)
1899466b491SNikita Popov // UNSIGNED-NEXT: store i16 [[TMP2]], ptr @sa, align 2
19044ebc2c8SBevin Hansson // UNSIGNED-NEXT: ret void
19144ebc2c8SBevin Hansson //
sdiv_sasausf(void)1927de71613SAaron Ballman void sdiv_sasausf(void) {
19344ebc2c8SBevin Hansson sa = sa / usf;
19444ebc2c8SBevin Hansson }
19544ebc2c8SBevin Hansson
19644ebc2c8SBevin Hansson // SIGNED-LABEL: @sdiv_sasaulf(
19744ebc2c8SBevin Hansson // SIGNED-NEXT: entry:
1989466b491SNikita Popov // SIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @sa, align 2
1999466b491SNikita Popov // SIGNED-NEXT: [[TMP1:%.*]] = load i32, ptr @ulf, align 4
20044ebc2c8SBevin Hansson // SIGNED-NEXT: [[RESIZE:%.*]] = sext i16 [[TMP0]] to i41
20144ebc2c8SBevin Hansson // SIGNED-NEXT: [[UPSCALE:%.*]] = shl i41 [[RESIZE]], 25
20244ebc2c8SBevin Hansson // SIGNED-NEXT: [[RESIZE1:%.*]] = zext i32 [[TMP1]] to i41
20344ebc2c8SBevin Hansson // SIGNED-NEXT: [[TMP2:%.*]] = call i41 @llvm.sdiv.fix.i41(i41 [[UPSCALE]], i41 [[RESIZE1]], i32 32)
20444ebc2c8SBevin Hansson // SIGNED-NEXT: [[DOWNSCALE:%.*]] = ashr i41 [[TMP2]], 25
20544ebc2c8SBevin Hansson // SIGNED-NEXT: [[RESIZE2:%.*]] = trunc i41 [[DOWNSCALE]] to i16
2069466b491SNikita Popov // SIGNED-NEXT: store i16 [[RESIZE2]], ptr @sa, align 2
20744ebc2c8SBevin Hansson // SIGNED-NEXT: ret void
20844ebc2c8SBevin Hansson //
20944ebc2c8SBevin Hansson // UNSIGNED-LABEL: @sdiv_sasaulf(
21044ebc2c8SBevin Hansson // UNSIGNED-NEXT: entry:
2119466b491SNikita Popov // UNSIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @sa, align 2
2129466b491SNikita Popov // UNSIGNED-NEXT: [[TMP1:%.*]] = load i32, ptr @ulf, align 4
21344ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[RESIZE:%.*]] = sext i16 [[TMP0]] to i40
21444ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[UPSCALE:%.*]] = shl i40 [[RESIZE]], 24
21544ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[RESIZE1:%.*]] = zext i32 [[TMP1]] to i40
21644ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[TMP2:%.*]] = call i40 @llvm.sdiv.fix.i40(i40 [[UPSCALE]], i40 [[RESIZE1]], i32 31)
21744ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[DOWNSCALE:%.*]] = ashr i40 [[TMP2]], 24
21844ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[RESIZE2:%.*]] = trunc i40 [[DOWNSCALE]] to i16
2199466b491SNikita Popov // UNSIGNED-NEXT: store i16 [[RESIZE2]], ptr @sa, align 2
22044ebc2c8SBevin Hansson // UNSIGNED-NEXT: ret void
22144ebc2c8SBevin Hansson //
sdiv_sasaulf(void)2227de71613SAaron Ballman void sdiv_sasaulf(void) {
22344ebc2c8SBevin Hansson sa = sa / ulf;
22444ebc2c8SBevin Hansson }
22544ebc2c8SBevin Hansson
22644ebc2c8SBevin Hansson // CHECK-LABEL: @sdiv_aaaaa(
22744ebc2c8SBevin Hansson // CHECK-NEXT: entry:
2289466b491SNikita Popov // CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @a, align 4
2299466b491SNikita Popov // CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @a2, align 4
23044ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP2:%.*]] = call i32 @llvm.sdiv.fix.i32(i32 [[TMP0]], i32 [[TMP1]], i32 15)
2319466b491SNikita Popov // CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr @a3, align 4
23244ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP4:%.*]] = call i32 @llvm.sdiv.fix.i32(i32 [[TMP2]], i32 [[TMP3]], i32 15)
2339466b491SNikita Popov // CHECK-NEXT: [[TMP5:%.*]] = load i32, ptr @a4, align 4
23444ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP6:%.*]] = call i32 @llvm.sdiv.fix.i32(i32 [[TMP4]], i32 [[TMP5]], i32 15)
2359466b491SNikita Popov // CHECK-NEXT: store i32 [[TMP6]], ptr @a, align 4
23644ebc2c8SBevin Hansson // CHECK-NEXT: ret void
23744ebc2c8SBevin Hansson //
sdiv_aaaaa(void)2387de71613SAaron Ballman void sdiv_aaaaa(void) {
23944ebc2c8SBevin Hansson a = a / a2 / a3 / a4;
24044ebc2c8SBevin Hansson }
24144ebc2c8SBevin Hansson
24244ebc2c8SBevin Hansson
24344ebc2c8SBevin Hansson // SIGNED-LABEL: @udiv_usausausa(
24444ebc2c8SBevin Hansson // SIGNED-NEXT: entry:
2459466b491SNikita Popov // SIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @usa, align 2
2469466b491SNikita Popov // SIGNED-NEXT: [[TMP1:%.*]] = load i16, ptr @usa, align 2
24744ebc2c8SBevin Hansson // SIGNED-NEXT: [[TMP2:%.*]] = call i16 @llvm.udiv.fix.i16(i16 [[TMP0]], i16 [[TMP1]], i32 8)
2489466b491SNikita Popov // SIGNED-NEXT: store i16 [[TMP2]], ptr @usa, align 2
24944ebc2c8SBevin Hansson // SIGNED-NEXT: ret void
25044ebc2c8SBevin Hansson //
25144ebc2c8SBevin Hansson // UNSIGNED-LABEL: @udiv_usausausa(
25244ebc2c8SBevin Hansson // UNSIGNED-NEXT: entry:
2539466b491SNikita Popov // UNSIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @usa, align 2
2549466b491SNikita Popov // UNSIGNED-NEXT: [[TMP1:%.*]] = load i16, ptr @usa, align 2
255808ac546SBevin Hansson // UNSIGNED-NEXT: [[TMP2:%.*]] = call i16 @llvm.sdiv.fix.i16(i16 [[TMP0]], i16 [[TMP1]], i32 7)
2569466b491SNikita Popov // UNSIGNED-NEXT: store i16 [[TMP2]], ptr @usa, align 2
25744ebc2c8SBevin Hansson // UNSIGNED-NEXT: ret void
25844ebc2c8SBevin Hansson //
udiv_usausausa(void)2597de71613SAaron Ballman void udiv_usausausa(void) {
26044ebc2c8SBevin Hansson usa = usa / usa;
26144ebc2c8SBevin Hansson }
26244ebc2c8SBevin Hansson
26344ebc2c8SBevin Hansson // SIGNED-LABEL: @udiv_uausaua(
26444ebc2c8SBevin Hansson // SIGNED-NEXT: entry:
2659466b491SNikita Popov // SIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @usa, align 2
2669466b491SNikita Popov // SIGNED-NEXT: [[TMP1:%.*]] = load i32, ptr @ua, align 4
26744ebc2c8SBevin Hansson // SIGNED-NEXT: [[RESIZE:%.*]] = zext i16 [[TMP0]] to i32
26844ebc2c8SBevin Hansson // SIGNED-NEXT: [[UPSCALE:%.*]] = shl i32 [[RESIZE]], 8
26944ebc2c8SBevin Hansson // SIGNED-NEXT: [[TMP2:%.*]] = call i32 @llvm.udiv.fix.i32(i32 [[UPSCALE]], i32 [[TMP1]], i32 16)
2709466b491SNikita Popov // SIGNED-NEXT: store i32 [[TMP2]], ptr @ua, align 4
27144ebc2c8SBevin Hansson // SIGNED-NEXT: ret void
27244ebc2c8SBevin Hansson //
27344ebc2c8SBevin Hansson // UNSIGNED-LABEL: @udiv_uausaua(
27444ebc2c8SBevin Hansson // UNSIGNED-NEXT: entry:
2759466b491SNikita Popov // UNSIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @usa, align 2
2769466b491SNikita Popov // UNSIGNED-NEXT: [[TMP1:%.*]] = load i32, ptr @ua, align 4
27744ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[RESIZE:%.*]] = zext i16 [[TMP0]] to i32
27844ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[UPSCALE:%.*]] = shl i32 [[RESIZE]], 8
279808ac546SBevin Hansson // UNSIGNED-NEXT: [[TMP2:%.*]] = call i32 @llvm.sdiv.fix.i32(i32 [[UPSCALE]], i32 [[TMP1]], i32 15)
2809466b491SNikita Popov // UNSIGNED-NEXT: store i32 [[TMP2]], ptr @ua, align 4
28144ebc2c8SBevin Hansson // UNSIGNED-NEXT: ret void
28244ebc2c8SBevin Hansson //
udiv_uausaua(void)2837de71613SAaron Ballman void udiv_uausaua(void) {
28444ebc2c8SBevin Hansson ua = usa / ua;
28544ebc2c8SBevin Hansson }
28644ebc2c8SBevin Hansson
28744ebc2c8SBevin Hansson // SIGNED-LABEL: @udiv_usausausf(
28844ebc2c8SBevin Hansson // SIGNED-NEXT: entry:
2899466b491SNikita Popov // SIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @usa, align 2
2909466b491SNikita Popov // SIGNED-NEXT: [[TMP1:%.*]] = load i8, ptr @usf, align 1
29144ebc2c8SBevin Hansson // SIGNED-NEXT: [[RESIZE:%.*]] = zext i8 [[TMP1]] to i16
29244ebc2c8SBevin Hansson // SIGNED-NEXT: [[TMP2:%.*]] = call i16 @llvm.udiv.fix.i16(i16 [[TMP0]], i16 [[RESIZE]], i32 8)
2939466b491SNikita Popov // SIGNED-NEXT: store i16 [[TMP2]], ptr @usa, align 2
29444ebc2c8SBevin Hansson // SIGNED-NEXT: ret void
29544ebc2c8SBevin Hansson //
29644ebc2c8SBevin Hansson // UNSIGNED-LABEL: @udiv_usausausf(
29744ebc2c8SBevin Hansson // UNSIGNED-NEXT: entry:
2989466b491SNikita Popov // UNSIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @usa, align 2
2999466b491SNikita Popov // UNSIGNED-NEXT: [[TMP1:%.*]] = load i8, ptr @usf, align 1
30044ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[RESIZE:%.*]] = zext i8 [[TMP1]] to i16
301808ac546SBevin Hansson // UNSIGNED-NEXT: [[TMP2:%.*]] = call i16 @llvm.sdiv.fix.i16(i16 [[TMP0]], i16 [[RESIZE]], i32 7)
3029466b491SNikita Popov // UNSIGNED-NEXT: store i16 [[TMP2]], ptr @usa, align 2
30344ebc2c8SBevin Hansson // UNSIGNED-NEXT: ret void
30444ebc2c8SBevin Hansson //
udiv_usausausf(void)3057de71613SAaron Ballman void udiv_usausausf(void) {
30644ebc2c8SBevin Hansson usa = usa / usf;
30744ebc2c8SBevin Hansson }
30844ebc2c8SBevin Hansson
30944ebc2c8SBevin Hansson // SIGNED-LABEL: @udiv_usausauf(
31044ebc2c8SBevin Hansson // SIGNED-NEXT: entry:
3119466b491SNikita Popov // SIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @usa, align 2
3129466b491SNikita Popov // SIGNED-NEXT: [[TMP1:%.*]] = load i16, ptr @uf, align 2
31344ebc2c8SBevin Hansson // SIGNED-NEXT: [[RESIZE:%.*]] = zext i16 [[TMP0]] to i24
31444ebc2c8SBevin Hansson // SIGNED-NEXT: [[UPSCALE:%.*]] = shl i24 [[RESIZE]], 8
31544ebc2c8SBevin Hansson // SIGNED-NEXT: [[RESIZE1:%.*]] = zext i16 [[TMP1]] to i24
31644ebc2c8SBevin Hansson // SIGNED-NEXT: [[TMP2:%.*]] = call i24 @llvm.udiv.fix.i24(i24 [[UPSCALE]], i24 [[RESIZE1]], i32 16)
31744ebc2c8SBevin Hansson // SIGNED-NEXT: [[DOWNSCALE:%.*]] = lshr i24 [[TMP2]], 8
31844ebc2c8SBevin Hansson // SIGNED-NEXT: [[RESIZE2:%.*]] = trunc i24 [[DOWNSCALE]] to i16
3199466b491SNikita Popov // SIGNED-NEXT: store i16 [[RESIZE2]], ptr @usa, align 2
32044ebc2c8SBevin Hansson // SIGNED-NEXT: ret void
32144ebc2c8SBevin Hansson //
32244ebc2c8SBevin Hansson // UNSIGNED-LABEL: @udiv_usausauf(
32344ebc2c8SBevin Hansson // UNSIGNED-NEXT: entry:
3249466b491SNikita Popov // UNSIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @usa, align 2
3259466b491SNikita Popov // UNSIGNED-NEXT: [[TMP1:%.*]] = load i16, ptr @uf, align 2
32644ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[RESIZE:%.*]] = zext i16 [[TMP0]] to i24
32744ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[UPSCALE:%.*]] = shl i24 [[RESIZE]], 8
32844ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[RESIZE1:%.*]] = zext i16 [[TMP1]] to i24
329808ac546SBevin Hansson // UNSIGNED-NEXT: [[TMP2:%.*]] = call i24 @llvm.sdiv.fix.i24(i24 [[UPSCALE]], i24 [[RESIZE1]], i32 15)
33044ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[DOWNSCALE:%.*]] = lshr i24 [[TMP2]], 8
33144ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[RESIZE2:%.*]] = trunc i24 [[DOWNSCALE]] to i16
3329466b491SNikita Popov // UNSIGNED-NEXT: store i16 [[RESIZE2]], ptr @usa, align 2
33344ebc2c8SBevin Hansson // UNSIGNED-NEXT: ret void
33444ebc2c8SBevin Hansson //
udiv_usausauf(void)3357de71613SAaron Ballman void udiv_usausauf(void) {
33644ebc2c8SBevin Hansson usa = usa / uf;
33744ebc2c8SBevin Hansson }
33844ebc2c8SBevin Hansson
33944ebc2c8SBevin Hansson
34044ebc2c8SBevin Hansson // CHECK-LABEL: @int_sasai(
34144ebc2c8SBevin Hansson // CHECK-NEXT: entry:
3429466b491SNikita Popov // CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr @sa, align 2
3439466b491SNikita Popov // CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @i, align 4
34444ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE:%.*]] = sext i16 [[TMP0]] to i39
34544ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE1:%.*]] = sext i32 [[TMP1]] to i39
34644ebc2c8SBevin Hansson // CHECK-NEXT: [[UPSCALE:%.*]] = shl i39 [[RESIZE1]], 7
34744ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP2:%.*]] = call i39 @llvm.sdiv.fix.i39(i39 [[RESIZE]], i39 [[UPSCALE]], i32 7)
34844ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE2:%.*]] = trunc i39 [[TMP2]] to i16
3499466b491SNikita Popov // CHECK-NEXT: store i16 [[RESIZE2]], ptr @sa, align 2
35044ebc2c8SBevin Hansson // CHECK-NEXT: ret void
35144ebc2c8SBevin Hansson //
int_sasai(void)3527de71613SAaron Ballman void int_sasai(void) {
35344ebc2c8SBevin Hansson sa = sa / i;
35444ebc2c8SBevin Hansson }
35544ebc2c8SBevin Hansson
35644ebc2c8SBevin Hansson // CHECK-LABEL: @int_sasaui(
35744ebc2c8SBevin Hansson // CHECK-NEXT: entry:
3589466b491SNikita Popov // CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr @sa, align 2
3599466b491SNikita Popov // CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @ui, align 4
36044ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE:%.*]] = sext i16 [[TMP0]] to i40
36144ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE1:%.*]] = zext i32 [[TMP1]] to i40
36244ebc2c8SBevin Hansson // CHECK-NEXT: [[UPSCALE:%.*]] = shl i40 [[RESIZE1]], 7
36344ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP2:%.*]] = call i40 @llvm.sdiv.fix.i40(i40 [[RESIZE]], i40 [[UPSCALE]], i32 7)
36444ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE2:%.*]] = trunc i40 [[TMP2]] to i16
3659466b491SNikita Popov // CHECK-NEXT: store i16 [[RESIZE2]], ptr @sa, align 2
36644ebc2c8SBevin Hansson // CHECK-NEXT: ret void
36744ebc2c8SBevin Hansson //
int_sasaui(void)3687de71613SAaron Ballman void int_sasaui(void) {
36944ebc2c8SBevin Hansson sa = sa / ui;
37044ebc2c8SBevin Hansson }
37144ebc2c8SBevin Hansson
37244ebc2c8SBevin Hansson // SIGNED-LABEL: @int_usausai(
37344ebc2c8SBevin Hansson // SIGNED-NEXT: entry:
3749466b491SNikita Popov // SIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @usa, align 2
3759466b491SNikita Popov // SIGNED-NEXT: [[TMP1:%.*]] = load i32, ptr @i, align 4
37644ebc2c8SBevin Hansson // SIGNED-NEXT: [[RESIZE:%.*]] = zext i16 [[TMP0]] to i40
37744ebc2c8SBevin Hansson // SIGNED-NEXT: [[RESIZE1:%.*]] = sext i32 [[TMP1]] to i40
37844ebc2c8SBevin Hansson // SIGNED-NEXT: [[UPSCALE:%.*]] = shl i40 [[RESIZE1]], 8
37944ebc2c8SBevin Hansson // SIGNED-NEXT: [[TMP2:%.*]] = call i40 @llvm.sdiv.fix.i40(i40 [[RESIZE]], i40 [[UPSCALE]], i32 8)
38044ebc2c8SBevin Hansson // SIGNED-NEXT: [[RESIZE2:%.*]] = trunc i40 [[TMP2]] to i16
3819466b491SNikita Popov // SIGNED-NEXT: store i16 [[RESIZE2]], ptr @usa, align 2
38244ebc2c8SBevin Hansson // SIGNED-NEXT: ret void
38344ebc2c8SBevin Hansson //
38444ebc2c8SBevin Hansson // UNSIGNED-LABEL: @int_usausai(
38544ebc2c8SBevin Hansson // UNSIGNED-NEXT: entry:
3869466b491SNikita Popov // UNSIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @usa, align 2
3879466b491SNikita Popov // UNSIGNED-NEXT: [[TMP1:%.*]] = load i32, ptr @i, align 4
38844ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[RESIZE:%.*]] = zext i16 [[TMP0]] to i39
38944ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[RESIZE1:%.*]] = sext i32 [[TMP1]] to i39
39044ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[UPSCALE:%.*]] = shl i39 [[RESIZE1]], 7
39144ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[TMP2:%.*]] = call i39 @llvm.sdiv.fix.i39(i39 [[RESIZE]], i39 [[UPSCALE]], i32 7)
39244ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[RESIZE2:%.*]] = trunc i39 [[TMP2]] to i16
3939466b491SNikita Popov // UNSIGNED-NEXT: store i16 [[RESIZE2]], ptr @usa, align 2
39444ebc2c8SBevin Hansson // UNSIGNED-NEXT: ret void
39544ebc2c8SBevin Hansson //
int_usausai(void)3967de71613SAaron Ballman void int_usausai(void) {
39744ebc2c8SBevin Hansson usa = usa / i;
39844ebc2c8SBevin Hansson }
39944ebc2c8SBevin Hansson
40044ebc2c8SBevin Hansson // SIGNED-LABEL: @int_usausaui(
40144ebc2c8SBevin Hansson // SIGNED-NEXT: entry:
4029466b491SNikita Popov // SIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @usa, align 2
4039466b491SNikita Popov // SIGNED-NEXT: [[TMP1:%.*]] = load i32, ptr @ui, align 4
40444ebc2c8SBevin Hansson // SIGNED-NEXT: [[RESIZE:%.*]] = zext i16 [[TMP0]] to i40
40544ebc2c8SBevin Hansson // SIGNED-NEXT: [[RESIZE1:%.*]] = zext i32 [[TMP1]] to i40
40644ebc2c8SBevin Hansson // SIGNED-NEXT: [[UPSCALE:%.*]] = shl i40 [[RESIZE1]], 8
40744ebc2c8SBevin Hansson // SIGNED-NEXT: [[TMP2:%.*]] = call i40 @llvm.udiv.fix.i40(i40 [[RESIZE]], i40 [[UPSCALE]], i32 8)
40844ebc2c8SBevin Hansson // SIGNED-NEXT: [[RESIZE2:%.*]] = trunc i40 [[TMP2]] to i16
4099466b491SNikita Popov // SIGNED-NEXT: store i16 [[RESIZE2]], ptr @usa, align 2
41044ebc2c8SBevin Hansson // SIGNED-NEXT: ret void
41144ebc2c8SBevin Hansson //
41244ebc2c8SBevin Hansson // UNSIGNED-LABEL: @int_usausaui(
41344ebc2c8SBevin Hansson // UNSIGNED-NEXT: entry:
4149466b491SNikita Popov // UNSIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @usa, align 2
4159466b491SNikita Popov // UNSIGNED-NEXT: [[TMP1:%.*]] = load i32, ptr @ui, align 4
41644ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[RESIZE:%.*]] = zext i16 [[TMP0]] to i39
41744ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[RESIZE1:%.*]] = zext i32 [[TMP1]] to i39
41844ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[UPSCALE:%.*]] = shl i39 [[RESIZE1]], 7
41944ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[TMP2:%.*]] = call i39 @llvm.udiv.fix.i39(i39 [[RESIZE]], i39 [[UPSCALE]], i32 7)
42044ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[RESIZE2:%.*]] = trunc i39 [[TMP2]] to i16
4219466b491SNikita Popov // UNSIGNED-NEXT: store i16 [[RESIZE2]], ptr @usa, align 2
42244ebc2c8SBevin Hansson // UNSIGNED-NEXT: ret void
42344ebc2c8SBevin Hansson //
int_usausaui(void)4247de71613SAaron Ballman void int_usausaui(void) {
42544ebc2c8SBevin Hansson usa = usa / ui;
42644ebc2c8SBevin Hansson }
42744ebc2c8SBevin Hansson
42844ebc2c8SBevin Hansson // CHECK-LABEL: @int_lflfui(
42944ebc2c8SBevin Hansson // CHECK-NEXT: entry:
4309466b491SNikita Popov // CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @lf, align 4
4319466b491SNikita Popov // CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @ui, align 4
43244ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE:%.*]] = sext i32 [[TMP0]] to i64
43344ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE1:%.*]] = zext i32 [[TMP1]] to i64
43444ebc2c8SBevin Hansson // CHECK-NEXT: [[UPSCALE:%.*]] = shl i64 [[RESIZE1]], 31
43544ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP2:%.*]] = call i64 @llvm.sdiv.fix.i64(i64 [[RESIZE]], i64 [[UPSCALE]], i32 31)
43644ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE2:%.*]] = trunc i64 [[TMP2]] to i32
4379466b491SNikita Popov // CHECK-NEXT: store i32 [[RESIZE2]], ptr @lf, align 4
43844ebc2c8SBevin Hansson // CHECK-NEXT: ret void
43944ebc2c8SBevin Hansson //
int_lflfui(void)4407de71613SAaron Ballman void int_lflfui(void) {
44144ebc2c8SBevin Hansson lf = lf / ui;
44244ebc2c8SBevin Hansson }
44344ebc2c8SBevin Hansson
44444ebc2c8SBevin Hansson // CHECK-LABEL: @int_aab(
44544ebc2c8SBevin Hansson // CHECK-NEXT: entry:
4469466b491SNikita Popov // CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @a, align 4
4479466b491SNikita Popov // CHECK-NEXT: [[TMP1:%.*]] = load i8, ptr @b, align 1
44844ebc2c8SBevin Hansson // CHECK-NEXT: [[TOBOOL:%.*]] = trunc i8 [[TMP1]] to i1
44944ebc2c8SBevin Hansson // CHECK-NEXT: [[CONV:%.*]] = zext i1 [[TOBOOL]] to i32
45044ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE:%.*]] = sext i32 [[TMP0]] to i47
45144ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE1:%.*]] = sext i32 [[CONV]] to i47
45244ebc2c8SBevin Hansson // CHECK-NEXT: [[UPSCALE:%.*]] = shl i47 [[RESIZE1]], 15
45344ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP2:%.*]] = call i47 @llvm.sdiv.fix.i47(i47 [[RESIZE]], i47 [[UPSCALE]], i32 15)
45444ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE2:%.*]] = trunc i47 [[TMP2]] to i32
4559466b491SNikita Popov // CHECK-NEXT: store i32 [[RESIZE2]], ptr @a, align 4
45644ebc2c8SBevin Hansson // CHECK-NEXT: ret void
45744ebc2c8SBevin Hansson //
int_aab(void)4587de71613SAaron Ballman void int_aab(void) {
45944ebc2c8SBevin Hansson a = a / b;
46044ebc2c8SBevin Hansson }
46144ebc2c8SBevin Hansson
46244ebc2c8SBevin Hansson // CHECK-LABEL: @int_aia(
46344ebc2c8SBevin Hansson // CHECK-NEXT: entry:
4649466b491SNikita Popov // CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @i, align 4
4659466b491SNikita Popov // CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @a, align 4
46644ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE:%.*]] = sext i32 [[TMP0]] to i47
46744ebc2c8SBevin Hansson // CHECK-NEXT: [[UPSCALE:%.*]] = shl i47 [[RESIZE]], 15
46844ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE1:%.*]] = sext i32 [[TMP1]] to i47
46944ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP2:%.*]] = call i47 @llvm.sdiv.fix.i47(i47 [[UPSCALE]], i47 [[RESIZE1]], i32 15)
47044ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE2:%.*]] = trunc i47 [[TMP2]] to i32
4719466b491SNikita Popov // CHECK-NEXT: store i32 [[RESIZE2]], ptr @a, align 4
47244ebc2c8SBevin Hansson // CHECK-NEXT: ret void
47344ebc2c8SBevin Hansson //
int_aia(void)4747de71613SAaron Ballman void int_aia(void) {
47544ebc2c8SBevin Hansson a = i / a;
47644ebc2c8SBevin Hansson }
47744ebc2c8SBevin Hansson
47844ebc2c8SBevin Hansson // SIGNED-LABEL: @int_usauiusa(
47944ebc2c8SBevin Hansson // SIGNED-NEXT: entry:
4809466b491SNikita Popov // SIGNED-NEXT: [[TMP0:%.*]] = load i32, ptr @ui, align 4
4819466b491SNikita Popov // SIGNED-NEXT: [[TMP1:%.*]] = load i16, ptr @usa, align 2
48244ebc2c8SBevin Hansson // SIGNED-NEXT: [[RESIZE:%.*]] = zext i32 [[TMP0]] to i40
48344ebc2c8SBevin Hansson // SIGNED-NEXT: [[UPSCALE:%.*]] = shl i40 [[RESIZE]], 8
48444ebc2c8SBevin Hansson // SIGNED-NEXT: [[RESIZE1:%.*]] = zext i16 [[TMP1]] to i40
48544ebc2c8SBevin Hansson // SIGNED-NEXT: [[TMP2:%.*]] = call i40 @llvm.udiv.fix.i40(i40 [[UPSCALE]], i40 [[RESIZE1]], i32 8)
48644ebc2c8SBevin Hansson // SIGNED-NEXT: [[RESIZE2:%.*]] = trunc i40 [[TMP2]] to i16
4879466b491SNikita Popov // SIGNED-NEXT: store i16 [[RESIZE2]], ptr @usa, align 2
48844ebc2c8SBevin Hansson // SIGNED-NEXT: ret void
48944ebc2c8SBevin Hansson //
49044ebc2c8SBevin Hansson // UNSIGNED-LABEL: @int_usauiusa(
49144ebc2c8SBevin Hansson // UNSIGNED-NEXT: entry:
4929466b491SNikita Popov // UNSIGNED-NEXT: [[TMP0:%.*]] = load i32, ptr @ui, align 4
4939466b491SNikita Popov // UNSIGNED-NEXT: [[TMP1:%.*]] = load i16, ptr @usa, align 2
49444ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[RESIZE:%.*]] = zext i32 [[TMP0]] to i39
49544ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[UPSCALE:%.*]] = shl i39 [[RESIZE]], 7
49644ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[RESIZE1:%.*]] = zext i16 [[TMP1]] to i39
49744ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[TMP2:%.*]] = call i39 @llvm.udiv.fix.i39(i39 [[UPSCALE]], i39 [[RESIZE1]], i32 7)
49844ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[RESIZE2:%.*]] = trunc i39 [[TMP2]] to i16
4999466b491SNikita Popov // UNSIGNED-NEXT: store i16 [[RESIZE2]], ptr @usa, align 2
50044ebc2c8SBevin Hansson // UNSIGNED-NEXT: ret void
50144ebc2c8SBevin Hansson //
int_usauiusa(void)5027de71613SAaron Ballman void int_usauiusa(void) {
50344ebc2c8SBevin Hansson usa = ui / usa;
50444ebc2c8SBevin Hansson }
50544ebc2c8SBevin Hansson
50644ebc2c8SBevin Hansson // CHECK-LABEL: @int_sauisa(
50744ebc2c8SBevin Hansson // CHECK-NEXT: entry:
5089466b491SNikita Popov // CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @ui, align 4
5099466b491SNikita Popov // CHECK-NEXT: [[TMP1:%.*]] = load i16, ptr @sa, align 2
51044ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE:%.*]] = zext i32 [[TMP0]] to i40
51144ebc2c8SBevin Hansson // CHECK-NEXT: [[UPSCALE:%.*]] = shl i40 [[RESIZE]], 7
51244ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE1:%.*]] = sext i16 [[TMP1]] to i40
51344ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP2:%.*]] = call i40 @llvm.sdiv.fix.i40(i40 [[UPSCALE]], i40 [[RESIZE1]], i32 7)
51444ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE2:%.*]] = trunc i40 [[TMP2]] to i16
5159466b491SNikita Popov // CHECK-NEXT: store i16 [[RESIZE2]], ptr @sa, align 2
51644ebc2c8SBevin Hansson // CHECK-NEXT: ret void
51744ebc2c8SBevin Hansson //
int_sauisa(void)5187de71613SAaron Ballman void int_sauisa(void) {
51944ebc2c8SBevin Hansson sa = ui / sa;
52044ebc2c8SBevin Hansson }
52144ebc2c8SBevin Hansson
52244ebc2c8SBevin Hansson
52344ebc2c8SBevin Hansson // CHECK-LABEL: @sat_sassasas(
52444ebc2c8SBevin Hansson // CHECK-NEXT: entry:
5259466b491SNikita Popov // CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr @sa, align 2
5269466b491SNikita Popov // CHECK-NEXT: [[TMP1:%.*]] = load i16, ptr @sa_sat, align 2
52744ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP2:%.*]] = call i16 @llvm.sdiv.fix.sat.i16(i16 [[TMP0]], i16 [[TMP1]], i32 7)
5289466b491SNikita Popov // CHECK-NEXT: store i16 [[TMP2]], ptr @sa_sat, align 2
52944ebc2c8SBevin Hansson // CHECK-NEXT: ret void
53044ebc2c8SBevin Hansson //
sat_sassasas(void)5317de71613SAaron Ballman void sat_sassasas(void) {
5320b9922e6SBevin Hansson sa_sat = sa / sa_sat;
53344ebc2c8SBevin Hansson }
5340b9922e6SBevin Hansson
53544ebc2c8SBevin Hansson // SIGNED-LABEL: @sat_usasusausas(
53644ebc2c8SBevin Hansson // SIGNED-NEXT: entry:
5379466b491SNikita Popov // SIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @usa, align 2
5389466b491SNikita Popov // SIGNED-NEXT: [[TMP1:%.*]] = load i16, ptr @usa_sat, align 2
53944ebc2c8SBevin Hansson // SIGNED-NEXT: [[TMP2:%.*]] = call i16 @llvm.udiv.fix.sat.i16(i16 [[TMP0]], i16 [[TMP1]], i32 8)
5409466b491SNikita Popov // SIGNED-NEXT: store i16 [[TMP2]], ptr @usa_sat, align 2
54144ebc2c8SBevin Hansson // SIGNED-NEXT: ret void
54244ebc2c8SBevin Hansson //
54344ebc2c8SBevin Hansson // UNSIGNED-LABEL: @sat_usasusausas(
54444ebc2c8SBevin Hansson // UNSIGNED-NEXT: entry:
5459466b491SNikita Popov // UNSIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @usa, align 2
5469466b491SNikita Popov // UNSIGNED-NEXT: [[TMP1:%.*]] = load i16, ptr @usa_sat, align 2
547808ac546SBevin Hansson // UNSIGNED-NEXT: [[TMP2:%.*]] = call i16 @llvm.sdiv.fix.sat.i16(i16 [[TMP0]], i16 [[TMP1]], i32 7)
548808ac546SBevin Hansson // UNSIGNED-NEXT: [[RESIZE:%.*]] = trunc i16 [[TMP2]] to i15
549808ac546SBevin Hansson // UNSIGNED-NEXT: [[RESIZE1:%.*]] = zext i15 [[RESIZE]] to i16
5509466b491SNikita Popov // UNSIGNED-NEXT: store i16 [[RESIZE1]], ptr @usa_sat, align 2
55144ebc2c8SBevin Hansson // UNSIGNED-NEXT: ret void
55244ebc2c8SBevin Hansson //
sat_usasusausas(void)5537de71613SAaron Ballman void sat_usasusausas(void) {
5540b9922e6SBevin Hansson usa_sat = usa / usa_sat;
55544ebc2c8SBevin Hansson }
5560b9922e6SBevin Hansson
55744ebc2c8SBevin Hansson // SIGNED-LABEL: @sat_uasuausas(
55844ebc2c8SBevin Hansson // SIGNED-NEXT: entry:
5599466b491SNikita Popov // SIGNED-NEXT: [[TMP0:%.*]] = load i32, ptr @ua, align 4
5609466b491SNikita Popov // SIGNED-NEXT: [[TMP1:%.*]] = load i16, ptr @usa_sat, align 2
56144ebc2c8SBevin Hansson // SIGNED-NEXT: [[RESIZE:%.*]] = zext i16 [[TMP1]] to i32
56244ebc2c8SBevin Hansson // SIGNED-NEXT: [[UPSCALE:%.*]] = shl i32 [[RESIZE]], 8
56344ebc2c8SBevin Hansson // SIGNED-NEXT: [[TMP2:%.*]] = call i32 @llvm.udiv.fix.sat.i32(i32 [[TMP0]], i32 [[UPSCALE]], i32 16)
5649466b491SNikita Popov // SIGNED-NEXT: store i32 [[TMP2]], ptr @ua_sat, align 4
56544ebc2c8SBevin Hansson // SIGNED-NEXT: ret void
56644ebc2c8SBevin Hansson //
56744ebc2c8SBevin Hansson // UNSIGNED-LABEL: @sat_uasuausas(
56844ebc2c8SBevin Hansson // UNSIGNED-NEXT: entry:
5699466b491SNikita Popov // UNSIGNED-NEXT: [[TMP0:%.*]] = load i32, ptr @ua, align 4
5709466b491SNikita Popov // UNSIGNED-NEXT: [[TMP1:%.*]] = load i16, ptr @usa_sat, align 2
571808ac546SBevin Hansson // UNSIGNED-NEXT: [[RESIZE:%.*]] = zext i16 [[TMP1]] to i32
572808ac546SBevin Hansson // UNSIGNED-NEXT: [[UPSCALE:%.*]] = shl i32 [[RESIZE]], 8
573808ac546SBevin Hansson // UNSIGNED-NEXT: [[TMP2:%.*]] = call i32 @llvm.sdiv.fix.sat.i32(i32 [[TMP0]], i32 [[UPSCALE]], i32 15)
574808ac546SBevin Hansson // UNSIGNED-NEXT: [[RESIZE1:%.*]] = trunc i32 [[TMP2]] to i31
575808ac546SBevin Hansson // UNSIGNED-NEXT: [[RESIZE2:%.*]] = zext i31 [[RESIZE1]] to i32
5769466b491SNikita Popov // UNSIGNED-NEXT: store i32 [[RESIZE2]], ptr @ua_sat, align 4
57744ebc2c8SBevin Hansson // UNSIGNED-NEXT: ret void
57844ebc2c8SBevin Hansson //
sat_uasuausas(void)5797de71613SAaron Ballman void sat_uasuausas(void) {
5800b9922e6SBevin Hansson ua_sat = ua / usa_sat;
58144ebc2c8SBevin Hansson }
5820b9922e6SBevin Hansson
58344ebc2c8SBevin Hansson // CHECK-LABEL: @sat_sassasi(
58444ebc2c8SBevin Hansson // CHECK-NEXT: entry:
5859466b491SNikita Popov // CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr @sa_sat, align 2
5869466b491SNikita Popov // CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @i, align 4
58744ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE:%.*]] = sext i16 [[TMP0]] to i39
58844ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE1:%.*]] = sext i32 [[TMP1]] to i39
58944ebc2c8SBevin Hansson // CHECK-NEXT: [[UPSCALE:%.*]] = shl i39 [[RESIZE1]], 7
59044ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP2:%.*]] = call i39 @llvm.sdiv.fix.sat.i39(i39 [[RESIZE]], i39 [[UPSCALE]], i32 7)
59144ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP3:%.*]] = icmp sgt i39 [[TMP2]], 32767
59244ebc2c8SBevin Hansson // CHECK-NEXT: [[SATMAX:%.*]] = select i1 [[TMP3]], i39 32767, i39 [[TMP2]]
59344ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP4:%.*]] = icmp slt i39 [[SATMAX]], -32768
59444ebc2c8SBevin Hansson // CHECK-NEXT: [[SATMIN:%.*]] = select i1 [[TMP4]], i39 -32768, i39 [[SATMAX]]
59544ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE2:%.*]] = trunc i39 [[SATMIN]] to i16
5969466b491SNikita Popov // CHECK-NEXT: store i16 [[RESIZE2]], ptr @sa_sat, align 2
59744ebc2c8SBevin Hansson // CHECK-NEXT: ret void
59844ebc2c8SBevin Hansson //
sat_sassasi(void)5997de71613SAaron Ballman void sat_sassasi(void) {
6000b9922e6SBevin Hansson sa_sat = sa_sat / i;
60144ebc2c8SBevin Hansson }
6020b9922e6SBevin Hansson
60344ebc2c8SBevin Hansson // CHECK-LABEL: @sat_sassasui(
60444ebc2c8SBevin Hansson // CHECK-NEXT: entry:
6059466b491SNikita Popov // CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr @sa_sat, align 2
6069466b491SNikita Popov // CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @ui, align 4
60744ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE:%.*]] = sext i16 [[TMP0]] to i40
60844ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE1:%.*]] = zext i32 [[TMP1]] to i40
60944ebc2c8SBevin Hansson // CHECK-NEXT: [[UPSCALE:%.*]] = shl i40 [[RESIZE1]], 7
61044ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP2:%.*]] = call i40 @llvm.sdiv.fix.sat.i40(i40 [[RESIZE]], i40 [[UPSCALE]], i32 7)
61144ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP3:%.*]] = icmp sgt i40 [[TMP2]], 32767
61244ebc2c8SBevin Hansson // CHECK-NEXT: [[SATMAX:%.*]] = select i1 [[TMP3]], i40 32767, i40 [[TMP2]]
61344ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP4:%.*]] = icmp slt i40 [[SATMAX]], -32768
61444ebc2c8SBevin Hansson // CHECK-NEXT: [[SATMIN:%.*]] = select i1 [[TMP4]], i40 -32768, i40 [[SATMAX]]
61544ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE2:%.*]] = trunc i40 [[SATMIN]] to i16
6169466b491SNikita Popov // CHECK-NEXT: store i16 [[RESIZE2]], ptr @sa_sat, align 2
61744ebc2c8SBevin Hansson // CHECK-NEXT: ret void
61844ebc2c8SBevin Hansson //
sat_sassasui(void)6197de71613SAaron Ballman void sat_sassasui(void) {
6200b9922e6SBevin Hansson sa_sat = sa_sat / ui;
62144ebc2c8SBevin Hansson }
6220b9922e6SBevin Hansson
62344ebc2c8SBevin Hansson // SIGNED-LABEL: @sat_ufsufsufs(
62444ebc2c8SBevin Hansson // SIGNED-NEXT: entry:
6259466b491SNikita Popov // SIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @uf_sat, align 2
6269466b491SNikita Popov // SIGNED-NEXT: [[TMP1:%.*]] = load i16, ptr @uf_sat, align 2
62744ebc2c8SBevin Hansson // SIGNED-NEXT: [[TMP2:%.*]] = call i16 @llvm.udiv.fix.sat.i16(i16 [[TMP0]], i16 [[TMP1]], i32 16)
6289466b491SNikita Popov // SIGNED-NEXT: store i16 [[TMP2]], ptr @uf_sat, align 2
62944ebc2c8SBevin Hansson // SIGNED-NEXT: ret void
63044ebc2c8SBevin Hansson //
63144ebc2c8SBevin Hansson // UNSIGNED-LABEL: @sat_ufsufsufs(
63244ebc2c8SBevin Hansson // UNSIGNED-NEXT: entry:
6339466b491SNikita Popov // UNSIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @uf_sat, align 2
6349466b491SNikita Popov // UNSIGNED-NEXT: [[TMP1:%.*]] = load i16, ptr @uf_sat, align 2
635808ac546SBevin Hansson // UNSIGNED-NEXT: [[TMP2:%.*]] = call i16 @llvm.sdiv.fix.sat.i16(i16 [[TMP0]], i16 [[TMP1]], i32 15)
636808ac546SBevin Hansson // UNSIGNED-NEXT: [[RESIZE:%.*]] = trunc i16 [[TMP2]] to i15
637808ac546SBevin Hansson // UNSIGNED-NEXT: [[RESIZE1:%.*]] = zext i15 [[RESIZE]] to i16
6389466b491SNikita Popov // UNSIGNED-NEXT: store i16 [[RESIZE1]], ptr @uf_sat, align 2
63944ebc2c8SBevin Hansson // UNSIGNED-NEXT: ret void
64044ebc2c8SBevin Hansson //
sat_ufsufsufs(void)6417de71613SAaron Ballman void sat_ufsufsufs(void) {
6420b9922e6SBevin Hansson uf_sat = uf_sat / uf_sat;
64344ebc2c8SBevin Hansson }
6440b9922e6SBevin Hansson
64544ebc2c8SBevin Hansson // SIGNED-LABEL: @sat_usasusasi(
64644ebc2c8SBevin Hansson // SIGNED-NEXT: entry:
6479466b491SNikita Popov // SIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @usa_sat, align 2
6489466b491SNikita Popov // SIGNED-NEXT: [[TMP1:%.*]] = load i32, ptr @i, align 4
64944ebc2c8SBevin Hansson // SIGNED-NEXT: [[RESIZE:%.*]] = zext i16 [[TMP0]] to i40
65044ebc2c8SBevin Hansson // SIGNED-NEXT: [[RESIZE1:%.*]] = sext i32 [[TMP1]] to i40
65144ebc2c8SBevin Hansson // SIGNED-NEXT: [[UPSCALE:%.*]] = shl i40 [[RESIZE1]], 8
65244ebc2c8SBevin Hansson // SIGNED-NEXT: [[TMP2:%.*]] = call i40 @llvm.sdiv.fix.sat.i40(i40 [[RESIZE]], i40 [[UPSCALE]], i32 8)
65344ebc2c8SBevin Hansson // SIGNED-NEXT: [[TMP3:%.*]] = icmp sgt i40 [[TMP2]], 65535
65444ebc2c8SBevin Hansson // SIGNED-NEXT: [[SATMAX:%.*]] = select i1 [[TMP3]], i40 65535, i40 [[TMP2]]
65544ebc2c8SBevin Hansson // SIGNED-NEXT: [[TMP4:%.*]] = icmp slt i40 [[SATMAX]], 0
65644ebc2c8SBevin Hansson // SIGNED-NEXT: [[SATMIN:%.*]] = select i1 [[TMP4]], i40 0, i40 [[SATMAX]]
65744ebc2c8SBevin Hansson // SIGNED-NEXT: [[RESIZE2:%.*]] = trunc i40 [[SATMIN]] to i16
6589466b491SNikita Popov // SIGNED-NEXT: store i16 [[RESIZE2]], ptr @usa_sat, align 2
65944ebc2c8SBevin Hansson // SIGNED-NEXT: ret void
66044ebc2c8SBevin Hansson //
66144ebc2c8SBevin Hansson // UNSIGNED-LABEL: @sat_usasusasi(
66244ebc2c8SBevin Hansson // UNSIGNED-NEXT: entry:
6639466b491SNikita Popov // UNSIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @usa_sat, align 2
6649466b491SNikita Popov // UNSIGNED-NEXT: [[TMP1:%.*]] = load i32, ptr @i, align 4
66544ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[RESIZE:%.*]] = zext i16 [[TMP0]] to i39
66644ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[RESIZE1:%.*]] = sext i32 [[TMP1]] to i39
66744ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[UPSCALE:%.*]] = shl i39 [[RESIZE1]], 7
66844ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[TMP2:%.*]] = call i39 @llvm.sdiv.fix.sat.i39(i39 [[RESIZE]], i39 [[UPSCALE]], i32 7)
66944ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[TMP3:%.*]] = icmp sgt i39 [[TMP2]], 32767
67044ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[SATMAX:%.*]] = select i1 [[TMP3]], i39 32767, i39 [[TMP2]]
67144ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[TMP4:%.*]] = icmp slt i39 [[SATMAX]], 0
67244ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[SATMIN:%.*]] = select i1 [[TMP4]], i39 0, i39 [[SATMAX]]
67344ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[RESIZE2:%.*]] = trunc i39 [[SATMIN]] to i16
6749466b491SNikita Popov // UNSIGNED-NEXT: store i16 [[RESIZE2]], ptr @usa_sat, align 2
67544ebc2c8SBevin Hansson // UNSIGNED-NEXT: ret void
67644ebc2c8SBevin Hansson //
sat_usasusasi(void)6777de71613SAaron Ballman void sat_usasusasi(void) {
6780b9922e6SBevin Hansson usa_sat = usa_sat / i;
6790b9922e6SBevin Hansson }
680