From afae5407f67646254c868a9fde6da97609d5f69d Mon Sep 17 00:00:00 2001 From: pcpa Date: 2014年10月14日 17:05:25 -0300 Subject: Implement the jit_align interface * lib/jit_aarch64-cpu.c, lib/jit_alpha-cpu.c, lib/jit_arm-cpu.c, lib/jit_hppa-cpu.c, lib/jit_mips-cpu.c, lib/jit_ppc-cpu.c, lib/jit_sparc-cpu.c: Implement or correct the internal nop(count) call that receives an argument that tells the modulo bytes to align the code for the next instruction. * include/lightning.h, lib/lightning.c, lib/jit_aarch64.c, lib/jit_alpha.c, lib/jit_arm.c, lib/jit_hppa.c, lib/jit_ia64.c, lib/jit_mips.c, lib/jit_ppc.c, lib/jit_s390x.c, lib/jit_sparc.c, lib/jit_x86.c: Implement the new jit_align() call that receive an argument, that tells the modulo, in bytes, to align the next instruction. In most backends the only value that makes a difference is a value that matches sizeof(void*), as all other values usually are already automatically aligned in labels, but not guaranteed to be aligned at word size bytes. * check/align.ok, check/align.tst: New files, implementing a simple test for the new jit_align() interface. * check/Makefile.am, check/lightning.c, lib/jit_aarch64-sz.c, lib/jit_alpha-sz.c, lib/jit_arm-sz.c, lib/jit_hppa-sz.c, lib/jit_ia64-sz.c, lib/jit_mips-sz.c, lib/jit_ppc-sz.c, lib/jit_print.c, lib/jit_s390x-sz.c, lib/jit_sparc-sz.c, lib/jit_x86-sz.c: Update for the new jit_code_align code and the jit_align() interface. --- lib/jit_alpha-cpu.c | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'lib/jit_alpha-cpu.c') diff --git a/lib/jit_alpha-cpu.c b/lib/jit_alpha-cpu.c index 8fe4338..8787b0f 100644 --- a/lib/jit_alpha-cpu.c +++ b/lib/jit_alpha-cpu.c @@ -303,6 +303,8 @@ static void _Opi(jit_state_t*,int,int,unsigned int,unsigned int,int); # define NEGL(ra,rc) SUBL(_R31_REGNO,ra,rc) # define NEGQ(ra,rc) SUBQ(_R31_REGNO,ra,rc) # define NOT(ra,rc) ORNOT(_R31_REGNO,ra,rc) +# define nop(i0) _nop(_jit,i0) +static void _nop(jit_state_t*,jit_int32_t); # define movr(r0,r1) _movr(_jit,r0,r1) static void _movr(jit_state_t*,jit_int32_t,jit_int32_t); # define movi(r0,i0) _movi(_jit,r0,i0) @@ -703,6 +705,14 @@ _Opi(jit_state_t *_jit, int o, int ra, unsigned int i, unsigned int f, int rc) ii((o<<26)|(ra<<21)|(_u8(i)<<13)|(1<<12)|(_u7(f)<<5)|rc); } +static void +_nop(jit_state_t *_jit, jit_int32_t i0) +{ + for (; i0> 0; i0 -= 4) + NOP(); + assert(i0 == 0); +} + static void _movr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1) { -- cgit v1.2.3

AltStyle によって変換されたページ (->オリジナル) /