Fix handling of fp arguments in the LLVM backend, they were copied using OP_MOVE...
authorZoltan Varga <vargaz@gmail.com>
Wed, 15 Feb 2012 19:12:34 +0000 (20:12 +0100)
committerZoltan Varga <vargaz@gmail.com>
Wed, 15 Feb 2012 19:12:47 +0000 (20:12 +0100)
mono/mini/mini-llvm.c

index 811122c75e08eab5c83aaba47d9617a388f54276..9ac07631f30f204a1937efea1dd53191e0ab81a5 100644 (file)
@@ -4591,15 +4591,19 @@ mono_llvm_emit_call (MonoCompile *cfg, MonoCallInst *call)
                /* Simply remember the arguments */
                switch (ainfo->storage) {
                case LLVMArgInIReg:
-                       MONO_INST_NEW (cfg, ins, OP_MOVE);
-                       ins->dreg = mono_alloc_ireg (cfg);
-                       ins->sreg1 = in->dreg;
-                       break;
-               case LLVMArgInFPReg:
-                       MONO_INST_NEW (cfg, ins, OP_FMOVE);
-                       ins->dreg = mono_alloc_freg (cfg);
+               case LLVMArgInFPReg: {
+                       MonoType *t = (sig->hasthis && i == 0) ? &mono_defaults.int_class->byval_arg : sig->params [i - sig->hasthis];
+
+                       if (!t->byref && (t->type == MONO_TYPE_R8 || t->type == MONO_TYPE_R4)) {
+                               MONO_INST_NEW (cfg, ins, OP_FMOVE);
+                               ins->dreg = mono_alloc_freg (cfg);
+                       } else {
+                               MONO_INST_NEW (cfg, ins, OP_MOVE);
+                               ins->dreg = mono_alloc_ireg (cfg);
+                       }
                        ins->sreg1 = in->dreg;
                        break;
+               }
                case LLVMArgVtypeByVal:
                case LLVMArgVtypeInReg:
                        MONO_INST_NEW (cfg, ins, OP_LLVM_OUTARG_VT);