2006-10-16 Aleksey Demakov * jit/jit-interp.h, jit/jit-interp.c (_jit_run_function): * jit/jit-opcode.c, jit/jit-rules-interp.c (_jit_gen_insn): Repair struct handling broken since the last interpreter reorganization, remove unused interpreter opcodes. * jit/jit-rules-interp.c (_jit_gen_start_block): check if the fixup position is before the cache end. This prevents segmentation fault when the end of cache block is reached and jit_function_compile() attempts to generate more code (it checks for the cache end way too late). 2006-10-14 Aleksey Demakov * jit/jit-rules-interp.c (_jit_create_call_return_insns): fix return code in case of no return value or struct returned via pointer (this is just like 2006-02-20 fix for x86). * jit/jit-cfg.c (create_value_entry): an uninitialized value was used (thanks Klaus for spotting). 2006-10-02 Klaus Treichel * jit/jit-intrinsic.c: Fix a copy bug in jit_ulong_mul (replace - by *). 2006-09-25 Aleksey Demakov * include/jit/jit-arch-x86.h, include/jit/jit-arch-generic.h: add headers for architecture-specific definitions. (_JIT_ARCH_GET_CURRENT_FRAME): add macro to find the stack frame pointer. * include/jit/Makefile.am: create jit-arch.h as a symlink to one of the jit-arch-*.h files depending on the JIT_ARCH value. * configure.in: set JIT_ARCH according to the system architecture. * include/jit/jit-walk.h (jit_get_current_frame): * jit/jit-walk.c (jit_get_starting_frame): * tools/gen-apply.c (find_return_offset, detect_frame_offsets): use _JIT_ARCH_GET_CURRENT_FRAME macro if available. This resolves the problem with gcc 4.1.* where __builtin_frame_address() function is broken (thanks Klaus for identifing the problem). 2006-09-15 Radek Polak * include/jit/jit-insn.h, jit/jit-insn.c, jit/jit-debugger.c: new instruction jit_insn_mark_breakpoint_variable. 2006-09-14 Aleksey Demakov * jit/jit-reg-alloc.h, jit/jit-reg-alloc.c: remove "old" register allocation code. * configure.in: remove --enable-new-reg-alloc option. * jit/jit-rules-x86.ins: simplify JIT_OP_RETURN_LONG rule, lift code from load_small_struct() function to JIT_OP_RETURN_SMALL_STRUCT rule. * jit/jit-rules-x86.c: remove load_small_struct() function. 2006-09-09 Aleksey Demakov * jit/jit-reg-alloc.h, jit/jit-reg-alloc.c: * tools/gen-rules-parser.y: add _JIT_REGS_CLOBBER_STACK flag and use it in the code genearted for "only" rules instead of the explicit stack top check followed by the _jit_regs_spill_all() call. 2006-09-02 Aleksey Demakov * jit/jit-interp.c (_jit_run_function): * jit/jit-rules-interp.c (_jit_gen_insn): remove last traces of register allocation from the interpreter. 2006-08-31 Klaus Treichel * configure.in: Replace the deprecated AM_PROG_LIBTOOL with the current AC_PROG_LIBTOOL. * jitdynamic/Makefile.am, jitplus/Makefile.am: Add -no-undefined to the LDFLAGS to enable building cygwin/mingw dlls. 2006-08-31 Aleksey Demakov * tools/gen-rules-scanner.l, tools/gen-rules-parser.y: add "frame" keyword that is just like "local" but forces the value out from the register into the stack frame. * jit/jit-rules-x86.ins: rewrite JIT_OP_COPY_STORE_BYTE, JIT_OP_ADDRESS_OF, and JIT_OP_COPY_STORE_SHORT rules using the "frame" keyword. * jit/Makefile.am, jit/jit-rules-x86.c: remove all references to jit-rules-x86.sel and jit-rules-x86.slc. * jit/jit-rules-x86.c: remove mov_memindex_reg_byte() and widen_byte() functions. 2006-08-30 Aleksey Demakov * jit/jit-interp.h, jit/jit-interp.c, jit/jit-opcode.c, jit/jit-rules-interp.h, jit/jit-rules-interp.c: major change in the internal interpreter instruction set. Now the stack is used only for function arguments. There are three pseudo-registers used instead of the stack for operands. One is used for the destination value, two others are used for the source values. The destination register is spilled after each instruction. This scheme obviates the need for register allocation for the interpreter backend. * jit/jit-function.c (jit_function_compile, compile_block): do not make register allocator calls if JIT_BACKEND_INTERP is defined. 2006-08-29 Aleksey Demakov * jit/jit-function.c (jit_function_from_pc): fix problem with wrong exception handler address for interpreter. * jit/jit-insn.c (jit_insn_return, jit_insn_return_ptr): do not pop the setjmp context for the interpreter backend because it takes care of this by itself. * jit/jit-rules.h, jit/jit-rules-alpha.c, jit/jit-rules-arm.c, * jit/jit-rules-interp.c, jit/jit-rules-x86.c, jit/jit-reg-alloc.c: move part of the _jit_gen_exch_top() functionality into a separate _jit_gen_move_top() function. * include/jit/jit-opcode.h: * jit/jit-opcode.c: add JIT_OPCODE_IS_JUMP_TABLE flag to mark the JIT_OP_JUMP_TABLE opcode. * jit/jit-dump.c (jit_dump_insn, dump_interp_code): add jump table dumping. 2006-08-28 Klaus Treichel * dpas/Makefile.am, jit/Makefile.am, tests/Makefile.am: Add missing sources to fix creation of tarballs (make dist). 2006-08-25 Yan Burman * jitdynamic/jit-cpp-mangle.c (mangle_type_gcc3): fix typo in is_unsigned usage (patch #5324) 2006-08-23 Thomas Cort * jit/jit-apply-alpha.c jit/jit-apply-alpha.h: Fix jit_redirector_size. alpha_call is 6 instructions, not 1. 5 to load the addr, 1 to call. * jit/jit-gen-alpha.h: add macros for fp sign copy and arithmetic. * jit/jit-rules-alpha.c: remove TODO() from unused functions. 2006-08-23 Aleksey Demakov * jit/jit-internal.h (struct _jit_function): change the type of redirector and indirector fields from char array to pointer. * jit/jit-function.c (jit_function_create): allocate the redirector and indirector buffers in the code cache. Call jit_flush_exec on these buffers. This fixes problems on alpha and some x86 linux distros. [This one is based on the initial solution suggested by Kirill Kononenko ]. * jit/jit-rules-x86.c (_jit_gen_redirector): ifdef out as this function is not used with the x86 backend. * jit/jit-reg-alloc.c: improve handling of three-address op codes. Now the dest register may re-use one of the input registers while previously it was always assigned to a separate register. Also restructure the code that will be used for better selection of x87 instructions (this code was not used before and still is not but this is about to change). * jit/jit-rules-x86.ins: rewrite all LOAD_RELATIVE and LOAD_ELEMENT ops for x86 as three-address. Adjust IREM ops so that they work correctly together with the latest allocator changes. 2006-08-22 Klaus Treichel * jit/jit-alloc.c: Use mmap and munmap to allocate executable memory where available because memory allocated with malloc is not executable on some archs/distros. 2006-08-21 Thomas Cort * jit/jit-rules-alpha.c jit/jit-gen-alpha.h: Add macros for int to fp and fp to int conversions. Use _jit_pad_bufer. 2006-08-20 Thomas Cort * jit/jit-apply-alpha.c jit/jit-apply-alpha.h jit/jit-rules-alpha.h jit/jit-rules-alpha.ins jit/jit-rules-alpha.c jit/jit-gen-alpha.h: Remove unnecessary code from the prolog, epilog, redirector, and closure. Implement > and >= opcodes for signed and unsigned values. 2006-08-19 Aleksey Demakov * jit/jit-reg-alloc.c (set_regdesc_flags): fix a problem with the clobber flag being ignored. The problem was introduced by the patch from 2006-06-17. 2006-08-15 Thomas Cort * jit/jit-rules-alpha.c jit/jit-rules-alpha.h jit/jit-rules-alpha.ins Add a TODO() macro to print unimplemented warnings. Fix some casting warnings. Implement _jit_gen_redirector(...). Fix JIT_CDECL_WORD_REG_PARAMS to use the correct parameter registers. Add some stack push and pop instructions. 2006-08-15 Kirill Kononenko * configure.in: add --enable-signals option; * jit/Makefile.am: add jit/jit-signal.c; * jit/jit-signal.c, jit/jit-internal.h: add _jit_signal_init(); * jit/jit-init.c: call _jit_signal_init() if JIT_USE_SIGNALS is defined. 2006-08-11 Thomas Cort * jit/jit-rules-alpha.c jit/jit-rules-alpha.ins Properly handle fixups on alpha. Implement JIT_OP_CALL_EXTERNAL for alpha. 2006-07-29 Aleksey Demakov * jit/jit-reg-alloc.c (use_cheapest_register): allow a register that contains an input value to be used as a scratch register. The input value in this case is copied to another register. This resolves the problem with JIT_OP_IREM rule that failed to allocate a scratch reg in a very specific case (all EBX, ESI, EDI regs are used as global, dividend is initially in ECX and copied to EAX:EDX pair where x86 idiv expects it to be). * jit/jit-reg-alloc.c (set_regdesc_flags): fix a bug. 2006-07-23 Thomas Cort * jit/jit-apply-alpha.c jit/jit-apply-alpha.h jit/jit-apply-func.h jit/jit-gen-alpha.h jit/jit-rules-alpha.c jit/jit-rules-alpha.h jit/jit-rules-alpha.ins Implement the redirector for alpha. Continue to implement more functions in jit/jit-rules-alpha.c. 2006-07-15 Thomas Cort * jit/jit-apply-alpha.c jit/jit-gen-alpha.h jit/jit-rules-alpha.h jit/jit-rules-alpha.c: Implement closure for alpha. Use jsr instead of bsr in alpha_call. Clean up prolog and epilog generation for alpha to be more readable. 2006-07-13 Thomas Cort * jit/jit-gen-alpha.h jit/jit-rules-alpha.c jit/jit-rules-alpha.h: Added trap barrier macro alpha_trapb. Implemented _jit_gen_prolog and _jit_gen_epilog for alpha. 2006-07-12 Aleksey Demakov * jit/jit-insn.c (jit_insn_move_blocks_to_start): fix problem with wrong order of blocks that were moved from the position just after the init_block and with disappearance of blocks after the empty init_block. 2006-07-12 Thomas Cort * README.alpha jit/Makefile.am jit/jit-apply-alpha.c jit/jit-apply-alpha.h jit/jit-elf-defs.h jit/jit-gen-alpha.h jit/jit-rules-alpha.c jit/jit-rules-alpha.h jit/jit-rules-alpha.ins /jit/jit-rules.h: Initial import of the code for the alpha port. 2006-07-06 Aleksey Demakov * jit/jit-rules-x86.ins: fix division by power of two. 2006-07-05 Aleksey Demakov * configure.in: make new register allocator the default. * jit/jit-reg-alloc.c (is_register_alive, compute_spill_cost): fix problem with destroying the end register of a long pair. 2006-07-03 Aleksey Demakov * jit/jit-rules-x86.ins: add JIT_OP_LOW_WORD, JIT_OP_EXPAND_INT, JIT_OP_EXPAND_UINT, JIT_OP_INT_TO_NFLOAT, JIT_OP_UINT_TO_NFLOAT, JIT_OP_LONG_TO_NFLOAT, JIT_OP_ULONG_TO_NFLOAT and rewrite JIT_OP_TRUNC_SBYTE, JIT_OP_TRUNC_UBYTE, JIT_OP_LOAD_PC rules. * jit/jit-rules-x86.c (_jit_opcode_is_supported): include .inc file instead of .slc if USE_NEW_REG_ALLOC is defined. 2006-06-28 Aleksey Demakov * tools/gen-rules-parser.y (gensel_output_code): * jit/jit-rules-x86.ins: use $1 for dest register instead of $0 for consistency. 2006-06-27 Aleksey Demakov * jit/jit-insn.c (accumulate_relative_offset): add function that accumulates JIT_OP_ADD_RELATIVE offsets. (jit_insn_store_relative, jit_insn_load_relative) (jit_insn_add_relative): use accumulate_relative_offset() instead of previous_relative() to find the offset from the original address and do not replace the accumulated instructions with JIT_OP_NOP as it was before. The old approach is problematic because it is unknown at this point if the values we accumulated are dead or they will be used by instructions added later. The deadcode elimination pass removes unused values just as well but with enough knowledge to be safe. The new code also does not move JIT_OP_ADDRESS_OF towards the relative instructions that uses the address. Supposedly such move may be used by the code generator as a hint. However currently the code generator does not use such a hint. The old code is kept for reference #ifdefed out. 2006-06-17 Aleksey Demakov * jit/jit-reg-alloc.h, jit/jit-reg-alloc.c: implement support of the JIT_REGS_FREE_DEST flag for 3-argument instructions. Tweak reg alloc API. * tools/gen-rules-parser.y: adjust for reg alloc API changes. Use '$0' pattern element to refer to destination register in 3-argument instructions. * jit/jit-rules-x86.ins: rewrite JIT_OP_IDIV, JIT_OP_IDIV_UN, JIT_OP_IREM, JIT_OP_IREM_UN, JIT_OP_ADDRESS_OF_LABEL, JIT_OP_LOAD_RELATIVE_FLOAT32, JIT_OP_LOAD_RELATIVE_FLOAT32, JIT_OP_LOAD_RELATIVE_NFLOAT, JIT_OP_LOAD_ELEMENT_FLOAT32, JIT_OP_LOAD_ELEMENT_FLOAT64, JIT_OP_LOAD_ELEMENT_NFLOAT rules. 2006-06-16 Aleksey Demakov * jit/jit-rules-x86.sel, jit/jit-rules-x86.ins: fix JIT_OP_IDIV and JIT_OP_IREM rules for the divisor value of -1. 2006-06-09 Aleksey Demakov * jit/jit-rules-x86.ins: rewrite JIT_OP_STORE_RELATIVE_BYTE, JIT_OP_STORE_RELATIVE_SHORT, JIT_OP_STORE_RELATIVE_LONG, JIT_OP_STORE_RELATIVE_FLOAT32, JIT_OP_STORE_RELATIVE_FLOAT64, JIT_OP_STORE_RELATIVE_NFLOAT, JIT_OP_STORE_ELEMENT_LONG, JIT_OP_STORE_ELEMENT_NFLOAT rules to use regular pattern syntax instead of manual. 2006-06-03 Aleksey Demakov * jit/jit-rules-x86.ins: remove _jit_regs_free_reg() call from JIT_OP_RETURN_FLOAT32, JIT_OP_PUSH_FLOAT32, JIT_OP_RETURN_FLOAT64, JIT_OP_RETURN_NFLOAT, JIT_OP_PUSH_FLOAT64, and JIT_OP_PUSH_NFLOAT rules. With new ``gen-rules'' tool it frees wrong register and the right register is anyway freed automatically by the new allocator. * jit/jit-reg-alloc.h, jit/jit-reg-alloc.c (_jit_regs_abort): add function to unbind values from registers if the code generation failed. This is required because new allocator may temporary bind constants to registers and if neither _jit_regs_commit() nor _jit_regs_abort() is called the constant value will be left in inconsistent state. The problem shows up when the end of a cache block has been reached and the compilation is restarted with a new block. * jit/jit-reg-alloc.c (_jit_regs_begin, _jit_regs_end): add convenience functions. * tools/gen-rules-parser.y (gensel_output_clauses): make generated code more readable by using _jit_regs_begin() and _jit_regs_end() where appropriate. * jit/jit-reg-alloc.c: allow to load the second part of a register pair to a global register. This is because x86 long arithmetics use 4 registers at once: EAX:EDX and ECX:EBX. At the same time EBX is the global register candidate. If the instruction clobbers the global register, the new allocator automatically pushes it on the stack before and pops after the instruction. * jit/jit-function.c (compile_block): modify trace messages. 2006-05-28 Klaus Treichel * jit/jit-insn.c: Add a code_label in initialize_setjmp_block just before the end_label that is moved with the block to the start of the function as jump target to the code. Otherwise other blocks moved to the start after this block will never be executed. 2006-05-27 Aleksey Demakov * jit/jit-reg-alloc.c (free_value, save_value): the value that has a global register and is also associated with a local register needs to be unbound from the local one. * jit/jit-reg-alloc.c (compute_spill_cost): assume that the spill cost for clean values is not zero. This keeps them in registers as long as there are free registers and thus reduces the number of loads. 2006-05-25 Aleksey Demakov * jit/jit-reg-alloc.c (use_cheapest_register): fix cost calculation again for 'spill_before' rules. The last patch did not work for values stored in global registers. Now both global and non-global values should be copied to EAX. 2006-05-25 Aleksey Demakov * jit/jit-reg-alloc.c (use_cheapest_register): fix cost calculation that sometimes caused overlooking free registers. This was a serious problem as there are some 'spill_before' rules that assume that the allocator will always choose EAX as the first free register. 2006-05-21 Aleksey Demakov * jit/jit-reg-alloc.h: add _JIT_REGS_FREE_DEST flag to be used in cases when the destination register is independent of any input register. * tools/gen-rules-parser.y: allow specification of independent destination register with '=reg' pattern syntax. (But the allocator does not yet handle this.) 2006-05-20 Aleksey Demakov * jit/jit-rules-x86.c (_jit_gen_exch_top): fix computation of stack register index. * jit/jit-reg-alloc.c (_jit_regs_assign): micro optimization by changing nesting order of for and if statements. 2006-05-19 Aleksey Demakov * jit-reg-alloc.h, jit/jit-reg-alloc.c: determine if input values need to be saved and evicted from registers to stack frame at the _jit_regs_assign() time. Uniformly save input values that need to in _jit_regs_gen(), do not save them in _jit_regs_commit(). This simplifies handling of stack registers. Remove initial_stack_top, exchanges, num_exchages fields from the _jit_regs_t struct. Add save and kill bit fields to the _jit_regdesc_t struct. Refactor and clean up code. 2006-05-10 Aleksey Demakov * jit/jit-reg-alloc.c (use_cheapest_register): check if the other part of a register pair clobbers global registers. * jit/jit-reg-alloc.c (exch_stack_top): run value exchange loop for all values in both registers. * jit/jit-reg-alloc.h, jit/jit-reg-alloc.c: delete on_stack field from the _jit_regdesc_t struct. * jit/jit-reg-alloc.c (_jit_regs_gen): handle instructions that have both stack and flat registers. * jit/jit-reg-alloc.c (spill_value): spilling an input value remember if we do register exchanges for other values. * jit/jit-reg-alloc.c: set touched registers more accurately. 2006-05-08 Aleksey Demakov * jit/jit-reg-alloc.c (commit_input_value, commit_output_value): fix extra spills introduced at 2006-05-05. * jit/jit-rules-x86.c (_jit_gen_spill_top): add missing jit_cache_end_output(). 2006-05-05 Aleksey Demakov * jit/jit-reg-alloc.h, jit/jit-reg-alloc.c: fix spilling and many problems with stack registers. 2006-05-04 Radek Polak * jit/jit-dump.c (dump_object_code): Now can dump to any stream not just stdout and stderr. 2006-05-01 Aleksey Demakov * jit/jit-rules-x86.sel, jit/jit-rules-x86.ins: fix problem with spilling dest register in JIT_OP_ADDRESS_OF rule. * jit/jit-rules-x86.ins: rewrite JIT_OP_STORE_RELATIVE_INT rule. 2006-04-23 Aleksey Demakov * jit/jit-reg-alloc.h, jit/jit-reg-alloc.c: register allocator now supports register sets that constrain the register assignment. * tools/gen-rules-parser.y: extend grammar to support register sets. Fix bugs. * jit/jit-rules-x86.ins: take advantage of new register allocator for JIT_OP_MEMORY, JIT_OP_MEMOVE, JIT_OP_MEMESET rules. 2006-04-20 Aleksey Demakov * tools/gen-rules-parser.y: fix generation of `if' pattern code. 2006-04-19 Aleksey Demakov * jit/jit-rules-x86.c (_jit_gen_load_value): fix compiler warning. * tools/gen-rules-parser.y (gensel_output_clauses): fix generation of clobber and scratch code. * tools/gen-rules-scanner.l, tools/gen-rules-parser.y: add `any' keyword. 2006-04-18 Aleksey Demakov * jit/jit-rules-x86.ins: add instruction selection rules for new register allocator. * jit/Makefile.am: build new instruction selection rules. * configure.in: add --enable-new-reg-alloc option. 2006-04-14 Aleksey Demakov * jit/jit-reg-alloc.h, jit/jit-reg-alloc.c: new register allocator improved and extended to support stack registers. * jit/jit-internal.h (struct _jit_builder): * jit/jit-function.c (compile_block, jit_function_compile): add some tracing. * jit/jit-rules.h: * jit/jit-rules-arm.c: * jit/jit-rules-interp.c: * jit/jit-rules-x86.c: add _jit_gen_exch_top and _jit_gen_spill_top functions used by new allocator to handle stack registers. Add reg argument to _jit_gen_spill_global and_jit_gen_load_global functions. 2006-04-11 Aleksey Demakov * jit/jit-insn.c (jit_insn_start_catcher): initialize thrown_exception (the problem was found by Klaus). 2006-04-08 Aleksey Demakov * jit/jit-opcode.c: add jump table into jit_opcodes array. * tools/gen-rules-parser.y: extend pattern syntax to allow mark registers as clobbered. Fix bugs. 2006-04-07 Klaus Treichel * jit/jit-internal.h (struct _jit_function): add indirector field. * jit/jit-function.c (jit_function_compile, jit_function_create): use indirector. * jit/jit-apply-x86.h: define jit_indirector_size. * jit/jit-apply-func.h, jit/jit-apply-x86.c (_jit_create_indirector): add function that emits indirector code. 2006-04-07 Aleksey Demakov * jit/jit-insn.c (create_call_setup_insns): zero struct_return in case of tail calls (the problem was found by Klaus). 2006-04-03 Aleksey Demakov * tools/gen-rules-scanner.l: * tools/gen-rules-parser.y: add `reversible', `x87arith', and `copy' keywords. Fix bugs. 2006-03-23 Klaus Treichel * jit/jitc-except.c: Walk the stack to build the stack trace in jit_exception_get_stack_trace when the frame is not broken. 2006-03-23 Aleksey Demakov * tools/Makefile.am: * tools/gen-rules-parser.y, tools/gen-rules-scanner.l: add "gen-rules" tool that is similar to "gen-sel" but uses new register allocator. 2006-03-12 Klaus Treichel * jit/jit-insn.c: Pop the setjump context on return from functions with a catcher. 2006-03-11 Kirill Kononenko * jit/jit-insn.c (create_call_setup_insn): fix tail calls, work if the called function is not the callee function (thanks klausT for finding the bug). 2006-02-27 Aleksey Demakov * jit/jit-insn.c (jit_insn_convert): fix int->uint and uint->int conversion. 2006-02-26 Aleksey Demakov * jit/jit-rules-x86.sel: fix JIT_OP_STORE_RELATIVE_LONG. * jit/jit-gen-x86.h (x86_pop_mem, x86_pop_membase): fix opcode -- it was 0x87 (xchg) instead of 0x8f (pop). 2006-02-24 Aleksey Demakov * jit/jit-insn.c (jit_insn_address_of_label): fix a typo. * jit/jit-rules-x86.sel: fix JIT_OP_ADDRESS_OF_LABEL rule. 2006-02-20 Aleksey Demakov * jit/jit-rules-x86.c (_jit_create_call_return_insns): fix return code in case of no return value or struct returned via pointer. 2006-02-19 Aleksey Demakov * jit/jit-reg-alloc.h: * jit/jit-reg-alloc.c: Initial version of new local register allocator. * jit/jit-rules.h: * jit/jit-rules-arm.c (_jit_gen_spill_global): * jit/jit-rules-interp.c (_jit_gen_spill_global): * jit/jit-rules-x86.c (_jit_gen_spill_global): add function for spilling global registers. Used by the new allocator. Only x86 version is really implemented. 2006-02-13 Aleksey Demakov * jit/jit-internal.h (struct _jit_value): add index field. * jit/jit-value.c (alloc_value): initialize index field; * jit/Makefile.am (libjit_la_SOURCES): add jit-bitset.c and jit-cfg.c. 2006-02-12 Aleksey Demakov * jit/jit-rules-x86.sel: fix JIT_OP_CALL_FINALLY. 2006-02-10 Aleksey Demakov * jit/jit-bitset.c: * jit/jit-bitset.h: * jit/jit-cfg.c: * jit/jit-cfg.h: initial code drop for a more precise liveness analysis based on control flow graph. 2006-02-04 Aleksey Demakov * jit/jit-rules-x86.sel: fix a typo in JIT_OP_JUMP_TABLE. 2006-01-30 Aleksey Demakov * jit/jit-rules-x86.c (_jit_gen_load_value): optimize loading of zero constants. Allow to move a value from one register to another. 2006-01-15 Rhys Weatherley * configure.in, NEWS: update version for the "0.0.6" release. * configure.in: updating working version to "0.0.7". 2006-01-14 Aleksey Demakov * tools/gen-sel-parser.y: spilling a register which is the first part of a register pair spill the other part too. * jit/jit-reg-alloc.c (free_register_for_value): * jit/jit-rules-x86.sel: if a register is the second part of a register pair do not consider it free. 2006-01-13 Aleksey Demakov * jit/jit-insn.c: fix all descriptors of intrinsic functions that return an exception code to have return_type equal to _jit_type_int_def. * jit/jit-dump.c (dump_object_code): fix object file extension. 2006-01-11 Aleksey Demakov * jit/jit-gen-x86.h (x86_jump_memindex): add macro for indirect jumps. * jit/jit-internal.h, jit/jit-function.c, jiy/jit-rules-x86.c: add fixup_absolute_list field to _jit_block struct for fixing up absolute address references to a block. * include/jit/jit-opcode.h, include/jit/jit-insn.h, jit/jit-insn.c (jit_insn_jump_table), jit/jit-rules-x86.sel, jit/jit-rules-interp.c (_jit_gen_insn), jit/jit-interp.c (_jit_run_function): add JIT_OP_JUMP_TABLE opcode. 2006-01-08 Aleksey Demakov * jit/jit-apply-x86.h (jit_builtin_return_int): change definition to dereference the return_buf argument and use leal instead of movl. This fixes builds with gcc 4.0.2. 2005-12-28 Aleksey Demakov * jit/jit-rules-x86.sel: implement JIT_OP_MEMMOVE rule. Get rid of compiler warnings in JIT_OP_MEMSET. 2005-12-24 Avinash Atreya * dpas/dpas-parser.y: implement array expressions (committed by Aleksey Demakov, jit_insn_throw replaced with throw_builtin_exception) 2005-12-24 Aleksey Demakov * include/jit/jit-except.h, jit/jit-except.c (jit_exception_builtin): add JIT_RESULT_OUT_OF_BOUNDS builtin exception type code. * dpas/dpas-parser.y (throw_builtin_exception): add static function that makes jit_exception_builtin call. * jit/jit-cache.c (_jit_cache_get_start_method): add function that for an address in cache returns the start address of the block that contains it. * jit/jit-except.c (jit_stack_trace_get_offset): use _jit_cache_get_start_method function instead of cache_start field. * jit/jit-internal.h, jit/jit-function.c (jit_function_compile): remove cache_start field to the jit_function struct. 2005-12-22 Aleksey Demakov * jit/jit-rules-x86.sel: implement JIT_OP_MEMSET and JIT_OP_MEMCPY rules optimized for small constant size blocks. 2005-12-20 Aleksey Demakov * jit/jit-gen-x86.h (x86_fld_memindex, x86_fld80_memindex) (x86_fst_memindex, x86_fst80_memindex): add floating point load and store macros with memindex addressing. * jit/jit-rules-x86.sel: optimize floating point element load and store rules. Fix potential register allocation problems. 2005-12-18 Aleksey Demakov * jit/jit-internal.h, jit/jit-function.c (jit_function_compile): Add cache_start field to the jit_function struct, set it to the start of the function code cache. * jit/jit-except.c (jit_stack_trace_get_offset): implement the function. 2005-12-15 Aleksey Demakov * jit/jit-insn.c (jit_insn_address_of): return null if the value is constant. 2005-12-15 Avinash Atreya * jit/jit-insn.c: Store constants to a temporary to obtain address of constant values (Gopal). 2005-12-13 Aleksey Demakov * configure.in: Added --enable-long-double option that forces jit_nfloat to be long double. * jit/jit-apply-x86.h (jit_builtin_apply, jit_builtin_return_float): In gcc/Win32 and gcc/non-Win32 versions of the macros check the size of jit_nfloat and use fstpl/fldl or fstpt/fldt instructions accordingly. * tools/gen-apply.c (detect_float_return): On x86 only the first 10 bytes of 12 byte long doubles are significant and are used for comparison. 2005-12-12 Aleksey Demakov * jit/jit-dump.c (dump_object_code): in order to make dump work on cygwin call "as" and "objdump" in two separate system() calls because it looks like the ';' separator between commands does not work there. Also on Win32 use TMP and TEMP environment variables as the tmp directory names and fallback to "c:/tmp". * jit/jit-gen-x86.h (jit_assert): change the macro definition to resolve problems introduced at 2005-12-10. 2005-12-10 Aleksey Demakov * jit/jit-gen-x86.h: Merged changes from the latest Mono project's version of this file. * jit/jit-rules-x86.sel: Done the following rules: JIT_OP_LOAD_ELEMENT_FLOAT32, JIT_OP_LOAD_ELEMENT_FLOAT64, JIT_OP_LOAD_ELEMENT_NFLOAT, JIT_OP_STORE_ELEMENT_LONG, JIT_OP_STORE_ELEMENT_FLOAT32, JIT_OP_STORE_ELEMENT_FLOAT64, JIT_OP_STORE_ELEMENT_NFLOAT. 2005-11-19 Klaus Treichel * jit/apply-x86-64.h: Change definition of JIT_MEMCPY from "jit_memcpy" to "jit_memcpy@PLT" to fix the build of a shared library for x86_64. 2004-11-18 Rhys Weatherley * include/jit/jit-opcode.h, jit/jit-dump.c, jit/jit-insn.c, jit/jit-interp.c, jit/jit-opcode.c, jit/jit-rules-interp.c, jit/jit-rules-x86.sel: implement tail calls properly. 2004-11-05 Evin Robertson * jit/jit-insn.c (jit_insn_store): use the destination type to determine the store opcode, not the source value type. 2004-11-02 Evin Robertson * jit/jit-function.c (jit_function_compile): clear block addresses and fixup lists if we need to restart on a new cache page (minor alterations by Rhys). * jit/jit-function.c (jit_function_apply_vararg): return 0 when a sub-function throws an exception, not 1. 2004-10-31 Rhys Weatherley * jit/jit-rules-x86.sel: handle the special case of constant destination pointers in "store_relative" instructions, because otherwise the register allocator gets confused. 2004-10-29 Peter Lund * doc/libjit.3: fix manpage formatting issues. (patch attached to bug #10779, Gopal). 2004-10-28 Rhys Weatherley * configure.in, jit/jit-debugger.c, jit/jit-thread.c, jit/jit-thread.h: implement some of the locking code for the debugging API. 2004-10-12 Evin Robertson * jit/jit-rules-x86.c (output_branch): correct the offset when outputting a long-form backward branch. * tests/Makefile.am, tests/loop.pas: test case for the long-form backward branch bug. 2004-10-06 Rhys Weatherley * doc/Makefile.am, doc/libjit.texi, include/jit/Makefile.am, include/jit/jit-common.h, include/jit/jit-context.h, include/jit/jit-debugger.h, include/jit/jit-except.h, include/jit/jit-function.h, include/jit/jit.h, jit/Makefile.am, jit/jit-context.c, jit/jit-debug.c, jit/jit-debugger.c, jit/jit-insn.c, jit/jit-internal.h, jit/jit-interp.c: redesign the debugger API so that it contains functions like "add breakpoint", "run", "step", etc that more closely resemble what a front end debugger will want to have, shifting the implementation burden off the front end. 2004-10-04 Rhys Weatherley * include/jit/jit-function.h, include/jit/jit-insn.h, include/jit/jit-opcode.h, include/jit/jit-plus.h, jit/jit-function.c, jit/jit-insn.c, jit/jit-internal.h, jit/jit-interp.c, jit/jit-opcode.c, jit/jit-rules-interp.c, jit/jit-rules-arm.sel, jit/jit-rules-x86.sel, jitplus/jit-plus-function.cpp: add instructions and function API's for supporting debug line numbers and breakpoints. * doc/Makefile.am, doc/libjit.texi, include/jit/jit-context.h, include/jit/jit-insn.h, include/jit/jit-opcode.h, include/jit/jit-plus.h, jit/Makefile.am, jit/jit-context.c, jit/jit-debug.c, jit/jit-function.c, jit/jit-insn.c, jit/jit-internal.h, jit/jit-interp.c, jit/jit-opcode.c, jit/jit-rules-arm.sel, jit/jit-rules-interp.c, jit/jit-rules-x86.sel, jitplus/jit-plus-function.cpp: clean up the breakpoint API and implement debug hooks for the interpreter. * jit/jit-insn.c, jit/jit-rules-arm.sel, jit/jit-rules-x86.sel: use a common helper function for performing debug hook tests on native platforms, to avoid the need to implement breakpoint testing individually in every native back end. 2004-09-10 Rhys Weatherley * jit/jit-rules-x86.sel: pointer-relative loads and stores for structures in the x86 back end. 2004-09-09 Rhys Weatherley * jit/jit-rules-x86.c, jit/jit-rules-x86.sel: add some support for structure copying to the x86 back end. 2004-09-06 Rhys Weatherley * jit/jit-rules-interp.c: the pointer value for indirect and vtable calls was being pushed onto the stack twice. 2004-09-05 Norbert Bollow * samples/hellovm.c: add a sample program that demonstrates a simple VM based on libjit (committed by Rhys). 2004-08-30 Rhys Weatherley * jit-rules-x86.sel: fix x86 code generation for floating-point return instructions. 2004-08-16 Rhys Weatherley * jit/jit-cpuid-x86.c (cpuid_query): use %ebx in a way that doesn't confuse PIC mode in some versions of gcc (bug #10022). 2004-08-13 Rhys Weatherley * include/jit/jit-insn.h, include/jit/jit-opcode.h, include/jit/jit-plus.h, jit/jit-insn.c, jit/jit-internal.h, jit/jit-interp.h, jit/jit-opcode.c, jit/jit-rules-interp.c, jitplus/jit-plus-function.cpp: re-implement the "push_return_area_ptr" patch so as to avoid wasting stack space in functions with more than one native function call. 2004-08-12 Rhys Weatherley * jit/jit-rules-interp.c: account for the extra value that is added to the stack by the "push_return_area_ptr" instruction. 2004-08-08 Rhys Weatherley * configure.in, NEWS: update version for the "0.0.4" release. * configure.in: updating working version to "0.0.5". 2004-08-05 Rhys Weatherley * doc/Makefile.am, doc/README, doc/libjit.texi, jit/jit-dump.c, jit/jit-insn.c: documentation updates. * dpas/Makefile.am, tools/Makefile.am: support for parallel builds. 2004-08-04 Rhys Weatherley * jit/jit-opcode.c: fix the operand types for "call_vtable_ptr". 2004-06-25 Rhys Weatherley * tools/gen-apply.c: fix a crash in gen-apply under x86-64. * jit/jit-apply-func.h, jit/jit-apply-x86-64.h, tools/gen-apply.c: write an x86-64 assembly version of "__builtin_apply", because the version inside gcc has an unusable register ordering. 2004-06-24 Rhys Weatherley * jit/jit-reg-alloc.c, jit/jit-rules-arm.h, jit/jit-rules-interp.c, jit/jit-rules-interp.h, jit/jit-rules-x86.h, jit/jit-rules.h: use separate JIT_REG_xxx flags for float32, float64, and nfloat because some platforms need to put these values in different types of registers (e.g. x86-64). 2004-06-22 Rhys Weatherley * jit/jit-insn.c: properly set the "may_throw" flag for opcodes that throw exceptions and which are also supported by the back end. 2004-06-21 Rhys Weatherley * jit/jit-rules-x86.c, jit/jit-rules-x86.sel: move the code for loading/storing small structures into a central location. 2004-06-18 Rhys Weatherley * jit/jit-dump.c, jit/jit-reg-alloc.c, jit/jit-rules-arm.c, jit/jit-rules-arm.h, jit/jit-rules-x86.c, jit/jit-rules-x86.h, jit/jit-rules-x86.sel, jit/jit-rules.c, jit/jit-rules.h, tests/param.pas: rewrite the x86 and ARM parameter handling routines to centralise the code and fix several bugs; add new tests for fastcall and stdcall conventions. 2004-06-17 Rhys Weatherley * jit/jit-reg-alloc.c (_jit_regs_set_outgoing): pass 64-bit "fastcall" parameters in ECX:EDX, not in ECX:EBX. * tools/gen-apply.c: allow floating-point values to be passed in "fastcall" registers. 2004-06-16 Rhys Weatherley * tools/gen-sel-parser.y: add a missing semi-colon. 2004-06-14 Rhys Weatherley * dpas/dpas-internal.h, dpas/dpas-parser.y, dpas/dpas-scanner.l, jit/jit-rules-x86.c, jit/jit-rules-x86.sel, tests/Makefile.am, tests/param.pas, tools/gen-apply.c: add some test cases for parameter passing; fix fastcall/stdcall conventions for x86. * jit/jit-rules-arm.h, jit/jit-rules-arm.sel, jit/jit-rules-x86.h, jit/jit-rules-x86.sel, tools/gen-sel-parser.y: enable register allocation for 64-bit values under x86 and ARM; expand some 64-bit opcodes in the instruction selectors. 2004-06-12 Rhys Weatherley * jit/jit-insn.c, jit/jit-rules-x86.c, jit/jit-rules-x86.sel: implement or stub missing x86 instruction selection rules. * include/jit/jit-insn.h, include/jit/jit-opcode.h, include/jit/jit-plus.h, jit/jit-function.c, jit/jit-insn.c, jit/jit-interp.c, jit/jit-opcode.c, jit/jit-rules-interp.c, jitplus/jit-plus-function.cpp: add the "outgoing_frame_posn" instruction, to support tail calls. 2004-06-11 Rhys Weatherley * doc/libjit.texi, jit/jit-insn.c, jit/jit-internal.h, jit/jit-reg-alloc.c, jit/jit-rules-arm.c, jit/jit-rules-arm.sel, jit/jit-rules-interp.c, jit/jit-rules-x86.c, jit/jit-rules-x86.sel, jit/jit-rules.h, jit/jit-value.c, tutorial/Makefile.am, tutorial/t2.c, tutorial/t5.c: implement tail calls from a function to itself. * jit/jit-function.c, jit/jit-reg-alloc.c, jit/jit-rules-arm.c, jit/jit-rules-interp.c, jit/jit-rules-x86.c, jit/jit-rules.h: implement global register allocation for parameters in stack slots. * jit/jit-rules-x86.c, jit/jit-rules-x86.sel, jit/jit-rules.h: optimize the x86 function epilog when we are certain that the stack height doesn't change between entry and exit (i.e. the function is a leaf and there are no alloca's). 2004-06-10 Rhys Weatherley * jit/jit-apply-arm.c, jit/jit-gen-arm.c, jit/jit-gen-arm.h, jit/jit-rules-arm.c, jit/jit-rules-arm.h, jit/jit-rules-arm.sel, tools/gen-sel-parser.y: redesign the ARM code generation macros so that they have stronger protection against buffer overruns. * jit/jit-rules-arm.sel: flush the constant pool after unconditional branches, to try to minimize the probability that the pool will be flushed in the middle of a loop body. * jit/jit-dump.c: dump the hex address of external functions, to aid with debugging native disassembly dumps. * include/jit/jit-insn.h, include/jit/jit-opcode.h, include/jit/jit-plus.h, jit/jit-insn.c, jit/jit-internal.h, jit/jit-interp.c, jit/jit-opcode.c, jit/jit-rules-arm.c, jit/jit-rules-arm.sel, jitplus/jit-plus-function.cpp: add support for outgoing parameter areas, which should reduce the overhead of function calls that involve stacked arguments on non-x86 platforms; use parameter areas in the ARM back end. * include/jit/jit-plus.h, include/jit/jit-value.h, jit/jit-insn.c, jit/jit-internal.h, jit/jit-reg-alloc.c, jit/jit-rules-x86.c, jit/jit-value.c: don't over-allocate x86 stack frames if EBX, ESI, and EDI don't need to be saved; don't perform global register allocation on stacked parameters because it confuses the register spill logic. * jit/jit-reg-alloc.c (_jit_regs_load_value): avoid unnecessary spills if a temporary value won't be used again in the current block. 2004-06-09 Rhys Weatherley * jit/jit-rules-arm.c (flush_constants): update the instruction location after flushing the constant table. * jit/jit-gen-arm.h: fix some bugs in the encoding of floating-point load and store instructions. * jit/jit-gen-arm.c (_arm_alu_reg_imm): forgot to update the instruction pointer when loading the immediate value. * jit/jit-gen-arm.c: optimize the use of rotated immediate values. * jit/jit-rules-arm.c (_jit_gen_load_value): use ARM register pairs properly for "long" and "float64" values. 2004-06-08 Rhys Weatherley * jit/Makefile.am, jit/jit-cpuid-x86.c, jit/jit-cpuid-x86.h: add an API for querying the x86 "cpuid" information. * include/jit/jit-opcode.h, jit/jit-interp.c, jit/jit-opcode.c: remove obsolete opcodes which violate "_jit_load_opcode"'s rules. * jit/jit-reg-alloc.c, jit/jit-rules-x86.c, jit/jit-rules-x86.sel: more x86 instruction selection rules. * jit/jit-reg-alloc.c (_jit_regs_set_outgoing): implement missing function. * jit/jit-gen-arm.h (arm_call): use a more efficient form of call for offsets beyond the simple target range. * jit/jit-rules-arm.sel, tools/gen-sel-parser.y, tools/gen-sel-scanner.l: introduce conditional rules into "gen-sel" so that we can disable certain rules on ARM platforms that lack floating-point support. * jit/jit-rules-arm.c (_jit_gen_spill_reg): spill properly to global registers for ARM. * jit/jit-reg-alloc.c, jit/jit-rules-arm.c, jit/jit-rules-arm.sel, jit/jit-rules-x86.sel: minor register assignment bugs. * jit/jit-rules-arm.c: ARM parameters cannot be split between registers and the stack. * jit/jit-gen-arm.c, jit/jit-gen-arm.h, jit/jit-rules-arm.c, jit/jit-rules-arm.h, jit/jit-rules-arm.sel: implement a constant pool for ARM, which gets complicated constants out of the main stream of execution. 2004-06-08 Miroslaw Dobrzanski-Neumann * jit/jit-alloc.c: fix ROUND_END_PTR so that it adds the size after casting to jit_nuint. 2004-06-07 Thong Nguyen * configure.in, jit/jit-insn.c: add "_setjmp" to the list of names to try to work around the "setjmp" macro (needed for Win32). 2004-06-07 Rhys Weatherley * tools/gen-apply.c: gen-apply fixes for Alpha platforms. * jit/jit-interp.c: alignment problem with "push_const_float32" on 64-bit platforms. * jit/jit-intrinsic.c: work around a SIGFPE for sqrt(-1) on Alpha; it should return NaN instead. * jit/jit-value.c: fix a warning. * configure.in, jit/jit-insn.c: use "sigsetjmp" instead of "setjmp", because "setjmp" may be a macro on some systems. * jit-gen-arm.h: add floating-point instruction macros. * jit/jit-gen-arm.h, jit/jit-rules-arm.c, jit/jit-rules-arm.h, jit/jit-rules-arm.sel: expand floating-point instructions for ARM. * jit/jit-rules-x86.c: fix misnaming of jit_type_get_abi, jit_abi_stdcall, and jit_abi_fastcall. * tools/gen-apply-macosx.h, tools/gen-apply.c: bypass the auto-detection logic in gen-apply under MacOSX because it doesn't work with Apple's version of gcc. * tools/gen-apply.c: gen-apply fix for ia64. * jit/jit-alloc.c (jit_flush_exec): warning fix for ia64. 2004-06-06 Miroslaw Dobrzanski-Neumann * jit/jit-alloc.c (jit_flush_exec): flush cache lines properly if the start is not on a line boundary. 2004-06-06 Rhys Weatherley * jit/jit-reg-alloc.c, jit/jit-reg-alloc.h, jit/jit-rules-arm.c, jit/jit-rules-arm.sel, jit/jit-rules-x86.c, jit/jit-rules-x86.sel: add some more instructions to the ARM back end; split some x86 back end code out into common code for ARM to use as well. 2004-06-02 Rhys Weatherley * jit/jit-function.c, jit/jit-insn.c, jit/jit-internal.h, jit/jit-reg-alloc.c, jit/jit-reg-alloc.h, jit/jit-rules-arm.c, jit/jit-rules-arm.h, jit/jit-rules-interp.c, jit/jit-rules-interp.h, jit/jit-rules-x86.c, jit/jit-rules-x86.h, jit/jit-rules.h, jit/jit-value.c, tools/gen-sel-parser.y: implement a simple global register allocation policy, based on usage counts. * jit/jit-reg-alloc.c (_jit_regs_load_value): if a value is in a global register and it is not going to be destroyed by an instruction, then use the global register as the operand. * jit/jit-insn.c: recognise "t = a op b; a = t" and turn it into "a = a op b" to make it easier for back ends to recognise special idioms such as increments and decrements. 2004-06-01 Rhys Weatherley * jit/jit-cache.c, jit/jit-elf-read.c, tools/gen-apply.c: fix some gcc 3.x compile warnings. * jit/jit-rules-arm.c, jit/jit-rules-arm.sel: more instruction selection rules for ARM. * configure.in, jit/jit-rules.h: enable the x86 back end by default on platforms where it makes sense, and add the option "--enable-interpreter" to "configure". 2004-05-31 Rhys Weatherley * jit/jit-rules-x86.sel: optimize multiplications for x86. * jit/jit-rules-x86.c, jit/jit-rules-x86.sel, tools/gen-sel-parser.y, tools/gen-sel-scanner.l: inline and optimize divisions for x86. * jit/jit-rules-x86.sel: throw exceptions correctly for "check_null". 2004-05-30 Rhys Weatherley * doc/libjit.texi: clarify the text that describes LLVM, at the request of Chris Lattner, LLVM's author. * jit/jit-insn.c (jit_insn_convert): use intrinsic functions for conversions when the back end doesn't support the opcode. * jit/jit-rules-x86.sel, tools/gen-sel-parser.y, tools/gen-sel-scanner.l: improve instruction selection for floating-point "push" operations. * include/jit/jit-insn.h, jit/jit-insn.c, jit/jit-internal.h, jit/jit-rules-x86.c: add "jit_insn_defer_pop_stack" and "jit_insn_flush_defer_pop", to defer the popping of function call arguments as long as possible. * jit/jit-rules-x86.sel: fix a cpu vs non-cpu register problem in the floating-point "push" operations for x86. 2004-05-29 Rhys Weatherley * jit/jit-insn.c, jit/jit-reg-alloc.c, jit/jit-reg-alloc.h, jit/jit-rules-x86.c, jit/jit-rules-x86.sel: continue the x86 back end; particularly byte/short stores. * jit/jit-rules-x86.sel: stub out JIT_OP_RETURN_REG, which doesn't need any special handling for x86. 2004-05-27 Rhys Weatherley * tools/gen-apply.c: split "detect_struct_conventions" up a bit more to (hopefully) prevent problems under MacOSX; fix a bug in the generation of "jit_apply_builder_align_regs" that affected ARM and PPC systems. * dpas/dpas-types.c (dpas_type_identical): treat "float64" and "nfloat" as identical on platforms whose "long double" type is the same as "double". * jit/jit-rules-x86.c, jit/jit-rules-x86.sel, tools/gen-sel-parser.y, tools/gen-sel-scanner.l: relative loads and stores for x86. 2004-05-26 Rhys Weatherley * jit/jit-insn.c, jit/jit-rules-x86.c, jit/jit-rules-x86.sel, jit/jit-rules.h, tools/gen-sel-parser.y: fix some compile issues in the x86 native back end. * jit/jit-function.c, jit/jit-rules-x86.c, jit/jit-rules-x86.sel, tools/gen-sel-parser.y: more bug fixes for the x86 back end. * include/jit/jit-insn.h, include/jit/jit-plus.h, jit/jit-insn.c, jitplus/jit-plus-function.cpp: add "jit_insn_new_block" to simplify creating a new block that doesn't have an explicit label. * dpas/dpas-parser.y, include/jit/jit-block.h, jit/jit-block.c, jit/jit-insn.c: add "jit_block_current_is_dead" to simplify testing if the last block is reachable or not, taking empty trailing blocks into account. * jit/jit-rules-x86.c, jit/jit-rules-x86.sel, tools/gen-sel-parser.y, tools/gen-sel-scanner.l: more selection cases for the x86 back end. * jit/Makefile.am, jit/jit-gen-arm.h, jit/jit-rules-arm.c, jit/jit-rules-arm.sel: add the beginnings of the instruction selector for ARM. 2004-05-25 Rhys Weatherley * tools/.cvsignore, tools/Makefile.am, tools/gen-sel-parser.y, tools/gen-sel-scanner.l: add the "gen-sel" program to the tree, to assist with building native instruction selectors. * jit/.cvsignore, jit/Makefile.am, jit/jit-rules-x86.c, jit/jit-rules-x86.sel, tools/gen-sel-parser.y: check in the initial instruction selector for x86 (incomplete). * jit/jit-rules-x86.sel, tools/gen-sel-parser.y, tools/gen-sel-scanner.l: selectors for branch instructions. * jit/jit-rules-x86.sel: selectors for call instructions. 2004-05-24 Rhys Weatherley * include/jit/jit-insn.h, include/jit/jit-opcode.h, jit/jit-block.c, jit/jit-dump.c, jit/jit-except.c, jit/jit-function.c, jit/jit-insn.c, jit/jit-internal.h, jit/jit-interp.c, jit/jit-interp.h, jit/jit-opcode.c, jit/jit-rules-arm.c, jit/jit-rules-interp.c, jit/jit-rules-x86.c, jit/jit-rules.h, jit/jit-setjmp.h: rewrite the exception region routines to make them easier to use from CLI and JVM style systems. * jit/jit-rules-interp.c (_jit_gen_start_block): set the address of the exception handler for interpreted code. * include/jit/jit-plus.h, jitplus/jit-plus-function.cpp: add missing functions to the C++ API. 2004-05-22 Rhys Weatherley * jit/jit-block.c (_jit_block_peephole_branch): don't allow conditional branches to cross an exception context boundary, because doing so will violate "finally" semantics. * dpas/dpas-parser.y, include/jit/jit-insn.h, jit/jit-function.c, jit/jit-insn.c, jit/jit-internal.h: rename "jit_insn_move_blocks" to "jit_insn_move_blocks_to_end" and add a new function "jit_insn_move_blocks_to_start" for creating initialization code. * include/jit/jit-opcode.h, jit/jit-except.c, jit/jit-function.c, jit/jit-insn.c, jit/jit-internal.h, jit/jit-interp.c, jit/jit-opcode.c, jit/jit-setjmp.h: modify the function call logic to use "setjmp" with native back ends. 2004-05-21 Rhys Weatherley * jit/jit-gen-arm.c, jit/jit-gen-arm.h: modify the ARM codegen macros so that they can be used for branch elimination. * include/jit/jit-except.h, jit/jit-except.cpp, jit/jit-function.c, jit/jit-insn.c, jit/jit-internal.h, jit/jit-interp.cpp, jit/jit-interp.h, jit/jit-setjmp.h: redesign the exception handling mechanism to use "setjmp" rather than C++ exceptions. * configure.in, doc/Makefile.am, doc/libjit.texi, dpas/Makefile.am, jit/Makefile.am, jit/jit-except.c, jit/jit-except.cpp, jit/jit-interp.c, jit/jit-interp.cpp, jitdynamic/Makefile.am: remove the last remaining C++ code from libjit.so so that it is now a pure C library. * include/jit/jit-insn.h, include/jit/jit-opcode.h, include/jit/jit-plus.h, jit/jit-insn.c, jit/jit-interp.c, jit/jit-opcode.c, jitplus/jit-plus-function.cpp: add the "jit_insn_alloca" instruction. * configure.in, jit/.cvsignore, jit/Makefile.am, jit/jit-interp.c, jit/mklabel.sh: use computed goto's in the interpreter if supported by the underlying compiler. 2004-05-20 Rhys Weatherley * include/jit/jit-value.h, jit/jit-insn.c, jit/jit-value.c: convert constant conditional branches such as "if true goto L" into unconditional branches. * jit/jit-block.c, jit/jit-internal.h, jit/jit-live.c, jit/jit-rules-interp.c: perform peephole optimization of branches to branches before live variable analysis, so that the back ends don't need to worry about jump threading. * jit/jit-block.c, jit/jit-live.c: treat dead blocks as empty when peepholing branches to the next block. 2004-05-15 Rhys Weatherley * tools/gen-apply.c: fix a macro generation bug for Win32 systems. * jit/jit-reg-alloc.c: fix a compile bug. 2004-05-14 Rhys Weatherley * include/jit/Makefile.am, include/jit/jit-objmodel-private.h, include/jit/jit-objmodel.h, include/jit/jit.h, jit/Makefile.am, jit/jit-objmodel.c: put some infrastructure in place to support pluggable object models. 2004-05-13 Rhys Weatherley * dpas/dpas-parser.y, dpas/dpas-types.c, dpas/dpas-types.h: put some infrastructure (incomplete) in place to support array index expressions. * configure.in, NEWS: update version for the "0.0.2" release. * configure.in: updating working version to "0.0.3". 2004-05-12 Rhys Weatherley * jitdynamic/Makefile.am, jitplus/Makefile.am: use both .libs and non.libs versions of the so paths, because some versions of libtool add .libs implicitly and others don't. * dpas/dpas-builtin.c, dpas/dpas-parser.y, dpas/dpas-types.c, dpas/dpas-types.h: add the "SameType" and "SameShape" builtins, to assist with unit testing type coercions. * dpas/dpas-parser.y (IfTail): fix a bug that caused the "then" case of an "if" to fall through to the "else". * dpas/dpas-parser.y: resolve ea-based lvalues in operators. * include/jit/jit-defs.h.in: incorrect values for jit_max_int and jit_max_long. * dpas/dpas-scanner.l (dpas_parse_hex): ignore the 'H' on the end of a hexadecimal constant. * Makefile.am, configure.in, tests/.cvsignore, tests/Makefile.am, tests/coerce.pas: check in some initial infrastructure for the dpas-based test suite. * jit/jit-type.c (jit_type_promote_int): promote ubyte and ushort to uint, not int. * jit/jit-insn.c, tests/coerce.pas: more coercion test cases and fixes. * dpas/dpas-builtin.c, jit/jit-dump.c, jit/jit-value.c: add builtins for mathematical operations. * dpas/dpas-parser.y, jit/jit-interp.cpp, tests/Makefile.am, tests/math.pas: test cases and bug fixes for mathematical operations. * dpas/dpas-main.c, include/jit/jit-context.h, jit/jit-context.c, jit/jit-insn.c, tests/Makefile.am: add the "--dont-fold" option to Dynamic Pascal, so that we can run the test cases without folding. * tests/README: add a README file to describe how to write test cases. 2004-05-11 Rhys Weatherley * include/jit/jit-insn.h, jit/jit-insn.c, jit/jit-interp.cpp, jit/jit-interp.h, jit/jit-opcode.c, jit/jit-rules-interp.c: round out the function call handling opcodes for the interpreter. * jit/jit-rules-interp.c, jit/jit-rules-interp.h: implement the exception-handling opcodes for the interpreter. * dpas/dpas-parser.y, dpas/dpas-scope.c, dpas/dpas-scope.h: fix a bug that caused global variables in Dynamic Pascal to be incorrectly allocated as locals. * jit/jit-reg-alloc.c (_jit_regs_load_to_top_two): handle the case where the second value is on the stack but not the first. * dpas/dpas-parser.y, dpas/dpas-types.c, dpas/dpas-types.h: report errors for unimplemented expressions and statements, so that users are not "surprised" when things silently fail. * .cvsignore, auto_gen.sh, configure.in, doc/.cvsignore, dpas/.cvsignore, dpas/Makefile.am, include/.cvsignore, jit/.cvsignore, jit/Makefile.am, jitdynamic/.cvsignore, jitdynamic/Makefile.am, jitplus/.cvsignore, jitplus/Makefile.am, tools/.cvsignore, tutorial/.cvsignore, tutorial/Makefile.am: modify the autoconf/automake build system to use libtool. 2004-05-10 Rhys Weatherley * jit/jit-reg-alloc.c, jit/jit-reg-alloc.h, jit/jit-rules-interp.c: interpreter code conversion for relative pointer and copy opcodes; fix some bugs in stack-based register allocation. * dpas/dpas-parser.y, dpas/dpas-types.c, dpas/dpas-types.h: loading and storing record fields in Dynamic Pascal. * dpas/dpas-builtin.c: implement the "New" and "Dispose" builtins. 2004-05-08 Rhys Weatherley * jit/jit-cache.c, jit/jit-cache.h, jit/jit-dump.c, jit/jit-interp.h, jit/jit-rules-interp.c: add "_jit_cache_get_end_method", to allow the end of a method's code to be located without explicit marking. * configure.in, include/jit/jit-util.h, jit/jit-string.c: remove the locale-sensitive string comparison routines because they aren't used in libjit, and front ends will normally have their own functions for this purpose. * Makefile.am, configure.in, doc/Makefile.am, doc/libjit.texi, include/jit/Makefile.am, include/jit/jit-dynamic.h, include/jit/jit-util.h, jit/Makefile.am, jit/jit-dynlib.c, jit/jit-mangle.c, jitdynamic/.cvsignore, jitdynamic/Makefile.am, jitdynamic/jit-cpp-mangle.c, jitdynamic/jit-dynlib.c: move the dynlib and C++ name mangling routines into a separate "jitdynamic" library, which will handle all of the cross-language naming and dynamic invocation logic. * include/jit/jit-type.h, jit/jit-internal.h, jit/jit-type.c, jitdynamic/jit-cpp-mangle.c: move the "JIT_TYPE_xxx" constants into the public headers and add "jit_type_get_kind" so that front end code can classify types quickly. * jit/jit-dump.c: use "objdump" to dump compiled native code. 2004-05-07 Rhys Weatherley * dpas/dpas-function.c, dpas/dpas-internal.h, dpas/dpas-main.c, dpas/dpas-parser.y, jit/jit-interp.cpp, jit/jit-interp.h, jit/jit-opcode.c, jit/jit-rules-interp.c: execute the "main" method once a Dynamic Pascal program has been compiled; fix some calling convention problems with "call_external". * dpas/dpas-builtin.c, dpas/dpas-scanner.l: add the "Flush" and "Terminate" builtins; fix a small bug in string scanning. * include/jit/jit-elf.h, jit/Makefile.am, jit/jit-context.c, jit/jit-elf-read.c, jit/jit-internal.h, jit/jit-symbol.c: implement symbol relocations for the ELF binary reader. * dpas/dpas-parser.y: code generation for "for" loops. 2004-05-06 Rhys Weatherley * dpas/Makefile.am, dpas/dpas-builtin.c, dpas/dpas-function.c, dpas/dpas-internal.h, dpas/dpas-main.c, dpas/dpas-parser.y, dpas/dpas-scope.c, dpas/dpas-scope.h, dpas/dpas-semantics.h, dpas/dpas-types.c, dpas/dpas-types.h, include/jit/jit-block.h, include/jit/jit-insn.h, include/jit/jit-plus.h, jit/jit-block.c, jit/jit-dump.c, jit/jit-function.c, jit/jit-insn.c, jit/jit-interp.cpp, jit/jit-opcode.c, jit/jit-rules-arm.c, jit/jit-rules-interp.c, jit/jit-rules-x86.c, jit/jit-type.c, jit/jit-value.c, jitplus/jit-plus-function.cpp: get basic compilation working in Dynamic Pascal. 2004-05-03 Rhys Weatherley * tools/gen-apply.c: improve the maintainability of the apply macros. * include/jit/jit-block.h, include/jit/jit-context.h, include/jit/jit-dump.h, include/jit/jit-elf.h, include/jit/jit-init.h, include/jit/jit-meta.h, include/jit/jit-type.h, include/jit/jit-util.h, jit/jit-type.c, jit/jit-value.c: add more instances of JIT_NOTHROW to the headers; add some special meta tags for types. * include/jit/jit-type.h, jit/jit-type.c: tag the system-dependent types so that they can be distinguished from the fixed-sized types when it is necessary to do so. * jit/Makefile.am, jit/jit-mangle.c: add the beginnings of a C++ name mangler, to help with extracting C++ symbols from dynamic shared libraries. * doc/Makefile.am, doc/libjit.texi, doc/mangling_rules.txt, include/jit/jit-type.h, include/jit/jit-util.h, jit/jit-mangle.c, jit/jit-type.c: continue the implementation of the C++ name mangling routines. 2004-05-01 Rhys Weatherley * jit/jit-apply-x86.c, jit/jit-rules-x86.c, tools/gen-apply.c: fix function prolog and epilog handling for structure returns under x86/cdecl. * configure.in: set the initial working version to 0.0.1. * jit/jit-rules-x86.c: implement x86 code generation for some of the basic operators. * include/jit/jit-insn.h, include/jit/jit-opcode.h, include/jit/jit-plus.h, jit/jit-insn.c, jit/jit-interp.cpp, jit/jit-opcode.c, jit/jit-reg-alloc.c, jit/jit-reg-alloc.h, jit/jit-rules-interp.c, jitplus/jit-plus-function.cpp: add array access instructions. * tools/gen-apply.c: clean up the builder/parser macros and detect padding of the floating-point registers. 2004-04-30 Rhys Weatherley * include/jit/jit-function.h, include/jit/jit-insn.h, include/jit/jit-opcode.h, include/jit/jit-plus.h, jit/jit-except.cpp, jit/jit-function.c, jit/jit-insn.c, jit/jit-internal.h, jit/jit-interp.cpp, jit/jit-interp.h, jit/jit-opcode.c, jit/jit-rules-arm.c, jit/jit-rules-interp.c, jit/jit-rules-x86.c, jit/jit-rules.h, jitplus/jit-plus-function.cpp: put some infrastructure in place to support "try"-related instructions. * dpas/dpas-parser.y, dpas/dpas-scope.h, dpas/dpas-semantics.h: introduce effective address based l-values into dpas. 2004-04-27 Rhys Weatherley * jit/jit-dump.c, jit/jit-reg-alloc.c: fix a register stack bug in "_jit_regs_set_value"; add some more debug code. * include/jit/jit-opcode.h, jit/jit-insn.c, jit/jit-internal.h, jit/jit-interp.cpp, jit/jit-opcode.c: wrap function calls with code to set up and remove exception frame information. * jit/jit-function.c, jit/jit-insn.c, jit/jit-internal.h: intuit "nothrow" and "noreturn" flags for compiled functions. * include/jit/jit-insn.h, include/jit/jit-plus.h, jit/jit-insn.c, jitplus/jit-plus-function.cpp: add "jit_insn_throw", "jit_insn_rethrow", and "jit_insn_get_call_stack" to assist with throwing exceptions. * include/jit/jit-insn.h, jit/jit-block.c, jit/jit-insn.c, jit/jit-internal.h: add some instructions for managing "try" blocks. * include/jit/jit-opcode.h, jit/jit-block.c, jit/jit-insn.c, jit/jit-internal.h, jit/jit-opcode.c: more work on "try" blocks. 2004-04-26 Rhys Weatherley * jit/jit-reg-alloc.c, jit/jit-reg-alloc.h: add functions to assist with register allocation on stack-based architectures. * jit/jit-rules-interp.c: implement "_jit_gen_load_value" for the interpreter backend. * jit/jit-interp.cpp, jit/jit-interp.h: fix some opcode names that should be prefixed with "JIT_OP". * jit/jit-function.c, jit/jit-internal.h, jit/jit-reg-alloc.c, jit/jit-reg-alloc.h, jit/jit-rules-arm.c, jit/jit-rules-interp.c, jit/jit-rules-interp.h, jit/jit-rules-x86.c, jit/jit-rules.h: interpreter back end code generation for binary, unary, and branch opcodes. * doc/libjit.texi, jit/jit-rules-interp.c: fix the Texinfo section markers in the "Porting" chapter. * jit/jit-rules-interp.c: code generation for interpreter return's. * include/jit/jit-except.h, include/jit/jit-function.h, include/jit/jit-plus.h, jit/jit-except.cpp, jit/jit-function.c, jit/jit-interp.cpp, jit/jit-interp.h, jit/jit-rules-interp.c, jitplus/jit-plus-function.cpp: implement "jit_function_apply" and "jit_function_apply_vararg" for the interpreter back end. * jitplus/jit-plus-function.cpp: initialization errors in the C++ binding. * jit/jit-function.c, jit/jit-insn.c, jit/jit-interp.cpp, jit/jit-rules-interp.c: work on code generation for function calls. * doc/libjit.texi, include/jit/jit-insn.h, include/jit/jit-plus.h, jit/jit-insn.c, jitplus/jit-plus-function.cpp, tutorial/t2.c: add a "flags" parmeter to "jit_insn_call" and friends, so that "nothrow", "noreturn", and "tail" options can be supplied. * jit/jit-dump.c, jit/jit-interp.cpp, jit/jit-interp.h, jit/jit-opcode.c, jit/jit-rules-interp.c: dump the translated native code from "jit_dump_function" are compilation. * jit/jit-interp.cpp, jit/jit-rules-interp.c: argument variable offsets should in item units, not byte units. * jit/jit-insn.c, jit/jit-reg-alloc.c, jit/jit-reg-alloc.h, jit/jit-rules-interp.c: improve register allocation in stacks. 2004-04-25 Rhys Weatherley * jit/jit-apply-func.h, jit/jit-apply-x86.c, jit/jit-apply-x86.h, jit/jit-cache.c: use CPU-specifc padding for aligning code areas with NOP's, for greater runtime efficiency. * include/jit/jit-elf.h, jit/Makefile.am, jit/jit-elf-write.c: add the skeleton of the ELF writing routines. * jit/jit-interp.cpp: modify VM_BR_TARGET so that it is PIC-friendly. 2004-04-24 Rhys Weatherley * */*: Initial public release. Most of the skeleton code is in place.