1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-28 05:50:30 +02:00

Big merge with new lightning semantics aiming for lightning 2.0.

2012-12-02 Paulo Andrade <pcpa@gnu.org>

	* tests/Makefile.am, tests/3to2.c, tests/3to2.ok, tests/add.c,
	tests/add.ok, tests/allocai.c, tests/allocai.ok, tests/bp.c,
	tests/bp.ok, tests/divi.c, tests/divi.ok, tests/fib.c, tests/fib.ok,
	tests/fibdelay.c, tests/fibdelay.ok, tests/fibit.c, tests/fibit.ok,
	tests/funcfp.c, tests/funcfp.ok, tests/incr.c, tests/incr.ok,
	tests/ldst.c, tests/ldst.ok, tests/ldxi.c, tests/ldxi.ok,
	tests/modi.c, tests/modi.ok, tests/movi.c, tests/movi.ok,
	tests/printf.c, tests/printf.ok, tests/printf2.c, tests/printf2.ok,
	tests/ret.c, tests/ret.ok, tests/rpn.c, tests/rpn.ok, tests/rpnfp.c,
	tests/rpnfp.ok, tests/sete.c, tests/sete.ok, tests/testfp.c,
	tests/testfp.ok, tests-run-test: Removed previous test suite, in
	favor of a newer one in the check subdirectory.

	* check/3to2.ok, check/3to2.tst, check/add.ok, check/add.tst,
	check/allocai.ok, check/allocai.tst, check/bp.ok, check/bp.tst,
	check/divi.ok, check/divi.tst, check/fib.ok, check/fib.tst:
	New sample input for the new test program, loosely matching
	several of the previous test cases.

	* check/Makefile.am: New test suite makefile.

	* check/check.sh, check/run-test: New wrapper files for the
	new test suite.

	* check/lightning.c: New file. The main driver of the new test
	suite, that compiles to a parser of a very simple assembly like
	language, generates jit and executes it.

	* check/all.tst: New file. A generic debug and sample test file
	with a directive to prevent it from being executed, and useful to
	read disassembly of all possible instructions, using a fixed set
	of registers.

	* include/Makefile.am, include/lightning.h,
	include/lightning/Makefile.am, include/lightning/jit_arm.h,
	include/lightning/jit_mips.h, include/lightning/jit_ppc.h,
	include/lightning/jit_private.h, include/lightning/jit_x86.h,
	lib/Makefile.am, lib/jit_disasm.c, lib/jit_print.c,
	lib/jit_x86-cpu.c, lib/jit_x86-sse.c, lib/jit_x86-x87.c,
	lib/jit_x86.c, lib/lightning.c: New files. These files are
	written from scratch, only by <pcpa@gnu.org>, and have now
	copyright assignment to the FSF. This is the core of the new
	lightning rework. Previously it was integrated in code with
	a garbage collector and several custom types like vectors and
	hash tables, so this first code merge with lightning converts
	that code into a library extracting only the jit bits, and at
	first only for x86_64 GNU/Linux.

	* lightning.h, m4/lightning.m4: Removed. These are no longer
	required in the new lightning code.

	.gitignore, Makefile.am, configure.ac: Update for the new
	lightning code.
This commit is contained in:
pcpa 2012-12-02 19:44:36 -02:00
parent 75d99beb21
commit 7a1c455237
77 changed files with 17194 additions and 8221 deletions

17
include/Makefile.am Normal file
View file

@ -0,0 +1,17 @@
#
# Copyright 2000, 2001, 2002, 2012 Free Software Foundation, Inc.
#
# This is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This software is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
include_HEADERS = lightning.h
SUBDIRS = \
lightning

852
include/lightning.h Normal file
View file

