[Issue 14571] [REG2.064] Large static arrays seem to lock up DMD

via Digitalmars-d-bugs digitalmars-d-bugs at puremagic.com
Fri May 22 04:10:11 PDT 2015


https://issues.dlang.org/show_bug.cgi?id=14571

--- Comment #15 from Vladimir Panteleev <thecybershadow at gmail.com> ---
(In reply to Walter Bright from comment #14)
> Take a look at the code generated for global data. In 64 bit code, it's all
> relative to the program counter. In 32 bit code, it's indirect because of
> shared library support (PIC).

Not on Win32, though.

> That died a couple decades ago with the advent of DLLs.

DLLs are relocated at load time (and usually are linked with a base unlikely to
conflict, so relocations are often not done). The hypothetical ptr[5] would be
relocated as well.

> x86-64 bit code
> doesn't even have a direct addressing mode. Even the presumably direct
> addressing modes in x32 are indirect because of the segment registers, and
> despite that, the CPU does such a good job of address pipelining you'll
> never see the effect of using a register offset.

I would need to run some benchmarks to test this. But a quick test shows that
64-bit code has dedicated CPU instructions for relative addressing of globals,
but indexing arrays on the heap still requires two instructions (mov rax, arr +
mov dword ptr [arr+idx*4], value).

> I know, that's why I mentioned it. BSS is special.

I understood your post as that executable bloat still applies even though it
goes into BSS.

--


More information about the Digitalmars-d-bugs mailing list