FULL PRODUCT VERSION : java version "1.7.0-ea-fastdebug" Java(TM) SE Runtime Environment (build 1.7.0-ea-fastdebug-b76) Java HotSpot(TM) Client VM (build 17.0-b05-fastdebug, mixed mode) FULL OS VERSION : Windows XP SP-3 EXTRA RELEVANT SYSTEM CONFIGURATION : using hsdis library See: https://java-nio-charset-enhanced.dev.java.net/source/browse/java-nio-charset-enhanced/branches/j7_EUC_TW/nbproject/configs/C_d_b_c1_f3_shortMap5_PA.properties?rev=895&view=markup A DESCRIPTION OF THE PROBLEM : In the for loop in my code I have code<(page+1)*PAGE_LENGTH as loop termination. Variable page is local and is not altered in the loop, and PAGE_LENGTH is static final, so the result from "(page+1)*PAGE_LENGTH" should be remembered instead of recalculated each loop. In disassembly in pc 0x00bc9e1b the result is held in ecx register. In pc 0x00bc9e2e ecx register is overwritten without saving the result before. THE PROBLEM WAS REPRODUCIBLE WITH -Xint FLAG: No THE PROBLEM WAS REPRODUCIBLE WITH -server FLAG: Yes STEPS TO FOLLOW TO REPRODUCE THE PROBLEM : Run from NetBeans 6.8 using: https://java-nio-charset-enhanced.dev.java.net/source/browse/java-nio-charset-enhanced/branches/j7_EUC_TW/nbproject/configs/C_d_b_c1_f3_shortMap5_PA.properties?rev=895&view=markup EXPECTED VERSUS ACTUAL BEHAVIOR : Output from disassembly: 0x00bc9e0a: mov %ebp,0xc(%esp) 0x00bc9e0e: imul $0x5e,%ebp,%ecx ;*imul ; - sun.nio.cs.ext.EUC_TW_C_d_b_c1_f3_shortMap4$Encoder::<clinit>@129 (line 329) 0x00bc9e11: cmp 0x18(%esp),%ebx 0x00bc9e15: jg 0x00bc9f81 ;*if_icmpgt ; - sun.nio.cs.ext.EUC_TW_C_d_b_c1_f3_shortMap4$Encoder::<clinit>@139 (line 329) 0x00bc9e1b: add $0x5e,%ecx 0x00bc9e1e: mov 0x24(%esp),%ebp 0x00bc9e22: cmp %ecx,%ebp 0x00bc9e24: jge 0x00bc9f12 ;*if_icmpge ; - sun.nio.cs.ext.EUC_TW_C_d_b_c1_f3_shortMap4$Encoder::<clinit>@150 (line 330) 0x00bc9e2a: mov 0x14(%esp),%edi 0x00bc9e2e: mov 0x10(%edi),%ecx ; implicit exception: dispatches to 0x00bca2d9 ... Complete output here (line 569): https://java-nio-charset-enhanced.dev.java.net/source/browse/java-nio-charset-enhanced/branches/j7_EUC_TW/log/C_d_b_c1_f3_shortMap4_PA_3.xml?rev=895&view=markup REPRODUCIBILITY : This bug can be reproduced always. ---------- BEGIN SOURCE ---------- In my code I have following snippet: for (int code=page*PAGE_LENGTH, i=0; i<=maxCode; page++) { for (; code<(page+1)*PAGE_LENGTH && i<=maxCode; code++, i++) { // TODO: HotSpot bug: "(page+1)*PAGE_LENGTH" should be reused instead of recalculated each loop char c = chars.charAt(i); assert code <= Character.MAX_VALUE; if (c != UNMAPPABLE_DECODING) if ((b2cIsSupp[i] & (1 << p)) == 0) c2b[c2bIndex[c >> 8] + (c&0xff)] = (char)code; else c2bSupp[c2bSuppIndex[c >> 8] + (c&0xff)] = (char)code; } codeOffsets[page] = codeOffset; } Complete source code (line 330): https://java-nio-charset-enhanced.dev.java.net/source/browse/java-nio-charset-enhanced/branches/j7_EUC_TW/src/sun/nio/cs/ext/EUC_TW_C_d_b_c1_f3_shortMap4.java?rev=895&view=markup Complete project: https://java-nio-charset-enhanced.dev.java.net/source/browse/java-nio-charset-enhanced/branches/j7_EUC_TW?rev=895 ---------- END SOURCE ----------
|