310 lines
10 KiB
C
310 lines
10 KiB
C
|
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
|
||
|
// RUN: %clang_cc1 -ffixed-point -triple arm64-unknown-linux-gnu -S -emit-llvm %s -o - | FileCheck %s --check-prefixes=CHECK,SIGNED
|
||
|
// RUN: %clang_cc1 -ffixed-point -triple arm64-unknown-linux-gnu -S -emit-llvm %s -o - -fpadding-on-unsigned-fixed-point | FileCheck %s --check-prefixes=CHECK,UNSIGNED
|
||
|
|
||
|
short _Fract sf;
|
||
|
long _Fract lf;
|
||
|
|
||
|
short _Accum sa;
|
||
|
long _Accum la;
|
||
|
|
||
|
unsigned short _Accum usa;
|
||
|
unsigned long _Accum ula;
|
||
|
|
||
|
_Sat short _Fract sf_sat;
|
||
|
_Sat long _Fract lf_sat;
|
||
|
|
||
|
_Sat short _Accum sa_sat;
|
||
|
_Sat long _Accum la_sat;
|
||
|
|
||
|
_Sat unsigned short _Accum usa_sat;
|
||
|
_Sat unsigned long _Accum ula_sat;
|
||
|
|
||
|
_Float16 h;
|
||
|
|
||
|
|
||
|
// CHECK-LABEL: @half_fix1(
|
||
|
// CHECK-NEXT: entry:
|
||
|
// CHECK-NEXT: [[TMP0:%.*]] = load half, half* @h, align 2
|
||
|
// CHECK-NEXT: [[TMP1:%.*]] = fmul half [[TMP0]], 0xH5800
|
||
|
// CHECK-NEXT: [[TMP2:%.*]] = fptosi half [[TMP1]] to i8
|
||
|
// CHECK-NEXT: store i8 [[TMP2]], i8* @sf, align 1
|
||
|
// CHECK-NEXT: ret void
|
||
|
//
|
||
|
void half_fix1() {
|
||
|
sf = h;
|
||
|
}
|
||
|
|
||
|
// CHECK-LABEL: @half_fix2(
|
||
|
// CHECK-NEXT: entry:
|
||
|
// CHECK-NEXT: [[TMP0:%.*]] = load half, half* @h, align 2
|
||
|
// CHECK-NEXT: [[TMP1:%.*]] = fpext half [[TMP0]] to float
|
||
|
// CHECK-NEXT: [[TMP2:%.*]] = fmul float [[TMP1]], 0x41E0000000000000
|
||
|
// CHECK-NEXT: [[TMP3:%.*]] = fptosi float [[TMP2]] to i32
|
||
|
// CHECK-NEXT: store i32 [[TMP3]], i32* @lf, align 4
|
||
|
// CHECK-NEXT: ret void
|
||
|
//
|
||
|
void half_fix2() {
|
||
|
lf = h;
|
||
|
}
|
||
|
|
||
|
// CHECK-LABEL: @half_fix3(
|
||
|
// CHECK-NEXT: entry:
|
||
|
// CHECK-NEXT: [[TMP0:%.*]] = load half, half* @h, align 2
|
||
|
// CHECK-NEXT: [[TMP1:%.*]] = fmul half [[TMP0]], 0xH5800
|
||
|
// CHECK-NEXT: [[TMP2:%.*]] = fptosi half [[TMP1]] to i16
|
||
|
// CHECK-NEXT: store i16 [[TMP2]], i16* @sa, align 2
|
||
|
// CHECK-NEXT: ret void
|
||
|
//
|
||
|
void half_fix3() {
|
||
|
sa = h;
|
||
|
}
|
||
|
|
||
|
// CHECK-LABEL: @half_fix4(
|
||
|
// CHECK-NEXT: entry:
|
||
|
// CHECK-NEXT: [[TMP0:%.*]] = load half, half* @h, align 2
|
||
|
// CHECK-NEXT: [[TMP1:%.*]] = fpext half [[TMP0]] to float
|
||
|
// CHECK-NEXT: [[TMP2:%.*]] = fmul float [[TMP1]], 0x41E0000000000000
|
||
|
// CHECK-NEXT: [[TMP3:%.*]] = fptosi float [[TMP2]] to i64
|
||
|
// CHECK-NEXT: store i64 [[TMP3]], i64* @la, align 8
|
||
|
// CHECK-NEXT: ret void
|
||
|
//
|
||
|
void half_fix4() {
|
||
|
la = h;
|
||
|
}
|
||
|
|
||
|
// SIGNED-LABEL: @half_fix5(
|
||
|
// SIGNED-NEXT: entry:
|
||
|
// SIGNED-NEXT: [[TMP0:%.*]] = load half, half* @h, align 2
|
||
|
// SIGNED-NEXT: [[TMP1:%.*]] = fpext half [[TMP0]] to float
|
||
|
// SIGNED-NEXT: [[TMP2:%.*]] = fmul float [[TMP1]], 2.560000e+02
|
||
|
// SIGNED-NEXT: [[TMP3:%.*]] = fptoui float [[TMP2]] to i16
|
||
|
// SIGNED-NEXT: store i16 [[TMP3]], i16* @usa, align 2
|
||
|
// SIGNED-NEXT: ret void
|
||
|
//
|
||
|
// UNSIGNED-LABEL: @half_fix5(
|
||
|
// UNSIGNED-NEXT: entry:
|
||
|
// UNSIGNED-NEXT: [[TMP0:%.*]] = load half, half* @h, align 2
|
||
|
// UNSIGNED-NEXT: [[TMP1:%.*]] = fmul half [[TMP0]], 0xH5800
|
||
|
// UNSIGNED-NEXT: [[TMP2:%.*]] = fptosi half [[TMP1]] to i16
|
||
|
// UNSIGNED-NEXT: store i16 [[TMP2]], i16* @usa, align 2
|
||
|
// UNSIGNED-NEXT: ret void
|
||
|
//
|
||
|
void half_fix5() {
|
||
|
usa = h;
|
||
|
}
|
||
|
|
||
|
// SIGNED-LABEL: @half_fix6(
|
||
|
// SIGNED-NEXT: entry:
|
||
|
// SIGNED-NEXT: [[TMP0:%.*]] = load half, half* @h, align 2
|
||
|
// SIGNED-NEXT: [[TMP1:%.*]] = fpext half [[TMP0]] to float
|
||
|
// SIGNED-NEXT: [[TMP2:%.*]] = fmul float [[TMP1]], 0x41F0000000000000
|
||
|
// SIGNED-NEXT: [[TMP3:%.*]] = fptoui float [[TMP2]] to i64
|
||
|
// SIGNED-NEXT: store i64 [[TMP3]], i64* @ula, align 8
|
||
|
// SIGNED-NEXT: ret void
|
||
|
//
|
||
|
// UNSIGNED-LABEL: @half_fix6(
|
||
|
// UNSIGNED-NEXT: entry:
|
||
|
// UNSIGNED-NEXT: [[TMP0:%.*]] = load half, half* @h, align 2
|
||
|
// UNSIGNED-NEXT: [[TMP1:%.*]] = fpext half [[TMP0]] to float
|
||
|
// UNSIGNED-NEXT: [[TMP2:%.*]] = fmul float [[TMP1]], 0x41E0000000000000
|
||
|
// UNSIGNED-NEXT: [[TMP3:%.*]] = fptosi float [[TMP2]] to i64
|
||
|
// UNSIGNED-NEXT: store i64 [[TMP3]], i64* @ula, align 8
|
||
|
// UNSIGNED-NEXT: ret void
|
||
|
//
|
||
|
void half_fix6() {
|
||
|
ula = h;
|
||
|
}
|
||
|
|
||
|
|
||
|
// CHECK-LABEL: @half_sat1(
|
||
|
// CHECK-NEXT: entry:
|
||
|
// CHECK-NEXT: [[TMP0:%.*]] = load half, half* @h, align 2
|
||
|
// CHECK-NEXT: [[TMP1:%.*]] = fmul half [[TMP0]], 0xH5800
|
||
|
// CHECK-NEXT: [[TMP2:%.*]] = call i8 @llvm.fptosi.sat.i8.f16(half [[TMP1]])
|
||
|
// CHECK-NEXT: store i8 [[TMP2]], i8* @sf_sat, align 1
|
||
|
// CHECK-NEXT: ret void
|
||
|
//
|
||
|
void half_sat1() {
|
||
|
sf_sat = h;
|
||
|
}
|
||
|
|
||
|
// CHECK-LABEL: @half_sat2(
|
||
|
// CHECK-NEXT: entry:
|
||
|
// CHECK-NEXT: [[TMP0:%.*]] = load half, half* @h, align 2
|
||
|
// CHECK-NEXT: [[TMP1:%.*]] = fpext half [[TMP0]] to float
|
||
|
// CHECK-NEXT: [[TMP2:%.*]] = fmul float [[TMP1]], 0x41E0000000000000
|
||
|
// CHECK-NEXT: [[TMP3:%.*]] = call i32 @llvm.fptosi.sat.i32.f32(float [[TMP2]])
|
||
|
// CHECK-NEXT: store i32 [[TMP3]], i32* @lf_sat, align 4
|
||
|
// CHECK-NEXT: ret void
|
||
|
//
|
||
|
void half_sat2() {
|
||
|
lf_sat = h;
|
||
|
}
|
||
|
|
||
|
// CHECK-LABEL: @half_sat3(
|
||
|
// CHECK-NEXT: entry:
|
||
|
// CHECK-NEXT: [[TMP0:%.*]] = load half, half* @h, align 2
|
||
|
// CHECK-NEXT: [[TMP1:%.*]] = fmul half [[TMP0]], 0xH5800
|
||
|
// CHECK-NEXT: [[TMP2:%.*]] = call i16 @llvm.fptosi.sat.i16.f16(half [[TMP1]])
|
||
|
// CHECK-NEXT: store i16 [[TMP2]], i16* @sa_sat, align 2
|
||
|
// CHECK-NEXT: ret void
|
||
|
//
|
||
|
void half_sat3() {
|
||
|
sa_sat = h;
|
||
|
}
|
||
|
|
||
|
// CHECK-LABEL: @half_sat4(
|
||
|
// CHECK-NEXT: entry:
|
||
|
// CHECK-NEXT: [[TMP0:%.*]] = load half, half* @h, align 2
|
||
|
// CHECK-NEXT: [[TMP1:%.*]] = fpext half [[TMP0]] to float
|
||
|
// CHECK-NEXT: [[TMP2:%.*]] = fmul float [[TMP1]], 0x41E0000000000000
|
||
|
// CHECK-NEXT: [[TMP3:%.*]] = call i64 @llvm.fptosi.sat.i64.f32(float [[TMP2]])
|
||
|
// CHECK-NEXT: store i64 [[TMP3]], i64* @la_sat, align 8
|
||
|
// CHECK-NEXT: ret void
|
||
|
//
|
||
|
void half_sat4() {
|
||
|
la_sat = h;
|
||
|
}
|
||
|
|
||
|
// SIGNED-LABEL: @half_sat5(
|
||
|
// SIGNED-NEXT: entry:
|
||
|
// SIGNED-NEXT: [[TMP0:%.*]] = load half, half* @h, align 2
|
||
|
// SIGNED-NEXT: [[TMP1:%.*]] = fpext half [[TMP0]] to float
|
||
|
// SIGNED-NEXT: [[TMP2:%.*]] = fmul float [[TMP1]], 2.560000e+02
|
||
|
// SIGNED-NEXT: [[TMP3:%.*]] = call i16 @llvm.fptoui.sat.i16.f32(float [[TMP2]])
|
||
|
// SIGNED-NEXT: store i16 [[TMP3]], i16* @usa_sat, align 2
|
||
|
// SIGNED-NEXT: ret void
|
||
|
//
|
||
|
// UNSIGNED-LABEL: @half_sat5(
|
||
|
// UNSIGNED-NEXT: entry:
|
||
|
// UNSIGNED-NEXT: [[TMP0:%.*]] = load half, half* @h, align 2
|
||
|
// UNSIGNED-NEXT: [[TMP1:%.*]] = fmul half [[TMP0]], 0xH5800
|
||
|
// UNSIGNED-NEXT: [[TMP2:%.*]] = call i16 @llvm.fptosi.sat.i16.f16(half [[TMP1]])
|
||
|
// UNSIGNED-NEXT: [[TMP3:%.*]] = icmp slt i16 [[TMP2]], 0
|
||
|
// UNSIGNED-NEXT: [[SATMIN:%.*]] = select i1 [[TMP3]], i16 0, i16 [[TMP2]]
|
||
|
// UNSIGNED-NEXT: store i16 [[SATMIN]], i16* @usa_sat, align 2
|
||
|
// UNSIGNED-NEXT: ret void
|
||
|
//
|
||
|
void half_sat5() {
|
||
|
usa_sat = h;
|
||
|
}
|
||
|
|
||
|
// SIGNED-LABEL: @half_sat6(
|
||
|
// SIGNED-NEXT: entry:
|
||
|
// SIGNED-NEXT: [[TMP0:%.*]] = load half, half* @h, align 2
|
||
|
// SIGNED-NEXT: [[TMP1:%.*]] = fpext half [[TMP0]] to float
|
||
|
// SIGNED-NEXT: [[TMP2:%.*]] = fmul float [[TMP1]], 0x41F0000000000000
|
||
|
// SIGNED-NEXT: [[TMP3:%.*]] = call i64 @llvm.fptoui.sat.i64.f32(float [[TMP2]])
|
||
|
// SIGNED-NEXT: store i64 [[TMP3]], i64* @ula_sat, align 8
|
||
|
// SIGNED-NEXT: ret void
|
||
|
//
|
||
|
// UNSIGNED-LABEL: @half_sat6(
|
||
|
// UNSIGNED-NEXT: entry:
|
||
|
// UNSIGNED-NEXT: [[TMP0:%.*]] = load half, half* @h, align 2
|
||
|
// UNSIGNED-NEXT: [[TMP1:%.*]] = fpext half [[TMP0]] to float
|
||
|
// UNSIGNED-NEXT: [[TMP2:%.*]] = fmul float [[TMP1]], 0x41E0000000000000
|
||
|
// UNSIGNED-NEXT: [[TMP3:%.*]] = call i64 @llvm.fptosi.sat.i64.f32(float [[TMP2]])
|
||
|
// UNSIGNED-NEXT: [[TMP4:%.*]] = icmp slt i64 [[TMP3]], 0
|
||
|
// UNSIGNED-NEXT: [[SATMIN:%.*]] = select i1 [[TMP4]], i64 0, i64 [[TMP3]]
|
||
|
// UNSIGNED-NEXT: store i64 [[SATMIN]], i64* @ula_sat, align 8
|
||
|
// UNSIGNED-NEXT: ret void
|
||
|
//
|
||
|
void half_sat6() {
|
||
|
ula_sat = h;
|
||
|
}
|
||
|
|
||
|
|
||
|
// CHECK-LABEL: @fix_half1(
|
||
|
// CHECK-NEXT: entry:
|
||
|
// CHECK-NEXT: [[TMP0:%.*]] = load i8, i8* @sf, align 1
|
||
|
// CHECK-NEXT: [[TMP1:%.*]] = sitofp i8 [[TMP0]] to half
|
||
|
// CHECK-NEXT: [[TMP2:%.*]] = fmul half [[TMP1]], 0xH2000
|
||
|
// CHECK-NEXT: store half [[TMP2]], half* @h, align 2
|
||
|
// CHECK-NEXT: ret void
|
||
|
//
|
||
|
void fix_half1() {
|
||
|
h = sf;
|
||
|
}
|
||
|
|
||
|
// CHECK-LABEL: @fix_half2(
|
||
|
// CHECK-NEXT: entry:
|
||
|
// CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* @lf, align 4
|
||
|
// CHECK-NEXT: [[TMP1:%.*]] = sitofp i32 [[TMP0]] to float
|
||
|
// CHECK-NEXT: [[TMP2:%.*]] = fmul float [[TMP1]], 0x3E00000000000000
|
||
|
// CHECK-NEXT: [[TMP3:%.*]] = fptrunc float [[TMP2]] to half
|
||
|
// CHECK-NEXT: store half [[TMP3]], half* @h, align 2
|
||
|
// CHECK-NEXT: ret void
|
||
|
//
|
||
|
void fix_half2() {
|
||
|
h = lf;
|
||
|
}
|
||
|
|
||
|
// CHECK-LABEL: @fix_half3(
|
||
|
// CHECK-NEXT: entry:
|
||
|
// CHECK-NEXT: [[TMP0:%.*]] = load i16, i16* @sa, align 2
|
||
|
// CHECK-NEXT: [[TMP1:%.*]] = sitofp i16 [[TMP0]] to half
|
||
|
// CHECK-NEXT: [[TMP2:%.*]] = fmul half [[TMP1]], 0xH2000
|
||
|
// CHECK-NEXT: store half [[TMP2]], half* @h, align 2
|
||
|
// CHECK-NEXT: ret void
|
||
|
//
|
||
|
void fix_half3() {
|
||
|
h = sa;
|
||
|
}
|
||
|
|
||
|
// CHECK-LABEL: @fix_half4(
|
||
|
// CHECK-NEXT: entry:
|
||
|
// CHECK-NEXT: [[TMP0:%.*]] = load i64, i64* @la, align 8
|
||
|
// CHECK-NEXT: [[TMP1:%.*]] = sitofp i64 [[TMP0]] to float
|
||
|
// CHECK-NEXT: [[TMP2:%.*]] = fmul float [[TMP1]], 0x3E00000000000000
|
||
|
// CHECK-NEXT: [[TMP3:%.*]] = fptrunc float [[TMP2]] to half
|
||
|
// CHECK-NEXT: store half [[TMP3]], half* @h, align 2
|
||
|
// CHECK-NEXT: ret void
|
||
|
//
|
||
|
void fix_half4() {
|
||
|
h = la;
|
||
|
}
|
||
|
|
||
|
// SIGNED-LABEL: @fix_half5(
|
||
|
// SIGNED-NEXT: entry:
|
||
|
// SIGNED-NEXT: [[TMP0:%.*]] = load i16, i16* @usa, align 2
|
||
|
// SIGNED-NEXT: [[TMP1:%.*]] = uitofp i16 [[TMP0]] to float
|
||
|
// SIGNED-NEXT: [[TMP2:%.*]] = fmul float [[TMP1]], 3.906250e-03
|
||
|
// SIGNED-NEXT: [[TMP3:%.*]] = fptrunc float [[TMP2]] to half
|
||
|
// SIGNED-NEXT: store half [[TMP3]], half* @h, align 2
|
||
|
// SIGNED-NEXT: ret void
|
||
|
//
|
||
|
// UNSIGNED-LABEL: @fix_half5(
|
||
|
// UNSIGNED-NEXT: entry:
|
||
|
// UNSIGNED-NEXT: [[TMP0:%.*]] = load i16, i16* @usa, align 2
|
||
|
// UNSIGNED-NEXT: [[TMP1:%.*]] = uitofp i16 [[TMP0]] to half
|
||
|
// UNSIGNED-NEXT: [[TMP2:%.*]] = fmul half [[TMP1]], 0xH2000
|
||
|
// UNSIGNED-NEXT: store half [[TMP2]], half* @h, align 2
|
||
|
// UNSIGNED-NEXT: ret void
|
||
|
//
|
||
|
void fix_half5() {
|
||
|
h = usa;
|
||
|
}
|
||
|
|
||
|
// SIGNED-LABEL: @fix_half6(
|
||
|
// SIGNED-NEXT: entry:
|
||
|
// SIGNED-NEXT: [[TMP0:%.*]] = load i64, i64* @ula, align 8
|
||
|
// SIGNED-NEXT: [[TMP1:%.*]] = uitofp i64 [[TMP0]] to float
|
||
|
// SIGNED-NEXT: [[TMP2:%.*]] = fmul float [[TMP1]], 0x3DF0000000000000
|
||
|
// SIGNED-NEXT: [[TMP3:%.*]] = fptrunc float [[TMP2]] to half
|
||
|
// SIGNED-NEXT: store half [[TMP3]], half* @h, align 2
|
||
|
// SIGNED-NEXT: ret void
|
||
|
//
|
||
|
// UNSIGNED-LABEL: @fix_half6(
|
||
|
// UNSIGNED-NEXT: entry:
|
||
|
// UNSIGNED-NEXT: [[TMP0:%.*]] = load i64, i64* @ula, align 8
|
||
|
// UNSIGNED-NEXT: [[TMP1:%.*]] = uitofp i64 [[TMP0]] to float
|
||
|
// UNSIGNED-NEXT: [[TMP2:%.*]] = fmul float [[TMP1]], 0x3E00000000000000
|
||
|
// UNSIGNED-NEXT: [[TMP3:%.*]] = fptrunc float [[TMP2]] to half
|
||
|
// UNSIGNED-NEXT: store half [[TMP3]], half* @h, align 2
|
||
|
// UNSIGNED-NEXT: ret void
|
||
|
//
|
||
|
void fix_half6() {
|
||
|
h = ula;
|
||
|
}
|