From ca4dbf3219fc684afe8f8afcd8428ad1a262c445 Mon Sep 17 00:00:00 2001 From: Kit Barton Date: Thu, 2 Jul 2015 19:29:05 +0000 Subject: [PATCH] This patch adds support for the vector merge even word and vector merge odd word instructions introduced in POWER8. These are the Clang-related changes for http://reviews.llvm.org/D10704 All builtins are added in altivec.h and guarded with the POWER8_VECTOR macro. Phabricator review: http://reviews.llvm.org/D10736 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@241293 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Headers/altivec.h | 50 ++++++++++++++++++++++++++++ test/CodeGen/builtins-ppc-p8vector.c | 28 ++++++++++++++++ 2 files changed, 78 insertions(+) diff --git a/lib/Headers/altivec.h b/lib/Headers/altivec.h index be0a1dbc11..2c80e24db3 100644 --- a/lib/Headers/altivec.h +++ b/lib/Headers/altivec.h @@ -3180,6 +3180,56 @@ static vector float __ATTRS_o_ai vec_vmrglw(vector float __a, 0x1C, 0x1D, 0x1E, 0x1F)); } + +#ifdef __POWER8_VECTOR__ +/* vec_mergee */ + +static vector bool int __ATTRS_o_ai +vec_mergee(vector bool int __a, vector bool int __b) { + return vec_perm(__a, __b, (vector unsigned char) + (0x00, 0x01, 0x02, 0x03, 0x10, 0x11, 0x12, 0x13, + 0x08, 0x09, 0x0A, 0x0B, 0x18, 0x19, 0x1A, 0x1B)); +} + +static vector signed int __ATTRS_o_ai +vec_mergee(vector signed int __a, vector signed int __b) { + return vec_perm(__a, __b, (vector unsigned char) + (0x00, 0x01, 0x02, 0x03, 0x10, 0x11, 0x12, 0x13, + 0x08, 0x09, 0x0A, 0x0B, 0x18, 0x19, 0x1A, 0x1B)); +} + +static vector unsigned int __ATTRS_o_ai +vec_mergee(vector unsigned int __a, vector unsigned int __b) { + return vec_perm(__a, __b, (vector unsigned char) + (0x00, 0x01, 0x02, 0x03, 0x10, 0x11, 0x12, 0x13, + 0x08, 0x09, 0x0A, 0x0B, 0x18, 0x19, 0x1A, 0x1B)); +} + +/* vec_mergeo */ + +static vector bool int __ATTRS_o_ai +vec_mergeo(vector bool int __a, vector bool int __b) { + return vec_perm(__a, __b, (vector unsigned char) + (0x04, 0x05, 0x06, 0x07, 0x14, 0x15, 0x16, 0x17, + 0x0C, 0x0D, 0x0E, 0x0F, 0x1C, 0x1D, 0x1E, 0x1F)); +} + +static vector signed int __ATTRS_o_ai +vec_mergeo(vector signed int __a, vector signed int __b) { + return vec_perm(__a, __b, (vector unsigned char) + (0x04, 0x05, 0x06, 0x07, 0x14, 0x15, 0x16, 0x17, + 0x0C, 0x0D, 0x0E, 0x0F, 0x1C, 0x1D, 0x1E, 0x1F)); +} + +static vector unsigned int __ATTRS_o_ai +vec_mergeo(vector unsigned int __a, vector unsigned int __b) { + return vec_perm(__a, __b, (vector unsigned char) + (0x04, 0x05, 0x06, 0x07, 0x14, 0x15, 0x16, 0x17, + 0x0C, 0x0D, 0x0E, 0x0F, 0x1C, 0x1D, 0x1E, 0x1F)); +} + +#endif + /* vec_mfvscr */ static vector unsigned short __attribute__((__always_inline__)) diff --git a/test/CodeGen/builtins-ppc-p8vector.c b/test/CodeGen/builtins-ppc-p8vector.c index 7afc5c75f3..61e14ba283 100644 --- a/test/CodeGen/builtins-ppc-p8vector.c +++ b/test/CodeGen/builtins-ppc-p8vector.c @@ -55,6 +55,34 @@ void test1() { // CHECK-LE: add <2 x i64> // CHECK-PPC: error: call to 'vec_add' is ambiguous + /* vec_mergee */ + res_vbi = vec_mergee(vbi, vbi); +// CHECK: @llvm.ppc.altivec.vperm +// CHECK-LE: @llvm.ppc.altivec.vperm + + res_vi = vec_mergee(vi, vi); +// CHECK: @llvm.ppc.altivec.vperm +// CHECK-LE: @llvm.ppc.altivec.vperm + + res_vui = vec_mergee(vui, vui); +// CHECK: @llvm.ppc.altivec.vperm +// CHECK-LE: @llvm.ppc.altivec.vperm +// CHECK-PPC: warning: implicit declaration of function 'vec_mergee' + + /* vec_mergeo */ + res_vbi = vec_mergeo(vbi, vbi); +// CHECK: @llvm.ppc.altivec.vperm +// CHECK-LE: @llvm.ppc.altivec.vperm + + res_vi = vec_mergeo(vi, vi); +// CHECK: @llvm.ppc.altivec.vperm +// CHECK-LE: @llvm.ppc.altivec.vperm + + res_vui = vec_mergeo(vui, vui); +// CHECK: @llvm.ppc.altivec.vperm +// CHECK-LE: @llvm.ppc.altivec.vperm +// CHECK-PPC: warning: implicit declaration of function 'vec_mergeo' + /* vec_cmpeq */ res_vbll = vec_cmpeq(vsll, vsll); // CHECK: @llvm.ppc.altivec.vcmpequd -- 2.40.0