forked from OSchip/llvm-project
569 lines
18 KiB
C
569 lines
18 KiB
C
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
|
|
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -ffixed-point -S -emit-llvm %s -o - | FileCheck %s --check-prefixes=CHECK,SIGNED
|
|
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -ffixed-point -fpadding-on-unsigned-fixed-point -S -emit-llvm %s -o - | FileCheck %s --check-prefixes=CHECK,UNSIGNED
|
|
|
|
_Accum a;
|
|
_Fract f;
|
|
long _Fract lf;
|
|
unsigned _Accum ua;
|
|
short unsigned _Accum usa;
|
|
unsigned _Fract uf;
|
|
|
|
_Sat _Accum sa;
|
|
_Sat _Fract sf;
|
|
_Sat long _Fract slf;
|
|
_Sat unsigned _Accum sua;
|
|
_Sat short unsigned _Accum susa;
|
|
_Sat unsigned _Fract suf;
|
|
|
|
int i;
|
|
|
|
// CHECK-LABEL: @inc_a(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* @a, align 4
|
|
// CHECK-NEXT: [[TMP1:%.*]] = sub i32 [[TMP0]], -32768
|
|
// CHECK-NEXT: store i32 [[TMP1]], i32* @a, align 4
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void inc_a() {
|
|
a++;
|
|
}
|
|
|
|
// CHECK-LABEL: @inc_f(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i16, i16* @f, align 2
|
|
// CHECK-NEXT: [[TMP1:%.*]] = sub i16 [[TMP0]], -32768
|
|
// CHECK-NEXT: store i16 [[TMP1]], i16* @f, align 2
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void inc_f() {
|
|
f++;
|
|
}
|
|
|
|
// CHECK-LABEL: @inc_lf(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* @lf, align 4
|
|
// CHECK-NEXT: [[TMP1:%.*]] = sub i32 [[TMP0]], -2147483648
|
|
// CHECK-NEXT: store i32 [[TMP1]], i32* @lf, align 4
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void inc_lf() {
|
|
lf++;
|
|
}
|
|
|
|
// SIGNED-LABEL: @inc_ua(
|
|
// SIGNED-NEXT: entry:
|
|
// SIGNED-NEXT: [[TMP0:%.*]] = load i32, i32* @ua, align 4
|
|
// SIGNED-NEXT: [[TMP1:%.*]] = add i32 [[TMP0]], 65536
|
|
// SIGNED-NEXT: store i32 [[TMP1]], i32* @ua, align 4
|
|
// SIGNED-NEXT: ret void
|
|
//
|
|
// UNSIGNED-LABEL: @inc_ua(
|
|
// UNSIGNED-NEXT: entry:
|
|
// UNSIGNED-NEXT: [[TMP0:%.*]] = load i32, i32* @ua, align 4
|
|
// UNSIGNED-NEXT: [[TMP1:%.*]] = add i32 [[TMP0]], 32768
|
|
// UNSIGNED-NEXT: store i32 [[TMP1]], i32* @ua, align 4
|
|
// UNSIGNED-NEXT: ret void
|
|
//
|
|
void inc_ua() {
|
|
ua++;
|
|
}
|
|
|
|
// SIGNED-LABEL: @inc_usa(
|
|
// SIGNED-NEXT: entry:
|
|
// SIGNED-NEXT: [[TMP0:%.*]] = load i16, i16* @usa, align 2
|
|
// SIGNED-NEXT: [[TMP1:%.*]] = add i16 [[TMP0]], 256
|
|
// SIGNED-NEXT: store i16 [[TMP1]], i16* @usa, align 2
|
|
// SIGNED-NEXT: ret void
|
|
//
|
|
// UNSIGNED-LABEL: @inc_usa(
|
|
// UNSIGNED-NEXT: entry:
|
|
// UNSIGNED-NEXT: [[TMP0:%.*]] = load i16, i16* @usa, align 2
|
|
// UNSIGNED-NEXT: [[TMP1:%.*]] = add i16 [[TMP0]], 128
|
|
// UNSIGNED-NEXT: store i16 [[TMP1]], i16* @usa, align 2
|
|
// UNSIGNED-NEXT: ret void
|
|
//
|
|
void inc_usa() {
|
|
usa++;
|
|
}
|
|
|
|
// SIGNED-LABEL: @inc_uf(
|
|
// SIGNED-NEXT: entry:
|
|
// SIGNED-NEXT: [[TMP0:%.*]] = load i16, i16* @uf, align 2
|
|
// SIGNED-NEXT: [[TMP1:%.*]] = add i16 [[TMP0]], poison
|
|
// SIGNED-NEXT: store i16 [[TMP1]], i16* @uf, align 2
|
|
// SIGNED-NEXT: ret void
|
|
//
|
|
// UNSIGNED-LABEL: @inc_uf(
|
|
// UNSIGNED-NEXT: entry:
|
|
// UNSIGNED-NEXT: [[TMP0:%.*]] = load i16, i16* @uf, align 2
|
|
// UNSIGNED-NEXT: [[TMP1:%.*]] = add i16 [[TMP0]], -32768
|
|
// UNSIGNED-NEXT: store i16 [[TMP1]], i16* @uf, align 2
|
|
// UNSIGNED-NEXT: ret void
|
|
//
|
|
void inc_uf() {
|
|
uf++;
|
|
}
|
|
|
|
// CHECK-LABEL: @inc_sa(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* @sa, align 4
|
|
// CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.ssub.sat.i32(i32 [[TMP0]], i32 -32768)
|
|
// CHECK-NEXT: store i32 [[TMP1]], i32* @sa, align 4
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void inc_sa() {
|
|
sa++;
|
|
}
|
|
|
|
// CHECK-LABEL: @inc_sf(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i16, i16* @sf, align 2
|
|
// CHECK-NEXT: [[TMP1:%.*]] = call i16 @llvm.ssub.sat.i16(i16 [[TMP0]], i16 -32768)
|
|
// CHECK-NEXT: store i16 [[TMP1]], i16* @sf, align 2
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void inc_sf() {
|
|
sf++;
|
|
}
|
|
|
|
// CHECK-LABEL: @inc_slf(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* @slf, align 4
|
|
// CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.ssub.sat.i32(i32 [[TMP0]], i32 -2147483648)
|
|
// CHECK-NEXT: store i32 [[TMP1]], i32* @slf, align 4
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void inc_slf() {
|
|
slf++;
|
|
}
|
|
|
|
// SIGNED-LABEL: @inc_sua(
|
|
// SIGNED-NEXT: entry:
|
|
// SIGNED-NEXT: [[TMP0:%.*]] = load i32, i32* @sua, align 4
|
|
// SIGNED-NEXT: [[TMP1:%.*]] = call i32 @llvm.uadd.sat.i32(i32 [[TMP0]], i32 65536)
|
|
// SIGNED-NEXT: store i32 [[TMP1]], i32* @sua, align 4
|
|
// SIGNED-NEXT: ret void
|
|
//
|
|
// UNSIGNED-LABEL: @inc_sua(
|
|
// UNSIGNED-NEXT: entry:
|
|
// UNSIGNED-NEXT: [[TMP0:%.*]] = load i32, i32* @sua, align 4
|
|
// UNSIGNED-NEXT: [[TMP1:%.*]] = call i32 @llvm.sadd.sat.i32(i32 [[TMP0]], i32 32768)
|
|
// UNSIGNED-NEXT: [[RESIZE:%.*]] = trunc i32 [[TMP1]] to i31
|
|
// UNSIGNED-NEXT: [[RESIZE1:%.*]] = zext i31 [[RESIZE]] to i32
|
|
// UNSIGNED-NEXT: store i32 [[RESIZE1]], i32* @sua, align 4
|
|
// UNSIGNED-NEXT: ret void
|
|
//
|
|
void inc_sua() {
|
|
sua++;
|
|
}
|
|
|
|
// SIGNED-LABEL: @inc_susa(
|
|
// SIGNED-NEXT: entry:
|
|
// SIGNED-NEXT: [[TMP0:%.*]] = load i16, i16* @susa, align 2
|
|
// SIGNED-NEXT: [[TMP1:%.*]] = call i16 @llvm.uadd.sat.i16(i16 [[TMP0]], i16 256)
|
|
// SIGNED-NEXT: store i16 [[TMP1]], i16* @susa, align 2
|
|
// SIGNED-NEXT: ret void
|
|
//
|
|
// UNSIGNED-LABEL: @inc_susa(
|
|
// UNSIGNED-NEXT: entry:
|
|
// UNSIGNED-NEXT: [[TMP0:%.*]] = load i16, i16* @susa, align 2
|
|
// UNSIGNED-NEXT: [[TMP1:%.*]] = call i16 @llvm.sadd.sat.i16(i16 [[TMP0]], i16 128)
|
|
// UNSIGNED-NEXT: [[RESIZE:%.*]] = trunc i16 [[TMP1]] to i15
|
|
// UNSIGNED-NEXT: [[RESIZE1:%.*]] = zext i15 [[RESIZE]] to i16
|
|
// UNSIGNED-NEXT: store i16 [[RESIZE1]], i16* @susa, align 2
|
|
// UNSIGNED-NEXT: ret void
|
|
//
|
|
void inc_susa() {
|
|
susa++;
|
|
}
|
|
|
|
// SIGNED-LABEL: @inc_suf(
|
|
// SIGNED-NEXT: entry:
|
|
// SIGNED-NEXT: [[TMP0:%.*]] = load i16, i16* @suf, align 2
|
|
// SIGNED-NEXT: [[TMP1:%.*]] = call i16 @llvm.uadd.sat.i16(i16 [[TMP0]], i16 -1)
|
|
// SIGNED-NEXT: store i16 [[TMP1]], i16* @suf, align 2
|
|
// SIGNED-NEXT: ret void
|
|
//
|
|
// UNSIGNED-LABEL: @inc_suf(
|
|
// UNSIGNED-NEXT: entry:
|
|
// UNSIGNED-NEXT: [[TMP0:%.*]] = load i16, i16* @suf, align 2
|
|
// UNSIGNED-NEXT: [[TMP1:%.*]] = call i16 @llvm.sadd.sat.i16(i16 [[TMP0]], i16 32767)
|
|
// UNSIGNED-NEXT: [[RESIZE:%.*]] = trunc i16 [[TMP1]] to i15
|
|
// UNSIGNED-NEXT: [[RESIZE1:%.*]] = zext i15 [[RESIZE]] to i16
|
|
// UNSIGNED-NEXT: store i16 [[RESIZE1]], i16* @suf, align 2
|
|
// UNSIGNED-NEXT: ret void
|
|
//
|
|
void inc_suf() {
|
|
suf++;
|
|
}
|
|
|
|
|
|
// CHECK-LABEL: @dec_a(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* @a, align 4
|
|
// CHECK-NEXT: [[TMP1:%.*]] = add i32 [[TMP0]], -32768
|
|
// CHECK-NEXT: store i32 [[TMP1]], i32* @a, align 4
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void dec_a() {
|
|
a--;
|
|
}
|
|
|
|
// CHECK-LABEL: @dec_f(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i16, i16* @f, align 2
|
|
// CHECK-NEXT: [[TMP1:%.*]] = add i16 [[TMP0]], -32768
|
|
// CHECK-NEXT: store i16 [[TMP1]], i16* @f, align 2
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void dec_f() {
|
|
f--;
|
|
}
|
|
|
|
// CHECK-LABEL: @dec_lf(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* @lf, align 4
|
|
// CHECK-NEXT: [[TMP1:%.*]] = add i32 [[TMP0]], -2147483648
|
|
// CHECK-NEXT: store i32 [[TMP1]], i32* @lf, align 4
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void dec_lf() {
|
|
lf--;
|
|
}
|
|
|
|
// SIGNED-LABEL: @dec_ua(
|
|
// SIGNED-NEXT: entry:
|
|
// SIGNED-NEXT: [[TMP0:%.*]] = load i32, i32* @ua, align 4
|
|
// SIGNED-NEXT: [[TMP1:%.*]] = sub i32 [[TMP0]], 65536
|
|
// SIGNED-NEXT: store i32 [[TMP1]], i32* @ua, align 4
|
|
// SIGNED-NEXT: ret void
|
|
//
|
|
// UNSIGNED-LABEL: @dec_ua(
|
|
// UNSIGNED-NEXT: entry:
|
|
// UNSIGNED-NEXT: [[TMP0:%.*]] = load i32, i32* @ua, align 4
|
|
// UNSIGNED-NEXT: [[TMP1:%.*]] = sub i32 [[TMP0]], 32768
|
|
// UNSIGNED-NEXT: store i32 [[TMP1]], i32* @ua, align 4
|
|
// UNSIGNED-NEXT: ret void
|
|
//
|
|
void dec_ua() {
|
|
ua--;
|
|
}
|
|
|
|
// SIGNED-LABEL: @dec_usa(
|
|
// SIGNED-NEXT: entry:
|
|
// SIGNED-NEXT: [[TMP0:%.*]] = load i16, i16* @usa, align 2
|
|
// SIGNED-NEXT: [[TMP1:%.*]] = sub i16 [[TMP0]], 256
|
|
// SIGNED-NEXT: store i16 [[TMP1]], i16* @usa, align 2
|
|
// SIGNED-NEXT: ret void
|
|
//
|
|
// UNSIGNED-LABEL: @dec_usa(
|
|
// UNSIGNED-NEXT: entry:
|
|
// UNSIGNED-NEXT: [[TMP0:%.*]] = load i16, i16* @usa, align 2
|
|
// UNSIGNED-NEXT: [[TMP1:%.*]] = sub i16 [[TMP0]], 128
|
|
// UNSIGNED-NEXT: store i16 [[TMP1]], i16* @usa, align 2
|
|
// UNSIGNED-NEXT: ret void
|
|
//
|
|
void dec_usa() {
|
|
usa--;
|
|
}
|
|
|
|
// SIGNED-LABEL: @dec_uf(
|
|
// SIGNED-NEXT: entry:
|
|
// SIGNED-NEXT: [[TMP0:%.*]] = load i16, i16* @uf, align 2
|
|
// SIGNED-NEXT: [[TMP1:%.*]] = sub i16 [[TMP0]], poison
|
|
// SIGNED-NEXT: store i16 [[TMP1]], i16* @uf, align 2
|
|
// SIGNED-NEXT: ret void
|
|
//
|
|
// UNSIGNED-LABEL: @dec_uf(
|
|
// UNSIGNED-NEXT: entry:
|
|
// UNSIGNED-NEXT: [[TMP0:%.*]] = load i16, i16* @uf, align 2
|
|
// UNSIGNED-NEXT: [[TMP1:%.*]] = sub i16 [[TMP0]], -32768
|
|
// UNSIGNED-NEXT: store i16 [[TMP1]], i16* @uf, align 2
|
|
// UNSIGNED-NEXT: ret void
|
|
//
|
|
void dec_uf() {
|
|
uf--;
|
|
}
|
|
|
|
// CHECK-LABEL: @dec_sa(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* @sa, align 4
|
|
// CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.sadd.sat.i32(i32 [[TMP0]], i32 -32768)
|
|
// CHECK-NEXT: store i32 [[TMP1]], i32* @sa, align 4
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void dec_sa() {
|
|
sa--;
|
|
}
|
|
|
|
// CHECK-LABEL: @dec_sf(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i16, i16* @sf, align 2
|
|
// CHECK-NEXT: [[TMP1:%.*]] = call i16 @llvm.sadd.sat.i16(i16 [[TMP0]], i16 -32768)
|
|
// CHECK-NEXT: store i16 [[TMP1]], i16* @sf, align 2
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void dec_sf() {
|
|
sf--;
|
|
}
|
|
|
|
// CHECK-LABEL: @dec_slf(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* @slf, align 4
|
|
// CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.sadd.sat.i32(i32 [[TMP0]], i32 -2147483648)
|
|
// CHECK-NEXT: store i32 [[TMP1]], i32* @slf, align 4
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void dec_slf() {
|
|
slf--;
|
|
}
|
|
|
|
// SIGNED-LABEL: @dec_sua(
|
|
// SIGNED-NEXT: entry:
|
|
// SIGNED-NEXT: [[TMP0:%.*]] = load i32, i32* @sua, align 4
|
|
// SIGNED-NEXT: [[TMP1:%.*]] = call i32 @llvm.usub.sat.i32(i32 [[TMP0]], i32 65536)
|
|
// SIGNED-NEXT: store i32 [[TMP1]], i32* @sua, align 4
|
|
// SIGNED-NEXT: ret void
|
|
//
|
|
// UNSIGNED-LABEL: @dec_sua(
|
|
// UNSIGNED-NEXT: entry:
|
|
// UNSIGNED-NEXT: [[TMP0:%.*]] = load i32, i32* @sua, align 4
|
|
// UNSIGNED-NEXT: [[TMP1:%.*]] = call i32 @llvm.ssub.sat.i32(i32 [[TMP0]], i32 32768)
|
|
// UNSIGNED-NEXT: [[TMP2:%.*]] = icmp slt i32 [[TMP1]], 0
|
|
// UNSIGNED-NEXT: [[SATMIN:%.*]] = select i1 [[TMP2]], i32 0, i32 [[TMP1]]
|
|
// UNSIGNED-NEXT: [[RESIZE:%.*]] = trunc i32 [[SATMIN]] to i31
|
|
// UNSIGNED-NEXT: [[RESIZE1:%.*]] = zext i31 [[RESIZE]] to i32
|
|
// UNSIGNED-NEXT: store i32 [[RESIZE1]], i32* @sua, align 4
|
|
// UNSIGNED-NEXT: ret void
|
|
//
|
|
void dec_sua() {
|
|
sua--;
|
|
}
|
|
|
|
// SIGNED-LABEL: @dec_susa(
|
|
// SIGNED-NEXT: entry:
|
|
// SIGNED-NEXT: [[TMP0:%.*]] = load i16, i16* @susa, align 2
|
|
// SIGNED-NEXT: [[TMP1:%.*]] = call i16 @llvm.usub.sat.i16(i16 [[TMP0]], i16 256)
|
|
// SIGNED-NEXT: store i16 [[TMP1]], i16* @susa, align 2
|
|
// SIGNED-NEXT: ret void
|
|
//
|
|
// UNSIGNED-LABEL: @dec_susa(
|
|
// UNSIGNED-NEXT: entry:
|
|
// UNSIGNED-NEXT: [[TMP0:%.*]] = load i16, i16* @susa, align 2
|
|
// UNSIGNED-NEXT: [[TMP1:%.*]] = call i16 @llvm.ssub.sat.i16(i16 [[TMP0]], i16 128)
|
|
// UNSIGNED-NEXT: [[TMP2:%.*]] = icmp slt i16 [[TMP1]], 0
|
|
// UNSIGNED-NEXT: [[SATMIN:%.*]] = select i1 [[TMP2]], i16 0, i16 [[TMP1]]
|
|
// UNSIGNED-NEXT: [[RESIZE:%.*]] = trunc i16 [[SATMIN]] to i15
|
|
// UNSIGNED-NEXT: [[RESIZE1:%.*]] = zext i15 [[RESIZE]] to i16
|
|
// UNSIGNED-NEXT: store i16 [[RESIZE1]], i16* @susa, align 2
|
|
// UNSIGNED-NEXT: ret void
|
|
//
|
|
void dec_susa() {
|
|
susa--;
|
|
}
|
|
|
|
// SIGNED-LABEL: @dec_suf(
|
|
// SIGNED-NEXT: entry:
|
|
// SIGNED-NEXT: [[TMP0:%.*]] = load i16, i16* @suf, align 2
|
|
// SIGNED-NEXT: [[TMP1:%.*]] = call i16 @llvm.usub.sat.i16(i16 [[TMP0]], i16 -1)
|
|
// SIGNED-NEXT: store i16 [[TMP1]], i16* @suf, align 2
|
|
// SIGNED-NEXT: ret void
|
|
//
|
|
// UNSIGNED-LABEL: @dec_suf(
|
|
// UNSIGNED-NEXT: entry:
|
|
// UNSIGNED-NEXT: [[TMP0:%.*]] = load i16, i16* @suf, align 2
|
|
// UNSIGNED-NEXT: [[TMP1:%.*]] = call i16 @llvm.ssub.sat.i16(i16 [[TMP0]], i16 32767)
|
|
// UNSIGNED-NEXT: [[TMP2:%.*]] = icmp slt i16 [[TMP1]], 0
|
|
// UNSIGNED-NEXT: [[SATMIN:%.*]] = select i1 [[TMP2]], i16 0, i16 [[TMP1]]
|
|
// UNSIGNED-NEXT: [[RESIZE:%.*]] = trunc i16 [[SATMIN]] to i15
|
|
// UNSIGNED-NEXT: [[RESIZE1:%.*]] = zext i15 [[RESIZE]] to i16
|
|
// UNSIGNED-NEXT: store i16 [[RESIZE1]], i16* @suf, align 2
|
|
// UNSIGNED-NEXT: ret void
|
|
//
|
|
void dec_suf() {
|
|
suf--;
|
|
}
|
|
|
|
|
|
// CHECK-LABEL: @neg_a(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* @a, align 4
|
|
// CHECK-NEXT: [[TMP1:%.*]] = sub i32 0, [[TMP0]]
|
|
// CHECK-NEXT: store i32 [[TMP1]], i32* @a, align 4
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void neg_a() {
|
|
a = -a;
|
|
}
|
|
|
|
// CHECK-LABEL: @neg_f(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i16, i16* @f, align 2
|
|
// CHECK-NEXT: [[TMP1:%.*]] = sub i16 0, [[TMP0]]
|
|
// CHECK-NEXT: store i16 [[TMP1]], i16* @f, align 2
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void neg_f() {
|
|
f = -f;
|
|
}
|
|
|
|
// CHECK-LABEL: @neg_usa(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i16, i16* @usa, align 2
|
|
// CHECK-NEXT: [[TMP1:%.*]] = sub i16 0, [[TMP0]]
|
|
// CHECK-NEXT: store i16 [[TMP1]], i16* @usa, align 2
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void neg_usa() {
|
|
usa = -usa;
|
|
}
|
|
|
|
// CHECK-LABEL: @neg_uf(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i16, i16* @uf, align 2
|
|
// CHECK-NEXT: [[TMP1:%.*]] = sub i16 0, [[TMP0]]
|
|
// CHECK-NEXT: store i16 [[TMP1]], i16* @uf, align 2
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void neg_uf() {
|
|
uf = -uf;
|
|
}
|
|
|
|
// CHECK-LABEL: @neg_sa(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* @sa, align 4
|
|
// CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.ssub.sat.i32(i32 0, i32 [[TMP0]])
|
|
// CHECK-NEXT: store i32 [[TMP1]], i32* @sa, align 4
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void neg_sa() {
|
|
sa = -sa;
|
|
}
|
|
|
|
// CHECK-LABEL: @neg_sf(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i16, i16* @sf, align 2
|
|
// CHECK-NEXT: [[TMP1:%.*]] = call i16 @llvm.ssub.sat.i16(i16 0, i16 [[TMP0]])
|
|
// CHECK-NEXT: store i16 [[TMP1]], i16* @sf, align 2
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void neg_sf() {
|
|
sf = -sf;
|
|
}
|
|
|
|
// SIGNED-LABEL: @neg_susa(
|
|
// SIGNED-NEXT: entry:
|
|
// SIGNED-NEXT: [[TMP0:%.*]] = load i16, i16* @susa, align 2
|
|
// SIGNED-NEXT: [[TMP1:%.*]] = call i16 @llvm.usub.sat.i16(i16 0, i16 [[TMP0]])
|
|
// SIGNED-NEXT: store i16 [[TMP1]], i16* @susa, align 2
|
|
// SIGNED-NEXT: ret void
|
|
//
|
|
// UNSIGNED-LABEL: @neg_susa(
|
|
// UNSIGNED-NEXT: entry:
|
|
// UNSIGNED-NEXT: [[TMP0:%.*]] = load i16, i16* @susa, align 2
|
|
// UNSIGNED-NEXT: [[TMP1:%.*]] = call i16 @llvm.ssub.sat.i16(i16 0, i16 [[TMP0]])
|
|
// UNSIGNED-NEXT: [[TMP2:%.*]] = icmp slt i16 [[TMP1]], 0
|
|
// UNSIGNED-NEXT: [[SATMIN:%.*]] = select i1 [[TMP2]], i16 0, i16 [[TMP1]]
|
|
// UNSIGNED-NEXT: [[RESIZE:%.*]] = trunc i16 [[SATMIN]] to i15
|
|
// UNSIGNED-NEXT: [[RESIZE1:%.*]] = zext i15 [[RESIZE]] to i16
|
|
// UNSIGNED-NEXT: store i16 [[RESIZE1]], i16* @susa, align 2
|
|
// UNSIGNED-NEXT: ret void
|
|
//
|
|
void neg_susa() {
|
|
susa = -susa;
|
|
}
|
|
|
|
// SIGNED-LABEL: @neg_suf(
|
|
// SIGNED-NEXT: entry:
|
|
// SIGNED-NEXT: [[TMP0:%.*]] = load i16, i16* @suf, align 2
|
|
// SIGNED-NEXT: [[TMP1:%.*]] = call i16 @llvm.usub.sat.i16(i16 0, i16 [[TMP0]])
|
|
// SIGNED-NEXT: store i16 [[TMP1]], i16* @suf, align 2
|
|
// SIGNED-NEXT: ret void
|
|
//
|
|
// UNSIGNED-LABEL: @neg_suf(
|
|
// UNSIGNED-NEXT: entry:
|
|
// UNSIGNED-NEXT: [[TMP0:%.*]] = load i16, i16* @suf, align 2
|
|
// UNSIGNED-NEXT: [[TMP1:%.*]] = call i16 @llvm.ssub.sat.i16(i16 0, i16 [[TMP0]])
|
|
// UNSIGNED-NEXT: [[TMP2:%.*]] = icmp slt i16 [[TMP1]], 0
|
|
// UNSIGNED-NEXT: [[SATMIN:%.*]] = select i1 [[TMP2]], i16 0, i16 [[TMP1]]
|
|
// UNSIGNED-NEXT: [[RESIZE:%.*]] = trunc i16 [[SATMIN]] to i15
|
|
// UNSIGNED-NEXT: [[RESIZE1:%.*]] = zext i15 [[RESIZE]] to i16
|
|
// UNSIGNED-NEXT: store i16 [[RESIZE1]], i16* @suf, align 2
|
|
// UNSIGNED-NEXT: ret void
|
|
//
|
|
void neg_suf() {
|
|
suf = -suf;
|
|
}
|
|
|
|
|
|
// CHECK-LABEL: @plus_a(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* @a, align 4
|
|
// CHECK-NEXT: store i32 [[TMP0]], i32* @a, align 4
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void plus_a() {
|
|
a = +a;
|
|
}
|
|
|
|
// CHECK-LABEL: @plus_uf(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i16, i16* @uf, align 2
|
|
// CHECK-NEXT: store i16 [[TMP0]], i16* @uf, align 2
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void plus_uf() {
|
|
uf = +uf;
|
|
}
|
|
|
|
// CHECK-LABEL: @plus_sa(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* @sa, align 4
|
|
// CHECK-NEXT: store i32 [[TMP0]], i32* @sa, align 4
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void plus_sa() {
|
|
sa = +sa;
|
|
}
|
|
|
|
|
|
// CHECK-LABEL: @not_a(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* @a, align 4
|
|
// CHECK-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP0]], 0
|
|
// CHECK-NEXT: [[LNOT:%.*]] = xor i1 [[TOBOOL]], true
|
|
// CHECK-NEXT: [[LNOT_EXT:%.*]] = zext i1 [[LNOT]] to i32
|
|
// CHECK-NEXT: store i32 [[LNOT_EXT]], i32* @i, align 4
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void not_a() {
|
|
i = !a;
|
|
}
|
|
|
|
// CHECK-LABEL: @not_uf(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i16, i16* @uf, align 2
|
|
// CHECK-NEXT: [[TOBOOL:%.*]] = icmp ne i16 [[TMP0]], 0
|
|
// CHECK-NEXT: [[LNOT:%.*]] = xor i1 [[TOBOOL]], true
|
|
// CHECK-NEXT: [[LNOT_EXT:%.*]] = zext i1 [[LNOT]] to i32
|
|
// CHECK-NEXT: store i32 [[LNOT_EXT]], i32* @i, align 4
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void not_uf() {
|
|
i = !uf;
|
|
}
|
|
|
|
// CHECK-LABEL: @not_susa(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i16, i16* @susa, align 2
|
|
// CHECK-NEXT: [[TOBOOL:%.*]] = icmp ne i16 [[TMP0]], 0
|
|
// CHECK-NEXT: [[LNOT:%.*]] = xor i1 [[TOBOOL]], true
|
|
// CHECK-NEXT: [[LNOT_EXT:%.*]] = zext i1 [[LNOT]] to i32
|
|
// CHECK-NEXT: store i32 [[LNOT_EXT]], i32* @i, align 4
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void not_susa() {
|
|
i = !susa;
|
|
}
|