[Bug target/42324] [4.3/4.4/4.5 Regression] Gcc doesn't follow x86-64 psABI on _Bool

hjl dot tools at gmail dot com gcc-bugzilla@gcc.gnu.org
Tue Dec 8 18:17:00 GMT 2009



------- Comment #7 from hjl dot tools at gmail dot com  2009-12-08 18:17 -------
Another testcase:

[hjl@gnu-26 pr42324]$ cat b3.c 
void foo (unsigned long, unsigned int, unsigned long,
          unsigned int, unsigned int, unsigned int, unsigned int,
          unsigned long, unsigned int);

void bar (_Bool v1, _Bool v2, unsigned char v3, unsigned char v4,
          unsigned char v5, unsigned char v6,
          unsigned char v7, _Bool v8)
{
  foo (v1, v2, v3, v4, v5, v6, v7, v8, v8);
}
[hjl@gnu-26 pr42324]$ /usr/gcc-4.4/bin/gcc -O2 b3.c -S  
[hjl@gnu-26 pr42324]$ cat b3.s
        .file   "b3.c"
        .text
        .p2align 4,,15
.globl bar
        .type   bar, @function
bar:
.LFB2:
        subq    $24, %rsp
.LCFI0:
        movzbl  %cl, %ecx
        movzbl  %dl, %edx
        movzbl  40(%rsp), %r10d
        movzbl  %sil, %esi
        movzbl  %dil, %edi
        movzbl  %r9b, %r9d
        movzbl  %r8b, %r8d
        movzbl  %r10b, %eax
        movq    %r10, 8(%rsp)
        movl    %eax, 16(%rsp)
        movzbl  32(%rsp), %eax
        movl    %eax, (%rsp)
        call    foo
        addq    $24, %rsp
        ret

icc 11.1 generates:

        .globl bar
bar:
# parameter 1: %edi
# parameter 2: %esi
# parameter 3: %edx
# parameter 4: %ecx
# parameter 5: %r8d
# parameter 6: %r9d
# parameter 7: 48 + %rsp
# parameter 8: 56 + %rsp
..B1.1:                         # Preds ..B1.0
..___tag_value_bar.1:                                           #8.1
        subq      $40, %rsp                                     #8.1
..___tag_value_bar.2:                                           #
        movzbl    48(%rsp), %eax                                #9.32
        movzbl    56(%rsp), %r10d                               #9.36
        movl      %eax, (%rsp)                                  #9.32
        movzbl    %dil, %edi                                    #8.1
        movq      %r10, 8(%rsp)                                 #9.36
        movl      %r10d, 16(%rsp)                               #9.40
        movzbl    %sil, %esi                                    #9.12
        movzbl    %dl, %edx                                     #8.1
        movzbl    %cl, %ecx                                     #9.20
        movzbl    %r8b, %r8d                                    #9.24
        movzbl    %r9b, %r9d                                    #9.28
        call      foo                                           #9.3
                                # LOE rbx rbp r12 r13 r14 r15
..B1.2:                         # Preds ..B1.1
        addq      $40, %rsp                                     #10.1
..___tag_value_bar.3:                                           #
        ret                                                     #10.1

So both gcc and icc treat _Bool parameters in register and on stack
as 1 byte. I think we should just drop

---
When a value of type _Bool is passed in a register or on the stack,
the upper 63 bits of the eightbyte shall be zero.
---

from psABI since it isn't really followed/used at all.


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42324



More information about the Gcc-bugs mailing list