On Tue, Dec 8, 2009 at 8:50 AM, Michael Matz <m...@suse.de> wrote: > Hi, > > On Mon, 7 Dec 2009, H.J. Lu wrote: > >> --- >> 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. >> --- > > That was the outcome of a discussion in 2005/2006. We put this language > in because at that time all compilers booleanized at the caller. > GCC also makes use of this guarantee (although limited to the > 8 bit): > > _Bool bartmp; > void foo(_Bool bar) > { > bartmp = bar; > } > > will generate > > foo: > movb %dil, bartmp(%rip) > ret > > I do see value in limiting the zeroing to bits 1-31 when passed on stack. > But we'd need agreement on the discuss@ list, which for some reason didn't > seem to get any of these mails. >
Both icc and gcc generate: [...@gnu-26 pr42324]$ cat b4.c extern unsigned int bartmp; void foo(_Bool bar) { bartmp = bar; } [...@gnu-26 pr42324]$ /usr/gcc-4.4/bin/gcc -O2 b4.c -S [...@gnu-26 pr42324]$ cat b4.s .file "b4.c" .text .p2align 4,,15 .globl foo .type foo, @function foo: .LFB2: movzbl %dil, %edi movl %edi, bartmp(%rip) ret 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 _Bool has one byte in size with values of 0 and 1. Compilers have to clear upper 7 bits in one byte. -- H.J.