From: <cap...@us...> - 2007-04-18 14:27:26
|
Revision: 66 http://svn.sourceforge.net/pearcolator/?rev=66&view=rev Author: captain5050 Date: 2007-04-18 07:27:27 -0700 (Wed, 18 Apr 2007) Log Message: ----------- Support for overflow from multiply Modified Paths: -------------- ext/org/jikesrvm/compilers/opt/ir/OPT_ConditionOperand.java ext/org/jikesrvm/compilers/opt/ir/ia32/OPT_IA32ConditionOperand.java Modified: ext/org/jikesrvm/compilers/opt/ir/OPT_ConditionOperand.java =================================================================== --- ext/org/jikesrvm/compilers/opt/ir/OPT_ConditionOperand.java 2007-04-18 14:26:40 UTC (rev 65) +++ ext/org/jikesrvm/compilers/opt/ir/OPT_ConditionOperand.java 2007-04-18 14:27:27 UTC (rev 66) @@ -109,6 +109,11 @@ /** Would is bit a not set in b? */ public static final int NO_RBIT_TEST = 35; + /** Would a*b cause an overflow? */ + public static final int OVERFLOW_FROM_MUL = 36; + /** Would a*b not cause an overflow? */ + public static final int NO_OVERFLOW_FROM_MUL = 37; + /* Results from evaluations */ /** Evaluation result is false */ public static final int FALSE = 0; @@ -310,6 +315,15 @@ } /** + * Create the condition code operand for OVERFLOW_FROM_ADD + * + * @return a newly created condition code operand + */ + public static OPT_ConditionOperand OVERFLOW_FROM_MUL() { + return new OPT_ConditionOperand(OVERFLOW_FROM_MUL); + } + + /** * Is x higher (unsigned >) than y? */ private static boolean higher(int x, int y) { @@ -373,6 +387,15 @@ } /** + * Would x*y overflow a register? + */ + private static boolean overflow_from_mul(int x, int y) { + int z = x * y; + long z2 = ((long)x) * ((long)y); + return (long)z != z2; + } + + /** * Would is bit y of x set? */ private static boolean bit_test(int x, int y) { @@ -507,6 +530,8 @@ case NO_BIT_TEST: case RBIT_TEST: case NO_RBIT_TEST: + case OVERFLOW_FROM_MUL: + case NO_OVERFLOW_FROM_MUL: return true; default: return false; @@ -845,6 +870,8 @@ case NO_BIT_TEST: case RBIT_TEST: case NO_RBIT_TEST: + case OVERFLOW_FROM_MUL: + case NO_OVERFLOW_FROM_MUL: return UNKNOWN; default: throw new OPT_OptimizingCompilerException("invalid condition " + this); @@ -891,6 +918,8 @@ case NO_BIT_TEST: return bit_test(v1, v2) ? FALSE : TRUE; case RBIT_TEST: return bit_test(v2, v1) ? TRUE : FALSE; case NO_RBIT_TEST: return bit_test(v2, v1) ? FALSE : TRUE; + case OVERFLOW_FROM_MUL: return overflow_from_mul(v1, v2) ? TRUE : FALSE; + case NO_OVERFLOW_FROM_MUL: return overflow_from_mul(v1, v2) ? FALSE : TRUE; } throw new OPT_OptimizingCompilerException("invalid condition " + this); } @@ -1055,6 +1084,10 @@ case NO_BIT_TEST: value = BIT_TEST; break; case RBIT_TEST: value = NO_RBIT_TEST; break; case NO_RBIT_TEST: value = RBIT_TEST; break; + + case OVERFLOW_FROM_MUL: value = NO_OVERFLOW_FROM_MUL; break; + case NO_OVERFLOW_FROM_MUL: value = OVERFLOW_FROM_MUL; break; + default: OPT_OptimizingCompilerException.UNREACHABLE(); } @@ -1118,6 +1151,10 @@ case NO_BIT_TEST: value = NO_RBIT_TEST; break; case RBIT_TEST: value = BIT_TEST; break; case NO_RBIT_TEST: value = NO_BIT_TEST; break; + + case OVERFLOW_FROM_MUL: break; // mul is commutative + case NO_OVERFLOW_FROM_MUL: break; + default: OPT_OptimizingCompilerException.UNREACHABLE(); } @@ -1183,6 +1220,9 @@ case RBIT_TEST: return "rbt"; case NO_RBIT_TEST: return "!rbt"; + case OVERFLOW_FROM_MUL: return "overflow(*)"; + case NO_OVERFLOW_FROM_MUL: return "nooverflow(*)"; + default: return "UNKNOWN"; } } Modified: ext/org/jikesrvm/compilers/opt/ir/ia32/OPT_IA32ConditionOperand.java =================================================================== --- ext/org/jikesrvm/compilers/opt/ir/ia32/OPT_IA32ConditionOperand.java 2007-04-18 14:26:40 UTC (rev 65) +++ ext/org/jikesrvm/compilers/opt/ir/ia32/OPT_IA32ConditionOperand.java 2007-04-18 14:27:27 UTC (rev 66) @@ -171,14 +171,36 @@ value = LGT; break; case OPT_ConditionOperand.LOWER: + case OPT_ConditionOperand.CARRY_FROM_ADD: + case OPT_ConditionOperand.BORROW_FROM_SUB: + case OPT_ConditionOperand.BORROW_FROM_RSUB: + case OPT_ConditionOperand.BIT_TEST: + case OPT_ConditionOperand.RBIT_TEST: value = LLT; break; case OPT_ConditionOperand.HIGHER_EQUAL: + case OPT_ConditionOperand.NO_CARRY_FROM_ADD: + case OPT_ConditionOperand.NO_BORROW_FROM_SUB: + case OPT_ConditionOperand.NO_BORROW_FROM_RSUB: + case OPT_ConditionOperand.NO_BIT_TEST: + case OPT_ConditionOperand.NO_RBIT_TEST: value = LGE; break; case OPT_ConditionOperand.LOWER_EQUAL: value = LLE; break; + case OPT_ConditionOperand.OVERFLOW_FROM_ADD: + case OPT_ConditionOperand.OVERFLOW_FROM_SUB: + case OPT_ConditionOperand.OVERFLOW_FROM_RSUB: + case OPT_ConditionOperand.OVERFLOW_FROM_MUL: + value = O; + break; + case OPT_ConditionOperand.NO_OVERFLOW_FROM_ADD: + case OPT_ConditionOperand.NO_OVERFLOW_FROM_SUB: + case OPT_ConditionOperand.NO_OVERFLOW_FROM_RSUB: + case OPT_ConditionOperand.NO_OVERFLOW_FROM_MUL: + value = NO; + break; case OPT_ConditionOperand.CMPL_EQUAL: case OPT_ConditionOperand.CMPL_GREATER: case OPT_ConditionOperand.CMPG_LESS: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |