930 lines · c
1// REQUIRES: systemz-registered-target2// RUN: %clang_cc1 -target-cpu z14 -triple s390x-linux-gnu \3// RUN: -O2 -fzvector -flax-vector-conversions=none \4// RUN: -Wall -Wno-unused -Werror -emit-llvm %s -o - | FileCheck %s5// RUN: %clang_cc1 -target-cpu z14 -triple s390x-linux-gnu \6// RUN: -O2 -fzvector -flax-vector-conversions=none \7// RUN: -Wall -Wno-unused -Werror -S %s -o - | FileCheck %s --check-prefix=CHECK-ASM8 9#include <vecintrin.h>10 11volatile vector signed char vsc;12volatile vector signed short vss;13volatile vector signed int vsi;14volatile vector signed long long vsl;15volatile vector signed __int128 vslll;16volatile vector unsigned char vuc;17volatile vector unsigned short vus;18volatile vector unsigned int vui;19volatile vector unsigned long long vul;20volatile vector unsigned __int128 vulll;21volatile vector bool char vbc;22volatile vector bool short vbs;23volatile vector bool int vbi;24volatile vector bool long long vbl;25volatile vector bool __int128 vblll;26volatile vector float vf;27volatile vector double vd;28 29volatile signed char sc;30volatile signed short ss;31volatile signed int si;32volatile signed long long sl;33volatile unsigned char uc;34volatile unsigned short us;35volatile unsigned int ui;36volatile unsigned long long ul;37volatile float f;38volatile double d;39 40const void * volatile cptr;41const signed char * volatile cptrsc;42const signed short * volatile cptrss;43const signed int * volatile cptrsi;44const signed long long * volatile cptrsl;45const unsigned char * volatile cptruc;46const unsigned short * volatile cptrus;47const unsigned int * volatile cptrui;48const unsigned long long * volatile cptrul;49const float * volatile cptrf;50const double * volatile cptrd;51 52void * volatile ptr;53signed char * volatile ptrsc;54signed short * volatile ptrss;55signed int * volatile ptrsi;56signed long long * volatile ptrsl;57unsigned char * volatile ptruc;58unsigned short * volatile ptrus;59unsigned int * volatile ptrui;60unsigned long long * volatile ptrul;61float * volatile ptrf;62double * volatile ptrd;63 64volatile unsigned int len;65volatile int idx;66int cc;67 68void test_core(void) {69 // CHECK-ASM-LABEL: test_core70 vector float vf2;71 vector double vd2;72 73 f = vec_extract(vf, 0);74 // CHECK: extractelement <4 x float> %{{.*}}, i64 075 // CHECK-ASM: vstef76 f = vec_extract(vf, idx);77 // CHECK: extractelement <4 x float> %{{.*}}, i32 %{{.*}}78 // CHECK-ASM: vlgvf79 d = vec_extract(vd, 0);80 // CHECK: extractelement <2 x double> %{{.*}}, i64 081 // CHECK-ASM: vsteg82 d = vec_extract(vd, idx);83 // CHECK: extractelement <2 x double> %{{.*}}, i32 %{{.*}}84 // CHECK-ASM: vlgvg85 86 vf2 = vf;87 vf = vec_insert(f, vf2, 0);88 // CHECK: insertelement <4 x float> %{{.*}}, float %{{.*}}, i64 089 // CHECK-ASM: vlef90 vf = vec_insert(0.0f, vf, 1);91 // CHECK: insertelement <4 x float> %{{.*}}, float 0.000000e+00, i64 192 // CHECK-ASM: vleif %{{.*}}, 0, 193 vf = vec_insert(f, vf, idx);94 // CHECK: insertelement <4 x float> %{{.*}}, float %{{.*}}, i32 %{{.*}}95 // CHECK-ASM: vlvgf96 vd2 = vd;97 vd = vec_insert(d, vd2, 0);98 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i64 099 // CHECK-ASM: vleg100 vd = vec_insert(0.0, vd, 1);101 // CHECK: insertelement <2 x double> %{{.*}}, double 0.000000e+00, i64 1102 // CHECK-ASM: vleig %{{.*}}, 0, 1103 vd = vec_insert(d, vd, idx);104 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 %{{.*}}105 // CHECK-ASM: vlvgg106 107 vf = vec_promote(f, idx);108 // CHECK: insertelement <4 x float> poison, float %{{.*}}, i32 %{{.*}}109 // CHECK-ASM: vlvgf110 vd = vec_promote(d, idx);111 // CHECK: insertelement <2 x double> poison, double %{{.*}}, i32 %{{.*}}112 // CHECK-ASM: vlvgg113 114 vf = vec_insert_and_zero(cptrf);115 // CHECK: insertelement <4 x float> <float 0.000000e+00, float poison, float 0.000000e+00, float 0.000000e+00>, float %{{.*}}, i64 1116 // CHECK-ASM: vllezf117 vd = vec_insert_and_zero(cptrd);118 // CHECK: insertelement <2 x double> <double poison, double 0.000000e+00>, double %{{.*}}, i64 0119 // CHECK-ASM: vllezg120 121 vf = vec_perm(vf, vf, vuc);122 // CHECK: call <16 x i8> @llvm.s390.vperm(<16 x i8> %{{.*}}, <16 x i8> %{{.*}}, <16 x i8> %{{.*}})123 // CHECK-ASM: vperm124 vd = vec_perm(vd, vd, vuc);125 // CHECK: call <16 x i8> @llvm.s390.vperm(<16 x i8> %{{.*}}, <16 x i8> %{{.*}}, <16 x i8> %{{.*}})126 // CHECK-ASM: vperm127 128 vul = vec_bperm(vulll, vuc);129 // CHECK: call <2 x i64> @llvm.s390.vbperm(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})130 // CHECK-ASM: vbperm131 132 vul = vec_bperm_u128(vuc, vuc);133 // CHECK: call <2 x i64> @llvm.s390.vbperm(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})134 // CHECK-ASM: vbperm135 136 vf = vec_revb(vf);137 // CHECK-ASM: vperm138 vd = vec_revb(vd);139 // CHECK-ASM: vperm140 141 vf = vec_reve(vf);142 // CHECK-ASM: vperm143 vd = vec_reve(vd);144 // CHECK-ASM: {{vperm|vpdi}}145 146 vf = vec_sel(vf, vf, vui);147 // CHECK-ASM: vsel148 vf = vec_sel(vf, vf, vbi);149 // CHECK-ASM: vsel150 vd = vec_sel(vd, vd, vul);151 // CHECK-ASM: vsel152 vd = vec_sel(vd, vd, vbl);153 // CHECK-ASM: vsel154 155 vf = vec_gather_element(vf, vui, cptrf, 0);156 // CHECK-ASM: vgef %{{.*}}, 0(%{{.*}},%{{.*}}), 0157 vf = vec_gather_element(vf, vui, cptrf, 1);158 // CHECK-ASM: vgef %{{.*}}, 0(%{{.*}},%{{.*}}), 1159 vf = vec_gather_element(vf, vui, cptrf, 2);160 // CHECK-ASM: vgef %{{.*}}, 0(%{{.*}},%{{.*}}), 2161 vf = vec_gather_element(vf, vui, cptrf, 3);162 // CHECK-ASM: vgef %{{.*}}, 0(%{{.*}},%{{.*}}), 3163 vd = vec_gather_element(vd, vul, cptrd, 0);164 // CHECK-ASM: vgeg %{{.*}}, 0(%{{.*}},%{{.*}}), 0165 vd = vec_gather_element(vd, vul, cptrd, 1);166 // CHECK-ASM: vgeg %{{.*}}, 0(%{{.*}},%{{.*}}), 1167 168 vec_scatter_element(vf, vui, ptrf, 0);169 // CHECK-ASM: vscef %{{.*}}, 0(%{{.*}},%{{.*}}), 0170 vec_scatter_element(vf, vui, ptrf, 1);171 // CHECK-ASM: vscef %{{.*}}, 0(%{{.*}},%{{.*}}), 1172 vec_scatter_element(vf, vui, ptrf, 2);173 // CHECK-ASM: vscef %{{.*}}, 0(%{{.*}},%{{.*}}), 2174 vec_scatter_element(vf, vui, ptrf, 3);175 // CHECK-ASM: vscef %{{.*}}, 0(%{{.*}},%{{.*}}), 3176 vec_scatter_element(vd, vul, ptrd, 0);177 // CHECK-ASM: vsceg %{{.*}}, 0(%{{.*}},%{{.*}}), 0178 vec_scatter_element(vd, vul, ptrd, 1);179 // CHECK-ASM: vsceg %{{.*}}, 0(%{{.*}},%{{.*}}), 1180 181 vf = vec_xl(idx, cptrf);182 // CHECK-ASM: vl183 vd = vec_xl(idx, cptrd);184 // CHECK-ASM: vl185 186 vec_xst(vf, idx, ptrf);187 // CHECK-ASM: vst188 vec_xst(vd, idx, ptrd);189 // CHECK-ASM: vst190 191 vd = vec_load_bndry(cptrd, 64);192 // CHECK: call <16 x i8> @llvm.s390.vlbb(ptr %{{.*}}, i32 0)193 // CHECK-ASM: vlbb194 vf = vec_load_bndry(cptrf, 64);195 // CHECK: call <16 x i8> @llvm.s390.vlbb(ptr %{{.*}}, i32 0)196 // CHECK-ASM: vlbb197 vf = vec_load_bndry(cptrf, 128);198 // CHECK: call <16 x i8> @llvm.s390.vlbb(ptr %{{.*}}, i32 1)199 // CHECK-ASM: vlbb200 vf = vec_load_bndry(cptrf, 256);201 // CHECK: call <16 x i8> @llvm.s390.vlbb(ptr %{{.*}}, i32 2)202 // CHECK-ASM: vlbb203 vf = vec_load_bndry(cptrf, 512);204 // CHECK: call <16 x i8> @llvm.s390.vlbb(ptr %{{.*}}, i32 3)205 // CHECK-ASM: vlbb206 vf = vec_load_bndry(cptrf, 1024);207 // CHECK: call <16 x i8> @llvm.s390.vlbb(ptr %{{.*}}, i32 4)208 // CHECK-ASM: vlbb209 vf = vec_load_bndry(cptrf, 2048);210 // CHECK: call <16 x i8> @llvm.s390.vlbb(ptr %{{.*}}, i32 5)211 // CHECK-ASM: vlbb212 vf = vec_load_bndry(cptrf, 4096);213 // CHECK: call <16 x i8> @llvm.s390.vlbb(ptr %{{.*}}, i32 6)214 // CHECK-ASM: vlbb215 216 vf = vec_load_len(cptrf, idx);217 // CHECK: call <16 x i8> @llvm.s390.vll(i32 %{{.*}}, ptr %{{.*}})218 // CHECK-ASM: vll219 vd = vec_load_len(cptrd, idx);220 // CHECK: call <16 x i8> @llvm.s390.vll(i32 %{{.*}}, ptr %{{.*}})221 // CHECK-ASM: vll222 223 vec_store_len(vf, ptrf, idx);224 // CHECK: call void @llvm.s390.vstl(<16 x i8> %{{.*}}, i32 %{{.*}}, ptr %{{.*}})225 // CHECK-ASM: vstl226 vec_store_len(vd, ptrd, idx);227 // CHECK: call void @llvm.s390.vstl(<16 x i8> %{{.*}}, i32 %{{.*}}, ptr %{{.*}})228 // CHECK-ASM: vstl229 230 vsc = vec_load_len_r(cptrsc, 0);231 // CHECK: call <16 x i8> @llvm.s390.vlrl(i32 0, ptr %{{.*}})232 // CHECK-ASM: vlrl %{{.*}}, 0(%{{.*}}), 0233 vsc = vec_load_len_r(cptrsc, idx);234 // CHECK: call <16 x i8> @llvm.s390.vlrl(i32 %{{.*}}, ptr %{{.*}})235 // CHECK-ASM: vlrlr236 vuc = vec_load_len_r(cptruc, 0);237 // CHECK: call <16 x i8> @llvm.s390.vlrl(i32 0, ptr %{{.*}})238 // CHECK-ASM: vlrl %{{.*}}, 0(%{{.*}}), 0239 vuc = vec_load_len_r(cptruc, idx);240 // CHECK: call <16 x i8> @llvm.s390.vlrl(i32 %{{.*}}, ptr %{{.*}})241 // CHECK-ASM: vlrlr242 243 vec_store_len_r(vsc, ptrsc, 0);244 // CHECK: call void @llvm.s390.vstrl(<16 x i8> %{{.*}}, i32 0, ptr %{{.*}})245 // CHECK-ASM: vstrl %{{.*}}, 0(%{{.*}}), 0246 vec_store_len_r(vsc, ptrsc, idx);247 // CHECK: call void @llvm.s390.vstrl(<16 x i8> %{{.*}}, i32 %{{.*}}, ptr %{{.*}})248 // CHECK-ASM: vstrlr249 vec_store_len_r(vuc, ptruc, 0);250 // CHECK: call void @llvm.s390.vstrl(<16 x i8> %{{.*}}, i32 0, ptr %{{.*}})251 // CHECK-ASM: vstrl %{{.*}}, 0(%{{.*}}), 0252 vec_store_len_r(vuc, ptruc, idx);253 // CHECK: call void @llvm.s390.vstrl(<16 x i8> %{{.*}}, i32 %{{.*}}, ptr %{{.*}})254 // CHECK-ASM: vstrlr255 256 vf = vec_splat(vf, 0);257 // CHECK: shufflevector <4 x float> %{{.*}}, <4 x float> poison, <4 x i32> zeroinitializer258 // CHECK-ASM: vrepf259 vf = vec_splat(vf, 1);260 // CHECK: shufflevector <4 x float> %{{.*}}, <4 x float> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>261 // CHECK-ASM: vrepf262 vd = vec_splat(vd, 0);263 // CHECK: shufflevector <2 x double> %{{.*}}, <2 x double> poison, <2 x i32> zeroinitializer264 // CHECK-ASM: vrepg265 vd = vec_splat(vd, 1);266 // CHECK: shufflevector <2 x double> %{{.*}}, <2 x double> poison, <2 x i32> <i32 1, i32 1>267 // CHECK-ASM: vrepg268 269 vf = vec_splats(f);270 // CHECK: shufflevector <4 x float> %{{.*}}, <4 x float> poison, <4 x i32> zeroinitializer271 // CHECK-ASM: vlrepf272 vd = vec_splats(d);273 // CHECK: shufflevector <2 x double> %{{.*}}, <2 x double> poison, <2 x i32> zeroinitializer274 // CHECK-ASM: vlrepg275 276 vf = vec_mergeh(vf, vf);277 // shufflevector <4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x i32> <i32 0, i32 4, i32 1, i32 5>278 // CHECK-ASM: vmrhf279 vd = vec_mergeh(vd, vd);280 // shufflevector <2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x i32> <i32 0, i32 2>281 // CHECK-ASM: vmrhg282 283 vf = vec_mergel(vf, vf);284 // shufflevector <4 x float> %{{.*}}, <4 x float> %{{.*}}, <i32 2, i32 6, i32 3, i32 7>285 // CHECK-ASM: vmrlf286 vd = vec_mergel(vd, vd);287 // shufflevector <2 x double> %{{.*}}, <2 x double> %{{.*}}, <i32 1, i32 3>288 // CHECK-ASM: vmrlg289}290 291void test_compare(void) {292 // CHECK-ASM-LABEL: test_compare293 294 vbi = vec_cmpeq(vf, vf);295 // CHECK: fcmp oeq <4 x float> %{{.*}}, %{{.*}}296 // CHECK-ASM: vfcesb297 vbl = vec_cmpeq(vd, vd);298 // CHECK: fcmp oeq <2 x double> %{{.*}}, %{{.*}}299 // CHECK-ASM: vfcedb300 301 vbi = vec_cmpge(vf, vf);302 // CHECK: fcmp oge <4 x float> %{{.*}}, %{{.*}}303 // CHECK-ASM: vfchesb304 vbl = vec_cmpge(vd, vd);305 // CHECK: fcmp oge <2 x double> %{{.*}}, %{{.*}}306 // CHECK-ASM: vfchedb307 308 vbi = vec_cmpgt(vf, vf);309 // CHECK: fcmp ogt <4 x float> %{{.*}}, %{{.*}}310 // CHECK-ASM: vfchsb311 vbl = vec_cmpgt(vd, vd);312 // CHECK: fcmp ogt <2 x double> %{{.*}}, %{{.*}}313 // CHECK-ASM: vfchdb314 315 vbi = vec_cmple(vf, vf);316 // CHECK: fcmp ole <4 x float> %{{.*}}, %{{.*}}317 // CHECK-ASM: vfchesb318 vbl = vec_cmple(vd, vd);319 // CHECK: fcmp ole <2 x double> %{{.*}}, %{{.*}}320 // CHECK-ASM: vfchedb321 322 vbi = vec_cmplt(vf, vf);323 // CHECK: fcmp olt <4 x float> %{{.*}}, %{{.*}}324 // CHECK-ASM: vfchsb325 vbl = vec_cmplt(vd, vd);326 // CHECK: fcmp olt <2 x double> %{{.*}}, %{{.*}}327 // CHECK-ASM: vfchdb328 329 idx = vec_all_eq(vf, vf);330 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfcesbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})331 // CHECK-ASM: vfcesbs332 idx = vec_all_eq(vd, vd);333 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfcedbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})334 // CHECK-ASM: vfcedbs335 336 idx = vec_all_ne(vf, vf);337 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfcesbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})338 // CHECK-ASM: vfcesbs339 idx = vec_all_ne(vd, vd);340 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfcedbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})341 // CHECK-ASM: vfcedbs342 343 idx = vec_all_ge(vf, vf);344 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchesbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})345 // CHECK-ASM: vfchesbs346 idx = vec_all_ge(vd, vd);347 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchedbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})348 // CHECK-ASM: vfchedbs349 350 idx = vec_all_gt(vf, vf);351 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchsbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})352 // CHECK-ASM: vfchsbs353 idx = vec_all_gt(vd, vd);354 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchdbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})355 // CHECK-ASM: vfchdbs356 357 idx = vec_all_le(vf, vf);358 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchesbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})359 // CHECK-ASM: vfchesbs360 idx = vec_all_le(vd, vd);361 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchedbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})362 // CHECK-ASM: vfchedbs363 364 idx = vec_all_lt(vf, vf);365 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchsbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})366 // CHECK-ASM: vfchsbs367 idx = vec_all_lt(vd, vd);368 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchdbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})369 // CHECK-ASM: vfchdbs370 371 idx = vec_all_nge(vf, vf);372 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchesbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})373 // CHECK-ASM: vfchesbs374 idx = vec_all_nge(vd, vd);375 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchedbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})376 // CHECK-ASM: vfchedbs377 378 idx = vec_all_ngt(vf, vf);379 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchsbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})380 // CHECK-ASM: vfchsbs381 idx = vec_all_ngt(vd, vd);382 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchdbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})383 // CHECK-ASM: vfchdbs384 385 idx = vec_all_nle(vf, vf);386 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchesbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})387 // CHECK-ASM: vfchesbs388 idx = vec_all_nle(vd, vd);389 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchedbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})390 // CHECK-ASM: vfchedbs391 392 idx = vec_all_nlt(vf, vf);393 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchsbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})394 // CHECK-ASM: vfchsbs395 idx = vec_all_nlt(vd, vd);396 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchdbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})397 // CHECK-ASM: vfchdbs398 399 idx = vec_all_nan(vf);400 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vftcisb(<4 x float> %{{.*}}, i32 15)401 // CHECK-ASM: vftcisb402 idx = vec_all_nan(vd);403 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vftcidb(<2 x double> %{{.*}}, i32 15)404 // CHECK-ASM: vftcidb405 406 idx = vec_all_numeric(vf);407 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vftcisb(<4 x float> %{{.*}}, i32 15)408 // CHECK-ASM: vftcisb409 idx = vec_all_numeric(vd);410 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vftcidb(<2 x double> %{{.*}}, i32 15)411 // CHECK-ASM: vftcidb412 413 idx = vec_any_eq(vf, vf);414 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfcesbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})415 // CHECK-ASM: vfcesbs416 idx = vec_any_eq(vd, vd);417 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfcedbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})418 // CHECK-ASM: vfcedbs419 420 idx = vec_any_ne(vf, vf);421 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfcesbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})422 // CHECK-ASM: vfcesbs423 idx = vec_any_ne(vd, vd);424 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfcedbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})425 // CHECK-ASM: vfcedbs426 427 idx = vec_any_ge(vf, vf);428 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchesbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})429 // CHECK-ASM: vfchesbs430 idx = vec_any_ge(vd, vd);431 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchedbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})432 // CHECK-ASM: vfchedbs433 434 idx = vec_any_gt(vf, vf);435 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchsbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})436 // CHECK-ASM: vfchsbs437 idx = vec_any_gt(vd, vd);438 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchdbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})439 // CHECK-ASM: vfchdbs440 441 idx = vec_any_le(vf, vf);442 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchesbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})443 // CHECK-ASM: vfchesbs444 idx = vec_any_le(vd, vd);445 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchedbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})446 // CHECK-ASM: vfchedbs447 448 idx = vec_any_lt(vf, vf);449 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchsbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})450 // CHECK-ASM: vfchsbs451 idx = vec_any_lt(vd, vd);452 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchdbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})453 // CHECK-ASM: vfchdbs454 455 idx = vec_any_nge(vf, vf);456 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchesbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})457 // CHECK-ASM: vfchesbs458 idx = vec_any_nge(vd, vd);459 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchedbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})460 // CHECK-ASM: vfchedbs461 462 idx = vec_any_ngt(vf, vf);463 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchsbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})464 // CHECK-ASM: vfchsbs465 idx = vec_any_ngt(vd, vd);466 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchdbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})467 // CHECK-ASM: vfchdbs468 469 idx = vec_any_nle(vf, vf);470 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchesbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})471 // CHECK-ASM: vfchesbs472 idx = vec_any_nle(vd, vd);473 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchedbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})474 // CHECK-ASM: vfchedbs475 476 idx = vec_any_nlt(vf, vf);477 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchsbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})478 // CHECK-ASM: vfchsbs479 idx = vec_any_nlt(vd, vd);480 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchdbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})481 // CHECK-ASM: vfchdbs482 483 idx = vec_any_nan(vf);484 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vftcisb(<4 x float> %{{.*}}, i32 15)485 // CHECK-ASM: vftcisb486 idx = vec_any_nan(vd);487 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vftcidb(<2 x double> %{{.*}}, i32 15)488 // CHECK-ASM: vftcidb489 490 idx = vec_any_numeric(vf);491 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vftcisb(<4 x float> %{{.*}}, i32 15)492 // CHECK-ASM: vftcisb493 idx = vec_any_numeric(vd);494 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vftcidb(<2 x double> %{{.*}}, i32 15)495 // CHECK-ASM: vftcidb496}497 498void test_integer(void) {499 // CHECK-ASM-LABEL: test_integer500 501 vf = vec_and(vf, vf);502 // CHECK-ASM: vn503 vd = vec_and(vd, vd);504 // CHECK-ASM: vn505 506 vf = vec_or(vf, vf);507 // CHECK-ASM: vo508 vd = vec_or(vd, vd);509 // CHECK-ASM: vo510 511 vf = vec_xor(vf, vf);512 // CHECK-ASM: vx513 vd = vec_xor(vd, vd);514 // CHECK-ASM: vx515 516 vf = vec_andc(vf, vf);517 // CHECK-ASM: vnc518 vd = vec_andc(vd, vd);519 // CHECK-ASM: vnc520 521 vf = vec_nor(vf, vf);522 // CHECK-ASM: vno523 vd = vec_nor(vd, vd);524 // CHECK-ASM: vno525 526 vsc = vec_nand(vsc, vsc);527 // CHECK-ASM: vnn528 vuc = vec_nand(vuc, vuc);529 // CHECK-ASM: vnn530 vbc = vec_nand(vbc, vbc);531 // CHECK-ASM: vnn532 vss = vec_nand(vss, vss);533 // CHECK-ASM: vnn534 vus = vec_nand(vus, vus);535 // CHECK-ASM: vnn536 vbs = vec_nand(vbs, vbs);537 // CHECK-ASM: vnn538 vsi = vec_nand(vsi, vsi);539 // CHECK-ASM: vnn540 vui = vec_nand(vui, vui);541 // CHECK-ASM: vnn542 vbi = vec_nand(vbi, vbi);543 // CHECK-ASM: vnn544 vsl = vec_nand(vsl, vsl);545 // CHECK-ASM: vnn546 vul = vec_nand(vul, vul);547 // CHECK-ASM: vnn548 vbl = vec_nand(vbl, vbl);549 // CHECK-ASM: vnn550 vslll = vec_nand(vslll, vslll);551 // CHECK-ASM: vnn552 vulll = vec_nand(vulll, vulll);553 // CHECK-ASM: vnn554 vblll = vec_nand(vblll, vblll);555 // CHECK-ASM: vnn556 vf = vec_nand(vf, vf);557 // CHECK-ASM: vnn558 vd = vec_nand(vd, vd);559 // CHECK-ASM: vnn560 561 vsc = vec_orc(vsc, vsc);562 // CHECK-ASM: voc563 vuc = vec_orc(vuc, vuc);564 // CHECK-ASM: voc565 vbc = vec_orc(vbc, vbc);566 // CHECK-ASM: voc567 vss = vec_orc(vss, vss);568 // CHECK-ASM: voc569 vus = vec_orc(vus, vus);570 // CHECK-ASM: voc571 vbs = vec_orc(vbs, vbs);572 // CHECK-ASM: voc573 vsi = vec_orc(vsi, vsi);574 // CHECK-ASM: voc575 vui = vec_orc(vui, vui);576 // CHECK-ASM: voc577 vbi = vec_orc(vbi, vbi);578 // CHECK-ASM: voc579 vsl = vec_orc(vsl, vsl);580 // CHECK-ASM: voc581 vul = vec_orc(vul, vul);582 // CHECK-ASM: voc583 vbl = vec_orc(vbl, vbl);584 // CHECK-ASM: voc585 vslll = vec_orc(vslll, vslll);586 // CHECK-ASM: voc587 vulll = vec_orc(vulll, vulll);588 // CHECK-ASM: voc589 vblll = vec_orc(vblll, vblll);590 // CHECK-ASM: voc591 vf = vec_orc(vf, vf);592 // CHECK-ASM: voc593 vd = vec_orc(vd, vd);594 // CHECK-ASM: voc595 596 vsc = vec_eqv(vsc, vsc);597 // CHECK-ASM: vnx598 vuc = vec_eqv(vuc, vuc);599 // CHECK-ASM: vnx600 vbc = vec_eqv(vbc, vbc);601 // CHECK-ASM: vnx602 vss = vec_eqv(vss, vss);603 // CHECK-ASM: vnx604 vus = vec_eqv(vus, vus);605 // CHECK-ASM: vnx606 vbs = vec_eqv(vbs, vbs);607 // CHECK-ASM: vnx608 vsi = vec_eqv(vsi, vsi);609 // CHECK-ASM: vnx610 vui = vec_eqv(vui, vui);611 // CHECK-ASM: vnx612 vbi = vec_eqv(vbi, vbi);613 // CHECK-ASM: vnx614 vsl = vec_eqv(vsl, vsl);615 // CHECK-ASM: vnx616 vul = vec_eqv(vul, vul);617 // CHECK-ASM: vnx618 vbl = vec_eqv(vbl, vbl);619 // CHECK-ASM: vnx620 vslll = vec_eqv(vslll, vslll);621 // CHECK-ASM: vnx622 vulll = vec_eqv(vulll, vulll);623 // CHECK-ASM: vnx624 vblll = vec_eqv(vblll, vblll);625 // CHECK-ASM: vnx626 vf = vec_eqv(vf, vf);627 // CHECK-ASM: vnx628 vd = vec_eqv(vd, vd);629 // CHECK-ASM: vnx630 631 vuc = vec_popcnt(vsc);632 // CHECK: call range(i8 0, 9) <16 x i8> @llvm.ctpop.v16i8(<16 x i8> %{{.*}})633 // CHECK-ASM: vpopctb634 vuc = vec_popcnt(vuc);635 // CHECK: call range(i8 0, 9) <16 x i8> @llvm.ctpop.v16i8(<16 x i8> %{{.*}})636 // CHECK-ASM: vpopctb637 vus = vec_popcnt(vss);638 // CHECK: call range(i16 0, 17) <8 x i16> @llvm.ctpop.v8i16(<8 x i16> %{{.*}})639 // CHECK-ASM: vpopcth640 vus = vec_popcnt(vus);641 // CHECK: call range(i16 0, 17) <8 x i16> @llvm.ctpop.v8i16(<8 x i16> %{{.*}})642 // CHECK-ASM: vpopcth643 vui = vec_popcnt(vsi);644 // CHECK: call range(i32 0, 33) <4 x i32> @llvm.ctpop.v4i32(<4 x i32> %{{.*}})645 // CHECK-ASM: vpopctf646 vui = vec_popcnt(vui);647 // CHECK: call range(i32 0, 33) <4 x i32> @llvm.ctpop.v4i32(<4 x i32> %{{.*}})648 // CHECK-ASM: vpopctf649 vul = vec_popcnt(vsl);650 // CHECK: call range(i64 0, 65) <2 x i64> @llvm.ctpop.v2i64(<2 x i64> %{{.*}})651 // CHECK-ASM: vpopctg652 vul = vec_popcnt(vul);653 // CHECK: call range(i64 0, 65) <2 x i64> @llvm.ctpop.v2i64(<2 x i64> %{{.*}})654 // CHECK-ASM: vpopctg655 656 vf = vec_slb(vf, vsi);657 // CHECK: call <16 x i8> @llvm.s390.vslb(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})658 // CHECK-ASM: vslb659 vf = vec_slb(vf, vui);660 // CHECK: call <16 x i8> @llvm.s390.vslb(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})661 // CHECK-ASM: vslb662 vf = vec_slb(vf, vuc);663 // CHECK: call <16 x i8> @llvm.s390.vslb(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})664 // CHECK-ASM: vslb665 vd = vec_slb(vd, vsl);666 // CHECK: call <16 x i8> @llvm.s390.vslb(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})667 // CHECK-ASM: vslb668 vd = vec_slb(vd, vul);669 // CHECK: call <16 x i8> @llvm.s390.vslb(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})670 // CHECK-ASM: vslb671 vd = vec_slb(vd, vuc);672 // CHECK: call <16 x i8> @llvm.s390.vslb(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})673 // CHECK-ASM: vslb674 675 vf = vec_sld(vf, vf, 0);676 // CHECK: call <16 x i8> @llvm.s390.vsldb(<16 x i8> %{{.*}}, <16 x i8> %{{.*}}, i32 0)677 // CHECK-ASM: vsldb678 vf = vec_sld(vf, vf, 15);679 // CHECK: call <16 x i8> @llvm.s390.vsldb(<16 x i8> %{{.*}}, <16 x i8> %{{.*}}, i32 15)680 // CHECK-ASM: vsldb681 vd = vec_sld(vd, vd, 0);682 // CHECK: call <16 x i8> @llvm.s390.vsldb(<16 x i8> %{{.*}}, <16 x i8> %{{.*}}, i32 0)683 // CHECK-ASM: vsldb684 vd = vec_sld(vd, vd, 15);685 // CHECK: call <16 x i8> @llvm.s390.vsldb(<16 x i8> %{{.*}}, <16 x i8> %{{.*}}, i32 15)686 // CHECK-ASM: vsldb687 688 vf = vec_srab(vf, vsi);689 // CHECK: call <16 x i8> @llvm.s390.vsrab(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})690 // CHECK-ASM: vsrab691 vf = vec_srab(vf, vui);692 // CHECK: call <16 x i8> @llvm.s390.vsrab(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})693 // CHECK-ASM: vsrab694 vf = vec_srab(vf, vuc);695 // CHECK: call <16 x i8> @llvm.s390.vsrab(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})696 // CHECK-ASM: vsrab697 vd = vec_srab(vd, vsl);698 // CHECK: call <16 x i8> @llvm.s390.vsrab(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})699 // CHECK-ASM: vsrab700 vd = vec_srab(vd, vul);701 // CHECK: call <16 x i8> @llvm.s390.vsrab(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})702 // CHECK-ASM: vsrab703 vd = vec_srab(vd, vuc);704 // CHECK: call <16 x i8> @llvm.s390.vsrab(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})705 // CHECK-ASM: vsrab706 707 vf = vec_srb(vf, vsi);708 // CHECK: call <16 x i8> @llvm.s390.vsrlb(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})709 // CHECK-ASM: vsrlb710 vf = vec_srb(vf, vui);711 // CHECK: call <16 x i8> @llvm.s390.vsrlb(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})712 // CHECK-ASM: vsrlb713 vf = vec_srb(vf, vuc);714 // CHECK: call <16 x i8> @llvm.s390.vsrlb(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})715 // CHECK-ASM: vsrlb716 vd = vec_srb(vd, vsl);717 // CHECK: call <16 x i8> @llvm.s390.vsrlb(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})718 // CHECK-ASM: vsrlb719 vd = vec_srb(vd, vul);720 // CHECK: call <16 x i8> @llvm.s390.vsrlb(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})721 // CHECK-ASM: vsrlb722 vd = vec_srb(vd, vuc);723 // CHECK: call <16 x i8> @llvm.s390.vsrlb(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})724 // CHECK-ASM: vsrlb725 726 idx = vec_test_mask(vf, vui);727 // CHECK: call i32 @llvm.s390.vtm(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})728 // CHECK-ASM: vtm729 idx = vec_test_mask(vd, vul);730 // CHECK: call i32 @llvm.s390.vtm(<16 x i8> %{{.*}}, <16 x i8> %{{.*}})731 // CHECK-ASM: vtm732 733 vulll = vec_msum(vul, vul, vulll, 0);734 // CHECK: call i128 @llvm.s390.vmslg(<2 x i64> %{{.*}}, <2 x i64> %{{.*}}, i128 %{{.*}}, i32 0)735 // CHECK-ASM: vmslg736 vulll = vec_msum(vul, vul, vulll, 4);737 // CHECK: call i128 @llvm.s390.vmslg(<2 x i64> %{{.*}}, <2 x i64> %{{.*}}, i128 %{{.*}}, i32 4)738 // CHECK-ASM: vmslg739 vulll = vec_msum(vul, vul, vulll, 8);740 // CHECK: call i128 @llvm.s390.vmslg(<2 x i64> %{{.*}}, <2 x i64> %{{.*}}, i128 %{{.*}}, i32 8)741 // CHECK-ASM: vmslg742 vulll = vec_msum(vul, vul, vulll, 12);743 // CHECK: call i128 @llvm.s390.vmslg(<2 x i64> %{{.*}}, <2 x i64> %{{.*}}, i128 %{{.*}}, i32 12)744 // CHECK-ASM: vmslg745 746 vuc = vec_msum_u128(vul, vul, vuc, 0);747 // CHECK: call i128 @llvm.s390.vmslg(<2 x i64> %{{.*}}, <2 x i64> %{{.*}}, i128 %{{.*}}, i32 0)748 // CHECK-ASM: vmslg749 vuc = vec_msum_u128(vul, vul, vuc, 4);750 // CHECK: call i128 @llvm.s390.vmslg(<2 x i64> %{{.*}}, <2 x i64> %{{.*}}, i128 %{{.*}}, i32 4)751 // CHECK-ASM: vmslg752 vuc = vec_msum_u128(vul, vul, vuc, 8);753 // CHECK: call i128 @llvm.s390.vmslg(<2 x i64> %{{.*}}, <2 x i64> %{{.*}}, i128 %{{.*}}, i32 8)754 // CHECK-ASM: vmslg755 vuc = vec_msum_u128(vul, vul, vuc, 12);756 // CHECK: call i128 @llvm.s390.vmslg(<2 x i64> %{{.*}}, <2 x i64> %{{.*}}, i128 %{{.*}}, i32 12)757 // CHECK-ASM: vmslg758}759 760void test_float(void) {761 // CHECK-ASM-LABEL: test_float762 763 vf = vec_abs(vf);764 // CHECK: call <4 x float> @llvm.fabs.v4f32(<4 x float> %{{.*}})765 // CHECK-ASM: vflpsb766 vd = vec_abs(vd);767 // CHECK: call <2 x double> @llvm.fabs.v2f64(<2 x double> %{{.*}})768 // CHECK-ASM: vflpdb769 770 vf = vec_nabs(vf);771 // CHECK: [[ABS:%[^ ]+]] = tail call <4 x float> @llvm.fabs.v4f32(<4 x float> %{{.*}})772 // CHECK-NEXT: fneg <4 x float> [[ABS]]773 // CHECK-ASM: vflnsb774 vd = vec_nabs(vd);775 // CHECK: [[ABS:%[^ ]+]] = tail call <2 x double> @llvm.fabs.v2f64(<2 x double> %{{.*}})776 // CHECK-NEXT: fneg <2 x double> [[ABS]]777 // CHECK-ASM: vflndb778 779 vf = vec_max(vf, vf);780 // CHECK: call <4 x float> @llvm.s390.vfmaxsb(<4 x float> %{{.*}}, <4 x float> %{{.*}}, i32 0)781 // CHECK-ASM: vfmaxsb782 vd = vec_max(vd, vd);783 // CHECK: call <2 x double> @llvm.s390.vfmaxdb(<2 x double> %{{.*}}, <2 x double> %{{.*}}, i32 0)784 // CHECK-ASM: vfmaxdb785 786 vf = vec_min(vf, vf);787 // CHECK: call <4 x float> @llvm.s390.vfminsb(<4 x float> %{{.*}}, <4 x float> %{{.*}}, i32 0)788 // CHECK-ASM: vfminsb789 vd = vec_min(vd, vd);790 // CHECK: call <2 x double> @llvm.s390.vfmindb(<2 x double> %{{.*}}, <2 x double> %{{.*}}, i32 0)791 // CHECK-ASM: vfmindb792 793 vf = vec_madd(vf, vf, vf);794 // CHECK: call <4 x float> @llvm.fma.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> %{{.*}})795 // CHECK-ASM: vfmasb796 vd = vec_madd(vd, vd, vd);797 // CHECK: call <2 x double> @llvm.fma.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> %{{.*}})798 // CHECK-ASM: vfmadb799 800 vf = vec_msub(vf, vf, vf);801 // CHECK: [[NEG:%[^ ]+]] = fneg <4 x float> %{{.*}}802 // CHECK: call <4 x float> @llvm.fma.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> [[NEG]])803 // CHECK-ASM: vfmssb804 vd = vec_msub(vd, vd, vd);805 // CHECK: [[NEG:%[^ ]+]] = fneg <2 x double> %{{.*}}806 // CHECK: call <2 x double> @llvm.fma.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> [[NEG]])807 // CHECK-ASM: vfmsdb808 809 vf = vec_nmadd(vf, vf, vf);810 // CHECK: [[RES:%[^ ]+]] = tail call <4 x float> @llvm.fma.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> %{{.*}})811 // CHECK: fneg <4 x float> [[RES]]812 // CHECK-ASM: vfnmasb813 vd = vec_nmadd(vd, vd, vd);814 // CHECK: [[RES:%[^ ]+]] = tail call <2 x double> @llvm.fma.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> %{{.*}})815 // CHECK: fneg <2 x double> [[RES]]816 // CHECK-ASM: vfnmadb817 818 vf = vec_nmsub(vf, vf, vf);819 // CHECK: [[NEG:%[^ ]+]] = fneg <4 x float> %{{.*}}820 // CHECK: [[RES:%[^ ]+]] = tail call <4 x float> @llvm.fma.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> [[NEG]])821 // CHECK: fneg <4 x float> [[RES]]822 // CHECK-ASM: vfnmssb823 vd = vec_nmsub(vd, vd, vd);824 // CHECK: [[NEG:%[^ ]+]] = fneg <2 x double> %{{.*}}825 // CHECK: [[RES:%[^ ]+]] = tail call <2 x double> @llvm.fma.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> [[NEG]])826 // CHECK: fneg <2 x double> [[RES]]827 // CHECK-ASM: vfnmsdb828 829 vf = vec_sqrt(vf);830 // CHECK: call <4 x float> @llvm.sqrt.v4f32(<4 x float> %{{.*}})831 // CHECK-ASM: vfsqsb832 vd = vec_sqrt(vd);833 // CHECK: call <2 x double> @llvm.sqrt.v2f64(<2 x double> %{{.*}})834 // CHECK-ASM: vfsqdb835 836 vd = vec_doublee(vf);837 // CHECK: fpext <2 x float> %{{.*}} to <2 x double>838 // CHECK-ASM: vldeb839 vf = vec_floate(vd);840 // CHECK: fptrunc <2 x double> %{{.*}} to <2 x float>841 // CHECK-ASM: vledb842 843 vd = vec_double(vsl);844 // CHECK: sitofp <2 x i64> %{{.*}} to <2 x double>845 // CHECK-ASM: vcdgb846 vd = vec_double(vul);847 // CHECK: uitofp <2 x i64> %{{.*}} to <2 x double>848 // CHECK-ASM: vcdlgb849 850 vsl = vec_signed(vd);851 // CHECK: fptosi <2 x double> %{{.*}} to <2 x i64>852 // CHECK-ASM: vcgdb853 vul = vec_unsigned(vd);854 // CHECK: fptoui <2 x double> %{{.*}} to <2 x i64>855 // CHECK-ASM: vclgdb856 857 vf = vec_roundp(vf);858 // CHECK: call <4 x float> @llvm.ceil.v4f32(<4 x float> %{{.*}})859 // CHECK-ASM: vfisb %{{.*}}, %{{.*}}, 4, 6860 vf = vec_ceil(vf);861 // CHECK: call <4 x float> @llvm.ceil.v4f32(<4 x float> %{{.*}})862 // CHECK-ASM: vfisb %{{.*}}, %{{.*}}, 4, 6863 vd = vec_roundp(vd);864 // CHECK: call <2 x double> @llvm.ceil.v2f64(<2 x double> %{{.*}})865 // CHECK-ASM: vfidb %{{.*}}, %{{.*}}, 4, 6866 vd = vec_ceil(vd);867 // CHECK: call <2 x double> @llvm.ceil.v2f64(<2 x double> %{{.*}})868 // CHECK-ASM: vfidb %{{.*}}, %{{.*}}, 4, 6869 870 vf = vec_roundm(vf);871 // CHECK: call <4 x float> @llvm.floor.v4f32(<4 x float> %{{.*}})872 // CHECK-ASM: vfisb %{{.*}}, %{{.*}}, 4, 7873 vf = vec_floor(vf);874 // CHECK: call <4 x float> @llvm.floor.v4f32(<4 x float> %{{.*}})875 // CHECK-ASM: vfisb %{{.*}}, %{{.*}}, 4, 7876 vd = vec_roundm(vd);877 // CHECK: call <2 x double> @llvm.floor.v2f64(<2 x double> %{{.*}})878 // CHECK-ASM: vfidb %{{.*}}, %{{.*}}, 4, 7879 vd = vec_floor(vd);880 // CHECK: call <2 x double> @llvm.floor.v2f64(<2 x double> %{{.*}})881 // CHECK-ASM: vfidb %{{.*}}, %{{.*}}, 4, 7882 883 vf = vec_roundz(vf);884 // CHECK: call <4 x float> @llvm.trunc.v4f32(<4 x float> %{{.*}})885 // CHECK-ASM: vfisb %{{.*}}, %{{.*}}, 4, 5886 vf = vec_trunc(vf);887 // CHECK: call <4 x float> @llvm.trunc.v4f32(<4 x float> %{{.*}})888 // CHECK-ASM: vfisb %{{.*}}, %{{.*}}, 4, 5889 vd = vec_roundz(vd);890 // CHECK: call <2 x double> @llvm.trunc.v2f64(<2 x double> %{{.*}})891 // CHECK-ASM: vfidb %{{.*}}, %{{.*}}, 4, 5892 vd = vec_trunc(vd);893 // CHECK: call <2 x double> @llvm.trunc.v2f64(<2 x double> %{{.*}})894 // CHECK-ASM: vfidb %{{.*}}, %{{.*}}, 4, 5895 896 vf = vec_roundc(vf);897 // CHECK: call <4 x float> @llvm.nearbyint.v4f32(<4 x float> %{{.*}})898 // CHECK-ASM: vfisb %{{.*}}, %{{.*}}, 4, 0899 vd = vec_roundc(vd);900 // CHECK: call <2 x double> @llvm.nearbyint.v2f64(<2 x double> %{{.*}})901 // CHECK-ASM: vfidb %{{.*}}, %{{.*}}, 4, 0902 903 vf = vec_rint(vf);904 // CHECK: call <4 x float> @llvm.rint.v4f32(<4 x float> %{{.*}})905 // CHECK-ASM: vfisb %{{.*}}, %{{.*}}, 0, 0906 vd = vec_rint(vd);907 // CHECK: call <2 x double> @llvm.rint.v2f64(<2 x double> %{{.*}})908 // CHECK-ASM: vfidb %{{.*}}, %{{.*}}, 0, 0909 910 vf = vec_round(vf);911 // CHECK: call <4 x float> @llvm.roundeven.v4f32(<4 x float> %{{.*}})912 // CHECK-ASM: vfisb %{{.*}}, %{{.*}}, 4, 4913 vd = vec_round(vd);914 // CHECK: call <2 x double> @llvm.roundeven.v2f64(<2 x double> %{{.*}})915 // CHECK-ASM: vfidb %{{.*}}, %{{.*}}, 4, 4916 917 vbi = vec_fp_test_data_class(vf, 0, &cc);918 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vftcisb(<4 x float> %{{.*}}, i32 0)919 // CHECK-ASM: vftcisb920 vbi = vec_fp_test_data_class(vf, 4095, &cc);921 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vftcisb(<4 x float> %{{.*}}, i32 4095)922 // CHECK-ASM: vftcisb923 vbl = vec_fp_test_data_class(vd, 0, &cc);924 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vftcidb(<2 x double> %{{.*}}, i32 0)925 // CHECK-ASM: vftcidb926 vbl = vec_fp_test_data_class(vd, 4095, &cc);927 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vftcidb(<2 x double> %{{.*}}, i32 4095)928 // CHECK-ASM: vftcidb929}930