Re: riscv: configure.ac bug fix for misaligned access when __riscv_misaligned_slow
Kito Cheng <[email protected]> Fri, 22 May 2026 17:35:54 +0800
| Newsgroups | gmane.comp.lib.newlib |
|---|---|
| Message-ID | <CA+yXCZBLUPxRPr8-barguAMBLGwzPod5F2LGjvwUNJ82mp-ppA@mail.gmail.com> |
sorry for missed this one, I think drop __riscv_misaligned_slow is make sense to me, we should prevent misaligned access if it's already know to be slow. pushed with regen configure script :) Gedare Bloom <[email protected]> =E6=96=BC 2026=E5=B9=B45=E6=9C=8812=E6=97= =A5=E9=80=B1=E4=BA=8C =E4=B8=8A=E5=8D=881:33=E5=AF=AB=E9=81=93=EF=BC=9A > > On Mon, May 11, 2026 at 10:33=E2=80=AFAM Gedare Bloom <[email protected]> = wrote: > > > > On Thu, May 7, 2026 at 6:06=E2=80=AFAM Pincheng Wang > > <[email protected]> wrote: > > > > > > Hi Gedare, > > > > > > I have a question regarding this inconsistency between the > > > compiler-defined macro and actual hardware behavior. Please do not ta= ke > > > this message as a review comment. > > > > > > On 2026/5/1 13:28, Gedare Bloom wrote: > > > > memcmp is generating data alignment errors on risc-v targets where = the > > > > hw does not allow unaligned access. This behavior was observed on > > > > microchip polarfire with rtems. Here is the code generated: > > > > > > > > 000000008000bb34 <memcmp>: > > > > 8000bb34: 469d li a3,7 > > > > 8000bb36: 00c6fb63 bgeu a3,a2,8000bb4c <me= mcmp+0x18> > > > > 8000bb3a: 6118 ld a4,0(a0) > > > > 8000bb3c: 619c ld a5,0(a1) > > > > > > > > You can see that 8000bb3a will cause a fault if a0 is not aligned a= nd > > > > hw does not support it. > > > > > > > > riscv-rtems7-gcc -dM -E - < /dev/null | grep aligned > > > > #define __riscv_misaligned_slow 1 > > > > > > > > > > According to the riscv-c-api-doc[1], "__riscv_misaligned_slow" macro > > > shuold be defined when scalar misaligned *are supported* but slower t= han > > > aligned accesses. For hardwares that not allow unaligned access at al= l, > > > "__riscv_misaligned_avoid" seems to be the more appropriate macro. > > > > > > So, I am wondering whether this is actually a compiler issue rather t= han > > > a C library issue? > > > > > > > This is a good point. I was taking my inspiration from the > > implementations of memcpy and memmove, which only check for > > __riscv_misaligned_fast. > > I'm not sure what the right answer is for the optimization. > > > > Regarding my problem with alignment error, you are correct that this > > is probably better fixed by using a multilib with mstrict-align > > defined so that I get the _avoid variant. > > > This seems to work for me now. However, it does raise the question of > whether the other optimized variants should also be checking for > __riscv_misaligned_slow. > > > > > Attached fix corrects this. Generated code is now: > > > > 00000008000baf6 <memcmp>: > > > > 8000baf6: 469d li a3,7 > > > > 8000baf8: 04c6f063 bgeu a3,a2,8000bb38 <me= mcmp+0x42> > > > > 8000bafc: 00a5e7b3 or a5,a1,a0 > > > > 8000bb00: 8b9d andi a5,a5,7 > > > > 8000bb02: c395 beqz a5,8000bb26 <memcm= p+0x30> > > > > 8000bb04: 167d addi a2,a2,-1 > > > > 8000bb06: 0605 addi a2,a2,1 > > > > 8000bb08: 962a add a2,a2,a0 > > > > 8000bb0a: a019 j 8000bb10 <memcmp+0= x1a> > > > > > > > > Now we have the check at 8000bb02 that will handle alignment and > > > > falls-thru to byte-by-byte copy, or jumps to aligned long copies. > > > > > > > > Gedare > > > > > > Best regards, > > > Pincheng Wang > > > > > > [1] > > > https://github.com/riscv-non-isa/riscv-c-api-doc/blob/main/src/c-api.= adoc > > >