[ppc] add native type support for float
authorBernhard Urban <bernhard.urban@xamarin.com>
Wed, 20 Sep 2017 09:55:47 +0000 (11:55 +0200)
committerBernhard Urban <bernhard.urban@xamarin.com>
Mon, 25 Sep 2017 16:01:15 +0000 (18:01 +0200)
mono/arch/ppc/ppc-codegen.h
mono/mini/cpu-ppc.md
mono/mini/mini-ppc.c

index 869365b4bccd9b3d93d99dd1184dfbc049253d8f..98fed7525fb2937dea3a7cc334c33c026d596503 100644 (file)
@@ -333,7 +333,7 @@ my and Ximian's copyright to this code. ;)
 #define ppc_andid(c,S,A,ui) ppc_emit32(c, (28 << 26) | ((S) << 21 ) | ((A) << 16) | ((guint16)(ui)))
 #define ppc_andisd(c,S,A,ui) ppc_emit32(c, (29 << 26) | ((S) << 21 ) | ((A) << 16) | ((guint16)(ui)))
 
-#define ppc_bcx(c,BO,BI,BD,AA,LK) ppc_emit32(c, (16 << 26) | (BO << 21 )| (BI << 16) | (BD << 2) | ((AA) << 1) | LK)
+#define ppc_bcx(c,BO,BI,BD,AA,LK) ppc_emit32(c, (16 << 26) | ((BO) << 21 )| ((BI) << 16) | (BD << 2) | ((AA) << 1) | LK)
 #define ppc_bc(c,BO,BI,BD) ppc_bcx(c,BO,BI,BD,0,0) 
 #define ppc_bca(c,BO,BI,BD) ppc_bcx(c,BO,BI,BD,1,0)
 #define ppc_bcl(c,BO,BI,BD) ppc_bcx(c,BO,BI,BD,0,1)
index e7544570c050474dc918a94ec34ffb796c3e9a21..0baa0fe3c993261b2366ed0c5b15e6c864c556de 100644 (file)
@@ -198,6 +198,9 @@ float_cgt_un: dest:i src1:f src2:f len:20
 float_clt: dest:i src1:f src2:f len:16
 float_clt_un: dest:i src1:f src2:f len:20
 float_conv_to_u: dest:i src1:f len:36
+float_cneq: dest:i src1:f src2:f len:16
+float_cge: dest:i src1:f src2:f len:16
+float_cle: dest:i src1:f src2:f len:16
 call_handler: len:12 clob:c
 endfilter: src1:i len:32
 aot_const: dest:i len:8
index 60d9475dfe31a8b80b1b5322a8026008b4ad94ee..4ba20cc2257e31ff9ad4e154ca7267b2b939d124 100644 (file)
@@ -4371,15 +4371,17 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                        ppc_fcmpu (code, 0, ins->sreg1, ins->sreg2);
                        break;
                case OP_FCEQ:
+               case OP_FCNEQ:
                        ppc_fcmpo (code, 0, ins->sreg1, ins->sreg2);
-                       ppc_li (code, ins->dreg, 0);
-                       ppc_bc (code, PPC_BR_FALSE, PPC_BR_EQ, 2);
                        ppc_li (code, ins->dreg, 1);
+                       ppc_bc (code, ins->opcode == OP_FCEQ ? PPC_BR_TRUE : PPC_BR_FALSE, PPC_BR_EQ, 2);
+                       ppc_li (code, ins->dreg, 0);
                        break;
                case OP_FCLT:
+               case OP_FCGE:
                        ppc_fcmpo (code, 0, ins->sreg1, ins->sreg2);
                        ppc_li (code, ins->dreg, 1);
-                       ppc_bc (code, PPC_BR_TRUE, PPC_BR_LT, 2);
+                       ppc_bc (code, ins->opcode == OP_FCLT ? PPC_BR_TRUE : PPC_BR_FALSE, PPC_BR_LT, 2);
                        ppc_li (code, ins->dreg, 0);
                        break;
                case OP_FCLT_UN:
@@ -4390,9 +4392,10 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                        ppc_li (code, ins->dreg, 0);
                        break;
                case OP_FCGT:
+               case OP_FCLE:
                        ppc_fcmpo (code, 0, ins->sreg1, ins->sreg2);
                        ppc_li (code, ins->dreg, 1);
-                       ppc_bc (code, PPC_BR_TRUE, PPC_BR_GT, 2);
+                       ppc_bc (code, ins->opcode == OP_FCGT ? PPC_BR_TRUE : PPC_BR_FALSE, PPC_BR_GT, 2);
                        ppc_li (code, ins->dreg, 0);
                        break;
                case OP_FCGT_UN: