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

Add jit_ellipis and remove jit_prepare argument.

* include/lightning.h, lib/jit_arm.c, lib/jit_mips.c,
	lib/jit_ppc.c, lib/jit_x86.c, lib/lightning.c: Change jit_prepare
	to no longer receive an argument. If receiving an argument, it
	should be an ABI specifier, not a boolean if varargs or not,
	and add the new jit_ellipsis call, to specify where the
	ellipsis is in the C prototype of the function being called.
	Note that currently it is not supported to define varargs
	functions and it will be ignored if calling jit_ellipsis not
	in a prepare/finish* block, but this should be addressed.

	* check/allocai.tst, check/alu_add.tst, check/alu_and.tst,
	check/alu_com.tst, check/alu_div.tst, check/alu_lsh.tst,
	check/alu_mul.tst, check/alu_neg.tst, check/alu_or.tst,
	check/alu_rem.tst, check/alu_rsh.tst, check/alu_sub.tst,
	check/alu_xor.tst, check/alux_add.tst, check/alux_sub.tst,
	check/bp.tst, check/branch.tst, check/cvt.tst, check/divi.tst,
	check/fib.tst, check/ldsti.tst, check/ldstr-c.tst,
	check/ldstr.tst, check/ldstxi-c.tst, check/ldstxi.tst,
	check/ldstxr-c.tst, check/ldstxr.tst, check/rpn.tst,
	check/lightning.c: Update for the change to jit_prepare and
	addition of jit_ellipsis.
This commit is contained in:
pcpa 2012-12-12 22:59:52 -02:00
parent a04df966c0
commit 0b89a17ca2
39 changed files with 165 additions and 70 deletions

View file

@ -1,3 +1,27 @@
2012-12-12 Paulo Andrade <pcpa@gnu.org>
* include/lightning.h, lib/jit_arm.c, lib/jit_mips.c,
lib/jit_ppc.c, lib/jit_x86.c, lib/lightning.c: Change jit_prepare
to no longer receive an argument. If receiving an argument, it
should be an ABI specifier, not a boolean if varargs or not,
and add the new jit_ellipsis call, to specify where the
ellipsis is in the C prototype of the function being called.
Note that currently it is not supported to define varargs
functions and it will be ignored if calling jit_ellipsis not
in a prepare/finish* block, but this should be addressed.
* check/allocai.tst, check/alu_add.tst, check/alu_and.tst,
check/alu_com.tst, check/alu_div.tst, check/alu_lsh.tst,
check/alu_mul.tst, check/alu_neg.tst, check/alu_or.tst,
check/alu_rem.tst, check/alu_rsh.tst, check/alu_sub.tst,
check/alu_xor.tst, check/alux_add.tst, check/alux_sub.tst,
check/bp.tst, check/branch.tst, check/cvt.tst, check/divi.tst,
check/fib.tst, check/ldsti.tst, check/ldstr-c.tst,
check/ldstr.tst, check/ldstxi-c.tst, check/ldstxi.tst,
check/ldstxr-c.tst, check/ldstxr.tst, check/rpn.tst,
check/lightning.c: Update for the change to jit_prepare and
addition of jit_ellipsis.
2012-12-11 Paulo Andrade <pcpa@gnu.org>
* lib/jit_ppc-cpu.c: Make movr a function that checks arguments

View file

@ -18,13 +18,14 @@ test_double_##a##_##b##_##c: \
retr_d %a \
epilog
#define test_double(a, b, c, x, y) \
prepare 0 \
prepare \
pushargi_d x \
pushargi_d y \
finishi test_double_##a##_##b##_##c \
retval_d %f0 \
prepare 1 \
prepare \
pushargi dfmt \
ellipsis \
pushargr_d %f0 \
finishi @printf
@ -39,13 +40,14 @@ test_int_##a##_##b##_##c: \
retr %a \
epilog
#define test_int(a, b, c, x, y) \
prepare 0 \
prepare \
pushargi x \
pushargi y \
finishi test_int_##a##_##b##_##c \
retval %r0 \
prepare 1 \
prepare \
pushargi ifmt \
ellipsis \
pushargr %r0 \
finishi @printf

