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