/* -*- 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 #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 */ #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