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.function u1 main(){
15b1994897Sopenharmony_ci    movi v0, 2500000
16b1994897Sopenharmony_ci    fmovi.64 v1, 1036257.0468539958
17b1994897Sopenharmony_ci    call.short test, v0, v1
18b1994897Sopenharmony_ci    return
19b1994897Sopenharmony_ci}
20b1994897Sopenharmony_ci
21b1994897Sopenharmony_ci.function u1 test(i32 a0, f64 a1){
22b1994897Sopenharmony_ci    movi v3, 12
23b1994897Sopenharmony_ci    newarr v0, v3, f64[]                            #Angles
24b1994897Sopenharmony_ci    call.short init, v0, v0
25b1994897Sopenharmony_ci    call.short cordic, a0, v0
26b1994897Sopenharmony_ci    sta.64 v2                  #total
27b1994897Sopenharmony_ci    fsub2.64 a1
28b1994897Sopenharmony_ci    sta.64 v1
29b1994897Sopenharmony_ci    fldai.64 1e-13
30b1994897Sopenharmony_ci    fcmpl.64 v1
31b1994897Sopenharmony_ci    jltz exit_failure
32b1994897Sopenharmony_ci    ldai 0
33b1994897Sopenharmony_ci    return
34b1994897Sopenharmony_ciexit_failure:
35b1994897Sopenharmony_ci    ldai 1
36b1994897Sopenharmony_ci    return
37b1994897Sopenharmony_ci}
38b1994897Sopenharmony_ci
39b1994897Sopenharmony_ci.function f64 cordic(i32 a0, f64[] a1){
40b1994897Sopenharmony_ci    fmovi.64 v1, 0.0         #total
41b1994897Sopenharmony_ci    movi v2, 0           #loop_counter
42b1994897Sopenharmony_ci    fmovi.64 v3, 28.027      #TARGET_ANGLE
43b1994897Sopenharmony_ciloop:
44b1994897Sopenharmony_ci    lda v2
45b1994897Sopenharmony_ci    jeq a0, loop_exit
46b1994897Sopenharmony_ci    call.short cordicsincos, v3, a1
47b1994897Sopenharmony_ci    fadd2.64 v1
48b1994897Sopenharmony_ci    sta.64 v1
49b1994897Sopenharmony_ci    inci v2, 1
50b1994897Sopenharmony_ci    jmp loop
51b1994897Sopenharmony_ciloop_exit:
52b1994897Sopenharmony_ci    lda.64 v1
53b1994897Sopenharmony_ci    return.64
54b1994897Sopenharmony_ci}
55b1994897Sopenharmony_ci
56b1994897Sopenharmony_ci.function f64 cordicsincos(f64 a0, f64[] a1){
57b1994897Sopenharmony_ci    fmovi.64 v1, 0.0           #x
58b1994897Sopenharmony_ci    fmovi.64 v2, 0.0           #y
59b1994897Sopenharmony_ci    fmovi.64 v3, 0.0           #targetAngle
60b1994897Sopenharmony_ci    fmovi.64 v4, 0.0           #currAngle
61b1994897Sopenharmony_ci    movi.64 v5, 0              #step
62b1994897Sopenharmony_ci    fmovi.64 v6, 0.6072529350      #AG_CONST
63b1994897Sopenharmony_ci    movi v12, 12
64b1994897Sopenharmony_ci    call.short FIXED, v6, v1   #x
65b1994897Sopenharmony_ci    sta.64 v1
66b1994897Sopenharmony_ci    call.short FIXED, a0, a0
67b1994897Sopenharmony_ci    sta.64 v3
68b1994897Sopenharmony_ci    movi v8, 0                 #step
69b1994897Sopenharmony_ciloop:
70b1994897Sopenharmony_ci    lda v8
71b1994897Sopenharmony_ci    jeq v12, loop_exit
72b1994897Sopenharmony_ci    lda.64 v3
73b1994897Sopenharmony_ci    fcmpl.64 v4
74b1994897Sopenharmony_ci    jgtz if
75b1994897Sopenharmony_ci    lda.64 v2
76b1994897Sopenharmony_ci    f64toi32
77b1994897Sopenharmony_ci    shr2 v8
78b1994897Sopenharmony_ci    i32tof64
79b1994897Sopenharmony_ci    fadd2.64 v1
80b1994897Sopenharmony_ci    sta.64 v10                 #newX
81b1994897Sopenharmony_ci    lda.64 v1
82b1994897Sopenharmony_ci    f64toi32
83b1994897Sopenharmony_ci    shr2 v8
84b1994897Sopenharmony_ci    i32tof64
85b1994897Sopenharmony_ci    fneg.64
86b1994897Sopenharmony_ci    fadd2.64 v2
87b1994897Sopenharmony_ci    sta.64 v2
88b1994897Sopenharmony_ci    mov.64 v1, v10
89b1994897Sopenharmony_ci    lda.64 v8
90b1994897Sopenharmony_ci    fldarr.64 a1
91b1994897Sopenharmony_ci    fneg.64
92b1994897Sopenharmony_ci    fadd2.64 v4
93b1994897Sopenharmony_ci    sta.64 v4
94b1994897Sopenharmony_ci    inci v8, 1
95b1994897Sopenharmony_ci    jmp loop
96b1994897Sopenharmony_ciloop_exit:
97b1994897Sopenharmony_ci    call.short FLOAT, v1, v1
98b1994897Sopenharmony_ci    sta.64 v12
99b1994897Sopenharmony_ci    call.short FLOAT, v2, v1
100b1994897Sopenharmony_ci    sta.64 v13
101b1994897Sopenharmony_ci    fmul2.64 v12
102b1994897Sopenharmony_ci    return.64
103b1994897Sopenharmony_ciif:
104b1994897Sopenharmony_ci    lda.64 v2
105b1994897Sopenharmony_ci    f64toi32
106b1994897Sopenharmony_ci    shr2 v8
107b1994897Sopenharmony_ci    i32tof64
108b1994897Sopenharmony_ci    fneg.64
109b1994897Sopenharmony_ci    fadd2.64 v1
110b1994897Sopenharmony_ci    sta.64 v10              #newX
111b1994897Sopenharmony_ci    lda.64 v1
112b1994897Sopenharmony_ci    f64toi32
113b1994897Sopenharmony_ci    shr2 v8
114b1994897Sopenharmony_ci    i32tof64
115b1994897Sopenharmony_ci    fadd2.64 v2
116b1994897Sopenharmony_ci    sta.64 v2
117b1994897Sopenharmony_ci    mov.64 v1, v10
118b1994897Sopenharmony_ci    lda v8
119b1994897Sopenharmony_ci    fldarr.64 a1
120b1994897Sopenharmony_ci    fadd2.64 v4
121b1994897Sopenharmony_ci    sta.64 v4
122b1994897Sopenharmony_ci    inci v8, 1
123b1994897Sopenharmony_ci    lda v8
124b1994897Sopenharmony_ci    jmp loop
125b1994897Sopenharmony_ci}
126b1994897Sopenharmony_ci
127b1994897Sopenharmony_ci.function f64 FLOAT(f64 a0){
128b1994897Sopenharmony_ci    fmovi.64 v1, 65536.0
129b1994897Sopenharmony_ci    lda.64 a0
130b1994897Sopenharmony_ci    fdiv2.64 v1
131b1994897Sopenharmony_ci    return.64
132b1994897Sopenharmony_ci}
133b1994897Sopenharmony_ci
134b1994897Sopenharmony_ci.function f64 FIXED(f64 a0){
135b1994897Sopenharmony_ci    fldai.64 65536.0
136b1994897Sopenharmony_ci    fmul2.64 a0
137b1994897Sopenharmony_ci    return.64
138b1994897Sopenharmony_ci}
139b1994897Sopenharmony_ci
140b1994897Sopenharmony_ci.function void init(f64[] a0){
141b1994897Sopenharmony_ci    movi.64 v2, 0
142b1994897Sopenharmony_ci    fmovi.64 v1, 45.0
143b1994897Sopenharmony_ci    call.short FIXED, v1, v1
144b1994897Sopenharmony_ci    fstarr.64 a0, v2
145b1994897Sopenharmony_ci    inci v2, 1
146b1994897Sopenharmony_ci    fmovi.64 v1, 26.565
147b1994897Sopenharmony_ci    call.short FIXED, v1, v1
148b1994897Sopenharmony_ci    fstarr.64 a0, v2
149b1994897Sopenharmony_ci    inci v2, 1
150b1994897Sopenharmony_ci    fmovi.64 v1, 14.0362
151b1994897Sopenharmony_ci    call.short FIXED, v1, v1
152b1994897Sopenharmony_ci    fstarr.64 a0, v2
153b1994897Sopenharmony_ci    inci v2, 1
154b1994897Sopenharmony_ci    fmovi.64 v1, 7.12502
155b1994897Sopenharmony_ci    call.short FIXED, v1, v1
156b1994897Sopenharmony_ci    fstarr.64 a0, v2
157b1994897Sopenharmony_ci    inci v2, 1
158b1994897Sopenharmony_ci    fmovi.64 v1, 3.57633
159b1994897Sopenharmony_ci    call.short FIXED, v1, v1
160b1994897Sopenharmony_ci    fstarr.64 a0, v2
161b1994897Sopenharmony_ci    inci v2, 1
162b1994897Sopenharmony_ci    fmovi.64 v1, 1.78991
163b1994897Sopenharmony_ci    call.short FIXED, v1, v1
164b1994897Sopenharmony_ci    fstarr.64 a0, v2
165b1994897Sopenharmony_ci    inci v2, 1
166b1994897Sopenharmony_ci    fmovi.64 v1, 0.895174
167b1994897Sopenharmony_ci    call.short FIXED, v1, v1
168b1994897Sopenharmony_ci    fstarr.64 a0, v2
169b1994897Sopenharmony_ci    inci v2, 1
170b1994897Sopenharmony_ci    fmovi.64 v1, 0.447614
171b1994897Sopenharmony_ci    call.short FIXED, v1, v1
172b1994897Sopenharmony_ci    fstarr.64 a0, v2
173b1994897Sopenharmony_ci    inci v2, 1
174b1994897Sopenharmony_ci    fmovi.64 v1, 0.223811
175b1994897Sopenharmony_ci    call.short FIXED, v1, v1
176b1994897Sopenharmony_ci    fstarr.64 a0, v2
177b1994897Sopenharmony_ci    inci v2, 1
178b1994897Sopenharmony_ci    fmovi.64 v1, 0.111906
179b1994897Sopenharmony_ci    call.short FIXED, v1, v1
180b1994897Sopenharmony_ci    fstarr.64 a0, v2
181b1994897Sopenharmony_ci    inci v2, 1
182b1994897Sopenharmony_ci    fmovi.64 v1, 0.055953
183b1994897Sopenharmony_ci    call.short FIXED, v1, v1
184b1994897Sopenharmony_ci    fstarr.64 a0, v2
185b1994897Sopenharmony_ci    inci v2, 1
186b1994897Sopenharmony_ci    fmovi.64 v1, 0.027977
187b1994897Sopenharmony_ci    call.short FIXED, v1, v1
188b1994897Sopenharmony_ci    fstarr.64 a0, v2
189b1994897Sopenharmony_ci    return.void
190b1994897Sopenharmony_ci}
191