brintos

brintos / llvm-project-archived public Read only

0
0
Text · 13.8 KiB · 4993df2 Raw
321 lines · c
1// REQUIRES: systemz-registered-target2// RUN: %clang_cc1 -target-cpu z13 -triple s390x-linux-gnu \3// RUN: -O2 -fzvector -flax-vector-conversions=none \4// RUN: -ffp-exception-behavior=strict \5// RUN: -Wall -Wno-unused -Werror -emit-llvm %s -o - | FileCheck %s6// RUN: %clang_cc1 -target-cpu z13 -triple s390x-linux-gnu \7// RUN: -O2 -fzvector -flax-vector-conversions=none \8// RUN: -ffp-exception-behavior=strict \9// RUN: -Wall -Wno-unused -Werror -S %s -o - | FileCheck %s --check-prefix=CHECK-ASM10 11#include <vecintrin.h>12 13volatile vector signed long long vsl;14volatile vector unsigned long long vul;15volatile vector bool long long vbl;16volatile vector double vd;17 18volatile double d;19 20const float * volatile cptrf;21const double * volatile cptrd;22 23float * volatile ptrf;24double * volatile ptrd;25 26volatile int idx;27 28void test_core(void) {29  // CHECK-ASM-LABEL: test_core30 31  d = vec_extract(vd, idx);32  // CHECK: extractelement <2 x double> %{{.*}}, i32 %{{.*}}33  // CHECK-ASM: vlgvg34 35  vd = vec_insert(d, vd, idx);36  // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 %{{.*}}37  // CHECK-ASM: vlvgg38 39  vd = vec_promote(d, idx);40  // CHECK: insertelement <2 x double> poison, double %{{.*}}, i32 %{{.*}}41  // CHECK-ASM: vlvgg42 43  vd = vec_insert_and_zero(cptrd);44  // CHECK: [[ZVEC:%[^ ]+]] = insertelement <2 x double> <double poison, double 0.000000e+00>, double {{.*}}, i64 045  // CHECK-ASM: vllezg46 47  vd = vec_revb(vd);48  // CHECK-ASM: vperm49 50  vd = vec_reve(vd);51  // CHECK-ASM: {{vperm|vpdi}}52 53  vd = vec_sel(vd, vd, vul);54  // CHECK-ASM: vsel55  vd = vec_sel(vd, vd, vbl);56  // CHECK-ASM: vsel57 58  vd = vec_gather_element(vd, vul, cptrd, 0);59  // CHECK-ASM: vgeg %{{.*}}, 0(%{{.*}},%{{.*}}), 060  vd = vec_gather_element(vd, vul, cptrd, 1);61  // CHECK-ASM: vgeg %{{.*}}, 0(%{{.*}},%{{.*}}), 162 63  vec_scatter_element(vd, vul, ptrd, 0);64  // CHECK-ASM: vsceg %{{.*}}, 0(%{{.*}},%{{.*}}), 065  vec_scatter_element(vd, vul, ptrd, 1);66  // CHECK-ASM: vsceg %{{.*}}, 0(%{{.*}},%{{.*}}), 167 68  vd = vec_xl(idx, cptrd);69  // CHECK-ASM-NEXT: lgf     %r5, 0(%r3)70  // CHECK-ASM-NEXT: lg      %r13, 0(%r4)71  // CHECK-ASM-NEXT: vl      %v0, 0(%r5,%r13){{$}}72  // CHECK-ASM-NEXT: vst73 74  vd = vec_xld2(idx, cptrd);75  // CHECK-ASM:      vst76 77  vec_xst(vd, idx, ptrd);78 79  vec_xstd2(vd, idx, ptrd);80 81  vd = vec_splat(vd, 0);82  // CHECK: shufflevector <2 x double> %{{.*}}, <2 x double> poison, <2 x i32> zeroinitializer83  // CHECK-ASM: vrepg84  vd = vec_splat(vd, 1);85  // CHECK: shufflevector <2 x double> %{{.*}}, <2 x double> poison, <2 x i32> <i32 1, i32 1>86  // CHECK-ASM: vrepg87 88  vd = vec_splats(d);89  // CHECK: shufflevector <2 x double> %{{.*}}, <2 x double> poison, <2 x i32> zeroinitializer90  // CHECK-ASM: vlrepg91 92  vd = vec_mergeh(vd, vd);93  // shufflevector <2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x i32> <i32 0, i32 2>94  // CHECK-ASM: vmrhg95 96  vd = vec_mergel(vd, vd);97  // shufflevector <2 x double> %{{.*}}, <2 x double> %{{.*}}, <i32 1, i32 3>98  // CHECK-ASM: vmrlg99}100 101void test_compare(void) {102  // CHECK-ASM-LABEL: test_compare103 104  vbl = vec_cmpeq(vd, vd);105  // CHECK: call <2 x i1> @llvm.experimental.constrained.fcmp.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, metadata !"oeq", metadata !{{.*}})106  // CHECK-ASM: vfcedb107 108  vbl = vec_cmpge(vd, vd);109  // CHECK: call <2 x i1> @llvm.experimental.constrained.fcmps.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, metadata !"oge", metadata !{{.*}})110  // CHECK-ASM: kdbr111  // CHECK-ASM: kdbr112  // CHECK-ASM: vst113 114  vbl = vec_cmpgt(vd, vd);115  // CHECK: call <2 x i1> @llvm.experimental.constrained.fcmps.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, metadata !"ogt", metadata !{{.*}})116  // CHECK-ASM: kdbr117  // CHECK-ASM: kdbr118  // CHECK-ASM: vst119 120  vbl = vec_cmple(vd, vd);121  // CHECK: call <2 x i1> @llvm.experimental.constrained.fcmps.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, metadata !"ole", metadata !{{.*}})122  // CHECK-ASM: kdbr123  // CHECK-ASM: kdbr124  // CHECK-ASM: vst125 126  vbl = vec_cmplt(vd, vd);127  // CHECK: call <2 x i1> @llvm.experimental.constrained.fcmps.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, metadata !"olt", metadata !{{.*}})128  // CHECK-ASM: kdbr129  // CHECK-ASM: kdbr130  // CHECK-ASM: vst131 132  idx = vec_all_lt(vd, vd);133  // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchdbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})134  // CHECK-ASM: vfchdbs135 136  idx = vec_all_nge(vd, vd);137  // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchedbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})138  // CHECK-ASM: vfchedbs139  idx = vec_all_ngt(vd, vd);140  // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchdbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})141  // CHECK-ASM: vfchdbs142  idx = vec_all_nle(vd, vd);143  // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchedbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})144  // CHECK-ASM: vfchedbs145  idx = vec_all_nlt(vd, vd);146  // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchdbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})147  // CHECK-ASM: vfchdbs148 149  idx = vec_all_nan(vd);150  // CHECK: call { <2 x i64>, i32 } @llvm.s390.vftcidb(<2 x double> %{{.*}}, i32 15)151  // CHECK-ASM: vftcidb152  idx = vec_all_numeric(vd);153  // CHECK: call { <2 x i64>, i32 } @llvm.s390.vftcidb(<2 x double> %{{.*}}, i32 15)154  // CHECK-ASM: vftcidb155 156  idx = vec_any_eq(vd, vd);157  // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfcedbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})158  // CHECK-ASM: vfcedbs159 160  idx = vec_any_ne(vd, vd);161  // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfcedbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})162  // CHECK-ASM: vfcedbs163 164  idx = vec_any_ge(vd, vd);165  // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchedbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})166  // CHECK-ASM: vfchedbs167 168  idx = vec_any_gt(vd, vd);169  // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchdbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})170  // CHECK-ASM: vfchdbs171 172  idx = vec_any_le(vd, vd);173  // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchedbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})174  // CHECK-ASM: vfchedbs175 176  idx = vec_any_lt(vd, vd);177  // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchdbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})178  // CHECK-ASM: vfchdbs179 180  idx = vec_any_nge(vd, vd);181  // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchedbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})182  // CHECK-ASM: vfchedbs183  idx = vec_any_ngt(vd, vd);184  // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchdbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})185  // CHECK-ASM: vfchdbs186  idx = vec_any_nle(vd, vd);187  // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchedbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})188  // CHECK-ASM: vfchedbs189  idx = vec_any_nlt(vd, vd);190  // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchdbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})191  // CHECK-ASM: vfchdbs192 193  idx = vec_any_nan(vd);194  // CHECK: call { <2 x i64>, i32 } @llvm.s390.vftcidb(<2 x double> %{{.*}}, i32 15)195  // CHECK-ASM: vftcidb196  idx = vec_any_numeric(vd);197  // CHECK: call { <2 x i64>, i32 } @llvm.s390.vftcidb(<2 x double> %{{.*}}, i32 15)198  // CHECK-ASM: vftcidb199}200 201void test_float(void) {202  // CHECK-ASM-LABEL: test_float203 204  vd = vec_abs(vd);205  // CHECK: call <2 x double> @llvm.fabs.v2f64(<2 x double> %{{.*}})206  // CHECK-ASM: vflpdb207 208  vd = vec_nabs(vd);209  // CHECK: [[ABS:%[^ ]+]] = tail call <2 x double> @llvm.fabs.v2f64(<2 x double> %{{.*}})210  // CHECK-NEXT: fneg <2 x double> [[ABS]]211  // CHECK-ASM: vflndb212 213  vd = vec_madd(vd, vd, vd);214  // CHECK: call <2 x double> @llvm.experimental.constrained.fma.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> %{{.*}}, metadata !{{.*}})215  // CHECK-ASM: vfmadb216  vd = vec_msub(vd, vd, vd);217  // CHECK: [[NEG:%[^ ]+]] = fneg <2 x double> %{{.*}}218  // CHECK: call <2 x double> @llvm.experimental.constrained.fma.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> [[NEG]], metadata !{{.*}})219  // CHECK-ASM: vfmsdb220  vd = vec_sqrt(vd);221  // CHECK: call <2 x double> @llvm.experimental.constrained.sqrt.v2f64(<2 x double> %{{.*}}, metadata !{{.*}})222  // CHECK-ASM: vfsqdb223 224  vd = vec_ld2f(cptrf);225  // CHECK: [[VAL:%[^ ]+]] = load <2 x float>, ptr %{{.*}}226  // CHECK: call <2 x double> @llvm.experimental.constrained.fpext.v2f64.v2f32(<2 x float> [[VAL]], metadata !{{.*}})227  // (emulated)228  vec_st2f(vd, ptrf);229  // CHECK: [[VAL:%[^ ]+]] = tail call <2 x float> @llvm.experimental.constrained.fptrunc.v2f32.v2f64(<2 x double> %{{.*}}, metadata !{{.*}})230  // CHECK: store <2 x float> [[VAL]], ptr %{{.*}}231  // (emulated)232 233  vd = vec_ctd(vsl, 0);234  // CHECK: call <2 x double> @llvm.experimental.constrained.sitofp.v2f64.v2i64(<2 x i64> %{{.*}}, metadata !{{.*}})235  // (emulated)236  vd = vec_ctd(vul, 0);237  // CHECK: call <2 x double> @llvm.experimental.constrained.uitofp.v2f64.v2i64(<2 x i64> %{{.*}}, metadata !{{.*}})238  // (emulated)239  vd = vec_ctd(vsl, 1);240  // CHECK: [[VAL:%[^ ]+]] = tail call <2 x double> @llvm.experimental.constrained.sitofp.v2f64.v2i64(<2 x i64> %{{.*}}, metadata !{{.*}})241  // CHECK: call <2 x double> @llvm.experimental.constrained.fmul.v2f64(<2 x double> [[VAL]], <2 x double> splat (double 5.000000e-01), metadata !{{.*}})242  // (emulated)243  vd = vec_ctd(vul, 1);244  // CHECK: [[VAL:%[^ ]+]] = tail call <2 x double> @llvm.experimental.constrained.uitofp.v2f64.v2i64(<2 x i64> %{{.*}}, metadata !{{.*}})245  // CHECK: call <2 x double> @llvm.experimental.constrained.fmul.v2f64(<2 x double> [[VAL]], <2 x double> splat (double 5.000000e-01), metadata !{{.*}})246  // (emulated)247  vd = vec_ctd(vsl, 31);248  // CHECK: [[VAL:%[^ ]+]] = tail call <2 x double> @llvm.experimental.constrained.sitofp.v2f64.v2i64(<2 x i64> %{{.*}}, metadata !{{.*}})249  // CHECK: call <2 x double> @llvm.experimental.constrained.fmul.v2f64(<2 x double> [[VAL]], <2 x double> splat (double 0x3E00000000000000), metadata !{{.*}})250  // (emulated)251  vd = vec_ctd(vul, 31);252  // CHECK: [[VAL:%[^ ]+]] = tail call <2 x double> @llvm.experimental.constrained.uitofp.v2f64.v2i64(<2 x i64> %{{.*}}, metadata !{{.*}})253  // CHECK: call <2 x double> @llvm.experimental.constrained.fmul.v2f64(<2 x double> [[VAL]], <2 x double> splat (double 0x3E00000000000000), metadata !{{.*}})254  // (emulated)255 256  vsl = vec_ctsl(vd, 0);257  // CHECK: call <2 x i64> @llvm.experimental.constrained.fptosi.v2i64.v2f64(<2 x double> %{{.*}}, metadata !{{.*}})258  // (emulated)259  vul = vec_ctul(vd, 0);260  // CHECK: call <2 x i64> @llvm.experimental.constrained.fptoui.v2i64.v2f64(<2 x double> %{{.*}}, metadata !{{.*}})261  // (emulated)262  vsl = vec_ctsl(vd, 1);263  // CHECK: [[VAL:%[^ ]+]] = tail call <2 x double> @llvm.experimental.constrained.fmul.v2f64(<2 x double> {{.*}}, <2 x double> splat (double 2.000000e+00), metadata !{{.*}})264  // CHECK: call <2 x i64> @llvm.experimental.constrained.fptosi.v2i64.v2f64(<2 x double> [[VAL]], metadata !{{.*}})265  // (emulated)266  vul = vec_ctul(vd, 1);267  // CHECK: [[VAL:%[^ ]+]] = tail call <2 x double> @llvm.experimental.constrained.fmul.v2f64(<2 x double> %{{.*}}, <2 x double> splat (double 2.000000e+00), metadata !{{.*}})268  // CHECK: call <2 x i64> @llvm.experimental.constrained.fptoui.v2i64.v2f64(<2 x double> [[VAL]], metadata !{{.*}})269  // (emulated)270  vsl = vec_ctsl(vd, 31);271  // CHECK: [[VAL:%[^ ]+]] = tail call <2 x double> @llvm.experimental.constrained.fmul.v2f64(<2 x double> %{{.*}}, <2 x double> splat (double 0x41E0000000000000), metadata !{{.*}})272  // CHECK: call <2 x i64> @llvm.experimental.constrained.fptosi.v2i64.v2f64(<2 x double> [[VAL]], metadata !{{.*}})273  // (emulated)274  vul = vec_ctul(vd, 31);275  // CHECK: [[VAL:%[^ ]+]] = tail call <2 x double> @llvm.experimental.constrained.fmul.v2f64(<2 x double> %{{.*}}, <2 x double> splat (double 0x41E0000000000000), metadata !{{.*}})276  // CHECK: call <2 x i64> @llvm.experimental.constrained.fptoui.v2i64.v2f64(<2 x double> [[VAL]], metadata !{{.*}})277  // (emulated)278 279  vd = vec_double(vsl);280  // CHECK: call <2 x double> @llvm.experimental.constrained.sitofp.v2f64.v2i64(<2 x i64> %{{.*}}, metadata !{{.*}})281  // CHECK-ASM: vcdgb282  vd = vec_double(vul);283  // CHECK: call <2 x double> @llvm.experimental.constrained.uitofp.v2f64.v2i64(<2 x i64> %{{.*}}, metadata !{{.*}})284  // CHECK-ASM: vcdlgb285 286  vsl = vec_signed(vd);287  // CHECK: call <2 x i64> @llvm.experimental.constrained.fptosi.v2i64.v2f64(<2 x double> %{{.*}}, metadata !{{.*}})288  // CHECK-ASM: vcgdb289  vul = vec_unsigned(vd);290  // CHECK: call <2 x i64> @llvm.experimental.constrained.fptoui.v2i64.v2f64(<2 x double> %{{.*}}, metadata !{{.*}})291  // CHECK-ASM: vclgdb292 293  vd = vec_roundp(vd);294  // CHECK: call <2 x double> @llvm.experimental.constrained.ceil.v2f64(<2 x double> %{{.*}}, metadata !{{.*}})295  // CHECK-ASM: vfidb %{{.*}}, %{{.*}}, 4, 6296  vd = vec_ceil(vd);297  // CHECK: call <2 x double> @llvm.experimental.constrained.ceil.v2f64(<2 x double> %{{.*}}, metadata !{{.*}})298  // CHECK-ASM: vfidb %{{.*}}, %{{.*}}, 4, 6299  vd = vec_roundm(vd);300  // CHECK: call <2 x double> @llvm.experimental.constrained.floor.v2f64(<2 x double> %{{.*}}, metadata !{{.*}})301  // CHECK-ASM: vfidb %{{.*}}, %{{.*}}, 4, 7302  vd = vec_floor(vd);303  // CHECK: call <2 x double> @llvm.experimental.constrained.floor.v2f64(<2 x double> %{{.*}}, metadata !{{.*}})304  // CHECK-ASM: vfidb %{{.*}}, %{{.*}}, 4, 7305  vd = vec_roundz(vd);306  // CHECK: call <2 x double> @llvm.experimental.constrained.trunc.v2f64(<2 x double> %{{.*}}, metadata !{{.*}})307  // CHECK-ASM: vfidb %{{.*}}, %{{.*}}, 4, 5308  vd = vec_trunc(vd);309  // CHECK: call <2 x double> @llvm.experimental.constrained.trunc.v2f64(<2 x double> %{{.*}}, metadata !{{.*}})310  // CHECK-ASM: vfidb %{{.*}}, %{{.*}}, 4, 5311  vd = vec_roundc(vd);312  // CHECK: call <2 x double> @llvm.experimental.constrained.nearbyint.v2f64(<2 x double> %{{.*}}, metadata !{{.*}})313  // CHECK-ASM: vfidb %{{.*}}, %{{.*}}, 4, 0314  vd = vec_rint(vd);315  // CHECK: call <2 x double> @llvm.experimental.constrained.rint.v2f64(<2 x double> %{{.*}}, metadata !{{.*}})316  // CHECK-ASM: vfidb %{{.*}}, %{{.*}}, 0, 0317  vd = vec_round(vd);318  // CHECK: call <2 x double> @llvm.experimental.constrained.roundeven.v2f64(<2 x double> %{{.*}}, metadata !{{.*}})319  // CHECK-ASM: vfidb %{{.*}}, %{{.*}}, 4, 4320}321