View file

@ -17,13 +17,14 @@ test:
main:
prolog
prepare 0
prepare
pushargi 5
pushargi 4
finishi test
retval %r0
prepare 1
prepare
pushargi fmt
ellipsis
pushargi 5
pushargi 4
pushargr %r0

View file

@ -196,11 +196,12 @@ label:
jmpi label
callr %r0
calli label
prepare 0
prepare
pushargr %r0
finishr %r0
prepare 1
prepare
pushargi 1
ellipsis
finishi 0x80000000
ret
retr %r1
@ -303,7 +304,7 @@ unordi:
bordi_f unordi %f0 0.5
bunordr_f unord %f0 %f1
bunordi_f unordi %f0 0.5
prepare 0
prepare
pushargr_f %f1
pushargi_f 0.5
finishi 0x80000000
@ -395,7 +396,7 @@ unordi:
bordi_d unordi %f0 0.5
bunordr_d unord %f0 %f1
bunordi_d unordi %f0 0.5
prepare 0
prepare
pushargr_d %f1
pushargi_d 0.5
finishi 0x80000000

View file

@ -23,8 +23,9 @@ identify:
prolog
arg $i
getarg %v0 $i
prepare 1
prepare
pushargi idfmt
ellipsis
pushargr %v0
finishi @printf
retr %v0
@ -45,7 +46,7 @@ identity_func:
stxi $neg %fp %r2
/* Invoke FUNC. */
prepare 0
prepare
pushargr %r1
finishi identify
@ -64,8 +65,9 @@ identity_func:
/* Display a failure message. */
branch:
prepare 1
prepare
pushargi failure_message
ellipsis
finishi @printf
/* Leave. */
@ -74,19 +76,21 @@ branch:
main:
prolog
prepare 0
prepare
pushargi 7777
finishi identity_func
beqi succeeded %ret 7777
prepare 1
prepare
pushargi report_message
ellipsis
pushargr %ret
pushargi 7777
finishi @printf
reti 1
succeeded:
prepare 1
prepare
pushargi succeeded_message
ellipsis
finishi @printf
reti 0
epilog

View file

@ -39,8 +39,9 @@
ADD(0, _d, -0.5, 0.5, 0.0)
ADD(1, _d, 0.25, 0.75, 1.0)
prepare 1
prepare
pushargi ok
ellipsis
finishi @printf
ret
epilog

View file

@ -28,8 +28,9 @@
AND(19, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff)
#endif
prepare 1
prepare
pushargi ok
ellipsis
finishi @printf
ret
epilog

View file

@ -25,8 +25,9 @@
COM(9, 0x8000000000000001, 0x7ffffffffffffffe)
#endif
prepare 1
prepare
pushargi ok
ellipsis
finishi @printf
ret
epilog

View file

@ -75,8 +75,9 @@
DIV(0, _d, -0.5, 0.5, -1.0)
DIV(1, _d, 1.25, 0.5, 2.5)
prepare 1
prepare
pushargi ok
ellipsis
finishi @printf
ret
epilog

View file

@ -49,8 +49,9 @@
LSH(30, 0xffffffffff, 47, 0xffff800000000000)
#endif
prepare 1
prepare
pushargi ok
ellipsis
finishi @printf
ret
epilog

View file

@ -51,8 +51,9 @@
MUL(0, _d, -0.5, 0.5, -0.25)
MUL(1, _d, 0.25, 0.75, 0.1875)
prepare 1
prepare
pushargi ok
ellipsis
finishi @printf
ret
epilog

View file

@ -34,8 +34,9 @@
NEG(2, _d, $(1.0 / 0), $(-1 / 0.0))
NEG(3, _d, -1.25, 1.25)
prepare 1
prepare
pushargi ok
ellipsis
finishi @printf
ret
epilog

View file

@ -28,8 +28,9 @@
OR(19, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff)
#endif
prepare 1
prepare
pushargi ok
ellipsis
finishi @printf
ret
epilog

View file

