xref: /llvm-project/clang/test/CodeGen/arm-mfp8.c (revision 87103a016fbfd480e1d3bb8eba23c27a9c74e70d)
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