On Sun, May 13, 2012 at 11:58 PM, H.J. Lu <hjl.to...@gmail.com> wrote: > On Sun, May 13, 2012 at 12:01 PM, Richard Guenther > <richard.guent...@gmail.com> wrote: >> On Sun, May 13, 2012 at 6:32 PM, H.J. Lu <hjl.to...@gmail.com> wrote: >>> Hi, >>> >>> I am trying to optimize memory address for x32. X32 runs in 64-bit mode. >>> 64-bit address is base + index * scale + offset: >>> 1. Base is 64bit. >>> 2. Index is 64bit. >>> 3. Offset is 8bit or 32bit >>> >>> 0x67 address size prefix is used to zero-extend 32bit address to 64bit: >>> 1. Upper 32bits of base or index can be none-zero. >>> 2. Index can be negative. >>> >>> We can avoid 0x67 prefix if >>> 1. There is no index >>> 2. Upper 32bits of base is zero: >>> a. When base is set via 32bit load op, the upper 32bits are >>> atomically zero-extended from the lower 32bits >>> 3. Base + offset is a valid 32-bit address. >>> >>> Will x86 backend ever see a memory address with wrap around. >>> That is to use 0xffffffff + 0x30 to represent 0x2f. >> >> Why not? Easily from code like >> >> long foo (long a, long b) >> { >> return *((long *)(a + b)); >> } >> > > What is the expect run-time behavior when a + b has > overflow/underflow?
If you make it unsigned long then with the values to quote you derefernece 0x2f (sorry for using signed arith, and thus undefinedness on overflow in the example). Richard. > > -- > H.J.