Пр о ц е с с о р TMS 3 2 0C4 x
173
.global
Arccos
Arccos:
LDP
ACOS_ADR
LDI
@ACOS_ADR, AR0
; адрес констант в AR0
PUSHF
R0
ABSF
R0, R2
; X = абсолютное значение x
CMPF
0.5, R2
; сравнение X с 0.5
BN
ACOSB1
; если X < 0.5, переход на
ACOSB1
LDI
1, IR1
SUBF
R2,
∗
AR0, R2
; X = 1.0 – X
MPYF
0.5, R2
; g = X / 2
PUSHF
R2
LDF
R2, R3
RSQRF
R2, R1
; R1 = v[0] = первое приближе-
ние 1/sqrt(g)
MPYF
0.5, R2
; R2 = v/2
MPYF
R1, R2, R0
; R0 = v[0](g/2)
MPYF
R1, R0
; R0 = (g/2)v[0]v[0]
SUBRF
1.5, R0
; R0 = 1.5 – (g/2)v[0]v[0]
MPYF
R0, R1
; v[1] = v[0](1.5 – (g/2)v[0]v[0])
RND
R1
MPYF3
R1, R2, R0
; R0 = v[1](g/2)
MPYF
R1, R0
; R0 = (g/2)v[1]v[1]
SUBRF
1.5, R0
; R0 = 1.5 – (g/2)v[1]v[1]
MPYF
R0, R1
; v[2] = v[1](1.5 – (g/2)v[1]v[1])
RND
R1, R2
; 1/ sqrt(g)
→
R2
BD
ACOSB2
; переход на ACOSB2
MPYF3
R3, R2, R4
; sqrt(g) = g
⋅
sqrt(1/g)
MPYF
-2.0, R4
; X = – 2sqrt(g)
→
R4
POPF
R3
; g
→
R3
ACOSB1:
LDI
2, IR1
; 2
→
IR1
LDF
R2, R4
; X
→
R4
MPYF
R4, R4, R3
; g = X
2
→
R3
ACOSB2:
MPYF
∗
++AR0, R3, R0
; P
2
g
→
R0
ADDF
∗
++AR0, R0
; R0 + P
1
→
R0
MPYF
R3, R0
; gR0
→
R0
ADDF
∗
++AR0, R3, R1
; Q
1
+ g
→
R1
MPYF
R3, R1
; gR1
→
R1
ADDF
∗
++AR0, R1
; R1 + Q
0
→
R1