On 2/12/2012 4:46 PM, Andrew Whitworth wrote:
It depends what you mean about "plans ... to support more than integer
type". There are a few ways we could support a 64-bit integer:

1) Add a new register set for consistently-sized large integer types
(i.e. $Ix is for system-sized integers, but $Lx would always be for
large 64-bit integers). This would be a hassle to implement.
The bigger win (with corresponding bigger hassle) is to drop the "4 register types" notion, add a way to declare registers of different types that's richer than the 4, and switch to the "register frame" just being a blob of memory and register accesses are offsets into that. Unfortunately, that may well be hard to make efficient in an interpreter context (though prederef stuff could well be an option).

2) Change configuration to always force the $I register set to be
64-bits wide. This would waste a lot of space where such large
integers weren't needed, and might be inefficient on platforms without
good 64-bit arithmetic support.
Of the three, this feels like the most immediately feasible option; it'll get us something workable, and we can add some ops to cope with the unsigned cases when they're different. Note that in terms of space, you probably tend to care more when you're storing large numbers of integers, e.g. in packed arrays.

The problem isn't so much changing the $I registers; it's that on 64-bit the opcode_t also changes with that at the moment. Which means that bytecode is hugely padded on 64-bit systems (in fact, 16 bits for opcode woulda probably been enough; 32 is maybe OK; 64 is nuts). This is already an issue for everyone on 64-bit, so it'd just be giving 32-bit folks the same pain. But maybe pain leads to more incentives to improve things. ;-) Note that fixing this would imply that 64-bit integer literals need a constants segment entry. But I think it'd be worth it; the win is less memory usage and more bytecode fitting in the CPU cache, which is important.

3) Keep the $I register set the same (platform/config-dependent) but
add in Int64 (and Int32, etc) PMC types. These might be a replacement
for or a supplement to our current Integer PMC type. (We would need to
work out all sorts of boxing and autoconversion rules, and PMC
operations are inherently less efficient than $I registers, etc)
This one isn't going to work out from a Rakudo perspective. If that's all that's possible then I can do the same far more neatly with a REPR in 6model. But the reason I don't want that is that I want to be able to do operations on 64-bit ints, signed or unsigned, as *integers*, not as objects (which in turn require allocation and GC). That's the key part here.

Thanks,

Jonathan

_______________________________________________
http://lists.parrot.org/mailman/listinfo/parrot-dev

Reply via email to