You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
581 lines
18 KiB
581 lines
18 KiB
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
|
|
// RUN: %clang_cc1 -ffixed-point -triple x86_64-unknown-linux-gnu -S -emit-llvm %s -o - | FileCheck %s --check-prefixes=CHECK,SIGNED
|
|
// RUN: %clang_cc1 -ffixed-point -triple x86_64-unknown-linux-gnu -fpadding-on-unsigned-fixed-point -S -emit-llvm %s -o - | FileCheck %s --check-prefixes=CHECK,UNSIGNED
|
|
|
|
short _Accum sa;
|
|
_Accum a;
|
|
long _Accum la;
|
|
|
|
short _Fract sf;
|
|
_Fract f;
|
|
long _Fract lf;
|
|
|
|
unsigned short _Accum usa;
|
|
unsigned _Accum ua;
|
|
unsigned long _Accum ula;
|
|
|
|
unsigned short _Fract usf;
|
|
unsigned _Fract uf;
|
|
unsigned long _Fract ulf;
|
|
|
|
_Sat short _Accum sa_sat;
|
|
_Sat _Accum a_sat;
|
|
|
|
_Sat short _Fract sf_sat;
|
|
_Sat _Fract f_sat;
|
|
|
|
_Sat unsigned short _Accum usa_sat;
|
|
_Sat unsigned _Accum ua_sat;
|
|
|
|
_Sat unsigned short _Fract usf_sat;
|
|
_Sat unsigned _Fract uf_sat;
|
|
|
|
int i;
|
|
unsigned u;
|
|
|
|
|
|
// CHECK-LABEL: @sleft_sasai(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i16, i16* @sa, align 2
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* @i, align 4
|
|
// CHECK-NEXT: [[TMP2:%.*]] = trunc i32 [[TMP1]] to i16
|
|
// CHECK-NEXT: [[TMP3:%.*]] = shl i16 [[TMP0]], [[TMP2]]
|
|
// CHECK-NEXT: store i16 [[TMP3]], i16* @sa, align 2
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void sleft_sasai() {
|
|
sa = sa << i;
|
|
}
|
|
|
|
// CHECK-LABEL: @sleft_aai(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* @a, align 4
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* @i, align 4
|
|
// CHECK-NEXT: [[TMP2:%.*]] = shl i32 [[TMP0]], [[TMP1]]
|
|
// CHECK-NEXT: store i32 [[TMP2]], i32* @a, align 4
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void sleft_aai() {
|
|
a = a << i;
|
|
}
|
|
|
|
// CHECK-LABEL: @sleft_lalai(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i64, i64* @la, align 8
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* @i, align 4
|
|
// CHECK-NEXT: [[TMP2:%.*]] = zext i32 [[TMP1]] to i64
|
|
// CHECK-NEXT: [[TMP3:%.*]] = shl i64 [[TMP0]], [[TMP2]]
|
|
// CHECK-NEXT: store i64 [[TMP3]], i64* @la, align 8
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void sleft_lalai() {
|
|
la = la << i;
|
|
}
|
|
|
|
// CHECK-LABEL: @sleft_sfsfi(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i8, i8* @sf, align 1
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* @i, align 4
|
|
// CHECK-NEXT: [[TMP2:%.*]] = trunc i32 [[TMP1]] to i8
|
|
// CHECK-NEXT: [[TMP3:%.*]] = shl i8 [[TMP0]], [[TMP2]]
|
|
// CHECK-NEXT: store i8 [[TMP3]], i8* @sf, align 1
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void sleft_sfsfi() {
|
|
sf = sf << i;
|
|
}
|
|
|
|
// CHECK-LABEL: @sleft_ffi(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i16, i16* @f, align 2
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* @i, align 4
|
|
// CHECK-NEXT: [[TMP2:%.*]] = trunc i32 [[TMP1]] to i16
|
|
// CHECK-NEXT: [[TMP3:%.*]] = shl i16 [[TMP0]], [[TMP2]]
|
|
// CHECK-NEXT: store i16 [[TMP3]], i16* @f, align 2
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void sleft_ffi() {
|
|
f = f << i;
|
|
}
|
|
|
|
// CHECK-LABEL: @sleft_lflfi(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* @lf, align 4
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* @i, align 4
|
|
// CHECK-NEXT: [[TMP2:%.*]] = shl i32 [[TMP0]], [[TMP1]]
|
|
// CHECK-NEXT: store i32 [[TMP2]], i32* @lf, align 4
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void sleft_lflfi() {
|
|
lf = lf << i;
|
|
}
|
|
|
|
// CHECK-LABEL: @sleft_aau(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* @a, align 4
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* @u, align 4
|
|
// CHECK-NEXT: [[TMP2:%.*]] = shl i32 [[TMP0]], [[TMP1]]
|
|
// CHECK-NEXT: store i32 [[TMP2]], i32* @a, align 4
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void sleft_aau() {
|
|
a = a << u;
|
|
}
|
|
|
|
// CHECK-LABEL: @sleft_ffu(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i16, i16* @f, align 2
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* @u, align 4
|
|
// CHECK-NEXT: [[TMP2:%.*]] = trunc i32 [[TMP1]] to i16
|
|
// CHECK-NEXT: [[TMP3:%.*]] = shl i16 [[TMP0]], [[TMP2]]
|
|
// CHECK-NEXT: store i16 [[TMP3]], i16* @f, align 2
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void sleft_ffu() {
|
|
f = f << u;
|
|
}
|
|
|
|
|
|
// CHECK-LABEL: @uleft_usausai(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i16, i16* @usa, align 2
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* @i, align 4
|
|
// CHECK-NEXT: [[TMP2:%.*]] = trunc i32 [[TMP1]] to i16
|
|
// CHECK-NEXT: [[TMP3:%.*]] = shl i16 [[TMP0]], [[TMP2]]
|
|
// CHECK-NEXT: store i16 [[TMP3]], i16* @usa, align 2
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void uleft_usausai() {
|
|
usa = usa << i;
|
|
}
|
|
|
|
// CHECK-LABEL: @uleft_uauai(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* @ua, align 4
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* @i, align 4
|
|
// CHECK-NEXT: [[TMP2:%.*]] = shl i32 [[TMP0]], [[TMP1]]
|
|
// CHECK-NEXT: store i32 [[TMP2]], i32* @ua, align 4
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void uleft_uauai() {
|
|
ua = ua << i;
|
|
}
|
|
|
|
// CHECK-LABEL: @uleft_ulaulai(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i64, i64* @ula, align 8
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* @i, align 4
|
|
// CHECK-NEXT: [[TMP2:%.*]] = zext i32 [[TMP1]] to i64
|
|
// CHECK-NEXT: [[TMP3:%.*]] = shl i64 [[TMP0]], [[TMP2]]
|
|
// CHECK-NEXT: store i64 [[TMP3]], i64* @ula, align 8
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void uleft_ulaulai() {
|
|
ula = ula << i;
|
|
}
|
|
|
|
// CHECK-LABEL: @uleft_usfusfi(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i8, i8* @usf, align 1
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* @i, align 4
|
|
// CHECK-NEXT: [[TMP2:%.*]] = trunc i32 [[TMP1]] to i8
|
|
// CHECK-NEXT: [[TMP3:%.*]] = shl i8 [[TMP0]], [[TMP2]]
|
|
// CHECK-NEXT: store i8 [[TMP3]], i8* @usf, align 1
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void uleft_usfusfi() {
|
|
usf = usf << i;
|
|
}
|
|
|
|
// CHECK-LABEL: @uleft_ufufi(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i16, i16* @uf, align 2
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* @i, align 4
|
|
// CHECK-NEXT: [[TMP2:%.*]] = trunc i32 [[TMP1]] to i16
|
|
// CHECK-NEXT: [[TMP3:%.*]] = shl i16 [[TMP0]], [[TMP2]]
|
|
// CHECK-NEXT: store i16 [[TMP3]], i16* @uf, align 2
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void uleft_ufufi() {
|
|
uf = uf << i;
|
|
}
|
|
|
|
// CHECK-LABEL: @uleft_ulfulfi(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* @ulf, align 4
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* @i, align 4
|
|
// CHECK-NEXT: [[TMP2:%.*]] = shl i32 [[TMP0]], [[TMP1]]
|
|
// CHECK-NEXT: store i32 [[TMP2]], i32* @ulf, align 4
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void uleft_ulfulfi() {
|
|
ulf = ulf << i;
|
|
}
|
|
|
|
// CHECK-LABEL: @uleft_uauau(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* @ua, align 4
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* @u, align 4
|
|
// CHECK-NEXT: [[TMP2:%.*]] = shl i32 [[TMP0]], [[TMP1]]
|
|
// CHECK-NEXT: store i32 [[TMP2]], i32* @ua, align 4
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void uleft_uauau() {
|
|
ua = ua << u;
|
|
}
|
|
|
|
// CHECK-LABEL: @uleft_ufufu(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i16, i16* @uf, align 2
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* @u, align 4
|
|
// CHECK-NEXT: [[TMP2:%.*]] = trunc i32 [[TMP1]] to i16
|
|
// CHECK-NEXT: [[TMP3:%.*]] = shl i16 [[TMP0]], [[TMP2]]
|
|
// CHECK-NEXT: store i16 [[TMP3]], i16* @uf, align 2
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void uleft_ufufu() {
|
|
uf = uf << u;
|
|
}
|
|
|
|
|
|
// CHECK-LABEL: @sright_sasai(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i16, i16* @sa, align 2
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* @i, align 4
|
|
// CHECK-NEXT: [[TMP2:%.*]] = trunc i32 [[TMP1]] to i16
|
|
// CHECK-NEXT: [[TMP3:%.*]] = ashr i16 [[TMP0]], [[TMP2]]
|
|
// CHECK-NEXT: store i16 [[TMP3]], i16* @sa, align 2
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void sright_sasai() {
|
|
sa = sa >> i;
|
|
}
|
|
|
|
// CHECK-LABEL: @sright_aai(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* @a, align 4
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* @i, align 4
|
|
// CHECK-NEXT: [[TMP2:%.*]] = ashr i32 [[TMP0]], [[TMP1]]
|
|
// CHECK-NEXT: store i32 [[TMP2]], i32* @a, align 4
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void sright_aai() {
|
|
a = a >> i;
|
|
}
|
|
|
|
// CHECK-LABEL: @sright_lalai(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i64, i64* @la, align 8
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* @i, align 4
|
|
// CHECK-NEXT: [[TMP2:%.*]] = zext i32 [[TMP1]] to i64
|
|
// CHECK-NEXT: [[TMP3:%.*]] = ashr i64 [[TMP0]], [[TMP2]]
|
|
// CHECK-NEXT: store i64 [[TMP3]], i64* @la, align 8
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void sright_lalai() {
|
|
la = la >> i;
|
|
}
|
|
|
|
// CHECK-LABEL: @sright_sfsfi(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i8, i8* @sf, align 1
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* @i, align 4
|
|
// CHECK-NEXT: [[TMP2:%.*]] = trunc i32 [[TMP1]] to i8
|
|
// CHECK-NEXT: [[TMP3:%.*]] = ashr i8 [[TMP0]], [[TMP2]]
|
|
// CHECK-NEXT: store i8 [[TMP3]], i8* @sf, align 1
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void sright_sfsfi() {
|
|
sf = sf >> i;
|
|
}
|
|
|
|
// CHECK-LABEL: @sright_ffi(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i16, i16* @f, align 2
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* @i, align 4
|
|
// CHECK-NEXT: [[TMP2:%.*]] = trunc i32 [[TMP1]] to i16
|
|
// CHECK-NEXT: [[TMP3:%.*]] = ashr i16 [[TMP0]], [[TMP2]]
|
|
// CHECK-NEXT: store i16 [[TMP3]], i16* @f, align 2
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void sright_ffi() {
|
|
f = f >> i;
|
|
}
|
|
|
|
// CHECK-LABEL: @sright_lflfi(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* @lf, align 4
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* @i, align 4
|
|
// CHECK-NEXT: [[TMP2:%.*]] = ashr i32 [[TMP0]], [[TMP1]]
|
|
// CHECK-NEXT: store i32 [[TMP2]], i32* @lf, align 4
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void sright_lflfi() {
|
|
lf = lf >> i;
|
|
}
|
|
|
|
// CHECK-LABEL: @sright_aau(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* @a, align 4
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* @u, align 4
|
|
// CHECK-NEXT: [[TMP2:%.*]] = ashr i32 [[TMP0]], [[TMP1]]
|
|
// CHECK-NEXT: store i32 [[TMP2]], i32* @a, align 4
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void sright_aau() {
|
|
a = a >> u;
|
|
}
|
|
|
|
// CHECK-LABEL: @sright_ffu(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i16, i16* @f, align 2
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* @u, align 4
|
|
// CHECK-NEXT: [[TMP2:%.*]] = trunc i32 [[TMP1]] to i16
|
|
// CHECK-NEXT: [[TMP3:%.*]] = ashr i16 [[TMP0]], [[TMP2]]
|
|
// CHECK-NEXT: store i16 [[TMP3]], i16* @f, align 2
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void sright_ffu() {
|
|
f = f >> u;
|
|
}
|
|
|
|
|
|
// CHECK-LABEL: @uright_usausai(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i16, i16* @usa, align 2
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* @i, align 4
|
|
// CHECK-NEXT: [[TMP2:%.*]] = trunc i32 [[TMP1]] to i16
|
|
// CHECK-NEXT: [[TMP3:%.*]] = lshr i16 [[TMP0]], [[TMP2]]
|
|
// CHECK-NEXT: store i16 [[TMP3]], i16* @usa, align 2
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void uright_usausai() {
|
|
usa = usa >> i;
|
|
}
|
|
|
|
// CHECK-LABEL: @uright_uauai(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* @ua, align 4
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* @i, align 4
|
|
// CHECK-NEXT: [[TMP2:%.*]] = lshr i32 [[TMP0]], [[TMP1]]
|
|
// CHECK-NEXT: store i32 [[TMP2]], i32* @ua, align 4
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void uright_uauai() {
|
|
ua = ua >> i;
|
|
}
|
|
|
|
// CHECK-LABEL: @uright_ulaulai(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i64, i64* @ula, align 8
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* @i, align 4
|
|
// CHECK-NEXT: [[TMP2:%.*]] = zext i32 [[TMP1]] to i64
|
|
// CHECK-NEXT: [[TMP3:%.*]] = lshr i64 [[TMP0]], [[TMP2]]
|
|
// CHECK-NEXT: store i64 [[TMP3]], i64* @ula, align 8
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void uright_ulaulai() {
|
|
ula = ula >> i;
|
|
}
|
|
|
|
// CHECK-LABEL: @uright_usfusfi(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i8, i8* @usf, align 1
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* @i, align 4
|
|
// CHECK-NEXT: [[TMP2:%.*]] = trunc i32 [[TMP1]] to i8
|
|
// CHECK-NEXT: [[TMP3:%.*]] = lshr i8 [[TMP0]], [[TMP2]]
|
|
// CHECK-NEXT: store i8 [[TMP3]], i8* @usf, align 1
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void uright_usfusfi() {
|
|
usf = usf >> i;
|
|
}
|
|
|
|
// CHECK-LABEL: @uright_ufufi(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i16, i16* @uf, align 2
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* @i, align 4
|
|
// CHECK-NEXT: [[TMP2:%.*]] = trunc i32 [[TMP1]] to i16
|
|
// CHECK-NEXT: [[TMP3:%.*]] = lshr i16 [[TMP0]], [[TMP2]]
|
|
// CHECK-NEXT: store i16 [[TMP3]], i16* @uf, align 2
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void uright_ufufi() {
|
|
uf = uf >> i;
|
|
}
|
|
|
|
// CHECK-LABEL: @uright_ulfulfi(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* @ulf, align 4
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* @i, align 4
|
|
// CHECK-NEXT: [[TMP2:%.*]] = lshr i32 [[TMP0]], [[TMP1]]
|
|
// CHECK-NEXT: store i32 [[TMP2]], i32* @ulf, align 4
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void uright_ulfulfi() {
|
|
ulf = ulf >> i;
|
|
}
|
|
|
|
// CHECK-LABEL: @uright_uauau(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* @ua, align 4
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* @u, align 4
|
|
// CHECK-NEXT: [[TMP2:%.*]] = lshr i32 [[TMP0]], [[TMP1]]
|
|
// CHECK-NEXT: store i32 [[TMP2]], i32* @ua, align 4
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void uright_uauau() {
|
|
ua = ua >> u;
|
|
}
|
|
|
|
// CHECK-LABEL: @uright_ufufu(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i16, i16* @uf, align 2
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* @u, align 4
|
|
// CHECK-NEXT: [[TMP2:%.*]] = trunc i32 [[TMP1]] to i16
|
|
// CHECK-NEXT: [[TMP3:%.*]] = lshr i16 [[TMP0]], [[TMP2]]
|
|
// CHECK-NEXT: store i16 [[TMP3]], i16* @uf, align 2
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void uright_ufufu() {
|
|
uf = uf >> u;
|
|
}
|
|
|
|
|
|
// CHECK-LABEL: @satleft_sassasi(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i16, i16* @sa_sat, align 2
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* @i, align 4
|
|
// CHECK-NEXT: [[TMP2:%.*]] = trunc i32 [[TMP1]] to i16
|
|
// CHECK-NEXT: [[TMP3:%.*]] = call i16 @llvm.sshl.sat.i16(i16 [[TMP0]], i16 [[TMP2]])
|
|
// CHECK-NEXT: store i16 [[TMP3]], i16* @sa_sat, align 2
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void satleft_sassasi() {
|
|
sa_sat = sa_sat << i;
|
|
}
|
|
|
|
// CHECK-LABEL: @satleft_asasi(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* @a_sat, align 4
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* @i, align 4
|
|
// CHECK-NEXT: [[TMP2:%.*]] = call i32 @llvm.sshl.sat.i32(i32 [[TMP0]], i32 [[TMP1]])
|
|
// CHECK-NEXT: store i32 [[TMP2]], i32* @a_sat, align 4
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void satleft_asasi() {
|
|
a_sat = a_sat << i;
|
|
}
|
|
|
|
// CHECK-LABEL: @satleft_sfssfsi(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i8, i8* @sf_sat, align 1
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* @i, align 4
|
|
// CHECK-NEXT: [[TMP2:%.*]] = trunc i32 [[TMP1]] to i8
|
|
// CHECK-NEXT: [[TMP3:%.*]] = call i8 @llvm.sshl.sat.i8(i8 [[TMP0]], i8 [[TMP2]])
|
|
// CHECK-NEXT: store i8 [[TMP3]], i8* @sf_sat, align 1
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void satleft_sfssfsi() {
|
|
sf_sat = sf_sat << i;
|
|
}
|
|
|
|
// CHECK-LABEL: @satleft_fsfsi(
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[TMP0:%.*]] = load i16, i16* @f_sat, align 2
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* @i, align 4
|
|
// CHECK-NEXT: [[TMP2:%.*]] = trunc i32 [[TMP1]] to i16
|
|
// CHECK-NEXT: [[TMP3:%.*]] = call i16 @llvm.sshl.sat.i16(i16 [[TMP0]], i16 [[TMP2]])
|
|
// CHECK-NEXT: store i16 [[TMP3]], i16* @f_sat, align 2
|
|
// CHECK-NEXT: ret void
|
|
//
|
|
void satleft_fsfsi() {
|
|
f_sat = f_sat << i;
|
|
}
|
|
|
|
// SIGNED-LABEL: @satleft_usasusasi(
|
|
// SIGNED-NEXT: entry:
|
|
// SIGNED-NEXT: [[TMP0:%.*]] = load i16, i16* @usa_sat, align 2
|
|
// SIGNED-NEXT: [[TMP1:%.*]] = load i32, i32* @i, align 4
|
|
// SIGNED-NEXT: [[TMP2:%.*]] = trunc i32 [[TMP1]] to i16
|
|
// SIGNED-NEXT: [[TMP3:%.*]] = call i16 @llvm.ushl.sat.i16(i16 [[TMP0]], i16 [[TMP2]])
|
|
// SIGNED-NEXT: store i16 [[TMP3]], i16* @usa_sat, align 2
|
|
// SIGNED-NEXT: ret void
|
|
//
|
|
// UNSIGNED-LABEL: @satleft_usasusasi(
|
|
// UNSIGNED-NEXT: entry:
|
|
// UNSIGNED-NEXT: [[TMP0:%.*]] = load i16, i16* @usa_sat, align 2
|
|
// UNSIGNED-NEXT: [[TMP1:%.*]] = load i32, i32* @i, align 4
|
|
// UNSIGNED-NEXT: [[TMP2:%.*]] = trunc i32 [[TMP1]] to i16
|
|
// UNSIGNED-NEXT: [[TMP3:%.*]] = call i16 @llvm.sshl.sat.i16(i16 [[TMP0]], i16 [[TMP2]])
|
|
// UNSIGNED-NEXT: store i16 [[TMP3]], i16* @usa_sat, align 2
|
|
// UNSIGNED-NEXT: ret void
|
|
//
|
|
void satleft_usasusasi() {
|
|
usa_sat = usa_sat << i;
|
|
}
|
|
|
|
// SIGNED-LABEL: @satleft_uasuasi(
|
|
// SIGNED-NEXT: entry:
|
|
// SIGNED-NEXT: [[TMP0:%.*]] = load i32, i32* @ua_sat, align 4
|
|
// SIGNED-NEXT: [[TMP1:%.*]] = load i32, i32* @i, align 4
|
|
// SIGNED-NEXT: [[TMP2:%.*]] = call i32 @llvm.ushl.sat.i32(i32 [[TMP0]], i32 [[TMP1]])
|
|
// SIGNED-NEXT: store i32 [[TMP2]], i32* @ua_sat, align 4
|
|
// SIGNED-NEXT: ret void
|
|
//
|
|
// UNSIGNED-LABEL: @satleft_uasuasi(
|
|
// UNSIGNED-NEXT: entry:
|
|
// UNSIGNED-NEXT: [[TMP0:%.*]] = load i32, i32* @ua_sat, align 4
|
|
// UNSIGNED-NEXT: [[TMP1:%.*]] = load i32, i32* @i, align 4
|
|
// UNSIGNED-NEXT: [[TMP2:%.*]] = call i32 @llvm.sshl.sat.i32(i32 [[TMP0]], i32 [[TMP1]])
|
|
// UNSIGNED-NEXT: store i32 [[TMP2]], i32* @ua_sat, align 4
|
|
// UNSIGNED-NEXT: ret void
|
|
//
|
|
void satleft_uasuasi() {
|
|
ua_sat = ua_sat << i;
|
|
}
|
|
|
|
// SIGNED-LABEL: @satleft_usfsusfsi(
|
|
// SIGNED-NEXT: entry:
|
|
// SIGNED-NEXT: [[TMP0:%.*]] = load i8, i8* @usf_sat, align 1
|
|
// SIGNED-NEXT: [[TMP1:%.*]] = load i32, i32* @i, align 4
|
|
// SIGNED-NEXT: [[TMP2:%.*]] = trunc i32 [[TMP1]] to i8
|
|
// SIGNED-NEXT: [[TMP3:%.*]] = call i8 @llvm.ushl.sat.i8(i8 [[TMP0]], i8 [[TMP2]])
|
|
// SIGNED-NEXT: store i8 [[TMP3]], i8* @usf_sat, align 1
|
|
// SIGNED-NEXT: ret void
|
|
//
|
|
// UNSIGNED-LABEL: @satleft_usfsusfsi(
|
|
// UNSIGNED-NEXT: entry:
|
|
// UNSIGNED-NEXT: [[TMP0:%.*]] = load i8, i8* @usf_sat, align 1
|
|
// UNSIGNED-NEXT: [[TMP1:%.*]] = load i32, i32* @i, align 4
|
|
// UNSIGNED-NEXT: [[TMP2:%.*]] = trunc i32 [[TMP1]] to i8
|
|
// UNSIGNED-NEXT: [[TMP3:%.*]] = call i8 @llvm.sshl.sat.i8(i8 [[TMP0]], i8 [[TMP2]])
|
|
// UNSIGNED-NEXT: store i8 [[TMP3]], i8* @usf_sat, align 1
|
|
// UNSIGNED-NEXT: ret void
|
|
//
|
|
void satleft_usfsusfsi() {
|
|
usf_sat = usf_sat << i;
|
|
}
|
|
|
|
// SIGNED-LABEL: @satleft_ufsufsi(
|
|
// SIGNED-NEXT: entry:
|
|
// SIGNED-NEXT: [[TMP0:%.*]] = load i16, i16* @uf_sat, align 2
|
|
// SIGNED-NEXT: [[TMP1:%.*]] = load i32, i32* @i, align 4
|
|
// SIGNED-NEXT: [[TMP2:%.*]] = trunc i32 [[TMP1]] to i16
|
|
// SIGNED-NEXT: [[TMP3:%.*]] = call i16 @llvm.ushl.sat.i16(i16 [[TMP0]], i16 [[TMP2]])
|
|
// SIGNED-NEXT: store i16 [[TMP3]], i16* @uf_sat, align 2
|
|
// SIGNED-NEXT: ret void
|
|
//
|
|
// UNSIGNED-LABEL: @satleft_ufsufsi(
|
|
// UNSIGNED-NEXT: entry:
|
|
// UNSIGNED-NEXT: [[TMP0:%.*]] = load i16, i16* @uf_sat, align 2
|
|
// UNSIGNED-NEXT: [[TMP1:%.*]] = load i32, i32* @i, align 4
|
|
// UNSIGNED-NEXT: [[TMP2:%.*]] = trunc i32 [[TMP1]] to i16
|
|
// UNSIGNED-NEXT: [[TMP3:%.*]] = call i16 @llvm.sshl.sat.i16(i16 [[TMP0]], i16 [[TMP2]])
|
|
// UNSIGNED-NEXT: store i16 [[TMP3]], i16* @uf_sat, align 2
|
|
// UNSIGNED-NEXT: ret void
|
|
//
|
|
void satleft_ufsufsi() {
|
|
uf_sat = uf_sat << i;
|
|
}
|