Messages in this thread Patch in this message | | | From | Charlie Jenkins <> | Date | Thu, 18 Jan 2024 13:53:59 -0800 | Subject | [PATCH] riscv: lib: Support csum on GCC <11 |
| |
The OutputOperands field for asm goto statements is only supported starting from GCC 11. Split the asm goto to remove the use of this feature.
Signed-off-by: Charlie Jenkins <charlie@rivosinc.com> Fixes: a04c192eabfb ("riscv: Add checksum library") --- The OutputOperands field for asm goto statements is only supported starting from GCC 11. Split the asm goto to remove the use of this feature. --- arch/riscv/lib/csum.c | 42 ++++++++++++++++++++++++++++++------------ 1 file changed, 30 insertions(+), 12 deletions(-)
diff --git a/arch/riscv/lib/csum.c b/arch/riscv/lib/csum.c index 06ce8e7250d9..23be289f52b6 100644 --- a/arch/riscv/lib/csum.c +++ b/arch/riscv/lib/csum.c @@ -177,22 +177,35 @@ do_csum_with_alignment(const unsigned char *buff, int len) : no_zbb); #ifdef CONFIG_32BIT - asm_volatile_goto(".option push \n\ + /* + * OutputOperands in asm goto is not supported until GCC 11, so + * this asm has to be split to be compatible. + */ + asm (".option push \n\ .option arch,+zbb \n\ rori %[fold_temp], %[csum], 16 \n\ andi %[offset], %[offset], 1 \n\ add %[csum], %[fold_temp], %[csum] \n\ - beq %[offset], zero, %l[end] \n\ - rev8 %[csum], %[csum] \n\ .option pop" : [csum] "+r" (csum), [fold_temp] "=&r" (fold_temp) - : [offset] "r" (offset) - : - : end); + : [offset] "r" (offset)); + + if (offset == 0) + goto end; + + asm (".option push \n\ + .option arch, +zbb \n\ + rev8 %[csum], %[csum] \n\ + .option pop" + : [csum] "+r" (csum)); return (unsigned short)csum; #else /* !CONFIG_32BIT */ - asm_volatile_goto(".option push \n\ + /* + * OutputOperands in asm goto is not supported until GCC 11, so + * this asm has to be split to be compatible. + */ + asm (".option push \n\ .option arch,+zbb \n\ rori %[fold_temp], %[csum], 32 \n\ add %[csum], %[fold_temp], %[csum] \n\ @@ -200,13 +213,18 @@ do_csum_with_alignment(const unsigned char *buff, int len) roriw %[fold_temp], %[csum], 16 \n\ addw %[csum], %[fold_temp], %[csum] \n\ andi %[offset], %[offset], 1 \n\ - beq %[offset], zero, %l[end] \n\ - rev8 %[csum], %[csum] \n\ .option pop" : [csum] "+r" (csum), [fold_temp] "=&r" (fold_temp) - : [offset] "r" (offset) - : - : end); + : [offset] "r" (offset)); + + if (offset == 0) + goto end; + + asm (".option push \n\ + .option arch, +zbb \n\ + rev8 %[csum], %[csum] \n\ + .option pop" + : [csum] "+r" (csum)); return (csum << 16) >> 48; #endif /* !CONFIG_32BIT */ --- base-commit: 080c4324fa5e81ff3780206a138223abfb57a68e change-id: 20240118-csum_remove_output_operands_asm_goto-49922c141ce7 -- - Charlie
| |