@ -0,0 +1,852 @@
/*
* Copyright (C) 2012 Free Software Foundation, Inc.
*
* This is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* Authors:
* Paulo Cesar Pereira de Andrade
*/
#ifndef _lightning_h
#define _lightning_h
#include <unistd.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#ifndef __WORDSIZE
# define __WORDSIZE WORDSIZE
#endif
#ifndef __BYTE_ORDER
# define __BYTE_ORDER BYTE_ORDER
#endif
#ifndef __LITTLE_ENDIAN
# define __LITTLE_ENDIAN LITTLE_ENDIAN
#endif
#ifndef __BIG_ENDIAN
# define __BIG_ENDIAN BIG_ENDIAN
#endif
typedef signed char jit_int8_t;
typedef unsigned char jit_uint8_t;
typedef signed short jit_int16_t;
typedef unsigned short jit_uint16_t;
typedef signed int jit_int32_t;
typedef unsigned int jit_uint32_t;
#if __WORDSIZE == 32
typedef signed long long jit_int64_t;
typedef unsigned long long jit_uint64_t;
typedef jit_int32_t jit_word_t;
typedef jit_uint32_t jit_uword_t;
#else
typedef signed long jit_int64_t;
typedef unsigned long jit_uint64_t;
typedef jit_int64_t jit_word_t;
typedef jit_uint64_t jit_uword_t;
#endif
typedef float jit_float32_t;
typedef double jit_float64_t;
typedef void* jit_pointer_t;
typedef jit_int32_t jit_bool_t;
typedef jit_int32_t jit_gpr_t;
typedef jit_int32_t jit_fpr_t;
#if defined(__i386__) || defined(__x86_64__)
# include <lightning/jit_x86.h>
#elif defined(__mips__)
# include <lightning/jit_mips.h>
#elif defined(__arm__)
# include <lightning/jit_arm.h>
#elif defined(__ppc__)
# include <lightning/jit_ppc.h>
#endif
#define jit_flag_node 0x00000001 /* patch node not absolute */
#define jit_flag_patch 0x00000002 /* jump already patched */
#define jit_flag_data 0x00000004 /* data in the constant pool */
#define jit_flag_use 0x00000008 /* do not remove marker label */
#define jit_flag_head 0x00100000 /* label reached by normal flow */
#define JIT_R(index) jit_r(index)
#define JIT_V(index) jit_v(index)
#define JIT_F(index) jit_f(index)
#define JIT_R_NUM jit_r_num()
#define JIT_V_NUM jit_v_num()
#define JIT_F_NUM jit_f_num()
#define jit_class_chk 0x02000000 /* just checking */
#define jit_class_arg 0x08000000 /* argument register */
#define jit_class_sav 0x10000000 /* callee save */
#define jit_class_gpr 0x20000000 /* general purpose */
#define jit_class_fpr 0x40000000 /* float */
#define jit_class(reg) ((reg) & 0xffff0000)
#define jit_regno(reg) ((reg) & 0x00007fff)
#define jit_call_default 0
/* assume only varags functions called are printf like, that is,
* without a declared float/double argument */
/* FIXME currently no way to create a varargs (or non varargs) jit function
* if calling sequence changes for float/double arguments */
#define jit_call_varargs 1
typedef struct jit_node jit_node_t;
typedef struct jit_state jit_state_t;
typedef enum {
#define jit_data(u,v) _jit_data(_jit,u,v)
jit_code_data,
jit_code_save, jit_code_load,
#define jit_note(u) jit_new_node_ww(jit_code_note,0,(jit_word_t)u)
#define jit_label() _jit_label(_jit)
#define jit_forward() _jit_forward(_jit)
#define jit_link(u) _jit_link(_jit,u)
jit_code_note, jit_code_label,
#define jit_prolog() _jit_prolog(_jit)
jit_code_prolog,
#define jit_allocai(u) _jit_allocai(_jit,u)
#define jit_arg() _jit_arg(_jit)
#define jit_getarg_c(u,v) _jit_getarg_c(_jit,u,v)
#define jit_getarg_uc(u,v) _jit_getarg_uc(_jit,u,v)
#define jit_getarg_s(u,v) _jit_getarg_s(_jit,u,v)
#define jit_getarg_us(u,v) _jit_getarg_us(_jit,u,v)
#define jit_getarg_i(u,v) _jit_getarg_i(_jit,u,v)
/* >> 64 bit */
#define jit_getarg_ui(u,v) _jit_getarg_ui(_jit,u,v)
#define jit_getarg_l(u,v) _jit_getarg_l(_jit,u,v)
/* << 64 bit */
#if __WORDSIZE == 32
# define jit_getarg(u,v) jit_getarg_i(u,v)
#else
# define jit_getarg(u,v) jit_getarg_l(u,v)
#endif
#define jit_addr(u,v,w) jit_new_node_www(jit_code_addr,u,v,w)
#define jit_addi(u,v,w) jit_new_node_www(jit_code_addi,u,v,w)
jit_code_addr, jit_code_addi,
#define jit_addxr(u,v,w) jit_new_node_www(jit_code_addxr,u,v,w)
#define jit_addxi(u,v,w) jit_new_node_www(jit_code_addxi,u,v,w)
jit_code_addxr, jit_code_addxi,
#define jit_addcr(u,v,w) jit_new_node_www(jit_code_addcr,u,v,w)
#define jit_addci(u,v,w) jit_new_node_www(jit_code_addci,u,v,w)
jit_code_addcr, jit_code_addci,
#define jit_subr(u,v,w) jit_new_node_www(jit_code_subr,u,v,w)
#define jit_subi(u,v,w) jit_new_node_www(jit_code_subi,u,v,w)
jit_code_subr, jit_code_subi,
#define jit_subxr(u,v,w) jit_new_node_www(jit_code_subxr,u,v,w)
#define jit_subxi(u,v,w) jit_new_node_www(jit_code_subxi,u,v,w)
jit_code_subxr, jit_code_subxi,
#define jit_subcr(u,v,w) jit_new_node_www(jit_code_subcr,u,v,w)
#define jit_subci(u,v,w) jit_new_node_www(jit_code_subci,u,v,w)
jit_code_subcr, jit_code_subci,
#define jit_mulr(u,v,w) jit_new_node_www(jit_code_mulr,u,v,w)
#define jit_muli(u,v,w) jit_new_node_www(jit_code_muli,u,v,w)
jit_code_mulr, jit_code_muli,
#define jit_divr(u,v,w) jit_new_node_www(jit_code_divr,u,v,w)
#define jit_divi(u,v,w) jit_new_node_www(jit_code_divi,u,v,w)
jit_code_divr, jit_code_divi,
#define jit_divr_u(u,v,w) jit_new_node_www(jit_code_divr_u,u,v,w)
#define jit_divi_u(u,v,w) jit_new_node_www(jit_code_divi_u,u,v,w)
jit_code_divr_u, jit_code_divi_u,
#define jit_remr(u,v,w) jit_new_node_www(jit_code_remr,u,v,w)
#define jit_remi(u,v,w) jit_new_node_www(jit_code_remi,u,v,w)
jit_code_remr, jit_code_remi,
#define jit_remr_u(u,v,w) jit_new_node_www(jit_code_remr_u,u,v,w)
#define jit_remi_u(u,v,w) jit_new_node_www(jit_code_remi_u,u,v,w)
jit_code_remr_u, jit_code_remi_u,
#define jit_andr(u,v,w) jit_new_node_www(jit_code_andr,u,v,w)
#define jit_andi(u,v,w) jit_new_node_www(jit_code_andi,u,v,w)
jit_code_andr, jit_code_andi,
#define jit_orr(u,v,w) jit_new_node_www(jit_code_orr,u,v,w)
#define jit_ori(u,v,w) jit_new_node_www(jit_code_ori,u,v,w)
jit_code_orr, jit_code_ori,
#define jit_xorr(u,v,w) jit_new_node_www(jit_code_xorr,u,v,w)
#define jit_xori(u,v,w) jit_new_node_www(jit_code_xori,u,v,w)
jit_code_xorr, jit_code_xori,
#define jit_lshr(u,v,w) jit_new_node_www(jit_code_lshr,u,v,w)
#define jit_lshi(u,v,w) jit_new_node_www(jit_code_lshi,u,v,w)
jit_code_lshr, jit_code_lshi,
#define jit_rshr(u,v,w) jit_new_node_www(jit_code_rshr,u,v,w)
#define jit_rshi(u,v,w) jit_new_node_www(jit_code_rshi,u,v,w)
jit_code_rshr, jit_code_rshi,
#define jit_rshr_u(u,v,w) jit_new_node_www(jit_code_rshr_u,u,v,w)
#define jit_rshi_u(u,v,w) jit_new_node_www(jit_code_rshi_u,u,v,w)
jit_code_rshr_u, jit_code_rshi_u,
#define jit_negr(u,v) jit_new_node_ww(jit_code_negr,u,v)
#define jit_comr(u,v) jit_new_node_ww(jit_code_comr,u,v)
jit_code_negr, jit_code_comr,
#define jit_ltr(u,v,w) jit_new_node_www(jit_code_ltr,u,v,w)
#define jit_lti(u,v,w) jit_new_node_www(jit_code_lti,u,v,w)
jit_code_ltr, jit_code_lti,
#define jit_ltr_u(u,v,w) jit_new_node_www(jit_code_ltr_u,u,v,w)
#define jit_lti_u(u,v,w) jit_new_node_www(jit_code_lti_u,u,v,w)
jit_code_ltr_u, jit_code_lti_u,
#define jit_ler(u,v,w) jit_new_node_www(jit_code_ler,u,v,w)
#define jit_lei(u,v,w) jit_new_node_www(jit_code_lei,u,v,w)
jit_code_ler, jit_code_lei,
#define jit_ler_u(u,v,w) jit_new_node_www(jit_code_ler_u,u,v,w)
#define jit_lei_u(u,v,w) jit_new_node_www(jit_code_lei_u,u,v,w)
jit_code_ler_u, jit_code_lei_u,
#define jit_eqr(u,v,w) jit_new_node_www(jit_code_eqr,u,v,w)
#define jit_eqi(u,v,w) jit_new_node_www(jit_code_eqi,u,v,w)
jit_code_eqr, jit_code_eqi,
#define jit_ger(u,v,w) jit_new_node_www(jit_code_ger,u,v,w)
#define jit_gei(u,v,w) jit_new_node_www(jit_code_gei,u,v,w)
jit_code_ger, jit_code_gei,
#define jit_ger_u(u,v,w) jit_new_node_www(jit_code_ger_u,u,v,w)
#define jit_gei_u(u,v,w) jit_new_node_www(jit_code_gei_u,u,v,w)
jit_code_ger_u, jit_code_gei_u,
#define jit_gtr(u,v,w) jit_new_node_www(jit_code_gtr,u,v,w)
#define jit_gti(u,v,w) jit_new_node_www(jit_code_gti,u,v,w)
jit_code_gtr, jit_code_gti,
#define jit_gtr_u(u,v,w) jit_new_node_www(jit_code_gtr_u,u,v,w)
#define jit_gti_u(u,v,w) jit_new_node_www(jit_code_gti_u,u,v,w)
jit_code_gtr_u, jit_code_gti_u,
#define jit_ner(u,v,w) jit_new_node_www(jit_code_ner,u,v,w)
#define jit_nei(u,v,w) jit_new_node_www(jit_code_nei,u,v,w)
jit_code_ner, jit_code_nei,
#define jit_movr(u,v) jit_new_node_ww(jit_code_movr,u,v)
#define jit_movi(u,v) jit_new_node_ww(jit_code_movi,u,v)
jit_code_movr, jit_code_movi,
#define jit_extr_c(u,v) jit_new_node_ww(jit_code_extr_c,u,v)
#define jit_extr_uc(u,v) jit_new_node_ww(jit_code_extr_uc,u,v)
jit_code_extr_c, jit_code_extr_uc,
#define jit_extr_s(u,v) jit_new_node_ww(jit_code_extr_s,u,v)
#define jit_extr_us(u,v) jit_new_node_ww(jit_code_extr_us,u,v)
jit_code_extr_s, jit_code_extr_us,
/* >> 64 bit */
#define jit_extr_i(u,v) jit_new_node_ww(jit_code_extr_i,u,v)
#define jit_extr_ui(u,v) jit_new_node_ww(jit_code_extr_ui,u,v)
jit_code_extr_i, jit_code_extr_ui,
/* << 64 bit */
#define jit_htonr(u,v) jit_new_node_ww(jit_code_htonr,u,v)
#define jit_ntohr(u,v) jit_new_node_ww(jit_code_htonr,u,v)
jit_code_htonr,
#define jit_ldr_c(u,v) jit_new_node_ww(jit_code_ldr_c,u,v)
#define jit_ldi_c(u,v) jit_new_node_ww(jit_code_ldi_c,u,v)
jit_code_ldr_c, jit_code_ldi_c,
#define jit_ldr_uc(u,v) jit_new_node_ww(jit_code_ldr_uc,u,v)
#define jit_ldi_uc(u,v) jit_new_node_ww(jit_code_ldi_uc,u,v)
jit_code_ldr_uc, jit_code_ldi_uc,
#define jit_ldr_s(u,v) jit_new_node_ww(jit_code_ldr_s,u,v)
#define jit_ldi_s(u,v) jit_new_node_ww(jit_code_ldi_s,u,v)
jit_code_ldr_s, jit_code_ldi_s,
#define jit_ldr_us(u,v) jit_new_node_ww(jit_code_ldr_us,u,v)
#define jit_ldi_us(u,v) jit_new_node_ww(jit_code_ldi_us,u,v)
jit_code_ldr_us, jit_code_ldi_us,
#define jit_ldr_i(u,v) jit_new_node_ww(jit_code_ldr_i,u,v)
#define jit_ldi_i(u,v) jit_new_node_ww(jit_code_ldi_i,u,v)
jit_code_ldr_i, jit_code_ldi_i,
#if __WORDSIZE == 32
# define jit_ldr(u,v) jit_ldr_i(u,v)
# define jit_ldi(u,v) jit_ldi_i(u,v)
#else
# define jit_ldr(u,v) jit_ldr_l(u,v)
# define jit_ldi(u,v) jit_ldi_l(u,v)
#endif
/* >> 64 bit */
#define jit_ldr_ui(u,v) jit_new_node_ww(jit_code_ldr_ui,u,v)
#define jit_ldi_ui(u,v) jit_new_node_ww(jit_code_ldi_ui,u,v)
jit_code_ldr_ui, jit_code_ldi_ui,
#define jit_ldr_l(u,v) jit_new_node_ww(jit_code_ldr_l,u,v)
#define jit_ldi_l(u,v) jit_new_node_ww(jit_code_ldi_l,u,v)
jit_code_ldr_l, jit_code_ldi_l,
/* << 64 bit */
#define jit_ldxr_c(u,v,w) jit_new_node_www(jit_code_ldxr_c,u,v,w)
#define jit_ldxi_c(u,v,w) jit_new_node_www(jit_code_ldxi_c,u,v,w)
jit_code_ldxr_c, jit_code_ldxi_c,
#define jit_ldxr_uc(u,v,w) jit_new_node_www(jit_code_ldxr_uc,u,v,w)
#define jit_ldxi_uc(u,v,w) jit_new_node_www(jit_code_ldxi_uc,u,v,w)
jit_code_ldxr_uc, jit_code_ldxi_uc,
#define jit_ldxr_s(u,v,w) jit_new_node_www(jit_code_ldxr_s,u,v,w)
#define jit_ldxi_s(u,v,w) jit_new_node_www(jit_code_ldxi_s,u,v,w)
jit_code_ldxr_s, jit_code_ldxi_s,
#define jit_ldxr_us(u,v,w) jit_new_node_www(jit_code_ldxr_us,u,v,w)
#define jit_ldxi_us(u,v,w) jit_new_node_www(jit_code_ldxi_us,u,v,w)
jit_code_ldxr_us, jit_code_ldxi_us,
#define jit_ldxr_i(u,v,w) jit_new_node_www(jit_code_ldxr_i,u,v,w)
#define jit_ldxi_i(u,v,w) jit_new_node_www(jit_code_ldxi_i,u,v,w)
jit_code_ldxr_i, jit_code_ldxi_i,
#if __WORDSIZE == 32
# define jit_ldxr(u,v,w) jit_ldxr_i(u,v,w)
# define jit_ldxi(u,v,w) jit_ldxi_i(u,v,w)
#else
# define jit_ldxr_ui(u,v,w) jit_new_node_www(jit_code_ldxr_ui,u,v,w)
# define jit_ldxi_ui(u,v,w) jit_new_node_www(jit_code_ldxi_ui,u,v,w)
# define jit_ldxr_l(u,v,w) jit_new_node_www(jit_code_ldxr_l,u,v,w)
# define jit_ldxi_l(u,v,w) jit_new_node_www(jit_code_ldxi_l,u,v,w)
# define jit_ldxr(u,v,w) jit_ldxr_l(u,v,w)
# define jit_ldxi(u,v,w) jit_ldxi_l(u,v,w)
#endif
jit_code_ldxr_ui, jit_code_ldxi_ui,
jit_code_ldxr_l, jit_code_ldxi_l,
#define jit_str_c(u,v) jit_new_node_ww(jit_code_str_c,u,v)
#define jit_sti_c(u,v) jit_new_node_ww(jit_code_sti_c,u,v)
jit_code_str_c, jit_code_sti_c,
#define jit_str_s(u,v) jit_new_node_ww(jit_code_str_s,u,v)
#define jit_sti_s(u,v) jit_new_node_ww(jit_code_sti_s,u,v)
jit_code_str_s, jit_code_sti_s,
#define jit_str_i(u,v) jit_new_node_ww(jit_code_str_i,u,v)
#define jit_sti_i(u,v) jit_new_node_ww(jit_code_sti_i,u,v)
jit_code_str_i, jit_code_sti_i,
#if __WORDSIZE == 32
# define jit_str(u,v) jit_str_i(u,v)
# define jit_sti(u,v) jit_sti_i(u,v)
#else
#define jit_str(u,v) jit_str_l(u,v)
#define jit_sti(u,v) jit_sti_l(u,v)
#endif
/* >> 64 bit */
#define jit_str_l(u,v) jit_new_node_ww(jit_code_str_l,u,v)
#define jit_sti_l(u,v) jit_new_node_ww(jit_code_sti_l,u,v)
jit_code_str_l, jit_code_sti_l,
/* << 64 bit */
#define jit_stxr_c(u,v,w) jit_new_node_www(jit_code_stxr_c,u,v,w)
#define jit_stxi_c(u,v,w) jit_new_node_www(jit_code_stxi_c,u,v,w)
jit_code_stxr_c, jit_code_stxi_c,
#define jit_stxr_s(u,v,w) jit_new_node_www(jit_code_stxr_s,u,v,w)
#define jit_stxi_s(u,v,w) jit_new_node_www(jit_code_stxi_s,u,v,w)
jit_code_stxr_s, jit_code_stxi_s,
#define jit_stxr_i(u,v,w) jit_new_node_www(jit_code_stxr_i,u,v,w)
#define jit_stxi_i(u,v,w) jit_new_node_www(jit_code_stxi_i,u,v,w)
jit_code_stxr_i, jit_code_stxi_i,
#if __WORDSIZE == 32
# define jit_stxr(u,v,w) jit_stxr_i(u,v,w)
# define jit_stxi(u,v,w) jit_stxi_i(u,v,w)
#else
# define jit_stxr_l(u,v,w) jit_new_node_www(jit_code_stxr_l,u,v,w)
# define jit_stxi_l(u,v,w) jit_new_node_www(jit_code_stxi_l,u,v,w)
#endif
/* >> 64 bit */
#define jit_stxr(u,v,w) jit_stxr_l(u,v,w)
#define jit_stxi(u,v,w) jit_stxi_l(u,v,w)
jit_code_stxr_l, jit_code_stxi_l,
/* << 64 bit */
#define jit_bltr(v,w) jit_new_node_pww(jit_code_bltr,NULL,v,w)
#define jit_blti(v,w) jit_new_node_pww(jit_code_blti,NULL,v,w)
jit_code_bltr, jit_code_blti,
#define jit_bltr_u(v,w) jit_new_node_pww(jit_code_bltr_u,NULL,v,w)
#define jit_blti_u(v,w) jit_new_node_pww(jit_code_blti_u,NULL,v,w)
jit_code_bltr_u, jit_code_blti_u,
#define jit_bler(v,w) jit_new_node_pww(jit_code_bler,NULL,v,w)
#define jit_blei(v,w) jit_new_node_pww(jit_code_blei,NULL,v,w)
jit_code_bler, jit_code_blei,
#define jit_bler_u(v,w) jit_new_node_pww(jit_code_bler_u,NULL,v,w)
#define jit_blei_u(v,w) jit_new_node_pww(jit_code_blei_u,NULL,v,w)
jit_code_bler_u, jit_code_blei_u,
#define jit_beqr(v,w) jit_new_node_pww(jit_code_beqr,NULL,v,w)
#define jit_beqi(v,w) jit_new_node_pww(jit_code_beqi,NULL,v,w)
jit_code_beqr, jit_code_beqi,
#define jit_bger(v,w) jit_new_node_pww(jit_code_bger,NULL,v,w)
#define jit_bgei(v,w) jit_new_node_pww(jit_code_bgei,NULL,v,w)
jit_code_bger, jit_code_bgei,
#define jit_bger_u(v,w) jit_new_node_pww(jit_code_bger_u,NULL,v,w)
#define jit_bgei_u(v,w) jit_new_node_pww(jit_code_bgei_u,NULL,v,w)
jit_code_bger_u, jit_code_bgei_u,
#define jit_bgtr(v,w) jit_new_node_pww(jit_code_bgtr,NULL,v,w)
#define jit_bgti(v,w) jit_new_node_pww(jit_code_bgti,NULL,v,w)
jit_code_bgtr, jit_code_bgti,
#define jit_bgtr_u(v,w) jit_new_node_pww(jit_code_bgtr_u,NULL,v,w)
#define jit_bgti_u(v,w) jit_new_node_pww(jit_code_bgti_u,NULL,v,w)
jit_code_bgtr_u, jit_code_bgti_u,
#define jit_bner(v,w) jit_new_node_pww(jit_code_bner,NULL,v,w)
#define jit_bnei(v,w) jit_new_node_pww(jit_code_bnei,NULL,v,w)
jit_code_bner, jit_code_bnei,
#define jit_bmsr(v,w) jit_new_node_pww(jit_code_bmsr,NULL,v,w)
#define jit_bmsi(v,w) jit_new_node_pww(jit_code_bmsi,NULL,v,w)
jit_code_bmsr, jit_code_bmsi,
#define jit_bmcr(v,w) jit_new_node_pww(jit_code_bmcr,NULL,v,w)
#define jit_bmci(v,w) jit_new_node_pww(jit_code_bmci,NULL,v,w)
jit_code_bmcr, jit_code_bmci,
#define jit_boaddr(v,w) jit_new_node_pww(jit_code_boaddr,NULL,v,w)
#define jit_boaddi(v,w) jit_new_node_pww(jit_code_boaddi,NULL,v,w)
jit_code_boaddr, jit_code_boaddi,
#define jit_boaddr_u(v,w) jit_new_node_pww(jit_code_boaddr_u,NULL,v,w)
#define jit_boaddi_u(v,w) jit_new_node_pww(jit_code_boaddi_u,NULL,v,w)
jit_code_boaddr_u, jit_code_boaddi_u,
#define jit_bxaddr(v,w) jit_new_node_pww(jit_code_bxaddr,NULL,v,w)
#define jit_bxaddi(v,w) jit_new_node_pww(jit_code_bxaddi,NULL,v,w)
jit_code_bxaddr, jit_code_bxaddi,
#define jit_bxaddr_u(v,w) jit_new_node_pww(jit_code_bxaddr_u,NULL,v,w)
#define jit_bxaddi_u(v,w) jit_new_node_pww(jit_code_bxaddi_u,NULL,v,w)
jit_code_bxaddr_u, jit_code_bxaddi_u,
#define jit_bosubr(v,w) jit_new_node_pww(jit_code_bosubr,NULL,v,w)
#define jit_bosubi(v,w) jit_new_node_pww(jit_code_bosubi,NULL,v,w)
jit_code_bosubr, jit_code_bosubi,
#define jit_bosubr_u(v,w) jit_new_node_pww(jit_code_bosubr_u,NULL,v,w)
#define jit_bosubi_u(v,w) jit_new_node_pww(jit_code_bosubi_u,NULL,v,w)
jit_code_bosubr_u, jit_code_bosubi_u,
#define jit_bxsubr(v,w) jit_new_node_pww(jit_code_bxsubr,NULL,v,w)
#define jit_bxsubi(v,w) jit_new_node_pww(jit_code_bxsubi,NULL,v,w)
jit_code_bxsubr, jit_code_bxsubi,
#define jit_bxsubr_u(v,w) jit_new_node_pww(jit_code_bxsubr_u,NULL,v,w)
#define jit_bxsubi_u(v,w) jit_new_node_pww(jit_code_bxsubi_u,NULL,v,w)
jit_code_bxsubr_u, jit_code_bxsubi_u,
#define jit_jmpr(u) jit_new_node_w(jit_code_jmpr,u)
#define jit_jmpi() jit_new_node_p(jit_code_jmpi,NULL)
jit_code_jmpr, jit_code_jmpi,
#define jit_callr(u) jit_new_node_w(jit_code_callr,u)
#define jit_calli(u) jit_new_node_p(jit_code_calli,u)
jit_code_callr, jit_code_calli,
#define jit_prepare(u) _jit_prepare(_jit,u)
#define jit_pushargr(u) _jit_pushargr(_jit,u)
#define jit_pushargi(u) _jit_pushargi(_jit,u)
#define jit_finishr(u) _jit_finishr(_jit,u)
#define jit_finishi(u) _jit_finishi(_jit,u)
#define jit_ret() _jit_ret(_jit)
#define jit_retr(u) _jit_retr(_jit,u)
#define jit_reti(u) _jit_reti(_jit,u)
#define jit_retval_c(u) _jit_retval_c(_jit,u)
#define jit_retval_uc(u) _jit_retval_uc(_jit,u)
#define jit_retval_s(u) _jit_retval_s(_jit,u)
#define jit_retval_us(u) _jit_retval_us(_jit,u)
#define jit_retval_i(u) _jit_retval_i(_jit,u)
/* >> 64 bit */
#define jit_retval_ui(u) _jit_retval_ui(_jit,u)
#define jit_retval_l(u) _jit_retval_l(_jit,u)
/* << 64 bit */
#if __WORDSIZE == 32
# define jit_retval(u) jit_retval_i(u)
#else
# define jit_retval(u) jit_retval_l(u)
#endif
/* Usually should not need to call directly, but useful if need
* to get a label just before a jit_prolog() call */
#define jit_epilog() _jit_epilog(_jit)
jit_code_epilog,
#define jit_arg_f() _jit_arg_f(_jit)
#define jit_getarg_f(u,v) _jit_getarg_f(_jit,u,v)
#define jit_addr_f(u,v,w) jit_new_node_www(jit_code_addr_f,u,v,w)
#define jit_addi_f(u,v,w) jit_new_node_wwf(jit_code_addi_f,u,v,w)
jit_code_addr_f, jit_code_addi_f,
#define jit_subr_f(u,v,w) jit_new_node_www(jit_code_subr_f,u,v,w)
#define jit_subi_f(u,v,w) jit_new_node_wwf(jit_code_subi_f,u,v,w)
jit_code_subr_f, jit_code_subi_f,
#define jit_mulr_f(u,v,w) jit_new_node_www(jit_code_mulr_f,u,v,w)
#define jit_muli_f(u,v,w) jit_new_node_wwf(jit_code_muli_f,u,v,w)
jit_code_mulr_f, jit_code_muli_f,
#define jit_divr_f(u,v,w) jit_new_node_www(jit_code_divr_f,u,v,w)
#define jit_divi_f(u,v,w) jit_new_node_wwf(jit_code_divi_f,u,v,w)
jit_code_divr_f, jit_code_divi_f,
#define jit_negr_f(u,v) jit_new_node_ww(jit_code_negr_f,u,v)
#define jit_absr_f(u,v) jit_new_node_ww(jit_code_absr_f,u,v)
#define jit_sqrtr_f(u,v) jit_new_node_ww(jit_code_sqrtr_f,u,v)
jit_code_negr_f, jit_code_absr_f, jit_code_sqrtr_f,
#define jit_ltr_f(u,v,w) jit_new_node_www(jit_code_ltr_f,u,v,w)
#define jit_lti_f(u,v,w) jit_new_node_wwf(jit_code_lti_f,u,v,w)
jit_code_ltr_f, jit_code_lti_f,
#define jit_ler_f(u,v,w) jit_new_node_www(jit_code_ler_f,u,v,w)
#define jit_lei_f(u,v,w) jit_new_node_wwf(jit_code_lei_f,u,v,w)
jit_code_ler_f, jit_code_lei_f,
#define jit_eqr_f(u,v,w) jit_new_node_www(jit_code_eqr_f,u,v,w)
#define jit_eqi_f(u,v,w) jit_new_node_wwf(jit_code_eqi_f,u,v,w)
jit_code_eqr_f, jit_code_eqi_f,
#define jit_ger_f(u,v,w) jit_new_node_www(jit_code_ger_f,u,v,w)
#define jit_gei_f(u,v,w) jit_new_node_wwf(jit_code_gei_f,u,v,w)
jit_code_ger_f, jit_code_gei_f,
#define jit_gtr_f(u,v,w) jit_new_node_www(jit_code_gtr_f,u,v,w)
#define jit_gti_f(u,v,w) jit_new_node_wwf(jit_code_gti_f,u,v,w)
jit_code_gtr_f, jit_code_gti_f,
#define jit_ner_f(u,v,w) jit_new_node_www(jit_code_ner_f,u,v,w)
#define jit_nei_f(u,v,w) jit_new_node_wwf(jit_code_nei_f,u,v,w)
jit_code_ner_f, jit_code_nei_f,
#define jit_unltr_f(u,v,w) jit_new_node_www(jit_code_unltr_f,u,v,w)
#define jit_unlti_f(u,v,w) jit_new_node_wwf(jit_code_unlti_f,u,v,w)
jit_code_unltr_f, jit_code_unlti_f,
#define jit_unler_f(u,v,w) jit_new_node_www(jit_code_unler_f,u,v,w)
#define jit_unlei_f(u,v,w) jit_new_node_wwf(jit_code_unlei_f,u,v,w)
jit_code_unler_f, jit_code_unlei_f,
#define jit_uneqr_f(u,v,w) jit_new_node_www(jit_code_uneqr_f,u,v,w)
#define jit_uneqi_f(u,v,w) jit_new_node_wwf(jit_code_uneqi_f,u,v,w)
jit_code_uneqr_f, jit_code_uneqi_f,
#define jit_unger_f(u,v,w) jit_new_node_www(jit_code_unger_f,u,v,w)
#define jit_ungei_f(u,v,w) jit_new_node_wwf(jit_code_ungei_f,u,v,w)
jit_code_unger_f, jit_code_ungei_f,
#define jit_ungtr_f(u,v,w) jit_new_node_www(jit_code_ungtr_f,u,v,w)
#define jit_ungti_f(u,v,w) jit_new_node_wwf(jit_code_ungti_f,u,v,w)
jit_code_ungtr_f, jit_code_ungti_f,
#define jit_ltgtr_f(u,v,w) jit_new_node_www(jit_code_ltgtr_f,u,v,w)
#define jit_ltgti_f(u,v,w) jit_new_node_wwf(jit_code_ltgti_f,u,v,w)
jit_code_ltgtr_f, jit_code_ltgti_f,
#define jit_ordr_f(u,v,w) jit_new_node_www(jit_code_ordr_f,u,v,w)
#define jit_ordi_f(u,v,w) jit_new_node_wwf(jit_code_ordi_f,u,v,w)
jit_code_ordr_f, jit_code_ordi_f,
#define jit_unordr_f(u,v,w) jit_new_node_www(jit_code_unordr_f,u,v,w)
#define jit_unordi_f(u,v,w) jit_new_node_wwf(jit_code_unordi_f,u,v,w)
jit_code_unordr_f, jit_code_unordi_f,
#define jit_truncr_f_i(u,v) jit_new_node_ww(jit_code_truncr_f_i,u,v)
jit_code_truncr_f_i,
#if __WODSIZE == 32
# define jit_truncr_f(u,v) jit_truncr_f_i(u,v)
#else
# define jit_truncr_f(u,v) jit_truncr_f_l(u,v)
#endif
/* >> 64 bit */
#define jit_truncr_f_l(u,v) jit_new_node_ww(jit_code_truncr_f_l,u,v)
jit_code_truncr_f_l,
/* << 64 bit */
#define jit_extr_f(u,v) jit_new_node_ww(jit_code_extr_f,u,v)
#define jit_extr_d_f(u,v) jit_new_node_ww(jit_code_extr_d_f,u,v)
jit_code_extr_f, jit_code_extr_d_f,
#define jit_movr_f(u,v) jit_new_node_ww(jit_code_movr_f,u,v)
#define jit_movi_f(u,v) jit_new_node_wf(jit_code_movi_f,u,v)
jit_code_movr_f, jit_code_movi_f,
#define jit_ldr_f(u,v) jit_new_node_ww(jit_code_ldr_f,u,v)
#define jit_ldi_f(u,v) jit_new_node_ww(jit_code_ldi_f,u,v)
jit_code_ldr_f, jit_code_ldi_f,
#define jit_ldxr_f(u,v,w) jit_new_node_www(jit_code_ldxr_f,u,v,w)
#define jit_ldxi_f(u,v,w) jit_new_node_www(jit_code_ldxi_f,u,v,w)
jit_code_ldxr_f, jit_code_ldxi_f,
#define jit_str_f(u,v) jit_new_node_ww(jit_code_str_f,u,v)
#define jit_sti_f(u,v) jit_new_node_ww(jit_code_sti_f,u,v)
jit_code_str_f, jit_code_sti_f,
#define jit_stxr_f(u,v,w) jit_new_node_www(jit_code_stxr_f,u,v,w)
#define jit_stxi_f(u,v,w) jit_new_node_www(jit_code_stxi_f,u,v,w)
jit_code_stxr_f, jit_code_stxi_f,
#define jit_bltr_f(v,w) jit_new_node_pww(jit_code_bltr_f,NULL,v,w)
#define jit_blti_f(v,w) jit_new_node_pwf(jit_code_blti_f,NULL,v,w)
jit_code_bltr_f, jit_code_blti_f,
#define jit_bler_f(v,w) jit_new_node_pww(jit_code_bler_f,NULL,v,w)
#define jit_blei_f(v,w) jit_new_node_pwf(jit_code_blei_f,NULL,v,w)
jit_code_bler_f, jit_code_blei_f,
#define jit_beqr_f(v,w) jit_new_node_pww(jit_code_beqr_f,NULL,v,w)
#define jit_beqi_f(v,w) jit_new_node_pwf(jit_code_beqi_f,NULL,v,w)
jit_code_beqr_f, jit_code_beqi_f,
#define jit_bger_f(v,w) jit_new_node_pww(jit_code_bger_f,NULL,v,w)
#define jit_bgei_f(v,w) jit_new_node_pwf(jit_code_bgei_f,NULL,v,w)
jit_code_bger_f, jit_code_bgei_f,
#define jit_bgtr_f(v,w) jit_new_node_pww(jit_code_bgtr_f,NULL,v,w)
#define jit_bgti_f(v,w) jit_new_node_pwf(jit_code_bgti_f,NULL,v,w)
jit_code_bgtr_f, jit_code_bgti_f,
#define jit_bner_f(v,w) jit_new_node_pww(jit_code_bner_f,NULL,v,w)
#define jit_bnei_f(v,w) jit_new_node_pwf(jit_code_bnei_f,NULL,v,w)
jit_code_bner_f, jit_code_bnei_f,
#define jit_bunltr_f(v,w) jit_new_node_pww(jit_code_bunltr_f,NULL,v,w)
#define jit_bunlti_f(v,w) jit_new_node_pwf(jit_code_bunlti_f,NULL,v,w)
jit_code_bunltr_f, jit_code_bunlti_f,
#define jit_bunler_f(v,w) jit_new_node_pww(jit_code_bunler_f,NULL,v,w)
#define jit_bunlei_f(v,w) jit_new_node_pwf(jit_code_bunlei_f,NULL,v,w)
jit_code_bunler_f, jit_code_bunlei_f,
#define jit_buneqr_f(v,w) jit_new_node_pww(jit_code_buneqr_f,NULL,v,w)
#define jit_buneqi_f(v,w) jit_new_node_pwf(jit_code_buneqi_f,NULL,v,w)
jit_code_buneqr_f, jit_code_buneqi_f,
#define jit_bunger_f(v,w) jit_new_node_pww(jit_code_bunger_f,NULL,v,w)
#define jit_bungei_f(v,w) jit_new_node_pwf(jit_code_bungei_f,NULL,v,w)
jit_code_bunger_f, jit_code_bungei_f,
#define jit_bungtr_f(v,w) jit_new_node_pww(jit_code_bungtr_f,NULL,v,w)
#define jit_bungti_f(v,w) jit_new_node_pwf(jit_code_bungti_f,NULL,v,w)
jit_code_bungtr_f, jit_code_bungti_f,
#define jit_bltgtr_f(v,w) jit_new_node_pww(jit_code_bltgtr_f,NULL,v,w)
#define jit_bltgti_f(v,w) jit_new_node_pwf(jit_code_bltgti_f,NULL,v,w)
jit_code_bltgtr_f, jit_code_bltgti_f,
#define jit_bordr_f(v,w) jit_new_node_pww(jit_code_bordr_f,NULL,v,w)
#define jit_bordi_f(v,w) jit_new_node_pwf(jit_code_bordi_f,NULL,v,w)
jit_code_bordr_f, jit_code_bordi_f,
#define jit_bunordr_f(v,w) jit_new_node_pww(jit_code_bunordr_f,NULL,v,w)
#define jit_bunordi_f(v,w) jit_new_node_pwf(jit_code_bunordi_f,NULL,v,w)
jit_code_bunordr_f, jit_code_bunordi_f,
#define jit_pushargr_f(u) _jit_pushargr_f(_jit,u)
#define jit_pushargi_f(u) _jit_pushargi_f(_jit,u)
#define jit_retr_f(u) _jit_retr_f(_jit,u)
#define jit_reti_f(u) _jit_reti_f(_jit,u)
#define jit_retval_f(u) _jit_retval_f(_jit,u)
jit_code_retval_f,
#define jit_arg_d() _jit_arg_d(_jit)
#define jit_getarg_d(u,v) _jit_getarg_d(_jit,u,v)
#define jit_addr_d(u,v,w) jit_new_node_www(jit_code_addr_d,u,v,w)
#define jit_addi_d(u,v,w) jit_new_node_wwd(jit_code_addi_d,u,v,w)
jit_code_addr_d, jit_code_addi_d,
#define jit_subr_d(u,v,w) jit_new_node_www(jit_code_subr_d,u,v,w)
#define jit_subi_d(u,v,w) jit_new_node_wwd(jit_code_subi_d,u,v,w)
jit_code_subr_d, jit_code_subi_d,
#define jit_mulr_d(u,v,w) jit_new_node_www(jit_code_mulr_d,u,v,w)
#define jit_muli_d(u,v,w) jit_new_node_wwd(jit_code_muli_d,u,v,w)
jit_code_mulr_d, jit_code_muli_d,
#define jit_divr_d(u,v,w) jit_new_node_www(jit_code_divr_d,u,v,w)
#define jit_divi_d(u,v,w) jit_new_node_wwd(jit_code_divi_d,u,v,w)
jit_code_divr_d, jit_code_divi_d,
#define jit_negr_d(u,v) jit_new_node_ww(jit_code_negr_d,u,v)
#define jit_absr_d(u,v) jit_new_node_ww(jit_code_absr_d,u,v)
#define jit_sqrtr_d(u,v) jit_new_node_ww(jit_code_sqrtr_d,u,v)
jit_code_negr_d, jit_code_absr_d, jit_code_sqrtr_d,
#define jit_ltr_d(u,v,w) jit_new_node_www(jit_code_ltr_d,u,v,w)
#define jit_lti_d(u,v,w) jit_new_node_wwd(jit_code_lti_d,u,v,w)
jit_code_ltr_d, jit_code_lti_d,
#define jit_ler_d(u,v,w) jit_new_node_www(jit_code_ler_d,u,v,w)
#define jit_lei_d(u,v,w) jit_new_node_wwd(jit_code_lei_d,u,v,w)
jit_code_ler_d, jit_code_lei_d,
#define jit_eqr_d(u,v,w) jit_new_node_www(jit_code_eqr_d,u,v,w)
#define jit_eqi_d(u,v,w) jit_new_node_wwd(jit_code_eqi_d,u,v,w)
jit_code_eqr_d, jit_code_eqi_d,
#define jit_ger_d(u,v,w) jit_new_node_www(jit_code_ger_d,u,v,w)
#define jit_gei_d(u,v,w) jit_new_node_wwd(jit_code_gei_d,u,v,w)
jit_code_ger_d, jit_code_gei_d,
#define jit_gtr_d(u,v,w) jit_new_node_www(jit_code_gtr_d,u,v,w)
#define jit_gti_d(u,v,w) jit_new_node_wwd(jit_code_gti_d,u,v,w)
jit_code_gtr_d, jit_code_gti_d,
#define jit_ner_d(u,v,w) jit_new_node_www(jit_code_ner_d,u,v,w)
#define jit_nei_d(u,v,w) jit_new_node_wwd(jit_code_nei_d,u,v,w)
jit_code_ner_d, jit_code_nei_d,
#define jit_unltr_d(u,v,w) jit_new_node_www(jit_code_unltr_d,u,v,w)
#define jit_unlti_d(u,v,w) jit_new_node_wwd(jit_code_unlti_d,u,v,w)
jit_code_unltr_d, jit_code_unlti_d,
#define jit_unler_d(u,v,w) jit_new_node_www(jit_code_unler_d,u,v,w)
#define jit_unlei_d(u,v,w) jit_new_node_wwd(jit_code_unlei_d,u,v,w)
jit_code_unler_d, jit_code_unlei_d,
#define jit_uneqr_d(u,v,w) jit_new_node_www(jit_code_uneqr_d,u,v,w)
#define jit_uneqi_d(u,v,w) jit_new_node_wwd(jit_code_uneqi_d,u,v,w)
jit_code_uneqr_d, jit_code_uneqi_d,
#define jit_unger_d(u,v,w) jit_new_node_www(jit_code_unger_d,u,v,w)
#define jit_ungei_d(u,v,w) jit_new_node_wwd(jit_code_ungei_d,u,v,w)
jit_code_unger_d, jit_code_ungei_d,
#define jit_ungtr_d(u,v,w) jit_new_node_www(jit_code_ungtr_d,u,v,w)
#define jit_ungti_d(u,v,w) jit_new_node_wwd(jit_code_ungti_d,u,v,w)
jit_code_ungtr_d, jit_code_ungti_d,
#define jit_ltgtr_d(u,v,w) jit_new_node_www(jit_code_ltgtr_d,u,v,w)
#define jit_ltgti_d(u,v,w) jit_new_node_wwd(jit_code_ltgti_d,u,v,w)
jit_code_ltgtr_d, jit_code_ltgti_d,
#define jit_ordr_d(u,v,w) jit_new_node_www(jit_code_ordr_d,u,v,w)
#define jit_ordi_d(u,v,w) jit_new_node_wwd(jit_code_ordi_d,u,v,w)
jit_code_ordr_d, jit_code_ordi_d,
#define jit_unordr_d(u,v,w) jit_new_node_www(jit_code_unordr_d,u,v,w)
#define jit_unordi_d(u,v,w) jit_new_node_wwd(jit_code_unordi_d,u,v,w)
jit_code_unordr_d, jit_code_unordi_d,
#define jit_truncr_d_i(u,v) jit_new_node_ww(jit_code_truncr_d_i,u,v)
jit_code_truncr_d_i,
#if __WODSIZE == 32
# define jit_truncr_d(u,v) jit_truncr_d_i(u,v)
#else
# define jit_truncr_d(u,v) jit_truncr_d_l(u,v)
#endif
/* >> 64 bit */
#define jit_truncr_d_l(u,v) jit_new_node_ww(jit_code_truncr_d_l,u,v)
jit_code_truncr_d_l,
/* << 64 bit */
#define jit_extr_d(u,v) jit_new_node_ww(jit_code_extr_f,u,v)
#define jit_extr_f_d(u,v) jit_new_node_ww(jit_code_extr_f_d,u,v)
jit_code_extr_d, jit_code_extr_f_d,
#define jit_movr_d(u,v) jit_new_node_ww(jit_code_movr_d,u,v)
#define jit_movi_d(u,v) jit_new_node_wd(jit_code_movi_d,u,v)
jit_code_movr_d, jit_code_movi_d,
#define jit_ldr_d(u,v) jit_new_node_ww(jit_code_ldr_d,u,v)
#define jit_ldi_d(u,v) jit_new_node_ww(jit_code_ldi_d,u,v)
jit_code_ldr_d, jit_code_ldi_d,
#define jit_ldxr_d(u,v,w) jit_new_node_www(jit_code_ldxr_d,u,v,w)
#define jit_ldxi_d(u,v,w) jit_new_node_www(jit_code_ldxi_d,u,v,w)
jit_code_ldxr_d, jit_code_ldxi_d,
#define jit_str_d(u,v) jit_new_node_ww(jit_code_str_d,u,v)
#define jit_sti_d(u,v) jit_new_node_ww(jit_code_sti_d,u,v)
jit_code_str_d, jit_code_sti_d,
#define jit_stxr_d(u,v,w) jit_new_node_www(jit_code_stxr_d,u,v,w)
#define jit_stxi_d(u,v,w) jit_new_node_www(jit_code_stxi_d,u,v,w)
jit_code_stxr_d, jit_code_stxi_d,
#define jit_bltr_d(v,w) jit_new_node_pww(jit_code_bltr_d,NULL,v,w)
#define jit_blti_d(v,w) jit_new_node_pwd(jit_code_blti_d,NULL,v,w)
jit_code_bltr_d, jit_code_blti_d,
#define jit_bler_d(v,w) jit_new_node_pww(jit_code_bler_d,NULL,v,w)
#define jit_blei_d(v,w) jit_new_node_pwd(jit_code_blei_d,NULL,v,w)
jit_code_bler_d, jit_code_blei_d,
#define jit_beqr_d(v,w) jit_new_node_pww(jit_code_beqr_d,NULL,v,w)
#define jit_beqi_d(v,w) jit_new_node_pwd(jit_code_beqi_d,NULL,v,w)
jit_code_beqr_d, jit_code_beqi_d,
#define jit_bger_d(v,w) jit_new_node_pww(jit_code_bger_d,NULL,v,w)
#define jit_bgei_d(v,w) jit_new_node_pwd(jit_code_bgei_d,NULL,v,w)
jit_code_bger_d, jit_code_bgei_d,
#define jit_bgtr_d(v,w) jit_new_node_pww(jit_code_bgtr_d,NULL,v,w)
#define jit_bgti_d(v,w) jit_new_node_pwd(jit_code_bgti_d,NULL,v,w)
jit_code_bgtr_d, jit_code_bgti_d,
#define jit_bner_d(v,w) jit_new_node_pww(jit_code_bner_d,NULL,v,w)
#define jit_bnei_d(v,w) jit_new_node_pwd(jit_code_bnei_d,NULL,v,w)
jit_code_bner_d, jit_code_bnei_d,
#define jit_bunltr_d(v,w) jit_new_node_pww(jit_code_bunltr_d,NULL,v,w)
#define jit_bunlti_d(v,w) jit_new_node_pwd(jit_code_bunlti_d,NULL,v,w)
jit_code_bunltr_d, jit_code_bunlti_d,
#define jit_bunler_d(v,w) jit_new_node_pww(jit_code_bunler_d,NULL,v,w)
#define jit_bunlei_d(v,w) jit_new_node_pwd(jit_code_bunlei_d,NULL,v,w)
jit_code_bunler_d, jit_code_bunlei_d,
#define jit_buneqr_d(v,w) jit_new_node_pww(jit_code_buneqr_d,NULL,v,w)
#define jit_buneqi_d(v,w) jit_new_node_pwd(jit_code_buneqi_d,NULL,v,w)
jit_code_buneqr_d, jit_code_buneqi_d,
#define jit_bunger_d(v,w) jit_new_node_pww(jit_code_bunger_d,NULL,v,w)
#define jit_bungei_d(v,w) jit_new_node_pwd(jit_code_bungei_d,NULL,v,w)
jit_code_bunger_d, jit_code_bungei_d,
#define jit_bungtr_d(v,w) jit_new_node_pww(jit_code_bungtr_d,NULL,v,w)
#define jit_bungti_d(v,w) jit_new_node_pwd(jit_code_bungti_d,NULL,v,w)
jit_code_bungtr_d, jit_code_bungti_d,
#define jit_bltgtr_d(v,w) jit_new_node_pww(jit_code_bltgtr_d,NULL,v,w)
#define jit_bltgti_d(v,w) jit_new_node_pwd(jit_code_bltgti_d,NULL,v,w)
jit_code_bltgtr_d, jit_code_bltgti_d,
#define jit_bordr_d(v,w) jit_new_node_pww(jit_code_bordr_d,NULL,v,w)
#define jit_bordi_d(v,w) jit_new_node_pwd(jit_code_bordi_d,NULL,v,w)
jit_code_bordr_d, jit_code_bordi_d,
#define jit_bunordr_d(v,w) jit_new_node_pww(jit_code_bunordr_d,NULL,v,w)
#define jit_bunordi_d(v,w) jit_new_node_pwd(jit_code_bunordi_d,NULL,v,w)
jit_code_bunordr_d, jit_code_bunordi_d,
#define jit_pushargr_d(u) _jit_pushargr_d(_jit,u)
#define jit_pushargi_d(u) _jit_pushargi_d(_jit,u)
#define jit_retr_d(u) _jit_retr_d(_jit,u)
#define jit_reti_d(u) _jit_reti_d(_jit,u)
#define jit_retval_d(u) _jit_retval_d(_jit,u)
jit_code_retval_d,
} jit_code_t;
/*
* Prototypes
*/
extern void init_jit(void);
extern void finish_jit(void);
extern jit_state_t *jit_new_state(void);
extern jit_node_t *_jit_data(jit_state_t*, jit_pointer_t, jit_word_t);
extern jit_node_t *_jit_note(jit_state_t*, jit_pointer_t);
extern jit_node_t *_jit_label(jit_state_t*);
extern jit_node_t *_jit_forward(jit_state_t*);
extern void _jit_link(jit_state_t*, jit_node_t*);
extern void _jit_prolog(jit_state_t*);
extern jit_int32_t _jit_allocai(jit_state_t*, jit_int32_t);
extern jit_int32_t _jit_arg(jit_state_t*);
extern void _jit_getarg_c(jit_state_t*, jit_gpr_t, jit_int32_t);
extern void _jit_getarg_uc(jit_state_t*, jit_gpr_t, jit_int32_t);
extern void _jit_getarg_s(jit_state_t*, jit_gpr_t, jit_int32_t);
extern void _jit_getarg_us(jit_state_t*, jit_gpr_t, jit_int32_t);
extern void _jit_getarg_i(jit_state_t*, jit_gpr_t, jit_int32_t);
#if __WORDSIZE == 64
extern void _jit_getarg_ui(jit_state_t*, jit_gpr_t, jit_int32_t);
extern void _jit_getarg_l(jit_state_t*, jit_gpr_t, jit_int32_t);
#endif
extern void _jit_prepare(jit_state_t*, jit_int32_t);
extern void _jit_pushargr(jit_state_t*, jit_gpr_t);
extern void _jit_pushargi(jit_state_t*, jit_word_t);
extern void _jit_finishr(jit_state_t*, jit_gpr_t);
extern jit_node_t *_jit_finishi(jit_state_t*, jit_pointer_t);
extern void _jit_ret(jit_state_t*);
extern void _jit_retr(jit_state_t*, jit_gpr_t);
extern void _jit_reti(jit_state_t*, jit_word_t);
extern void _jit_retval_c(jit_state_t*, jit_gpr_t);
extern void _jit_retval_uc(jit_state_t*, jit_gpr_t);
extern void _jit_retval_s(jit_state_t*, jit_gpr_t);
extern void _jit_retval_us(jit_state_t*, jit_gpr_t);
extern void _jit_retval_i(jit_state_t*, jit_gpr_t);
#if __WORDSIZE == 64
extern void _jit_retval_ui(jit_state_t*, jit_gpr_t);
extern void _jit_retval_l(jit_state_t*, jit_gpr_t);
#endif
extern void _jit_epilog(jit_state_t*);
#define jit_patch(u) _jit_patch(_jit,u)
extern void _jit_patch(jit_state_t*, jit_node_t*);
#define jit_patch_at(u,v) _jit_patch_at(_jit,u,v)
extern void _jit_patch_at(jit_state_t*, jit_node_t*, jit_node_t*);
#define jit_patch_abs(u,v) _jit_patch_abs(_jit,u,v)
extern void _jit_patch_abs(jit_state_t*, jit_node_t*, jit_pointer_t);
#define jit_emit() _jit_emit(_jit)
extern jit_pointer_t _jit_emit(jit_state_t*);
#define jit_print() _jit_print(_jit)
extern void _jit_print(jit_state_t*);
extern jit_int32_t _jit_arg_f(jit_state_t*);
extern void _jit_getarg_f(jit_state_t*, jit_fpr_t, jit_int32_t);
extern void _jit_pushargr_f(jit_state_t*, jit_fpr_t);
extern void _jit_pushargi_f(jit_state_t*, jit_float32_t);
extern void _jit_retr_f(jit_state_t*, jit_fpr_t);
extern void _jit_reti_f(jit_state_t*, jit_float32_t);
extern void _jit_retval_f(jit_state_t*, jit_fpr_t);
extern jit_int32_t _jit_arg_d(jit_state_t*);
extern void _jit_getarg_d(jit_state_t*, jit_fpr_t, jit_int32_t);
extern void _jit_pushargr_d(jit_state_t*, jit_fpr_t);
extern void _jit_pushargi_d(jit_state_t*, jit_float64_t);
extern void _jit_retr_d(jit_state_t*, jit_fpr_t);
extern void _jit_reti_d(jit_state_t*, jit_float64_t);
extern void _jit_retval_d(jit_state_t*, jit_fpr_t);
#define jit_new_node(c) _jit_new_node(_jit,c)
extern jit_node_t *_jit_new_node(jit_state_t*, jit_code_t);
#define jit_new_node_w(c,u) _jit_new_node_w(_jit,c,u)
extern jit_node_t *_jit_new_node_w(jit_state_t*, jit_code_t,
jit_word_t);
#define jit_new_node_p(c,u) _jit_new_node_p(_jit,c,u)
extern jit_node_t *_jit_new_node_p(jit_state_t*, jit_code_t,
jit_pointer_t);
#define jit_new_node_ww(c,u,v) _jit_new_node_ww(_jit,c,u,v)
extern jit_node_t *_jit_new_node_ww(jit_state_t*,jit_code_t,
jit_word_t, jit_word_t);
#define jit_new_node_wf(c,u,v) _jit_new_node_wf(_jit,c,u,v)
extern jit_node_t *_jit_new_node_wf(jit_state_t*, jit_code_t,
jit_word_t, jit_float32_t);
#define jit_new_node_wd(c,u,v) _jit_new_node_wd(_jit,c,u,v)
extern jit_node_t *_jit_new_node_wd(jit_state_t*, jit_code_t,
jit_word_t, jit_float64_t);
#define jit_new_node_www(c,u,v,w) _jit_new_node_www(_jit,c,u,v,w)
extern jit_node_t *_jit_new_node_www(jit_state_t*, jit_code_t,
jit_word_t, jit_word_t, jit_word_t);
#define jit_new_node_wwf(c,u,v,w) _jit_new_node_wwf(_jit,c,u,v,w)
extern jit_node_t *_jit_new_node_wwf(jit_state_t*, jit_code_t,
jit_word_t, jit_word_t, jit_float32_t);
#define jit_new_node_wwd(c,u,v,w) _jit_new_node_wwd(_jit,c,u,v,w)
extern jit_node_t *_jit_new_node_wwd(jit_state_t*, jit_code_t,
jit_word_t, jit_word_t, jit_float64_t);
#define jit_new_node_pww(c,u,v,w) _jit_new_node_pww(_jit,c,u,v,w)
extern jit_node_t *_jit_new_node_pww(jit_state_t*, jit_code_t,
jit_pointer_t, jit_word_t, jit_word_t);
#define jit_new_node_pwf(c,u,v,w) _jit_new_node_pwf(_jit,c,u,v,w)
extern jit_node_t *_jit_new_node_pwf(jit_state_t*, jit_code_t,
jit_pointer_t, jit_word_t, jit_float32_t);
#define jit_new_node_pwd(c,u,v,w) _jit_new_node_pwd(_jit,c,u,v,w)
extern jit_node_t *_jit_new_node_pwd(jit_state_t*, jit_code_t,
jit_pointer_t, jit_word_t, jit_float64_t);
#define jit_disassemble() _jit_disassemble(_jit)
extern void _jit_disassemble(jit_state_t*);
#endif /* _lightning_h */

