mirror of
https://github.com/Gericom/teak-llvm.git
synced 2025-06-28 15:58:57 -04:00

VSX makes the "vector long long" and "vector double" types available. This patch enables the vec_perm interface for these types. The same builtin is generated regardless of the specified type, so no additional work or testing is needed in the back end. Tests are added to ensure this builtin is generated by the front end. llvm-svn: 221988
117 lines
2.7 KiB
C
117 lines
2.7 KiB
C
// REQUIRES: powerpc-registered-target
|
|
// RUN: %clang_cc1 -faltivec -target-feature +vsx -triple powerpc64-unknown-unknown -emit-llvm %s -o - | FileCheck %s
|
|
|
|
vector unsigned char vuc = { 8, 9, 10, 11, 12, 13, 14, 15,
|
|
0, 1, 2, 3, 4, 5, 6, 7};
|
|
vector float vf = { -1.5, 2.5, -3.5, 4.5 };
|
|
vector double vd = { 3.5, -7.5 };
|
|
vector signed int vsi = { -1, 2, -3, 4 };
|
|
vector unsigned int vui = { 0, 1, 2, 3 };
|
|
vector signed long long vsll = { 255LL, -937LL };
|
|
vector unsigned long long vull = { 1447LL, 2894LL };
|
|
double d = 23.4;
|
|
|
|
vector float res_vf;
|
|
vector double res_vd;
|
|
vector signed int res_vsi;
|
|
vector unsigned int res_vui;
|
|
vector signed long long res_vsll;
|
|
vector unsigned long long res_vull;
|
|
double res_d;
|
|
|
|
void test1() {
|
|
// CHECK-LABEL: define void @test1
|
|
|
|
/* vec_div */
|
|
res_vf = vec_div(vf, vf);
|
|
// CHECK: @llvm.ppc.vsx.xvdivsp
|
|
|
|
res_vd = vec_div(vd, vd);
|
|
// CHECK: @llvm.ppc.vsx.xvdivdp
|
|
|
|
/* vec_max */
|
|
res_vf = vec_max(vf, vf);
|
|
// CHECK: @llvm.ppc.vsx.xvmaxsp
|
|
|
|
res_vd = vec_max(vd, vd);
|
|
// CHECK: @llvm.ppc.vsx.xvmaxdp
|
|
|
|
res_vf = vec_vmaxfp(vf, vf);
|
|
// CHECK: @llvm.ppc.vsx.xvmaxsp
|
|
|
|
/* vec_min */
|
|
res_vf = vec_min(vf, vf);
|
|
// CHECK: @llvm.ppc.vsx.xvminsp
|
|
|
|
res_vd = vec_min(vd, vd);
|
|
// CHECK: @llvm.ppc.vsx.xvmindp
|
|
|
|
res_vf = vec_vminfp(vf, vf);
|
|
// CHECK: @llvm.ppc.vsx.xvminsp
|
|
|
|
res_d = __builtin_vsx_xsmaxdp(d, d);
|
|
// CHECK: @llvm.ppc.vsx.xsmaxdp
|
|
|
|
res_d = __builtin_vsx_xsmindp(d, d);
|
|
// CHECK: @llvm.ppc.vsx.xsmindp
|
|
|
|
/* vec_perm */
|
|
res_vsll = vec_perm(vsll, vsll, vuc);
|
|
// CHECK: @llvm.ppc.altivec.vperm
|
|
|
|
res_vull = vec_perm(vull, vull, vuc);
|
|
// CHECK: @llvm.ppc.altivec.vperm
|
|
|
|
res_vd = vec_perm(vd, vd, vuc);
|
|
// CHECK: @llvm.ppc.altivec.vperm
|
|
|
|
res_vsll = vec_vperm(vsll, vsll, vuc);
|
|
// CHECK: @llvm.ppc.altivec.vperm
|
|
|
|
res_vull = vec_vperm(vull, vull, vuc);
|
|
// CHECK: @llvm.ppc.altivec.vperm
|
|
|
|
res_vd = vec_vperm(vd, vd, vuc);
|
|
// CHECK: @llvm.ppc.altivec.vperm
|
|
|
|
/* vec_vsx_ld */
|
|
|
|
res_vsi = vec_vsx_ld(0, &vsi);
|
|
// CHECK: @llvm.ppc.vsx.lxvw4x
|
|
|
|
res_vui = vec_vsx_ld(0, &vui);
|
|
// CHECK: @llvm.ppc.vsx.lxvw4x
|
|
|
|
res_vf = vec_vsx_ld (0, &vf);
|
|
// CHECK: @llvm.ppc.vsx.lxvw4x
|
|
|
|
res_vsll = vec_vsx_ld(0, &vsll);
|
|
// CHECK: @llvm.ppc.vsx.lxvd2x
|
|
|
|
res_vull = vec_vsx_ld(0, &vull);
|
|
// CHECK: @llvm.ppc.vsx.lxvd2x
|
|
|
|
res_vd = vec_vsx_ld(0, &vd);
|
|
// CHECK: @llvm.ppc.vsx.lxvd2x
|
|
|
|
/* vec_vsx_st */
|
|
|
|
vec_vsx_st(vsi, 0, &res_vsi);
|
|
// CHECK: @llvm.ppc.vsx.stxvw4x
|
|
|
|
vec_vsx_st(vui, 0, &res_vui);
|
|
// CHECK: @llvm.ppc.vsx.stxvw4x
|
|
|
|
vec_vsx_st(vf, 0, &res_vf);
|
|
// CHECK: @llvm.ppc.vsx.stxvw4x
|
|
|
|
vec_vsx_st(vsll, 0, &res_vsll);
|
|
// CHECK: @llvm.ppc.vsx.stxvd2x
|
|
|
|
vec_vsx_st(vull, 0, &res_vull);
|
|
// CHECK: @llvm.ppc.vsx.stxvd2x
|
|
|
|
vec_vsx_st(vd, 0, &res_vd);
|
|
// CHECK: @llvm.ppc.vsx.stxvd2x
|
|
}
|