[Top][All Lists]
[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);
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [dotgnu-pnet-commits] pnet ChangeLog engine/jitc_branch.c,
Klaus Treichel <=