author | pcpa <paulo.cesar.pereira.de.andrade@gmail.com> | 2012年12月12日 22:59:52 -0200 |
---|---|---|
committer | pcpa <paulo.cesar.pereira.de.andrade@gmail.com> | 2012年12月12日 22:59:52 -0200 |
commit | 0b89a17ca2709fbd4765a9758b73e07b6b5d9a52 (patch) | |
tree | a31b84b195ce8bebbf76d3170eba38e50bf26e26 | |
parent | a04df966c056513cdd85086e2c85b491bad55f3c (diff) | |
download | lightning-0b89a17ca2709fbd4765a9758b73e07b6b5d9a52.tar.gz |
@@ -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 diff --git a/check/3to2.tst b/check/3to2.tst index 10de7f8..1e4a30e 100644 --- a/check/3to2.tst +++ b/check/3to2.tst @@ -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 diff --git a/check/add.tst b/check/add.tst index 03a6962..d849fce 100644 --- a/check/add.tst +++ b/check/add.tst @@ -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 diff --git a/check/all.tst b/check/all.tst index aa8856c..d8d4769 100644 --- a/check/all.tst +++ b/check/all.tst @@ -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 diff --git a/check/allocai.tst b/check/allocai.tst index b613a41..9bb6cbe 100644 --- a/check/allocai.tst +++ b/check/allocai.tst @@ -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 diff --git a/check/alu_add.tst b/check/alu_add.tst index 221b6ac..16cdf38 100644 --- a/check/alu_add.tst +++ b/check/alu_add.tst @@ -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 diff --git a/check/alu_and.tst b/check/alu_and.tst index 2f0da9a..7474271 100644 --- a/check/alu_and.tst +++ b/check/alu_and.tst @@ -28,8 +28,9 @@ AND(19, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff) #endif - prepare 1 + prepare pushargi ok + ellipsis finishi @printf ret epilog diff --git a/check/alu_com.tst b/check/alu_com.tst index 4722813..581c940 100644 --- a/check/alu_com.tst +++ b/check/alu_com.tst @@ -25,8 +25,9 @@ COM(9, 0x8000000000000001, 0x7ffffffffffffffe) #endif - prepare 1 + prepare pushargi ok + ellipsis finishi @printf ret epilog diff --git a/check/alu_div.tst b/check/alu_div.tst index 37c1a2b..97e024d 100644 --- a/check/alu_div.tst +++ b/check/alu_div.tst @@ -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 diff --git a/check/alu_lsh.tst b/check/alu_lsh.tst index 1b3118f..c05fda0 100644 --- a/check/alu_lsh.tst +++ b/check/alu_lsh.tst @@ -49,8 +49,9 @@ LSH(30, 0xffffffffff, 47, 0xffff800000000000) #endif - prepare 1 + prepare pushargi ok + ellipsis finishi @printf ret epilog diff --git a/check/alu_mul.tst b/check/alu_mul.tst index edf9777..748417c 100644 --- a/check/alu_mul.tst +++ b/check/alu_mul.tst @@ -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 diff --git a/check/alu_neg.tst b/check/alu_neg.tst index 73b1b30..3264d13 100644 --- a/check/alu_neg.tst +++ b/check/alu_neg.tst @@ -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 diff --git a/check/alu_or.tst b/check/alu_or.tst index 31aa0c6..1e55a86 100644 --- a/check/alu_or.tst +++ b/check/alu_or.tst @@ -28,8 +28,9 @@ OR(19, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff) #endif - prepare 1 + prepare pushargi ok + ellipsis finishi @printf ret epilog diff --git a/check/alu_rem.tst b/check/alu_rem.tst index f6c6074..5aea7cf 100644 --- a/check/alu_rem.tst +++ b/check/alu_rem.tst @@ -68,8 +68,9 @@ UREM(26,0xffffffffffffffff, 0xffffffffffffffff, 0) #endif - prepare 1 + prepare pushargi ok + ellipsis finishi @printf ret epilog diff --git a/check/alu_rsh.tst b/check/alu_rsh.tst index f32c3c9..93f8c7b 100644 --- a/check/alu_rsh.tst +++ b/check/alu_rsh.tst @@ -77,8 +77,9 @@ URSH(31,0xffff800000000000, 47, 0x1ffff) #endif - prepare 1 + prepare pushargi ok + ellipsis finishi @printf ret epilog diff --git a/check/alu_sub.tst b/check/alu_sub.tst index 4e8fd3c..8f07b62 100644 --- a/check/alu_sub.tst +++ b/check/alu_sub.tst @@ -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 diff --git a/check/alu_xor.tst b/check/alu_xor.tst index 5c98e27..d1976ab 100644 --- a/check/alu_xor.tst +++ b/check/alu_xor.tst @@ -28,8 +28,9 @@ XOR(20, 0xffffffffffffffff, 0xffffffffffffffff, 0) #endif - prepare 1 + prepare pushargi ok + ellipsis finishi @printf ret epilog diff --git a/check/alux_add.tst b/check/alux_add.tst index 68cf8e5..ddc4e57 100644 --- a/check/alux_add.tst +++ b/check/alux_add.tst @@ -41,8 +41,9 @@ ADDX(10,0x8000000000000000, 0x8000000000000000, 1) #endif - prepare 1 + prepare pushargi ok + ellipsis finishi @printf ret epilog diff --git a/check/alux_sub.tst b/check/alux_sub.tst index edef15f..8a2838d 100644 --- a/check/alux_sub.tst +++ b/check/alux_sub.tst @@ -41,8 +41,9 @@ SUBX(10,1, 0x8000000000000000, -1) #endif - prepare 1 + prepare pushargi ok + ellipsis finishi @printf ret epilog diff --git a/check/bp.tst b/check/bp.tst index a331244..487217b 100644 --- a/check/bp.tst +++ b/check/bp.tst @@ -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 diff --git a/check/branch.tst b/check/branch.tst index 5fd54d5..b8ec071 100644 --- a/check/branch.tst +++ b/check/branch.tst @@ -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 diff --git a/check/cvt.tst b/check/cvt.tst index e645cc2..1828259 100644 --- a/check/cvt.tst +++ b/check/cvt.tst @@ -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 diff --git a/check/divi.tst b/check/divi.tst index 6a21152..94bd3d6 100644 --- a/check/divi.tst +++ b/check/divi.tst @@ -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 diff --git a/check/fib.tst b/check/fib.tst index 2df7b23..6891de0 100644 --- a/check/fib.tst +++ b/check/fib.tst @@ -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 diff --git a/check/ldsti.tst b/check/ldsti.tst index 3fd7f31..59d598b 100644 --- a/check/ldsti.tst +++ b/check/ldsti.tst @@ -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 diff --git a/check/ldstr-c.tst b/check/ldstr-c.tst index 6644f98..7f85cda 100644 --- a/check/ldstr-c.tst +++ b/check/ldstr-c.tst @@ -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 diff --git a/check/ldstr.tst b/check/ldstr.tst index 2b9fd0d..1eb03d6 100644 --- a/check/ldstr.tst +++ b/check/ldstr.tst @@ -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 diff --git a/check/ldstxi-c.tst b/check/ldstxi-c.tst index 7951a60..9491bf1 100644 --- a/check/ldstxi-c.tst +++ b/check/ldstxi-c.tst @@ -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 diff --git a/check/ldstxi.tst b/check/ldstxi.tst index 5dc224f..4aa0cc7 100644 --- a/check/ldstxi.tst +++ b/check/ldstxi.tst @@ -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 diff --git a/check/ldstxr-c.tst b/check/ldstxr-c.tst index bf85416..13056bc 100644 --- a/check/ldstxr-c.tst +++ b/check/ldstxr-c.tst @@ -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 diff --git a/check/ldstxr.tst b/check/ldstxr.tst index 32ddd24..95c1891 100644 --- a/check/ldstxr.tst +++ b/check/ldstxr.tst @@ -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 diff --git a/check/lightning.c b/check/lightning.c index cf5dff1..2226da9 100644 --- a/check/lightning.c +++ b/check/lightning.c @@ -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) diff --git a/check/rpn.tst b/check/rpn.tst index fe12557..939e0a5 100644 --- a/check/rpn.tst +++ b/check/rpn.tst @@ -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 diff --git a/include/lightning.h b/include/lightning.h index 997a936..56cefe5 100644 --- a/include/lightning.h +++ b/include/lightning.h @@ -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); diff --git a/lib/jit_arm.c b/lib/jit_arm.c index b706440..adafcb2 100644 --- a/lib/jit_arm.c +++ b/lib/jit_arm.c @@ -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) { diff --git a/lib/jit_mips.c b/lib/jit_mips.c index f365e3c..7b6f99d 100644 --- a/lib/jit_mips.c +++ b/lib/jit_mips.c @@ -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) { diff --git a/lib/jit_ppc.c b/lib/jit_ppc.c index 19eeca6..618adef 100644 --- a/lib/jit_ppc.c +++ b/lib/jit_ppc.c @@ -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) { diff --git a/lib/jit_x86.c b/lib/jit_x86.c index 416e72a..918af41 100644 --- a/lib/jit_x86.c +++ b/lib/jit_x86.c @@ -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) { diff --git a/lib/lightning.c b/lib/lightning.c index a416872..1a49ffe 100644 --- a/lib/lightning.c +++ b/lib/lightning.c @@ -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; |