【发布时间】:2021-07-18 21:56:35
【问题描述】:
我正在学习 TMS320C55x 中的反正切实现 这是源代码:
;* AR0 assigned to _x
;* AR1 assigned to _r
;* T0 assigned to _nx
PSH T3
|| BSET FRCT ;fractional mode
SUB #1, T0 ;nx-1
MOV T0, BRC0 ;repeat nx times
MOV #2596 << #16, AC3 ; AC3.Hi = C5
MOV #-9464 << #16, AC1 ; AC1.Hi = C3
MOV #32617 << #16, AC2 ; AC2.Hi = C1
*
* Note: loading T3 on the instruction before a multiply that uses it will
* cause a 1-cycle delay.
*
MPYMR T3=*AR0+, AC3, AC0 ; (Prime the Pump)
|| RPTBLOCAL loop1-1
MACR AC0, T3, AC1, AC0
MPYR T3, AC0
||MOV *AR0+, T1 ; (for next iteration)
MACR AC0, T3, AC2, AC0
MPYR T3, AC0
||MOV T1, T3
MOV HI(AC0), *AR1+ ;save result
||MPYR T1, AC3, AC0 ; (for next iteration)
loop1:
POP T3
|| BCLR FRCT ;return to standard C
MOV #0, T0 ;return OK value (no possible error)
|| RET
其中 _x 是输入向量,_r 是输出。 nx 是元素的数量。 问题是关于分配给 AC3、AC1、AC2 的常量。我猜这是多项式逼近的系数,但我不明白如何计算它们
【问题讨论】:
-
这个程序集对我来说是未知的......所以我只能猜测 tan 和 arctan 通常由 Chebyshev polynomials 或 CORDIC 计算......也许你应该稍微对齐代码以便它的更具可读性和描述非标准助记符,甚至将代码转换为方程式……还有什么数据类型?固定点?
标签: math assembly trigonometry numerical-methods