asm.S 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342
  1. /*
  2. * Copyright (C) 2002 Wolfgang Denk <wd@denx.de>
  3. *
  4. * SPDX-License-Identifier: GPL-2.0+
  5. */
  6. #include <config.h>
  7. #include <post.h>
  8. #include <ppc_asm.tmpl>
  9. #include <ppc_defs.h>
  10. #include <asm/cache.h>
  11. #if CONFIG_POST & CONFIG_SYS_POST_CPU
  12. /* void cpu_post_exec_02 (ulong *code, ulong op1, ulong op2); */
  13. .global cpu_post_exec_02
  14. cpu_post_exec_02:
  15. isync
  16. mflr r0
  17. stwu r0, -4(r1)
  18. subi r1, r1, 104
  19. stmw r6, 0(r1)
  20. mtlr r3
  21. mr r3, r4
  22. mr r4, r5
  23. blrl
  24. lmw r6, 0(r1)
  25. addi r1, r1, 104
  26. lwz r0, 0(r1)
  27. addi r1, r1, 4
  28. mtlr r0
  29. blr
  30. /* void cpu_post_exec_04 (ulong *code, ulong op1, ulong op2, ulong op3, ulong op4); */
  31. .global cpu_post_exec_04
  32. cpu_post_exec_04:
  33. isync
  34. mflr r0
  35. stwu r0, -4(r1)
  36. subi r1, r1, 96
  37. stmw r8, 0(r1)
  38. mtlr r3
  39. mr r3, r4
  40. mr r4, r5
  41. mr r5, r6
  42. mtxer r7
  43. blrl
  44. lmw r8, 0(r1)
  45. addi r1, r1, 96
  46. lwz r0, 0(r1)
  47. addi r1, r1, 4
  48. mtlr r0
  49. blr
  50. /* void cpu_post_exec_12 (ulong *code, ulong *res, ulong op1, ulong op2); */
  51. .global cpu_post_exec_12
  52. cpu_post_exec_12:
  53. isync
  54. mflr r0
  55. stwu r0, -4(r1)
  56. stwu r4, -4(r1)
  57. mtlr r3
  58. mr r3, r5
  59. mr r4, r6
  60. blrl
  61. lwz r4, 0(r1)
  62. stw r3, 0(r4)
  63. lwz r0, 4(r1)
  64. addi r1, r1, 8
  65. mtlr r0
  66. blr
  67. /* void cpu_post_exec_11 (ulong *code, ulong *res, ulong op1); */
  68. .global cpu_post_exec_11
  69. cpu_post_exec_11:
  70. isync
  71. mflr r0
  72. stwu r0, -4(r1)
  73. stwu r4, -4(r1)
  74. mtlr r3
  75. mr r3, r5
  76. blrl
  77. lwz r4, 0(r1)
  78. stw r3, 0(r4)
  79. lwz r0, 4(r1)
  80. addi r1, r1, 8
  81. mtlr r0
  82. blr
  83. /* void cpu_post_exec_21 (ulong *code, ulong *cr, ulong *res, ulong op1); */
  84. .global cpu_post_exec_21
  85. cpu_post_exec_21:
  86. isync
  87. mflr r0
  88. stwu r0, -4(r1)
  89. stwu r4, -4(r1)
  90. stwu r5, -4(r1)
  91. li r0, 0
  92. mtxer r0
  93. lwz r0, 0(r4)
  94. mtcr r0
  95. mtlr r3
  96. mr r3, r6
  97. blrl
  98. mfcr r0
  99. lwz r4, 4(r1)
  100. stw r0, 0(r4)
  101. lwz r4, 0(r1)
  102. stw r3, 0(r4)
  103. lwz r0, 8(r1)
  104. addi r1, r1, 12
  105. mtlr r0
  106. blr
  107. /* void cpu_post_exec_22 (ulong *code, ulong *cr, ulong *res, ulong op1,
  108. ulong op2); */
  109. .global cpu_post_exec_22
  110. cpu_post_exec_22:
  111. isync
  112. mflr r0
  113. stwu r0, -4(r1)
  114. stwu r4, -4(r1)
  115. stwu r5, -4(r1)
  116. li r0, 0
  117. mtxer r0
  118. lwz r0, 0(r4)
  119. mtcr r0
  120. mtlr r3
  121. mr r3, r6
  122. mr r4, r7
  123. blrl
  124. mfcr r0
  125. lwz r4, 4(r1)
  126. stw r0, 0(r4)
  127. lwz r4, 0(r1)
  128. stw r3, 0(r4)
  129. lwz r0, 8(r1)
  130. addi r1, r1, 12
  131. mtlr r0
  132. blr
  133. /* void cpu_post_exec_12w (ulong *code, ulong *op1, ulong op2, ulong op3); */
  134. .global cpu_post_exec_12w
  135. cpu_post_exec_12w:
  136. isync
  137. mflr r0
  138. stwu r0, -4(r1)
  139. stwu r4, -4(r1)
  140. mtlr r3
  141. lwz r3, 0(r4)
  142. mr r4, r5
  143. mr r5, r6
  144. blrl
  145. lwz r4, 0(r1)
  146. stw r3, 0(r4)
  147. lwz r0, 4(r1)
  148. addi r1, r1, 8
  149. mtlr r0
  150. blr
  151. /* void cpu_post_exec_11w (ulong *code, ulong *op1, ulong op2); */
  152. .global cpu_post_exec_11w
  153. cpu_post_exec_11w:
  154. isync
  155. mflr r0
  156. stwu r0, -4(r1)
  157. stwu r4, -4(r1)
  158. mtlr r3
  159. lwz r3, 0(r4)
  160. mr r4, r5
  161. blrl
  162. lwz r4, 0(r1)
  163. stw r3, 0(r4)
  164. lwz r0, 4(r1)
  165. addi r1, r1, 8
  166. mtlr r0
  167. blr
  168. /* void cpu_post_exec_22w (ulong *code, ulong *op1, ulong op2, ulong *op3); */
  169. .global cpu_post_exec_22w
  170. cpu_post_exec_22w:
  171. isync
  172. mflr r0
  173. stwu r0, -4(r1)
  174. stwu r4, -4(r1)
  175. stwu r6, -4(r1)
  176. mtlr r3
  177. lwz r3, 0(r4)
  178. mr r4, r5
  179. blrl
  180. lwz r4, 4(r1)
  181. stw r3, 0(r4)
  182. lwz r4, 0(r1)
  183. stw r5, 0(r4)
  184. lwz r0, 8(r1)
  185. addi r1, r1, 12
  186. mtlr r0
  187. blr
  188. /* void cpu_post_exec_21w (ulong *code, ulong *op1, ulong *op2); */
  189. .global cpu_post_exec_21w
  190. cpu_post_exec_21w:
  191. isync
  192. mflr r0
  193. stwu r0, -4(r1)
  194. stwu r4, -4(r1)
  195. stwu r5, -4(r1)
  196. mtlr r3
  197. lwz r3, 0(r4)
  198. blrl
  199. lwz r5, 4(r1)
  200. stw r3, 0(r5)
  201. lwz r5, 0(r1)
  202. stw r4, 0(r5)
  203. lwz r0, 8(r1)
  204. addi r1, r1, 12
  205. mtlr r0
  206. blr
  207. /* void cpu_post_exec_21x (ulong *code, ulong *op1, ulong *op2, ulong op3); */
  208. .global cpu_post_exec_21x
  209. cpu_post_exec_21x:
  210. isync
  211. mflr r0
  212. stwu r0, -4(r1)
  213. stwu r4, -4(r1)
  214. stwu r5, -4(r1)
  215. mtlr r3
  216. mr r3, r6
  217. blrl
  218. lwz r5, 4(r1)
  219. stw r3, 0(r5)
  220. lwz r5, 0(r1)
  221. stw r4, 0(r5)
  222. lwz r0, 8(r1)
  223. addi r1, r1, 12
  224. mtlr r0
  225. blr
  226. /* void cpu_post_exec_31 (ulong *code, ulong *ctr, ulong *lr, ulong *jump,
  227. ulong cr); */
  228. .global cpu_post_exec_31
  229. cpu_post_exec_31:
  230. isync
  231. mflr r0
  232. stwu r0, -4(r1)
  233. stwu r4, -4(r1)
  234. stwu r5, -4(r1)
  235. stwu r6, -4(r1)
  236. mtlr r3
  237. lwz r3, 0(r4)
  238. lwz r4, 0(r5)
  239. mr r6, r7
  240. mfcr r7
  241. blrl
  242. mtcr r7
  243. lwz r7, 8(r1)
  244. stw r3, 0(r7)
  245. lwz r7, 4(r1)
  246. stw r4, 0(r7)
  247. lwz r7, 0(r1)
  248. stw r5, 0(r7)
  249. lwz r0, 12(r1)
  250. addi r1, r1, 16
  251. mtlr r0
  252. blr
  253. /* int cpu_post_complex_1_asm (int a1, int a2, int a3, int a4, int n); */
  254. .global cpu_post_complex_1_asm
  255. cpu_post_complex_1_asm:
  256. li r9,0
  257. cmpw r9,r7
  258. bge cpu_post_complex_1_done
  259. mtctr r7
  260. cpu_post_complex_1_loop:
  261. mullw r0,r3,r4
  262. subf r0,r5,r0
  263. divw r0,r0,r6
  264. add r9,r9,r0
  265. bdnz cpu_post_complex_1_loop
  266. cpu_post_complex_1_done:
  267. mr r3,r9
  268. blr
  269. /* int cpu_post_complex_2_asm (int x, int n); */
  270. .global cpu_post_complex_2_asm
  271. cpu_post_complex_2_asm:
  272. mr. r0,r4
  273. mtctr r0
  274. mr r0,r3
  275. li r3,1
  276. li r4,1
  277. blelr
  278. cpu_post_complex_2_loop:
  279. mullw r3,r3,r0
  280. add r3,r3,r4
  281. bdnz cpu_post_complex_2_loop
  282. blr
  283. #endif