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
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
;
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
;
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> %{{.*}})
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> %{{.*}})
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 %{{.*}})
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)
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 %{{.*}})
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 %{{.*}})
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 %{{.*}})
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> %{{.*}})
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 %{{.*}})