dotgnu-pnet-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[dotgnu-pnet-commits] pnet ChangeLog engine/jitc_branch.c


From: Klaus Treichel
Subject: [dotgnu-pnet-commits] pnet ChangeLog engine/jitc_branch.c
Date: Sun, 20 Jul 2008 10:17:15 +0000

CVSROOT:        /cvsroot/dotgnu-pnet
Module name:    pnet
Changes by:     Klaus Treichel <ktreichel>      08/07/20 10:17:15

Modified files:
        .              : ChangeLog 
        engine         : jitc_branch.c 

Log message:
        Fix handling compares of unordered check and branch opcodes for float 
values.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/pnet/ChangeLog?cvsroot=dotgnu-pnet&r1=1.3543&r2=1.3544
http://cvs.savannah.gnu.org/viewcvs/pnet/engine/jitc_branch.c?cvsroot=dotgnu-pnet&r1=1.15&r2=1.16

Patches:
Index: ChangeLog
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/ChangeLog,v
retrieving revision 1.3543
retrieving revision 1.3544
diff -u -b -r1.3543 -r1.3544
--- ChangeLog   14 Jul 2008 18:32:19 -0000      1.3543
+++ ChangeLog   20 Jul 2008 10:17:14 -0000      1.3544
@@ -1,3 +1,10 @@
+2008-07-20  Klaus Treichel  <address@hidden>
+
+       * engine/jitc_branch.c (JITCoder_Branch): Handle the unsigned/unordered
+       branch opcodes correctly for float compares (Fixes result for NaN 
values).
+       (JITCoder_Compare): Handle the unsigned/unordered check opcodes 
correctly
+       for float values (Fixes result for NaN values).
+       
 2008-07-14  Klaus Treichel  <address@hidden>
 
        * engine/verify_branch.c (IL_PREFIX_OP_CEQ): Look for a following

Index: engine/jitc_branch.c
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/engine/jitc_branch.c,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -b -r1.15 -r1.16
--- engine/jitc_branch.c        7 Oct 2007 19:20:12 -0000       1.15
+++ engine/jitc_branch.c        20 Jul 2008 10:17:15 -0000      1.16
@@ -168,7 +168,6 @@
 {
        ILJITCoder *jitCoder = _ILCoderToILJITCoder(coder);
        ILJITLabel *label = 0;
-       ILJitValue temp = 0;
        _ILJitStackItemNew(value2);
        _ILJitStackItemNew(value1);
 
@@ -225,10 +224,62 @@
 
                default:
                {
+                       int invertBranch = 0;
+                       ILJitValue temp = 0;
                        _ILJitStackPop(jitCoder, value2);
                        _ILJitStackPop(jitCoder, value1);
                        label = _ILJitLabelGet(jitCoder, dest, 
_IL_JIT_LABEL_NORMAL);
 
+                       /*
+                        * Note: Adjust the unsigned/unordered branch opcodes 
for float
+                        * values so that NaN values are handled correctly.
+                        */
+                       if(type1 == ILEngineType_F)
+                       {
+                               switch(opcode)
+                               {
+                                       case IL_OP_BNE_UN:
+                                       case IL_OP_BNE_UN_S:
+                                       {
+                                               opcode = IL_OP_BEQ;
+                                               invertBranch = 1;
+                                       }
+                                       break;
+
+                                       case IL_OP_BGT_UN:
+                                       case IL_OP_BGT_UN_S:
+                                       {
+                                               opcode = IL_OP_BLE;
+                                               invertBranch = 1;
+                                       }
+                                       break;
+
+                                       case IL_OP_BGE_UN:
+                                       case IL_OP_BGE_UN_S:
+                                       {
+                                               opcode = IL_OP_BLT;
+                                               invertBranch = 1;
+                                       }
+                                       break;
+
+                                       case IL_OP_BLT_UN:
+                                       case IL_OP_BLT_UN_S:
+                                       {
+                                               opcode = IL_OP_BGE;
+                                               invertBranch = 1;
+                                       }
+                                       break;
+
+                                       case IL_OP_BLE_UN:
+                                       case IL_OP_BLE_UN_S:
+                                       {
+                                               opcode = IL_OP_BGT;
+                                               invertBranch = 1;
+                                       }
+                                       break;
+                               }
+                       }
+
                        switch(opcode)
                        {
                                case IL_OP_BEQ:
@@ -238,8 +289,6 @@
                                        temp = OutputCompare(jitCoder, 
IL_OP_BEQ,
                                                                                
 &(_ILJitStackItemValue(value1)),
                                                                                
 &(_ILJitStackItemValue(value2)));
-                                       
jit_insn_branch_if(jitCoder->jitFunction, temp, 
-                                                                          
&(label->label));
                                }
                                break;
 
@@ -250,8 +299,6 @@
                                        temp = OutputCompare(jitCoder, 
IL_OP_BNE_UN,
                                                                                
 &(_ILJitStackItemValue(value1)),
                                                                                
 &(_ILJitStackItemValue(value2)));
-                                       
jit_insn_branch_if(jitCoder->jitFunction, temp, 
-                                                                          
&(label->label));
                                }
                                break;
 
@@ -262,8 +309,6 @@
                                        temp = OutputCompare(jitCoder, 
IL_OP_BGT,
                                                                                
 &(_ILJitStackItemValue(value1)),
                                                                                
 &(_ILJitStackItemValue(value2)));
-                                       
jit_insn_branch_if(jitCoder->jitFunction, temp,
-                                                                          
&(label->label));
                                }
                                break;
 
