Hi all,

I'm working on changing GHC's calling convention to support overlapping register classes. On x86-64 this will mean that a function can receive up to six Float/Double arguments (any mixture) in registers. Right now only two Double arguments can be passed in registers on x86-64, even if a function takes zero Float arguments---the register classes for Floats and Doubles cannot overlap even though both are passed in xmm* registers.

This is working fine with the native back-end, but I'm not sure how to get it working with the LLVM back-end. Right now LLVM translates a Cmm procedure to an LLVM function of a single universal type( that is, all LLVM functions that the LLVM back-end produces for Cmm procedures have the same type) that takes all STG registers as arguments. A Cmm procedure call passes all the STG registers, although the back-end takes advantage of the liveness information attached to Cmm jumps to pass undefined values for non-live registers.

Now that register classes can overlap, I need to change this. Since jumps have liveness information attached, I can simply pass the live registers. But when translating Cmm procedures, I need to know which registers are live on entry to the procedure.

The slightly longer-term goal is to add support for passing SSE vectors in registers. What I'd like to have ideally is the set of live registers *and their Cmm types* at each procedure entry and jump. I envision having a single STG register class, say X16, for all 128-bit-wide SSE registers, but I'd like the Cmm type information when generating LLVM type signatures so I can generate the appropriate LLVM types---a 128-bit-wide vector of 32-bit integers does not have the same type as a 128-bit-wide vector of double precision floats.

I might be able to do without the Cmm type information by inserting appropriate casts in the generated LLVM code, but I really need the set of live registers on entry to a Cmm procedure. I don't see how to get this unfortunately. Any hints?

Thanks,
Geoff

_______________________________________________
Cvs-ghc mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/cvs-ghc

Reply via email to