From: <dgr...@us...> - 2007-05-31 14:00:05
|
Revision: 12402 http://svn.sourceforge.net/jikesrvm/?rev=12402&view=rev Author: dgrove-oss Date: 2007-05-31 06:59:59 -0700 (Thu, 31 May 2007) Log Message: ----------- ppc version of fix for bug Ian discovered in the IA32 baseline compiler yesterday. We want edgeCounters to saturate at maxInt, and the old code sequence instead simply forced them to be non-negative by wrapping from maxInt to 0 which was not the intent. So, instead of using incorrent masking computation, branch around the store that updates the counter value if the increment causes overflow. Annoyingly enough, PPC doesn't have an ADDi. form so we need an explicit CMPi here that we don't need in IA32. Modified Paths: -------------- rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ppc/VM_Compiler.java Modified: rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ppc/VM_Compiler.java =================================================================== --- rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ppc/VM_Compiler.java 2007-05-31 13:32:13 UTC (rev 12401) +++ rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ppc/VM_Compiler.java 2007-05-31 13:59:59 UTC (rev 12402) @@ -3436,16 +3436,22 @@ private void incEdgeCounter(int counters, int scratch, int counterIdx) { asm.emitLInt(scratch, counterIdx << 2, counters); asm.emitADDI(scratch, 1, scratch); - asm.emitRLWINM(scratch, scratch, 0, 1, 31); + // Branch around store if we overflowed: want count to saturate at maxint. + asm.emitCMPI(scratch, 0); + VM_ForwardReference fr = asm.emitForwardBC(VM_Assembler.LT); asm.emitSTW(scratch, counterIdx << 2, counters); + fr.resolve(asm); } private void incEdgeCounterIdx(int counters, int scratch, int base, int counterIdx) { asm.emitADDI(counters, base << 2, counters); asm.emitLIntX(scratch, counterIdx, counters); asm.emitADDI(scratch, 1, scratch); - asm.emitRLWINM(scratch, scratch, 0, 1, 31); + // Branch around store if we overflowed: want count to saturate at maxint. + asm.emitCMPI(scratch, 0); + VM_ForwardReference fr = asm.emitForwardBC(VM_Assembler.LT); asm.emitSTWX(scratch, counterIdx, counters); + fr.resolve(asm); } /** This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |