1 // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5 2 // RUN: %clang_cc1 -emit-llvm -triple aarch64-arm-none-eabi -target-feature -fp8 -target-feature +neon -disable-O0-optnone -o - %s | opt -S --passes=mem2reg | FileCheck %s --check-prefixes=CHECK-C 3 // RUN: %clang_cc1 -emit-llvm -triple aarch64-arm-none-eabi -target-feature -fp8 -target-feature +neon -disable-O0-optnone -o - -x c++ %s | opt -S --passes=mem2reg | FileCheck %s --check-prefixes=CHECK-CXX 4 5 // REQUIRES: aarch64-registered-target 6 7 8 #include <arm_neon.h> 9 10 // CHECK-C-LABEL: define dso_local <16 x i8> @test_ret_mfloat8x16_t( 11 // CHECK-C-SAME: <16 x i8> [[V:%.*]]) #[[ATTR0:[0-9]+]] { 12 // CHECK-C-NEXT: [[ENTRY:.*:]] 13 // CHECK-C-NEXT: ret <16 x i8> [[V]] 14 // 15 // CHECK-CXX-LABEL: define dso_local <16 x i8> @_Z21test_ret_mfloat8x16_t14__Mfloat8x16_t( 16 // CHECK-CXX-SAME: <16 x i8> [[V:%.*]]) #[[ATTR0:[0-9]+]] { 17 // CHECK-CXX-NEXT: [[ENTRY:.*:]] 18 // CHECK-CXX-NEXT: ret <16 x i8> [[V]] 19 // 20 mfloat8x16_t test_ret_mfloat8x16_t(mfloat8x16_t v) { 21 return v; 22 } 23 24 // CHECK-C-LABEL: define dso_local <8 x i8> @test_ret_mfloat8x8_t( 25 // CHECK-C-SAME: <8 x i8> [[V:%.*]]) #[[ATTR0]] { 26 // CHECK-C-NEXT: [[ENTRY:.*:]] 27 // CHECK-C-NEXT: ret <8 x i8> [[V]] 28 // 29 // CHECK-CXX-LABEL: define dso_local <8 x i8> @_Z20test_ret_mfloat8x8_t13__Mfloat8x8_t( 30 // CHECK-CXX-SAME: <8 x i8> [[V:%.*]]) #[[ATTR0]] { 31 // CHECK-CXX-NEXT: [[ENTRY:.*:]] 32 // CHECK-CXX-NEXT: ret <8 x i8> [[V]] 33 // 34 mfloat8x8_t test_ret_mfloat8x8_t(mfloat8x8_t v) { 35 return v; 36 } 37 38 // CHECK-C-LABEL: define dso_local <1 x i8> @func1n( 39 // CHECK-C-SAME: <1 x i8> [[MFP8:%.*]]) #[[ATTR0]] { 40 // CHECK-C-NEXT: [[ENTRY:.*:]] 41 // CHECK-C-NEXT: [[F1N:%.*]] = alloca [10 x <1 x i8>], align 1 42 // CHECK-C-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x <1 x i8>], ptr [[F1N]], i64 0, i64 2 43 // CHECK-C-NEXT: store <1 x i8> [[MFP8]], ptr [[ARRAYIDX]], align 1 44 // CHECK-C-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds [10 x <1 x i8>], ptr [[F1N]], i64 0, i64 2 45 // CHECK-C-NEXT: [[TMP0:%.*]] = load <1 x i8>, ptr [[ARRAYIDX1]], align 1 46 // CHECK-C-NEXT: ret <1 x i8> [[TMP0]] 47 // 48 // CHECK-CXX-LABEL: define dso_local <1 x i8> @_Z6func1nu6__mfp8( 49 // CHECK-CXX-SAME: <1 x i8> [[MFP8:%.*]]) #[[ATTR0]] { 50 // CHECK-CXX-NEXT: [[ENTRY:.*:]] 51 // CHECK-CXX-NEXT: [[F1N:%.*]] = alloca [10 x <1 x i8>], align 1 52 // CHECK-CXX-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x <1 x i8>], ptr [[F1N]], i64 0, i64 2 53 // CHECK-CXX-NEXT: store <1 x i8> [[MFP8]], ptr [[ARRAYIDX]], align 1 54 // CHECK-CXX-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds [10 x <1 x i8>], ptr [[F1N]], i64 0, i64 2 55 // CHECK-CXX-NEXT: [[TMP0:%.*]] = load <1 x i8>, ptr [[ARRAYIDX1]], align 1 56 // CHECK-CXX-NEXT: ret <1 x i8> [[TMP0]] 57 // 58 __mfp8 func1n(__mfp8 mfp8) { 59 __mfp8 f1n[10]; 60 f1n[2] = mfp8; 61 return f1n[2]; 62 } 63 64 // CHECK-C-LABEL: define dso_local <1 x i8> @test_extract_element( 65 // CHECK-C-SAME: <16 x i8> [[X:%.*]], i32 noundef [[I:%.*]]) #[[ATTR0]] { 66 // CHECK-C-NEXT: [[ENTRY:.*:]] 67 // CHECK-C-NEXT: [[RETVAL:%.*]] = alloca <1 x i8>, align 1 68 // CHECK-C-NEXT: [[VECEXT:%.*]] = extractelement <16 x i8> [[X]], i32 [[I]] 69 // CHECK-C-NEXT: store i8 [[VECEXT]], ptr [[RETVAL]], align 1 70 // CHECK-C-NEXT: [[TMP0:%.*]] = load <1 x i8>, ptr [[RETVAL]], align 1 71 // CHECK-C-NEXT: ret <1 x i8> [[TMP0]] 72 // 73 // CHECK-CXX-LABEL: define dso_local <1 x i8> @_Z20test_extract_element14__Mfloat8x16_ti( 74 // CHECK-CXX-SAME: <16 x i8> [[X:%.*]], i32 noundef [[I:%.*]]) #[[ATTR0]] { 75 // CHECK-CXX-NEXT: [[ENTRY:.*:]] 76 // CHECK-CXX-NEXT: [[RETVAL:%.*]] = alloca <1 x i8>, align 1 77 // CHECK-CXX-NEXT: [[VECEXT:%.*]] = extractelement <16 x i8> [[X]], i32 [[I]] 78 // CHECK-CXX-NEXT: store i8 [[VECEXT]], ptr [[RETVAL]], align 1 79 // CHECK-CXX-NEXT: [[TMP0:%.*]] = load <1 x i8>, ptr [[RETVAL]], align 1 80 // CHECK-CXX-NEXT: ret <1 x i8> [[TMP0]] 81 // 82 mfloat8_t test_extract_element(mfloat8x16_t x, int i) { 83 return x[i]; 84 } 85 86 // CHECK-C-LABEL: define dso_local <16 x i8> @test_insert_element( 87 // CHECK-C-SAME: <16 x i8> [[X:%.*]], i32 noundef [[I:%.*]], <1 x i8> [[V:%.*]]) #[[ATTR0]] { 88 // CHECK-C-NEXT: [[ENTRY:.*:]] 89 // CHECK-C-NEXT: [[TMP0:%.*]] = bitcast <1 x i8> [[V]] to i8 90 // CHECK-C-NEXT: [[VECINS:%.*]] = insertelement <16 x i8> [[X]], i8 [[TMP0]], i32 [[I]] 91 // CHECK-C-NEXT: ret <16 x i8> [[VECINS]] 92 // 93 // CHECK-CXX-LABEL: define dso_local <16 x i8> @_Z19test_insert_element14__Mfloat8x16_tiu6__mfp8( 94 // CHECK-CXX-SAME: <16 x i8> [[X:%.*]], i32 noundef [[I:%.*]], <1 x i8> [[V:%.*]]) #[[ATTR0]] { 95 // CHECK-CXX-NEXT: [[ENTRY:.*:]] 96 // CHECK-CXX-NEXT: [[TMP0:%.*]] = bitcast <1 x i8> [[V]] to i8 97 // CHECK-CXX-NEXT: [[VECINS:%.*]] = insertelement <16 x i8> [[X]], i8 [[TMP0]], i32 [[I]] 98 // CHECK-CXX-NEXT: ret <16 x i8> [[VECINS]] 99 // 100 mfloat8x16_t test_insert_element(mfloat8x16_t x, int i, mfloat8_t v) { 101 x[i] = v; 102 return x; 103 } 104