[Bug c++/108539] New: Wrong register usage for -m16 -masm=intel -march=i386 on asm volatile

arheik at dnainternet dot net gcc-bugzilla@gcc.gnu.org
Wed Jan 25 13:33:20 GMT 2023


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108539

            Bug ID: 108539
           Summary: Wrong register usage for -m16 -masm=intel -march=i386
                    on asm volatile
           Product: gcc
           Version: 12.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: arheik at dnainternet dot net
  Target Milestone: ---

Consider the following code (test.cpp):

void test(unsigned char& a, unsigned char& b)
{
        unsigned char _a, _b;
        asm volatile(
                "mov dx, 0\n"
                "mov bx, 0\n"
        : "=dl" (_a), "=dh" (_b)
        :
        : "bx"
        );
        a = _a;
        b = _b;
}

void main(void)
{
        unsigned char a, b;
        test(a, b);
}

Compiled with:
g++ -m16 -masm=intel -march=i386 -ffreestanding -fno-inline -mregparm=3
-fno-dwarf2-cfi-asm -fno-asynchronous-unwind-tables -fno-ident -O2 test.cpp -o
- -S

This generates for test():

_Z4testRhS_:
.LFB0:
        push    esi
.LCFI0:
        push    ebx
.LCFI1:
        mov     ecx, edx
#APP
# 4 "test.cpp" 1
        mov dx, 0
mov bx, 0

# 0 "" 2
#NO_APP
        mov     ebx, esi
        mov     BYTE PTR [eax], bl
        mov     BYTE PTR [ecx], dl
        pop     ebx
.LCFI2:
        pop     esi
.LCFI3:
        ret

In which bl usage is clearly wrong (dh is missing) and ebx/eax/esi usage looks
suspect.

Compling with -mregparm=0 produces for test():

_Z4testRhS_:
.LFB0:
        push    ebx
.LCFI0:
#APP
# 4 "test.cpp" 1
        mov dx, 0
mov bx, 0

# 0 "" 2
#NO_APP
        mov     eax, DWORD PTR 8[esp]
        mov     BYTE PTR [eax], cl
        mov     eax, DWORD PTR 12[esp]
        mov     BYTE PTR [eax], dl
        pop     ebx
.LCFI1:
        ret

Which should use dh instead of cl.


More information about the Gcc-bugs mailing list