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
4313461f6SBevin Hansson
5313461f6SBevin Hansson short _Fract shf;
6313461f6SBevin Hansson _Accum a;
7313461f6SBevin Hansson unsigned _Fract uf;
8313461f6SBevin Hansson unsigned long _Accum ula;
9313461f6SBevin Hansson
10313461f6SBevin Hansson _Sat short _Fract sshf;
11313461f6SBevin Hansson _Sat _Accum sa;
12313461f6SBevin Hansson _Sat unsigned _Fract suf;
13313461f6SBevin Hansson _Sat unsigned long _Accum sula;
14313461f6SBevin Hansson
15313461f6SBevin Hansson int i;
16313461f6SBevin Hansson unsigned int u;
17313461f6SBevin Hansson signed char c;
18313461f6SBevin Hansson
19c4944a6fSBevin Hansson float fl;
20c4944a6fSBevin Hansson
21313461f6SBevin Hansson
2244ebc2c8SBevin Hansson // CHECK-LABEL: @add_shfa(
2344ebc2c8SBevin Hansson // CHECK-NEXT: entry:
249466b491SNikita Popov // CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @a, align 4
259466b491SNikita Popov // CHECK-NEXT: [[TMP1:%.*]] = load i8, ptr @shf, align 1
26313461f6SBevin Hansson // CHECK-NEXT: [[RESIZE:%.*]] = sext i8 [[TMP1]] to i32
27313461f6SBevin Hansson // CHECK-NEXT: [[UPSCALE:%.*]] = shl i32 [[RESIZE]], 8
28313461f6SBevin Hansson // CHECK-NEXT: [[TMP2:%.*]] = add i32 [[UPSCALE]], [[TMP0]]
29313461f6SBevin Hansson // CHECK-NEXT: [[DOWNSCALE:%.*]] = ashr i32 [[TMP2]], 8
30313461f6SBevin Hansson // CHECK-NEXT: [[RESIZE1:%.*]] = trunc i32 [[DOWNSCALE]] to i8
319466b491SNikita Popov // CHECK-NEXT: store i8 [[RESIZE1]], ptr @shf, align 1
3244ebc2c8SBevin Hansson // CHECK-NEXT: ret void
3344ebc2c8SBevin Hansson //
add_shfa(void)347de71613SAaron Ballman void add_shfa(void) {
35313461f6SBevin Hansson shf += a;
3644ebc2c8SBevin Hansson }
37313461f6SBevin Hansson
3844ebc2c8SBevin Hansson // SIGNED-LABEL: @add_auf(
3944ebc2c8SBevin Hansson // SIGNED-NEXT: entry:
409466b491SNikita Popov // SIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @uf, align 2
419466b491SNikita Popov // SIGNED-NEXT: [[TMP1:%.*]] = load i32, ptr @a, align 4
4244ebc2c8SBevin Hansson // SIGNED-NEXT: [[RESIZE:%.*]] = sext i32 [[TMP1]] to i33
4344ebc2c8SBevin Hansson // SIGNED-NEXT: [[UPSCALE:%.*]] = shl i33 [[RESIZE]], 1
4444ebc2c8SBevin Hansson // SIGNED-NEXT: [[RESIZE1:%.*]] = zext i16 [[TMP0]] to i33
4544ebc2c8SBevin Hansson // SIGNED-NEXT: [[TMP2:%.*]] = add i33 [[UPSCALE]], [[RESIZE1]]
4644ebc2c8SBevin Hansson // SIGNED-NEXT: [[DOWNSCALE:%.*]] = ashr i33 [[TMP2]], 1
4744ebc2c8SBevin Hansson // SIGNED-NEXT: [[RESIZE2:%.*]] = trunc i33 [[DOWNSCALE]] to i32
489466b491SNikita Popov // SIGNED-NEXT: store i32 [[RESIZE2]], ptr @a, align 4
4944ebc2c8SBevin Hansson // SIGNED-NEXT: ret void
5044ebc2c8SBevin Hansson //
5144ebc2c8SBevin Hansson // UNSIGNED-LABEL: @add_auf(
5244ebc2c8SBevin Hansson // UNSIGNED-NEXT: entry:
539466b491SNikita Popov // UNSIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @uf, align 2
549466b491SNikita Popov // UNSIGNED-NEXT: [[TMP1:%.*]] = load i32, ptr @a, align 4
5544ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[RESIZE:%.*]] = zext i16 [[TMP0]] to i32
5644ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[TMP2:%.*]] = add i32 [[TMP1]], [[RESIZE]]
579466b491SNikita Popov // UNSIGNED-NEXT: store i32 [[TMP2]], ptr @a, align 4
5844ebc2c8SBevin Hansson // UNSIGNED-NEXT: ret void
5944ebc2c8SBevin Hansson //
add_auf(void)607de71613SAaron Ballman void add_auf(void) {
61313461f6SBevin Hansson a += uf;
6244ebc2c8SBevin Hansson }
63313461f6SBevin Hansson
6444ebc2c8SBevin Hansson // CHECK-LABEL: @add_ufula(
6544ebc2c8SBevin Hansson // CHECK-NEXT: entry:
669466b491SNikita Popov // CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr @ula, align 8
679466b491SNikita Popov // CHECK-NEXT: [[TMP1:%.*]] = load i16, ptr @uf, align 2
6844ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE:%.*]] = zext i16 [[TMP1]] to i64
6944ebc2c8SBevin Hansson // CHECK-NEXT: [[UPSCALE:%.*]] = shl i64 [[RESIZE]], 16
7044ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP2:%.*]] = add i64 [[UPSCALE]], [[TMP0]]
7144ebc2c8SBevin Hansson // CHECK-NEXT: [[DOWNSCALE:%.*]] = lshr i64 [[TMP2]], 16
7244ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE1:%.*]] = trunc i64 [[DOWNSCALE]] to i16
739466b491SNikita Popov // CHECK-NEXT: store i16 [[RESIZE1]], ptr @uf, align 2
7444ebc2c8SBevin Hansson // CHECK-NEXT: ret void
7544ebc2c8SBevin Hansson //
add_ufula(void)767de71613SAaron Ballman void add_ufula(void) {
77313461f6SBevin Hansson uf += ula;
7844ebc2c8SBevin Hansson }
79313461f6SBevin Hansson
8044ebc2c8SBevin Hansson // SIGNED-LABEL: @add_ulashf(
8144ebc2c8SBevin Hansson // SIGNED-NEXT: entry:
829466b491SNikita Popov // SIGNED-NEXT: [[TMP0:%.*]] = load i8, ptr @shf, align 1
839466b491SNikita Popov // SIGNED-NEXT: [[TMP1:%.*]] = load i64, ptr @ula, align 8
8444ebc2c8SBevin Hansson // SIGNED-NEXT: [[RESIZE:%.*]] = zext i64 [[TMP1]] to i65
8544ebc2c8SBevin Hansson // SIGNED-NEXT: [[RESIZE1:%.*]] = sext i8 [[TMP0]] to i65
8644ebc2c8SBevin Hansson // SIGNED-NEXT: [[UPSCALE:%.*]] = shl i65 [[RESIZE1]], 25
8744ebc2c8SBevin Hansson // SIGNED-NEXT: [[TMP2:%.*]] = add i65 [[RESIZE]], [[UPSCALE]]
8844ebc2c8SBevin Hansson // SIGNED-NEXT: [[DOWNSCALE:%.*]] = ashr i65 [[TMP2]], 1
8944ebc2c8SBevin Hansson // SIGNED-NEXT: [[RESIZE2:%.*]] = trunc i65 [[DOWNSCALE]] to i64
9044ebc2c8SBevin Hansson // SIGNED-NEXT: [[UPSCALE3:%.*]] = shl i64 [[RESIZE2]], 1
919466b491SNikita Popov // SIGNED-NEXT: store i64 [[UPSCALE3]], ptr @ula, align 8
9244ebc2c8SBevin Hansson // SIGNED-NEXT: ret void
9344ebc2c8SBevin Hansson //
9444ebc2c8SBevin Hansson // UNSIGNED-LABEL: @add_ulashf(
9544ebc2c8SBevin Hansson // UNSIGNED-NEXT: entry:
969466b491SNikita Popov // UNSIGNED-NEXT: [[TMP0:%.*]] = load i8, ptr @shf, align 1
979466b491SNikita Popov // UNSIGNED-NEXT: [[TMP1:%.*]] = load i64, ptr @ula, align 8
9844ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[RESIZE:%.*]] = sext i8 [[TMP0]] to i64
9944ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[UPSCALE:%.*]] = shl i64 [[RESIZE]], 24
10044ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[TMP2:%.*]] = add i64 [[TMP1]], [[UPSCALE]]
1019466b491SNikita Popov // UNSIGNED-NEXT: store i64 [[TMP2]], ptr @ula, align 8
10244ebc2c8SBevin Hansson // UNSIGNED-NEXT: ret void
10344ebc2c8SBevin Hansson //
add_ulashf(void)1047de71613SAaron Ballman void add_ulashf(void) {
105313461f6SBevin Hansson ula += shf;
10644ebc2c8SBevin Hansson }
107313461f6SBevin Hansson
10844ebc2c8SBevin Hansson // SIGNED-LABEL: @add_ufshf(
10944ebc2c8SBevin Hansson // SIGNED-NEXT: entry:
1109466b491SNikita Popov // SIGNED-NEXT: [[TMP0:%.*]] = load i8, ptr @shf, align 1
1119466b491SNikita Popov // SIGNED-NEXT: [[TMP1:%.*]] = load i16, ptr @uf, align 2
11244ebc2c8SBevin Hansson // SIGNED-NEXT: [[RESIZE:%.*]] = zext i16 [[TMP1]] to i17
11344ebc2c8SBevin Hansson // SIGNED-NEXT: [[RESIZE1:%.*]] = sext i8 [[TMP0]] to i17
11444ebc2c8SBevin Hansson // SIGNED-NEXT: [[UPSCALE:%.*]] = shl i17 [[RESIZE1]], 9
11544ebc2c8SBevin Hansson // SIGNED-NEXT: [[TMP2:%.*]] = add i17 [[RESIZE]], [[UPSCALE]]
11644ebc2c8SBevin Hansson // SIGNED-NEXT: [[DOWNSCALE:%.*]] = ashr i17 [[TMP2]], 1
11744ebc2c8SBevin Hansson // SIGNED-NEXT: [[RESIZE2:%.*]] = trunc i17 [[DOWNSCALE]] to i16
11844ebc2c8SBevin Hansson // SIGNED-NEXT: [[UPSCALE3:%.*]] = shl i16 [[RESIZE2]], 1
1199466b491SNikita Popov // SIGNED-NEXT: store i16 [[UPSCALE3]], ptr @uf, align 2
12044ebc2c8SBevin Hansson // SIGNED-NEXT: ret void
12144ebc2c8SBevin Hansson //
12244ebc2c8SBevin Hansson // UNSIGNED-LABEL: @add_ufshf(
12344ebc2c8SBevin Hansson // UNSIGNED-NEXT: entry:
1249466b491SNikita Popov // UNSIGNED-NEXT: [[TMP0:%.*]] = load i8, ptr @shf, align 1
1259466b491SNikita Popov // UNSIGNED-NEXT: [[TMP1:%.*]] = load i16, ptr @uf, align 2
12644ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[RESIZE:%.*]] = sext i8 [[TMP0]] to i16
12744ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[UPSCALE:%.*]] = shl i16 [[RESIZE]], 8
12844ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[TMP2:%.*]] = add i16 [[TMP1]], [[UPSCALE]]
1299466b491SNikita Popov // UNSIGNED-NEXT: store i16 [[TMP2]], ptr @uf, align 2
13044ebc2c8SBevin Hansson // UNSIGNED-NEXT: ret void
13144ebc2c8SBevin Hansson //
add_ufshf(void)1327de71613SAaron Ballman void add_ufshf(void) {
133313461f6SBevin Hansson uf += shf;
13444ebc2c8SBevin Hansson }
135313461f6SBevin Hansson
13644ebc2c8SBevin Hansson // CHECK-LABEL: @add_ashf(
13744ebc2c8SBevin Hansson // CHECK-NEXT: entry:
1389466b491SNikita Popov // CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr @shf, align 1
1399466b491SNikita Popov // CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @a, align 4
14044ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE:%.*]] = sext i8 [[TMP0]] to i32
14144ebc2c8SBevin Hansson // CHECK-NEXT: [[UPSCALE:%.*]] = shl i32 [[RESIZE]], 8
14244ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP2:%.*]] = add i32 [[TMP1]], [[UPSCALE]]
1439466b491SNikita Popov // CHECK-NEXT: store i32 [[TMP2]], ptr @a, align 4
14444ebc2c8SBevin Hansson // CHECK-NEXT: ret void
14544ebc2c8SBevin Hansson //
add_ashf(void)1467de71613SAaron Ballman void add_ashf(void) {
147313461f6SBevin Hansson a += shf;
14844ebc2c8SBevin Hansson }
149313461f6SBevin Hansson
15044ebc2c8SBevin Hansson // CHECK-LABEL: @add_ai(
15144ebc2c8SBevin Hansson // CHECK-NEXT: entry:
1529466b491SNikita Popov // CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @i, align 4
1539466b491SNikita Popov // CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @a, align 4
15444ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE:%.*]] = sext i32 [[TMP1]] to i47
15544ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE1:%.*]] = sext i32 [[TMP0]] to i47
15644ebc2c8SBevin Hansson // CHECK-NEXT: [[UPSCALE:%.*]] = shl i47 [[RESIZE1]], 15
15744ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP2:%.*]] = add i47 [[RESIZE]], [[UPSCALE]]
15844ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE2:%.*]] = trunc i47 [[TMP2]] to i32
1599466b491SNikita Popov // CHECK-NEXT: store i32 [[RESIZE2]], ptr @a, align 4
16044ebc2c8SBevin Hansson // CHECK-NEXT: ret void
16144ebc2c8SBevin Hansson //
add_ai(void)1627de71613SAaron Ballman void add_ai(void) {
163313461f6SBevin Hansson a += i;
16444ebc2c8SBevin Hansson }
165313461f6SBevin Hansson
16644ebc2c8SBevin Hansson // CHECK-LABEL: @add_au(
16744ebc2c8SBevin Hansson // CHECK-NEXT: entry:
1689466b491SNikita Popov // CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @u, align 4
1699466b491SNikita Popov // CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @a, align 4
17044ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE:%.*]] = sext i32 [[TMP1]] to i48
17144ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE1:%.*]] = zext i32 [[TMP0]] to i48
17244ebc2c8SBevin Hansson // CHECK-NEXT: [[UPSCALE:%.*]] = shl i48 [[RESIZE1]], 15
17344ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP2:%.*]] = add i48 [[RESIZE]], [[UPSCALE]]
17444ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE2:%.*]] = trunc i48 [[TMP2]] to i32
1759466b491SNikita Popov // CHECK-NEXT: store i32 [[RESIZE2]], ptr @a, align 4
17644ebc2c8SBevin Hansson // CHECK-NEXT: ret void
17744ebc2c8SBevin Hansson //
add_au(void)1787de71613SAaron Ballman void add_au(void) {
179313461f6SBevin Hansson a += u;
18044ebc2c8SBevin Hansson }
181313461f6SBevin Hansson
18244ebc2c8SBevin Hansson // SIGNED-LABEL: @add_ulai(
18344ebc2c8SBevin Hansson // SIGNED-NEXT: entry:
1849466b491SNikita Popov // SIGNED-NEXT: [[TMP0:%.*]] = load i32, ptr @i, align 4
1859466b491SNikita Popov // SIGNED-NEXT: [[TMP1:%.*]] = load i64, ptr @ula, align 8
18644ebc2c8SBevin Hansson // SIGNED-NEXT: [[RESIZE:%.*]] = zext i64 [[TMP1]] to i65
18744ebc2c8SBevin Hansson // SIGNED-NEXT: [[RESIZE1:%.*]] = sext i32 [[TMP0]] to i65
18844ebc2c8SBevin Hansson // SIGNED-NEXT: [[UPSCALE:%.*]] = shl i65 [[RESIZE1]], 32
18944ebc2c8SBevin Hansson // SIGNED-NEXT: [[TMP2:%.*]] = add i65 [[RESIZE]], [[UPSCALE]]
19044ebc2c8SBevin Hansson // SIGNED-NEXT: [[RESIZE2:%.*]] = trunc i65 [[TMP2]] to i64
1919466b491SNikita Popov // SIGNED-NEXT: store i64 [[RESIZE2]], ptr @ula, align 8
19244ebc2c8SBevin Hansson // SIGNED-NEXT: ret void
19344ebc2c8SBevin Hansson //
19444ebc2c8SBevin Hansson // UNSIGNED-LABEL: @add_ulai(
19544ebc2c8SBevin Hansson // UNSIGNED-NEXT: entry:
1969466b491SNikita Popov // UNSIGNED-NEXT: [[TMP0:%.*]] = load i32, ptr @i, align 4
1979466b491SNikita Popov // UNSIGNED-NEXT: [[TMP1:%.*]] = load i64, ptr @ula, align 8
19844ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[RESIZE:%.*]] = sext i32 [[TMP0]] to i64
19944ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[UPSCALE:%.*]] = shl i64 [[RESIZE]], 31
20044ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[TMP2:%.*]] = add i64 [[TMP1]], [[UPSCALE]]
2019466b491SNikita Popov // UNSIGNED-NEXT: store i64 [[TMP2]], ptr @ula, align 8
20244ebc2c8SBevin Hansson // UNSIGNED-NEXT: ret void
20344ebc2c8SBevin Hansson //
add_ulai(void)2047de71613SAaron Ballman void add_ulai(void) {
205313461f6SBevin Hansson ula += i;
20644ebc2c8SBevin Hansson }
207313461f6SBevin Hansson
20844ebc2c8SBevin Hansson // SIGNED-LABEL: @add_iula(
20944ebc2c8SBevin Hansson // SIGNED-NEXT: entry:
2109466b491SNikita Popov // SIGNED-NEXT: [[TMP0:%.*]] = load i64, ptr @ula, align 8
2119466b491SNikita Popov // SIGNED-NEXT: [[TMP1:%.*]] = load i32, ptr @i, align 4
21244ebc2c8SBevin Hansson // SIGNED-NEXT: [[RESIZE:%.*]] = sext i32 [[TMP1]] to i65
21344ebc2c8SBevin Hansson // SIGNED-NEXT: [[UPSCALE:%.*]] = shl i65 [[RESIZE]], 32
21444ebc2c8SBevin Hansson // SIGNED-NEXT: [[RESIZE1:%.*]] = zext i64 [[TMP0]] to i65
21544ebc2c8SBevin Hansson // SIGNED-NEXT: [[TMP2:%.*]] = add i65 [[UPSCALE]], [[RESIZE1]]
21644ebc2c8SBevin Hansson // SIGNED-NEXT: [[RESIZE2:%.*]] = trunc i65 [[TMP2]] to i64
21744ebc2c8SBevin Hansson // SIGNED-NEXT: [[DOWNSCALE:%.*]] = lshr i64 [[RESIZE2]], 32
21844ebc2c8SBevin Hansson // SIGNED-NEXT: [[RESIZE3:%.*]] = trunc i64 [[DOWNSCALE]] to i32
2199466b491SNikita Popov // SIGNED-NEXT: store i32 [[RESIZE3]], ptr @i, align 4
22044ebc2c8SBevin Hansson // SIGNED-NEXT: ret void
22144ebc2c8SBevin Hansson //
22244ebc2c8SBevin Hansson // UNSIGNED-LABEL: @add_iula(
22344ebc2c8SBevin Hansson // UNSIGNED-NEXT: entry:
2249466b491SNikita Popov // UNSIGNED-NEXT: [[TMP0:%.*]] = load i64, ptr @ula, align 8
2259466b491SNikita Popov // UNSIGNED-NEXT: [[TMP1:%.*]] = load i32, ptr @i, align 4
22644ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[RESIZE:%.*]] = sext i32 [[TMP1]] to i64
22744ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[UPSCALE:%.*]] = shl i64 [[RESIZE]], 31
22844ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[TMP2:%.*]] = add i64 [[UPSCALE]], [[TMP0]]
22944ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[DOWNSCALE:%.*]] = lshr i64 [[TMP2]], 31
23044ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[RESIZE1:%.*]] = trunc i64 [[DOWNSCALE]] to i32
2319466b491SNikita Popov // UNSIGNED-NEXT: store i32 [[RESIZE1]], ptr @i, align 4
23244ebc2c8SBevin Hansson // UNSIGNED-NEXT: ret void
23344ebc2c8SBevin Hansson //
add_iula(void)2347de71613SAaron Ballman void add_iula(void) {
235313461f6SBevin Hansson i += ula;
23644ebc2c8SBevin Hansson }
237313461f6SBevin Hansson
23844ebc2c8SBevin Hansson // CHECK-LABEL: @add_ca(
23944ebc2c8SBevin Hansson // CHECK-NEXT: entry:
2409466b491SNikita Popov // CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @a, align 4
2419466b491SNikita Popov // CHECK-NEXT: [[TMP1:%.*]] = load i8, ptr @c, align 1
24244ebc2c8SBevin Hansson // CHECK-NEXT: [[CONV:%.*]] = sext i8 [[TMP1]] to i32
24344ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE:%.*]] = sext i32 [[CONV]] to i47
24444ebc2c8SBevin Hansson // CHECK-NEXT: [[UPSCALE:%.*]] = shl i47 [[RESIZE]], 15
24544ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE1:%.*]] = sext i32 [[TMP0]] to i47
24644ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP2:%.*]] = add i47 [[UPSCALE]], [[RESIZE1]]
24744ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE2:%.*]] = trunc i47 [[TMP2]] to i32
24844ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP3:%.*]] = icmp slt i32 [[RESIZE2]], 0
24944ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP4:%.*]] = add i32 [[RESIZE2]], 32767
25044ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP5:%.*]] = select i1 [[TMP3]], i32 [[TMP4]], i32 [[RESIZE2]]
25144ebc2c8SBevin Hansson // CHECK-NEXT: [[DOWNSCALE:%.*]] = ashr i32 [[TMP5]], 15
25244ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE3:%.*]] = trunc i32 [[DOWNSCALE]] to i8
2539466b491SNikita Popov // CHECK-NEXT: store i8 [[RESIZE3]], ptr @c, align 1
25444ebc2c8SBevin Hansson // CHECK-NEXT: ret void
25544ebc2c8SBevin Hansson //
add_ca(void)2567de71613SAaron Ballman void add_ca(void) {
257313461f6SBevin Hansson c += a;
25844ebc2c8SBevin Hansson }
259313461f6SBevin Hansson
26044ebc2c8SBevin Hansson // CHECK-LABEL: @add_sai(
26144ebc2c8SBevin Hansson // CHECK-NEXT: entry:
2629466b491SNikita Popov // CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @i, align 4
2639466b491SNikita Popov // CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @sa, align 4
26444ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE:%.*]] = sext i32 [[TMP1]] to i47
26544ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE1:%.*]] = sext i32 [[TMP0]] to i47
26644ebc2c8SBevin Hansson // CHECK-NEXT: [[UPSCALE:%.*]] = shl i47 [[RESIZE1]], 15
26744ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP2:%.*]] = call i47 @llvm.sadd.sat.i47(i47 [[RESIZE]], i47 [[UPSCALE]])
26844ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP3:%.*]] = icmp sgt i47 [[TMP2]], 2147483647
26944ebc2c8SBevin Hansson // CHECK-NEXT: [[SATMAX:%.*]] = select i1 [[TMP3]], i47 2147483647, i47 [[TMP2]]
27044ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP4:%.*]] = icmp slt i47 [[SATMAX]], -2147483648
27144ebc2c8SBevin Hansson // CHECK-NEXT: [[SATMIN:%.*]] = select i1 [[TMP4]], i47 -2147483648, i47 [[SATMAX]]
27244ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE2:%.*]] = trunc i47 [[SATMIN]] to i32
2739466b491SNikita Popov // CHECK-NEXT: store i32 [[RESIZE2]], ptr @sa, align 4
27444ebc2c8SBevin Hansson // CHECK-NEXT: ret void
27544ebc2c8SBevin Hansson //
add_sai(void)2767de71613SAaron Ballman void add_sai(void) {
277313461f6SBevin Hansson sa += i;
27844ebc2c8SBevin Hansson }
279313461f6SBevin Hansson
28044ebc2c8SBevin Hansson // CHECK-LABEL: @add_csa(
28144ebc2c8SBevin Hansson // CHECK-NEXT: entry:
2829466b491SNikita Popov // CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @sa, align 4
2839466b491SNikita Popov // CHECK-NEXT: [[TMP1:%.*]] = load i8, ptr @c, align 1
28444ebc2c8SBevin Hansson // CHECK-NEXT: [[CONV:%.*]] = sext i8 [[TMP1]] to i32
28544ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE:%.*]] = sext i32 [[CONV]] to i47
28644ebc2c8SBevin Hansson // CHECK-NEXT: [[UPSCALE:%.*]] = shl i47 [[RESIZE]], 15
28744ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE1:%.*]] = sext i32 [[TMP0]] to i47
28844ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP2:%.*]] = call i47 @llvm.sadd.sat.i47(i47 [[UPSCALE]], i47 [[RESIZE1]])
28944ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP3:%.*]] = icmp sgt i47 [[TMP2]], 2147483647
29044ebc2c8SBevin Hansson // CHECK-NEXT: [[SATMAX:%.*]] = select i1 [[TMP3]], i47 2147483647, i47 [[TMP2]]
29144ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP4:%.*]] = icmp slt i47 [[SATMAX]], -2147483648
29244ebc2c8SBevin Hansson // CHECK-NEXT: [[SATMIN:%.*]] = select i1 [[TMP4]], i47 -2147483648, i47 [[SATMAX]]
29344ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE2:%.*]] = trunc i47 [[SATMIN]] to i32
29444ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP5:%.*]] = icmp slt i32 [[RESIZE2]], 0
29544ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP6:%.*]] = add i32 [[RESIZE2]], 32767
29644ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP7:%.*]] = select i1 [[TMP5]], i32 [[TMP6]], i32 [[RESIZE2]]
29744ebc2c8SBevin Hansson // CHECK-NEXT: [[DOWNSCALE:%.*]] = ashr i32 [[TMP7]], 15
29844ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE3:%.*]] = trunc i32 [[DOWNSCALE]] to i8
2999466b491SNikita Popov // CHECK-NEXT: store i8 [[RESIZE3]], ptr @c, align 1
30044ebc2c8SBevin Hansson // CHECK-NEXT: ret void
30144ebc2c8SBevin Hansson //
add_csa(void)3027de71613SAaron Ballman void add_csa(void) {
303313461f6SBevin Hansson c += sa;
30444ebc2c8SBevin Hansson }
305313461f6SBevin Hansson
30644ebc2c8SBevin Hansson // SIGNED-LABEL: @add_sulau(
30744ebc2c8SBevin Hansson // SIGNED-NEXT: entry:
3089466b491SNikita Popov // SIGNED-NEXT: [[TMP0:%.*]] = load i32, ptr @u, align 4
3099466b491SNikita Popov // SIGNED-NEXT: [[TMP1:%.*]] = load i64, ptr @sula, align 8
31044ebc2c8SBevin Hansson // SIGNED-NEXT: [[RESIZE:%.*]] = zext i32 [[TMP0]] to i64
31144ebc2c8SBevin Hansson // SIGNED-NEXT: [[UPSCALE:%.*]] = shl i64 [[RESIZE]], 32
31244ebc2c8SBevin Hansson // SIGNED-NEXT: [[TMP2:%.*]] = call i64 @llvm.uadd.sat.i64(i64 [[TMP1]], i64 [[UPSCALE]])
3139466b491SNikita Popov // SIGNED-NEXT: store i64 [[TMP2]], ptr @sula, align 8
31444ebc2c8SBevin Hansson // SIGNED-NEXT: ret void
31544ebc2c8SBevin Hansson //
31644ebc2c8SBevin Hansson // UNSIGNED-LABEL: @add_sulau(
31744ebc2c8SBevin Hansson // UNSIGNED-NEXT: entry:
3189466b491SNikita Popov // UNSIGNED-NEXT: [[TMP0:%.*]] = load i32, ptr @u, align 4
3199466b491SNikita Popov // UNSIGNED-NEXT: [[TMP1:%.*]] = load i64, ptr @sula, align 8
32044ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[RESIZE:%.*]] = trunc i64 [[TMP1]] to i63
32144ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[RESIZE1:%.*]] = zext i32 [[TMP0]] to i63
32244ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[UPSCALE:%.*]] = shl i63 [[RESIZE1]], 31
32344ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[TMP2:%.*]] = call i63 @llvm.uadd.sat.i63(i63 [[RESIZE]], i63 [[UPSCALE]])
32444ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[RESIZE2:%.*]] = zext i63 [[TMP2]] to i64
3259466b491SNikita Popov // UNSIGNED-NEXT: store i64 [[RESIZE2]], ptr @sula, align 8
32644ebc2c8SBevin Hansson // UNSIGNED-NEXT: ret void
32744ebc2c8SBevin Hansson //
add_sulau(void)3287de71613SAaron Ballman void add_sulau(void) {
329313461f6SBevin Hansson sula += u;
33044ebc2c8SBevin Hansson }
331313461f6SBevin Hansson
33244ebc2c8SBevin Hansson // SIGNED-LABEL: @add_sshsuf(
33344ebc2c8SBevin Hansson // SIGNED-NEXT: entry:
3349466b491SNikita Popov // SIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @suf, align 2
3359466b491SNikita Popov // SIGNED-NEXT: [[TMP1:%.*]] = load i8, ptr @sshf, align 1
33644ebc2c8SBevin Hansson // SIGNED-NEXT: [[RESIZE:%.*]] = sext i8 [[TMP1]] to i17
33744ebc2c8SBevin Hansson // SIGNED-NEXT: [[UPSCALE:%.*]] = shl i17 [[RESIZE]], 9
33844ebc2c8SBevin Hansson // SIGNED-NEXT: [[RESIZE1:%.*]] = zext i16 [[TMP0]] to i17
33944ebc2c8SBevin Hansson // SIGNED-NEXT: [[TMP2:%.*]] = call i17 @llvm.sadd.sat.i17(i17 [[UPSCALE]], i17 [[RESIZE1]])
34044ebc2c8SBevin Hansson // SIGNED-NEXT: [[DOWNSCALE:%.*]] = ashr i17 [[TMP2]], 1
34144ebc2c8SBevin Hansson // SIGNED-NEXT: [[RESIZE2:%.*]] = trunc i17 [[DOWNSCALE]] to i16
34244ebc2c8SBevin Hansson // SIGNED-NEXT: [[DOWNSCALE3:%.*]] = ashr i16 [[RESIZE2]], 8
34344ebc2c8SBevin Hansson // SIGNED-NEXT: [[RESIZE4:%.*]] = trunc i16 [[DOWNSCALE3]] to i8
3449466b491SNikita Popov // SIGNED-NEXT: store i8 [[RESIZE4]], ptr @sshf, align 1
34544ebc2c8SBevin Hansson // SIGNED-NEXT: ret void
34644ebc2c8SBevin Hansson //
34744ebc2c8SBevin Hansson // UNSIGNED-LABEL: @add_sshsuf(
34844ebc2c8SBevin Hansson // UNSIGNED-NEXT: entry:
3499466b491SNikita Popov // UNSIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @suf, align 2
3509466b491SNikita Popov // UNSIGNED-NEXT: [[TMP1:%.*]] = load i8, ptr @sshf, align 1
35144ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[RESIZE:%.*]] = sext i8 [[TMP1]] to i16
35244ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[UPSCALE:%.*]] = shl i16 [[RESIZE]], 8
35344ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[TMP2:%.*]] = call i16 @llvm.sadd.sat.i16(i16 [[UPSCALE]], i16 [[TMP0]])
35444ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[DOWNSCALE:%.*]] = ashr i16 [[TMP2]], 8
35544ebc2c8SBevin Hansson // UNSIGNED-NEXT: [[RESIZE1:%.*]] = trunc i16 [[DOWNSCALE]] to i8
3569466b491SNikita Popov // UNSIGNED-NEXT: store i8 [[RESIZE1]], ptr @sshf, align 1
35744ebc2c8SBevin Hansson // UNSIGNED-NEXT: ret void
35844ebc2c8SBevin Hansson //
add_sshsuf(void)3597de71613SAaron Ballman void add_sshsuf(void) {
360313461f6SBevin Hansson sshf += suf;
361313461f6SBevin Hansson }
362313461f6SBevin Hansson
363c4944a6fSBevin Hansson // CHECK-LABEL: @add_afl(
364c4944a6fSBevin Hansson // CHECK-NEXT: entry:
3659466b491SNikita Popov // CHECK-NEXT: [[TMP0:%.*]] = load float, ptr @fl, align 4
3669466b491SNikita Popov // CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @a, align 4
367c4944a6fSBevin Hansson // CHECK-NEXT: [[TMP2:%.*]] = sitofp i32 [[TMP1]] to float
368c4944a6fSBevin Hansson // CHECK-NEXT: [[TMP3:%.*]] = fmul float [[TMP2]], 0x3F00000000000000
369c4944a6fSBevin Hansson // CHECK-NEXT: [[ADD:%.*]] = fadd float [[TMP3]], [[TMP0]]
370c4944a6fSBevin Hansson // CHECK-NEXT: [[TMP4:%.*]] = fmul float [[ADD]], 3.276800e+04
371c4944a6fSBevin Hansson // CHECK-NEXT: [[TMP5:%.*]] = fptosi float [[TMP4]] to i32
3729466b491SNikita Popov // CHECK-NEXT: store i32 [[TMP5]], ptr @a, align 4
373c4944a6fSBevin Hansson // CHECK-NEXT: ret void
374c4944a6fSBevin Hansson //
add_afl(void)3757de71613SAaron Ballman void add_afl(void) {
376c4944a6fSBevin Hansson a += fl;
377c4944a6fSBevin Hansson }
378c4944a6fSBevin Hansson
379c4944a6fSBevin Hansson // CHECK-LABEL: @add_fla(
380c4944a6fSBevin Hansson // CHECK-NEXT: entry:
3819466b491SNikita Popov // CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @a, align 4
382c4944a6fSBevin Hansson // CHECK-NEXT: [[TMP1:%.*]] = sitofp i32 [[TMP0]] to float
383c4944a6fSBevin Hansson // CHECK-NEXT: [[TMP2:%.*]] = fmul float [[TMP1]], 0x3F00000000000000
3849466b491SNikita Popov // CHECK-NEXT: [[TMP3:%.*]] = load float, ptr @fl, align 4
385c4944a6fSBevin Hansson // CHECK-NEXT: [[ADD:%.*]] = fadd float [[TMP3]], [[TMP2]]
3869466b491SNikita Popov // CHECK-NEXT: store float [[ADD]], ptr @fl, align 4
387c4944a6fSBevin Hansson // CHECK-NEXT: ret void
388c4944a6fSBevin Hansson //
add_fla(void)3897de71613SAaron Ballman void add_fla(void) {
390c4944a6fSBevin Hansson fl += a;
391c4944a6fSBevin Hansson }
392c4944a6fSBevin Hansson
393c4944a6fSBevin Hansson // CHECK-LABEL: @add_safl(
394c4944a6fSBevin Hansson // CHECK-NEXT: entry:
3959466b491SNikita Popov // CHECK-NEXT: [[TMP0:%.*]] = load float, ptr @fl, align 4
3969466b491SNikita Popov // CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @sa, align 4
397c4944a6fSBevin Hansson // CHECK-NEXT: [[TMP2:%.*]] = sitofp i32 [[TMP1]] to float
398c4944a6fSBevin Hansson // CHECK-NEXT: [[TMP3:%.*]] = fmul float [[TMP2]], 0x3F00000000000000
399c4944a6fSBevin Hansson // CHECK-NEXT: [[ADD:%.*]] = fadd float [[TMP3]], [[TMP0]]
400c4944a6fSBevin Hansson // CHECK-NEXT: [[TMP4:%.*]] = fmul float [[ADD]], 3.276800e+04
401c4944a6fSBevin Hansson // CHECK-NEXT: [[TMP5:%.*]] = call i32 @llvm.fptosi.sat.i32.f32(float [[TMP4]])
4029466b491SNikita Popov // CHECK-NEXT: store i32 [[TMP5]], ptr @sa, align 4
403c4944a6fSBevin Hansson // CHECK-NEXT: ret void
404c4944a6fSBevin Hansson //
add_safl(void)4057de71613SAaron Ballman void add_safl(void) {
406c4944a6fSBevin Hansson sa += fl;
407c4944a6fSBevin Hansson }
408c4944a6fSBevin Hansson
409c4944a6fSBevin Hansson // CHECK-LABEL: @add_flsa(
410c4944a6fSBevin Hansson // CHECK-NEXT: entry:
4119466b491SNikita Popov // CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @sa, align 4
412c4944a6fSBevin Hansson // CHECK-NEXT: [[TMP1:%.*]] = sitofp i32 [[TMP0]] to float
413c4944a6fSBevin Hansson // CHECK-NEXT: [[TMP2:%.*]] = fmul float [[TMP1]], 0x3F00000000000000
4149466b491SNikita Popov // CHECK-NEXT: [[TMP3:%.*]] = load float, ptr @fl, align 4
415c4944a6fSBevin Hansson // CHECK-NEXT: [[ADD:%.*]] = fadd float [[TMP3]], [[TMP2]]
4169466b491SNikita Popov // CHECK-NEXT: store float [[ADD]], ptr @fl, align 4
417c4944a6fSBevin Hansson // CHECK-NEXT: ret void
418c4944a6fSBevin Hansson //
add_flsa(void)4197de71613SAaron Ballman void add_flsa(void) {
420c4944a6fSBevin Hansson fl += sa;
421c4944a6fSBevin Hansson }
422c4944a6fSBevin Hansson
423313461f6SBevin Hansson // Subtraction, multiplication and division should work about the same, so
424313461f6SBevin Hansson // just make sure we can do them.
425313461f6SBevin Hansson
42644ebc2c8SBevin Hansson // SIGNED-LABEL: @sub_auf(
42744ebc2c8SBevin Hansson // SIGNED-NEXT: entry:
4289466b491SNikita Popov // SIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @uf, align 2
4299466b491SNikita Popov // SIGNED-NEXT: [[TMP1:%.*]] = load i32, ptr @a, align 4
430313461f6SBevin Hansson // SIGNED-NEXT: [[RESIZE:%.*]] = sext i32 [[TMP1]] to i33
431313461f6SBevin Hansson // SIGNED-NEXT: [[UPSCALE:%.*]] = shl i33 [[RESIZE]], 1
432313461f6SBevin Hansson // SIGNED-NEXT: [[RESIZE1:%.*]] = zext i16 [[TMP0]] to i33
433313461f6SBevin Hansson // SIGNED-NEXT: [[TMP2:%.*]] = sub i33 [[UPSCALE]], [[RESIZE1]]
434313461f6SBevin Hansson // SIGNED-NEXT: [[DOWNSCALE:%.*]] = ashr i33 [[TMP2]], 1
435313461f6SBevin Hansson // SIGNED-NEXT: [[RESIZE2:%.*]] = trunc i33 [[DOWNSCALE]] to i32
4369466b491SNikita Popov // SIGNED-NEXT: store i32 [[RESIZE2]], ptr @a, align 4
43744ebc2c8SBevin Hansson // SIGNED-NEXT: ret void
43844ebc2c8SBevin Hansson //
43944ebc2c8SBevin Hansson // UNSIGNED-LABEL: @sub_auf(
44044ebc2c8SBevin Hansson // UNSIGNED-NEXT: entry:
4419466b491SNikita Popov // UNSIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @uf, align 2
4429466b491SNikita Popov // UNSIGNED-NEXT: [[TMP1:%.*]] = load i32, ptr @a, align 4
443313461f6SBevin Hansson // UNSIGNED-NEXT: [[RESIZE:%.*]] = zext i16 [[TMP0]] to i32
444313461f6SBevin Hansson // UNSIGNED-NEXT: [[TMP2:%.*]] = sub i32 [[TMP1]], [[RESIZE]]
4459466b491SNikita Popov // UNSIGNED-NEXT: store i32 [[TMP2]], ptr @a, align 4
44644ebc2c8SBevin Hansson // UNSIGNED-NEXT: ret void
44744ebc2c8SBevin Hansson //
sub_auf(void)4487de71613SAaron Ballman void sub_auf(void) {
449313461f6SBevin Hansson a -= uf;
45044ebc2c8SBevin Hansson }
451313461f6SBevin Hansson
45244ebc2c8SBevin Hansson // CHECK-LABEL: @sub_ai(
45344ebc2c8SBevin Hansson // CHECK-NEXT: entry:
4549466b491SNikita Popov // CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @i, align 4
4559466b491SNikita Popov // CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @a, align 4
45644ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE:%.*]] = sext i32 [[TMP1]] to i47
45744ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE1:%.*]] = sext i32 [[TMP0]] to i47
45844ebc2c8SBevin Hansson // CHECK-NEXT: [[UPSCALE:%.*]] = shl i47 [[RESIZE1]], 15
45944ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP2:%.*]] = sub i47 [[RESIZE]], [[UPSCALE]]
46044ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE2:%.*]] = trunc i47 [[TMP2]] to i32
4619466b491SNikita Popov // CHECK-NEXT: store i32 [[RESIZE2]], ptr @a, align 4
46244ebc2c8SBevin Hansson // CHECK-NEXT: ret void
46344ebc2c8SBevin Hansson //
sub_ai(void)4647de71613SAaron Ballman void sub_ai(void) {
465313461f6SBevin Hansson a -= i;
46644ebc2c8SBevin Hansson }
467313461f6SBevin Hansson
46844ebc2c8SBevin Hansson // CHECK-LABEL: @sub_csa(
46944ebc2c8SBevin Hansson // CHECK-NEXT: entry:
4709466b491SNikita Popov // CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @sa, align 4
4719466b491SNikita Popov // CHECK-NEXT: [[TMP1:%.*]] = load i8, ptr @c, align 1
47244ebc2c8SBevin Hansson // CHECK-NEXT: [[CONV:%.*]] = sext i8 [[TMP1]] to i32
47344ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE:%.*]] = sext i32 [[CONV]] to i47
47444ebc2c8SBevin Hansson // CHECK-NEXT: [[UPSCALE:%.*]] = shl i47 [[RESIZE]], 15
47544ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE1:%.*]] = sext i32 [[TMP0]] to i47
47644ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP2:%.*]] = call i47 @llvm.ssub.sat.i47(i47 [[UPSCALE]], i47 [[RESIZE1]])
47744ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP3:%.*]] = icmp sgt i47 [[TMP2]], 2147483647
47844ebc2c8SBevin Hansson // CHECK-NEXT: [[SATMAX:%.*]] = select i1 [[TMP3]], i47 2147483647, i47 [[TMP2]]
47944ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP4:%.*]] = icmp slt i47 [[SATMAX]], -2147483648
48044ebc2c8SBevin Hansson // CHECK-NEXT: [[SATMIN:%.*]] = select i1 [[TMP4]], i47 -2147483648, i47 [[SATMAX]]
48144ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE2:%.*]] = trunc i47 [[SATMIN]] to i32
48244ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP5:%.*]] = icmp slt i32 [[RESIZE2]], 0
48344ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP6:%.*]] = add i32 [[RESIZE2]], 32767
48444ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP7:%.*]] = select i1 [[TMP5]], i32 [[TMP6]], i32 [[RESIZE2]]
48544ebc2c8SBevin Hansson // CHECK-NEXT: [[DOWNSCALE:%.*]] = ashr i32 [[TMP7]], 15
48644ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE3:%.*]] = trunc i32 [[DOWNSCALE]] to i8
4879466b491SNikita Popov // CHECK-NEXT: store i8 [[RESIZE3]], ptr @c, align 1
48844ebc2c8SBevin Hansson // CHECK-NEXT: ret void
48944ebc2c8SBevin Hansson //
sub_csa(void)4907de71613SAaron Ballman void sub_csa(void) {
491313461f6SBevin Hansson c -= sa;
492313461f6SBevin Hansson }
493313461f6SBevin Hansson
494c4944a6fSBevin Hansson // CHECK-LABEL: @sub_afl(
495c4944a6fSBevin Hansson // CHECK-NEXT: entry:
4969466b491SNikita Popov // CHECK-NEXT: [[TMP0:%.*]] = load float, ptr @fl, align 4
4979466b491SNikita Popov // CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @a, align 4
498c4944a6fSBevin Hansson // CHECK-NEXT: [[TMP2:%.*]] = sitofp i32 [[TMP1]] to float
499c4944a6fSBevin Hansson // CHECK-NEXT: [[TMP3:%.*]] = fmul float [[TMP2]], 0x3F00000000000000
500c4944a6fSBevin Hansson // CHECK-NEXT: [[SUB:%.*]] = fsub float [[TMP3]], [[TMP0]]
501c4944a6fSBevin Hansson // CHECK-NEXT: [[TMP4:%.*]] = fmul float [[SUB]], 3.276800e+04
502c4944a6fSBevin Hansson // CHECK-NEXT: [[TMP5:%.*]] = fptosi float [[TMP4]] to i32
5039466b491SNikita Popov // CHECK-NEXT: store i32 [[TMP5]], ptr @a, align 4
504c4944a6fSBevin Hansson // CHECK-NEXT: ret void
505c4944a6fSBevin Hansson //
sub_afl(void)5067de71613SAaron Ballman void sub_afl(void) {
507c4944a6fSBevin Hansson a -= fl;
508c4944a6fSBevin Hansson }
509c4944a6fSBevin Hansson
51044ebc2c8SBevin Hansson
51144ebc2c8SBevin Hansson // SIGNED-LABEL: @mul_auf(
51244ebc2c8SBevin Hansson // SIGNED-NEXT: entry:
5139466b491SNikita Popov // SIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @uf, align 2
5149466b491SNikita Popov // SIGNED-NEXT: [[TMP1:%.*]] = load i32, ptr @a, align 4
515313461f6SBevin Hansson // SIGNED-NEXT: [[RESIZE:%.*]] = sext i32 [[TMP1]] to i33
516313461f6SBevin Hansson // SIGNED-NEXT: [[UPSCALE:%.*]] = shl i33 [[RESIZE]], 1
517313461f6SBevin Hansson // SIGNED-NEXT: [[RESIZE1:%.*]] = zext i16 [[TMP0]] to i33
518313461f6SBevin Hansson // SIGNED-NEXT: [[TMP2:%.*]] = call i33 @llvm.smul.fix.i33(i33 [[UPSCALE]], i33 [[RESIZE1]], i32 16)
519313461f6SBevin Hansson // SIGNED-NEXT: [[DOWNSCALE:%.*]] = ashr i33 [[TMP2]], 1
520313461f6SBevin Hansson // SIGNED-NEXT: [[RESIZE2:%.*]] = trunc i33 [[DOWNSCALE]] to i32
5219466b491SNikita Popov // SIGNED-NEXT: store i32 [[RESIZE2]], ptr @a, align 4
52244ebc2c8SBevin Hansson // SIGNED-NEXT: ret void
52344ebc2c8SBevin Hansson //
52444ebc2c8SBevin Hansson // UNSIGNED-LABEL: @mul_auf(
52544ebc2c8SBevin Hansson // UNSIGNED-NEXT: entry:
5269466b491SNikita Popov // UNSIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @uf, align 2
5279466b491SNikita Popov // UNSIGNED-NEXT: [[TMP1:%.*]] = load i32, ptr @a, align 4
528313461f6SBevin Hansson // UNSIGNED-NEXT: [[RESIZE:%.*]] = zext i16 [[TMP0]] to i32
529313461f6SBevin Hansson // UNSIGNED-NEXT: [[TMP2:%.*]] = call i32 @llvm.smul.fix.i32(i32 [[TMP1]], i32 [[RESIZE]], i32 15)
5309466b491SNikita Popov // UNSIGNED-NEXT: store i32 [[TMP2]], ptr @a, align 4
53144ebc2c8SBevin Hansson // UNSIGNED-NEXT: ret void
53244ebc2c8SBevin Hansson //
mul_auf(void)5337de71613SAaron Ballman void mul_auf(void) {
534313461f6SBevin Hansson a *= uf;
53544ebc2c8SBevin Hansson }
536313461f6SBevin Hansson
53744ebc2c8SBevin Hansson // CHECK-LABEL: @mul_ai(
53844ebc2c8SBevin Hansson // CHECK-NEXT: entry:
5399466b491SNikita Popov // CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @i, align 4
5409466b491SNikita Popov // CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @a, align 4
54144ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE:%.*]] = sext i32 [[TMP1]] to i47
54244ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE1:%.*]] = sext i32 [[TMP0]] to i47
54344ebc2c8SBevin Hansson // CHECK-NEXT: [[UPSCALE:%.*]] = shl i47 [[RESIZE1]], 15
54444ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP2:%.*]] = call i47 @llvm.smul.fix.i47(i47 [[RESIZE]], i47 [[UPSCALE]], i32 15)
54544ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE2:%.*]] = trunc i47 [[TMP2]] to i32
5469466b491SNikita Popov // CHECK-NEXT: store i32 [[RESIZE2]], ptr @a, align 4
54744ebc2c8SBevin Hansson // CHECK-NEXT: ret void
54844ebc2c8SBevin Hansson //
mul_ai(void)5497de71613SAaron Ballman void mul_ai(void) {
550313461f6SBevin Hansson a *= i;
55144ebc2c8SBevin Hansson }
552313461f6SBevin Hansson
55344ebc2c8SBevin Hansson // CHECK-LABEL: @mul_csa(
55444ebc2c8SBevin Hansson // CHECK-NEXT: entry:
5559466b491SNikita Popov // CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @sa, align 4
5569466b491SNikita Popov // CHECK-NEXT: [[TMP1:%.*]] = load i8, ptr @c, align 1
55744ebc2c8SBevin Hansson // CHECK-NEXT: [[CONV:%.*]] = sext i8 [[TMP1]] to i32
55844ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE:%.*]] = sext i32 [[CONV]] to i47
55944ebc2c8SBevin Hansson // CHECK-NEXT: [[UPSCALE:%.*]] = shl i47 [[RESIZE]], 15
56044ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE1:%.*]] = sext i32 [[TMP0]] to i47
56144ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP2:%.*]] = call i47 @llvm.smul.fix.sat.i47(i47 [[UPSCALE]], i47 [[RESIZE1]], i32 15)
56244ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP3:%.*]] = icmp sgt i47 [[TMP2]], 2147483647
56344ebc2c8SBevin Hansson // CHECK-NEXT: [[SATMAX:%.*]] = select i1 [[TMP3]], i47 2147483647, i47 [[TMP2]]
56444ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP4:%.*]] = icmp slt i47 [[SATMAX]], -2147483648
56544ebc2c8SBevin Hansson // CHECK-NEXT: [[SATMIN:%.*]] = select i1 [[TMP4]], i47 -2147483648, i47 [[SATMAX]]
56644ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE2:%.*]] = trunc i47 [[SATMIN]] to i32
56744ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP5:%.*]] = icmp slt i32 [[RESIZE2]], 0
56844ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP6:%.*]] = add i32 [[RESIZE2]], 32767
56944ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP7:%.*]] = select i1 [[TMP5]], i32 [[TMP6]], i32 [[RESIZE2]]
57044ebc2c8SBevin Hansson // CHECK-NEXT: [[DOWNSCALE:%.*]] = ashr i32 [[TMP7]], 15
57144ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE3:%.*]] = trunc i32 [[DOWNSCALE]] to i8
5729466b491SNikita Popov // CHECK-NEXT: store i8 [[RESIZE3]], ptr @c, align 1
57344ebc2c8SBevin Hansson // CHECK-NEXT: ret void
57444ebc2c8SBevin Hansson //
mul_csa(void)5757de71613SAaron Ballman void mul_csa(void) {
576313461f6SBevin Hansson c *= sa;
577313461f6SBevin Hansson }
578313461f6SBevin Hansson
579c4944a6fSBevin Hansson // CHECK-LABEL: @mul_afl(
580c4944a6fSBevin Hansson // CHECK-NEXT: entry:
5819466b491SNikita Popov // CHECK-NEXT: [[TMP0:%.*]] = load float, ptr @fl, align 4
5829466b491SNikita Popov // CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @a, align 4
583c4944a6fSBevin Hansson // CHECK-NEXT: [[TMP2:%.*]] = sitofp i32 [[TMP1]] to float
584c4944a6fSBevin Hansson // CHECK-NEXT: [[TMP3:%.*]] = fmul float [[TMP2]], 0x3F00000000000000
585c4944a6fSBevin Hansson // CHECK-NEXT: [[MUL:%.*]] = fmul float [[TMP3]], [[TMP0]]
586c4944a6fSBevin Hansson // CHECK-NEXT: [[TMP4:%.*]] = fmul float [[MUL]], 3.276800e+04
587c4944a6fSBevin Hansson // CHECK-NEXT: [[TMP5:%.*]] = fptosi float [[TMP4]] to i32
5889466b491SNikita Popov // CHECK-NEXT: store i32 [[TMP5]], ptr @a, align 4
589c4944a6fSBevin Hansson // CHECK-NEXT: ret void
590c4944a6fSBevin Hansson //
mul_afl(void)5917de71613SAaron Ballman void mul_afl(void) {
592c4944a6fSBevin Hansson a *= fl;
593c4944a6fSBevin Hansson }
594c4944a6fSBevin Hansson
59544ebc2c8SBevin Hansson
59644ebc2c8SBevin Hansson // SIGNED-LABEL: @div_auf(
59744ebc2c8SBevin Hansson // SIGNED-NEXT: entry:
5989466b491SNikita Popov // SIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @uf, align 2
5999466b491SNikita Popov // SIGNED-NEXT: [[TMP1:%.*]] = load i32, ptr @a, align 4
600313461f6SBevin Hansson // SIGNED-NEXT: [[RESIZE:%.*]] = sext i32 [[TMP1]] to i33
601313461f6SBevin Hansson // SIGNED-NEXT: [[UPSCALE:%.*]] = shl i33 [[RESIZE]], 1
602313461f6SBevin Hansson // SIGNED-NEXT: [[RESIZE1:%.*]] = zext i16 [[TMP0]] to i33
603313461f6SBevin Hansson // SIGNED-NEXT: [[TMP2:%.*]] = call i33 @llvm.sdiv.fix.i33(i33 [[UPSCALE]], i33 [[RESIZE1]], i32 16)
604313461f6SBevin Hansson // SIGNED-NEXT: [[DOWNSCALE:%.*]] = ashr i33 [[TMP2]], 1
605313461f6SBevin Hansson // SIGNED-NEXT: [[RESIZE2:%.*]] = trunc i33 [[DOWNSCALE]] to i32
6069466b491SNikita Popov // SIGNED-NEXT: store i32 [[RESIZE2]], ptr @a, align 4
60744ebc2c8SBevin Hansson // SIGNED-NEXT: ret void
60844ebc2c8SBevin Hansson //
60944ebc2c8SBevin Hansson // UNSIGNED-LABEL: @div_auf(
61044ebc2c8SBevin Hansson // UNSIGNED-NEXT: entry:
6119466b491SNikita Popov // UNSIGNED-NEXT: [[TMP0:%.*]] = load i16, ptr @uf, align 2
6129466b491SNikita Popov // UNSIGNED-NEXT: [[TMP1:%.*]] = load i32, ptr @a, align 4
613313461f6SBevin Hansson // UNSIGNED-NEXT: [[RESIZE:%.*]] = zext i16 [[TMP0]] to i32
614313461f6SBevin Hansson // UNSIGNED-NEXT: [[TMP2:%.*]] = call i32 @llvm.sdiv.fix.i32(i32 [[TMP1]], i32 [[RESIZE]], i32 15)
6159466b491SNikita Popov // UNSIGNED-NEXT: store i32 [[TMP2]], ptr @a, align 4
61644ebc2c8SBevin Hansson // UNSIGNED-NEXT: ret void
61744ebc2c8SBevin Hansson //
div_auf(void)6187de71613SAaron Ballman void div_auf(void) {
619313461f6SBevin Hansson a /= uf;
62044ebc2c8SBevin Hansson }
621313461f6SBevin Hansson
62244ebc2c8SBevin Hansson // CHECK-LABEL: @div_ai(
62344ebc2c8SBevin Hansson // CHECK-NEXT: entry:
6249466b491SNikita Popov // CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @i, align 4
6259466b491SNikita Popov // CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @a, align 4
62644ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE:%.*]] = sext i32 [[TMP1]] to i47
62744ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE1:%.*]] = sext i32 [[TMP0]] to i47
62844ebc2c8SBevin Hansson // CHECK-NEXT: [[UPSCALE:%.*]] = shl i47 [[RESIZE1]], 15
62944ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP2:%.*]] = call i47 @llvm.sdiv.fix.i47(i47 [[RESIZE]], i47 [[UPSCALE]], i32 15)
63044ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE2:%.*]] = trunc i47 [[TMP2]] to i32
6319466b491SNikita Popov // CHECK-NEXT: store i32 [[RESIZE2]], ptr @a, align 4
63244ebc2c8SBevin Hansson // CHECK-NEXT: ret void
63344ebc2c8SBevin Hansson //
div_ai(void)6347de71613SAaron Ballman void div_ai(void) {
635313461f6SBevin Hansson a /= i;
63644ebc2c8SBevin Hansson }
637313461f6SBevin Hansson
63844ebc2c8SBevin Hansson // CHECK-LABEL: @div_csa(
63944ebc2c8SBevin Hansson // CHECK-NEXT: entry:
6409466b491SNikita Popov // CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @sa, align 4
6419466b491SNikita Popov // CHECK-NEXT: [[TMP1:%.*]] = load i8, ptr @c, align 1
64244ebc2c8SBevin Hansson // CHECK-NEXT: [[CONV:%.*]] = sext i8 [[TMP1]] to i32
64344ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE:%.*]] = sext i32 [[CONV]] to i47
64444ebc2c8SBevin Hansson // CHECK-NEXT: [[UPSCALE:%.*]] = shl i47 [[RESIZE]], 15
64544ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE1:%.*]] = sext i32 [[TMP0]] to i47
64644ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP2:%.*]] = call i47 @llvm.sdiv.fix.sat.i47(i47 [[UPSCALE]], i47 [[RESIZE1]], i32 15)
64744ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP3:%.*]] = icmp sgt i47 [[TMP2]], 2147483647
64844ebc2c8SBevin Hansson // CHECK-NEXT: [[SATMAX:%.*]] = select i1 [[TMP3]], i47 2147483647, i47 [[TMP2]]
64944ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP4:%.*]] = icmp slt i47 [[SATMAX]], -2147483648
65044ebc2c8SBevin Hansson // CHECK-NEXT: [[SATMIN:%.*]] = select i1 [[TMP4]], i47 -2147483648, i47 [[SATMAX]]
65144ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE2:%.*]] = trunc i47 [[SATMIN]] to i32
65244ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP5:%.*]] = icmp slt i32 [[RESIZE2]], 0
65344ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP6:%.*]] = add i32 [[RESIZE2]], 32767
65444ebc2c8SBevin Hansson // CHECK-NEXT: [[TMP7:%.*]] = select i1 [[TMP5]], i32 [[TMP6]], i32 [[RESIZE2]]
65544ebc2c8SBevin Hansson // CHECK-NEXT: [[DOWNSCALE:%.*]] = ashr i32 [[TMP7]], 15
65644ebc2c8SBevin Hansson // CHECK-NEXT: [[RESIZE3:%.*]] = trunc i32 [[DOWNSCALE]] to i8
6579466b491SNikita Popov // CHECK-NEXT: store i8 [[RESIZE3]], ptr @c, align 1
65844ebc2c8SBevin Hansson // CHECK-NEXT: ret void
65944ebc2c8SBevin Hansson //
div_csa(void)6607de71613SAaron Ballman void div_csa(void) {
661313461f6SBevin Hansson c /= sa;
662313461f6SBevin Hansson }
663313461f6SBevin Hansson
664c4944a6fSBevin Hansson // CHECK-LABEL: @div_afl(
665c4944a6fSBevin Hansson // CHECK-NEXT: entry:
6669466b491SNikita Popov // CHECK-NEXT: [[TMP0:%.*]] = load float, ptr @fl, align 4
6679466b491SNikita Popov // CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @a, align 4
668c4944a6fSBevin Hansson // CHECK-NEXT: [[TMP2:%.*]] = sitofp i32 [[TMP1]] to float
669c4944a6fSBevin Hansson // CHECK-NEXT: [[TMP3:%.*]] = fmul float [[TMP2]], 0x3F00000000000000
670c4944a6fSBevin Hansson // CHECK-NEXT: [[DIV:%.*]] = fdiv float [[TMP3]], [[TMP0]]
671c4944a6fSBevin Hansson // CHECK-NEXT: [[TMP4:%.*]] = fmul float [[DIV]], 3.276800e+04
672c4944a6fSBevin Hansson // CHECK-NEXT: [[TMP5:%.*]] = fptosi float [[TMP4]] to i32
6739466b491SNikita Popov // CHECK-NEXT: store i32 [[TMP5]], ptr @a, align 4
674c4944a6fSBevin Hansson // CHECK-NEXT: ret void
675c4944a6fSBevin Hansson //
div_afl(void)6767de71613SAaron Ballman void div_afl(void) {
677c4944a6fSBevin Hansson a /= fl;
678c4944a6fSBevin Hansson }
679c4944a6fSBevin Hansson
680577f8b15SBevin Hansson
681577f8b15SBevin Hansson // CHECK-LABEL: @shft_ai(
682577f8b15SBevin Hansson // CHECK-NEXT: entry:
6839466b491SNikita Popov // CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @i, align 4
6849466b491SNikita Popov // CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @a, align 4
685577f8b15SBevin Hansson // CHECK-NEXT: [[TMP2:%.*]] = shl i32 [[TMP1]], [[TMP0]]
6869466b491SNikita Popov // CHECK-NEXT: store i32 [[TMP2]], ptr @a, align 4
687577f8b15SBevin Hansson // CHECK-NEXT: ret void
688577f8b15SBevin Hansson //
shft_ai(void)6897de71613SAaron Ballman void shft_ai(void) {
690577f8b15SBevin Hansson a <<= i;
691577f8b15SBevin Hansson }
692577f8b15SBevin Hansson
693577f8b15SBevin Hansson // SIGNED-LABEL: @shft_sufi(
694577f8b15SBevin Hansson // SIGNED-NEXT: entry:
6959466b491SNikita Popov // SIGNED-NEXT: [[TMP0:%.*]] = load i32, ptr @i, align 4
6969466b491SNikita Popov // SIGNED-NEXT: [[TMP1:%.*]] = load i16, ptr @suf, align 2
697577f8b15SBevin Hansson // SIGNED-NEXT: [[TMP2:%.*]] = trunc i32 [[TMP0]] to i16
698577f8b15SBevin Hansson // SIGNED-NEXT: [[TMP3:%.*]] = call i16 @llvm.ushl.sat.i16(i16 [[TMP1]], i16 [[TMP2]])
6999466b491SNikita Popov // SIGNED-NEXT: store i16 [[TMP3]], ptr @suf, align 2
700577f8b15SBevin Hansson // SIGNED-NEXT: ret void
701577f8b15SBevin Hansson //
702577f8b15SBevin Hansson // UNSIGNED-LABEL: @shft_sufi(
703577f8b15SBevin Hansson // UNSIGNED-NEXT: entry:
7049466b491SNikita Popov // UNSIGNED-NEXT: [[TMP0:%.*]] = load i32, ptr @i, align 4
7059466b491SNikita Popov // UNSIGNED-NEXT: [[TMP1:%.*]] = load i16, ptr @suf, align 2
706577f8b15SBevin Hansson // UNSIGNED-NEXT: [[TMP2:%.*]] = trunc i32 [[TMP0]] to i16
707577f8b15SBevin Hansson // UNSIGNED-NEXT: [[TMP3:%.*]] = call i16 @llvm.sshl.sat.i16(i16 [[TMP1]], i16 [[TMP2]])
7089466b491SNikita Popov // UNSIGNED-NEXT: store i16 [[TMP3]], ptr @suf, align 2
709577f8b15SBevin Hansson // UNSIGNED-NEXT: ret void
710577f8b15SBevin Hansson //
shft_sufi(void)7117de71613SAaron Ballman void shft_sufi(void) {
712577f8b15SBevin Hansson suf <<= i;
713577f8b15SBevin Hansson }
714577f8b15SBevin Hansson
715577f8b15SBevin Hansson // CHECK-LABEL: @shft_ulai(
716577f8b15SBevin Hansson // CHECK-NEXT: entry:
7179466b491SNikita Popov // CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @i, align 4
7189466b491SNikita Popov // CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr @ula, align 8
719577f8b15SBevin Hansson // CHECK-NEXT: [[TMP2:%.*]] = zext i32 [[TMP0]] to i64
720577f8b15SBevin Hansson // CHECK-NEXT: [[TMP3:%.*]] = lshr i64 [[TMP1]], [[TMP2]]
7219466b491SNikita Popov // CHECK-NEXT: store i64 [[TMP3]], ptr @ula, align 8
722577f8b15SBevin Hansson // CHECK-NEXT: ret void
723577f8b15SBevin Hansson //
shft_ulai(void)7247de71613SAaron Ballman void shft_ulai(void) {
725577f8b15SBevin Hansson ula >>= i;
726577f8b15SBevin Hansson }
727