https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97708
Bug ID: 97708 Summary: Inline asm does not use the local register asm specified with register ... asm() as input Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: inline-asm Assignee: unassigned at gcc dot gnu.org Reporter: bp at alien8 dot de Target Milestone: --- Building the below on x86-64 with gcc9, gcc10 and Segher built with gcc11 20201015: --- int main(void) { register float foo asm ("xmm0") = 0.99f; asm volatile("movl %0, %%r8d\n\t" "vmcall\n\t" :: "g" (foo)); return 0; } --- results in gcc not using the xmm0 register directly as the input register to the asm statement but does something funky: 0000000000001125 <main>: 1125: 55 push %rbp 1126: 48 89 e5 mov %rsp,%rbp 1129: f3 0f 10 05 d3 0e 00 movss 0xed3(%rip),%xmm0 # 2004 <_IO_stdin_used+0x4> 1130: 00 1131: 66 0f 7e c0 movd %xmm0,%eax 1135: 41 89 c0 mov %eax,%r8d 1138: 0f 01 c1 vmcall by loading through the %eax GPR and producing wrong code without even a warning. I'm not saying this example is supposed to make sense but this should fail instead by trying to compile: $ cat xmm1.s movl %xmm0,%eax $ x86_64-linux-as xmm1.s -o xmm1.o xmm1.s: Assembler messages: xmm1.s:1: Error: unsupported instruction `mov' and fail the build because plain MOV cannot use an XMM reg as a source. Thx.