1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-21 11:10:21 +02:00

Add framework for sparc port.

* include/lightning/jit_sparc.h, lib/jit_sparc-cpu.c,
	lib/jit_sparc-fpu.c, lib/jit_sparc.c: New files implementing
	the basic framework of the sparc port.

	* configure.ac, include/lightning.h, include/lightning/Makefile.am,
	include/lightning/jit_private.h, lib/jit_disasm.c: Update
	for the sparc port framework.

	* lib/jit_mips.c: Correct reversed retr/reti logic.

	* lib/jit_ppc.c: Correct misspelled __LITTLE_ENDIAN.

	* lib/lightning.c: Always do byte hashing in hash_data, because
	the logic to "compress" strings causes large pointers to not
	be guaranteed aligned at 4 byte boundaries.
	  Update for the sparc port framework.
This commit is contained in:
pcpa 2013-02-18 01:18:54 -03:00
parent 12c35b7e83
commit 610a569300
15 changed files with 3511 additions and 25 deletions

View file

@ -1,3 +1,22 @@
2013-02-17 Paulo Andrade <pcpa@gnu.org>
* include/lightning/jit_sparc.h, lib/jit_sparc-cpu.c,
lib/jit_sparc-fpu.c, lib/jit_sparc.c: New files implementing
the basic framework of the sparc port.
* configure.ac, include/lightning.h, include/lightning/Makefile.am,
include/lightning/jit_private.h, lib/jit_disasm.c: Update
for the sparc port framework.
* lib/jit_mips.c: Correct reversed retr/reti logic.
* lib/jit_ppc.c: Correct misspelled __LITTLE_ENDIAN.
* lib/lightning.c: Always do byte hashing in hash_data, because
the logic to "compress" strings causes large pointers to not
be guaranteed aligned at 4 byte boundaries.
Update for the sparc port framework.
2013-02-11 Paulo Andrade <pcpa@gnu.org>
* lib/jit_arm.c: Correct jit_pushargi_f in the arm hardfp abi.

View file

@ -522,6 +522,9 @@ static void rehash(hash_t *hash);
/*
* Initialization
*/
#if __sparc__
extern int missing_count;
#endif
static jit_state_t *_jit;
static int flag_verbose;
static int flag_disasm;
@ -3994,6 +3997,11 @@ main(int argc, char *argv[])
pclose(parser.fp);
parser.fp = NULL;
#if defined(__sparc__)
if (missing_count)
flag_disasm = 1;
#endif
for (opt_short = 0; opt_index < argc; opt_short++, opt_index++)
argv[opt_short] = argv[opt_index];
argv[opt_short] = NULL;

View file

@ -75,12 +75,14 @@ case "$target_cpu" in
*arm*) cpu=arm ;;
*mips*) cpu=mips ;;
*powerpc*) cpu=ppc ;;
*sparc*) cpu=sparc ;;
*) ;;
esac
AM_CONDITIONAL(cpu_arm, [test cpu-$cpu = cpu-arm])
AM_CONDITIONAL(cpu_mips, [test cpu-$cpu = cpu-mips])
AM_CONDITIONAL(cpu_ppc, [test cpu-$cpu = cpu-ppc])
AM_CONDITIONAL(cpu_x86, [test cpu-$cpu = cpu-x86])
AM_CONDITIONAL(cpu_arm, [test cpu-$cpu = cpu-arm])
AM_CONDITIONAL(cpu_mips, [test cpu-$cpu = cpu-mips])
AM_CONDITIONAL(cpu_ppc, [test cpu-$cpu = cpu-ppc])
AM_CONDITIONAL(cpu_sparc, [test cpu-$cpu = cpu-sparc])
AM_CONDITIONAL(cpu_x86, [test cpu-$cpu = cpu-x86])
# Test x87 if both, x87 and sse2 available
ac_cv_test_x86_x87=

View file

@ -72,6 +72,8 @@ typedef jit_int32_t jit_fpr_t;
# include <lightning/jit_arm.h>
#elif defined(__ppc__)
# include <lightning/jit_ppc.h>
#elif defined(__sparc__)
# include <lightning/jit_sparc.h>
#endif
#define jit_flag_node 0x00000001 /* patch node not absolute */

View file

@ -29,6 +29,10 @@ if cpu_ppc
lightning_include_HEADERS = \
jit_ppc.h
endif
if cpu_sparc
lightning_include_HEADERS = \
jit_sparc.h
endif
if cpu_x86
lightning_include_HEADERS = \
jit_x86.h

View file

@ -70,6 +70,10 @@
# define JIT_SP _R1
# define JIT_RET _R3
# define JIT_FRET _F1
#elif defined(__sparc__)
# define JIT_SP _SP
# define JIT_RET _I0
# define JIT_FRET _F0
#endif
#define jit_size(vector) (sizeof(vector) / sizeof((vector)[0]))

View file

@ -0,0 +1,60 @@
/*
* Copyright (C) 2013 Free Software Foundation, Inc.
*
* This is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* Authors:
* Paulo Cesar Pereira de Andrade
*/
#ifndef _jit_sparc_h
#define _jit_sparc_h
#define JIT_HASH_CONSTS 1
#define JIT_NUM_OPERANDS 3
/*
* Types
*/
#define JIT_FP _FP
typedef enum {
#define jit_arg_reg_p(i) ((i) >= 0 && (i) < 6)
#define jit_r(i) (_G2 + (i))
#define jit_r_num() 6
#define jit_v(i) (_L0 + (i))
#define jit_v_num() 8
#define jit_arg_f_reg_p(i) ((i) >= 0 && (i) < 6)
#define jit_f(i) (_F0 + (i))
#define jit_f_num() 8
#define JIT_R0 _G2
#define JIT_R1 _G3
#define JIT_R2 _G4
#define JIT_V0 _L0
#define JIT_V1 _L1
#define JIT_V2 _L2
_G0, _G1, _G2, _G3, _G4, _G5, _G6, _G7,
_O0, _O1, _O2, _O3, _O4, _O5, _SP, _O7,
_L0, _L1, _L2, _L3, _L4, _L5, _L6, _L7,
_I0, _I1, _I2, _I3, _I4, _I5, _FP, _I7,
#define JIT_F0 _F0
#define JIT_F1 _F1
#define JIT_F2 _F2
#define JIT_F3 _F3
#define JIT_F4 _F4
#define JIT_F5 _F5
_F0, _F1, _F2, _F3, _F4, _F5, _F6, _F7,
#define JIT_NOREG _NOREG
_NOREG,
} jit_reg_t;
typedef jit_int64_t jit_regset_t;
#endif /* _jit_sparc_h */

