diff -aruN shujit-0.6.2/ChangeLog shujit/ChangeLog --- shujit-0.6.2/ChangeLog Sat Aug 26 21:31:32 2000 +++ shujit/ChangeLog Tue Aug 29 20:47:54 2000 @@ -1,5 +1,28 @@ $Id$ +[20000829] + +0.6.3 リリース。 + +[20000828] + +スタック状態の更新 (updateStates()) のバグを修整。 +goto, ret 命令の後の状態をマクロ STATE_AFTER_JUMP の値に設定し損ねていた。 +CaffeineMark 3.0 の Logic, String のスコアが大きく向上 +(Logic: 4900 -> 5900, String: 1800 -> 2350)。 +(compile.c) + +ジャンプ命令の次だけでなく、return, [ilfda]return 命令の後の状態も +updateStates() 内で 0 に固定するようにした。 +(compile.c) + +[20000827] + +内部命令 inv_vir_varspace にて、本来ならローカル変数の領域は +mb->nlocal - mb->args_size とすべきところ、条件分岐を減らすため +単に mb->nlocal にした。 +(code.c) + [20000826] resolveExcRetSwitch() (compile.c) でも、 @@ -9,6 +32,14 @@ 0.6.2 リリース。 +関数呼び出しの際に %esi をスタックに退避するのをやめた。 +マクロ FUNCCALL* (code.h) から、pushl, popl を削除。 +(code.h) + +メソッド呼び出しの際に %esi をスタックに退避するのをやめた。 +内部命令 inv_core のコード (code.c) を変更。 +(code.c) + [20000825] invoke* 命令を、いくつかの内部命令に分割。 @@ -43,7 +74,7 @@ (compile.c) あるコードを一度だけ実行させるための自己書き換えの方法を変えた。 -nop 命令を上書きする方法から、jmp XX XX (0xeb XX XX) を上書きする方法に変えた。 +nop 命令を上書きする方法から、jmp XX (0xeb XX) を上書きする方法に変えた。 (code.c) 0.6.1 リリース。 diff -aruN shujit-0.6.2/README shujit/README --- shujit-0.6.2/README Mon Aug 21 18:51:34 2000 +++ shujit/README Tue Aug 29 20:18:22 2000 @@ -13,8 +13,8 @@ Working on the following platforms is confirmed. - Linux - - Blackdown JDK 1.2.2 FCS, pgcc 2.95.3, glibc2.1.3 and Linux 2.4.0-test7-pre2 - - JDK 1.1.8v1, pgcc 2.95.3, glibc2.1.3 and Linux 2.4.0-test7-pre2 + - Blackdown JDK 1.2.2 FCS, pgcc 2.95.3, glibc2.1.3 and Linux 2.4.0-test8-pre1 + - JDK 1.1.8v1, pgcc 2.95.3, glibc2.1.3 and Linux 2.4.0-test8-pre1 - JDK 1.1.7v1a, egcs 1.1.2, libc5.4.38 and Linux 2.0.35 - FreeBSD diff -aruN shujit-0.6.2/code.c shujit/code.c --- shujit-0.6.2/code.c Sat Aug 26 16:03:59 2000 +++ shujit/code.c Mon Aug 28 18:33:55 2000 @@ -342,7 +342,7 @@ #endif #ifdef DIRECT_INVOCATION - // ee->vars = %ebp + // ee->current_frame->vars = %ebp asm("movl %0,%%edi" : : "m" (ee)); // edi = ee asm("movl " EE_CURRENTFRAME(%edi) ",%edi\n\t" "movl %ebp," FRAME_VARS(%edi)); @@ -420,7 +420,7 @@ # define CALL_MONITOR(MON, FUNCNAME) \ asm("pushl " #MON);\ asm("pushl %0" : : "m" (ee)); /* ee */\ - asm("call " SYMBOL(FUNCNAME) "@PLT\n\t"\ + asm("call " SYMBOL(FUNCNAME) "2@PLT\n\t"\ "addl $8,%esp") #else # define CALL_MONITOR(MON, FUNCNAME) \ @@ -442,30 +442,23 @@ #endif METAVM_MONITOR(%eax, proxy_monitorenter, "sync_enter", 0); OBJ_MONITOR(%eax); -#if JDK_VER >= 12 - CALL_MONITOR(%eax, monitorEnter2); -#else CALL_MONITOR(%eax, monitorEnter); -#endif asm("syncenter_done:"); } // exit synchronized method - CODE(opc_sync_exit, sync_exit, STANY, STSTA, OPC_NONE) { - asm("pushl %edx\n\tpushl %ecx"); // save - - // monitorExit(obj_monitor(o)); - asm("movl %0,%%eax" : : "m" (o)); - METAVM_MONITOR(%eax, proxy_monitorexit, "sync_exit", 0); - OBJ_MONITOR(%eax); -#if JDK_VER >= 12 - CALL_MONITOR(%eax, monitorExit2); -#else - CALL_MONITOR(%eax, monitorExit); -#endif +#define SYNC_EXIT() \ + FUNCCALL_IN(2);\ + \ + /* monitorExit(obj_monitor(o)) */\ + asm("movl %0,%%eax" : : "m" (o));\ + METAVM_MONITOR(%eax, proxy_monitorexit, "sync_exit", 0);\ + OBJ_MONITOR(%eax);\ + CALL_MONITOR(%eax, monitorExit);\ + \ + FUNCCALL_OUT(2) - asm("popl %ecx\n\tpopl %edx"); // restore - } + CODE(opc_sync_exit, sync_exit, STANY, STSTA, OPC_NONE) { SYNC_EXIT(); } CODE(opc_strict_enter, strict_enter, STANY, STSTA, OPC_NONE) { @@ -3404,7 +3397,7 @@ // lreturn // compile: stateto4, return // return - CODE(opc_return, return, STANY, STSTA, OPC_NONE) { + CODE(opc_return, return, STANY, STATE_AFTER_RETURN, OPC_NONE) { BIPUSH_DEBUG1(%edx); BIPUSH_DEBUG1(%ecx); asm("jmp " STR(ADDR_FIN)); @@ -3750,7 +3743,7 @@ // invokevirtual - // const: args_size, methodIndex, retsize + // const: args_size, slot, retsize // invokespecial // const: args_size, method, local_var_space, retsize // invokestatic @@ -3797,8 +3790,8 @@ // const: args_size CODE(opc_inv_head, inv_head, STANY, STSTA, OPC_NONE) { - bytepcoff = BYTEPCOFF; asm("movl $" STR(CONST) ",%ecx"); // ecx = args_size + bytepcoff = BYTEPCOFF; } @@ -3868,16 +3861,19 @@ // const: retsize, args_size CODE(opc_inv_core, inv_core, STANY, ST0, OPC_NONE) { + asm(".globl inv_core\n\t.type inv_core,@function"); + asm("inv_core:"); + asm("subl %edi,%esp\n\t" "pushl %edi\n\t" // save "leal 4(%esp,%edi),%edi"); // edi = original esp - + asm("leal -4(%edi,%ecx,4),%edi"); // base of native stack // edi = original esp + 4 * (args_size - 1) - + // save registers - asm("pushl %esi"); - + //asm("pushl %esi"); + // push args of invocationHelper() INVOKE_CORE_PUSH_DEBUG_FLAG; // push runtime_debug asm("pushl $" STR(CONST)); // push retsize @@ -3887,31 +3883,32 @@ asm("pushl %ecx\n\t" // push args_size "pushl %eax\n\t" // push method "pushl %edx"); // push obj - + asm("movl " EE_CURRENTFRAME(%edi) ",%edi"); // edi = ee->current_frame - + INVOKE_CORE_DIRECT_JIT("inv_core"); - + asm("inv_core_invoke_normal:"); asm("call " SYMBOL(invocationHelper) "@PLT"); asm("inv_core_invoke_done:"); - + asm("addl $" INVOKE_CORE_ARG_SIZE ",%esp"); // restore registers - asm("popl %esi"); - + //asm("popl %esi"); + INVOKE_CORE_DEBUG1; - + asm("popl %edi"); // restore asm("addl %edi,%esp"); // free local var space - - asm("inv_core_restack:"); - + + asm(".globl inv_core_done\n\t.type inv_core_done,@function"); + asm("inv_core_done:"); + // adjust optop asm("movl $" STR(CONST) ",%edi\n\t" // edi = args_size "leal (%esp,%edi,4),%esp"); // esp += (args_size * 4) - + // if (eax == 0) goto exc_handler asm("testl %eax,%eax\n\t" "jnz " STR(ADDR_EXC)); @@ -3937,7 +3934,7 @@ # define METAVM_INVOKEVIRTUAL #endif - // const: methodIndex + // const: slot CODE(opc_invokevirtual, invokevirtual, STANY, STSTA, OPC_SIGNAL) { OBJ_ARRAY_METHODTABLE_TO_EAX(%edx, "invokevir"); // may cause SIGSEGV @@ -3945,7 +3942,7 @@ asm("movl $" STR(CONST) ",%edi"); // edi = slot MT_SLOT(%eax, %edi, %eax); // eax = method } - // const: methodIndex + // const: slot CODE(opc_invokevirtual_obj, invokevirtual_obj, STANY, STSTA, OPC_SIGNAL) { OBJ_METHODTABLE(%edx, %eax); // may cause SIGSEGV @@ -3957,12 +3954,16 @@ CODE(opc_inv_vir_varspace, inv_vir_varspace, STANY, STSTA, OPC_NONE) { // allocate local var space METHOD_NLOCALS(%eax, %edi); // edi = method->nlocals +#if 1 + asm("shll $2,%edi"); +#else asm("testl %edi,%edi\n\t" "jz inv_vir_varspace_nlocal_done\n\t" // edi = 0, if true // method->nlocals of native method is 0 "subl %ecx,%edi\n\t" // edi -= args_size "shll $2,%edi\n\t" // edi *= 4 "inv_vir_varspace_nlocal_done:"); +#endif } #ifdef METAVM @@ -3998,7 +3999,7 @@ "addl $24,%esp"); asm("popl %ecx"); // restore - asm("jmp inv_metavm_restack"); + asm("jmp " STR(CONST)); // jump to inv_core_done asm("inv_metavm_inv_local:"); } @@ -4111,10 +4112,10 @@ #if 0 // how to get methodblock # if 0 if (opcode == opc_invokevirtual_quick) // obj isn't an array - method = mt_slot(obj_methodtable(obj), methodIndex); + method = mt_slot(obj_methodtable(obj), slot); else # endif - method = mt_slot(obj_array_methodtable(obj), methodIndex); + method = mt_slot(obj_array_methodtable(obj), slot); #endif @@ -4249,7 +4250,7 @@ /* call newobject() */\ FUNCCALL_IN(STATE);\ asm("pushl %0" : : "m" (ee)); /* ee */\ - asm("pushl $0\n\t" /* pc */\ + asm("pushl $0\n\t" /* pc */\ "pushl " #CB_REG "\n\t"\ "call " SYMBOL(newobject) "@PLT\n\t"\ "addl $12,%esp");\ @@ -4789,8 +4790,8 @@ } #if JDK_VER >= 12 - CODE_MONITOR(monitorenter, monitorEnter2, proxy_monitorenter); - CODE_MONITOR(monitorexit, monitorExit2, proxy_monitorexit); + CODE_MONITOR(monitorenter, monitorEnter, proxy_monitorenter); + CODE_MONITOR(monitorexit, monitorExit, proxy_monitorexit); #else CODE_MONITOR(monitorenter, monitorEnter, proxy_monitorenter); CODE_MONITOR(monitorexit, monitorExit, proxy_monitorexit); @@ -5096,10 +5097,10 @@ #endif // SPECIAL_INLINING -#ifdef DIRECT_INVOCATION +#if defined(DIRECT_INVOCATION) && defined(REWRITE_CALLER) CODE(opc_direct_invoke, direct_invoke, STANY, STSTA, OPC_NONE) { - asm("movl 4(%ebp),%eax"); // eax = return address - asm("cmpw $0xd1ff,-2(%eax)\n\t" // FF D1: call *%ecx + asm("movl 4(%ebp),%edi"); // edi = return address + asm("cmpw $0xd1ff,-2(%edi)\n\t" // FF D1: call *%ecx "jne dinv_done"); #ifdef RUNTIME_DEBUG @@ -5111,33 +5112,71 @@ } #endif // RUNTIME_DEBUG - // rewrite - // from: XX XX XX XX XX XX - // to: 90 E8 - // this code assumes INVOKE_CORE_DIRECT_JIT as the following: // 2e1d: f6 40 11 40 testb $0x40,0x11(%eax) // 2e21: 74 10 je 2e33 // 2e23: 89 47 1c mov %eax,0x1c(%edi) // 2e26: ff d1 call *%ecx - asm("subl $11,%eax\n\t" +#if 1 + // rewrite + // from: XX XX XX XX XX XX XX XX XX XX XX + // to: EB 04 XX XX XX XX E8 + + asm("movl %0,%%eax" : : "m" (mb)); // eax = mb + METHOD_COMPILEDCODE(%eax, %eax); // eax = mb->CompiledCode + asm("movb $0xe8,-5(%edi)\n\t" + "subl %edi,%eax"); + asm("movw $0xfeeb,-11(%edi)"); + // 11: depends on INVOKE_CORE_DIRECT_JIT macro. + asm("movl %eax,-4(%edi)"); + asm("movb $0x04,-10(%edi)"); +#endif +#if 0 + // rewrite + // from: XX XX XX XX XX ... + // to: E8 + + asm("subl $11,%edi\n\t" + // 11: depends on INVOKE_CORE_DIRECT_JIT macro. + "movw $0xfeeb,(%edi)"); // EB FE: jump to self + asm("movl %0,%%eax" : : "m" (mb)); // eax = mb + asm("addl $5,%edi"); // edi += 5 + METHOD_COMPILEDCODE(%eax, %eax); // eax = mb->CompiledCode + asm("subl %edi,%eax\n\t" + "pushl %eax\n\t" // save the argument + "movb $0xfe,%al\n\t" + "movl %eax,-4(%edi)"); + + asm("movw $0x04eb,(%edi)"); + + asm("popl %eax\n\t" // restore the argument + "movb %al,%ah\n\t" + "movb $0xe8,%al\n\t" + "movw %ax,-5(%edi)"); +#endif +#if 0 + // rewrite + // from: XX XX XX XX XX XX ... + // to: 90 E8 + + asm("subl $11,%edi\n\t" // 11: depends on INVOKE_CORE_DIRECT_JIT macro. - "movw $0xfeeb,(%eax)"); // EB FE: jmp to self - asm("movl %0,%%edi\n\t" : : "m" (mb)); // edi = mb - asm("addl $6,%eax"); // eax += 6 - METHOD_COMPILEDCODE(%edi, %edi); // edi = mb->CompiledCode - asm("subl %eax,%edi\n\t" - "movl %edi,-4(%eax)"); + "movw $0xfeeb,(%edi)"); // EB FE: jmp to self + asm("movl %0,%%eax" : : "m" (mb)); // eax = mb + asm("addl $6,%edi"); // edi += 6 + METHOD_COMPILEDCODE(%eax, %eax); // eax = mb->CompiledCode + asm("subl %edi,%eax\n\t" + "movl %eax,-4(%edi)"); - asm("movl $0x90909090,(%eax)\n\t" - "movb $0x90,4(%eax)"); + asm("movw $0x03eb,(%edi)"); - asm("movw $0xe890,-6(%eax)"); + asm("movw $0xe890,-6(%edi)"); +#endif asm("dinv_done:"); } -#endif // DIRECT_INVOCATION +#endif // DIRECT_INVOCATION && REWRITE_CALLER CODEEND; @@ -5165,7 +5204,7 @@ // instantiate an exception - // call SingalError() if it has not called yet + // call SingalError() if it has not been called yet asm("movl %0,%%edi" : : "m" (ee)); asm("cmpb $0," EE_EXCEPTIONKIND(%edi) "\n\t" "jz exc_new_signal\n\t" diff -aruN shujit-0.6.2/code.h shujit/code.h --- shujit-0.6.2/code.h Thu Aug 24 22:20:28 2000 +++ shujit/code.h Mon Aug 28 17:35:51 2000 @@ -59,8 +59,12 @@ #define NSTATES 5 +// state for next instruction of goto,jsr,ret #define STATE_AFTER_JUMP ST0 - // state for next instruction of goto,jsr,ret +#define STATE_AFTER_JSR ST0 +#define STATE_AFTER_RETURN ST0 + // should be `ST0' because we cannot expect + // the stack has elements enough for other states. // @@ -141,16 +145,16 @@ #define FUNCCALL_OUT(STATE) _FUNCCALL_OUT(STATE) #define _FUNCCALL_IN(STATE) FUNCCALL_IN_##STATE #define _FUNCCALL_OUT(STATE) FUNCCALL_OUT_##STATE -#define FUNCCALL_IN_0 asm("pushl %esi") -#define FUNCCALL_OUT_0 asm("popl %esi") -#define FUNCCALL_IN_1 asm("pushl %esi\n\tpushl %edx") -#define FUNCCALL_OUT_1 asm("popl %edx\n\tpopl %esi") -#define FUNCCALL_IN_2 asm("pushl %esi\n\tpushl %edx\n\tpushl %ecx") -#define FUNCCALL_OUT_2 asm("popl %ecx\n\tpopl %edx\n\tpopl %esi") -#define FUNCCALL_IN_3 asm("pushl %esi\n\tpushl %ecx") -#define FUNCCALL_OUT_3 asm("popl %ecx\n\tpopl %esi") -#define FUNCCALL_IN_4 asm("pushl %esi\n\tpushl %ecx\n\tpushl %edx") -#define FUNCCALL_OUT_4 asm("popl %edx\n\tpopl %ecx\n\tpopl %esi") +#define FUNCCALL_IN_0 +#define FUNCCALL_OUT_0 +#define FUNCCALL_IN_1 asm("pushl %edx") +#define FUNCCALL_OUT_1 asm("popl %edx") +#define FUNCCALL_IN_2 asm("pushl %edx\n\tpushl %ecx") +#define FUNCCALL_OUT_2 asm("popl %ecx\n\tpopl %edx") +#define FUNCCALL_IN_3 asm("pushl %ecx") +#define FUNCCALL_OUT_3 asm("popl %ecx") +#define FUNCCALL_IN_4 asm("pushl %ecx\n\tpushl %edx") +#define FUNCCALL_OUT_4 asm("popl %edx\n\tpopl %ecx") #define STATETO00 diff -aruN shujit-0.6.2/compile.c shujit/compile.c --- shujit-0.6.2/compile.c Sat Aug 26 13:07:53 2000 +++ shujit/compile.c Mon Aug 28 18:34:07 2000 @@ -443,7 +443,7 @@ processAnOpcode(cc, opc_strict_enter, -1); } -#ifdef DIRECT_INVOCATION +#if defined(DIRECT_INVOCATION) && defined(REWRITE_CALLER) if (mb->fb.access & (ACC_STATIC | ACC_PRIVATE)) processAnOpcode(cc, opc_direct_invoke, -1); #endif @@ -1324,10 +1324,12 @@ break; case opc_new: + case opc_new_quick: case opc_anewarray: // code_opcode = code_opcode; operand = GET_UINT16(bytepc + 1); - { // check whether the class exists or not + if (code_opcode != opc_new_quick) { + // check whether the class exists or not if (!CONSTANT_POOL_TYPE_TABLE_IS_RESOLVED(type_table, operand)) { if (!ResolveClassConstantFromClass2(fieldclass(&mb->fb), operand, cc->ee, 1 << CONSTANT_Class, FALSE)) { @@ -1335,12 +1337,16 @@ code_opcode = opc_throw_noclassdef; } } + +#if 0 // cannot translate `new' instructions to new_quick + if (code_opcode == opc_new) { + if (CB_INITIALIZED(constant_pool[operand].clazz)) { + code_opcode = opc_new_quick; + } + } +#endif } break; - case opc_new_quick: - // code_opcode = opc_new_quick; - operand = GET_UINT16(bytepc + 1); - break; case opc_newarray: // code_opcode = opc_newarray; @@ -1681,64 +1687,63 @@ } #endif - if (codep->last_state != STSTA) { - switch (opcode) { - // jump instructions - case opc_goto: - case opc_jsr: - case opc_ret: - case opc_tableswitch: - case opc_lookupswitch: - state = STATE_AFTER_JUMP; - break; + switch (opcode) { + // jump instructions + case opc_goto: + case opc_ret: + case opc_tableswitch: + case opc_lookupswitch: + state = STATE_AFTER_JUMP; + break; + case opc_jsr: + state = STATE_AFTER_JSR; + break; - // invocation instructions - case opc_inv_core: - case opc_invokevirtual_quick: - case opc_invokevirtualobject_quick: - { - cp_item_type *constant_pool = + // invocation instructions + case opc_inv_core: + { + cp_item_type *constant_pool = cbConstantPool(fieldclass(&cc->mb->fb)); - unsigned char *type_table = + unsigned char *type_table = constant_pool[CONSTANT_POOL_TYPE_TABLE_INDEX].type; - int32_t operand = pctable->operand; - struct methodblock *method; - CodeInfo *info; + int32_t operand = pctable->operand; + struct methodblock *method; + CodeInfo *info; - method = constant_pool[operand].mb; + method = constant_pool[operand].mb; #ifdef COMPILE_DEBUG - if (compile_debug) { - printf(" %s#%s %s\n", cbName(fieldclass(&method->fb)), + if (compile_debug) { + printf(" %s#%s %s\n", cbName(fieldclass(&method->fb)), method->fb.name, method->fb.signature); - fflush(stdout); - } + fflush(stdout); + } #endif - if (!(method->CompiledCodeInfo)) { - if (!prepareCompiledCodeInfo(cc->ee, method)) { - /* NOTREACHED */ - fprintf(stderr, "FATAL: method has not been initialized:" + if (!(method->CompiledCodeInfo)) { + if (!prepareCompiledCodeInfo(cc->ee, method)) { + /* NOTREACHED */ + fprintf(stderr, "FATAL: method has not been initialized:" "%s#%s %s.\n", cbName(fieldclass(&method->fb)), method->fb.name, method->fb.signature); - JVM_Exit(1); - } + JVM_Exit(1); } - info = (CodeInfo *)method->CompiledCodeInfo; - sysAssert(info != NULL); - - if (info->ret_size == 0) - state = 0; - else if (info->ret_size == 1) - state = 1; - else // 2 - state = 4; } - break; + info = (CodeInfo *)method->CompiledCodeInfo; + sysAssert(info != NULL); - default: - state = codep->last_state; - break; + if (info->ret_size == 0) + state = 0; + else if (info->ret_size == 1) + state = 1; + else // 2 + state = 4; } - } + break; + + default: + if (codep->last_state != STSTA) + state = codep->last_state; + break; + } // switch (opcode) } #ifdef COMPILE_DEBUG if (compile_debug) { @@ -1929,7 +1934,7 @@ } #endif if (opcode == opc_ret) { - tgtstate = STATE_AFTER_JUMP; + tgtstate = STATE_AFTER_JSR; } else { int jumpoff; @@ -2492,6 +2497,29 @@ else // invokeignroed_static_quick memcpy(bufp + constant_table[opcode][state][0], &args_size, 4); #endif + +#ifdef METAVM + case: opc_inv_metavm: + { + pcentry *succ_pctable; + int succ_opcode; + CodeTable *succ_codep; + int j = i, jump_arg = 0; + while (TRUE) { + succ_pctable = cc->pctable + j; + succ_opcode = succ_pctable->opcode; + if (succ_opcode == opc_inv_core) break; + succ_codep = + &code_table[succ_opcode][pcentryState(succ_pctable)]; + jump_arg += succ_codep->length; + j++; + } + jump_arg += (((char *)inv_core_done) - ((char *)inv_core)); + + memcpy(bufp + constant_table[opcode][state][0], &jump_arg, 4); + } + break; +#endif // METAVM } break; } // resolve constants: switch (opcode) diff -aruN shujit-0.6.2/compiler.h shujit/compiler.h --- shujit-0.6.2/compiler.h Mon Aug 21 03:58:24 2000 +++ shujit/compiler.h Mon Aug 28 18:46:29 2000 @@ -76,6 +76,7 @@ #undef COUNT_TSC #define DIRECT_INVOCATION +#undef REWRITE_CALLER #define GET_SIGCONTEXT #define NULLEXC_BY_SIGNAL #define ARITHEXC_BY_SIGNAL diff -aruN shujit-0.6.2/txt/benchmark-PJ2X3 shujit/txt/benchmark-PJ2X3 --- shujit-0.6.2/txt/benchmark-PJ2X3 Tue Aug 22 04:24:04 2000 +++ shujit/txt/benchmark-PJ2X3 Tue Aug 29 20:47:26 2000 @@ -23,7 +23,8 @@ [CaffeineMark 3.0] -JDK 1.1.8v1 +- JDK 1.1.8v1 + * interpreter Sieve 609 Loop 482 @@ -49,14 +50,26 @@ Dialog 84 82 83 96 85 150 119 CM3 980 952 981 984 960 1048 979 - 000816 000822 -Sieve 2007 1996 -Loop 3348 3346 -Logic 4401 4912 -String 1844 1867 -Float 2024 1920 -Method 1508 1672 -Graphics 346 343 -Image 513 518 -Dialog 126 121 -CM3 1157 1173 + 000816 000822 000827 0.6.3 +Sieve 2007 1996 1997 1994 +Loop 3348 3346 3348 3337 +Logic 4401 4912 4818 5935 +String 1844 1867 1879 1855 +Float 2024 1920 1822 1829 +Method 1508 1672 1737 1752 +Graphics 346 343 392 323 +Image 513 518 506 526 +Dialog 126 121 127 114 +CM3 1157 1173 1191 1183 + + TYA 1.7v2 OpenJIT 1.1.13 +Sieve 1911 3231 +Loop 2683 4655 +Logic 4958 7066 +String 2305 4135 +Float 1765 3143 +Method 1823 4650 +Graphics 360 302 +Image 533 553 +Dialog 129 161 +CM3 1186 1765 diff -aruN shujit-0.6.2/txt/memo shujit/txt/memo --- shujit-0.6.2/txt/memo Tue Aug 22 14:25:31 2000 +++ shujit/txt/memo Tue Aug 29 17:47:08 2000 @@ -27,6 +27,10 @@ - invokeignored_quick への書き換え規則。 最適化 + - メソッド呼び出しから戻った後の、例外の有無チェックを省く。 + - インライン展開。 + コンパイル中に、そのメソッドが呼ぶメソッドを途中までコンパイル、 + PEI の有無やコード長などを調べておく。 - peephole 最適化。 - invokeignored_quick への変換を進める。 - [ifa]store{,_N}, [ifa]load{,_N} で、メモリからの読みだしを省く。