1b1994897Sopenharmony_ci# Copyright (c) 2021-2022 Huawei Device Co., Ltd.
2b1994897Sopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License");
3b1994897Sopenharmony_ci# you may not use this file except in compliance with the License.
4b1994897Sopenharmony_ci# You may obtain a copy of the License at
5b1994897Sopenharmony_ci#
6b1994897Sopenharmony_ci# http://www.apache.org/licenses/LICENSE-2.0
7b1994897Sopenharmony_ci#
8b1994897Sopenharmony_ci# Unless required by applicable law or agreed to in writing, software
9b1994897Sopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS,
10b1994897Sopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11b1994897Sopenharmony_ci# See the License for the specific language governing permissions and
12b1994897Sopenharmony_ci# limitations under the License.
13b1994897Sopenharmony_ci# 
14b1994897Sopenharmony_ci# The following comment until the empty line must be a valid YAML document 
15b1994897Sopenharmony_ci# containing exact copies of ISA specification assertions relevant to this test.
16b1994897Sopenharmony_ci#--- 
17b1994897Sopenharmony_ci#   - title: Load from array
18b1994897Sopenharmony_ci#     description: >
19b1994897Sopenharmony_ci#       Load an element from array using accumulator as an index and puts it into accumulator.
20b1994897Sopenharmony_ci#     instructions:
21b1994897Sopenharmony_ci#       - sig: ldarr vs
22b1994897Sopenharmony_ci#         format: [op_vs_8]
23b1994897Sopenharmony_ci#         type: obj
24b1994897Sopenharmony_ci#         dtype: i32
25b1994897Sopenharmony_ci#         etype: i32
26b1994897Sopenharmony_ci#   - title: Store to array
27b1994897Sopenharmony_ci#     description: >
28b1994897Sopenharmony_ci#       Store accumulator content into array slot pointed by index.
29b1994897Sopenharmony_ci#     instructions:
30b1994897Sopenharmony_ci#       - sig: starr vs1, vs2
31b1994897Sopenharmony_ci#         format: [op_vs1_4_vs2_4]
32b1994897Sopenharmony_ci#         type: i32
33b1994897Sopenharmony_ci#         dtype: none
34b1994897Sopenharmony_ci#         etype: i32
35b1994897Sopenharmony_ci
36b1994897Sopenharmony_ci#int foo4(int n) {
37b1994897Sopenharmony_ci#  int sum = 0;
38b1994897Sopenharmony_ci#  if (n < 1)
39b1994897Sopenharmony_ci#    return sum;
40b1994897Sopenharmony_ci#  int *arr = new int[n];
41b1994897Sopenharmony_ci#  for (int i = 0; i < n; i++) {
42b1994897Sopenharmony_ci#    arr[i] = 4;
43b1994897Sopenharmony_ci#    sum += arr[i];
44b1994897Sopenharmony_ci#  }
45b1994897Sopenharmony_ci#  return sum + foo4(n - 1);
46b1994897Sopenharmony_ci#}
47b1994897Sopenharmony_ci#
48b1994897Sopenharmony_ci#int foo3(int n) {
49b1994897Sopenharmony_ci#  int sum = 0;
50b1994897Sopenharmony_ci#  int *arr = new int[n];
51b1994897Sopenharmony_ci#  for (int i = 0; i < n; i++) {
52b1994897Sopenharmony_ci#    arr[i] = 3;
53b1994897Sopenharmony_ci#    sum += arr[i];
54b1994897Sopenharmony_ci#  }
55b1994897Sopenharmony_ci#  n += 2;
56b1994897Sopenharmony_ci#  sum += foo4(n);
57b1994897Sopenharmony_ci#  return sum;
58b1994897Sopenharmony_ci#}
59b1994897Sopenharmony_ci#
60b1994897Sopenharmony_ci#int foo2(int n) {
61b1994897Sopenharmony_ci#  int sum = 0;
62b1994897Sopenharmony_ci#  int *arr = new int[n];
63b1994897Sopenharmony_ci#  for (int i = 0; i < n; i++) {
64b1994897Sopenharmony_ci#    arr[i] = 2;
65b1994897Sopenharmony_ci#    sum += arr[i];
66b1994897Sopenharmony_ci#  }
67b1994897Sopenharmony_ci#  n += 2;
68b1994897Sopenharmony_ci#  sum += foo3(n);
69b1994897Sopenharmony_ci#  return sum;
70b1994897Sopenharmony_ci#}
71b1994897Sopenharmony_ci#
72b1994897Sopenharmony_ci#int foo1(int n) {
73b1994897Sopenharmony_ci#  int sum = 0;
74b1994897Sopenharmony_ci#  int *arr = new int[n];
75b1994897Sopenharmony_ci#  for (int i = 0; i < n; i++) {
76b1994897Sopenharmony_ci#    arr[i] = 1;
77b1994897Sopenharmony_ci#    sum += arr[i];
78b1994897Sopenharmony_ci#  }
79b1994897Sopenharmony_ci#  n += 2;
80b1994897Sopenharmony_ci#  sum += foo2(n);
81b1994897Sopenharmony_ci#  return sum;
82b1994897Sopenharmony_ci#}
83b1994897Sopenharmony_ci#
84b1994897Sopenharmony_ci#int main() {
85b1994897Sopenharmony_ci#  int n = 8;
86b1994897Sopenharmony_ci#  if (foo1(n) != 484)
87b1994897Sopenharmony_ci#    return 1;
88b1994897Sopenharmony_ci#  return 0;
89b1994897Sopenharmony_ci#}
90b1994897Sopenharmony_ci
91b1994897Sopenharmony_ci.function i32 main(){
92b1994897Sopenharmony_ci    movi v0, 8
93b1994897Sopenharmony_ci    movi v1, 484
94b1994897Sopenharmony_ci    call.short foo1, v0, v0
95b1994897Sopenharmony_ci    jne v1, exit_failure
96b1994897Sopenharmony_ci    ldai 0
97b1994897Sopenharmony_ci    return
98b1994897Sopenharmony_ciexit_failure:
99b1994897Sopenharmony_ci    ldai 1
100b1994897Sopenharmony_ci    return
101b1994897Sopenharmony_ci}
102b1994897Sopenharmony_ci
103b1994897Sopenharmony_ci.function i32 foo1(i32 a0){
104b1994897Sopenharmony_ci    newarr v1, a0, i32[]
105b1994897Sopenharmony_ci    movi v0, 0       #loop_counter
106b1994897Sopenharmony_ci    movi v2, 0       #sum
107b1994897Sopenharmony_ci    lda v0
108b1994897Sopenharmony_ciloop:
109b1994897Sopenharmony_ci    jeq a0, loop_exit
110b1994897Sopenharmony_ci    ldai 1
111b1994897Sopenharmony_ci    starr v1, v0
112b1994897Sopenharmony_ci    lda v0
113b1994897Sopenharmony_ci    ldarr v1
114b1994897Sopenharmony_ci    add2 v2
115b1994897Sopenharmony_ci    sta v2
116b1994897Sopenharmony_ci    inci v0, 1
117b1994897Sopenharmony_ci    lda v0
118b1994897Sopenharmony_ci    jmp loop
119b1994897Sopenharmony_ciloop_exit:
120b1994897Sopenharmony_ci    lda a0
121b1994897Sopenharmony_ci    addi 2
122b1994897Sopenharmony_ci    sta a0
123b1994897Sopenharmony_ci    call.short foo2, a0, v2
124b1994897Sopenharmony_ci    add2 v2
125b1994897Sopenharmony_ci    return
126b1994897Sopenharmony_ci}
127b1994897Sopenharmony_ci
128b1994897Sopenharmony_ci.function i32 foo2(i32 a0){
129b1994897Sopenharmony_ci    newarr v1, a0, i32[]
130b1994897Sopenharmony_ci    movi v0, 0
131b1994897Sopenharmony_ci    movi v2, 0       #sum
132b1994897Sopenharmony_ci    lda v0
133b1994897Sopenharmony_ciloop:
134b1994897Sopenharmony_ci    jeq a0, loop_exit
135b1994897Sopenharmony_ci    ldai 2
136b1994897Sopenharmony_ci    starr v1, v0
137b1994897Sopenharmony_ci    lda v0
138b1994897Sopenharmony_ci    ldarr v1
139b1994897Sopenharmony_ci    add2 v2
140b1994897Sopenharmony_ci    sta v2
141b1994897Sopenharmony_ci    inci v0, 1
142b1994897Sopenharmony_ci    lda v0
143b1994897Sopenharmony_ci    jmp loop
144b1994897Sopenharmony_ciloop_exit:
145b1994897Sopenharmony_ci    lda a0
146b1994897Sopenharmony_ci    addi 2
147b1994897Sopenharmony_ci    sta a0
148b1994897Sopenharmony_ci    call.short foo3, a0, a0
149b1994897Sopenharmony_ci    add2 v2
150b1994897Sopenharmony_ci    return
151b1994897Sopenharmony_ci}
152b1994897Sopenharmony_ci
153b1994897Sopenharmony_ci.function i32 foo3(i32 a0){
154b1994897Sopenharmony_ci    newarr v1, a0, i32[]
155b1994897Sopenharmony_ci    movi v0, 0        #loop_counter
156b1994897Sopenharmony_ci    movi v2, 0        #sum
157b1994897Sopenharmony_ci    lda v0
158b1994897Sopenharmony_ciloop:
159b1994897Sopenharmony_ci    jeq a0, loop_exit
160b1994897Sopenharmony_ci    ldai 3
161b1994897Sopenharmony_ci    starr v1, v0
162b1994897Sopenharmony_ci    lda v0
163b1994897Sopenharmony_ci    ldarr v1
164b1994897Sopenharmony_ci    add2 v2
165b1994897Sopenharmony_ci    sta v2
166b1994897Sopenharmony_ci    inci v0, 1
167b1994897Sopenharmony_ci    lda v0
168b1994897Sopenharmony_ci    jmp loop
169b1994897Sopenharmony_ciloop_exit:
170b1994897Sopenharmony_ci    lda a0
171b1994897Sopenharmony_ci    addi 2
172b1994897Sopenharmony_ci    sta a0
173b1994897Sopenharmony_ci    call.short foo4, a0, a0
174b1994897Sopenharmony_ci    add2 v2
175b1994897Sopenharmony_ci    return
176b1994897Sopenharmony_ci}
177b1994897Sopenharmony_ci
178b1994897Sopenharmony_ci.function i32 foo4(i32 a0){
179b1994897Sopenharmony_ci    newarr v1, a0, i32[]
180b1994897Sopenharmony_ci    movi v0, 0        #loop_counter
181b1994897Sopenharmony_ci    movi v2, 0        #sum
182b1994897Sopenharmony_ci    ldai 0
183b1994897Sopenharmony_ci    jeq a0, exit
184b1994897Sopenharmony_ci    lda v0
185b1994897Sopenharmony_ciloop:
186b1994897Sopenharmony_ci    jeq a0, loop_exit
187b1994897Sopenharmony_ci    ldai 4
188b1994897Sopenharmony_ci    starr v1, v0
189b1994897Sopenharmony_ci    lda v0
190b1994897Sopenharmony_ci    ldarr v1
191b1994897Sopenharmony_ci    add2 v2
192b1994897Sopenharmony_ci    sta v2
193b1994897Sopenharmony_ci    inci v0, 1
194b1994897Sopenharmony_ci    lda v0
195b1994897Sopenharmony_ci    jmp loop
196b1994897Sopenharmony_ciloop_exit:
197b1994897Sopenharmony_ci    inci a0, -1
198b1994897Sopenharmony_ci    call.short foo4, a0, a0
199b1994897Sopenharmony_ci    add2 v2
200b1994897Sopenharmony_ci    return
201b1994897Sopenharmony_ciexit:
202b1994897Sopenharmony_ci    ldai 0
203b1994897Sopenharmony_ci    return
204b1994897Sopenharmony_ci}
205