1#include "or1k-asm.h"
2/*
3 * Assembly functions for software multiplication and devision.
4 */
5
6#define ENTRY(symbol)	\
7	.align 4	;\
8	.global symbol	;\
9	.type	symbol, @function ;\
10symbol:
11
12#ifdef L__mulsi3
13ENTRY(__mulsi3)
14	l.addi r11,r0,0x0
15	l.sfne r3,r11
16OR1K_DELAYED(
17	OR1K_INST(l.ori r5,r3,0x0),
18	OR1K_INST(l.bnf 3f)
19)
20	l.addi r6,r0,0x0
211:
22	l.andi r3,r5,0x1
23	l.sfeq r3,r6
24OR1K_DELAYED(
25	OR1K_INST(l.srli r5,r5,0x1),
26	OR1K_INST(l.bf 2f)
27)
28	l.add r11,r11,r4
292:
30	l.sfne r5,r6
31OR1K_DELAYED(
32	OR1K_INST(l.slli r4,r4,0x1),
33	OR1K_INST(l.bf 1b)
34)
353:
36OR1K_DELAYED_NOP(
37	OR1K_INST(l.jr r9)
38)
39.size __mulsi3,.-__mulsi3
40#endif
41
42#ifdef L__udivsi3
43.global __udivsi3_internal
44.hidden __udivsi3_internal
45__udivsi3_internal:
46ENTRY(__udivsi3)
47	l.addi          r1,r1,-4
48        l.sw            0(r1),r9
49        l.addi          r11,r0,0
50        l.addi          r8,r4,0
51        l.addi          r5,r3,0
52        l.sfne          r8,r11
53OR1K_DELAYED(
54	OR1K_INST(l.addi r7,r0,0),
55	OR1K_INST(l.bnf 4f)
56)
57	/* The following work equally on delay and no-delay implementations */
58        l.sfgtu         r8,r5
59        l.bf            5f
60        l.sfeq          r8,r5
61        l.bf            6f
62        l.sfltu         r11,r8
63
64OR1K_DELAYED(
65	OR1K_INST(l.addi r13,r0,32),
66        OR1K_INST(l.bnf 2f)
67)
68        l.movhi         r9,hi(0x80000000)
69        l.addi          r6,r0,-1
701:
71        l.and           r3,r5,r9
72        l.slli          r4,r7,1
73        l.addi          r15,r5,0
74        l.srli          r3,r3,31
75        l.add           r13,r13,r6
76        l.or            r7,r4,r3
77        l.sfltu         r7,r8
78OR1K_DELAYED(
79        OR1K_INST(l.slli r5,r5,1),
80        OR1K_INST(l.bf 1b)
81)
822:
83        l.srli          r7,r7,1
84        l.addi          r13,r13,1
85        l.addi          r9,r0,0
86        l.sfltu         r9,r13
87OR1K_DELAYED(
88        OR1K_INST(l.addi r5,r15,0),
89        OR1K_INST(l.bnf 4f)
90)
91        l.movhi         r15,hi(0x80000000)
92        l.addi          r17,r0,0
933:
94        l.and           r3,r5,r15
95        l.slli          r4,r7,1
96        l.srli          r3,r3,31
97        l.or            r7,r4,r3
98        l.sub           r6,r7,r8
99        l.and           r3,r6,r15
100        l.srli          r3,r3,31
101        l.addi          r4,r0,0
102        l.sfne          r3,r4
103OR1K_DELAYED(
104        OR1K_INST(l.slli r3,r11,1),
105        OR1K_INST(l.bf 1f)
106)
107        l.addi          r4,r0,1
1081:
109        l.slli          r5,r5,1
110        l.sfne          r4,r17
111OR1K_DELAYED(
112        OR1K_INST(l.or r11,r3,r4),
113        OR1K_INST(l.bnf 2f)
114)
115        l.addi          r7,r6,0
1162:
117        l.addi          r9,r9,1
118        l.sfltu         r9,r13
119OR1K_DELAYED_NOP(
120        OR1K_INST(l.bf 3b)
121)
122OR1K_DELAYED_NOP(
123	OR1K_INST(l.j 4f)
124)
1256:
126OR1K_DELAYED(
127	OR1K_INST(l.addi r11,r0,1),
128	OR1K_INST(l.j 4f)
129)
1305:
131	l.addi		r7,r5,0
1324:
133        l.lwz           r9,0(r1)
134OR1K_DELAYED(
135        OR1K_INST(l.addi r1,r1,4),
136        OR1K_INST(l.jr r9)
137)
138.size __udivsi3,.-__udivsi3
139#endif
140
141
142#ifdef L__divsi3
143ENTRY(__divsi3)
144	l.addi          r1,r1,-8
145        l.sw            0(r1),r9
146        l.sw            4(r1),r14
147        l.addi          r5,r3,0
148        l.addi          r14,r0,0
149        l.sflts         r5,r0
150OR1K_DELAYED(
151        OR1K_INST(l.addi r3,r0,0),
152        OR1K_INST(l.bnf 1f)
153)
154        l.addi          r14,r0,1
155        l.sub           r5,r0,r5
1561:
157        l.sflts         r4,r0
158OR1K_DELAYED_NOP(
159        OR1K_INST(l.bnf 1f)
160)
161        l.addi          r14,r14,1
162        l.sub           r4,r0,r4
1631:
164OR1K_DELAYED(
165        OR1K_INST(l.addi r3,r5,0),
166        OR1K_INST(l.jal __udivsi3_internal)
167)
168        l.sfeqi         r14,1
169OR1K_DELAYED_NOP(
170        OR1K_INST(l.bnf 1f)
171)
172        l.sub           r11,r0,r11
1731:
174        l.lwz           r9,0(r1)
175        l.lwz           r14,4(r1)
176OR1K_DELAYED(
177        OR1K_INST(l.addi r1,r1,8),
178        OR1K_INST(l.jr r9)
179)
180.size __divsi3,.-__divsi3
181#endif
182
183
184#ifdef L__umodsi3
185ENTRY(__umodsi3)
186	l.addi          r1,r1,-4
187	l.sw            0(r1),r9
188OR1K_DELAYED_NOP(
189	OR1K_INST(l.jal __udivsi3_internal)
190)
191	l.addi		r11,r7,0
192	l.lwz           r9,0(r1)
193OR1K_DELAYED(
194	OR1K_INST(l.addi r1,r1,4),
195	OR1K_INST(l.jr r9)
196)
197.size __umodsi3,.-__umodsi3
198#endif
199
200
201#ifdef L__modsi3
202ENTRY(__modsi3)
203        l.addi          r1,r1,-8
204        l.sw            0(r1),r9
205        l.sw            4(r1),r14
206        l.addi          r14,r0,0
207        l.sflts         r3,r0
208OR1K_DELAYED_NOP(
209        OR1K_INST(l.bnf 1f)
210)
211        l.addi          r14,r0,1
212        l.sub           r3,r0,r3
2131:
214        l.sflts         r4,r0
215OR1K_DELAYED_NOP(
216        OR1K_INST(l.bnf 1f)
217)
218        l.sub           r4,r0,r4
2191:
220OR1K_DELAYED_NOP(
221        OR1K_INST(l.jal __udivsi3_internal)
222)
223        l.sfeqi         r14,1
224OR1K_DELAYED(
225        OR1K_INST(l.addi r11,r7,0),
226        OR1K_INST(l.bnf 1f)
227)
228        l.sub           r11,r0,r11
2291:
230        l.lwz           r9,0(r1)
231        l.lwz           r14,4(r1)
232OR1K_DELAYED(
233        OR1K_INST(l.addi r1,r1,8),
234        OR1K_INST(l.jr r9)
235)
236.size __modsi3,.-__modsi3
237#endif
238