@ -68,8 +68,9 @@
UREM(26,0xffffffffffffffff, 0xffffffffffffffff, 0)
#endif
prepare 1
prepare
pushargi ok
ellipsis
finishi @printf
ret
epilog

View file

@ -77,8 +77,9 @@
URSH(31,0xffff800000000000, 47, 0x1ffff)
#endif
prepare 1
prepare
pushargi ok
ellipsis
finishi @printf
ret
epilog

View file

@ -41,8 +41,9 @@
SUB(0, _d, -0.5, 0.5, -1.0)
SUB(1, _d, 0.25, 0.75, -0.5)
prepare 1
prepare
pushargi ok
ellipsis
finishi @printf
ret
epilog

View file

@ -28,8 +28,9 @@
XOR(20, 0xffffffffffffffff, 0xffffffffffffffff, 0)
#endif
prepare 1
prepare
pushargi ok
ellipsis
finishi @printf
ret
epilog

View file

@ -41,8 +41,9 @@
ADDX(10,0x8000000000000000, 0x8000000000000000, 1)
#endif
prepare 1
prepare
pushargi ok
ellipsis
finishi @printf
ret
epilog

View file

@ -41,8 +41,9 @@
SUBX(10,1, 0x8000000000000000, -1)
#endif
prepare 1
prepare
pushargi ok
ellipsis
finishi @printf
ret
epilog

View file

@ -13,11 +13,11 @@ rfibs:
blti_u out %v0 2
subi %v1 %v0 1 /* V1 = N-1 */
subi %v2 %v0 2 /* V1 = N-2 */
prepare 0
prepare
pushargr %v1
finishi rfibs
retval %v1 /* V1 = rfibs(N-1) */
prepare 0
prepare
pushargr %v2
finishi rfibs
retval %v2 /* V2 = rfibs(N-2) */
@ -31,12 +31,13 @@ out:
main:
prolog
prepare 0
prepare
pushargi 32
finishi rfibs
retval %v0
prepare 1
prepare
pushargi fmt
ellipsis
pushargi 32
pushargr %v0
finishi @printf

View file

@ -554,8 +554,9 @@ unordi_f_0:
unordi_f_1:
// just to know did not crash or abort
prepare 1
prepare
pushargi ok
ellipsis
finishi @printf
ret

View file

@ -371,8 +371,9 @@ xdf:
EXTDF(f0, f1, f2, f3, f4, f5)
// just to know did not abort
prepare 1
prepare
pushargi ok
ellipsis
finishi @printf
ret

View file

@ -34,7 +34,7 @@ test_divider_##divisor: \
loop_##divisor: \
bger done_##divisor %v0 %v1 \
ldr_i %v2 %v0 \
prepare 0 \
prepare \
pushargr %v2 \
finishi divider_##divisor \
retval %v2 \
@ -42,8 +42,9 @@ loop_##divisor: \
divi %r0 %r2 divisor \
/* save div result */ \
stxi_i $loc %fp %r0 \
prepare 1 \
prepare \
pushargi fmt \
ellipsis \
pushargr %r2 \
pushargi divisor \
pushargr %v2 \
@ -63,12 +64,12 @@ generate_test_divider(32768)
main:
prolog
prepare 0
prepare
pushargi small_ops
pushargi 3
finishi test_divider_8
bnei fail %ret 0
prepare 0
prepare
pushargi large_ops
pushargi 3
finishi test_divider_32768

View file

@ -34,7 +34,7 @@ main:
getarg %r0 $argv
addi %r0 %r0 $(__WORDSIZE >> 3)
ldr %r0 %r0
prepare 0
prepare
pushargr %r0
finishi @atoi
retval %r0
@ -45,12 +45,13 @@ default:
call:
movr %v0 %r0
prepare 0
prepare
pushargr %r0
finishi nfibs
retval %r0
prepare 1
prepare
pushargi format
ellipsis
pushargr %v0
pushargr %r0
finishi @printf

View file

@ -141,8 +141,9 @@ Ld:
LDST(v0, v1, v2, r0, r1, r2, f0, f1, f2, f3, f4, f5)
// just to know did not abort
prepare 1
prepare
pushargi ok
ellipsis
finishi @printf
ret
epilog

