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

New s390x port built on the hercules emulator and fedora 16 image.

* include/lightning/jit_s390x.h, lib/jit_s390x-cpu.c,
	lib/jit_s390x-fpu.c, lib/jit_s390x.c: New files
	implementing the new s390x port.

	* configure.ac, include/lightning.h,
	include/lightning/Makefile.am,
	include/lightning/jit_private.h,
	lib/Makefile.am, lib/jit_disasm.c, lib/lightning.c:
	Minor adaptation for the new s390x backend.

	* check/float.tst: Update for the s390x result of
	truncating +Inf to integer.

	* check/qalu_mul.tst: Add extra test cases to better test
	high word of signed multiplication as the result is
	adjust from unsigned multiplication on s390x.
This commit is contained in:
pcpa 2013-07-28 14:13:39 -03:00
parent a3891adb4b
commit f6ee396ccb
14 changed files with 5994 additions and 2 deletions

View file

@ -1,3 +1,22 @@
2013-07-28 Paulo Andrade <pcpa@gnu.org>
* include/lightning/jit_s390x.h, lib/jit_s390x-cpu.c,
lib/jit_s390x-fpu.c, lib/jit_s390x.c: New files
implementing the new s390x port.
* configure.ac, include/lightning.h,
include/lightning/Makefile.am,
include/lightning/jit_private.h,
lib/Makefile.am, lib/jit_disasm.c, lib/lightning.c:
Minor adaptation for the new s390x backend.
* check/float.tst: Update for the s390x result of
truncating +Inf to integer.
* check/qalu_mul.tst: Add extra test cases to better test
high word of signed multiplication as the result is
adjust from unsigned multiplication on s390x.
2013-07-28 Paulo Andrade <pcpa@gnu.org> 2013-07-28 Paulo Andrade <pcpa@gnu.org>
* check/lightning.c: Do not assume casting a double NaN or * check/lightning.c: Do not assume casting a double NaN or

View file

@ -21,7 +21,7 @@ ok:
#else #else
# define wnan x80 # define wnan x80
#endif #endif
#if __mips__ || __arm__ || __ppc__ || __sparc__ || __hppa__ || __aarch64__ #if __mips__ || __arm__ || __ppc__ || __sparc__ || __hppa__ || __aarch64__ || __s390x__
# define wpinf x7f # define wpinf x7f
#else #else
# define wpinf x80 # define wpinf x80

View file

@ -12,10 +12,16 @@
QMUL(4, 0x7ffff, 0x7ffff, 0xfff00001, 0x3f) QMUL(4, 0x7ffff, 0x7ffff, 0xfff00001, 0x3f)
UQMUL(5, 0xffffff, 0xffffff, 0xfe000001, 0xffff) UQMUL(5, 0xffffff, 0xffffff, 0xfe000001, 0xffff)
QMUL(6, 0x80000000, -2, 0, 1) QMUL(6, 0x80000000, -2, 0, 1)
QMUL(7, 0x80000000, 2, 0, -1)
QMUL(8, 0x80000001, 3, 0x80000003, -2)
QMUL(9, 0x80000001, -3, 0x7ffffffd, 1)
#else #else
QMUL(4, 0x7ffffffff, 0x7ffffffff, 0xfffffff000000001, 0x3f) QMUL(4, 0x7ffffffff, 0x7ffffffff, 0xfffffff000000001, 0x3f)
UQMUL(5, 0xffffffffff, 0xffffffffff, 0xfffffe0000000001, 0xffff) UQMUL(5, 0xffffffffff, 0xffffffffff, 0xfffffe0000000001, 0xffff)
QMUL(6, 0x8000000000000000, -2, 0, 1) QMUL(6, 0x8000000000000000, -2, 0, 1)
QMUL(7, 0x8000000000000000, 2, 0, -1)
QMUL(8, 0x8000000000000001, 3, 0x8000000000000003, -2)
QMUL(9, 0x8000000000000001, -3, 0x7ffffffffffffffd, 1)
#endif #endif
prepare prepare
pushargi ok pushargi ok

