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