View file

@ -150,8 +150,9 @@ Ll:
LDST(v0, v1, v2, r0, r1, r2)
// just to know did not abort
prepare 1
prepare
pushargi ok
ellipsis
finishi @printf
ret
epilog

View file

@ -178,8 +178,9 @@ Ld:
LDST(v0, v1, v2, r0, r1, r2, f0, f1, f2, f3, f4, f5)
// just to know did not abort
prepare 1
prepare
pushargi ok
ellipsis
finishi @printf
ret
epilog

View file

@ -153,8 +153,9 @@ Ll:
LDST(v0, v1, v2, r0, r1, r2)
// just to know did not abort
prepare 1
prepare
pushargi ok
ellipsis
finishi @printf
ret
epilog

View file

@ -149,8 +149,9 @@ Ld:
LDST(v0, v1, v2, r0, r1, r2, f0, f1, f2, f3, f4, f5)
// just to know did not abort
prepare 1
prepare
pushargi ok
ellipsis
finishi @printf
ret
epilog

View file

@ -214,8 +214,9 @@ Ll1:
LDST(v0, v1, v2, r0, r1, r2)
// just to know did not abort
prepare 1
prepare
pushargi ok
ellipsis
finishi @printf
ret
epilog

View file

@ -204,8 +204,9 @@ Ld:
LDST(v0, v1, v2, r0, r1, r2, f0, f1, f2, f3, f4, f5)
// just to know did not abort
prepare 1
prepare
pushargi ok
ellipsis
finishi @printf
ret
epilog

View file