View file

@ -100,6 +100,7 @@ case "$target_cpu" in
ia64) cpu=ia64 ;; ia64) cpu=ia64 ;;
hppa*) cpu=hppa ;; hppa*) cpu=hppa ;;
aarch64) cpu=aarch64 ;; aarch64) cpu=aarch64 ;;
s390x) cpu=s390x ;;
*) ;; *) ;;
esac esac
AM_CONDITIONAL(cpu_arm, [test cpu-$cpu = cpu-arm]) AM_CONDITIONAL(cpu_arm, [test cpu-$cpu = cpu-arm])
@ -110,6 +111,7 @@ AM_CONDITIONAL(cpu_x86, [test cpu-$cpu = cpu-x86])
AM_CONDITIONAL(cpu_ia64, [test cpu-$cpu = cpu-ia64]) AM_CONDITIONAL(cpu_ia64, [test cpu-$cpu = cpu-ia64])
AM_CONDITIONAL(cpu_hppa, [test cpu-$cpu = cpu-hppa]) AM_CONDITIONAL(cpu_hppa, [test cpu-$cpu = cpu-hppa])
AM_CONDITIONAL(cpu_aarch64, [test cpu-$cpu = cpu-aarch64]) AM_CONDITIONAL(cpu_aarch64, [test cpu-$cpu = cpu-aarch64])
AM_CONDITIONAL(cpu_s390x, [test cpu-$cpu = cpu-s390x])
# Test x87 if both, x87 and sse2 available # Test x87 if both, x87 and sse2 available
ac_cv_test_x86_x87= ac_cv_test_x86_x87=

View file

@ -126,6 +126,8 @@ typedef jit_int32_t jit_fpr_t;
# include <lightning/jit_hppa.h> # include <lightning/jit_hppa.h>
#elif defined(__aarch64__) #elif defined(__aarch64__)
# include <lightning/jit_aarch64.h> # include <lightning/jit_aarch64.h>
#elif defined(__s390x__)
# include <lightning/jit_s390x.h>
#endif #endif
#define jit_flag_node 0x00000001 /* patch node not absolute */ #define jit_flag_node 0x00000001 /* patch node not absolute */

View file

@ -49,3 +49,7 @@ if cpu_aarch64
lightning_include_HEADERS = \ lightning_include_HEADERS = \
jit_aarch64.h jit_aarch64.h
endif endif
if cpu_s390x
lightning_include_HEADERS = \
jit_s390x.h
endif

View file

@ -85,6 +85,10 @@
# define JIT_SP _SP # define JIT_SP _SP
# define JIT_RET _R0 # define JIT_RET _R0
# define JIT_FRET _V0 # define JIT_FRET _V0
#elif defined(__s390x__)
# define JIT_SP _R15
# define JIT_RET _R2
# define JIT_FRET _F0
#endif #endif
#define jit_size(vector) (sizeof(vector) / sizeof((vector)[0])) #define jit_size(vector) (sizeof(vector) / sizeof((vector)[0]))
@ -94,6 +98,10 @@
!jit_regset_tstbit(&_jitc->regarg, regno) && \ !jit_regset_tstbit(&_jitc->regarg, regno) && \
!jit_regset_tstbit(&_jitc->regsav, regno)) !jit_regset_tstbit(&_jitc->regsav, regno))
#define jit_reg_free_if_spill_p(regno) \
(!jit_regset_tstbit(&_jitc->regarg, regno) && \
!jit_regset_tstbit(&_jitc->regsav, regno))
/* /*
* Private jit_class bitmasks * Private jit_class bitmasks
*/ */

View file

