/* * Returns * a0 - comparison result, value like strcmp * * Parameters * a0 - string1 * a1 - string2 * * Clobbers * t0, t1
*/
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: /* * strcmp only needs to return (< 0, 0, > 0) values * not necessarily -1, 0, +1
*/ sub a0, t0, t1
ret
/* * Variant of strcmp using the ZBB extension if available. * The code was published as part of the bitmanip manual * in Appendix A.
*/
#if defined(CONFIG_RISCV_ISA_ZBB) && defined(CONFIG_TOOLCHAIN_HAS_ZBB)
strcmp_zbb:
/* * Words don't match, and no null byte in the first * word. Get bytes in big-endian order and compare.
*/
#ifndef CONFIG_CPU_BIG_ENDIAN
rev8 t0, t0
rev8 t1, t1
#endif
/* Synthesize (t0 >= t1) ? 1 : -1 in a branchless sequence. */
sltu a0, t0, t1
neg a0, a0
ori a0, a0, 1
ret
2: /* * Found a null byte. * If words don't match, fall back to simple loop.
*/
bne t0, t1, 3f
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.