View file

@ -33,6 +33,9 @@ EXTRA_DIST = \
jit_ppc.c \
jit_ppc-cpu.c \
jit_ppc-fpu.c \
jit_sparc.c \
jit_sparc-cpu.c \
jit_sparc-fpu.c \
jit_x86.c \
jit_x86-cpu.c \
jit_x86-sse.c \

View file

@ -81,6 +81,9 @@ jit_init_debug(void)
if (jit_cpu.thumb)
disasm_info.disassembler_options = "force-thumb";
# endif
# if defined(__sparc__)
disasm_info.endian = disasm_info.display_endian = BFD_ENDIAN_BIG;
#endif
disasm_info.print_address_func = disasm_print_address;
if (bfd_get_file_flags(disasm_bfd) & HAS_SYMS) {

View file

@ -180,17 +180,17 @@ _jit_ret(jit_state_t *_jit)
void
_jit_retr(jit_state_t *_jit, jit_int32_t u)
{
jit_movr(JIT_RET, u);
if (JIT_RET != u)
jit_movr(JIT_RET, u);
else
jit_live(JIT_RET);
jit_ret();
}
void
_jit_reti(jit_state_t *_jit, jit_word_t u)
{
if (JIT_RET != u)
jit_movi(JIT_RET, u);
else
jit_live(JIT_RET);
jit_movi(JIT_RET, u);
jit_ret();
}

View file

@ -322,7 +322,7 @@ _jit_getarg_uc(jit_state_t *_jit, jit_int32_t u, jit_node_t *v)
if (v->u.w < 8)
jit_extr_uc(u, JIT_RA0 - v->u.w);
else {
#if __BYTE_ORDER == __LITTLE__ENDIAN
#if __BYTE_ORDER == __LITTLE_ENDIAN
jit_ldxi_uc(u, JIT_FP, v->u.w);
#else
jit_ldxi_uc(u, JIT_FP,
@ -337,7 +337,7 @@ _jit_getarg_s(jit_state_t *_jit, jit_int32_t u, jit_node_t *v)
if (v->u.w < 8)
jit_extr_s(u, JIT_RA0 - v->u.w);
else {
#if __BYTE_ORDER == __LITTLE__ENDIAN
#if __BYTE_ORDER == __LITTLE_ENDIAN
jit_ldxi_s(u, JIT_FP, v->u.w);
#else
jit_ldxi_s(u, JIT_FP,
@ -352,7 +352,7 @@ _jit_getarg_us(jit_state_t *_jit, jit_int32_t u, jit_node_t *v)
if (v->u.w < 8)
jit_extr_us(u, JIT_RA0 - v->u.w);
else {
#if __BYTE_ORDER == __LITTLE__ENDIAN
#if __BYTE_ORDER == __LITTLE_ENDIAN
jit_ldxi_us(u, JIT_FP, v->u.w);
#else
jit_ldxi_us(u, JIT_FP,
@ -367,7 +367,7 @@ _jit_getarg_i(jit_state_t *_jit, jit_int32_t u, jit_node_t *v)
if (v->u.w < 8)
jit_movr(u, JIT_RA0 - v->u.w);
else {
#if __BYTE_ORDER == __LITTLE__ENDIAN
#if __BYTE_ORDER == __LITTLE_ENDIAN
jit_ldxi_i(u, JIT_FP, v->u.w);
#else
jit_ldxi_i(u, JIT_FP,
@ -383,7 +383,7 @@ _jit_getarg_ui(jit_state_t *_jit, jit_int32_t u, jit_node_t *v)
if (v->u.w < 8)
jit_extr_ui(u, JIT_RA0 - v->u.w);
else {
# if __BYTE_ORDER == __LITTLE__ENDIAN
# if __BYTE_ORDER == __LITTLE_ENDIAN
jit_ldxi_ui(u, JIT_FP, v->u.w);
# else
jit_ldxi_ui(u, JIT_FP,

1535
lib/jit_sparc-cpu.c Normal file

File diff suppressed because it is too large Load diff

689
lib/jit_sparc-fpu.c Normal file
View file

@ -0,0 +1,689 @@
/*
* Copyright (C) 2013 Free Software Foundation, Inc.
*
* This is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* Authors:
* Paulo Cesar Pereira de Andrade
*/
#if PROTO
# define LDF(rs1, rs2, rd) f3r(3, rd, 32, rs1, rs2)
# define LDFI(rs1, imm, rd) f3i(3, rd, 32, rs1, imm)
# define LDDF(rs1, rs2, rd) f3r(3, rd, 35, rs1, rs2)
# define LDDFI(rs1, imm, rd) f3i(3, rd, 35, rs1, imm)
# define LDFSR(rs1, rs2, rd) f3r(3, rd, 33, rs1, rs2)
# define LDFSRI(rs1, imm, rd) f3i(3, rd, 33, rs1, imm)
# define STF(rd, rs1, rs2) f3r(3, rd, 36, rs1, rs2)
# define STFI(rd, rs1, imm) f3i(3, rd, 36, rs1, imm)
# define STDF(rd, rs1, rs2) f3r(3, rd, 39, rs1, rs2)
# define STDFI(rd, rs1, imm) f3i(3, rd, 39, rs1, imm)
# define STFSR(rd, rs1, rs2) f3r(3, rd, 37, rs1, rs2)
# define STFSRI(rd, rs1, imm) f3i(3, rd, 37, rs1, imm)
# define STDFQ(rd, rs1, rs2) f3r(3, rd, 38, rs1, rs2)
# define STFDFQ(rd, rs1, imm) f3i(3, rd, 38, rs1, imm)
# define SPARC_FBA 8 /* always - 1 */
# define SPARC_FBN 0 /* never - 0 */
# define SPARC_FBU 7 /* unordered - U */
# define SPARC_FBG 6 /* greater - G */
# define SPARC_FBUG 5 /* unordered or greater - G or U */
# define SPARC_FBL 4 /* less - L */
# define SPARC_FBUL 5 /* unordered or less - L or U */
# define SPARC_FBLG 2 /* less or greater - L or G */
# define SPARC_FBNE 1 /* not equal - L or G or U */
# define SPARC_FBNZ SPARC_FBNE
# define SPARC_FBE 9 /* equal - E */
# define SPARC_FBZ SPARC_FBE
# define SPARC_FBUE 10 /* unordered or equal - E or U */
# define SPARC_FBGE 11 /* greater or equal - E or G */
# define SPARC_FBUGE 12 /* unordered or greater or equal - E or G or U */
# define SPARC_FBLE 13 /* less or equal - E or L */
# define SPARC_FBULE 14 /* unordered or less or equal - E or L or U */
# define SPARC_FBO 15 /* ordered - E or L or G */
# define FB(cc, imm) f2b(0, 0, cc, 6, imm)
# define FBa(cc, imm) f2b(0, 1, cc, 6, imm)
# define FBA(imm) FB(SPARC_FBA, imm)
# define FBAa(imm) FBa(SPARC_FBA, imm)
# define FBN(imm) FB(SPARC_FBN, imm)
# define FBNa(imm) FBa(SPARC_FBN, imm)
# define FBU(imm) FB(SPARC_FBU, imm)
# define FBUa(imm) FBa(SPARC_FBU, imm)
# define FBG(imm) FB(SPARC_FBG, imm)
# define FBGa(imm) FBa(SPARC_FBG, imm)
# define FBUG(imm) FB(SPARC_FBUG, imm)
# define FBUGa(imm) FBa(SPARC_FBUG, imm)
# define FBL(imm) FB(SPARC_FBL, imm)
# define FBLa(imm) FBa(SPARC_FBL, imm)
# define FBUL(imm) FB(SPARC_FBUL, imm)
# define FBULa(imm) FBa(SPARC_FBUL, imm)
# define FBLG(imm) FB(SPARC_FBLG, imm)
# define FBLGa(imm) FBa(SPARC_FBLG, imm)
# define FBNE(imm) FB(SPARC_FBNE, imm)
# define FBNEa(imm) FBa(SPARC_FBNE, imm)
# define FBE(imm) FB(SPARC_FBE, imm)
# define FBEa(imm) FBa(SPARC_FBE, imm)
# define FBUE(imm) FB(SPARC_FBUE, imm)
# define FBUEa(imm) FBa(SPARC_FBUE, imm)
# define FBLE(imm) FB(SPARC_FBLE, imm)
# define FBLEa(imm) FBa(SPARC_FBLE, imm)
# define FBO(imm) FB(SPARC_FBO, imm)
# define FBOa(imm) FBa(SPARC_FBO, imm)
# define FPop1(rd, rs1, opf, rs2) f3f(rd, 52, rs1, opf, rs2)
# define FPop2(rd, rs1, opf, rs2) f3f(rd, 53, rs1, opf, rs2)
# define f3f(rd, op3, rs1, opf, rs2) _f3f(_jit, rd, op3, rs1, opf, rs2)
static void
_f3f(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t, jit_int32_t,jit_int32_t);
# define FITOS(rs2, rd) FPop1(rd, 0, 196, rs2)
# define FITOD(rs2, rd) FPop1(rd, 0, 200, rs2)
# define FITOQ(rs2, rd) FPop1(rd, 0, 204, rs2)
# define FSTOI(rs2, rd) FPop1(rd, 0, 209, rs2)
# define FDTOI(rs2, rd) FPop1(rd, 0, 210, rs2)
# define FQTOI(rs2, rd) FPop1(rd, 0, 211, rs2)
# define FSTOD(rs2, rd) FPop1(rd, 0, 201, rs2)
# define FSTOQ(rs2, rd) FPop1(rd, 0, 205, rs2)
# define FDTOS(rs2, rd) FPop1(rd, 0, 198, rs2)
# define FDTOQ(rs2, rd) FPop1(rd, 0, 206, rs2)
# define FQTOS(rs2, rd) FPop1(rd, 0, 199, rs2)
# define FQTOD(rs2, rd) FPop1(rd, 0, 203, rs2)
# define FMOVS(rs2, rd) FPop1(rd, 0, 1, rs2)
# define FNEGS(rs2, rd) FPop1(rd, 0, 5, rs2)
# define FABSS(rs2, rd) FPop1(rd, 0, 9, rs2)
# define FSQRTS(rs2, rd) FPop1(rd, 0, 41, rs2)
# define FSQRTD(rs2, rd) FPop1(rd, 0, 42, rs2)
# define FSQRTQ(rs2, rd) FPop1(rd, 0, 43, rs2)
# define SPARC_FADDS 65
# define SPARC_FADDD 66
# define SPARC_FADDQ 67
# define SPARC_FSUBS 69
# define SPARC_FSUBD 70
# define SPARC_FSUBQ 71
# define SPARC_FMULS 73
# define SPARC_FMULD 74
# define SPARC_FMULQ 75
# define SPARC_FSMULD 105
# define SPARC_FDMULQ 110
# define SPARC_FDIVS 77
# define SPARC_FDIVD 78
# define SPARC_FDIVQ 79
# define FADDS(rs1, rs2, rd) FPop1(rd, rs1, SPARC_FADDS, rs2)
# define FADDD(rs1, rs2, rd) FPop1(rd, rs1, SPARC_FADDD, rs2)
# define FADDQ(rs1, rs2, rd) FPop1(rd, rs1, SPARC_FADDQ, rs2)
# define FSUBS(rs1, rs2, rd) FPop1(rd, rs1, SPARC_FSUBS, rs2)
# define FSUBD(rs1, rs2, rd) FPop1(rd, rs1, SPARC_FSUBD, rs2)
# define FSUBQ(rs1, rs2, rd) FPop1(rd, rs1, SPARC_FSUBQ, rs2)
# define FMULS(rs1, rs2, rd) FPop1(rd, rs1, SPARC_FMULS, rs2)
# define FMULD(rs1, rs2, rd) FPop1(rd, rs1, SPARC_FMULD, rs2)
# define FMULQ(rs1, rs2, rd) FPop1(rd, rs1, SPARC_FMULQ, rs2)
# define FSMULD(rs1, rs2, rd) FPop1(rd, rs1, SPARC_FSMULD, rs2)
# define FDMULQ(rs1, rs2, rd) FPop1(rd, rs1, SPARC_FDMULQ, rs2)
# define FDIVS(rs1, rs2, rd) FPop1(rd, rs1, SPARC_FDIVS, rs2)
# define FDIVD(rs1, rs2, rd) FPop1(rd, rs1, SPARC_FDIVD, rs2)
# define FDIVQ(rs1, rs2, rd) FPop1(rd, rs1, SPARC_FDIVQ, rs2)
# define SPARC_FCMPS 81
# define SPARC_FCMPD 82
# define SPARC_FCMPQ 83
# define SPARC_FCMPES 85
# define SPARC_FCMPED 86
# define SPARC_FCMPEQ 87
# define FCMPS(rs1, rs2) FPop2(0, rs1, SPARC_FCMPS, rs2)
# define FCMPD(rs1, rs2) FPop2(0, rs1, SPARC_FCMPD, rs2)
# define FCMPQ(rs1, rs2) FPop2(0, rs1, SPARC_FCMPQ, rs2)
# define FCMPES(rs1, rs2) FPop2(0, rs1, SPARC_FCMPES, rs2)
# define FCMPED(rs1, rs2) FPop2(0, rs1, SPARC_FCMPED, rs2)
# define FCMPEQ(rs1, rs2) FPop2(0, rs1, SPARC_FCMPEQ, rs2)
# define CPop1(rd, rs1, opc, rs2) f3f(rd, 54, rs1, opf, rs2)
# define CPop2(rd, rs1, opc, rs2) f3f(rd, 55, rs1, opf, rs2)
# define extr_f(r0, r1) _extr_f(_jit, r0, r1)
static void _extr_f(jit_state_t*, jit_int32_t, jit_int32_t);
# define truncr_f(r0, r1) truncr_f_i(r0, r1)
# define truncr_f_i(r0, r1) _truncr_f_i(_jit, r0, r1)
static void _truncr_f_i(jit_state_t*, jit_int32_t, jit_int32_t);
# define extr_d_f(r0, r1) FSTOD(r1, r0)
# define movi_f(r0, i0) ldi_f(r0, (jit_word_t)i0)
# define movr_f(r0, r1) FMOVS(r1, r0)
# define negr_f(r0, r1) FNEGS(r1, r0)
# define absr_f(r0, r1) FABSS(r1, r0)
# define sqrtr_f(r0, r1) FSQRTS(r1, r0)
# define extr_d(r0, r1) _extr_d(_jit, r0, r1)
static void _extr_d(jit_state_t*, jit_int32_t, jit_int32_t);
# define truncr_d(r0, r1) truncr_d_i(r0, r1)
# define truncr_d_i(r0, r1) _truncr_d_i(_jit, r0, r1)
static void _truncr_d_i(jit_state_t*, jit_int32_t, jit_int32_t);
# define extr_f_d(r0, r1) FDTOS(r1, r0)
# define movi_d(r0, i0) ldi_d(r0, (jit_word_t)i0)
# define movr_d(r0, r1) _movr_d(_jit, r0, r1)
static void _movr_d(jit_state_t*, jit_int32_t, jit_int32_t);
# define negr_d(r0, r1) _negr_d(_jit, r0, r1)
static void _negr_d(jit_state_t*, jit_int32_t, jit_int32_t);
# define absr_d(r0, r1) _absr_d(_jit, r0, r1)
static void _absr_d(jit_state_t*, jit_int32_t, jit_int32_t);
# define sqrtr_d(r0, r1) FSQRTD(r1, r0)
# define fop1f(op, r0, r1, i0) _fop1f(_jit, op, r0, r1, i0)
static void _fop1f(jit_state_t*,jit_int32_t,
jit_int32_t,jit_int32_t,jit_float32_t*);
# define fop1d(op, r0, r1, i0) _fop1d(_jit, op, r0, r1, i0)
static void _fop1d(jit_state_t*,jit_int32_t,
jit_int32_t,jit_int32_t,jit_float64_t*);
# define addr_f(r0, r1, r2) FADDS(r1, r2, r0)
# define addi_f(r0, r1, i0) fop1f(SPARC_FADDS, r0, r1, i0)
# define subr_f(r0, r1, r2) FSUBS(r1, r2, r0)
# define subi_f(r0, r1, i0) fop1f(SPARC_FSUBS, r0, r1, i0)
# define mulr_f(r0, r1, r2) FMULS(r1, r2, r0)
# define muli_f(r0, r1, i0) fop1f(SPARC_FMULS, r0, r1, i0)
# define divr_f(r0, r1, r2) FDIVS(r1, r2, r0)
# define divi_f(r0, r1, i0) fop1f(SPARC_FDIVS, r0, r1, i0)
# define addr_d(r0, r1, r2) FADDD(r1, r2, r0)
# define addi_d(r0, r1, i0) fop1d(SPARC_FADDD, r0, r1, i0)
# define subr_d(r0, r1, r2) FSUBD(r1, r2, r0)
# define subi_d(r0, r1, i0) fop1d(SPARC_FSUBD, r0, r1, i0)
# define mulr_d(r0, r1, r2) FMULD(r1, r2, r0)
# define muli_d(r0, r1, i0) fop1d(SPARC_FMULD, r0, r1, i0)
# define divr_d(r0, r1, r2) FDIVD(r1, r2, r0)
# define divi_d(r0, r1, i0) fop1d(SPARC_FDIVD, r0, r1, i0)
#define fcr(cc, r0, r1, r2) _fcr(_jit, cc, r0, r1, r2)
static void _fcr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t);
#define fcw(cc, r0, r1, i0) _fcw(_jit, cc, r0, r1, i0)
static void
_fcw(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t,jit_float32_t*);
# define ltr_f(r0, r1, r2) fcr(SPARC_FBL, r0, r1, r2)
# define lti_f(r0, r1, i0) fcw(SPARC_FBL, r0, r1, i0)
# define ler_f(r0, r1, r2) fcr(SPARC_FBLE, r0, r1, r2)
# define lei_f(r0, r1, i0) fcw(SPARC_FBLE, r0, r1, i0)
# define eqr_f(r0, r1, r2) fcr(SPARC_FBE, r0, r1, r2)
# define eqi_f(r0, r1, i0) fcw(SPARC_FBE, r0, r1, i0)
# define ger_f(r0, r1, r2) fcr(SPARC_FBGE, r0, r1, r2)
# define gei_f(r0, r1, i0) fcw(SPARC_FBGE, r0, r1, i0)
# define gtr_f(r0, r1, r2) fcr(SPARC_FBG, r0, r1, r2)
# define gti_f(r0, r1, i0) fcw(SPARC_FBG, r0, r1, i0)
# define ner_f(r0, r1, r2) fcr(SPARC_FBNE, r0, r1, r2)
# define nei_f(r0, r1, i0) fcw(SPARC_FBNE, r0, r1, i0)
# define unltr_f(r0, r1, r2) fcr(SPARC_FBUL, r0, r1, r2)
# define unlti_f(r0, r1, i0) fcw(SPARC_FBUL, r0, r1, i0)
# define unler_f(r0, r1, r2) fcr(SPARC_FBULE, r0, r1, r2)
# define unlei_f(r0, r1, i0) fcw(SPARC_FBULE, r0, r1, i0)
# define uneqr_f(r0, r1, r2) fcr(SPARC_FBUE, r0, r1, r2)
# define uneqi_f(r0, r1, i0) fcw(SPARC_FBUE, r0, r1, i0)
# define unger_f(r0, r1, r2) fcr(SPARC_FBUGE, r0, r1, r2)
# define ungei_f(r0, r1, i0) fcw(SPARC_FBUGE, r0, r1, i0)
# define ungtr_f(r0, r1, r2) fcr(SPARC_FBUG, r0, r1, r2)
# define ungti_f(r0, r1, i0) fcw(SPARC_FBUG, r0, r1, i0)
# define ltgtr_f(r0, r1, r2) fcr(SPARC_FBLG, r0, r1, r2)
# define ltgti_f(r0, r1, i0) fcw(SPARC_FBLG, r0, r1, i0)
# define ordr_f(r0, r1, r2) fcr(SPARC_FBO, r0, r1, r2)
# define ordi_f(r0, r1, i0) fcw(SPARC_FBO, r0, r1, i0)
# define unordr_f(r0, r1, r2) fcr(SPARC_FBU, r0, r1, r2)
# define unordi_f(r0, r1, i0) fcw(SPARC_FBU, r0, r1, i0)
#define dcr(cc, r0, r1, r2) _dcr(_jit, cc, r0, r1, r2)
static void _dcr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t,jit_int32_t);
#define dcw(cc, r0, r1, i0) _dcw(_jit, cc, r0, r1, i0)
static void
_dcw(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t,jit_float64_t*);
# define ltr_d(r0, r1, r2) dcr(SPARC_FBL, r0, r1, r2)
# define lti_d(r0, r1, i0) dcw(SPARC_FBL, r0, r1, i0)
# define ler_d(r0, r1, r2) dcr(SPARC_FBLE, r0, r1, r2)
# define lei_d(r0, r1, i0) dcw(SPARC_FBLE, r0, r1, i0)
# define eqr_d(r0, r1, r2) dcr(SPARC_FBE, r0, r1, r2)
# define eqi_d(r0, r1, i0) dcw(SPARC_FBE, r0, r1, i0)
# define ger_d(r0, r1, r2) dcr(SPARC_FBGE, r0, r1, r2)
# define gei_d(r0, r1, i0) dcw(SPARC_FBGE, r0, r1, i0)
# define gtr_d(r0, r1, r2) dcr(SPARC_FBG, r0, r1, r2)
# define gti_d(r0, r1, i0) dcw(SPARC_FBG, r0, r1, i0)
# define ner_d(r0, r1, r2) dcr(SPARC_FBNE, r0, r1, r2)
# define nei_d(r0, r1, i0) dcw(SPARC_FBNE, r0, r1, i0)
# define unltr_d(r0, r1, r2) dcr(SPARC_FBUL, r0, r1, r2)
# define unlti_d(r0, r1, i0) dcw(SPARC_FBUL, r0, r1, i0)
# define unler_d(r0, r1, r2) dcr(SPARC_FBULE, r0, r1, r2)
# define unlei_d(r0, r1, i0) dcw(SPARC_FBULE, r0, r1, i0)
# define uneqr_d(r0, r1, r2) dcr(SPARC_FBUE, r0, r1, r2)
# define uneqi_d(r0, r1, i0) dcw(SPARC_FBUE, r0, r1, i0)
# define unger_d(r0, r1, r2) dcr(SPARC_FBUGE, r0, r1, r2)
# define ungei_d(r0, r1, i0) dcw(SPARC_FBUGE, r0, r1, i0)
# define ungtr_d(r0, r1, r2) dcr(SPARC_FBUG, r0, r1, r2)
# define ungti_d(r0, r1, i0) dcw(SPARC_FBUG, r0, r1, i0)
# define ltgtr_d(r0, r1, r2) dcr(SPARC_FBLG, r0, r1, r2)
# define ltgti_d(r0, r1, i0) dcw(SPARC_FBLG, r0, r1, i0)
# define ordr_d(r0, r1, r2) dcr(SPARC_FBO, r0, r1, r2)
# define ordi_d(r0, r1, i0) dcw(SPARC_FBO, r0, r1, i0)
# define unordr_d(r0, r1, r2) dcr(SPARC_FBU, r0, r1, r2)
# define unordi_d(r0, r1, i0) dcw(SPARC_FBU, r0, r1, i0)
# define ldr_f(r0, r1) LDF(r1, 0, r0)
# define ldi_f(r0, i0) _ldi_f(_jit, r0, i0)
static void _ldi_f(jit_state_t*,jit_int32_t,jit_word_t);
# define ldxr_f(r0, r1, r2) LDF(r1, r2, r0)
# define ldxi_f(r0, r1, i0) _ldxi_f(_jit, r0, r1, i0)
static void _ldxi_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
# define str_f(r0, r1) STF(r1, r0, 0)
# define sti_f(r0, i0) _sti_f(_jit, r0, i0)
static void _sti_f(jit_state_t*,jit_int32_t,jit_word_t);
# define stxr_f(r0, r1, r2) STF(r2, r1, r0)
# define stxi_f(r0, r1, i0) _stxi_f(_jit, r0, r1, i0)
static void _stxi_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
# define ldr_d(r0, r1) LDDF(r1, 0, r0)
# define ldi_d(r0, i0) _ldi_d(_jit, r0, i0)
static void _ldi_d(jit_state_t*,jit_int32_t,jit_word_t);
# define ldxr_d(r0, r1, r2) LDDF(r1, r2, r0)
# define ldxi_d(r0, r1, i0) _ldxi_d(_jit, r0, r1, i0)
static void _ldxi_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
# define str_d(r0, r1) STDF(r1, r0, 0)
# define sti_d(r0, i0) _sti_d(_jit, r0, i0)
static void _sti_d(jit_state_t*,jit_int32_t,jit_word_t);
# define stxr_d(r0, r1, r2) STDF(r2, r1, r0)
# define stxi_d(r0, r1, i0) _stxi_d(_jit, r0, r1, i0)
static void _stxi_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
# define fbr(cc, i0, r0, r1) _fbr(_jit, cc, i0, r0, r1)
static jit_word_t
_fbr(jit_state_t*,jit_int32_t,jit_word_t,jit_int32_t,jit_int32_t);
# define fbw(cc, i0, r0, i1) _fbw(_jit, cc, i0, r0, i1)
static jit_word_t
_fbw(jit_state_t*,jit_int32_t,jit_word_t,jit_int32_t,jit_float32_t*);
# define bltr_f(i0, r0, r1) fbr(SPARC_FBL, i0, r0, r1)
# define blti_f(i0, r0, i1) fbw(SPARC_FBL, i0, r0, i1)
# define bler_f(i0, r0, r1) fbr(SPARC_FBLE, i0, r0, r1)
# define blei_f(i0, r0, i1) fbw(SPARC_FBLE, i0, r0, i1)
# define beqr_f(i0, r0, r1) fbr(SPARC_FBE, i0, r0, r1)
# define beqi_f(i0, r0, i1) fbw(SPARC_FBE, i0, r0, i1)
# define bger_f(i0, r0, r1) fbr(SPARC_FBGE, i0, r0, r1)
# define bgei_f(i0, r0, i1) fbw(SPARC_FBGE, i0, r0, i1)
# define bgtr_f(i0, r0, r1) fbr(SPARC_FBG, i0, r0, r1)
# define bgti_f(i0, r0, i1) fbw(SPARC_FBG, i0, r0, i1)
# define bner_f(i0, r0, r1) fbr(SPARC_FBNE, i0, r0, r1)
# define bnei_f(i0, r0, i1) fbw(SPARC_FBNE, i0, r0, i1)
# define bunltr_f(i0, r0, r1) fbr(SPARC_FBUL, i0, r0, r1)
# define bunlti_f(i0, r0, i1) fbw(SPARC_FBUL, i0, r0, i1)
# define bunler_f(i0, r0, r1) fbr(SPARC_FBULE, i0, r0, r1)
# define bunlei_f(i0, r0, i1) fbw(SPARC_FBULE, i0, r0, i1)
# define buneqr_f(i0, r0, r1) fbr(SPARC_FBUE, i0, r0, r1)
# define buneqi_f(i0, r0, i1) fbw(SPARC_FBUE, i0, r0, i1)
# define bunger_f(i0, r0, r1) fbr(SPARC_FBUGE, i0, r0, r1)
# define bungei_f(i0, r0, i1) fbw(SPARC_FBUGE, i0, r0, i1)
# define bungtr_f(i0, r0, r1) fbr(SPARC_FBUG, i0, r0, r1)
# define bungti_f(i0, r0, i1) fbw(SPARC_FBUG, i0, r0, i1)
# define bltgtr_f(i0, r0, r1) fbr(SPARC_FBLG, i0, r0, r1)
# define bltgti_f(i0, r0, i1) fbw(SPARC_FBLG, i0, r0, i1)
# define bordr_f(i0, r0, r1) fbr(SPARC_FBO, i0, r0, r1)
# define bordi_f(i0, r0, i1) fbw(SPARC_FBO, i0, r0, i1)
# define bunordr_f(i0, r0, r1) fbr(SPARC_FBU, i0, r0, r1)
# define bunordi_f(i0, r0, i1) fbw(SPARC_FBU, i0, r0, i1)
# define dbr(cc, i0, r0, r1) _dbr(_jit, cc, i0, r0, r1)
static jit_word_t
_dbr(jit_state_t*,jit_int32_t,jit_word_t,jit_int32_t,jit_int32_t);
# define dbw(cc, i0, r0, i1) _dbw(_jit, cc, i0, r0, i1)
static jit_word_t
_dbw(jit_state_t*,jit_int32_t,jit_word_t,jit_int32_t,jit_float64_t*);
# define bltr_d(i0, r0, r1) dbr(SPARC_FBL, i0, r0, r1)
# define blti_d(i0, r0, i1) dbw(SPARC_FBL, i0, r0, i1)
# define bler_d(i0, r0, r1) dbr(SPARC_FBLE, i0, r0, r1)
# define blei_d(i0, r0, i1) dbw(SPARC_FBLE, i0, r0, i1)
# define beqr_d(i0, r0, r1) dbr(SPARC_FBE, i0, r0, r1)
# define beqi_d(i0, r0, i1) dbw(SPARC_FBE, i0, r0, i1)
# define bger_d(i0, r0, r1) dbr(SPARC_FBGE, i0, r0, r1)
# define bgei_d(i0, r0, i1) dbw(SPARC_FBGE, i0, r0, i1)
# define bgtr_d(i0, r0, r1) dbr(SPARC_FBG, i0, r0, r1)
# define bgti_d(i0, r0, i1) dbw(SPARC_FBG, i0, r0, i1)
# define bner_d(i0, r0, r1) dbr(SPARC_FBNE, i0, r0, r1)
# define bnei_d(i0, r0, i1) dbw(SPARC_FBNE, i0, r0, i1)
# define bunltr_d(i0, r0, r1) dbr(SPARC_FBUL, i0, r0, r1)
# define bunlti_d(i0, r0, i1) dbw(SPARC_FBUL, i0, r0, i1)
# define bunler_d(i0, r0, r1) dbr(SPARC_FBULE, i0, r0, r1)
# define bunlei_d(i0, r0, i1) dbw(SPARC_FBULE, i0, r0, i1)
# define buneqr_d(i0, r0, r1) dbr(SPARC_FBUE, i0, r0, r1)
# define buneqi_d(i0, r0, i1) dbw(SPARC_FBUE, i0, r0, i1)
# define bunger_d(i0, r0, r1) dbr(SPARC_FBUGE, i0, r0, r1)
# define bungei_d(i0, r0, i1) dbw(SPARC_FBUGE, i0, r0, i1)
# define bungtr_d(i0, r0, r1) dbr(SPARC_FBUG, i0, r0, r1)
# define bungti_d(i0, r0, i1) dbw(SPARC_FBUG, i0, r0, i1)
# define bltgtr_d(i0, r0, r1) dbr(SPARC_FBLG, i0, r0, r1)
# define bltgti_d(i0, r0, i1) dbw(SPARC_FBLG, i0, r0, i1)
# define bordr_d(i0, r0, r1) dbr(SPARC_FBO, i0, r0, r1)
# define bordi_d(i0, r0, i1) dbw(SPARC_FBO, i0, r0, i1)
# define bunordr_d(i0, r0, r1) dbr(SPARC_FBU, i0, r0, r1)
# define bunordi_d(i0, r0, i1) dbw(SPARC_FBU, i0, r0, i1)
#endif
#if CODE
static void
_f3f(jit_state_t *_jit, jit_int32_t rd,
jit_int32_t op3, jit_int32_t rs1, jit_int32_t opf, jit_int32_t rs2)
{
jit_instr_t v;
assert(!(rd & 0xffffffe0));
assert(!(op3 & 0xffffffc0));
assert(!(rs1 & 0xffffffe0));
assert(!(opf & 0xfffffe00));
assert(!(rs2 & 0xffffffe0));
v.op.b = 2;
v.rd.b = rd;
v.op3.b = op3;
v.rs1.b = rs1;
v.opf.b = opf;
v.rs2.b = rs2;
ii(v.v);
}
static void
_movr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
assert(!(r0 & 1));
assert(!(r1 & 1));
if (r0 != r1) {
FMOVS(r1, r0);
FMOVS(r1 + 1, r0 + 1);
}
}
static void
_negr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
assert(!(r0 & 1));
assert(!(r1 & 1));
FNEGS(r1, r0);
if (r0 != r1)
FMOVS(r1 + 1, r0 + 1);
}
static void
_absr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
assert(!(r0 & 1));
assert(!(r1 & 1));
FABSS(r1, r0);
if (r0 != r1)
FMOVS(r1 + 1, r0 + 1);
}
static void
_fop1f(jit_state_t *_jit, jit_int32_t op,
jit_int32_t r0, jit_int32_t r1, jit_float32_t *i0)
{
jit_int32_t reg;
reg = jit_get_reg(jit_class_gpr);
movi_f(rn(reg), i0);
FPop1(r0, r1, op, rn(reg));
jit_unget_reg(reg);
}
static void
_fop1d(jit_state_t *_jit, jit_int32_t op,
jit_int32_t r0, jit_int32_t r1, jit_float64_t *i0)
{
jit_int32_t reg;
reg = jit_get_reg(jit_class_gpr);
movi_d(rn(reg), i0);
FPop1(r0, r1, op, rn(reg));
jit_unget_reg(reg);
}
static void
_extr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
stxi(-8, _FP_REGNO, r1);
ldxi_f(r0, _FP_REGNO, -8);
FITOS(r0, r0);
}
static void
_truncr_f_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
jit_int32_t reg;
reg = jit_get_reg(jit_class_gpr);
FSTOI(r1, rn(reg));
stxi_f(-8, _FP_REGNO, rn(reg));
ldxi_i(r0, _FP_REGNO, -8);
jit_unget_reg(reg);
}
static void
_fcr(jit_state_t *_jit, jit_int32_t cc,
jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
{
FCMPS(r1, r2);
FBa(cc, 3);
movi(r0, 1);
movi(r0, 0);
}
static void
_fcw(jit_state_t *_jit, jit_int32_t cc,
jit_int32_t r0, jit_int32_t r1, jit_float32_t *i0)
{
jit_int32_t reg;
reg = jit_get_reg(jit_class_fpr);
movi_f(rn(reg), i0);
FCMPS(r1, rn(reg));
jit_unget_reg(reg);
FBa(cc, 3);
movi(r0, 1);
movi(r0, 0);
}
static void
_dcr(jit_state_t *_jit, jit_int32_t cc,
jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
{
FCMPD(r1, r2);
FBa(cc, 3);
movi(r0, 1);
movi(r0, 0);
}
static void
_dcw(jit_state_t *_jit, jit_int32_t cc,
jit_int32_t r0, jit_int32_t r1, jit_float64_t *i0)
{
jit_int32_t reg;
reg = jit_get_reg(jit_class_fpr);
movi_d(rn(reg), i0);
FCMPD(r1, rn(reg));
jit_unget_reg(reg);
FBa(cc, 3);
movi(r0, 1);
movi(r0, 0);
}
static void
_ldi_f(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
{
jit_int32_t reg;
if (s13_p(i0))
LDFI(0, i0, r0);
else {
reg = jit_get_reg(jit_class_gpr);
movi(rn(reg), i0);
ldr_f(r0, rn(reg));
jit_unget_reg(reg);
}
}
static void
_ldxi_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
{
jit_int32_t reg;
if (s13_p(i0))
LDFI(r1, i0, r0);
else {
reg = jit_get_reg(jit_class_gpr);
movi(rn(reg), i0);
ldxr_f(r0, r1, rn(reg));
jit_unget_reg(reg);
}
}
static void
_sti_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
{
jit_int32_t reg;
if (s13_p(i0))
STFI(r0, 0, i0);
else {
reg = jit_get_reg(jit_class_gpr);
movi(rn(reg), i0);
str_f(rn(reg), r0);
jit_unget_reg(reg);
}
}
static void
_stxi_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
{
jit_int32_t reg;
if (s13_p(i0))
STFI(r1, r0, i0);
else {
reg = jit_get_reg(jit_class_gpr);
movi(rn(reg), i0);
stxr_f(rn(reg), r0, r1);
jit_unget_reg(reg);
}
}
static void
_extr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
stxi(-4, _FP_REGNO, r1);
stxi(-8, _FP_REGNO, 0);
ldxi_d(r0, _FP_REGNO, -8);
FITOD(r0, r0);
}
static void
_truncr_d_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
jit_int32_t reg;
reg = jit_get_reg(jit_class_gpr);
FDTOI(r1, rn(reg));
stxi_d(-8, _FP_REGNO, rn(reg));
ldxi_i(r0, _FP_REGNO, -4);
jit_unget_reg(reg);
}
static void
_ldi_d(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
{
jit_int32_t reg;
if (s13_p(i0))
LDDFI(0, i0, r0);
else {
reg = jit_get_reg(jit_class_gpr);
movi(rn(reg), i0);
ldr_d(r0, rn(reg));
jit_unget_reg(reg);
}
}
static void
_ldxi_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
{
jit_int32_t reg;
if (s13_p(i0))
LDDFI(r1, i0, r0);
else {
reg = jit_get_reg(jit_class_gpr);
movi(rn(reg), i0);
ldxr_d(r0, r1, rn(reg));
jit_unget_reg(reg);
}
}
static void
_sti_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
{
jit_int32_t reg;
if (s13_p(i0))
STDFI(r0, 0, i0);
else {
reg = jit_get_reg(jit_class_gpr);
movi(rn(reg), i0);
str_d(rn(reg), r0);
jit_unget_reg(reg);
}
}
static void
_stxi_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
{
jit_int32_t reg;
if (s13_p(i0))
STDFI(r1, r0, i0);
else {
reg = jit_get_reg(jit_class_gpr);
movi(rn(reg), i0);
stxr_d(rn(reg), r0, r1);
jit_unget_reg(reg);
}
}
static jit_word_t
_fbr(jit_state_t *_jit, jit_int32_t cc,
jit_word_t i0, jit_int32_t r0,jit_int32_t r1)
{
jit_word_t w;
FCMPS(r0, r1);
w = _jit->pc.w;
FB(cc, ((i0 - w) >> 2) - 1);
NOP();
return (w);
}
static jit_word_t
_fbw(jit_state_t *_jit, jit_int32_t cc,
jit_word_t i0, jit_int32_t r0, jit_float32_t *i1)
{
jit_word_t w;
jit_int32_t reg;
reg = jit_get_reg(jit_class_fpr);
movi_f(rn(reg), i1);
FCMPS(r0, rn(reg));
jit_unget_reg(reg);
w = _jit->pc.w;
FB(cc, ((i0 - w) >> 2) - 1);
NOP();
return (w);
}
static jit_word_t
_dbr(jit_state_t *_jit, jit_int32_t cc,
jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
{
jit_word_t w;
FCMPD(r0, r1);
w = _jit->pc.w;
FB(cc, ((i0 - w) >> 2) - 1);
NOP();
return (w);
}
static jit_word_t
_dbw(jit_state_t *_jit, jit_int32_t cc,
jit_word_t i0, jit_int32_t r0, jit_float64_t *i1)
{
jit_word_t w;
jit_int32_t reg;
reg = jit_get_reg(jit_class_fpr);
movi_d(rn(reg), i1);
FCMPD(r0, rn(reg));
jit_unget_reg(reg);
w = _jit->pc.w;
FB(cc, ((i0 - w) >> 2) - 1);
NOP();
return (w);
}
#endif

1163
lib/jit_sparc.c Normal file

File diff suppressed because it is too large Load diff

View file

@ -302,18 +302,10 @@ _jit_load(jit_state_t *_jit, jit_int32_t reg)
static jit_word_t
hash_data(jit_pointer_t data, jit_word_t length)
{
jit_uint8_t *ptr;
jit_word_t i, key;
union {
jit_uint8_t *c;
jit_word_t *w;
jit_pointer_t p;
} ptr;
for (i = 0, key = 0, ptr.p = data; i < length / sizeof(jit_word_t); i++)
key = (key << (key & 1)) ^ ptr.w[i];
for (i *= sizeof(jit_word_t); i < length; i++)
key = (key << (key & 1)) ^ ptr.c[i];
for (i = key = 0, ptr = data; i < length; i++)
key = (key << (key & 1)) ^ ptr[i];
return (key);
}
@ -2608,4 +2600,6 @@ _patch_register(jit_state_t *_jit, jit_node_t *node, jit_node_t *link,
# include "jit_arm.c"
#elif defined(__ppc__)
# include "jit_ppc.c"
#elif defined(__sparc__)
# include "jit_sparc.c"
#endif