[PATCH v4 4/5] RISC-V: add infrastructure to allow different str* implementations
Andrew Jones
ajones at ventanamicro.com
Wed Jan 11 04:30:27 PST 2023
On Tue, Jan 10, 2023 at 01:13:20PM +0100, Andrew Jones wrote:
> On Mon, Jan 09, 2023 at 07:17:54PM +0100, Heiko Stuebner wrote:
...
> > +
> > +/* int strcmp(const char *cs, const char *ct) */
> > +SYM_FUNC_START(strcmp)
> > + /*
> > + * Returns
> > + * a0 - comparison result, value like strcmp
> > + *
> > + * Parameters
> > + * a0 - string1
> > + * a1 - string2
> > + *
> > + * Clobbers
> > + * t0, t1, t2
> > + */
> > + mv t2, a1
>
> The above instruction and the 'mv a1, t2' below appear to be attempting
> to preserve a1, but that shouldn't be necessary.
>
> > +1:
> > + lbu t1, 0(a0)
> > + lbu t0, 0(a1)
>
> I'd rather have t0 be 0(a0) and t1 be 0(a1)
>
> > + addi a0, a0, 1
> > + addi a1, a1, 1
> > + beq t1, t0, 3f
> > + li a0, 1
> > + bgeu t1, t0, 2f
> > + li a0, -1
> > +2:
> > + mv a1, t2
> > + ret
> > +3:
> > + bnez t1, 1b
> > + li a0, 0
> > + j 2b
>
> For fun I removed one conditional and one unconditional branch (untested)
>
> 1:
> lbu t0, 0(a0)
> lbu t1, 0(a1)
> addi a0, a0, 1
> addi a1, a1, 1
> bne t0, t1, 2f
> bnez t0, 1b
> li a0, 0
> ret
> 2:
> slt a1, t1, t0
> slli a1, a1, 1
> li a0, -1
> add a0, a0, a1
If we just need < 0 and > 0 then the above four instructions can become
sub a0, t0, t1
> ret
>
Similar comment for strncmp.
Thanks,
drew
More information about the linux-riscv
mailing list