? .cvm_arith.c.swp ? amd64_unroller.patch Index: cvm_config.h =================================================================== RCS file: /cvsroot/dotgnu-pnet/pnet/engine/cvm_config.h,v retrieving revision 1.15 diff -u -r1.15 cvm_config.h --- cvm_config.h 4 Oct 2005 05:34:57 -0000 1.15 +++ cvm_config.h 13 Nov 2005 08:55:35 -0000 @@ -195,7 +195,6 @@ #undef IL_CVM_FLAVOUR #define IL_CVM_FLAVOUR "Direct Unrolled (x86)" #endif -/* TODO: enable when the amd64 unroller is complete #if defined(IL_CVM_DIRECT) && defined(CVM_X86_64) && \ defined(__GNUC__) && !defined(IL_NO_ASM) && \ !defined(IL_CVM_PROFILE_CVM_VAR_USAGE) && \ @@ -204,7 +203,6 @@ #undef IL_CVM_FLAVOUR #define IL_CVM_FLAVOUR "Direct Unrolled (amd64)" #endif -*/ #if defined(IL_CVM_DIRECT) && defined(CVM_ARM) && \ defined(__GNUC__) && !defined(IL_NO_ASM) && \ !defined(IL_CVM_PROFILE_CVM_VAR_USAGE) && \ Index: md_amd64.c =================================================================== RCS file: /cvsroot/dotgnu-pnet/pnet/engine/md_amd64.c,v retrieving revision 1.2 diff -u -r1.2 md_amd64.c --- md_amd64.c 3 Nov 2005 12:51:57 -0000 1.2 +++ md_amd64.c 13 Nov 2005 08:55:45 -0000 @@ -78,41 +78,51 @@ return inst; } -#if 0 /* TODO */ -md_inst_ptr _md_x86_mov_memindex_reg_byte(md_inst_ptr inst, int basereg, +md_inst_ptr _md_amd64_mov_memindex_reg_byte(md_inst_ptr inst, int basereg, unsigned offset, int indexreg, int srcreg) { - if(srcreg == X86_EAX || srcreg == X86_EBX || - srcreg == X86_ECX || srcreg == X86_EDX) + if(srcreg == AMD64_RAX || srcreg == AMD64_RBX || + srcreg == AMD64_RCX || srcreg == AMD64_RDX) { - x86_mov_memindex_reg(inst, basereg, offset, indexreg, + amd64_mov_memindex_reg(inst, basereg, offset, indexreg, 0, srcreg, 1); } else { int tempreg; - if(basereg != X86_EAX && indexreg != X86_EAX) + if(basereg != AMD64_RAX && indexreg != AMD64_RAX) { - tempreg = X86_EAX; + tempreg = AMD64_RAX; } - else if(basereg != X86_ECX && indexreg != X86_ECX) + else if(basereg != AMD64_RCX && indexreg != AMD64_RCX) { - tempreg = X86_ECX; + tempreg = AMD64_RCX; } else { - tempreg = X86_EDX; + tempreg = AMD64_RDX; } - x86_push_reg(inst, tempreg); - x86_mov_reg_reg(inst, tempreg, srcreg, 4); - x86_mov_memindex_reg(inst, basereg, offset, indexreg, + amd64_push_reg(inst, tempreg); + amd64_mov_reg_reg(inst, tempreg, srcreg, 4); + amd64_mov_memindex_reg(inst, basereg, offset, indexreg, 0, tempreg, 1); - x86_pop_reg(inst, tempreg); + amd64_pop_reg(inst, tempreg); } return inst; } +md_inst_ptr _md_amd64_switch(md_inst_ptr inst, int reg, void * table) +{ + /* we can clobber over MD_REG_PC */ + amd64_mov_reg_imm_size(inst, MD_REG_PC, table, 8); + amd64_mov_reg_memindex(inst, MD_REG_PC, MD_REG_PC, + 0, reg, 3, 8); + amd64_jump_membase(inst, MD_REG_PC, 0); + + return inst; +} +#if 0 md_inst_ptr _md_x86_rem_float (md_inst_ptr inst, int reg1, int reg2, int used) { Index: md_amd64.h =================================================================== RCS file: /cvsroot/dotgnu-pnet/pnet/engine/md_amd64.h,v retrieving revision 1.2 diff -u -r1.2 md_amd64.h --- md_amd64.h 3 Nov 2005 12:51:57 -0000 1.2 +++ md_amd64.h 13 Nov 2005 08:55:45 -0000 @@ -518,12 +518,10 @@ /* * Jump to a program counter that is defined by a switch table. */ +extern md_inst_ptr _md_amd64_switch(md_inst_ptr inst, int reg, void * table); #define md_switch(inst,reg,table) \ do { \ - /* amd64_mov_reg_memindex((inst), MD_REG_PC, X86_NOBASEREG, \ - (long long)(table), (reg), 2, 4); \ - amd64_jump_membase((inst), MD_REG_PC, 0); */\ - TODO_trap(inst);\ + (inst) = _md_amd64_switch((inst), (reg), (table));\ } while (0) /* @@ -671,7 +669,7 @@ * and "reg2" is the array index to check. */ #define md_bounds_check(inst,reg1,reg2) \ - x86_alu_reg_membase((inst), X86_CMP, (reg2), (reg1), 0) + amd64_alu_reg_membase((inst), X86_CMP, (reg2), (reg1), 0) /* * Load a 32-bit word value from an indexed array. "disp" is the offset @@ -680,7 +678,7 @@ */ #define md_load_memindex_word_32(inst,reg,basereg,indexreg,disp) \ do { \ - x86_mov_reg_memindex((inst), (reg), (basereg), \ + amd64_mov_reg_memindex((inst), (reg), (basereg), \ (disp), (indexreg), 2, 4); \ } while (0) @@ -689,8 +687,8 @@ */ #define md_load_memindex_word_native(inst,reg,basereg,indexreg,disp) \ do { \ - x86_mov_reg_memindex((inst), (reg), (basereg), \ - (disp), (indexreg), 2, 4); \ + amd64_mov_reg_memindex((inst), (reg), (basereg), \ + (disp), (indexreg), 3, 8); \ } while (0) /* @@ -698,7 +696,7 @@ */ #define md_load_memindex_byte(inst,reg,basereg,indexreg,disp) \ do { \ - x86_widen_memindex((inst), (reg), (basereg), \ + amd64_widen_memindex((inst), (reg), (basereg), \ (disp), (indexreg), 0, 0, 0); \ } while (0) @@ -707,7 +705,7 @@ */ #define md_load_memindex_sbyte(inst,reg,basereg,indexreg,disp) \ do { \ - x86_widen_memindex((inst), (reg), (basereg), \ + amd64_widen_memindex((inst), (reg), (basereg), \ (disp), (indexreg), 0, 1, 0); \ } while (0) @@ -716,7 +714,7 @@ */ #define md_load_memindex_short(inst,reg,basereg,indexreg,disp) \ do { \ - x86_widen_memindex((inst), (reg), (basereg), \ + amd64_widen_memindex((inst), (reg), (basereg), \ (disp), (indexreg), 1, 1, 1); \ } while (0) @@ -725,7 +723,7 @@ */ #define md_load_memindex_ushort(inst,reg,basereg,indexreg,disp) \ do { \ - x86_widen_memindex((inst), (reg), (basereg), \ + amd64_widen_memindex((inst), (reg), (basereg), \ (disp), (indexreg), 1, 0, 1); \ } while (0) @@ -734,7 +732,7 @@ */ #define md_store_memindex_word_32(inst,reg,basereg,indexreg,disp) \ do { \ - x86_mov_memindex_reg((inst), (basereg), (disp), (indexreg), \ + amd64_mov_memindex_reg((inst), (basereg), (disp), (indexreg), \ 2, (reg), 4); \ } while (0) @@ -743,19 +741,19 @@ */ #define md_store_memindex_word_native(inst,reg,basereg,indexreg,disp) \ do { \ - x86_mov_memindex_reg((inst), (basereg), (disp), (indexreg), \ - 2, (reg), 4); \ + amd64_mov_memindex_reg((inst), (basereg), (disp), (indexreg), \ + 3, (reg), 8); \ } while (0) /* * Store a byte value into an indexed array. */ -extern md_inst_ptr _md_x86_mov_memindex_reg_byte +extern md_inst_ptr _md_amd64_mov_memindex_reg_byte (md_inst_ptr inst, int basereg, unsigned offset, int indexreg, int srcreg); #define md_store_memindex_byte(inst,reg,basereg,indexreg,disp) \ do { \ - (inst) = _md_x86_mov_memindex_reg_byte \ + (inst) = _md_amd64_mov_memindex_reg_byte \ ((inst), (basereg), (disp), (indexreg), (reg)); \ } while (0) @@ -764,7 +762,7 @@ */ #define md_store_memindex_sbyte(inst,reg,basereg,indexreg,disp) \ do { \ - (inst) = _md_x86_mov_memindex_reg_byte \ + (inst) = _md_amd64_mov_memindex_reg_byte \ ((inst), (basereg), (disp), (indexreg), (reg)); \ } while (0) @@ -773,7 +771,7 @@ */ #define md_store_memindex_short(inst,reg,basereg,indexreg,disp) \ do { \ - x86_mov_memindex_reg((inst), (basereg), (disp), (indexreg), \ + amd64_mov_memindex_reg((inst), (basereg), (disp), (indexreg), \ 1, (reg), 2); \ } while (0) @@ -782,7 +780,7 @@ */ #define md_store_memindex_ushort(inst,reg,basereg,indexreg,disp) \ do { \ - x86_mov_memindex_reg((inst), (basereg), (disp), (indexreg), \ + amd64_mov_memindex_reg((inst), (basereg), (disp), (indexreg), \ 1, (reg), 2); \ } while (0) Index: unroll_ptr.c =================================================================== RCS file: /cvsroot/dotgnu-pnet/pnet/engine/unroll_ptr.c,v retrieving revision 1.7 diff -u -r1.7 unroll_ptr.c --- unroll_ptr.c 21 Jan 2005 08:52:28 -0000 1.7 +++ unroll_ptr.c 13 Nov 2005 08:55:49 -0000 @@ -1011,7 +1011,7 @@ unsigned temp = (unsigned)CVM_ARG_BYTE; UNROLL_START(); GetTopTwoWordRegisters(&unroll, ®, ®2, - MD_REG1_NATIVE | MD_REG2_32BIT); + MD_REG1_NATIVE | MD_REG2_NATIVE); CheckForNull(&unroll, reg, pc, (unsigned char *)inst, 0); md_store_membase_word_native(unroll.out, reg2, reg, (int)temp); FreeTopRegister(&unroll, -1);