@ -0,0 +1,70 @@
/*
* 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_s390x_h
#define _jit_s390x_h
#define JIT_HASH_CONSTS 1
#define JIT_NUM_OPERANDS 2
/*
* Types
*/
#define JIT_FP _R13
typedef enum {
#define jit_arg_reg_p(i) ((i) >= 0 && (i) <= 5)
#define jit_r(i) (_R12 + ((i) << 1))
#define jit_r_num() 3
#define jit_v(i) (_R11 + ((i) << 1))
#define jit_v_num() 3
#define jit_arg_f_reg_p(i) ((i) >= 0 && (i) <= 4)
#define jit_f(i) (_F8 + (i))
#define jit_f_num() 6
#define JIT_R0 _R12
#define JIT_R1 _R10
#define JIT_R2 _R8
#define JIT_V0 _R11
#define JIT_V1 _R9
#define JIT_V2 _R7
_R0, _R1, /* Volatile */
_R12, /* Saved, GOT */
_R11, _R10, _R9, _R8, /* Saved */
_R7, /* Saved */
_R6, /* Saved, parameter */
_R5, _R4, _R3, /* Parameter passing */
_R2, /* Volatile, parameter and return value */
_R13, /* Saved, literal pool pointer */
_R14, /* Volatile, return address */
_R15, /* Saved, stack pointer */
#define JIT_F0 _F8
#define JIT_F1 _F9
#define JIT_F2 _F10
#define JIT_F3 _F11
#define JIT_F4 _F12
#define JIT_F5 _F13
_F1, _F3, _F5, _F7, /* Volatile */
_F14, _F15, _F8, _F9, /* Saved */
_F10, _F11, _F12, _F13, /* Saved */
_F6, _F4, _F2, /* Volatile, parameter */
_F0, /* Volatile, parameter and return value */
_NOREG,
#define JIT_NOREG _NOREG
} jit_reg_t;
typedef jit_int32_t jit_regset_t;
#endif /* _jit_s390x_h */

View file

@ -43,6 +43,9 @@ EXTRA_DIST = \
jit_ppc.c \ jit_ppc.c \
jit_ppc-cpu.c \ jit_ppc-cpu.c \
jit_ppc-fpu.c \ jit_ppc-fpu.c \
jit_s390x.c \
jit_s390x-cpu.c \
jit_s390x-fpu.c \
jit_sparc.c \ jit_sparc.c \
jit_sparc-cpu.c \ jit_sparc-cpu.c \
jit_sparc-fpu.c \ jit_sparc-fpu.c \

View file

@ -90,9 +90,14 @@ jit_init_debug(void)
# endif # endif
disassemble_init_powerpc(&disasm_info); disassemble_init_powerpc(&disasm_info);
# endif # endif
# if defined(__sparc__) # if defined(__sparc__)
disasm_info.endian = disasm_info.display_endian = BFD_ENDIAN_BIG; disasm_info.endian = disasm_info.display_endian = BFD_ENDIAN_BIG;
# endif
# if defined(__s390x__)
disasm_info.arch = bfd_arch_s390;
disasm_info.mach = bfd_mach_s390_64;
disasm_info.endian = disasm_info.display_endian = BFD_ENDIAN_BIG;
disasm_info.disassembler_options = "zarch";
# endif # endif
disasm_info.print_address_func = disasm_print_address; disasm_info.print_address_func = disasm_print_address;

3392
lib/jit_s390x-cpu.c Normal file

File diff suppressed because it is too large Load diff

1198
lib/jit_s390x-fpu.c Normal file

File diff suppressed because it is too large Load diff

1281
lib/jit_s390x.c Normal file

File diff suppressed because it is too large Load diff

View file

@ -2913,4 +2913,6 @@ _patch_register(jit_state_t *_jit, jit_node_t *node, jit_node_t *link,
# include "jit_hppa.c" # include "jit_hppa.c"
#elif defined(__aarch64__) #elif defined(__aarch64__)
# include "jit_aarch64.c" # include "jit_aarch64.c"
#elif defined(__s390x__)
# include "jit_s390x.c"
#endif #endif