floating point immediate problem

I tried to generate pattern for instruction which transports floating point immediate to a floating point register.

def MOVF32fk : InstTCE<(outs F32Regs:$dst), (ins f32imm:$val),
             "$val -> $dst;",
                    [(set F32Regs:$dst, (f32 imm:$val))]>;

This causes an type contradiction:

/home/hkultala26/src/devel/tce/src/applibs/LLVMBackend/plugin//TCEInstrInfo.td:109:1: error: In MOVF32fk: Type inference contradiction found, 'f32' needs to be integer
def MOVF32fk : InstTCE<(outs F32Regs:$dst), (ins f32imm:$val),

why? Why does llvm assume floating point immediate needs to be integer?

(f32 imm:$val))]>; <-- this needs to be fpimm, 'imm' is an integer immediate.