Hi, Thanks for your helpful comments!
Segher Boessenkool <seg...@kernel.crashing.org> writes: > Hi! > > On Mon, May 13, 2024 at 10:57:12AM +0800, Jiufu Guo wrote: >> For PR96866, when gcc print asm code for modifier "%a" which requires >> an address operand, > > It requires a *memory* operand, and it outputs its address. This is a > generic modifier btw (not rs6000). Oh, yeap. it outputs the operands's address. I would update words like: which requires an addressable operand. > >> while the operand is with the constraint "X" which >> allow non-address form. An error message would be reported to indicate >> the invalid asm operands. > > "non-address form"? Every mem has an address. > > But 'X' is not memory. What is it at all? Why do we use that when you > *have to* have mem here? "X" allows any thing. This is the reason why the code is *invalid*. Other constraints("r/m") should be better than "X" for "%a". > > The code you add that tests for address_operand looks wrong. I would > expect it to test the operand is memory, instead :-) I understand your concern. While there is a tricky work: before invoking print_operand_address/output_address, the orignal operand (which would be 'mem') is stripped to it's address. So, 'address_operand' is tested for print_operand_address is targets. While I also wonder if "address_operand" is really needed. Because under the condition: ``` else if (SYMBOL_REF_P (x) || GET_CODE (x) == CONST || GET_CODE (x) == LABEL_REF) { ``` 'x' is already known, it only could be: SYMBOL_REF/LABEL_REF or CONST. I would update the patch for this. Thanks for your comments. BR, Jeff(Jiufu) Guo > > > Segher