View file

@ -0,0 +1,23 @@
#
# Copyright 2000, 2001, 2002, 2012 Free Software Foundation, Inc.
#
# This is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This software is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
includedir = $(includedir)/lightning
EXTRA_DIST = \
jit_private.h
if cpu_x86
include_HEADERS = \
jit_x86.h
endif

147
include/lightning/jit_arm.h Normal file
View file

@ -0,0 +1,147 @@
/*
* Copyright (C) 2012 Free Software Foundation, Inc.
*
* This is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* Authors:
* Paulo Cesar Pereira de Andrade
*/
#ifndef _jit_arm_h
#define _jit_arm_h
#define JIT_HASH_CONSTS 0
#define JIT_NUM_OPERANDS 3
/*
* Types
*/
#define jit_swf_p() (jit_cpu.vfp == 0)
#define jit_hardfp_p() jit_cpu.abi
#define JIT_RET _R0
#define JIT_SP _R13
#define JIT_FP _R11
typedef enum {
#define jit_arg_reg_p(i) ((i) >= 0 && (i) < 4)
#define jit_r(i) (_R4 + (i))
#define jit_r_num() 3
#define jit_v(i) (_R7 + (i))
#define jit_v_num() 3
#define jit_arg_f_reg_p(i) ((i) >= 0 && (i) < 4)
#define jit_f(i) (jit_cpu.abi ? _D8 + (i) : _D7 + (i))
#define jit_f_num() (jit_cpu.vfp ? 16 : 8)
_R12, /* ip - temporary */
#define JIT_R0 _R4
#define JIT_R1 _R5
#define JIT_R2 _R6
_R4, /* r4 - variable */
_R5, /* r5 - variable */
_R6, /* r6 - variable */
#define JIT_V0 _R7
#define JIT_V1 _R8
#define JIT_V2 _R9
_R7, /* r7 - variable */
_R8, /* r8 - variable */
_R9, /* r9 - variable */
_R10, /* sl - stack limit */
_R11, /* fp - frame pointer */
_R13, /* sp - stack pointer */
_R14, /* lr - link register */
_R15, /* pc - program counter */
#define JIT_RA0 _R0
#define JIT_RA1 _R1
#define JIT_RA2 _R2
#define JIT_RA3 _R3
_R3, /* r3 - argument/result */
_R2, /* r2 - argument/result */
_R1, /* r1 - argument/result */
_R0, /* r0 - argument/result */
#if defined(__ARM_PCS_VFP)
# define JIT_FRET _D0
#else
# define JIT_FRET _R0
#endif
#define JIT_F0 (jit_hardfp_p() ? _D8 : _D0)
#define JIT_F1 (jit_hardfp_p() ? _D9 : _D1)
#define JIT_F2 (jit_hardfp_p() ? _D10 : _D2)
#define JIT_F3 (jit_hardfp_p() ? _D11 : _D3)
#define JIT_F4 (jit_hardfp_p() ? _D12 : _D4)
#define JIT_F5 (jit_hardfp_p() ? _D13 : _D5)
#define JIT_F6 (jit_hardfp_p() ? _D14 : _D6)
#define JIT_F7 (jit_hardfp_p() ? _D15 : _D7)
_S16, _D8 = _S16, _Q4 = _D8,
_S17,
_S18, _D9 = _S18,
_S19,
_S20, _D10 = _S20, _Q5 = _D10,
_S21,
_S22, _D11 = _S22,
_S23,
_S24, _D12 = _S24, _Q6 = _D12,
_S25,
_S26, _D13 = _S26,
_S27,
_S28, _D14 = _S28, _Q7 = _D14,
_S29,
_S30, _D15 = _S30,
_S31,
#define JIT_FA0 _D0
#define JIT_FA1 _D1
#define JIT_FA2 _D2
#define JIT_FA3 _D3
#define JIT_FA4 _D4
#define JIT_FA5 _D5
#define JIT_FA6 _D6
#define JIT_FA7 _D7
_S15,
_S14, _D7 = _S14,
_S13,
_S12, _D6 = _S12, _Q3 = _D6,
_S11,
_S10, _D5 = _S10,
_S9,
_S8, _D4 = _S8, _Q2 = _D4,
_S7,
_S6, _D3 = _S6,
_S5,
_S4, _D2 = _S4, _Q1 = _D2,
_S3,
_S2, _D1 = _S2,
_S1,
_S0, _D0 = _S0, _Q0 = _D0,
_NOREG,
#define JIT_NOREG _NOREG
} jit_reg_t;
typedef struct {
jit_uint32_t version : 4;
jit_uint32_t extend : 1;
/* only generate thumb instructions for thumb2 */
jit_uint32_t thumb : 1;
jit_uint32_t vfp : 3;
jit_uint32_t neon : 1;
jit_uint32_t abi : 2;
} jit_cpu_t;
typedef struct {
/* prevent using thumb instructions that set flags? */
jit_uint32_t no_set_flags : 1;
} jit_flags_t;
typedef jit_int64_t jit_regset_t;
/*
* Initialization
*/
extern jit_cpu_t jit_cpu;
#endif /* _jit_arm_h */

