On Fri, Mar 6, 2015 at 12:48 PM, Bernd Edlinger
<[email protected]> wrote:
> Hi Richard,
>
> here is my new proposal, it addresses your objections and generates
> "better" code for this test case:
>
> main:
> .LFB0:
> .cfi_startproc
> pushq %rbp
> .cfi_def_cfa_offset 16
> .cfi_offset 6, -16
> movq %rsp, %rbp
> .cfi_def_cfa_register 6
> movl global+1(%rip), %eax
> orl $2147483647, %eax
> movl %eax, global+1(%rip)
> movl global+1(%rip), %eax
> andl $2147483647, %eax
> cmpl $2147483647, %eax
> je .L2
> call abort
> .L2:
> movl $0, %eax
> popq %rbp
> .cfi_def_cfa 7, 8
> ret
> .cfi_endproc
>
>
> I also tried to fix the comments.
>
> Reg-tested on x86_64 successfully and ARM is still running.
>
> Is it OK for trunk?
Looks ok to me apart from
/* Check for cases of unaligned fields that must be split. */
- if (bitnum % BITS_PER_UNIT + bitsize > modesize
- || (STRICT_ALIGNMENT
- && bitnum % GET_MODE_ALIGNMENT (fieldmode) + bitsize > modesize))
+ if (bitnum % (STRICT_ALIGNMENT ? modesize : BITS_PER_UNIT)
+ + bitsize > modesize
+ || (STRICT_ALIGNMENT && MEM_ALIGN (op0) < modesize))
return false;
where I'd use GET_MODE_ALIGNMENT (fieldmode) rather than modesize
(in both places).
Please leave Eric the chance to comment.
Thanks,
Richard.
>
>
> Thanks
> Bernd.
>