[RyuJIT/armel] Correct returning float values.
authorAlexander Soldatov <soldatov.a@samsung.com>
Tue, 6 Jun 2017 14:10:12 +0000 (17:10 +0300)
committerAlexander Soldatov <soldatov.a@samsung.com>
Fri, 9 Jun 2017 16:07:37 +0000 (19:07 +0300)
Returned from function float pointing value in softfp mode should be
stored into r0 (r0-r1 for TYP_DOUBLE).

Commit migrated from https://github.com/dotnet/coreclr/commit/be4f1fa51ca71b542aa104c74f8c4771babd670a

src/coreclr/src/jit/codegenarm.cpp

index b953dae..9fca8b6 100644 (file)
@@ -308,7 +308,20 @@ void CodeGen::genReturn(GenTreePtr treeNode)
             genConsumeReg(op1);
 
             regNumber retReg = varTypeIsFloating(treeNode) ? REG_FLOATRET : REG_INTRET;
-            if (op1->gtRegNum != retReg)
+            if (varTypeIsFloating(treeNode) && (compiler->opts.compUseSoftFP || compiler->info.compIsVarArgs))
+            {
+                if (targetType == TYP_FLOAT)
+                {
+                    getEmitter()->emitIns_R_R(INS_vmov_f2i, EA_4BYTE, REG_INTRET, op1->gtRegNum);
+                }
+                else
+                {
+                    assert(targetType == TYP_DOUBLE);
+                    getEmitter()->emitIns_R_R_R(INS_vmov_d2i, EA_8BYTE, REG_INTRET, REG_NEXT(REG_INTRET),
+                                                op1->gtRegNum);
+                }
+            }
+            else if (op1->gtRegNum != retReg)
             {
                 inst_RV_RV(ins_Move_Extend(targetType, true), retReg, op1->gtRegNum, targetType);
             }