1*4494ce4fSKuninori Morimoto/* SPDX-License-Identifier: GPL-2.0+ WITH GCC-exception-2.0 2*4494ce4fSKuninori Morimoto * 3*4494ce4fSKuninori Morimoto * Copyright (C) 2006 Free Software Foundation, Inc. 4*4494ce4fSKuninori Morimoto */ 53b041227STakashi YOSHII 63b041227STakashi YOSHII/* Moderately Space-optimized libgcc routines for the Renesas SH / 73b041227STakashi YOSHII STMicroelectronics ST40 CPUs. 83b041227STakashi YOSHII Contributed by J"orn Rennecke joern.rennecke@st.com. */ 93b041227STakashi YOSHII 103b041227STakashi YOSHII/* Size: 186 bytes jointly for udivsi3_i4i and sdivsi3_i4i 113b041227STakashi YOSHII sh4-200 run times: 123b041227STakashi YOSHII udiv small divisor: 55 cycles 133b041227STakashi YOSHII udiv large divisor: 52 cycles 143b041227STakashi YOSHII sdiv small divisor, positive result: 59 cycles 153b041227STakashi YOSHII sdiv large divisor, positive result: 56 cycles 163b041227STakashi YOSHII sdiv small divisor, negative result: 65 cycles (*) 173b041227STakashi YOSHII sdiv large divisor, negative result: 62 cycles (*) 183b041227STakashi YOSHII (*): r2 is restored in the rts delay slot and has a lingering latency 193b041227STakashi YOSHII of two more cycles. */ 203b041227STakashi YOSHII .balign 4 213b041227STakashi YOSHII .global __udivsi3_i4i 223b041227STakashi YOSHII .global __udivsi3_i4 233b041227STakashi YOSHII .set __udivsi3_i4, __udivsi3_i4i 243b041227STakashi YOSHII .type __udivsi3_i4i, @function 253b041227STakashi YOSHII .type __sdivsi3_i4i, @function 263b041227STakashi YOSHII__udivsi3_i4i: 273b041227STakashi YOSHII sts pr,r1 283b041227STakashi YOSHII mov.l r4,@-r15 293b041227STakashi YOSHII extu.w r5,r0 303b041227STakashi YOSHII cmp/eq r5,r0 313b041227STakashi YOSHII swap.w r4,r0 323b041227STakashi YOSHII shlr16 r4 333b041227STakashi YOSHII bf/s large_divisor 343b041227STakashi YOSHII div0u 353b041227STakashi YOSHII mov.l r5,@-r15 363b041227STakashi YOSHII shll16 r5 373b041227STakashi YOSHIIsdiv_small_divisor: 383b041227STakashi YOSHII div1 r5,r4 393b041227STakashi YOSHII bsr div6 403b041227STakashi YOSHII div1 r5,r4 413b041227STakashi YOSHII div1 r5,r4 423b041227STakashi YOSHII bsr div6 433b041227STakashi YOSHII div1 r5,r4 443b041227STakashi YOSHII xtrct r4,r0 453b041227STakashi YOSHII xtrct r0,r4 463b041227STakashi YOSHII bsr div7 473b041227STakashi YOSHII swap.w r4,r4 483b041227STakashi YOSHII div1 r5,r4 493b041227STakashi YOSHII bsr div7 503b041227STakashi YOSHII div1 r5,r4 513b041227STakashi YOSHII xtrct r4,r0 523b041227STakashi YOSHII mov.l @r15+,r5 533b041227STakashi YOSHII swap.w r0,r0 543b041227STakashi YOSHII mov.l @r15+,r4 553b041227STakashi YOSHII jmp @r1 563b041227STakashi YOSHII rotcl r0 573b041227STakashi YOSHIIdiv7: 583b041227STakashi YOSHII div1 r5,r4 593b041227STakashi YOSHIIdiv6: 603b041227STakashi YOSHII div1 r5,r4; div1 r5,r4; div1 r5,r4 613b041227STakashi YOSHII div1 r5,r4; div1 r5,r4; rts; div1 r5,r4 623b041227STakashi YOSHII 633b041227STakashi YOSHIIdivx3: 643b041227STakashi YOSHII rotcl r0 653b041227STakashi YOSHII div1 r5,r4 663b041227STakashi YOSHII rotcl r0 673b041227STakashi YOSHII div1 r5,r4 683b041227STakashi YOSHII rotcl r0 693b041227STakashi YOSHII rts 703b041227STakashi YOSHII div1 r5,r4 713b041227STakashi YOSHII 723b041227STakashi YOSHIIlarge_divisor: 733b041227STakashi YOSHII mov.l r5,@-r15 743b041227STakashi YOSHIIsdiv_large_divisor: 753b041227STakashi YOSHII xor r4,r0 763b041227STakashi YOSHII .rept 4 773b041227STakashi YOSHII rotcl r0 783b041227STakashi YOSHII bsr divx3 793b041227STakashi YOSHII div1 r5,r4 803b041227STakashi YOSHII .endr 813b041227STakashi YOSHII mov.l @r15+,r5 823b041227STakashi YOSHII mov.l @r15+,r4 833b041227STakashi YOSHII jmp @r1 843b041227STakashi YOSHII rotcl r0 853b041227STakashi YOSHII 863b041227STakashi YOSHII .global __sdivsi3_i4i 873b041227STakashi YOSHII .global __sdivsi3_i4 883b041227STakashi YOSHII .global __sdivsi3 893b041227STakashi YOSHII .set __sdivsi3_i4, __sdivsi3_i4i 903b041227STakashi YOSHII .set __sdivsi3, __sdivsi3_i4i 913b041227STakashi YOSHII__sdivsi3_i4i: 923b041227STakashi YOSHII mov.l r4,@-r15 933b041227STakashi YOSHII cmp/pz r5 943b041227STakashi YOSHII mov.l r5,@-r15 953b041227STakashi YOSHII bt/s pos_divisor 963b041227STakashi YOSHII cmp/pz r4 973b041227STakashi YOSHII neg r5,r5 983b041227STakashi YOSHII extu.w r5,r0 993b041227STakashi YOSHII bt/s neg_result 1003b041227STakashi YOSHII cmp/eq r5,r0 1013b041227STakashi YOSHII neg r4,r4 1023b041227STakashi YOSHIIpos_result: 1033b041227STakashi YOSHII swap.w r4,r0 1043b041227STakashi YOSHII bra sdiv_check_divisor 1053b041227STakashi YOSHII sts pr,r1 1063b041227STakashi YOSHIIpos_divisor: 1073b041227STakashi YOSHII extu.w r5,r0 1083b041227STakashi YOSHII bt/s pos_result 1093b041227STakashi YOSHII cmp/eq r5,r0 1103b041227STakashi YOSHII neg r4,r4 1113b041227STakashi YOSHIIneg_result: 1123b041227STakashi YOSHII mova negate_result,r0 1133b041227STakashi YOSHII ; 1143b041227STakashi YOSHII mov r0,r1 1153b041227STakashi YOSHII swap.w r4,r0 1163b041227STakashi YOSHII lds r2,macl 1173b041227STakashi YOSHII sts pr,r2 1183b041227STakashi YOSHIIsdiv_check_divisor: 1193b041227STakashi YOSHII shlr16 r4 1203b041227STakashi YOSHII bf/s sdiv_large_divisor 1213b041227STakashi YOSHII div0u 1223b041227STakashi YOSHII bra sdiv_small_divisor 1233b041227STakashi YOSHII shll16 r5 1243b041227STakashi YOSHII .balign 4 1253b041227STakashi YOSHIInegate_result: 1263b041227STakashi YOSHII neg r0,r0 1273b041227STakashi YOSHII jmp @r2 1283b041227STakashi YOSHII sts macl,r2 129