oktagon_io.S
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:3k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /* -*- mode: asm -*-
  2.  * Due to problems while transferring data I've put these routines as assembly
  3.  * code.
  4.  * Since I'm no PPC assembler guru, the code is just the assembler version of
  5. int oktag_to_io(long *paddr,long *addr,long len)
  6. {
  7.   long *addr2 = addr;
  8.   for(len=(len+sizeof(long)-1)/sizeof(long);len--;)
  9.     *paddr = *addr2++;
  10.   return addr2 - addr;
  11. }
  12. int oktag_from_io(long *addr,long *paddr,long len)
  13. {
  14.   long *addr2 = addr;
  15.   for(len=(len+sizeof(long)-1)/sizeof(long);len--;)
  16.     *addr2++ = *paddr;
  17.   return addr2 - addr;
  18. }
  19.  * assembled using gcc -O2 -S, with two exception catch points where data
  20.  * is moved to/from the IO register.
  21.  */
  22. #include <linux/config.h>
  23. #ifdef CONFIG_APUS
  24. .file "oktagon_io.c"
  25. gcc2_compiled.:
  26. /*
  27. .section ".text"
  28. */
  29. .align 2
  30. .globl oktag_to_io
  31. .type  oktag_to_io,@function
  32. oktag_to_io:
  33. addi 5,5,3
  34. srwi 5,5,2
  35. cmpwi 1,5,0
  36. mr 9,3
  37. mr 3,4
  38. addi 5,5,-1
  39. bc 12,6,.L3
  40. .L5:
  41. cmpwi 1,5,0
  42. lwz 0,0(3)
  43. addi 3,3,4
  44. addi 5,5,-1
  45. exp1: stw 0,0(9)
  46. bc 4,6,.L5
  47. .L3:
  48. ret1: subf 3,4,3
  49. srawi 3,3,2
  50. blr
  51. .Lfe1:
  52. .size  oktag_to_io,.Lfe1-oktag_to_io
  53. .align 2
  54. .globl oktag_from_io
  55. .type  oktag_from_io,@function
  56. oktag_from_io:
  57. addi 5,5,3
  58. srwi 5,5,2
  59. cmpwi 1,5,0
  60. mr 9,3
  61. addi 5,5,-1
  62. bc 12,6,.L9
  63. .L11:
  64. cmpwi 1,5,0
  65. exp2: lwz 0,0(4)
  66. addi 5,5,-1
  67. stw 0,0(3)
  68. addi 3,3,4
  69. bc 4,6,.L11
  70. .L9:
  71. ret2: subf 3,9,3
  72. srawi 3,3,2
  73. blr
  74. .Lfe2:
  75. .size  oktag_from_io,.Lfe2-oktag_from_io
  76. .ident "GCC: (GNU) egcs-2.90.29 980515 (egcs-1.0.3 release)"
  77. /*
  78.  * Exception table.
  79.  * Second longword shows where to jump when an exception at the addr the first
  80.  * longword is pointing to is caught.
  81.  */
  82. .section __ex_table,"a"
  83. .align 2
  84. oktagon_except:
  85. .long exp1,ret1
  86. .long exp2,ret2
  87. #else
  88. /*
  89. The code which follows is for 680x0 based assembler and is meant for
  90. Linux/m68k. It was created by cross compiling the code using the
  91. instructions given above. I then added the four labels used in the
  92. exception handler table at the bottom of this file.
  93. - Kevin <kcozens@interlog.com>
  94. */
  95. #ifdef CONFIG_AMIGA
  96. .file "oktagon_io.c"
  97. .version "01.01"
  98. gcc2_compiled.:
  99. .text
  100. .align  2
  101. .globl oktag_to_io
  102. .type  oktag_to_io,@function
  103. oktag_to_io:
  104. link.w %a6,#0
  105. move.l %d2,-(%sp)
  106. move.l 8(%a6),%a1
  107. move.l 12(%a6),%d1
  108. move.l %d1,%a0
  109. move.l 16(%a6),%d0
  110. addq.l #3,%d0
  111. lsr.l #2,%d0
  112. subq.l #1,%d0
  113. moveq.l #-1,%d2
  114. cmp.l %d0,%d2
  115. jbeq .L3
  116. .L5:
  117. exp1:
  118. move.l (%a0)+,(%a1)
  119. dbra %d0,.L5
  120. clr.w %d0
  121. subq.l #1,%d0
  122. jbcc .L5
  123. .L3:
  124. ret1:
  125. move.l %a0,%d0
  126. sub.l %d1,%d0
  127. asr.l #2,%d0
  128. move.l -4(%a6),%d2
  129. unlk %a6
  130. rts
  131. .Lfe1:
  132. .size  oktag_to_io,.Lfe1-oktag_to_io
  133. .align  2
  134. .globl oktag_from_io
  135. .type  oktag_from_io,@function
  136. oktag_from_io:
  137. link.w %a6,#0
  138. move.l %d2,-(%sp)
  139. move.l 8(%a6),%d1
  140. move.l 12(%a6),%a1
  141. move.l %d1,%a0
  142. move.l 16(%a6),%d0
  143. addq.l #3,%d0
  144. lsr.l #2,%d0
  145. subq.l #1,%d0
  146. moveq.l #-1,%d2
  147. cmp.l %d0,%d2
  148. jbeq .L9
  149. .L11:
  150. exp2:
  151. move.l (%a1),(%a0)+
  152. dbra %d0,.L11
  153. clr.w %d0
  154. subq.l #1,%d0
  155. jbcc .L11
  156. .L9:
  157. ret2:
  158. move.l %a0,%d0
  159. sub.l %d1,%d0
  160. asr.l #2,%d0
  161. move.l -4(%a6),%d2
  162. unlk %a6
  163. rts
  164. .Lfe2:
  165. .size  oktag_from_io,.Lfe2-oktag_from_io
  166. .ident "GCC: (GNU) 2.7.2.1"
  167. /*
  168.  * Exception table.
  169.  * Second longword shows where to jump when an exception at the addr the first
  170.  * longword is pointing to is caught.
  171.  */
  172. .section __ex_table,"a"
  173. .align 2
  174. oktagon_except:
  175. .long exp1,ret1
  176. .long exp2,ret2
  177. #endif
  178. #endif