xref: /llvm-project/clang/test/CodeGen/SystemZ/builtins-systemz-vector5.c (revision 8424bf207efd89eacf2fe893b67be98d535e1db6)
1 // REQUIRES: systemz-registered-target
2 // RUN: %clang_cc1 -target-cpu arch15 -triple s390x-ibm-linux -flax-vector-conversions=none \
3 // RUN: -Wall -Wno-unused -Werror -emit-llvm %s -o - | FileCheck %s
4 
5 typedef __attribute__((vector_size(16))) signed char vec_schar;
6 typedef __attribute__((vector_size(16))) signed short vec_sshort;
7 typedef __attribute__((vector_size(16))) signed int vec_sint;
8 typedef __attribute__((vector_size(16))) signed long long vec_slong;
9 typedef __attribute__((vector_size(16))) signed __int128 vec_sint128;
10 typedef __attribute__((vector_size(16))) unsigned char vec_uchar;
11 typedef __attribute__((vector_size(16))) unsigned short vec_ushort;
12 typedef __attribute__((vector_size(16))) unsigned int vec_uint;
13 typedef __attribute__((vector_size(16))) unsigned long long vec_ulong;
14 typedef __attribute__((vector_size(16))) unsigned __int128 vec_uint128;
15 typedef __attribute__((vector_size(16))) double vec_double;
16 
17 volatile vec_schar vsc;
18 volatile vec_sshort vss;
19 volatile vec_sint vsi;
20 volatile vec_slong vsl;
21 volatile vec_uchar vuc;
22 volatile vec_ushort vus;
23 volatile vec_uint vui;
24 volatile vec_ulong vul;
25 volatile signed __int128 si128;
26 volatile unsigned __int128 ui128;
27 
28 int cc;
29 
30 void test_core(void) {
31   vuc = __builtin_s390_vgemb(vus);
32   // CHECK: call <16 x i8> @llvm.s390.vgemb(<8 x i16> %{{.*}})
33   vus = __builtin_s390_vgemh(vuc);
34   // CHECK: call <8 x i16> @llvm.s390.vgemh(<16 x i8> %{{.*}})
35   vui = __builtin_s390_vgemf(vuc);
36   // CHECK: call <4 x i32> @llvm.s390.vgemf(<16 x i8> %{{.*}})
37   vul = __builtin_s390_vgemg(vuc);
38   // CHECK: call <2 x i64> @llvm.s390.vgemg(<16 x i8> %{{.*}})
39   ui128 = __builtin_s390_vgemq(vuc);
40   // CHECK: call i128 @llvm.s390.vgemq(<16 x i8> %{{.*}})
41 
42   si128 = __builtin_s390_vuphg(vsl);
43   // CHECK: call i128 @llvm.s390.vuphg(<2 x i64> %{{.*}})
44   si128 = __builtin_s390_vuplg(vsl);
45   // CHECK: call i128 @llvm.s390.vuplg(<2 x i64> %{{.*}})
46   ui128 = __builtin_s390_vuplhg(vul);
47   // CHECK: call i128 @llvm.s390.vuplhg(<2 x i64> %{{.*}})
48   ui128 = __builtin_s390_vupllg(vul);
49   // CHECK: call i128 @llvm.s390.vupllg(<2 x i64> %{{.*}})
50 }
51 
52 void test_integer(void) {
53   si128 = __builtin_s390_vavgq(si128, si128);
54   // CHECK: call i128 @llvm.s390.vavgq(i128 %{{.*}}, i128 %{{.*}})
55   ui128 = __builtin_s390_vavglq(ui128, ui128);
56   // CHECK: call i128 @llvm.s390.vavglq(i128 %{{.*}}, i128 %{{.*}})
57 
58   vuc = __builtin_s390_veval(vuc, vuc, vuc, 0);
59   // CHECK: call <16 x i8> @llvm.s390.veval(<16 x i8> %{{.*}}, <16 x i8> %{{.*}}, <16 x i8> %{{.*}}, i32 0)
60 
61   vsl = __builtin_s390_vmahg(vsl, vsl, vsl);
62   // CHECK: call <2 x i64> @llvm.s390.vmahg(<2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}})
63   si128 = __builtin_s390_vmahq(si128, si128, si128);
64   // CHECK: call i128 @llvm.s390.vmahq(i128 %{{.*}}, i128 %{{.*}}, i128 %{{.*}})
65   vul = __builtin_s390_vmalhg(vul, vul, vul);
66   // CHECK: call <2 x i64> @llvm.s390.vmalhg(<2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}})
67   ui128 = __builtin_s390_vmalhq(ui128, ui128, ui128);
68   // CHECK: call i128 @llvm.s390.vmalhq(i128 %{{.*}}, i128 %{{.*}}, i128 %{{.*}})
69 
70   si128 = __builtin_s390_vmaeg(vsl, vsl, si128);
71   // CHECK: call i128 @llvm.s390.vmaeg(<2 x i64> %{{.*}}, <2 x i64> %{{.*}}, i128 %{{.*}})
72   ui128 = __builtin_s390_vmaleg(vul, vul, ui128);
73   // CHECK: call i128 @llvm.s390.vmaleg(<2 x i64> %{{.*}}, <2 x i64> %{{.*}}, i128 %{{.*}})
74   si128 = __builtin_s390_vmaog(vsl, vsl, si128);
75   // CHECK: call i128 @llvm.s390.vmaog(<2 x i64> %{{.*}}, <2 x i64> %{{.*}}, i128 %{{.*}})
76   ui128 = __builtin_s390_vmalog(vul, vul, ui128);
77   // CHECK: call i128 @llvm.s390.vmalog(<2 x i64> %{{.*}}, <2 x i64> %{{.*}}, i128 %{{.*}})
78 
79   vsl = __builtin_s390_vmhg(vsl, vsl);
80   // CHECK: call <2 x i64> @llvm.s390.vmhg(<2 x i64> %{{.*}}, <2 x i64> %{{.*}})
81   si128 = __builtin_s390_vmhq(si128, si128);
82   // CHECK: call i128 @llvm.s390.vmhq(i128 %{{.*}}, i128 %{{.*}})
83   vul = __builtin_s390_vmlhg(vul, vul);
84   // CHECK: call <2 x i64> @llvm.s390.vmlhg(<2 x i64> %{{.*}}, <2 x i64> %{{.*}})
85   ui128 = __builtin_s390_vmlhq(ui128, ui128);
86   // CHECK: call i128 @llvm.s390.vmlhq(i128 %{{.*}}, i128 %{{.*}})
87 
88   si128 = __builtin_s390_vmeg(vsl, vsl);
89   // CHECK: call i128 @llvm.s390.vmeg(<2 x i64> %{{.*}}, <2 x i64> %{{.*}})
90   ui128 = __builtin_s390_vmleg(vul, vul);
91   // CHECK: call i128 @llvm.s390.vmleg(<2 x i64> %{{.*}}, <2 x i64> %{{.*}})
92   si128 = __builtin_s390_vmog(vsl, vsl);
93   // CHECK: call i128 @llvm.s390.vmog(<2 x i64> %{{.*}}, <2 x i64> %{{.*}})
94   ui128 = __builtin_s390_vmlog(vul, vul);
95   // CHECK: call i128 @llvm.s390.vmlog(<2 x i64> %{{.*}}, <2 x i64> %{{.*}})
96 
97   si128 = __builtin_s390_vceqqs(ui128, ui128, &cc);
98   // CHECK: call { i128, i32 } @llvm.s390.vceqqs(i128 %{{.*}}, i128 %{{.*}})
99   si128 = __builtin_s390_vchqs(si128, si128, &cc);
100   // CHECK: call { i128, i32 } @llvm.s390.vchqs(i128 %{{.*}}, i128 %{{.*}})
101   si128 = __builtin_s390_vchlqs(ui128, ui128, &cc);
102   // CHECK: call { i128, i32 } @llvm.s390.vchlqs(i128 %{{.*}}, i128 %{{.*}})
103 }
104