commit b544ec681bdc9c48587d2e014f9559674097738a Author: Jeff Law Date: Mon Dec 4 10:06:49 2023 -0700 [committed] Fix HImode load mnemonic on microblaze port The tester recently started failing va-arg-22.c on microblaze-linux: gcc.c-torture/execute/va-arg-22.c -O0 (test for excess errors) It was failing with an undefined reference to "r7" at link time. This was ultimately tracked down to a HImode load using (reg+reg) addressing mode, but which used the lhui instruction instead of lhu. The "i" means it's supposed to be (reg+disp) so the assembler tried to interpret "r7" as an immediate/symbol. The port uses %i as an output modifier to select between sh/shi and various other mnemonics for loads/stores. The movhi pattern simply failed to use it for the two cases where it's loading from memory (interestingly enough it was used for stores). Clearly we aren't using reg+reg much for HImode loads as this didn't fix anything else in the testsuite. gcc/ * config/microblaze/microblaze.md (movhi): Use %i for half-word loads to properly select between lhu/lhui. diff --git a/gcc/config/microblaze/microblaze.md b/gcc/config/microblaze/microblaze.md index 671667b537c..a8ee886d36b 100644 --- a/gcc/config/microblaze/microblaze.md +++ b/gcc/config/microblaze/microblaze.md @@ -1089,8 +1089,8 @@ (define_insn "*movhi_internal2" "@ addik\t%0,r0,%1\t# %X1 addk\t%0,%1,r0 - lhui\t%0,%1 - lhui\t%0,%1 + lhu%i1\t%0,%1 + lhu%i1\t%0,%1 sh%i0\t%z1,%0 sh%i0\t%z1,%0" [(set_attr "type" "arith,move,load,no_delay_load,store,no_delay_store")