Custom call lowering - where?

The CallingConv.td file can specify CCCustom and ISelLowering has LowerFormalArguments. The existing uses of CCCustom pick a register to pass an unmodified argument in and LowerFormalArguments is mostly concerned with marking registers as live, though I think provides enough information that I can munge the DAG there.

I would like to pass a scalar type (marked as a register class) in a vector register. I essentially want to wrap the argument in a SCALAR_TO_VECTOR ISD node before calling a function and unwrap it using EXTRACT_VECTOR_ELT or similar within the function.

Where should I introduce these additional nodes, or should it be possible to achieve this via CCCustom?

Cheers!

Jon

See RetCC_ARM_APCS_Custom_f64/ARMTargetLowering::LowerCallResult for an straightforward example of how CCCustom works in practice. You can generate whatever conversion code you need in your call lowering code.

-Eli