1 // RUN: %clang_cc1 -triple armv8.2a-arm-none-eabi -target-feature +neon -target-feature +bf16 -mfloat-abi hard \ 2 // RUN: -disable-O0-optnone -S -emit-llvm -o - %s \ 3 // RUN: | opt -S -instcombine \ 4 // RUN: | FileCheck %s 5 6 // REQUIRES: arm-registered-target 7 8 #include <arm_neon.h> 9 10 // CHECK-LABEL: @test_vreinterpret_bf16_s8( 11 // CHECK-NEXT: entry: 12 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x i8> [[A:%.*]] to <4 x bfloat> 13 // CHECK-NEXT: ret <4 x bfloat> [[TMP0]] 14 // test_vreinterpret_bf16_s8(int8x8_t a)15bfloat16x4_t test_vreinterpret_bf16_s8(int8x8_t a) { return vreinterpret_bf16_s8(a); } 16 // CHECK-LABEL: @test_vreinterpret_bf16_s16( 17 // CHECK-NEXT: entry: 18 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x i16> [[A:%.*]] to <4 x bfloat> 19 // CHECK-NEXT: ret <4 x bfloat> [[TMP0]] 20 // test_vreinterpret_bf16_s16(int16x4_t a)21bfloat16x4_t test_vreinterpret_bf16_s16(int16x4_t a) { return vreinterpret_bf16_s16(a); } 22 // CHECK-LABEL: @test_vreinterpret_bf16_s32( 23 // CHECK-NEXT: entry: 24 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <2 x i32> [[A:%.*]] to <4 x bfloat> 25 // CHECK-NEXT: ret <4 x bfloat> [[A:%.*]] 26 // test_vreinterpret_bf16_s32(int32x2_t a)27bfloat16x4_t test_vreinterpret_bf16_s32(int32x2_t a) { return vreinterpret_bf16_s32(a); } 28 // CHECK-LABEL: @test_vreinterpret_bf16_f32( 29 // CHECK-NEXT: entry: 30 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <2 x float> [[A:%.*]] to <4 x bfloat> 31 // CHECK-NEXT: ret <4 x bfloat> [[TMP0]] 32 // test_vreinterpret_bf16_f32(float32x2_t a)33bfloat16x4_t test_vreinterpret_bf16_f32(float32x2_t a) { return vreinterpret_bf16_f32(a); } 34 // CHECK-LABEL: @test_vreinterpret_bf16_u8( 35 // CHECK-NEXT: entry: 36 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x i8> [[A:%.*]] to <4 x bfloat> 37 // CHECK-NEXT: ret <4 x bfloat> [[TMP0]] 38 // test_vreinterpret_bf16_u8(uint8x8_t a)39bfloat16x4_t test_vreinterpret_bf16_u8(uint8x8_t a) { return vreinterpret_bf16_u8(a); } 40 // CHECK-LABEL: @test_vreinterpret_bf16_u16( 41 // CHECK-NEXT: entry: 42 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x i16> [[A:%.*]] to <4 x bfloat> 43 // CHECK-NEXT: ret <4 x bfloat> [[TMP0]] 44 // test_vreinterpret_bf16_u16(uint16x4_t a)45bfloat16x4_t test_vreinterpret_bf16_u16(uint16x4_t a) { return vreinterpret_bf16_u16(a); } 46 // CHECK-LABEL: @test_vreinterpret_bf16_u32( 47 // CHECK-NEXT: entry: 48 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <2 x i32> [[A:%.*]] to <4 x bfloat> 49 // CHECK-NEXT: ret <4 x bfloat> [[A:%.*]] 50 // test_vreinterpret_bf16_u32(uint32x2_t a)51bfloat16x4_t test_vreinterpret_bf16_u32(uint32x2_t a) { return vreinterpret_bf16_u32(a); } 52 // CHECK-LABEL: @test_vreinterpret_bf16_p8( 53 // CHECK-NEXT: entry: 54 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x i8> [[A:%.*]] to <4 x bfloat> 55 // CHECK-NEXT: ret <4 x bfloat> [[TMP0]] 56 // test_vreinterpret_bf16_p8(poly8x8_t a)57bfloat16x4_t test_vreinterpret_bf16_p8(poly8x8_t a) { return vreinterpret_bf16_p8(a); } 58 // CHECK-LABEL: @test_vreinterpret_bf16_p16( 59 // CHECK-NEXT: entry: 60 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x i16> [[A:%.*]] to <4 x bfloat> 61 // CHECK-NEXT: ret <4 x bfloat> [[TMP0]] 62 // test_vreinterpret_bf16_p16(poly16x4_t a)63bfloat16x4_t test_vreinterpret_bf16_p16(poly16x4_t a) { return vreinterpret_bf16_p16(a); } 64 // CHECK-LABEL: @test_vreinterpret_bf16_u64( 65 // CHECK-NEXT: entry: 66 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <1 x i64> [[A:%.*]] to <4 x bfloat> 67 // CHECK-NEXT: ret <4 x bfloat> [[TMP0]] 68 // test_vreinterpret_bf16_u64(uint64x1_t a)69bfloat16x4_t test_vreinterpret_bf16_u64(uint64x1_t a) { return vreinterpret_bf16_u64(a); } 70 // CHECK-LABEL: @test_vreinterpret_bf16_s64( 71 // CHECK-NEXT: entry: 72 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <1 x i64> [[A:%.*]] to <4 x bfloat> 73 // CHECK-NEXT: ret <4 x bfloat> [[TMP0]] 74 // test_vreinterpret_bf16_s64(int64x1_t a)75bfloat16x4_t test_vreinterpret_bf16_s64(int64x1_t a) { return vreinterpret_bf16_s64(a); } 76 // CHECK-LABEL: @test_vreinterpretq_bf16_s8( 77 // CHECK-NEXT: entry: 78 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x i8> [[A:%.*]] to <8 x bfloat> 79 // CHECK-NEXT: ret <8 x bfloat> [[TMP0]] 80 // test_vreinterpretq_bf16_s8(int8x16_t a)81bfloat16x8_t test_vreinterpretq_bf16_s8(int8x16_t a) { return vreinterpretq_bf16_s8(a); } 82 // CHECK-LABEL: @test_vreinterpretq_bf16_s16( 83 // CHECK-NEXT: entry: 84 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x i16> [[A:%.*]] to <8 x bfloat> 85 // CHECK-NEXT: ret <8 x bfloat> [[TMP0]] 86 // test_vreinterpretq_bf16_s16(int16x8_t a)87bfloat16x8_t test_vreinterpretq_bf16_s16(int16x8_t a) { return vreinterpretq_bf16_s16(a); } 88 // CHECK-LABEL: @test_vreinterpretq_bf16_s32( 89 // CHECK-NEXT: entry: 90 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x i32> [[A:%.*]] to <8 x bfloat> 91 // CHECK-NEXT: ret <8 x bfloat> [[A:%.*]] 92 // test_vreinterpretq_bf16_s32(int32x4_t a)93bfloat16x8_t test_vreinterpretq_bf16_s32(int32x4_t a) { return vreinterpretq_bf16_s32(a); } 94 // CHECK-LABEL: @test_vreinterpretq_bf16_f32( 95 // CHECK-NEXT: entry: 96 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x float> [[A:%.*]] to <8 x bfloat> 97 // CHECK-NEXT: ret <8 x bfloat> [[TMP0]] 98 // test_vreinterpretq_bf16_f32(float32x4_t a)99bfloat16x8_t test_vreinterpretq_bf16_f32(float32x4_t a) { return vreinterpretq_bf16_f32(a); } 100 // CHECK-LABEL: @test_vreinterpretq_bf16_u8( 101 // CHECK-NEXT: entry: 102 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x i8> [[A:%.*]] to <8 x bfloat> 103 // CHECK-NEXT: ret <8 x bfloat> [[TMP0]] 104 // test_vreinterpretq_bf16_u8(uint8x16_t a)105bfloat16x8_t test_vreinterpretq_bf16_u8(uint8x16_t a) { return vreinterpretq_bf16_u8(a); } 106 // CHECK-LABEL: @test_vreinterpretq_bf16_u16( 107 // CHECK-NEXT: entry: 108 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x i16> [[A:%.*]] to <8 x bfloat> 109 // CHECK-NEXT: ret <8 x bfloat> [[TMP0]] 110 // test_vreinterpretq_bf16_u16(uint16x8_t a)111bfloat16x8_t test_vreinterpretq_bf16_u16(uint16x8_t a) { return vreinterpretq_bf16_u16(a); } 112 // CHECK-LABEL: @test_vreinterpretq_bf16_u32( 113 // CHECK-NEXT: entry: 114 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x i32> [[A:%.*]] to <8 x bfloat> 115 // CHECK-NEXT: ret <8 x bfloat> [[A:%.*]] 116 // test_vreinterpretq_bf16_u32(uint32x4_t a)117bfloat16x8_t test_vreinterpretq_bf16_u32(uint32x4_t a) { return vreinterpretq_bf16_u32(a); } 118 // CHECK-LABEL: @test_vreinterpretq_bf16_p8( 119 // CHECK-NEXT: entry: 120 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x i8> [[A:%.*]] to <8 x bfloat> 121 // CHECK-NEXT: ret <8 x bfloat> [[TMP0]] 122 // test_vreinterpretq_bf16_p8(poly8x16_t a)123bfloat16x8_t test_vreinterpretq_bf16_p8(poly8x16_t a) { return vreinterpretq_bf16_p8(a); } 124 // CHECK-LABEL: @test_vreinterpretq_bf16_p16( 125 // CHECK-NEXT: entry: 126 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x i16> [[A:%.*]] to <8 x bfloat> 127 // CHECK-NEXT: ret <8 x bfloat> [[TMP0]] 128 // test_vreinterpretq_bf16_p16(poly16x8_t a)129bfloat16x8_t test_vreinterpretq_bf16_p16(poly16x8_t a) { return vreinterpretq_bf16_p16(a); } 130 // CHECK-LABEL: @test_vreinterpretq_bf16_u64( 131 // CHECK-NEXT: entry: 132 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <2 x i64> [[A:%.*]] to <8 x bfloat> 133 // CHECK-NEXT: ret <8 x bfloat> [[TMP0]] 134 // test_vreinterpretq_bf16_u64(uint64x2_t a)135bfloat16x8_t test_vreinterpretq_bf16_u64(uint64x2_t a) { return vreinterpretq_bf16_u64(a); } 136 // CHECK-LABEL: @test_vreinterpretq_bf16_s64( 137 // CHECK-NEXT: entry: 138 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <2 x i64> [[A:%.*]] to <8 x bfloat> 139 // CHECK-NEXT: ret <8 x bfloat> [[TMP0]] 140 // test_vreinterpretq_bf16_s64(int64x2_t a)141bfloat16x8_t test_vreinterpretq_bf16_s64(int64x2_t a) { return vreinterpretq_bf16_s64(a); } 142 // CHECK-LABEL: @test_vreinterpret_bf16_p64( 143 // CHECK-NEXT: entry: 144 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <1 x i64> [[A:%.*]] to <4 x bfloat> 145 // CHECK-NEXT: ret <4 x bfloat> [[TMP0]] 146 // test_vreinterpret_bf16_p64(poly64x1_t a)147bfloat16x4_t test_vreinterpret_bf16_p64(poly64x1_t a) { return vreinterpret_bf16_p64(a); } 148 // CHECK-LABEL: @test_vreinterpretq_bf16_p64( 149 // CHECK-NEXT: entry: 150 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <2 x i64> [[A:%.*]] to <8 x bfloat> 151 // CHECK-NEXT: ret <8 x bfloat> [[TMP0]] 152 // test_vreinterpretq_bf16_p64(poly64x2_t a)153bfloat16x8_t test_vreinterpretq_bf16_p64(poly64x2_t a) { return vreinterpretq_bf16_p64(a); } 154 155 // TODO: poly128_t not implemented on aarch32 156 // CHCK-LABEL: @test_vreinterpretq_bf16_p128( 157 // CHCK-NEXT: entry: 158 // CHCK-NEXT: [[TMP0:%.*]] = bitcast i128 [[A:%.*]] to <4 x i32> 159 // CHCK-NEXT: ret <4 x i32> [[TMP0]] 160 // 161 //bfloat16x8_t test_vreinterpretq_bf16_p128(poly128_t a) { return vreinterpretq_bf16_p128(a); } 162 163 // CHECK-LABEL: @test_vreinterpret_s8_bf16( 164 // CHECK-NEXT: entry: 165 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x bfloat> [[A:%.*]] to <8 x i8> 166 // CHECK-NEXT: ret <8 x i8> [[TMP0]] 167 // test_vreinterpret_s8_bf16(bfloat16x4_t a)168int8x8_t test_vreinterpret_s8_bf16(bfloat16x4_t a) { return vreinterpret_s8_bf16(a); } 169 // CHECK-LABEL: @test_vreinterpret_s16_bf16( 170 // CHECK-NEXT: entry: 171 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x bfloat> [[A:%.*]] to <4 x i16> 172 // CHECK-NEXT: ret <4 x i16> [[TMP0]] 173 // test_vreinterpret_s16_bf16(bfloat16x4_t a)174int16x4_t test_vreinterpret_s16_bf16(bfloat16x4_t a) { return vreinterpret_s16_bf16(a); } 175 // CHECK-LABEL: @test_vreinterpret_s32_bf16( 176 // CHECK-NEXT: entry: 177 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x bfloat> [[A:%.*]] to <2 x i32> 178 // CHECK-NEXT: ret <2 x i32> [[A:%.*]] 179 // test_vreinterpret_s32_bf16(bfloat16x4_t a)180int32x2_t test_vreinterpret_s32_bf16(bfloat16x4_t a) { return vreinterpret_s32_bf16(a); } 181 // CHECK-LABEL: @test_vreinterpret_f32_bf16( 182 // CHECK-NEXT: entry: 183 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x bfloat> [[A:%.*]] to <2 x float> 184 // CHECK-NEXT: ret <2 x float> [[TMP0]] 185 // test_vreinterpret_f32_bf16(bfloat16x4_t a)186float32x2_t test_vreinterpret_f32_bf16(bfloat16x4_t a) { return vreinterpret_f32_bf16(a); } 187 // CHECK-LABEL: @test_vreinterpret_u8_bf16( 188 // CHECK-NEXT: entry: 189 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x bfloat> [[A:%.*]] to <8 x i8> 190 // CHECK-NEXT: ret <8 x i8> [[TMP0]] 191 // test_vreinterpret_u8_bf16(bfloat16x4_t a)192uint8x8_t test_vreinterpret_u8_bf16(bfloat16x4_t a) { return vreinterpret_u8_bf16(a); } 193 // CHECK-LABEL: @test_vreinterpret_u16_bf16( 194 // CHECK-NEXT: entry: 195 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x bfloat> [[A:%.*]] to <4 x i16> 196 // CHECK-NEXT: ret <4 x i16> [[TMP0]] 197 // test_vreinterpret_u16_bf16(bfloat16x4_t a)198uint16x4_t test_vreinterpret_u16_bf16(bfloat16x4_t a) { return vreinterpret_u16_bf16(a); } 199 // CHECK-LABEL: @test_vreinterpret_u32_bf16( 200 // CHECK-NEXT: entry: 201 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x bfloat> [[A:%.*]] to <2 x i32> 202 // CHECK-NEXT: ret <2 x i32> [[A:%.*]] 203 // test_vreinterpret_u32_bf16(bfloat16x4_t a)204uint32x2_t test_vreinterpret_u32_bf16(bfloat16x4_t a) { return vreinterpret_u32_bf16(a); } 205 // CHECK-LABEL: @test_vreinterpret_p8_bf16( 206 // CHECK-NEXT: entry: 207 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x bfloat> [[A:%.*]] to <8 x i8> 208 // CHECK-NEXT: ret <8 x i8> [[TMP0]] 209 // test_vreinterpret_p8_bf16(bfloat16x4_t a)210poly8x8_t test_vreinterpret_p8_bf16(bfloat16x4_t a) { return vreinterpret_p8_bf16(a); } 211 // CHECK-LABEL: @test_vreinterpret_p16_bf16( 212 // CHECK-NEXT: entry: 213 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x bfloat> [[A:%.*]] to <4 x i16> 214 // CHECK-NEXT: ret <4 x i16> [[TMP0]] 215 // test_vreinterpret_p16_bf16(bfloat16x4_t a)216poly16x4_t test_vreinterpret_p16_bf16(bfloat16x4_t a) { return vreinterpret_p16_bf16(a); } 217 // CHECK-LABEL: @test_vreinterpret_u64_bf16( 218 // CHECK-NEXT: entry: 219 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x bfloat> [[A:%.*]] to <1 x i64> 220 // CHECK-NEXT: ret <1 x i64> [[TMP0]] 221 // test_vreinterpret_u64_bf16(bfloat16x4_t a)222uint64x1_t test_vreinterpret_u64_bf16(bfloat16x4_t a) { return vreinterpret_u64_bf16(a); } 223 // CHECK-LABEL: @test_vreinterpret_s64_bf16( 224 // CHECK-NEXT: entry: 225 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x bfloat> [[A:%.*]] to <1 x i64> 226 // CHECK-NEXT: ret <1 x i64> [[TMP0]] 227 // test_vreinterpret_s64_bf16(bfloat16x4_t a)228int64x1_t test_vreinterpret_s64_bf16(bfloat16x4_t a) { return vreinterpret_s64_bf16(a); } 229 // CHECK-LABEL: @test_vreinterpret_p64_bf16( 230 // CHECK-NEXT: entry: 231 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x bfloat> [[A:%.*]] to <1 x i64> 232 // CHECK-NEXT: ret <1 x i64> [[TMP0]] 233 // test_vreinterpret_p64_bf16(bfloat16x4_t a)234poly64x1_t test_vreinterpret_p64_bf16(bfloat16x4_t a) { return vreinterpret_p64_bf16(a); } 235 // CHECK-LABEL: @test_vreinterpretq_s8_bf16( 236 // CHECK-NEXT: entry: 237 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x bfloat> [[A:%.*]] to <16 x i8> 238 // CHECK-NEXT: ret <16 x i8> [[TMP0]] 239 // test_vreinterpretq_s8_bf16(bfloat16x8_t a)240int8x16_t test_vreinterpretq_s8_bf16(bfloat16x8_t a) { return vreinterpretq_s8_bf16(a); } 241 // CHECK-LABEL: @test_vreinterpretq_s16_bf16( 242 // CHECK-NEXT: entry: 243 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x bfloat> [[A:%.*]] to <8 x i16> 244 // CHECK-NEXT: ret <8 x i16> [[TMP0]] 245 // test_vreinterpretq_s16_bf16(bfloat16x8_t a)246int16x8_t test_vreinterpretq_s16_bf16(bfloat16x8_t a) { return vreinterpretq_s16_bf16(a); } 247 // CHECK-LABEL: @test_vreinterpretq_s32_bf16( 248 // CHECK-NEXT: entry: 249 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x bfloat> [[A:%.*]] to <4 x i32> 250 // CHECK-NEXT: ret <4 x i32> [[A:%.*]] 251 // test_vreinterpretq_s32_bf16(bfloat16x8_t a)252int32x4_t test_vreinterpretq_s32_bf16(bfloat16x8_t a) { return vreinterpretq_s32_bf16(a); } 253 // CHECK-LABEL: @test_vreinterpretq_f32_bf16( 254 // CHECK-NEXT: entry: 255 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x bfloat> [[A:%.*]] to <4 x float> 256 // CHECK-NEXT: ret <4 x float> [[TMP0]] 257 // test_vreinterpretq_f32_bf16(bfloat16x8_t a)258float32x4_t test_vreinterpretq_f32_bf16(bfloat16x8_t a) { return vreinterpretq_f32_bf16(a); } 259 // CHECK-LABEL: @test_vreinterpretq_u8_bf16( 260 // CHECK-NEXT: entry: 261 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x bfloat> [[A:%.*]] to <16 x i8> 262 // CHECK-NEXT: ret <16 x i8> [[TMP0]] 263 // test_vreinterpretq_u8_bf16(bfloat16x8_t a)264uint8x16_t test_vreinterpretq_u8_bf16(bfloat16x8_t a) { return vreinterpretq_u8_bf16(a); } 265 // CHECK-LABEL: @test_vreinterpretq_u16_bf16( 266 // CHECK-NEXT: entry: 267 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x bfloat> [[A:%.*]] to <8 x i16> 268 // CHECK-NEXT: ret <8 x i16> [[TMP0]] 269 // test_vreinterpretq_u16_bf16(bfloat16x8_t a)270uint16x8_t test_vreinterpretq_u16_bf16(bfloat16x8_t a) { return vreinterpretq_u16_bf16(a); } 271 // CHECK-LABEL: @test_vreinterpretq_u32_bf16( 272 // CHECK-NEXT: entry: 273 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x bfloat> [[A:%.*]] to <4 x i32> 274 // CHECK-NEXT: ret <4 x i32> [[A:%.*]] 275 // test_vreinterpretq_u32_bf16(bfloat16x8_t a)276uint32x4_t test_vreinterpretq_u32_bf16(bfloat16x8_t a) { return vreinterpretq_u32_bf16(a); } 277 // CHECK-LABEL: @test_vreinterpretq_p8_bf16( 278 // CHECK-NEXT: entry: 279 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x bfloat> [[A:%.*]] to <16 x i8> 280 // CHECK-NEXT: ret <16 x i8> [[TMP0]] 281 // test_vreinterpretq_p8_bf16(bfloat16x8_t a)282poly8x16_t test_vreinterpretq_p8_bf16(bfloat16x8_t a) { return vreinterpretq_p8_bf16(a); } 283 // CHECK-LABEL: @test_vreinterpretq_p16_bf16( 284 // CHECK-NEXT: entry: 285 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x bfloat> [[A:%.*]] to <8 x i16> 286 // CHECK-NEXT: ret <8 x i16> [[TMP0]] 287 // test_vreinterpretq_p16_bf16(bfloat16x8_t a)288poly16x8_t test_vreinterpretq_p16_bf16(bfloat16x8_t a) { return vreinterpretq_p16_bf16(a); } 289 // CHECK-LABEL: @test_vreinterpretq_u64_bf16( 290 // CHECK-NEXT: entry: 291 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x bfloat> [[A:%.*]] to <2 x i64> 292 // CHECK-NEXT: ret <2 x i64> [[TMP0]] 293 // test_vreinterpretq_u64_bf16(bfloat16x8_t a)294uint64x2_t test_vreinterpretq_u64_bf16(bfloat16x8_t a) { return vreinterpretq_u64_bf16(a); } 295 // CHECK-LABEL: @test_vreinterpretq_s64_bf16( 296 // CHECK-NEXT: entry: 297 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x bfloat> [[A:%.*]] to <2 x i64> 298 // CHECK-NEXT: ret <2 x i64> [[TMP0]] 299 // test_vreinterpretq_s64_bf16(bfloat16x8_t a)300int64x2_t test_vreinterpretq_s64_bf16(bfloat16x8_t a) { return vreinterpretq_s64_bf16(a); } 301 // CHECK-LABEL: @test_vreinterpretq_p64_bf16( 302 // CHECK-NEXT: entry: 303 // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x bfloat> [[A:%.*]] to <2 x i64> 304 // CHECK-NEXT: ret <2 x i64> [[TMP0]] 305 // test_vreinterpretq_p64_bf16(bfloat16x8_t a)306poly64x2_t test_vreinterpretq_p64_bf16(bfloat16x8_t a) { return vreinterpretq_p64_bf16(a); } 307 308 // TODO: poly128_t not implemented on aarch32 309 // CHCK-LABEL: @test_vreinterpretq_p128_bf16( 310 // CHCK-NEXT: entry: 311 // CHCK-NEXT: [[TMP0:%.*]] = bitcast <4 x i32> [[A:%.*]] to i128 312 // CHCK-NEXT: ret i128 [[TMP0]] 313 // 314 //poly128_t test_vreinterpretq_p128_bf16(bfloat16x8_t a) { return vreinterpretq_p128_bf16(a); } 315