@ -242,7 +242,7 @@ static void call_forward(void *value, label_t *label);
static void make_arg(long value);
static long get_arg(void);
static long get_imm(void);
static void prolog(void);
static void prolog(void); static void ellipsis(void);
static void allocai(void);
static void arg(void);
static void getarg_c(void); static void getarg_uc(void);
@ -533,7 +533,7 @@ static char *data;
static size_t data_offset, data_length;
static instr_t instr_vector[] = {
#define entry(value) { NULL, #value, value }
entry(prolog),
entry(prolog), entry(ellipsis),
entry(allocai),
entry(arg),
entry(getarg_c), entry(getarg_uc),
@ -1211,7 +1211,7 @@ name(void) \
jit_##name(value); \
}
entry(prolog)
entry(prolog) entry(ellipsis)
void
allocai(void) {
symbol_t *symbol;
@ -1360,7 +1360,7 @@ entry_lb_ir_ir(bxsubr) entry_lb_ir_im(bxsubi)
entry_lb_ir_ir(bxsubr_u) entry_lb_ir_im(bxsubi_u)
entry_ir(jmpr) entry_lb(jmpi)
entry_ir(callr) entry_fn(calli)
entry_im(prepare)
entry(prepare)
entry_ir(pushargr) entry_im(pushargi)
entry_ir(finishr) entry_fn(finishi)
entry(ret)

View file

@ -106,64 +106,74 @@ f2c:
main:
prolog
prepare 1
prepare
pushargi C
ellipsis
finishi @printf
movi %v0 0
loopC:
prepare 1
prepare
pushargi format
ellipsis
pushargr %v0
finishi @printf
addi %v0 %v0 10
blei loopC %v0 100
prepare 1
prepare
pushargi F
ellipsis
finishi @printf
movi %v0 0
loopC2F:
prepare 0
prepare
pushargr %v0
finishi c2f
retval %r0
prepare 2
prepare
pushargi format
ellipsis
pushargr %r0
finishi @printf
addi %v0 %v0 10
blei loopC2F %v0 100
prepare 1
prepare
pushargi newline
ellipsis
finishi @printf
prepare 1
prepare
pushargi F
ellipsis
finishi @printf
movi %v0 32
loopF:
prepare 2
prepare
pushargi format
ellipsis
pushargr %v0
finishi @printf
addi %v0 %v0 18
blei loopF %v0 212
prepare 1
prepare
pushargi C
ellipsis
finishi @printf
movi %v0 32
loopF2C:
prepare 0
prepare
pushargr %v0
finishi f2c
retval %r0
prepare 2
prepare
pushargi format
ellipsis
pushargr %r0
finishi @printf
addi %v0 %v0 18
blei loopF2C %v0 212
prepare 1
prepare
pushargi newline
ellipsis
finishi @printf
ret

View file

@ -114,6 +114,7 @@ typedef enum {
#define jit_prolog() _jit_prolog(_jit)
jit_code_prolog,
#define jit_ellipsis() _jit_ellipsis(_jit)
#define jit_allocai(u) _jit_allocai(_jit,u)
#define jit_arg() _jit_arg(_jit)
@ -406,7 +407,7 @@ typedef enum {
#define jit_calli(u) jit_new_node_p(jit_code_calli,u)
jit_code_callr, jit_code_calli,
#define jit_prepare(u) _jit_prepare(_jit,u)
#define jit_prepare() _jit_prepare(_jit)
#define jit_pushargr(u) _jit_pushargr(_jit,u)
#define jit_pushargi(u) _jit_pushargi(_jit,u)
#define jit_finishr(u) _jit_finishr(_jit,u)
@ -739,6 +740,7 @@ extern void _jit_link(jit_state_t*, jit_node_t*);
extern void _jit_prolog(jit_state_t*);
extern jit_int32_t _jit_allocai(jit_state_t*, jit_int32_t);
extern void _jit_ellipsis(jit_state_t*);
extern jit_int32_t _jit_arg(jit_state_t*);
extern void _jit_getarg_c(jit_state_t*, jit_gpr_t, jit_int32_t);
@ -751,7 +753,8 @@ extern void _jit_getarg_ui(jit_state_t*, jit_gpr_t, jit_int32_t);
extern void _jit_getarg_l(jit_state_t*, jit_gpr_t, jit_int32_t);
#endif
extern void _jit_prepare(jit_state_t*, jit_int32_t);
extern void _jit_prepare(jit_state_t*);
extern void _jit_ellipsis(jit_state_t*);
extern void _jit_pushargr(jit_state_t*, jit_gpr_t);
extern void _jit_pushargi(jit_state_t*, jit_word_t);
extern void _jit_finishr(jit_state_t*, jit_gpr_t);

View file

@ -243,6 +243,12 @@ _jit_prolog(jit_state_t *_jit)
jit_regset_new(_jit->function->regset);
}
void
_jit_ellipsis(jit_state_t *_jit)
{
_jit->function->call.kind = jit_call_varargs;
}
jit_int32_t
_jit_allocai(jit_state_t *_jit, jit_int32_t length)
{

View file

@ -150,6 +150,12 @@ _jit_prolog(jit_state_t *_jit)
jit_regset_new(_jit->function->regset);
}
void
_jit_ellipsis(jit_state_t *_jit)
{
_jit->function->call.kind = jit_call_varargs;
}
jit_int32_t
_jit_allocai(jit_state_t *_jit, jit_int32_t length)
{

View file

@ -156,6 +156,12 @@ _jit_prolog(jit_state_t *_jit)
jit_regset_new(_jit->function->regset);
}
void
_jit_ellipsis(jit_state_t *_jit)
{
_jit->function->call.kind = jit_call_varargs;
}
jit_int32_t
_jit_allocai(jit_state_t *_jit, jit_int32_t length)
{

View file

@ -320,6 +320,12 @@ _jit_prolog(jit_state_t *_jit)
jit_regset_new(_jit->function->regset);
}
void
_jit_ellipsis(jit_state_t *_jit)
{
_jit->function->call.kind = jit_call_varargs;
}
jit_int32_t
_jit_allocai(jit_state_t *_jit, jit_int32_t length)
{

View file

@ -708,10 +708,10 @@ _jit_link(jit_state_t *_jit, jit_node_t *node)
}
void
_jit_prepare(jit_state_t *_jit, jit_int32_t kind)
_jit_prepare(jit_state_t *_jit)
{
assert(_jit->function);
_jit->function->call.kind = kind;
_jit->function->call.kind = jit_call_default;
_jit->function->call.argi =
_jit->function->call.argf =
_jit->function->call.size = 0;