1 // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py 2 // REQUIRES: aarch64-registered-target 3 // RUN: %clang_cc1 -fclang-abi-compat=latest -triple aarch64 -target-feature +sve -disable-O0-optnone -Werror -Wall -emit-llvm -o - %s | opt -S -passes=mem2reg,tailcallelim | FileCheck %s 4 // RUN: %clang_cc1 -fclang-abi-compat=latest -triple aarch64 -target-feature +sve -disable-O0-optnone -Werror -Wall -emit-llvm -o - -x c++ %s | opt -S -passes=mem2reg,tailcallelim | FileCheck %s -check-prefix=CPP-CHECK 5 // RUN: %clang_cc1 -fclang-abi-compat=latest -DSVE_OVERLOADED_FORMS -triple aarch64 -target-feature +sve -disable-O0-optnone -Werror -Wall -emit-llvm -o - %s | opt -S -passes=mem2reg,tailcallelim | FileCheck %s 6 // RUN: %clang_cc1 -fclang-abi-compat=latest -DSVE_OVERLOADED_FORMS -triple aarch64 -target-feature +sve -disable-O0-optnone -Werror -Wall -emit-llvm -o - -x c++ %s | opt -S -passes=mem2reg,tailcallelim | FileCheck %s -check-prefix=CPP-CHECK 7 // RUN: %clang_cc1 -fclang-abi-compat=latest -triple aarch64 -target-feature +sve -target-feature +sme -S -disable-O0-optnone -Werror -Wall -o /dev/null %s 8 // RUN: %clang_cc1 -fclang-abi-compat=latest -triple aarch64 -target-feature +sme -S -disable-O0-optnone -Werror -Wall -o /dev/null %s 9 10 #include <arm_sve.h> 11 12 #ifdef SVE_OVERLOADED_FORMS 13 // A simple used,unused... macro, long enough to represent any SVE builtin. 14 #define SVE_ACLE_FUNC(A1,A2_UNUSED,A3,A4_UNUSED) A1##A3 15 #else 16 #define SVE_ACLE_FUNC(A1,A2,A3,A4) A1##A2##A3##A4 17 #endif 18 19 #ifdef __ARM_FEATURE_SME 20 #define ATTR __arm_streaming 21 #else 22 #define ATTR 23 #endif 24 25 // CHECK-LABEL: @test_svcreate2_s8( 26 // CHECK-NEXT: entry: 27 // CHECK-NEXT: [[TMP0:%.*]] = insertvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } poison, <vscale x 16 x i8> [[X0:%.*]], 0 28 // CHECK-NEXT: [[TMP1:%.*]] = insertvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } [[TMP0]], <vscale x 16 x i8> [[X1:%.*]], 1 29 // CHECK-NEXT: ret { <vscale x 16 x i8>, <vscale x 16 x i8> } [[TMP1]] 30 // 31 // CPP-CHECK-LABEL: @_Z17test_svcreate2_s8u10__SVInt8_tS_( 32 // CPP-CHECK-NEXT: entry: 33 // CPP-CHECK-NEXT: [[TMP0:%.*]] = insertvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } poison, <vscale x 16 x i8> [[X0:%.*]], 0 34 // CPP-CHECK-NEXT: [[TMP1:%.*]] = insertvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } [[TMP0]], <vscale x 16 x i8> [[X1:%.*]], 1 35 // CPP-CHECK-NEXT: ret { <vscale x 16 x i8>, <vscale x 16 x i8> } [[TMP1]] 36 // 37 svint8x2_t test_svcreate2_s8(svint8_t x0, svint8_t x1) ATTR 38 { 39 return SVE_ACLE_FUNC(svcreate2,_s8,,)(x0, x1); 40 } 41 42 // CHECK-LABEL: @test_svcreate2_s16( 43 // CHECK-NEXT: entry: 44 // CHECK-NEXT: [[TMP0:%.*]] = insertvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } poison, <vscale x 8 x i16> [[X0:%.*]], 0 45 // CHECK-NEXT: [[TMP1:%.*]] = insertvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } [[TMP0]], <vscale x 8 x i16> [[X1:%.*]], 1 46 // CHECK-NEXT: ret { <vscale x 8 x i16>, <vscale x 8 x i16> } [[TMP1]] 47 // 48 // CPP-CHECK-LABEL: @_Z18test_svcreate2_s16u11__SVInt16_tS_( 49 // CPP-CHECK-NEXT: entry: 50 // CPP-CHECK-NEXT: [[TMP0:%.*]] = insertvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } poison, <vscale x 8 x i16> [[X0:%.*]], 0 51 // CPP-CHECK-NEXT: [[TMP1:%.*]] = insertvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } [[TMP0]], <vscale x 8 x i16> [[X1:%.*]], 1 52 // CPP-CHECK-NEXT: ret { <vscale x 8 x i16>, <vscale x 8 x i16> } [[TMP1]] 53 // 54 svint16x2_t test_svcreate2_s16(svint16_t x0, svint16_t x1) ATTR 55 { 56 return SVE_ACLE_FUNC(svcreate2,_s16,,)(x0, x1); 57 } 58 59 // CHECK-LABEL: @test_svcreate2_s32( 60 // CHECK-NEXT: entry: 61 // CHECK-NEXT: [[TMP0:%.*]] = insertvalue { <vscale x 4 x i32>, <vscale x 4 x i32> } poison, <vscale x 4 x i32> [[X0:%.*]], 0 62 // CHECK-NEXT: [[TMP1:%.*]] = insertvalue { <vscale x 4 x i32>, <vscale x 4 x i32> } [[TMP0]], <vscale x 4 x i32> [[X1:%.*]], 1 63 // CHECK-NEXT: ret { <vscale x 4 x i32>, <vscale x 4 x i32> } [[TMP1]] 64 // 65 // CPP-CHECK-LABEL: @_Z18test_svcreate2_s32u11__SVInt32_tS_( 66 // CPP-CHECK-NEXT: entry: 67 // CPP-CHECK-NEXT: [[TMP0:%.*]] = insertvalue { <vscale x 4 x i32>, <vscale x 4 x i32> } poison, <vscale x 4 x i32> [[X0:%.*]], 0 68 // CPP-CHECK-NEXT: [[TMP1:%.*]] = insertvalue { <vscale x 4 x i32>, <vscale x 4 x i32> } [[TMP0]], <vscale x 4 x i32> [[X1:%.*]], 1 69 // CPP-CHECK-NEXT: ret { <vscale x 4 x i32>, <vscale x 4 x i32> } [[TMP1]] 70 // 71 svint32x2_t test_svcreate2_s32(svint32_t x0, svint32_t x1) ATTR 72 { 73 return SVE_ACLE_FUNC(svcreate2,_s32,,)(x0, x1); 74 } 75 76 // CHECK-LABEL: @test_svcreate2_s64( 77 // CHECK-NEXT: entry: 78 // CHECK-NEXT: [[TMP0:%.*]] = insertvalue { <vscale x 2 x i64>, <vscale x 2 x i64> } poison, <vscale x 2 x i64> [[X0:%.*]], 0 79 // CHECK-NEXT: [[TMP1:%.*]] = insertvalue { <vscale x 2 x i64>, <vscale x 2 x i64> } [[TMP0]], <vscale x 2 x i64> [[X1:%.*]], 1 80 // CHECK-NEXT: ret { <vscale x 2 x i64>, <vscale x 2 x i64> } [[TMP1]] 81 // 82 // CPP-CHECK-LABEL: @_Z18test_svcreate2_s64u11__SVInt64_tS_( 83 // CPP-CHECK-NEXT: entry: 84 // CPP-CHECK-NEXT: [[TMP0:%.*]] = insertvalue { <vscale x 2 x i64>, <vscale x 2 x i64> } poison, <vscale x 2 x i64> [[X0:%.*]], 0 85 // CPP-CHECK-NEXT: [[TMP1:%.*]] = insertvalue { <vscale x 2 x i64>, <vscale x 2 x i64> } [[TMP0]], <vscale x 2 x i64> [[X1:%.*]], 1 86 // CPP-CHECK-NEXT: ret { <vscale x 2 x i64>, <vscale x 2 x i64> } [[TMP1]] 87 // 88 svint64x2_t test_svcreate2_s64(svint64_t x0, svint64_t x1) ATTR 89 { 90 return SVE_ACLE_FUNC(svcreate2,_s64,,)(x0, x1); 91 } 92 93 // CHECK-LABEL: @test_svcreate2_u8( 94 // CHECK-NEXT: entry: 95 // CHECK-NEXT: [[TMP0:%.*]] = insertvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } poison, <vscale x 16 x i8> [[X0:%.*]], 0 96 // CHECK-NEXT: [[TMP1:%.*]] = insertvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } [[TMP0]], <vscale x 16 x i8> [[X1:%.*]], 1 97 // CHECK-NEXT: ret { <vscale x 16 x i8>, <vscale x 16 x i8> } [[TMP1]] 98 // 99 // CPP-CHECK-LABEL: @_Z17test_svcreate2_u8u11__SVUint8_tS_( 100 // CPP-CHECK-NEXT: entry: 101 // CPP-CHECK-NEXT: [[TMP0:%.*]] = insertvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } poison, <vscale x 16 x i8> [[X0:%.*]], 0 102 // CPP-CHECK-NEXT: [[TMP1:%.*]] = insertvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } [[TMP0]], <vscale x 16 x i8> [[X1:%.*]], 1 103 // CPP-CHECK-NEXT: ret { <vscale x 16 x i8>, <vscale x 16 x i8> } [[TMP1]] 104 // 105 svuint8x2_t test_svcreate2_u8(svuint8_t x0, svuint8_t x1) ATTR 106 { 107 return SVE_ACLE_FUNC(svcreate2,_u8,,)(x0, x1); 108 } 109 110 // CHECK-LABEL: @test_svcreate2_u16( 111 // CHECK-NEXT: entry: 112 // CHECK-NEXT: [[TMP0:%.*]] = insertvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } poison, <vscale x 8 x i16> [[X0:%.*]], 0 113 // CHECK-NEXT: [[TMP1:%.*]] = insertvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } [[TMP0]], <vscale x 8 x i16> [[X1:%.*]], 1 114 // CHECK-NEXT: ret { <vscale x 8 x i16>, <vscale x 8 x i16> } [[TMP1]] 115 // 116 // CPP-CHECK-LABEL: @_Z18test_svcreate2_u16u12__SVUint16_tS_( 117 // CPP-CHECK-NEXT: entry: 118 // CPP-CHECK-NEXT: [[TMP0:%.*]] = insertvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } poison, <vscale x 8 x i16> [[X0:%.*]], 0 119 // CPP-CHECK-NEXT: [[TMP1:%.*]] = insertvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } [[TMP0]], <vscale x 8 x i16> [[X1:%.*]], 1 120 // CPP-CHECK-NEXT: ret { <vscale x 8 x i16>, <vscale x 8 x i16> } [[TMP1]] 121 // 122 svuint16x2_t test_svcreate2_u16(svuint16_t x0, svuint16_t x1) ATTR 123 { 124 return SVE_ACLE_FUNC(svcreate2,_u16,,)(x0, x1); 125 } 126 127 // CHECK-LABEL: @test_svcreate2_u32( 128 // CHECK-NEXT: entry: 129 // CHECK-NEXT: [[TMP0:%.*]] = insertvalue { <vscale x 4 x i32>, <vscale x 4 x i32> } poison, <vscale x 4 x i32> [[X0:%.*]], 0 130 // CHECK-NEXT: [[TMP1:%.*]] = insertvalue { <vscale x 4 x i32>, <vscale x 4 x i32> } [[TMP0]], <vscale x 4 x i32> [[X1:%.*]], 1 131 // CHECK-NEXT: ret { <vscale x 4 x i32>, <vscale x 4 x i32> } [[TMP1]] 132 // 133 // CPP-CHECK-LABEL: @_Z18test_svcreate2_u32u12__SVUint32_tS_( 134 // CPP-CHECK-NEXT: entry: 135 // CPP-CHECK-NEXT: [[TMP0:%.*]] = insertvalue { <vscale x 4 x i32>, <vscale x 4 x i32> } poison, <vscale x 4 x i32> [[X0:%.*]], 0 136 // CPP-CHECK-NEXT: [[TMP1:%.*]] = insertvalue { <vscale x 4 x i32>, <vscale x 4 x i32> } [[TMP0]], <vscale x 4 x i32> [[X1:%.*]], 1 137 // CPP-CHECK-NEXT: ret { <vscale x 4 x i32>, <vscale x 4 x i32> } [[TMP1]] 138 // 139 svuint32x2_t test_svcreate2_u32(svuint32_t x0, svuint32_t x1) ATTR 140 { 141 return SVE_ACLE_FUNC(svcreate2,_u32,,)(x0, x1); 142 } 143 144 // CHECK-LABEL: @test_svcreate2_u64( 145 // CHECK-NEXT: entry: 146 // CHECK-NEXT: [[TMP0:%.*]] = insertvalue { <vscale x 2 x i64>, <vscale x 2 x i64> } poison, <vscale x 2 x i64> [[X0:%.*]], 0 147 // CHECK-NEXT: [[TMP1:%.*]] = insertvalue { <vscale x 2 x i64>, <vscale x 2 x i64> } [[TMP0]], <vscale x 2 x i64> [[X1:%.*]], 1 148 // CHECK-NEXT: ret { <vscale x 2 x i64>, <vscale x 2 x i64> } [[TMP1]] 149 // 150 // CPP-CHECK-LABEL: @_Z18test_svcreate2_u64u12__SVUint64_tS_( 151 // CPP-CHECK-NEXT: entry: 152 // CPP-CHECK-NEXT: [[TMP0:%.*]] = insertvalue { <vscale x 2 x i64>, <vscale x 2 x i64> } poison, <vscale x 2 x i64> [[X0:%.*]], 0 153 // CPP-CHECK-NEXT: [[TMP1:%.*]] = insertvalue { <vscale x 2 x i64>, <vscale x 2 x i64> } [[TMP0]], <vscale x 2 x i64> [[X1:%.*]], 1 154 // CPP-CHECK-NEXT: ret { <vscale x 2 x i64>, <vscale x 2 x i64> } [[TMP1]] 155 // 156 svuint64x2_t test_svcreate2_u64(svuint64_t x0, svuint64_t x1) ATTR 157 { 158 return SVE_ACLE_FUNC(svcreate2,_u64,,)(x0, x1); 159 } 160 161 // CHECK-LABEL: @test_svcreate2_f16( 162 // CHECK-NEXT: entry: 163 // CHECK-NEXT: [[TMP0:%.*]] = insertvalue { <vscale x 8 x half>, <vscale x 8 x half> } poison, <vscale x 8 x half> [[X0:%.*]], 0 164 // CHECK-NEXT: [[TMP1:%.*]] = insertvalue { <vscale x 8 x half>, <vscale x 8 x half> } [[TMP0]], <vscale x 8 x half> [[X1:%.*]], 1 165 // CHECK-NEXT: ret { <vscale x 8 x half>, <vscale x 8 x half> } [[TMP1]] 166 // 167 // CPP-CHECK-LABEL: @_Z18test_svcreate2_f16u13__SVFloat16_tS_( 168 // CPP-CHECK-NEXT: entry: 169 // CPP-CHECK-NEXT: [[TMP0:%.*]] = insertvalue { <vscale x 8 x half>, <vscale x 8 x half> } poison, <vscale x 8 x half> [[X0:%.*]], 0 170 // CPP-CHECK-NEXT: [[TMP1:%.*]] = insertvalue { <vscale x 8 x half>, <vscale x 8 x half> } [[TMP0]], <vscale x 8 x half> [[X1:%.*]], 1 171 // CPP-CHECK-NEXT: ret { <vscale x 8 x half>, <vscale x 8 x half> } [[TMP1]] 172 // 173 svfloat16x2_t test_svcreate2_f16(svfloat16_t x0, svfloat16_t x1) ATTR 174 { 175 return SVE_ACLE_FUNC(svcreate2,_f16,,)(x0, x1); 176 } 177 178 // CHECK-LABEL: @test_svcreate2_f32( 179 // CHECK-NEXT: entry: 180 // CHECK-NEXT: [[TMP0:%.*]] = insertvalue { <vscale x 4 x float>, <vscale x 4 x float> } poison, <vscale x 4 x float> [[X0:%.*]], 0 181 // CHECK-NEXT: [[TMP1:%.*]] = insertvalue { <vscale x 4 x float>, <vscale x 4 x float> } [[TMP0]], <vscale x 4 x float> [[X1:%.*]], 1 182 // CHECK-NEXT: ret { <vscale x 4 x float>, <vscale x 4 x float> } [[TMP1]] 183 // 184 // CPP-CHECK-LABEL: @_Z18test_svcreate2_f32u13__SVFloat32_tS_( 185 // CPP-CHECK-NEXT: entry: 186 // CPP-CHECK-NEXT: [[TMP0:%.*]] = insertvalue { <vscale x 4 x float>, <vscale x 4 x float> } poison, <vscale x 4 x float> [[X0:%.*]], 0 187 // CPP-CHECK-NEXT: [[TMP1:%.*]] = insertvalue { <vscale x 4 x float>, <vscale x 4 x float> } [[TMP0]], <vscale x 4 x float> [[X1:%.*]], 1 188 // CPP-CHECK-NEXT: ret { <vscale x 4 x float>, <vscale x 4 x float> } [[TMP1]] 189 // 190 svfloat32x2_t test_svcreate2_f32(svfloat32_t x0, svfloat32_t x1) ATTR 191 { 192 return SVE_ACLE_FUNC(svcreate2,_f32,,)(x0, x1); 193 } 194 195 // CHECK-LABEL: @test_svcreate2_f64( 196 // CHECK-NEXT: entry: 197 // CHECK-NEXT: [[TMP0:%.*]] = insertvalue { <vscale x 2 x double>, <vscale x 2 x double> } poison, <vscale x 2 x double> [[X0:%.*]], 0 198 // CHECK-NEXT: [[TMP1:%.*]] = insertvalue { <vscale x 2 x double>, <vscale x 2 x double> } [[TMP0]], <vscale x 2 x double> [[X1:%.*]], 1 199 // CHECK-NEXT: ret { <vscale x 2 x double>, <vscale x 2 x double> } [[TMP1]] 200 // 201 // CPP-CHECK-LABEL: @_Z18test_svcreate2_f64u13__SVFloat64_tS_( 202 // CPP-CHECK-NEXT: entry: 203 // CPP-CHECK-NEXT: [[TMP0:%.*]] = insertvalue { <vscale x 2 x double>, <vscale x 2 x double> } poison, <vscale x 2 x double> [[X0:%.*]], 0 204 // CPP-CHECK-NEXT: [[TMP1:%.*]] = insertvalue { <vscale x 2 x double>, <vscale x 2 x double> } [[TMP0]], <vscale x 2 x double> [[X1:%.*]], 1 205 // CPP-CHECK-NEXT: ret { <vscale x 2 x double>, <vscale x 2 x double> } [[TMP1]] 206 // 207 svfloat64x2_t test_svcreate2_f64(svfloat64_t x0, svfloat64_t x1) ATTR 208 { 209 return SVE_ACLE_FUNC(svcreate2,_f64,,)(x0, x1); 210 } 211