@@ -274,8 +319,6 @@
                                        temp = OutputCompare(jitCoder, 
IL_OP_BGT_UN,
                                                                                
 &(_ILJitStackItemValue(value1)),
                                                                                
 &(_ILJitStackItemValue(value2)));
-                                       
jit_insn_branch_if(jitCoder->jitFunction, temp,
-                                                                          
&(label->label));
                                }
                                break;
 
@@ -286,8 +329,6 @@
                                        temp = OutputCompare(jitCoder, 
IL_OP_BGE,
                                                                                
 &(_ILJitStackItemValue(value1)),
                                                                                
 &(_ILJitStackItemValue(value2)));
-                                       
jit_insn_branch_if(jitCoder->jitFunction, temp,
-                                                                          
&(label->label));
                                }
                                break;
 
@@ -298,8 +339,6 @@
                                        temp = OutputCompare(jitCoder, 
IL_OP_BGE_UN,
                                                                                
 &(_ILJitStackItemValue(value1)),
                                                                                
 &(_ILJitStackItemValue(value2)));
-                                       
jit_insn_branch_if(jitCoder->jitFunction, temp,
-                                                                          
&(label->label));
                                }
                                break;
 
@@ -310,8 +349,6 @@
                                        temp = OutputCompare(jitCoder, 
IL_OP_BLT,
                                                                                
 &(_ILJitStackItemValue(value1)),
                                                                                
 &(_ILJitStackItemValue(value2)));
-                                       
jit_insn_branch_if(jitCoder->jitFunction, temp,
-                                                                          
&(label->label));
                                }
                                break;
 
@@ -322,8 +359,6 @@
                                        temp = OutputCompare(jitCoder, 
IL_OP_BLT_UN,
                                                                                
 &(_ILJitStackItemValue(value1)),
                                                                                
 &(_ILJitStackItemValue(value2)));
-                                       
jit_insn_branch_if(jitCoder->jitFunction, temp,
-                                                                          
&(label->label));
                                }
                                break;
 
@@ -334,8 +369,6 @@
                                        temp = OutputCompare(jitCoder, 
IL_OP_BLE,
                                                                                
 &(_ILJitStackItemValue(value1)),
                                                                                
 &(_ILJitStackItemValue(value2)));
-                                       
jit_insn_branch_if(jitCoder->jitFunction, temp,
-                                                                          
&(label->label));
                                }
                                break;
 
@@ -346,10 +379,21 @@
                                        temp = OutputCompare(jitCoder, 
IL_OP_BLE_UN,
                                                                                
 &(_ILJitStackItemValue(value1)),
                                                                                
 &(_ILJitStackItemValue(value2)));
+                               }
+                               break;
+                       }
+                       if(temp)
+                       {
+                               if(invertBranch)
+                               {
+                                       
jit_insn_branch_if_not(jitCoder->jitFunction, temp,
+                                                                               
   &(label->label));
+                               }
+                               else
+                               {
                                        
jit_insn_branch_if(jitCoder->jitFunction, temp,
                                                                           
&(label->label));
                                }
-                               break;
                        }
                }
                break;
@@ -437,6 +481,31 @@
 
        _ILJitStackPop(jitCoder, value2);
        _ILJitStackPop(jitCoder, value1);
+
+       /*
+        * Note: Adjust the unsigned/unordered compare opcodes for float values
+        * so that NaN values are handled correctly.
+        */
+       if(type1 == ILEngineType_F)
+       {
+               switch(opcode)
+               {
+                       case IL_OP_PREFIX + IL_PREFIX_OP_CGT_UN:
+                       {
+                               opcode = IL_OP_BLE;
+                               invertTest = ((invertTest == 0) ? 1 : 0);
+                       }
+                       break;
+
+                       case IL_OP_PREFIX + IL_PREFIX_OP_CLT_UN:
+                       {
+                               opcode = IL_OP_BGE;
+                               invertTest = ((invertTest == 0) ? 1 : 0);
+                       }
+                       break;
+               }
+       }
+
        temp = OutputCompare(jitCoder, opcode,
                                                 
&(_ILJitStackItemValue(value1)),
                                                 
&(_ILJitStackItemValue(value2)));
@@ -444,10 +513,6 @@
        {
                temp = jit_insn_to_not_bool(jitCoder->jitFunction, temp);
        }
-       else
-       {
-               temp = jit_insn_to_bool(jitCoder->jitFunction, temp);
-       }
        _ILJitStackPushValue(jitCoder, temp);
 }
 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]