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-none-linux-gnu -target-feature +neon -disable-O0-optnone -Werror -Wall -emit-llvm -o - %s | opt -S -p mem2reg | FileCheck %s 3*87103a01SMomchil Velikov // RUN: %clang_cc1 -x c++ -triple aarch64-none-linux-gnu -target-feature +neon -disable-O0-optnone -Werror -Wall -emit-llvm -o - %s | opt -S -p mem2reg | FileCheck %s -check-prefix CHECK-CXX 4*87103a01SMomchil Velikov 5*87103a01SMomchil Velikov // RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +neon -disable-O0-optnone -Werror -Wall -S -o /dev/null %s 6*87103a01SMomchil Velikov 7*87103a01SMomchil Velikov // REQUIRES: aarch64-registered-target 8*87103a01SMomchil Velikov 9*87103a01SMomchil Velikov #include <arm_neon.h> 10*87103a01SMomchil Velikov 11*87103a01SMomchil Velikov // Bitcast between FP8 Neon vectors 12*87103a01SMomchil Velikov // CHECK-LABEL: define dso_local <8 x i8> @test_f8_f8( 13*87103a01SMomchil Velikov // CHECK-SAME: <8 x i8> [[X:%.*]]) #[[ATTR0:[0-9]+]] { 14*87103a01SMomchil Velikov // CHECK-NEXT: [[ENTRY:.*:]] 15*87103a01SMomchil Velikov // CHECK-NEXT: ret <8 x i8> [[X]] 16*87103a01SMomchil Velikov // 17*87103a01SMomchil Velikov // CHECK-CXX-LABEL: define dso_local <8 x i8> @_Z10test_f8_f813__Mfloat8x8_t( 18*87103a01SMomchil Velikov // CHECK-CXX-SAME: <8 x i8> [[X:%.*]]) #[[ATTR0:[0-9]+]] { 19*87103a01SMomchil Velikov // CHECK-CXX-NEXT: [[ENTRY:.*:]] 20*87103a01SMomchil Velikov // CHECK-CXX-NEXT: ret <8 x i8> [[X]] 21*87103a01SMomchil Velikov // 22*87103a01SMomchil Velikov mfloat8x8_t test_f8_f8(mfloat8x8_t x) { 23*87103a01SMomchil Velikov return (mfloat8x8_t) x; 24*87103a01SMomchil Velikov } 25*87103a01SMomchil Velikov 26*87103a01SMomchil Velikov // CHECK-LABEL: define dso_local <16 x i8> @testq_f8_f8( 27*87103a01SMomchil Velikov // CHECK-SAME: <16 x i8> [[X:%.*]]) #[[ATTR0]] { 28*87103a01SMomchil Velikov // CHECK-NEXT: [[ENTRY:.*:]] 29*87103a01SMomchil Velikov // CHECK-NEXT: ret <16 x i8> [[X]] 30*87103a01SMomchil Velikov // 31*87103a01SMomchil Velikov // CHECK-CXX-LABEL: define dso_local <16 x i8> @_Z11testq_f8_f814__Mfloat8x16_t( 32*87103a01SMomchil Velikov // CHECK-CXX-SAME: <16 x i8> [[X:%.*]]) #[[ATTR0]] { 33*87103a01SMomchil Velikov // CHECK-CXX-NEXT: [[ENTRY:.*:]] 34*87103a01SMomchil Velikov // CHECK-CXX-NEXT: ret <16 x i8> [[X]] 35*87103a01SMomchil Velikov // 36*87103a01SMomchil Velikov mfloat8x16_t testq_f8_f8(mfloat8x16_t x) { 37*87103a01SMomchil Velikov return (mfloat8x16_t) x; 38*87103a01SMomchil Velikov } 39*87103a01SMomchil Velikov 40*87103a01SMomchil Velikov // Bitcast between FP8 and int8 Neon vectors 41*87103a01SMomchil Velikov // CHECK-LABEL: define dso_local <8 x i8> @test_f8_s8( 42*87103a01SMomchil Velikov // CHECK-SAME: <8 x i8> noundef [[X:%.*]]) #[[ATTR0]] { 43*87103a01SMomchil Velikov // CHECK-NEXT: [[ENTRY:.*:]] 44*87103a01SMomchil Velikov // CHECK-NEXT: ret <8 x i8> [[X]] 45*87103a01SMomchil Velikov // 46*87103a01SMomchil Velikov // CHECK-CXX-LABEL: define dso_local <8 x i8> @_Z10test_f8_s810__Int8x8_t( 47*87103a01SMomchil Velikov // CHECK-CXX-SAME: <8 x i8> noundef [[X:%.*]]) #[[ATTR0]] { 48*87103a01SMomchil Velikov // CHECK-CXX-NEXT: [[ENTRY:.*:]] 49*87103a01SMomchil Velikov // CHECK-CXX-NEXT: ret <8 x i8> [[X]] 50*87103a01SMomchil Velikov // 51*87103a01SMomchil Velikov mfloat8x8_t test_f8_s8(int8x8_t x) { 52*87103a01SMomchil Velikov return (mfloat8x8_t) x; 53*87103a01SMomchil Velikov } 54*87103a01SMomchil Velikov 55*87103a01SMomchil Velikov // CHECK-LABEL: define dso_local <8 x i8> @test_s8_f8( 56*87103a01SMomchil Velikov // CHECK-SAME: <8 x i8> [[X:%.*]]) #[[ATTR0]] { 57*87103a01SMomchil Velikov // CHECK-NEXT: [[ENTRY:.*:]] 58*87103a01SMomchil Velikov // CHECK-NEXT: ret <8 x i8> [[X]] 59*87103a01SMomchil Velikov // 60*87103a01SMomchil Velikov // CHECK-CXX-LABEL: define dso_local noundef <8 x i8> @_Z10test_s8_f813__Mfloat8x8_t( 61*87103a01SMomchil Velikov // CHECK-CXX-SAME: <8 x i8> [[X:%.*]]) #[[ATTR0]] { 62*87103a01SMomchil Velikov // CHECK-CXX-NEXT: [[ENTRY:.*:]] 63*87103a01SMomchil Velikov // CHECK-CXX-NEXT: ret <8 x i8> [[X]] 64*87103a01SMomchil Velikov // 65*87103a01SMomchil Velikov int8x8_t test_s8_f8(mfloat8x8_t x) { 66*87103a01SMomchil Velikov return (int8x8_t) x; 67*87103a01SMomchil Velikov } 68*87103a01SMomchil Velikov 69*87103a01SMomchil Velikov // CHECK-LABEL: define dso_local <16 x i8> @testq_f8_s8( 70*87103a01SMomchil Velikov // CHECK-SAME: <16 x i8> noundef [[X:%.*]]) #[[ATTR0]] { 71*87103a01SMomchil Velikov // CHECK-NEXT: [[ENTRY:.*:]] 72*87103a01SMomchil Velikov // CHECK-NEXT: ret <16 x i8> [[X]] 73*87103a01SMomchil Velikov // 74*87103a01SMomchil Velikov // CHECK-CXX-LABEL: define dso_local <16 x i8> @_Z11testq_f8_s811__Int8x16_t( 75*87103a01SMomchil Velikov // CHECK-CXX-SAME: <16 x i8> noundef [[X:%.*]]) #[[ATTR0]] { 76*87103a01SMomchil Velikov // CHECK-CXX-NEXT: [[ENTRY:.*:]] 77*87103a01SMomchil Velikov // CHECK-CXX-NEXT: ret <16 x i8> [[X]] 78*87103a01SMomchil Velikov // 79*87103a01SMomchil Velikov mfloat8x16_t testq_f8_s8(int8x16_t x) { 80*87103a01SMomchil Velikov return (mfloat8x16_t) x; 81*87103a01SMomchil Velikov } 82*87103a01SMomchil Velikov 83*87103a01SMomchil Velikov // CHECK-LABEL: define dso_local <16 x i8> @testq_s8_f8( 84*87103a01SMomchil Velikov // CHECK-SAME: <16 x i8> [[X:%.*]]) #[[ATTR0]] { 85*87103a01SMomchil Velikov // CHECK-NEXT: [[ENTRY:.*:]] 86*87103a01SMomchil Velikov // CHECK-NEXT: ret <16 x i8> [[X]] 87*87103a01SMomchil Velikov // 88*87103a01SMomchil Velikov // CHECK-CXX-LABEL: define dso_local noundef <16 x i8> @_Z11testq_s8_f814__Mfloat8x16_t( 89*87103a01SMomchil Velikov // CHECK-CXX-SAME: <16 x i8> [[X:%.*]]) #[[ATTR0]] { 90*87103a01SMomchil Velikov // CHECK-CXX-NEXT: [[ENTRY:.*:]] 91*87103a01SMomchil Velikov // CHECK-CXX-NEXT: ret <16 x i8> [[X]] 92*87103a01SMomchil Velikov // 93*87103a01SMomchil Velikov int8x16_t testq_s8_f8(mfloat8x16_t x) { 94*87103a01SMomchil Velikov return (int8x16_t) x; 95*87103a01SMomchil Velikov } 96*87103a01SMomchil Velikov 97*87103a01SMomchil Velikov // Bitcast between FP8 and float32 Neon vectors 98*87103a01SMomchil Velikov // CHECK-LABEL: define dso_local <8 x i8> @test_f8_f32( 99*87103a01SMomchil Velikov // CHECK-SAME: <2 x float> noundef [[X:%.*]]) #[[ATTR0]] { 100*87103a01SMomchil Velikov // CHECK-NEXT: [[ENTRY:.*:]] 101*87103a01SMomchil Velikov // CHECK-NEXT: [[TMP0:%.*]] = bitcast <2 x float> [[X]] to <8 x i8> 102*87103a01SMomchil Velikov // CHECK-NEXT: ret <8 x i8> [[TMP0]] 103*87103a01SMomchil Velikov // 104*87103a01SMomchil Velikov // CHECK-CXX-LABEL: define dso_local <8 x i8> @_Z11test_f8_f3213__Float32x2_t( 105*87103a01SMomchil Velikov // CHECK-CXX-SAME: <2 x float> noundef [[X:%.*]]) #[[ATTR0]] { 106*87103a01SMomchil Velikov // CHECK-CXX-NEXT: [[ENTRY:.*:]] 107*87103a01SMomchil Velikov // CHECK-CXX-NEXT: [[TMP0:%.*]] = bitcast <2 x float> [[X]] to <8 x i8> 108*87103a01SMomchil Velikov // CHECK-CXX-NEXT: ret <8 x i8> [[TMP0]] 109*87103a01SMomchil Velikov // 110*87103a01SMomchil Velikov mfloat8x8_t test_f8_f32(float32x2_t x) { 111*87103a01SMomchil Velikov return (mfloat8x8_t) x; 112*87103a01SMomchil Velikov } 113*87103a01SMomchil Velikov 114*87103a01SMomchil Velikov // CHECK-LABEL: define dso_local <2 x float> @test_f32_f8( 115*87103a01SMomchil Velikov // CHECK-SAME: <8 x i8> [[X:%.*]]) #[[ATTR0]] { 116*87103a01SMomchil Velikov // CHECK-NEXT: [[ENTRY:.*:]] 117*87103a01SMomchil Velikov // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x i8> [[X]] to <2 x float> 118*87103a01SMomchil Velikov // CHECK-NEXT: ret <2 x float> [[TMP0]] 119*87103a01SMomchil Velikov // 120*87103a01SMomchil Velikov // CHECK-CXX-LABEL: define dso_local noundef <2 x float> @_Z11test_f32_f813__Mfloat8x8_t( 121*87103a01SMomchil Velikov // CHECK-CXX-SAME: <8 x i8> [[X:%.*]]) #[[ATTR0]] { 122*87103a01SMomchil Velikov // CHECK-CXX-NEXT: [[ENTRY:.*:]] 123*87103a01SMomchil Velikov // CHECK-CXX-NEXT: [[TMP0:%.*]] = bitcast <8 x i8> [[X]] to <2 x float> 124*87103a01SMomchil Velikov // CHECK-CXX-NEXT: ret <2 x float> [[TMP0]] 125*87103a01SMomchil Velikov // 126*87103a01SMomchil Velikov float32x2_t test_f32_f8(mfloat8x8_t x) { 127*87103a01SMomchil Velikov return (float32x2_t) x; 128*87103a01SMomchil Velikov } 129*87103a01SMomchil Velikov 130*87103a01SMomchil Velikov // CHECK-LABEL: define dso_local <16 x i8> @testq_f8_f32( 131*87103a01SMomchil Velikov // CHECK-SAME: <4 x float> noundef [[X:%.*]]) #[[ATTR0]] { 132*87103a01SMomchil Velikov // CHECK-NEXT: [[ENTRY:.*:]] 133*87103a01SMomchil Velikov // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x float> [[X]] to <16 x i8> 134*87103a01SMomchil Velikov // CHECK-NEXT: ret <16 x i8> [[TMP0]] 135*87103a01SMomchil Velikov // 136*87103a01SMomchil Velikov // CHECK-CXX-LABEL: define dso_local <16 x i8> @_Z12testq_f8_f3213__Float32x4_t( 137*87103a01SMomchil Velikov // CHECK-CXX-SAME: <4 x float> noundef [[X:%.*]]) #[[ATTR0]] { 138*87103a01SMomchil Velikov // CHECK-CXX-NEXT: [[ENTRY:.*:]] 139*87103a01SMomchil Velikov // CHECK-CXX-NEXT: [[TMP0:%.*]] = bitcast <4 x float> [[X]] to <16 x i8> 140*87103a01SMomchil Velikov // CHECK-CXX-NEXT: ret <16 x i8> [[TMP0]] 141*87103a01SMomchil Velikov // 142*87103a01SMomchil Velikov mfloat8x16_t testq_f8_f32(float32x4_t x) { 143*87103a01SMomchil Velikov return (mfloat8x16_t) x; 144*87103a01SMomchil Velikov } 145*87103a01SMomchil Velikov 146*87103a01SMomchil Velikov // CHECK-LABEL: define dso_local <4 x float> @testq_f32_f8( 147*87103a01SMomchil Velikov // CHECK-SAME: <16 x i8> [[X:%.*]]) #[[ATTR0]] { 148*87103a01SMomchil Velikov // CHECK-NEXT: [[ENTRY:.*:]] 149*87103a01SMomchil Velikov // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x i8> [[X]] to <4 x float> 150*87103a01SMomchil Velikov // CHECK-NEXT: ret <4 x float> [[TMP0]] 151*87103a01SMomchil Velikov // 152*87103a01SMomchil Velikov // CHECK-CXX-LABEL: define dso_local noundef <4 x float> @_Z12testq_f32_f814__Mfloat8x16_t( 153*87103a01SMomchil Velikov // CHECK-CXX-SAME: <16 x i8> [[X:%.*]]) #[[ATTR0]] { 154*87103a01SMomchil Velikov // CHECK-CXX-NEXT: [[ENTRY:.*:]] 155*87103a01SMomchil Velikov // CHECK-CXX-NEXT: [[TMP0:%.*]] = bitcast <16 x i8> [[X]] to <4 x float> 156*87103a01SMomchil Velikov // CHECK-CXX-NEXT: ret <4 x float> [[TMP0]] 157*87103a01SMomchil Velikov // 158*87103a01SMomchil Velikov float32x4_t testq_f32_f8(mfloat8x16_t x) { 159*87103a01SMomchil Velikov return (float32x4_t) x; 160*87103a01SMomchil Velikov } 161*87103a01SMomchil Velikov 162*87103a01SMomchil Velikov // Bitcast between FP8 and poly128_t (which is integral) 163*87103a01SMomchil Velikov // CHECK-LABEL: define dso_local <16 x i8> @testq_f8_p128( 164*87103a01SMomchil Velikov // CHECK-SAME: i128 noundef [[X:%.*]]) #[[ATTR0]] { 165*87103a01SMomchil Velikov // CHECK-NEXT: [[ENTRY:.*:]] 166*87103a01SMomchil Velikov // CHECK-NEXT: [[TMP0:%.*]] = bitcast i128 [[X]] to <16 x i8> 167*87103a01SMomchil Velikov // CHECK-NEXT: ret <16 x i8> [[TMP0]] 168*87103a01SMomchil Velikov // 169*87103a01SMomchil Velikov // CHECK-CXX-LABEL: define dso_local <16 x i8> @_Z13testq_f8_p128o( 170*87103a01SMomchil Velikov // CHECK-CXX-SAME: i128 noundef [[X:%.*]]) #[[ATTR0]] { 171*87103a01SMomchil Velikov // CHECK-CXX-NEXT: [[ENTRY:.*:]] 172*87103a01SMomchil Velikov // CHECK-CXX-NEXT: [[TMP0:%.*]] = bitcast i128 [[X]] to <16 x i8> 173*87103a01SMomchil Velikov // CHECK-CXX-NEXT: ret <16 x i8> [[TMP0]] 174*87103a01SMomchil Velikov // 175*87103a01SMomchil Velikov mfloat8x16_t testq_f8_p128(poly128_t x) { 176*87103a01SMomchil Velikov return (mfloat8x16_t) x; 177*87103a01SMomchil Velikov } 178*87103a01SMomchil Velikov 179*87103a01SMomchil Velikov // CHECK-LABEL: define dso_local i128 @testq_p128_f8( 180*87103a01SMomchil Velikov // CHECK-SAME: <16 x i8> [[X:%.*]]) #[[ATTR0]] { 181*87103a01SMomchil Velikov // CHECK-NEXT: [[ENTRY:.*:]] 182*87103a01SMomchil Velikov // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x i8> [[X]] to i128 183*87103a01SMomchil Velikov // CHECK-NEXT: ret i128 [[TMP0]] 184*87103a01SMomchil Velikov // 185*87103a01SMomchil Velikov // CHECK-CXX-LABEL: define dso_local noundef i128 @_Z13testq_p128_f814__Mfloat8x16_t( 186*87103a01SMomchil Velikov // CHECK-CXX-SAME: <16 x i8> [[X:%.*]]) #[[ATTR0]] { 187*87103a01SMomchil Velikov // CHECK-CXX-NEXT: [[ENTRY:.*:]] 188*87103a01SMomchil Velikov // CHECK-CXX-NEXT: [[TMP0:%.*]] = bitcast <16 x i8> [[X]] to i128 189*87103a01SMomchil Velikov // CHECK-CXX-NEXT: ret i128 [[TMP0]] 190*87103a01SMomchil Velikov // 191*87103a01SMomchil Velikov poly128_t testq_p128_f8(mfloat8x16_t x) { 192*87103a01SMomchil Velikov return (poly128_t) x; 193*87103a01SMomchil Velikov } 194