forked from OSchip/llvm-project
315 lines
10 KiB
C
315 lines
10 KiB
C
// REQUIRES: powerpc-registered-target
|
|
// RUN: %clang_cc1 -triple powerpc64le-unknown-linux-gnu \
|
|
// RUN: -emit-llvm %s -o - -target-cpu pwr8 | FileCheck %s
|
|
// RUN: %clang_cc1 -triple powerpc64-unknown-aix \
|
|
// RUN: -emit-llvm %s -o - -target-cpu pwr7 | FileCheck %s
|
|
// RUN: %clang_cc1 -triple powerpc-unknown-aix \
|
|
// RUN: -emit-llvm %s -o - -target-cpu pwr7 | FileCheck %s
|
|
|
|
extern double a;
|
|
extern double b;
|
|
extern double c;
|
|
extern float d;
|
|
extern float e;
|
|
extern float f;
|
|
|
|
// CHECK-LABEL: @test_fric(
|
|
// CHECK: [[TMP0:%.*]] = load double, double* @a, align 8
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load double, double* @a, align 8
|
|
// CHECK-NEXT: [[TMP2:%.*]] = call double @llvm.rint.f64(double [[TMP1]])
|
|
// CHECK-NEXT: ret double [[TMP2]]
|
|
//
|
|
double test_fric() {
|
|
return __fric(a);
|
|
}
|
|
|
|
// CHECK-LABEL: @test_frim(
|
|
// CHECK: [[TMP0:%.*]] = load double, double* @a, align 8
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load double, double* @a, align 8
|
|
// CHECK-NEXT: [[TMP2:%.*]] = call double @llvm.floor.f64(double [[TMP1]])
|
|
// CHECK-NEXT: ret double [[TMP2]]
|
|
//
|
|
double test_frim() {
|
|
return __frim(a);
|
|
}
|
|
|
|
// CHECK-LABEL: @test_frims(
|
|
// CHECK: [[TMP0:%.*]] = load float, float* @d, align 4
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load float, float* @d, align 4
|
|
// CHECK-NEXT: [[TMP2:%.*]] = call float @llvm.floor.f32(float [[TMP1]])
|
|
// CHECK-NEXT: ret float [[TMP2]]
|
|
//
|
|
float test_frims() {
|
|
return __frims(d);
|
|
}
|
|
|
|
// CHECK-LABEL: @test_frin(
|
|
// CHECK: [[TMP0:%.*]] = load double, double* @a, align 8
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load double, double* @a, align 8
|
|
// CHECK-NEXT: [[TMP2:%.*]] = call double @llvm.round.f64(double [[TMP1]])
|
|
// CHECK-NEXT: ret double [[TMP2]]
|
|
//
|
|
double test_frin() {
|
|
return __frin(a);
|
|
}
|
|
|
|
// CHECK-LABEL: @test_frins(
|
|
// CHECK: [[TMP0:%.*]] = load float, float* @d, align 4
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load float, float* @d, align 4
|
|
// CHECK-NEXT: [[TMP2:%.*]] = call float @llvm.round.f32(float [[TMP1]])
|
|
// CHECK-NEXT: ret float [[TMP2]]
|
|
//
|
|
float test_frins() {
|
|
return __frins(d);
|
|
}
|
|
|
|
// CHECK-LABEL: @test_frip(
|
|
// CHECK: [[TMP0:%.*]] = load double, double* @a, align 8
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load double, double* @a, align 8
|
|
// CHECK-NEXT: [[TMP2:%.*]] = call double @llvm.ceil.f64(double [[TMP1]])
|
|
// CHECK-NEXT: ret double [[TMP2]]
|
|
//
|
|
double test_frip() {
|
|
return __frip(a);
|
|
}
|
|
|
|
// CHECK-LABEL: @test_frips(
|
|
// CHECK: [[TMP0:%.*]] = load float, float* @d, align 4
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load float, float* @d, align 4
|
|
// CHECK-NEXT: [[TMP2:%.*]] = call float @llvm.ceil.f32(float [[TMP1]])
|
|
// CHECK-NEXT: ret float [[TMP2]]
|
|
//
|
|
float test_frips() {
|
|
return __frips(d);
|
|
}
|
|
|
|
// CHECK-LABEL: @test_friz(
|
|
// CHECK: [[TMP0:%.*]] = load double, double* @a, align 8
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load double, double* @a, align 8
|
|
// CHECK-NEXT: [[TMP2:%.*]] = call double @llvm.trunc.f64(double [[TMP1]])
|
|
// CHECK-NEXT: ret double [[TMP2]]
|
|
//
|
|
double test_friz() {
|
|
return __friz(a);
|
|
}
|
|
|
|
// CHECK-LABEL: @test_frizs(
|
|
// CHECK: [[TMP0:%.*]] = load float, float* @d, align 4
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load float, float* @d, align 4
|
|
// CHECK-NEXT: [[TMP2:%.*]] = call float @llvm.trunc.f32(float [[TMP1]])
|
|
// CHECK-NEXT: ret float [[TMP2]]
|
|
//
|
|
float test_frizs() {
|
|
return __frizs(d);
|
|
}
|
|
|
|
// CHECK-LABEL: @test_fsel(
|
|
// CHECK: [[TMP0:%.*]] = load double, double* @a, align 8
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load double, double* @b, align 8
|
|
// CHECK-NEXT: [[TMP2:%.*]] = load double, double* @c, align 8
|
|
// CHECK-NEXT: [[TMP3:%.*]] = call double @llvm.ppc.fsel(double [[TMP0]], double [[TMP1]], double [[TMP2]])
|
|
// CHECK-NEXT: ret double [[TMP3]]
|
|
//
|
|
double test_fsel() {
|
|
return __fsel(a, b, c);
|
|
}
|
|
|
|
// CHECK-LABEL: @test_fsels(
|
|
// CHECK: [[TMP0:%.*]] = load float, float* @d, align 4
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load float, float* @e, align 4
|
|
// CHECK-NEXT: [[TMP2:%.*]] = load float, float* @f, align 4
|
|
// CHECK-NEXT: [[TMP3:%.*]] = call float @llvm.ppc.fsels(float [[TMP0]], float [[TMP1]], float [[TMP2]])
|
|
// CHECK-NEXT: ret float [[TMP3]]
|
|
//
|
|
float test_fsels() {
|
|
return __fsels(d, e, f);
|
|
}
|
|
|
|
// CHECK-LABEL: @test_frsqrte(
|
|
// CHECK: [[TMP0:%.*]] = load double, double* @a, align 8
|
|
// CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.ppc.frsqrte(double [[TMP0]])
|
|
// CHECK-NEXT: ret double [[TMP1]]
|
|
//
|
|
double test_frsqrte() {
|
|
return __frsqrte(a);
|
|
}
|
|
|
|
// CHECK-LABEL: @test_frsqrtes(
|
|
// CHECK: [[TMP0:%.*]] = load float, float* @d, align 4
|
|
// CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.ppc.frsqrtes(float [[TMP0]])
|
|
// CHECK-NEXT: ret float [[TMP1]]
|
|
//
|
|
float test_frsqrtes() {
|
|
return __frsqrtes(d);
|
|
}
|
|
|
|
// CHECK-LABEL: @test_fsqrt(
|
|
// CHECK: [[TMP0:%.*]] = load double, double* @a, align 8
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load double, double* @a, align 8
|
|
// CHECK-NEXT: [[TMP2:%.*]] = call double @llvm.sqrt.f64(double [[TMP1]])
|
|
// CHECK-NEXT: ret double [[TMP2]]
|
|
//
|
|
double test_fsqrt() {
|
|
return __fsqrt(a);
|
|
}
|
|
|
|
// CHECK-LABEL: @test_fsqrts(
|
|
// CHECK: [[TMP0:%.*]] = load float, float* @d, align 4
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load float, float* @d, align 4
|
|
// CHECK-NEXT: [[TMP2:%.*]] = call float @llvm.sqrt.f32(float [[TMP1]])
|
|
// CHECK-NEXT: ret float [[TMP2]]
|
|
//
|
|
float test_fsqrts() {
|
|
return __fsqrts(d);
|
|
}
|
|
|
|
// CHECK-LABEL: @test_builtin_ppc_fric(
|
|
// CHECK: [[TMP0:%.*]] = load double, double* @a, align 8
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load double, double* @a, align 8
|
|
// CHECK-NEXT: [[TMP2:%.*]] = call double @llvm.rint.f64(double [[TMP1]])
|
|
// CHECK-NEXT: ret double [[TMP2]]
|
|
//
|
|
double test_builtin_ppc_fric() {
|
|
return __builtin_ppc_fric(a);
|
|
}
|
|
|
|
// CHECK-LABEL: @test_builtin_ppc_frim(
|
|
// CHECK: [[TMP0:%.*]] = load double, double* @a, align 8
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load double, double* @a, align 8
|
|
// CHECK-NEXT: [[TMP2:%.*]] = call double @llvm.floor.f64(double [[TMP1]])
|
|
// CHECK-NEXT: ret double [[TMP2]]
|
|
//
|
|
double test_builtin_ppc_frim() {
|
|
return __builtin_ppc_frim(a);
|
|
}
|
|
|
|
// CHECK-LABEL: @test_builtin_ppc_frims(
|
|
// CHECK: [[TMP0:%.*]] = load float, float* @d, align 4
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load float, float* @d, align 4
|
|
// CHECK-NEXT: [[TMP2:%.*]] = call float @llvm.floor.f32(float [[TMP1]])
|
|
// CHECK-NEXT: ret float [[TMP2]]
|
|
//
|
|
float test_builtin_ppc_frims() {
|
|
return __builtin_ppc_frims(d);
|
|
}
|
|
|
|
// CHECK-LABEL: @test_builtin_ppc_frin(
|
|
// CHECK: [[TMP0:%.*]] = load double, double* @a, align 8
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load double, double* @a, align 8
|
|
// CHECK-NEXT: [[TMP2:%.*]] = call double @llvm.round.f64(double [[TMP1]])
|
|
// CHECK-NEXT: ret double [[TMP2]]
|
|
//
|
|
double test_builtin_ppc_frin() {
|
|
return __builtin_ppc_frin(a);
|
|
}
|
|
|
|
// CHECK-LABEL: @test_builtin_ppc_frins(
|
|
// CHECK: [[TMP0:%.*]] = load float, float* @d, align 4
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load float, float* @d, align 4
|
|
// CHECK-NEXT: [[TMP2:%.*]] = call float @llvm.round.f32(float [[TMP1]])
|
|
// CHECK-NEXT: ret float [[TMP2]]
|
|
//
|
|
float test_builtin_ppc_frins() {
|
|
return __builtin_ppc_frins(d);
|
|
}
|
|
|
|
// CHECK-LABEL: @test_builtin_ppc_frip(
|
|
// CHECK: [[TMP0:%.*]] = load double, double* @a, align 8
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load double, double* @a, align 8
|
|
// CHECK-NEXT: [[TMP2:%.*]] = call double @llvm.ceil.f64(double [[TMP1]])
|
|
// CHECK-NEXT: ret double [[TMP2]]
|
|
//
|
|
double test_builtin_ppc_frip() {
|
|
return __builtin_ppc_frip(a);
|
|
}
|
|
|
|
// CHECK-LABEL: @test_builtin_ppc_frips(
|
|
// CHECK: [[TMP0:%.*]] = load float, float* @d, align 4
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load float, float* @d, align 4
|
|
// CHECK-NEXT: [[TMP2:%.*]] = call float @llvm.ceil.f32(float [[TMP1]])
|
|
// CHECK-NEXT: ret float [[TMP2]]
|
|
//
|
|
float test_builtin_ppc_frips() {
|
|
return __builtin_ppc_frips(d);
|
|
}
|
|
|
|
// CHECK-LABEL: @test_builtin_ppc_friz(
|
|
// CHECK: [[TMP0:%.*]] = load double, double* @a, align 8
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load double, double* @a, align 8
|
|
// CHECK-NEXT: [[TMP2:%.*]] = call double @llvm.trunc.f64(double [[TMP1]])
|
|
// CHECK-NEXT: ret double [[TMP2]]
|
|
//
|
|
double test_builtin_ppc_friz() {
|
|
return __builtin_ppc_friz(a);
|
|
}
|
|
|
|
// CHECK-LABEL: @test_builtin_ppc_frizs(
|
|
// CHECK: [[TMP0:%.*]] = load float, float* @d, align 4
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load float, float* @d, align 4
|
|
// CHECK-NEXT: [[TMP2:%.*]] = call float @llvm.trunc.f32(float [[TMP1]])
|
|
// CHECK-NEXT: ret float [[TMP2]]
|
|
//
|
|
float test_builtin_ppc_frizs() {
|
|
return __builtin_ppc_frizs(d);
|
|
}
|
|
|
|
// CHECK-LABEL: @test_builtin_ppc_fsel(
|
|
// CHECK: [[TMP0:%.*]] = load double, double* @a, align 8
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load double, double* @b, align 8
|
|
// CHECK-NEXT: [[TMP2:%.*]] = load double, double* @c, align 8
|
|
// CHECK-NEXT: [[TMP3:%.*]] = call double @llvm.ppc.fsel(double [[TMP0]], double [[TMP1]], double [[TMP2]])
|
|
// CHECK-NEXT: ret double [[TMP3]]
|
|
//
|
|
double test_builtin_ppc_fsel() {
|
|
return __builtin_ppc_fsel(a, b, c);
|
|
}
|
|
|
|
// CHECK-LABEL: @test_builtin_ppc_fsels(
|
|
// CHECK: [[TMP0:%.*]] = load float, float* @d, align 4
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load float, float* @e, align 4
|
|
// CHECK-NEXT: [[TMP2:%.*]] = load float, float* @f, align 4
|
|
// CHECK-NEXT: [[TMP3:%.*]] = call float @llvm.ppc.fsels(float [[TMP0]], float [[TMP1]], float [[TMP2]])
|
|
// CHECK-NEXT: ret float [[TMP3]]
|
|
//
|
|
float test_builtin_ppc_fsels() {
|
|
return __builtin_ppc_fsels(d, e, f);
|
|
}
|
|
|
|
// CHECK-LABEL: @test_builtin_ppc_frsqrte(
|
|
// CHECK: [[TMP0:%.*]] = load double, double* @a, align 8
|
|
// CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.ppc.frsqrte(double [[TMP0]])
|
|
// CHECK-NEXT: ret double [[TMP1]]
|
|
//
|
|
double test_builtin_ppc_frsqrte() {
|
|
return __builtin_ppc_frsqrte(a);
|
|
}
|
|
|
|
// CHECK-LABEL: @test_builtin_ppc_frsqrtes(
|
|
// CHECK: [[TMP0:%.*]] = load float, float* @d, align 4
|
|
// CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.ppc.frsqrtes(float [[TMP0]])
|
|
// CHECK-NEXT: ret float [[TMP1]]
|
|
//
|
|
float test_builtin_ppc_frsqrtes() {
|
|
return __builtin_ppc_frsqrtes(d);
|
|
}
|
|
|
|
// CHECK-LABEL: @test_builtin_ppc_fsqrt(
|
|
// CHECK: [[TMP0:%.*]] = load double, double* @a, align 8
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load double, double* @a, align 8
|
|
// CHECK-NEXT: [[TMP2:%.*]] = call double @llvm.sqrt.f64(double [[TMP1]])
|
|
// CHECK-NEXT: ret double [[TMP2]]
|
|
//
|
|
double test_builtin_ppc_fsqrt() {
|
|
return __builtin_ppc_fsqrt(a);
|
|
}
|
|
|
|
// CHECK-LABEL: @test_builtin_ppc_fsqrts(
|
|
// CHECK: [[TMP0:%.*]] = load float, float* @d, align 4
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load float, float* @d, align 4
|
|
// CHECK-NEXT: [[TMP2:%.*]] = call float @llvm.sqrt.f32(float [[TMP1]])
|
|
// CHECK-NEXT: ret float [[TMP2]]
|
|
//
|
|
float test_builtin_ppc_fsqrts() {
|
|
return __builtin_ppc_fsqrts(d);
|
|
}
|