Пр о ц е с с о р TMS 3 2 0C4 x
177
Пример Д.10. Программа вычисления
ln
(x)
; Регистры на входе:
R0 – аргумент x
; Регистры на выходе:
R0 – значение функции ln(x)
; Используемые регистры:
R1, R2, R3, R8, R10, AR2, AR0
; Вызов
LAJ Log_e
; Память: код
53 слова
;
константы
7 слов
; Время выполнения
57 циклов ( 2.28 мкс)
; В комментариях обозначены:
;
M{x} – мантисса числа
x
,
;
E{x} – экспонента числа
x
.global
Log_e
Log_e:
LDP
LOG_ADR
LDI
@LOG_ADR, AR0
; адрес констант в AR0
LDF
R0, R2
PUSHF
R2
; сохранение x в стеке
LDF
1.0, R3
; 1.0
→
R3
LDI
R2, R3
; M{x}
→
R3
POP
AR2
; x
→
AR2
ASH
-24, AR2
; E{x}
→
AR2
ADDI
1, AR2
; E{x} + 1
LDF
0.5, R2
; 0.5
→
R2
MPYF
R2, R3
; f = 0.5M{x}
CMPF
∗
AR0++, R3
; сравнение M{x} с sqrt(0.5)
BLT
LOGB1
; если f < sqrt(0.5),
; переход на LOGB1
SUBFR
2, R3, R0
; f – 0.5
→
R0
BD
LOGB2
; переход на LOGB2
SUBFR
2, R0
; P = R0 – 0.5
MPYF
R2, R3, R1
; P / 2
→
R1
ADDF
R2, R1
; Q = R1 + 0.5
LOGB1:
SUBFR
2, R3, R0
; P = f – 0.5
MPYF
R2, R0, R1
; 0.5P
→
R1
ADDF
R2, R1
; Q = R1 + 0.5
SUBI
1, AR2
; E{x} – 1
; Вычисление z = P / Q, где v = Q
LOGB2:
RCPF
R1, R10
; x[0] = приближение 1/v
MPYF
R10, R1, R8
; R8 = vx[0]
SUBRF
2.0, R8
; R8 = 2.0 – vx[0]
MPYF
R8, R10
; R10 = x[1] = x[0](2.0 – vx[0])