1*87103a01SMomchil Velikov // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5 2*87103a01SMomchil Velikov // RUN: %clang_cc1 -triple aarch64-linux -target-feature +neon -disable-O0-optnone -emit-llvm -o - %s | opt -S -passes=mem2reg | FileCheck %s 3*87103a01SMomchil Velikov 4*87103a01SMomchil Velikov // REQUIRES: aarch64-registered-target 5*87103a01SMomchil Velikov 6*87103a01SMomchil Velikov typedef __attribute__((neon_vector_type(8))) signed char int8x8_t; 7*87103a01SMomchil Velikov typedef __attribute__((neon_vector_type(16))) signed char int8x16_t; 8*87103a01SMomchil Velikov 9*87103a01SMomchil Velikov typedef __attribute__((neon_vector_type(8))) __mfp8 mfloat8x8_t; 10*87103a01SMomchil Velikov typedef __attribute__((neon_vector_type(16))) __mfp8 mfloat8x16_t; 11*87103a01SMomchil Velikov 12*87103a01SMomchil Velikov // CHECK-LABEL: define dso_local <8 x i8> @test_8x8( 13*87103a01SMomchil Velikov // CHECK-SAME: <8 x i8> [[X:%.*]]) #[[ATTR0:[0-9]+]] { 14*87103a01SMomchil Velikov // CHECK-NEXT: [[ENTRY:.*:]] 15*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUFFLE:%.*]] = shufflevector <8 x i8> [[X]], <8 x i8> [[X]], <8 x i32> <i32 3, i32 2, i32 1, i32 0, i32 3, i32 2, i32 1, i32 0> 16*87103a01SMomchil Velikov // CHECK-NEXT: ret <8 x i8> [[SHUFFLE]] 17*87103a01SMomchil Velikov // 18*87103a01SMomchil Velikov mfloat8x8_t test_8x8(mfloat8x8_t x) { 19*87103a01SMomchil Velikov return __builtin_shufflevector(x, x, 3, 2, 1, 0, 3, 2, 1, 0); 20*87103a01SMomchil Velikov } 21*87103a01SMomchil Velikov 22*87103a01SMomchil Velikov // CHECK-LABEL: define dso_local <8 x i8> @test_8x8_v( 23*87103a01SMomchil Velikov // CHECK-SAME: <8 x i8> [[X:%.*]], <8 x i8> noundef [[P:%.*]]) #[[ATTR0]] { 24*87103a01SMomchil Velikov // CHECK-NEXT: [[ENTRY:.*:]] 25*87103a01SMomchil Velikov // CHECK-NEXT: [[MASK:%.*]] = and <8 x i8> [[P]], splat (i8 7) 26*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_IDX:%.*]] = extractelement <8 x i8> [[MASK]], i64 0 27*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_ELT:%.*]] = extractelement <8 x i8> [[X]], i8 [[SHUF_IDX]] 28*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_INS:%.*]] = insertelement <8 x i8> poison, i8 [[SHUF_ELT]], i64 0 29*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_IDX1:%.*]] = extractelement <8 x i8> [[MASK]], i64 1 30*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_ELT2:%.*]] = extractelement <8 x i8> [[X]], i8 [[SHUF_IDX1]] 31*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_INS3:%.*]] = insertelement <8 x i8> [[SHUF_INS]], i8 [[SHUF_ELT2]], i64 1 32*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_IDX4:%.*]] = extractelement <8 x i8> [[MASK]], i64 2 33*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_ELT5:%.*]] = extractelement <8 x i8> [[X]], i8 [[SHUF_IDX4]] 34*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_INS6:%.*]] = insertelement <8 x i8> [[SHUF_INS3]], i8 [[SHUF_ELT5]], i64 2 35*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_IDX7:%.*]] = extractelement <8 x i8> [[MASK]], i64 3 36*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_ELT8:%.*]] = extractelement <8 x i8> [[X]], i8 [[SHUF_IDX7]] 37*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_INS9:%.*]] = insertelement <8 x i8> [[SHUF_INS6]], i8 [[SHUF_ELT8]], i64 3 38*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_IDX10:%.*]] = extractelement <8 x i8> [[MASK]], i64 4 39*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_ELT11:%.*]] = extractelement <8 x i8> [[X]], i8 [[SHUF_IDX10]] 40*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_INS12:%.*]] = insertelement <8 x i8> [[SHUF_INS9]], i8 [[SHUF_ELT11]], i64 4 41*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_IDX13:%.*]] = extractelement <8 x i8> [[MASK]], i64 5 42*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_ELT14:%.*]] = extractelement <8 x i8> [[X]], i8 [[SHUF_IDX13]] 43*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_INS15:%.*]] = insertelement <8 x i8> [[SHUF_INS12]], i8 [[SHUF_ELT14]], i64 5 44*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_IDX16:%.*]] = extractelement <8 x i8> [[MASK]], i64 6 45*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_ELT17:%.*]] = extractelement <8 x i8> [[X]], i8 [[SHUF_IDX16]] 46*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_INS18:%.*]] = insertelement <8 x i8> [[SHUF_INS15]], i8 [[SHUF_ELT17]], i64 6 47*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_IDX19:%.*]] = extractelement <8 x i8> [[MASK]], i64 7 48*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_ELT20:%.*]] = extractelement <8 x i8> [[X]], i8 [[SHUF_IDX19]] 49*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_INS21:%.*]] = insertelement <8 x i8> [[SHUF_INS18]], i8 [[SHUF_ELT20]], i64 7 50*87103a01SMomchil Velikov // CHECK-NEXT: ret <8 x i8> [[SHUF_INS21]] 51*87103a01SMomchil Velikov // 52*87103a01SMomchil Velikov mfloat8x8_t test_8x8_v(mfloat8x8_t x, int8x8_t p) { 53*87103a01SMomchil Velikov return __builtin_shufflevector(x, p); 54*87103a01SMomchil Velikov } 55*87103a01SMomchil Velikov 56*87103a01SMomchil Velikov // CHECK-LABEL: define dso_local <16 x i8> @test_8x16( 57*87103a01SMomchil Velikov // CHECK-SAME: <16 x i8> [[X:%.*]]) #[[ATTR0]] { 58*87103a01SMomchil Velikov // CHECK-NEXT: [[ENTRY:.*:]] 59*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUFFLE:%.*]] = shufflevector <16 x i8> [[X]], <16 x i8> [[X]], <16 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0> 60*87103a01SMomchil Velikov // CHECK-NEXT: ret <16 x i8> [[SHUFFLE]] 61*87103a01SMomchil Velikov // 62*87103a01SMomchil Velikov mfloat8x16_t test_8x16(mfloat8x16_t x) { 63*87103a01SMomchil Velikov return __builtin_shufflevector(x, x, 7, 6, 5, 4, 3, 2, 1, 0, 7, 6, 5, 4, 3, 2, 64*87103a01SMomchil Velikov 1, 0); 65*87103a01SMomchil Velikov } 66*87103a01SMomchil Velikov 67*87103a01SMomchil Velikov // CHECK-LABEL: define dso_local <16 x i8> @test_8x16_v( 68*87103a01SMomchil Velikov // CHECK-SAME: <16 x i8> [[X:%.*]], <16 x i8> noundef [[P:%.*]]) #[[ATTR0]] { 69*87103a01SMomchil Velikov // CHECK-NEXT: [[ENTRY:.*:]] 70*87103a01SMomchil Velikov // CHECK-NEXT: [[MASK:%.*]] = and <16 x i8> [[P]], splat (i8 15) 71*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_IDX:%.*]] = extractelement <16 x i8> [[MASK]], i64 0 72*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_ELT:%.*]] = extractelement <16 x i8> [[X]], i8 [[SHUF_IDX]] 73*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_INS:%.*]] = insertelement <16 x i8> poison, i8 [[SHUF_ELT]], i64 0 74*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_IDX1:%.*]] = extractelement <16 x i8> [[MASK]], i64 1 75*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_ELT2:%.*]] = extractelement <16 x i8> [[X]], i8 [[SHUF_IDX1]] 76*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_INS3:%.*]] = insertelement <16 x i8> [[SHUF_INS]], i8 [[SHUF_ELT2]], i64 1 77*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_IDX4:%.*]] = extractelement <16 x i8> [[MASK]], i64 2 78*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_ELT5:%.*]] = extractelement <16 x i8> [[X]], i8 [[SHUF_IDX4]] 79*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_INS6:%.*]] = insertelement <16 x i8> [[SHUF_INS3]], i8 [[SHUF_ELT5]], i64 2 80*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_IDX7:%.*]] = extractelement <16 x i8> [[MASK]], i64 3 81*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_ELT8:%.*]] = extractelement <16 x i8> [[X]], i8 [[SHUF_IDX7]] 82*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_INS9:%.*]] = insertelement <16 x i8> [[SHUF_INS6]], i8 [[SHUF_ELT8]], i64 3 83*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_IDX10:%.*]] = extractelement <16 x i8> [[MASK]], i64 4 84*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_ELT11:%.*]] = extractelement <16 x i8> [[X]], i8 [[SHUF_IDX10]] 85*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_INS12:%.*]] = insertelement <16 x i8> [[SHUF_INS9]], i8 [[SHUF_ELT11]], i64 4 86*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_IDX13:%.*]] = extractelement <16 x i8> [[MASK]], i64 5 87*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_ELT14:%.*]] = extractelement <16 x i8> [[X]], i8 [[SHUF_IDX13]] 88*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_INS15:%.*]] = insertelement <16 x i8> [[SHUF_INS12]], i8 [[SHUF_ELT14]], i64 5 89*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_IDX16:%.*]] = extractelement <16 x i8> [[MASK]], i64 6 90*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_ELT17:%.*]] = extractelement <16 x i8> [[X]], i8 [[SHUF_IDX16]] 91*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_INS18:%.*]] = insertelement <16 x i8> [[SHUF_INS15]], i8 [[SHUF_ELT17]], i64 6 92*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_IDX19:%.*]] = extractelement <16 x i8> [[MASK]], i64 7 93*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_ELT20:%.*]] = extractelement <16 x i8> [[X]], i8 [[SHUF_IDX19]] 94*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_INS21:%.*]] = insertelement <16 x i8> [[SHUF_INS18]], i8 [[SHUF_ELT20]], i64 7 95*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_IDX22:%.*]] = extractelement <16 x i8> [[MASK]], i64 8 96*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_ELT23:%.*]] = extractelement <16 x i8> [[X]], i8 [[SHUF_IDX22]] 97*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_INS24:%.*]] = insertelement <16 x i8> [[SHUF_INS21]], i8 [[SHUF_ELT23]], i64 8 98*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_IDX25:%.*]] = extractelement <16 x i8> [[MASK]], i64 9 99*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_ELT26:%.*]] = extractelement <16 x i8> [[X]], i8 [[SHUF_IDX25]] 100*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_INS27:%.*]] = insertelement <16 x i8> [[SHUF_INS24]], i8 [[SHUF_ELT26]], i64 9 101*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_IDX28:%.*]] = extractelement <16 x i8> [[MASK]], i64 10 102*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_ELT29:%.*]] = extractelement <16 x i8> [[X]], i8 [[SHUF_IDX28]] 103*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_INS30:%.*]] = insertelement <16 x i8> [[SHUF_INS27]], i8 [[SHUF_ELT29]], i64 10 104*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_IDX31:%.*]] = extractelement <16 x i8> [[MASK]], i64 11 105*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_ELT32:%.*]] = extractelement <16 x i8> [[X]], i8 [[SHUF_IDX31]] 106*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_INS33:%.*]] = insertelement <16 x i8> [[SHUF_INS30]], i8 [[SHUF_ELT32]], i64 11 107*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_IDX34:%.*]] = extractelement <16 x i8> [[MASK]], i64 12 108*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_ELT35:%.*]] = extractelement <16 x i8> [[X]], i8 [[SHUF_IDX34]] 109*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_INS36:%.*]] = insertelement <16 x i8> [[SHUF_INS33]], i8 [[SHUF_ELT35]], i64 12 110*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_IDX37:%.*]] = extractelement <16 x i8> [[MASK]], i64 13 111*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_ELT38:%.*]] = extractelement <16 x i8> [[X]], i8 [[SHUF_IDX37]] 112*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_INS39:%.*]] = insertelement <16 x i8> [[SHUF_INS36]], i8 [[SHUF_ELT38]], i64 13 113*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_IDX40:%.*]] = extractelement <16 x i8> [[MASK]], i64 14 114*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_ELT41:%.*]] = extractelement <16 x i8> [[X]], i8 [[SHUF_IDX40]] 115*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_INS42:%.*]] = insertelement <16 x i8> [[SHUF_INS39]], i8 [[SHUF_ELT41]], i64 14 116*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_IDX43:%.*]] = extractelement <16 x i8> [[MASK]], i64 15 117*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_ELT44:%.*]] = extractelement <16 x i8> [[X]], i8 [[SHUF_IDX43]] 118*87103a01SMomchil Velikov // CHECK-NEXT: [[SHUF_INS45:%.*]] = insertelement <16 x i8> [[SHUF_INS42]], i8 [[SHUF_ELT44]], i64 15 119*87103a01SMomchil Velikov // CHECK-NEXT: ret <16 x i8> [[SHUF_INS45]] 120*87103a01SMomchil Velikov // 121*87103a01SMomchil Velikov mfloat8x16_t test_8x16_v(mfloat8x16_t x, int8x16_t p) { 122*87103a01SMomchil Velikov return __builtin_shufflevector(x, p); 123*87103a01SMomchil Velikov } 124