oktagon_io.S
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:3k
- /* -*- mode: asm -*-
- * Due to problems while transferring data I've put these routines as assembly
- * code.
- * Since I'm no PPC assembler guru, the code is just the assembler version of
- int oktag_to_io(long *paddr,long *addr,long len)
- {
- long *addr2 = addr;
- for(len=(len+sizeof(long)-1)/sizeof(long);len--;)
- *paddr = *addr2++;
- return addr2 - addr;
- }
- int oktag_from_io(long *addr,long *paddr,long len)
- {
- long *addr2 = addr;
- for(len=(len+sizeof(long)-1)/sizeof(long);len--;)
- *addr2++ = *paddr;
- return addr2 - addr;
- }
- * assembled using gcc -O2 -S, with two exception catch points where data
- * is moved to/from the IO register.
- */
- #include <linux/config.h>
- #ifdef CONFIG_APUS
- .file "oktagon_io.c"
- gcc2_compiled.:
- /*
- .section ".text"
- */
- .align 2
- .globl oktag_to_io
- .type oktag_to_io,@function
- oktag_to_io:
- addi 5,5,3
- srwi 5,5,2
- cmpwi 1,5,0
- mr 9,3
- mr 3,4
- addi 5,5,-1
- bc 12,6,.L3
- .L5:
- cmpwi 1,5,0
- lwz 0,0(3)
- addi 3,3,4
- addi 5,5,-1
- exp1: stw 0,0(9)
- bc 4,6,.L5
- .L3:
- ret1: subf 3,4,3
- srawi 3,3,2
- blr
- .Lfe1:
- .size oktag_to_io,.Lfe1-oktag_to_io
- .align 2
- .globl oktag_from_io
- .type oktag_from_io,@function
- oktag_from_io:
- addi 5,5,3
- srwi 5,5,2
- cmpwi 1,5,0
- mr 9,3
- addi 5,5,-1
- bc 12,6,.L9
- .L11:
- cmpwi 1,5,0
- exp2: lwz 0,0(4)
- addi 5,5,-1
- stw 0,0(3)
- addi 3,3,4
- bc 4,6,.L11
- .L9:
- ret2: subf 3,9,3
- srawi 3,3,2
- blr
- .Lfe2:
- .size oktag_from_io,.Lfe2-oktag_from_io
- .ident "GCC: (GNU) egcs-2.90.29 980515 (egcs-1.0.3 release)"
- /*
- * Exception table.
- * Second longword shows where to jump when an exception at the addr the first
- * longword is pointing to is caught.
- */
- .section __ex_table,"a"
- .align 2
- oktagon_except:
- .long exp1,ret1
- .long exp2,ret2
- #else
- /*
- The code which follows is for 680x0 based assembler and is meant for
- Linux/m68k. It was created by cross compiling the code using the
- instructions given above. I then added the four labels used in the
- exception handler table at the bottom of this file.
- - Kevin <kcozens@interlog.com>
- */
- #ifdef CONFIG_AMIGA
- .file "oktagon_io.c"
- .version "01.01"
- gcc2_compiled.:
- .text
- .align 2
- .globl oktag_to_io
- .type oktag_to_io,@function
- oktag_to_io:
- link.w %a6,#0
- move.l %d2,-(%sp)
- move.l 8(%a6),%a1
- move.l 12(%a6),%d1
- move.l %d1,%a0
- move.l 16(%a6),%d0
- addq.l #3,%d0
- lsr.l #2,%d0
- subq.l #1,%d0
- moveq.l #-1,%d2
- cmp.l %d0,%d2
- jbeq .L3
- .L5:
- exp1:
- move.l (%a0)+,(%a1)
- dbra %d0,.L5
- clr.w %d0
- subq.l #1,%d0
- jbcc .L5
- .L3:
- ret1:
- move.l %a0,%d0
- sub.l %d1,%d0
- asr.l #2,%d0
- move.l -4(%a6),%d2
- unlk %a6
- rts
- .Lfe1:
- .size oktag_to_io,.Lfe1-oktag_to_io
- .align 2
- .globl oktag_from_io
- .type oktag_from_io,@function
- oktag_from_io:
- link.w %a6,#0
- move.l %d2,-(%sp)
- move.l 8(%a6),%d1
- move.l 12(%a6),%a1
- move.l %d1,%a0
- move.l 16(%a6),%d0
- addq.l #3,%d0
- lsr.l #2,%d0
- subq.l #1,%d0
- moveq.l #-1,%d2
- cmp.l %d0,%d2
- jbeq .L9
- .L11:
- exp2:
- move.l (%a1),(%a0)+
- dbra %d0,.L11
- clr.w %d0
- subq.l #1,%d0
- jbcc .L11
- .L9:
- ret2:
- move.l %a0,%d0
- sub.l %d1,%d0
- asr.l #2,%d0
- move.l -4(%a6),%d2
- unlk %a6
- rts
- .Lfe2:
- .size oktag_from_io,.Lfe2-oktag_from_io
- .ident "GCC: (GNU) 2.7.2.1"
- /*
- * Exception table.
- * Second longword shows where to jump when an exception at the addr the first
- * longword is pointing to is caught.
- */
- .section __ex_table,"a"
- .align 2
- oktagon_except:
- .long exp1,ret1
- .long exp2,ret2
- #endif
- #endif