------- Comment #7 from hjl dot tools at gmail dot com 2009-12-08 18:17 ------- Another testcase:
[...@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); } [...@gnu-26 pr42324]$ /usr/gcc-4.4/bin/gcc -O2 b3.c -S [...@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