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