On 10/27/18 5:37 AM, Stafford Horne wrote:
> +/* Here _init and _fini are empty because .init_array/.fini_array are used
> +   exclusively.  However, the functions are still needed as required when
> +   linking.  */
> +     .align 4
> +     .global _init
> +     .type   _init,@function
> +_init:
> +     .global _fini
> +     .type   _fini,@function
> +_fini:
> +     l.jr    r9
> +      l.nop

Where are they referenced from?  Perhaps just a binutils bug, in that the
linker script needs adjustment?

> +     /* Given R = X * Y ... */
> +1:   l.sfeq          r4, r0                  /* while (y != 0) */
> +     l.bf            2f
> +      l.andi         r5, r4, 1               /* if (y & 1) ... */
> +     l.add           r12, r11, r3
> +     l.sfne          r5, r0
> +#if defined(__or1k_cmov__)
> +     l.cmov          r11, r12, r11           /* ... r += x. */
> +     l.srli          r4, r4, 1               /* y >>= 1 */
> +#else
> +     l.bnf           3f
> +      l.srli         r4, r4, 1               /* y >>= 1 */
> +     l.ori           r11, r12, 0

This move could be the add to save 1 cycle in the !cmov case.

> +     /* Shift Y back to the right again, subtracting from X.  */
> +2:   l.add           r7, r11, r6     /* tmp1 = quot + mask */
> +3:   l.srli          r6, r6, 1       /* mask >>= 1 */
> +     l.sub           r8, r12, r4     /* tmp2 = x - y */
> +     l.sfleu         r4, r12         /* y <= x */
> +     l.srli          r4, r4, 1       /* y >>= 1 */
> +#if defined(__or1k_cmov__)
> +     l.cmov          r11, r7, r11    /* if (y <= x) quot = tmp1 */
> +     l.cmov          r12, r8, r12    /* if (y <= x) x = tmp2 */
> +#else
> +     l.bnf           4f
> +      l.nop
> +     l.ori           r11, r7, 0
> +     l.ori           r12, r8, 0

Simiarly.

Although both mul nor div are correct as-is, and need not be fixed immediately.
 I'm only concerned about _init and _fini.


r~

Reply via email to