643 lines · c
1// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 52// RUN: %clang_cc1 -triple arm64-none-linux-gnu -target-feature +neon -flax-vector-conversions=none\3// RUN: -ffp-contract=fast -disable-O0-optnone -emit-llvm -o - %s | opt -S -passes=mem2reg,sroa \4// RUN: | FileCheck %s5 6// REQUIRES: aarch64-registered-target || arm-registered-target7 8#include <arm_neon.h>9 10// CHECK-LABEL: define dso_local <1 x i64> @test_vceq_p64(11// CHECK-SAME: <1 x i64> noundef [[A:%.*]], <1 x i64> noundef [[B:%.*]]) #[[ATTR0:[0-9]+]] {12// CHECK-NEXT: [[ENTRY:.*:]]13// CHECK-NEXT: [[CMP_I:%.*]] = icmp eq <1 x i64> [[A]], [[B]]14// CHECK-NEXT: [[SEXT_I:%.*]] = sext <1 x i1> [[CMP_I]] to <1 x i64>15// CHECK-NEXT: ret <1 x i64> [[SEXT_I]]16//17uint64x1_t test_vceq_p64(poly64x1_t a, poly64x1_t b) {18 return vceq_p64(a, b);19}20 21// CHECK-LABEL: define dso_local <2 x i64> @test_vceqq_p64(22// CHECK-SAME: <2 x i64> noundef [[A:%.*]], <2 x i64> noundef [[B:%.*]]) #[[ATTR0]] {23// CHECK-NEXT: [[ENTRY:.*:]]24// CHECK-NEXT: [[CMP_I:%.*]] = icmp eq <2 x i64> [[A]], [[B]]25// CHECK-NEXT: [[SEXT_I:%.*]] = sext <2 x i1> [[CMP_I]] to <2 x i64>26// CHECK-NEXT: ret <2 x i64> [[SEXT_I]]27//28uint64x2_t test_vceqq_p64(poly64x2_t a, poly64x2_t b) {29 return vceqq_p64(a, b);30}31 32// CHECK-LABEL: define dso_local <1 x i64> @test_vtst_p64(33// CHECK-SAME: <1 x i64> noundef [[A:%.*]], <1 x i64> noundef [[B:%.*]]) #[[ATTR0]] {34// CHECK-NEXT: [[ENTRY:.*:]]35// CHECK-NEXT: [[TMP0:%.*]] = bitcast <1 x i64> [[A]] to <8 x i8>36// CHECK-NEXT: [[TMP1:%.*]] = bitcast <1 x i64> [[B]] to <8 x i8>37// CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i8> [[TMP0]] to <1 x i64>38// CHECK-NEXT: [[TMP3:%.*]] = bitcast <8 x i8> [[TMP1]] to <1 x i64>39// CHECK-NEXT: [[TMP4:%.*]] = and <1 x i64> [[TMP2]], [[TMP3]]40// CHECK-NEXT: [[TMP5:%.*]] = icmp ne <1 x i64> [[TMP4]], zeroinitializer41// CHECK-NEXT: [[VTST_I:%.*]] = sext <1 x i1> [[TMP5]] to <1 x i64>42// CHECK-NEXT: ret <1 x i64> [[VTST_I]]43//44uint64x1_t test_vtst_p64(poly64x1_t a, poly64x1_t b) {45 return vtst_p64(a, b);46}47 48// CHECK-LABEL: define dso_local <2 x i64> @test_vtstq_p64(49// CHECK-SAME: <2 x i64> noundef [[A:%.*]], <2 x i64> noundef [[B:%.*]]) #[[ATTR0]] {50// CHECK-NEXT: [[ENTRY:.*:]]51// CHECK-NEXT: [[TMP0:%.*]] = bitcast <2 x i64> [[A]] to <16 x i8>52// CHECK-NEXT: [[TMP1:%.*]] = bitcast <2 x i64> [[B]] to <16 x i8>53// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i8> [[TMP0]] to <2 x i64>54// CHECK-NEXT: [[TMP3:%.*]] = bitcast <16 x i8> [[TMP1]] to <2 x i64>55// CHECK-NEXT: [[TMP4:%.*]] = and <2 x i64> [[TMP2]], [[TMP3]]56// CHECK-NEXT: [[TMP5:%.*]] = icmp ne <2 x i64> [[TMP4]], zeroinitializer57// CHECK-NEXT: [[VTST_I:%.*]] = sext <2 x i1> [[TMP5]] to <2 x i64>58// CHECK-NEXT: ret <2 x i64> [[VTST_I]]59//60uint64x2_t test_vtstq_p64(poly64x2_t a, poly64x2_t b) {61 return vtstq_p64(a, b);62}63 64// CHECK-LABEL: define dso_local <1 x i64> @test_vbsl_p64(65// CHECK-SAME: <1 x i64> noundef [[A:%.*]], <1 x i64> noundef [[B:%.*]], <1 x i64> noundef [[C:%.*]]) #[[ATTR0]] {66// CHECK-NEXT: [[ENTRY:.*:]]67// CHECK-NEXT: [[TMP0:%.*]] = bitcast <1 x i64> [[A]] to <8 x i8>68// CHECK-NEXT: [[TMP1:%.*]] = bitcast <1 x i64> [[B]] to <8 x i8>69// CHECK-NEXT: [[TMP2:%.*]] = bitcast <1 x i64> [[C]] to <8 x i8>70// CHECK-NEXT: [[VBSL_I:%.*]] = bitcast <8 x i8> [[TMP0]] to <1 x i64>71// CHECK-NEXT: [[VBSL1_I:%.*]] = bitcast <8 x i8> [[TMP1]] to <1 x i64>72// CHECK-NEXT: [[VBSL2_I:%.*]] = bitcast <8 x i8> [[TMP2]] to <1 x i64>73// CHECK-NEXT: [[VBSL3_I:%.*]] = and <1 x i64> [[VBSL_I]], [[VBSL1_I]]74// CHECK-NEXT: [[TMP3:%.*]] = xor <1 x i64> [[VBSL_I]], splat (i64 -1)75// CHECK-NEXT: [[VBSL4_I:%.*]] = and <1 x i64> [[TMP3]], [[VBSL2_I]]76// CHECK-NEXT: [[VBSL5_I:%.*]] = or <1 x i64> [[VBSL3_I]], [[VBSL4_I]]77// CHECK-NEXT: ret <1 x i64> [[VBSL5_I]]78//79poly64x1_t test_vbsl_p64(poly64x1_t a, poly64x1_t b, poly64x1_t c) {80 return vbsl_p64(a, b, c);81}82 83// CHECK-LABEL: define dso_local <2 x i64> @test_vbslq_p64(84// CHECK-SAME: <2 x i64> noundef [[A:%.*]], <2 x i64> noundef [[B:%.*]], <2 x i64> noundef [[C:%.*]]) #[[ATTR0]] {85// CHECK-NEXT: [[ENTRY:.*:]]86// CHECK-NEXT: [[TMP0:%.*]] = bitcast <2 x i64> [[A]] to <16 x i8>87// CHECK-NEXT: [[TMP1:%.*]] = bitcast <2 x i64> [[B]] to <16 x i8>88// CHECK-NEXT: [[TMP2:%.*]] = bitcast <2 x i64> [[C]] to <16 x i8>89// CHECK-NEXT: [[VBSL_I:%.*]] = bitcast <16 x i8> [[TMP0]] to <2 x i64>90// CHECK-NEXT: [[VBSL1_I:%.*]] = bitcast <16 x i8> [[TMP1]] to <2 x i64>91// CHECK-NEXT: [[VBSL2_I:%.*]] = bitcast <16 x i8> [[TMP2]] to <2 x i64>92// CHECK-NEXT: [[VBSL3_I:%.*]] = and <2 x i64> [[VBSL_I]], [[VBSL1_I]]93// CHECK-NEXT: [[TMP3:%.*]] = xor <2 x i64> [[VBSL_I]], splat (i64 -1)94// CHECK-NEXT: [[VBSL4_I:%.*]] = and <2 x i64> [[TMP3]], [[VBSL2_I]]95// CHECK-NEXT: [[VBSL5_I:%.*]] = or <2 x i64> [[VBSL3_I]], [[VBSL4_I]]96// CHECK-NEXT: ret <2 x i64> [[VBSL5_I]]97//98poly64x2_t test_vbslq_p64(poly64x2_t a, poly64x2_t b, poly64x2_t c) {99 return vbslq_p64(a, b, c);100}101 102// CHECK-LABEL: define dso_local i64 @test_vget_lane_p64(103// CHECK-SAME: <1 x i64> noundef [[V:%.*]]) #[[ATTR0]] {104// CHECK-NEXT: [[ENTRY:.*:]]105// CHECK-NEXT: [[VGET_LANE:%.*]] = extractelement <1 x i64> [[V]], i32 0106// CHECK-NEXT: ret i64 [[VGET_LANE]]107//108poly64_t test_vget_lane_p64(poly64x1_t v) {109 return vget_lane_p64(v, 0);110}111 112// CHECK-LABEL: define dso_local i64 @test_vgetq_lane_p64(113// CHECK-SAME: <2 x i64> noundef [[V:%.*]]) #[[ATTR0]] {114// CHECK-NEXT: [[ENTRY:.*:]]115// CHECK-NEXT: [[VGETQ_LANE:%.*]] = extractelement <2 x i64> [[V]], i32 1116// CHECK-NEXT: ret i64 [[VGETQ_LANE]]117//118poly64_t test_vgetq_lane_p64(poly64x2_t v) {119 return vgetq_lane_p64(v, 1);120}121 122// CHECK-LABEL: define dso_local <1 x i64> @test_vset_lane_p64(123// CHECK-SAME: i64 noundef [[A:%.*]], <1 x i64> noundef [[V:%.*]]) #[[ATTR0]] {124// CHECK-NEXT: [[ENTRY:.*:]]125// CHECK-NEXT: [[VSET_LANE:%.*]] = insertelement <1 x i64> [[V]], i64 [[A]], i32 0126// CHECK-NEXT: ret <1 x i64> [[VSET_LANE]]127//128poly64x1_t test_vset_lane_p64(poly64_t a, poly64x1_t v) {129 return vset_lane_p64(a, v, 0);130}131 132// CHECK-LABEL: define dso_local <2 x i64> @test_vsetq_lane_p64(133// CHECK-SAME: i64 noundef [[A:%.*]], <2 x i64> noundef [[V:%.*]]) #[[ATTR0]] {134// CHECK-NEXT: [[ENTRY:.*:]]135// CHECK-NEXT: [[VSET_LANE:%.*]] = insertelement <2 x i64> [[V]], i64 [[A]], i32 1136// CHECK-NEXT: ret <2 x i64> [[VSET_LANE]]137//138poly64x2_t test_vsetq_lane_p64(poly64_t a, poly64x2_t v) {139 return vsetq_lane_p64(a, v, 1);140}141 142// CHECK-LABEL: define dso_local <1 x i64> @test_vcopy_lane_p64(143// CHECK-SAME: <1 x i64> noundef [[A:%.*]], <1 x i64> noundef [[B:%.*]]) #[[ATTR0]] {144// CHECK-NEXT: [[ENTRY:.*:]]145// CHECK-NEXT: [[VGET_LANE:%.*]] = extractelement <1 x i64> [[B]], i32 0146// CHECK-NEXT: [[VSET_LANE:%.*]] = insertelement <1 x i64> [[A]], i64 [[VGET_LANE]], i32 0147// CHECK-NEXT: ret <1 x i64> [[VSET_LANE]]148//149poly64x1_t test_vcopy_lane_p64(poly64x1_t a, poly64x1_t b) {150 return vcopy_lane_p64(a, 0, b, 0);151 152}153 154// CHECK-LABEL: define dso_local <2 x i64> @test_vcopyq_lane_p64(155// CHECK-SAME: <2 x i64> noundef [[A:%.*]], <1 x i64> noundef [[B:%.*]]) #[[ATTR0]] {156// CHECK-NEXT: [[ENTRY:.*:]]157// CHECK-NEXT: [[VGET_LANE:%.*]] = extractelement <1 x i64> [[B]], i32 0158// CHECK-NEXT: [[VSET_LANE:%.*]] = insertelement <2 x i64> [[A]], i64 [[VGET_LANE]], i32 1159// CHECK-NEXT: ret <2 x i64> [[VSET_LANE]]160//161poly64x2_t test_vcopyq_lane_p64(poly64x2_t a, poly64x1_t b) {162 return vcopyq_lane_p64(a, 1, b, 0);163}164 165// CHECK-LABEL: define dso_local <2 x i64> @test_vcopyq_laneq_p64(166// CHECK-SAME: <2 x i64> noundef [[A:%.*]], <2 x i64> noundef [[B:%.*]]) #[[ATTR0]] {167// CHECK-NEXT: [[ENTRY:.*:]]168// CHECK-NEXT: [[VGETQ_LANE:%.*]] = extractelement <2 x i64> [[B]], i32 1169// CHECK-NEXT: [[VSET_LANE:%.*]] = insertelement <2 x i64> [[A]], i64 [[VGETQ_LANE]], i32 1170// CHECK-NEXT: ret <2 x i64> [[VSET_LANE]]171//172poly64x2_t test_vcopyq_laneq_p64(poly64x2_t a, poly64x2_t b) {173 return vcopyq_laneq_p64(a, 1, b, 1);174}175 176// CHECK-LABEL: define dso_local <1 x i64> @test_vcreate_p64(177// CHECK-SAME: i64 noundef [[A:%.*]]) #[[ATTR0]] {178// CHECK-NEXT: [[ENTRY:.*:]]179// CHECK-NEXT: [[TMP0:%.*]] = bitcast i64 [[A]] to <1 x i64>180// CHECK-NEXT: ret <1 x i64> [[TMP0]]181//182poly64x1_t test_vcreate_p64(uint64_t a) {183 return vcreate_p64(a);184}185 186// CHECK-LABEL: define dso_local <1 x i64> @test_vdup_n_p64(187// CHECK-SAME: i64 noundef [[A:%.*]]) #[[ATTR0]] {188// CHECK-NEXT: [[ENTRY:.*:]]189// CHECK-NEXT: [[VECINIT_I:%.*]] = insertelement <1 x i64> poison, i64 [[A]], i32 0190// CHECK-NEXT: ret <1 x i64> [[VECINIT_I]]191//192poly64x1_t test_vdup_n_p64(poly64_t a) {193 return vdup_n_p64(a);194}195// CHECK-LABEL: define dso_local <2 x i64> @test_vdupq_n_p64(196// CHECK-SAME: i64 noundef [[A:%.*]]) #[[ATTR0]] {197// CHECK-NEXT: [[ENTRY:.*:]]198// CHECK-NEXT: [[VECINIT_I:%.*]] = insertelement <2 x i64> poison, i64 [[A]], i32 0199// CHECK-NEXT: [[VECINIT1_I:%.*]] = insertelement <2 x i64> [[VECINIT_I]], i64 [[A]], i32 1200// CHECK-NEXT: ret <2 x i64> [[VECINIT1_I]]201//202poly64x2_t test_vdupq_n_p64(poly64_t a) {203 return vdupq_n_p64(a);204}205 206// CHECK-LABEL: define dso_local <1 x i64> @test_vmov_n_p64(207// CHECK-SAME: i64 noundef [[A:%.*]]) #[[ATTR0]] {208// CHECK-NEXT: [[ENTRY:.*:]]209// CHECK-NEXT: [[VECINIT_I:%.*]] = insertelement <1 x i64> poison, i64 [[A]], i32 0210// CHECK-NEXT: ret <1 x i64> [[VECINIT_I]]211//212poly64x1_t test_vmov_n_p64(poly64_t a) {213 return vmov_n_p64(a);214}215 216// CHECK-LABEL: define dso_local <2 x i64> @test_vmovq_n_p64(217// CHECK-SAME: i64 noundef [[A:%.*]]) #[[ATTR0]] {218// CHECK-NEXT: [[ENTRY:.*:]]219// CHECK-NEXT: [[VECINIT_I:%.*]] = insertelement <2 x i64> poison, i64 [[A]], i32 0220// CHECK-NEXT: [[VECINIT1_I:%.*]] = insertelement <2 x i64> [[VECINIT_I]], i64 [[A]], i32 1221// CHECK-NEXT: ret <2 x i64> [[VECINIT1_I]]222//223poly64x2_t test_vmovq_n_p64(poly64_t a) {224 return vmovq_n_p64(a);225}226 227// CHECK-LABEL: define dso_local <1 x i64> @test_vdup_lane_p64(228// CHECK-SAME: <1 x i64> noundef [[VEC:%.*]]) #[[ATTR0]] {229// CHECK-NEXT: [[ENTRY:.*:]]230// CHECK-NEXT: [[TMP0:%.*]] = bitcast <1 x i64> [[VEC]] to <8 x i8>231// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i8> [[TMP0]] to <1 x i64>232// CHECK-NEXT: [[LANE:%.*]] = shufflevector <1 x i64> [[TMP1]], <1 x i64> [[TMP1]], <1 x i32> zeroinitializer233// CHECK-NEXT: ret <1 x i64> [[LANE]]234//235poly64x1_t test_vdup_lane_p64(poly64x1_t vec) {236 return vdup_lane_p64(vec, 0);237}238 239// CHECK-LABEL: define dso_local <2 x i64> @test_vdupq_lane_p64(240// CHECK-SAME: <1 x i64> noundef [[VEC:%.*]]) #[[ATTR0]] {241// CHECK-NEXT: [[ENTRY:.*:]]242// CHECK-NEXT: [[TMP0:%.*]] = bitcast <1 x i64> [[VEC]] to <8 x i8>243// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i8> [[TMP0]] to <1 x i64>244// CHECK-NEXT: [[LANE:%.*]] = shufflevector <1 x i64> [[TMP1]], <1 x i64> [[TMP1]], <2 x i32> zeroinitializer245// CHECK-NEXT: ret <2 x i64> [[LANE]]246//247poly64x2_t test_vdupq_lane_p64(poly64x1_t vec) {248 return vdupq_lane_p64(vec, 0);249}250 251// CHECK-LABEL: define dso_local <2 x i64> @test_vdupq_laneq_p64(252// CHECK-SAME: <2 x i64> noundef [[VEC:%.*]]) #[[ATTR0]] {253// CHECK-NEXT: [[ENTRY:.*:]]254// CHECK-NEXT: [[TMP0:%.*]] = bitcast <2 x i64> [[VEC]] to <16 x i8>255// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i8> [[TMP0]] to <2 x i64>256// CHECK-NEXT: [[LANE:%.*]] = shufflevector <2 x i64> [[TMP1]], <2 x i64> [[TMP1]], <2 x i32> <i32 1, i32 1>257// CHECK-NEXT: ret <2 x i64> [[LANE]]258//259poly64x2_t test_vdupq_laneq_p64(poly64x2_t vec) {260 return vdupq_laneq_p64(vec, 1);261}262 263// CHECK-LABEL: define dso_local <2 x i64> @test_vcombine_p64(264// CHECK-SAME: <1 x i64> noundef [[LOW:%.*]], <1 x i64> noundef [[HIGH:%.*]]) #[[ATTR0]] {265// CHECK-NEXT: [[ENTRY:.*:]]266// CHECK-NEXT: [[SHUFFLE_I:%.*]] = shufflevector <1 x i64> [[LOW]], <1 x i64> [[HIGH]], <2 x i32> <i32 0, i32 1>267// CHECK-NEXT: ret <2 x i64> [[SHUFFLE_I]]268//269poly64x2_t test_vcombine_p64(poly64x1_t low, poly64x1_t high) {270 return vcombine_p64(low, high);271}272 273// CHECK-LABEL: define dso_local <1 x i64> @test_vld1_p64(274// CHECK-SAME: ptr noundef [[PTR:%.*]]) #[[ATTR0]] {275// CHECK-NEXT: [[ENTRY:.*:]]276// CHECK-NEXT: [[TMP0:%.*]] = load <1 x i64>, ptr [[PTR]], align 8277// CHECK-NEXT: ret <1 x i64> [[TMP0]]278//279poly64x1_t test_vld1_p64(poly64_t const * ptr) {280 return vld1_p64(ptr);281}282 283// CHECK-LABEL: define dso_local <2 x i64> @test_vld1q_p64(284// CHECK-SAME: ptr noundef [[PTR:%.*]]) #[[ATTR0]] {285// CHECK-NEXT: [[ENTRY:.*:]]286// CHECK-NEXT: [[TMP0:%.*]] = load <2 x i64>, ptr [[PTR]], align 8287// CHECK-NEXT: ret <2 x i64> [[TMP0]]288//289poly64x2_t test_vld1q_p64(poly64_t const * ptr) {290 return vld1q_p64(ptr);291}292 293// CHECK-LABEL: define dso_local void @test_vst1_p64(294// CHECK-SAME: ptr noundef [[PTR:%.*]], <1 x i64> noundef [[VAL:%.*]]) #[[ATTR0]] {295// CHECK-NEXT: [[ENTRY:.*:]]296// CHECK-NEXT: [[TMP0:%.*]] = bitcast <1 x i64> [[VAL]] to <8 x i8>297// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i8> [[TMP0]] to <1 x i64>298// CHECK-NEXT: store <1 x i64> [[TMP1]], ptr [[PTR]], align 8299// CHECK-NEXT: ret void300//301void test_vst1_p64(poly64_t * ptr, poly64x1_t val) {302 return vst1_p64(ptr, val);303}304 305// CHECK-LABEL: define dso_local void @test_vst1q_p64(306// CHECK-SAME: ptr noundef [[PTR:%.*]], <2 x i64> noundef [[VAL:%.*]]) #[[ATTR0]] {307// CHECK-NEXT: [[ENTRY:.*:]]308// CHECK-NEXT: [[TMP0:%.*]] = bitcast <2 x i64> [[VAL]] to <16 x i8>309// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i8> [[TMP0]] to <2 x i64>310// CHECK-NEXT: store <2 x i64> [[TMP1]], ptr [[PTR]], align 8311// CHECK-NEXT: ret void312//313void test_vst1q_p64(poly64_t * ptr, poly64x2_t val) {314 return vst1q_p64(ptr, val);315}316 317// CHECK-LABEL: define dso_local %struct.poly64x1x2_t @test_vld2_p64(318// CHECK-SAME: ptr noundef [[PTR:%.*]]) #[[ATTR0]] {319// CHECK-NEXT: [[ENTRY:.*:]]320// CHECK-NEXT: [[VLD2:%.*]] = call { <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld2.v1i64.p0(ptr [[PTR]])321// CHECK-NEXT: [[VLD2_FCA_0_EXTRACT:%.*]] = extractvalue { <1 x i64>, <1 x i64> } [[VLD2]], 0322// CHECK-NEXT: [[VLD2_FCA_1_EXTRACT:%.*]] = extractvalue { <1 x i64>, <1 x i64> } [[VLD2]], 1323// CHECK-NEXT: [[DOTFCA_0_0_INSERT:%.*]] = insertvalue [[STRUCT_POLY64X1X2_T:%.*]] poison, <1 x i64> [[VLD2_FCA_0_EXTRACT]], 0, 0324// CHECK-NEXT: [[DOTFCA_0_1_INSERT:%.*]] = insertvalue [[STRUCT_POLY64X1X2_T]] [[DOTFCA_0_0_INSERT]], <1 x i64> [[VLD2_FCA_1_EXTRACT]], 0, 1325// CHECK-NEXT: ret [[STRUCT_POLY64X1X2_T]] [[DOTFCA_0_1_INSERT]]326//327poly64x1x2_t test_vld2_p64(poly64_t const * ptr) {328 return vld2_p64(ptr);329}330 331// CHECK-LABEL: define dso_local %struct.poly64x2x2_t @test_vld2q_p64(332// CHECK-SAME: ptr noundef [[PTR:%.*]]) #[[ATTR0]] {333// CHECK-NEXT: [[ENTRY:.*:]]334// CHECK-NEXT: [[VLD2:%.*]] = call { <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld2.v2i64.p0(ptr [[PTR]])335// CHECK-NEXT: [[VLD2_FCA_0_EXTRACT:%.*]] = extractvalue { <2 x i64>, <2 x i64> } [[VLD2]], 0336// CHECK-NEXT: [[VLD2_FCA_1_EXTRACT:%.*]] = extractvalue { <2 x i64>, <2 x i64> } [[VLD2]], 1337// CHECK-NEXT: [[DOTFCA_0_0_INSERT:%.*]] = insertvalue [[STRUCT_POLY64X2X2_T:%.*]] poison, <2 x i64> [[VLD2_FCA_0_EXTRACT]], 0, 0338// CHECK-NEXT: [[DOTFCA_0_1_INSERT:%.*]] = insertvalue [[STRUCT_POLY64X2X2_T]] [[DOTFCA_0_0_INSERT]], <2 x i64> [[VLD2_FCA_1_EXTRACT]], 0, 1339// CHECK-NEXT: ret [[STRUCT_POLY64X2X2_T]] [[DOTFCA_0_1_INSERT]]340//341poly64x2x2_t test_vld2q_p64(poly64_t const * ptr) {342 return vld2q_p64(ptr);343}344 345// CHECK-LABEL: define dso_local %struct.poly64x1x3_t @test_vld3_p64(346// CHECK-SAME: ptr noundef [[PTR:%.*]]) #[[ATTR0]] {347// CHECK-NEXT: [[ENTRY:.*:]]348// CHECK-NEXT: [[VLD3:%.*]] = call { <1 x i64>, <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld3.v1i64.p0(ptr [[PTR]])349// CHECK-NEXT: [[VLD3_FCA_0_EXTRACT:%.*]] = extractvalue { <1 x i64>, <1 x i64>, <1 x i64> } [[VLD3]], 0350// CHECK-NEXT: [[VLD3_FCA_1_EXTRACT:%.*]] = extractvalue { <1 x i64>, <1 x i64>, <1 x i64> } [[VLD3]], 1351// CHECK-NEXT: [[VLD3_FCA_2_EXTRACT:%.*]] = extractvalue { <1 x i64>, <1 x i64>, <1 x i64> } [[VLD3]], 2352// CHECK-NEXT: [[DOTFCA_0_0_INSERT:%.*]] = insertvalue [[STRUCT_POLY64X1X3_T:%.*]] poison, <1 x i64> [[VLD3_FCA_0_EXTRACT]], 0, 0353// CHECK-NEXT: [[DOTFCA_0_1_INSERT:%.*]] = insertvalue [[STRUCT_POLY64X1X3_T]] [[DOTFCA_0_0_INSERT]], <1 x i64> [[VLD3_FCA_1_EXTRACT]], 0, 1354// CHECK-NEXT: [[DOTFCA_0_2_INSERT:%.*]] = insertvalue [[STRUCT_POLY64X1X3_T]] [[DOTFCA_0_1_INSERT]], <1 x i64> [[VLD3_FCA_2_EXTRACT]], 0, 2355// CHECK-NEXT: ret [[STRUCT_POLY64X1X3_T]] [[DOTFCA_0_2_INSERT]]356//357poly64x1x3_t test_vld3_p64(poly64_t const * ptr) {358 return vld3_p64(ptr);359}360 361// CHECK-LABEL: define dso_local %struct.poly64x2x3_t @test_vld3q_p64(362// CHECK-SAME: ptr noundef [[PTR:%.*]]) #[[ATTR0]] {363// CHECK-NEXT: [[ENTRY:.*:]]364// CHECK-NEXT: [[VLD3:%.*]] = call { <2 x i64>, <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld3.v2i64.p0(ptr [[PTR]])365// CHECK-NEXT: [[VLD3_FCA_0_EXTRACT:%.*]] = extractvalue { <2 x i64>, <2 x i64>, <2 x i64> } [[VLD3]], 0366// CHECK-NEXT: [[VLD3_FCA_1_EXTRACT:%.*]] = extractvalue { <2 x i64>, <2 x i64>, <2 x i64> } [[VLD3]], 1367// CHECK-NEXT: [[VLD3_FCA_2_EXTRACT:%.*]] = extractvalue { <2 x i64>, <2 x i64>, <2 x i64> } [[VLD3]], 2368// CHECK-NEXT: [[DOTFCA_0_0_INSERT:%.*]] = insertvalue [[STRUCT_POLY64X2X3_T:%.*]] poison, <2 x i64> [[VLD3_FCA_0_EXTRACT]], 0, 0369// CHECK-NEXT: [[DOTFCA_0_1_INSERT:%.*]] = insertvalue [[STRUCT_POLY64X2X3_T]] [[DOTFCA_0_0_INSERT]], <2 x i64> [[VLD3_FCA_1_EXTRACT]], 0, 1370// CHECK-NEXT: [[DOTFCA_0_2_INSERT:%.*]] = insertvalue [[STRUCT_POLY64X2X3_T]] [[DOTFCA_0_1_INSERT]], <2 x i64> [[VLD3_FCA_2_EXTRACT]], 0, 2371// CHECK-NEXT: ret [[STRUCT_POLY64X2X3_T]] [[DOTFCA_0_2_INSERT]]372//373poly64x2x3_t test_vld3q_p64(poly64_t const * ptr) {374 return vld3q_p64(ptr);375}376 377// CHECK-LABEL: define dso_local %struct.poly64x1x4_t @test_vld4_p64(378// CHECK-SAME: ptr noundef [[PTR:%.*]]) #[[ATTR0]] {379// CHECK-NEXT: [[ENTRY:.*:]]380// CHECK-NEXT: [[VLD4:%.*]] = call { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld4.v1i64.p0(ptr [[PTR]])381// CHECK-NEXT: [[VLD4_FCA_0_EXTRACT:%.*]] = extractvalue { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } [[VLD4]], 0382// CHECK-NEXT: [[VLD4_FCA_1_EXTRACT:%.*]] = extractvalue { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } [[VLD4]], 1383// CHECK-NEXT: [[VLD4_FCA_2_EXTRACT:%.*]] = extractvalue { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } [[VLD4]], 2384// CHECK-NEXT: [[VLD4_FCA_3_EXTRACT:%.*]] = extractvalue { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } [[VLD4]], 3385// CHECK-NEXT: [[DOTFCA_0_0_INSERT:%.*]] = insertvalue [[STRUCT_POLY64X1X4_T:%.*]] poison, <1 x i64> [[VLD4_FCA_0_EXTRACT]], 0, 0386// CHECK-NEXT: [[DOTFCA_0_1_INSERT:%.*]] = insertvalue [[STRUCT_POLY64X1X4_T]] [[DOTFCA_0_0_INSERT]], <1 x i64> [[VLD4_FCA_1_EXTRACT]], 0, 1387// CHECK-NEXT: [[DOTFCA_0_2_INSERT:%.*]] = insertvalue [[STRUCT_POLY64X1X4_T]] [[DOTFCA_0_1_INSERT]], <1 x i64> [[VLD4_FCA_2_EXTRACT]], 0, 2388// CHECK-NEXT: [[DOTFCA_0_3_INSERT:%.*]] = insertvalue [[STRUCT_POLY64X1X4_T]] [[DOTFCA_0_2_INSERT]], <1 x i64> [[VLD4_FCA_3_EXTRACT]], 0, 3389// CHECK-NEXT: ret [[STRUCT_POLY64X1X4_T]] [[DOTFCA_0_3_INSERT]]390//391poly64x1x4_t test_vld4_p64(poly64_t const * ptr) {392 return vld4_p64(ptr);393}394 395// CHECK-LABEL: define dso_local %struct.poly64x2x4_t @test_vld4q_p64(396// CHECK-SAME: ptr noundef [[PTR:%.*]]) #[[ATTR0]] {397// CHECK-NEXT: [[ENTRY:.*:]]398// CHECK-NEXT: [[VLD4:%.*]] = call { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld4.v2i64.p0(ptr [[PTR]])399// CHECK-NEXT: [[VLD4_FCA_0_EXTRACT:%.*]] = extractvalue { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } [[VLD4]], 0400// CHECK-NEXT: [[VLD4_FCA_1_EXTRACT:%.*]] = extractvalue { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } [[VLD4]], 1401// CHECK-NEXT: [[VLD4_FCA_2_EXTRACT:%.*]] = extractvalue { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } [[VLD4]], 2402// CHECK-NEXT: [[VLD4_FCA_3_EXTRACT:%.*]] = extractvalue { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } [[VLD4]], 3403// CHECK-NEXT: [[DOTFCA_0_0_INSERT:%.*]] = insertvalue [[STRUCT_POLY64X2X4_T:%.*]] poison, <2 x i64> [[VLD4_FCA_0_EXTRACT]], 0, 0404// CHECK-NEXT: [[DOTFCA_0_1_INSERT:%.*]] = insertvalue [[STRUCT_POLY64X2X4_T]] [[DOTFCA_0_0_INSERT]], <2 x i64> [[VLD4_FCA_1_EXTRACT]], 0, 1405// CHECK-NEXT: [[DOTFCA_0_2_INSERT:%.*]] = insertvalue [[STRUCT_POLY64X2X4_T]] [[DOTFCA_0_1_INSERT]], <2 x i64> [[VLD4_FCA_2_EXTRACT]], 0, 2406// CHECK-NEXT: [[DOTFCA_0_3_INSERT:%.*]] = insertvalue [[STRUCT_POLY64X2X4_T]] [[DOTFCA_0_2_INSERT]], <2 x i64> [[VLD4_FCA_3_EXTRACT]], 0, 3407// CHECK-NEXT: ret [[STRUCT_POLY64X2X4_T]] [[DOTFCA_0_3_INSERT]]408//409poly64x2x4_t test_vld4q_p64(poly64_t const * ptr) {410 return vld4q_p64(ptr);411}412 413// CHECK-LABEL: define dso_local void @test_vst2_p64(414// CHECK-SAME: ptr noundef [[PTR:%.*]], [2 x <1 x i64>] alignstack(8) [[VAL_COERCE:%.*]]) #[[ATTR0]] {415// CHECK-NEXT: [[ENTRY:.*:]]416// CHECK-NEXT: [[VAL_COERCE_FCA_0_EXTRACT:%.*]] = extractvalue [2 x <1 x i64>] [[VAL_COERCE]], 0417// CHECK-NEXT: [[VAL_COERCE_FCA_1_EXTRACT:%.*]] = extractvalue [2 x <1 x i64>] [[VAL_COERCE]], 1418// CHECK-NEXT: [[TMP0:%.*]] = bitcast <1 x i64> [[VAL_COERCE_FCA_0_EXTRACT]] to <8 x i8>419// CHECK-NEXT: [[TMP1:%.*]] = bitcast <1 x i64> [[VAL_COERCE_FCA_1_EXTRACT]] to <8 x i8>420// CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i8> [[TMP0]] to <1 x i64>421// CHECK-NEXT: [[TMP3:%.*]] = bitcast <8 x i8> [[TMP1]] to <1 x i64>422// CHECK-NEXT: call void @llvm.aarch64.neon.st2.v1i64.p0(<1 x i64> [[TMP2]], <1 x i64> [[TMP3]], ptr [[PTR]])423// CHECK-NEXT: ret void424//425void test_vst2_p64(poly64_t * ptr, poly64x1x2_t val) {426 return vst2_p64(ptr, val);427}428 429// CHECK-LABEL: define dso_local void @test_vst2q_p64(430// CHECK-SAME: ptr noundef [[PTR:%.*]], [2 x <2 x i64>] alignstack(16) [[VAL_COERCE:%.*]]) #[[ATTR0]] {431// CHECK-NEXT: [[ENTRY:.*:]]432// CHECK-NEXT: [[VAL_COERCE_FCA_0_EXTRACT:%.*]] = extractvalue [2 x <2 x i64>] [[VAL_COERCE]], 0433// CHECK-NEXT: [[VAL_COERCE_FCA_1_EXTRACT:%.*]] = extractvalue [2 x <2 x i64>] [[VAL_COERCE]], 1434// CHECK-NEXT: [[TMP0:%.*]] = bitcast <2 x i64> [[VAL_COERCE_FCA_0_EXTRACT]] to <16 x i8>435// CHECK-NEXT: [[TMP1:%.*]] = bitcast <2 x i64> [[VAL_COERCE_FCA_1_EXTRACT]] to <16 x i8>436// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i8> [[TMP0]] to <2 x i64>437// CHECK-NEXT: [[TMP3:%.*]] = bitcast <16 x i8> [[TMP1]] to <2 x i64>438// CHECK-NEXT: call void @llvm.aarch64.neon.st2.v2i64.p0(<2 x i64> [[TMP2]], <2 x i64> [[TMP3]], ptr [[PTR]])439// CHECK-NEXT: ret void440//441void test_vst2q_p64(poly64_t * ptr, poly64x2x2_t val) {442 return vst2q_p64(ptr, val);443}444 445// CHECK-LABEL: define dso_local void @test_vst3_p64(446// CHECK-SAME: ptr noundef [[PTR:%.*]], [3 x <1 x i64>] alignstack(8) [[VAL_COERCE:%.*]]) #[[ATTR0]] {447// CHECK-NEXT: [[ENTRY:.*:]]448// CHECK-NEXT: [[VAL_COERCE_FCA_0_EXTRACT:%.*]] = extractvalue [3 x <1 x i64>] [[VAL_COERCE]], 0449// CHECK-NEXT: [[VAL_COERCE_FCA_1_EXTRACT:%.*]] = extractvalue [3 x <1 x i64>] [[VAL_COERCE]], 1450// CHECK-NEXT: [[VAL_COERCE_FCA_2_EXTRACT:%.*]] = extractvalue [3 x <1 x i64>] [[VAL_COERCE]], 2451// CHECK-NEXT: [[TMP0:%.*]] = bitcast <1 x i64> [[VAL_COERCE_FCA_0_EXTRACT]] to <8 x i8>452// CHECK-NEXT: [[TMP1:%.*]] = bitcast <1 x i64> [[VAL_COERCE_FCA_1_EXTRACT]] to <8 x i8>453// CHECK-NEXT: [[TMP2:%.*]] = bitcast <1 x i64> [[VAL_COERCE_FCA_2_EXTRACT]] to <8 x i8>454// CHECK-NEXT: [[TMP3:%.*]] = bitcast <8 x i8> [[TMP0]] to <1 x i64>455// CHECK-NEXT: [[TMP4:%.*]] = bitcast <8 x i8> [[TMP1]] to <1 x i64>456// CHECK-NEXT: [[TMP5:%.*]] = bitcast <8 x i8> [[TMP2]] to <1 x i64>457// CHECK-NEXT: call void @llvm.aarch64.neon.st3.v1i64.p0(<1 x i64> [[TMP3]], <1 x i64> [[TMP4]], <1 x i64> [[TMP5]], ptr [[PTR]])458// CHECK-NEXT: ret void459//460void test_vst3_p64(poly64_t * ptr, poly64x1x3_t val) {461 return vst3_p64(ptr, val);462}463 464// CHECK-LABEL: define dso_local void @test_vst3q_p64(465// CHECK-SAME: ptr noundef [[PTR:%.*]], [3 x <2 x i64>] alignstack(16) [[VAL_COERCE:%.*]]) #[[ATTR0]] {466// CHECK-NEXT: [[ENTRY:.*:]]467// CHECK-NEXT: [[VAL_COERCE_FCA_0_EXTRACT:%.*]] = extractvalue [3 x <2 x i64>] [[VAL_COERCE]], 0468// CHECK-NEXT: [[VAL_COERCE_FCA_1_EXTRACT:%.*]] = extractvalue [3 x <2 x i64>] [[VAL_COERCE]], 1469// CHECK-NEXT: [[VAL_COERCE_FCA_2_EXTRACT:%.*]] = extractvalue [3 x <2 x i64>] [[VAL_COERCE]], 2470// CHECK-NEXT: [[TMP0:%.*]] = bitcast <2 x i64> [[VAL_COERCE_FCA_0_EXTRACT]] to <16 x i8>471// CHECK-NEXT: [[TMP1:%.*]] = bitcast <2 x i64> [[VAL_COERCE_FCA_1_EXTRACT]] to <16 x i8>472// CHECK-NEXT: [[TMP2:%.*]] = bitcast <2 x i64> [[VAL_COERCE_FCA_2_EXTRACT]] to <16 x i8>473// CHECK-NEXT: [[TMP3:%.*]] = bitcast <16 x i8> [[TMP0]] to <2 x i64>474// CHECK-NEXT: [[TMP4:%.*]] = bitcast <16 x i8> [[TMP1]] to <2 x i64>475// CHECK-NEXT: [[TMP5:%.*]] = bitcast <16 x i8> [[TMP2]] to <2 x i64>476// CHECK-NEXT: call void @llvm.aarch64.neon.st3.v2i64.p0(<2 x i64> [[TMP3]], <2 x i64> [[TMP4]], <2 x i64> [[TMP5]], ptr [[PTR]])477// CHECK-NEXT: ret void478//479void test_vst3q_p64(poly64_t * ptr, poly64x2x3_t val) {480 return vst3q_p64(ptr, val);481}482 483// CHECK-LABEL: define dso_local void @test_vst4_p64(484// CHECK-SAME: ptr noundef [[PTR:%.*]], [4 x <1 x i64>] alignstack(8) [[VAL_COERCE:%.*]]) #[[ATTR0]] {485// CHECK-NEXT: [[ENTRY:.*:]]486// CHECK-NEXT: [[VAL_COERCE_FCA_0_EXTRACT:%.*]] = extractvalue [4 x <1 x i64>] [[VAL_COERCE]], 0487// CHECK-NEXT: [[VAL_COERCE_FCA_1_EXTRACT:%.*]] = extractvalue [4 x <1 x i64>] [[VAL_COERCE]], 1488// CHECK-NEXT: [[VAL_COERCE_FCA_2_EXTRACT:%.*]] = extractvalue [4 x <1 x i64>] [[VAL_COERCE]], 2489// CHECK-NEXT: [[VAL_COERCE_FCA_3_EXTRACT:%.*]] = extractvalue [4 x <1 x i64>] [[VAL_COERCE]], 3490// CHECK-NEXT: [[TMP0:%.*]] = bitcast <1 x i64> [[VAL_COERCE_FCA_0_EXTRACT]] to <8 x i8>491// CHECK-NEXT: [[TMP1:%.*]] = bitcast <1 x i64> [[VAL_COERCE_FCA_1_EXTRACT]] to <8 x i8>492// CHECK-NEXT: [[TMP2:%.*]] = bitcast <1 x i64> [[VAL_COERCE_FCA_2_EXTRACT]] to <8 x i8>493// CHECK-NEXT: [[TMP3:%.*]] = bitcast <1 x i64> [[VAL_COERCE_FCA_3_EXTRACT]] to <8 x i8>494// CHECK-NEXT: [[TMP4:%.*]] = bitcast <8 x i8> [[TMP0]] to <1 x i64>495// CHECK-NEXT: [[TMP5:%.*]] = bitcast <8 x i8> [[TMP1]] to <1 x i64>496// CHECK-NEXT: [[TMP6:%.*]] = bitcast <8 x i8> [[TMP2]] to <1 x i64>497// CHECK-NEXT: [[TMP7:%.*]] = bitcast <8 x i8> [[TMP3]] to <1 x i64>498// CHECK-NEXT: call void @llvm.aarch64.neon.st4.v1i64.p0(<1 x i64> [[TMP4]], <1 x i64> [[TMP5]], <1 x i64> [[TMP6]], <1 x i64> [[TMP7]], ptr [[PTR]])499// CHECK-NEXT: ret void500//501void test_vst4_p64(poly64_t * ptr, poly64x1x4_t val) {502 return vst4_p64(ptr, val);503}504 505// CHECK-LABEL: define dso_local void @test_vst4q_p64(506// CHECK-SAME: ptr noundef [[PTR:%.*]], [4 x <2 x i64>] alignstack(16) [[VAL_COERCE:%.*]]) #[[ATTR0]] {507// CHECK-NEXT: [[ENTRY:.*:]]508// CHECK-NEXT: [[VAL_COERCE_FCA_0_EXTRACT:%.*]] = extractvalue [4 x <2 x i64>] [[VAL_COERCE]], 0509// CHECK-NEXT: [[VAL_COERCE_FCA_1_EXTRACT:%.*]] = extractvalue [4 x <2 x i64>] [[VAL_COERCE]], 1510// CHECK-NEXT: [[VAL_COERCE_FCA_2_EXTRACT:%.*]] = extractvalue [4 x <2 x i64>] [[VAL_COERCE]], 2511// CHECK-NEXT: [[VAL_COERCE_FCA_3_EXTRACT:%.*]] = extractvalue [4 x <2 x i64>] [[VAL_COERCE]], 3512// CHECK-NEXT: [[TMP0:%.*]] = bitcast <2 x i64> [[VAL_COERCE_FCA_0_EXTRACT]] to <16 x i8>513// CHECK-NEXT: [[TMP1:%.*]] = bitcast <2 x i64> [[VAL_COERCE_FCA_1_EXTRACT]] to <16 x i8>514// CHECK-NEXT: [[TMP2:%.*]] = bitcast <2 x i64> [[VAL_COERCE_FCA_2_EXTRACT]] to <16 x i8>515// CHECK-NEXT: [[TMP3:%.*]] = bitcast <2 x i64> [[VAL_COERCE_FCA_3_EXTRACT]] to <16 x i8>516// CHECK-NEXT: [[TMP4:%.*]] = bitcast <16 x i8> [[TMP0]] to <2 x i64>517// CHECK-NEXT: [[TMP5:%.*]] = bitcast <16 x i8> [[TMP1]] to <2 x i64>518// CHECK-NEXT: [[TMP6:%.*]] = bitcast <16 x i8> [[TMP2]] to <2 x i64>519// CHECK-NEXT: [[TMP7:%.*]] = bitcast <16 x i8> [[TMP3]] to <2 x i64>520// CHECK-NEXT: call void @llvm.aarch64.neon.st4.v2i64.p0(<2 x i64> [[TMP4]], <2 x i64> [[TMP5]], <2 x i64> [[TMP6]], <2 x i64> [[TMP7]], ptr [[PTR]])521// CHECK-NEXT: ret void522//523void test_vst4q_p64(poly64_t * ptr, poly64x2x4_t val) {524 return vst4q_p64(ptr, val);525}526 527// CHECK-LABEL: define dso_local <1 x i64> @test_vext_p64(528// CHECK-SAME: <1 x i64> noundef [[A:%.*]], <1 x i64> noundef [[B:%.*]]) #[[ATTR0]] {529// CHECK-NEXT: [[ENTRY:.*:]]530// CHECK-NEXT: [[TMP0:%.*]] = bitcast <1 x i64> [[A]] to <8 x i8>531// CHECK-NEXT: [[TMP1:%.*]] = bitcast <1 x i64> [[B]] to <8 x i8>532// CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i8> [[TMP0]] to <1 x i64>533// CHECK-NEXT: [[TMP3:%.*]] = bitcast <8 x i8> [[TMP1]] to <1 x i64>534// CHECK-NEXT: [[VEXT:%.*]] = shufflevector <1 x i64> [[TMP2]], <1 x i64> [[TMP3]], <1 x i32> zeroinitializer535// CHECK-NEXT: ret <1 x i64> [[VEXT]]536//537poly64x1_t test_vext_p64(poly64x1_t a, poly64x1_t b) {538 return vext_u64(a, b, 0);539 540}541 542// CHECK-LABEL: define dso_local <2 x i64> @test_vextq_p64(543// CHECK-SAME: <2 x i64> noundef [[A:%.*]], <2 x i64> noundef [[B:%.*]]) #[[ATTR0]] {544// CHECK-NEXT: [[ENTRY:.*:]]545// CHECK-NEXT: [[TMP0:%.*]] = bitcast <2 x i64> [[A]] to <16 x i8>546// CHECK-NEXT: [[TMP1:%.*]] = bitcast <2 x i64> [[B]] to <16 x i8>547// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i8> [[TMP0]] to <2 x i64>548// CHECK-NEXT: [[TMP3:%.*]] = bitcast <16 x i8> [[TMP1]] to <2 x i64>549// CHECK-NEXT: [[VEXT:%.*]] = shufflevector <2 x i64> [[TMP2]], <2 x i64> [[TMP3]], <2 x i32> <i32 1, i32 2>550// CHECK-NEXT: ret <2 x i64> [[VEXT]]551//552poly64x2_t test_vextq_p64(poly64x2_t a, poly64x2_t b) {553 return vextq_p64(a, b, 1);554}555 556// CHECK-LABEL: define dso_local <2 x i64> @test_vzip1q_p64(557// CHECK-SAME: <2 x i64> noundef [[A:%.*]], <2 x i64> noundef [[B:%.*]]) #[[ATTR0]] {558// CHECK-NEXT: [[ENTRY:.*:]]559// CHECK-NEXT: [[SHUFFLE_I:%.*]] = shufflevector <2 x i64> [[A]], <2 x i64> [[B]], <2 x i32> <i32 0, i32 2>560// CHECK-NEXT: ret <2 x i64> [[SHUFFLE_I]]561//562poly64x2_t test_vzip1q_p64(poly64x2_t a, poly64x2_t b) {563 return vzip1q_p64(a, b);564}565 566// CHECK-LABEL: define dso_local <2 x i64> @test_vzip2q_p64(567// CHECK-SAME: <2 x i64> noundef [[A:%.*]], <2 x i64> noundef [[B:%.*]]) #[[ATTR0]] {568// CHECK-NEXT: [[ENTRY:.*:]]569// CHECK-NEXT: [[SHUFFLE_I:%.*]] = shufflevector <2 x i64> [[A]], <2 x i64> [[B]], <2 x i32> <i32 1, i32 3>570// CHECK-NEXT: ret <2 x i64> [[SHUFFLE_I]]571//572poly64x2_t test_vzip2q_p64(poly64x2_t a, poly64x2_t b) {573 return vzip2q_u64(a, b);574}575 576// CHECK-LABEL: define dso_local <2 x i64> @test_vuzp1q_p64(577// CHECK-SAME: <2 x i64> noundef [[A:%.*]], <2 x i64> noundef [[B:%.*]]) #[[ATTR0]] {578// CHECK-NEXT: [[ENTRY:.*:]]579// CHECK-NEXT: [[SHUFFLE_I:%.*]] = shufflevector <2 x i64> [[A]], <2 x i64> [[B]], <2 x i32> <i32 0, i32 2>580// CHECK-NEXT: ret <2 x i64> [[SHUFFLE_I]]581//582poly64x2_t test_vuzp1q_p64(poly64x2_t a, poly64x2_t b) {583 return vuzp1q_p64(a, b);584}585 586// CHECK-LABEL: define dso_local <2 x i64> @test_vuzp2q_p64(587// CHECK-SAME: <2 x i64> noundef [[A:%.*]], <2 x i64> noundef [[B:%.*]]) #[[ATTR0]] {588// CHECK-NEXT: [[ENTRY:.*:]]589// CHECK-NEXT: [[SHUFFLE_I:%.*]] = shufflevector <2 x i64> [[A]], <2 x i64> [[B]], <2 x i32> <i32 1, i32 3>590// CHECK-NEXT: ret <2 x i64> [[SHUFFLE_I]]591//592poly64x2_t test_vuzp2q_p64(poly64x2_t a, poly64x2_t b) {593 return vuzp2q_u64(a, b);594}595 596// CHECK-LABEL: define dso_local <2 x i64> @test_vtrn1q_p64(597// CHECK-SAME: <2 x i64> noundef [[A:%.*]], <2 x i64> noundef [[B:%.*]]) #[[ATTR0]] {598// CHECK-NEXT: [[ENTRY:.*:]]599// CHECK-NEXT: [[SHUFFLE_I:%.*]] = shufflevector <2 x i64> [[A]], <2 x i64> [[B]], <2 x i32> <i32 0, i32 2>600// CHECK-NEXT: ret <2 x i64> [[SHUFFLE_I]]601//602poly64x2_t test_vtrn1q_p64(poly64x2_t a, poly64x2_t b) {603 return vtrn1q_p64(a, b);604}605 606// CHECK-LABEL: define dso_local <2 x i64> @test_vtrn2q_p64(607// CHECK-SAME: <2 x i64> noundef [[A:%.*]], <2 x i64> noundef [[B:%.*]]) #[[ATTR0]] {608// CHECK-NEXT: [[ENTRY:.*:]]609// CHECK-NEXT: [[SHUFFLE_I:%.*]] = shufflevector <2 x i64> [[A]], <2 x i64> [[B]], <2 x i32> <i32 1, i32 3>610// CHECK-NEXT: ret <2 x i64> [[SHUFFLE_I]]611//612poly64x2_t test_vtrn2q_p64(poly64x2_t a, poly64x2_t b) {613 return vtrn2q_u64(a, b);614}615 616// CHECK-LABEL: define dso_local <1 x i64> @test_vsri_n_p64(617// CHECK-SAME: <1 x i64> noundef [[A:%.*]], <1 x i64> noundef [[B:%.*]]) #[[ATTR0]] {618// CHECK-NEXT: [[ENTRY:.*:]]619// CHECK-NEXT: [[TMP0:%.*]] = bitcast <1 x i64> [[A]] to <8 x i8>620// CHECK-NEXT: [[TMP1:%.*]] = bitcast <1 x i64> [[B]] to <8 x i8>621// CHECK-NEXT: [[VSRI_N:%.*]] = bitcast <8 x i8> [[TMP0]] to <1 x i64>622// CHECK-NEXT: [[VSRI_N1:%.*]] = bitcast <8 x i8> [[TMP1]] to <1 x i64>623// CHECK-NEXT: [[VSRI_N2:%.*]] = call <1 x i64> @llvm.aarch64.neon.vsri.v1i64(<1 x i64> [[VSRI_N]], <1 x i64> [[VSRI_N1]], i32 33)624// CHECK-NEXT: ret <1 x i64> [[VSRI_N2]]625//626poly64x1_t test_vsri_n_p64(poly64x1_t a, poly64x1_t b) {627 return vsri_n_p64(a, b, 33);628}629 630// CHECK-LABEL: define dso_local <2 x i64> @test_vsriq_n_p64(631// CHECK-SAME: <2 x i64> noundef [[A:%.*]], <2 x i64> noundef [[B:%.*]]) #[[ATTR0]] {632// CHECK-NEXT: [[ENTRY:.*:]]633// CHECK-NEXT: [[TMP0:%.*]] = bitcast <2 x i64> [[A]] to <16 x i8>634// CHECK-NEXT: [[TMP1:%.*]] = bitcast <2 x i64> [[B]] to <16 x i8>635// CHECK-NEXT: [[VSRI_N:%.*]] = bitcast <16 x i8> [[TMP0]] to <2 x i64>636// CHECK-NEXT: [[VSRI_N1:%.*]] = bitcast <16 x i8> [[TMP1]] to <2 x i64>637// CHECK-NEXT: [[VSRI_N2:%.*]] = call <2 x i64> @llvm.aarch64.neon.vsri.v2i64(<2 x i64> [[VSRI_N]], <2 x i64> [[VSRI_N1]], i32 64)638// CHECK-NEXT: ret <2 x i64> [[VSRI_N2]]639//640poly64x2_t test_vsriq_n_p64(poly64x2_t a, poly64x2_t b) {641 return vsriq_n_p64(a, b, 64);642}643