View file

@ -0,0 +1,98 @@
/*
* Copyright (C) 2012 Free Software Foundation, Inc.
*
* This is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* Authors:
* Paulo Cesar Pereira de Andrade
*/
#ifndef _jit_mips_h
#define _jit_mips_h
#define JIT_HASH_CONSTS 1
#define JIT_NUM_OPERANDS 3
/*
* Types
*/
#define JIT_RET _V0
#define JIT_FRET _F0
#define JIT_SP _SP
#define JIT_FP _FP
typedef enum {
#define jit_arg_reg_p(i) ((i) >= 0 && (i) < 4)
#define jit_r(i) (_V0 + (i))
#define jit_r_num() 12
#define jit_v(i) (_S0 + (i))
#define jit_r_num() 8
#define jit_arg_reg_p(i) ((i) >= 0 && (i) < 4)
#define jit_f(i) (_F0 + (i))
#define jit_f_num() 14
_AT,
#define JIT_R0 _V0
#define JIT_R1 _V1
#define JIT_R2 _T0
#define JIT_R3 _T1
#define JIT_R4 _T2
#define JIT_R5 _T3
#define JIT_R6 _T4
#define JIT_R7 _T5
#define JIT_R8 _T6
#define JIT_R9 _T7
#define JIT_R10 _T8
#define JIT_R11 _T9 /* must point to PIC function */
_V0, _V1, _T0, _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9,
#define JIT_V0 _S0
#define JIT_V1 _S1
#define JIT_V2 _S2
#define JIT_V3 _S3
#define JIT_V4 _S4
#define JIT_V5 _S5
#define JIT_V6 _S6
#define JIT_V7 _S7
_S0, _S1, _S2, _S3, _S4, _S5, _S6, _S7,
_ZERO, _K0, _K1, _RA,
_GP, /* FIXME use to point to jit data */
_SP, _FP,
# define JIT_RA0 _A0
# define JIT_RA1 _A1
# define JIT_RA2 _A2
# define JIT_RA3 _A3
_A3, _A2, _A1, _A0,
#define JIT_F0 _F0
#define JIT_F1 _F2
#define JIT_F2 _F4
#define JIT_F3 _F6
#define JIT_F4 _F8
#define JIT_F5 _F10
_F0, _F2, _F4, _F6, _F8, _F10,
/* callee save float registers */
#define JIT_FS0 _F16
#define JIT_FS1 _F18
#define JIT_FS2 _F20
#define JIT_FS3 _F22
#define JIT_FS4 _F24
#define JIT_FS5 _F26
#define JIT_FS6 _F28
#define JIT_FS7 _F30
_F16, _F18, _F20, _F22, _F24, _F26, _F28, _F30,
#define JIT_FA0 _F12
#define JIT_FA1 _F14
_F12, _F14,
#define JIT_NOREG _NOREG
_NOREG,
} jit_reg_t;
typedef jit_int64_t jit_regset_t;
#endif /* _jit_mips_h */

