fourier_asm.s 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. .globl mac_init;
  2. ALIGN;
  3. mac_init:
  4. movel #0,%macsr
  5. movel #0xfffffdff,%mask /*CFG_ADC_BUF_MASK */
  6. movel #0x0,%acc0
  7. movel #0x0,%acc1
  8. clrl %d0
  9. rts
  10. /*
  11. 在内核中函数调用压栈的顺序为从右到左,最后压栈的为返回地址。
  12. 例如下列函数中返回地址为sp(0),a的地址为sp(4),b的地址为sp(8), c的地址为sp(12).
  13. void abc(int a,int b, int c)
  14. {
  15. }
  16. void fourier32(short *dots,short * real_image_pair,int harmonic)
  17. */
  18. .globl fourier32;
  19. ALIGN;
  20. fourier32:
  21. subal #(3*4), %sp
  22. moveml %d2/%a2-%a3 ,%sp@
  23. /*得到初值*/
  24. movel %sp@(16),%a0 /*a0: 采样值的地址*/
  25. moveal %sp@(24),%a1 /*a1:本次实部系数地址*/
  26. moveal %a1,%a2
  27. addl #64,%a2 /*a2本次虚部系数地址*/
  28. movel %sp@(20),%a3 /*a3: 返回复数对的地址*/
  29. movel #0,%acc0 /*ACC0清零*/
  30. movel #0,%acc1 /*ACC1清零*/
  31. clrl %d0
  32. mac.w %d0u,%d2u,(%a0)+&,%d0,%acc0 /*%d2高16位为0,并取回下一个采样值*/
  33. movel (%a1)+,%d1 /*实部系数*/
  34. /*循环计算*/
  35. mac.w %d0l,%d1l,%acc0 /*乘加实部低16位*/
  36. mac.w %d0u,%d1u,(%a2)+,%d2,%acc0 /*乘加实部高16位,并取虚部系数*/
  37. mac.w %d0l,%d2l,(%a1)+,%d1,%acc1 /*乘加虚部低16位,并取实部系数*/
  38. mac.w %d0u,%d2u,(%a0)+&,%d0,%acc1 /*乘加虚部高16位,并取采样值*/
  39. mac.w %d0l,%d1l,%acc0 /*乘加实部低16位*/
  40. mac.w %d0u,%d1u,(%a2)+,%d2,%acc0 /*乘加实部高16位,并取虚部系数*/
  41. mac.w %d0l,%d2l,(%a1)+,%d1,%acc1 /*乘加虚部低16位,并取实部系数*/
  42. mac.w %d0u,%d2u,(%a0)+&,%d0,%acc1 /*乘加虚部高16位,并取采样值*/
  43. mac.w %d0l,%d1l,%acc0 /*乘加实部低16位*/
  44. mac.w %d0u,%d1u,(%a2)+,%d2,%acc0 /*乘加实部高16位,并取虚部系数*/
  45. mac.w %d0l,%d2l,(%a1)+,%d1,%acc1 /*乘加虚部低16位,并取实部系数*/
  46. mac.w %d0u,%d2u,(%a0)+&,%d0,%acc1 /*乘加虚部高16位,并取采样值*/
  47. mac.w %d0l,%d1l,%acc0 /*乘加实部低16位*/
  48. mac.w %d0u,%d1u,(%a2)+,%d2,%acc0 /*乘加实部高16位,并取虚部系数*/
  49. mac.w %d0l,%d2l,(%a1)+,%d1,%acc1 /*乘加虚部低16位,并取实部系数*/
  50. mac.w %d0u,%d2u,(%a0)+&,%d0,%acc1 /*乘加虚部高16位,并取采样值*/
  51. mac.w %d0l,%d1l,%acc0 /*乘加实部低16位*/
  52. mac.w %d0u,%d1u,(%a2)+,%d2,%acc0 /*乘加实部高16位,并取虚部系数*/
  53. mac.w %d0l,%d2l,(%a1)+,%d1,%acc1 /*乘加虚部低16位,并取实部系数*/
  54. mac.w %d0u,%d2u,(%a0)+&,%d0,%acc1 /*乘加虚部高16位,并取采样值*/
  55. mac.w %d0l,%d1l,%acc0 /*乘加实部低16位*/
  56. mac.w %d0u,%d1u,(%a2)+,%d2,%acc0 /*乘加实部高16位,并取虚部系数*/
  57. mac.w %d0l,%d2l,(%a1)+,%d1,%acc1 /*乘加虚部低16位,并取实部系数*/
  58. mac.w %d0u,%d2u,(%a0)+&,%d0,%acc1 /*乘加虚部高16位,并取采样值*/
  59. mac.w %d0l,%d1l,%acc0 /*乘加实部低16位*/
  60. mac.w %d0u,%d1u,(%a2)+,%d2,%acc0 /*乘加实部高16位,并取虚部系数*/
  61. mac.w %d0l,%d2l,(%a1)+,%d1,%acc1 /*乘加虚部低16位,并取实部系数*/
  62. mac.w %d0u,%d2u,(%a0)+&,%d0,%acc1 /*乘加虚部高16位,并取采样值*/
  63. mac.w %d0l,%d1l,%acc0 /*乘加实部低16位*/
  64. mac.w %d0u,%d1u,(%a2)+,%d2,%acc0 /*乘加实部高16位,并取虚部系数*/
  65. mac.w %d0l,%d2l,(%a1)+,%d1,%acc1 /*乘加虚部低16位,并取实部系数*/
  66. mac.w %d0u,%d2u,(%a0)+&,%d0,%acc1 /*乘加虚部高16位,并取采样值*/
  67. mac.w %d0l,%d1l,%acc0 /*乘加实部低16位*/
  68. mac.w %d0u,%d1u,(%a2)+,%d2,%acc0 /*乘加实部高16位,并取虚部系数*/
  69. mac.w %d0l,%d2l,(%a1)+,%d1,%acc1 /*乘加虚部低16位,并取实部系数*/
  70. mac.w %d0u,%d2u,(%a0)+&,%d0,%acc1 /*乘加虚部高16位,并取采样值*/
  71. mac.w %d0l,%d1l,%acc0 /*乘加实部低16位*/
  72. mac.w %d0u,%d1u,(%a2)+,%d2,%acc0 /*乘加实部高16位,并取虚部系数*/
  73. mac.w %d0l,%d2l,(%a1)+,%d1,%acc1 /*乘加虚部低16位,并取实部系数*/
  74. mac.w %d0u,%d2u,(%a0)+&,%d0,%acc1 /*乘加虚部高16位,并取采样值*/
  75. mac.w %d0l,%d1l,%acc0 /*乘加实部低16位*/
  76. mac.w %d0u,%d1u,(%a2)+,%d2,%acc0 /*乘加实部高16位,并取虚部系数*/
  77. mac.w %d0l,%d2l,(%a1)+,%d1,%acc1 /*乘加虚部低16位,并取实部系数*/
  78. mac.w %d0u,%d2u,(%a0)+&,%d0,%acc1 /*乘加虚部高16位,并取采样值*/
  79. mac.w %d0l,%d1l,%acc0 /*乘加实部低16位*/
  80. mac.w %d0u,%d1u,(%a2)+,%d2,%acc0 /*乘加实部高16位,并取虚部系数*/
  81. mac.w %d0l,%d2l,(%a1)+,%d1,%acc1 /*乘加虚部低16位,并取实部系数*/
  82. mac.w %d0u,%d2u,(%a0)+&,%d0,%acc1 /*乘加虚部高16位,并取采样值*/
  83. mac.w %d0l,%d1l,%acc0 /*乘加实部低16位*/
  84. mac.w %d0u,%d1u,(%a2)+,%d2,%acc0 /*乘加实部高16位,并取虚部系数*/
  85. mac.w %d0l,%d2l,(%a1)+,%d1,%acc1 /*乘加虚部低16位,并取实部系数*/
  86. mac.w %d0u,%d2u,(%a0)+&,%d0,%acc1 /*乘加虚部高16位,并取采样值*/
  87. mac.w %d0l,%d1l,%acc0 /*乘加实部低16位*/
  88. mac.w %d0u,%d1u,(%a2)+,%d2,%acc0 /*乘加实部高16位,并取虚部系数*/
  89. mac.w %d0l,%d2l,(%a1)+,%d1,%acc1 /*乘加虚部低16位,并取实部系数*/
  90. mac.w %d0u,%d2u,(%a0)+&,%d0,%acc1 /*乘加虚部高16位,并取采样值*/
  91. mac.w %d0l,%d1l,%acc0 /*乘加实部低16位*/
  92. mac.w %d0u,%d1u,(%a2)+,%d2,%acc0 /*乘加实部高16位,并取虚部系数*/
  93. mac.w %d0l,%d2l,(%a1)+,%d1,%acc1 /*乘加虚部低16位,并取实部系数*/
  94. mac.w %d0u,%d2u,(%a0)+&,%d0,%acc1 /*乘加虚部高16位,并取采样值*/
  95. mac.w %d0l,%d1l,%acc0 /*乘加实部低16位*/
  96. mac.w %d0u,%d1u,(%a2)+,%d2,%acc0 /*乘加实部高16位,并取虚部系数*/
  97. mac.w %d0l,%d2l,%acc1 /*乘加虚部低16位*/
  98. mac.w %d0u,%d2u,%acc1 /*乘加虚部高16位*/
  99. /*取得结果,并四舍五入*/
  100. movel %acc0,%d0 /*结果->D0*/
  101. addl #0x8000,%d0 /*大于0.5就加一,已考虑正负数问题。*/
  102. swap %d0 /*交换高低16位,就是将结果值除以65536*/
  103. move.w %d0,(%a3)+ /*保存结果*/
  104. movel %acc1,%d0 /*结果->D0*/
  105. addl #0x8000,%d0 /*大于0.5就加一,已考虑正负数问题。*/
  106. swap %d0 /*交换高低16位,就是将结果值除以65536*/
  107. move.w %d0,(%a3) /*保存结果*/
  108. /*函数退出*/
  109. moveml %sp@,%d2/%a2-%a3
  110. addal #(3*4), %sp
  111. rts
  112. .globl fourier32_half;
  113. ALIGN;
  114. fourier32_half:
  115. subal #(3*4), %sp
  116. moveml %d2/%a2-%a3 ,%sp@
  117. /*得到初值*/
  118. movel %sp@(16),%a0 /*a0: 采样值的地址*/
  119. moveal %sp@(24),%a1 /*a1:本次实部系数地址*/
  120. moveal %a1,%a2
  121. addl #64,%a2 /*a2本次虚部系数地址*/
  122. movel %sp@(20),%a3 /*a3: 返回复数对的地址*/
  123. movel #0,%acc0 /*ACC0清零*/
  124. movel #0,%acc1 /*ACC1清零*/
  125. clrl %d0
  126. mac.w %d0u,%d2u,(%a0)+&,%d0,%acc0 /*%d2高16位为0,并取回下一个采样值*/
  127. movel (%a1)+,%d1 /*实部系数*/
  128. /*循环计算*/
  129. mac.w %d0l,%d1l,%acc0 /*乘加实部低16位*/
  130. mac.w %d0u,%d1u,(%a2)+,%d2,%acc0 /*乘加实部高16位,并取虚部系数*/
  131. mac.w %d0l,%d2l,(%a1)+,%d1,%acc1 /*乘加虚部低16位,并取实部系数*/
  132. mac.w %d0u,%d2u,(%a0)+&,%d0,%acc1 /*乘加虚部高16位,并取采样值*/
  133. mac.w %d0l,%d1l,%acc0 /*乘加实部低16位*/
  134. mac.w %d0u,%d1u,(%a2)+,%d2,%acc0 /*乘加实部高16位,并取虚部系数*/
  135. mac.w %d0l,%d2l,(%a1)+,%d1,%acc1 /*乘加虚部低16位,并取实部系数*/
  136. mac.w %d0u,%d2u,(%a0)+&,%d0,%acc1 /*乘加虚部高16位,并取采样值*/
  137. mac.w %d0l,%d1l,%acc0 /*乘加实部低16位*/
  138. mac.w %d0u,%d1u,(%a2)+,%d2,%acc0 /*乘加实部高16位,并取虚部系数*/
  139. mac.w %d0l,%d2l,(%a1)+,%d1,%acc1 /*乘加虚部低16位,并取实部系数*/
  140. mac.w %d0u,%d2u,(%a0)+&,%d0,%acc1 /*乘加虚部高16位,并取采样值*/
  141. mac.w %d0l,%d1l,%acc0 /*乘加实部低16位*/
  142. mac.w %d0u,%d1u,(%a2)+,%d2,%acc0 /*乘加实部高16位,并取虚部系数*/
  143. mac.w %d0l,%d2l,(%a1)+,%d1,%acc1 /*乘加虚部低16位,并取实部系数*/
  144. mac.w %d0u,%d2u,(%a0)+&,%d0,%acc1 /*乘加虚部高16位,并取采样值*/
  145. mac.w %d0l,%d1l,%acc0 /*乘加实部低16位*/
  146. mac.w %d0u,%d1u,(%a2)+,%d2,%acc0 /*乘加实部高16位,并取虚部系数*/
  147. mac.w %d0l,%d2l,(%a1)+,%d1,%acc1 /*乘加虚部低16位,并取实部系数*/
  148. mac.w %d0u,%d2u,(%a0)+&,%d0,%acc1 /*乘加虚部高16位,并取采样值*/
  149. mac.w %d0l,%d1l,%acc0 /*乘加实部低16位*/
  150. mac.w %d0u,%d1u,(%a2)+,%d2,%acc0 /*乘加实部高16位,并取虚部系数*/
  151. mac.w %d0l,%d2l,(%a1)+,%d1,%acc1 /*乘加虚部低16位,并取实部系数*/
  152. mac.w %d0u,%d2u,(%a0)+&,%d0,%acc1 /*乘加虚部高16位,并取采样值*/
  153. mac.w %d0l,%d1l,%acc0 /*乘加实部低16位*/
  154. mac.w %d0u,%d1u,(%a2)+,%d2,%acc0 /*乘加实部高16位,并取虚部系数*/
  155. mac.w %d0l,%d2l,(%a1)+,%d1,%acc1 /*乘加虚部低16位,并取实部系数*/
  156. mac.w %d0u,%d2u,(%a0)+&,%d0,%acc1 /*乘加虚部高16位,并取采样值*/
  157. mac.w %d0l,%d1l,%acc0 /*乘加实部低16位*/
  158. mac.w %d0u,%d1u,(%a2)+,%d2,%acc0 /*乘加实部高16位,并取虚部系数*/
  159. mac.w %d0l,%d2l,%acc1 /*乘加虚部低16位*/
  160. mac.w %d0u,%d2u,%acc1 /*乘加虚部高16位*/
  161. /*取得结果,并四舍五入*/
  162. movel #2,%d1
  163. movel %acc0,%d0 /*结果->D0*/
  164. mulsl %d1,%d0 /*有符号乘以2*/
  165. addl #0x8000,%d0 /*大于0.5就加一,已考虑正负数问题。*/
  166. swap %d0 /*交换高低16位,就是将结果值除以65536*/
  167. move.w %d0,(%a3)+ /*保存结果*/
  168. movel %acc1,%d0 /*结果->D0*/
  169. mulsl %d1,%d0 /*有符号乘以2*/
  170. addl #0x8000,%d0 /*大于0.5就加一,已考虑正负数问题。*/
  171. swap %d0 /*交换高低16位,就是将结果值除以65536*/
  172. move.w %d0,(%a3) /*保存结果*/
  173. /*函数退出*/
  174. moveml %sp@,%d2/%a2-%a3
  175. addal #(3*4), %sp
  176. rts
  177. .globl bkpt_disable;
  178. ALIGN;
  179. bkpt_disable:
  180. lea wdbg_bkpt,%a0
  181. wdebug (%a0)
  182. clrl %d0
  183. rts
  184. .data
  185. .align 4
  186. wdbg_bkpt:
  187. .word 0x2c80 /* DR0 */
  188. .word 0x0006 /* 31:16 */
  189. .word 0x0000 /* 15:0 -- enable UHE */
  190. .word 0x0000 /* unused */