mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-04-09 04:59:31 -06:00
add the source code for GNU lightning in the source directory for the C runtime
This commit is contained in:
@@ -7,6 +7,8 @@ AC_CONFIG_SRCDIR([gu/mem.c])
|
||||
AC_CONFIG_AUX_DIR([scripts])
|
||||
AC_CONFIG_MACRO_DIR([m4])
|
||||
|
||||
AC_CANONICAL_TARGET
|
||||
|
||||
AM_INIT_AUTOMAKE([1.7.9])
|
||||
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
|
||||
|
||||
@@ -37,6 +39,16 @@ AC_C_FAM_IN_MEM
|
||||
AC_C_STATEMENT_EXPRESSIONS
|
||||
AC_C_ASCII
|
||||
|
||||
case "$target_cpu" in
|
||||
i?86) cpu=i386; AC_DEFINE(LIGHTNING_I386, 1,
|
||||
[Define if lightning is targeting the x86 architecture]) ;;
|
||||
sparc*) cpu=sparc; AC_DEFINE(LIGHTNING_SPARC, 1,
|
||||
[Define if lightning is targeting the x86 architecture]) ;;
|
||||
powerpc) cpu=ppc; AC_DEFINE(LIGHTNING_PPC, 1,
|
||||
[Define if lightning is targeting the x86 architecture]) ;;
|
||||
*) AC_MSG_ERROR([cpu $target_cpu not supported]) ;;
|
||||
esac
|
||||
|
||||
dnl Doxygen support
|
||||
DX_PS_FEATURE(OFF)
|
||||
DX_PDF_FEATURE(OFF)
|
||||
@@ -53,6 +65,13 @@ DX_ARG_ABLE(dev, [include internal development documentation],
|
||||
DX_INIT_DOXYGEN(libpgf)
|
||||
|
||||
|
||||
cpu_dir=pgf/lightning/$cpu
|
||||
AC_CONFIG_LINKS(pgf/lightning/asm.h:$cpu_dir/asm.h dnl
|
||||
pgf/lightning/fp.h:$cpu_dir/fp.h dnl
|
||||
pgf/lightning/core.h:$cpu_dir/core.h dnl
|
||||
pgf/lightning/funcs.h:$cpu_dir/funcs.h, [],
|
||||
[cpu_dir=$cpu_dir])
|
||||
|
||||
AC_CONFIG_FILES([Makefile
|
||||
libgu.pc
|
||||
libpgf.pc
|
||||
|
||||
62
src/runtime/c/pgf/lightning.h
Normal file
62
src/runtime/c/pgf/lightning.h
Normal file
@@ -0,0 +1,62 @@
|
||||
/******************************** -*- C -*- ****************************
|
||||
*
|
||||
* lightning main include file
|
||||
*
|
||||
***********************************************************************/
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* Copyright 2000 Free Software Foundation, Inc.
|
||||
* Written by Paolo Bonzini.
|
||||
*
|
||||
* This file is part of GNU lightning.
|
||||
*
|
||||
* GNU lightning is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* GNU lightning 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 Lesser General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with GNU lightning; see the file COPYING.LESSER; if not, write to the
|
||||
* Free Software Foundation, 59 Temple Place - Suite 330, Boston,
|
||||
* MA 02111-1307, USA.
|
||||
*
|
||||
***********************************************************************/
|
||||
|
||||
|
||||
|
||||
#ifndef __lightning_h
|
||||
#define __lightning_h
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "lightning/asm-common.h"
|
||||
|
||||
#ifndef LIGHTNING_DEBUG
|
||||
#include "lightning/asm.h"
|
||||
#endif
|
||||
|
||||
#include "lightning/core.h"
|
||||
#include "lightning/core-common.h"
|
||||
#include "lightning/funcs.h"
|
||||
#include "lightning/funcs-common.h"
|
||||
#include "lightning/fp.h"
|
||||
#include "lightning/fp-common.h"
|
||||
|
||||
#ifndef JIT_R0
|
||||
#error GNU lightning does not support the current target
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __lightning_h */
|
||||
197
src/runtime/c/pgf/lightning/asm-common.h
Normal file
197
src/runtime/c/pgf/lightning/asm-common.h
Normal file
@@ -0,0 +1,197 @@
|
||||
/******************************** -*- C -*- ****************************
|
||||
*
|
||||
* Dynamic assembler support
|
||||
*
|
||||
***********************************************************************/
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* Copyright 2000, 2001, 2002 Free Software Foundation, Inc.
|
||||
* Written by Paolo Bonzini.
|
||||
*
|
||||
* This file is part of GNU lightning.
|
||||
*
|
||||
* GNU lightning is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* GNU lightning 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 Lesser General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with GNU lightning; see the file COPYING.LESSER; if not, write to the
|
||||
* Free Software Foundation, 59 Temple Place - Suite 330, Boston,
|
||||
* MA 02111-1307, USA.
|
||||
*
|
||||
***********************************************************************/
|
||||
|
||||
|
||||
#ifndef __lightning_asm_common_h
|
||||
#define __lightning_asm_common_h_
|
||||
|
||||
|
||||
#ifndef _ASM_SAFETY
|
||||
#define JITFAIL(MSG) 0
|
||||
#else
|
||||
#if defined __GNUC__ && (__GNUC__ == 3 ? __GNUC_MINOR__ >= 2 : __GNUC__ > 3)
|
||||
#define JITFAIL(MSG) jit_fail(MSG, __FILE__, __LINE__, __func__)
|
||||
#else
|
||||
#define JITFAIL(MSG) jit_fail(MSG, __FILE__, __LINE__, __FUNCTION__)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined __GNUC__ && (__GNUC__ == 3 ? __GNUC_MINOR__ >= 2 : __GNUC__ > 3)
|
||||
#define JITSORRY(MSG) jit_fail("sorry, unimplemented: " MSG, __FILE__, __LINE__, __func__)
|
||||
#else
|
||||
#define JITSORRY(MSG) jit_fail("sorry, unimplemented: " MSG, __FILE__, __LINE__, __FUNCTION__)
|
||||
#endif
|
||||
|
||||
#ifdef __GNUC__
|
||||
#define JIT_UNUSED __attribute__((unused))
|
||||
#else
|
||||
#define JIT_UNUSED
|
||||
#endif
|
||||
|
||||
|
||||
/* NextStep 2.0 cc is really gcc 1.93 but it defines __GNUC__ = 2 and
|
||||
does not implement __extension__. But that compiler doesn't define
|
||||
__GNUC_MINOR__. */
|
||||
#ifdef __GNUC__
|
||||
#if __GNUC__ < 2 || (defined(__NeXT__) && !__GNUC_MINOR__)
|
||||
#define __extension__
|
||||
#endif
|
||||
|
||||
#define _TEMPD(type, var)
|
||||
|
||||
#define _TEMP(type, var, val, body) __extension__ ({ \
|
||||
register struct { type var } _jitl; _jitl.var = val; \
|
||||
body; \
|
||||
})
|
||||
|
||||
#else
|
||||
|
||||
/* Between loading a global and calling a subroutine, we choose the lesser
|
||||
* evil. */
|
||||
#define _TEMPD(type, var) static type var;
|
||||
#define _TEMP(type, var, val, body) ((var = val), body)
|
||||
|
||||
#endif
|
||||
|
||||
typedef char _sc;
|
||||
typedef unsigned char _uc;
|
||||
typedef unsigned short _us;
|
||||
typedef unsigned int _ui;
|
||||
typedef long _sl;
|
||||
typedef unsigned long _ul;
|
||||
|
||||
#define _jit_UC(X) ((_uc )(X))
|
||||
#define _jit_US(X) ((_us )(X))
|
||||
#define _jit_UI(X) ((_ui )(X))
|
||||
#define _jit_SL(X) ((_sl )(X))
|
||||
#define _jit_UL(X) ((_ul )(X))
|
||||
# define _PUC(X) ((_uc *)(X))
|
||||
# define _PUS(X) ((_us *)(X))
|
||||
# define _PUI(X) ((_ui *)(X))
|
||||
# define _PSL(X) ((_sl *)(X))
|
||||
# define _PUL(X) ((_ul *)(X))
|
||||
|
||||
#define _jit_B(B) _jit_UL(((*_jit.x.uc_pc++)= _jit_UC((B)& 0xff)))
|
||||
#define _jit_W(W) _jit_UL(((*_jit.x.us_pc++)= _jit_US((W)&0xffff)))
|
||||
#define _jit_I(I) _jit_UL(((*_jit.x.ui_pc++)= _jit_UI((I) )))
|
||||
#define _jit_L(L) _jit_UL(((*_jit.x.ul_pc++)= _jit_UL((L) )))
|
||||
#define _jit_I_noinc(I) _jit_UL(((*_jit.x.ui_pc)= _jit_UI((I) )))
|
||||
|
||||
#define _MASK(N) ((unsigned)((1<<(N)))-1)
|
||||
#define _siP(N,I) (!((((unsigned)(I))^(((unsigned)(I))<<1))&~_MASK(N)))
|
||||
#define _uiP(N,I) (!(((unsigned)(I))&~_MASK(N)))
|
||||
#define _suiP(N,I) (_siP(N,I) | _uiP(N,I))
|
||||
|
||||
#ifndef _ASM_SAFETY
|
||||
#define _ck_s(W,I) (_jit_UL(I) & _MASK(W))
|
||||
#define _ck_u(W,I) (_jit_UL(I) & _MASK(W))
|
||||
#define _ck_su(W,I) (_jit_UL(I) & _MASK(W))
|
||||
#define _ck_d(W,I) (_jit_UL(I) & _MASK(W))
|
||||
#else
|
||||
#define _ck_s(W,I) (_siP(W,I) ? (_jit_UL(I) & _MASK(W)) : JITFAIL( "signed integer `"#I"' too large for "#W"-bit field"))
|
||||
#define _ck_u(W,I) (_uiP(W,I) ? (_jit_UL(I) & _MASK(W)) : JITFAIL("unsigned integer `"#I"' too large for "#W"-bit field"))
|
||||
#define _ck_su(W,I) (_suiP(W,I) ? (_jit_UL(I) & _MASK(W)) : JITFAIL( "integer `"#I"' too large for "#W"-bit field"))
|
||||
#define _ck_d(W,I) (_siP(W,I) ? (_jit_UL(I) & _MASK(W)) : JITFAIL( "displacement `"#I"' too large for "#W"-bit field"))
|
||||
#endif
|
||||
|
||||
#define _s0P(I) ((I)==0)
|
||||
#define _s8P(I) _siP(8,I)
|
||||
#define _s16P(I) _siP(16,I)
|
||||
#define _u8P(I) _uiP(8,I)
|
||||
#define _u16P(I) _uiP(16,I)
|
||||
|
||||
#define _su8(I) _ck_su(8,I)
|
||||
#define _su16(I) _ck_su(16,I)
|
||||
|
||||
#define _s1(I) _ck_s( 1,I)
|
||||
#define _s2(I) _ck_s( 2,I)
|
||||
#define _s3(I) _ck_s( 3,I)
|
||||
#define _s4(I) _ck_s( 4,I)
|
||||
#define _s5(I) _ck_s( 5,I)
|
||||
#define _s6(I) _ck_s( 6,I)
|
||||
#define _s7(I) _ck_s( 7,I)
|
||||
#define _s8(I) _ck_s( 8,I)
|
||||
#define _s9(I) _ck_s( 9,I)
|
||||
#define _s10(I) _ck_s(10,I)
|
||||
#define _s11(I) _ck_s(11,I)
|
||||
#define _s12(I) _ck_s(12,I)
|
||||
#define _s13(I) _ck_s(13,I)
|
||||
#define _s14(I) _ck_s(14,I)
|
||||
#define _s15(I) _ck_s(15,I)
|
||||
#define _s16(I) _ck_s(16,I)
|
||||
#define _s17(I) _ck_s(17,I)
|
||||
#define _s18(I) _ck_s(18,I)
|
||||
#define _s19(I) _ck_s(19,I)
|
||||
#define _s20(I) _ck_s(20,I)
|
||||
#define _s21(I) _ck_s(21,I)
|
||||
#define _s22(I) _ck_s(22,I)
|
||||
#define _s23(I) _ck_s(23,I)
|
||||
#define _s24(I) _ck_s(24,I)
|
||||
#define _s25(I) _ck_s(25,I)
|
||||
#define _s26(I) _ck_s(26,I)
|
||||
#define _s27(I) _ck_s(27,I)
|
||||
#define _s28(I) _ck_s(28,I)
|
||||
#define _s29(I) _ck_s(29,I)
|
||||
#define _s30(I) _ck_s(30,I)
|
||||
#define _s31(I) _ck_s(31,I)
|
||||
#define _u1(I) _ck_u( 1,I)
|
||||
#define _u2(I) _ck_u( 2,I)
|
||||
#define _u3(I) _ck_u( 3,I)
|
||||
#define _u4(I) _ck_u( 4,I)
|
||||
#define _u5(I) _ck_u( 5,I)
|
||||
#define _u6(I) _ck_u( 6,I)
|
||||
#define _u7(I) _ck_u( 7,I)
|
||||
#define _u8(I) _ck_u( 8,I)
|
||||
#define _u9(I) _ck_u( 9,I)
|
||||
#define _u10(I) _ck_u(10,I)
|
||||
#define _u11(I) _ck_u(11,I)
|
||||
#define _u12(I) _ck_u(12,I)
|
||||
#define _u13(I) _ck_u(13,I)
|
||||
#define _u14(I) _ck_u(14,I)
|
||||
#define _u15(I) _ck_u(15,I)
|
||||
#define _u16(I) _ck_u(16,I)
|
||||
#define _u17(I) _ck_u(17,I)
|
||||
#define _u18(I) _ck_u(18,I)
|
||||
#define _u19(I) _ck_u(19,I)
|
||||
#define _u20(I) _ck_u(20,I)
|
||||
#define _u21(I) _ck_u(21,I)
|
||||
#define _u22(I) _ck_u(22,I)
|
||||
#define _u23(I) _ck_u(23,I)
|
||||
#define _u24(I) _ck_u(24,I)
|
||||
#define _u25(I) _ck_u(25,I)
|
||||
#define _u26(I) _ck_u(26,I)
|
||||
#define _u27(I) _ck_u(27,I)
|
||||
#define _u28(I) _ck_u(28,I)
|
||||
#define _u29(I) _ck_u(29,I)
|
||||
#define _u30(I) _ck_u(30,I)
|
||||
#define _u31(I) _ck_u(31,I)
|
||||
|
||||
#endif /* __lightning_asm_common_h */
|
||||
624
src/runtime/c/pgf/lightning/core-common.h
Normal file
624
src/runtime/c/pgf/lightning/core-common.h
Normal file
@@ -0,0 +1,624 @@
|
||||
/******************************** -*- C -*- ****************************
|
||||
*
|
||||
* Platform-independent layer support
|
||||
*
|
||||
***********************************************************************/
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* Copyright 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
|
||||
* Written by Paolo Bonzini.
|
||||
*
|
||||
* This file is part of GNU lightning.
|
||||
*
|
||||
* GNU lightning is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* GNU lightning 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 Lesser General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with GNU lightning; see the file COPYING.LESSER; if not, write to the
|
||||
* Free Software Foundation, 59 Temple Place - Suite 330, Boston,
|
||||
* MA 02111-1307, USA.
|
||||
*
|
||||
***********************************************************************/
|
||||
|
||||
|
||||
#ifndef __lightning_core_common_h
|
||||
#define __lightning_core_common_h_
|
||||
|
||||
typedef struct {
|
||||
union {
|
||||
jit_insn *pc;
|
||||
_uc *uc_pc;
|
||||
_us *us_pc;
|
||||
_ui *ui_pc;
|
||||
_ul *ul_pc;
|
||||
} x;
|
||||
struct jit_fp *fp;
|
||||
struct jit_local_state jitl;
|
||||
} jit_state;
|
||||
|
||||
#ifdef jit_init
|
||||
static jit_state _jit = jit_init ();
|
||||
#else
|
||||
static jit_state _jit;
|
||||
#endif
|
||||
|
||||
#define JIT_NOREG (-1)
|
||||
#define JIT_R0 JIT_R(0)
|
||||
#define JIT_R1 JIT_R(1)
|
||||
#define JIT_R2 JIT_R(2)
|
||||
#define JIT_V0 JIT_V(0)
|
||||
#define JIT_V1 JIT_V(1)
|
||||
#define JIT_V2 JIT_V(2)
|
||||
|
||||
#define _jitl _jit.jitl
|
||||
|
||||
#define jit_get_ip() (*(jit_code *) &_jit.x.pc)
|
||||
#define jit_set_ip(ptr) (_jit.x.pc = (ptr), jit_get_ip ())
|
||||
#define jit_get_label() (_jit.x.pc)
|
||||
#define jit_forward() (_jit.x.pc)
|
||||
|
||||
#define jit_field(struc, f) ( ((long) (&((struc *) 8)->f) ) - 8)
|
||||
#define jit_ptr_field(struc_p, f) ( ((long) (&((struc_p) 8)->f) ) - 8)
|
||||
|
||||
/* realignment via N-byte no-ops */
|
||||
|
||||
#ifndef jit_align
|
||||
#define jit_align(n)
|
||||
#endif
|
||||
|
||||
/* jit_code: union of many possible function pointer types. Returned
|
||||
* by jit_get_ip().
|
||||
*/
|
||||
typedef union jit_code {
|
||||
char *ptr;
|
||||
void (*vptr)(void);
|
||||
char (*cptr)(void);
|
||||
unsigned char (*ucptr)(void);
|
||||
short (*sptr)(void);
|
||||
unsigned short (*usptr)(void);
|
||||
int (*iptr)(void);
|
||||
unsigned int (*uiptr)(void);
|
||||
long (*lptr)(void);
|
||||
unsigned long (*ulptr)(void);
|
||||
void * (*pptr)(void);
|
||||
float (*fptr)(void);
|
||||
double (*dptr)(void);
|
||||
} jit_code;
|
||||
|
||||
#ifndef jit_fill_delay_after
|
||||
#define jit_fill_delay_after(branch) (branch)
|
||||
#endif
|
||||
|
||||
#define jit_delay(insn, branch) ((insn), jit_fill_delay_after(branch))
|
||||
|
||||
|
||||
/* ALU synonyms */
|
||||
#define jit_addi_ui(d, rs, is) jit_addi_i((d), (rs), (is))
|
||||
#define jit_addr_ui(d, s1, s2) jit_addr_i((d), (s1), (s2))
|
||||
#define jit_addci_ui(d, rs, is) jit_addci_i((d), (rs), (is))
|
||||
#define jit_addcr_ui(d, s1, s2) jit_addcr_i((d), (s1), (s2))
|
||||
#define jit_addxi_ui(d, rs, is) jit_addxi_i((d), (rs), (is))
|
||||
#define jit_addxr_ui(d, s1, s2) jit_addxr_i((d), (s1), (s2))
|
||||
#define jit_andi_ui(d, rs, is) jit_andi_i((d), (rs), (is))
|
||||
#define jit_andr_ui(d, s1, s2) jit_andr_i((d), (s1), (s2))
|
||||
#define jit_lshi_ui(d, rs, is) jit_lshi_i((d), (rs), (is))
|
||||
#define jit_lshr_ui(d, s1, s2) jit_lshr_i((d), (s1), (s2))
|
||||
#define jit_movi_ui(d, rs) jit_movi_i((d), (rs))
|
||||
#define jit_movr_ui(d, rs) jit_movr_i((d), (rs))
|
||||
#define jit_ori_ui(d, rs, is) jit_ori_i((d), (rs), (is))
|
||||
#define jit_orr_ui(d, s1, s2) jit_orr_i((d), (s1), (s2))
|
||||
#define jit_rsbi_ui(d, rs, is) jit_rsbi_i((d), (rs), (is))
|
||||
#define jit_rsbr_ui(d, s1, s2) jit_rsbr_i((d), (s1), (s2))
|
||||
#define jit_subi_ui(d, rs, is) jit_subi_i((d), (rs), (is))
|
||||
#define jit_subr_ui(d, s1, s2) jit_subr_i((d), (s1), (s2))
|
||||
#define jit_subci_ui(d, rs, is) jit_subci_i((d), (rs), (is))
|
||||
#define jit_subcr_ui(d, s1, s2) jit_subcr_i((d), (s1), (s2))
|
||||
#define jit_subxi_ui(d, rs, is) jit_subxi_i((d), (rs), (is))
|
||||
#define jit_subxr_ui(d, s1, s2) jit_subxr_i((d), (s1), (s2))
|
||||
#define jit_xori_ui(d, rs, is) jit_xori_i((d), (rs), (is))
|
||||
#define jit_xorr_ui(d, s1, s2) jit_xorr_i((d), (s1), (s2))
|
||||
|
||||
#define jit_addi_ul(d, rs, is) jit_addi_l((d), (rs), (is))
|
||||
#define jit_addr_ul(d, s1, s2) jit_addr_l((d), (s1), (s2))
|
||||
#define jit_addci_ul(d, rs, is) jit_addci_l((d), (rs), (is))
|
||||
#define jit_addcr_ul(d, s1, s2) jit_addcr_l((d), (s1), (s2))
|
||||
#define jit_addxi_ul(d, rs, is) jit_addxi_l((d), (rs), (is))
|
||||
#define jit_addxr_ul(d, s1, s2) jit_addxr_l((d), (s1), (s2))
|
||||
#define jit_andi_ul(d, rs, is) jit_andi_l((d), (rs), (is))
|
||||
#define jit_andr_ul(d, s1, s2) jit_andr_l((d), (s1), (s2))
|
||||
#define jit_lshi_ul(d, rs, is) jit_lshi_l((d), (rs), (is))
|
||||
#define jit_lshr_ul(d, s1, s2) jit_lshr_l((d), (s1), (s2))
|
||||
#define jit_movi_ul(d, rs) jit_movi_l((d), (rs))
|
||||
#define jit_movr_ul(d, rs) jit_movr_l((d), (rs))
|
||||
#define jit_ori_ul(d, rs, is) jit_ori_l((d), (rs), (is))
|
||||
#define jit_orr_ul(d, s1, s2) jit_orr_l((d), (s1), (s2))
|
||||
#define jit_rsbi_ul(d, rs, is) jit_rsbi_l((d), (rs), (is))
|
||||
#define jit_rsbr_ul(d, s1, s2) jit_rsbr_l((d), (s1), (s2))
|
||||
#define jit_subi_ul(d, rs, is) jit_subi_l((d), (rs), (is))
|
||||
#define jit_subr_ul(d, s1, s2) jit_subr_l((d), (s1), (s2))
|
||||
#define jit_subci_ul(d, rs, is) jit_subci_l((d), (rs), (is))
|
||||
#define jit_subcr_ul(d, s1, s2) jit_subcr_l((d), (s1), (s2))
|
||||
#define jit_subxi_ui(d, rs, is) jit_subxi_i((d), (rs), (is))
|
||||
#define jit_subxi_ul(d, rs, is) jit_subxi_l((d), (rs), (is))
|
||||
#define jit_subxr_ui(d, s1, s2) jit_subxr_i((d), (s1), (s2))
|
||||
#define jit_subxr_ul(d, s1, s2) jit_subxr_i((d), (s1), (s2))
|
||||
#define jit_xori_ul(d, rs, is) jit_xori_l((d), (rs), (is))
|
||||
#define jit_xorr_ul(d, s1, s2) jit_xorr_l((d), (s1), (s2))
|
||||
|
||||
#define jit_addr_p(d, s1, s2) jit_addr_ul((d), (s1), (s2))
|
||||
#define jit_addi_p(d, rs, is) jit_addi_ul((d), (rs), (long) (is))
|
||||
#define jit_movr_p(d, rs) jit_movr_ul((d), (rs))
|
||||
#define jit_subr_p(d, s1, s2) jit_subr_ul((d), (s1), (s2))
|
||||
#define jit_subi_p(d, rs, is) jit_subi_ul((d), (rs), (long) (is))
|
||||
#define jit_rsbi_p(d, rs, is) jit_rsbi_ul((d), (rs), (long) (is))
|
||||
|
||||
#ifndef jit_movi_p
|
||||
#define jit_movi_p(d, is) (jit_movi_ul((d), (long) (is)), _jit.x.pc)
|
||||
#endif
|
||||
|
||||
#define jit_patch(pv) jit_patch_at ((pv), (_jit.x.pc))
|
||||
|
||||
#ifndef jit_addci_i
|
||||
#define jit_addci_i(d, rs, is) jit_addi_i((d), (rs), (is))
|
||||
#define jit_addcr_i(d, s1, s2) jit_addr_i((d), (s1), (s2))
|
||||
#define jit_addci_l(d, rs, is) jit_addi_l((d), (rs), (is))
|
||||
#define jit_addcr_l(d, s1, s2) jit_addr_l((d), (s1), (s2))
|
||||
#endif
|
||||
|
||||
#ifndef jit_subcr_i
|
||||
#define jit_subcr_i(d, s1, s2) jit_subr_i((d), (s1), (s2))
|
||||
#endif
|
||||
|
||||
/* NEG is not mandatory -- pick an appropriate implementation */
|
||||
#ifndef jit_negr_i
|
||||
# ifdef JIT_RZERO
|
||||
# define jit_negr_i(d, rs) jit_subr_i((d), JIT_RZERO, (rs))
|
||||
# define jit_negr_l(d, rs) jit_subr_l((d), JIT_RZERO, (rs))
|
||||
# else /* !JIT_RZERO */
|
||||
# ifndef jit_rsbi_i
|
||||
# define jit_negr_i(d, rs) (jit_xori_i((d), (rs), -1), jit_addi_l((d), (d), 1))
|
||||
# define jit_negr_l(d, rs) (jit_xori_l((d), (rs), -1), jit_addi_l((d), (d), 1))
|
||||
# else /* jit_rsbi_i */
|
||||
# define jit_negr_i(d, rs) jit_rsbi_i((d), (rs), 0)
|
||||
# define jit_negr_l(d, rs) jit_rsbi_l((d), (rs), 0)
|
||||
# endif /* jit_rsbi_i */
|
||||
# endif /* !JIT_RZERO */
|
||||
#endif /* !jit_negr_i */
|
||||
|
||||
/* RSB is not mandatory */
|
||||
#ifndef jit_rsbi_i
|
||||
# define jit_rsbi_i(d, rs, is) (jit_subi_i((d), (rs), (is)), jit_negr_i((d), (d)))
|
||||
|
||||
# ifndef jit_rsbi_l
|
||||
# define jit_rsbi_l(d, rs, is) (jit_subi_l((d), (rs), (is)), jit_negr_l((d), (d)))
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* Common 'shortcut' implementations */
|
||||
#define jit_subi_i(d, rs, is) jit_addi_i((d), (rs), -(is))
|
||||
#define jit_subi_l(d, rs, is) jit_addi_l((d), (rs), -(is))
|
||||
#define jit_subci_i(d, rs, is) jit_addci_i((d), (rs), -(is))
|
||||
#define jit_subci_l(d, rs, is) jit_addci_l((d), (rs), -(is))
|
||||
#define jit_rsbr_f(d, s1, s2) jit_subr_f((d), (s2), (s1))
|
||||
#define jit_rsbr_d(d, s1, s2) jit_subr_d((d), (s2), (s1))
|
||||
#define jit_rsbr_i(d, s1, s2) jit_subr_i((d), (s2), (s1))
|
||||
#define jit_rsbr_l(d, s1, s2) jit_subr_l((d), (s2), (s1))
|
||||
#define jit_rsbr_p(d, s1, s2) jit_subr_p((d), (s2), (s1))
|
||||
|
||||
/* Unary */
|
||||
#define jit_notr_c(d, rs) jit_xori_c((d), (rs), 255)
|
||||
#define jit_notr_uc(d, rs) jit_xori_c((d), (rs), 255)
|
||||
#define jit_notr_s(d, rs) jit_xori_s((d), (rs), 65535)
|
||||
#define jit_notr_us(d, rs) jit_xori_s((d), (rs), 65535)
|
||||
#define jit_notr_i(d, rs) jit_xori_i((d), (rs), ~0)
|
||||
#define jit_notr_ui(d, rs) jit_xori_i((d), (rs), ~0)
|
||||
#define jit_notr_l(d, rs) jit_xori_l((d), (rs), ~0L)
|
||||
#define jit_notr_ul(d, rs) jit_xori_l((d), (rs), ~0L)
|
||||
|
||||
#ifndef jit_extr_c_ui
|
||||
#define jit_extr_c_ui(d, rs) jit_andi_ui((d), (rs), 0xFF)
|
||||
#endif
|
||||
#ifndef jit_extr_s_ui
|
||||
#define jit_extr_s_ui(d, rs) jit_andi_ui((d), (rs), 0xFFFF)
|
||||
#endif
|
||||
#ifndef jit_extr_c_i
|
||||
#define jit_extr_c_i(d, rs) (jit_lshi_i((d), (rs), 24), jit_rshi_i((d), (d), 24))
|
||||
#endif
|
||||
#ifndef jit_extr_s_i
|
||||
#define jit_extr_s_i(d, rs) (jit_lshi_i((d), (rs), 16), jit_rshi_i((d), (d), 16))
|
||||
#endif
|
||||
|
||||
#ifdef jit_addi_l /* sizeof(long) != sizeof(int) */
|
||||
#ifndef jit_extr_c_l
|
||||
#define jit_extr_c_l(d, rs) (jit_lshi_l((d), (rs), 56), jit_rshi_l((d), (d), 56))
|
||||
#endif
|
||||
#ifndef jit_extr_s_l
|
||||
#define jit_extr_s_l(d, rs) (jit_lshi_l((d), (rs), 48), jit_rshi_l((d), (d), 48))
|
||||
#endif
|
||||
#ifndef jit_extr_i_l
|
||||
#define jit_extr_i_l(d, rs) (jit_lshi_l((d), (rs), 32), jit_rshi_l((d), (d), 32))
|
||||
#endif
|
||||
#ifndef jit_extr_c_ul
|
||||
#define jit_extr_c_ul(d, rs) jit_andi_l((d), (rs), 0xFF)
|
||||
#endif
|
||||
#ifndef jit_extr_s_ul
|
||||
#define jit_extr_s_ul(d, rs) jit_andi_l((d), (rs), 0xFFFF)
|
||||
#endif
|
||||
#ifndef jit_extr_i_ul
|
||||
#define jit_extr_i_ul(d, rs) jit_andi_l((d), (rs), 0xFFFFFFFFUL)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define jit_extr_c_s(d, rs) jit_extr_c_i((d), (rs))
|
||||
#define jit_extr_c_us(d, rs) jit_extr_c_ui((d), (rs))
|
||||
#define jit_extr_uc_s(d, rs) jit_extr_uc_i((d), (rs))
|
||||
#define jit_extr_uc_us(d, rs) jit_extr_uc_ui((d), (rs))
|
||||
#define jit_extr_uc_i(d, rs) jit_extr_c_ui((d), (rs))
|
||||
#define jit_extr_uc_ui(d, rs) jit_extr_c_ui((d), (rs))
|
||||
#define jit_extr_us_i(d, rs) jit_extr_s_ui((d), (rs))
|
||||
#define jit_extr_us_ui(d, rs) jit_extr_s_ui((d), (rs))
|
||||
#define jit_extr_uc_l(d, rs) jit_extr_c_ul((d), (rs))
|
||||
#define jit_extr_uc_ul(d, rs) jit_extr_c_ul((d), (rs))
|
||||
#define jit_extr_us_l(d, rs) jit_extr_s_ul((d), (rs))
|
||||
#define jit_extr_us_ul(d, rs) jit_extr_s_ul((d), (rs))
|
||||
#define jit_extr_ui_l(d, rs) jit_extr_i_ul((d), (rs))
|
||||
#define jit_extr_ui_ul(d, rs) jit_extr_i_ul((d), (rs))
|
||||
|
||||
|
||||
/* NTOH/HTON is not mandatory for big endian architectures */
|
||||
#ifndef jit_ntoh_ui /* big endian */
|
||||
#define jit_ntoh_ui(d, rs) ((d) == (rs) ? (void)0 : jit_movr_i((d), (rs)))
|
||||
#define jit_ntoh_us(d, rs) ((d) == (rs) ? (void)0 : jit_movr_i((d), (rs)))
|
||||
#endif /* big endian */
|
||||
|
||||
/* hton is a synonym for ntoh */
|
||||
#define jit_hton_ui(d, rs) jit_ntoh_ui((d), (rs))
|
||||
#define jit_hton_us(d, rs) jit_ntoh_us((d), (rs))
|
||||
|
||||
/* Stack synonyms */
|
||||
#define jit_pushr_ui(rs) jit_pushr_i(rs)
|
||||
#define jit_popr_ui(rs) jit_popr_i(rs)
|
||||
#define jit_pushr_ul(rs) jit_pushr_l(rs)
|
||||
#define jit_popr_ul(rs) jit_popr_l(rs)
|
||||
#define jit_pushr_p(rs) jit_pushr_ul(rs)
|
||||
#define jit_popr_p(rs) jit_popr_ul(rs)
|
||||
|
||||
#define jit_prepare(nint) jit_prepare_i((nint))
|
||||
#define jit_pusharg_c(rs) jit_pusharg_i(rs)
|
||||
#define jit_pusharg_s(rs) jit_pusharg_i(rs)
|
||||
#define jit_pusharg_uc(rs) jit_pusharg_i(rs)
|
||||
#define jit_pusharg_us(rs) jit_pusharg_i(rs)
|
||||
#define jit_pusharg_ui(rs) jit_pusharg_i(rs)
|
||||
#define jit_pusharg_ul(rs) jit_pusharg_l(rs)
|
||||
#define jit_pusharg_p(rs) jit_pusharg_ul(rs)
|
||||
|
||||
/* Memory synonyms */
|
||||
|
||||
#ifdef JIT_RZERO
|
||||
#ifndef jit_ldi_c
|
||||
#define jit_ldi_c(rd, is) jit_ldxi_c((rd), JIT_RZERO, (is))
|
||||
#define jit_sti_c(id, rs) jit_stxi_c((id), JIT_RZERO, (rs))
|
||||
#define jit_ldi_s(rd, is) jit_ldxi_s((rd), JIT_RZERO, (is))
|
||||
#define jit_sti_s(id, rs) jit_stxi_s((id), JIT_RZERO, (rs))
|
||||
#define jit_ldi_i(rd, is) jit_ldxi_i((rd), JIT_RZERO, (is))
|
||||
#define jit_sti_i(id, rs) jit_stxi_i((id), JIT_RZERO, (rs))
|
||||
#define jit_ldi_l(rd, is) jit_ldxi_l((rd), JIT_RZERO, (is))
|
||||
#define jit_sti_l(id, rs) jit_stxi_l((id), JIT_RZERO, (rs))
|
||||
#define jit_ldi_uc(rd, is) jit_ldxi_uc((rd), JIT_RZERO, (is))
|
||||
#define jit_ldi_us(rd, is) jit_ldxi_us((rd), JIT_RZERO, (is))
|
||||
#define jit_ldi_ui(rd, is) jit_ldxi_ui((rd), JIT_RZERO, (is))
|
||||
#define jit_ldi_ul(rd, is) jit_ldxi_ul((rd), JIT_RZERO, (is))
|
||||
#endif
|
||||
|
||||
#ifndef jit_ldr_c
|
||||
#define jit_ldr_c(rd, rs) jit_ldxr_c((rd), JIT_RZERO, (rs))
|
||||
#define jit_str_c(rd, rs) jit_stxr_c(JIT_RZERO, (rd), (rs))
|
||||
#define jit_ldr_s(rd, rs) jit_ldxr_s((rd), JIT_RZERO, (rs))
|
||||
#define jit_str_s(rd, rs) jit_stxr_s(JIT_RZERO, (rd), (rs))
|
||||
#define jit_ldr_i(rd, rs) jit_ldxr_i((rd), JIT_RZERO, (rs))
|
||||
#define jit_str_i(rd, rs) jit_stxr_i(JIT_RZERO, (rd), (rs))
|
||||
#define jit_ldr_l(rd, rs) jit_ldxr_l((rd), JIT_RZERO, (rs))
|
||||
#define jit_str_l(rd, rs) jit_stxr_l(JIT_RZERO, (rd), (rs))
|
||||
#define jit_ldr_uc(rd, rs) jit_ldxr_uc((rd), JIT_RZERO, (rs))
|
||||
#define jit_ldr_us(rd, rs) jit_ldxr_us((rd), JIT_RZERO, (rs))
|
||||
#define jit_ldr_ui(rd, rs) jit_ldxr_ui((rd), JIT_RZERO, (rs))
|
||||
#define jit_ldr_ul(rd, rs) jit_ldxr_ul((rd), JIT_RZERO, (rs))
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define jit_str_uc(rd, rs) jit_str_c((rd), (rs))
|
||||
#define jit_sti_uc(id, rs) jit_sti_c((id), (rs))
|
||||
#define jit_stxr_uc(d1, d2, rs) jit_stxr_c((d1), (d2), (rs))
|
||||
#define jit_stxi_uc(id, rd, is) jit_stxi_c((id), (rd), (is))
|
||||
|
||||
#define jit_str_us(rd, rs) jit_str_s((rd), (rs))
|
||||
#define jit_sti_us(id, rs) jit_sti_s((id), (rs))
|
||||
#define jit_stxr_us(d1, d2, rs) jit_stxr_s((d1), (d2), (rs))
|
||||
#define jit_stxi_us(id, rd, is) jit_stxi_s((id), (rd), (is))
|
||||
|
||||
#define jit_str_ui(rd, rs) jit_str_i((rd), (rs))
|
||||
#define jit_sti_ui(id, rs) jit_sti_i((id), (rs))
|
||||
#define jit_stxr_ui(d1, d2, rs) jit_stxr_i((d1), (d2), (rs))
|
||||
#define jit_stxi_ui(id, rd, is) jit_stxi_i((id), (rd), (is))
|
||||
|
||||
#define jit_str_ul(rd, rs) jit_str_l((rd), (rs))
|
||||
#define jit_sti_ul(id, rs) jit_sti_l((id), (rs))
|
||||
#define jit_stxr_ul(d1, d2, rs) jit_stxr_l((d1), (d2), (rs))
|
||||
#define jit_stxi_ul(id, rd, is) jit_stxi_l((id), (rd), (is))
|
||||
|
||||
#define jit_str_p(rd, rs) jit_str_l((rd), (rs))
|
||||
#define jit_sti_p(id, rs) jit_sti_l((id), (rs))
|
||||
#define jit_stxr_p(d1, d2, rs) jit_stxr_l((d1), (d2), (rs))
|
||||
#define jit_stxi_p(id, rd, is) jit_stxi_l((id), (rd), (is))
|
||||
|
||||
#define jit_ldr_p(rd, rs) jit_ldr_l((rd), (rs))
|
||||
#define jit_ldi_p(rd, is) jit_ldi_l((rd), (is))
|
||||
#define jit_ldxr_p(rd, s1, s2) jit_ldxr_l((rd), (s1), (s2))
|
||||
#define jit_ldxi_p(rd, rs, is) jit_ldxi_l((rd), (rs), (is))
|
||||
|
||||
|
||||
/* Boolean & branch synonyms */
|
||||
#define jit_eqr_ui(d, s1, s2) jit_eqr_i((d), (s1), (s2))
|
||||
#define jit_eqi_ui(d, rs, is) jit_eqi_i((d), (rs), (is))
|
||||
#define jit_ner_ui(d, s1, s2) jit_ner_i((d), (s1), (s2))
|
||||
#define jit_nei_ui(d, rs, is) jit_nei_i((d), (rs), (is))
|
||||
|
||||
#define jit_eqr_ul(d, s1, s2) jit_eqr_l((d), (s1), (s2))
|
||||
#define jit_eqi_ul(d, rs, is) jit_eqi_l((d), (rs), (is))
|
||||
#define jit_ner_ul(d, s1, s2) jit_ner_l((d), (s1), (s2))
|
||||
#define jit_nei_ul(d, rs, is) jit_nei_l((d), (rs), (is))
|
||||
|
||||
#define jit_beqr_ui(label, s1, s2) jit_beqr_i((label), (s1), (s2))
|
||||
#define jit_beqi_ui(label, rs, is) jit_beqi_i((label), (rs), (is))
|
||||
#define jit_bner_ui(label, s1, s2) jit_bner_i((label), (s1), (s2))
|
||||
#define jit_bnei_ui(label, rs, is) jit_bnei_i((label), (rs), (is))
|
||||
#define jit_bmcr_ui(label, s1, s2) jit_bmcr_i((label), (s1), (s2))
|
||||
#define jit_bmci_ui(label, rs, is) jit_bmci_i((label), (rs), (is))
|
||||
#define jit_bmsr_ui(label, s1, s2) jit_bmsr_i((label), (s1), (s2))
|
||||
#define jit_bmsi_ui(label, rs, is) jit_bmsi_i((label), (rs), (is))
|
||||
|
||||
#define jit_beqr_ul(label, s1, s2) jit_beqr_l((label), (s1), (s2))
|
||||
#define jit_beqi_ul(label, rs, is) jit_beqi_l((label), (rs), (is))
|
||||
#define jit_bner_ul(label, s1, s2) jit_bner_l((label), (s1), (s2))
|
||||
#define jit_bnei_ul(label, rs, is) jit_bnei_l((label), (rs), (is))
|
||||
#define jit_bmcr_ul(label, s1, s2) jit_bmcr_l((label), (s1), (s2))
|
||||
#define jit_bmci_ul(label, rs, is) jit_bmci_l((label), (rs), (is))
|
||||
#define jit_bmsr_ul(label, s1, s2) jit_bmsr_l((label), (s1), (s2))
|
||||
#define jit_bmsi_ul(label, rs, is) jit_bmsi_l((label), (rs), (is))
|
||||
|
||||
#define jit_ltr_p(d, s1, s2) jit_ltr_ul((d), (s1), (s2))
|
||||
#define jit_lti_p(d, rs, is) jit_lti_ul((d), (rs), (is))
|
||||
#define jit_ler_p(d, s1, s2) jit_ler_ul((d), (s1), (s2))
|
||||
#define jit_lei_p(d, rs, is) jit_lei_ul((d), (rs), (is))
|
||||
#define jit_gtr_p(d, s1, s2) jit_gtr_ul((d), (s1), (s2))
|
||||
#define jit_gti_p(d, rs, is) jit_gti_ul((d), (rs), (is))
|
||||
#define jit_ger_p(d, s1, s2) jit_ger_ul((d), (s1), (s2))
|
||||
#define jit_gei_p(d, rs, is) jit_gei_ul((d), (rs), (is))
|
||||
#define jit_eqr_p(d, s1, s2) jit_eqr_ul((d), (s1), (s2))
|
||||
#define jit_eqi_p(d, rs, is) jit_eqi_ul((d), (rs), (is))
|
||||
#define jit_ner_p(d, s1, s2) jit_ner_ul((d), (s1), (s2))
|
||||
#define jit_nei_p(d, rs, is) jit_nei_ul((d), (rs), (is))
|
||||
|
||||
#define jit_bltr_p(label, s1, s2) jit_bltr_ul((label), (s1), (s2))
|
||||
#define jit_blti_p(label, rs, is) jit_blti_ul((label), (rs), (is))
|
||||
#define jit_bler_p(label, s1, s2) jit_bler_ul((label), (s1), (s2))
|
||||
#define jit_blei_p(label, rs, is) jit_blei_ul((label), (rs), (is))
|
||||
#define jit_bgtr_p(label, s1, s2) jit_bgtr_ul((label), (s1), (s2))
|
||||
#define jit_bgti_p(label, rs, is) jit_bgti_ul((label), (rs), (is))
|
||||
#define jit_bger_p(label, s1, s2) jit_bger_ul((label), (s1), (s2))
|
||||
#define jit_bgei_p(label, rs, is) jit_bgei_ul((label), (rs), (is))
|
||||
#define jit_beqr_p(label, s1, s2) jit_beqr_ul((label), (s1), (s2))
|
||||
#define jit_beqi_p(label, rs, is) jit_beqi_ul((label), (rs), (is))
|
||||
#define jit_bner_p(label, s1, s2) jit_bner_ul((label), (s1), (s2))
|
||||
#define jit_bnei_p(label, rs, is) jit_bnei_ul((label), (rs), (is))
|
||||
|
||||
#define jit_retval_ui(rd) jit_retval_i((rd))
|
||||
#define jit_retval_uc(rd) jit_retval_i((rd))
|
||||
#define jit_retval_us(rd) jit_retval_i((rd))
|
||||
#define jit_retval_ul(rd) jit_retval_l((rd))
|
||||
#define jit_retval_p(rd) jit_retval_ul((rd))
|
||||
#define jit_retval_c(rd) jit_retval_i((rd))
|
||||
#define jit_retval_s(rd) jit_retval_i((rd))
|
||||
|
||||
/* This was a bug, but we keep it. */
|
||||
#define jit_retval(rd) jit_retval_i ((rd))
|
||||
|
||||
#ifndef jit_finish
|
||||
#define jit_finish(sub) jit_calli(sub)
|
||||
#endif
|
||||
|
||||
#ifndef jit_finishr
|
||||
#define jit_finishr(reg) jit_callr(reg)
|
||||
#endif
|
||||
|
||||
#ifndef jit_prolog
|
||||
#define jit_prolog(numargs)
|
||||
#endif
|
||||
|
||||
#ifndef jit_leaf
|
||||
#define jit_leaf(numargs) jit_prolog(numargs)
|
||||
#endif
|
||||
|
||||
#ifndef jit_getarg_c
|
||||
#ifndef JIT_FP
|
||||
#define jit_getarg_c(reg, ofs) jit_extr_c_i ((reg), (ofs))
|
||||
#define jit_getarg_i(reg, ofs) jit_movr_i ((reg), (ofs))
|
||||
#define jit_getarg_l(reg, ofs) jit_movr_l ((reg), (ofs))
|
||||
#define jit_getarg_p(reg, ofs) jit_movr_p ((reg), (ofs))
|
||||
#define jit_getarg_s(reg, ofs) jit_extr_s_i ((reg), (ofs))
|
||||
#define jit_getarg_uc(reg, ofs) jit_extr_uc_ui((reg), (ofs))
|
||||
#define jit_getarg_ui(reg, ofs) jit_movr_ui ((reg), (ofs))
|
||||
#define jit_getarg_ul(reg, ofs) jit_extr_uc_ul((reg), (ofs))
|
||||
#define jit_getarg_us(reg, ofs) jit_extr_us_ul((reg), (ofs))
|
||||
#else
|
||||
#define jit_getarg_c(reg, ofs) jit_ldxi_c((reg), JIT_FP, (ofs));
|
||||
#define jit_getarg_uc(reg, ofs) jit_ldxi_uc((reg), JIT_FP, (ofs));
|
||||
#define jit_getarg_s(reg, ofs) jit_ldxi_s((reg), JIT_FP, (ofs));
|
||||
#define jit_getarg_us(reg, ofs) jit_ldxi_us((reg), JIT_FP, (ofs));
|
||||
#define jit_getarg_i(reg, ofs) jit_ldxi_i((reg), JIT_FP, (ofs));
|
||||
#define jit_getarg_ui(reg, ofs) jit_ldxi_ui((reg), JIT_FP, (ofs));
|
||||
#define jit_getarg_l(reg, ofs) jit_ldxi_l((reg), JIT_FP, (ofs));
|
||||
#define jit_getarg_ul(reg, ofs) jit_ldxi_ul((reg), JIT_FP, (ofs));
|
||||
#define jit_getarg_p(reg, ofs) jit_ldxi_p((reg), JIT_FP, (ofs));
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
/* Common definitions when sizeof(long) = sizeof(int) */
|
||||
#ifndef jit_addi_l
|
||||
#define JIT_LONG_IS_INT
|
||||
|
||||
/* ALU */
|
||||
#define jit_addi_l(d, rs, is) jit_addi_i((d), (rs), (is))
|
||||
#define jit_addr_l(d, s1, s2) jit_addr_i((d), (s1), (s2))
|
||||
#define jit_addci_l(d, rs, is) jit_addci_i((d), (rs), (is))
|
||||
#define jit_addcr_l(d, s1, s2) jit_addcr_i((d), (s1), (s2))
|
||||
#define jit_addxi_l(d, rs, is) jit_addxi_i((d), (rs), (is))
|
||||
#define jit_addxr_l(d, s1, s2) jit_addxr_i((d), (s1), (s2))
|
||||
#define jit_andi_l(d, rs, is) jit_andi_i((d), (rs), (is))
|
||||
#define jit_andr_l(d, s1, s2) jit_andr_i((d), (s1), (s2))
|
||||
#define jit_divi_l(d, rs, is) jit_divi_i((d), (rs), (is))
|
||||
#define jit_divr_l(d, s1, s2) jit_divr_i((d), (s1), (s2))
|
||||
#define jit_hmuli_l(d, rs, is) jit_hmuli_i((d), (rs), (is))
|
||||
#define jit_hmulr_l(d, s1, s2) jit_hmulr_i((d), (s1), (s2))
|
||||
#define jit_lshi_l(d, rs, is) jit_lshi_i((d), (rs), (is))
|
||||
#define jit_lshr_l(d, s1, s2) jit_lshr_i((d), (s1), (s2))
|
||||
#define jit_modi_l(d, rs, is) jit_modi_i((d), (rs), (is))
|
||||
#define jit_modr_l(d, s1, s2) jit_modr_i((d), (s1), (s2))
|
||||
#define jit_muli_l(d, rs, is) jit_muli_i((d), (rs), (is))
|
||||
#define jit_mulr_l(d, s1, s2) jit_mulr_i((d), (s1), (s2))
|
||||
#define jit_ori_l(d, rs, is) jit_ori_i((d), (rs), (is))
|
||||
#define jit_orr_l(d, s1, s2) jit_orr_i((d), (s1), (s2))
|
||||
#define jit_rshi_l(d, rs, is) jit_rshi_i((d), (rs), (is))
|
||||
#define jit_rshr_l(d, s1, s2) jit_rshr_i((d), (s1), (s2))
|
||||
#define jit_subr_l(d, s1, s2) jit_subr_i((d), (s1), (s2))
|
||||
#define jit_subcr_l(d, s1, s2) jit_subcr_i((d), (s1), (s2))
|
||||
#define jit_subxi_l(d, rs, is) jit_subxi_i((d), (rs), (is))
|
||||
#define jit_subxr_l(d, s1, s2) jit_subxr_i((d), (s1), (s2))
|
||||
#define jit_xori_l(d, rs, is) jit_xori_i((d), (rs), (is))
|
||||
#define jit_xorr_l(d, s1, s2) jit_xorr_i((d), (s1), (s2))
|
||||
|
||||
#ifndef jit_rsbi_l
|
||||
#define jit_rsbi_l(d, rs, is) jit_rsbi_i((d), (rs), (is))
|
||||
#endif
|
||||
|
||||
#define jit_divi_ul(d, rs, is) jit_divi_ui((d), (rs), (is))
|
||||
#define jit_divr_ul(d, s1, s2) jit_divr_ui((d), (s1), (s2))
|
||||
#define jit_hmuli_ul(d, rs, is) jit_hmuli_ui((d), (rs), (is))
|
||||
#define jit_hmulr_ul(d, s1, s2) jit_hmulr_ui((d), (s1), (s2))
|
||||
#define jit_modi_ul(d, rs, is) jit_modi_ui((d), (rs), (is))
|
||||
#define jit_modr_ul(d, s1, s2) jit_modr_ui((d), (s1), (s2))
|
||||
#define jit_muli_ul(d, rs, is) jit_muli_ui((d), (rs), (is))
|
||||
#define jit_mulr_ul(d, s1, s2) jit_mulr_ui((d), (s1), (s2))
|
||||
#define jit_rshi_ul(d, rs, is) jit_rshi_ui((d), (rs), (is))
|
||||
#define jit_rshr_ul(d, s1, s2) jit_rshr_ui((d), (s1), (s2))
|
||||
|
||||
/* Sign/Zero extension */
|
||||
#define jit_extr_c_l(d, rs) jit_extr_c_i(d, rs)
|
||||
#define jit_extr_c_ul(d, rs) jit_extr_c_ui(d, rs)
|
||||
#define jit_extr_s_l(d, rs) jit_extr_s_i(d, rs)
|
||||
#define jit_extr_s_ul(d, rs) jit_extr_s_ui(d, rs)
|
||||
#define jit_extr_i_l(d, rs) jit_movr_i(d, rs)
|
||||
#define jit_extr_i_ul(d, rs) jit_movr_i(d, rs)
|
||||
|
||||
/* Unary */
|
||||
#define jit_movi_l(d, rs) jit_movi_i((d), (rs))
|
||||
#define jit_movr_l(d, rs) jit_movr_i((d), (rs))
|
||||
|
||||
/* Stack */
|
||||
#define jit_pushr_l(rs) jit_pushr_i(rs)
|
||||
#define jit_popr_l(rs) jit_popr_i(rs)
|
||||
#define jit_pusharg_l(rs) jit_pusharg_i(rs)
|
||||
|
||||
/* Memory */
|
||||
#ifndef JIT_RZERO
|
||||
#define jit_ldr_l(d, rs) jit_ldr_i((d), (rs))
|
||||
#define jit_ldi_l(d, is) jit_ldi_i((d), (is))
|
||||
#define jit_str_l(d, rs) jit_str_i((d), (rs))
|
||||
#define jit_sti_l(d, is) jit_sti_i((d), (is))
|
||||
#define jit_ldr_ui(d, rs) jit_ldr_i((d), (rs))
|
||||
#define jit_ldi_ui(d, is) jit_ldi_i((d), (is))
|
||||
#define jit_ldr_ul(d, rs) jit_ldr_ui((d), (rs))
|
||||
#define jit_ldi_ul(d, is) jit_ldi_ui((d), (is))
|
||||
#endif
|
||||
|
||||
#define jit_ldxr_l(d, s1, s2) jit_ldxr_i((d), (s1), (s2))
|
||||
#define jit_ldxi_l(d, rs, is) jit_ldxi_i((d), (rs), (is))
|
||||
#define jit_stxr_l(d, s1, s2) jit_stxr_i((d), (s1), (s2))
|
||||
#define jit_stxi_l(d, rs, is) jit_stxi_i((d), (rs), (is))
|
||||
#define jit_ldxr_ui(d, s1, s2) jit_ldxr_i((d), (s1), (s2))
|
||||
#define jit_ldxi_ui(d, rs, is) jit_ldxi_i((d), (rs), (is))
|
||||
#define jit_ldxr_ul(d, s1, s2) jit_ldxr_ui((d), (s1), (s2))
|
||||
#define jit_ldxi_ul(d, rs, is) jit_ldxi_ui((d), (rs), (is))
|
||||
|
||||
|
||||
/* Boolean */
|
||||
#define jit_ltr_l(d, s1, s2) jit_ltr_i((d), (s1), (s2))
|
||||
#define jit_lti_l(d, rs, is) jit_lti_i((d), (rs), (is))
|
||||
#define jit_ler_l(d, s1, s2) jit_ler_i((d), (s1), (s2))
|
||||
#define jit_lei_l(d, rs, is) jit_lei_i((d), (rs), (is))
|
||||
#define jit_gtr_l(d, s1, s2) jit_gtr_i((d), (s1), (s2))
|
||||
#define jit_gti_l(d, rs, is) jit_gti_i((d), (rs), (is))
|
||||
#define jit_ger_l(d, s1, s2) jit_ger_i((d), (s1), (s2))
|
||||
#define jit_gei_l(d, rs, is) jit_gei_i((d), (rs), (is))
|
||||
#define jit_eqr_l(d, s1, s2) jit_eqr_i((d), (s1), (s2))
|
||||
#define jit_eqi_l(d, rs, is) jit_eqi_i((d), (rs), (is))
|
||||
#define jit_ner_l(d, s1, s2) jit_ner_i((d), (s1), (s2))
|
||||
#define jit_nei_l(d, rs, is) jit_nei_i((d), (rs), (is))
|
||||
#define jit_ltr_ul(d, s1, s2) jit_ltr_ui((d), (s1), (s2))
|
||||
#define jit_lti_ul(d, rs, is) jit_lti_ui((d), (rs), (is))
|
||||
#define jit_ler_ul(d, s1, s2) jit_ler_ui((d), (s1), (s2))
|
||||
#define jit_lei_ul(d, rs, is) jit_lei_ui((d), (rs), (is))
|
||||
#define jit_gtr_ul(d, s1, s2) jit_gtr_ui((d), (s1), (s2))
|
||||
#define jit_gti_ul(d, rs, is) jit_gti_ui((d), (rs), (is))
|
||||
#define jit_ger_ul(d, s1, s2) jit_ger_ui((d), (s1), (s2))
|
||||
#define jit_gei_ul(d, rs, is) jit_gei_ui((d), (rs), (is))
|
||||
|
||||
/* Branches */
|
||||
#define jit_bltr_l(label, s1, s2) jit_bltr_i((label), (s1), (s2))
|
||||
#define jit_blti_l(label, rs, is) jit_blti_i((label), (rs), (is))
|
||||
#define jit_bler_l(label, s1, s2) jit_bler_i((label), (s1), (s2))
|
||||
#define jit_blei_l(label, rs, is) jit_blei_i((label), (rs), (is))
|
||||
#define jit_bgtr_l(label, s1, s2) jit_bgtr_i((label), (s1), (s2))
|
||||
#define jit_bgti_l(label, rs, is) jit_bgti_i((label), (rs), (is))
|
||||
#define jit_bger_l(label, s1, s2) jit_bger_i((label), (s1), (s2))
|
||||
#define jit_bgei_l(label, rs, is) jit_bgei_i((label), (rs), (is))
|
||||
#define jit_beqr_l(label, s1, s2) jit_beqr_i((label), (s1), (s2))
|
||||
#define jit_beqi_l(label, rs, is) jit_beqi_i((label), (rs), (is))
|
||||
#define jit_bner_l(label, s1, s2) jit_bner_i((label), (s1), (s2))
|
||||
#define jit_bnei_l(label, rs, is) jit_bnei_i((label), (rs), (is))
|
||||
#define jit_bmcr_l(label, s1, s2) jit_bmcr_i((label), (s1), (s2))
|
||||
#define jit_bmci_l(label, rs, is) jit_bmci_i((label), (rs), (is))
|
||||
#define jit_bmsr_l(label, s1, s2) jit_bmsr_i((label), (s1), (s2))
|
||||
#define jit_bmsi_l(label, rs, is) jit_bmsi_i((label), (rs), (is))
|
||||
#define jit_boaddr_l(label, s1, s2) jit_boaddr_i((label), (s1), (s2))
|
||||
#define jit_boaddi_l(label, rs, is) jit_boaddi_i((label), (rs), (is))
|
||||
#define jit_bosubr_l(label, s1, s2) jit_bosubr_i((label), (s1), (s2))
|
||||
#define jit_bosubi_l(label, rs, is) jit_bosubi_i((label), (rs), (is))
|
||||
#define jit_bltr_ul(label, s1, s2) jit_bltr_ui((label), (s1), (s2))
|
||||
#define jit_blti_ul(label, rs, is) jit_blti_ui((label), (rs), (is))
|
||||
#define jit_bler_ul(label, s1, s2) jit_bler_ui((label), (s1), (s2))
|
||||
#define jit_blei_ul(label, rs, is) jit_blei_ui((label), (rs), (is))
|
||||
#define jit_bgtr_ul(label, s1, s2) jit_bgtr_ui((label), (s1), (s2))
|
||||
#define jit_bgti_ul(label, rs, is) jit_bgti_ui((label), (rs), (is))
|
||||
#define jit_bger_ul(label, s1, s2) jit_bger_ui((label), (s1), (s2))
|
||||
#define jit_bgei_ul(label, rs, is) jit_bgei_ui((label), (rs), (is))
|
||||
#define jit_boaddr_ul(label, s1, s2) jit_boaddr_ui((label), (s1), (s2))
|
||||
#define jit_boaddi_ul(label, rs, is) jit_boaddi_ui((label), (rs), (is))
|
||||
#define jit_bosubr_ul(label, s1, s2) jit_bosubr_ui((label), (s1), (s2))
|
||||
#define jit_bosubi_ul(label, rs, is) jit_bosubi_ui((label), (rs), (is))
|
||||
|
||||
#define jit_retval_l(rd) jit_retval_i((rd))
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* __lightning_core_common_h_ */
|
||||
86
src/runtime/c/pgf/lightning/fp-common.h
Normal file
86
src/runtime/c/pgf/lightning/fp-common.h
Normal file
@@ -0,0 +1,86 @@
|
||||
/******************************** -*- C -*- ****************************
|
||||
*
|
||||
* Platform-independent layer floating-point interface
|
||||
*
|
||||
***********************************************************************/
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* Copyright 2000, 2001, 2002 Free Software Foundation, Inc.
|
||||
* Written by Paolo Bonzini.
|
||||
*
|
||||
* This file is part of GNU lightning.
|
||||
*
|
||||
* GNU lightning is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* GNU lightning 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 Lesser General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with GNU lightning; see the file COPYING.LESSER; if not, write to the
|
||||
* Free Software Foundation, 59 Temple Place - Suite 330, Boston,
|
||||
* MA 02111-1307, USA.
|
||||
*
|
||||
***********************************************************************/
|
||||
|
||||
#define JIT_FPR0 JIT_FPR(0)
|
||||
#define JIT_FPR1 JIT_FPR(1)
|
||||
#define JIT_FPR2 JIT_FPR(2)
|
||||
#define JIT_FPR3 JIT_FPR(3)
|
||||
#define JIT_FPR4 JIT_FPR(4)
|
||||
#define JIT_FPR5 JIT_FPR(5)
|
||||
|
||||
#ifdef JIT_RZERO
|
||||
#ifndef jit_ldi_f
|
||||
#define jit_ldi_f(rd, is) jit_ldxi_f((rd), JIT_RZERO, (is))
|
||||
#define jit_sti_f(id, rs) jit_stxi_f((id), JIT_RZERO, (rs))
|
||||
#define jit_ldi_d(rd, is) jit_ldxi_d((rd), JIT_RZERO, (is))
|
||||
#define jit_sti_d(id, rs) jit_stxi_d((id), JIT_RZERO, (rs))
|
||||
#endif
|
||||
|
||||
#ifndef jit_ldr_f
|
||||
#define jit_ldr_f(rd, rs) jit_ldxr_f((rd), JIT_RZERO, (rs))
|
||||
#define jit_str_f(rd, rs) jit_stxr_f((rd), JIT_RZERO, (rs))
|
||||
#define jit_ldr_d(rd, rs) jit_ldxr_d((rd), JIT_RZERO, (rs))
|
||||
#define jit_str_d(rd, rs) jit_stxr_d((rd), JIT_RZERO, (rs))
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef jit_addr_f
|
||||
#define jit_addr_f(rd,s1,s2) jit_addr_d(rd,s1,s2)
|
||||
#define jit_subr_f(rd,s1,s2) jit_subr_d(rd,s1,s2)
|
||||
#define jit_mulr_f(rd,s1,s2) jit_mulr_d(rd,s1,s2)
|
||||
#define jit_divr_f(rd,s1,s2) jit_divr_d(rd,s1,s2)
|
||||
#define jit_movr_f(rd,rs) jit_movr_d(rd,rs)
|
||||
#define jit_abs_f(rd,rs) jit_abs_d(rd,rs)
|
||||
#define jit_negr_f(rd,rs) jit_negr_d(rd,rs)
|
||||
#define jit_sqrt_f(rd,rs) jit_sqrt_d(rd,rs)
|
||||
#define jit_extr_f_d(rs, rd)
|
||||
#define jit_extr_d_f(rs, rd)
|
||||
#define jit_extr_i_f(rd, rs) jit_extr_i_d(rd, rs)
|
||||
#define jit_roundr_f_i(rd, rs) jit_roundr_d_i(rd, rs)
|
||||
#define jit_floorr_f_i(rd, rs) jit_floorr_d_i(rd, rs)
|
||||
#define jit_ceilr_f_i(rd, rs) jit_ceilr_d_i(rd, rs)
|
||||
#define jit_truncr_f_i(rd, rs) jit_truncr_d_i(rd, rs)
|
||||
#define jit_ltr_f(d, s1, s2) jit_ltr_d(d, s1, s2)
|
||||
#define jit_ler_f(d, s1, s2) jit_ler_d(d, s1, s2)
|
||||
#define jit_eqr_f(d, s1, s2) jit_eqr_d(d, s1, s2)
|
||||
#define jit_ner_f(d, s1, s2) jit_ner_d(d, s1, s2)
|
||||
#define jit_ger_f(d, s1, s2) jit_ger_d(d, s1, s2)
|
||||
#define jit_gtr_f(d, s1, s2) jit_gtr_d(d, s1, s2)
|
||||
#define jit_unltr_f(d, s1, s2) jit_unltr_d(d, s1, s2)
|
||||
#define jit_unler_f(d, s1, s2) jit_unler_d(d, s1, s2)
|
||||
#define jit_uneqr_f(d, s1, s2) jit_uneqr_d(d, s1, s2)
|
||||
#define jit_ltgtr_f(d, s1, s2) jit_ltgtr_d(d, s1, s2)
|
||||
#define jit_unger_f(d, s1, s2) jit_unger_d(d, s1, s2)
|
||||
#define jit_ungtr_f(d, s1, s2) jit_ungtr_d(d, s1, s2)
|
||||
#define jit_ordr_f(d, s1, s2) jit_ordr_d(d, s1, s2)
|
||||
#define jit_unordr_f(d, s1, s2) jit_unordr_d(d, s1, s2)
|
||||
#define jit_retval_f(rs) jit_retval_d(rs)
|
||||
#endif
|
||||
54
src/runtime/c/pgf/lightning/funcs-common.h
Normal file
54
src/runtime/c/pgf/lightning/funcs-common.h
Normal file
@@ -0,0 +1,54 @@
|
||||
/******************************** -*- C -*- ****************************
|
||||
*
|
||||
* Platform-independent layer inline functions (common part)
|
||||
*
|
||||
***********************************************************************/
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* Copyright 2000, 2001, 2002 Free Software Foundation, Inc.
|
||||
* Written by Paolo Bonzini.
|
||||
*
|
||||
* This file is part of GNU lightning.
|
||||
*
|
||||
* GNU lightning is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* GNU lightning 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 Lesser General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with GNU lightning; see the file COPYING.LESSER; if not, write to the
|
||||
* Free Software Foundation, 59 Temple Place - Suite 330, Boston,
|
||||
* MA 02111-1307, USA.
|
||||
*
|
||||
***********************************************************************/
|
||||
|
||||
#ifndef __lightning_funcs_common_h
|
||||
#define __lightning_funcs_common_h
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
static int jit_fail(const char *, const char*, int, const char *) JIT_UNUSED;
|
||||
|
||||
int
|
||||
jit_fail(const char *msg, const char *file, int line, const char *function)
|
||||
{
|
||||
fprintf(stderr, "%s: In function `%s':\n", file, function);
|
||||
fprintf(stderr, "%s:%d: %s\n", file, line, msg);
|
||||
abort();
|
||||
}
|
||||
|
||||
|
||||
#ifndef jit_start_pfx
|
||||
#define jit_start_pfx() ( (jit_insn*)0x4)
|
||||
#define jit_end_pfx() ( (jit_insn*)0x0)
|
||||
#endif
|
||||
|
||||
#endif /* __lightning_funcs_common_h */
|
||||
1062
src/runtime/c/pgf/lightning/i386/asm.h
Normal file
1062
src/runtime/c/pgf/lightning/i386/asm.h
Normal file
File diff suppressed because it is too large
Load Diff
413
src/runtime/c/pgf/lightning/i386/core.h
Normal file
413
src/runtime/c/pgf/lightning/i386/core.h
Normal file
@@ -0,0 +1,413 @@
|
||||
/******************************** -*- C -*- ****************************
|
||||
*
|
||||
* Platform-independent layer (i386 version)
|
||||
*
|
||||
***********************************************************************/
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* Copyright 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
|
||||
* Written by Paolo Bonzini.
|
||||
*
|
||||
* This file is part of GNU lightning.
|
||||
*
|
||||
* GNU lightning is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* GNU lightning 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 Lesser General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with GNU lightning; see the file COPYING.LESSER; if not, write to the
|
||||
* Free Software Foundation, 59 Temple Place - Suite 330, Boston,
|
||||
* MA 02111-1307, USA.
|
||||
*
|
||||
***********************************************************************/
|
||||
|
||||
|
||||
|
||||
#ifndef __lightning_core_h
|
||||
#define __lightning_core_h
|
||||
|
||||
#define JIT_FP _EBP
|
||||
#define JIT_SP _ESP
|
||||
#define JIT_RET _EAX
|
||||
|
||||
#define JIT_R_NUM 3
|
||||
#define JIT_V_NUM 3
|
||||
#define JIT_R(i) (_EAX + (i))
|
||||
#define JIT_V(i) ((i) == 0 ? _EBX : _ESI + (i) - 1)
|
||||
|
||||
struct jit_local_state {
|
||||
int framesize;
|
||||
int argssize;
|
||||
};
|
||||
|
||||
/* 3-parameter operation */
|
||||
#define jit_opr_(d, s1, s2, op1d, op2d) \
|
||||
( (s2 == d) ? op1d : \
|
||||
( ((s1 == d) ? (void)0 : (void)MOVLrr(s1, d)), op2d ) \
|
||||
)
|
||||
|
||||
/* 3-parameter operation, with immediate */
|
||||
#define jit_op_(d, s1, op2d) \
|
||||
((s1 == d) ? op2d : (MOVLrr(s1, d), op2d)) \
|
||||
|
||||
/* 3-parameter operation, optimizable */
|
||||
#define jit_opo_(d, s1, s2, op1d, op2d, op12d) \
|
||||
((s2 == d) ? op2d : \
|
||||
((s1 == d) ? op1d : op12d))
|
||||
|
||||
/* 3-parameter operation, optimizable, with immediate */
|
||||
#define jit_opi_(d, rs, opdi, opdri) \
|
||||
((rs == d) ? opdi : opdri)
|
||||
|
||||
/* An operand is forced into a register */
|
||||
#define jit_replace(rd, rs, forced, op) \
|
||||
((rd == forced) ? JITSORRY("Register conflict for " # op) : \
|
||||
(rs == forced) ? op : (PUSHLr(forced), MOVLrr(rs, forced), op, POPLr(forced)))
|
||||
|
||||
/* For LT, LE, ... */
|
||||
#define jit_replace8(d, op) \
|
||||
(jit_check8(d) \
|
||||
? (MOVLir(0, d), op(d)) \
|
||||
: (PUSHLr(_EAX), MOVLir(0, _EAX), op(_EAX), MOVLrr(_EAX, (d)), POPLr(_EAX)))
|
||||
|
||||
#define jit_bool_r(d, s1, s2, op) \
|
||||
(CMPLrr(s2, s1), jit_replace8(d, op))
|
||||
|
||||
#define jit_bool_i(d, rs, is, op) \
|
||||
(CMPLir(is, rs), jit_replace8(d, op))
|
||||
|
||||
/* When CMP with 0 can be replaced with TEST */
|
||||
#define jit_bool_i0(d, rs, is, op, op0) \
|
||||
((is) != 0 \
|
||||
? (CMPLir(is, rs), jit_replace8(d, op)) \
|
||||
: (TESTLrr(rs, rs), jit_replace8(d, op0)))
|
||||
|
||||
/* For BLT, BLE, ... */
|
||||
#define jit_bra_r(s1, s2, op) (CMPLrr(s2, s1), op, _jit.x.pc)
|
||||
#define jit_bra_i(rs, is, op) (CMPLir(is, rs), op, _jit.x.pc)
|
||||
|
||||
/* When CMP with 0 can be replaced with TEST */
|
||||
#define jit_bra_i0(rs, is, op, op0) \
|
||||
( (is) == 0 ? (TESTLrr(rs, rs), op0, _jit.x.pc) : (CMPLir(is, rs), op, _jit.x.pc))
|
||||
|
||||
/* Used to implement ldc, stc, ... */
|
||||
#define jit_check8(rs) ( (rs) <= _EBX )
|
||||
#define jit_reg8(rs) ( ((rs) == _SI || (rs) == _DI) ? _AL : ((rs) & _BH) | _AL )
|
||||
#define jit_reg16(rs) ( ((rs) & _BH) | _AX )
|
||||
|
||||
/* In jit_replace below, _EBX is dummy */
|
||||
#define jit_movbrm(rs, dd, db, di, ds) \
|
||||
(jit_check8(rs) \
|
||||
? MOVBrm(jit_reg8(rs), dd, db, di, ds) \
|
||||
: jit_replace(_EBX, rs, _EAX, MOVBrm(_AL, dd, db, di, ds)))
|
||||
|
||||
/* Reduce arguments of XOR/OR/TEST */
|
||||
#define jit_reduce_(op) op
|
||||
#define jit_reduce(op, is, rs) \
|
||||
(_u8P(is) && jit_check8(rs) ? jit_reduce_(op##Bir(is, jit_reg8(rs))) : \
|
||||
(_u16P(is) ? jit_reduce_(op##Wir(is, jit_reg16(rs))) : \
|
||||
jit_reduce_(op##Lir(is, rs)) ))
|
||||
|
||||
/* Helper macros for MUL/DIV/IDIV */
|
||||
#define jit_might(d, s1, op) \
|
||||
((s1 == d) ? 0 : op)
|
||||
|
||||
#define jit_mulr_ui_(s1, s2) jit_opr_(_EAX, s1, s2, MULLr(s1), MULLr(s2))
|
||||
#define jit_mulr_i_(s1, s2) jit_opr_(_EAX, s1, s2, IMULLr(s1), IMULLr(s2))
|
||||
|
||||
|
||||
#define jit_muli_i_(is, rs) \
|
||||
(MOVLir(is, rs == _EAX ? _EDX : _EAX), \
|
||||
IMULLr(rs == _EAX ? _EDX : rs))
|
||||
|
||||
#define jit_muli_ui_(is, rs) \
|
||||
(MOVLir(is, rs == _EAX ? _EDX : _EAX), \
|
||||
IMULLr(rs == _EAX ? _EDX : rs))
|
||||
|
||||
#define jit_divi_i_(result, d, rs, is) \
|
||||
(jit_might (d, _EAX, PUSHLr(_EAX)), \
|
||||
jit_might (d, _ECX, PUSHLr(_ECX)), \
|
||||
jit_might (d, _EDX, PUSHLr(_EDX)), \
|
||||
jit_might (rs, _EAX, MOVLrr(rs, _EAX)), \
|
||||
jit_might (rs, _EDX, MOVLrr(rs, _EDX)), \
|
||||
MOVLir(is, _ECX), \
|
||||
SARLir(31, _EDX), \
|
||||
IDIVLr(_ECX), \
|
||||
jit_might(d, result, MOVLrr(result, d)), \
|
||||
jit_might(d, _EDX, POPLr(_EDX)), \
|
||||
jit_might(d, _ECX, POPLr(_ECX)), \
|
||||
jit_might(d, _EAX, POPLr(_EAX)))
|
||||
|
||||
#define jit_divr_i_(result, d, s1, s2) \
|
||||
(jit_might (d, _EAX, PUSHLr(_EAX)), \
|
||||
jit_might (d, _ECX, PUSHLr(_ECX)), \
|
||||
jit_might (d, _EDX, PUSHLr(_EDX)), \
|
||||
((s1 == _ECX) ? PUSHLr(_ECX) : 0), \
|
||||
jit_might (s2, _ECX, MOVLrr(s2, _ECX)), \
|
||||
((s1 == _ECX) ? POPLr(_EDX) : \
|
||||
jit_might (s1, _EDX, MOVLrr(s1, _EDX))), \
|
||||
MOVLrr(_EDX, _EAX), \
|
||||
SARLir(31, _EDX), \
|
||||
IDIVLr(_ECX), \
|
||||
jit_might(d, result, MOVLrr(result, d)), \
|
||||
jit_might(d, _EDX, POPLr(_EDX)), \
|
||||
jit_might(d, _ECX, POPLr(_ECX)), \
|
||||
jit_might(d, _EAX, POPLr(_EAX)))
|
||||
|
||||
#define jit_divi_ui_(result, d, rs, is) \
|
||||
(jit_might (d, _EAX, PUSHLr(_EAX)), \
|
||||
jit_might (d, _ECX, PUSHLr(_ECX)), \
|
||||
jit_might (d, _EDX, PUSHLr(_EDX)), \
|
||||
jit_might (rs, _EAX, MOVLrr(rs, _EAX)), \
|
||||
MOVLir(is, _ECX), \
|
||||
XORLrr(_EDX, _EDX), \
|
||||
DIVLr(_ECX), \
|
||||
jit_might(d, result, MOVLrr(result, d)), \
|
||||
jit_might(d, _EDX, POPLr(_EDX)), \
|
||||
jit_might(d, _ECX, POPLr(_ECX)), \
|
||||
jit_might(d, _EAX, POPLr(_EAX)))
|
||||
|
||||
#define jit_divr_ui_(result, d, s1, s2) \
|
||||
(jit_might (d, _EAX, PUSHLr(_EAX)), \
|
||||
jit_might (d, _ECX, PUSHLr(_ECX)), \
|
||||
jit_might (d, _EDX, PUSHLr(_EDX)), \
|
||||
((s1 == _ECX) ? PUSHLr(_ECX) : 0), \
|
||||
jit_might (s2, _ECX, MOVLrr(s2, _ECX)), \
|
||||
((s1 == _ECX) ? POPLr(_EAX) : \
|
||||
jit_might (s1, _EAX, MOVLrr(s1, _EAX))), \
|
||||
XORLrr(_EDX, _EDX), \
|
||||
DIVLr(_ECX), \
|
||||
jit_might(d, result, MOVLrr(result, d)), \
|
||||
jit_might(d, _EDX, POPLr(_EDX)), \
|
||||
jit_might(d, _ECX, POPLr(_ECX)), \
|
||||
jit_might(d, _EAX, POPLr(_EAX)))
|
||||
|
||||
|
||||
/* ALU */
|
||||
#define jit_addi_i(d, rs, is) jit_opi_((d), (rs), ADDLir((is), (d)), LEALmr((is), (rs), 0, 0, (d)) )
|
||||
#define jit_addr_i(d, s1, s2) jit_opo_((d), (s1), (s2), ADDLrr((s2), (d)), ADDLrr((s1), (d)), LEALmr(0, (s1), (s2), 1, (d)) )
|
||||
#define jit_addci_i(d, rs, is) jit_op_ ((d), (rs), ADDLir((is), (d)) )
|
||||
#define jit_addcr_i(d, s1, s2) jit_opr_((d), (s1), (s2), ADDLrr((s1), (d)), ADDLrr((s2), (d)) )
|
||||
#define jit_addxi_i(d, rs, is) jit_op_ ((d), (rs), ADCLir((is), (d)) )
|
||||
#define jit_addxr_i(d, s1, s2) jit_opr_((d), (s1), (s2), ADCLrr((s1), (d)), ADCLrr((s2), (d)) )
|
||||
#define jit_andi_i(d, rs, is) jit_op_ ((d), (rs), ANDLir((is), (d)) )
|
||||
#define jit_andr_i(d, s1, s2) jit_opr_((d), (s1), (s2), ANDLrr((s1), (d)), ANDLrr((s2), (d)) )
|
||||
#define jit_orr_i(d, s1, s2) jit_opr_((d), (s1), (s2), ORLrr((s1), (d)), ORLrr((s2), (d)) )
|
||||
#define jit_subr_i(d, s1, s2) jit_opr_((d), (s1), (s2), (SUBLrr((s1), (d)), NEGLr(d)), SUBLrr((s2), (d)) )
|
||||
#define jit_subcr_i(d, s1, s2) jit_subr_i((d), (s1), (s2))
|
||||
#define jit_subxr_i(d, s1, s2) jit_opr_((d), (s1), (s2), SBBLrr((s1), (d)), SBBLrr((s2), (d)) )
|
||||
#define jit_subxi_i(d, rs, is) jit_op_ ((d), (rs), SBBLir((is), (d)) )
|
||||
#define jit_xorr_i(d, s1, s2) jit_opr_((d), (s1), (s2), XORLrr((s1), (d)), XORLrr((s2), (d)) )
|
||||
|
||||
/* These can sometimes use byte or word versions! */
|
||||
#define jit_ori_i(d, rs, is) jit_op_ ((d), (rs), jit_reduce(OR, (is), (d)) )
|
||||
#define jit_xori_i(d, rs, is) jit_op_ ((d), (rs), jit_reduce(XOR, (is), (d)) )
|
||||
|
||||
#define jit_muli_i(d, rs, is) jit_op_ ((d), (rs), IMULLir((is), (d)) )
|
||||
#define jit_mulr_i(d, s1, s2) jit_opr_((d), (s1), (s2), IMULLrr((s1), (d)), IMULLrr((s2), (d)) )
|
||||
|
||||
/* As far as low bits are concerned, signed and unsigned multiplies are
|
||||
exactly the same. */
|
||||
#define jit_muli_ui(d, rs, is) jit_op_ ((d), (rs), IMULLir((is), (d)) )
|
||||
#define jit_mulr_ui(d, s1, s2) jit_opr_((d), (s1), (s2), IMULLrr((s1), (d)), IMULLrr((s2), (d)) )
|
||||
|
||||
#define jit_hmuli_i(d, rs, is) \
|
||||
((d) == _EDX ? ( PUSHLr(_EAX), jit_muli_i_((is), (rs)), POPLr(_EAX) ) : \
|
||||
((d) == _EAX ? (PUSHLr(_EDX), jit_muli_i_((is), (rs)), MOVLrr(_EDX, _EAX), POPLr(_EDX) ) : \
|
||||
(PUSHLr(_EDX), PUSHLr(_EAX), jit_muli_i_((is), (rs)), MOVLrr(_EDX, (d)), POPLr(_EAX), POPLr(_EDX) )))
|
||||
|
||||
#define jit_hmulr_i(d, s1, s2) \
|
||||
((d) == _EDX ? ( PUSHLr(_EAX), jit_mulr_i_((s1), (s2)), POPLr(_EAX) ) : \
|
||||
((d) == _EAX ? (PUSHLr(_EDX), jit_mulr_i_((s1), (s2)), MOVLrr(_EDX, _EAX), POPLr(_EDX) ) : \
|
||||
(PUSHLr(_EDX), PUSHLr(_EAX), jit_mulr_i_((s1), (s2)), MOVLrr(_EDX, (d)), POPLr(_EAX), POPLr(_EDX) )))
|
||||
|
||||
#define jit_hmuli_ui(d, rs, is) \
|
||||
((d) == _EDX ? ( PUSHLr(_EAX), jit_muli_ui_((is), (rs)), POPLr(_EAX) ) : \
|
||||
((d) == _EAX ? (PUSHLr(_EDX), jit_muli_ui_((is), (rs)), MOVLrr(_EDX, _EAX), POPLr(_EDX) ) : \
|
||||
(PUSHLr(_EDX), PUSHLr(_EAX), jit_muli_ui_((is), (rs)), MOVLrr(_EDX, (d)), POPLr(_EAX), POPLr(_EDX) )))
|
||||
|
||||
#define jit_hmulr_ui(d, s1, s2) \
|
||||
((d) == _EDX ? ( PUSHLr(_EAX), jit_mulr_ui_((s1), (s2)), POPLr(_EAX) ) : \
|
||||
((d) == _EAX ? (PUSHLr(_EDX), jit_mulr_ui_((s1), (s2)), MOVLrr(_EDX, _EAX), POPLr(_EDX) ) : \
|
||||
(PUSHLr(_EDX), PUSHLr(_EAX), jit_mulr_ui_((s1), (s2)), MOVLrr(_EDX, (d)), POPLr(_EAX), POPLr(_EDX) )))
|
||||
|
||||
#define jit_divi_i(d, rs, is) jit_divi_i_(_EAX, (d), (rs), (is))
|
||||
#define jit_divi_ui(d, rs, is) jit_divi_ui_(_EAX, (d), (rs), (is))
|
||||
#define jit_modi_i(d, rs, is) jit_divi_i_(_EDX, (d), (rs), (is))
|
||||
#define jit_modi_ui(d, rs, is) jit_divi_ui_(_EDX, (d), (rs), (is))
|
||||
#define jit_divr_i(d, s1, s2) jit_divr_i_(_EAX, (d), (s1), (s2))
|
||||
#define jit_divr_ui(d, s1, s2) jit_divr_ui_(_EAX, (d), (s1), (s2))
|
||||
#define jit_modr_i(d, s1, s2) jit_divr_i_(_EDX, (d), (s1), (s2))
|
||||
#define jit_modr_ui(d, s1, s2) jit_divr_ui_(_EDX, (d), (s1), (s2))
|
||||
|
||||
|
||||
/* Shifts */
|
||||
#define jit_lshi_i(d, rs, is) ((is) <= 3 ? LEALmr(0, 0, (rs), 1 << (is), (d)) : jit_op_ ((d), (rs), SHLLir((is), (d)) ))
|
||||
#define jit_rshi_i(d, rs, is) jit_op_ ((d), (rs), SARLir((is), (d)) )
|
||||
#define jit_rshi_ui(d, rs, is) jit_op_ ((d), (rs), SHRLir((is), (d)) )
|
||||
#define jit_lshr_i(d, r1, r2) jit_replace((r1), (r2), _ECX, jit_op_ ((d), (r1), SHLLrr(_CL, (d)) ))
|
||||
#define jit_rshr_i(d, r1, r2) jit_replace((r1), (r2), _ECX, jit_op_ ((d), (r1), SARLrr(_CL, (d)) ))
|
||||
#define jit_rshr_ui(d, r1, r2) jit_replace((r1), (r2), _ECX, jit_op_ ((d), (r1), SHRLrr(_CL, (d)) ))
|
||||
|
||||
/* Stack */
|
||||
#define jit_pushr_i(rs) PUSHLr(rs)
|
||||
#define jit_popr_i(rs) POPLr(rs)
|
||||
#define jit_prolog(n) (_jitl.framesize = 8, PUSHLr(_EBP), MOVLrr(_ESP, _EBP), PUSHLr(_EBX), PUSHLr(_ESI), PUSHLr(_EDI))
|
||||
|
||||
/* The += allows for stack pollution */
|
||||
|
||||
#define jit_prepare_i(ni) (_jitl.argssize += (ni))
|
||||
#define jit_prepare_f(nf) (_jitl.argssize += (nf))
|
||||
#define jit_prepare_d(nd) (_jitl.argssize += 2 * (nd))
|
||||
#define jit_pusharg_i(rs) PUSHLr(rs)
|
||||
#define jit_finish(sub) (jit_calli((sub)), ADDLir(4 * _jitl.argssize, JIT_SP), _jitl.argssize = 0)
|
||||
#define jit_finishr(reg) (jit_callr((reg)), ADDLir(4 * _jitl.argssize, JIT_SP), _jitl.argssize = 0)
|
||||
#define jit_retval_i(rd) jit_movr_i ((rd), _EAX)
|
||||
|
||||
#define jit_arg_c() ((_jitl.framesize += sizeof(int)) - sizeof(int))
|
||||
#define jit_arg_uc() ((_jitl.framesize += sizeof(int)) - sizeof(int))
|
||||
#define jit_arg_s() ((_jitl.framesize += sizeof(int)) - sizeof(int))
|
||||
#define jit_arg_us() ((_jitl.framesize += sizeof(int)) - sizeof(int))
|
||||
#define jit_arg_i() ((_jitl.framesize += sizeof(int)) - sizeof(int))
|
||||
#define jit_arg_ui() ((_jitl.framesize += sizeof(int)) - sizeof(int))
|
||||
#define jit_arg_l() ((_jitl.framesize += sizeof(long)) - sizeof(long))
|
||||
#define jit_arg_ul() ((_jitl.framesize += sizeof(long)) - sizeof(long))
|
||||
#define jit_arg_p() ((_jitl.framesize += sizeof(long)) - sizeof(long))
|
||||
|
||||
#define jit_arg_f() ((_jitl.framesize += sizeof(float)) - sizeof(float))
|
||||
#define jit_arg_d() ((_jitl.framesize += sizeof(double)) - sizeof(double))
|
||||
|
||||
/* Unary */
|
||||
#define jit_negr_i(d, rs) jit_opi_((d), (rs), NEGLr(d), (XORLrr((d), (d)), SUBLrr((rs), (d))) )
|
||||
#define jit_negr_l(d, rs) jit_opi_((d), (rs), NEGLr(d), (XORLrr((d), (d)), SUBLrr((rs), (d))) )
|
||||
|
||||
#define jit_movr_i(d, rs) ((rs) == (d) ? 0 : MOVLrr((rs), (d)))
|
||||
#define jit_movi_i(d, is) ((is) ? MOVLir((is), (d)) : XORLrr ((d), (d)) )
|
||||
#define jit_movi_p(d, is) (MOVLir((is), (d)), _jit.x.pc)
|
||||
#define jit_patch_movi(pa,pv) (*_PSL((pa) - 4) = _jit_SL((pv)))
|
||||
|
||||
#define jit_ntoh_ui(d, rs) jit_op_((d), (rs), BSWAPLr(d))
|
||||
#define jit_ntoh_us(d, rs) jit_op_((d), (rs), RORWir(8, d))
|
||||
|
||||
/* Boolean */
|
||||
#define jit_ltr_i(d, s1, s2) jit_bool_r((d), (s1), (s2), SETLr )
|
||||
#define jit_ler_i(d, s1, s2) jit_bool_r((d), (s1), (s2), SETLEr )
|
||||
#define jit_gtr_i(d, s1, s2) jit_bool_r((d), (s1), (s2), SETGr )
|
||||
#define jit_ger_i(d, s1, s2) jit_bool_r((d), (s1), (s2), SETGEr )
|
||||
#define jit_eqr_i(d, s1, s2) jit_bool_r((d), (s1), (s2), SETEr )
|
||||
#define jit_ner_i(d, s1, s2) jit_bool_r((d), (s1), (s2), SETNEr )
|
||||
#define jit_ltr_ui(d, s1, s2) jit_bool_r((d), (s1), (s2), SETBr )
|
||||
#define jit_ler_ui(d, s1, s2) jit_bool_r((d), (s1), (s2), SETBEr )
|
||||
#define jit_gtr_ui(d, s1, s2) jit_bool_r((d), (s1), (s2), SETAr )
|
||||
#define jit_ger_ui(d, s1, s2) jit_bool_r((d), (s1), (s2), SETAEr )
|
||||
|
||||
#define jit_lti_i(d, rs, is) jit_bool_i0((d), (rs), (is), SETLr, SETSr )
|
||||
#define jit_lei_i(d, rs, is) jit_bool_i ((d), (rs), (is), SETLEr )
|
||||
#define jit_gti_i(d, rs, is) jit_bool_i ((d), (rs), (is), SETGr )
|
||||
#define jit_gei_i(d, rs, is) jit_bool_i0((d), (rs), (is), SETGEr, SETNSr )
|
||||
#define jit_eqi_i(d, rs, is) jit_bool_i0((d), (rs), (is), SETEr, SETEr )
|
||||
#define jit_nei_i(d, rs, is) jit_bool_i0((d), (rs), (is), SETNEr, SETNEr )
|
||||
#define jit_lti_ui(d, rs, is) jit_bool_i ((d), (rs), (is), SETBr )
|
||||
#define jit_lei_ui(d, rs, is) jit_bool_i0((d), (rs), (is), SETBEr, SETEr )
|
||||
#define jit_gti_ui(d, rs, is) jit_bool_i0((d), (rs), (is), SETAr, SETNEr )
|
||||
#define jit_gei_ui(d, rs, is) jit_bool_i0((d), (rs), (is), SETAEr, INCLr )
|
||||
|
||||
/* Jump */
|
||||
#define jit_bltr_i(label, s1, s2) jit_bra_r((s1), (s2), JLm(label, 0,0,0) )
|
||||
#define jit_bler_i(label, s1, s2) jit_bra_r((s1), (s2), JLEm(label,0,0,0) )
|
||||
#define jit_bgtr_i(label, s1, s2) jit_bra_r((s1), (s2), JGm(label, 0,0,0) )
|
||||
#define jit_bger_i(label, s1, s2) jit_bra_r((s1), (s2), JGEm(label,0,0,0) )
|
||||
#define jit_beqr_i(label, s1, s2) jit_bra_r((s1), (s2), JEm(label, 0,0,0) )
|
||||
#define jit_bner_i(label, s1, s2) jit_bra_r((s1), (s2), JNEm(label,0,0,0) )
|
||||
#define jit_bltr_ui(label, s1, s2) jit_bra_r((s1), (s2), JBm(label, 0,0,0) )
|
||||
#define jit_bler_ui(label, s1, s2) jit_bra_r((s1), (s2), JBEm(label,0,0,0) )
|
||||
#define jit_bgtr_ui(label, s1, s2) jit_bra_r((s1), (s2), JAm(label, 0,0,0) )
|
||||
#define jit_bger_ui(label, s1, s2) jit_bra_r((s1), (s2), JAEm(label,0,0,0) )
|
||||
#define jit_bmsr_i(label, s1, s2) (TESTLrr((s1), (s2)), JNZm(label,0,0,0), _jit.x.pc)
|
||||
#define jit_bmcr_i(label, s1, s2) (TESTLrr((s1), (s2)), JZm(label,0,0,0), _jit.x.pc)
|
||||
#define jit_boaddr_i(label, s1, s2) (ADDLrr((s2), (s1)), JOm(label,0,0,0), _jit.x.pc)
|
||||
#define jit_bosubr_i(label, s1, s2) (SUBLrr((s2), (s1)), JOm(label,0,0,0), _jit.x.pc)
|
||||
#define jit_boaddr_ui(label, s1, s2) (ADDLrr((s2), (s1)), JCm(label,0,0,0), _jit.x.pc)
|
||||
#define jit_bosubr_ui(label, s1, s2) (SUBLrr((s2), (s1)), JCm(label,0,0,0), _jit.x.pc)
|
||||
|
||||
#define jit_blti_i(label, rs, is) jit_bra_i0((rs), (is), JLm(label, 0,0,0), JSm(label, 0,0,0) )
|
||||
#define jit_blei_i(label, rs, is) jit_bra_i ((rs), (is), JLEm(label,0,0,0) )
|
||||
#define jit_bgti_i(label, rs, is) jit_bra_i ((rs), (is), JGm(label, 0,0,0) )
|
||||
#define jit_bgei_i(label, rs, is) jit_bra_i0((rs), (is), JGEm(label,0,0,0), JNSm(label,0,0,0) )
|
||||
#define jit_beqi_i(label, rs, is) jit_bra_i0((rs), (is), JEm(label, 0,0,0), JEm(label, 0,0,0) )
|
||||
#define jit_bnei_i(label, rs, is) jit_bra_i0((rs), (is), JNEm(label,0,0,0), JNEm(label,0,0,0) )
|
||||
#define jit_blti_ui(label, rs, is) jit_bra_i ((rs), (is), JBm(label, 0,0,0) )
|
||||
#define jit_blei_ui(label, rs, is) jit_bra_i0((rs), (is), JBEm(label,0,0,0), JEm(label, 0,0,0) )
|
||||
#define jit_bgti_ui(label, rs, is) jit_bra_i0((rs), (is), JAm(label, 0,0,0), JNEm(label,0,0,0) )
|
||||
#define jit_bgei_ui(label, rs, is) jit_bra_i ((rs), (is), JAEm(label,0,0,0) )
|
||||
#define jit_boaddi_i(label, rs, is) (ADDLir((is), (rs)), JOm(label,0,0,0), _jit.x.pc)
|
||||
#define jit_bosubi_i(label, rs, is) (SUBLir((is), (rs)), JOm(label,0,0,0), _jit.x.pc)
|
||||
#define jit_boaddi_ui(label, rs, is) (ADDLir((is), (rs)), JCm(label,0,0,0), _jit.x.pc)
|
||||
#define jit_bosubi_ui(label, rs, is) (SUBLir((is), (rs)), JCm(label,0,0,0), _jit.x.pc)
|
||||
|
||||
#define jit_bmsi_i(label, rs, is) (jit_reduce(TEST, (is), (rs)), JNZm(label,0,0,0), _jit.x.pc)
|
||||
#define jit_bmci_i(label, rs, is) (jit_reduce(TEST, (is), (rs)), JZm(label,0,0,0), _jit.x.pc)
|
||||
|
||||
#define jit_jmpi(label) (JMPm( ((unsigned long) (label)), 0, 0, 0), _jit.x.pc)
|
||||
#define jit_calli(label) (CALLm( ((unsigned long) (label)), 0, 0, 0), _jit.x.pc)
|
||||
#define jit_callr(reg) (CALLsr(reg))
|
||||
#define jit_jmpr(reg) JMPsr(reg)
|
||||
#define jit_patch_at(jump_pc,v) (*_PSL((jump_pc) - 4) = _jit_SL((v) - (jump_pc)))
|
||||
#define jit_ret() (POPLr(_EDI), POPLr(_ESI), POPLr(_EBX), POPLr(_EBP), RET_())
|
||||
|
||||
/* Memory */
|
||||
#define jit_ldi_c(d, is) MOVSBLmr((is), 0, 0, 0, (d))
|
||||
#define jit_ldr_c(d, rs) MOVSBLmr(0, (rs), 0, 0, (d))
|
||||
#define jit_ldxr_c(d, s1, s2) MOVSBLmr(0, (s1), (s2), 1, (d))
|
||||
#define jit_ldxi_c(d, rs, is) MOVSBLmr((is), (rs), 0, 0, (d))
|
||||
|
||||
#define jit_ldi_uc(d, is) MOVZBLmr((is), 0, 0, 0, (d))
|
||||
#define jit_ldr_uc(d, rs) MOVZBLmr(0, (rs), 0, 0, (d))
|
||||
#define jit_ldxr_uc(d, s1, s2) MOVZBLmr(0, (s1), (s2), 1, (d))
|
||||
#define jit_ldxi_uc(d, rs, is) MOVZBLmr((is), (rs), 0, 0, (d))
|
||||
|
||||
#define jit_sti_c(id, rs) jit_movbrm((rs), (id), 0, 0, 0)
|
||||
#define jit_str_c(rd, rs) jit_movbrm((rs), 0, (rd), 0, 0)
|
||||
#define jit_stxr_c(d1, d2, rs) jit_movbrm((rs), 0, (d1), (d2), 1)
|
||||
#define jit_stxi_c(id, rd, rs) jit_movbrm((rs), (id), (rd), 0, 0)
|
||||
|
||||
#define jit_ldi_s(d, is) MOVSWLmr((is), 0, 0, 0, (d))
|
||||
#define jit_ldr_s(d, rs) MOVSWLmr(0, (rs), 0, 0, (d))
|
||||
#define jit_ldxr_s(d, s1, s2) MOVSWLmr(0, (s1), (s2), 1, (d))
|
||||
#define jit_ldxi_s(d, rs, is) MOVSWLmr((is), (rs), 0, 0, (d))
|
||||
|
||||
#define jit_ldi_us(d, is) MOVZWLmr((is), 0, 0, 0, (d))
|
||||
#define jit_ldr_us(d, rs) MOVZWLmr(0, (rs), 0, 0, (d))
|
||||
#define jit_ldxr_us(d, s1, s2) MOVZWLmr(0, (s1), (s2), 1, (d))
|
||||
#define jit_ldxi_us(d, rs, is) MOVZWLmr((is), (rs), 0, 0, (d))
|
||||
|
||||
#define jit_sti_s(id, rs) MOVWrm(jit_reg16(rs), (id), 0, 0, 0)
|
||||
#define jit_str_s(rd, rs) MOVWrm(jit_reg16(rs), 0, (rd), 0, 0)
|
||||
#define jit_stxr_s(d1, d2, rs) MOVWrm(jit_reg16(rs), 0, (d1), (d2), 1)
|
||||
#define jit_stxi_s(id, rd, rs) MOVWrm(jit_reg16(rs), (id), (rd), 0, 0)
|
||||
|
||||
#define jit_ldi_i(d, is) MOVLmr((is), 0, 0, 0, (d))
|
||||
#define jit_ldr_i(d, rs) MOVLmr(0, (rs), 0, 0, (d))
|
||||
#define jit_ldxr_i(d, s1, s2) MOVLmr(0, (s1), (s2), 1, (d))
|
||||
#define jit_ldxi_i(d, rs, is) MOVLmr((is), (rs), 0, 0, (d))
|
||||
|
||||
#define jit_sti_i(id, rs) MOVLrm((rs), (id), 0, 0, 0)
|
||||
#define jit_str_i(rd, rs) MOVLrm((rs), 0, (rd), 0, 0)
|
||||
#define jit_stxr_i(d1, d2, rs) MOVLrm((rs), 0, (d1), (d2), 1)
|
||||
#define jit_stxi_i(id, rd, rs) MOVLrm((rs), (id), (rd), 0, 0)
|
||||
|
||||
/* Extra */
|
||||
#define jit_nop() NOP_()
|
||||
|
||||
#define _jit_alignment(pc, n) (((pc ^ _MASK(4)) + 1) & _MASK(n))
|
||||
#define jit_align(n) NOPi(_jit_alignment(_jit_UL(_jit.x.pc), (n)))
|
||||
|
||||
#endif /* __lightning_core_h */
|
||||
347
src/runtime/c/pgf/lightning/i386/fp.h
Normal file
347
src/runtime/c/pgf/lightning/i386/fp.h
Normal file
@@ -0,0 +1,347 @@
|
||||
/******************************** -*- C -*- ****************************
|
||||
*
|
||||
* Run-time assembler & support macros for the i386 math coprocessor
|
||||
*
|
||||
***********************************************************************/
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* Copyright 2000, 2001, 2002, 2004 Free Software Foundation, Inc.
|
||||
* Written by Paolo Bonzini.
|
||||
*
|
||||
* This file is part of GNU lightning.
|
||||
*
|
||||
* GNU lightning is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* GNU lightning 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 Lesser General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with GNU lightning; see the file COPYING.LESSER; if not, write to the
|
||||
* Free Software Foundation, 59 Temple Place - Suite 330, Boston,
|
||||
* MA 02111-1307, USA.
|
||||
*
|
||||
***********************************************************************/
|
||||
|
||||
|
||||
#ifndef __lightning_asm_fp_h
|
||||
#define __lightning_asm_fp_h
|
||||
|
||||
/* We really must map the x87 stack onto a flat register file. In practice,
|
||||
we can provide something sensible and make it work on the x86 using the
|
||||
stack like a file of eight registers.
|
||||
|
||||
We use six or seven registers so as to have some freedom
|
||||
for floor, ceil, round, (and log, tan, atn and exp).
|
||||
|
||||
Not hard at all, basically play with FXCH. FXCH is mostly free,
|
||||
so the generated code is not bad. Of course we special case when one
|
||||
of the operands turns out to be ST0.
|
||||
|
||||
Here are the macros that actually do the trick. */
|
||||
|
||||
#define JIT_FPR_NUM 6
|
||||
#define JIT_FPR(i) (i)
|
||||
|
||||
#define jit_fxch(rs, op) (((rs) != 0 ? FXCHr(rs) : 0), \
|
||||
op, ((rs) != 0 ? FXCHr(rs) : 0))
|
||||
|
||||
#define jit_fp_unary(rd, s1, op) \
|
||||
((rd) == (s1) ? jit_fxch ((rd), op) \
|
||||
: (rd) == 0 ? (FSTPr (0), FLDr ((s1)-1), op) \
|
||||
: (FLDr ((s1)), op, FSTPr ((rd))))
|
||||
|
||||
#define jit_fp_binary(rd, s1, s2, op, opr) \
|
||||
((rd) == (s1) ? \
|
||||
((s2) == 0 ? opr(0, (rd)) \
|
||||
: (s2) == (s1) ? jit_fxch((rd), op(0, 0)) \
|
||||
: jit_fxch((rd), op((s2), 0))) \
|
||||
: (rd) == (s2) ? jit_fxch((s1), opr(0, (rd) == 0 ? (s1) : (rd))) \
|
||||
: (FLDr (s1), op(0, (s2)+1), FSTPr((rd)+1)))
|
||||
|
||||
#define jit_addr_d(rd,s1,s2) jit_fp_binary((rd),(s1),(s2),FADDrr,FADDrr)
|
||||
#define jit_subr_d(rd,s1,s2) jit_fp_binary((rd),(s1),(s2),FSUBrr,FSUBRrr)
|
||||
#define jit_mulr_d(rd,s1,s2) jit_fp_binary((rd),(s1),(s2),FMULrr,FMULrr)
|
||||
#define jit_divr_d(rd,s1,s2) jit_fp_binary((rd),(s1),(s2),FDIVrr,FDIVRrr)
|
||||
|
||||
#define jit_abs_d(rd,rs) jit_fp_unary ((rd), (rs), _OO (0xd9e1))
|
||||
#define jit_negr_d(rd,rs) jit_fp_unary ((rd), (rs), _OO (0xd9e0))
|
||||
#define jit_sqrt_d(rd,rs) jit_fp_unary ((rd), (rs), _OO (0xd9fa))
|
||||
|
||||
/* - moves:
|
||||
|
||||
move FPR0 to FPR3
|
||||
FST ST3
|
||||
|
||||
move FPR3 to FPR0
|
||||
FXCH ST3
|
||||
FST ST3
|
||||
|
||||
move FPR3 to FPR1
|
||||
FLD ST1
|
||||
FST ST4 Stack is rotated, so FPRn becomes STn+1 */
|
||||
|
||||
#define jit_movr_d(rd,s1) \
|
||||
((s1) == (rd) ? 0 \
|
||||
: (s1) == 0 ? FSTr ((rd)) \
|
||||
: (rd) == 0 ? (FXCHr ((s1)), FSTr ((s1))) \
|
||||
: (FLDr ((s1)), FSTr ((rd)+1)))
|
||||
|
||||
/* - loads:
|
||||
|
||||
load into FPR0
|
||||
FSTP ST0
|
||||
FLD [FUBAR]
|
||||
|
||||
load into FPR3
|
||||
FSTP ST3 Save old st0 into destination register
|
||||
FLD [FUBAR]
|
||||
FXCH ST3 Get back old st0
|
||||
|
||||
(and similarly for immediates, using the stack) */
|
||||
|
||||
#define jit_movi_f(rd,immf) \
|
||||
(_O (0x68), \
|
||||
*((float *) _jit.x.pc) = (float) immf, \
|
||||
_jit.x.uc_pc += sizeof (float), \
|
||||
jit_ldr_f((rd), _ESP), \
|
||||
ADDLir(4, _ESP))
|
||||
|
||||
union jit_double_imm {
|
||||
double d;
|
||||
int i[2];
|
||||
};
|
||||
|
||||
#define jit_movi_d(rd,immd) \
|
||||
(_O (0x68), \
|
||||
_jit.x.uc_pc[4] = 0x68, \
|
||||
((union jit_double_imm *) (_jit.x.uc_pc + 5))->d = (double) immd, \
|
||||
*((int *) _jit.x.uc_pc) = ((union jit_double_imm *) (_jit.x.uc_pc + 5))->i[1], \
|
||||
_jit.x.uc_pc += 9, \
|
||||
jit_ldr_d((rd), _ESP), \
|
||||
ADDLir(8, _ESP))
|
||||
|
||||
#define jit_ldi_f(rd, is) \
|
||||
((rd) == 0 ? (FSTPr (0), FLDSm((is), 0, 0, 0)) \
|
||||
: (FLDSm((is), 0, 0, 0), FSTPr ((rd) + 1)))
|
||||
|
||||
#define jit_ldi_d(rd, is) \
|
||||
((rd) == 0 ? (FSTPr (0), FLDLm((is), 0, 0, 0)) \
|
||||
: (FLDLm((is), 0, 0, 0), FSTPr ((rd) + 1)))
|
||||
|
||||
#define jit_ldr_f(rd, rs) \
|
||||
((rd) == 0 ? (FSTPr (0), FLDSm(0, (rs), 0, 0)) \
|
||||
: (FLDSm(0, (rs), 0, 0), FSTPr ((rd) + 1)))
|
||||
|
||||
#define jit_ldr_d(rd, rs) \
|
||||
((rd) == 0 ? (FSTPr (0), FLDLm(0, (rs), 0, 0)) \
|
||||
: (FLDLm(0, (rs), 0, 0), FSTPr ((rd) + 1)))
|
||||
|
||||
#define jit_ldxi_f(rd, rs, is) \
|
||||
((rd) == 0 ? (FSTPr (0), FLDSm((is), (rs), 0, 0)) \
|
||||
: (FLDSm((is), (rs), 0, 0), FSTPr ((rd) + 1)))
|
||||
|
||||
#define jit_ldxi_d(rd, rs, is) \
|
||||
((rd) == 0 ? (FSTPr (0), FLDLm((is), (rs), 0, 0)) \
|
||||
: (FLDLm((is), (rs), 0, 0), FSTPr ((rd) + 1)))
|
||||
|
||||
#define jit_ldxr_f(rd, s1, s2) \
|
||||
((rd) == 0 ? (FSTPr (0), FLDSm(0, (s1), (s2), 1)) \
|
||||
: (FLDSm(0, (s1), (s2), 1), FSTPr ((rd) + 1)))
|
||||
|
||||
#define jit_ldxr_d(rd, s1, s2) \
|
||||
((rd) == 0 ? (FSTPr (0), FLDLm(0, (s1), (s2), 1)) \
|
||||
: (FLDLm(0, (s1), (s2), 1), FSTPr ((rd) + 1)))
|
||||
|
||||
#define jit_extr_i_d(rd, rs) (PUSHLr((rs)), \
|
||||
((rd) == 0 ? (FSTPr (0), FILDLm(0, _ESP, 0, 0)) \
|
||||
: (FILDLm(0, _ESP, 0, 0), FSTPr ((rd) + 1))), \
|
||||
POPLr((rs)))
|
||||
|
||||
#define jit_stxi_f(id, rd, rs) jit_fxch ((rs), FSTSm((id), (rd), 0, 0))
|
||||
#define jit_stxr_f(d1, d2, rs) jit_fxch ((rs), FSTSm(0, (d1), (d2), 1))
|
||||
#define jit_stxi_d(id, rd, rs) jit_fxch ((rs), FSTLm((id), (rd), 0, 0))
|
||||
#define jit_stxr_d(d1, d2, rs) jit_fxch ((rs), FSTLm(0, (d1), (d2), 1))
|
||||
#define jit_sti_f(id, rs) jit_fxch ((rs), FSTSm((id), 0, 0, 0))
|
||||
#define jit_str_f(rd, rs) jit_fxch ((rs), FSTSm(0, (rd), 0, 0))
|
||||
#define jit_sti_d(id, rs) jit_fxch ((rs), FSTLm((id), 0, 0, 0))
|
||||
#define jit_str_d(rd, rs) jit_fxch ((rs), FSTLm(0, (rd), 0, 0))
|
||||
|
||||
/* Assume round to near mode */
|
||||
#define jit_floorr_d_i(rd, rs) \
|
||||
(FLDr (rs), jit_floor2((rd), ((rd) == _EDX ? _EAX : _EDX)))
|
||||
|
||||
#define jit_ceilr_d_i(rd, rs) \
|
||||
(FLDr (rs), jit_ceil2((rd), ((rd) == _EDX ? _EAX : _EDX)))
|
||||
|
||||
#define jit_truncr_d_i(rd, rs) \
|
||||
(FLDr (rs), jit_trunc2((rd), ((rd) == _EDX ? _EAX : _EDX)))
|
||||
|
||||
#define jit_calc_diff(ofs) \
|
||||
FISTLm(ofs, _ESP, 0, 0), \
|
||||
FILDLm(ofs, _ESP, 0, 0), \
|
||||
FSUBRPr(1), \
|
||||
FSTPSm(4+ofs, _ESP, 0, 0) \
|
||||
|
||||
/* The real meat */
|
||||
#define jit_floor2(rd, aux) \
|
||||
(PUSHLr(aux), \
|
||||
SUBLir(8, _ESP), \
|
||||
jit_calc_diff(0), \
|
||||
POPLr(rd), /* floor in rd */ \
|
||||
POPLr(aux), /* x-round(x) in aux */ \
|
||||
ADDLir(0x7FFFFFFF, aux), /* carry if x-round(x) < -0 */ \
|
||||
SBBLir(0, rd), /* subtract 1 if carry */ \
|
||||
POPLr(aux))
|
||||
|
||||
#define jit_ceil2(rd, aux) \
|
||||
(PUSHLr(aux), \
|
||||
SUBLir(8, _ESP), \
|
||||
jit_calc_diff(0), \
|
||||
POPLr(rd), /* floor in rd */ \
|
||||
POPLr(aux), /* x-round(x) in aux */ \
|
||||
TESTLrr(aux, aux), \
|
||||
SETGr(jit_reg8(aux)), \
|
||||
SHRLir(1, aux), \
|
||||
ADCLir(0, rd), \
|
||||
POPLr(aux))
|
||||
|
||||
/* a mingling of the two above */
|
||||
#define jit_trunc2(rd, aux) \
|
||||
(PUSHLr(aux), \
|
||||
SUBLir(12, _ESP), \
|
||||
FSTSm(0, _ESP, 0, 0), \
|
||||
jit_calc_diff(4), \
|
||||
POPLr(aux), \
|
||||
POPLr(rd), \
|
||||
TESTLrr(aux, aux), \
|
||||
POPLr(aux), \
|
||||
JSSm(_jit.x.pc + 11, 0, 0, 0), \
|
||||
ADDLir(0x7FFFFFFF, aux), /* 6 */ \
|
||||
SBBLir(0, rd), /* 3 */ \
|
||||
JMPSm(_jit.x.pc + 10, 0, 0, 0), /* 2 */ \
|
||||
TESTLrr(aux, aux), /* 2 */ \
|
||||
SETGr(jit_reg8(aux)), /* 3 */ \
|
||||
SHRLir(1, aux), /* 2 */ \
|
||||
ADCLir(0, rd), /* 3 */ \
|
||||
POPLr(aux))
|
||||
|
||||
/* the easy one */
|
||||
#define jit_roundr_d_i(rd, rs) \
|
||||
(PUSHLr(_EAX), \
|
||||
jit_fxch ((rs), FISTPLm(0, _ESP, 0, 0)), \
|
||||
POPLr((rd)))
|
||||
|
||||
#define jit_fp_test(d, s1, s2, n, _and, res) \
|
||||
(((s1) == 0 ? FUCOMr((s2)) : (FLDr((s1)), FUCOMPr((s2) + 1))), \
|
||||
((d) != _EAX ? MOVLrr(_EAX, (d)) : 0), \
|
||||
FNSTSWr(_EAX), \
|
||||
SHRLir(n, _EAX), \
|
||||
((_and) ? ANDLir((_and), _EAX) : MOVLir(0, _EAX)), \
|
||||
res, \
|
||||
((d) != _EAX ? _O (0x90 + ((d) & 7)) : 0)) /* xchg */
|
||||
|
||||
#define jit_fp_btest(d, s1, s2, n, _and, cmp, res) \
|
||||
(((s1) == 0 ? FUCOMr((s2)) : (FLDr((s1)), FUCOMPr((s2) + 1))), \
|
||||
PUSHLr(_EAX), \
|
||||
FNSTSWr(_EAX), \
|
||||
SHRLir(n, _EAX), \
|
||||
((_and) ? ANDLir ((_and), _EAX) : 0), \
|
||||
((cmp) ? CMPLir ((cmp), _AL) : 0), \
|
||||
POPLr(_EAX), \
|
||||
res ((d), 0, 0, 0))
|
||||
|
||||
#define jit_nothing_needed(x)
|
||||
|
||||
/* After FNSTSW we have 1 if <, 40 if =, 0 if >, 45 if unordered. Here
|
||||
is how to map the values of the status word's high byte to the
|
||||
conditions.
|
||||
|
||||
< = > unord valid values condition
|
||||
gt no no yes no 0 STSW & 45 == 0
|
||||
lt yes no no no 1 STSW & 45 == 1
|
||||
eq no yes no no 40 STSW & 45 == 40
|
||||
unord no no no yes 45 bit 2 == 1
|
||||
|
||||
ge no yes no no 0, 40 bit 0 == 0
|
||||
unlt yes no no yes 1, 45 bit 0 == 1
|
||||
ltgt yes no yes no 0, 1 bit 6 == 0
|
||||
uneq no yes no yes 40, 45 bit 6 == 1
|
||||
le yes yes no no 1, 40 odd parity for STSW & 41
|
||||
ungt no no yes yes 0, 45 even parity for STSW & 41
|
||||
|
||||
unle yes yes no yes 1, 40, 45 STSW & 45 != 0
|
||||
unge no yes yes yes 0, 40, 45 STSW & 45 != 1
|
||||
ne yes no yes yes 0, 1, 45 STSW & 45 != 40
|
||||
ord yes yes yes no 0, 1, 40 bit 2 == 0
|
||||
|
||||
lt, le, ungt, unge are actually computed as gt, ge, unlt, unle with
|
||||
the operands swapped; it is more efficient this way. */
|
||||
|
||||
#define jit_gtr_d(d, s1, s2) jit_fp_test((d), (s1), (s2), 8, 0x45, SETZr (_AL))
|
||||
#define jit_ger_d(d, s1, s2) jit_fp_test((d), (s1), (s2), 9, 0, SBBBir (-1, _AL))
|
||||
#define jit_unler_d(d, s1, s2) jit_fp_test((d), (s1), (s2), 8, 0x45, SETNZr (_AL))
|
||||
#define jit_unltr_d(d, s1, s2) jit_fp_test((d), (s1), (s2), 9, 0, ADCBir (0, _AL))
|
||||
#define jit_ltr_d(d, s1, s2) jit_fp_test((d), (s2), (s1), 8, 0x45, SETZr (_AL))
|
||||
#define jit_ler_d(d, s1, s2) jit_fp_test((d), (s2), (s1), 9, 0, SBBBir (-1, _AL))
|
||||
#define jit_unger_d(d, s1, s2) jit_fp_test((d), (s2), (s1), 8, 0x45, SETNZr (_AL))
|
||||
#define jit_ungtr_d(d, s1, s2) jit_fp_test((d), (s2), (s1), 9, 0, ADCBir (0, _AL))
|
||||
#define jit_eqr_d(d, s1, s2) jit_fp_test((d), (s1), (s2), 8, 0x45, (CMPBir (0x40, _AL), SETEr (_AL)))
|
||||
#define jit_ner_d(d, s1, s2) jit_fp_test((d), (s1), (s2), 8, 0x45, (CMPBir (0x40, _AL), SETNEr (_AL)))
|
||||
#define jit_ltgtr_d(d, s1, s2) jit_fp_test((d), (s1), (s2), 15, 0, SBBBir (-1, _AL))
|
||||
#define jit_uneqr_d(d, s1, s2) jit_fp_test((d), (s1), (s2), 15, 0, ADCBir (0, _AL))
|
||||
#define jit_ordr_d(d, s1, s2) jit_fp_test((d), (s1), (s2), 11, 0, SBBBir (-1, _AL))
|
||||
#define jit_unordr_d(d, s1, s2) jit_fp_test((d), (s1), (s2), 11, 0, ADCBir (0, _AL))
|
||||
|
||||
#define jit_bgtr_d(d, s1, s2) jit_fp_btest((d), (s1), (s2), 8, 0x45, 0, JZm)
|
||||
#define jit_bger_d(d, s1, s2) jit_fp_btest((d), (s1), (s2), 9, 0, 0, JNCm)
|
||||
#define jit_bunler_d(d, s1, s2) jit_fp_btest((d), (s1), (s2), 8, 0x45, 0, JNZm)
|
||||
#define jit_bunltr_d(d, s1, s2) jit_fp_btest((d), (s1), (s2), 9, 0, 0, JCm)
|
||||
#define jit_bltr_d(d, s1, s2) jit_fp_btest((d), (s2), (s1), 8, 0x45, 0, JZm)
|
||||
#define jit_bler_d(d, s1, s2) jit_fp_btest((d), (s2), (s1), 9, 0, 0, JNCm)
|
||||
#define jit_bunger_d(d, s1, s2) jit_fp_btest((d), (s2), (s1), 8, 0x45, 0, JNZm)
|
||||
#define jit_bungtr_d(d, s1, s2) jit_fp_btest((d), (s2), (s1), 9, 0, 0, JCm)
|
||||
#define jit_beqr_d(d, s1, s2) jit_fp_btest((d), (s1), (s2), 8, 0x45, 0x40, JZm)
|
||||
#define jit_bner_d(d, s1, s2) jit_fp_btest((d), (s1), (s2), 8, 0x45, 0x40, JNZm)
|
||||
#define jit_bltgtr_d(d, s1, s2) jit_fp_btest((d), (s1), (s2), 15, 0, 0, JNCm)
|
||||
#define jit_buneqr_d(d, s1, s2) jit_fp_btest((d), (s1), (s2), 15, 0, 0, JCm)
|
||||
#define jit_bordr_d(d, s1, s2) jit_fp_btest((d), (s1), (s2), 11, 0, 0, JNCm)
|
||||
#define jit_bunordr_d(d, s1, s2) jit_fp_btest((d), (s1), (s2), 11, 0, 0, JCm)
|
||||
|
||||
#define jit_getarg_f(rd, ofs) jit_ldxi_f((rd), JIT_FP,(ofs))
|
||||
#define jit_getarg_d(rd, ofs) jit_ldxi_d((rd), JIT_FP,(ofs))
|
||||
#define jit_pusharg_d(rs) (jit_subi_i(JIT_SP,JIT_SP,sizeof(double)), jit_str_d(JIT_SP,(rs)))
|
||||
#define jit_pusharg_f(rs) (jit_subi_i(JIT_SP,JIT_SP,sizeof(float)), jit_str_f(JIT_SP,(rs)))
|
||||
#define jit_retval_d(op1) jit_movr_d(0, (op1))
|
||||
|
||||
|
||||
#if 0
|
||||
#define jit_sin() _OO(0xd9fe) /* fsin */
|
||||
#define jit_cos() _OO(0xd9ff) /* fcos */
|
||||
#define jit_tan() (_OO(0xd9f2), /* fptan */ \
|
||||
FSTPr(0)) /* fstp st */
|
||||
#define jit_atn() (_OO(0xd9e8), /* fld1 */ \
|
||||
_OO(0xd9f3)) /* fpatan */
|
||||
#define jit_exp() (_OO(0xd9ea), /* fldl2e */ \
|
||||
FMULPr(1), /* fmulp */ \
|
||||
_OO(0xd9c0), /* fld st */ \
|
||||
_OO(0xd9fc), /* frndint */ \
|
||||
_OO(0xdce9), /* fsubr */ \
|
||||
FXCHr(1), /* fxch st(1) */ \
|
||||
_OO(0xd9f0), /* f2xm1 */ \
|
||||
_OO(0xd9e8), /* fld1 */ \
|
||||
_OO(0xdec1), /* faddp */ \
|
||||
_OO(0xd9fd), /* fscale */ \
|
||||
FSTPr(1)) /* fstp st(1) */
|
||||
#define jit_log() (_OO(0xd9ed), /* fldln2 */ \
|
||||
FXCHr(1), /* fxch st(1) */ \
|
||||
_OO(0xd9f1)) /* fyl2x */
|
||||
#endif
|
||||
|
||||
#endif /* __lightning_asm_h */
|
||||
91
src/runtime/c/pgf/lightning/i386/funcs.h
Normal file
91
src/runtime/c/pgf/lightning/i386/funcs.h
Normal file
@@ -0,0 +1,91 @@
|
||||
/******************************** -*- C -*- ****************************
|
||||
*
|
||||
* Platform-independent layer inline functions (i386)
|
||||
*
|
||||
***********************************************************************/
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* Copyright 2000, 2001, 2002 Free Software Foundation, Inc.
|
||||
* Written by Paolo Bonzini.
|
||||
*
|
||||
* This file is part of GNU lightning.
|
||||
*
|
||||
* GNU lightning is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* GNU lightning 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 Lesser General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with GNU lightning; see the file COPYING.LESSER; if not, write to the
|
||||
* Free Software Foundation, 59 Temple Place - Suite 330, Boston,
|
||||
* MA 02111-1307, USA.
|
||||
*
|
||||
***********************************************************************/
|
||||
|
||||
|
||||
|
||||
#ifndef __lightning_funcs_h
|
||||
#define __lightning_funcs_h
|
||||
|
||||
#ifdef __linux__
|
||||
#include <unistd.h>
|
||||
#include <sys/mman.h>
|
||||
#endif
|
||||
|
||||
static void
|
||||
jit_flush_code(void *dest, void *end)
|
||||
{
|
||||
/* On the x86, the PROT_EXEC bits are not handled by the MMU.
|
||||
However, the kernel can emulate this by setting the code
|
||||
segment's limit to the end address of the highest page
|
||||
whose PROT_EXEC bit is set.
|
||||
|
||||
Linux kernels that do so and that disable by default the
|
||||
execution of the data and stack segment are becoming more
|
||||
and more common (Fedora, for example), so we implement our
|
||||
jit_flush_code as an mprotect. */
|
||||
#ifdef __linux__
|
||||
static unsigned long prev_page = 0, prev_length = 0;
|
||||
int page, length;
|
||||
#ifdef PAGESIZE
|
||||
const int page_size = PAGESIZE;
|
||||
#else
|
||||
static int page_size = -1;
|
||||
if (page_size == -1)
|
||||
page_size = sysconf (_SC_PAGESIZE);
|
||||
#endif
|
||||
|
||||
page = (long) dest & ~(page_size - 1);
|
||||
length = ((char *) end - (char *) page + page_size - 1) & ~(page_size - 1);
|
||||
|
||||
/* Simple-minded attempt at optimizing the common case where a single
|
||||
chunk of memory is used to compile multiple functions. */
|
||||
if (page >= prev_page && page + length <= prev_page + prev_length)
|
||||
return;
|
||||
|
||||
mprotect ((void *) page, length, PROT_READ | PROT_WRITE | PROT_EXEC);
|
||||
|
||||
/* See if we can extend the previously mprotect'ed memory area towards
|
||||
higher addresses: the starting address remains the same as before. */
|
||||
if (page >= prev_page && page <= prev_page + prev_length)
|
||||
prev_length = page + length - prev_page;
|
||||
|
||||
/* See if we can extend the previously mprotect'ed memory area towards
|
||||
lower addresses: the highest address remains the same as before. */
|
||||
else if (page < prev_page && page + length <= prev_page + prev_length)
|
||||
prev_length += prev_page - page, prev_page = page;
|
||||
|
||||
/* Nothing to do, replace the area. */
|
||||
else
|
||||
prev_page = page, prev_length = length;
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* __lightning_funcs_h */
|
||||
647
src/runtime/c/pgf/lightning/ppc/asm.h
Normal file
647
src/runtime/c/pgf/lightning/ppc/asm.h
Normal file
@@ -0,0 +1,647 @@
|
||||
/******************************** -*- C -*- ****************************
|
||||
*
|
||||
* Run-time assembler for the PowerPC
|
||||
*
|
||||
***********************************************************************/
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* Copyright 1999, 2000, 2001, 2002 Ian Piumarta
|
||||
*
|
||||
* This file is part of GNU lightning.
|
||||
*
|
||||
* GNU lightning is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* GNU lightning 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 Lesser General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with GNU lightning; see the file COPYING.LESSER; if not, write to the
|
||||
* Free Software Foundation, 59 Temple Place - Suite 330, Boston,
|
||||
* MA 02111-1307, USA.
|
||||
*
|
||||
***********************************************************************/
|
||||
|
||||
#ifndef __lightning_asm_h
|
||||
#define __lightning_asm_h
|
||||
|
||||
/* <imm> = [0-9]+ | (.+) -> add i, one parameter (imm)
|
||||
* <reg> = r<imm> -> add r, one parameter (imm)
|
||||
* <mem> = <imm>(<reg>) -> add m, two parameters (imm,reg)
|
||||
* <idx> = <reg>(<reg>) -> add x, two parameters (reg,reg)
|
||||
*
|
||||
* `x' operands have two forms. For example `stwu source, rega(regb)'
|
||||
* could be written as either
|
||||
* STWUrx(source, rega, regb)
|
||||
* or
|
||||
* STWUXrrr(source, rega, regb)
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*** a brief NOTE about halfwords and "shifted" operands
|
||||
*
|
||||
* LOGICAL insns require UNSIGNED args in 0..65535, whether or not shifted
|
||||
*
|
||||
* ARITHMETIC insns require SIGNED args in -32768..32767, even when shifted
|
||||
*
|
||||
* as a special case: "lis/addis" also accepts UNSIGNED arguments in
|
||||
* 0..65535 since it is often used immediately before "ori" to load a 32-bit
|
||||
* constant (this is consistent with the GNU rs/6000 and PowerPC assemblers)
|
||||
*
|
||||
* thus: lis rD, expression@hi
|
||||
* ori rD, rD, expression@lo ; load 32-bit constant
|
||||
*/
|
||||
|
||||
typedef unsigned int jit_insn;
|
||||
|
||||
#ifndef LIGHTNING_DEBUG
|
||||
#define _cr0 0
|
||||
#define _cr1 1
|
||||
#define _cr2 2
|
||||
#define _cr3 3
|
||||
#define _cr4 4
|
||||
#define _cr5 5
|
||||
#define _cr6 6
|
||||
#define _cr7 7
|
||||
|
||||
#define _lt 0
|
||||
#define _gt 1
|
||||
#define _eq 2
|
||||
#define _so 3
|
||||
#define _un 3
|
||||
|
||||
#define _d16(D) (_ck_d(16,(_jit_UL(D)-_jit_UL(_jit.x.pc))) & ~3)
|
||||
#define _d26(D) (_ck_d(26,(_jit_UL(D)-_jit_UL(_jit.x.pc))) & ~3)
|
||||
|
||||
/* primitive instruction forms [1, Section A.4] */
|
||||
|
||||
#define _FB( OP, BD,AA,LK ) (_jit_I_noinc((_u6(OP)<<26)| _d26(BD)| (_u1(AA)<<1)|_u1(LK)), _jit.x.pc++, 0)
|
||||
#define _FBA( OP, BD,AA,LK ) _jit_I((_u6(OP)<<26)| (_u26(BD)&~3)| (_u1(AA)<<1)|_u1(LK))
|
||||
#define _BB( OP,BO,BI, BD,AA,LK ) (_jit_I_noinc((_u6(OP)<<26)|(_u5(BO)<<21)|(_u5(BI)<<16)| _d16(BD)| (_u1(AA)<<1)|_u1(LK)), _jit.x.pc++, 0)
|
||||
#define _D( OP,RD,RA, DD ) _jit_I((_u6(OP)<<26)|(_u5(RD)<<21)|(_u5(RA)<<16)| _s16(DD) )
|
||||
#define _Du( OP,RD,RA, DD ) _jit_I((_u6(OP)<<26)|(_u5(RD)<<21)|(_u5(RA)<<16)| _u16(DD) )
|
||||
#define _Ds( OP,RD,RA, DD ) _jit_I((_u6(OP)<<26)|(_u5(RD)<<21)|(_u5(RA)<<16)| _su16(DD) )
|
||||
#define _X( OP,RD,RA,RB, XO,RC ) _jit_I((_u6(OP)<<26)|(_u5(RD)<<21)|(_u5(RA)<<16)|( _u5(RB)<<11)| (_u10(XO)<<1)|_u1(RC))
|
||||
#define _XL( OP,BO,BI, XO,LK ) _jit_I((_u6(OP)<<26)|(_u5(BO)<<21)|(_u5(BI)<<16)|( _u5(00)<<11)| (_u10(XO)<<1)|_u1(LK))
|
||||
#define _XFX( OP,RD, SR,XO ) _jit_I((_u6(OP)<<26)|(_u5(RD)<<21)| (_u10(SR)<<11)| (_u10(XO)<<1)|_u1(00))
|
||||
#define _XO( OP,RD,RA,RB,OE,XO,RC ) _jit_I((_u6(OP)<<26)|(_u5(RD)<<21)|(_u5(RA)<<16)|( _u5(RB)<<11)|(_u1(OE)<<10)|( _u9(XO)<<1)|_u1(RC))
|
||||
#define _M( OP,RS,RA,SH,MB,ME,RC ) _jit_I((_u6(OP)<<26)|(_u5(RS)<<21)|(_u5(RA)<<16)|( _u5(SH)<<11)|(_u5(MB)<< 6)|( _u5(ME)<<1)|_u1(RC))
|
||||
|
||||
|
||||
/* special purpose registers (form XFX) [1, Section 8.2, page 8-138] */
|
||||
|
||||
#define SPR_LR ((8<<5)|(0))
|
||||
|
||||
/* +++ intrinsic instructions */
|
||||
|
||||
#define ADDrrr(RD, RA, RB) _XO (31, RD, RA, RB, 0, 266, 0)
|
||||
#define ADD_rrr(RD, RA, RB) _XO (31, RD, RA, RB, 0, 266, 1)
|
||||
#define ADDCrrr(RD, RA, RB) _XO (31, RD, RA, RB, 0, 10, 0)
|
||||
#define ADDC_rrr(RD, RA, RB) _XO (31, RD, RA, RB, 0, 10, 1)
|
||||
#define ADDErrr(RD, RA, RB) _XO (31, RD, RA, RB, 0, 138, 0)
|
||||
#define ADDE_rrr(RD, RA, RB) _XO (31, RD, RA, RB, 0, 138, 1)
|
||||
#define ADDOrrr(RD, RA, RB) _XO (31, RD, RA, RB, 1, 266, 0)
|
||||
#define ADDO_rrr(RD, RA, RB) _XO (31, RD, RA, RB, 1, 266, 1)
|
||||
#define ADDIrri(RD, RA, IMM) _D (14, RD, RA, IMM)
|
||||
#define ADDICrri(RD, RA, IMM) _D (12, RD, RA, IMM)
|
||||
#define ADDIC_rri(RD, RA, IMM) _D (13, RD, RA, IMM)
|
||||
#define ADDISrri(RD, RA, IMM) _Ds (15, RD, RA, IMM)
|
||||
|
||||
#define ANDrrr(RA, RS, RB) _X (31, RS, RA, RB, 28, 0)
|
||||
#define AND_rrr(RA, RS, RB) _X (31, RS, RA, RB, 28, 1)
|
||||
#define ANDCrrr(RA, RS, RB) _X (31, RS, RA, RB, 60, 0)
|
||||
#define ANDC_rrr(RA, RS, RB) _X (31, RS, RA, RB, 60, 1)
|
||||
#define ANDI_rri(RA, RS, IMM) _Du (28, RS, RA, IMM)
|
||||
#define ANDIS_rri(RA, RS, IMM) _Du (29, RS, RA, IMM)
|
||||
|
||||
#define Bi(BD) _FB (18, BD, 0, 0)
|
||||
#define BAi(BD) _FBA (18, BD, 1, 0)
|
||||
#define BLi(BD) _FB (18, BD, 0, 1)
|
||||
#define BLAi(BD) _FBA (18, BD, 1, 1)
|
||||
|
||||
#define BCiii(BO,BI,BD) _BB (16, BO, BI, BD, 0, 0)
|
||||
#define BCAiii(BO,BI,BD) _BB (16, BO, BI, BD, 1, 0)
|
||||
#define BCLiii(BO,BI,BD) _BB (16, BO, BI, BD, 0, 1)
|
||||
#define BCLAiii(BO,BI,BD) _BB (16, BO, BI, BD, 1, 1)
|
||||
|
||||
#define BCCTRii(BO,BI) _XL (19, BO, BI, 528, 0)
|
||||
#define BCCTRLii(BO,BI) _XL (19, BO, BI, 528, 1)
|
||||
|
||||
#define BCLRii(BO,BI) _XL (19, BO, BI, 16, 0)
|
||||
#define BCLRLii(BO,BI) _XL (19, BO, BI, 16, 1)
|
||||
|
||||
#define CMPiirr(CR, LL, RA, RB) _X (31, ((CR)<<2)|(LL), RA, RB, 0, 0)
|
||||
#define CMPIiiri(CR, LL, RA, IMM) _D (11, ((CR)<<2)|(LL), RA, IMM)
|
||||
|
||||
#define CMPLiirr(CR, LL, RA, RB) _X (31, ((CR)<<2)|(LL), RA, RB, 32, 0)
|
||||
#define CMPLIiiri(CR, LL, RA, IMM) _D (10, ((CR)<<2)|(LL), RA, IMM)
|
||||
|
||||
#define CRANDiii(CRD,CRA,CRB) _X (19, CRD, CRA, CRB, 257, 0)
|
||||
#define CRANDCiii(CRD,CRA,CRB) _X (19, CRD, CRA, CRB, 129, 0)
|
||||
#define CREQViii(CRD,CRA,CRB) _X (19, CRD, CRA, CRB, 289, 0)
|
||||
#define CRNANDiii(CRD,CRA,CRB) _X (19, CRD, CRA, CRB, 225, 0)
|
||||
#define CRNORiii(CRD,CRA,CRB) _X (19, CRD, CRA, CRB, 33, 0)
|
||||
#define CRORiii(CRD,CRA,CRB) _X (19, CRD, CRA, CRB, 449, 0)
|
||||
#define CRORCiii(CRD,CRA,CRB) _X (19, CRD, CRA, CRB, 417, 0)
|
||||
#define CRXORiii(CRD,CRA,CRB) _X (19, CRD, CRA, CRB, 193, 0)
|
||||
|
||||
#define DCBSTrr(RA,RB) _X (31, 00, RA, RB, 54, 0)
|
||||
|
||||
#define DIVWrrr(RD, RA, RB) _XO (31, RD, RA, RB, 0, 491, 0)
|
||||
#define DIVW_rrr(RD, RA, RB) _XO (31, RD, RA, RB, 0, 491, 1)
|
||||
#define DIVWOrrr(RD, RA, RB) _XO (31, RD, RA, RB, 1, 491, 0)
|
||||
#define DIVWO_rrr(RD, RA, RB) _XO (31, RD, RA, RB, 1, 491, 1)
|
||||
|
||||
#define DIVWUrrr(RD, RA, RB) _XO (31, RD, RA, RB, 0, 459, 0)
|
||||
#define DIVWU_rrr(RD, RA, RB) _XO (31, RD, RA, RB, 0, 459, 1)
|
||||
#define DIVWUOrrr(RD, RA, RB) _XO (31, RD, RA, RB, 1, 459, 0)
|
||||
#define DIVWUO_rrr(RD, RA, RB) _XO (31, RD, RA, RB, 1, 459, 1)
|
||||
|
||||
#define EQVrrr(Ra,RS,RB) _X (31, RS, RA, RB, 284, 0)
|
||||
#define EQV_rrr(Ra,RS,RB) _X (31, RS, RA, RB, 284, 1)
|
||||
|
||||
#define EXTSBrr(RA,RS) _X (31, RS, RA, 0, 954, 0)
|
||||
#define EXTSB_rr(RA,RS) _X (31, RS, RA, 0, 954, 1)
|
||||
|
||||
#define EXTSHrr(RA,RS) _X (31, RS, RA, 0, 922, 0)
|
||||
#define EXTSH_rr(RA,RS) _X (31, RS, RA, 0, 922, 1)
|
||||
|
||||
#define ICBIrr(RA,RB) _X (31, 00, RA, RB, 982, 0)
|
||||
|
||||
#define ISYNC() _X (19, 00, 00, 00, 150, 0)
|
||||
|
||||
#define LBZrm(RD,ID,RA) _D (34, RD, RA, ID)
|
||||
#define LBZUrm(RD,ID,RA) _D (35, RD, RA, ID)
|
||||
#define LBZUXrrr(RD,RA,RB) _X (31, RD, RA, RB, 119, 0)
|
||||
#define LBZXrrr(RD,RA,RB) _X (31, RD, RA, RB, 87, 0)
|
||||
|
||||
#define LHArm(RD,ID,RA) _D (42, RD, RA, ID)
|
||||
#define LHAUrm(RD,ID,RA) _D (43, RD, RA, ID)
|
||||
#define LHAUXrrr(RD,RA,RB) _X (31, RD, RA, RB, 375, 0)
|
||||
#define LHAXrrr(RD,RA,RB) _X (31, RD, RA, RB, 343, 0)
|
||||
#define LHBRXrrr(RD,RA,RB) _X (31, RD, RA, RB, 790, 0)
|
||||
|
||||
#define LHZrm(RD,ID,RA) _D (40, RD, RA, ID)
|
||||
#define LHZUrm(RD,ID,RA) _D (41, RD, RA, ID)
|
||||
#define LHZUXrrr(RD,RA,RB) _X (31, RD, RA, RB, 311, 0)
|
||||
#define LHZXrrr(RD,RA,RB) _X (31, RD, RA, RB, 279, 0)
|
||||
|
||||
#define LMWrm(RD,ID,RA) _D (46, RD, RA, ID)
|
||||
|
||||
#define LWBRXrrr(RD,RA,RB) _X (31, RD, RA, RB, 534, 0)
|
||||
|
||||
#define LWZrm(RD, DISP, RA) _D (32, RD, RA, DISP)
|
||||
#define LWZUrm(RD, DISP, RA) _D (33, RD, RA, DISP)
|
||||
#define LWZUXrrr(RD, RA, RB) _X (31, RD, RA, RB, 56, 0)
|
||||
#define LWZXrrr(RD, RA, RB) _X (31, RD, RA, RB, 23, 0)
|
||||
|
||||
#define MCRFii(CD,CS) _X (19, ((CD)<<2), ((CS)<<2), 0, 0, 0)
|
||||
|
||||
#define MFCRr(RD) _X (31, RD, 0, 0, 19, 0)
|
||||
#define MCRXRi(RD) _XFX (31, (RD)<<2, 0, 512)
|
||||
|
||||
#define MFSPRri(RD, SPR) _XFX (31, RD, (SPR)<<5, 339)
|
||||
#define MTSPRir(SPR, RS) _XFX (31, RS, (SPR)<<5, 467)
|
||||
|
||||
#define MULHWrrr(RD,RA,RB) _XO (31, RD, RA, RB, 0, 75, 0)
|
||||
#define MULHW_rrr(RD,RA,RB) _XO (31, RD, RA, RB, 0, 75, 1)
|
||||
#define MULHWUrrr(RD,RA,RB) _XO (31, RD, RA, RB, 0, 11, 0)
|
||||
#define MULHWU_rrr(RD,RA,RB) _XO (31, RD, RA, RB, 0, 11, 1)
|
||||
|
||||
#define MULLIrri(RD,RA,IM) _D (07, RD, RA, IM)
|
||||
|
||||
#define MULLWrrr(RD,RA,RB) _XO (31, RD, RA, RB, 0, 235, 0)
|
||||
#define MULLW_rrr(RD,RA,RB) _XO (31, RD, RA, RB, 0, 235, 1)
|
||||
#define MULLWOrrr(RD,RA,RB) _XO (31, RD, RA, RB, 1, 235, 0)
|
||||
#define MULLWO_rrr(RD,RA,RB) _XO (31, RD, RA, RB, 1, 235, 1)
|
||||
|
||||
#define NANDrrr(RA,RS,RB) _X (31, RS, RA, RB, 476, 0)
|
||||
#define NAND_rrr(RA,RS,RB) _X (31, RS, RA, RB, 476, 1)
|
||||
|
||||
#define NEGrr(RD,RA) _XO (31, RD, RA, 0, 0, 104, 0)
|
||||
#define NEG_rr(RD,RA) _XO (31, RD, RA, 0, 0, 104, 1)
|
||||
#define NEGOrr(RD,RA) _XO (31, RD, RA, 0, 1, 104, 0)
|
||||
#define NEGO_rr(RD,RA) _XO (31, RD, RA, 0, 1, 104, 1)
|
||||
|
||||
#define NORrrr(RA,RS,RB) _X (31, RS, RA, RB, 124, 0)
|
||||
#define NOR_rrr(RA,RS,RB) _X (31, RS, RA, RB, 124, 1)
|
||||
|
||||
#define ORrrr(RA,RS,RB) _X (31, RS, RA, RB, 444, 0)
|
||||
#define OR_rrr(RA,RS,RB) _X (31, RS, RA, RB, 444, 1)
|
||||
#define ORCrrr(RA,RS,RB) _X (31, RS, RA, RB, 412, 0)
|
||||
#define ORC_rrr(RA,RS,RB) _X (31, RS, RA, RB, 412, 1)
|
||||
#define ORIrri(RA,RS,IM) _Du (24, RS, RA, IM)
|
||||
#define ORISrri(RA,RS,IM) _Du (25, RS, RA, IM)
|
||||
|
||||
#define RLWIMIrriii(RA,RS,SH,MB,ME) _M (20, RS, RA, SH, MB, ME, 0)
|
||||
#define RLWIMI_rriii(RA,RS,SH,MB,ME) _M (20, RS, RA, SH, MB, ME, 1)
|
||||
|
||||
#define RLWINMrriii(RA,RS,SH,MB,ME) _M (21, RS, RA, SH, MB, ME, 0)
|
||||
#define RLWINM_rriii(RA,RS,SH,MB,ME) _M (21, RS, RA, SH, MB, ME, 1)
|
||||
|
||||
#define RLWNMrrrii(RA,RS,RB,MB,ME) _M (23, RS, RA, RB, MB, ME, 0)
|
||||
#define RLWNM_rrrii(RA,RS,RB,MB,ME) _M (23, RS, RA, RB, MB, ME, 1)
|
||||
|
||||
#define SLWrrr(RA,RS,RB) _X (31, RS, RA, RB, 24, 0)
|
||||
#define SLW_rrr(RA,RS,RB) _X (31, RS, RA, RB, 24, 1)
|
||||
|
||||
#define SRAWrrr(RA,RS,RB) _X (31, RS, RA, RB, 792, 0)
|
||||
#define SRAW_rrr(RA,RS,RB) _X (31, RS, RA, RB, 792, 1)
|
||||
|
||||
#define SRAWIrri(RD, RS, SH) _X (31, RS, RD, SH, 824, 0)
|
||||
#define SRAWI_rri(RD, RS, SH) _X (31, RS, RD, SH, 824, 1)
|
||||
|
||||
#define SRWrrr(RA,RS,RB) _X (31, RS, RA, RB, 536, 0)
|
||||
#define SRW_rrr(RA,RS,RB) _X (31, RS, RA, RB, 536, 1)
|
||||
|
||||
#define STBrm(RS,ID,RA) _D (38, RS, RA, ID)
|
||||
#define STBUrm(RS,ID,RA) _D (39, RS, RA, ID)
|
||||
#define STBUXrrr(RS,RA,RB) _X (31, RS, RA, RB, 247, 0)
|
||||
#define STBXrrr(RS,RA,RB) _X (31, RS, RA, RB, 215, 0)
|
||||
|
||||
#define STHrm(RS,ID,RA) _D (44, RS, RA, ID)
|
||||
#define STHUrm(RS,ID,RA) _D (45, RS, RA, ID)
|
||||
#define STHBRXrrr(RS,RA,RB) _X (31, RS, RA, RB, 918, 0)
|
||||
#define STHUXrrr(RS,RA,RB) _X (31, RS, RA, RB, 439, 0)
|
||||
#define STHXrrr(RS,RA,RB) _X (31, RS, RA, RB, 407, 0)
|
||||
|
||||
#define STMWrm(RS,ID,RA) _D (47, RS, RA, ID)
|
||||
|
||||
#define STWrm(RS,ID,RA) _D (36, RS, RA, ID)
|
||||
#define STWBRXrrr(RS,RA,RB) _X (31, RS, RA, RB, 662, 0)
|
||||
#define STWCXrrr(RS,RA,RB) _X (31, RS, RA, RB, 150, 0)
|
||||
#define STWCX_rrr(RS,RA,RB) _X (31, RS, RA, RB, 150, 1)
|
||||
#define STWUrm(RS,ID,RA) _D (37, RS, RA, ID)
|
||||
#define STWUXrrr(RS,RA,RB) _X (31, RS, RA, RB, 183, 0)
|
||||
#define STWXrrr(RS,RA,RB) _X (31, RS, RA, RB, 151, 0)
|
||||
|
||||
#define SUBFrrr(RD, RA, RB) _XO (31, RD, RA, RB, 0, 40, 0)
|
||||
#define SUBF_rrr(RD, RA, RB) _XO (31, RD, RA, RB, 0, 40, 1)
|
||||
#define SUBFrrr(RD, RA, RB) _XO (31, RD, RA, RB, 0, 40, 0)
|
||||
#define SUBF_rrr(RD, RA, RB) _XO (31, RD, RA, RB, 0, 40, 1)
|
||||
#define SUBFErrr(RD, RA, RB) _XO (31, RD, RA, RB, 1, 136, 0)
|
||||
#define SUBFE_rrr(RD, RA, RB) _XO (31, RD, RA, RB, 1, 136, 1)
|
||||
#define SUBFCrrr(RD, RA, RB) _XO (31, RD, RA, RB, 0, 8, 0)
|
||||
#define SUBFC_rrr(RD, RA, RB) _XO (31, RD, RA, RB, 0, 8, 1)
|
||||
#define SUBFCOrrr(RD, RA, RB) _XO (31, RD, RA, RB, 1, 8, 0)
|
||||
#define SUBFCO_rrr(RD, RA, RB) _XO (31, RD, RA, RB, 1, 8, 1)
|
||||
#define SUBFICrri(RD, RA, IMM) _D (8, RD, RA, IMM)
|
||||
|
||||
#define ADDrrr(RD, RA, RB) _XO (31, RD, RA, RB, 0, 266, 0)
|
||||
#define ADDOrrr(RD, RA, RB) _XO (31, RD, RA, RB, 1, 266, 0)
|
||||
#define ADDIrri(RD, RA, IMM) _D (14, RD, RA, IMM)
|
||||
#define ADDISrri(RD, RA, IMM) _Ds (15, RD, RA, IMM)
|
||||
|
||||
#define SYNC() _X (31, 00, 00, 00, 598, 0)
|
||||
|
||||
#define TWirr(TO,RA,RB) _X (31, TO, RA, RB, 4, 0)
|
||||
#define TWIiri(TO,RA,IM) _D (03, TO, RA, IM)
|
||||
|
||||
#define XORrrr(RA,RS,RB) _X (31, RS, RA, RB, 316, 0)
|
||||
#define XOR_rrr(RA,RS,RB) _X (31, RS, RA, RB, 316, 1)
|
||||
#define XORIrri(RA,RS,IM) _Du (26, RS, RA, IM)
|
||||
#define XORISrri(RA,RS,IM) _Du (27, RS, RA, IM)
|
||||
|
||||
/* simplified mnemonics [1, Appendix F] */
|
||||
|
||||
#define MOVEIri2(R,H,L) (LISri(R,H), (L ? ORIrri(R,R,L) : 0))
|
||||
#define MOVEIri(R,I) (_siP(16,I) ? LIri(R,I) : \
|
||||
MOVEIri2(R, _HI(I), _LO(I)) )
|
||||
|
||||
#define SUBIrri(RD,RA,IM) ADDIrri(RD,RA,-_LO((IM))) /* [1, Section F.2.1] */
|
||||
#define SUBISrri(RD,RA,IM) ADDISrri(RD,RA,-_LO((IM)))
|
||||
#define SUBICrri(RD,RA,IM) ADDICrri(RD,RA,-_LO((IM)))
|
||||
#define SUBIC_rri(RD,RA,IM) ADDIC_rri(RD,RA,-_LO((IM)))
|
||||
|
||||
#define SUBrrr(RD,RA,RB) SUBFrrr(RD,RB,RA) /* [1, Section F.2.2] */
|
||||
#define SUBOrrr(RD,RA,RB) SUBFOrrr(RD,RB,RA)
|
||||
#define SUB_rrr(RD,RA,RB) SUBF_rrr(RD,RB,RA)
|
||||
#define SUBCrrr(RD,RA,RB) SUBFCrrr(RD,RB,RA)
|
||||
#define SUBCOrrr(RD,RA,RB) SUBFCOrrr(RD,RB,RA)
|
||||
#define SUBC_rrr(RD,RA,RB) SUBFC_rrr(RD,RB,RA)
|
||||
#define SUBErrr(RD,RA,RB) SUBFErrr(RD,RB,RA)
|
||||
#define SUBE_rrr(RD,RA,RB) SUBFE_rrr(RD,RB,RA)
|
||||
|
||||
#define CMPWIiri(C,RA,IM) CMPIiiri(C,0,RA,IM) /* [1, Table F-2] */
|
||||
#define CMPWirr(C,RA,RB) CMPiirr(C,0,RA,RB)
|
||||
#define CMPLWIiri(C,RA,IM) CMPLIiiri(C,0,RA,IM)
|
||||
#define CMPLWirr(C,RA,RB) CMPLiirr(C,0,RA,RB)
|
||||
|
||||
#define CMPWIri(RA,IM) CMPWIiri(0,RA,IM) /* with implicit _cr0 */
|
||||
#define CMPWrr(RA,RB) CMPWirr(0,RA,RB)
|
||||
#define CMPLWIri(RA,IM) CMPLWIiri(0,RA,IM)
|
||||
#define CMPLWrr(RA,RB) CMPLWirr(0,RA,RB)
|
||||
|
||||
#define EXTLWIrrii(RA,RS,N,B) RLWINMrriii(RA, RS, B, 0, (N)-1) /* [1, Table F-3] */
|
||||
#define EXTRWIrrii(RA,RS,N,B) RLWINMrriii(RA, RS, (B)+(N), 32-(N), 31)
|
||||
#define INSLWIrrii(RA,RS,N,B) RLWIMIrriii(RA, RS, 32-(B), B, (B)+(N)-1)
|
||||
#define INSRWIrrii(RA,RS,N,B) RLWIMIrriii(RA, RS, 32-((B)+(N)), B, (B)+(N)-1)
|
||||
#define ROTLWIrri(RA,RS,N) RLWINMrriii(RA, RS, N, 0, 31)
|
||||
#define ROTRWIrri(RA,RS,N) RLWINMrriii(RA, RS, 32-(N), 0, 31)
|
||||
#define ROTLWrrr(RA,RS,RB) RLWNMrrrii( RA, RS, RB, 0, 31)
|
||||
#define SLWIrri(RA,RS,N) RLWINMrriii(RA, RS, N, 0, 31-(N))
|
||||
#define SRWIrri(RA,RS,N) RLWINMrriii(RA, RS, 32-(N), N, 31)
|
||||
#define CLRLWIrri(RA,RS,N) RLWINMrriii(RA, RS, 0, N, 31)
|
||||
#define CLRRWIrri(RA,RS,N) RLWINMrriii(RA, RS, 0, 0, 31-(N))
|
||||
#define CLRLSLWIrrii(RA,RS,B,N) RLWINMrriii(RA, RS, N, (B)-(N), 31-(N))
|
||||
|
||||
|
||||
/* 9 below inverts the branch condition and the branch prediction.
|
||||
* This has an incestuous knowledge of JIT_AUX */
|
||||
#define BC_EXT(A, C, D) (_siP(16, _jit_UL(D)-_jit_UL(_jit.x.pc)) \
|
||||
? BCiii((A), (C), (D)) \
|
||||
: (BCiii((A)^9, (C), _jit.x.pc+5), \
|
||||
LISri(JIT_AUX,_HI(D)), \
|
||||
ORIrri(JIT_AUX,JIT_AUX,_LO(D)), \
|
||||
MTLRr(JIT_AUX), BLR() ))
|
||||
|
||||
#define B_EXT(D) (_siP(16, _jit_UL(D)-_jit_UL(_jit.x.pc)) \
|
||||
? Bi((D)) \
|
||||
: (LISri(JIT_AUX,_HI(D)), \
|
||||
ORIrri(JIT_AUX,JIT_AUX,_LO(D)), \
|
||||
MTLRr(JIT_AUX), BLR()) )
|
||||
|
||||
#define BTii(C,D) BC_EXT(12, C, D) /* [1, Table F-5] */
|
||||
#define BFii(C,D) BC_EXT( 4, C, D)
|
||||
#define BDNZi(D) BCiii(16, 0, D)
|
||||
#define BDNZTii(C,D) BC_EXT( 8, C, D)
|
||||
#define BDNZFii(C,D) BC_EXT( 0, C, D)
|
||||
#define BDZi(D) BCiii(18, 0, D)
|
||||
#define BDZTii(C,D) BC_EXT(10, C, D)
|
||||
#define BDZFii(C,D) BC_EXT( 2, C, D)
|
||||
|
||||
#define BCTR() BCCTRii(20, 0) /* [1, Table F-6] */
|
||||
#define BCTRL() BCCTRLii(20, 0)
|
||||
|
||||
#define BLR() BCLRii(20, 0) /* [1, Table F-6] */
|
||||
#define BLRL() BCLRLii(20, 0)
|
||||
|
||||
|
||||
#define BLTLRi(CR) BCLRii(12, ((CR)<<2)+0) /* [1, Table F-10] */
|
||||
#define BLELRi(CR) BCLRii( 4, ((CR)<<2)+1)
|
||||
#define BEQLRi(CR) BCLRii(12, ((CR)<<2)+2)
|
||||
#define BGELRi(CR) BCLRii( 4, ((CR)<<2)+0)
|
||||
#define BGTLRi(CR) BCLRii(12, ((CR)<<2)+1)
|
||||
#define BNLLRi(CR) BCLRii( 4, ((CR)<<2)+0)
|
||||
#define BNELRi(CR) BCLRii( 4, ((CR)<<2)+2)
|
||||
#define BNGLRi(CR) BCLRii( 4, ((CR)<<2)+1)
|
||||
#define BSOLRi(CR) BCLRii(12, ((CR)<<2)+3)
|
||||
#define BNSLRi(CR) BCLRii( 4, ((CR)<<2)+3)
|
||||
#define BUNLRi(CR) BCLRii(12, ((CR)<<2)+3)
|
||||
#define BNULRi(CR) BCLRii( 4, ((CR)<<2)+3)
|
||||
|
||||
#define BLTLRLi(CR) BCLRLii(12, ((CR)<<2)+0) /* [1, Table F-10] */
|
||||
#define BLELRLi(CR) BCLRLii( 4, ((CR)<<2)+1)
|
||||
#define BEQLRLi(CR) BCLRLii(12, ((CR)<<2)+2)
|
||||
#define BGELRLi(CR) BCLRLii( 4, ((CR)<<2)+0)
|
||||
#define BGTLRLi(CR) BCLRLii(12, ((CR)<<2)+1)
|
||||
#define BNLLRLi(CR) BCLRLii( 4, ((CR)<<2)+0)
|
||||
#define BNELRLi(CR) BCLRLii( 4, ((CR)<<2)+2)
|
||||
#define BNGLRLi(CR) BCLRLii( 4, ((CR)<<2)+1)
|
||||
#define BSOLRLi(CR) BCLRLii(12, ((CR)<<2)+3)
|
||||
#define BNSLRLi(CR) BCLRLii( 4, ((CR)<<2)+3)
|
||||
#define BUNLRLi(CR) BCLRLii(12, ((CR)<<2)+3)
|
||||
#define BNULRLi(CR) BCLRLii( 4, ((CR)<<2)+3)
|
||||
|
||||
#define BLTCTRi(CR) BCCTRii(12, ((CR)<<2)+0) /* [1, Table F-10] */
|
||||
#define BLECTRi(CR) BCCTRii( 4, ((CR)<<2)+1)
|
||||
#define BEQCTRi(CR) BCCTRii(12, ((CR)<<2)+2)
|
||||
#define BGECTRi(CR) BCCTRii( 4, ((CR)<<2)+0)
|
||||
#define BGTCTRi(CR) BCCTRii(12, ((CR)<<2)+1)
|
||||
#define BNLCTRi(CR) BCCTRii( 4, ((CR)<<2)+0)
|
||||
#define BNECTRi(CR) BCCTRii( 4, ((CR)<<2)+2)
|
||||
#define BNGCTRi(CR) BCCTRii( 4, ((CR)<<2)+1)
|
||||
#define BSOCTRi(CR) BCCTRii(12, ((CR)<<2)+3)
|
||||
#define BNSCTRi(CR) BCCTRii( 4, ((CR)<<2)+3)
|
||||
#define BUNCTRi(CR) BCCTRii(12, ((CR)<<2)+3)
|
||||
#define BNUCTRi(CR) BCCTRii( 4, ((CR)<<2)+3)
|
||||
|
||||
#define BLTCTRLi(CR) BCCTRLii(12, ((CR)<<2)+0) /* [1, Table F-10] */
|
||||
#define BLECTRLi(CR) BCCTRLii( 4, ((CR)<<2)+1)
|
||||
#define BEQCTRLi(CR) BCCTRLii(12, ((CR)<<2)+2)
|
||||
#define BGECTRLi(CR) BCCTRLii( 4, ((CR)<<2)+0)
|
||||
#define BGTCTRLi(CR) BCCTRLii(12, ((CR)<<2)+1)
|
||||
#define BNLCTRLi(CR) BCCTRLii( 4, ((CR)<<2)+0)
|
||||
#define BNECTRLi(CR) BCCTRLii( 4, ((CR)<<2)+2)
|
||||
#define BNGCTRLi(CR) BCCTRLii( 4, ((CR)<<2)+1)
|
||||
#define BSOCTRLi(CR) BCCTRLii(12, ((CR)<<2)+3)
|
||||
#define BNSCTRLi(CR) BCCTRLii( 4, ((CR)<<2)+3)
|
||||
#define BUNCTRLi(CR) BCCTRLii(12, ((CR)<<2)+3)
|
||||
#define BNUCTRLi(CR) BCCTRLii( 4, ((CR)<<2)+3)
|
||||
|
||||
|
||||
#define BLTLR() BLTLRi(0) /* with implicit _cr0 */
|
||||
#define BLELR() BLELRi(0)
|
||||
#define BEQLR() BEQLRi(0)
|
||||
#define BGELR() BGELRi(0)
|
||||
#define BGTLR() BGTLRi(0)
|
||||
#define BNLLR() BNLLRi(0)
|
||||
#define BNELR() BNELRi(0)
|
||||
#define BNGLR() BNGLRi(0)
|
||||
#define BSOLR() BSOLRi(0)
|
||||
#define BNSLR() BNSLRi(0)
|
||||
#define BUNLR() BUNLRi(0)
|
||||
#define BNULR() BNULRi(0)
|
||||
|
||||
#define BLTLRL() BLTLRLi(0)
|
||||
#define BLELRL() BLELRLi(0)
|
||||
#define BEQLRL() BEQLRLi(0)
|
||||
#define BGELRL() BGELRLi(0)
|
||||
#define BGTLRL() BGTLRLi(0)
|
||||
#define BNLLRL() BNLLRLi(0)
|
||||
#define BNELRL() BNELRLi(0)
|
||||
#define BNGLRL() BNGLRLi(0)
|
||||
#define BSOLRL() BSOLRLi(0)
|
||||
#define BNSLRL() BNSLRLi(0)
|
||||
#define BUNLRL() BUNLRLi(0)
|
||||
#define BNULRL() BNULRLi(0)
|
||||
|
||||
#define BLTCTR() BLTCTRi(0)
|
||||
#define BLECTR() BLECTRi(0)
|
||||
#define BEQCTR() BEQCTRi(0)
|
||||
#define BGECTR() BGECTRi(0)
|
||||
#define BGTCTR() BGTCTRi(0)
|
||||
#define BNLCTR() BNLCTRi(0)
|
||||
#define BNECTR() BNECTRi(0)
|
||||
#define BNGCTR() BNGCTRi(0)
|
||||
#define BSOCTR() BSOCTRi(0)
|
||||
#define BNSCTR() BNSCTRi(0)
|
||||
#define BUNCTR() BUNCTRi(0)
|
||||
#define BNUCTR() BNUCTRi(0)
|
||||
|
||||
#define BLTCTRL() BLTCTRLi(0)
|
||||
#define BLECTRL() BLECTRLi(0)
|
||||
#define BEQCTRL() BEQCTRLi(0)
|
||||
#define BGECTRL() BGECTRLi(0)
|
||||
#define BGTCTRL() BGTCTRLi(0)
|
||||
#define BNLCTRL() BNLCTRLi(0)
|
||||
#define BNECTRL() BNECTRLi(0)
|
||||
#define BNGCTRL() BNGCTRLi(0)
|
||||
#define BSOCTRL() BSOCTRLi(0)
|
||||
#define BNSCTRL() BNSCTRLi(0)
|
||||
#define BUNCTRL() BUNCTRLi(0)
|
||||
#define BNUCTRL() BNUCTRLi(0)
|
||||
|
||||
|
||||
#define BLTii(C,D) BC_EXT(12, ((C)<<2)+0, D) /* [1, Table F-11] */
|
||||
#define BNLii(C,D) BC_EXT( 4, ((C)<<2)+0, D)
|
||||
#define BGEii(C,D) BC_EXT( 4, ((C)<<2)+0, D)
|
||||
#define BGTii(C,D) BC_EXT(12, ((C)<<2)+1, D)
|
||||
#define BNGii(C,D) BC_EXT( 4, ((C)<<2)+1, D)
|
||||
#define BLEii(C,D) BC_EXT( 4, ((C)<<2)+1, D)
|
||||
#define BEQii(C,D) BC_EXT(12, ((C)<<2)+2, D)
|
||||
#define BNEii(C,D) BC_EXT( 4, ((C)<<2)+2, D)
|
||||
#define BSOii(C,D) BC_EXT(12, ((C)<<2)+3, D)
|
||||
#define BNSii(C,D) BC_EXT( 4, ((C)<<2)+3, D)
|
||||
#define BUNii(C,D) BC_EXT(12, ((C)<<2)+3, D)
|
||||
#define BNUii(C,D) BC_EXT( 4, ((C)<<2)+3, D)
|
||||
|
||||
#define BLTi(D) BLTii(0,D) /* with implicit _cr0 */
|
||||
#define BLEi(D) BLEii(0,D)
|
||||
#define BEQi(D) BEQii(0,D)
|
||||
#define BGEi(D) BGEii(0,D)
|
||||
#define BGTi(D) BGTii(0,D)
|
||||
#define BNLi(D) BNLii(0,D)
|
||||
#define BNEi(D) BNEii(0,D)
|
||||
#define BNGi(D) BNGii(0,D)
|
||||
#define BSOi(D) BSOii(0,D)
|
||||
#define BNSi(D) BNSii(0,D)
|
||||
#define BUNi(D) BUNii(0,D)
|
||||
#define BNUi(D) BNUii(0,D)
|
||||
|
||||
#define BLTLii(C,D) BCLiii(12, ((C)<<2)+0, D) /* [1, Table F-??] */
|
||||
#define BLELii(C,D) BCLiii( 4, ((C)<<2)+1, D)
|
||||
#define BEQLii(C,D) BCLiii(12, ((C)<<2)+2, D)
|
||||
#define BGELii(C,D) BCLiii( 4, ((C)<<2)+0, D)
|
||||
#define BGTLii(C,D) BCLiii(12, ((C)<<2)+1, D)
|
||||
#define BNLLii(C,D) BCLiii( 4, ((C)<<2)+0, D)
|
||||
#define BNELii(C,D) BCLiii( 4, ((C)<<2)+2, D)
|
||||
#define BNGLii(C,D) BCLiii( 4, ((C)<<2)+1, D)
|
||||
#define BSOLii(C,D) BCLiii(12, ((C)<<2)+3, D)
|
||||
#define BNSLii(C,D) BCLiii( 4, ((C)<<2)+3, D)
|
||||
#define BUNLii(C,D) BCLiii(12, ((C)<<2)+3, D)
|
||||
#define BNULii(C,D) BCLiii( 4, ((C)<<2)+3, D)
|
||||
|
||||
#define BLTLi(D) BLTLii(0,D) /* with implicit _cr0 */
|
||||
#define BLELi(D) BLELii(0,D)
|
||||
#define BEQLi(D) BEQLii(0,D)
|
||||
#define BGELi(D) BGELii(0,D)
|
||||
#define BGTLi(D) BGTLii(0,D)
|
||||
#define BNLLi(D) BNLLii(0,D)
|
||||
#define BNELi(D) BNELii(0,D)
|
||||
#define BNGLi(D) BNGLii(0,D)
|
||||
#define BSOLi(D) BSOLii(0,D)
|
||||
#define BNSLi(D) BNSLii(0,D)
|
||||
#define BUNLi(D) BUNLii(0,D)
|
||||
#define BNULi(D) BNULii(0,D)
|
||||
|
||||
/* Note: there are many tens of other simplified branches that are not (yet?) defined here */
|
||||
|
||||
#define CRSETi(BX) CREQViii(BX, BX, BX) /* [1, Table F-15] */
|
||||
#define CRCLRi(BX) CRXORiii(BX, BX, BX)
|
||||
#define CRMOVEii(BX,BY) CRORiii(BX, BY, BY)
|
||||
#define CRNOTii(BX,BY) CRNORiii(BX, BY, BY)
|
||||
|
||||
#define MTLRr(RS) MTSPRir(8, RS) /* [1, Table F-20] */
|
||||
#define MFLRr(RD) MFSPRri(RD, 8)
|
||||
#define MTCTRr(RS) MTSPRir(9, RS)
|
||||
#define MFCTRr(RD) MFSPRri(RD, 9)
|
||||
#define MTXERr(RS) MTSPRir(1, RS)
|
||||
#define MFXERr(RD) MFSPRri(RD, 1)
|
||||
|
||||
#define NOP() ORIrri(0, 0, 0) /* [1, Section F.9] */
|
||||
#define LIri(RD,IM) ADDIrri(RD, 0, IM)
|
||||
#define LISri(RD,IM) ADDISrri(RD, 0, IM)
|
||||
#define LArm(RD,D,RA) ADDIrri(RD, RA, D)
|
||||
#define LArrr(RD,RB,RA) ADDIrrr(RD, RA, RB)
|
||||
#define MRrr(RA,RS) ORrrr(RA, RS, RS)
|
||||
#define NOTrr(RA,RS) NORrrr(RA, RS, RS)
|
||||
|
||||
/* alternative parenthesised forms of extended indexed load/store insns */
|
||||
|
||||
#define LBZUrx(RD,RA,RB) LBZUXrrr(RD,RA,RB)
|
||||
#define LBZrx(RD,RA,RB) LBZXrrr(RD,RA,RB)
|
||||
#define LHAUrx(RD,RA,RB) LHAUXrrr(RD,RA,RB)
|
||||
#define LHArx(RD,RA,RB) LHAXrrr(RD,RA,RB)
|
||||
#define LHBRrx(RD,RA,RB) LHBRXrrr(RD,RA,RB)
|
||||
#define LHZUrx(RD,RA,RB) LHZUXrrr(RD,RA,RB)
|
||||
#define LHZrx(RD,RA,RB) LHZXrrr(RD,RA,RB)
|
||||
#define LWBRrx(RD,RA,RB) LWBRXrrr(RD,RA,RB)
|
||||
#define LWZUrx(RD, RA, RB) LWZUXrrr(RD, RA, RB)
|
||||
#define LWZrx(RD, RA, RB) LWZXrrr(RD, RA, RB)
|
||||
#define STBUrx(RD,RA,RB) STBUXrrr(RD,RA,RB)
|
||||
#define STBrx(RD,RA,RB) STBXrrr(RD,RA,RB)
|
||||
#define STHBRrx(RS,RA,RB) STHBRXrrr(RS,RA,RB)
|
||||
#define STHUrx(RS,RA,RB) STHUXrrr(RS,RA,RB)
|
||||
#define STHrx(RS,RA,RB) STHXrrr(RS,RA,RB)
|
||||
#define STWBRrx(RS,RA,RB) STWBRXrrr(RS,RA,RB)
|
||||
#define STWCrx(RS,RA,RB) STWCXrrr(RS,RA,RB)
|
||||
#define STWCX_rx(RS,RA,RB) STWCX_rrr(RS,RA,RB)
|
||||
#define STWUrx(RS,RA,RB) STWUXrrr(RS,RA,RB)
|
||||
#define STWrx(RS,RA,RB) STWXrrr(RS,RA,RB)
|
||||
#define LArx(RD,RB,RA) LArrr(RD,RB,RA)
|
||||
|
||||
|
||||
#define _LO(I) (_jit_UL(I) & _MASK(16))
|
||||
#define _HI(I) (_jit_UL(I) >> (16))
|
||||
|
||||
#define _A(OP,RD,RA,RB,RC,XO,RCx) _jit_I((_u6(OP)<<26)|(_u5(RD)<<21)|(_u5(RA)<<16)|( _u5(RB)<<11)|_u5(RC)<<6|(_u5(XO)<<1)|_u1(RCx))
|
||||
|
||||
#define LFDrri(RD,RA,imm) _D(50,RD,RA,imm)
|
||||
#define LFDUrri(RD,RA,imm) _D(51,RD,RA,imm)
|
||||
#define LFDUxrrr(RD,RA,RB) _X(31,RD,RA,RB,631,0)
|
||||
#define LFDxrrr(RD,RA,RB) _X(31,RD,RA,RB,599,0)
|
||||
|
||||
#define LFSrri(RD,RA,imm) _D(48,RD,RA,imm)
|
||||
#define LFSUrri(RD,RA,imm) _D(49,RD,RA,imm)
|
||||
#define LFSUxrrr(RD,RA,RB) _X(31,RD,RA,RB,567,0)
|
||||
#define LFSxrrr(RD,RA,RB) _X(31,RD,RA,RB,535,0)
|
||||
|
||||
#define STFDrri(RS,RA,imm) _D(54,RS,RA,imm)
|
||||
#define STFDUrri(RS,RA,imm) _D(55,RS,RA,imm)
|
||||
#define STFDUxrrr(RS,RA,RB) _X(31,RS,RA,RB,759,0)
|
||||
#define STFDxrrr(RS,RA,RB) _X(31,RS,RA,RB,727,0)
|
||||
|
||||
#define STFSrri(RS,RA,imm) _D(52,RS,RA,imm)
|
||||
#define STFSUrri(RS,RA,imm) _D(53,RS,RA,imm)
|
||||
#define STFSUxrrr(RS,RA,RB) _X(31,RS,RA,RB,695,0)
|
||||
#define STFSxrrr(RS,RA,RB) _X(31,RS,RA,RB,663,0)
|
||||
#define STFIWXrrr(RS,RA,RB) _X(31,RS,RA,RB,983,0)
|
||||
|
||||
#define FADDDrrr(RD,RA,RB) _A(63,RD,RA,RB,0,21,0)
|
||||
#define FADDSrrr(RD,RA,RB) _A(59,RD,RA,RB,0,21,0)
|
||||
#define FSUBDrrr(RD,RA,RB) _A(63,RD,RA,RB,0,20,0)
|
||||
#define FSUBSrrr(RD,RA,RB) _A(59,RD,RA,RB,0,20,0)
|
||||
#define FMULDrrr(RD,RA,RC) _A(63,RD,RA,0,RC,25,0)
|
||||
#define FMULSrrr(RD,RA,RC) _A(59,RD,RA,0,RC,25,0)
|
||||
#define FDIVDrrr(RD,RA,RB) _A(63,RD,RA,RB,0,18,0)
|
||||
#define FDIVSrrr(RD,RA,RB) _A(59,RD,RA,RB,0,25,0)
|
||||
#define FSQRTDrr(RD,RB) _A(63,RD,0,RB,0,22,0)
|
||||
#define FSQRTSrr(RD,RB) _A(59,RD,0,RB,0,22,0)
|
||||
#define FSELrrrr(RD,RA,RB,RC) _A(63,RD,RA,RB,RC,23,0)
|
||||
#define FCTIWrr(RD,RB) _X(63,RD,0,RB,14,0)
|
||||
#define FCTIWZrr(RD,RB) _X(63,RD,0,RB,15,0)
|
||||
#define FRSPrr(RD,RB) _X(63,RD,0,RB,12,0)
|
||||
#define FABSrr(RD,RB) _X(63,RD,0,RB,264,0)
|
||||
#define FNABSrr(RD,RB) _X(63,RD,0,RB,136,0)
|
||||
#define FNEGrr(RD,RB) _X(63,RD,0,RB,40,0)
|
||||
#define FMOVErr(RD,RB) _X(63,RD,0,RB,72,0)
|
||||
#define FCMPOrrr(CR,RA,RB) _X(63,_u3((CR)<<2),RA,RB,32,0)
|
||||
#define FCMPUrrr(CR,RA,RB) _X(63,_u3((CR)<<2),RA,RB,0,0)
|
||||
#define MTFSFIri(CR,IMM) _X(63,_u5((CR)<<2),0,_u5((IMM)<<1),134,0)
|
||||
|
||||
/*** References:
|
||||
*
|
||||
* [1] "PowerPC Microprocessor Family: The Programming Environments For 32-Bit Microprocessors", Motorola, 1997.
|
||||
*/
|
||||
|
||||
|
||||
#endif
|
||||
#endif /* __ccg_asm_ppc_h */
|
||||
298
src/runtime/c/pgf/lightning/ppc/core.h
Normal file
298
src/runtime/c/pgf/lightning/ppc/core.h
Normal file
@@ -0,0 +1,298 @@
|
||||
/******************************** -*- C -*- ****************************
|
||||
*
|
||||
* Platform-independent layer (PowerPC version)
|
||||
*
|
||||
***********************************************************************/
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* Copyright 2000, 2001, 2002 Free Software Foundation, Inc.
|
||||
* Written by Paolo Bonzini.
|
||||
*
|
||||
* This file is part of GNU lightning.
|
||||
*
|
||||
* GNU lightning is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* GNU lightning 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 Lesser General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with GNU lightning; see the file COPYING.LESSER; if not, write to the
|
||||
* Free Software Foundation, 59 Temple Place - Suite 330, Boston,
|
||||
* MA 02111-1307, USA.
|
||||
*
|
||||
***********************************************************************/
|
||||
|
||||
|
||||
|
||||
|
||||
#ifndef __lightning_core_h
|
||||
#define __lightning_core_h
|
||||
|
||||
struct jit_local_state {
|
||||
int nextarg_puti; /* number of integer args */
|
||||
int nextarg_putf; /* number of float args */
|
||||
int nextarg_putd; /* number of double args */
|
||||
int nextarg_geti; /* Next r20-r25 reg. to be read */
|
||||
int nextarg_getd; /* The FP args are picked up from FPR1 -> FPR10 */
|
||||
int nbArgs; /* Number of arguments for the prolog */
|
||||
};
|
||||
|
||||
#define JIT_SP 1
|
||||
#define JIT_RET 3
|
||||
#define JIT_R_NUM 3
|
||||
#define JIT_V_NUM 7
|
||||
#define JIT_R(i) (9+(i))
|
||||
#define JIT_V(i) (31-(i))
|
||||
#define JIT_AUX JIT_V(JIT_V_NUM) /* for 32-bit operands & shift counts */
|
||||
|
||||
#define jit_pfx_start() (_jit.jitl.trampolines)
|
||||
#define jit_pfx_end() (_jit.jitl.free)
|
||||
|
||||
/* If possible, use the `small' instruction (rd, rs, imm)
|
||||
* else load imm into r26 and use the `big' instruction (rd, rs, r26)
|
||||
*/
|
||||
#define jit_chk_ims(imm, small, big) (_siP(16,(imm)) ? (small) : (MOVEIri(JIT_AUX, imm), (big)) )
|
||||
#define jit_chk_imu(imm, small, big) (_uiP(16,(imm)) ? (small) : (MOVEIri(JIT_AUX, imm), (big)) )
|
||||
#define jit_chk_imu15(imm, small, big) (_uiP(15,(imm)) ? (small) : (MOVEIri(JIT_AUX, imm), (big)) )
|
||||
|
||||
#define jit_big_ims(imm, big) (MOVEIri(JIT_AUX, imm), (big))
|
||||
#define jit_big_imu(imm, big) (MOVEIri(JIT_AUX, imm), (big))
|
||||
|
||||
/* Helper macros for branches */
|
||||
#define jit_s_brai(rs, is, jmp) (jit_chk_ims (is, CMPWIri(rs, is), CMPWrr(rs, JIT_AUX)), jmp, _jit.x.pc)
|
||||
#define jit_s_brar(s1, s2, jmp) ( CMPWrr(s1, s2), jmp, _jit.x.pc)
|
||||
#define jit_u_brai(rs, is, jmp) (jit_chk_imu (is, CMPLWIri(rs, is), CMPLWrr(rs, JIT_AUX)), jmp, _jit.x.pc)
|
||||
#define jit_u_brar(s1, s2, jmp) ( CMPLWrr(s1, s2), jmp, _jit.x.pc)
|
||||
|
||||
/* Helper macros for boolean tests. */
|
||||
#define jit_sbooli(d, rs, is, jmp) (jit_chk_ims (is, CMPWIri (rs, is), CMPWrr(rs, JIT_AUX)), MFCRr((d)), EXTRWIrrii((d), (d), 1, (jmp)))
|
||||
#define jit_sboolr(d, s1, s2, jmp) ( CMPWrr (s1, s2), MFCRr((d)), EXTRWIrrii((d), (d), 1, (jmp)))
|
||||
#define jit_sbooli2(d, rs, is, jmp) (jit_chk_ims (is, CMPWIri (rs, is), CMPWrr(rs, JIT_AUX)), MFCRr((d)), EXTRWIrrii((d), (d), 1, (jmp)), XORIrri((d), (d), 1))
|
||||
#define jit_sboolr2(d, s1, s2, jmp) ( CMPWrr (s1, s2), MFCRr((d)), EXTRWIrrii((d), (d), 1, (jmp)), XORIrri((d), (d), 1))
|
||||
#define jit_ubooli(d, rs, is, jmp) (jit_chk_imu (is, CMPLWIri(rs, is), CMPLWrr(rs, JIT_AUX)), MFCRr((d)), EXTRWIrrii((d), (d), 1, (jmp)))
|
||||
#define jit_uboolr(d, s1, s2, jmp) ( CMPLWrr (s1, s2), MFCRr((d)), EXTRWIrrii((d), (d), 1, (jmp)))
|
||||
#define jit_ubooli2(d, rs, is, jmp) (jit_chk_imu (is, CMPLWIri(rs, is), CMPLWrr(rs, JIT_AUX)), MFCRr((d)), EXTRWIrrii((d), (d), 1, (jmp)), XORIrri((d), (d), 1))
|
||||
#define jit_uboolr2(d, s1, s2, jmp) ( CMPLWrr (s1, s2), MFCRr((d)), EXTRWIrrii((d), (d), 1, (jmp)), XORIrri((d), (d), 1))
|
||||
|
||||
/* modulus with immediate
|
||||
* movei r26, imm
|
||||
* mtlr r31
|
||||
* divw r31, rs, r26 (or divwu)
|
||||
* mullw r31, r31, r26
|
||||
* sub rs, rs, r26
|
||||
* mflr r31
|
||||
*/
|
||||
|
||||
#define _jit_mod(div, rs, imm) (MOVEIri(JIT_AUX, (imm)), MTLRr(31), (div), \
|
||||
MULLWrrr(31, 31, JIT_AUX), SUBrrr((rs), (rs), JIT_AUX), \
|
||||
MFLRr(31))
|
||||
|
||||
/* Patch a movei instruction made of a LIS at lis_pc and an ORI at ori_pc. */
|
||||
#define jit_patch_movei(lis_pc, ori_pc, dest) \
|
||||
(*(lis_pc) &= ~_MASK(16), *(lis_pc) |= _HI(dest), \
|
||||
*(ori_pc) &= ~_MASK(16), *(ori_pc) |= _LO(dest)) \
|
||||
|
||||
/* Patch a branch instruction */
|
||||
#define jit_patch_branch(jump_pc,pv) \
|
||||
(*(jump_pc) &= ~_MASK(16) | 3, \
|
||||
*(jump_pc) |= (_jit_UL(pv) - _jit_UL(jump_pc)) & _MASK(16))
|
||||
|
||||
#define jit_patch_ucbranch(jump_pc,pv) \
|
||||
(*(jump_pc) &= ~_MASK(26) | 3, \
|
||||
(*(jump_pc) |= (_jit_UL((pv)) - _jit_UL(jump_pc)) & _MASK(26)))
|
||||
|
||||
#define _jit_b_encoding (18 << 26)
|
||||
#define _jit_blr_encoding ((19 << 26) | (20 << 21) | (00 << 16) | (00 << 11) | (16 << 1))
|
||||
#define _jit_is_ucbranch(a) (((*(a) & (63<<26)) == _jit_b_encoding))
|
||||
|
||||
#define jit_patch_at(jump_pc, value) ( \
|
||||
((*(jump_pc - 1) & ~1) == _jit_blr_encoding) \
|
||||
? jit_patch_movei(((jump_pc) - 4), ((jump_pc) - 3), (value)) \
|
||||
: ( _jit_is_ucbranch((jump_pc) - 1) \
|
||||
? jit_patch_ucbranch((jump_pc) - 1, (value)) \
|
||||
: jit_patch_branch((jump_pc) - 1, (value))))
|
||||
|
||||
#define jit_patch_movi(movi_pc, val) \
|
||||
jit_patch_movei((movi_pc) - 2, (movi_pc) - 1, (val))
|
||||
|
||||
#define jit_arg_c() (_jitl.nextarg_geti--)
|
||||
#define jit_arg_i() (_jitl.nextarg_geti--)
|
||||
#define jit_arg_l() (_jitl.nextarg_geti--)
|
||||
#define jit_arg_p() (_jitl.nextarg_geti--)
|
||||
#define jit_arg_s() (_jitl.nextarg_geti--)
|
||||
#define jit_arg_uc() (_jitl.nextarg_geti--)
|
||||
#define jit_arg_ui() (_jitl.nextarg_geti--)
|
||||
#define jit_arg_ul() (_jitl.nextarg_geti--)
|
||||
#define jit_arg_us() (_jitl.nextarg_geti--)
|
||||
|
||||
/* Check Mach-O-Runtime documentation: Must skip GPR(s) whenever "corresponding" FPR is used */
|
||||
#define jit_arg_f() (_jitl.nextarg_geti-- ,_jitl.nextarg_getd++)
|
||||
#define jit_arg_d() (_jitl.nextarg_geti-=2,_jitl.nextarg_getd++)
|
||||
|
||||
#define jit_addi_i(d, rs, is) jit_chk_ims((is), ADDICrri((d), (rs), (is)), ADDrrr((d), (rs), JIT_AUX))
|
||||
#define jit_addr_i(d, s1, s2) ADDrrr((d), (s1), (s2))
|
||||
#define jit_addci_i(d, rs, is) jit_chk_ims((is), ADDICrri((d), (rs), (is)), ADDCrrr((d), (rs), JIT_AUX))
|
||||
#define jit_addcr_i(d, s1, s2) ADDCrrr((d), (s1), (s2))
|
||||
#define jit_addxi_i(d, rs, is) (MOVEIri(JIT_AUX, (is)), ADDErrr((d), (rs), JIT_AUX))
|
||||
#define jit_addxr_i(d, s1, s2) ADDErrr((d), (s1), (s2))
|
||||
#define jit_andi_i(d, rs, is) jit_chk_imu((is), ANDI_rri((d), (rs), (is)), ANDrrr((d), (rs), JIT_AUX))
|
||||
#define jit_andr_i(d, s1, s2) ANDrrr((d), (s1), (s2))
|
||||
#define jit_bmsi_i(label, rs, is) (jit_chk_imu((is), ANDI_rri(JIT_AUX, (rs), (is)), AND_rrr(JIT_AUX, (rs), JIT_AUX)), BGTi((label)), _jit.x.pc)
|
||||
#define jit_bmci_i(label, rs, is) (jit_chk_imu((is), ANDI_rri(JIT_AUX, (rs), (is)), AND_rrr(JIT_AUX, (rs), JIT_AUX)), BEQi((label)), _jit.x.pc)
|
||||
#define jit_bmsr_i(label, s1, s2) ( AND_rrr(JIT_AUX, (s1), (s2)), BGTi((label)), _jit.x.pc)
|
||||
#define jit_bmcr_i(label, s1, s2) ( AND_rrr(JIT_AUX, (s1), (s2)), BEQi((label)), _jit.x.pc)
|
||||
#define jit_beqi_i(label, rs, is) jit_s_brai((rs), (is), BEQi((label)) )
|
||||
#define jit_beqr_i(label, s1, s2) jit_s_brar((s1), (s2), BEQi((label)) )
|
||||
#define jit_bgei_i(label, rs, is) jit_s_brai((rs), (is), BGEi((label)) )
|
||||
#define jit_bgei_ui(label, rs, is) jit_u_brai((rs), (is), BGEi((label)) )
|
||||
#define jit_bger_i(label, s1, s2) jit_s_brar((s1), (s2), BGEi((label)) )
|
||||
#define jit_bger_ui(label, s1, s2) jit_u_brar((s1), (s2), BGEi((label)) )
|
||||
#define jit_bgti_i(label, rs, is) jit_s_brai((rs), (is), BGTi((label)) )
|
||||
#define jit_bgti_ui(label, rs, is) jit_u_brai((rs), (is), BGTi((label)) )
|
||||
#define jit_bgtr_i(label, s1, s2) jit_s_brar((s1), (s2), BGTi((label)) )
|
||||
#define jit_bgtr_ui(label, s1, s2) jit_u_brar((s1), (s2), BGTi((label)) )
|
||||
#define jit_blei_i(label, rs, is) jit_s_brai((rs), (is), BLEi((label)) )
|
||||
#define jit_blei_ui(label, rs, is) jit_u_brai((rs), (is), BLEi((label)) )
|
||||
#define jit_bler_i(label, s1, s2) jit_s_brar((s1), (s2), BLEi((label)) )
|
||||
#define jit_bler_ui(label, s1, s2) jit_u_brar((s1), (s2), BLEi((label)) )
|
||||
#define jit_blti_i(label, rs, is) jit_s_brai((rs), (is), BLTi((label)) )
|
||||
#define jit_blti_ui(label, rs, is) jit_u_brai((rs), (is), BLTi((label)) )
|
||||
#define jit_bltr_i(label, s1, s2) jit_s_brar((s1), (s2), BLTi((label)) )
|
||||
#define jit_bltr_ui(label, s1, s2) jit_u_brar((s1), (s2), BLTi((label)) )
|
||||
#define jit_bnei_i(label, rs, is) jit_s_brai((rs), (is), BNEi((label)) )
|
||||
#define jit_bner_i(label, s1, s2) jit_s_brar((s1), (s2), BNEi((label)) )
|
||||
#define jit_boaddi_i(label, rs, is) (MOVEIri(JIT_AUX, (is)), ADDOrrr((rs), (rs), JIT_AUX), MCRXRi(0), BGTi((label)), _jit.x.pc) /* GT = bit 1 of XER = OV */
|
||||
#define jit_bosubi_i(label, rs, is) (MOVEIri(JIT_AUX, (is)), SUBCOrrr((rs), (rs), JIT_AUX), MCRXRi(0), BGTi((label)), _jit.x.pc)
|
||||
#define jit_boaddr_i(label, s1, s2) ( ADDOrrr((s1), (s1), (s2)), MCRXRi(0), BGTi((label)), _jit.x.pc)
|
||||
#define jit_bosubr_i(label, s1, s2) ( SUBCOrrr((s1), (s1), (s2)), MCRXRi(0), BGTi((label)), _jit.x.pc)
|
||||
#define jit_boaddi_ui(label, rs, is) (jit_chk_ims ((is), ADDICri((rs), (rs), is), ADDCrr((rs), JIT_AUX)), MCRXRi(0), BEQi((label)), _jit.x.pc) /* EQ = bit 2 of XER = CA */
|
||||
#define jit_bosubi_ui(label, rs, is) (jit_chk_ims ((is), SUBICri((rs), (rs), is), SUBCrr((rs), JIT_AUX)), MCRXRi(0), BEQi((label)), _jit.x.pc)
|
||||
#define jit_boaddr_ui(label, s1, s2) ( ADDCrr((s1), (s1), (s2)), MCRXRi(0), BEQi((label)), _jit.x.pc)
|
||||
#define jit_bosubr_ui(label, s1, s2) ( SUBCrr((s1), (s1), (s2)), MCRXRi(0), BEQi((label)), _jit.x.pc)
|
||||
#define jit_calli(label) (jit_movi_p(JIT_AUX, (label)), MTCTRr(JIT_AUX), BCTRL(), _jitl.nextarg_puti = _jitl.nextarg_putf = _jitl.nextarg_putd = 0, _jit.x.pc)
|
||||
#define jit_callr(reg) (MTCTRr(reg), BCTRL())
|
||||
#define jit_divi_i(d, rs, is) jit_big_ims((is), DIVWrrr ((d), (rs), JIT_AUX))
|
||||
#define jit_divi_ui(d, rs, is) jit_big_imu((is), DIVWUrrr((d), (rs), JIT_AUX))
|
||||
#define jit_divr_i(d, s1, s2) DIVWrrr ((d), (s1), (s2))
|
||||
#define jit_divr_ui(d, s1, s2) DIVWUrrr((d), (s1), (s2))
|
||||
#define jit_eqi_i(d, rs, is) (jit_chk_ims((is), SUBIrri(JIT_AUX, (rs), (is)), SUBrrr(JIT_AUX, (rs), JIT_AUX)), SUBFICrri((d), JIT_AUX, 0), ADDErrr((d), (d), JIT_AUX))
|
||||
#define jit_eqr_i(d, s1, s2) (SUBrrr(JIT_AUX, (s1), (s2)), SUBFICrri((d), JIT_AUX, 0), ADDErrr((d), (d), JIT_AUX))
|
||||
#define jit_extr_c_i(d, rs) EXTSBrr((d), (rs))
|
||||
#define jit_extr_s_i(d, rs) EXTSHrr((d), (rs))
|
||||
#define jit_gei_i(d, rs, is) jit_sbooli2((d), (rs), (is), _lt)
|
||||
#define jit_gei_ui(d, rs, is) jit_ubooli2((d), (rs), (is), _lt)
|
||||
#define jit_ger_i(d, s1, s2) jit_sboolr2((d), (s1), (s2), _lt)
|
||||
#define jit_ger_ui(d, s1, s2) jit_uboolr2((d), (s1), (s2), _lt)
|
||||
#define jit_gti_i(d, rs, is) jit_sbooli ((d), (rs), (is), _gt)
|
||||
#define jit_gti_ui(d, rs, is) jit_ubooli ((d), (rs), (is), _gt)
|
||||
#define jit_gtr_i(d, s1, s2) jit_sboolr ((d), (s1), (s2), _gt)
|
||||
#define jit_gtr_ui(d, s1, s2) jit_uboolr ((d), (s1), (s2), _gt)
|
||||
#define jit_hmuli_i(d, rs, is) jit_big_ims((is), MULHWrrr ((d), (rs), JIT_AUX))
|
||||
#define jit_hmuli_ui(d, rs, is) jit_big_imu((is), MULHWUrrr((d), (rs), JIT_AUX))
|
||||
#define jit_hmulr_i(d, s1, s2) MULHWrrr ((d), (s1), (s2))
|
||||
#define jit_hmulr_ui(d, s1, s2) MULHWUrrr((d), (s1), (s2))
|
||||
#define jit_jmpi(label) (B_EXT((label)), _jit.x.pc)
|
||||
#define jit_jmpr(reg) (MTLRr(reg), BLR())
|
||||
#define jit_ldxi_c(d, rs, is) (jit_ldxi_uc((d), (rs), (is)), jit_extr_c_i((d), (d)))
|
||||
#define jit_ldxr_c(d, s1, s2) (jit_ldxr_uc((d), (s1), (s2)), jit_extr_c_i((d), (d)))
|
||||
#define jit_ldxi_i(d, rs, is) jit_chk_ims((d), LWZrm((d), (is), (rs)), LWZrx((d), JIT_AUX, (rs)))
|
||||
#define jit_ldxi_s(d, rs, is) jit_chk_ims((d), LHArm((d), (is), (rs)), LHArx((d), JIT_AUX, (rs)))
|
||||
#define jit_ldxi_uc(d, rs, is) jit_chk_ims((d), LBZrm((d), (is), (rs)), LBZrx((d), JIT_AUX, (rs)))
|
||||
#define jit_ldxi_us(d, rs, is) jit_chk_ims((d), LHZrm((d), (is), (rs)), LHZrx((d), JIT_AUX, (rs)))
|
||||
#define jit_ldxr_i(d, s1, s2) LWZrx((d), (s1), (s2))
|
||||
#define jit_ldxr_s(d, s1, s2) LHArx((d), (s1), (s2))
|
||||
#define jit_ldxr_uc(d, s1, s2) LBZrx((d), (s1), (s2))
|
||||
#define jit_ldxr_us(d, s1, s2) LHZrx((d), (s1), (s2))
|
||||
#define jit_lei_i(d, rs, is) jit_sbooli2((d), (rs), (is), _gt )
|
||||
#define jit_lei_ui(d, rs, is) jit_ubooli2((d), (rs), (is), _gt )
|
||||
#define jit_ler_i(d, s1, s2) jit_sboolr2((d), (s1), (s2), _gt )
|
||||
#define jit_ler_ui(d, s1, s2) jit_uboolr2((d), (s1), (s2), _gt )
|
||||
#define jit_lshi_i(d, rs, is) SLWIrri((d), (rs), (is))
|
||||
#define jit_lshr_i(d, s1, s2) (ANDI_rri(JIT_AUX, (s2), 31), SLWrrr ((d), (s1), JIT_AUX))
|
||||
#define jit_lti_i(d, rs, is) jit_sbooli ((d), (rs), (is), _lt )
|
||||
#define jit_lti_ui(d, rs, is) jit_ubooli ((d), (rs), (is), _lt )
|
||||
#define jit_ltr_i(d, s1, s2) jit_sboolr ((d), (s1), (s2), _lt )
|
||||
#define jit_ltr_ui(d, s1, s2) jit_uboolr ((d), (s1), (s2), _lt )
|
||||
#define jit_modi_i(d, rs, is) _jit_mod(jit_divi_i (31, (rs), JIT_AUX), (rs), (is))
|
||||
#define jit_modi_ui(d, rs, is) _jit_mod(jit_divi_ui(31, (rs), JIT_AUX), (rs), (is))
|
||||
#define jit_modr_i(d, s1, s2) (DIVWrrr(JIT_AUX, (s1), (s2)), MULLWrrr(JIT_AUX, JIT_AUX, (s2)), SUBrrr((d), (s1), JIT_AUX))
|
||||
#define jit_modr_ui(d, s1, s2) (DIVWUrrr(JIT_AUX, (s1), (s2)), MULLWrrr(JIT_AUX, JIT_AUX, (s2)), SUBrrr((d), (s1), JIT_AUX))
|
||||
#define jit_movi_i(d, is) MOVEIri((d), (is))
|
||||
#define jit_movi_p(d, is) (LISri((d), _HI((is))),ORIrri((d),(d),_LO((is))),_jit.x.pc)
|
||||
|
||||
#define jit_movr_i(d, rs) MRrr((d), (rs))
|
||||
#define jit_muli_i(d, rs, is) jit_chk_ims ((is), MULLIrri((d), (rs), (is)), MULLWrrr((d), (rs), JIT_AUX))
|
||||
#define jit_muli_ui(d, rs, is) jit_chk_imu15((is), MULLIrri((d), (rs), (is)), MULLWrrr((d), (rs), JIT_AUX))
|
||||
#define jit_mulr_i(d, s1, s2) MULLWrrr((d), (s1), (s2))
|
||||
#define jit_mulr_ui(d, s1, s2) MULLWrrr((d), (s1), (s2))
|
||||
#define jit_nei_i(d, rs, is) (jit_chk_ims((is), SUBIrri(JIT_AUX, (rs), (is)), SUBrrr(JIT_AUX, (rs), JIT_AUX)), ADDICrri((d), JIT_AUX, -1), SUBFErrr((d), (d), JIT_AUX))
|
||||
#define jit_ner_i(d, s1, s2) (SUBrrr(JIT_AUX, (s1), (s2)), ADDICrri((d), JIT_AUX, -1), SUBFErrr((d), (d), JIT_AUX))
|
||||
#define jit_nop() NOP()
|
||||
#define jit_ori_i(d, rs, is) jit_chk_imu((is), ORIrri((d), (rs), (is)), ORrrr((d), (rs), JIT_AUX))
|
||||
#define jit_orr_i(d, s1, s2) ORrrr((d), (s1), (s2))
|
||||
#define jit_popr_i(rs) (LWZrm((rs), 0, 1), ADDIrri(1, 1, 4))
|
||||
#define jit_prepare_i(numi) (_jitl.nextarg_puti = numi)
|
||||
#define jit_prepare_f(numf) (_jitl.nextarg_putf = numf)
|
||||
#define jit_prepare_d(numd) (_jitl.nextarg_putd = numd)
|
||||
#define jit_prolog(n) _jit_prolog(&_jit, (n))
|
||||
#define jit_pushr_i(rs) STWUrm((rs), -4, 1)
|
||||
#define jit_pusharg_i(rs) (--_jitl.nextarg_puti, MRrr((3 + _jitl.nextarg_putd * 2 + _jitl.nextarg_putf + _jitl.nextarg_puti), (rs)))
|
||||
#define jit_ret() _jit_epilog(&_jit)
|
||||
#define jit_retval_i(rd) MRrr((rd), 3)
|
||||
#define jit_rsbi_i(d, rs, is) jit_chk_ims((is), SUBFICrri((d), (rs), (is)), SUBFCrrr((d), (rs), JIT_AUX))
|
||||
#define jit_rshi_i(d, rs, is) SRAWIrri((d), (rs), (is))
|
||||
#define jit_rshi_ui(d, rs, is) SRWIrri ((d), (rs), (is))
|
||||
#define jit_rshr_i(d, s1, s2) (ANDI_rri(JIT_AUX, (s2), 31), SRAWrrr ((d), (s1), JIT_AUX))
|
||||
#define jit_rshr_ui(d, s1, s2) (ANDI_rri(JIT_AUX, (s2), 31), SRWrrr ((d), (s1), JIT_AUX))
|
||||
#define jit_stxi_c(id, rd, rs) jit_chk_ims((id), STBrm((rs), (id), (rd)), STBrx((rs), (rd), JIT_AUX))
|
||||
#define jit_stxi_i(id, rd, rs) jit_chk_ims((id), STWrm((rs), (id), (rd)), STWrx((rs), (rd), JIT_AUX))
|
||||
#define jit_stxi_s(id, rd, rs) jit_chk_ims((id), STHrm((rs), (id), (rd)), STHrx((rs), (rd), JIT_AUX))
|
||||
#define jit_stxr_c(d1, d2, rs) STBrx((rs), (d1), (d2))
|
||||
#define jit_stxr_i(d1, d2, rs) STWrx((rs), (d1), (d2))
|
||||
#define jit_stxr_s(d1, d2, rs) STHrx((rs), (d1), (d2))
|
||||
#define jit_subr_i(d, s1, s2) SUBrrr((d), (s1), (s2))
|
||||
#define jit_subcr_i(d, s1, s2) SUBCrrr((d), (s1), (s2))
|
||||
#define jit_subxi_i(d, rs, is) jit_big_ims((is), SUBErrr((d), (rs), JIT_AUX))
|
||||
#define jit_subxr_i(d, s1, s2) SUBErrr((d), (s1), (s2))
|
||||
#define jit_xori_i(d, rs, is) jit_chk_imu((is), XORIrri((d), (rs), (is)), XORrrr((d), (rs), JIT_AUX))
|
||||
#define jit_xorr_i(d, s1, s2) XORrrr((d), (s1), (s2))
|
||||
|
||||
/* Cannot use JIT_RZERO because having 0 in a register field on the PowerPC
|
||||
* does not mean `a register whose value is 0', but rather `no register at
|
||||
* all' */
|
||||
|
||||
#define jit_negr_i(d, rs) jit_rsbi_i((d), (rs), 0)
|
||||
#define jit_negr_l(d, rs) jit_rsbi_l((d), (rs), 0)
|
||||
#define jit_ldr_c(rd, rs) jit_ldxr_c((rd), 0, (rs))
|
||||
#define jit_str_c(rd, rs) jit_stxr_c(0, (rd), (rs))
|
||||
#define jit_ldr_s(rd, rs) jit_ldxr_s((rd), 0, (rs))
|
||||
#define jit_str_s(rd, rs) jit_stxr_s(0, (rd), (rs))
|
||||
#define jit_ldr_i(rd, rs) jit_ldxr_i((rd), 0, (rs))
|
||||
#define jit_str_i(rd, rs) jit_stxr_i(0, (rd), (rs))
|
||||
#define jit_ldr_uc(rd, rs) jit_ldxr_uc((rd), 0, (rs))
|
||||
#define jit_ldr_us(rd, rs) jit_ldxr_us((rd), 0, (rs))
|
||||
|
||||
/* e.g.
|
||||
* 0x01234567 _HA << 16 = 0x01230000 _LA = 0x00004567 _HA << 16 + LA = 0x01234567
|
||||
* 0x89abcdef _HA << 16 = 0x89ac0000 _LA = 0xffffcdef _HA << 16 + LA = 0x89abcdef
|
||||
*/
|
||||
#define _HA(addr) ((_jit_UL(addr) >> 16) + (_jit_US(_jit_UL(addr)) >> 15))
|
||||
#define _LA(addr) (_jit_UL(addr) - (_HA(addr) << 16))
|
||||
|
||||
#define jit_ldi_c(rd, is) (LISri(JIT_AUX, _HA(is)), jit_ldxi_c((rd), JIT_AUX, _LA(is)))
|
||||
#define jit_sti_c(id, rs) (LISri(JIT_AUX, _HA(id)), jit_stxi_c(_LA(id), JIT_AUX, (rs)))
|
||||
#define jit_ldi_s(rd, is) (LISri(JIT_AUX, _HA(is)), jit_ldxi_s((rd), JIT_AUX, _LA(is)))
|
||||
#define jit_sti_s(id, rs) (LISri(JIT_AUX, _HA(id)), jit_stxi_s(_LA(id), JIT_AUX, (rs)))
|
||||
#define jit_ldi_i(rd, is) (LISri(JIT_AUX, _HA(is)), jit_ldxi_i((rd), JIT_AUX, _LA(is)))
|
||||
#define jit_sti_i(id, rs) (LISri(JIT_AUX, _HA(id)), jit_stxi_i(_LA(id), JIT_AUX, (rs)))
|
||||
#define jit_ldi_uc(rd, is) (LISri(JIT_AUX, _HA(is)), jit_ldxi_uc((rd), JIT_AUX, _LA(is)))
|
||||
#define jit_ldi_us(rd, is) (LISri(JIT_AUX, _HA(is)), jit_ldxi_us((rd), JIT_AUX, _LA(is)))
|
||||
|
||||
#endif /* __lightning_core_h */
|
||||
211
src/runtime/c/pgf/lightning/ppc/fp.h
Normal file
211
src/runtime/c/pgf/lightning/ppc/fp.h
Normal file
@@ -0,0 +1,211 @@
|
||||
/******************************** -*- C -*- ****************************
|
||||
*
|
||||
* Run-time assembler & support macros for the Sparc math unit
|
||||
*
|
||||
***********************************************************************/
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* Copyright 2000, 2001, 2002 Free Software Foundation, Inc.
|
||||
* Written by Paolo Bonzini.
|
||||
*
|
||||
* This file is part of GNU lightning.
|
||||
*
|
||||
* GNU lightning is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* GNU lightning 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 Lesser General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with GNU lightning; see the file COPYING.LESSER; if not, write to the
|
||||
* Free Software Foundation, 59 Temple Place - Suite 330, Boston,
|
||||
* MA 02111-1307, USA.
|
||||
*
|
||||
***********************************************************************/
|
||||
|
||||
|
||||
|
||||
|
||||
#ifndef __lightning_asm_fp_h
|
||||
#define __lightning_asm_fp_h
|
||||
|
||||
|
||||
#define JIT_FPR_NUM 6
|
||||
#define JIT_FPR(i) (8+(i))
|
||||
|
||||
#define JIT_FPFR 0
|
||||
|
||||
/* Make space for 1 or 2 words, store address in REG */
|
||||
#define jit_data(REG, D1) (_FBA (18, 8, 0, 1), _jit_L(D1), MFLRr(REG))
|
||||
|
||||
#define jit_addr_d(rd,s1,s2) FADDDrrr((rd),(s1),(s2))
|
||||
#define jit_subr_d(rd,s1,s2) FSUBDrrr((rd),(s1),(s2))
|
||||
#define jit_mulr_d(rd,s1,s2) FMULDrrr((rd),(s1),(s2))
|
||||
#define jit_divr_d(rd,s1,s2) FDIVDrrr((rd),(s1),(s2))
|
||||
|
||||
#define jit_addr_f(rd,s1,s2) FADDSrrr((rd),(s1),(s2))
|
||||
#define jit_subr_f(rd,s1,s2) FSUBSrrr((rd),(s1),(s2))
|
||||
#define jit_mulr_f(rd,s1,s2) FMULSrrr((rd),(s1),(s2))
|
||||
#define jit_divr_f(rd,s1,s2) FDIVSrrr((rd),(s1),(s2))
|
||||
|
||||
#define jit_movr_d(rd,rs) ( (rd) == (rs) ? 0 : FMOVErr((rd),(rs)))
|
||||
#define jit_movi_d(reg0,d) do { \
|
||||
double _v = (d); \
|
||||
_FBA (18, 12, 0, 1); \
|
||||
memcpy(_jit.x.uc_pc, &_v, sizeof (double)); \
|
||||
_jit.x.uc_pc += sizeof (double); \
|
||||
MFLRr (JIT_AUX); \
|
||||
jit_ldxi_d((reg0), JIT_AUX, 0); \
|
||||
} while(0)
|
||||
|
||||
|
||||
#define jit_movr_f(rd,rs) ( (rd) == (rs) ? 0 : FMOVErr((rd),(rs)))
|
||||
#define jit_movi_f(reg0,f) do { \
|
||||
float _v = (f); \
|
||||
_FBA (18, 8, 0, 1); \
|
||||
memcpy(_jit.x.uc_pc, &_v, sizeof (float)); \
|
||||
_jit.x.uc_pc += sizeof (float); \
|
||||
MFLRr (JIT_AUX); \
|
||||
jit_ldxi_f((reg0), JIT_AUX, 0); \
|
||||
} while(0)
|
||||
|
||||
|
||||
#define jit_abs_d(rd,rs) FABSrr((rd),(rs))
|
||||
#define jit_negr_d(rd,rs) FNEGrr((rd),(rs))
|
||||
#define jit_sqrt_d(rd,rs) FSQRTDrr((rd),(rs))
|
||||
|
||||
|
||||
#define jit_ldxi_f(reg0, rs, is) (_siP(16,(is)) ? LFSrri((reg0),(rs),(is)) : (MOVEIri(JIT_AUX,(is)),LFSxrrr((reg0),(rs),JIT_AUX)))
|
||||
#define jit_ldxi_d(reg0, rs, is) (_siP(16,(is)) ? LFDrri((reg0),(rs),(is)) : (MOVEIri(JIT_AUX,(is)),LFDxrrr((reg0),(rs),JIT_AUX)))
|
||||
#define jit_ldxr_f(reg0, s1, s2) LFSxrrr((reg0),(s1),(s2))
|
||||
#define jit_ldxr_d(reg0, s1, s2) LFDxrrr((reg0),(s1),(s2))
|
||||
#define jit_ldi_f(reg0, is) (_siP(16,(is)) ? LFSrri((reg0),0,(is)) : (MOVEIri(JIT_AUX,(is)),LFSrri((reg0),JIT_AUX,0)))
|
||||
#define jit_ldi_d(reg0, is) (_siP(16,(is)) ? LFDrri((reg0),0,(is)) : (MOVEIri(JIT_AUX,(is)),LFDrri((reg0),JIT_AUX,0)))
|
||||
#define jit_ldr_f(reg0, rs) LFSrri((reg0),(rs),0)
|
||||
#define jit_ldr_d(reg0, rs) LFDrri((reg0),(rs),0)
|
||||
#define jit_stxi_f(id, rd, reg0) (_siP(16,(id)) ? STFSrri((reg0),(rd),(id)) : (MOVEIri(JIT_AUX,(id)),STFSrri((reg0),(rd),JIT_AUX)))
|
||||
#define jit_stxi_d(id, rd, reg0) (_siP(16,(id)) ? STFDrri((reg0),(rd),(id)) : (MOVEIri(JIT_AUX,(id)),STFDrri((reg0),(rd),JIT_AUX)))
|
||||
#define jit_stxr_f(d1, d2, reg0) STFSxrrr((reg0),(d1),(d2))
|
||||
#define jit_stxr_d(d1, d2, reg0) STFDxrrr((reg0),(d1),(d2))
|
||||
#define jit_sti_f(id, reg0) (_siP(16,(id)) ? STFSrri((reg0),0,(id)) : (MOVEIri(JIT_AUX,(id)),STFSrri((reg0),JIT_AUX,0)))
|
||||
#define jit_sti_d(id, reg0) (_siP(16,(id)) ? STFDrri((reg0),0,(id)) : (MOVEIri(JIT_AUX,(id)),STFDrri((reg0),JIT_AUX,0)))
|
||||
#define jit_str_f(rd, reg0) STFSrri((reg0),(rd),0)
|
||||
#define jit_str_d(rd, reg0) STFDrri((reg0),(rd),0)
|
||||
|
||||
#define jit_fpboolr(d, s1, s2, rcbit) ( \
|
||||
FCMPOrrr(_cr0,(s1),(s2)), \
|
||||
MFCRr((d)), \
|
||||
EXTRWIrrii((d), (d), 1, (rcbit)))
|
||||
|
||||
#define jit_fpboolr_neg(d, s1, s2,rcbit) ( \
|
||||
FCMPOrrr(_cr0,(s1),(s2)), \
|
||||
MFCRr((d)), \
|
||||
EXTRWIrrii((d), (d), 1, (rcbit)), \
|
||||
XORIrri((d), (d), 1))
|
||||
|
||||
#define jit_fpboolur(d, s1, s2, rcbit) ( \
|
||||
FCMPUrrr(_cr0,(s1),(s2)), \
|
||||
MFCRr((d)), \
|
||||
EXTRWIrrii((d), (d), 1, (rcbit)))
|
||||
|
||||
#define jit_fpboolur_neg(d, s1, s2,rcbit) ( \
|
||||
FCMPUrrr(_cr0,(s1),(s2)), \
|
||||
MFCRr((d)), \
|
||||
EXTRWIrrii((d), (d), 1, (rcbit)), \
|
||||
XORIrri((d), (d), 1))
|
||||
|
||||
#define jit_fpboolur_or(d, s1, s2, bit1, bit2) (\
|
||||
FCMPUrrr(_cr0,(s1),(s2)), \
|
||||
CRORiii((bit1), (bit1), (bit2)), \
|
||||
MFCRr((d)), \
|
||||
EXTRWIrrii((d), (d), 1, (bit1)))
|
||||
|
||||
#define jit_gtr_d(d, s1, s2) jit_fpboolr ((d),(s1),(s2),_gt)
|
||||
#define jit_ger_d(d, s1, s2) jit_fpboolr_neg((d),(s1),(s2),_lt)
|
||||
#define jit_ltr_d(d, s1, s2) jit_fpboolr ((d),(s1),(s2),_lt)
|
||||
#define jit_ler_d(d, s1, s2) jit_fpboolr_neg((d),(s1),(s2),_gt)
|
||||
#define jit_eqr_d(d, s1, s2) jit_fpboolr ((d),(s1),(s2),_eq)
|
||||
#define jit_ner_d(d, s1, s2) jit_fpboolr_neg((d),(s1),(s2),_eq)
|
||||
#define jit_unordr_d(d, s1, s2) jit_fpboolur ((d),(s1),(s2),_un)
|
||||
#define jit_ordr_d(d, s1, s2) jit_fpboolur_neg((d),(s1),(s2),_un)
|
||||
#define jit_unler_d(d, s1, s2) jit_fpboolur_neg ((d), (s1), (s2), _gt)
|
||||
#define jit_unltr_d(d, s1, s2) jit_fpboolur_or ((d), (s1), (s2), _un, _lt)
|
||||
#define jit_unger_d(d, s1, s2) jit_fpboolur_neg ((d), (s1), (s2), _lt)
|
||||
#define jit_ungtr_d(d, s1, s2) jit_fpboolur_or ((d), (s1), (s2), _un, _gt)
|
||||
#define jit_ltgtr_d(d, s1, s2) jit_fpboolur_or ((d), (s1), (s2), _gt, _lt)
|
||||
#define jit_uneqr_d(d, s1, s2) jit_fpboolur_or ((d), (s1), (s2), _un, _eq)
|
||||
|
||||
#define jit_fpbr(d, s1, s2, rcbit) ( \
|
||||
FCMPOrrr(_cr0,(s1),(s2)), \
|
||||
BTii ((rcbit), (d)))
|
||||
|
||||
#define jit_fpbr_neg(d, s1, s2,rcbit) ( \
|
||||
FCMPOrrr(_cr0,(s1),(s2)), \
|
||||
BFii ((rcbit), (d)))
|
||||
|
||||
#define jit_fpbur(d, s1, s2, rcbit) ( \
|
||||
FCMPUrrr(_cr0,(s1),(s2)), \
|
||||
BTii ((rcbit), (d)))
|
||||
|
||||
#define jit_fpbur_neg(d, s1, s2,rcbit) ( \
|
||||
FCMPUrrr(_cr0,(s1),(s2)), \
|
||||
BFii ((rcbit), (d)))
|
||||
|
||||
#define jit_fpbur_or(d, s1, s2, bit1, bit2) ( \
|
||||
FCMPUrrr(_cr0,(s1),(s2)), \
|
||||
CRORiii((bit1), (bit1), (bit2)), \
|
||||
BTii ((bit1), (d)))
|
||||
|
||||
#define jit_bgtr_d(d, s1, s2) jit_fpbr ((d),(s1),(s2),_gt)
|
||||
#define jit_bger_d(d, s1, s2) jit_fpbr_neg((d),(s1),(s2),_lt)
|
||||
#define jit_bltr_d(d, s1, s2) jit_fpbr ((d),(s1),(s2),_lt)
|
||||
#define jit_bler_d(d, s1, s2) jit_fpbr_neg((d),(s1),(s2),_gt)
|
||||
#define jit_beqr_d(d, s1, s2) jit_fpbr ((d),(s1),(s2),_eq)
|
||||
#define jit_bner_d(d, s1, s2) jit_fpbr_neg((d),(s1),(s2),_eq)
|
||||
#define jit_bunordr_d(d, s1, s2) jit_fpbur ((d),(s1),(s2),_un)
|
||||
#define jit_bordr_d(d, s1, s2) jit_fpbur_neg((d),(s1),(s2),_un)
|
||||
#define jit_bunler_d(d, s1, s2) jit_fpbur_neg ((d), (s1), (s2), _gt)
|
||||
#define jit_bunltr_d(d, s1, s2) jit_fpbur_or ((d), (s1), (s2), _un, _lt)
|
||||
#define jit_bunger_d(d, s1, s2) jit_fpbur_neg ((d), (s1), (s2), _lt)
|
||||
#define jit_bungtr_d(d, s1, s2) jit_fpbur_or ((d), (s1), (s2), _un, _gt)
|
||||
#define jit_bltgtr_d(d, s1, s2) jit_fpbur_or ((d), (s1), (s2), _gt, _lt)
|
||||
#define jit_buneqr_d(d, s1, s2) jit_fpbur_or ((d), (s1), (s2), _un, _eq)
|
||||
|
||||
#define jit_getarg_f(rd, ofs) jit_movr_f((rd),(ofs))
|
||||
#define jit_getarg_d(rd, ofs) jit_movr_d((rd),(ofs))
|
||||
#define jit_pusharg_d(rs) (_jitl.nextarg_putd--,jit_movr_d((_jitl.nextarg_putf+_jitl.nextarg_putd+1), (rs)))
|
||||
#define jit_pusharg_f(rs) (_jitl.nextarg_putf--,jit_movr_f((_jitl.nextarg_putf+_jitl.nextarg_putd+1), (rs)))
|
||||
#define jit_retval_d(op1) jit_movr_d(1, (op1))
|
||||
#define jit_retval_f(op1) jit_movr_f(1, (op1))
|
||||
|
||||
|
||||
#define jit_floorr_d_i(rd,rs) (MTFSFIri(7,3), \
|
||||
FCTIWrr(7,(rs)), \
|
||||
MOVEIri(JIT_AUX,-4), \
|
||||
STFIWXrrr(7,JIT_SP,JIT_AUX), \
|
||||
LWZrm((rd),-4,JIT_SP))
|
||||
|
||||
#define jit_ceilr_d_i(rd,rs) (MTFSFIri(7,2), \
|
||||
FCTIWrr(7,(rs)), \
|
||||
MOVEIri(JIT_AUX,-4), \
|
||||
STFIWXrrr(7,JIT_SP,JIT_AUX), \
|
||||
LWZrm((rd),-4,JIT_SP))
|
||||
|
||||
#define jit_roundr_d_i(rd,rs) (MTFSFIri(7,0), \
|
||||
FCTIWrr(7,(rs)), \
|
||||
MOVEIri(JIT_AUX,-4), \
|
||||
STFIWXrrr(7,JIT_SP,JIT_AUX), \
|
||||
LWZrm((rd),-4,JIT_SP))
|
||||
|
||||
#define jit_truncr_d_i(rd,rs) (FCTIWZrr(7,(rs)), \
|
||||
MOVEIri(JIT_AUX,-4), \
|
||||
STFIWXrrr(7,JIT_SP,JIT_AUX), \
|
||||
LWZrm((rd),-4,JIT_SP))
|
||||
|
||||
#endif /* __lightning_asm_h */
|
||||
164
src/runtime/c/pgf/lightning/ppc/funcs.h
Normal file
164
src/runtime/c/pgf/lightning/ppc/funcs.h
Normal file
@@ -0,0 +1,164 @@
|
||||
/******************************** -*- C -*- ****************************
|
||||
*
|
||||
* Platform-independent layer inline functions (PowerPC)
|
||||
*
|
||||
***********************************************************************/
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* Copyright 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
|
||||
* Written by Paolo Bonzini.
|
||||
*
|
||||
* This file is part of GNU lightning.
|
||||
*
|
||||
* GNU lightning is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* GNU lightning 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 Lesser General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with GNU lightning; see the file COPYING.LESSER; if not, write to the
|
||||
* Free Software Foundation, 59 Temple Place - Suite 330, Boston,
|
||||
* MA 02111-1307, USA.
|
||||
*
|
||||
***********************************************************************/
|
||||
|
||||
|
||||
|
||||
#ifndef __lightning_funcs_h
|
||||
#define __lightning_funcs_h
|
||||
|
||||
#if !defined(__GNUC__) && !defined(__GNUG__)
|
||||
#error Go get GNU C, I do not know how to flush the cache
|
||||
#error with this compiler.
|
||||
#else
|
||||
static void
|
||||
jit_flush_code(void *start, void *end)
|
||||
{
|
||||
#ifndef LIGHTNING_CROSS
|
||||
register char *ddest, *idest;
|
||||
|
||||
static int cache_line_size;
|
||||
if (cache_line_size == 0) {
|
||||
char buffer[8192];
|
||||
int i, probe;
|
||||
|
||||
/* Find out the size of a cache line by zeroing one */
|
||||
memset(buffer, 0xFF, 8192);
|
||||
__asm__ __volatile__ ("dcbz 0,%0" : : "r"(buffer + 4096));
|
||||
|
||||
/* Probe for the beginning of the cache line. */
|
||||
for(i = 0, probe = 4096; probe; probe >>= 1)
|
||||
if (buffer[i | probe] != 0x00)
|
||||
i |= probe;
|
||||
|
||||
/* i is now just before the start of the cache line */
|
||||
i++;
|
||||
for(cache_line_size = 1; i + cache_line_size < 8192; cache_line_size <<= 1)
|
||||
if (buffer[i + cache_line_size] != 0x00)
|
||||
break;
|
||||
}
|
||||
|
||||
start -= ((long) start) & (cache_line_size - 1);
|
||||
end -= ((long) end) & (cache_line_size - 1);
|
||||
|
||||
/* Force data cache write-backs */
|
||||
for (ddest = (char *) start; ddest <= (char *) end; ddest += cache_line_size) {
|
||||
__asm__ __volatile__ ("dcbst 0,%0" : : "r"(ddest));
|
||||
}
|
||||
__asm__ __volatile__ ("sync" : : );
|
||||
|
||||
/* Now invalidate the instruction cache */
|
||||
for (idest = (char *) start; idest <= (char *) end; idest += cache_line_size) {
|
||||
__asm__ __volatile__ ("icbi 0,%0" : : "r"(idest));
|
||||
}
|
||||
__asm__ __volatile__ ("isync" : : );
|
||||
#endif /* !LIGHTNING_CROSS */
|
||||
}
|
||||
#endif /* __GNUC__ || __GNUG__ */
|
||||
|
||||
#define _jit (*jit)
|
||||
|
||||
static void
|
||||
_jit_epilog(jit_state *jit)
|
||||
{
|
||||
int n = _jitl.nbArgs;
|
||||
int frame_size, ofs;
|
||||
int first_saved_reg = JIT_AUX - n;
|
||||
int num_saved_regs = 32 - first_saved_reg;
|
||||
|
||||
frame_size = 24 + 32 + num_saved_regs * 4; /* r24..r31 + args */
|
||||
frame_size += 15; /* the stack must be quad-word */
|
||||
frame_size &= ~15; /* aligned */
|
||||
|
||||
#ifdef _CALL_DARWIN
|
||||
LWZrm(0, frame_size + 8, 1); /* lwz r0, x+8(r1) (ret.addr.) */
|
||||
#else
|
||||
LWZrm(0, frame_size + 4, 1); /* lwz r0, x+4(r1) (ret.addr.) */
|
||||
#endif
|
||||
MTLRr(0); /* mtspr LR, r0 */
|
||||
|
||||
ofs = frame_size - num_saved_regs * 4;
|
||||
LMWrm(first_saved_reg, ofs, 1); /* lmw rI, ofs(r1) */
|
||||
ADDIrri(1, 1, frame_size); /* addi r1, r1, x */
|
||||
BLR(); /* blr */
|
||||
}
|
||||
|
||||
/* Emit a prolog for a function.
|
||||
Upon entrance to the trampoline:
|
||||
- LR = address where the real code for the function lies
|
||||
- R3-R8 = parameters
|
||||
Upon finishing the trampoline:
|
||||
- R0 = return address for the function
|
||||
- R25-R20 = parameters (order is reversed, 1st argument is R25)
|
||||
|
||||
The +32 in frame_size computation is to accound for the parameter area of
|
||||
a function frame.
|
||||
|
||||
On PPC the frame must have space to host the arguments of any callee.
|
||||
However, as it currently stands, the argument to jit_trampoline (n) is
|
||||
the number of arguments of the caller we generate. Therefore, the
|
||||
callee can overwrite a part of the stack (saved register area when it
|
||||
flushes its own parameter on the stack. The addition of a constant
|
||||
offset = 32 is enough to hold eight 4 bytes arguments. This is less
|
||||
than perfect but is a reasonable work around for now.
|
||||
Better solution must be investigated. */
|
||||
static void
|
||||
_jit_prolog(jit_state *jit, int n)
|
||||
{
|
||||
int frame_size;
|
||||
int ofs, i;
|
||||
int first_saved_reg = JIT_AUX - n;
|
||||
int num_saved_regs = 32 - first_saved_reg;
|
||||
|
||||
_jitl.nextarg_geti = JIT_AUX - 1;
|
||||
_jitl.nextarg_getd = 1;
|
||||
_jitl.nbArgs = n;
|
||||
|
||||
frame_size = 24 + 32 + num_saved_regs * 4; /* r27..r31 + args */
|
||||
frame_size += 15; /* the stack must be quad-word */
|
||||
frame_size &= ~15; /* aligned */
|
||||
|
||||
MFLRr(0);
|
||||
STWUrm(1, -frame_size, 1); /* stwu r1, -x(r1) */
|
||||
|
||||
ofs = frame_size - num_saved_regs * 4;
|
||||
STMWrm(first_saved_reg, ofs, 1); /* stmw rI, ofs(r1) */
|
||||
#ifdef _CALL_DARWIN
|
||||
STWrm(0, frame_size + 8, 1); /* stw r0, x+8(r1) */
|
||||
#else
|
||||
STWrm(0, frame_size + 4, 1); /* stw r0, x+4(r1) */
|
||||
#endif
|
||||
for (i = 0; i < n; i++)
|
||||
MRrr(JIT_AUX-1-i, 3+i); /* save parameters below r24 */
|
||||
}
|
||||
|
||||
#undef _jit
|
||||
|
||||
#endif /* __lightning_funcs_h */
|
||||
383
src/runtime/c/pgf/lightning/sparc/asm.h
Normal file
383
src/runtime/c/pgf/lightning/sparc/asm.h
Normal file
@@ -0,0 +1,383 @@
|
||||
/******************************** -*- C -*- ****************************
|
||||
*
|
||||
* Run-time assembler for the SPARC
|
||||
*
|
||||
***********************************************************************/
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* Copyright 1999, 2000, 2001, 2002 Ian Piumarta
|
||||
*
|
||||
* This file is part of GNU lightning.
|
||||
*
|
||||
* GNU lightning is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* GNU lightning 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 Lesser General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with GNU lightning; see the file COPYING.LESSER; if not, write to the
|
||||
* Free Software Foundation, 59 Temple Place - Suite 330, Boston,
|
||||
* MA 02111-1307, USA.
|
||||
*
|
||||
***********************************************************************/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#ifndef __lightning_asm_h
|
||||
#define __lightning_asm_h
|
||||
|
||||
|
||||
/* <imm> = [0-9]+ -> add i, one parameter (imm)
|
||||
* <reg> = %<imm> -> add r, one parameter (imm or _Rr(imm) )
|
||||
* %g<imm> -> add r, one parameter (imm or _Rg(imm) )
|
||||
* %o<imm> -> add r, one parameter (imm+8 or _Ro(imm) )
|
||||
* %l<imm> -> add r, one parameter (imm+16 or _Rl(imm) )
|
||||
* %i<imm> -> add r, one parameter (imm+24 or _Ri(imm) )
|
||||
* <mem> = <imm>(<reg>) -> add m, two parameters (reg,imm)
|
||||
* <idx> = <reg>(<reg>) -> add x, two parameters (reg,reg)
|
||||
*/
|
||||
|
||||
|
||||
typedef unsigned int jit_insn;
|
||||
|
||||
#ifndef LIGHTNING_DEBUG
|
||||
#define _d30(BD) ((_jit_UL(BD) - _jit_UL(_jit.x.pc))>>2)
|
||||
#define _d22(BD) _ck_d(22, _d30(BD))
|
||||
|
||||
#define _HI(I) (_jit_UL(I) >> (10))
|
||||
#define _LO(I) (_jit_UL(I) & _MASK(10))
|
||||
|
||||
/* register names */
|
||||
|
||||
#define _y 0
|
||||
#define _psr 1
|
||||
|
||||
#define _Rr(N) ( 0+(N))
|
||||
#define _Rg(N) ( 0+(N))
|
||||
#define _Ro(N) ( 8+(N))
|
||||
#define _Rl(N) (16+(N))
|
||||
#define _Ri(N) (24+(N))
|
||||
|
||||
/* instruction formats -- Figure 5-1, page 44 in */
|
||||
/* SPARC International, "The SPARC Architecture Manual, Version 8", Prentice-Hall, 1992. */
|
||||
|
||||
#define _0i(RD, OP2, IMM) _jit_I((0<<30)| (_u5(RD)<<25)|(_u3(OP2)<<22)| _u22(IMM))
|
||||
#define _0( A, CC, OP2, DSP) _jit_I((0<<30)|(_u1(A)<<29)|(_u4(CC)<<25)|(_u3(OP2)<<22)| _d22(DSP))
|
||||
#define _0d( A, CC, OP2, DSP) _jit_I((0<<30)|(_u1(A)<<29)|(_u4(CC)<<25)|(_u3(OP2)<<22)| _u22(DSP))
|
||||
|
||||
#define _1( DSP) _jit_I((1<<30)| _d30(DSP))
|
||||
|
||||
#define _2( RD, OP3, RS1, I, ASI, RS2) _jit_I((2<<30)| (_u5(RD)<<25)|(_u6(OP3)<<19)|(_u5(RS1)<<14)|(_u1(I)<<13)|(_u8(ASI)<<5)|_u5 (RS2))
|
||||
#define _2i(RD, OP3, RS1, I, IMM) _jit_I((2<<30)| (_u5(RD)<<25)|(_u6(OP3)<<19)|(_u5(RS1)<<14)|(_u1(I)<<13)| _s13(IMM))
|
||||
#define _2f(RD, OP3, RS1, OPF, RS2) _jit_I((2<<30)| (_u5(RD)<<25)|(_u6(OP3)<<19)|(_u5(RS1)<<14)| (_u9(OPF)<<5)|_u5 (RS2))
|
||||
|
||||
#define _3( RD, OP3, RS1, I, ASI, RS2) _jit_I((3<<30)| (_u5(RD)<<25)|(_u6(OP3)<<19)|(_u5(RS1)<<14)|(_u1(I)<<13)|(_u8(ASI)<<5)|_u5 (RS2))
|
||||
#define _3i(RD, OP3, RS1, I, IMM) _jit_I((3<<30)| (_u5(RD)<<25)|(_u6(OP3)<<19)|(_u5(RS1)<<14)|(_u1(I)<<13)| _s13(IMM))
|
||||
|
||||
#define _FP1(RD, RS1, OPF, RS2) _2f((RD), 52, (RS1), (OPF), (RS2))
|
||||
#define _FP2(RD, RS1, OPF, RS2) _2f((RD), 53, (RS1), (OPF), (RS2))
|
||||
|
||||
/* basic instructions [Section B, page 87] */
|
||||
|
||||
#define ADDrrr(RS1, RS2, RD) _2 ((RD), 0, (RS1), 0, 0, (RS2))
|
||||
#define ADDrir(RS1, IMM, RD) _2i ((RD), 0, (RS1), 1, (IMM))
|
||||
#define ADDCCrrr(RS1, RS2, RD) _2 ((RD), 16, (RS1), 0, 0, (RS2))
|
||||
#define ADDCCrir(RS1, IMM, RD) _2i ((RD), 16, (RS1), 1, (IMM))
|
||||
#define ADDXrrr(RS1, RS2, RD) _2 ((RD), 8, (RS1), 0, 0, (RS2))
|
||||
#define ADDXrir(RS1, IMM, RD) _2i ((RD), 8, (RS1), 1, (IMM))
|
||||
#define ADDXCCrrr(RS1, RS2, RD) _2 ((RD), 24, (RS1), 0, 0, (RS2))
|
||||
#define ADDXCCrir(RS1, IMM, RD) _2i ((RD), 24, (RS1), 1, (IMM))
|
||||
#define ANDrrr(RS1, RS2, RD) _2 ((RD), 1, (RS1), 0, 0, (RS2))
|
||||
#define ANDrir(RS1, IMM, RD) _2i ((RD), 1, (RS1), 1, (IMM))
|
||||
#define ANDCCrrr(RS1, RS2, RD) _2 ((RD), 17, (RS1), 0, 0, (RS2))
|
||||
#define ANDCCrir(RS1, IMM, RD) _2i ((RD), 17, (RS1), 1, (IMM))
|
||||
|
||||
#define BNi(DISP) _0 (0, 0, 2, (DISP))
|
||||
#define BN_Ai(DISP) _0 (1, 0, 2, (DISP))
|
||||
#define BEi(DISP) _0 (0, 1, 2, (DISP))
|
||||
#define BE_Ai(DISP) _0 (1, 1, 2, (DISP))
|
||||
#define BLEi(DISP) _0 (0, 2, 2, (DISP))
|
||||
#define BLE_Ai(DISP) _0 (1, 2, 2, (DISP))
|
||||
#define BLi(DISP) _0 (0, 3, 2, (DISP))
|
||||
#define BL_Ai(DISP) _0 (1, 3, 2, (DISP))
|
||||
#define BLEUi(DISP) _0 (0, 4, 2, (DISP))
|
||||
#define BLEU_Ai(DISP) _0 (1, 4, 2, (DISP))
|
||||
#define BCSi(DISP) _0 (0, 5, 2, (DISP))
|
||||
#define BCS_Ai(DISP) _0 (1, 5, 2, (DISP))
|
||||
#define BNEGi(DISP) _0 (0, 6, 2, (DISP))
|
||||
#define BNEG_Ai(DISP) _0 (1, 6, 2, (DISP))
|
||||
#define BVSi(DISP) _0 (0, 7, 2, (DISP))
|
||||
#define BVS_Ai(DISP) _0 (1, 7, 2, (DISP))
|
||||
#define BAi(DISP) _0 (0, 8, 2, (DISP))
|
||||
#define BA_Ai(DISP) _0 (1, 8, 2, (DISP))
|
||||
#define BNEi(DISP) _0 (0, 9, 2, (DISP))
|
||||
#define BNE_Ai(DISP) _0 (1, 9, 2, (DISP))
|
||||
#define BGi(DISP) _0 (0, 10, 2, (DISP))
|
||||
#define BG_Ai(DISP) _0 (1, 10, 2, (DISP))
|
||||
#define BGEi(DISP) _0 (0, 11, 2, (DISP))
|
||||
#define BGE_Ai(DISP) _0 (1, 11, 2, (DISP))
|
||||
#define BGUi(DISP) _0 (0, 12, 2, (DISP))
|
||||
#define BGU_Ai(DISP) _0 (1, 12, 2, (DISP))
|
||||
#define BCCi(DISP) _0 (0, 13, 2, (DISP))
|
||||
#define BCC_Ai(DISP) _0 (1, 13, 2, (DISP))
|
||||
#define BPOSi(DISP) _0 (0, 14, 2, (DISP))
|
||||
#define BPOS_Ai(DISP) _0 (1, 14, 2, (DISP))
|
||||
#define BVCi(DISP) _0 (0, 15, 2, (DISP))
|
||||
#define BVC_Ai(DISP) _0 (1, 15, 2, (DISP))
|
||||
|
||||
#define CALLi(DISP) _1 ((DISP))
|
||||
|
||||
#define FLUSHrr(RS1, RS2) _2 (0, 0x3b, (RS1), 0, 0, (RS2))
|
||||
#define FLUSHir(IMM, RS1) _2i (0, 0x3b, (RS1), 1, (IMM))
|
||||
|
||||
#define JMPLxr(RS1, RS2, RD) _2 ((RD), 56, (RS1), 0, 0, (RS2))
|
||||
#define JMPLmr(RS1, IMM, RD) _2i ((RD), 56, (RS1), 1, (IMM))
|
||||
|
||||
#define LDxr(RS1, RS2, RD) _3 ((RD), 0, (RS1), 0, 0, (RS2))
|
||||
#define LDmr(RS1, IMM, RD) _3i ((RD), 0, (RS1), 1, (IMM))
|
||||
#define LDUBxr(RS1, RS2, RD) _3 ((RD), 1, (RS1), 0, 0, (RS2))
|
||||
#define LDUBmr(RS1, IMM, RD) _3i ((RD), 1, (RS1), 1, (IMM))
|
||||
#define LDUHxr(RS1, RS2, RD) _3 ((RD), 2, (RS1), 0, 0, (RS2))
|
||||
#define LDUHmr(RS1, IMM, RD) _3i ((RD), 2, (RS1), 1, (IMM))
|
||||
#define LDDxr(RS1, RS2, RD) _3 ((RD), 3, (RS1), 0, 0, (RS2))
|
||||
#define LDDmr(RS1, IMM, RD) _3i ((RD), 3, (RS1), 1, (IMM))
|
||||
#define LDSBxr(RS1, RS2, RD) _3 ((RD), 9, (RS1), 0, 0, (RS2))
|
||||
#define LDSBmr(RS1, IMM, RD) _3i ((RD), 9, (RS1), 1, (IMM))
|
||||
#define LDSHxr(RS1, RS2, RD) _3 ((RD), 10, (RS1), 0, 0, (RS2))
|
||||
#define LDSHmr(RS1, IMM, RD) _3i ((RD), 10, (RS1), 1, (IMM))
|
||||
|
||||
#define ORrrr(RS1, RS2, RD) _2 ((RD), 2, (RS1), 0, 0, (RS2))
|
||||
#define ORrir(RS1, IMM, RD) _2i ((RD), 2, (RS1), 1, (IMM))
|
||||
#define ORCCrrr(RS1, RS2, RD) _2 ((RD), 18, (RS1), 0, 0, (RS2))
|
||||
#define ORCCrir(RS1, IMM, RD) _2i ((RD), 18, (RS1), 1, (IMM))
|
||||
|
||||
#define RDir(RS, RD) _2 ((RD), (RS)|0x28, 0, 0, 0,0)
|
||||
#define RESTORErrr(RS1, RS2, RD) _2 ((RD), 61, (RS1), 0, 0, (RS2))
|
||||
#define RESTORErir(RS1, IMM, RD) _2i ((RD), 61, (RS1), 1, (IMM))
|
||||
|
||||
#define SAVErrr(RS1, RS2, RD) _2 ((RD), 60, (RS1), 0, 0, (RS2))
|
||||
#define SAVErir(RS1, IMM, RD) _2i ((RD), 60, (RS1), 1, (IMM))
|
||||
#define SDIVrrr(RS1, RS2, RD) _2 ((RD), 15, (RS1), 0, 0, (RS2))
|
||||
#define SDIVrir(RS1, IMM, RD) _2i ((RD), 15, (RS1), 1, (IMM))
|
||||
#define SDIVCCrrr(RS1, RS2, RD) _2 ((RD), 31, (RS1), 0, 0, (RS2))
|
||||
#define SDIVCCrir(RS1, IMM, RD) _2i ((RD), 31, (RS1), 1, (IMM))
|
||||
#define SETHIir(IMM, RD) _0i ((RD), 4, (IMM))
|
||||
#define SLLrrr(RS1, RS2, RD) _2 ((RD), 37, (RS1), 0, 0, (RS2))
|
||||
#define SLLrir(RS1, IMM, RD) _2i ((RD), 37, (RS1), 1, (IMM))
|
||||
#define SMULrrr(RS1, RS2, RD) _2 ((RD), 11, (RS1), 0, 0, (RS2))
|
||||
#define SMULrir(RS1, IMM, RD) _2i ((RD), 11, (RS1), 1, (IMM))
|
||||
#define SMULCCrrr(RS1, RS2, RD) _2 ((RD), 27, (RS1), 0, 0, (RS2))
|
||||
#define SMULCCrir(RS1, IMM, RD) _2i ((RD), 27, (RS1), 1, (IMM))
|
||||
#define SRArrr(RS1, RS2, RD) _2 ((RD), 39, (RS1), 0, 0, (RS2))
|
||||
#define SRArir(RS1, IMM, RD) _2i ((RD), 39, (RS1), 1, (IMM))
|
||||
#define SRLrrr(RS1, RS2, RD) _2 ((RD), 38, (RS1), 0, 0, (RS2))
|
||||
#define SRLrir(RS1, IMM, RD) _2i ((RD), 38, (RS1), 1, (IMM))
|
||||
#define STrx(RS, RD1, RD2) _3 ((RS), 4, (RD1), 0, 0, (RD2))
|
||||
#define STrm(RS, RD, IMM) _3i ((RS), 4, (RD), 1, (IMM))
|
||||
#define STBrx(RS, RD1, RD2) _3 ((RS), 5, (RD1), 0, 0, (RD2))
|
||||
#define STBrm(RS, RD, IMM) _3i ((RS), 5, (RD), 1, (IMM))
|
||||
#define STBAR() _0i (0, 0x28, 15, 0, 0)
|
||||
#define STHrx(RS, RD1, RD2) _3 ((RS), 6, (RD1), 0, 0, (RD2))
|
||||
#define STHrm(RS, RD, IMM) _3i ((RS), 6, (RD), 1, (IMM))
|
||||
#define STDrx(RS, RD1, RD2) _3 ((RS), 7, (RD1), 0, 0, (RD2))
|
||||
#define STDrm(RS, RD, IMM) _3i ((RS), 7, (RD), 1, (IMM))
|
||||
#define SUBrrr(RS1, RS2, RD) _2 ((RD), 4, (RS1), 0, 0, (RS2))
|
||||
#define SUBrir(RS1, IMM, RD) _2i ((RD), 4, (RS1), 1, (IMM))
|
||||
#define SUBCCrrr(RS1, RS2, RD) _2 ((RD), 20, (RS1), 0, 0, (RS2))
|
||||
#define SUBCCrir(RS1, IMM, RD) _2i ((RD), 20, (RS1), 1, (IMM))
|
||||
#define SUBXrrr(RS1, RS2, RD) _2 ((RD), 12, (RS1), 0, 0, (RS2))
|
||||
#define SUBXrir(RS1, IMM, RD) _2i ((RD), 12, (RS1), 1, (IMM))
|
||||
#define SUBXCCrrr(RS1, RS2, RD) _2 ((RD), 28, (RS1), 0, 0, (RS2))
|
||||
#define SUBXCCrir(RS1, IMM, RD) _2i ((RD), 28, (RS1), 1, (IMM))
|
||||
|
||||
#define UDIVrrr(RS1, RS2, RD) _2 ((RD), 14, (RS1), 0, 0, (RS2))
|
||||
#define UDIVrir(RS1, IMM, RD) _2i ((RD), 14, (RS1), 1, (IMM))
|
||||
#define UDIVCCrrr(RS1, RS2, RD) _2 ((RD), 30, (RS1), 0, 0, (RS2))
|
||||
#define UDIVCCrir(RS1, IMM, RD) _2i ((RD), 30, (RS1), 1, (IMM))
|
||||
#define UMULrrr(RS1, RS2, RD) _2 ((RD), 10, (RS1), 0, 0, (RS2))
|
||||
#define UMULrir(RS1, IMM, RD) _2i ((RD), 10, (RS1), 1, (IMM))
|
||||
#define UMULCCrrr(RS1, RS2, RD) _2 ((RD), 26, (RS1), 0, 0, (RS2))
|
||||
#define UMULCCrir(RS1, IMM, RD) _2i ((RD), 26, (RS1), 1, (IMM))
|
||||
|
||||
#define WRrri(RS1, RS2, RD) _2 (0, (RD)|0x30, RS1, 0, 0, (RS2))
|
||||
#define WRrii(RS1, IMM, RD) _2i (0, (RD)|0x30, RS1, 1, (IMM))
|
||||
|
||||
#define XORrrr(RS1, RS2, RD) _2 ((RD), 3, (RS1), 0, 0, (RS2))
|
||||
#define XORrir(RS1, IMM, RD) _2i ((RD), 3, (RS1), 1, (IMM))
|
||||
#define XORCCrrr(RS1, RS2, RD) _2 ((RD), 19, (RS1), 0, 0, (RS2))
|
||||
#define XORCCrir(RS1, IMM, RD) _2i ((RD), 19, (RS1), 1, (IMM))
|
||||
|
||||
/* synonyms */
|
||||
|
||||
#define Bi(DISP) BAi((DISP))
|
||||
#define B_Ai(DISP) BA_Ai((DISP))
|
||||
#define BNZi(DISP) BNEi((DISP))
|
||||
#define BNZ_Ai(DISP) BNE_Ai((DISP))
|
||||
#define BZi(DISP) BEi((DISP))
|
||||
#define BZ_Ai(DISP) BE_Ai((DISP))
|
||||
#define BGEUi(DISP) BCCi((DISP))
|
||||
#define BGEU_Ai(DISP) BCC_Ai((DISP))
|
||||
#define BLUi(DISP) BCSi((DISP))
|
||||
#define BLU_Ai(DISP) BCS_Ai((DISP))
|
||||
|
||||
#define LDUWxr(RS1, RS2, RD) LDxr((RS1), (RS2), (RD))
|
||||
#define LDUWmr(RS1, IMM, RD) LDmr((RS1), (IMM), (RD))
|
||||
#define LDSWxr(RS1, RS2, RD) LDxr((RS1), (RS2), (RD))
|
||||
#define LDSWmr(RS1, IMM, RD) LDmr((RS1), (IMM), (RD))
|
||||
|
||||
#define STWrx(RS, RD1, RD2) STrx((RS), (RD1), (RD2))
|
||||
#define STWrm(RS, RD, IMM) STrm((RS), (RD), (IMM))
|
||||
|
||||
/* synthetic instructions [Table A-1, page 85] */
|
||||
|
||||
#define BCLRrr(R,S) ANDNrrr((R), (S), (S))
|
||||
#define BCLRir(I,R) ANDNrir((R), (I), (R))
|
||||
#define BSETrr(R,S) ORrrr((R), (S), (S))
|
||||
#define BSETir(I,R) ORrir((R), (I), (R))
|
||||
#define BTOGrr(R,S) XORrrr((R), (S), (S))
|
||||
#define BTOGir(I,R) XORrir((R), (I), (R))
|
||||
#define BTSTrr(R,S) ANDCCrrr((R), (S), 0)
|
||||
#define BTSTir(I,R) ANDCCrir((R), (I), 0)
|
||||
|
||||
#define CALLm(R,I) JMPLmr((R), (I), _Ro(7))
|
||||
#define CALLx(R,S) JMPLxr((R), (S), _Ro(7))
|
||||
|
||||
#define CLRr(R) ORrrr(0, 0, (R))
|
||||
#define CLRBm(R,I) STBrm(0, (R), (I))
|
||||
#define CLRBx(R,S) STBrm(0, (R), (S))
|
||||
#define CLRHm(R,I) STHrm(0, (R), (I))
|
||||
#define CLRHx(R,S) STHrm(0, (R), (S))
|
||||
#define CLRm(R,I) STrm(0, (R), (I))
|
||||
#define CLRx(R,S) STrm(0, (R), (S))
|
||||
|
||||
#define CMPrr(RS1, RS2) SUBCCrrr((RS1), (RS2), 0)
|
||||
#define CMPri(RS1, IMM) SUBCCrir((RS1), (IMM), 0)
|
||||
|
||||
#define DECr(R) SUBrir((R), 1, (R))
|
||||
#define DECir(I,R) SUBrir((R), (I), (R))
|
||||
#define DECCCr(R) SUBCCrir((R), 1, (R))
|
||||
#define DECCCir(I,R) SUBCCrir((R), (I), (R))
|
||||
|
||||
#define INCr(R) ADDrir((R), 1, (R))
|
||||
#define INCir(I,R) ADDrir((R), (I), (R))
|
||||
#define INCCCr(R) ADDCCrir((R), 1, (R))
|
||||
#define INCCCir(I,R) ADDCCrir((R), (I), (R))
|
||||
|
||||
#define JMPm(R,I) JMPLmr((R), (I), 0)
|
||||
#define JMPx(R,S) JMPLxr((R), (S), 0)
|
||||
|
||||
#define MOVrr(R,S) ORrrr(0, (R), (S))
|
||||
#define MOVir(I, R) ORrir(0, (I), (R))
|
||||
|
||||
#define NEGrr(R,S) SUBrrr(0, (R), (S))
|
||||
#define NEGr(R) SUBrrr(0, (R), (R))
|
||||
#define NOP() SETHIir(0, 0)
|
||||
|
||||
#define NOTrr(R,S) XNORrrr((R), 0, (S))
|
||||
#define NOTr(R) XNORrrr((R), 0, (R))
|
||||
|
||||
#define RESTORE() RESTORErrr(0, 0, 0)
|
||||
#define RET() JMPLmr(_Ri(7),8 ,0)
|
||||
#define RETL() JMPLmr(_Ro(7),8 ,0)
|
||||
|
||||
#define SAVE() SAVErrr(0, 0, 0)
|
||||
#define SETir(I,R) (_siP(13,(I)) ? MOVir((I),(R)) : SETir2(_HI(I), _LO(I), (R)))
|
||||
#define SETir2(H,L,R) (SETHIir(H,R), (L ? ORrir(R,L,R) : 0))
|
||||
|
||||
/* BNZ,a executes the delay instruction if NZ (so skips if Z)
|
||||
* BZ,a executes the delay instruction if Z (so skips if NZ). */
|
||||
#define SKIPZ() _0d (1, 9, 2, 2) /* BNZ,a .+8 */
|
||||
#define SKIPNZ() _0d (1, 1, 2, 2) /* BZ,a .+8 */
|
||||
#define SKIP() _0d (1, 0, 2, 0) /* BN,a . */
|
||||
|
||||
#define TSTr(R) ORCCrrr(0, (R), 0)
|
||||
|
||||
#define WRii(IMM, RD) WRrii(0, (IMM), (RD))
|
||||
#define WRri(RS2, RD) WRrri(0, (RS2), (RD))
|
||||
|
||||
#define LDFSRx(RS1, RS2) _3 (0, 33, (RS1), 0, 0, (RS2))
|
||||
#define LDFSRm(RS1, IMM) _3i (0, 33, (RS1), 1, (IMM))
|
||||
#define STFSRx(RD1, RD2) _3 (0, 37, (RD1), 0, 0, (RD2))
|
||||
#define STFSRm(RD, IMM) _3i (0, 37, (RD), 1, (IMM))
|
||||
|
||||
#define FITODrr(FRS, FRD) _FP1((FRD), 0, 200, (FRS))
|
||||
#define FITOSrr(FRS, FRD) _FP1((FRD), 0, 196, (FRS))
|
||||
#define FDTOIrr(FRS, FRD) _FP1((FRD), 0, 210, (FRS))
|
||||
#define FSTOIrr(FRS, FRD) _FP1((FRD), 0, 209, (FRS))
|
||||
#define FSTODrr(FRS, FRD) _FP1((FRD), 0, 201, (FRS))
|
||||
#define FDTOSrr(FRS, FRD) _FP1((FRD), 0, 198, (FRS))
|
||||
#define FMOVSrr(FRS, FRD) _FP1((FRD), 0, 1, (FRS))
|
||||
#define FNEGSrr(FRS, FRD) _FP1((FRD), 0, 5, (FRS))
|
||||
#define FABSSrr(FRS, FRD) _FP1((FRD), 0, 9, (FRS))
|
||||
#define FMOVDrr(FRS, FRD) _FP1((FRD), 0, 2, (FRS))
|
||||
#define FNEGDrr(FRS, FRD) _FP1((FRD), 0, 6, (FRS))
|
||||
#define FABSDrr(FRS, FRD) _FP1((FRD), 0, 10, (FRS))
|
||||
#define FSQRTDrr(FRS, FRD) _FP1((FRD), 0, 42, (FRS))
|
||||
#define FSQRTSrr(FRS, FRD) _FP1((FRD), 0, 41, (FRS))
|
||||
|
||||
#define FADDSrrr(FRS1, FRS2, FRD) _FP1((FRD), (FRS1), 65, (FRS2))
|
||||
#define FSUBSrrr(FRS1, FRS2, FRD) _FP1((FRD), (FRS1), 69, (FRS2))
|
||||
#define FMULSrrr(FRS1, FRS2, FRD) _FP1((FRD), (FRS1), 73, (FRS2))
|
||||
#define FDIVSrrr(FRS1, FRS2, FRD) _FP1((FRD), (FRS1), 77, (FRS2))
|
||||
|
||||
#define FADDDrrr(FRS1, FRS2, FRD) _FP1((FRD), (FRS1), 66, (FRS2))
|
||||
#define FSUBDrrr(FRS1, FRS2, FRD) _FP1((FRD), (FRS1), 70, (FRS2))
|
||||
#define FMULDrrr(FRS1, FRS2, FRD) _FP1((FRD), (FRS1), 74, (FRS2))
|
||||
#define FDIVDrrr(FRS1, FRS2, FRD) _FP1((FRD), (FRS1), 78, (FRS2))
|
||||
|
||||
#define FCMPSrr(FRS1, FRS2) _FP2(0, (FRS1), 81, (FRS2))
|
||||
#define FCMPDrr(FRS1, FRS2) _FP2(0, (FRS1), 82, (FRS2))
|
||||
|
||||
#define LDFxr(RS1, RS2, RD) _3 ((RD), 32, (RS1), 0, 0, (RS2))
|
||||
#define LDFmr(RS1, IMM, RD) _3i ((RD), 32, (RS1), 1, (IMM))
|
||||
#define LDDFxr(RS1, RS2, RD) _3 ((RD), 35, (RS1), 0, 0, (RS2))
|
||||
#define LDDFmr(RS1, IMM, RD) _3i ((RD), 35, (RS1), 1, (IMM))
|
||||
#define STFrx(RS, RD1, RD2) _3 ((RS), 36, (RD1), 0, 0, (RD2))
|
||||
#define STFrm(RS, RD1, IMM) _3i ((RS), 36, (RD1), 1, (IMM))
|
||||
#define STDFrx(RS, RD1, RD2) _3 ((RS), 39, (RD1), 0, 0, (RD2))
|
||||
#define STDFrm(RS, RD1, IMM) _3i ((RS), 39, (RD1), 1, (IMM))
|
||||
|
||||
#define FBNi(DISP) _0 (0, 0, 6, (DISP))
|
||||
#define FBN_Ai(DISP) _0 (1, 0, 6, (DISP))
|
||||
#define FBNEi(DISP) _0 (0, 1, 6, (DISP))
|
||||
#define FBNE_Ai(DISP) _0 (1, 1, 6, (DISP))
|
||||
#define FBLGi(DISP) _0 (0, 2, 6, (DISP))
|
||||
#define FBLG_Ai(DISP) _0 (1, 2, 6, (DISP))
|
||||
#define FBULi(DISP) _0 (0, 3, 6, (DISP))
|
||||
#define FBUL_Ai(DISP) _0 (1, 3, 6, (DISP))
|
||||
#define FBLi(DISP) _0 (0, 4, 6, (DISP))
|
||||
#define FBL_Ai(DISP) _0 (1, 4, 6, (DISP))
|
||||
#define FBUGi(DISP) _0 (0, 5, 6, (DISP))
|
||||
#define FBUG_Ai(DISP) _0 (1, 5, 6, (DISP))
|
||||
#define FBGi(DISP) _0 (0, 6, 6, (DISP))
|
||||
#define FBG_Ai(DISP) _0 (1, 6, 6, (DISP))
|
||||
#define FBUi(DISP) _0 (0, 7, 6, (DISP))
|
||||
#define FBU_Ai(DISP) _0 (1, 7, 6, (DISP))
|
||||
#define FBAi(DISP) _0 (0, 8, 6, (DISP))
|
||||
#define FBA_Ai(DISP) _0 (1, 8, 6, (DISP))
|
||||
#define FBEi(DISP) _0 (0, 9, 6, (DISP))
|
||||
#define FBE_Ai(DISP) _0 (1, 9, 6, (DISP))
|
||||
#define FBUEi(DISP) _0 (0, 10, 6, (DISP))
|
||||
#define FBUE_Ai(DISP) _0 (1, 10, 6, (DISP))
|
||||
#define FBGEi(DISP) _0 (0, 11, 6, (DISP))
|
||||
#define FBGE_Ai(DISP) _0 (1, 11, 6, (DISP))
|
||||
#define FBUGEi(DISP) _0 (0, 12, 6, (DISP))
|
||||
#define FBUGE_Ai(DISP) _0 (1, 12, 6, (DISP))
|
||||
#define FBLEi(DISP) _0 (0, 13, 6, (DISP))
|
||||
#define FBLE_Ai(DISP) _0 (1, 13, 6, (DISP))
|
||||
#define FBULEi(DISP) _0 (0, 14, 6, (DISP))
|
||||
#define FBULE_Ai(DISP) _0 (1, 14, 6, (DISP))
|
||||
#define FBOi(DISP) _0 (0, 15, 6, (DISP))
|
||||
#define FBO_Ai(DISP) _0 (1, 15, 6, (DISP))
|
||||
|
||||
#endif
|
||||
#endif /* __ccg_asm_sparc_h */
|
||||
265
src/runtime/c/pgf/lightning/sparc/core.h
Normal file
265
src/runtime/c/pgf/lightning/sparc/core.h
Normal file
@@ -0,0 +1,265 @@
|
||||
/******************************** -*- C -*- ****************************
|
||||
*
|
||||
* Platform-independent layer (Sparc version)
|
||||
*
|
||||
***********************************************************************/
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* Copyright 2000, 2001, 2002 Free Software Foundation, Inc.
|
||||
* Written by Paolo Bonzini.
|
||||
*
|
||||
* This file is part of GNU lightning.
|
||||
*
|
||||
* GNU lightning is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* GNU lightning 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 Lesser General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with GNU lightning; see the file COPYING.LESSER; if not, write to the
|
||||
* Free Software Foundation, 59 Temple Place - Suite 330, Boston,
|
||||
* MA 02111-1307, USA.
|
||||
*
|
||||
***********************************************************************/
|
||||
|
||||
|
||||
#ifndef __lightning_core_h
|
||||
#define __lightning_core_h
|
||||
|
||||
#define JIT_R_NUM 3
|
||||
#define JIT_V_NUM 6
|
||||
#define JIT_R(i) ((i) ? _Rl((i) - 1) : _Rg(2))
|
||||
#define JIT_V(i) _Rl((i)+2)
|
||||
|
||||
#define JIT_BIG _Rg(1) /* %g1 used to make 32-bit operands */
|
||||
#define JIT_BIG2 _Ro(7) /* %o7 used to make 32-bit compare operands */
|
||||
#define JIT_SP _Ro(6)
|
||||
#define JIT_RZERO _Rg(0)
|
||||
#define JIT_RET _Ri(0)
|
||||
|
||||
/* Delay slot scheduling: jmp generates branches with annulled delay
|
||||
* slots; we toggle the annul bit if we can fill the slot. CALLs and
|
||||
* cond. branches have a different meaning for the annul bit, so we
|
||||
* automatically generate a NOP and eventually copy the delay insn onto
|
||||
* it. Delay slots in RET are already used for RESTORE, so we don't
|
||||
* schedule them.
|
||||
*
|
||||
* ,--- _jit.x.pc
|
||||
* insn X X before
|
||||
* cmp branch insn X X after (branch)
|
||||
* `--- _jit.x.pc
|
||||
* call insn insn X after (call)
|
||||
* `--- _jit.x.pc
|
||||
*/
|
||||
|
||||
struct jit_local_state {
|
||||
int nextarg_put; /* Next %o reg. to be written */
|
||||
int nextarg_get; /* Next %i reg. to be read */
|
||||
jit_insn delay;
|
||||
};
|
||||
|
||||
#define jit_fill_delay_after(branch) (_jitl.delay = *--_jit.x.pc, \
|
||||
((branch) == _jit.x.pc /* check if NOP was inserted */ \
|
||||
? (_jit.x.pc[-1] ^= 1<<29) /* no if branch, toggle annul bit */ \
|
||||
: (_jit.x.pc[-1] = _jitl.delay)), /* yes if call, replace NOP with delay insn */ \
|
||||
*_jit.x.pc = _jitl.delay, _jit.x.pc - 1) /* return addr of delay insn */
|
||||
|
||||
/* If possible, use the `small' instruction (rs, imm, rd)
|
||||
* else load imm into %l6 and use the `big' instruction (rs, %l6, rd)
|
||||
* jit_chk_imm2 uses %l7 instead of %l6 to avoid conflicts when using delay slots
|
||||
*/
|
||||
#define jit_chk_imm(imm, small, big) (_siP(13,(imm)) ? (small) : (SETir((imm), JIT_BIG), (big)) )
|
||||
#define jit_chk_imm2(imm, small, big) (_siP(13,(imm)) ? (small) : (SETir((imm), JIT_BIG2), (big)) )
|
||||
|
||||
/* Helper macros for branches */
|
||||
#define jit_branchi(rs, is, jmp, nop) (jit_chk_imm2(is, CMPri(rs, is), CMPrr(rs, JIT_BIG2)), jmp, nop, _jit.x.pc - 1)
|
||||
#define jit_branchr(s1, s2, jmp, nop) ( CMPrr(s1, s2), jmp, nop, _jit.x.pc - 1)
|
||||
|
||||
/* Helper macros for boolean tests -- delay slot sets d to 1;
|
||||
* taken branch leaves it to 1, not-taken branch resets it to 0 */
|
||||
#define jit_booli(d, rs, is, jmp) (jit_chk_imm (is, CMPri(rs, is), CMPrr(rs, JIT_BIG)), jmp, MOVir(1, (d)), MOVir(0, (d)))
|
||||
#define jit_boolr(d, s1, s2, jmp) ( CMPrr(s1, s2), jmp, MOVir(1, (d)), MOVir(0, (d)))
|
||||
|
||||
/* Helper macros for division
|
||||
* The architecture specifies that there must be 3 instructions between *
|
||||
* a y register write and a use of it for correct results. */
|
||||
#define jit_prepare_y(rs, is) (SRArir(rs, 31, JIT_BIG), WRri(JIT_BIG, _y), NOP(), NOP(), NOP(), _jit.x.pc -= jit_immsize(is))
|
||||
#define jit_clr_y(rs, is) ( WRri(0, _y), NOP(), NOP(), NOP(), _jit.x.pc -= jit_immsize(is))
|
||||
|
||||
#define jit_modr(jit_div, jit_mul, d, s1, s2) \
|
||||
(jit_div (JIT_BIG, s1, s2), \
|
||||
jit_mul (JIT_BIG, JIT_BIG, s2), \
|
||||
jit_subr_i (d, s1, JIT_BIG))
|
||||
|
||||
#define jit_modi(jit_divi, jit_muli, jit_divr, jit_mulr, d, rs, is) \
|
||||
(_siP(13,(imm)) \
|
||||
? (jit_divi (JIT_BIG, rs, is), \
|
||||
jit_muli (JIT_BIG, JIT_BIG, is), \
|
||||
jit_subr_i (d, rs, JIT_BIG)) \
|
||||
: (SETir ((is), JIT_BIG2), \
|
||||
jit_modr (jit_divr, jit_mulr, d, rs, JIT_BIG2)))
|
||||
|
||||
/* How many instruction are needed to put imm in a register. */
|
||||
#define jit_immsize(imm) (!(imm) ? 0 : \
|
||||
(!_siP((imm), 13) && ((imm) & 0x3ff) ? 2 : 1))
|
||||
|
||||
|
||||
/* branch instructions return the address of the *delay* instruction -- this
|
||||
* is just a helper macro that makes jit_patch more readable.
|
||||
*/
|
||||
#define jit_patch_(jump_pc,pv) \
|
||||
(*jump_pc &= ~_MASK(22), \
|
||||
*jump_pc |= ((_jit_UL((pv)) - _jit_UL(jump_pc)) >> 2) & _MASK(22))
|
||||
|
||||
#define jit_patch_set(sethi_pc, or_pc, dest) \
|
||||
(*(sethi_pc) &= ~_MASK(22), *(sethi_pc) |= _HI(dest), \
|
||||
*(or_pc) &= ~_MASK(13), *(or_pc) |= _LO(dest)) \
|
||||
|
||||
#define jit_patch_movi(movi_pc, val) \
|
||||
jit_patch_set((movi_pc) - 2, (movi_pc) - 1, (val))
|
||||
|
||||
#define jit_arg_c() (_jitl.nextarg_get++)
|
||||
#define jit_arg_i() (_jitl.nextarg_get++)
|
||||
#define jit_arg_l() (_jitl.nextarg_get++)
|
||||
#define jit_arg_p() (_jitl.nextarg_get++)
|
||||
#define jit_arg_s() (_jitl.nextarg_get++)
|
||||
#define jit_arg_uc() (_jitl.nextarg_get++)
|
||||
#define jit_arg_ui() (_jitl.nextarg_get++)
|
||||
#define jit_arg_ul() (_jitl.nextarg_get++)
|
||||
#define jit_arg_us() (_jitl.nextarg_get++)
|
||||
#define jit_addi_i(d, rs, is) jit_chk_imm((is), ADDrir((rs), (is), (d)), ADDrrr((rs), JIT_BIG, (d)))
|
||||
#define jit_addr_i(d, s1, s2) ADDrrr((s1), (s2), (d))
|
||||
#define jit_addci_i(d, rs, is) jit_chk_imm((is), ADDCCrir((rs), (is), (d)), ADDCCrrr((rs), JIT_BIG, (d)))
|
||||
#define jit_addcr_i(d, s1, s2) ADDCCrrr((s1), (s2), (d))
|
||||
#define jit_addxi_i(d, rs, is) jit_chk_imm((is), ADDXCCrir((rs), (is), (d)), ADDXCCrrr((rs), JIT_BIG, (d)))
|
||||
#define jit_addxr_i(d, s1, s2) ADDXCCrrr((s1), (s2), (d))
|
||||
#define jit_andi_i(d, rs, is) jit_chk_imm((is), ANDrir((rs), (is), (d)), ANDrrr((rs), JIT_BIG, (d)))
|
||||
#define jit_andr_i(d, s1, s2) ANDrrr((s1), (s2), (d))
|
||||
#define jit_beqi_i(label, rs, is) jit_branchi((rs), (is), BEi((label)), NOP() )
|
||||
#define jit_beqr_i(label, s1, s2) jit_branchr((s1), (s2), BEi((label)), NOP() )
|
||||
#define jit_bgei_i(label, rs, is) jit_branchi((rs), (is), BGEi((label)), NOP() )
|
||||
#define jit_bgei_ui(label, rs, is) jit_branchi((rs), (is), BGEUi((label)), NOP() )
|
||||
#define jit_bger_i(label, s1, s2) jit_branchr((s1), (s2), BGEi((label)), NOP() )
|
||||
#define jit_bger_ui(label, s1, s2) jit_branchr((s1), (s2), BGEUi((label)), NOP() )
|
||||
#define jit_bgti_i(label, rs, is) jit_branchi((rs), (is), BGi((label)), NOP() )
|
||||
#define jit_bgti_ui(label, rs, is) jit_branchi((rs), (is), BGUi((label)), NOP() )
|
||||
#define jit_bgtr_i(label, s1, s2) jit_branchr((s1), (s2), BGi((label)), NOP() )
|
||||
#define jit_bgtr_ui(label, s1, s2) jit_branchr((s1), (s2), BGUi((label)), NOP() )
|
||||
#define jit_blei_i(label, rs, is) jit_branchi((rs), (is), BLEi((label)), NOP() )
|
||||
#define jit_blei_ui(label, rs, is) jit_branchi((rs), (is), BLEUi((label)), NOP() )
|
||||
#define jit_bler_i(label, s1, s2) jit_branchr((s1), (s2), BLEi((label)), NOP() )
|
||||
#define jit_bler_ui(label, s1, s2) jit_branchr((s1), (s2), BLEUi((label)), NOP() )
|
||||
#define jit_blti_i(label, rs, is) jit_branchi((rs), (is), BLi((label)), NOP() )
|
||||
#define jit_blti_ui(label, rs, is) jit_branchi((rs), (is), BLUi((label)), NOP() )
|
||||
#define jit_bltr_i(label, s1, s2) jit_branchr((s1), (s2), BLi((label)), NOP() )
|
||||
#define jit_bltr_ui(label, s1, s2) jit_branchr((s1), (s2), BLUi((label)), NOP() )
|
||||
#define jit_bnei_i(label, rs, is) jit_branchi((rs), (is), BNEi((label)), NOP() )
|
||||
#define jit_bner_i(label, s1, s2) jit_branchr((s1), (s2), BNEi((label)), NOP() )
|
||||
#define jit_bmsi_i(label, rs, is) (jit_chk_imm((is), BTSTir((is), (rs)), BTSTrr((rs), JIT_BIG)), BNEi((label)), NOP(), _jit.x.pc - 1)
|
||||
#define jit_bmci_i(label, rs, is) (jit_chk_imm((is), BTSTir((is), (rs)), BTSTrr((rs), JIT_BIG)), BEi((label)), NOP(), _jit.x.pc - 1)
|
||||
#define jit_bmsr_i(label, s1, s2) ( BTSTrr((s1), (s2)), BNEi((label)), NOP(), _jit.x.pc - 1)
|
||||
#define jit_bmcr_i(label, s1, s2) ( BTSTrr((s1), (s2)), BEi((label)), NOP(), _jit.x.pc - 1)
|
||||
#define jit_boaddi_i(label, rs, is) (jit_chk_imm((is), ADDCCrir((rs), (is), (rs)), ADDCCrrr((rs), JIT_BIG, (rs))), BVSi((label)), NOP(), _jit.x.pc - 1)
|
||||
#define jit_bosubi_i(label, rs, is) (jit_chk_imm((is), SUBCCrir((rs), (is), (rs)), SUBCCrrr((rs), JIT_BIG, (rs))), BVSi((label)), NOP(), _jit.x.pc - 1)
|
||||
#define jit_boaddr_i(label, s1, s2) ( ADDCCrrr((s1), (s2), (s1)), BVSi((label)), NOP(), _jit.x.pc - 1)
|
||||
#define jit_bosubr_i(label, s1, s2) ( SUBCCrrr((s1), (s2), (s1)), BVSi((label)), NOP(), _jit.x.pc - 1)
|
||||
#define jit_boaddi_ui(label, rs, is) (jit_chk_imm((is), ADDCCrir((rs), (is), (rs)), ADDCCrrr((rs), JIT_BIG, (rs))), BCSi((label)), NOP(), _jit.x.pc - 1)
|
||||
#define jit_bosubi_ui(label, rs, is) (jit_chk_imm((is), SUBCCrir((rs), (is), (rs)), SUBCCrrr((rs), JIT_BIG, (rs))), BCSi((label)), NOP(), _jit.x.pc - 1)
|
||||
#define jit_boaddr_ui(label, s1, s2) ( ADDCCrrr((s1), (s2), (s1)), BCSi((label)), NOP(), _jit.x.pc - 1)
|
||||
#define jit_bosubr_ui(label, s1, s2) ( SUBCCrrr((s1), (s2), (s1)), BCSi((label)), NOP(), _jit.x.pc - 1)
|
||||
#define jit_calli(label) (CALLi(label), NOP(), _jit.x.pc - 1)
|
||||
#define jit_callr(reg) (CALLx((reg), 0), NOP())
|
||||
|
||||
#define jit_divi_i(d, rs, is) (jit_prepare_y((rs), 0x12345678), SETir((is), JIT_BIG), SDIVrrr((rs), JIT_BIG, (d)) )
|
||||
#define jit_divi_ui(d, rs, is) (jit_clr_y((rs), 0x12345678), SETir((is), JIT_BIG), UDIVrrr((rs), JIT_BIG, (d)) )
|
||||
#define jit_divr_i(d, s1, s2) (jit_prepare_y((s1), 0), SDIVrrr((s1), (s2), (d)))
|
||||
#define jit_divr_ui(d, s1, s2) (jit_clr_y((s1), 0), UDIVrrr((s1), (s2), (d)))
|
||||
#define jit_eqi_i(d, rs, is) jit_chk_imm((is), \
|
||||
(SUBCCrir((rs), (is), (d)), ADDXCCrir((d), -1, JIT_BIG), SUBXrir(0,-1,(d))),\
|
||||
jit_eqr_i(d, rs, JIT_BIG))
|
||||
#define jit_eqr_i(d, s1, s2) (SUBCCrrr((s1), (s2), (d)), ADDXCCrir((d), -1, JIT_BIG), SUBXrir(0,-1,(d)))
|
||||
#define jit_nei_i(d, rs, is) jit_chk_imm((is), \
|
||||
(SUBCCrir((rs), (is), (d)), ADDXCCrir((d), -1, JIT_BIG), ADDXrrr(0,0,(d))),\
|
||||
jit_ner_i(d, rs, JIT_BIG))
|
||||
#define jit_ner_i(d, s1, s2) (SUBCCrrr((s1), (s2), (d)), ADDXCCrir((d), -1, JIT_BIG), ADDXrrr(0,0,(d)))
|
||||
#define jit_gei_i(d, rs, is) jit_booli ((d), (rs), (is), BGEi(_jit.x.pc + 3) )
|
||||
#define jit_gei_ui(d, rs, is) jit_booli ((d), (rs), (is), BGEUi(_jit.x.pc + 3))
|
||||
#define jit_ger_i(d, s1, s2) jit_boolr ((d), (s1), (s2), BGEi(_jit.x.pc + 3) )
|
||||
#define jit_ger_ui(d, s1, s2) jit_boolr ((d), (s1), (s2), BGEUi(_jit.x.pc + 3))
|
||||
#define jit_gti_i(d, rs, is) jit_booli ((d), (rs), (is), BGi(_jit.x.pc + 3) )
|
||||
#define jit_gti_ui(d, rs, is) jit_booli ((d), (rs), (is), BGUi(_jit.x.pc + 3) )
|
||||
#define jit_gtr_i(d, s1, s2) jit_boolr ((d), (s1), (s2), BGi(_jit.x.pc + 3) )
|
||||
#define jit_gtr_ui(d, s1, s2) jit_boolr ((d), (s1), (s2), BGUi(_jit.x.pc + 3) )
|
||||
#define jit_hmuli_i(d, rs, is) (jit_muli_i (JIT_BIG, (rs), (is)), RDir (_y, (d)))
|
||||
#define jit_hmuli_ui(d, rs, is) (jit_muli_ui(JIT_BIG, (rs), (is)), RDir (_y, (d)))
|
||||
#define jit_hmulr_i(d, s1, s2) (jit_mulr_i (JIT_BIG, (s1), (s2)), RDir (_y, (d)))
|
||||
#define jit_hmulr_ui(d, s1, s2) (jit_mulr_ui(JIT_BIG, (s1), (s2)), RDir (_y, (d)))
|
||||
#define jit_jmpi(label) (BA_Ai((label)), _jit.x.pc)
|
||||
#define jit_jmpr(reg) (JMPx(JIT_RZERO, (reg)), NOP(), _jit.x.pc - 1)
|
||||
#define jit_ldxi_c(d, rs, is) jit_chk_imm((is), LDSBmr((rs), (is), (d)), LDSBxr((rs), JIT_BIG, (d)))
|
||||
#define jit_ldxi_i(d, rs, is) jit_chk_imm((is), LDSWmr((rs), (is), (d)), LDSWxr((rs), JIT_BIG, (d)))
|
||||
#define jit_ldxi_s(d, rs, is) jit_chk_imm((is), LDSHmr((rs), (is), (d)), LDSHxr((rs), JIT_BIG, (d)))
|
||||
#define jit_ldxi_uc(d, rs, is) jit_chk_imm((is), LDUBmr((rs), (is), (d)), LDUBxr((rs), JIT_BIG, (d)))
|
||||
#define jit_ldxi_us(d, rs, is) jit_chk_imm((is), LDUHmr((rs), (is), (d)), LDUHxr((rs), JIT_BIG, (d)))
|
||||
#define jit_ldxr_c(d, s1, s2) LDSBxr((s1), (s2), (d))
|
||||
#define jit_ldxr_i(d, s1, s2) LDSWxr((s1), (s2), (d))
|
||||
#define jit_ldxr_s(d, s1, s2) LDSHxr((s1), (s2), (d))
|
||||
#define jit_ldxr_uc(d, s1, s2) LDUBxr((s1), (s2), (d))
|
||||
#define jit_ldxr_us(d, s1, s2) LDUHxr((s1), (s2), (d))
|
||||
#define jit_lei_i(d, rs, is) jit_booli ((d), (rs), (is), BLEi(_jit.x.pc + 3) )
|
||||
#define jit_lei_ui(d, rs, is) jit_booli ((d), (rs), (is), BLEUi(_jit.x.pc + 3))
|
||||
#define jit_ler_i(d, s1, s2) jit_boolr ((d), (s1), (s2), BLEi(_jit.x.pc + 3) )
|
||||
#define jit_ler_ui(d, s1, s2) jit_boolr ((d), (s1), (s2), BLEUi(_jit.x.pc + 3))
|
||||
#define jit_lshi_i(d, rs, is) SLLrir((rs), (is), (d))
|
||||
#define jit_lshr_i(d, r1, r2) SLLrrr((r1), (r2), (d))
|
||||
#define jit_lti_i(d, rs, is) jit_booli ((d), (rs), (is), BLi(_jit.x.pc + 3) )
|
||||
#define jit_lti_ui(d, rs, is) jit_booli ((d), (rs), (is), BLUi(_jit.x.pc + 3) )
|
||||
#define jit_ltr_i(d, s1, s2) jit_boolr ((d), (s1), (s2), BLi(_jit.x.pc + 3) )
|
||||
#define jit_ltr_ui(d, s1, s2) jit_boolr ((d), (s1), (s2), BLUi(_jit.x.pc + 3) )
|
||||
#define jit_modi_i(d, rs, is) jit_modi(jit_divi_i, jit_muli_i, jit_divr_i, jit_mulr_i, (d), (rs), (is))
|
||||
#define jit_modi_ui(d, rs, is) jit_modi(jit_divi_ui, jit_muli_ui, jit_divr_ui, jit_mulr_ui, (d), (rs), (is))
|
||||
#define jit_modr_i(d, s1, s2) jit_modr(jit_divr_i, jit_mulr_i, (d), (s1), (s2))
|
||||
#define jit_modr_ui(d, s1, s2) jit_modr(jit_divr_ui, jit_mulr_ui, (d), (s1), (s2))
|
||||
#define jit_movi_i(d, is) SETir((is), (d))
|
||||
#define jit_movi_p(d, is) (SETir2(_HI((is)), _LO((is)), (d)), _jit.x.pc)
|
||||
#define jit_movr_i(d, rs) MOVrr((rs), (d))
|
||||
#define jit_muli_i(d, rs, is) jit_chk_imm((is), SMULrir((rs), (is), (d)), SMULrrr((rs), JIT_BIG, (d)))
|
||||
#define jit_muli_ui(d, rs, is) jit_chk_imm((is), UMULrir((rs), (is), (d)), UMULrrr((rs), JIT_BIG, (d)))
|
||||
#define jit_mulr_i(d, s1, s2) SMULrrr((s1), (s2), (d))
|
||||
#define jit_mulr_ui(d, s1, s2) UMULrrr((s1), (s2), (d))
|
||||
#define jit_nop() NOP()
|
||||
#define jit_ori_i(d, rs, is) jit_chk_imm((is), ORrir((rs), (is), (d)), ORrrr((rs), JIT_BIG, (d)))
|
||||
#define jit_orr_i(d, s1, s2) ORrrr((s1), (s2), (d))
|
||||
#define jit_patch_at(delay_pc, pv) jit_patch_ (((delay_pc) - 1) , (pv))
|
||||
#define jit_popr_i(rs) (LDmr(JIT_SP, 0, (rs)), ADDrir(JIT_SP, 8, JIT_SP))
|
||||
#define jit_prepare_i(num) (_jitl.nextarg_put += (num))
|
||||
#define jit_prolog(numargs) (SAVErir(JIT_SP, -120, JIT_SP), _jitl.nextarg_get = _Ri(0))
|
||||
#define jit_pushr_i(rs) (STrm((rs), JIT_SP, -8), SUBrir(JIT_SP, 8, JIT_SP))
|
||||
#define jit_pusharg_i(rs) (--_jitl.nextarg_put, MOVrr((rs), _Ro(_jitl.nextarg_put)))
|
||||
#define jit_ret() (RET(), RESTORE())
|
||||
#define jit_retval_i(rd) MOVrr(_Ro(0), (rd))
|
||||
#define jit_rshi_i(d, rs, is) SRArir((rs), (is), (d))
|
||||
#define jit_rshi_ui(d, rs, is) SRLrir((rs), (is), (d))
|
||||
#define jit_rshr_i(d, r1, r2) SRArrr((r1), (r2), (d))
|
||||
#define jit_rshr_ui(d, r1, r2) SRLrrr((r1), (r2), (d))
|
||||
#define jit_stxi_c(id, rd, rs) jit_chk_imm((id), STBrm((rs), (rd), (id)), STBrx((rs), (rd), JIT_BIG))
|
||||
#define jit_stxi_i(id, rd, rs) jit_chk_imm((id), STWrm((rs), (rd), (id)), STWrx((rs), (rd), JIT_BIG))
|
||||
#define jit_stxi_s(id, rd, rs) jit_chk_imm((id), STHrm((rs), (rd), (id)), STHrx((rs), (rd), JIT_BIG))
|
||||
#define jit_stxr_c(d1, d2, rs) STBrx((rs), (d1), (d2))
|
||||
#define jit_stxr_i(d1, d2, rs) STWrx((rs), (d1), (d2))
|
||||
#define jit_stxr_s(d1, d2, rs) STHrx((rs), (d1), (d2))
|
||||
#define jit_subr_i(d, s1, s2) SUBrrr((s1), (s2), (d))
|
||||
#define jit_subcr_i(d, s1, s2) SUBCCrrr((s1), (s2), (d))
|
||||
#define jit_subxi_i(d, rs, is) jit_chk_imm((is), SUBXCCrir((rs), (is), (d)), SUBXCCrrr((rs), JIT_BIG, (d)))
|
||||
#define jit_subxr_i(d, s1, s2) SUBXCCrrr((s1), (s2), (d))
|
||||
#define jit_xori_i(d, rs, is) jit_chk_imm((is), XORrir((rs), (is), (d)), XORrrr((rs), JIT_BIG, (d)))
|
||||
#define jit_xorr_i(d, s1, s2) XORrrr((s1), (s2), (d))
|
||||
|
||||
#endif /* __lightning_core_h */
|
||||
222
src/runtime/c/pgf/lightning/sparc/fp.h
Normal file
222
src/runtime/c/pgf/lightning/sparc/fp.h
Normal file
@@ -0,0 +1,222 @@
|
||||
/******************************** -*- C -*- ****************************
|
||||
*
|
||||
* Run-time assembler & support macros for the PowerPC math unit
|
||||
*
|
||||
***********************************************************************/
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* Copyright 2000, 2001, 2002, 2004 Free Software Foundation, Inc.
|
||||
* Written by Paolo Bonzini.
|
||||
*
|
||||
* This file is part of GNU lightning.
|
||||
*
|
||||
* GNU lightning is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* GNU lightning 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 Lesser General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with GNU lightning; see the file COPYING.LESSER; if not, write to the
|
||||
* Free Software Foundation, 59 Temple Place - Suite 330, Boston,
|
||||
* MA 02111-1307, USA.
|
||||
*
|
||||
***********************************************************************/
|
||||
|
||||
|
||||
|
||||
|
||||
#ifndef __lightning_asm_fp_h
|
||||
#define __lightning_asm_fp_h
|
||||
|
||||
#include <float.h>
|
||||
|
||||
#define JIT_FPR_NUM 6
|
||||
#define JIT_FPR(i) (30-(i)*2)
|
||||
#define JIT_FPTMP 18
|
||||
|
||||
#define jit_addr_f(rd,s1,s2) FADDSrrr((s1), (s2), (rd))
|
||||
#define jit_subr_f(rd,s1,s2) FSUBSrrr((s1), (s2), (rd))
|
||||
#define jit_mulr_f(rd,s1,s2) FMULSrrr((s1), (s2), (rd))
|
||||
#define jit_divr_f(rd,s1,s2) FDIVSrrr((s1), (s2), (rd))
|
||||
|
||||
#define jit_addr_d(rd,s1,s2) FADDDrrr((s1), (s2), (rd))
|
||||
#define jit_subr_d(rd,s1,s2) FSUBDrrr((s1), (s2), (rd))
|
||||
#define jit_mulr_d(rd,s1,s2) FMULDrrr((s1), (s2), (rd))
|
||||
#define jit_divr_d(rd,s1,s2) FDIVDrrr((s1), (s2), (rd))
|
||||
|
||||
#define jit_movr_f(rd,rs) FMOVSrr((rs), (rd))
|
||||
#define jit_abs_d(rd,rs) FABSSrr((rs), (rd))
|
||||
#define jit_negr_d(rd,rs) FNEGSrr((rs), (rd))
|
||||
#define jit_sqrt_d(rd,rs) FSQRTSrr((rs), (rd))
|
||||
#define jit_movr_d(rd,rs) FMOVDrr((rs), (rd))
|
||||
#define jit_abs_f(rd,rs) FABSDrr((rs), (rd))
|
||||
#define jit_negr_f(rd,rs) FNEGDrr((rs), (rd))
|
||||
#define jit_sqrt_f(rd,rs) FSQRTDrr((rs), (rd))
|
||||
#define jit_extr_f_d(rs, rd) FSTODrr((rs), (rd))
|
||||
#define jit_extr_d_f(rs, rd) FDTOSrr((rs), (rd))
|
||||
|
||||
#define jit_movi_f(rd,immf) \
|
||||
do { \
|
||||
float _v = (immf); \
|
||||
_1(_jit.x.pc + 3), LDFmr(_Ro(7), 8, (rd)); \
|
||||
memcpy(_jit.x.uc_pc, &_v, sizeof (float)); \
|
||||
_jit.x.uc_pc += sizeof (float); \
|
||||
} while(0)
|
||||
|
||||
#define jit_movi_d(rd,immd) \
|
||||
do { \
|
||||
double _v = (immd); \
|
||||
if ((long)_jit.x.pc & 4) NOP(); \
|
||||
_1(_jit.x.pc + 4); \
|
||||
LDDFmr(_Ro(7), 8, (rd)); \
|
||||
memcpy(_jit.x.uc_pc, &_v, sizeof (double)); \
|
||||
_jit.x.uc_pc += sizeof (double); \
|
||||
} while(0)
|
||||
|
||||
|
||||
#define jit_ldxi_f(rd, rs, is) jit_chk_imm((is), LDFmr((rs), (is), (rd)), LDFxr((rs), JIT_BIG, (rd)))
|
||||
#define jit_ldxi_d(rd, rs, is) jit_chk_imm((is), LDDFmr((rs), (is), (rd)), LDDFxr((rs), JIT_BIG, (rd)))
|
||||
#define jit_ldxr_f(rd, s1, s2) LDFxr((s1), (s2), (rd))
|
||||
#define jit_ldxr_d(rd, s1, s2) LDDFxr((s1), (s2), (rd))
|
||||
#define jit_stxi_f(id, rd, rs) jit_chk_imm((id), STFrm((rs), (rd), (id)), STFrx((rs), (rd), JIT_BIG))
|
||||
#define jit_stxi_d(id, rd, rs) jit_chk_imm((id), STDFrm((rs), (rd), (id)), STDFrx((rs), (rd), JIT_BIG))
|
||||
#define jit_stxr_f(d1, d2, rs) STFrx((rs), (d1), (d2))
|
||||
#define jit_stxr_d(d1, d2, rs) STDFrx((rs), (d1), (d2))
|
||||
|
||||
#define jit_truncr_f_i(rd, rs) ( \
|
||||
_1(_jit.x.pc + 3), \
|
||||
FSTOIrr((rs), JIT_FPTMP), \
|
||||
NOP(), \
|
||||
STFrm(JIT_FPTMP, _Ro(7), 8), \
|
||||
LDmr(_Ro(7), 8, (rd)))
|
||||
|
||||
#define jit_truncr_d_i(rd, rs) ( \
|
||||
_1(_jit.x.pc + 3), \
|
||||
FDTOIrr((rs), JIT_FPTMP), \
|
||||
NOP(), \
|
||||
STFrm(JIT_FPTMP, _Ro(7), 8), \
|
||||
LDmr(_Ro(7), 8, (rd)))
|
||||
|
||||
#define jit_extr_i_d(rd, rs) (_1 (_jit.x.pc + 3), NOP(), NOP(), STrm((rs), _Ro(7), 8), LDFmr(_Ro(7), 8, (rd)), FITODrr((rd), (rd)))
|
||||
#define jit_extr_i_f(rd, rs) (_1 (_jit.x.pc + 3), NOP(), NOP(), STrm((rs), _Ro(7), 8), LDFmr(_Ro(7), 8, (rd)), FITOSrr((rd), (rd)))
|
||||
|
||||
#define jit_do_round_f(rd, rs, fixup, mode) do { \
|
||||
jit_movi_f (JIT_FPTMP, fixup); \
|
||||
_1(_jit.x.pc + 4); \
|
||||
SETHIir(_HI(mode << 29), JIT_BIG); \
|
||||
NOP(); \
|
||||
NOP(); \
|
||||
STFSRm(_Ro(7), 8); /* store fsr */ \
|
||||
LDmr(_Ro(7), 8, rd); \
|
||||
XORrrr(rd, JIT_BIG, JIT_BIG); /* adjust mode */ \
|
||||
STrm(JIT_BIG, _Ro(7), 12); \
|
||||
LDFSRm(_Ro(7), 12); /* load fsr */ \
|
||||
FADDSrrr ((rs), JIT_FPTMP, JIT_FPTMP); \
|
||||
LDFSRm(_Ro(7), 8); \
|
||||
FSTOIrr(JIT_FPTMP, JIT_FPTMP); \
|
||||
STFrm(JIT_FPTMP, _Ro(7), 8); \
|
||||
LDmr(_Ro(7), 8, (rd)); \
|
||||
ADDCCrrr ((rd), (rd), 0); \
|
||||
SUBXrrr ((rd), 0, (rd)); \
|
||||
} while (0);
|
||||
|
||||
#define jit_do_round_d(rd, rs, fixup, mode) do { \
|
||||
jit_movi_d (JIT_FPTMP, fixup); \
|
||||
_1(_jit.x.pc + 4); \
|
||||
SETHIir(_HI(mode << 29), JIT_BIG); \
|
||||
NOP(); \
|
||||
NOP(); \
|
||||
STFSRm(_Ro(7), 8); /* store fsr */ \
|
||||
LDmr(_Ro(7), 8, rd); \
|
||||
XORrrr(rd, JIT_BIG, JIT_BIG); /* adjust mode */ \
|
||||
STrm(JIT_BIG, _Ro(7), 12); \
|
||||
LDFSRm(_Ro(7), 12); /* load fsr */ \
|
||||
FADDDrrr ((rs), JIT_FPTMP, JIT_FPTMP); \
|
||||
LDFSRm(_Ro(7), 8); \
|
||||
FDTOIrr(JIT_FPTMP, JIT_FPTMP); \
|
||||
STFrm(JIT_FPTMP, _Ro(7), 8); \
|
||||
LDmr(_Ro(7), 8, (rd)); \
|
||||
ADDCCrrr ((rd), (rd), 0); \
|
||||
SUBXrrr ((rd), 0, (rd)); \
|
||||
} while (0);
|
||||
|
||||
#define jit_roundr_f_i(rd, rs) do { \
|
||||
jit_movi_f (JIT_FPTMP, 0.5); \
|
||||
FADDSrrr ((rs), JIT_FPTMP, JIT_FPTMP); \
|
||||
jit_truncr_f_i ((rd), JIT_FPTMP); \
|
||||
ADDCCrrr ((rd), (rd), 0); \
|
||||
SUBXrrr ((rd), 0, (rd)); \
|
||||
} while (0)
|
||||
|
||||
#define jit_roundr_d_i(rd, rs) do { \
|
||||
jit_movi_d (JIT_FPTMP, 0.5); \
|
||||
FADDDrrr ((rs), JIT_FPTMP, JIT_FPTMP); \
|
||||
jit_truncr_d_i ((rd), JIT_FPTMP); \
|
||||
ADDCCrrr ((rd), (rd), 0); \
|
||||
SUBXrrr ((rd), 0, (rd)); \
|
||||
} while (0)
|
||||
|
||||
#define jit_ceilr_f_i(rd, rs) \
|
||||
jit_do_round_f ((rd), (rs), 1.0f - FLT_EPSILON, 3)
|
||||
|
||||
#define jit_ceilr_d_i(rd, rs) \
|
||||
jit_do_round_d ((rd), (rs), 1.0 - DBL_EPSILON, 3)
|
||||
|
||||
#define jit_floorr_f_i(rd, rs) \
|
||||
jit_do_round_f ((rd), (rs), FLT_EPSILON, 2)
|
||||
|
||||
#define jit_floorr_d_i(rd, rs) \
|
||||
jit_do_round_d ((rd), (rs), DBL_EPSILON, 2)
|
||||
|
||||
#define jit_ltr_d(d, s1, s2) (FCMPDrr ((s1), (s2)), FBLi(_jit.x.pc + 3), MOVir (1, (d)), MOVir (0, (d)))
|
||||
#define jit_ltr_f(d, s1, s2) (FCMPSrr ((s1), (s2)), FBLi(_jit.x.pc + 3), MOVir (1, (d)), MOVir (0, (d)))
|
||||
#define jit_ler_d(d, s1, s2) (FCMPDrr ((s1), (s2)), FBLEi(_jit.x.pc + 3), MOVir (1, (d)), MOVir (0, (d)))
|
||||
#define jit_ler_f(d, s1, s2) (FCMPSrr ((s1), (s2)), FBLEi(_jit.x.pc + 3), MOVir (1, (d)), MOVir (0, (d)))
|
||||
#define jit_eqr_d(d, s1, s2) (FCMPDrr ((s1), (s2)), FBEi(_jit.x.pc + 3), MOVir (1, (d)), MOVir (0, (d)))
|
||||
#define jit_eqr_f(d, s1, s2) (FCMPSrr ((s1), (s2)), FBEi(_jit.x.pc + 3), MOVir (1, (d)), MOVir (0, (d)))
|
||||
#define jit_ner_d(d, s1, s2) (FCMPDrr ((s1), (s2)), FBNEi(_jit.x.pc + 3), MOVir (1, (d)), MOVir (0, (d)))
|
||||
#define jit_ner_f(d, s1, s2) (FCMPSrr ((s1), (s2)), FBNEi(_jit.x.pc + 3), MOVir (1, (d)), MOVir (0, (d)))
|
||||
#define jit_ger_d(d, s1, s2) (FCMPDrr ((s1), (s2)), FBGEi(_jit.x.pc + 3), MOVir (1, (d)), MOVir (0, (d)))
|
||||
#define jit_ger_f(d, s1, s2) (FCMPSrr ((s1), (s2)), FBGEi(_jit.x.pc + 3), MOVir (1, (d)), MOVir (0, (d)))
|
||||
#define jit_gtr_d(d, s1, s2) (FCMPDrr ((s1), (s2)), FBGi(_jit.x.pc + 3), MOVir (1, (d)), MOVir (0, (d)))
|
||||
#define jit_gtr_f(d, s1, s2) (FCMPSrr ((s1), (s2)), FBGi(_jit.x.pc + 3), MOVir (1, (d)), MOVir (0, (d)))
|
||||
#define jit_unltr_d(d, s1, s2) (FCMPDrr ((s1), (s2)), FBULi(_jit.x.pc + 3), MOVir (1, (d)), MOVir (0, (d)))
|
||||
#define jit_unltr_f(d, s1, s2) (FCMPSrr ((s1), (s2)), FBULi(_jit.x.pc + 3), MOVir (1, (d), MOVir (0, (d)))
|
||||
#define jit_unler_d(d, s1, s2) (FCMPDrr ((s1), (s2)), FBULEi(_jit.x.pc + 3), MOVir (1, (d)), MOVir (0, (d)))
|
||||
#define jit_unler_f(d, s1, s2) (FCMPSrr ((s1), (s2)), FBULEi(_jit.x.pc + 3), MOVir (1, (d)), MOVir (0, (d)))
|
||||
#define jit_uneqr_d(d, s1, s2) (FCMPDrr ((s1), (s2)), FBUEi(_jit.x.pc + 3), MOVir (1, (d)), MOVir (0, (d)))
|
||||
#define jit_uneqr_f(d, s1, s2) (FCMPSrr ((s1), (s2)), FBUEi(_jit.x.pc + 3), MOVir (1, (d)), MOVir (0, (d)))
|
||||
#define jit_ltgtr_d(d, s1, s2) (FCMPDrr ((s1), (s2)), FBLGi(_jit.x.pc + 3), MOVir (1, (d)), MOVir (0, (d)))
|
||||
#define jit_ltgtr_f(d, s1, s2) (FCMPSrr ((s1), (s2)), FBLGi(_jit.x.pc + 3), MOVir (1, (d)), MOVir (0, (d)))
|
||||
#define jit_unger_d(d, s1, s2) (FCMPDrr ((s1), (s2)), FBUGEi(_jit.x.pc + 3), MOVir (1, (d)), MOVir (0, (d)))
|
||||
#define jit_unger_f(d, s1, s2) (FCMPSrr ((s1), (s2)), FBUGEi(_jit.x.pc + 3), MOVir (1, (d)), MOVir (0, (d)))
|
||||
#define jit_ungtr_d(d, s1, s2) (FCMPDrr ((s1), (s2)), FBUGi(_jit.x.pc + 3), MOVir (1, (d)), MOVir (0, (d)))
|
||||
#define jit_ungtr_f(d, s1, s2) (FCMPSrr ((s1), (s2)), FBUGi(_jit.x.pc + 3), MOVir (1, (d)), MOVir (0, (d)))
|
||||
#define jit_ordr_d(d, s1, s2) (FCMPDrr ((s1), (s2)), FBOi(_jit.x.pc + 3), MOVir (1, (d)), MOVir (0, (d)))
|
||||
#define jit_ordr_f(d, s1, s2) (FCMPSrr ((s1), (s2)), FBOi(_jit.x.pc + 3), MOVir (1, (d)), MOVir (0, (d)))
|
||||
#define jit_unordr_d(d, s1, s2) (FCMPDrr ((s1), (s2)), FBUi(_jit.x.pc + 3), MOVir (1, (d)), MOVir (0, (d)))
|
||||
#define jit_unordr_f(d, s1, s2) (FCMPSrr ((s1), (s2)), FBUi(_jit.x.pc + 3), MOVir (1, (d)), MOVir (0, (d)))
|
||||
|
||||
#define jit_prepare_f(num) (_jitl.nextarg_put += (num))
|
||||
#define jit_prepare_d(num) (_jitl.nextarg_put += 2 * (num))
|
||||
|
||||
#define jit_arg_f() (_jitl.nextarg_get++)
|
||||
#define jit_arg_d() (_jitl.nextarg_get += _jitl.nextarg_get & 1, _jitl.nextarg_get += 2, _jitl.nextarg_get - 2)
|
||||
|
||||
#define jit_getarg_f(rd, ofs) (STrm(ofs, _Ri(6), -24), LDFmr (_Ri(6), -24, (rd)))
|
||||
#define jit_getarg_d(rd, ofs) (STDrm(ofs, _Ri(6), -24), LDDFmr (_Ri(6), -24, (rd)))
|
||||
|
||||
#define jit_pusharg_f(rs) (STFrm((rs), _Ri(6), -24), --_jitl.nextarg_put, LDmr (_Ri(6), -24, _Ro(_jitl.nextarg_put)))
|
||||
#define jit_pusharg_d(rs) (STDFrm((rs), _Ri(6), -24), _jitl.nextarg_put -= 2, LDmr (_Ri(6), -24, _Ro(_jitl.nextarg_put)))
|
||||
|
||||
#define jit_retval_f(rs) jit_movr_f(0, rs)
|
||||
#define jit_retval_d(rs) jit_movr_d(0, rs)
|
||||
|
||||
#endif /* __lightning_asm_fp_h */
|
||||
65
src/runtime/c/pgf/lightning/sparc/funcs.h
Normal file
65
src/runtime/c/pgf/lightning/sparc/funcs.h
Normal file
@@ -0,0 +1,65 @@
|
||||
/******************************** -*- C -*- ****************************
|
||||
*
|
||||
* Platform-independent layer inline functions (Sparc)
|
||||
*
|
||||
***********************************************************************/
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* Copyright 2000, 2001, 2002 Free Software Foundation, Inc.
|
||||
* Written by Paolo Bonzini.
|
||||
*
|
||||
* This file is part of GNU lightning.
|
||||
*
|
||||
* GNU lightning is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* GNU lightning 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 Lesser General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with GNU lightning; see the file COPYING.LESSER; if not, write to the
|
||||
* Free Software Foundation, 59 Temple Place - Suite 330, Boston,
|
||||
* MA 02111-1307, USA.
|
||||
*
|
||||
***********************************************************************/
|
||||
|
||||
|
||||
|
||||
#ifndef __lightning_funcs_h
|
||||
#define __lightning_funcs_h
|
||||
|
||||
#if !defined(__GNUC__) && !defined(__GNUG__)
|
||||
#error Go get GNU C, I do not know how to flush the cache
|
||||
#error with this compiler.
|
||||
#else
|
||||
/* Why doesn't this compile?!?
|
||||
* static void
|
||||
* jit_flush_code(start, end)
|
||||
* void *start;
|
||||
* void *end;
|
||||
*/
|
||||
|
||||
static void
|
||||
jit_flush_code(void* start, void* end)
|
||||
{
|
||||
#ifndef LIGHTNING_CROSS
|
||||
register char *dest;
|
||||
|
||||
__asm__ __volatile__ ("stbar");
|
||||
for (dest = (char *)start; dest <= (char *)end; dest += 4) {
|
||||
__asm__ __volatile__ ("flush %0"::"r"(dest));
|
||||
}
|
||||
|
||||
/* [SPARC Architecture Manual v8, page 139, implementation note #5] */
|
||||
__asm__ __volatile__ ("nop; nop; nop; nop; nop");
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __lightning_core_h */
|
||||
Reference in New Issue
Block a user