120
include/lightning/jit_ppc.h Normal file
View file

@ -0,0 +1,120 @@
/*
* Copyright (C) 2012 Free Software Foundation, Inc.
*
* This is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* Authors:
* Paulo Cesar Pereira de Andrade
*/
#ifndef _jit_ppc_h
#define _jit_ppc_h
#define JIT_HASH_CONSTS 1
#define JIT_NUM_OPERANDS 3
/*
* Types
*/
typedef enum {
#define jit_arg_reg_p(i) ((i) >= 0 && (i) < 8)
#define jit_r(i) (_R11 + (i))
#define jit_r_num() 3
#define jit_v(i) (_R30 - (i))
#define jit_r_num() 17
#define jit_arg_f_reg_p(i) ((i) >= 0 && (i) < 8)
#define jit_f(i) (_F0 + (i))
#define jit_f_num() 6
_R0,
#define JIT_R0 _R11
#define JIT_R1 _R12
#define JIT_R2 _R13
#define JIT_R3 _R2
_R11, _R12, _R13, _R2,
#define JIT_V0 _R30
#define JIT_V1 _R29
#define JIT_V2 _R28
#define JIT_V3 _R28
#define JIT_V4 _R26
#define JIT_V5 _R25
#define JIT_V6 _R24
#define JIT_V7 _R23
#define JIT_V8 _R22
#define JIT_V9 _R21
#define JIT_V10 _R20
#define JIT_V11 _R19
#define JIT_V12 _R18
#define JIT_V13 _R17
#define JIT_V14 _R16
#define JIT_V15 _R15
#define JIT_V16 _R14
_R14, _R15, _R16, _R17, _R18, _R19, _R20, _R21,
_R22, _R23, _R24, _R25, _R26, _R27, _R28, _R29,
_R30,
#define JIT_SP _R1
_R1,
#define JIT_FP _R31
_R31,
#define JIT_RET _R3
#define JIT_RA0 _R3
#define JIT_RA1 _R4
#define JIT_RA2 _R5
#define JIT_RA3 _R6
#define JIT_RA4 _R7
#define JIT_RA5 _R8
#define JIT_RA6 _R9
#define JIT_RA7 _R10
_R10, _R9, _R8, _R7, _R6, _R5, _R4, _R3,
# define JIT_F0 _F0
# define JIT_F1 _F8
# define JIT_F2 _F9
# define JIT_F3 _F10
# define JIT_F4 _F11
# define JIT_F5 _F12
_F0, _F9, _F10, _F11, _F12, _F13,
#define JIT_FS0 _F14
#define JIT_FS1 _F15
#define JIT_FS2 _F16
#define JIT_FS3 _F17
#define JIT_FS4 _F18
#define JIT_FS5 _F19
#define JIT_FS6 _F20
#define JIT_FS7 _F21
#define JIT_FS8 _F22
#define JIT_FS9 _F23
#define JIT_FS10 _F24
#define JIT_FS11 _F25
#define JIT_FS12 _F26
#define JIT_FS13 _F27
#define JIT_FS14 _F28
#define JIT_FS15 _F29
#define JIT_FS16 _F30
#define JIT_FS17 _F31
_F14, _F15, _F16, _F17, _F18, _F19, _F20,
_F21, _F22, _F23, _F24, _F25, _F26, _F27,
_F28, _F29, _F30, _F31,
#define JIT_FRET _F1
#define JIT_FA0 _F1
#define JIT_FA1 _F2
#define JIT_FA2 _F3
#define JIT_FA3 _F4
#define JIT_FA4 _F5
#define JIT_FA5 _F6
#define JIT_FA6 _F7
#define JIT_FA7 _F8
_F8, _F7, _F6, _F5, _F4, _F3, _F2, _F1,
_NOREG,
#define JIT_NOREG _NOREG
} jit_reg_t;
typedef jit_int64_t jit_regset_t;
#endif /* _jit_ppc_h */

