OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [linux-2.4/] [drivers/] [scsi/] [oktagon_io.S] - Rev 1765

Compare with Previous | Blame | View Log

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

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.