| // 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); |
| } |