View file

@ -0,0 +1,363 @@
/*
* Copyright (C) 2012 Free Software Foundation, Inc.
*
* This is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* Authors:
* Paulo Cesar Pereira de Andrade
*/
#ifndef _jit_private_h
#define _jit_private_h
#include <assert.h>
#include <limits.h>
#include <stdio.h>
#include <gmp.h>
#if defined(__GNUC__)
# define maybe_unused __attribute__ ((unused))
# define unlikely(exprn) __builtin_expect(!!(exprn), 0)
# define likely(exprn) __builtin_expect(!!(exprn), 1)
# if (__GNUC__ >= 4)
# define PUBLIC __attribute__ ((visibility("default")))
# define HIDDEN __attribute__ ((visibility("hidden")))
# else
# define PUBLIC /**/
# define HIDDEN /**/
# endif
#else
# define maybe_unused /**/
# define unlikely(exprn) exprn
# define likely(exprn) exprn
# define PUBLIC /**/
# define HIDDEN /**/
#endif
#define jit_size(vector) (sizeof(vector) / sizeof((vector)[0]))
/*
* Private jit_class bitmasks
*/
#define jit_class_nospill 0x00800000 /* hint to fail if need spill */
#define jit_class_sft 0x01000000 /* not a hardware register */
#define jit_class_rg8 0x04000000 /* x86 8 bits */
#define jit_class_xpr 0x80000000 /* float / vector */
#define jit_regno_patch 0x00008000 /* this is a register
* returned by a "user" call
* to jit_get_reg() */
#define jit_kind_register 1
#define jit_kind_code 2
#define jit_kind_word 3
#define jit_kind_float32 4
#define jit_kind_float64 5
#define jit_cc_a0_reg 0x00000001 /* arg0 is a register */
#define jit_cc_a0_chg 0x00000002 /* arg0 is modified */
#define jit_cc_a0_jmp 0x00000004 /* arg0 is a jump target */
#define jit_cc_a0_int 0x00000010 /* arg0 is immediate word */
#define jit_cc_a0_flt 0x00000020 /* arg0 is immediate float */
#define jit_cc_a0_dbl 0x00000040 /* arg0 is immediate double */
#define jit_cc_a1_reg 0x00000100 /* arg1 is a register */
#define jit_cc_a1_chg 0x00000200 /* arg1 is modified */
#define jit_cc_a1_int 0x00001000 /* arg1 is immediate word */
#define jit_cc_a1_flt 0x00002000 /* arg1 is immediate float */
#define jit_cc_a1_dbl 0x00004000 /* arg1 is immediate double */
#define jit_cc_a2_reg 0x00010000 /* arg2 is a register */
#define jit_cc_a2_chg 0x00020000 /* arg2 is modified */
#define jit_cc_a2_int 0x00100000 /* arg2 is immediate word */
#define jit_cc_a2_flt 0x00200000 /* arg2 is immediate float */
#define jit_cc_a2_dbl 0x00400000 /* arg2 is immediate double */
#define jit_regset_com(u, v) ((u) = ~(v))
#define jit_regset_and(u, v, w) ((u) = (v) & (w))
#define jit_regset_ior(u, v, w) ((u) = (v) | (w))
#define jit_regset_xor(u, v, w) ((u) = (v) ^ (w))
#define jit_regset_set(u, v) ((u) = (v))
#define jit_regset_cmp_ui(u, v) ((u) != (v))
#define jit_regset_set_ui(u, v) ((u) = (v))
#define jit_regset_set_p(set) (set)
#if DEBUG
# define jit_regset_clrbit(set, bit) \
(assert(bit >= 0 && bit < (sizeof(jit_regset_t) << 3)), \
(set) &= ~(1LL << (bit)))
# define jit_regset_setbit(set, bit) \
(assert(bit >= 0 && bit < (sizeof(jit_regset_t) << 3)), \
(set) |= 1LL << (bit))
# define jit_regset_tstbit(set, bit) \
(assert(bit >= 0 && bit < (sizeof(jit_regset_t) << 3)), \
(set) & (1LL << (bit)))
#else
# define jit_regset_clrbit(set, bit) ((set) &= ~(1LL << (bit)))
# define jit_regset_setbit(set, bit) ((set) |= 1LL << (bit))
# define jit_regset_tstbit(set, bit) ((set) & (1LL << (bit)))
#endif
#define jit_regset_new(set) ((set) = 0)
#define jit_regset_del(set) ((set) = 0)
extern unsigned long
jit_regset_scan1(jit_regset_t, jit_int32_t);
#define jit_reglive_setup() \
do { \
jit_regset_set_ui(_jit->reglive, 0); \
jit_regset_set_ui(_jit->regmask, 0); \
} while (0)
/*
* Types
*/
typedef union jit_data jit_data_t;
typedef struct jit_block jit_block_t;
typedef struct jit_value jit_value_t;
typedef struct jit_function jit_function_t;
typedef struct jit_register jit_register_t;
#if __arm__
# if DISASSEMBLER
typedef struct jit_data_info jit_data_info_t;
# endif
#endif
union jit_data {
struct {
#if __BYTE_ORDER == __LITTLE_ENDIAN
jit_int32_t l;
jit_int32_t h;
#else
jit_int32_t h;
jit_int32_t l;
#endif
} pair;
jit_word_t w;
jit_float32_t f;
jit_float64_t d;
jit_pointer_t p;
jit_node_t *n;
};
struct jit_node {
jit_node_t *next;
jit_code_t code;
jit_int32_t flag;
jit_data_t u;
jit_data_t v;
jit_data_t w;
jit_node_t *link;
};
struct jit_block {
jit_node_t *label;
jit_regset_t reglive;
jit_regset_t regmask;
};
struct jit_value {
jit_int32_t kind;
jit_code_t code;
jit_data_t base;
jit_data_t disp;
};
typedef struct {
jit_word_t inst;
jit_node_t *node;
} jit_patch_t;
#if __arm__ && DISASSEMBLER
struct jit_data_info {
jit_uword_t code; /* pointer in code buffer */
jit_word_t length; /* length of constant vector */
};
#endif
struct jit_function {
struct {
jit_int32_t argi;
jit_int32_t argf;
jit_int32_t size;
jit_int32_t aoff;
jit_int32_t alen;
} self;
struct {
jit_int32_t argi;
jit_int32_t argf;
jit_int32_t size;
jit_int32_t kind;
} call;
jit_node_t *prolog;
jit_node_t *epilog;
jit_int32_t *regoff;
jit_regset_t regset;
jit_int32_t stack;
};
struct jit_state {
union {
jit_uint8_t *uc;
jit_uint16_t *us;
jit_uint32_t *ui;
jit_uint64_t *ul;
jit_word_t w;
} pc;
jit_node_t *head;
jit_node_t *tail;
jit_uint32_t emit : 1; /* emit state entered */
jit_uint32_t again : 1; /* start over emiting function */
jit_int32_t reglen; /* number of registers */
jit_regset_t regarg; /* cannot allocate */
jit_regset_t regsav; /* automatic spill only once */
jit_regset_t reglive; /* known live registers at some point */
jit_regset_t regmask; /* register mask to update reglive */
mpz_t blockmask; /* mask of visited basic blocks */
struct {
jit_uint8_t *ptr;
jit_word_t length;
} code;
struct {
jit_uint8_t *ptr; /* constant pool */
jit_node_t **table; /* very simple hash table */
jit_word_t size; /* number of vectors in table */
jit_word_t count; /* number of hash table entries */
jit_word_t offset; /* offset in bytes in ptr */
jit_word_t length; /* length in bytes of ptr */
} data;
jit_node_t **spill;
jit_int32_t *gen; /* ssa like "register version" */
jit_value_t *values; /* temporary jit_value_t vector */
struct {
jit_block_t *ptr;
jit_word_t offset;
jit_word_t length;
} blocks; /* basic blocks */
struct {
jit_patch_t *ptr;
jit_word_t offset;
jit_word_t length;
} patches; /* forward patch information */
jit_function_t *function; /* current function */
struct {
jit_function_t *ptr;
jit_word_t offset;
jit_word_t length;
} functions; /* prolog/epilogue offsets in code */
struct {
jit_node_t **ptr;
jit_word_t offset;
jit_word_t length;
} pool;
jit_node_t *list;
#if __arm__
# if DISASSEMBLER
struct {
jit_data_info_t *ptr;
it_word_t offset;
jit_word_t length;
} data_info; /* constant pools information */
# endif
struct {
jit_uint8_t *data; /* pointer to code */
jit_word_t size; /* size data */
jit_word_t offset; /* pending patches */
jit_word_t length; /* number of pending constants */
jit_int32_t values[1024]; /* pending constants */
jit_word_t patches[2048];
} consts;
#endif
};
struct jit_register {
jit_reg_t spec;
char *name;
};
/*
* Prototypes
*/
extern void jit_get_cpu(void);
#define jit_init() _jit_init(_jit)
extern void _jit_init(jit_state_t*);
#define jit_new_node_no_link(u) _jit_new_node_no_link(_jit, u)
extern jit_node_t *_jit_new_node_no_link(jit_state_t*, jit_code_t);
#define jit_link_node(u) _jit_link_node(_jit, u)
extern void _jit_link_node(jit_state_t*, jit_node_t*);
#define jit_link_label(l) _jit_link_label(_jit,l)
extern void
_jit_link_label(jit_state_t*,jit_node_t*);
#define jit_reglive(node) _jit_reglive(_jit, node)
extern void
_jit_reglive(jit_state_t*, jit_node_t*);
#define jit_regarg_set(n,v) _jit_regarg_set(_jit,n,v)
extern void
_jit_regarg_set(jit_state_t*, jit_node_t*, jit_int32_t);
#define jit_regarg_clr(n,v) _jit_regarg_clr(_jit,n,v)
extern void
_jit_regarg_clr(jit_state_t*, jit_node_t*, jit_int32_t);
#define jit_get_reg(s) _jit_get_reg(_jit,s)
extern jit_int32_t
_jit_get_reg(jit_state_t*, jit_int32_t);
#define jit_unget_reg(r) _jit_unget_reg(_jit,r)
extern void
_jit_unget_reg(jit_state_t*, jit_int32_t);
#define jit_save(reg) _jit_save(_jit, reg)
extern void
_jit_save(jit_state_t*, jit_int32_t);
#define jit_load(reg) _jit_load(_jit, reg)
extern void
_jit_load(jit_state_t*, jit_int32_t);
#define jit_optimize() _jit_optimize(_jit)
extern void
_jit_optimize(jit_state_t*);
#define jit_classify(code) _jit_classify(_jit, code)
extern jit_int32_t
_jit_classify(jit_state_t*, jit_code_t);
#define jit_regarg_p(n, r) _jit_regarg_p(_jit, n, r)
extern jit_bool_t
_jit_regarg_p(jit_state_t*, jit_node_t*, jit_int32_t);
#define emit_ldxi(r0, r1, i0) _emit_ldxi(_jit, r0, r1, i0)
extern void
_emit_ldxi(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
#define emit_stxi(i0, r0, r1) _emit_stxi(_jit, i0, r0, r1)
extern void
_emit_stxi(jit_state_t*, jit_word_t, jit_int32_t, jit_int32_t);
#define emit_ldxi_d(r0, r1, i0) _emit_ldxi_d(_jit, r0, r1, i0)
extern void
_emit_ldxi_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
#define emit_stxi_d(i0, r0, r1) _emit_stxi(_jit, i0, r0, r1)
extern void
_emit_stxi_d(jit_state_t*, jit_word_t, jit_int32_t, jit_int32_t);
extern void jit_init_debug();
extern void jit_finish_debug();
/*
* Externs
*/
extern jit_register_t _rvs[];
#endif /* _jit_private_h */

166
include/lightning/jit_x86.h Normal file
View file

@ -0,0 +1,166 @@
/*
* Copyright (C) 2012 Free Software Foundation, Inc.
*
* This is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* Authors:
* Paulo Cesar Pereira de Andrade
*/
#ifndef _jit_x86_h
#define _jit_x86_h
#define JIT_HASH_CONSTS 1
#define JIT_NUM_OPERANDS 2
/*
* Types
*/
#define jit_sse2_p() jit_cpu.sse2
#define jit_x87_reg_p(reg) ((reg) >= _ST0 && (reg) <= _ST7)
#define JIT_RET _RAX
#define JIT_SP _RSP
#define JIT_FP _RBP
typedef enum {
#if __WORDSIZE == 32
# define jit_arg_reg_p(i) 0
# define jit_r(i) (_RAX + (i))
# define jit_r_num() 3
# define jit_v(i) (_RBX + (i))
# define jit_v_num() 3
# define jit_arg_reg_p(i) 0
# define jit_f(i) (jit_cpu.sse2 ? _XMM0 + (i) : _ST0 + (i))
# define jit_f_num() (jit_cpu.sse2 ? 8 : 6)
# define JIT_FRET _ST0
# define JIT_R0 _RAX
# define JIT_R1 _RCX
# define JIT_R2 _RDX
_RAX, _RCX, _RDX,
# define JIT_V0 _RBX
# define JIT_V1 _RSI
# define JIT_V2 _RDI
_RBX, _RSI, _RDI,
_RSP, _RBP,
# define JIT_F0 (jit_sse2_p() ? _XMM0 : _ST0)
# define JIT_F1 (jit_sse2_p() ? _XMM1 : _ST1)
# define JIT_F2 (jit_sse2_p() ? _XMM2 : _ST2)
# define JIT_F3 (jit_sse2_p() ? _XMM3 : _ST3)
# define JIT_F4 (jit_sse2_p() ? _XMM4 : _ST4)
# define JIT_F5 (jit_sse2_p() ? _XMM5 : _ST5)
# define JIT_F6 (jit_sse2_p() ? _XMM6 : _ST6)
# define JIT_F7 (jit_sse2_p() ? _XMM7 : _ST7)
_XMM0, _XMM1, _XMM2, _XMM3, _XMM4, _XMM5, _XMM6, _XMM7,
# define jit_sse_reg_p(reg) ((reg) >= _XMM0 && (reg) <= _XMM7)
#else
# define jit_arg_reg_p(i) ((i) >= 0 && (i) < 6)
# define jit_r(i) (_RAX + (i))
# define jit_r_num() 4
# define jit_v(i) (_RBX + (i))
# define jit_v_num() 4
# define jit_arg_f_reg_p(i) ((i) >= 0 && (i) < 8)
# define jit_f(index) (_XMM0 + (index))
# define jit_f_num() 8
# define JIT_FRET _XMM0
# define JIT_R0 _RAX
# define JIT_R1 _R10
# define JIT_R2 _R11
# define JIT_R3 _R12
_RAX, _R10, _R11, _R12,
# define JIT_V0 _RBX
# define JIT_V1 _R13
# define JIT_V2 _R14
# define JIT_V3 _R15
_RBX, _R13, _R14, _R15,
# define JIT_RA0 _RDI
# define JIT_RA1 _RSI
# define JIT_RA2 _RDX
# define JIT_RA3 _RCX
# define JIT_RA4 _R8
# define JIT_RA5 _R9
_R9, _R8, _RCX, _RDX, _RSI, _RDI,
_RSP, _RBP,
# define JIT_F0 _XMM8
# define JIT_F1 _XMM9
# define JIT_F2 _XMM10
# define JIT_F3 _XMM11
# define JIT_F4 _XMM12
# define JIT_F5 _XMM13
# define JIT_F6 _XMM14
# define JIT_F7 _XMM15
_XMM8, _XMM9, _XMM10, _XMM11, _XMM12, _XMM13, _XMM14, _XMM15,
# define JIT_FA0 _XMM0
# define JIT_FA1 _XMM1
# define JIT_FA2 _XMM2
# define JIT_FA3 _XMM3
# define JIT_FA4 _XMM4
# define JIT_FA5 _XMM5
# define JIT_FA6 _XMM6
# define JIT_FA7 _XMM7
_XMM7, _XMM6, _XMM5, _XMM4, _XMM3, _XMM2, _XMM1, _XMM0,
# define jit_sse_reg_p(reg) ((reg) >= _XMM8 && (reg) <= _XMM0)
#endif
_ST0, _ST1, _ST2, _ST3, _ST4, _ST5, _ST6, _ST7,
# define JIT_NOREG _NOREG
_NOREG,
} jit_reg_t;
typedef struct {
/* x87 present */
jit_uint32_t fpu : 1;
/* cmpxchg8b instruction */
jit_uint32_t cmpxchg8b : 1;
/* cmov and fcmov branchless conditional mov */
jit_uint32_t cmov : 1;
/* mmx registers/instructions available */
jit_uint32_t mmx : 1;
/* sse registers/instructions available */
jit_uint32_t sse : 1;
/* sse2 registers/instructions available */
jit_uint32_t sse2 : 1;
/* sse3 instructions available */
jit_uint32_t sse3 : 1;
/* pcmulqdq instruction */
jit_uint32_t pclmulqdq : 1;
/* ssse3 suplemental sse3 instructions available */
jit_uint32_t ssse3 : 1;
/* fused multiply/add using ymm state */
jit_uint32_t fma : 1;
/* cmpxchg16b instruction */
jit_uint32_t cmpxchg16b : 1;
/* sse4.1 instructions available */
jit_uint32_t sse4_1 : 1;
/* sse4.2 instructions available */
jit_uint32_t sse4_2 : 1;
/* movbe instruction available */
jit_uint32_t movbe : 1;
/* popcnt instruction available */
jit_uint32_t popcnt : 1;
/* aes instructions available */
jit_uint32_t aes : 1;
/* avx instructions available */
jit_uint32_t avx : 1;
/* lahf/sahf available in 64 bits mode */
jit_uint32_t lahf : 1;
} jit_cpu_t;
#if __WORDSIZE == 32
typedef jit_int32_t jit_regset_t;
#else
typedef jit_int64_t jit_regset_t;
#endif
/*
* Initialization
*/
extern jit_cpu_t jit_cpu;
#endif /* _jit_x86_h */