From bb283f4581ac07a4dd75325c4343d7f28b1ff376 Mon Sep 17 00:00:00 2001 From: Andy Belle-Isle Date: Sun, 25 Aug 2019 16:39:02 -0400 Subject: [PATCH] Fixed LuaJIT files --- lib/LuaJIT/.gitignore | 11 + lib/LuaJIT/COPYRIGHT | 56 + lib/LuaJIT/Makefile | 825 ++----- lib/LuaJIT/README | 16 + lib/LuaJIT/doc/bluequad-print.css | 166 ++ lib/LuaJIT/doc/bluequad.css | 325 +++ lib/LuaJIT/doc/changes.html | 882 ++++++++ lib/LuaJIT/doc/contact.html | 110 + lib/LuaJIT/doc/ext_c_api.html | 188 ++ lib/LuaJIT/doc/ext_ffi.html | 331 +++ lib/LuaJIT/doc/ext_ffi_api.html | 571 +++++ lib/LuaJIT/doc/ext_ffi_semantics.html | 1261 +++++++++++ lib/LuaJIT/doc/ext_ffi_tutorial.html | 602 ++++++ lib/LuaJIT/doc/ext_jit.html | 200 ++ lib/LuaJIT/doc/ext_profiler.html | 364 ++++ lib/LuaJIT/doc/extensions.html | 482 +++++ lib/LuaJIT/doc/faq.html | 185 ++ lib/LuaJIT/doc/img/contact.png | Bin 0 -> 1340 bytes lib/LuaJIT/doc/install.html | 691 ++++++ lib/LuaJIT/doc/luajit.html | 235 ++ lib/LuaJIT/doc/running.html | 308 +++ lib/LuaJIT/doc/status.html | 122 ++ lib/LuaJIT/dynasm/dasm_arm.h | 458 ++++ lib/LuaJIT/dynasm/dasm_arm.lua | 1125 ++++++++++ lib/LuaJIT/dynasm/dasm_arm64.h | 519 +++++ lib/LuaJIT/dynasm/dasm_arm64.lua | 1166 ++++++++++ lib/LuaJIT/dynasm/dasm_mips.h | 420 ++++ lib/LuaJIT/dynasm/dasm_mips.lua | 1008 +++++++++ lib/LuaJIT/dynasm/dasm_mips64.lua | 12 + lib/LuaJIT/dynasm/dasm_ppc.h | 420 ++++ lib/LuaJIT/dynasm/dasm_ppc.lua | 1919 +++++++++++++++++ lib/LuaJIT/dynasm/dasm_proto.h | 83 + lib/LuaJIT/dynasm/dasm_x64.lua | 12 + lib/LuaJIT/dynasm/dasm_x86.h | 509 +++++ lib/LuaJIT/dynasm/dasm_x86.lua | 2360 +++++++++++++++++++++ lib/LuaJIT/dynasm/dynasm.lua | 1094 ++++++++++ lib/LuaJIT/etc/luajit.1 | 88 + lib/LuaJIT/etc/luajit.pc | 25 + lib/LuaJIT/libluajit.a | Bin 866936 -> 0 bytes lib/LuaJIT/libluajit.so | Bin 503336 -> 0 bytes lib/LuaJIT/src/.gitignore | 7 + lib/LuaJIT/src/Makefile | 721 +++++++ lib/LuaJIT/{ => src}/Makefile.dep | 0 lib/LuaJIT/{ => src}/host/.gitignore | 0 lib/LuaJIT/{ => src}/host/README | 0 lib/LuaJIT/{ => src}/host/buildvm.c | 0 lib/LuaJIT/{ => src}/host/buildvm.h | 0 lib/LuaJIT/{ => src}/host/buildvm_asm.c | 0 lib/LuaJIT/{ => src}/host/buildvm_fold.c | 0 lib/LuaJIT/{ => src}/host/buildvm_lib.c | 0 lib/LuaJIT/{ => src}/host/buildvm_libbc.h | 0 lib/LuaJIT/{ => src}/host/buildvm_peobj.c | 0 lib/LuaJIT/{ => src}/host/genlibbc.lua | 0 lib/LuaJIT/{ => src}/host/genminilua.lua | 0 lib/LuaJIT/{ => src}/host/minilua.c | 0 lib/LuaJIT/{ => src}/jit/.gitignore | 0 lib/LuaJIT/{ => src}/jit/bc.lua | 0 lib/LuaJIT/{ => src}/jit/bcsave.lua | 0 lib/LuaJIT/{ => src}/jit/dis_arm.lua | 0 lib/LuaJIT/{ => src}/jit/dis_arm64.lua | 0 lib/LuaJIT/{ => src}/jit/dis_arm64be.lua | 0 lib/LuaJIT/{ => src}/jit/dis_mips.lua | 0 lib/LuaJIT/{ => src}/jit/dis_mips64.lua | 0 lib/LuaJIT/{ => src}/jit/dis_mips64el.lua | 0 lib/LuaJIT/{ => src}/jit/dis_mipsel.lua | 0 lib/LuaJIT/{ => src}/jit/dis_ppc.lua | 0 lib/LuaJIT/{ => src}/jit/dis_x64.lua | 0 lib/LuaJIT/{ => src}/jit/dis_x86.lua | 0 lib/LuaJIT/{ => src}/jit/dump.lua | 0 lib/LuaJIT/{ => src}/jit/p.lua | 0 lib/LuaJIT/{ => src}/jit/v.lua | 0 lib/LuaJIT/{ => src}/jit/zone.lua | 0 lib/LuaJIT/{ => src}/lauxlib.h | 0 lib/LuaJIT/{ => src}/lib_aux.c | 0 lib/LuaJIT/{ => src}/lib_base.c | 0 lib/LuaJIT/{ => src}/lib_bit.c | 0 lib/LuaJIT/{ => src}/lib_debug.c | 0 lib/LuaJIT/{ => src}/lib_ffi.c | 0 lib/LuaJIT/{ => src}/lib_init.c | 0 lib/LuaJIT/{ => src}/lib_io.c | 0 lib/LuaJIT/{ => src}/lib_jit.c | 0 lib/LuaJIT/{ => src}/lib_math.c | 0 lib/LuaJIT/{ => src}/lib_os.c | 0 lib/LuaJIT/{ => src}/lib_package.c | 0 lib/LuaJIT/{ => src}/lib_string.c | 0 lib/LuaJIT/{ => src}/lib_table.c | 0 lib/LuaJIT/{ => src}/lj.supp | 0 lib/LuaJIT/{ => src}/lj_alloc.c | 0 lib/LuaJIT/{ => src}/lj_alloc.h | 0 lib/LuaJIT/{ => src}/lj_api.c | 0 lib/LuaJIT/{ => src}/lj_arch.h | 0 lib/LuaJIT/{ => src}/lj_asm.c | 0 lib/LuaJIT/{ => src}/lj_asm.h | 0 lib/LuaJIT/{ => src}/lj_asm_arm.h | 0 lib/LuaJIT/{ => src}/lj_asm_arm64.h | 0 lib/LuaJIT/{ => src}/lj_asm_mips.h | 0 lib/LuaJIT/{ => src}/lj_asm_ppc.h | 0 lib/LuaJIT/{ => src}/lj_asm_x86.h | 0 lib/LuaJIT/{ => src}/lj_bc.c | 0 lib/LuaJIT/{ => src}/lj_bc.h | 0 lib/LuaJIT/{ => src}/lj_bcdump.h | 0 lib/LuaJIT/{ => src}/lj_bcread.c | 0 lib/LuaJIT/{ => src}/lj_bcwrite.c | 0 lib/LuaJIT/{ => src}/lj_buf.c | 0 lib/LuaJIT/{ => src}/lj_buf.h | 0 lib/LuaJIT/{ => src}/lj_carith.c | 0 lib/LuaJIT/{ => src}/lj_carith.h | 0 lib/LuaJIT/{ => src}/lj_ccall.c | 0 lib/LuaJIT/{ => src}/lj_ccall.h | 0 lib/LuaJIT/{ => src}/lj_ccallback.c | 0 lib/LuaJIT/{ => src}/lj_ccallback.h | 0 lib/LuaJIT/{ => src}/lj_cconv.c | 0 lib/LuaJIT/{ => src}/lj_cconv.h | 0 lib/LuaJIT/{ => src}/lj_cdata.c | 0 lib/LuaJIT/{ => src}/lj_cdata.h | 0 lib/LuaJIT/{ => src}/lj_char.c | 0 lib/LuaJIT/{ => src}/lj_char.h | 0 lib/LuaJIT/{ => src}/lj_clib.c | 0 lib/LuaJIT/{ => src}/lj_clib.h | 0 lib/LuaJIT/{ => src}/lj_cparse.c | 0 lib/LuaJIT/{ => src}/lj_cparse.h | 0 lib/LuaJIT/{ => src}/lj_crecord.c | 0 lib/LuaJIT/{ => src}/lj_crecord.h | 0 lib/LuaJIT/{ => src}/lj_ctype.c | 0 lib/LuaJIT/{ => src}/lj_ctype.h | 0 lib/LuaJIT/{ => src}/lj_debug.c | 0 lib/LuaJIT/{ => src}/lj_debug.h | 0 lib/LuaJIT/{ => src}/lj_def.h | 0 lib/LuaJIT/{ => src}/lj_dispatch.c | 0 lib/LuaJIT/{ => src}/lj_dispatch.h | 0 lib/LuaJIT/{ => src}/lj_emit_arm.h | 0 lib/LuaJIT/{ => src}/lj_emit_arm64.h | 0 lib/LuaJIT/{ => src}/lj_emit_mips.h | 0 lib/LuaJIT/{ => src}/lj_emit_ppc.h | 0 lib/LuaJIT/{ => src}/lj_emit_x86.h | 0 lib/LuaJIT/{ => src}/lj_err.c | 0 lib/LuaJIT/{ => src}/lj_err.h | 0 lib/LuaJIT/{ => src}/lj_errmsg.h | 0 lib/LuaJIT/{ => src}/lj_ff.h | 0 lib/LuaJIT/{ => src}/lj_ffrecord.c | 0 lib/LuaJIT/{ => src}/lj_ffrecord.h | 0 lib/LuaJIT/{ => src}/lj_frame.h | 0 lib/LuaJIT/{ => src}/lj_func.c | 0 lib/LuaJIT/{ => src}/lj_func.h | 0 lib/LuaJIT/{ => src}/lj_gc.c | 0 lib/LuaJIT/{ => src}/lj_gc.h | 0 lib/LuaJIT/{ => src}/lj_gdbjit.c | 0 lib/LuaJIT/{ => src}/lj_gdbjit.h | 0 lib/LuaJIT/{ => src}/lj_ir.c | 0 lib/LuaJIT/{ => src}/lj_ir.h | 0 lib/LuaJIT/{ => src}/lj_ircall.h | 0 lib/LuaJIT/{ => src}/lj_iropt.h | 0 lib/LuaJIT/{ => src}/lj_jit.h | 0 lib/LuaJIT/{ => src}/lj_lex.c | 0 lib/LuaJIT/{ => src}/lj_lex.h | 0 lib/LuaJIT/{ => src}/lj_lib.c | 0 lib/LuaJIT/{ => src}/lj_lib.h | 0 lib/LuaJIT/{ => src}/lj_load.c | 0 lib/LuaJIT/{ => src}/lj_mcode.c | 0 lib/LuaJIT/{ => src}/lj_mcode.h | 0 lib/LuaJIT/{ => src}/lj_meta.c | 0 lib/LuaJIT/{ => src}/lj_meta.h | 0 lib/LuaJIT/{ => src}/lj_obj.c | 0 lib/LuaJIT/{ => src}/lj_obj.h | 0 lib/LuaJIT/{ => src}/lj_opt_dce.c | 0 lib/LuaJIT/{ => src}/lj_opt_fold.c | 0 lib/LuaJIT/{ => src}/lj_opt_loop.c | 0 lib/LuaJIT/{ => src}/lj_opt_mem.c | 0 lib/LuaJIT/{ => src}/lj_opt_narrow.c | 0 lib/LuaJIT/{ => src}/lj_opt_sink.c | 0 lib/LuaJIT/{ => src}/lj_opt_split.c | 0 lib/LuaJIT/{ => src}/lj_parse.c | 0 lib/LuaJIT/{ => src}/lj_parse.h | 0 lib/LuaJIT/{ => src}/lj_profile.c | 0 lib/LuaJIT/{ => src}/lj_profile.h | 0 lib/LuaJIT/{ => src}/lj_record.c | 0 lib/LuaJIT/{ => src}/lj_record.h | 0 lib/LuaJIT/{ => src}/lj_snap.c | 0 lib/LuaJIT/{ => src}/lj_snap.h | 0 lib/LuaJIT/{ => src}/lj_state.c | 0 lib/LuaJIT/{ => src}/lj_state.h | 0 lib/LuaJIT/{ => src}/lj_str.c | 0 lib/LuaJIT/{ => src}/lj_str.h | 0 lib/LuaJIT/{ => src}/lj_strfmt.c | 0 lib/LuaJIT/{ => src}/lj_strfmt.h | 0 lib/LuaJIT/{ => src}/lj_strfmt_num.c | 0 lib/LuaJIT/{ => src}/lj_strscan.c | 0 lib/LuaJIT/{ => src}/lj_strscan.h | 0 lib/LuaJIT/{ => src}/lj_tab.c | 0 lib/LuaJIT/{ => src}/lj_tab.h | 0 lib/LuaJIT/{ => src}/lj_target.h | 0 lib/LuaJIT/{ => src}/lj_target_arm.h | 0 lib/LuaJIT/{ => src}/lj_target_arm64.h | 0 lib/LuaJIT/{ => src}/lj_target_mips.h | 0 lib/LuaJIT/{ => src}/lj_target_ppc.h | 0 lib/LuaJIT/{ => src}/lj_target_x86.h | 0 lib/LuaJIT/{ => src}/lj_trace.c | 0 lib/LuaJIT/{ => src}/lj_trace.h | 0 lib/LuaJIT/{ => src}/lj_traceerr.h | 0 lib/LuaJIT/{ => src}/lj_udata.c | 0 lib/LuaJIT/{ => src}/lj_udata.h | 0 lib/LuaJIT/{ => src}/lj_vm.h | 0 lib/LuaJIT/{ => src}/lj_vmevent.c | 0 lib/LuaJIT/{ => src}/lj_vmevent.h | 0 lib/LuaJIT/{ => src}/lj_vmmath.c | 0 lib/LuaJIT/{ => src}/ljamalg.c | 0 lib/LuaJIT/{ => src}/lua.h | 0 lib/LuaJIT/{ => src}/lua.hpp | 0 lib/LuaJIT/{ => src}/luaconf.h | 0 lib/LuaJIT/{ => src}/luajit.c | 0 lib/LuaJIT/{ => src}/luajit.h | 0 lib/LuaJIT/{ => src}/lualib.h | 0 lib/LuaJIT/{ => src}/msvcbuild.bat | 0 lib/LuaJIT/{ => src}/ps4build.bat | 0 lib/LuaJIT/{ => src}/psvitabuild.bat | 0 lib/LuaJIT/{ => src}/vm_arm.dasc | 0 lib/LuaJIT/{ => src}/vm_arm64.dasc | 0 lib/LuaJIT/{ => src}/vm_mips.dasc | 0 lib/LuaJIT/{ => src}/vm_mips64.dasc | 0 lib/LuaJIT/{ => src}/vm_ppc.dasc | 0 lib/LuaJIT/{ => src}/vm_x64.dasc | 0 lib/LuaJIT/{ => src}/vm_x86.dasc | 0 lib/LuaJIT/{ => src}/xb1build.bat | 0 lib/LuaJIT/{ => src}/xedkbuild.bat | 0 lib/libentityx.a | Bin 390786 -> 414808 bytes 225 files changed, 19187 insertions(+), 690 deletions(-) create mode 100644 lib/LuaJIT/.gitignore create mode 100644 lib/LuaJIT/COPYRIGHT create mode 100644 lib/LuaJIT/README create mode 100644 lib/LuaJIT/doc/bluequad-print.css create mode 100644 lib/LuaJIT/doc/bluequad.css create mode 100644 lib/LuaJIT/doc/changes.html create mode 100644 lib/LuaJIT/doc/contact.html create mode 100644 lib/LuaJIT/doc/ext_c_api.html create mode 100644 lib/LuaJIT/doc/ext_ffi.html create mode 100644 lib/LuaJIT/doc/ext_ffi_api.html create mode 100644 lib/LuaJIT/doc/ext_ffi_semantics.html create mode 100644 lib/LuaJIT/doc/ext_ffi_tutorial.html create mode 100644 lib/LuaJIT/doc/ext_jit.html create mode 100644 lib/LuaJIT/doc/ext_profiler.html create mode 100644 lib/LuaJIT/doc/extensions.html create mode 100644 lib/LuaJIT/doc/faq.html create mode 100644 lib/LuaJIT/doc/img/contact.png create mode 100644 lib/LuaJIT/doc/install.html create mode 100644 lib/LuaJIT/doc/luajit.html create mode 100644 lib/LuaJIT/doc/running.html create mode 100644 lib/LuaJIT/doc/status.html create mode 100644 lib/LuaJIT/dynasm/dasm_arm.h create mode 100644 lib/LuaJIT/dynasm/dasm_arm.lua create mode 100644 lib/LuaJIT/dynasm/dasm_arm64.h create mode 100644 lib/LuaJIT/dynasm/dasm_arm64.lua create mode 100644 lib/LuaJIT/dynasm/dasm_mips.h create mode 100644 lib/LuaJIT/dynasm/dasm_mips.lua create mode 100644 lib/LuaJIT/dynasm/dasm_mips64.lua create mode 100644 lib/LuaJIT/dynasm/dasm_ppc.h create mode 100644 lib/LuaJIT/dynasm/dasm_ppc.lua create mode 100644 lib/LuaJIT/dynasm/dasm_proto.h create mode 100644 lib/LuaJIT/dynasm/dasm_x64.lua create mode 100644 lib/LuaJIT/dynasm/dasm_x86.h create mode 100644 lib/LuaJIT/dynasm/dasm_x86.lua create mode 100644 lib/LuaJIT/dynasm/dynasm.lua create mode 100644 lib/LuaJIT/etc/luajit.1 create mode 100644 lib/LuaJIT/etc/luajit.pc delete mode 100644 lib/LuaJIT/libluajit.a delete mode 100755 lib/LuaJIT/libluajit.so create mode 100644 lib/LuaJIT/src/.gitignore create mode 100644 lib/LuaJIT/src/Makefile rename lib/LuaJIT/{ => src}/Makefile.dep (100%) rename lib/LuaJIT/{ => src}/host/.gitignore (100%) rename lib/LuaJIT/{ => src}/host/README (100%) rename lib/LuaJIT/{ => src}/host/buildvm.c (100%) rename lib/LuaJIT/{ => src}/host/buildvm.h (100%) rename lib/LuaJIT/{ => src}/host/buildvm_asm.c (100%) rename lib/LuaJIT/{ => src}/host/buildvm_fold.c (100%) rename lib/LuaJIT/{ => src}/host/buildvm_lib.c (100%) rename lib/LuaJIT/{ => src}/host/buildvm_libbc.h (100%) rename lib/LuaJIT/{ => src}/host/buildvm_peobj.c (100%) rename lib/LuaJIT/{ => src}/host/genlibbc.lua (100%) rename lib/LuaJIT/{ => src}/host/genminilua.lua (100%) rename lib/LuaJIT/{ => src}/host/minilua.c (100%) rename lib/LuaJIT/{ => src}/jit/.gitignore (100%) rename lib/LuaJIT/{ => src}/jit/bc.lua (100%) rename lib/LuaJIT/{ => src}/jit/bcsave.lua (100%) rename lib/LuaJIT/{ => src}/jit/dis_arm.lua (100%) rename lib/LuaJIT/{ => src}/jit/dis_arm64.lua (100%) rename lib/LuaJIT/{ => src}/jit/dis_arm64be.lua (100%) rename lib/LuaJIT/{ => src}/jit/dis_mips.lua (100%) rename lib/LuaJIT/{ => src}/jit/dis_mips64.lua (100%) rename lib/LuaJIT/{ => src}/jit/dis_mips64el.lua (100%) rename lib/LuaJIT/{ => src}/jit/dis_mipsel.lua (100%) rename lib/LuaJIT/{ => src}/jit/dis_ppc.lua (100%) rename lib/LuaJIT/{ => src}/jit/dis_x64.lua (100%) rename lib/LuaJIT/{ => src}/jit/dis_x86.lua (100%) rename lib/LuaJIT/{ => src}/jit/dump.lua (100%) rename lib/LuaJIT/{ => src}/jit/p.lua (100%) rename lib/LuaJIT/{ => src}/jit/v.lua (100%) rename lib/LuaJIT/{ => src}/jit/zone.lua (100%) rename lib/LuaJIT/{ => src}/lauxlib.h (100%) rename lib/LuaJIT/{ => src}/lib_aux.c (100%) rename lib/LuaJIT/{ => src}/lib_base.c (100%) rename lib/LuaJIT/{ => src}/lib_bit.c (100%) rename lib/LuaJIT/{ => src}/lib_debug.c (100%) rename lib/LuaJIT/{ => src}/lib_ffi.c (100%) rename lib/LuaJIT/{ => src}/lib_init.c (100%) rename lib/LuaJIT/{ => src}/lib_io.c (100%) rename lib/LuaJIT/{ => src}/lib_jit.c (100%) rename lib/LuaJIT/{ => src}/lib_math.c (100%) rename lib/LuaJIT/{ => src}/lib_os.c (100%) rename lib/LuaJIT/{ => src}/lib_package.c (100%) rename lib/LuaJIT/{ => src}/lib_string.c (100%) rename lib/LuaJIT/{ => src}/lib_table.c (100%) rename lib/LuaJIT/{ => src}/lj.supp (100%) rename lib/LuaJIT/{ => src}/lj_alloc.c (100%) rename lib/LuaJIT/{ => src}/lj_alloc.h (100%) rename lib/LuaJIT/{ => src}/lj_api.c (100%) rename lib/LuaJIT/{ => src}/lj_arch.h (100%) rename lib/LuaJIT/{ => src}/lj_asm.c (100%) rename lib/LuaJIT/{ => src}/lj_asm.h (100%) rename lib/LuaJIT/{ => src}/lj_asm_arm.h (100%) rename lib/LuaJIT/{ => src}/lj_asm_arm64.h (100%) rename lib/LuaJIT/{ => src}/lj_asm_mips.h (100%) rename lib/LuaJIT/{ => src}/lj_asm_ppc.h (100%) rename lib/LuaJIT/{ => src}/lj_asm_x86.h (100%) rename lib/LuaJIT/{ => src}/lj_bc.c (100%) rename lib/LuaJIT/{ => src}/lj_bc.h (100%) rename lib/LuaJIT/{ => src}/lj_bcdump.h (100%) rename lib/LuaJIT/{ => src}/lj_bcread.c (100%) rename lib/LuaJIT/{ => src}/lj_bcwrite.c (100%) rename lib/LuaJIT/{ => src}/lj_buf.c (100%) rename lib/LuaJIT/{ => src}/lj_buf.h (100%) rename lib/LuaJIT/{ => src}/lj_carith.c (100%) rename lib/LuaJIT/{ => src}/lj_carith.h (100%) rename lib/LuaJIT/{ => src}/lj_ccall.c (100%) rename lib/LuaJIT/{ => src}/lj_ccall.h (100%) rename lib/LuaJIT/{ => src}/lj_ccallback.c (100%) rename lib/LuaJIT/{ => src}/lj_ccallback.h (100%) rename lib/LuaJIT/{ => src}/lj_cconv.c (100%) rename lib/LuaJIT/{ => src}/lj_cconv.h (100%) rename lib/LuaJIT/{ => src}/lj_cdata.c (100%) rename lib/LuaJIT/{ => src}/lj_cdata.h (100%) rename lib/LuaJIT/{ => src}/lj_char.c (100%) rename lib/LuaJIT/{ => src}/lj_char.h (100%) rename lib/LuaJIT/{ => src}/lj_clib.c (100%) rename lib/LuaJIT/{ => src}/lj_clib.h (100%) rename lib/LuaJIT/{ => src}/lj_cparse.c (100%) rename lib/LuaJIT/{ => src}/lj_cparse.h (100%) rename lib/LuaJIT/{ => src}/lj_crecord.c (100%) rename lib/LuaJIT/{ => src}/lj_crecord.h (100%) rename lib/LuaJIT/{ => src}/lj_ctype.c (100%) rename lib/LuaJIT/{ => src}/lj_ctype.h (100%) rename lib/LuaJIT/{ => src}/lj_debug.c (100%) rename lib/LuaJIT/{ => src}/lj_debug.h (100%) rename lib/LuaJIT/{ => src}/lj_def.h (100%) rename lib/LuaJIT/{ => src}/lj_dispatch.c (100%) rename lib/LuaJIT/{ => src}/lj_dispatch.h (100%) rename lib/LuaJIT/{ => src}/lj_emit_arm.h (100%) rename lib/LuaJIT/{ => src}/lj_emit_arm64.h (100%) rename lib/LuaJIT/{ => src}/lj_emit_mips.h (100%) rename lib/LuaJIT/{ => src}/lj_emit_ppc.h (100%) rename lib/LuaJIT/{ => src}/lj_emit_x86.h (100%) rename lib/LuaJIT/{ => src}/lj_err.c (100%) rename lib/LuaJIT/{ => src}/lj_err.h (100%) rename lib/LuaJIT/{ => src}/lj_errmsg.h (100%) rename lib/LuaJIT/{ => src}/lj_ff.h (100%) rename lib/LuaJIT/{ => src}/lj_ffrecord.c (100%) rename lib/LuaJIT/{ => src}/lj_ffrecord.h (100%) rename lib/LuaJIT/{ => src}/lj_frame.h (100%) rename lib/LuaJIT/{ => src}/lj_func.c (100%) rename lib/LuaJIT/{ => src}/lj_func.h (100%) rename lib/LuaJIT/{ => src}/lj_gc.c (100%) rename lib/LuaJIT/{ => src}/lj_gc.h (100%) rename lib/LuaJIT/{ => src}/lj_gdbjit.c (100%) rename lib/LuaJIT/{ => src}/lj_gdbjit.h (100%) rename lib/LuaJIT/{ => src}/lj_ir.c (100%) rename lib/LuaJIT/{ => src}/lj_ir.h (100%) rename lib/LuaJIT/{ => src}/lj_ircall.h (100%) rename lib/LuaJIT/{ => src}/lj_iropt.h (100%) rename lib/LuaJIT/{ => src}/lj_jit.h (100%) rename lib/LuaJIT/{ => src}/lj_lex.c (100%) rename lib/LuaJIT/{ => src}/lj_lex.h (100%) rename lib/LuaJIT/{ => src}/lj_lib.c (100%) rename lib/LuaJIT/{ => src}/lj_lib.h (100%) rename lib/LuaJIT/{ => src}/lj_load.c (100%) rename lib/LuaJIT/{ => src}/lj_mcode.c (100%) rename lib/LuaJIT/{ => src}/lj_mcode.h (100%) rename lib/LuaJIT/{ => src}/lj_meta.c (100%) rename lib/LuaJIT/{ => src}/lj_meta.h (100%) rename lib/LuaJIT/{ => src}/lj_obj.c (100%) rename lib/LuaJIT/{ => src}/lj_obj.h (100%) rename lib/LuaJIT/{ => src}/lj_opt_dce.c (100%) rename lib/LuaJIT/{ => src}/lj_opt_fold.c (100%) rename lib/LuaJIT/{ => src}/lj_opt_loop.c (100%) rename lib/LuaJIT/{ => src}/lj_opt_mem.c (100%) rename lib/LuaJIT/{ => src}/lj_opt_narrow.c (100%) rename lib/LuaJIT/{ => src}/lj_opt_sink.c (100%) rename lib/LuaJIT/{ => src}/lj_opt_split.c (100%) rename lib/LuaJIT/{ => src}/lj_parse.c (100%) rename lib/LuaJIT/{ => src}/lj_parse.h (100%) rename lib/LuaJIT/{ => src}/lj_profile.c (100%) rename lib/LuaJIT/{ => src}/lj_profile.h (100%) rename lib/LuaJIT/{ => src}/lj_record.c (100%) rename lib/LuaJIT/{ => src}/lj_record.h (100%) rename lib/LuaJIT/{ => src}/lj_snap.c (100%) rename lib/LuaJIT/{ => src}/lj_snap.h (100%) rename lib/LuaJIT/{ => src}/lj_state.c (100%) rename lib/LuaJIT/{ => src}/lj_state.h (100%) rename lib/LuaJIT/{ => src}/lj_str.c (100%) rename lib/LuaJIT/{ => src}/lj_str.h (100%) rename lib/LuaJIT/{ => src}/lj_strfmt.c (100%) rename lib/LuaJIT/{ => src}/lj_strfmt.h (100%) rename lib/LuaJIT/{ => src}/lj_strfmt_num.c (100%) rename lib/LuaJIT/{ => src}/lj_strscan.c (100%) rename lib/LuaJIT/{ => src}/lj_strscan.h (100%) rename lib/LuaJIT/{ => src}/lj_tab.c (100%) rename lib/LuaJIT/{ => src}/lj_tab.h (100%) rename lib/LuaJIT/{ => src}/lj_target.h (100%) rename lib/LuaJIT/{ => src}/lj_target_arm.h (100%) rename lib/LuaJIT/{ => src}/lj_target_arm64.h (100%) rename lib/LuaJIT/{ => src}/lj_target_mips.h (100%) rename lib/LuaJIT/{ => src}/lj_target_ppc.h (100%) rename lib/LuaJIT/{ => src}/lj_target_x86.h (100%) rename lib/LuaJIT/{ => src}/lj_trace.c (100%) rename lib/LuaJIT/{ => src}/lj_trace.h (100%) rename lib/LuaJIT/{ => src}/lj_traceerr.h (100%) rename lib/LuaJIT/{ => src}/lj_udata.c (100%) rename lib/LuaJIT/{ => src}/lj_udata.h (100%) rename lib/LuaJIT/{ => src}/lj_vm.h (100%) rename lib/LuaJIT/{ => src}/lj_vmevent.c (100%) rename lib/LuaJIT/{ => src}/lj_vmevent.h (100%) rename lib/LuaJIT/{ => src}/lj_vmmath.c (100%) rename lib/LuaJIT/{ => src}/ljamalg.c (100%) rename lib/LuaJIT/{ => src}/lua.h (100%) rename lib/LuaJIT/{ => src}/lua.hpp (100%) rename lib/LuaJIT/{ => src}/luaconf.h (100%) rename lib/LuaJIT/{ => src}/luajit.c (100%) rename lib/LuaJIT/{ => src}/luajit.h (100%) rename lib/LuaJIT/{ => src}/lualib.h (100%) rename lib/LuaJIT/{ => src}/msvcbuild.bat (100%) rename lib/LuaJIT/{ => src}/ps4build.bat (100%) rename lib/LuaJIT/{ => src}/psvitabuild.bat (100%) rename lib/LuaJIT/{ => src}/vm_arm.dasc (100%) rename lib/LuaJIT/{ => src}/vm_arm64.dasc (100%) rename lib/LuaJIT/{ => src}/vm_mips.dasc (100%) rename lib/LuaJIT/{ => src}/vm_mips64.dasc (100%) rename lib/LuaJIT/{ => src}/vm_ppc.dasc (100%) rename lib/LuaJIT/{ => src}/vm_x64.dasc (100%) rename lib/LuaJIT/{ => src}/vm_x86.dasc (100%) rename lib/LuaJIT/{ => src}/xb1build.bat (100%) rename lib/LuaJIT/{ => src}/xedkbuild.bat (100%) diff --git a/lib/LuaJIT/.gitignore b/lib/LuaJIT/.gitignore new file mode 100644 index 0000000..1a07bf7 --- /dev/null +++ b/lib/LuaJIT/.gitignore @@ -0,0 +1,11 @@ +*.[oa] +*.so +*.obj +*.lib +*.exp +*.dll +*.exe +*.manifest +*.dmp +*.swp +.tags diff --git a/lib/LuaJIT/COPYRIGHT b/lib/LuaJIT/COPYRIGHT new file mode 100644 index 0000000..6ed4002 --- /dev/null +++ b/lib/LuaJIT/COPYRIGHT @@ -0,0 +1,56 @@ +=============================================================================== +LuaJIT -- a Just-In-Time Compiler for Lua. http://luajit.org/ + +Copyright (C) 2005-2017 Mike Pall. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +[ MIT license: http://www.opensource.org/licenses/mit-license.php ] + +=============================================================================== +[ LuaJIT includes code from Lua 5.1/5.2, which has this license statement: ] + +Copyright (C) 1994-2012 Lua.org, PUC-Rio. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +=============================================================================== +[ LuaJIT includes code from dlmalloc, which has this license statement: ] + +This is a version (aka dlmalloc) of malloc/free/realloc written by +Doug Lea and released to the public domain, as explained at +http://creativecommons.org/licenses/publicdomain + +=============================================================================== diff --git a/lib/LuaJIT/Makefile b/lib/LuaJIT/Makefile index d22eb73..0f93308 100644 --- a/lib/LuaJIT/Makefile +++ b/lib/LuaJIT/Makefile @@ -1,11 +1,14 @@ ############################################################################## -# LuaJIT Makefile. Requires GNU Make. +# LuaJIT top level Makefile for installation. Requires GNU Make. # # Please read doc/install.html before changing any variables! # # Suitable for POSIX platforms (Linux, *BSD, OSX etc.). -# Also works with MinGW and Cygwin on Windows. -# Please check msvcbuild.bat for building with MSVC on Windows. +# Note: src/Makefile has many more configurable options. +# +# ##### This Makefile is NOT useful for Windows! ##### +# For MSVC, please follow the instructions given in src/msvcbuild.bat. +# For MinGW and Cygwin, cd to src and run make with the Makefile there. # # Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h ############################################################################## @@ -13,709 +16,151 @@ MAJVER= 2 MINVER= 1 RELVER= 0 +PREREL= -beta3 +VERSION= $(MAJVER).$(MINVER).$(RELVER)$(PREREL) ABIVER= 5.1 -NODOTABIVER= 51 - -############################################################################## -############################# COMPILER OPTIONS ############################# -############################################################################## -# These options mainly affect the speed of the JIT compiler itself, not the -# speed of the JIT-compiled code. Turn any of the optional settings on by -# removing the '#' in front of them. Make sure you force a full recompile -# with "make clean", followed by "make" if you change any options. -# -DEFAULT_CC = gcc -# -# LuaJIT builds as a native 32 or 64 bit binary by default. -CC= $(DEFAULT_CC) -# -# Use this if you want to force a 32 bit build on a 64 bit multilib OS. -#CC= $(DEFAULT_CC) -m32 -# -# Since the assembler part does NOT maintain a frame pointer, it's pointless -# to slow down the C part by not omitting it. Debugging, tracebacks and -# unwinding are not affected -- the assembler part has frame unwind -# information and GCC emits it where needed (x64) or with -g (see CCDEBUG). -CCOPT= -O2 -fomit-frame-pointer -# Use this if you want to generate a smaller binary (but it's slower): -#CCOPT= -Os -fomit-frame-pointer -# Note: it's no longer recommended to use -O3 with GCC 4.x. -# The I-Cache bloat usually outweighs the benefits from aggressive inlining. -# -# Target-specific compiler options: -# -# x86/x64 only: For GCC 4.2 or higher and if you don't intend to distribute -# the binaries to a different machine you could also use: -march=native -# -CCOPT_x86= -march=i686 -msse -msse2 -mfpmath=sse -CCOPT_x64= -CCOPT_arm= -CCOPT_arm64= -CCOPT_ppc= -CCOPT_mips= -# -CCDEBUG= -# Uncomment the next line to generate debug information: -#CCDEBUG= -g -# -CCWARN= -Wall -# Uncomment the next line to enable more warnings: -#CCWARN+= -Wextra -Wdeclaration-after-statement -Wredundant-decls -Wshadow -Wpointer-arith -# -############################################################################## - -############################################################################## -################################ BUILD MODE ################################ -############################################################################## -# The default build mode is mixed mode on POSIX. On Windows this is the same -# as dynamic mode. -# -# Mixed mode creates a static + dynamic library and a statically linked luajit. -BUILDMODE= mixed -# -# Static mode creates a static library and a statically linked luajit. -#BUILDMODE= static -# -# Dynamic mode creates a dynamic library and a dynamically linked luajit. -# Note: this executable will only run when the library is installed! -#BUILDMODE= dynamic -# -############################################################################## ############################################################################## -################################# FEATURES ################################# -############################################################################## -# Enable/disable these features as needed, but make sure you force a full -# recompile with "make clean", followed by "make". -XCFLAGS= # -# Permanently disable the FFI extension to reduce the size of the LuaJIT -# executable. But please consider that the FFI library is compiled-in, -# but NOT loaded by default. It only allocates any memory, if you actually -# make use of it. -#XCFLAGS+= -DLUAJIT_DISABLE_FFI -# -# Features from Lua 5.2 that are unlikely to break existing code are -# enabled by default. Some other features that *might* break some existing -# code (e.g. __pairs or os.execute() return values) can be enabled here. -# Note: this does not provide full compatibility with Lua 5.2 at this time. -#XCFLAGS+= -DLUAJIT_ENABLE_LUA52COMPAT -# -# Disable the JIT compiler, i.e. turn LuaJIT into a pure interpreter. -#XCFLAGS+= -DLUAJIT_DISABLE_JIT -# -# Some architectures (e.g. PPC) can use either single-number (1) or -# dual-number (2) mode. Uncomment one of these lines to override the -# default mode. Please see LJ_ARCH_NUMMODE in lj_arch.h for details. -#XCFLAGS+= -DLUAJIT_NUMMODE=1 -#XCFLAGS+= -DLUAJIT_NUMMODE=2 -# -# Enable GC64 mode for x64. -#XCFLAGS+= -DLUAJIT_ENABLE_GC64 -# -############################################################################## - -############################################################################## -############################ DEBUGGING SUPPORT ############################# -############################################################################## -# Enable these options as needed, but make sure you force a full recompile -# with "make clean", followed by "make". -# Note that most of these are NOT suitable for benchmarking or release mode! -# -# Use the system provided memory allocator (realloc) instead of the -# bundled memory allocator. This is slower, but sometimes helpful for -# debugging. This option cannot be enabled on x64 without GC64, since -# realloc usually doesn't return addresses in the right address range. -# OTOH this option is mandatory for Valgrind's memcheck tool on x64 and -# the only way to get useful results from it for all other architectures. -#XCFLAGS+= -DLUAJIT_USE_SYSMALLOC -# -# This define is required to run LuaJIT under Valgrind. The Valgrind -# header files must be installed. You should enable debug information, too. -# Use --suppressions=lj.supp to avoid some false positives. -#XCFLAGS+= -DLUAJIT_USE_VALGRIND -# -# This is the client for the GDB JIT API. GDB 7.0 or higher is required -# to make use of it. See lj_gdbjit.c for details. Enabling this causes -# a non-negligible overhead, even when not running under GDB. -#XCFLAGS+= -DLUAJIT_USE_GDBJIT -# -# Turn on assertions for the Lua/C API to debug problems with lua_* calls. -# This is rather slow -- use only while developing C libraries/embeddings. -#XCFLAGS+= -DLUA_USE_APICHECK -# -# Turn on assertions for the whole LuaJIT VM. This significantly slows down -# everything. Use only if you suspect a problem with LuaJIT itself. -#XCFLAGS+= -DLUA_USE_ASSERT -# -############################################################################## -# You probably don't need to change anything below this line! -############################################################################## - -############################################################################## -# Host system detection. -############################################################################## - -ifeq (Windows,$(findstring Windows,$(OS))$(MSYSTEM)$(TERM)) - HOST_SYS= Windows - HOST_RM= del -else +# Change the installation path as needed. This automatically adjusts +# the paths in src/luaconf.h, too. Note: PREFIX must be an absolute path! +# +export PREFIX= /usr/local +export MULTILIB= lib +############################################################################## + +DPREFIX= $(DESTDIR)$(PREFIX) +INSTALL_BIN= $(DPREFIX)/bin +INSTALL_LIB= $(DPREFIX)/$(MULTILIB) +INSTALL_SHARE= $(DPREFIX)/share +INSTALL_INC= $(DPREFIX)/include/luajit-$(MAJVER).$(MINVER) + +INSTALL_LJLIBD= $(INSTALL_SHARE)/luajit-$(VERSION) +INSTALL_JITLIB= $(INSTALL_LJLIBD)/jit +INSTALL_LMODD= $(INSTALL_SHARE)/lua +INSTALL_LMOD= $(INSTALL_LMODD)/$(ABIVER) +INSTALL_CMODD= $(INSTALL_LIB)/lua +INSTALL_CMOD= $(INSTALL_CMODD)/$(ABIVER) +INSTALL_MAN= $(INSTALL_SHARE)/man/man1 +INSTALL_PKGCONFIG= $(INSTALL_LIB)/pkgconfig + +INSTALL_TNAME= luajit-$(VERSION) +INSTALL_TSYMNAME= luajit +INSTALL_ANAME= libluajit-$(ABIVER).a +INSTALL_SOSHORT1= libluajit-$(ABIVER).so +INSTALL_SOSHORT2= libluajit-$(ABIVER).so.$(MAJVER) +INSTALL_SONAME= $(INSTALL_SOSHORT2).$(MINVER).$(RELVER) +INSTALL_DYLIBSHORT1= libluajit-$(ABIVER).dylib +INSTALL_DYLIBSHORT2= libluajit-$(ABIVER).$(MAJVER).dylib +INSTALL_DYLIBNAME= libluajit-$(ABIVER).$(MAJVER).$(MINVER).$(RELVER).dylib +INSTALL_PCNAME= luajit.pc + +INSTALL_STATIC= $(INSTALL_LIB)/$(INSTALL_ANAME) +INSTALL_DYN= $(INSTALL_LIB)/$(INSTALL_SONAME) +INSTALL_SHORT1= $(INSTALL_LIB)/$(INSTALL_SOSHORT1) +INSTALL_SHORT2= $(INSTALL_LIB)/$(INSTALL_SOSHORT2) +INSTALL_T= $(INSTALL_BIN)/$(INSTALL_TNAME) +INSTALL_TSYM= $(INSTALL_BIN)/$(INSTALL_TSYMNAME) +INSTALL_PC= $(INSTALL_PKGCONFIG)/$(INSTALL_PCNAME) + +INSTALL_DIRS= $(INSTALL_BIN) $(INSTALL_LIB) $(INSTALL_INC) $(INSTALL_MAN) \ + $(INSTALL_PKGCONFIG) $(INSTALL_JITLIB) $(INSTALL_LMOD) $(INSTALL_CMOD) +UNINSTALL_DIRS= $(INSTALL_JITLIB) $(INSTALL_LJLIBD) $(INSTALL_INC) \ + $(INSTALL_LMOD) $(INSTALL_LMODD) $(INSTALL_CMOD) $(INSTALL_CMODD) + +RM= rm -f +MKDIR= mkdir -p +RMDIR= rmdir 2>/dev/null +SYMLINK= ln -sf +INSTALL_X= install -m 0755 +INSTALL_F= install -m 0644 +UNINSTALL= $(RM) +LDCONFIG= ldconfig -n +SED_PC= sed -e "s|^prefix=.*|prefix=$(PREFIX)|" \ + -e "s|^multilib=.*|multilib=$(MULTILIB)|" + +FILE_T= luajit +FILE_A= libluajit.a +FILE_SO= libluajit.so +FILE_MAN= luajit.1 +FILE_PC= luajit.pc +FILES_INC= lua.h lualib.h lauxlib.h luaconf.h lua.hpp luajit.h +FILES_JITLIB= bc.lua bcsave.lua dump.lua p.lua v.lua zone.lua \ + dis_x86.lua dis_x64.lua dis_arm.lua dis_arm64.lua \ + dis_arm64be.lua dis_ppc.lua dis_mips.lua dis_mipsel.lua \ + dis_mips64.lua dis_mips64el.lua vmdef.lua + +ifeq (,$(findstring Windows,$(OS))) HOST_SYS:= $(shell uname -s) - ifneq (,$(findstring MINGW,$(HOST_SYS))) - HOST_SYS= Windows - HOST_MSYS= mingw - endif - ifneq (,$(findstring MSYS,$(HOST_SYS))) - HOST_SYS= Windows - HOST_MSYS= mingw - endif - ifneq (,$(findstring CYGWIN,$(HOST_SYS))) - HOST_SYS= Windows - HOST_MSYS= cygwin - endif -endif - -############################################################################## -# Flags and options for host and target. -############################################################################## - -# You can override the following variables at the make command line: -# CC HOST_CC STATIC_CC DYNAMIC_CC -# CFLAGS HOST_CFLAGS TARGET_CFLAGS -# LDFLAGS HOST_LDFLAGS TARGET_LDFLAGS TARGET_SHLDFLAGS -# LIBS HOST_LIBS TARGET_LIBS -# CROSS HOST_SYS TARGET_SYS TARGET_FLAGS -# -# Cross-compilation examples: -# make HOST_CC="gcc -m32" CROSS=i586-mingw32msvc- TARGET_SYS=Windows -# make HOST_CC="gcc -m32" CROSS=powerpc-linux-gnu- - -ASOPTIONS= $(CCOPT) $(CCWARN) $(XCFLAGS) $(CFLAGS) -CCOPTIONS= $(CCDEBUG) $(ASOPTIONS) -LDOPTIONS= $(CCDEBUG) $(LDFLAGS) - -HOST_CC= $(CC) -HOST_RM?= rm -f -# If left blank, minilua is built and used. You can supply an installed -# copy of (plain) Lua 5.1 or 5.2, plus Lua BitOp. E.g. with: HOST_LUA=lua -HOST_LUA= - -HOST_XCFLAGS= -I. -HOST_XLDFLAGS= -HOST_XLIBS= -HOST_ACFLAGS= $(CCOPTIONS) $(HOST_XCFLAGS) $(TARGET_ARCH) $(HOST_CFLAGS) -HOST_ALDFLAGS= $(LDOPTIONS) $(HOST_XLDFLAGS) $(HOST_LDFLAGS) -HOST_ALIBS= $(HOST_XLIBS) $(LIBS) $(HOST_LIBS) - -STATIC_CC = $(CROSS)$(CC) -DYNAMIC_CC = $(CROSS)$(CC) -fPIC -TARGET_CC= $(STATIC_CC) -TARGET_STCC= $(STATIC_CC) -TARGET_DYNCC= $(DYNAMIC_CC) -TARGET_LD= $(CROSS)$(CC) -TARGET_AR= $(CROSS)ar rcus -TARGET_STRIP= $(CROSS)strip - -TARGET_LIBPATH= $(or $(PREFIX),/usr/local)/$(or $(MULTILIB),lib) -TARGET_SONAME= libluajit-$(ABIVER).so.$(MAJVER) -TARGET_DYLIBNAME= libluajit-$(ABIVER).$(MAJVER).dylib -TARGET_DYLIBPATH= $(TARGET_LIBPATH)/$(TARGET_DYLIBNAME) -TARGET_DLLNAME= lua$(NODOTABIVER).dll -TARGET_XSHLDFLAGS= -shared -fPIC -Wl,-soname,$(TARGET_SONAME) -TARGET_DYNXLDOPTS= - -TARGET_LFSFLAGS= -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -TARGET_XCFLAGS= $(TARGET_LFSFLAGS) -U_FORTIFY_SOURCE -TARGET_XLDFLAGS= -TARGET_XLIBS= -lm -TARGET_TCFLAGS= $(CCOPTIONS) $(TARGET_XCFLAGS) $(TARGET_FLAGS) $(TARGET_CFLAGS) -TARGET_ACFLAGS= $(CCOPTIONS) $(TARGET_XCFLAGS) $(TARGET_FLAGS) $(TARGET_CFLAGS) -TARGET_ASFLAGS= $(ASOPTIONS) $(TARGET_XCFLAGS) $(TARGET_FLAGS) $(TARGET_CFLAGS) -TARGET_ALDFLAGS= $(LDOPTIONS) $(TARGET_XLDFLAGS) $(TARGET_FLAGS) $(TARGET_LDFLAGS) -TARGET_ASHLDFLAGS= $(LDOPTIONS) $(TARGET_XSHLDFLAGS) $(TARGET_FLAGS) $(TARGET_SHLDFLAGS) -TARGET_ALIBS= $(TARGET_XLIBS) $(LIBS) $(TARGET_LIBS) - -TARGET_TESTARCH=$(shell $(TARGET_CC) $(TARGET_TCFLAGS) -E lj_arch.h -dM) -ifneq (,$(findstring LJ_TARGET_X64 ,$(TARGET_TESTARCH))) - TARGET_LJARCH= x64 -else -ifneq (,$(findstring LJ_TARGET_X86 ,$(TARGET_TESTARCH))) - TARGET_LJARCH= x86 -else -ifneq (,$(findstring LJ_TARGET_ARM ,$(TARGET_TESTARCH))) - TARGET_LJARCH= arm -else -ifneq (,$(findstring LJ_TARGET_ARM64 ,$(TARGET_TESTARCH))) - ifneq (,$(findstring __AARCH64EB__ ,$(TARGET_TESTARCH))) - TARGET_ARCH= -D__AARCH64EB__=1 - endif - TARGET_LJARCH= arm64 -else -ifneq (,$(findstring LJ_TARGET_PPC ,$(TARGET_TESTARCH))) - ifneq (,$(findstring LJ_LE 1,$(TARGET_TESTARCH))) - TARGET_ARCH= -DLJ_ARCH_ENDIAN=LUAJIT_LE - else - TARGET_ARCH= -DLJ_ARCH_ENDIAN=LUAJIT_BE - endif - TARGET_LJARCH= ppc -else -ifneq (,$(findstring LJ_TARGET_MIPS ,$(TARGET_TESTARCH))) - ifneq (,$(findstring MIPSEL ,$(TARGET_TESTARCH))) - TARGET_ARCH= -D__MIPSEL__=1 - endif - ifneq (,$(findstring LJ_TARGET_MIPS64 ,$(TARGET_TESTARCH))) - TARGET_LJARCH= mips64 - else - TARGET_LJARCH= mips - endif else - $(error Unsupported target architecture) -endif -endif -endif -endif -endif -endif - -ifneq (,$(findstring LJ_TARGET_PS3 1,$(TARGET_TESTARCH))) - TARGET_SYS= PS3 - TARGET_ARCH+= -D__CELLOS_LV2__ - TARGET_XCFLAGS+= -DLUAJIT_USE_SYSMALLOC - TARGET_XLIBS+= -lpthread -endif - -TARGET_XCFLAGS+= $(CCOPT_$(TARGET_LJARCH)) -TARGET_ARCH+= $(patsubst %,-DLUAJIT_TARGET=LUAJIT_ARCH_%,$(TARGET_LJARCH)) - -ifneq (,$(PREFIX)) -ifneq (/usr/local,$(PREFIX)) - TARGET_XCFLAGS+= -DLUA_ROOT=\"$(PREFIX)\" - ifneq (/usr,$(PREFIX)) - TARGET_DYNXLDOPTS= -Wl,-rpath,$(TARGET_LIBPATH) - endif -endif -endif -ifneq (,$(MULTILIB)) - TARGET_XCFLAGS+= -DLUA_MULTILIB=\"$(MULTILIB)\" -endif -ifneq (,$(LMULTILIB)) - TARGET_XCFLAGS+= -DLUA_LMULTILIB=\"$(LMULTILIB)\" + HOST_SYS= Windows endif - -############################################################################## -# Target system detection. -############################################################################## - TARGET_SYS?= $(HOST_SYS) -ifeq (Windows,$(TARGET_SYS)) - TARGET_STRIP+= --strip-unneeded - TARGET_XSHLDFLAGS= -shared - TARGET_DYNXLDOPTS= -else - TARGET_AR+= 2>/dev/null -ifeq (,$(shell $(TARGET_CC) -o /dev/null -c -x c /dev/null -fno-stack-protector 2>/dev/null || echo 1)) - TARGET_XCFLAGS+= -fno-stack-protector -endif -ifeq (Darwin,$(TARGET_SYS)) - ifeq (,$(MACOSX_DEPLOYMENT_TARGET)) - export MACOSX_DEPLOYMENT_TARGET=10.4 - endif - TARGET_STRIP+= -x - TARGET_XSHLDFLAGS= -dynamiclib -single_module -undefined dynamic_lookup -fPIC - TARGET_DYNXLDOPTS= - TARGET_XSHLDFLAGS+= -install_name $(TARGET_DYLIBPATH) -compatibility_version $(MAJVER).$(MINVER) -current_version $(MAJVER).$(MINVER).$(RELVER) - ifeq (x64,$(TARGET_LJARCH)) - TARGET_XLDFLAGS+= -pagezero_size 10000 -image_base 100000000 - TARGET_XSHLDFLAGS+= -image_base 7fff04c4a000 - endif -else -ifeq (iOS,$(TARGET_SYS)) - TARGET_STRIP+= -x - TARGET_XSHLDFLAGS= -dynamiclib -single_module -undefined dynamic_lookup -fPIC - TARGET_DYNXLDOPTS= - TARGET_XSHLDFLAGS+= -install_name $(TARGET_DYLIBPATH) -compatibility_version $(MAJVER).$(MINVER) -current_version $(MAJVER).$(MINVER).$(RELVER) - ifeq (arm64,$(TARGET_LJARCH)) - TARGET_XCFLAGS+= -fno-omit-frame-pointer - endif -else - ifneq (SunOS,$(TARGET_SYS)) - ifneq (PS3,$(TARGET_SYS)) - TARGET_XLDFLAGS+= -Wl,-E - endif - endif - ifeq (Linux,$(TARGET_SYS)) - TARGET_XLIBS+= -ldl - endif - ifeq (GNU/kFreeBSD,$(TARGET_SYS)) - TARGET_XLIBS+= -ldl - endif -endif -endif -endif - -ifneq ($(HOST_SYS),$(TARGET_SYS)) - ifeq (Windows,$(TARGET_SYS)) - HOST_XCFLAGS+= -malign-double -DLUAJIT_OS=LUAJIT_OS_WINDOWS - else - ifeq (Linux,$(TARGET_SYS)) - HOST_XCFLAGS+= -DLUAJIT_OS=LUAJIT_OS_LINUX - else - ifeq (Darwin,$(TARGET_SYS)) - HOST_XCFLAGS+= -DLUAJIT_OS=LUAJIT_OS_OSX - else - ifeq (iOS,$(TARGET_SYS)) - HOST_XCFLAGS+= -DLUAJIT_OS=LUAJIT_OS_OSX - else - HOST_XCFLAGS+= -DLUAJIT_OS=LUAJIT_OS_OTHER - endif - endif - endif - endif -endif -ifneq (,$(CCDEBUG)) - TARGET_STRIP= @: -endif - -############################################################################## -# Files and pathnames. -############################################################################## - -MINILUA_O= host/minilua.o -MINILUA_LIBS= -lm -MINILUA_T= host/minilua -MINILUA_X= $(MINILUA_T) - -ifeq (,$(HOST_LUA)) - HOST_LUA= $(MINILUA_X) - DASM_DEP= $(MINILUA_T) -endif - -DASM_DIR= ../dynasm -DASM= $(HOST_LUA) $(DASM_DIR)/dynasm.lua -DASM_XFLAGS= -DASM_AFLAGS= -DASM_ARCH= $(TARGET_LJARCH) - -ifneq (,$(findstring LJ_LE 1,$(TARGET_TESTARCH))) - DASM_AFLAGS+= -D ENDIAN_LE -else - DASM_AFLAGS+= -D ENDIAN_BE -endif -ifneq (,$(findstring LJ_ARCH_BITS 64,$(TARGET_TESTARCH))) - DASM_AFLAGS+= -D P64 -endif -ifneq (,$(findstring LJ_HASJIT 1,$(TARGET_TESTARCH))) - DASM_AFLAGS+= -D JIT -endif -ifneq (,$(findstring LJ_HASFFI 1,$(TARGET_TESTARCH))) - DASM_AFLAGS+= -D FFI -endif -ifneq (,$(findstring LJ_DUALNUM 1,$(TARGET_TESTARCH))) - DASM_AFLAGS+= -D DUALNUM -endif -ifneq (,$(findstring LJ_ARCH_HASFPU 1,$(TARGET_TESTARCH))) - DASM_AFLAGS+= -D FPU - TARGET_ARCH+= -DLJ_ARCH_HASFPU=1 -else - TARGET_ARCH+= -DLJ_ARCH_HASFPU=0 -endif -ifeq (,$(findstring LJ_ABI_SOFTFP 1,$(TARGET_TESTARCH))) - DASM_AFLAGS+= -D HFABI - TARGET_ARCH+= -DLJ_ABI_SOFTFP=0 -else - TARGET_ARCH+= -DLJ_ABI_SOFTFP=1 -endif -ifneq (,$(findstring LJ_NO_UNWIND 1,$(TARGET_TESTARCH))) - DASM_AFLAGS+= -D NO_UNWIND - TARGET_ARCH+= -DLUAJIT_NO_UNWIND -endif -DASM_AFLAGS+= -D VER=$(subst LJ_ARCH_VERSION_,,$(filter LJ_ARCH_VERSION_%,$(subst LJ_ARCH_VERSION ,LJ_ARCH_VERSION_,$(TARGET_TESTARCH)))) -ifeq (Windows,$(TARGET_SYS)) - DASM_AFLAGS+= -D WIN -endif -ifeq (x64,$(TARGET_LJARCH)) - ifeq (,$(findstring LJ_FR2 1,$(TARGET_TESTARCH))) - DASM_ARCH= x86 - endif -else -ifeq (arm,$(TARGET_LJARCH)) - ifeq (iOS,$(TARGET_SYS)) - DASM_AFLAGS+= -D IOS - endif -else -ifeq (ppc,$(TARGET_LJARCH)) - ifneq (,$(findstring LJ_ARCH_SQRT 1,$(TARGET_TESTARCH))) - DASM_AFLAGS+= -D SQRT - endif - ifneq (,$(findstring LJ_ARCH_ROUND 1,$(TARGET_TESTARCH))) - DASM_AFLAGS+= -D ROUND - endif - ifneq (,$(findstring LJ_ARCH_PPC32ON64 1,$(TARGET_TESTARCH))) - DASM_AFLAGS+= -D GPR64 - endif - ifeq (PS3,$(TARGET_SYS)) - DASM_AFLAGS+= -D PPE -D TOC - endif - ifneq (,$(findstring LJ_ARCH_PPC64 ,$(TARGET_TESTARCH))) - DASM_ARCH= ppc64 - endif -endif -endif -endif - -DASM_FLAGS= $(DASM_XFLAGS) $(DASM_AFLAGS) -DASM_DASC= vm_$(DASM_ARCH).dasc - -BUILDVM_O= host/buildvm.o host/buildvm_asm.o host/buildvm_peobj.o \ - host/buildvm_lib.o host/buildvm_fold.o -BUILDVM_T= host/buildvm -BUILDVM_X= $(BUILDVM_T) - -HOST_O= $(MINILUA_O) $(BUILDVM_O) -HOST_T= $(MINILUA_T) $(BUILDVM_T) - -LJVM_S= lj_vm.S -LJVM_O= lj_vm.o -LJVM_BOUT= $(LJVM_S) -LJVM_MODE= elfasm - -LJLIB_O= lib_base.o lib_math.o lib_bit.o lib_string.o lib_table.o \ - lib_io.o lib_os.o lib_package.o lib_debug.o lib_jit.o lib_ffi.o -LJLIB_C= $(LJLIB_O:.o=.c) - -LJCORE_O= lj_gc.o lj_err.o lj_char.o lj_bc.o lj_obj.o lj_buf.o \ - lj_str.o lj_tab.o lj_func.o lj_udata.o lj_meta.o lj_debug.o \ - lj_state.o lj_dispatch.o lj_vmevent.o lj_vmmath.o lj_strscan.o \ - lj_strfmt.o lj_strfmt_num.o lj_api.o lj_profile.o \ - lj_lex.o lj_parse.o lj_bcread.o lj_bcwrite.o lj_load.o \ - lj_ir.o lj_opt_mem.o lj_opt_fold.o lj_opt_narrow.o \ - lj_opt_dce.o lj_opt_loop.o lj_opt_split.o lj_opt_sink.o \ - lj_mcode.o lj_snap.o lj_record.o lj_crecord.o lj_ffrecord.o \ - lj_asm.o lj_trace.o lj_gdbjit.o \ - lj_ctype.o lj_cdata.o lj_cconv.o lj_ccall.o lj_ccallback.o \ - lj_carith.o lj_clib.o lj_cparse.o \ - lj_lib.o lj_alloc.o lib_aux.o \ - $(LJLIB_O) lib_init.o - -LJVMCORE_O= $(LJVM_O) $(LJCORE_O) -LJVMCORE_DYNO= $(LJVMCORE_O:.o=_dyn.o) - -LIB_VMDEF= jit/vmdef.lua -LIB_VMDEFP= $(LIB_VMDEF) - -LUAJIT_O= luajit.o -LUAJIT_A= libluajit.a -LUAJIT_SO= libluajit.so -LUAJIT_T= luajit - -ALL_T= $(LUAJIT_T) $(LUAJIT_A) $(LUAJIT_SO) $(HOST_T) -ALL_HDRGEN= lj_bcdef.h lj_ffdef.h lj_libdef.h lj_recdef.h lj_folddef.h \ - host/buildvm_arch.h -ALL_GEN= $(LJVM_S) $(ALL_HDRGEN) $(LIB_VMDEFP) -WIN_RM= *.obj *.lib *.exp *.dll *.exe *.manifest *.pdb *.ilk -ALL_RM= $(ALL_T) $(ALL_GEN) *.o host/*.o $(WIN_RM) - -############################################################################## -# Build mode handling. -############################################################################## - -# Mixed mode defaults. -TARGET_O= $(LUAJIT_A) -TARGET_T= $(LUAJIT_T) $(LUAJIT_SO) -TARGET_DEP= $(LIB_VMDEF) $(LUAJIT_SO) - -ifeq (Windows,$(TARGET_SYS)) - TARGET_DYNCC= $(STATIC_CC) - LJVM_MODE= peobj - LJVM_BOUT= $(LJVM_O) - LUAJIT_T= luajit.exe - ifeq (cygwin,$(HOST_MSYS)) - LUAJIT_SO= cyg$(TARGET_DLLNAME) - else - LUAJIT_SO= $(TARGET_DLLNAME) - endif - # Mixed mode is not supported on Windows. And static mode doesn't work well. - # C modules cannot be loaded, because they bind to lua51.dll. - ifneq (static,$(BUILDMODE)) - BUILDMODE= dynamic - TARGET_XCFLAGS+= -DLUA_BUILD_AS_DLL - endif -endif ifeq (Darwin,$(TARGET_SYS)) - LJVM_MODE= machasm -endif -ifeq (iOS,$(TARGET_SYS)) - LJVM_MODE= machasm -endif -ifeq (SunOS,$(TARGET_SYS)) - BUILDMODE= static -endif -ifeq (PS3,$(TARGET_SYS)) - BUILDMODE= static -endif - -ifeq (Windows,$(HOST_SYS)) - MINILUA_T= host/minilua.exe - BUILDVM_T= host/buildvm.exe - ifeq (,$(HOST_MSYS)) - MINILUA_X= host\minilua - BUILDVM_X= host\buildvm - ALL_RM:= $(subst /,\,$(ALL_RM)) - endif -endif - -ifeq (static,$(BUILDMODE)) - TARGET_DYNCC= @: - TARGET_T= $(LUAJIT_T) - TARGET_DEP= $(LIB_VMDEF) -else -ifeq (dynamic,$(BUILDMODE)) - ifneq (Windows,$(TARGET_SYS)) - TARGET_CC= $(DYNAMIC_CC) - endif - TARGET_DYNCC= @: - LJVMCORE_DYNO= $(LJVMCORE_O) - TARGET_O= $(LUAJIT_SO) - TARGET_XLDFLAGS+= $(TARGET_DYNXLDOPTS) -else -ifeq (Darwin,$(TARGET_SYS)) - TARGET_DYNCC= @: - LJVMCORE_DYNO= $(LJVMCORE_O) -endif -ifeq (iOS,$(TARGET_SYS)) - TARGET_DYNCC= @: - LJVMCORE_DYNO= $(LJVMCORE_O) -endif -endif -endif - -Q= @ -E= @echo -#Q= -#E= @: - -############################################################################## -# Make targets. -############################################################################## - -default all: $(TARGET_T) - -amalg: - @grep "^[+|]" ljamalg.c - $(MAKE) all "LJCORE_O=ljamalg.o" - -clean: - $(HOST_RM) $(ALL_RM) - -libbc: - ./$(LUAJIT_T) host/genlibbc.lua -o host/buildvm_libbc.h $(LJLIB_C) - $(MAKE) all - -depend: - @for file in $(ALL_HDRGEN); do \ - test -f $$file || touch $$file; \ + INSTALL_SONAME= $(INSTALL_DYLIBNAME) + INSTALL_SOSHORT1= $(INSTALL_DYLIBSHORT1) + INSTALL_SOSHORT2= $(INSTALL_DYLIBSHORT2) + LDCONFIG= : +endif + +############################################################################## + +INSTALL_DEP= src/luajit + +default all $(INSTALL_DEP): + @echo "==== Building LuaJIT $(VERSION) ====" + $(MAKE) -C src + @echo "==== Successfully built LuaJIT $(VERSION) ====" + +install: $(INSTALL_DEP) + @echo "==== Installing LuaJIT $(VERSION) to $(PREFIX) ====" + $(MKDIR) $(INSTALL_DIRS) + cd src && $(INSTALL_X) $(FILE_T) $(INSTALL_T) + cd src && test -f $(FILE_A) && $(INSTALL_F) $(FILE_A) $(INSTALL_STATIC) || : + $(RM) $(INSTALL_DYN) $(INSTALL_SHORT1) $(INSTALL_SHORT2) + cd src && test -f $(FILE_SO) && \ + $(INSTALL_X) $(FILE_SO) $(INSTALL_DYN) && \ + $(LDCONFIG) $(INSTALL_LIB) && \ + $(SYMLINK) $(INSTALL_SONAME) $(INSTALL_SHORT1) && \ + $(SYMLINK) $(INSTALL_SONAME) $(INSTALL_SHORT2) || : + cd etc && $(INSTALL_F) $(FILE_MAN) $(INSTALL_MAN) + cd etc && $(SED_PC) $(FILE_PC) > $(FILE_PC).tmp && \ + $(INSTALL_F) $(FILE_PC).tmp $(INSTALL_PC) && \ + $(RM) $(FILE_PC).tmp + cd src && $(INSTALL_F) $(FILES_INC) $(INSTALL_INC) + cd src/jit && $(INSTALL_F) $(FILES_JITLIB) $(INSTALL_JITLIB) + @echo "==== Successfully installed LuaJIT $(VERSION) to $(PREFIX) ====" + @echo "" + @echo "Note: the development releases deliberately do NOT install a symlink for luajit" + @echo "You can do this now by running this command (with sudo):" + @echo "" + @echo " $(SYMLINK) $(INSTALL_TNAME) $(INSTALL_TSYM)" + @echo "" + + +uninstall: + @echo "==== Uninstalling LuaJIT $(VERSION) from $(PREFIX) ====" + $(UNINSTALL) $(INSTALL_T) $(INSTALL_STATIC) $(INSTALL_DYN) $(INSTALL_SHORT1) $(INSTALL_SHORT2) $(INSTALL_MAN)/$(FILE_MAN) $(INSTALL_PC) + for file in $(FILES_JITLIB); do \ + $(UNINSTALL) $(INSTALL_JITLIB)/$$file; \ done - @$(HOST_CC) $(HOST_ACFLAGS) -MM *.c host/*.c | \ - sed -e "s| [^ ]*/dasm_\S*\.h||g" \ - -e "s|^\([^l ]\)|host/\1|" \ - -e "s| lj_target_\S*\.h| lj_target_*.h|g" \ - -e "s| lj_emit_\S*\.h| lj_emit_*.h|g" \ - -e "s| lj_asm_\S*\.h| lj_asm_*.h|g" >Makefile.dep - @for file in $(ALL_HDRGEN); do \ - test -s $$file || $(HOST_RM) $$file; \ + for file in $(FILES_INC); do \ + $(UNINSTALL) $(INSTALL_INC)/$$file; \ done - -.PHONY: default all amalg clean libbc depend - -############################################################################## -# Rules for generated files. -############################################################################## - -$(MINILUA_T): $(MINILUA_O) - $(E) "HOSTLINK $@" - $(Q)$(HOST_CC) $(HOST_ALDFLAGS) -o $@ $(MINILUA_O) $(MINILUA_LIBS) $(HOST_ALIBS) - -host/buildvm_arch.h: $(DASM_DASC) $(DASM_DEP) $(DASM_DIR)/*.lua - $(E) "DYNASM $@" - $(Q)$(DASM) $(DASM_FLAGS) -o $@ $(DASM_DASC) - -host/buildvm.o: $(DASM_DIR)/dasm_*.h - -$(BUILDVM_T): $(BUILDVM_O) - $(E) "HOSTLINK $@" - $(Q)$(HOST_CC) $(HOST_ALDFLAGS) -o $@ $(BUILDVM_O) $(HOST_ALIBS) - -$(LJVM_BOUT): $(BUILDVM_T) - $(E) "BUILDVM $@" - $(Q)$(BUILDVM_X) -m $(LJVM_MODE) -o $@ - -lj_bcdef.h: $(BUILDVM_T) $(LJLIB_C) - $(E) "BUILDVM $@" - $(Q)$(BUILDVM_X) -m bcdef -o $@ $(LJLIB_C) - -lj_ffdef.h: $(BUILDVM_T) $(LJLIB_C) - $(E) "BUILDVM $@" - $(Q)$(BUILDVM_X) -m ffdef -o $@ $(LJLIB_C) - -lj_libdef.h: $(BUILDVM_T) $(LJLIB_C) - $(E) "BUILDVM $@" - $(Q)$(BUILDVM_X) -m libdef -o $@ $(LJLIB_C) - -lj_recdef.h: $(BUILDVM_T) $(LJLIB_C) - $(E) "BUILDVM $@" - $(Q)$(BUILDVM_X) -m recdef -o $@ $(LJLIB_C) - -$(LIB_VMDEF): $(BUILDVM_T) $(LJLIB_C) - $(E) "BUILDVM $@" - $(Q)$(BUILDVM_X) -m vmdef -o $(LIB_VMDEFP) $(LJLIB_C) - -lj_folddef.h: $(BUILDVM_T) lj_opt_fold.c - $(E) "BUILDVM $@" - $(Q)$(BUILDVM_X) -m folddef -o $@ lj_opt_fold.c + $(LDCONFIG) $(INSTALL_LIB) + $(RMDIR) $(UNINSTALL_DIRS) || : + @echo "==== Successfully uninstalled LuaJIT $(VERSION) from $(PREFIX) ====" ############################################################################## -# Object file rules. -############################################################################## - -%.o: %.c - $(E) "CC $@" - $(Q)$(TARGET_DYNCC) $(TARGET_ACFLAGS) -c -o $(@:.o=_dyn.o) $< - $(Q)$(TARGET_CC) $(TARGET_ACFLAGS) -c -o $@ $< - -%.o: %.S - $(E) "ASM $@" - $(Q)$(TARGET_DYNCC) $(TARGET_ASFLAGS) -c -o $(@:.o=_dyn.o) $< - $(Q)$(TARGET_CC) $(TARGET_ASFLAGS) -c -o $@ $< - -$(LUAJIT_O): - $(E) "CC $@" - $(Q)$(TARGET_STCC) $(TARGET_ACFLAGS) -c -o $@ $< - -$(HOST_O): %.o: %.c - $(E) "HOSTCC $@" - $(Q)$(HOST_CC) $(HOST_ACFLAGS) -c -o $@ $< - -include Makefile.dep -############################################################################## -# Target file rules. -############################################################################## - -$(LUAJIT_A): $(LJVMCORE_O) - $(E) "AR $@" - $(Q)$(TARGET_AR) $@ $(LJVMCORE_O) +amalg: + @echo "Building LuaJIT $(VERSION)" + $(MAKE) -C src amalg -# The dependency on _O, but linking with _DYNO is intentional. -$(LUAJIT_SO): $(LJVMCORE_O) - $(E) "DYNLINK $@" - $(Q)$(TARGET_LD) $(TARGET_ASHLDFLAGS) -o $@ $(LJVMCORE_DYNO) $(TARGET_ALIBS) - $(Q)$(TARGET_STRIP) $@ +clean: + $(MAKE) -C src clean -$(LUAJIT_T): $(TARGET_O) $(LUAJIT_O) $(TARGET_DEP) - $(E) "LINK $@" - $(Q)$(TARGET_LD) $(TARGET_ALDFLAGS) -o $@ $(LUAJIT_O) $(TARGET_O) $(TARGET_ALIBS) - $(Q)$(TARGET_STRIP) $@ - $(E) "OK Successfully built LuaJIT" +.PHONY: all install amalg clean ############################################################################## diff --git a/lib/LuaJIT/README b/lib/LuaJIT/README new file mode 100644 index 0000000..2b9ae9d --- /dev/null +++ b/lib/LuaJIT/README @@ -0,0 +1,16 @@ +README for LuaJIT 2.1.0-beta3 +----------------------------- + +LuaJIT is a Just-In-Time (JIT) compiler for the Lua programming language. + +Project Homepage: http://luajit.org/ + +LuaJIT is Copyright (C) 2005-2017 Mike Pall. +LuaJIT is free software, released under the MIT license. +See full Copyright Notice in the COPYRIGHT file or in luajit.h. + +Documentation for LuaJIT is available in HTML format. +Please point your favorite browser to: + + doc/luajit.html + diff --git a/lib/LuaJIT/doc/bluequad-print.css b/lib/LuaJIT/doc/bluequad-print.css new file mode 100644 index 0000000..d5a3ea3 --- /dev/null +++ b/lib/LuaJIT/doc/bluequad-print.css @@ -0,0 +1,166 @@ +/* Copyright (C) 2004-2018 Mike Pall. + * + * You are welcome to use the general ideas of this design for your own sites. + * But please do not steal the stylesheet, the layout or the color scheme. + */ +body { + font-family: serif; + font-size: 11pt; + margin: 0 3em; + padding: 0; + border: none; +} +a:link, a:visited, a:hover, a:active { + text-decoration: none; + background: transparent; + color: #0000ff; +} +h1, h2, h3 { + font-family: sans-serif; + font-weight: bold; + text-align: left; + margin: 0.5em 0; + padding: 0; +} +h1 { + font-size: 200%; +} +h2 { + font-size: 150%; +} +h3 { + font-size: 125%; +} +p { + margin: 0 0 0.5em 0; + padding: 0; +} +ul, ol { + margin: 0.5em 0; + padding: 0 0 0 2em; +} +ul { + list-style: outside square; +} +ol { + list-style: outside decimal; +} +li { + margin: 0; + padding: 0; +} +dl { + margin: 1em 0; + padding: 1em; + border: 1px solid black; +} +dt { + font-weight: bold; + margin: 0; + padding: 0; +} +dt sup { + float: right; + margin-left: 1em; +} +dd { + margin: 0.5em 0 0 2em; + padding: 0; +} +table { + table-layout: fixed; + width: 100%; + margin: 1em 0; + padding: 0; + border: 1px solid black; + border-spacing: 0; + border-collapse: collapse; +} +tr { + margin: 0; + padding: 0; + border: none; +} +td { + text-align: left; + margin: 0; + padding: 0.2em 0.5em; + border-top: 1px solid black; + border-bottom: 1px solid black; +} +tr.separate td { + border-top: double; +} +tt, pre, code, kbd, samp { + font-family: monospace; + font-size: 75%; +} +kbd { + font-weight: bolder; +} +blockquote, pre { + margin: 1em 2em; + padding: 0; +} +img { + border: none; + vertical-align: baseline; + margin: 0; + padding: 0; +} +img.left { + float: left; + margin: 0.5em 1em 0.5em 0; +} +img.right { + float: right; + margin: 0.5em 0 0.5em 1em; +} +.flush { + clear: both; + visibility: hidden; +} +.hide, .noprint, #nav { + display: none !important; +} +.pagebreak { + page-break-before: always; +} +#site { + text-align: right; + font-family: sans-serif; + font-weight: bold; + margin: 0 1em; + border-bottom: 1pt solid black; +} +#site a { + font-size: 1.2em; +} +#site a:link, #site a:visited { + text-decoration: none; + font-weight: bold; + background: transparent; + color: #ffffff; +} +#logo { + color: #ff8000; +} +#head { + clear: both; + margin: 0 1em; +} +#main { + line-height: 1.3; + text-align: justify; + margin: 1em; +} +#foot { + clear: both; + font-size: 80%; + text-align: center; + margin: 0 1.25em; + padding: 0.5em 0 0 0; + border-top: 1pt solid black; + page-break-before: avoid; + page-break-after: avoid; +} diff --git a/lib/LuaJIT/doc/bluequad.css b/lib/LuaJIT/doc/bluequad.css new file mode 100644 index 0000000..cfc889a --- /dev/null +++ b/lib/LuaJIT/doc/bluequad.css @@ -0,0 +1,325 @@ +/* Copyright (C) 2004-2018 Mike Pall. + * + * You are welcome to use the general ideas of this design for your own sites. + * But please do not steal the stylesheet, the layout or the color scheme. + */ +/* colorscheme: + * + * site | head #4162bf/white | #6078bf/#e6ecff + * ------+------ ----------------+------------------- + * nav | main #bfcfff | #e6ecff/black + * + * nav: hiback loback #c5d5ff #b9c9f9 + * hiborder loborder #e6ecff #97a7d7 + * link hover #2142bf #ff0000 + * + * link: link visited hover #2142bf #8122bf #ff0000 + * + * main: boxback boxborder #f0f4ff #bfcfff + */ +body { + font-family: Verdana, Arial, Helvetica, sans-serif; + font-size: 10pt; + margin: 0; + padding: 0; + border: none; + background: #e0e0e0; + color: #000000; +} +a:link { + text-decoration: none; + background: transparent; + color: #2142bf; +} +a:visited { + text-decoration: none; + background: transparent; + color: #8122bf; +} +a:hover, a:active { + text-decoration: underline; + background: transparent; + color: #ff0000; +} +h1, h2, h3 { + font-weight: bold; + text-align: left; + margin: 0.5em 0; + padding: 0; + background: transparent; +} +h1 { + font-size: 200%; + line-height: 3em; /* really 6em relative to body, match #site span */ + margin: 0; +} +h2 { + font-size: 150%; + color: #606060; +} +h3 { + font-size: 125%; + color: #404040; +} +p { + max-width: 600px; + margin: 0 0 0.5em 0; + padding: 0; +} +b { + color: #404040; +} +ul, ol { + max-width: 600px; + margin: 0.5em 0; + padding: 0 0 0 2em; +} +ul { + list-style: outside square; +} +ol { + list-style: outside decimal; +} +li { + margin: 0; + padding: 0; +} +dl { + max-width: 600px; + margin: 1em 0; + padding: 1em; + border: 1px solid #bfcfff; + background: #f0f4ff; +} +dt { + font-weight: bold; + margin: 0; + padding: 0; +} +dt sup { + float: right; + margin-left: 1em; + color: #808080; +} +dt a:visited { + text-decoration: none; + color: #2142bf; +} +dt a:hover, dt a:active { + text-decoration: none; + color: #ff0000; +} +dd { + margin: 0.5em 0 0 2em; + padding: 0; +} +div.tablewrap { /* for IE *sigh* */ + max-width: 600px; +} +table { + table-layout: fixed; + border-spacing: 0; + border-collapse: collapse; + max-width: 600px; + width: 100%; + margin: 1em 0; + padding: 0; + border: 1px solid #bfcfff; +} +tr { + margin: 0; + padding: 0; + border: none; +} +tr.odd { + background: #f0f4ff; +} +tr.separate td { + border-top: 1px solid #bfcfff; +} +td { + text-align: left; + margin: 0; + padding: 0.2em 0.5em; + border: none; +} +tt, code, kbd, samp { + font-family: Courier New, Courier, monospace; + line-height: 1.2; + font-size: 110%; +} +kbd { + font-weight: bolder; +} +blockquote, pre { + max-width: 600px; + margin: 1em 2em; + padding: 0; +} +pre { + line-height: 1.1; +} +pre.code { + line-height: 1.4; + margin: 0.5em 0 1em 0.5em; + padding: 0.5em 1em; + border: 1px solid #bfcfff; + background: #f0f4ff; +} +pre.mark { + padding-left: 2em; +} +span.codemark { + position:absolute; + left: 16em; + color: #4040c0; +} +span.mark { + color: #4040c0; + font-family: Courier New, Courier, monospace; + line-height: 1.1; +} +img { + border: none; + vertical-align: baseline; + margin: 0; + padding: 0; +} +img.left { + float: left; + margin: 0.5em 1em 0.5em 0; +} +img.right { + float: right; + margin: 0.5em 0 0.5em 1em; +} +.indent { + padding-left: 1em; +} +.flush { + clear: both; + visibility: hidden; +} +.hide, .noscreen { + display: none !important; +} +.ext { + color: #ff8000; +} +.new { + font-size: 6pt; + vertical-align: middle; + background: #ff8000; + color: #ffffff; +} +#site { + clear: both; + float: left; + width: 13em; + text-align: center; + font-weight: bold; + margin: 0; + padding: 0; + background: transparent; + color: #ffffff; +} +#site a { + font-size: 200%; +} +#site a:link, #site a:visited { + text-decoration: none; + font-weight: bold; + background: transparent; + color: #ffffff; +} +#site span { + line-height: 3em; /* really 6em relative to body, match h1 */ +} +#logo { + color: #ffb380; +} +#head { + margin: 0; + padding: 0 0 0 2em; + border-left: solid 13em #4162bf; + border-right: solid 3em #6078bf; + background: #6078bf; + color: #e6ecff; +} +#nav { + clear: both; + float: left; + overflow: hidden; + text-align: left; + line-height: 1.5; + width: 13em; + padding-top: 1em; + background: transparent; +} +#nav ul { + list-style: none outside; + margin: 0; + padding: 0; +} +#nav li { + margin: 0; + padding: 0; +} +#nav a { + display: block; + text-decoration: none; + font-weight: bold; + margin: 0; + padding: 2px 1em; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + background: transparent; + color: #2142bf; +} +#nav a:hover, #nav a:active { + text-decoration: none; + border-top: 1px solid #97a7d7; + border-bottom: 1px solid #e6ecff; + background: #b9c9f9; + color: #ff0000; +} +#nav a.current, #nav a.current:hover, #nav a.current:active { + border-top: 1px solid #e6ecff; + border-bottom: 1px solid #97a7d7; + background: #c5d5ff; + color: #2142bf; +} +#nav ul ul a { + padding: 0 1em 0 1.7em; +} +#nav ul ul ul a { + padding: 0 0.5em 0 2.4em; +} +#main { + line-height: 1.5; + text-align: left; + margin: 0; + padding: 1em 2em; + border-left: solid 13em #bfcfff; + border-right: solid 3em #e6ecff; + background: #e6ecff; +} +#foot { + clear: both; + font-size: 80%; + text-align: center; + margin: 0; + padding: 0.5em; + background: #6078bf; + color: #ffffff; +} +#foot a:link, #foot a:visited { + text-decoration: underline; + background: transparent; + color: #ffffff; +} +#foot a:hover, #foot a:active { + text-decoration: underline; + background: transparent; + color: #bfcfff; +} diff --git a/lib/LuaJIT/doc/changes.html b/lib/LuaJIT/doc/changes.html new file mode 100644 index 0000000..1208ac8 --- /dev/null +++ b/lib/LuaJIT/doc/changes.html @@ -0,0 +1,882 @@ + + + +LuaJIT Change History + + + + + + + + +
+Lua +
+ + +
+

+This is a list of changes between the released versions of LuaJIT.
+The current stable version is LuaJIT 2.0.5.
+

+

+Please check the +» Online Change History +to see whether newer versions are available. +

+ +
+

LuaJIT 2.1.0-beta3 — 2017-05-01

+
    +
  • Rewrite memory block allocator.
  • +
  • Add various extension from Lua 5.2/5.3.
  • +
  • Remove old Lua 5.0 compatibility defines.
  • +
  • Set arg table before evaluating LUA_INIT and -e chunks.
  • +
  • Fix FOLD rules for math.abs() and FP negation.
  • +
  • Fix soft-float math.abs() and negation.
  • +
  • Fix formatting of some small denormals at low precision.
  • +
  • LJ_GC64: Add JIT compiler support.
  • +
  • x64/LJ_GC64: Add JIT compiler backend.
  • +
  • x86/x64: Generate BMI2 shifts and rotates, if available.
  • +
  • Windows/x86: Add full exception interoperability.
  • +
  • ARM64: Add big-endian support.
  • +
  • ARM64: Add JIT compiler backend.
  • +
  • MIPS: Fix TSETR barrier.
  • +
  • MIPS: Support MIPS16 interlinking.
  • +
  • MIPS soft-float: Fix code generation for HREF.
  • +
  • MIPS64: Add MIPS64 hard-float JIT compiler backend.
  • +
  • MIPS64: Add MIPS64 hard-float/soft-float support to interpreter.
  • +
  • FFI: Compile bitfield loads/stores.
  • +
  • Various fixes common with the 2.0 branch.
  • +
+ +

LuaJIT 2.1.0-beta2 — 2016-03-03

+
    +
  • Enable trace stitching.
  • +
  • Use internal implementation for converting FP numbers to strings.
  • +
  • Parse Unicode escape '\u{XX...}' in string literals.
  • +
  • Add MIPS soft-float support.
  • +
  • Switch MIPS port to dual-number mode.
  • +
  • x86/x64: Add support for AES-NI, AVX and AVX2 to DynASM.
  • +
  • FFI: Add ssize_t declaration.
  • +
  • FFI: Parse #line NN and #NN.
  • +
  • Various minor fixes.
  • +
+ +

LuaJIT 2.1.0-beta1 — 2015-08-25

+

+This is a brief summary of the major changes in LuaJIT 2.1 compared to 2.0. +Please take a look at the commit history for more details. +

+
    +
  • Changes to the VM core: +
      +
    • Add low-overhead profiler (-jp).
    • +
    • Add LJ_GC64 mode: 64 bit GC object references (really: 47 bit). Interpreter-only for now.
    • +
    • Add LJ_FR2 mode: Two-slot frame info. Required by LJ_GC64 mode.
    • +
    • Add table.new() and table.clear().
    • +
    • Parse binary number literals (0bxxx).
    • +
  • +
  • Improvements to the JIT compiler: +
      +
    • Add trace stitching (disabled for now).
    • +
    • Compile various builtins: string.char(), string.reverse(), string.lower(), string.upper(), string.rep(), string.format(), table.concat(), bit.tohex(), getfenv(0), debug.getmetatable().
    • +
    • Compile string.find() for fixed string searches (no patterns).
    • +
    • Compile BC_TSETM, e.g. {1,2,3,f()}.
    • +
    • Compile string concatenations (BC_CAT).
    • +
    • Compile __concat metamethod.
    • +
    • Various minor optimizations.
    • +
  • +
  • Internal Changes: +
      +
    • Add support for embedding LuaJIT bytecode for builtins.
    • +
    • Replace various builtins with embedded bytecode.
    • +
    • Refactor string buffers and string formatting.
    • +
    • Remove obsolete non-truncating number to integer conversions.
    • +
  • +
  • Ports: +
      +
    • Add Xbox One port (LJ_GC64 mode).
    • +
    • ARM64: Add port of the interpreter (LJ_GC64 mode).
    • +
    • x64: Add separate port of the interpreter to LJ_GC64 mode.
    • +
    • x86/x64: Drop internal x87 math functions. Use libm functions.
    • +
    • x86: Remove x87 support from interpreter. SSE2 is mandatory now.
    • +
    • PPC/e500: Drop support for this architecture.
    • +
  • +
  • FFI library: +
      +
    • FFI: Add 64 bit bitwise operations.
    • +
    • FFI: Compile VLA/VLS and large cdata allocations with default initialization.
    • +
    • FFI: Compile conversions from functions to function pointers.
    • +
    • FFI: Compile lightuserdata to void * conversion.
    • +
    • FFI: Compile ffi.gc(cdata, nil), too.
    • +
    • FFI: Add ffi.typeinfo().
    • +
  • +
+
+ +
+

LuaJIT 2.0.5 — 2017-05-01

+
    +
  • Add workaround for MSVC 2015 stdio changes.
  • +
  • Limit mcode alloc probing, depending on the available pool size.
  • +
  • Fix overly restrictive range calculation in mcode allocation.
  • +
  • Fix out-of-scope goto handling in parser.
  • +
  • Remove internal __mode = "K" and replace with safe check.
  • +
  • Add "proto" field to jit.util.funcinfo().
  • +
  • Fix GC step size calculation.
  • +
  • Initialize uv->immutable for upvalues of loaded chunks.
  • +
  • Fix for cdata vs. non-cdata arithmetics/comparisons.
  • +
  • Drop leftover regs in 'for' iterator assignment, too.
  • +
  • Fix PHI remarking in SINK pass.
  • +
  • Don't try to record outermost pcall() return to lower frame.
  • +
  • Add guard for obscure aliasing between open upvalues and SSA slots.
  • +
  • Remove assumption that lj_math_random_step() doesn't clobber FPRs.
  • +
  • Fix handling of non-numeric strings in arithmetic coercions.
  • +
  • Fix recording of select(n, ...) with off-trace varargs
  • +
  • Fix install for cross-builds.
  • +
  • Don't allocate unused 2nd result register in JIT compiler backend.
  • +
  • Drop marks from replayed instructions when sinking.
  • +
  • Fix unsinking check.
  • +
  • Properly handle OOM in trace_save().
  • +
  • Limit number of arguments given to io.lines() and fp:lines().
  • +
  • Fix narrowing of TOBIT.
  • +
  • OSX: Fix build with recent XCode.
  • +
  • x86/x64: Don't spill an explicit REF_BASE in the IR.
  • +
  • x86/x64: Fix instruction length decoder.
  • +
  • x86/x64: Search for exit jumps with instruction length decoder.
  • +
  • ARM: Fix BLX encoding for Thumb interworking calls.
  • +
  • MIPS: Don't use RID_GP as a scratch register.
  • +
  • MIPS: Fix emitted code for U32 to float conversion.
  • +
  • MIPS: Backport workaround for compact unwind tables.
  • +
  • MIPS: Fix cross-endian jit.bcsave.
  • +
  • MIPS: Fix BC_ISNEXT fallback path.
  • +
  • MIPS: Fix use of ffgccheck delay slots in interpreter.
  • +
  • FFI: Fix FOLD rules for int64_t comparisons.
  • +
  • FFI: Fix SPLIT pass for CONV i64.u64.
  • +
  • FFI: Fix ipairs() recording.
  • +
  • FFI: Don't propagate qualifiers into subtypes of complex.
  • +
+ +

LuaJIT 2.0.4 — 2015-05-14

+
    +
  • Fix stack check in narrowing optimization.
  • +
  • Fix Lua/C API typecheck error for special indexes.
  • +
  • Fix string to number conversion.
  • +
  • Fix lexer error for chunks without tokens.
  • +
  • Don't compile IR_RETF after CALLT to ff with-side effects.
  • +
  • Fix BC_UCLO/BC_JMP join optimization in Lua parser.
  • +
  • Fix corner case in string to number conversion.
  • +
  • Gracefully handle lua_error() for a suspended coroutine.
  • +
  • Avoid error messages when building with Clang.
  • +
  • Fix snapshot #0 handling for traces with a stack check on entry.
  • +
  • Fix fused constant loads under high register pressure.
  • +
  • Invalidate backpropagation cache after DCE.
  • +
  • Fix ABC elimination.
  • +
  • Fix debug info for main chunk of stripped bytecode.
  • +
  • Fix FOLD rule for string.sub(s, ...) == k.
  • +
  • Fix FOLD rule for STRREF of SNEW.
  • +
  • Fix frame traversal while searching for error function.
  • +
  • Prevent GC estimate miscalculation due to buffer growth.
  • +
  • Prevent adding side traces for stack checks.
  • +
  • Fix top slot calculation for snapshots with continuations.
  • +
  • Fix check for reuse of SCEV results in FORL.
  • +
  • Add PS Vita port.
  • +
  • Fix compatibility issues with Illumos.
  • +
  • Fix DragonFly build (unsupported).
  • +
  • OpenBSD/x86: Better executable memory allocation for W^X mode.
  • +
  • x86: Fix argument checks for ipairs() iterator.
  • +
  • x86: lj_math_random_step() clobbers XMM regs on OSX Clang.
  • +
  • x86: Fix code generation for unused result of math.random().
  • +
  • x64: Allow building with LUAJIT_USE_SYSMALLOC and LUAJIT_USE_VALGRIND.
  • +
  • x86/x64: Fix argument check for bit shifts.
  • +
  • x86/x64: Fix code generation for fused test/arith ops.
  • +
  • ARM: Fix write barrier check in BC_USETS.
  • +
  • PPC: Fix red zone overflow in machine code generation.
  • +
  • PPC: Don't use mcrxr on PPE.
  • +
  • Various archs: Fix excess stack growth in interpreter.
  • +
  • FFI: Fix FOLD rule for TOBIT + CONV num.u32.
  • +
  • FFI: Prevent DSE across ffi.string().
  • +
  • FFI: No meta fallback when indexing pointer to incomplete struct.
  • +
  • FFI: Fix initialization of unions of subtypes.
  • +
  • FFI: Fix cdata vs. non-cdata arithmetic and comparisons.
  • +
  • FFI: Fix __index/__newindex metamethod resolution for ctypes.
  • +
  • FFI: Fix compilation of reference field access.
  • +
  • FFI: Fix frame traversal for backtraces with FFI callbacks.
  • +
  • FFI: Fix recording of indexing a struct pointer ctype object itself.
  • +
  • FFI: Allow non-scalar cdata to be compared for equality by address.
  • +
  • FFI: Fix pseudo type conversions for type punning.
  • +
+ +

LuaJIT 2.0.3 — 2014-03-12

+
    +
  • Add PS4 port.
  • +
  • Add support for multilib distro builds.
  • +
  • Fix OSX build.
  • +
  • Fix MinGW build.
  • +
  • Fix Xbox 360 build.
  • +
  • Improve ULOAD forwarding for open upvalues.
  • +
  • Fix GC steps threshold handling when called by JIT-compiled code.
  • +
  • Fix argument checks for math.deg() and math.rad().
  • +
  • Fix jit.flush(func|true).
  • +
  • Respect jit.off(func) when returning to a function, too.
  • +
  • Fix compilation of string.byte(s, nil, n).
  • +
  • Fix line number for relocated bytecode after closure fixup
  • +
  • Fix frame traversal for backtraces.
  • +
  • Fix ABC elimination.
  • +
  • Fix handling of redundant PHIs.
  • +
  • Fix snapshot restore for exit to function header.
  • +
  • Fix type punning alias analysis for constified pointers
  • +
  • Fix call unroll checks in the presence of metamethod frames.
  • +
  • Fix initial maxslot for down-recursive traces.
  • +
  • Prevent BASE register coalescing if parent uses IR_RETF.
  • +
  • Don't purge modified function from stack slots in BC_RET.
  • +
  • Fix recording of BC_VARG.
  • +
  • Don't access dangling reference to reallocated IR.
  • +
  • Fix frame depth display for bytecode dump in -jdump.
  • +
  • ARM: Fix register allocation when rematerializing FPRs.
  • +
  • x64: Fix store to upvalue for lightuserdata values.
  • +
  • FFI: Add missing GC steps for callback argument conversions.
  • +
  • FFI: Properly unload loaded DLLs.
  • +
  • FFI: Fix argument checks for ffi.string().
  • +
  • FFI/x64: Fix passing of vector arguments to calls.
  • +
  • FFI: Rehash finalizer table after GC cycle, if needed.
  • +
  • FFI: Fix cts->L for cdata unsinking in snapshot restore.
  • +
+ +

LuaJIT 2.0.2 — 2013-06-03

+
    +
  • Fix memory access check for fast string interning.
  • +
  • Fix MSVC intrinsics for older versions.
  • +
  • Add missing GC steps for io.* functions.
  • +
  • Fix spurious red zone overflows in machine code generation.
  • +
  • Fix jump-range constrained mcode allocation.
  • +
  • Inhibit DSE for implicit loads via calls.
  • +
  • Fix builtin string to number conversion for overflow digits.
  • +
  • Fix optional argument handling while recording builtins.
  • +
  • Fix optional argument handling in table.concat().
  • +
  • Add partial support for building with MingW64 GCC 4.8-SEH.
  • +
  • Add missing PHI barrier to string.sub(str, a, b) == kstr FOLD rule.
  • +
  • Fix compatibility issues with Illumos.
  • +
  • ARM: Fix cache flush/sync for exit stubs of JIT-compiled code.
  • +
  • MIPS: Fix cache flush/sync for JIT-compiled code jump area.
  • +
  • PPC: Add plt suffix for external calls from assembler code.
  • +
  • FFI: Fix snapshot substitution in SPLIT pass.
  • +
  • FFI/x86: Fix register allocation for 64 bit comparisons.
  • +
  • FFI: Fix tailcall in lowest frame to C function with bool result.
  • +
  • FFI: Ignore long type specifier in ffi.istype().
  • +
  • FFI: Fix calling conventions for 32 bit OSX and iOS simulator (struct returns).
  • +
  • FFI: Fix calling conventions for ARM hard-float EABI (nested structs).
  • +
  • FFI: Improve error messages for arithmetic and comparison operators.
  • +
  • FFI: Insert no-op type conversion for pointer to integer cast.
  • +
  • FFI: Fix unroll limit for ffi.fill().
  • +
  • FFI: Must sink XBAR together with XSTOREs.
  • +
  • FFI: Preserve intermediate string for const char * conversion.
  • +
+ +

LuaJIT 2.0.1 — 2013-02-19

+
    +
  • Don't clear frame for out-of-memory error.
  • +
  • Leave hook when resume catches error thrown from hook.
  • +
  • Add missing GC steps for template table creation.
  • +
  • Fix discharge order of comparisons in Lua parser.
  • +
  • Improve buffer handling for io.read().
  • +
  • OSX: Add support for Mach-O object files to -b option.
  • +
  • Fix PS3 port.
  • +
  • Fix/enable Xbox 360 port.
  • +
  • x86/x64: Always mark ref for shift count as non-weak.
  • +
  • x64: Don't fuse implicitly 32-to-64 extended operands.
  • +
  • ARM: Fix armhf call argument handling.
  • +
  • ARM: Fix code generation for integer math.min/math.max.
  • +
  • PPC/e500: Fix lj_vm_floor() for Inf/NaN.
  • +
  • FFI: Change priority of table initializer variants for structs.
  • +
  • FFI: Fix code generation for bool call result check on x86/x64.
  • +
  • FFI: Load FFI library on-demand for bytecode with cdata literals.
  • +
  • FFI: Fix handling of qualified transparent structs/unions.
  • +
+ +

LuaJIT 2.0.0 — 2012-11-08

+
    +
  • Correctness and completeness: +
      +
    • Fix Android/x86 build.
    • +
    • Fix recording of equality comparisons with __eq metamethods.
    • +
    • Fix detection of immutable upvalues.
    • +
    • Replace error with PANIC for callbacks from JIT-compiled code.
    • +
    • Fix builtin string to number conversion for INT_MIN.
    • +
    • Don't create unneeded array part for template tables.
    • +
    • Fix CONV.num.int sinking.
    • +
    • Don't propagate implicitly widened number to index metamethods.
    • +
    • ARM: Fix ordered comparisons of number vs. non-number.
    • +
    • FFI: Fix code generation for replay of sunk float fields.
    • +
    • FFI: Fix signedness of bool.
    • +
    • FFI: Fix recording of bool call result check on x86/x64.
    • +
    • FFI: Fix stack-adjustment for __thiscall callbacks.
    • +
  • +
+ +

LuaJIT 2.0.0-beta11 — 2012-10-16

+
    +
  • New features: +
      +
    • Use ARM VFP instructions, if available (build-time detection).
    • +
    • Add support for ARM hard-float EABI (armhf).
    • +
    • Add PS3 port.
    • +
    • Add many features from Lua 5.2, e.g. goto/labels. + Refer to this list.
    • +
    • FFI: Add parameterized C types.
    • +
    • FFI: Add support for copy constructors.
    • +
    • FFI: Equality comparisons never raise an error (treat as unequal instead).
    • +
    • FFI: Box all accessed or returned enums.
    • +
    • FFI: Check for __new metamethod when calling a constructor.
    • +
    • FFI: Handle __pairs/__ipairs metamethods for cdata objects.
    • +
    • FFI: Convert io.* file handle to FILE * pointer (but as a void *).
    • +
    • FFI: Detect and support type punning through unions.
    • +
    • FFI: Improve various error messages.
    • +
  • +
  • Build-system reorganization: +
      +
    • Reorganize directory layout:
      + lib/*src/jit/*
      + src/buildvm_*.dascsrc/vm_*.dasc
      + src/buildvm_*.h → removed
      + src/buildvm*src/host/*
    • +
    • Add minified Lua interpreter plus Lua BitOp (minilua) to run DynASM.
    • +
    • Change DynASM bit operations to use Lua BitOp
    • +
    • Translate only vm_*.dasc for detected target architecture.
    • +
    • Improve target detection for msvcbuild.bat.
    • +
    • Fix build issues on Cygwin and MinGW with optional MSys.
    • +
    • Handle cross-compiles with FPU/no-FPU or hard-fp/soft-fp ABI mismatch.
    • +
    • Remove some library functions for no-JIT/no-FFI builds.
    • +
    • Add uninstall target to top-level Makefile.
    • +
  • +
  • Correctness and completeness: +
      +
    • Preserve snapshot #0 PC for all traces.
    • +
    • Fix argument checks for coroutine.create().
    • +
    • Command line prints version and JIT status to stdout, not stderr.
    • +
    • Fix userdata __gc separations at Lua state close.
    • +
    • Fix TDUP to HLOAD forwarding for LJ_DUALNUM builds.
    • +
    • Fix buffer check in bytecode writer.
    • +
    • Make os.date() thread-safe.
    • +
    • Add missing declarations for MSVC intrinsics.
    • +
    • Fix dispatch table modifications for return hooks.
    • +
    • Workaround for MSVC conversion bug (doubleuint32_tint32_t).
    • +
    • Fix FOLD rule (i-j)-i => 0-j.
    • +
    • Never use DWARF unwinder on Windows.
    • +
    • Fix shrinking of direct mapped blocks in builtin allocator.
    • +
    • Limit recursion depth in string.match() et al.
    • +
    • Fix late despecialization of ITERN after loop has been entered.
    • +
    • Fix 'f' and 'L' options for debug.getinfo() and lua_getinfo().
    • +
    • Fix package.searchpath().
    • +
    • OSX: Change dylib names to be consistent with other platforms.
    • +
    • Android: Workaround for broken sprintf("%g", -0.0).
    • +
    • x86: Remove support for ancient CPUs without CMOV (before Pentium Pro).
    • +
    • x86: Fix register allocation for calls returning register pair.
    • +
    • x86/x64: Fix fusion of unsigned byte comparisons with swapped operands.
    • +
    • ARM: Fix tonumber() argument check.
    • +
    • ARM: Fix modulo operator and math.floor()/math.ceil() for inf/nan.
    • +
    • ARM: Invoke SPLIT pass for leftover IR_TOBIT.
    • +
    • ARM: Fix BASE register coalescing.
    • +
    • PPC: Fix interpreter state setup in callbacks.
    • +
    • PPC: Fix string.sub() range check.
    • +
    • MIPS: Support generation of MIPS/MIPSEL bytecode object files.
    • +
    • MIPS: Fix calls to floor()/ceil()/trunc().
    • +
    • ARM/PPC: Detect more target architecture variants.
    • +
    • ARM/PPC/e500/MIPS: Fix tailcalls from fast functions, esp. tostring().
    • +
    • ARM/PPC/MIPS: Fix rematerialization of FP constants.
    • +
    • FFI: Don't call FreeLibrary() on our own EXE/DLL.
    • +
    • FFI: Resolve metamethods for constructors, too.
    • +
    • FFI: Properly disable callbacks on iOS (would require executable memory).
    • +
    • FFI: Fix cdecl string parsing during recording.
    • +
    • FFI: Show address pointed to for tostring(ref), too.
    • +
    • FFI: Fix alignment of C call argument/return structure.
    • +
    • FFI: Initialize all fields of standard types.
    • +
    • FFI: Fix callback handling when new C types are declared in callback.
    • +
    • FFI: Fix recording of constructors for pointers.
    • +
    • FFI: Always resolve metamethods for pointers to structs.
    • +
    • FFI: Correctly propagate alignment when interning nested types.
    • +
  • +
  • Structural and performance enhancements: +
      +
    • Add allocation sinking and store sinking optimization.
    • +
    • Constify immutable upvalues.
    • +
    • Add builtin string to integer or FP number conversion. Improves cross-platform consistency and correctness.
    • +
    • Create string hash slots in template tables for non-const values, too. Avoids later table resizes.
    • +
    • Eliminate HREFK guard for template table references.
    • +
    • Add various new FOLD rules.
    • +
    • Don't use stack unwinding for lua_yield() (slow on x64).
    • +
    • ARM, PPC, MIPS: Improve XLOAD operand fusion and register hinting.
    • +
    • PPC, MIPS: Compile math.sqrt() to sqrt instruction, if available.
    • +
    • FFI: Fold KPTR + constant offset in SPLIT pass.
    • +
    • FFI: Optimize/inline ffi.copy() and ffi.fill().
    • +
    • FFI: Compile and optimize array/struct copies.
    • +
    • FFI: Compile ffi.typeof(cdata|ctype), ffi.sizeof(), ffi.alignof(), ffi.offsetof() and ffi.gc().
    • +
  • +
+ +

LuaJIT 2.0.0-beta10 — 2012-05-09

+
    +
  • New features: +
      +
    • The MIPS of LuaJIT is complete. It requires a CPU conforming to the +MIPS32 R1 architecture with hardware FPU. O32 hard-fp ABI, +little-endian or big-endian.
    • +
    • Auto-detect target arch via cross-compiler. No need for +TARGET=arch anymore.
    • +
    • Make DynASM compatible with Lua 5.2.
    • +
    • From Lua 5.2: Try __tostring metamethod on non-string error +messages..
    • +
  • +
  • Correctness and completeness: +
      +
    • Fix parsing of hex literals with exponents.
    • +
    • Fix bytecode dump for certain number constants.
    • +
    • Fix argument type in error message for relative arguments.
    • +
    • Fix argument error handling on Lua stacks without a frame.
    • +
    • Add missing mcode limit check in assembler backend.
    • +
    • Fix compilation on OpenBSD.
    • +
    • Avoid recursive GC steps after GC-triggered trace exit.
    • +
    • Replace <unwind.h> definitions with our own.
    • +
    • Fix OSX build issues. Bump minimum required OSX version to 10.4.
    • +
    • Fix discharge order of comparisons in Lua parser.
    • +
    • Ensure running __gc of userdata created in __gc +at state close.
    • +
    • Limit number of userdata __gc separations at state close.
    • +
    • Fix bytecode JMP slot range when optimizing +and/or with constant LHS.
    • +
    • Fix DSE of USTORE.
    • +
    • Make lua_concat() work from C hook with partial frame.
    • +
    • Add required PHIs for implicit conversions, e.g. via XREF +forwarding.
    • +
    • Add more comparison variants to Valgrind suppressions file.
    • +
    • Disable loading bytecode with an extra header (BOM or #!).
    • +
    • Fix PHI stack slot syncing.
    • +
    • ARM: Reorder type/value tests to silence Valgrind.
    • +
    • ARM: Fix register allocation for ldrd-optimized +HREFK.
    • +
    • ARM: Fix conditional branch fixup for OBAR.
    • +
    • ARM: Invoke SPLIT pass for double args in FFI call.
    • +
    • ARM: Handle all CALL* ops with double results in +SPLIT pass.
    • +
    • ARM: Fix rejoin of POW in SPLIT pass.
    • +
    • ARM: Fix compilation of math.sinh, math.cosh, +math.tanh.
    • +
    • ARM, PPC: Avoid pointless arg clearing in BC_IFUNCF.
    • +
    • PPC: Fix resume after yield from hook.
    • +
    • PPC: Fix argument checking for rawget().
    • +
    • PPC: Fix fusion of floating-point XLOAD/XSTORE.
    • +
    • PPC: Fix HREFK code generation for huge tables.
    • +
    • PPC: Use builtin D-Cache/I-Cache sync code.
    • +
  • +
  • FFI library: +
      +
    • Ignore empty statements in ffi.cdef().
    • +
    • Ignore number parsing errors while skipping definitions.
    • +
    • Don't touch frame in callbacks with tailcalls to fast functions.
    • +
    • Fix library unloading on POSIX systems.
    • +
    • Finalize cdata before userdata when closing the state.
    • +
    • Change ffi.load() library name resolution for Cygwin.
    • +
    • Fix resolving of function name redirects on Windows/x86.
    • +
    • Fix symbol resolving error messages on Windows.
    • +
    • Fix blacklisting of C functions calling callbacks.
    • +
    • Fix result type of pointer difference.
    • +
    • Use correct PC in FFI metamethod error message.
    • +
    • Allow 'typedef _Bool int BOOL;' for the Windows API.
    • +
    • Don't record test for bool result of call, if ignored.
    • +
  • +
+ +

LuaJIT 2.0.0-beta9 — 2011-12-14

+
    +
  • New features: +
      +
    • PPC port of LuaJIT is complete. Default is the dual-number port +(usually faster). Single-number port selectable via src/Makefile +at build time.
    • +
    • Add FFI callback support.
    • +
    • Extend -b to generate .c, .h or .obj/.o +files with embedded bytecode.
    • +
    • Allow loading embedded bytecode with require().
    • +
    • From Lua 5.2: Change to '\z' escape. Reject undefined escape +sequences.
    • +
  • +
  • Correctness and completeness: +
      +
    • Fix OSX 10.7 build. Fix install_name and versioning on OSX.
    • +
    • Fix iOS build.
    • +
    • Install dis_arm.lua, too.
    • +
    • Mark installed shared library as executable.
    • +
    • Add debug option to msvcbuild.bat and improve error handling.
    • +
    • Fix data-flow analysis for iterators.
    • +
    • Fix forced unwinding triggered by external unwinder.
    • +
    • Record missing for loop slot loads (return to lower frame).
    • +
    • Always use ANSI variants of Windows system functions.
    • +
    • Fix GC barrier for multi-result table constructor (TSETM).
    • +
    • Fix/add various FOLD rules.
    • +
    • Add potential PHI for number conversions due to type instability.
    • +
    • Do not eliminate PHIs only referenced from other PHIs.
    • +
    • Correctly anchor implicit number to string conversions in Lua/C API.
    • +
    • Fix various stack limit checks.
    • +
    • x64: Use thread-safe exceptions for external unwinding (GCC platforms).
    • +
    • x64: Fix result type of cdata index conversions.
    • +
    • x64: Fix math.random() and bit.bswap() code generation.
    • +
    • x64: Fix lightuserdata comparisons.
    • +
    • x64: Always extend stack-passed arguments to pointer size.
    • +
    • ARM: Many fixes to code generation backend.
    • +
    • PPC/e500: Fix dispatch for binop metamethods.
    • +
    • PPC/e500: Save/restore condition registers when entering/leaving the VM.
    • +
    • PPC/e500: Fix write barrier in stores of strings to upvalues.
    • +
  • +
  • FFI library: +
      +
    • Fix C comment parsing.
    • +
    • Fix snapshot optimization for cdata comparisons.
    • +
    • Fix recording of const/enum lookups in namespaces.
    • +
    • Fix call argument and return handling for I8/U8/I16/U16 types.
    • +
    • Fix unfused loads of float fields.
    • +
    • Fix ffi.string() recording.
    • +
    • Save GetLastError() around ffi.load() and symbol +resolving, too.
    • +
    • Improve ld script detection in ffi.load().
    • +
    • Record loads/stores to external variables in namespaces.
    • +
    • Compile calls to stdcall, fastcall and vararg functions.
    • +
    • Treat function ctypes like pointers in comparisons.
    • +
    • Resolve __call metamethod for pointers, too.
    • +
    • Record C function calls with bool return values.
    • +
    • Record ffi.errno().
    • +
    • x86: Fix number to uint32_t conversion rounding.
    • +
    • x86: Fix 64 bit arithmetic in assembler backend.
    • +
    • x64: Fix struct-by-value calling conventions.
    • +
    • ARM: Ensure invocation of SPLIT pass for float conversions.
    • +
  • +
  • Structural and performance enhancements: +
      +
    • Display trace types with -jv and -jdump.
    • +
    • Record isolated calls. But prefer recording loops over calls.
    • +
    • Specialize to prototype for non-monomorphic functions. Solves the +trace-explosion problem for closure-heavy programming styles.
    • +
    • Always generate a portable vmdef.lua. Easier for distros.
    • +
  • +
+ +

LuaJIT 2.0.0-beta8 — 2011-06-23

+
    +
  • New features: +
      +
    • Soft-float ARM port of LuaJIT is complete.
    • +
    • Add support for bytecode loading/saving and -b command line +option.
    • +
    • From Lua 5.2: __len metamethod for tables +(disabled by default).
    • +
  • +
  • Correctness and completeness: +
      +
    • ARM: Misc. fixes for interpreter.
    • +
    • x86/x64: Fix bit.* argument checking in interpreter.
    • +
    • Catch early out-of-memory in memory allocator initialization.
    • +
    • Fix data-flow analysis for paths leading to an upvalue close.
    • +
    • Fix check for missing arguments in string.format().
    • +
    • Fix Solaris/x86 build (note: not a supported target).
    • +
    • Fix recording of loops with instable directions in side traces.
    • +
    • x86/x64: Fix fusion of comparisons with u8/u16 +XLOAD.
    • +
    • x86/x64: Fix register allocation for variable shifts.
    • +
  • +
  • FFI library: +
      +
    • Add ffi.errno(). Save errno/GetLastError() +around allocations etc.
    • +
    • Fix __gc for VLA/VLS cdata objects.
    • +
    • Fix recording of casts from 32 bit cdata pointers to integers.
    • +
    • tonumber(cdata) returns nil for non-numbers.
    • +
    • Show address pointed to for tostring(pointer).
    • +
    • Print NULL pointers as "cdata<... *>: NULL".
    • +
    • Support __tostring metamethod for pointers to structs, too.
    • +
  • +
  • Structural and performance enhancements: +
      +
    • More tuning for loop unrolling heuristics.
    • +
    • Flatten and compress in-memory debug info (saves ~70%).
    • +
  • +
+ +

LuaJIT 2.0.0-beta7 — 2011-05-05

+
    +
  • New features: +
      +
    • ARM port of the LuaJIT interpreter is complete.
    • +
    • FFI library: Add ffi.gc(), ffi.metatype(), +ffi.istype().
    • +
    • FFI library: Resolve ld script redirection in ffi.load().
    • +
    • From Lua 5.2: package.searchpath(), fp:read("*L"), +load(string).
    • +
    • From Lua 5.2, disabled by default: empty statement, +table.unpack(), modified coroutine.running().
    • +
  • +
  • Correctness and completeness: +
      +
    • FFI library: numerous fixes.
    • +
    • Fix type mismatches in store-to-load forwarding.
    • +
    • Fix error handling within metamethods.
    • +
    • Fix table.maxn().
    • +
    • Improve accuracy of x^-k on x64.
    • +
    • Fix code generation for Intel Atom in x64 mode.
    • +
    • Fix narrowing of POW.
    • +
    • Fix recording of retried fast functions.
    • +
    • Fix code generation for bit.bnot() and multiplies.
    • +
    • Fix error location within cpcall frames.
    • +
    • Add workaround for old libgcc unwind bug.
    • +
    • Fix lua_yield() and getmetatable(lightuserdata) on x64.
    • +
    • Misc. fixes for PPC/e500 interpreter.
    • +
    • Fix stack slot updates for down-recursion.
    • +
  • +
  • Structural and performance enhancements: +
      +
    • Add dual-number mode (int/double) for the VM. Enabled for ARM.
    • +
    • Improve narrowing of arithmetic operators and for loops.
    • +
    • Tune loop unrolling heuristics and increase trace recorder limits.
    • +
    • Eliminate dead slots in snapshots using bytecode data-flow analysis.
    • +
    • Avoid phantom stores to proxy tables.
    • +
    • Optimize lookups in empty proxy tables.
    • +
    • Improve bytecode optimization of and/or operators.
    • +
  • +
+ +

LuaJIT 2.0.0-beta6 — 2011-02-11

+
    +
  • New features: +
      +
    • PowerPC/e500v2 port of the LuaJIT interpreter is complete.
    • +
    • Various minor features from Lua 5.2: Hex escapes in literals, +'\*' escape, reversible string.format("%q",s), +"%g" pattern, table.sort checks callbacks, +os.exit(status|true|false[,close]).
    • +
    • Lua 5.2 __pairs and __ipairs metamethods +(disabled by default).
    • +
    • Initial release of the FFI library.
    • +
  • +
  • Correctness and completeness: +
      +
    • Fix string.format() for non-finite numbers.
    • +
    • Fix memory leak when compiled to use the built-in allocator.
    • +
    • x86/x64: Fix unnecessary resize in TSETM bytecode.
    • +
    • Fix various GC issues with traces and jit.flush().
    • +
    • x64: Fix fusion of indexes for array references.
    • +
    • x86/x64: Fix stack overflow handling for coroutine results.
    • +
    • Enable low-2GB memory allocation on FreeBSD/x64.
    • +
    • Fix collectgarbage("count") result if more than 2GB is in use.
    • +
    • Fix parsing of hex floats.
    • +
    • x86/x64: Fix loop branch inversion with trailing +HREF+NE/EQ.
    • +
    • Add jit.os string.
    • +
    • coroutine.create() permits running C functions, too.
    • +
    • Fix OSX build to work with newer ld64 versions.
    • +
    • Fix bytecode optimization of and/or operators.
    • +
  • +
  • Structural and performance enhancements: +
      +
    • Emit specialized bytecode for pairs()/next().
    • +
    • Improve bytecode coalescing of nil constants.
    • +
    • Compile calls to vararg functions.
    • +
    • Compile select().
    • +
    • Improve alias analysis, esp. for loads from allocations.
    • +
    • Tuning of various compiler heuristics.
    • +
    • Refactor and extend IR conversion instructions.
    • +
    • x86/x64: Various backend enhancements related to the FFI.
    • +
    • Add SPLIT pass to split 64 bit IR instructions for 32 bit CPUs.
    • +
  • +
+ +

LuaJIT 2.0.0-beta5 — 2010-08-24

+
    +
  • Correctness and completeness: +
      +
    • Fix trace exit dispatch to function headers.
    • +
    • Fix Windows and OSX builds with LUAJIT_DISABLE_JIT.
    • +
    • Reorganize and fix placement of generated machine code on x64.
    • +
    • Fix TNEW in x64 interpreter.
    • +
    • Do not eliminate PHIs for values only referenced from side exits.
    • +
    • OS-independent canonicalization of strings for non-finite numbers.
    • +
    • Fix string.char() range check on x64.
    • +
    • Fix tostring() resolving within print().
    • +
    • Fix error handling for next().
    • +
    • Fix passing of constant arguments to external calls on x64.
    • +
    • Fix interpreter argument check for two-argument SSE math functions.
    • +
    • Fix C frame chain corruption caused by lua_cpcall().
    • +
    • Fix return from pcall() within active hook.
    • +
  • +
  • Structural and performance enhancements: +
      +
    • Replace on-trace GC frame syncing with interpreter exit.
    • +
    • Improve hash lookup specialization by not removing dead keys during GC.
    • +
    • Turn traces into true GC objects.
    • +
    • Avoid starting a GC cycle immediately after library init.
    • +
    • Add weak guards to improve dead-code elimination.
    • +
    • Speed up string interning.
    • +
  • +
+ +

LuaJIT 2.0.0-beta4 — 2010-03-28

+
    +
  • Correctness and completeness: +
      +
    • Fix precondition for on-trace creation of table keys.
    • +
    • Fix {f()} on x64 when table is resized.
    • +
    • Fix folding of ordered comparisons with same references.
    • +
    • Fix snapshot restores for multi-result bytecodes.
    • +
    • Fix potential hang when recording bytecode with nested closures.
    • +
    • Fix recording of getmetatable(), tonumber() and bad argument types.
    • +
    • Fix SLOAD fusion across returns to lower frames.
    • +
  • +
  • Structural and performance enhancements: +
      +
    • Add array bounds check elimination. -Oabc is enabled by default.
    • +
    • More tuning for x64, e.g. smaller table objects.
    • +
  • +
+ +

LuaJIT 2.0.0-beta3 — 2010-03-07

+
    +
  • LuaJIT x64 port: +
      +
    • Port integrated memory allocator to Linux/x64, Windows/x64 and OSX/x64.
    • +
    • Port interpreter and JIT compiler to x64.
    • +
    • Port DynASM to x64.
    • +
    • Many 32/64 bit cleanups in the VM.
    • +
    • Allow building the interpreter with either x87 or SSE2 arithmetics.
    • +
    • Add external unwinding and C++ exception interop (default on x64).
    • +
  • +
  • Correctness and completeness: +
      +
    • Fix constructor bytecode generation for certain conditional values.
    • +
    • Fix some cases of ordered string comparisons.
    • +
    • Fix lua_tocfunction().
    • +
    • Fix cutoff register in JMP bytecode for some conditional expressions.
    • +
    • Fix PHI marking algorithm for references from variant slots.
    • +
    • Fix package.cpath for non-default PREFIX.
    • +
    • Fix DWARF2 frame unwind information for interpreter on OSX.
    • +
    • Drive the GC forward on string allocations in the parser.
    • +
    • Implement call/return hooks (zero-cost if disabled).
    • +
    • Implement yield from C hooks.
    • +
    • Disable JIT compiler on older non-SSE2 CPUs instead of aborting.
    • +
  • +
  • Structural and performance enhancements: +
      +
    • Compile recursive code (tail-, up- and down-recursion).
    • +
    • Improve heuristics for bytecode penalties and blacklisting.
    • +
    • Split CALL/FUNC recording and clean up fast function call semantics.
    • +
    • Major redesign of internal function call handling.
    • +
    • Improve FOR loop const specialization and integerness checks.
    • +
    • Switch to pre-initialized stacks. Avoid frame-clearing.
    • +
    • Colocation of prototypes and related data: bytecode, constants, debug info.
    • +
    • Cleanup parser and streamline bytecode generation.
    • +
    • Add support for weak IR references to register allocator.
    • +
    • Switch to compressed, extensible snapshots.
    • +
    • Compile returns to frames below the start frame.
    • +
    • Improve alias analysis of upvalues using a disambiguation hash value.
    • +
    • Compile floor/ceil/trunc to SSE2 helper calls or SSE4.1 instructions.
    • +
    • Add generic C call handling to IR and backend.
    • +
    • Improve KNUM fuse vs. load heuristics.
    • +
    • Compile various io.*() functions.
    • +
    • Compile math.sinh(), math.cosh(), math.tanh() +and math.random().
    • +
  • +
+ +

LuaJIT 2.0.0-beta2 — 2009-11-09

+
    +
  • Reorganize build system. Build static+shared library on POSIX.
  • +
  • Allow C++ exception conversion on all platforms +using a wrapper function.
  • +
  • Automatically catch C++ exceptions and rethrow Lua error +(DWARF2 only).
  • +
  • Check for the correct x87 FPU precision at strategic points.
  • +
  • Always use wrappers for libm functions.
  • +
  • Resurrect metamethod name strings before copying them.
  • +
  • Mark current trace, even if compiler is idle.
  • +
  • Ensure FILE metatable is created only once.
  • +
  • Fix type comparisons when different integer types are involved.
  • +
  • Fix getmetatable() recording.
  • +
  • Fix TDUP with dead keys in template table.
  • +
  • jit.flush(tr) returns status. +Prevent manual flush of a trace that's still linked.
  • +
  • Improve register allocation heuristics for invariant references.
  • +
  • Compile the push/pop variants of table.insert() and +table.remove().
  • +
  • Compatibility with MSVC link /debug.
  • +
  • Fix lua_iscfunction().
  • +
  • Fix math.random() when compiled with -fpic (OSX).
  • +
  • Fix table.maxn().
  • +
  • Bump MACOSX_DEPLOYMENT_TARGET to 10.4
  • +
  • luaL_check*() and luaL_opt*() now support +negative arguments, too.
    +This matches the behavior of Lua 5.1, but not the specification.
  • +
+ +

LuaJIT 2.0.0-beta1 — 2009-10-31

+
    +
  • This is the first public release of LuaJIT 2.0.
  • +
  • The whole VM has been rewritten from the ground up, so there's +no point in listing differences over earlier versions.
  • +
+
+
+
+ + + diff --git a/lib/LuaJIT/doc/contact.html b/lib/LuaJIT/doc/contact.html new file mode 100644 index 0000000..2aace4b --- /dev/null +++ b/lib/LuaJIT/doc/contact.html @@ -0,0 +1,110 @@ + + + +Contact + + + + + + + +
+Lua +
+ + +
+

+If you want to report bugs, propose fixes or suggest enhancements, +please use the +GitHub issue tracker. +

+

+Please send general questions to the +» LuaJIT mailing list. +

+

+You can also send any questions you have directly to me: +

+ + + + + +

Copyright

+

+All documentation is +Copyright © 2005-2018 Mike Pall. +

+ + +
+
+ + + diff --git a/lib/LuaJIT/doc/ext_c_api.html b/lib/LuaJIT/doc/ext_c_api.html new file mode 100644 index 0000000..f27b956 --- /dev/null +++ b/lib/LuaJIT/doc/ext_c_api.html @@ -0,0 +1,188 @@ + + + +Lua/C API Extensions + + + + + + + +
+Lua +
+ + +
+

+LuaJIT adds some extensions to the standard Lua/C API. The LuaJIT include +directory must be in the compiler search path (-Ipath) +to be able to include the required header for C code: +

+
+#include "luajit.h"
+
+

+Or for C++ code: +

+
+#include "lua.hpp"
+
+ +

luaJIT_setmode(L, idx, mode) +— Control VM

+

+This is a C API extension to allow control of the VM from C code. The +full prototype of LuaJIT_setmode is: +

+
+LUA_API int luaJIT_setmode(lua_State *L, int idx, int mode);
+
+

+The returned status is either success (1) or failure (0). +The second argument is either 0 or a stack index (similar to the +other Lua/C API functions). +

+

+The third argument specifies the mode, which is 'or'ed with a flag. +The flag can be LUAJIT_MODE_OFF to turn a feature off, +LUAJIT_MODE_ON to turn a feature on, or +LUAJIT_MODE_FLUSH to flush cached code. +

+

+The following modes are defined: +

+ +

luaJIT_setmode(L, 0, LUAJIT_MODE_ENGINE|flag)

+

+Turn the whole JIT compiler on or off or flush the whole cache of compiled code. +

+ +

luaJIT_setmode(L, idx, LUAJIT_MODE_FUNC|flag)
+luaJIT_setmode(L, idx, LUAJIT_MODE_ALLFUNC|flag)
+luaJIT_setmode(L, idx, LUAJIT_MODE_ALLSUBFUNC|flag)

+

+This sets the mode for the function at the stack index idx or +the parent of the calling function (idx = 0). It either +enables JIT compilation for a function, disables it and flushes any +already compiled code or only flushes already compiled code. This +applies recursively to all sub-functions of the function with +LUAJIT_MODE_ALLFUNC or only to the sub-functions with +LUAJIT_MODE_ALLSUBFUNC. +

+ +

luaJIT_setmode(L, trace,
+  LUAJIT_MODE_TRACE|LUAJIT_MODE_FLUSH)

+

+Flushes the specified root trace and all of its side traces from the cache. +The code for the trace will be retained as long as there are any other +traces which link to it. +

+ +

luaJIT_setmode(L, idx, LUAJIT_MODE_WRAPCFUNC|flag)

+

+This mode defines a wrapper function for calls to C functions. If +called with LUAJIT_MODE_ON, the stack index at idx +must be a lightuserdata object holding a pointer to the wrapper +function. From now on all C functions are called through the wrapper +function. If called with LUAJIT_MODE_OFF this mode is turned +off and all C functions are directly called. +

+

+The wrapper function can be used for debugging purposes or to catch +and convert foreign exceptions. But please read the section on +C++ exception interoperability +first. Recommended usage can be seen in this C++ code excerpt: +

+
+#include <exception>
+#include "lua.hpp"
+
+// Catch C++ exceptions and convert them to Lua error messages.
+// Customize as needed for your own exception classes.
+static int wrap_exceptions(lua_State *L, lua_CFunction f)
+{
+  try {
+    return f(L);  // Call wrapped function and return result.
+  } catch (const char *s) {  // Catch and convert exceptions.
+    lua_pushstring(L, s);
+  } catch (std::exception& e) {
+    lua_pushstring(L, e.what());
+  } catch (...) {
+    lua_pushliteral(L, "caught (...)");
+  }
+  return lua_error(L);  // Rethrow as a Lua error.
+}
+
+static int myinit(lua_State *L)
+{
+  ...
+  // Define wrapper function and enable it.
+  lua_pushlightuserdata(L, (void *)wrap_exceptions);
+  luaJIT_setmode(L, -1, LUAJIT_MODE_WRAPCFUNC|LUAJIT_MODE_ON);
+  lua_pop(L, 1);
+  ...
+}
+
+

+Note that you can only define a single global wrapper function, +so be careful when using this mechanism from multiple C++ modules. +Also note that this mechanism is not without overhead. +

+
+
+ + + diff --git a/lib/LuaJIT/doc/ext_ffi.html b/lib/LuaJIT/doc/ext_ffi.html new file mode 100644 index 0000000..de57bcf --- /dev/null +++ b/lib/LuaJIT/doc/ext_ffi.html @@ -0,0 +1,331 @@ + + + +FFI Library + + + + + + + +
+Lua +
+ + +
+

+ +The FFI library allows calling external C functions and +using C data structures from pure Lua code. + +

+

+ +The FFI library largely obviates the need to write tedious manual +Lua/C bindings in C. No need to learn a separate binding language +— it parses plain C declarations! These can be +cut-n-pasted from C header files or reference manuals. It's up to +the task of binding large libraries without the need for dealing with +fragile binding generators. + +

+

+The FFI library is tightly integrated into LuaJIT (it's not available +as a separate module). The code generated by the JIT-compiler for +accesses to C data structures from Lua code is on par with the +code a C compiler would generate. Calls to C functions can +be inlined in JIT-compiled code, unlike calls to functions bound via +the classic Lua/C API. +

+

+This page gives a short introduction to the usage of the FFI library. +Please use the FFI sub-topics in the navigation bar to learn more. +

+ +

Motivating Example: Calling External C Functions

+

+It's really easy to call an external C library function: +

+
+①
+②
+
+
+③local ffi = require("ffi")
+ffi.cdef[[
+int printf(const char *fmt, ...);
+]]
+ffi.C.printf("Hello %s!", "world")
+
+

+So, let's pick that apart: +

+

+ Load the FFI library. +

+

+ Add a C declaration +for the function. The part inside the double-brackets (in green) is +just standard C syntax. +

+

+ Call the named +C function — Yes, it's that simple! +

+

+Actually, what goes on behind the scenes is far from simple: makes use of the standard +C library namespace ffi.C. Indexing this namespace with +a symbol name ("printf") automatically binds it to the +standard C library. The result is a special kind of object which, +when called, runs the printf function. The arguments passed +to this function are automatically converted from Lua objects to the +corresponding C types. +

+

+Ok, so maybe the use of printf() wasn't such a spectacular +example. You could have done that with io.write() and +string.format(), too. But you get the idea ... +

+

+So here's something to pop up a message box on Windows: +

+
+local ffi = require("ffi")
+ffi.cdef[[
+int MessageBoxA(void *w, const char *txt, const char *cap, int type);
+]]
+ffi.C.MessageBoxA(nil, "Hello world!", "Test", 0)
+
+

+Bing! Again, that was far too easy, no? +

+

+Compare this with the effort required to bind that function using the +classic Lua/C API: create an extra C file, add a C function +that retrieves and checks the argument types passed from Lua and calls +the actual C function, add a list of module functions and their +names, add a luaopen_* function and register all module +functions, compile and link it into a shared library (DLL), move it to +the proper path, add Lua code that loads the module aaaand ... finally +call the binding function. Phew! +

+ +

Motivating Example: Using C Data Structures

+

+The FFI library allows you to create and access C data +structures. Of course the main use for this is for interfacing with +C functions. But they can be used stand-alone, too. +

+

+Lua is built upon high-level data types. They are flexible, extensible +and dynamic. That's why we all love Lua so much. Alas, this can be +inefficient for certain tasks, where you'd really want a low-level +data type. E.g. a large array of a fixed structure needs to be +implemented with a big table holding lots of tiny tables. This imposes +both a substantial memory overhead as well as a performance overhead. +

+

+Here's a sketch of a library that operates on color images plus a +simple benchmark. First, the plain Lua version: +

+
+local floor = math.floor
+
+local function image_ramp_green(n)
+  local img = {}
+  local f = 255/(n-1)
+  for i=1,n do
+    img[i] = { red = 0, green = floor((i-1)*f), blue = 0, alpha = 255 }
+  end
+  return img
+end
+
+local function image_to_grey(img, n)
+  for i=1,n do
+    local y = floor(0.3*img[i].red + 0.59*img[i].green + 0.11*img[i].blue)
+    img[i].red = y; img[i].green = y; img[i].blue = y
+  end
+end
+
+local N = 400*400
+local img = image_ramp_green(N)
+for i=1,1000 do
+  image_to_grey(img, N)
+end
+
+

+This creates a table with 160.000 pixels, each of which is a table +holding four number values in the range of 0-255. First an image with +a green ramp is created (1D for simplicity), then the image is +converted to greyscale 1000 times. Yes, that's silly, but I was in +need of a simple example ... +

+

+And here's the FFI version. The modified parts have been marked in +bold: +

+
+①
+
+
+
+
+
+②
+
+③
+④
+
+
+
+
+
+
+③
+⑤local ffi = require("ffi")
+ffi.cdef[[
+typedef struct { uint8_t red, green, blue, alpha; } rgba_pixel;
+]]
+
+local function image_ramp_green(n)
+  local img = ffi.new("rgba_pixel[?]", n)
+  local f = 255/(n-1)
+  for i=0,n-1 do
+    img[i].green = i*f
+    img[i].alpha = 255
+  end
+  return img
+end
+
+local function image_to_grey(img, n)
+  for i=0,n-1 do
+    local y = 0.3*img[i].red + 0.59*img[i].green + 0.11*img[i].blue
+    img[i].red = y; img[i].green = y; img[i].blue = y
+  end
+end
+
+local N = 400*400
+local img = image_ramp_green(N)
+for i=1,1000 do
+  image_to_grey(img, N)
+end
+
+

+Ok, so that wasn't too difficult: +

+

+ First, load the FFI +library and declare the low-level data type. Here we choose a +struct which holds four byte fields, one for each component +of a 4x8 bit RGBA pixel. +

+

+ Creating the data +structure with ffi.new() is straightforward — the +'?' is a placeholder for the number of elements of a +variable-length array. +

+

+ C arrays are +zero-based, so the indexes have to run from 0 to +n-1. One might want to allocate one more element instead to +simplify converting legacy code. +

+

+ Since ffi.new() +zero-fills the array by default, we only need to set the green and the +alpha fields. +

+

+ The calls to +math.floor() can be omitted here, because floating-point +numbers are already truncated towards zero when converting them to an +integer. This happens implicitly when the number is stored in the +fields of each pixel. +

+

+Now let's have a look at the impact of the changes: first, memory +consumption for the image is down from 22 Megabytes to +640 Kilobytes (400*400*4 bytes). That's a factor of 35x less! So, +yes, tables do have a noticeable overhead. BTW: The original program +would consume 40 Megabytes in plain Lua (on x64). +

+

+Next, performance: the pure Lua version runs in 9.57 seconds (52.9 +seconds with the Lua interpreter) and the FFI version runs in 0.48 +seconds on my machine (YMMV). That's a factor of 20x faster (110x +faster than the Lua interpreter). +

+

+The avid reader may notice that converting the pure Lua version over +to use array indexes for the colors ([1] instead of +.red, [2] instead of .green etc.) ought to +be more compact and faster. This is certainly true (by a factor of +~1.7x). Switching to a struct-of-arrays would help, too. +

+

+However the resulting code would be less idiomatic and rather +error-prone. And it still doesn't get even close to the performance of +the FFI version of the code. Also, high-level data structures cannot +be easily passed to other C functions, especially I/O functions, +without undue conversion penalties. +

+
+
+ + + diff --git a/lib/LuaJIT/doc/ext_ffi_api.html b/lib/LuaJIT/doc/ext_ffi_api.html new file mode 100644 index 0000000..54ff0ce --- /dev/null +++ b/lib/LuaJIT/doc/ext_ffi_api.html @@ -0,0 +1,571 @@ + + + +ffi.* API Functions + + + + + + + + +
+Lua +
+ + +
+

+This page describes the API functions provided by the FFI library in +detail. It's recommended to read through the +introduction and the +FFI tutorial first. +

+ +

Glossary

+ + +

Declaring and Accessing External Symbols

+

+External symbols must be declared first and can then be accessed by +indexing a C library +namespace, which automatically binds the symbol to a specific +library. +

+ +

ffi.cdef(def)

+

+Adds multiple C declarations for types or external symbols (named +variables or functions). def must be a Lua string. It's +recommended to use the syntactic sugar for string arguments as +follows: +

+
+ffi.cdef[[
+typedef struct foo { int a, b; } foo_t;  // Declare a struct and typedef.
+int dofoo(foo_t *f, int n);  /* Declare an external C function. */
+]]
+
+

+The contents of the string (the part in green above) must be a +sequence of +C declarations, +separated by semicolons. The trailing semicolon for a single +declaration may be omitted. +

+

+Please note that external symbols are only declared, but they +are not bound to any specific address, yet. Binding is +achieved with C library namespaces (see below). +

+

+C declarations are not passed through a C pre-processor, +yet. No pre-processor tokens are allowed, except for +#pragma pack. Replace #define in existing +C header files with enum, static const +or typedef and/or pass the files through an external +C pre-processor (once). Be careful not to include unneeded or +redundant declarations from unrelated header files. +

+ +

ffi.C

+

+This is the default C library namespace — note the +uppercase 'C'. It binds to the default set of symbols or +libraries on the target system. These are more or less the same as a +C compiler would offer by default, without specifying extra link +libraries. +

+

+On POSIX systems, this binds to symbols in the default or global +namespace. This includes all exported symbols from the executable and +any libraries loaded into the global namespace. This includes at least +libc, libm, libdl (on Linux), +libgcc (if compiled with GCC), as well as any exported +symbols from the Lua/C API provided by LuaJIT itself. +

+

+On Windows systems, this binds to symbols exported from the +*.exe, the lua51.dll (i.e. the Lua/C API +provided by LuaJIT itself), the C runtime library LuaJIT was linked +with (msvcrt*.dll), kernel32.dll, +user32.dll and gdi32.dll. +

+ +

clib = ffi.load(name [,global])

+

+This loads the dynamic library given by name and returns +a new C library namespace which binds to its symbols. On POSIX +systems, if global is true, the library symbols are +loaded into the global namespace, too. +

+

+If name is a path, the library is loaded from this path. +Otherwise name is canonicalized in a system-dependent way and +searched in the default search path for dynamic libraries: +

+

+On POSIX systems, if the name contains no dot, the extension +.so is appended. Also, the lib prefix is prepended +if necessary. So ffi.load("z") looks for "libz.so" +in the default shared library search path. +

+

+On Windows systems, if the name contains no dot, the extension +.dll is appended. So ffi.load("ws2_32") looks for +"ws2_32.dll" in the default DLL search path. +

+ +

Creating cdata Objects

+

+The following API functions create cdata objects (type() +returns "cdata"). All created cdata objects are +garbage collected. +

+ +

cdata = ffi.new(ct [,nelem] [,init...])
+cdata = ctype([nelem,] [init...])

+

+Creates a cdata object for the given ct. VLA/VLS types +require the nelem argument. The second syntax uses a ctype as +a constructor and is otherwise fully equivalent. +

+

+The cdata object is initialized according to the +rules for initializers, +using the optional init arguments. Excess initializers cause +an error. +

+

+Performance notice: if you want to create many objects of one kind, +parse the cdecl only once and get its ctype with +ffi.typeof(). Then use the ctype as a constructor repeatedly. +

+

+Please note that an anonymous struct declaration implicitly +creates a new and distinguished ctype every time you use it for +ffi.new(). This is probably not what you want, +especially if you create more than one cdata object. Different anonymous +structs are not considered assignment-compatible by the +C standard, even though they may have the same fields! Also, they +are considered different types by the JIT-compiler, which may cause an +excessive number of traces. It's strongly suggested to either declare +a named struct or typedef with ffi.cdef() +or to create a single ctype object for an anonymous struct +with ffi.typeof(). +

+ +

ctype = ffi.typeof(ct)

+

+Creates a ctype object for the given ct. +

+

+This function is especially useful to parse a cdecl only once and then +use the resulting ctype object as a constructor. +

+ +

cdata = ffi.cast(ct, init)

+

+Creates a scalar cdata object for the given ct. The cdata +object is initialized with init using the "cast" variant of +the C type conversion +rules. +

+

+This functions is mainly useful to override the pointer compatibility +checks or to convert pointers to addresses or vice versa. +

+ +

ctype = ffi.metatype(ct, metatable)

+

+Creates a ctype object for the given ct and associates it with +a metatable. Only struct/union types, complex numbers +and vectors are allowed. Other types may be wrapped in a +struct, if needed. +

+

+The association with a metatable is permanent and cannot be changed +afterwards. Neither the contents of the metatable nor the +contents of an __index table (if any) may be modified +afterwards. The associated metatable automatically applies to all uses +of this type, no matter how the objects are created or where they +originate from. Note that pre-defined operations on types have +precedence (e.g. declared field names cannot be overriden). +

+

+All standard Lua metamethods are implemented. These are called directly, +without shortcuts and on any mix of types. For binary operations, the +left operand is checked first for a valid ctype metamethod. The +__gc metamethod only applies to struct/union +types and performs an implicit ffi.gc() +call during creation of an instance. +

+ +

cdata = ffi.gc(cdata, finalizer)

+

+Associates a finalizer with a pointer or aggregate cdata object. The +cdata object is returned unchanged. +

+

+This function allows safe integration of unmanaged resources into the +automatic memory management of the LuaJIT garbage collector. Typical +usage: +

+
+local p = ffi.gc(ffi.C.malloc(n), ffi.C.free)
+...
+p = nil -- Last reference to p is gone.
+-- GC will eventually run finalizer: ffi.C.free(p)
+
+

+A cdata finalizer works like the __gc metamethod for userdata +objects: when the last reference to a cdata object is gone, the +associated finalizer is called with the cdata object as an argument. The +finalizer can be a Lua function or a cdata function or cdata function +pointer. An existing finalizer can be removed by setting a nil +finalizer, e.g. right before explicitly deleting a resource: +

+
+ffi.C.free(ffi.gc(p, nil)) -- Manually free the memory.
+
+ +

C Type Information

+

+The following API functions return information about C types. +They are most useful for inspecting cdata objects. +

+ +

size = ffi.sizeof(ct [,nelem])

+

+Returns the size of ct in bytes. Returns nil if +the size is not known (e.g. for "void" or function types). +Requires nelem for VLA/VLS types, except for cdata objects. +

+ +

align = ffi.alignof(ct)

+

+Returns the minimum required alignment for ct in bytes. +

+ +

ofs [,bpos,bsize] = ffi.offsetof(ct, field)

+

+Returns the offset (in bytes) of field relative to the start +of ct, which must be a struct. Additionally returns +the position and the field size (in bits) for bit fields. +

+ +

status = ffi.istype(ct, obj)

+

+Returns true if obj has the C type given by +ct. Returns false otherwise. +

+

+C type qualifiers (const etc.) are ignored. Pointers are +checked with the standard pointer compatibility rules, but without any +special treatment for void *. If ct specifies a +struct/union, then a pointer to this type is accepted, +too. Otherwise the types must match exactly. +

+

+Note: this function accepts all kinds of Lua objects for the +obj argument, but always returns false for non-cdata +objects. +

+ +

Utility Functions

+ +

err = ffi.errno([newerr])

+

+Returns the error number set by the last C function call which +indicated an error condition. If the optional newerr argument +is present, the error number is set to the new value and the previous +value is returned. +

+

+This function offers a portable and OS-independent way to get and set the +error number. Note that only some C functions set the error +number. And it's only significant if the function actually indicated an +error condition (e.g. with a return value of -1 or +NULL). Otherwise, it may or may not contain any previously set +value. +

+

+You're advised to call this function only when needed and as close as +possible after the return of the related C function. The +errno value is preserved across hooks, memory allocations, +invocations of the JIT compiler and other internal VM activity. The same +applies to the value returned by GetLastError() on Windows, but +you need to declare and call it yourself. +

+ +

str = ffi.string(ptr [,len])

+

+Creates an interned Lua string from the data pointed to by +ptr. +

+

+If the optional argument len is missing, ptr is +converted to a "char *" and the data is assumed to be +zero-terminated. The length of the string is computed with +strlen(). +

+

+Otherwise ptr is converted to a "void *" and +len gives the length of the data. The data may contain +embedded zeros and need not be byte-oriented (though this may cause +endianess issues). +

+

+This function is mainly useful to convert (temporary) +"const char *" pointers returned by +C functions to Lua strings and store them or pass them to other +functions expecting a Lua string. The Lua string is an (interned) copy +of the data and bears no relation to the original data area anymore. +Lua strings are 8 bit clean and may be used to hold arbitrary, +non-character data. +

+

+Performance notice: it's faster to pass the length of the string, if +it's known. E.g. when the length is returned by a C call like +sprintf(). +

+ +

ffi.copy(dst, src, len)
+ffi.copy(dst, str)

+

+Copies the data pointed to by src to dst. +dst is converted to a "void *" and src +is converted to a "const void *". +

+

+In the first syntax, len gives the number of bytes to copy. +Caveat: if src is a Lua string, then len must not +exceed #src+1. +

+

+In the second syntax, the source of the copy must be a Lua string. All +bytes of the string plus a zero-terminator are copied to +dst (i.e. #src+1 bytes). +

+

+Performance notice: ffi.copy() may be used as a faster +(inlinable) replacement for the C library functions +memcpy(), strcpy() and strncpy(). +

+ +

ffi.fill(dst, len [,c])

+

+Fills the data pointed to by dst with len constant +bytes, given by c. If c is omitted, the data is +zero-filled. +

+

+Performance notice: ffi.fill() may be used as a faster +(inlinable) replacement for the C library function +memset(dst, c, len). Please note the different +order of arguments! +

+ +

Target-specific Information

+ +

status = ffi.abi(param)

+

+Returns true if param (a Lua string) applies for the +target ABI (Application Binary Interface). Returns false +otherwise. The following parameters are currently defined: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterDescription
32bit32 bit architecture
64bit64 bit architecture
leLittle-endian architecture
beBig-endian architecture
fpuTarget has a hardware FPU
softfpsoftfp calling conventions
hardfphardfp calling conventions
eabiEABI variant of the standard ABI
winWindows variant of the standard ABI
uwpUniversal Windows Platform
gc6464 bit GC references
+ +

ffi.os

+

+Contains the target OS name. Same contents as +jit.os. +

+ +

ffi.arch

+

+Contains the target architecture name. Same contents as +jit.arch. +

+ +

Methods for Callbacks

+

+The C types for callbacks +have some extra methods: +

+ +

cb:free()

+

+Free the resources associated with a callback. The associated Lua +function is unanchored and may be garbage collected. The callback +function pointer is no longer valid and must not be called anymore +(it may be reused by a subsequently created callback). +

+ +

cb:set(func)

+

+Associate a new Lua function with a callback. The C type of the +callback and the callback function pointer are unchanged. +

+

+This method is useful to dynamically switch the receiver of callbacks +without creating a new callback each time and registering it again (e.g. +with a GUI library). +

+ +

Extended Standard Library Functions

+

+The following standard library functions have been extended to work +with cdata objects: +

+ +

n = tonumber(cdata)

+

+Converts a number cdata object to a double and returns it as +a Lua number. This is particularly useful for boxed 64 bit +integer values. Caveat: this conversion may incur a precision loss. +

+ +

s = tostring(cdata)

+

+Returns a string representation of the value of 64 bit integers +("nnnLL" or "nnnULL") or +complex numbers ("re±imi"). Otherwise +returns a string representation of the C type of a ctype object +("ctype<type>") or a cdata object +("cdata<type>: address"), unless you +override it with a __tostring metamethod (see +ffi.metatype()). +

+ +

iter, obj, start = pairs(cdata)
+iter, obj, start = ipairs(cdata)

+

+Calls the __pairs or __ipairs metamethod of the +corresponding ctype. +

+ +

Extensions to the Lua Parser

+

+The parser for Lua source code treats numeric literals with the +suffixes LL or ULL as signed or unsigned 64 bit +integers. Case doesn't matter, but uppercase is recommended for +readability. It handles decimal (42LL), hexadecimal +(0x2aLL) and binary (0b101010LL) literals. +

+

+The imaginary part of complex numbers can be specified by suffixing +number literals with i or I, e.g. 12.5i. +Caveat: you'll need to use 1i to get an imaginary part with +the value one, since i itself still refers to a variable +named i. +

+
+
+ + + diff --git a/lib/LuaJIT/doc/ext_ffi_semantics.html b/lib/LuaJIT/doc/ext_ffi_semantics.html new file mode 100644 index 0000000..4b03da9 --- /dev/null +++ b/lib/LuaJIT/doc/ext_ffi_semantics.html @@ -0,0 +1,1261 @@ + + + +FFI Semantics + + + + + + + + +
+Lua +
+ + +
+

+This page describes the detailed semantics underlying the FFI library +and its interaction with both Lua and C code. +

+

+Given that the FFI library is designed to interface with C code +and that declarations can be written in plain C syntax, it +closely follows the C language semantics, wherever possible. +Some minor concessions are needed for smoother interoperation with Lua +language semantics. +

+

+Please don't be overwhelmed by the contents of this page — this +is a reference and you may need to consult it, if in doubt. It doesn't +hurt to skim this page, but most of the semantics "just work" as you'd +expect them to work. It should be straightforward to write +applications using the LuaJIT FFI for developers with a C or C++ +background. +

+ +

C Language Support

+

+The FFI library has a built-in C parser with a minimal memory +footprint. It's used by the ffi.* library +functions to declare C types or external symbols. +

+

+It's only purpose is to parse C declarations, as found e.g. in +C header files. Although it does evaluate constant expressions, +it's not a C compiler. The body of inline +C function definitions is simply ignored. +

+

+Also, this is not a validating C parser. It expects and +accepts correctly formed C declarations, but it may choose to +ignore bad declarations or show rather generic error messages. If in +doubt, please check the input against your favorite C compiler. +

+

+The C parser complies to the C99 language standard plus +the following extensions: +

+ +

+The following C types are pre-defined by the C parser (like +a typedef, except re-declarations will be ignored): +

+ +

+You're encouraged to use these types in preference to +compiler-specific extensions or target-dependent standard types. +E.g. char differs in signedness and long differs in +size, depending on the target architecture and platform ABI. +

+

+The following C features are not supported: +

+ + +

C Type Conversion Rules

+ +

Conversions from C types to Lua objects

+

+These conversion rules apply for read accesses to +C types: indexing pointers, arrays or +struct/union types; reading external variables or +constant values; retrieving return values from C calls: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputConversionOutput
int8_t, int16_tsign-ext int32_tdoublenumber
uint8_t, uint16_tzero-ext int32_tdoublenumber
int32_t, uint32_tdoublenumber
int64_t, uint64_tboxed value64 bit int cdata
double, floatdoublenumber
bool0 → false, otherwise trueboolean
enumboxed valueenum cdata
Complex numberboxed valuecomplex cdata
Vectorboxed valuevector cdata
Pointerboxed valuepointer cdata
Arrayboxed referencereference cdata
struct/unionboxed referencereference cdata
+

+Bitfields are treated like their underlying type. +

+

+Reference types are dereferenced before a conversion can take +place — the conversion is applied to the C type pointed to +by the reference. +

+ +

Conversions from Lua objects to C types

+

+These conversion rules apply for write accesses to +C types: indexing pointers, arrays or +struct/union types; initializing cdata objects; +casts to C types; writing to external variables; passing +arguments to C calls: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputConversionOutput
numberdouble
booleanfalse → 0, true → 1bool
nilNULL(void *)
lightuserdatalightuserdata address →(void *)
userdatauserdata payload →(void *)
io.* fileget FILE * handle →(void *)
stringmatch against enum constantenum
stringcopy string data + zero-byteint8_t[], uint8_t[]
stringstring data →const char[]
functioncreate callbackC function type
tabletable initializerArray
tabletable initializerstruct/union
cdatacdata payload →C type
+

+If the result type of this conversion doesn't match the +C type of the destination, the +conversion rules between C types +are applied. +

+

+Reference types are immutable after initialization ("no re-seating of +references"). For initialization purposes or when passing values to +reference parameters, they are treated like pointers. Note that unlike +in C++, there's no way to implement automatic reference generation of +variables under the Lua language semantics. If you want to call a +function with a reference parameter, you need to explicitly pass a +one-element array. +

+ +

Conversions between C types

+

+These conversion rules are more or less the same as the standard +C conversion rules. Some rules only apply to casts, or require +pointer or type compatibility: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputConversionOutput
Signed integernarrow or sign-extendInteger
Unsigned integernarrow or zero-extendInteger
Integerrounddouble, float
double, floattrunc int32_tnarrow(u)int8_t, (u)int16_t
double, floattrunc(u)int32_t, (u)int64_t
double, floatroundfloat, double
Numbern == 0 → 0, otherwise 1bool
boolfalse → 0, true → 1Number
Complex numberconvert real partNumber
Numberconvert real part, imag = 0Complex number
Complex numberconvert real and imag partComplex number
Numberconvert scalar and replicateVector
Vectorcopy (same size)Vector
struct/uniontake base address (compat)Pointer
Arraytake base address (compat)Pointer
Functiontake function addressFunction pointer
Numberconvert via uintptr_t (cast)Pointer
Pointerconvert address (compat/cast)Pointer
Pointerconvert address (cast)Integer
Arrayconvert base address (cast)Integer
Arraycopy (compat)Array
struct/unioncopy (identical type)struct/union
+

+Bitfields or enum types are treated like their underlying +type. +

+

+Conversions not listed above will raise an error. E.g. it's not +possible to convert a pointer to a complex number or vice versa. +

+ +

Conversions for vararg C function arguments

+

+The following default conversion rules apply when passing Lua objects +to the variable argument part of vararg C functions: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InputConversionOutput
numberdouble
booleanfalse → 0, true → 1bool
nilNULL(void *)
userdatauserdata payload →(void *)
lightuserdatalightuserdata address →(void *)
stringstring data →const char *
float cdatadouble
Array cdatatake base addressElement pointer
struct/union cdatatake base addressstruct/union pointer
Function cdatatake function addressFunction pointer
Any other cdatano conversionC type
+

+To pass a Lua object, other than a cdata object, as a specific type, +you need to override the conversion rules: create a temporary cdata +object with a constructor or a cast and initialize it with the value +to pass: +

+

+Assuming x is a Lua number, here's how to pass it as an +integer to a vararg function: +

+
+ffi.cdef[[
+int printf(const char *fmt, ...);
+]]
+ffi.C.printf("integer value: %d\n", ffi.new("int", x))
+
+

+If you don't do this, the default Lua number → double +conversion rule applies. A vararg C function expecting an integer +will see a garbled or uninitialized value. +

+ +

Initializers

+

+Creating a cdata object with +ffi.new() or the +equivalent constructor syntax always initializes its contents, too. +Different rules apply, depending on the number of optional +initializers and the C types involved: +

+ + +

Table Initializers

+

+The following rules apply if a Lua table is used to initialize an +Array or a struct/union: +

+ +

+Example: +

+
+local ffi = require("ffi")
+
+ffi.cdef[[
+struct foo { int a, b; };
+union bar { int i; double d; };
+struct nested { int x; struct foo y; };
+]]
+
+ffi.new("int[3]", {})            --> 0, 0, 0
+ffi.new("int[3]", {1})           --> 1, 1, 1
+ffi.new("int[3]", {1,2})         --> 1, 2, 0
+ffi.new("int[3]", {1,2,3})       --> 1, 2, 3
+ffi.new("int[3]", {[0]=1})       --> 1, 1, 1
+ffi.new("int[3]", {[0]=1,2})     --> 1, 2, 0
+ffi.new("int[3]", {[0]=1,2,3})   --> 1, 2, 3
+ffi.new("int[3]", {[0]=1,2,3,4}) --> error: too many initializers
+
+ffi.new("struct foo", {})            --> a = 0, b = 0
+ffi.new("struct foo", {1})           --> a = 1, b = 0
+ffi.new("struct foo", {1,2})         --> a = 1, b = 2
+ffi.new("struct foo", {[0]=1,2})     --> a = 1, b = 2
+ffi.new("struct foo", {b=2})         --> a = 0, b = 2
+ffi.new("struct foo", {a=1,b=2,c=3}) --> a = 1, b = 2  'c' is ignored
+
+ffi.new("union bar", {})        --> i = 0, d = 0.0
+ffi.new("union bar", {1})       --> i = 1, d = ?
+ffi.new("union bar", {[0]=1,2}) --> i = 1, d = ?    '2' is ignored
+ffi.new("union bar", {d=2})     --> i = ?, d = 2.0
+
+ffi.new("struct nested", {1,{2,3}})     --> x = 1, y.a = 2, y.b = 3
+ffi.new("struct nested", {x=1,y={2,3}}) --> x = 1, y.a = 2, y.b = 3
+
+ +

Operations on cdata Objects

+

+All of the standard Lua operators can be applied to cdata objects or a +mix of a cdata object and another Lua object. The following list shows +the pre-defined operations. +

+

+Reference types are dereferenced before performing each of +the operations below — the operation is applied to the +C type pointed to by the reference. +

+

+The pre-defined operations are always tried first before deferring to a +metamethod or index table (if any) for the corresponding ctype (except +for __new). An error is raised if the metamethod lookup or +index table lookup fails. +

+ +

Indexing a cdata object

+ +

+A ctype object can be indexed with a string key, too. The only +pre-defined operation is reading scoped constants of +struct/union types. All other accesses defer +to the corresponding metamethods or index tables (if any). +

+

+Note: since there's (deliberately) no address-of operator, a cdata +object holding a value type is effectively immutable after +initialization. The JIT compiler benefits from this fact when applying +certain optimizations. +

+

+As a consequence, the elements of complex numbers and +vectors are immutable. But the elements of an aggregate holding these +types may be modified of course. I.e. you cannot assign to +foo.c.im, but you can assign a (newly created) complex number +to foo.c. +

+

+The JIT compiler implements strict aliasing rules: accesses to different +types do not alias, except for differences in signedness (this +applies even to char pointers, unlike C99). Type punning +through unions is explicitly detected and allowed. +

+ +

Calling a cdata object

+ + +

Arithmetic on cdata objects

+ + +

Comparisons of cdata objects

+ + +

cdata objects as table keys

+

+Lua tables may be indexed by cdata objects, but this doesn't provide +any useful semantics — cdata objects are unsuitable as table +keys! +

+

+A cdata object is treated like any other garbage-collected object and +is hashed and compared by its address for table indexing. Since +there's no interning for cdata value types, the same value may be +boxed in different cdata objects with different addresses. Thus +t[1LL+1LL] and t[2LL] usually do not point to +the same hash slot and they certainly do not point to the same +hash slot as t[2]. +

+

+It would seriously drive up implementation complexity and slow down +the common case, if one were to add extra handling for by-value +hashing and comparisons to Lua tables. Given the ubiquity of their use +inside the VM, this is not acceptable. +

+

+There are three viable alternatives, if you really need to use cdata +objects as keys: +

+ + +

Parameterized Types

+

+To facilitate some abstractions, the two functions +ffi.typeof and +ffi.cdef support +parameterized types in C declarations. Note: none of the other API +functions taking a cdecl allow this. +

+

+Any place you can write a typedef name, an +identifier or a number in a declaration, you can write +$ (the dollar sign) instead. These placeholders are replaced in +order of appearance with the arguments following the cdecl string: +

+
+-- Declare a struct with a parameterized field type and name:
+ffi.cdef([[
+typedef struct { $ $; } foo_t;
+]], type1, name1)
+
+-- Anonymous struct with dynamic names:
+local bar_t = ffi.typeof("struct { int $, $; }", name1, name2)
+-- Derived pointer type:
+local bar_ptr_t = ffi.typeof("$ *", bar_t)
+
+-- Parameterized dimensions work even where a VLA won't work:
+local matrix_t = ffi.typeof("uint8_t[$][$]", width, height)
+
+

+Caveat: this is not simple text substitution! A passed ctype or +cdata object is treated like the underlying type, a passed string is +considered an identifier and a number is considered a number. You must +not mix this up: e.g. passing "int" as a string doesn't work in +place of a type, you'd need to use ffi.typeof("int") instead. +

+

+The main use for parameterized types are libraries implementing abstract +data types +(example), +similar to what can be achieved with C++ template metaprogramming. +Another use case are derived types of anonymous structs, which avoids +pollution of the global struct namespace. +

+

+Please note that parameterized types are a nice tool and indispensable +for certain use cases. But you'll want to use them sparingly in regular +code, e.g. when all types are actually fixed. +

+ +

Garbage Collection of cdata Objects

+

+All explicitly (ffi.new(), ffi.cast() etc.) or +implicitly (accessors) created cdata objects are garbage collected. +You need to ensure to retain valid references to cdata objects +somewhere on a Lua stack, an upvalue or in a Lua table while they are +still in use. Once the last reference to a cdata object is gone, the +garbage collector will automatically free the memory used by it (at +the end of the next GC cycle). +

+

+Please note that pointers themselves are cdata objects, however they +are not followed by the garbage collector. So e.g. if you +assign a cdata array to a pointer, you must keep the cdata object +holding the array alive as long as the pointer is still in use: +

+
+ffi.cdef[[
+typedef struct { int *a; } foo_t;
+]]
+
+local s = ffi.new("foo_t", ffi.new("int[10]")) -- WRONG!
+
+local a = ffi.new("int[10]") -- OK
+local s = ffi.new("foo_t", a)
+-- Now do something with 's', but keep 'a' alive until you're done.
+
+

+Similar rules apply for Lua strings which are implicitly converted to +"const char *": the string object itself must be +referenced somewhere or it'll be garbage collected eventually. The +pointer will then point to stale data, which may have already been +overwritten. Note that string literals are automatically kept +alive as long as the function containing it (actually its prototype) +is not garbage collected. +

+

+Objects which are passed as an argument to an external C function +are kept alive until the call returns. So it's generally safe to +create temporary cdata objects in argument lists. This is a common +idiom for passing specific C types to +vararg functions. +

+

+Memory areas returned by C functions (e.g. from malloc()) +must be manually managed, of course (or use +ffi.gc()). Pointers to +cdata objects are indistinguishable from pointers returned by C +functions (which is one of the reasons why the GC cannot follow them). +

+ +

Callbacks

+

+The LuaJIT FFI automatically generates special callback functions +whenever a Lua function is converted to a C function pointer. This +associates the generated callback function pointer with the C type +of the function pointer and the Lua function object (closure). +

+

+This can happen implicitly due to the usual conversions, e.g. when +passing a Lua function to a function pointer argument. Or you can use +ffi.cast() to explicitly cast a Lua function to a +C function pointer. +

+

+Currently only certain C function types can be used as callback +functions. Neither C vararg functions nor functions with +pass-by-value aggregate argument or result types are supported. There +are no restrictions for the kind of Lua functions that can be called +from the callback — no checks for the proper number of arguments +are made. The return value of the Lua function will be converted to the +result type and an error will be thrown for invalid conversions. +

+

+It's allowed to throw errors across a callback invocation, but it's not +advisable in general. Do this only if you know the C function, that +called the callback, copes with the forced stack unwinding and doesn't +leak resources. +

+

+One thing that's not allowed, is to let an FFI call into a C function +get JIT-compiled, which in turn calls a callback, calling into Lua again. +Usually this attempt is caught by the interpreter first and the +C function is blacklisted for compilation. +

+

+However, this heuristic may fail under specific circumstances: e.g. a +message polling function might not run Lua callbacks right away and the call +gets JIT-compiled. If it later happens to call back into Lua (e.g. a rarely +invoked error callback), you'll get a VM PANIC with the message +"bad callback". Then you'll need to manually turn off +JIT-compilation with +jit.off() for the +surrounding Lua function that invokes such a message polling function (or +similar). +

+ +

Callback resource handling

+

+Callbacks take up resources — you can only have a limited number +of them at the same time (500 - 1000, depending on the +architecture). The associated Lua functions are anchored to prevent +garbage collection, too. +

+

+Callbacks due to implicit conversions are permanent! There is no +way to guess their lifetime, since the C side might store the +function pointer for later use (typical for GUI toolkits). The associated +resources cannot be reclaimed until termination: +

+
+ffi.cdef[[
+typedef int (__stdcall *WNDENUMPROC)(void *hwnd, intptr_t l);
+int EnumWindows(WNDENUMPROC func, intptr_t l);
+]]
+
+-- Implicit conversion to a callback via function pointer argument.
+local count = 0
+ffi.C.EnumWindows(function(hwnd, l)
+  count = count + 1
+  return true
+end, 0)
+-- The callback is permanent and its resources cannot be reclaimed!
+-- Ok, so this may not be a problem, if you do this only once.
+
+

+Note: this example shows that you must properly declare +__stdcall callbacks on Windows/x86 systems. The calling +convention cannot be automatically detected, unlike for +__stdcall calls to Windows functions. +

+

+For some use cases it's necessary to free up the resources or to +dynamically redirect callbacks. Use an explicit cast to a +C function pointer and keep the resulting cdata object. Then use +the cb:free() +or cb:set() methods +on the cdata object: +

+
+-- Explicitly convert to a callback via cast.
+local count = 0
+local cb = ffi.cast("WNDENUMPROC", function(hwnd, l)
+  count = count + 1
+  return true
+end)
+
+-- Pass it to a C function.
+ffi.C.EnumWindows(cb, 0)
+-- EnumWindows doesn't need the callback after it returns, so free it.
+
+cb:free()
+-- The callback function pointer is no longer valid and its resources
+-- will be reclaimed. The created Lua closure will be garbage collected.
+
+ +

Callback performance

+

+Callbacks are slow! First, the C to Lua transition itself +has an unavoidable cost, similar to a lua_call() or +lua_pcall(). Argument and result marshalling add to that cost. +And finally, neither the C compiler nor LuaJIT can inline or +optimize across the language barrier and hoist repeated computations out +of a callback function. +

+

+Do not use callbacks for performance-sensitive work: e.g. consider a +numerical integration routine which takes a user-defined function to +integrate over. It's a bad idea to call a user-defined Lua function from +C code millions of times. The callback overhead will be absolutely +detrimental for performance. +

+

+It's considerably faster to write the numerical integration routine +itself in Lua — the JIT compiler will be able to inline the +user-defined function and optimize it together with its calling context, +with very competitive performance. +

+

+As a general guideline: use callbacks only when you must, because +of existing C APIs. E.g. callback performance is irrelevant for a +GUI application, which waits for user input most of the time, anyway. +

+

+For new designs avoid push-style APIs: a C function repeatedly +calling a callback for each result. Instead use pull-style APIs: +call a C function repeatedly to get a new result. Calls from Lua +to C via the FFI are much faster than the other way round. Most well-designed +libraries already use pull-style APIs (read/write, get/put). +

+ +

C Library Namespaces

+

+A C library namespace is a special kind of object which allows +access to the symbols contained in shared libraries or the default +symbol namespace. The default +ffi.C namespace is +automatically created when the FFI library is loaded. C library +namespaces for specific shared libraries may be created with the +ffi.load() API +function. +

+

+Indexing a C library namespace object with a symbol name (a Lua +string) automatically binds it to the library. First the symbol type +is resolved — it must have been declared with +ffi.cdef. Then the +symbol address is resolved by searching for the symbol name in the +associated shared libraries or the default symbol namespace. Finally, +the resulting binding between the symbol name, the symbol type and its +address is cached. Missing symbol declarations or nonexistent symbol +names cause an error. +

+

+This is what happens on a read access for the different kinds of +symbols: +

+ +

+This is what happens on a write access: +

+ +

+C library namespaces themselves are garbage collected objects. If +the last reference to the namespace object is gone, the garbage +collector will eventually release the shared library reference and +remove all memory associated with the namespace. Since this may +trigger the removal of the shared library from the memory of the +running process, it's generally not safe to use function +cdata objects obtained from a library if the namespace object may be +unreferenced. +

+

+Performance notice: the JIT compiler specializes to the identity of +namespace objects and to the strings used to index it. This +effectively turns function cdata objects into constants. It's not +useful and actually counter-productive to explicitly cache these +function objects, e.g. local strlen = ffi.C.strlen. OTOH it +is useful to cache the namespace itself, e.g. local C = +ffi.C. +

+ +

No Hand-holding!

+

+The FFI library has been designed as a low-level library. The +goal is to interface with C code and C data types with a +minimum of overhead. This means you can do anything you can do +from C: access all memory, overwrite anything in memory, call +machine code at any memory address and so on. +

+

+The FFI library provides no memory safety, unlike regular Lua +code. It will happily allow you to dereference a NULL +pointer, to access arrays out of bounds or to misdeclare +C functions. If you make a mistake, your application might crash, +just like equivalent C code would. +

+

+This behavior is inevitable, since the goal is to provide full +interoperability with C code. Adding extra safety measures, like +bounds checks, would be futile. There's no way to detect +misdeclarations of C functions, since shared libraries only +provide symbol names, but no type information. Likewise there's no way +to infer the valid range of indexes for a returned pointer. +

+

+Again: the FFI library is a low-level library. This implies it needs +to be used with care, but it's flexibility and performance often +outweigh this concern. If you're a C or C++ developer, it'll be easy +to apply your existing knowledge. OTOH writing code for the FFI +library is not for the faint of heart and probably shouldn't be the +first exercise for someone with little experience in Lua, C or C++. +

+

+As a corollary of the above, the FFI library is not safe for use by +untrusted Lua code. If you're sandboxing untrusted Lua code, you +definitely don't want to give this code access to the FFI library or +to any cdata object (except 64 bit integers or complex +numbers). Any properly engineered Lua sandbox needs to provide safety +wrappers for many of the standard Lua library functions — +similar wrappers need to be written for high-level operations on FFI +data types, too. +

+ +

Current Status

+

+The initial release of the FFI library has some limitations and is +missing some features. Most of these will be fixed in future releases. +

+

+C language support is +currently incomplete: +

+ +

+The JIT compiler already handles a large subset of all FFI operations. +It automatically falls back to the interpreter for unimplemented +operations (you can check for this with the +-jv command line option). +The following operations are currently not compiled and may exhibit +suboptimal performance, especially when used in inner loops: +

+ +

+Other missing features: +

+ +
+
+ + + diff --git a/lib/LuaJIT/doc/ext_ffi_tutorial.html b/lib/LuaJIT/doc/ext_ffi_tutorial.html new file mode 100644 index 0000000..e0b0821 --- /dev/null +++ b/lib/LuaJIT/doc/ext_ffi_tutorial.html @@ -0,0 +1,602 @@ + + + +FFI Tutorial + + + + + + + + +
+Lua +
+ + +
+

+This page is intended to give you an overview of the features of the FFI +library by presenting a few use cases and guidelines. +

+

+This page makes no attempt to explain all of the FFI library, though. +You'll want to have a look at the ffi.* API +function reference and the FFI +semantics to learn more. +

+ +

Loading the FFI Library

+

+The FFI library is built into LuaJIT by default, but it's not loaded +and initialized by default. The suggested way to use the FFI library +is to add the following to the start of every Lua file that needs one +of its functions: +

+
+local ffi = require("ffi")
+
+

+Please note this doesn't define an ffi variable in the table +of globals — you really need to use the local variable. The +require function ensures the library is only loaded once. +

+

+Note: If you want to experiment with the FFI from the interactive prompt +of the command line executable, omit the local, as it doesn't +preserve local variables across lines. +

+ +

Accessing Standard System Functions

+

+The following code explains how to access standard system functions. +We slowly print two lines of dots by sleeping for 10 milliseconds +after each dot: +

+
+ 
+①
+
+
+
+
+
+②
+③
+④
+
+
+
+⑤
+
+
+
+
+
+⑥local ffi = require("ffi")
+ffi.cdef[[
+void Sleep(int ms);
+int poll(struct pollfd *fds, unsigned long nfds, int timeout);
+]]
+
+local sleep
+if ffi.os == "Windows" then
+  function sleep(s)
+    ffi.C.Sleep(s*1000)
+  end
+else
+  function sleep(s)
+    ffi.C.poll(nil, 0, s*1000)
+  end
+end
+
+for i=1,160 do
+  io.write("."); io.flush()
+  sleep(0.01)
+end
+io.write("\n")
+
+

+Here's the step-by-step explanation: +

+

+ This defines the +C library functions we're going to use. The part inside the +double-brackets (in green) is just standard C syntax. You can +usually get this info from the C header files or the +documentation provided by each C library or C compiler. +

+

+ The difficulty we're +facing here, is that there are different standards to choose from. +Windows has a simple Sleep() function. On other systems there +are a variety of functions available to achieve sub-second sleeps, but +with no clear consensus. Thankfully poll() can be used for +this task, too, and it's present on most non-Windows systems. The +check for ffi.os makes sure we use the Windows-specific +function only on Windows systems. +

+

+ Here we're wrapping the +call to the C function in a Lua function. This isn't strictly +necessary, but it's helpful to deal with system-specific issues only +in one part of the code. The way we're wrapping it ensures the check +for the OS is only done during initialization and not for every call. +

+

+ A more subtle point is +that we defined our sleep() function (for the sake of this +example) as taking the number of seconds, but accepting fractional +seconds. Multiplying this by 1000 gets us milliseconds, but that still +leaves it a Lua number, which is a floating-point value. Alas, the +Sleep() function only accepts an integer value. Luckily for +us, the FFI library automatically performs the conversion when calling +the function (truncating the FP value towards zero, like in C). +

+

+Some readers will notice that Sleep() is part of +KERNEL32.DLL and is also a stdcall function. So how +can this possibly work? The FFI library provides the ffi.C +default C library namespace, which allows calling functions from +the default set of libraries, like a C compiler would. Also, the +FFI library automatically detects stdcall functions, so you +don't need to declare them as such. +

+

+ The poll() +function takes a couple more arguments we're not going to use. You can +simply use nil to pass a NULL pointer and 0 +for the nfds parameter. Please note that the +number 0 does not convert to a pointer value, +unlike in C++. You really have to pass pointers to pointer arguments +and numbers to number arguments. +

+

+The page on FFI semantics has all +of the gory details about +conversions between Lua +objects and C types. For the most part you don't have to deal +with this, as it's performed automatically and it's carefully designed +to bridge the semantic differences between Lua and C. +

+

+ Now that we have defined +our own sleep() function, we can just call it from plain Lua +code. That wasn't so bad, huh? Turning these boring animated dots into +a fascinating best-selling game is left as an exercise for the reader. +:-) +

+ +

Accessing the zlib Compression Library

+

+The following code shows how to access the zlib compression library from Lua code. +We'll define two convenience wrapper functions that take a string and +compress or uncompress it to another string: +

+
+ 
+①
+
+
+
+
+
+
+②
+
+
+③
+
+④
+
+
+⑤
+
+
+⑥
+
+
+
+
+
+
+
+⑦local ffi = require("ffi")
+ffi.cdef[[
+unsigned long compressBound(unsigned long sourceLen);
+int compress2(uint8_t *dest, unsigned long *destLen,
+	      const uint8_t *source, unsigned long sourceLen, int level);
+int uncompress(uint8_t *dest, unsigned long *destLen,
+	       const uint8_t *source, unsigned long sourceLen);
+]]
+local zlib = ffi.load(ffi.os == "Windows" and "zlib1" or "z")
+
+local function compress(txt)
+  local n = zlib.compressBound(#txt)
+  local buf = ffi.new("uint8_t[?]", n)
+  local buflen = ffi.new("unsigned long[1]", n)
+  local res = zlib.compress2(buf, buflen, txt, #txt, 9)
+  assert(res == 0)
+  return ffi.string(buf, buflen[0])
+end
+
+local function uncompress(comp, n)
+  local buf = ffi.new("uint8_t[?]", n)
+  local buflen = ffi.new("unsigned long[1]", n)
+  local res = zlib.uncompress(buf, buflen, comp, #comp)
+  assert(res == 0)
+  return ffi.string(buf, buflen[0])
+end
+
+-- Simple test code.
+local txt = string.rep("abcd", 1000)
+print("Uncompressed size: ", #txt)
+local c = compress(txt)
+print("Compressed size: ", #c)
+local txt2 = uncompress(c, #txt)
+assert(txt2 == txt)
+
+

+Here's the step-by-step explanation: +

+

+ This defines some of the +C functions provided by zlib. For the sake of this example, some +type indirections have been reduced and it uses the pre-defined +fixed-size integer types, while still adhering to the zlib API/ABI. +

+

+ This loads the zlib shared +library. On POSIX systems it's named libz.so and usually +comes pre-installed. Since ffi.load() automatically adds any +missing standard prefixes/suffixes, we can simply load the +"z" library. On Windows it's named zlib1.dll and +you'll have to download it first from the +» zlib site. The check for +ffi.os makes sure we pass the right name to +ffi.load(). +

+

+ First, the maximum size of +the compression buffer is obtained by calling the +zlib.compressBound function with the length of the +uncompressed string. The next line allocates a byte buffer of this +size. The [?] in the type specification indicates a +variable-length array (VLA). The actual number of elements of this +array is given as the 2nd argument to ffi.new(). +

+

+ This may look strange at +first, but have a look at the declaration of the compress2 +function from zlib: the destination length is defined as a pointer! +This is because you pass in the maximum buffer size and get back the +actual length that was used. +

+

+In C you'd pass in the address of a local variable +(&buflen). But since there's no address-of operator in +Lua, we'll just pass in a one-element array. Conveniently it can be +initialized with the maximum buffer size in one step. Calling the +actual zlib.compress2 function is then straightforward. +

+

+ We want to return the +compressed data as a Lua string, so we'll use ffi.string(). +It needs a pointer to the start of the data and the actual length. The +length has been returned in the buflen array, so we'll just +get it from there. +

+

+Note that since the function returns now, the buf and +buflen variables will eventually be garbage collected. This +is fine, because ffi.string() has copied the contents to a +newly created (interned) Lua string. If you plan to call this function +lots of times, consider reusing the buffers and/or handing back the +results in buffers instead of strings. This will reduce the overhead +for garbage collection and string interning. +

+

+ The uncompress +functions does the exact opposite of the compress function. +The compressed data doesn't include the size of the original string, +so this needs to be passed in. Otherwise no surprises here. +

+

+ The code, that makes use +of the functions we just defined, is just plain Lua code. It doesn't +need to know anything about the LuaJIT FFI — the convenience +wrapper functions completely hide it. +

+

+One major advantage of the LuaJIT FFI is that you are now able to +write those wrappers in Lua. And at a fraction of the time it +would cost you to create an extra C module using the Lua/C API. +Many of the simpler C functions can probably be used directly +from your Lua code, without any wrappers. +

+

+Side note: the zlib API uses the long type for passing +lengths and sizes around. But all those zlib functions actually only +deal with 32 bit values. This is an unfortunate choice for a +public API, but may be explained by zlib's history — we'll just +have to deal with it. +

+

+First, you should know that a long is a 64 bit type e.g. +on POSIX/x64 systems, but a 32 bit type on Windows/x64 and on +32 bit systems. Thus a long result can be either a plain +Lua number or a boxed 64 bit integer cdata object, depending on +the target system. +

+

+Ok, so the ffi.* functions generally accept cdata objects +wherever you'd want to use a number. That's why we get a away with +passing n to ffi.string() above. But other Lua +library functions or modules don't know how to deal with this. So for +maximum portability one needs to use tonumber() on returned +long results before passing them on. Otherwise the +application might work on some systems, but would fail in a POSIX/x64 +environment. +

+ +

Defining Metamethods for a C Type

+

+The following code explains how to define metamethods for a C type. +We define a simple point type and add some operations to it: +

+
+ 
+①
+
+
+
+②
+
+③
+
+④
+
+
+
+⑤
+
+⑥local ffi = require("ffi")
+ffi.cdef[[
+typedef struct { double x, y; } point_t;
+]]
+
+local point
+local mt = {
+  __add = function(a, b) return point(a.x+b.x, a.y+b.y) end,
+  __len = function(a) return math.sqrt(a.x*a.x + a.y*a.y) end,
+  __index = {
+    area = function(a) return a.x*a.x + a.y*a.y end,
+  },
+}
+point = ffi.metatype("point_t", mt)
+
+local a = point(3, 4)
+print(a.x, a.y)  --> 3  4
+print(#a)        --> 5
+print(a:area())  --> 25
+local b = a + point(0.5, 8)
+print(#b)        --> 12.5
+
+

+Here's the step-by-step explanation: +

+

+ This defines the C type for a +two-dimensional point object. +

+

+ We have to declare the variable +holding the point constructor first, because it's used inside of a +metamethod. +

+

+ Let's define an __add +metamethod which adds the coordinates of two points and creates a new +point object. For simplicity, this function assumes that both arguments +are points. But it could be any mix of objects, if at least one operand +is of the required type (e.g. adding a point plus a number or vice +versa). Our __len metamethod returns the distance of a point to +the origin. +

+

+ If we run out of operators, we can +define named methods, too. Here the __index table defines an +area function. For custom indexing needs, one might want to +define __index and __newindex functions instead. +

+

+ This associates the metamethods with +our C type. This only needs to be done once. For convenience, a +constructor is returned by +ffi.metatype(). +We're not required to use it, though. The original C type can still +be used e.g. to create an array of points. The metamethods automatically +apply to any and all uses of this type. +

+

+Please note that the association with a metatable is permanent and +the metatable must not be modified afterwards! Ditto for the +__index table. +

+

+ Here are some simple usage examples +for the point type and their expected results. The pre-defined +operations (such as a.x) can be freely mixed with the newly +defined metamethods. Note that area is a method and must be +called with the Lua syntax for methods: a:area(), not +a.area(). +

+

+The C type metamethod mechanism is most useful when used in +conjunction with C libraries that are written in an object-oriented +style. Creators return a pointer to a new instance and methods take an +instance pointer as the first argument. Sometimes you can just point +__index to the library namespace and __gc to the +destructor and you're done. But often enough you'll want to add +convenience wrappers, e.g. to return actual Lua strings or when +returning multiple values. +

+

+Some C libraries only declare instance pointers as an opaque +void * type. In this case you can use a fake type for all +declarations, e.g. a pointer to a named (incomplete) struct will do: +typedef struct foo_type *foo_handle. The C side doesn't +know what you declare with the LuaJIT FFI, but as long as the underlying +types are compatible, everything still works. +

+ +

Translating C Idioms

+

+Here's a list of common C idioms and their translation to the +LuaJIT FFI: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IdiomC codeLua code
Pointer dereference
int *p;
x = *p;
*p = y;
x = p[0]
p[0] = y
Pointer indexing
int i, *p;
x = p[i];
p[i+1] = y;
x = p[i]
p[i+1] = y
Array indexing
int i, a[];
x = a[i];
a[i+1] = y;
x = a[i]
a[i+1] = y
struct/union dereference
struct foo s;
x = s.field;
s.field = y;
x = s.field
s.field = y
struct/union pointer deref.
struct foo *sp;
x = sp->field;
sp->field = y;
x = s.field
s.field = y
Pointer arithmetic
int i, *p;
x = p + i;
y = p - i;
x = p + i
y = p - i
Pointer difference
int *p1, *p2;
x = p1 - p2;x = p1 - p2
Array element pointer
int i, a[];
x = &a[i];x = a+i
Cast pointer to address
int *p;
x = (intptr_t)p;x = tonumber(
 ffi.cast("intptr_t",
          p))
Functions with outargs
void foo(int *inoutlen);
int len = x;
foo(&len);
y = len;
local len =
  ffi.new("int[1]", x)
foo(len)
y = len[0]
Vararg conversions
int printf(char *fmt, ...);
printf("%g", 1.0);
printf("%d", 1);
 
printf("%g", 1);
printf("%d",
  ffi.new("int", 1))
+ +

To Cache or Not to Cache

+

+It's a common Lua idiom to cache library functions in local variables +or upvalues, e.g.: +

+
+local byte, char = string.byte, string.char
+local function foo(x)
+  return char(byte(x)+1)
+end
+
+

+This replaces several hash-table lookups with a (faster) direct use of +a local or an upvalue. This is less important with LuaJIT, since the +JIT compiler optimizes hash-table lookups a lot and is even able to +hoist most of them out of the inner loops. It can't eliminate +all of them, though, and it saves some typing for often-used +functions. So there's still a place for this, even with LuaJIT. +

+

+The situation is a bit different with C function calls via the +FFI library. The JIT compiler has special logic to eliminate all +of the lookup overhead for functions resolved from a +C library namespace! +Thus it's not helpful and actually counter-productive to cache +individual C functions like this: +

+
+local funca, funcb = ffi.C.funca, ffi.C.funcb -- Not helpful!
+local function foo(x, n)
+  for i=1,n do funcb(funca(x, i), 1) end
+end
+
+

+This turns them into indirect calls and generates bigger and slower +machine code. Instead you'll want to cache the namespace itself and +rely on the JIT compiler to eliminate the lookups: +

+
+local C = ffi.C          -- Instead use this!
+local function foo(x, n)
+  for i=1,n do C.funcb(C.funca(x, i), 1) end
+end
+
+

+This generates both shorter and faster code. So don't cache +C functions, but do cache namespaces! Most often the +namespace is already in a local variable at an outer scope, e.g. from +local lib = ffi.load(...). Note that copying +it to a local variable in the function scope is unnecessary. +

+
+
+ + + diff --git a/lib/LuaJIT/doc/ext_jit.html b/lib/LuaJIT/doc/ext_jit.html new file mode 100644 index 0000000..73cd3c2 --- /dev/null +++ b/lib/LuaJIT/doc/ext_jit.html @@ -0,0 +1,200 @@ + + + +jit.* Library + + + + + + + +
+Lua +
+ + +
+

+The functions in this built-in module control the behavior of the JIT +compiler engine. Note that JIT-compilation is fully automatic — +you probably won't need to use any of the following functions unless +you have special needs. +

+ +

jit.on()
+jit.off()

+

+Turns the whole JIT compiler on (default) or off. +

+

+These functions are typically used with the command line options +-j on or -j off. +

+ +

jit.flush()

+

+Flushes the whole cache of compiled code. +

+ +

jit.on(func|true [,true|false])
+jit.off(func|true [,true|false])
+jit.flush(func|true [,true|false])

+

+jit.on enables JIT compilation for a Lua function (this is +the default). +

+

+jit.off disables JIT compilation for a Lua function and +flushes any already compiled code from the code cache. +

+

+jit.flush flushes the code, but doesn't affect the +enable/disable status. +

+

+The current function, i.e. the Lua function calling this library +function, can also be specified by passing true as the first +argument. +

+

+If the second argument is true, JIT compilation is also +enabled, disabled or flushed recursively for all sub-functions of a +function. With false only the sub-functions are affected. +

+

+The jit.on and jit.off functions only set a flag +which is checked when the function is about to be compiled. They do +not trigger immediate compilation. +

+

+Typical usage is jit.off(true, true) in the main chunk +of a module to turn off JIT compilation for the whole module for +debugging purposes. +

+ +

jit.flush(tr)

+

+Flushes the root trace, specified by its number, and all of its side +traces from the cache. The code for the trace will be retained as long +as there are any other traces which link to it. +

+ +

status, ... = jit.status()

+

+Returns the current status of the JIT compiler. The first result is +either true or false if the JIT compiler is turned +on or off. The remaining results are strings for CPU-specific features +and enabled optimizations. +

+ +

jit.version

+

+Contains the LuaJIT version string. +

+ +

jit.version_num

+

+Contains the version number of the LuaJIT core. Version xx.yy.zz +is represented by the decimal number xxyyzz. +

+ +

jit.os

+

+Contains the target OS name: +"Windows", "Linux", "OSX", "BSD", "POSIX" or "Other". +

+ +

jit.arch

+

+Contains the target architecture name: +"x86", "x64", "arm", "arm64", "ppc", "mips" or "mips64". +

+ +

jit.opt.* — JIT compiler optimization control

+

+This sub-module provides the backend for the -O command line +option. +

+

+You can also use it programmatically, e.g.: +

+
+jit.opt.start(2) -- same as -O2
+jit.opt.start("-dce")
+jit.opt.start("hotloop=10", "hotexit=2")
+
+

+Unlike in LuaJIT 1.x, the module is built-in and +optimization is turned on by default! +It's no longer necessary to run require("jit.opt").start(), +which was one of the ways to enable optimization. +

+ +

jit.util.* — JIT compiler introspection

+

+This sub-module holds functions to introspect the bytecode, generated +traces, the IR and the generated machine code. The functionality +provided by this module is still in flux and therefore undocumented. +

+

+The debug modules -jbc, -jv and -jdump make +extensive use of these functions. Please check out their source code, +if you want to know more. +

+
+
+ + + diff --git a/lib/LuaJIT/doc/ext_profiler.html b/lib/LuaJIT/doc/ext_profiler.html new file mode 100644 index 0000000..d34ce6d --- /dev/null +++ b/lib/LuaJIT/doc/ext_profiler.html @@ -0,0 +1,364 @@ + + + +Profiler + + + + + + + +
+Lua +
+ + +
+

+LuaJIT has an integrated statistical profiler with very low overhead. It +allows sampling the currently executing stack and other parameters in +regular intervals. +

+

+The integrated profiler can be accessed from three levels: +

+ + +

High-Level Profiler

+

+The bundled high-level profiler offers basic profiling functionality. It +generates simple textual summaries or source code annotations. It can be +accessed with the -jp command line option +or from Lua code by loading the underlying jit.p module. +

+

+To cut to the chase — run this to get a CPU usage profile by +function name: +

+
+luajit -jp myapp.lua
+
+

+It's not a stated goal of the bundled profiler to add every +possible option or to cater for special profiling needs. The low-level +profiler APIs are documented below. They may be used by third-party +authors to implement advanced functionality, e.g. IDE integration or +graphical profilers. +

+

+Note: Sampling works for both interpreted and JIT-compiled code. The +results for JIT-compiled code may sometimes be surprising. LuaJIT +heavily optimizes and inlines Lua code — there's no simple +one-to-one correspondence between source code lines and the sampled +machine code. +

+ +

-jp=[options[,output]]

+

+The -jp command line option starts the high-level profiler. +When the application run by the command line terminates, the profiler +stops and writes the results to stdout or to the specified +output file. +

+

+The options argument specifies how the profiling is to be +performed: +

+ +

+The default output for -jp is a list of the most CPU consuming +spots in the application. Increasing the stack dump depth with (say) +-jp=2 may help to point out the main callers or callees of +hotspots. But sample aggregation is still flat per unique stack dump. +

+

+To get a two-level view (split view) of callers/callees, use +-jp=s or -jp=-s. The percentages shown for the second +level are relative to the first level. +

+

+To see how much time is spent in each line relative to a function, use +-jp=fl. +

+

+To see how much time is spent in different VM states or +zones, use -jp=v or -jp=z. +

+

+Combinations of v/z with f/F/l produce two-level +views, e.g. -jp=vf or -jp=fv. This shows the time +spent in a VM state or zone vs. hotspots. This can be used to answer +questions like "Which time consuming functions are only interpreted?" or +"What's the garbage collector overhead for a specific function?". +

+

+Multiple options can be combined — but not all combinations make +sense, see above. E.g. -jp=3si4m1 samples three stack levels +deep in 4ms intervals and shows a split view of the CPU consuming +functions and their callers with a 1% threshold. +

+

+Source code annotations produced by -jp=a or -jp=A are +always flat and at the line level. Obviously, the source code files need +to be readable by the profiler script. +

+

+The high-level profiler can also be started and stopped from Lua code with: +

+
+require("jit.p").start(options, output)
+...
+require("jit.p").stop()
+
+ +

jit.zone — Zones

+

+Zones can be used to provide information about different parts of an +application to the high-level profiler. E.g. a game could make use of an +"AI" zone, a "PHYS" zone, etc. Zones are hierarchical, +organized as a stack. +

+

+The jit.zone module needs to be loaded explicitly: +

+
+local zone = require("jit.zone")
+
+ +

+To show the time spent in each zone use -jp=z. To show the time +spent relative to hotspots use e.g. -jp=zf or -jp=fz. +

+ +

Low-level Lua API

+

+The jit.profile module gives access to the low-level API of the +profiler from Lua code. This module needs to be loaded explicitly: +

+local profile = require("jit.profile")
+
+

+This module can be used to implement your own higher-level profiler. +A typical profiling run starts the profiler, captures stack dumps in +the profiler callback, adds them to a hash table to aggregate the number +of samples, stops the profiler and then analyzes all of the captured +stack dumps. Other parameters can be sampled in the profiler callback, +too. But it's important not to spend too much time in the callback, +since this may skew the statistics. +

+ +

profile.start(mode, cb) +— Start profiler

+

+This function starts the profiler. The mode argument is a +string holding options: +

+ +

+The cb argument is a callback function which is called with +three arguments: (thread, samples, vmstate). The callback is +called on a separate coroutine, the thread argument is the +state that holds the stack to sample for profiling. Note: do +not modify the stack of that state or call functions on it. +

+

+samples gives the number of accumulated samples since the last +callback (usually 1). +

+

+vmstate holds the VM state at the time the profiling timer +triggered. This may or may not correspond to the state of the VM when +the profiling callback is called. The state is either 'N' +native (compiled) code, 'I' interpreted code, 'C' +C code, 'G' the garbage collector, or 'J' the JIT +compiler. +

+ +

profile.stop() +— Stop profiler

+

+This function stops the profiler. +

+ +

dump = profile.dumpstack([thread,] fmt, depth) +— Dump stack

+

+This function allows taking stack dumps in an efficient manner. It +returns a string with a stack dump for the thread (coroutine), +formatted according to the fmt argument: +

+ +

+The depth argument gives the number of frames to dump, starting +at the topmost frame of the thread. A negative number dumps the frames in +inverse order. +

+

+The first example prints a list of the current module names and line +numbers of up to 10 frames in separate lines. The second example prints +semicolon-separated function names for all frames (up to 100) in inverse +order: +

+
+print(profile.dumpstack(thread, "l\n", 10))
+print(profile.dumpstack(thread, "lZ;", -100))
+
+ +

Low-level C API

+

+The profiler can be controlled directly from C code, e.g. for +use by IDEs. The declarations are in "luajit.h" (see +Lua/C API extensions). +

+ +

luaJIT_profile_start(L, mode, cb, data) +— Start profiler

+

+This function starts the profiler. See +above for a description of the mode argument. +

+

+The cb argument is a callback function with the following +declaration: +

+
+typedef void (*luaJIT_profile_callback)(void *data, lua_State *L,
+                                        int samples, int vmstate);
+
+

+data is available for use by the callback. L is the +state that holds the stack to sample for profiling. Note: do +not modify this stack or call functions on this stack — +use a separate coroutine for this purpose. See +above for a description of samples and vmstate. +

+ +

luaJIT_profile_stop(L) +— Stop profiler

+

+This function stops the profiler. +

+ +

p = luaJIT_profile_dumpstack(L, fmt, depth, len) +— Dump stack

+

+This function allows taking stack dumps in an efficient manner. +See above for a description of fmt +and depth. +

+

+This function returns a const char * pointing to a +private string buffer of the profiler. The int *len +argument returns the length of the output string. The buffer is +overwritten on the next call and deallocated when the profiler stops. +You either need to consume the content immediately or copy it for later +use. +

+
+
+ + + diff --git a/lib/LuaJIT/doc/extensions.html b/lib/LuaJIT/doc/extensions.html new file mode 100644 index 0000000..7379041 --- /dev/null +++ b/lib/LuaJIT/doc/extensions.html @@ -0,0 +1,482 @@ + + + +Extensions + + + + + + + + +
+Lua +
+ + +
+

+LuaJIT is fully upwards-compatible with Lua 5.1. It supports all +» standard Lua +library functions and the full set of +» Lua/C API +functions. +

+

+LuaJIT is also fully ABI-compatible to Lua 5.1 at the linker/dynamic +loader level. This means you can compile a C module against the +standard Lua headers and load the same shared library from either Lua +or LuaJIT. +

+

+LuaJIT extends the standard Lua VM with new functionality and adds +several extension modules. Please note this page is only about +functional enhancements and not about performance enhancements, +such as the optimized VM, the faster interpreter or the JIT compiler. +

+ +

Extensions Modules

+

+LuaJIT comes with several built-in extension modules: +

+ +

bit.* — Bitwise operations

+

+LuaJIT supports all bitwise operations as defined by +» Lua BitOp: +

+
+bit.tobit  bit.tohex  bit.bnot    bit.band bit.bor  bit.bxor
+bit.lshift bit.rshift bit.arshift bit.rol  bit.ror  bit.bswap
+
+

+This module is a LuaJIT built-in — you don't need to download or +install Lua BitOp. The Lua BitOp site has full documentation for all +» Lua BitOp API functions. +The FFI adds support for +64 bit bitwise operations, +using the same API functions. +

+

+Please make sure to require the module before using any of +its functions: +

+
+local bit = require("bit")
+
+

+An already installed Lua BitOp module is ignored by LuaJIT. +This way you can use bit operations from both Lua and LuaJIT on a +shared installation. +

+ +

ffi.* — FFI library

+

+The FFI library allows calling external +C functions and the use of C data structures from pure Lua +code. +

+ +

jit.* — JIT compiler control

+

+The functions in this module +control the behavior of the JIT compiler engine. +

+ +

C API extensions

+

+LuaJIT adds some +extra functions to the Lua/C API. +

+ +

Profiler

+

+LuaJIT has an integrated profiler. +

+ +

Enhanced Standard Library Functions

+ +

xpcall(f, err [,args...]) passes arguments

+

+Unlike the standard implementation in Lua 5.1, xpcall() +passes any arguments after the error function to the function +which is called in a protected context. +

+ +

loadfile() etc. handle UTF-8 source code

+

+Non-ASCII characters are handled transparently by the Lua source code parser. +This allows the use of UTF-8 characters in identifiers and strings. +A UTF-8 BOM is skipped at the start of the source code. +

+ +

tostring() etc. canonicalize NaN and ±Inf

+

+All number-to-string conversions consistently convert non-finite numbers +to the same strings on all platforms. NaN results in "nan", +positive infinity results in "inf" and negative infinity results +in "-inf". +

+ +

tonumber() etc. use builtin string to number conversion

+

+All string-to-number conversions consistently convert integer and +floating-point inputs in decimal, hexadecimal and binary on all platforms. +strtod() is not used anymore, which avoids numerous +problems with poor C library implementations. The builtin conversion +function provides full precision according to the IEEE-754 standard, it +works independently of the current locale and it supports hex floating-point +numbers (e.g. 0x1.5p-3). +

+ +

string.dump(f [,strip]) generates portable bytecode

+

+An extra argument has been added to string.dump(). If set to +true, 'stripped' bytecode without debug information is +generated. This speeds up later bytecode loading and reduces memory +usage. See also the +-b command line option. +

+

+The generated bytecode is portable and can be loaded on any architecture +that LuaJIT supports, independent of word size or endianess. However the +bytecode compatibility versions must match. Bytecode stays compatible +for dot releases (x.y.0 → x.y.1), but may change with major or +minor releases (2.0 → 2.1) or between any beta release. Foreign +bytecode (e.g. from Lua 5.1) is incompatible and cannot be loaded. +

+

+Note: LJ_GC64 mode requires a different frame layout, which implies +a different, incompatible bytecode format for ports that use this mode (e.g. +ARM64 or MIPS64) or when explicitly enabled for x64. This may be rectified +in the future. +

+ +

table.new(narray, nhash) allocates a pre-sized table

+

+An extra library function table.new() can be made available via +require("table.new"). This creates a pre-sized table, just like +the C API equivalent lua_createtable(). This is useful for big +tables if the final table size is known and automatic table resizing is +too expensive. +

+ +

table.clear(tab) clears a table

+

+An extra library function table.clear() can be made available +via require("table.clear"). This clears all keys and values +from a table, but preserves the allocated array/hash sizes. This is +useful when a table, which is linked from multiple places, needs to be +cleared and/or when recycling a table for use by the same context. This +avoids managing backlinks, saves an allocation and the overhead of +incremental array/hash part growth. +

+

+Please note this function is meant for very specific situations. In most +cases it's better to replace the (usually single) link with a new table +and let the GC do its work. +

+ +

Enhanced PRNG for math.random()

+

+LuaJIT uses a Tausworthe PRNG with period 2^223 to implement +math.random() and math.randomseed(). The quality of +the PRNG results is much superior compared to the standard Lua +implementation which uses the platform-specific ANSI rand(). +

+

+The PRNG generates the same sequences from the same seeds on all +platforms and makes use of all bits in the seed argument. +math.random() without arguments generates 52 pseudo-random bits +for every call. The result is uniformly distributed between 0.0 and 1.0. +It's correctly scaled up and rounded for math.random(n [,m]) to +preserve uniformity. +

+ +

io.* functions handle 64 bit file offsets

+

+The file I/O functions in the standard io.* library handle +64 bit file offsets. In particular this means it's possible +to open files larger than 2 Gigabytes and to reposition or obtain +the current file position for offsets beyond 2 GB +(fp:seek() method). +

+ +

debug.* functions identify metamethods

+

+debug.getinfo() and lua_getinfo() also return information +about invoked metamethods. The namewhat field is set to +"metamethod" and the name field has the name of +the corresponding metamethod (e.g. "__index"). +

+ +

Fully Resumable VM

+

+The LuaJIT VM is fully resumable. This means you can yield from a +coroutine even across contexts, where this would not possible with +the standard Lua 5.1 VM: e.g. you can yield across pcall() +and xpcall(), across iterators and across metamethods. +

+ +

Extensions from Lua 5.2

+

+LuaJIT supports some language and library extensions from Lua 5.2. +Features that are unlikely to break existing code are unconditionally +enabled: +

+ +

+Other features are only enabled, if LuaJIT is built with +-DLUAJIT_ENABLE_LUA52COMPAT: +

+ +

+Note: this provides only partial compatibility with Lua 5.2 at the +language and Lua library level. LuaJIT is API+ABI-compatible with +Lua 5.1, which prevents implementing features that would otherwise +break the Lua/C API and ABI (e.g. _ENV). +

+ +

Extensions from Lua 5.3

+

+LuaJIT supports some extensions from Lua 5.3: +

+ +

C++ Exception Interoperability

+

+LuaJIT has built-in support for interoperating with C++ exceptions. +The available range of features depends on the target platform and +the toolchain used to compile LuaJIT: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PlatformCompilerInteroperability
POSIX/x64, DWARF2 unwindingGCC 4.3+, ClangFull
ARM -DLUAJIT_UNWIND_EXTERNALGCC, ClangFull
Other platforms, DWARF2 unwindingGCC, ClangLimited
Windows/x64MSVC or WinSDKFull
Windows/x86AnyFull
Other platformsOther compilersNo
+

+Full interoperability means: +

+ +

+Limited interoperability means: +

+ + +

+No interoperability means: +

+ +
+
+ + + diff --git a/lib/LuaJIT/doc/faq.html b/lib/LuaJIT/doc/faq.html new file mode 100644 index 0000000..ad88c49 --- /dev/null +++ b/lib/LuaJIT/doc/faq.html @@ -0,0 +1,185 @@ + + + +Frequently Asked Questions (FAQ) + + + + + + + + +
+Lua +
+ + +
+
+
Q: Where can I learn more about LuaJIT and Lua?
+
+ +
+ +
+
Q: Where can I learn more about the compiler technology used by LuaJIT?
+
+I'm planning to write more documentation about the internals of LuaJIT. +In the meantime, please use the following Google Scholar searches +to find relevant papers:
+Search for: » Trace Compiler
+Search for: » JIT Compiler
+Search for: » Dynamic Language Optimizations
+Search for: » SSA Form
+Search for: » Linear Scan Register Allocation
+Here is a list of the » innovative features in LuaJIT.
+And, you know, reading the source is of course the only way to enlightenment. :-) +
+
+ +
+
Q: Why do I get this error: "attempt to index global 'arg' (a nil value)"?
+Q: My vararg functions fail after switching to LuaJIT!
+
LuaJIT is compatible to the Lua 5.1 language standard. It doesn't +support the implicit arg parameter for old-style vararg +functions from Lua 5.0.
Please convert your code to the +» Lua 5.1 +vararg syntax.
+
+ +
+
Q: Why do I get this error: "bad FPU precision"?
+
Q: I get weird behavior after initializing Direct3D.
+
Q: Some FPU operations crash after I load a Delphi DLL.
+
+
+ +DirectX/Direct3D (up to version 9) sets the x87 FPU to single-precision +mode by default. This violates the Windows ABI and interferes with the +operation of many programs — LuaJIT is affected, too. Please make +sure you always use the D3DCREATE_FPU_PRESERVE flag when +initializing Direct3D.
+ +Direct3D version 10 or higher do not show this behavior anymore. +Consider testing your application with older versions, too.
+ +Similarly, the Borland/Delphi runtime modifies the FPU control word and +enables FP exceptions. Of course this violates the Windows ABI, too. +Please check the Delphi docs for the Set8087CW method. + +
+ +
+
Q: Sometimes Ctrl-C fails to stop my Lua program. Why?
+
The interrupt signal handler sets a Lua debug hook. But this is +currently ignored by compiled code (this will eventually be fixed). If +your program is running in a tight loop and never falls back to the +interpreter, the debug hook never runs and can't throw the +"interrupted!" error.
In the meantime you have to press Ctrl-C +twice to get stop your program. That's similar to when it's stuck +running inside a C function under the Lua interpreter.
+
+ +
+
Q: Why doesn't my favorite power-patch for Lua apply against LuaJIT?
+
Because it's a completely redesigned VM and has very little code +in common with Lua anymore. Also, if the patch introduces changes to +the Lua semantics, these would need to be reflected everywhere in the +VM, from the interpreter up to all stages of the compiler.
Please +use only standard Lua language constructs. For many common needs you +can use source transformations or use wrapper or proxy functions. +The compiler will happily optimize away such indirections.
+
+ +
+
Q: Lua runs everywhere. Why doesn't LuaJIT support my CPU?
+
Because it's a compiler — it needs to generate native +machine code. This means the code generator must be ported to each +architecture. And the fast interpreter is written in assembler and +must be ported, too. This is quite an undertaking.
+The install documentation shows the supported +architectures. Other architectures will follow based on sufficient user +demand and/or sponsoring.
+
+ +
+
Q: When will feature X be added? When will the next version be released?
+
When it's ready.
+C'mon, it's open source — I'm doing it on my own time and you're +getting it for free. You can either contribute a patch or sponsor +the development of certain features, if they are important to you. +
+
+
+
+ + + diff --git a/lib/LuaJIT/doc/img/contact.png b/lib/LuaJIT/doc/img/contact.png new file mode 100644 index 0000000000000000000000000000000000000000..9c73dc594efc1f47309d6c9b73d7719c3a9e04df GIT binary patch literal 1340 zcmV-C1;hG@P)sQ4|K#fZOHEVa==(`aQP0%nM@di3(&I%(O)@h#$&+f^&9&U}9=sU}#xfW8dZX zS6X4+hl`eQb9`=bdTMQUS6N_FRb1EH?oLrx)!OXR*y%bu zKs7fzyTH%6zRkD1%O4*iwYte19Urr}$DpLK7#SM{1qGa-tpfuC0RaJph?9SUjedfR ze1M8)YI0?0aARg}VPtGhP*&yZ{!C6(sq^PzF3k;#Avk3_bkCL7T2MCRjoQjT_h>Vwp zij{MAe{pnuZ*qHWaCvKPcUD+m*xm0?Qd!p9?bO-p)7k3L*XYmH<~BGyy}{8mHafb$ z&bYnIARr?h9v~YW9vK=O7Z@4@1O%I(tO5c8@Y5f50008dNklZz)3AlitwxnPH%H`Uot)Wm#A~UJD{dq04A@c=B#o!5#fVO zK9y#&^Z}?|*LsioK&(FDooZAR)tQj#4t{T51EP;48U9I=7br`Bk^O8MkeX!ZNe^m_BH=Vrj*jZZuSKj$t2j7FZ^2u4YKv8(~ zaMJ@oQZ>+`rSiG$iy;5QP}GpcaF4=ry2srsiZ0RqYjK@LQA)d@GB0_aay0Tvrp83dAL2x{13 zII2|!RUp(7P{l^2T*QHZ71!E*QcTqNtMh0|uLS!2k^8W?Ka#6$aBn3*=LUe(BpUo6 z=nkI1fP*0x3aYH^su6tQT}{)EfU4IyLBQ-;(w1i;#)>KNGk41l6I5_B2)f}c}CK-PL&a{M5Rut(jQ@VX1_p&z6vN)t zNcp7CYSP6-mE96jwhE}y?lvr|2kRa0g^iLTaJ1y+9qs~F+W}}-FHd&oy;TeG2n6hM z2eK~@vIu+Z%WDWZDK7wkG0}TEXW(~!Gk+0t(i)Sck-Ht%F=yzi{ZFXe-}F6T**!vM y)$^3mN5{Eb6*vAD>S)nmP3aw7v29)6WaBSReaJM4z7xj)0000 + + +Installation + + + + + + + + +
+Lua +
+ + +
+

+LuaJIT is only distributed as a source package. This page explains +how to build and install LuaJIT with different operating systems +and C compilers. +

+

+For the impatient (on POSIX systems): +

+
+make && sudo make install
+
+

+LuaJIT currently builds out-of-the box on most systems. +Here's the compatibility matrix for the supported combinations of +operating systems, CPUs and compilers: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CPU / OSLinux or
Android
*BSD, OtherOSX 10.4+ or
iOS 3.0+
Windows
XP/Vista/7
x86 (32 bit)GCC 4.2+GCC 4.2+XCode 5.0+
Clang
MSVC, MSVC/EE
WinSDK
MinGW, Cygwin
x64 (64 bit)GCC 4.2+GCC 4.2+
ORBIS (PS4)
XCode 5.0+
Clang
MSVC + SDK v7.0
WinSDK v7.0
Durango (Xbox One)
ARMv5+
ARM9E+
GCC 4.2+GCC 4.2+
PSP2 (PS VITA)
XCode 5.0+
Clang
 
ARM64GCC 4.8+ XCode 6.0+
Clang 3.5+
 
PPCGCC 4.3+GCC 4.3+
GCC 4.1 (PS3)
 XEDK (Xbox 360)
MIPS32
MIPS64
GCC 4.3+GCC 4.3+  
+ +

Configuring LuaJIT

+

+The standard configuration should work fine for most installations. +Usually there is no need to tweak the settings. The following files +hold all user-configurable settings: +

+
    +
  • src/luaconf.h sets some configuration variables.
  • +
  • Makefile has settings for installing LuaJIT (POSIX +only).
  • +
  • src/Makefile has settings for compiling LuaJIT +under POSIX, MinGW or Cygwin.
  • +
  • src/msvcbuild.bat has settings for compiling LuaJIT with +MSVC or WinSDK.
  • +
+

+Please read the instructions given in these files, before changing +any settings. +

+

+LuaJIT on x64 currently uses 32 bit GC objects by default. +LJ_GC64 mode may be explicitly enabled: +add XCFLAGS=-DLUAJIT_ENABLE_GC64 to the make command or run +msvcbuild gc64 for MSVC/WinSDK. Please check the note +about the bytecode format +differences, too. +

+ +

POSIX Systems (Linux, OSX, *BSD etc.)

+

Prerequisites

+

+Depending on your distribution, you may need to install a package for +GCC, the development headers and/or a complete SDK. E.g. on a current +Debian/Ubuntu, install libc6-dev with the package manager. +

+

+Download the current source package of LuaJIT (pick the .tar.gz), +if you haven't already done so. Move it to a directory of your choice, +open a terminal window and change to this directory. Now unpack the archive +and change to the newly created directory: +

+
+tar zxf LuaJIT-2.0.5.tar.gz
+cd LuaJIT-2.0.5
+

Building LuaJIT

+

+The supplied Makefiles try to auto-detect the settings needed for your +operating system and your compiler. They need to be run with GNU Make, +which is probably the default on your system, anyway. Simply run: +

+
+make
+
+

+This always builds a native binary, depending on the host OS +you're running this command on. Check the section on +cross-compilation for more options. +

+

+By default, modules are only searched under the prefix /usr/local. +You can add an extra prefix to the search paths by appending the +PREFIX option, e.g.: +

+
+make PREFIX=/home/myself/lj2
+
+

+Note for OSX: if the MACOSX_DEPLOYMENT_TARGET environment +variable is not set, then it's forced to 10.4. +

+

Installing LuaJIT

+

+The top-level Makefile installs LuaJIT by default under +/usr/local, i.e. the executable ends up in +/usr/local/bin and so on. You need root privileges +to write to this path. So, assuming sudo is installed on your system, +run the following command and enter your sudo password: +

+
+sudo make install
+
+

+Otherwise specify the directory prefix as an absolute path, e.g.: +

+
+make install PREFIX=/home/myself/lj2
+
+

+Obviously the prefixes given during build and installation need to be the same. +

+ +

Windows Systems

+

Prerequisites

+

+Either install one of the open source SDKs +(» MinGW or +» Cygwin), which come with a modified +GCC plus the required development headers. +

+

+Or install Microsoft's Visual C++ (MSVC). The freely downloadable +» Express Edition +works just fine, but only contains an x86 compiler. +

+

+The freely downloadable +» Windows SDK +only comes with command line tools, but this is all you need to build LuaJIT. +It contains x86 and x64 compilers. +

+

+Next, download the source package and unpack it using an archive manager +(e.g. the Windows Explorer) to a directory of your choice. +

+

Building with MSVC

+

+Open a "Visual Studio .NET Command Prompt", cd to the +directory where you've unpacked the sources and run these commands: +

+
+cd src
+msvcbuild
+
+

+Then follow the installation instructions below. +

+

Building with the Windows SDK

+

+Open a "Windows SDK Command Shell" and select the x86 compiler: +

+
+setenv /release /x86
+
+

+Or select the x64 compiler: +

+
+setenv /release /x64
+
+

+Then cd to the directory where you've unpacked the sources +and run these commands: +

+
+cd src
+msvcbuild
+
+

+Then follow the installation instructions below. +

+

Building with MinGW or Cygwin

+

+Open a command prompt window and make sure the MinGW or Cygwin programs +are in your path. Then cd to the directory where +you've unpacked the sources and run this command for MinGW: +

+
+mingw32-make
+
+

+Or this command for Cygwin: +

+
+make
+
+

+Then follow the installation instructions below. +

+

Installing LuaJIT

+

+Copy luajit.exe and lua51.dll (built in the src +directory) to a newly created directory (any location is ok). +Add lua and lua\jit directories below it and copy +all Lua files from the src\jit directory of the distribution +to the latter directory. +

+

+There are no hardcoded +absolute path names — all modules are loaded relative to the +directory where luajit.exe is installed +(see src/luaconf.h). +

+ +

Cross-compiling LuaJIT

+

+First, let's clear up some terminology: +

+
    +
  • Host: This is your development system, usually based on a x64 or x86 CPU.
  • +
  • Target: This is the target system you want LuaJIT to run on, e.g. Android/ARM.
  • +
  • Toolchain: This comprises a C compiler, linker, assembler and a matching C library.
  • +
  • Host (or system) toolchain: This is the toolchain used to build native binaries for your host system.
  • +
  • Cross-compile toolchain: This is the toolchain used to build binaries for the target system. They can only be run on the target system.
  • +
+

+The GNU Makefile-based build system allows cross-compiling on any host +for any supported target: +

+
    +
  • Yes, you need a toolchain for both your host and your target!
  • +
  • Both host and target architectures must have the same pointer size.
  • +
  • E.g. if you want to cross-compile to a 32 bit target on a 64 bit host, you need to install the multilib development package (e.g. libc6-dev-i386 on Debian/Ubuntu) and build a 32 bit host part (HOST_CC="gcc -m32").
  • +
  • 64 bit targets always require compilation on a 64 bit host.
  • +
+

+You need to specify TARGET_SYS whenever the host OS and the +target OS differ, or you'll get assembler or linker errors: +

+
    +
  • E.g. if you're compiling on a Windows or OSX host for embedded Linux or Android, you need to add TARGET_SYS=Linux to the examples below.
  • +
  • For a minimal target OS, you may need to disable the built-in allocator in src/Makefile and use TARGET_SYS=Other.
  • +
  • Don't forget to specify the same TARGET_SYS for the install step, too.
  • +
+

+Here are some examples where host and target have the same CPU: +

+
+# Cross-compile to a 32 bit binary on a multilib x64 OS
+make CC="gcc -m32"
+
+# Cross-compile on Debian/Ubuntu for Windows (mingw32 package)
+make HOST_CC="gcc -m32" CROSS=i586-mingw32msvc- TARGET_SYS=Windows
+
+

+The CROSS prefix allows specifying a standard GNU cross-compile +toolchain (Binutils, GCC and a matching libc). The prefix may vary +depending on the --target the toolchain was built for (note the +CROSS prefix has a trailing "-"). The examples below +use the canonical toolchain triplets for Linux. +

+

+Since there's often no easy way to detect CPU features at runtime, it's +important to compile with the proper CPU or architecture settings: + +

    +
  • The best way to get consistent results is to specify the correct settings when building the toolchain yourself.
  • +
  • For a pre-built, generic toolchain add -mcpu=... or -march=... and other necessary flags to TARGET_CFLAGS.
  • +
  • For ARM it's important to have the correct -mfloat-abi=... setting, too. Otherwise LuaJIT may not run at the full performance of your target CPU.
  • +
  • For MIPS it's important to select a supported ABI (o32 on MIPS32, n64 on MIPS64) and consistently compile your project either with hard-float or soft-float compiler settings.
  • +
+

+Here are some examples for targets with a different CPU than the host: +

+
+# ARM soft-float
+make HOST_CC="gcc -m32" CROSS=arm-linux-gnueabi- \
+     TARGET_CFLAGS="-mfloat-abi=soft"
+
+# ARM soft-float ABI with VFP (example for Cortex-A9)
+make HOST_CC="gcc -m32" CROSS=arm-linux-gnueabi- \
+     TARGET_CFLAGS="-mcpu=cortex-a9 -mfloat-abi=softfp"
+
+# ARM hard-float ABI with VFP (armhf, most modern toolchains)
+make HOST_CC="gcc -m32" CROSS=arm-linux-gnueabihf-
+
+# ARM64
+make CROSS=aarch64-linux-
+
+# PPC
+make HOST_CC="gcc -m32" CROSS=powerpc-linux-gnu-
+
+# MIPS32 big-endian
+make HOST_CC="gcc -m32" CROSS=mips-linux-
+# MIPS32 little-endian
+make HOST_CC="gcc -m32" CROSS=mipsel-linux-
+
+# MIPS64 big-endian
+make CROSS=mips-linux- TARGET_CFLAGS="-mips64r2 -mabi=64"
+# MIPS64 little-endian
+make CROSS=mipsel-linux- TARGET_CFLAGS="-mips64r2 -mabi=64"
+
+

+You can cross-compile for Android using the Android NDK. +The environment variables need to match the install locations and the +desired target platform. E.g. Android 4.0 corresponds to ABI level 14. +For details check the folder docs in the NDK directory. +

+

+Only a few common variations for the different CPUs, ABIs and platforms +are listed. Please use your own judgement for which combination you want +to build/deploy or which lowest common denominator you want to pick: +

+
+# Android/ARM, armeabi (ARMv5TE soft-float), Android 2.2+ (Froyo)
+NDK=/opt/android/ndk
+NDKABI=8
+NDKVER=$NDK/toolchains/arm-linux-androideabi-4.9
+NDKP=$NDKVER/prebuilt/linux-x86/bin/arm-linux-androideabi-
+NDKF="--sysroot $NDK/platforms/android-$NDKABI/arch-arm"
+make HOST_CC="gcc -m32" CROSS=$NDKP TARGET_FLAGS="$NDKF"
+
+# Android/ARM, armeabi-v7a (ARMv7 VFP), Android 4.0+ (ICS)
+NDK=/opt/android/ndk
+NDKABI=14
+NDKVER=$NDK/toolchains/arm-linux-androideabi-4.9
+NDKP=$NDKVER/prebuilt/linux-x86/bin/arm-linux-androideabi-
+NDKF="--sysroot $NDK/platforms/android-$NDKABI/arch-arm"
+NDKARCH="-march=armv7-a -mfloat-abi=softfp -Wl,--fix-cortex-a8"
+make HOST_CC="gcc -m32" CROSS=$NDKP TARGET_FLAGS="$NDKF $NDKARCH"
+
+# Android/MIPS, mipsel (MIPS32R1 hard-float), Android 4.0+ (ICS)
+NDK=/opt/android/ndk
+NDKABI=14
+NDKVER=$NDK/toolchains/mipsel-linux-android-4.9
+NDKP=$NDKVER/prebuilt/linux-x86/bin/mipsel-linux-android-
+NDKF="--sysroot $NDK/platforms/android-$NDKABI/arch-mips"
+make HOST_CC="gcc -m32" CROSS=$NDKP TARGET_FLAGS="$NDKF"
+
+# Android/x86, x86 (i686 SSE3), Android 4.0+ (ICS)
+NDK=/opt/android/ndk
+NDKABI=14
+NDKVER=$NDK/toolchains/x86-4.9
+NDKP=$NDKVER/prebuilt/linux-x86/bin/i686-linux-android-
+NDKF="--sysroot $NDK/platforms/android-$NDKABI/arch-x86"
+make HOST_CC="gcc -m32" CROSS=$NDKP TARGET_FLAGS="$NDKF"
+
+

+You can cross-compile for iOS 3.0+ (iPhone/iPad) using the » iOS SDK: +

+

+Note: the JIT compiler is disabled for iOS, because regular iOS Apps +are not allowed to generate code at runtime. You'll only get the performance +of the LuaJIT interpreter on iOS. This is still faster than plain Lua, but +much slower than the JIT compiler. Please complain to Apple, not me. +Or use Android. :-p +

+
+# iOS/ARM (32 bit)
+ISDKP=$(xcrun --sdk iphoneos --show-sdk-path)
+ICC=$(xcrun --sdk iphoneos --find clang)
+ISDKF="-arch armv7 -isysroot $ISDKP"
+make DEFAULT_CC=clang HOST_CC="clang -m32 -arch i386" \
+     CROSS="$(dirname $ICC)/" TARGET_FLAGS="$ISDKF" TARGET_SYS=iOS
+
+# iOS/ARM64
+ISDKP=$(xcrun --sdk iphoneos --show-sdk-path)
+ICC=$(xcrun --sdk iphoneos --find clang)
+ISDKF="-arch arm64 -isysroot $ISDKP"
+make DEFAULT_CC=clang CROSS="$(dirname $ICC)/" \
+     TARGET_FLAGS="$ISDKF" TARGET_SYS=iOS
+
+ +

Cross-compiling for consoles

+

+Building LuaJIT for consoles requires both a supported host compiler +(x86 or x64) and a cross-compiler (to PPC or ARM) from the official +console SDK. +

+

+Due to restrictions on consoles, the JIT compiler is disabled and only +the fast interpreter is built. This is still faster than plain Lua, +but much slower than the JIT compiler. The FFI is disabled, too, since +it's not very useful in such an environment. +

+

+The following commands build a static library libluajit.a, +which can be linked against your game, just like the Lua library. +

+

+To cross-compile for PS3 from a Linux host (requires +32 bit GCC, i.e. multilib Linux/x64) or a Windows host (requires +32 bit MinGW), run this command: +

+
+make HOST_CC="gcc -m32" CROSS=ppu-lv2-
+
+

+To cross-compile for PS4 from a Windows host, +open a "Visual Studio .NET Command Prompt" (64 bit host compiler), +cd to the directory where you've unpacked the sources and +run the following commands: +

+
+cd src
+ps4build
+
+

+To cross-compile for PS Vita from a Windows host, +open a "Visual Studio .NET Command Prompt" (32 bit host compiler), +cd to the directory where you've unpacked the sources and +run the following commands: +

+
+cd src
+psvitabuild
+
+

+To cross-compile for Xbox 360 from a Windows host, +open a "Visual Studio .NET Command Prompt" (32 bit host compiler), +cd to the directory where you've unpacked the sources and run +the following commands: +

+
+cd src
+xedkbuild
+
+

+To cross-compile for Xbox One from a Windows host, +open a "Visual Studio .NET Command Prompt" (64 bit host compiler), +cd to the directory where you've unpacked the sources and run +the following commands: +

+
+cd src
+xb1build
+
+ +

Embedding LuaJIT

+

+LuaJIT is API-compatible with Lua 5.1. If you've already embedded Lua +into your application, you probably don't need to do anything to switch +to LuaJIT, except link with a different library: +

+
    +
  • It's strongly suggested to build LuaJIT separately using the supplied +build system. Please do not attempt to integrate the individual +source files into your build tree. You'll most likely get the internal build +dependencies wrong or mess up the compiler flags. Treat LuaJIT like any +other external library and link your application with either the dynamic +or static library, depending on your needs.
  • +
  • If you want to load C modules compiled for plain Lua +with require(), you need to make sure the public symbols +(e.g. lua_pushnumber) are exported, too: +
    • On POSIX systems you can either link to the shared library +or link the static library into your application. In the latter case +you'll need to export all public symbols from your main executable +(e.g. -Wl,-E on Linux) and add the external dependencies +(e.g. -lm -ldl on Linux).
    • +
    • Since Windows symbols are bound to a specific DLL name, you need to +link to the lua51.dll created by the LuaJIT build (do not rename +the DLL). You may link LuaJIT statically on Windows only if you don't +intend to load Lua/C modules at runtime. +
    +
  • +
  • +If you're building a 64 bit application on OSX which links directly or +indirectly against LuaJIT which is not built for LJ_GC64 mode, +you need to link your main executable with these flags: +
    +-pagezero_size 10000 -image_base 100000000
    +
    +
  • +
+

Additional hints for initializing LuaJIT using the C API functions:

+
    +
  • Here's a +» simple example +for embedding Lua or LuaJIT into your application.
  • +
  • Make sure you use luaL_newstate. Avoid using +lua_newstate, since this uses the (slower) default memory +allocator from your system (no support for this on x64).
  • +
  • Make sure you use luaL_openlibs and not the old Lua 5.0 style +of calling luaopen_base etc. directly.
  • +
  • To change or extend the list of standard libraries to load, copy +src/lib_init.c to your project and modify it accordingly. +Make sure the jit library is loaded or the JIT compiler +will not be activated.
  • +
  • The bit.* module for bitwise operations +is already built-in. There's no need to statically link +» Lua BitOp to your application.
  • +
+ +

Hints for Distribution Maintainers

+

+The LuaJIT build system has extra provisions for the needs of most +POSIX-based distributions. If you're a package maintainer for +a distribution, please make use of these features and +avoid patching, subverting, autotoolizing or messing up the build system +in unspeakable ways. +

+

+There should be absolutely no need to patch luaconf.h or any +of the Makefiles. And please do not hand-pick files for your packages — +simply use whatever make install creates. There's a reason +for all of the files and directories it creates. +

+

+The build system uses GNU make and auto-detects most settings based on +the host you're building it on. This should work fine for native builds, +even when sandboxed. You may need to pass some of the following flags to +both the make and the make install command lines +for a regular distribution build: +

+
    +
  • PREFIX overrides the installation path and should usually +be set to /usr. Setting this also changes the module paths and +the paths needed to locate the shared library.
  • +
  • DESTDIR is an absolute path which allows you to install +to a shadow tree instead of the root tree of the build system.
  • +
  • MULTILIB sets the architecture-specific library path component +for multilib systems. The default is lib.
  • +
  • Have a look at the top-level Makefile and src/Makefile +for additional variables to tweak. The following variables may be +overridden, but it's not recommended, except for special needs +like cross-builds: +BUILDMODE, CC, HOST_CC, STATIC_CC, DYNAMIC_CC, CFLAGS, HOST_CFLAGS, +TARGET_CFLAGS, LDFLAGS, HOST_LDFLAGS, TARGET_LDFLAGS, TARGET_SHLDFLAGS, +TARGET_FLAGS, LIBS, HOST_LIBS, TARGET_LIBS, CROSS, HOST_SYS, TARGET_SYS +
  • +
+

+The build system has a special target for an amalgamated build, i.e. +make amalg. This compiles the LuaJIT core as one huge C file +and allows GCC to generate faster and shorter code. Alas, this requires +lots of memory during the build. This may be a problem for some users, +that's why it's not enabled by default. But it shouldn't be a problem for +most build farms. It's recommended that binary distributions use this +target for their LuaJIT builds. +

+

+The tl;dr version of the above: +

+
+make amalg PREFIX=/usr && \
+make install PREFIX=/usr DESTDIR=/tmp/buildroot
+
+

+Finally, if you encounter any difficulties, please +contact me first, instead of releasing a broken +package onto unsuspecting users. Because they'll usually gonna complain +to me (the upstream) and not you (the package maintainer), anyway. +

+
+
+ + + diff --git a/lib/LuaJIT/doc/luajit.html b/lib/LuaJIT/doc/luajit.html new file mode 100644 index 0000000..a85c201 --- /dev/null +++ b/lib/LuaJIT/doc/luajit.html @@ -0,0 +1,235 @@ + + + +LuaJIT + + + + + + + + + +
+Lua +
+ + +
+

+LuaJIT is a Just-In-Time Compiler (JIT) for the +» Lua programming language. +Lua is a powerful, dynamic and light-weight programming language. +It may be embedded or used as a general-purpose, stand-alone language. +

+

+LuaJIT is Copyright © 2005-2018 Mike Pall, released under the +» MIT open source license. +

+

+

+ +

Compatibility

+ + +
WindowsLinuxBSDOSXPOSIX
+ + +
EmbeddedAndroidiOS
+ + +
PS3PS4PS VitaXbox 360Xbox One
+ + +
GCCClang
LLVM
MSVC
+ + +
x86
x64
ARM
ARM64
PPCMIPS32
MIPS64
+ + +
Lua 5.1
API+ABI
+ JIT+ BitOp+ FFIDrop-in
DLL/.so
+ +

Overview

+ + + + + + + + + +
3x
-  100x
115 KB
VM
90 KB
JIT
63 KLOC
C
24 KLOC
ASM
11 KLOC
Lua
+

+LuaJIT has been successfully used as a scripting middleware in +games, appliances, network and graphics apps, numerical simulations, +trading platforms and many other specialty applications. It scales from +embedded devices, smartphones, desktops up to server farms. It combines +high flexibility with » high performance +and an unmatched low memory footprint. +

+

+LuaJIT has been in continuous development since 2005. It's widely +considered to be one of the fastest dynamic language +implementations. It has outperformed other dynamic languages on many +cross-language benchmarks since its first release — often by a +substantial margin. +

+

+For LuaJIT 2.0, the whole VM has been rewritten from the ground up +and relentlessly optimized for performance. It combines a high-speed +interpreter, written in assembler, with a state-of-the-art JIT +compiler. +

+

+An innovative trace compiler is integrated with advanced, +SSA-based optimizations and highly tuned code generation backends. +A substantial reduction of the overhead associated with dynamic languages +allows it to break into the performance range traditionally reserved for +offline, static language compilers. +

+ +

More ...

+

+Please select a sub-topic in the navigation bar to learn more about LuaJIT. +

+
+
+ + + diff --git a/lib/LuaJIT/doc/running.html b/lib/LuaJIT/doc/running.html new file mode 100644 index 0000000..ae3cd71 --- /dev/null +++ b/lib/LuaJIT/doc/running.html @@ -0,0 +1,308 @@ + + + +Running LuaJIT + + + + + + + + +
+Lua +
+ + +
+

+LuaJIT has only a single stand-alone executable, called luajit on +POSIX systems or luajit.exe on Windows. It can be used to run simple +Lua statements or whole Lua applications from the command line. It has an +interactive mode, too. +

+ +

Command Line Options

+

+The luajit stand-alone executable is just a slightly modified +version of the regular lua stand-alone executable. +It supports the same basic options, too. luajit -h +prints a short list of the available options. Please have a look at the +» Lua manual +for details. +

+

+LuaJIT has some additional options: +

+ +

-b[options] input output

+

+This option saves or lists bytecode. The following additional options +are accepted: +

+
    +
  • -l — Only list bytecode.
  • +
  • -s — Strip debug info (this is the default).
  • +
  • -g — Keep debug info.
  • +
  • -n name — Set module name (default: auto-detect from input name)
  • +
  • -t type — Set output file type (default: auto-detect from output name).
  • +
  • -a arch — Override architecture for object files (default: native).
  • +
  • -o os — Override OS for object files (default: native).
  • +
  • -e chunk — Use chunk string as input.
  • +
  • - (a single minus sign) — Use stdin as input and/or stdout as output.
  • +
+

+The output file type is auto-detected from the extension of the output +file name: +

+
    +
  • c — C source file, exported bytecode data.
  • +
  • h — C header file, static bytecode data.
  • +
  • obj or o — Object file, exported bytecode data +(OS- and architecture-specific).
  • +
  • raw or any other extension — Raw bytecode file (portable). +
+

+Notes: +

+
    +
  • See also string.dump() +for information on bytecode portability and compatibility.
  • +
  • A file in raw bytecode format is auto-detected and can be loaded like +any Lua source file. E.g. directly from the command line or with +loadfile(), dofile() etc.
  • +
  • To statically embed the bytecode of a module in your application, +generate an object file and just link it with your application.
  • +
  • On most ELF-based systems (e.g. Linux) you need to explicitly export the +global symbols when linking your application, e.g. with: -Wl,-E
  • +
  • require() tries to load embedded bytecode data from exported +symbols (in *.exe or lua51.dll on Windows) and from +shared libraries in package.cpath.
  • +
+

+Typical usage examples: +

+
+luajit -b test.lua test.out                 # Save bytecode to test.out
+luajit -bg test.lua test.out                # Keep debug info
+luajit -be "print('hello world')" test.out  # Save cmdline script
+
+luajit -bl test.lua                         # List to stdout
+luajit -bl test.lua test.txt                # List to test.txt
+luajit -ble "print('hello world')"          # List cmdline script
+
+luajit -b test.lua test.obj                 # Generate object file
+# Link test.obj with your application and load it with require("test")
+
+ +

-j cmd[=arg[,arg...]]

+

+This option performs a LuaJIT control command or activates one of the +loadable extension modules. The command is first looked up in the +jit.* library. If no matching function is found, a module +named jit.<cmd> is loaded and the start() +function of the module is called with the specified arguments (if +any). The space between -j and cmd is optional. +

+

+Here are the available LuaJIT control commands: +

+
    +
  • -jon — Turns the JIT compiler on (default).
  • +
  • -joff — Turns the JIT compiler off (only use the interpreter).
  • +
  • -jflush — Flushes the whole cache of compiled code.
  • +
  • -jv — Shows verbose information about the progress of the JIT compiler.
  • +
  • -jdump — Dumps the code and structures used in various compiler stages.
  • +
  • -jp — Start the integrated profiler.
  • +
+

+The -jv and -jdump commands are extension modules +written in Lua. They are mainly used for debugging the JIT compiler +itself. For a description of their options and output format, please +read the comment block at the start of their source. +They can be found in the lib directory of the source +distribution or installed under the jit directory. By default +this is /usr/local/share/luajit-2.0.5/jit on POSIX +systems. +

+ +

-O[level]
+-O[+]flag   -O-flag
+-Oparam=value

+

+This options allows fine-tuned control of the optimizations used by +the JIT compiler. This is mainly intended for debugging LuaJIT itself. +Please note that the JIT compiler is extremely fast (we are talking +about the microsecond to millisecond range). Disabling optimizations +doesn't have any visible impact on its overhead, but usually generates +code that runs slower. +

+

+The first form sets an optimization level — this enables a +specific mix of optimization flags. -O0 turns off all +optimizations and higher numbers enable more optimizations. Omitting +the level (i.e. just -O) sets the default optimization level, +which is -O3 in the current version. +

+

+The second form adds or removes individual optimization flags. +The third form sets a parameter for the VM or the JIT compiler +to a specific value. +

+

+You can either use this option multiple times (like -Ocse +-O-dce -Ohotloop=10) or separate several settings with a comma +(like -O+cse,-dce,hotloop=10). The settings are applied from +left to right and later settings override earlier ones. You can freely +mix the three forms, but note that setting an optimization level +overrides all earlier flags. +

+

+Here are the available flags and at what optimization levels they +are enabled: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Flag-O1-O2-O3 
foldConstant Folding, Simplifications and Reassociation
cseCommon-Subexpression Elimination
dceDead-Code Elimination
narrow Narrowing of numbers to integers
loop Loop Optimizations (code hoisting)
fwd  Load Forwarding (L2L) and Store Forwarding (S2L)
dse  Dead-Store Elimination
abc  Array Bounds Check Elimination
sink  Allocation/Store Sinking
fuse  Fusion of operands into instructions
+

+Here are the parameters and their default settings: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterDefault 
maxtrace1000Max. number of traces in the cache
maxrecord4000Max. number of recorded IR instructions
maxirconst500Max. number of IR constants of a trace
maxside100Max. number of side traces of a root trace
maxsnap500Max. number of snapshots for a trace
hotloop56Number of iterations to detect a hot loop or hot call
hotexit10Number of taken exits to start a side trace
tryside4Number of attempts to compile a side trace
instunroll4Max. unroll factor for instable loops
loopunroll15Max. unroll factor for loop ops in side traces
callunroll3Max. unroll factor for pseudo-recursive calls
recunroll2Min. unroll factor for true recursion
sizemcode32Size of each machine code area in KBytes (Windows: 64K)
maxmcode512Max. total size of all machine code areas in KBytes
+
+
+ + + diff --git a/lib/LuaJIT/doc/status.html b/lib/LuaJIT/doc/status.html new file mode 100644 index 0000000..e0d912e --- /dev/null +++ b/lib/LuaJIT/doc/status.html @@ -0,0 +1,122 @@ + + + +Status + + + + + + + + +
+Lua +
+ + +
+

+LuaJIT 2.0 is the current +stable branch. This branch is in +feature-freeze — new features will only be added to LuaJIT 2.1. +

+ +

Current Status

+

+LuaJIT ought to run all Lua 5.1-compatible source code just fine. +It's considered a serious bug if the VM crashes or produces unexpected +results — please report this. +

+

+Known incompatibilities and issues in LuaJIT 2.0: +

+
    +
  • +There are some differences in implementation-defined behavior. +These either have a good reason, are arbitrary design choices +or are due to quirks in the VM. The latter cases may get fixed if a +demonstrable need is shown. +
  • +
  • +The Lua debug API is missing a couple of features (return +hooks for non-Lua functions) and shows slightly different behavior +in LuaJIT (no per-coroutine hooks, no tail call counting). +
  • +
  • +Currently some out-of-memory errors from on-trace code are not +handled correctly. The error may fall through an on-trace +pcall or it may be passed on to the function set with +lua_atpanic on x64. This issue will be fixed with the new +garbage collector. +
  • +
  • +LuaJIT on 64 bit systems provides a limited range of 47 bits for the +legacy lightuserdata data type. +This is only relevant on x64 systems which use the negative part of the +virtual address space in user mode, e.g. Solaris/x64, and on ARM64 systems +configured with a 48 bit or 52 bit VA. +Avoid using lightuserdata to hold pointers that may point outside +of that range, e.g. variables on the stack. In general, avoid this data +type for new code and replace it with (much more performant) FFI bindings. +FFI cdata pointers can address the full 64 bit range. +
  • +
+
+
+ + + diff --git a/lib/LuaJIT/dynasm/dasm_arm.h b/lib/LuaJIT/dynasm/dasm_arm.h new file mode 100644 index 0000000..1d404cc --- /dev/null +++ b/lib/LuaJIT/dynasm/dasm_arm.h @@ -0,0 +1,458 @@ +/* +** DynASM ARM encoding engine. +** Copyright (C) 2005-2017 Mike Pall. All rights reserved. +** Released under the MIT license. See dynasm.lua for full copyright notice. +*/ + +#include +#include +#include +#include + +#define DASM_ARCH "arm" + +#ifndef DASM_EXTERN +#define DASM_EXTERN(a,b,c,d) 0 +#endif + +/* Action definitions. */ +enum { + DASM_STOP, DASM_SECTION, DASM_ESC, DASM_REL_EXT, + /* The following actions need a buffer position. */ + DASM_ALIGN, DASM_REL_LG, DASM_LABEL_LG, + /* The following actions also have an argument. */ + DASM_REL_PC, DASM_LABEL_PC, + DASM_IMM, DASM_IMM12, DASM_IMM16, DASM_IMML8, DASM_IMML12, DASM_IMMV8, + DASM__MAX +}; + +/* Maximum number of section buffer positions for a single dasm_put() call. */ +#define DASM_MAXSECPOS 25 + +/* DynASM encoder status codes. Action list offset or number are or'ed in. */ +#define DASM_S_OK 0x00000000 +#define DASM_S_NOMEM 0x01000000 +#define DASM_S_PHASE 0x02000000 +#define DASM_S_MATCH_SEC 0x03000000 +#define DASM_S_RANGE_I 0x11000000 +#define DASM_S_RANGE_SEC 0x12000000 +#define DASM_S_RANGE_LG 0x13000000 +#define DASM_S_RANGE_PC 0x14000000 +#define DASM_S_RANGE_REL 0x15000000 +#define DASM_S_UNDEF_LG 0x21000000 +#define DASM_S_UNDEF_PC 0x22000000 + +/* Macros to convert positions (8 bit section + 24 bit index). */ +#define DASM_POS2IDX(pos) ((pos)&0x00ffffff) +#define DASM_POS2BIAS(pos) ((pos)&0xff000000) +#define DASM_SEC2POS(sec) ((sec)<<24) +#define DASM_POS2SEC(pos) ((pos)>>24) +#define DASM_POS2PTR(D, pos) (D->sections[DASM_POS2SEC(pos)].rbuf + (pos)) + +/* Action list type. */ +typedef const unsigned int *dasm_ActList; + +/* Per-section structure. */ +typedef struct dasm_Section { + int *rbuf; /* Biased buffer pointer (negative section bias). */ + int *buf; /* True buffer pointer. */ + size_t bsize; /* Buffer size in bytes. */ + int pos; /* Biased buffer position. */ + int epos; /* End of biased buffer position - max single put. */ + int ofs; /* Byte offset into section. */ +} dasm_Section; + +/* Core structure holding the DynASM encoding state. */ +struct dasm_State { + size_t psize; /* Allocated size of this structure. */ + dasm_ActList actionlist; /* Current actionlist pointer. */ + int *lglabels; /* Local/global chain/pos ptrs. */ + size_t lgsize; + int *pclabels; /* PC label chains/pos ptrs. */ + size_t pcsize; + void **globals; /* Array of globals (bias -10). */ + dasm_Section *section; /* Pointer to active section. */ + size_t codesize; /* Total size of all code sections. */ + int maxsection; /* 0 <= sectionidx < maxsection. */ + int status; /* Status code. */ + dasm_Section sections[1]; /* All sections. Alloc-extended. */ +}; + +/* The size of the core structure depends on the max. number of sections. */ +#define DASM_PSZ(ms) (sizeof(dasm_State)+(ms-1)*sizeof(dasm_Section)) + + +/* Initialize DynASM state. */ +void dasm_init(Dst_DECL, int maxsection) +{ + dasm_State *D; + size_t psz = 0; + int i; + Dst_REF = NULL; + DASM_M_GROW(Dst, struct dasm_State, Dst_REF, psz, DASM_PSZ(maxsection)); + D = Dst_REF; + D->psize = psz; + D->lglabels = NULL; + D->lgsize = 0; + D->pclabels = NULL; + D->pcsize = 0; + D->globals = NULL; + D->maxsection = maxsection; + for (i = 0; i < maxsection; i++) { + D->sections[i].buf = NULL; /* Need this for pass3. */ + D->sections[i].rbuf = D->sections[i].buf - DASM_SEC2POS(i); + D->sections[i].bsize = 0; + D->sections[i].epos = 0; /* Wrong, but is recalculated after resize. */ + } +} + +/* Free DynASM state. */ +void dasm_free(Dst_DECL) +{ + dasm_State *D = Dst_REF; + int i; + for (i = 0; i < D->maxsection; i++) + if (D->sections[i].buf) + DASM_M_FREE(Dst, D->sections[i].buf, D->sections[i].bsize); + if (D->pclabels) DASM_M_FREE(Dst, D->pclabels, D->pcsize); + if (D->lglabels) DASM_M_FREE(Dst, D->lglabels, D->lgsize); + DASM_M_FREE(Dst, D, D->psize); +} + +/* Setup global label array. Must be called before dasm_setup(). */ +void dasm_setupglobal(Dst_DECL, void **gl, unsigned int maxgl) +{ + dasm_State *D = Dst_REF; + D->globals = gl - 10; /* Negative bias to compensate for locals. */ + DASM_M_GROW(Dst, int, D->lglabels, D->lgsize, (10+maxgl)*sizeof(int)); +} + +/* Grow PC label array. Can be called after dasm_setup(), too. */ +void dasm_growpc(Dst_DECL, unsigned int maxpc) +{ + dasm_State *D = Dst_REF; + size_t osz = D->pcsize; + DASM_M_GROW(Dst, int, D->pclabels, D->pcsize, maxpc*sizeof(int)); + memset((void *)(((unsigned char *)D->pclabels)+osz), 0, D->pcsize-osz); +} + +/* Setup encoder. */ +void dasm_setup(Dst_DECL, const void *actionlist) +{ + dasm_State *D = Dst_REF; + int i; + D->actionlist = (dasm_ActList)actionlist; + D->status = DASM_S_OK; + D->section = &D->sections[0]; + memset((void *)D->lglabels, 0, D->lgsize); + if (D->pclabels) memset((void *)D->pclabels, 0, D->pcsize); + for (i = 0; i < D->maxsection; i++) { + D->sections[i].pos = DASM_SEC2POS(i); + D->sections[i].ofs = 0; + } +} + + +#ifdef DASM_CHECKS +#define CK(x, st) \ + do { if (!(x)) { \ + D->status = DASM_S_##st|(p-D->actionlist-1); return; } } while (0) +#define CKPL(kind, st) \ + do { if ((size_t)((char *)pl-(char *)D->kind##labels) >= D->kind##size) { \ + D->status = DASM_S_RANGE_##st|(p-D->actionlist-1); return; } } while (0) +#else +#define CK(x, st) ((void)0) +#define CKPL(kind, st) ((void)0) +#endif + +static int dasm_imm12(unsigned int n) +{ + int i; + for (i = 0; i < 16; i++, n = (n << 2) | (n >> 30)) + if (n <= 255) return (int)(n + (i << 8)); + return -1; +} + +/* Pass 1: Store actions and args, link branches/labels, estimate offsets. */ +void dasm_put(Dst_DECL, int start, ...) +{ + va_list ap; + dasm_State *D = Dst_REF; + dasm_ActList p = D->actionlist + start; + dasm_Section *sec = D->section; + int pos = sec->pos, ofs = sec->ofs; + int *b; + + if (pos >= sec->epos) { + DASM_M_GROW(Dst, int, sec->buf, sec->bsize, + sec->bsize + 2*DASM_MAXSECPOS*sizeof(int)); + sec->rbuf = sec->buf - DASM_POS2BIAS(pos); + sec->epos = (int)sec->bsize/sizeof(int) - DASM_MAXSECPOS+DASM_POS2BIAS(pos); + } + + b = sec->rbuf; + b[pos++] = start; + + va_start(ap, start); + while (1) { + unsigned int ins = *p++; + unsigned int action = (ins >> 16); + if (action >= DASM__MAX) { + ofs += 4; + } else { + int *pl, n = action >= DASM_REL_PC ? va_arg(ap, int) : 0; + switch (action) { + case DASM_STOP: goto stop; + case DASM_SECTION: + n = (ins & 255); CK(n < D->maxsection, RANGE_SEC); + D->section = &D->sections[n]; goto stop; + case DASM_ESC: p++; ofs += 4; break; + case DASM_REL_EXT: break; + case DASM_ALIGN: ofs += (ins & 255); b[pos++] = ofs; break; + case DASM_REL_LG: + n = (ins & 2047) - 10; pl = D->lglabels + n; + /* Bkwd rel or global. */ + if (n >= 0) { CK(n>=10||*pl<0, RANGE_LG); CKPL(lg, LG); goto putrel; } + pl += 10; n = *pl; + if (n < 0) n = 0; /* Start new chain for fwd rel if label exists. */ + goto linkrel; + case DASM_REL_PC: + pl = D->pclabels + n; CKPL(pc, PC); + putrel: + n = *pl; + if (n < 0) { /* Label exists. Get label pos and store it. */ + b[pos] = -n; + } else { + linkrel: + b[pos] = n; /* Else link to rel chain, anchored at label. */ + *pl = pos; + } + pos++; + break; + case DASM_LABEL_LG: + pl = D->lglabels + (ins & 2047) - 10; CKPL(lg, LG); goto putlabel; + case DASM_LABEL_PC: + pl = D->pclabels + n; CKPL(pc, PC); + putlabel: + n = *pl; /* n > 0: Collapse rel chain and replace with label pos. */ + while (n > 0) { int *pb = DASM_POS2PTR(D, n); n = *pb; *pb = pos; + } + *pl = -pos; /* Label exists now. */ + b[pos++] = ofs; /* Store pass1 offset estimate. */ + break; + case DASM_IMM: + case DASM_IMM16: +#ifdef DASM_CHECKS + CK((n & ((1<<((ins>>10)&31))-1)) == 0, RANGE_I); + if ((ins & 0x8000)) + CK(((n + (1<<(((ins>>5)&31)-1)))>>((ins>>5)&31)) == 0, RANGE_I); + else + CK((n>>((ins>>5)&31)) == 0, RANGE_I); +#endif + b[pos++] = n; + break; + case DASM_IMMV8: + CK((n & 3) == 0, RANGE_I); + n >>= 2; + /* fallthrough */ + case DASM_IMML8: + case DASM_IMML12: + CK(n >= 0 ? ((n>>((ins>>5)&31)) == 0) : + (((-n)>>((ins>>5)&31)) == 0), RANGE_I); + b[pos++] = n; + break; + case DASM_IMM12: + CK(dasm_imm12((unsigned int)n) != -1, RANGE_I); + b[pos++] = n; + break; + } + } + } +stop: + va_end(ap); + sec->pos = pos; + sec->ofs = ofs; +} +#undef CK + +/* Pass 2: Link sections, shrink aligns, fix label offsets. */ +int dasm_link(Dst_DECL, size_t *szp) +{ + dasm_State *D = Dst_REF; + int secnum; + int ofs = 0; + +#ifdef DASM_CHECKS + *szp = 0; + if (D->status != DASM_S_OK) return D->status; + { + int pc; + for (pc = 0; pc*sizeof(int) < D->pcsize; pc++) + if (D->pclabels[pc] > 0) return DASM_S_UNDEF_PC|pc; + } +#endif + + { /* Handle globals not defined in this translation unit. */ + int idx; + for (idx = 20; idx*sizeof(int) < D->lgsize; idx++) { + int n = D->lglabels[idx]; + /* Undefined label: Collapse rel chain and replace with marker (< 0). */ + while (n > 0) { int *pb = DASM_POS2PTR(D, n); n = *pb; *pb = -idx; } + } + } + + /* Combine all code sections. No support for data sections (yet). */ + for (secnum = 0; secnum < D->maxsection; secnum++) { + dasm_Section *sec = D->sections + secnum; + int *b = sec->rbuf; + int pos = DASM_SEC2POS(secnum); + int lastpos = sec->pos; + + while (pos != lastpos) { + dasm_ActList p = D->actionlist + b[pos++]; + while (1) { + unsigned int ins = *p++; + unsigned int action = (ins >> 16); + switch (action) { + case DASM_STOP: case DASM_SECTION: goto stop; + case DASM_ESC: p++; break; + case DASM_REL_EXT: break; + case DASM_ALIGN: ofs -= (b[pos++] + ofs) & (ins & 255); break; + case DASM_REL_LG: case DASM_REL_PC: pos++; break; + case DASM_LABEL_LG: case DASM_LABEL_PC: b[pos++] += ofs; break; + case DASM_IMM: case DASM_IMM12: case DASM_IMM16: + case DASM_IMML8: case DASM_IMML12: case DASM_IMMV8: pos++; break; + } + } + stop: (void)0; + } + ofs += sec->ofs; /* Next section starts right after current section. */ + } + + D->codesize = ofs; /* Total size of all code sections */ + *szp = ofs; + return DASM_S_OK; +} + +#ifdef DASM_CHECKS +#define CK(x, st) \ + do { if (!(x)) return DASM_S_##st|(p-D->actionlist-1); } while (0) +#else +#define CK(x, st) ((void)0) +#endif + +/* Pass 3: Encode sections. */ +int dasm_encode(Dst_DECL, void *buffer) +{ + dasm_State *D = Dst_REF; + char *base = (char *)buffer; + unsigned int *cp = (unsigned int *)buffer; + int secnum; + + /* Encode all code sections. No support for data sections (yet). */ + for (secnum = 0; secnum < D->maxsection; secnum++) { + dasm_Section *sec = D->sections + secnum; + int *b = sec->buf; + int *endb = sec->rbuf + sec->pos; + + while (b != endb) { + dasm_ActList p = D->actionlist + *b++; + while (1) { + unsigned int ins = *p++; + unsigned int action = (ins >> 16); + int n = (action >= DASM_ALIGN && action < DASM__MAX) ? *b++ : 0; + switch (action) { + case DASM_STOP: case DASM_SECTION: goto stop; + case DASM_ESC: *cp++ = *p++; break; + case DASM_REL_EXT: + n = DASM_EXTERN(Dst, (unsigned char *)cp, (ins&2047), !(ins&2048)); + goto patchrel; + case DASM_ALIGN: + ins &= 255; while ((((char *)cp - base) & ins)) *cp++ = 0xe1a00000; + break; + case DASM_REL_LG: + CK(n >= 0, UNDEF_LG); + /* fallthrough */ + case DASM_REL_PC: + CK(n >= 0, UNDEF_PC); + n = *DASM_POS2PTR(D, n) - (int)((char *)cp - base) - 4; + patchrel: + if ((ins & 0x800) == 0) { + CK((n & 3) == 0 && ((n+0x02000000) >> 26) == 0, RANGE_REL); + cp[-1] |= ((n >> 2) & 0x00ffffff); + } else if ((ins & 0x1000)) { + CK((n & 3) == 0 && -256 <= n && n <= 256, RANGE_REL); + goto patchimml8; + } else if ((ins & 0x2000) == 0) { + CK((n & 3) == 0 && -4096 <= n && n <= 4096, RANGE_REL); + goto patchimml; + } else { + CK((n & 3) == 0 && -1020 <= n && n <= 1020, RANGE_REL); + n >>= 2; + goto patchimml; + } + break; + case DASM_LABEL_LG: + ins &= 2047; if (ins >= 20) D->globals[ins-10] = (void *)(base + n); + break; + case DASM_LABEL_PC: break; + case DASM_IMM: + cp[-1] |= ((n>>((ins>>10)&31)) & ((1<<((ins>>5)&31))-1)) << (ins&31); + break; + case DASM_IMM12: + cp[-1] |= dasm_imm12((unsigned int)n); + break; + case DASM_IMM16: + cp[-1] |= ((n & 0xf000) << 4) | (n & 0x0fff); + break; + case DASM_IMML8: patchimml8: + cp[-1] |= n >= 0 ? (0x00800000 | (n & 0x0f) | ((n & 0xf0) << 4)) : + ((-n & 0x0f) | ((-n & 0xf0) << 4)); + break; + case DASM_IMML12: case DASM_IMMV8: patchimml: + cp[-1] |= n >= 0 ? (0x00800000 | n) : (-n); + break; + default: *cp++ = ins; break; + } + } + stop: (void)0; + } + } + + if (base + D->codesize != (char *)cp) /* Check for phase errors. */ + return DASM_S_PHASE; + return DASM_S_OK; +} +#undef CK + +/* Get PC label offset. */ +int dasm_getpclabel(Dst_DECL, unsigned int pc) +{ + dasm_State *D = Dst_REF; + if (pc*sizeof(int) < D->pcsize) { + int pos = D->pclabels[pc]; + if (pos < 0) return *DASM_POS2PTR(D, -pos); + if (pos > 0) return -1; /* Undefined. */ + } + return -2; /* Unused or out of range. */ +} + +#ifdef DASM_CHECKS +/* Optional sanity checker to call between isolated encoding steps. */ +int dasm_checkstep(Dst_DECL, int secmatch) +{ + dasm_State *D = Dst_REF; + if (D->status == DASM_S_OK) { + int i; + for (i = 1; i <= 9; i++) { + if (D->lglabels[i] > 0) { D->status = DASM_S_UNDEF_LG|i; break; } + D->lglabels[i] = 0; + } + } + if (D->status == DASM_S_OK && secmatch >= 0 && + D->section != &D->sections[secmatch]) + D->status = DASM_S_MATCH_SEC|(D->section-D->sections); + return D->status; +} +#endif + diff --git a/lib/LuaJIT/dynasm/dasm_arm.lua b/lib/LuaJIT/dynasm/dasm_arm.lua new file mode 100644 index 0000000..32f595a --- /dev/null +++ b/lib/LuaJIT/dynasm/dasm_arm.lua @@ -0,0 +1,1125 @@ +------------------------------------------------------------------------------ +-- DynASM ARM module. +-- +-- Copyright (C) 2005-2017 Mike Pall. All rights reserved. +-- See dynasm.lua for full copyright notice. +------------------------------------------------------------------------------ + +-- Module information: +local _info = { + arch = "arm", + description = "DynASM ARM module", + version = "1.4.0", + vernum = 10400, + release = "2015-10-18", + author = "Mike Pall", + license = "MIT", +} + +-- Exported glue functions for the arch-specific module. +local _M = { _info = _info } + +-- Cache library functions. +local type, tonumber, pairs, ipairs = type, tonumber, pairs, ipairs +local assert, setmetatable, rawget = assert, setmetatable, rawget +local _s = string +local sub, format, byte, char = _s.sub, _s.format, _s.byte, _s.char +local match, gmatch, gsub = _s.match, _s.gmatch, _s.gsub +local concat, sort, insert = table.concat, table.sort, table.insert +local bit = bit or require("bit") +local band, shl, shr, sar = bit.band, bit.lshift, bit.rshift, bit.arshift +local ror, tohex = bit.ror, bit.tohex + +-- Inherited tables and callbacks. +local g_opt, g_arch +local wline, werror, wfatal, wwarn + +-- Action name list. +-- CHECK: Keep this in sync with the C code! +local action_names = { + "STOP", "SECTION", "ESC", "REL_EXT", + "ALIGN", "REL_LG", "LABEL_LG", + "REL_PC", "LABEL_PC", "IMM", "IMM12", "IMM16", "IMML8", "IMML12", "IMMV8", +} + +-- Maximum number of section buffer positions for dasm_put(). +-- CHECK: Keep this in sync with the C code! +local maxsecpos = 25 -- Keep this low, to avoid excessively long C lines. + +-- Action name -> action number. +local map_action = {} +for n,name in ipairs(action_names) do + map_action[name] = n-1 +end + +-- Action list buffer. +local actlist = {} + +-- Argument list for next dasm_put(). Start with offset 0 into action list. +local actargs = { 0 } + +-- Current number of section buffer positions for dasm_put(). +local secpos = 1 + +------------------------------------------------------------------------------ + +-- Dump action names and numbers. +local function dumpactions(out) + out:write("DynASM encoding engine action codes:\n") + for n,name in ipairs(action_names) do + local num = map_action[name] + out:write(format(" %-10s %02X %d\n", name, num, num)) + end + out:write("\n") +end + +-- Write action list buffer as a huge static C array. +local function writeactions(out, name) + local nn = #actlist + if nn == 0 then nn = 1; actlist[0] = map_action.STOP end + out:write("static const unsigned int ", name, "[", nn, "] = {\n") + for i = 1,nn-1 do + assert(out:write("0x", tohex(actlist[i]), ",\n")) + end + assert(out:write("0x", tohex(actlist[nn]), "\n};\n\n")) +end + +------------------------------------------------------------------------------ + +-- Add word to action list. +local function wputxw(n) + assert(n >= 0 and n <= 0xffffffff and n % 1 == 0, "word out of range") + actlist[#actlist+1] = n +end + +-- Add action to list with optional arg. Advance buffer pos, too. +local function waction(action, val, a, num) + local w = assert(map_action[action], "bad action name `"..action.."'") + wputxw(w * 0x10000 + (val or 0)) + if a then actargs[#actargs+1] = a end + if a or num then secpos = secpos + (num or 1) end +end + +-- Flush action list (intervening C code or buffer pos overflow). +local function wflush(term) + if #actlist == actargs[1] then return end -- Nothing to flush. + if not term then waction("STOP") end -- Terminate action list. + wline(format("dasm_put(Dst, %s);", concat(actargs, ", ")), true) + actargs = { #actlist } -- Actionlist offset is 1st arg to next dasm_put(). + secpos = 1 -- The actionlist offset occupies a buffer position, too. +end + +-- Put escaped word. +local function wputw(n) + if n <= 0x000fffff then waction("ESC") end + wputxw(n) +end + +-- Reserve position for word. +local function wpos() + local pos = #actlist+1 + actlist[pos] = "" + return pos +end + +-- Store word to reserved position. +local function wputpos(pos, n) + assert(n >= 0 and n <= 0xffffffff and n % 1 == 0, "word out of range") + if n <= 0x000fffff then + insert(actlist, pos+1, n) + n = map_action.ESC * 0x10000 + end + actlist[pos] = n +end + +------------------------------------------------------------------------------ + +-- Global label name -> global label number. With auto assignment on 1st use. +local next_global = 20 +local map_global = setmetatable({}, { __index = function(t, name) + if not match(name, "^[%a_][%w_]*$") then werror("bad global label") end + local n = next_global + if n > 2047 then werror("too many global labels") end + next_global = n + 1 + t[name] = n + return n +end}) + +-- Dump global labels. +local function dumpglobals(out, lvl) + local t = {} + for name, n in pairs(map_global) do t[n] = name end + out:write("Global labels:\n") + for i=20,next_global-1 do + out:write(format(" %s\n", t[i])) + end + out:write("\n") +end + +-- Write global label enum. +local function writeglobals(out, prefix) + local t = {} + for name, n in pairs(map_global) do t[n] = name end + out:write("enum {\n") + for i=20,next_global-1 do + out:write(" ", prefix, t[i], ",\n") + end + out:write(" ", prefix, "_MAX\n};\n") +end + +-- Write global label names. +local function writeglobalnames(out, name) + local t = {} + for name, n in pairs(map_global) do t[n] = name end + out:write("static const char *const ", name, "[] = {\n") + for i=20,next_global-1 do + out:write(" \"", t[i], "\",\n") + end + out:write(" (const char *)0\n};\n") +end + +------------------------------------------------------------------------------ + +-- Extern label name -> extern label number. With auto assignment on 1st use. +local next_extern = 0 +local map_extern_ = {} +local map_extern = setmetatable({}, { __index = function(t, name) + -- No restrictions on the name for now. + local n = next_extern + if n > 2047 then werror("too many extern labels") end + next_extern = n + 1 + t[name] = n + map_extern_[n] = name + return n +end}) + +-- Dump extern labels. +local function dumpexterns(out, lvl) + out:write("Extern labels:\n") + for i=0,next_extern-1 do + out:write(format(" %s\n", map_extern_[i])) + end + out:write("\n") +end + +-- Write extern label names. +local function writeexternnames(out, name) + out:write("static const char *const ", name, "[] = {\n") + for i=0,next_extern-1 do + out:write(" \"", map_extern_[i], "\",\n") + end + out:write(" (const char *)0\n};\n") +end + +------------------------------------------------------------------------------ + +-- Arch-specific maps. + +-- Ext. register name -> int. name. +local map_archdef = { sp = "r13", lr = "r14", pc = "r15", } + +-- Int. register name -> ext. name. +local map_reg_rev = { r13 = "sp", r14 = "lr", r15 = "pc", } + +local map_type = {} -- Type name -> { ctype, reg } +local ctypenum = 0 -- Type number (for Dt... macros). + +-- Reverse defines for registers. +function _M.revdef(s) + return map_reg_rev[s] or s +end + +local map_shift = { lsl = 0, lsr = 1, asr = 2, ror = 3, } + +local map_cond = { + eq = 0, ne = 1, cs = 2, cc = 3, mi = 4, pl = 5, vs = 6, vc = 7, + hi = 8, ls = 9, ge = 10, lt = 11, gt = 12, le = 13, al = 14, + hs = 2, lo = 3, +} + +------------------------------------------------------------------------------ + +-- Template strings for ARM instructions. +local map_op = { + -- Basic data processing instructions. + and_3 = "e0000000DNPs", + eor_3 = "e0200000DNPs", + sub_3 = "e0400000DNPs", + rsb_3 = "e0600000DNPs", + add_3 = "e0800000DNPs", + adc_3 = "e0a00000DNPs", + sbc_3 = "e0c00000DNPs", + rsc_3 = "e0e00000DNPs", + tst_2 = "e1100000NP", + teq_2 = "e1300000NP", + cmp_2 = "e1500000NP", + cmn_2 = "e1700000NP", + orr_3 = "e1800000DNPs", + mov_2 = "e1a00000DPs", + bic_3 = "e1c00000DNPs", + mvn_2 = "e1e00000DPs", + + and_4 = "e0000000DNMps", + eor_4 = "e0200000DNMps", + sub_4 = "e0400000DNMps", + rsb_4 = "e0600000DNMps", + add_4 = "e0800000DNMps", + adc_4 = "e0a00000DNMps", + sbc_4 = "e0c00000DNMps", + rsc_4 = "e0e00000DNMps", + tst_3 = "e1100000NMp", + teq_3 = "e1300000NMp", + cmp_3 = "e1500000NMp", + cmn_3 = "e1700000NMp", + orr_4 = "e1800000DNMps", + mov_3 = "e1a00000DMps", + bic_4 = "e1c00000DNMps", + mvn_3 = "e1e00000DMps", + + lsl_3 = "e1a00000DMws", + lsr_3 = "e1a00020DMws", + asr_3 = "e1a00040DMws", + ror_3 = "e1a00060DMws", + rrx_2 = "e1a00060DMs", + + -- Multiply and multiply-accumulate. + mul_3 = "e0000090NMSs", + mla_4 = "e0200090NMSDs", + umaal_4 = "e0400090DNMSs", -- v6 + mls_4 = "e0600090DNMSs", -- v6T2 + umull_4 = "e0800090DNMSs", + umlal_4 = "e0a00090DNMSs", + smull_4 = "e0c00090DNMSs", + smlal_4 = "e0e00090DNMSs", + + -- Halfword multiply and multiply-accumulate. + smlabb_4 = "e1000080NMSD", -- v5TE + smlatb_4 = "e10000a0NMSD", -- v5TE + smlabt_4 = "e10000c0NMSD", -- v5TE + smlatt_4 = "e10000e0NMSD", -- v5TE + smlawb_4 = "e1200080NMSD", -- v5TE + smulwb_3 = "e12000a0NMS", -- v5TE + smlawt_4 = "e12000c0NMSD", -- v5TE + smulwt_3 = "e12000e0NMS", -- v5TE + smlalbb_4 = "e1400080NMSD", -- v5TE + smlaltb_4 = "e14000a0NMSD", -- v5TE + smlalbt_4 = "e14000c0NMSD", -- v5TE + smlaltt_4 = "e14000e0NMSD", -- v5TE + smulbb_3 = "e1600080NMS", -- v5TE + smultb_3 = "e16000a0NMS", -- v5TE + smulbt_3 = "e16000c0NMS", -- v5TE + smultt_3 = "e16000e0NMS", -- v5TE + + -- Miscellaneous data processing instructions. + clz_2 = "e16f0f10DM", -- v5T + rev_2 = "e6bf0f30DM", -- v6 + rev16_2 = "e6bf0fb0DM", -- v6 + revsh_2 = "e6ff0fb0DM", -- v6 + sel_3 = "e6800fb0DNM", -- v6 + usad8_3 = "e780f010NMS", -- v6 + usada8_4 = "e7800010NMSD", -- v6 + rbit_2 = "e6ff0f30DM", -- v6T2 + movw_2 = "e3000000DW", -- v6T2 + movt_2 = "e3400000DW", -- v6T2 + -- Note: the X encodes width-1, not width. + sbfx_4 = "e7a00050DMvX", -- v6T2 + ubfx_4 = "e7e00050DMvX", -- v6T2 + -- Note: the X encodes the msb field, not the width. + bfc_3 = "e7c0001fDvX", -- v6T2 + bfi_4 = "e7c00010DMvX", -- v6T2 + + -- Packing and unpacking instructions. + pkhbt_3 = "e6800010DNM", pkhbt_4 = "e6800010DNMv", -- v6 + pkhtb_3 = "e6800050DNM", pkhtb_4 = "e6800050DNMv", -- v6 + sxtab_3 = "e6a00070DNM", sxtab_4 = "e6a00070DNMv", -- v6 + sxtab16_3 = "e6800070DNM", sxtab16_4 = "e6800070DNMv", -- v6 + sxtah_3 = "e6b00070DNM", sxtah_4 = "e6b00070DNMv", -- v6 + sxtb_2 = "e6af0070DM", sxtb_3 = "e6af0070DMv", -- v6 + sxtb16_2 = "e68f0070DM", sxtb16_3 = "e68f0070DMv", -- v6 + sxth_2 = "e6bf0070DM", sxth_3 = "e6bf0070DMv", -- v6 + uxtab_3 = "e6e00070DNM", uxtab_4 = "e6e00070DNMv", -- v6 + uxtab16_3 = "e6c00070DNM", uxtab16_4 = "e6c00070DNMv", -- v6 + uxtah_3 = "e6f00070DNM", uxtah_4 = "e6f00070DNMv", -- v6 + uxtb_2 = "e6ef0070DM", uxtb_3 = "e6ef0070DMv", -- v6 + uxtb16_2 = "e6cf0070DM", uxtb16_3 = "e6cf0070DMv", -- v6 + uxth_2 = "e6ff0070DM", uxth_3 = "e6ff0070DMv", -- v6 + + -- Saturating instructions. + qadd_3 = "e1000050DMN", -- v5TE + qsub_3 = "e1200050DMN", -- v5TE + qdadd_3 = "e1400050DMN", -- v5TE + qdsub_3 = "e1600050DMN", -- v5TE + -- Note: the X for ssat* encodes sat_imm-1, not sat_imm. + ssat_3 = "e6a00010DXM", ssat_4 = "e6a00010DXMp", -- v6 + usat_3 = "e6e00010DXM", usat_4 = "e6e00010DXMp", -- v6 + ssat16_3 = "e6a00f30DXM", -- v6 + usat16_3 = "e6e00f30DXM", -- v6 + + -- Parallel addition and subtraction. + sadd16_3 = "e6100f10DNM", -- v6 + sasx_3 = "e6100f30DNM", -- v6 + ssax_3 = "e6100f50DNM", -- v6 + ssub16_3 = "e6100f70DNM", -- v6 + sadd8_3 = "e6100f90DNM", -- v6 + ssub8_3 = "e6100ff0DNM", -- v6 + qadd16_3 = "e6200f10DNM", -- v6 + qasx_3 = "e6200f30DNM", -- v6 + qsax_3 = "e6200f50DNM", -- v6 + qsub16_3 = "e6200f70DNM", -- v6 + qadd8_3 = "e6200f90DNM", -- v6 + qsub8_3 = "e6200ff0DNM", -- v6 + shadd16_3 = "e6300f10DNM", -- v6 + shasx_3 = "e6300f30DNM", -- v6 + shsax_3 = "e6300f50DNM", -- v6 + shsub16_3 = "e6300f70DNM", -- v6 + shadd8_3 = "e6300f90DNM", -- v6 + shsub8_3 = "e6300ff0DNM", -- v6 + uadd16_3 = "e6500f10DNM", -- v6 + uasx_3 = "e6500f30DNM", -- v6 + usax_3 = "e6500f50DNM", -- v6 + usub16_3 = "e6500f70DNM", -- v6 + uadd8_3 = "e6500f90DNM", -- v6 + usub8_3 = "e6500ff0DNM", -- v6 + uqadd16_3 = "e6600f10DNM", -- v6 + uqasx_3 = "e6600f30DNM", -- v6 + uqsax_3 = "e6600f50DNM", -- v6 + uqsub16_3 = "e6600f70DNM", -- v6 + uqadd8_3 = "e6600f90DNM", -- v6 + uqsub8_3 = "e6600ff0DNM", -- v6 + uhadd16_3 = "e6700f10DNM", -- v6 + uhasx_3 = "e6700f30DNM", -- v6 + uhsax_3 = "e6700f50DNM", -- v6 + uhsub16_3 = "e6700f70DNM", -- v6 + uhadd8_3 = "e6700f90DNM", -- v6 + uhsub8_3 = "e6700ff0DNM", -- v6 + + -- Load/store instructions. + str_2 = "e4000000DL", str_3 = "e4000000DL", str_4 = "e4000000DL", + strb_2 = "e4400000DL", strb_3 = "e4400000DL", strb_4 = "e4400000DL", + ldr_2 = "e4100000DL", ldr_3 = "e4100000DL", ldr_4 = "e4100000DL", + ldrb_2 = "e4500000DL", ldrb_3 = "e4500000DL", ldrb_4 = "e4500000DL", + strh_2 = "e00000b0DL", strh_3 = "e00000b0DL", + ldrh_2 = "e01000b0DL", ldrh_3 = "e01000b0DL", + ldrd_2 = "e00000d0DL", ldrd_3 = "e00000d0DL", -- v5TE + ldrsb_2 = "e01000d0DL", ldrsb_3 = "e01000d0DL", + strd_2 = "e00000f0DL", strd_3 = "e00000f0DL", -- v5TE + ldrsh_2 = "e01000f0DL", ldrsh_3 = "e01000f0DL", + + ldm_2 = "e8900000oR", ldmia_2 = "e8900000oR", ldmfd_2 = "e8900000oR", + ldmda_2 = "e8100000oR", ldmfa_2 = "e8100000oR", + ldmdb_2 = "e9100000oR", ldmea_2 = "e9100000oR", + ldmib_2 = "e9900000oR", ldmed_2 = "e9900000oR", + stm_2 = "e8800000oR", stmia_2 = "e8800000oR", stmfd_2 = "e8800000oR", + stmda_2 = "e8000000oR", stmfa_2 = "e8000000oR", + stmdb_2 = "e9000000oR", stmea_2 = "e9000000oR", + stmib_2 = "e9800000oR", stmed_2 = "e9800000oR", + pop_1 = "e8bd0000R", push_1 = "e92d0000R", + + -- Branch instructions. + b_1 = "ea000000B", + bl_1 = "eb000000B", + blx_1 = "e12fff30C", + bx_1 = "e12fff10M", + + -- Miscellaneous instructions. + nop_0 = "e1a00000", + mrs_1 = "e10f0000D", + bkpt_1 = "e1200070K", -- v5T + svc_1 = "ef000000T", swi_1 = "ef000000T", + ud_0 = "e7f001f0", + + -- VFP instructions. + ["vadd.f32_3"] = "ee300a00dnm", + ["vadd.f64_3"] = "ee300b00Gdnm", + ["vsub.f32_3"] = "ee300a40dnm", + ["vsub.f64_3"] = "ee300b40Gdnm", + ["vmul.f32_3"] = "ee200a00dnm", + ["vmul.f64_3"] = "ee200b00Gdnm", + ["vnmul.f32_3"] = "ee200a40dnm", + ["vnmul.f64_3"] = "ee200b40Gdnm", + ["vmla.f32_3"] = "ee000a00dnm", + ["vmla.f64_3"] = "ee000b00Gdnm", + ["vmls.f32_3"] = "ee000a40dnm", + ["vmls.f64_3"] = "ee000b40Gdnm", + ["vnmla.f32_3"] = "ee100a40dnm", + ["vnmla.f64_3"] = "ee100b40Gdnm", + ["vnmls.f32_3"] = "ee100a00dnm", + ["vnmls.f64_3"] = "ee100b00Gdnm", + ["vdiv.f32_3"] = "ee800a00dnm", + ["vdiv.f64_3"] = "ee800b00Gdnm", + + ["vabs.f32_2"] = "eeb00ac0dm", + ["vabs.f64_2"] = "eeb00bc0Gdm", + ["vneg.f32_2"] = "eeb10a40dm", + ["vneg.f64_2"] = "eeb10b40Gdm", + ["vsqrt.f32_2"] = "eeb10ac0dm", + ["vsqrt.f64_2"] = "eeb10bc0Gdm", + ["vcmp.f32_2"] = "eeb40a40dm", + ["vcmp.f64_2"] = "eeb40b40Gdm", + ["vcmpe.f32_2"] = "eeb40ac0dm", + ["vcmpe.f64_2"] = "eeb40bc0Gdm", + ["vcmpz.f32_1"] = "eeb50a40d", + ["vcmpz.f64_1"] = "eeb50b40Gd", + ["vcmpze.f32_1"] = "eeb50ac0d", + ["vcmpze.f64_1"] = "eeb50bc0Gd", + + vldr_2 = "ed100a00dl|ed100b00Gdl", + vstr_2 = "ed000a00dl|ed000b00Gdl", + vldm_2 = "ec900a00or", + vldmia_2 = "ec900a00or", + vldmdb_2 = "ed100a00or", + vpop_1 = "ecbd0a00r", + vstm_2 = "ec800a00or", + vstmia_2 = "ec800a00or", + vstmdb_2 = "ed000a00or", + vpush_1 = "ed2d0a00r", + + ["vmov.f32_2"] = "eeb00a40dm|eeb00a00dY", -- #imm is VFPv3 only + ["vmov.f64_2"] = "eeb00b40Gdm|eeb00b00GdY", -- #imm is VFPv3 only + vmov_2 = "ee100a10Dn|ee000a10nD", + vmov_3 = "ec500a10DNm|ec400a10mDN|ec500b10GDNm|ec400b10GmDN", + + vmrs_0 = "eef1fa10", + vmrs_1 = "eef10a10D", + vmsr_1 = "eee10a10D", + + ["vcvt.s32.f32_2"] = "eebd0ac0dm", + ["vcvt.s32.f64_2"] = "eebd0bc0dGm", + ["vcvt.u32.f32_2"] = "eebc0ac0dm", + ["vcvt.u32.f64_2"] = "eebc0bc0dGm", + ["vcvtr.s32.f32_2"] = "eebd0a40dm", + ["vcvtr.s32.f64_2"] = "eebd0b40dGm", + ["vcvtr.u32.f32_2"] = "eebc0a40dm", + ["vcvtr.u32.f64_2"] = "eebc0b40dGm", + ["vcvt.f32.s32_2"] = "eeb80ac0dm", + ["vcvt.f64.s32_2"] = "eeb80bc0GdFm", + ["vcvt.f32.u32_2"] = "eeb80a40dm", + ["vcvt.f64.u32_2"] = "eeb80b40GdFm", + ["vcvt.f32.f64_2"] = "eeb70bc0dGm", + ["vcvt.f64.f32_2"] = "eeb70ac0GdFm", + + -- VFPv4 only: + ["vfma.f32_3"] = "eea00a00dnm", + ["vfma.f64_3"] = "eea00b00Gdnm", + ["vfms.f32_3"] = "eea00a40dnm", + ["vfms.f64_3"] = "eea00b40Gdnm", + ["vfnma.f32_3"] = "ee900a40dnm", + ["vfnma.f64_3"] = "ee900b40Gdnm", + ["vfnms.f32_3"] = "ee900a00dnm", + ["vfnms.f64_3"] = "ee900b00Gdnm", + + -- NYI: Advanced SIMD instructions. + + -- NYI: I have no need for these instructions right now: + -- swp, swpb, strex, ldrex, strexd, ldrexd, strexb, ldrexb, strexh, ldrexh + -- msr, nopv6, yield, wfe, wfi, sev, dbg, bxj, smc, srs, rfe + -- cps, setend, pli, pld, pldw, clrex, dsb, dmb, isb + -- stc, ldc, mcr, mcr2, mrc, mrc2, mcrr, mcrr2, mrrc, mrrc2, cdp, cdp2 +} + +-- Add mnemonics for "s" variants. +do + local t = {} + for k,v in pairs(map_op) do + if sub(v, -1) == "s" then + local v2 = sub(v, 1, 2)..char(byte(v, 3)+1)..sub(v, 4, -2) + t[sub(k, 1, -3).."s"..sub(k, -2)] = v2 + end + end + for k,v in pairs(t) do + map_op[k] = v + end +end + +------------------------------------------------------------------------------ + +local function parse_gpr(expr) + local tname, ovreg = match(expr, "^([%w_]+):(r1?[0-9])$") + local tp = map_type[tname or expr] + if tp then + local reg = ovreg or tp.reg + if not reg then + werror("type `"..(tname or expr).."' needs a register override") + end + expr = reg + end + local r = match(expr, "^r(1?[0-9])$") + if r then + r = tonumber(r) + if r <= 15 then return r, tp end + end + werror("bad register name `"..expr.."'") +end + +local function parse_gpr_pm(expr) + local pm, expr2 = match(expr, "^([+-]?)(.*)$") + return parse_gpr(expr2), (pm == "-") +end + +local function parse_vr(expr, tp) + local t, r = match(expr, "^([sd])([0-9]+)$") + if t == tp then + r = tonumber(r) + if r <= 31 then + if t == "s" then return shr(r, 1), band(r, 1) end + return band(r, 15), shr(r, 4) + end + end + werror("bad register name `"..expr.."'") +end + +local function parse_reglist(reglist) + reglist = match(reglist, "^{%s*([^}]*)}$") + if not reglist then werror("register list expected") end + local rr = 0 + for p in gmatch(reglist..",", "%s*([^,]*),") do + local rbit = shl(1, parse_gpr(gsub(p, "%s+$", ""))) + if band(rr, rbit) ~= 0 then + werror("duplicate register `"..p.."'") + end + rr = rr + rbit + end + return rr +end + +local function parse_vrlist(reglist) + local ta, ra, tb, rb = match(reglist, + "^{%s*([sd])([0-9]+)%s*%-%s*([sd])([0-9]+)%s*}$") + ra, rb = tonumber(ra), tonumber(rb) + if ta and ta == tb and ra and rb and ra <= 31 and rb <= 31 and ra <= rb then + local nr = rb+1 - ra + if ta == "s" then + return shl(shr(ra,1),12)+shl(band(ra,1),22) + nr + else + return shl(band(ra,15),12)+shl(shr(ra,4),22) + nr*2 + 0x100 + end + end + werror("register list expected") +end + +local function parse_imm(imm, bits, shift, scale, signed) + imm = match(imm, "^#(.*)$") + if not imm then werror("expected immediate operand") end + local n = tonumber(imm) + if n then + local m = sar(n, scale) + if shl(m, scale) == n then + if signed then + local s = sar(m, bits-1) + if s == 0 then return shl(m, shift) + elseif s == -1 then return shl(m + shl(1, bits), shift) end + else + if sar(m, bits) == 0 then return shl(m, shift) end + end + end + werror("out of range immediate `"..imm.."'") + else + waction("IMM", (signed and 32768 or 0)+scale*1024+bits*32+shift, imm) + return 0 + end +end + +local function parse_imm12(imm) + local n = tonumber(imm) + if n then + local m = band(n) + for i=0,-15,-1 do + if shr(m, 8) == 0 then return m + shl(band(i, 15), 8) end + m = ror(m, 2) + end + werror("out of range immediate `"..imm.."'") + else + waction("IMM12", 0, imm) + return 0 + end +end + +local function parse_imm16(imm) + imm = match(imm, "^#(.*)$") + if not imm then werror("expected immediate operand") end + local n = tonumber(imm) + if n then + if shr(n, 16) == 0 then return band(n, 0x0fff) + shl(band(n, 0xf000), 4) end + werror("out of range immediate `"..imm.."'") + else + waction("IMM16", 32*16, imm) + return 0 + end +end + +local function parse_imm_load(imm, ext) + local n = tonumber(imm) + if n then + if ext then + if n >= -255 and n <= 255 then + local up = 0x00800000 + if n < 0 then n = -n; up = 0 end + return shl(band(n, 0xf0), 4) + band(n, 0x0f) + up + end + else + if n >= -4095 and n <= 4095 then + if n >= 0 then return n+0x00800000 end + return -n + end + end + werror("out of range immediate `"..imm.."'") + else + waction(ext and "IMML8" or "IMML12", 32768 + shl(ext and 8 or 12, 5), imm) + return 0 + end +end + +local function parse_shift(shift, gprok) + if shift == "rrx" then + return 3 * 32 + else + local s, s2 = match(shift, "^(%S+)%s*(.*)$") + s = map_shift[s] + if not s then werror("expected shift operand") end + if sub(s2, 1, 1) == "#" then + return parse_imm(s2, 5, 7, 0, false) + shl(s, 5) + else + if not gprok then werror("expected immediate shift operand") end + return shl(parse_gpr(s2), 8) + shl(s, 5) + 16 + end + end +end + +local function parse_label(label, def) + local prefix = sub(label, 1, 2) + -- =>label (pc label reference) + if prefix == "=>" then + return "PC", 0, sub(label, 3) + end + -- ->name (global label reference) + if prefix == "->" then + return "LG", map_global[sub(label, 3)] + end + if def then + -- [1-9] (local label definition) + if match(label, "^[1-9]$") then + return "LG", 10+tonumber(label) + end + else + -- [<>][1-9] (local label reference) + local dir, lnum = match(label, "^([<>])([1-9])$") + if dir then -- Fwd: 1-9, Bkwd: 11-19. + return "LG", lnum + (dir == ">" and 0 or 10) + end + -- extern label (extern label reference) + local extname = match(label, "^extern%s+(%S+)$") + if extname then + return "EXT", map_extern[extname] + end + end + werror("bad label `"..label.."'") +end + +local function parse_load(params, nparams, n, op) + local oplo = band(op, 255) + local ext, ldrd = (oplo ~= 0), (oplo == 208) + local d + if (ldrd or oplo == 240) then + d = band(shr(op, 12), 15) + if band(d, 1) ~= 0 then werror("odd destination register") end + end + local pn = params[n] + local p1, wb = match(pn, "^%[%s*(.-)%s*%](!?)$") + local p2 = params[n+1] + if not p1 then + if not p2 then + if match(pn, "^[<>=%-]") or match(pn, "^extern%s+") then + local mode, n, s = parse_label(pn, false) + waction("REL_"..mode, n + (ext and 0x1800 or 0x0800), s, 1) + return op + 15 * 65536 + 0x01000000 + (ext and 0x00400000 or 0) + end + local reg, tailr = match(pn, "^([%w_:]+)%s*(.*)$") + if reg and tailr ~= "" then + local d, tp = parse_gpr(reg) + if tp then + waction(ext and "IMML8" or "IMML12", 32768 + 32*(ext and 8 or 12), + format(tp.ctypefmt, tailr)) + return op + shl(d, 16) + 0x01000000 + (ext and 0x00400000 or 0) + end + end + end + werror("expected address operand") + end + if wb == "!" then op = op + 0x00200000 end + if p2 then + if wb == "!" then werror("bad use of '!'") end + local p3 = params[n+2] + op = op + shl(parse_gpr(p1), 16) + local imm = match(p2, "^#(.*)$") + if imm then + local m = parse_imm_load(imm, ext) + if p3 then werror("too many parameters") end + op = op + m + (ext and 0x00400000 or 0) + else + local m, neg = parse_gpr_pm(p2) + if ldrd and (m == d or m-1 == d) then werror("register conflict") end + op = op + m + (neg and 0 or 0x00800000) + (ext and 0 or 0x02000000) + if p3 then op = op + parse_shift(p3) end + end + else + local p1a, p2 = match(p1, "^([^,%s]*)%s*(.*)$") + op = op + shl(parse_gpr(p1a), 16) + 0x01000000 + if p2 ~= "" then + local imm = match(p2, "^,%s*#(.*)$") + if imm then + local m = parse_imm_load(imm, ext) + op = op + m + (ext and 0x00400000 or 0) + else + local p2a, p3 = match(p2, "^,%s*([^,%s]*)%s*,?%s*(.*)$") + local m, neg = parse_gpr_pm(p2a) + if ldrd and (m == d or m-1 == d) then werror("register conflict") end + op = op + m + (neg and 0 or 0x00800000) + (ext and 0 or 0x02000000) + if p3 ~= "" then + if ext then werror("too many parameters") end + op = op + parse_shift(p3) + end + end + else + if wb == "!" then werror("bad use of '!'") end + op = op + (ext and 0x00c00000 or 0x00800000) + end + end + return op +end + +local function parse_vload(q) + local reg, imm = match(q, "^%[%s*([^,%s]*)%s*(.*)%]$") + if reg then + local d = shl(parse_gpr(reg), 16) + if imm == "" then return d end + imm = match(imm, "^,%s*#(.*)$") + if imm then + local n = tonumber(imm) + if n then + if n >= -1020 and n <= 1020 and n%4 == 0 then + return d + (n >= 0 and n/4+0x00800000 or -n/4) + end + werror("out of range immediate `"..imm.."'") + else + waction("IMMV8", 32768 + 32*8, imm) + return d + end + end + else + if match(q, "^[<>=%-]") or match(q, "^extern%s+") then + local mode, n, s = parse_label(q, false) + waction("REL_"..mode, n + 0x2800, s, 1) + return 15 * 65536 + end + local reg, tailr = match(q, "^([%w_:]+)%s*(.*)$") + if reg and tailr ~= "" then + local d, tp = parse_gpr(reg) + if tp then + waction("IMMV8", 32768 + 32*8, format(tp.ctypefmt, tailr)) + return shl(d, 16) + end + end + end + werror("expected address operand") +end + +------------------------------------------------------------------------------ + +-- Handle opcodes defined with template strings. +local function parse_template(params, template, nparams, pos) + local op = tonumber(sub(template, 1, 8), 16) + local n = 1 + local vr = "s" + + -- Process each character. + for p in gmatch(sub(template, 9), ".") do + local q = params[n] + if p == "D" then + op = op + shl(parse_gpr(q), 12); n = n + 1 + elseif p == "N" then + op = op + shl(parse_gpr(q), 16); n = n + 1 + elseif p == "S" then + op = op + shl(parse_gpr(q), 8); n = n + 1 + elseif p == "M" then + op = op + parse_gpr(q); n = n + 1 + elseif p == "d" then + local r,h = parse_vr(q, vr); op = op+shl(r,12)+shl(h,22); n = n + 1 + elseif p == "n" then + local r,h = parse_vr(q, vr); op = op+shl(r,16)+shl(h,7); n = n + 1 + elseif p == "m" then + local r,h = parse_vr(q, vr); op = op+r+shl(h,5); n = n + 1 + elseif p == "P" then + local imm = match(q, "^#(.*)$") + if imm then + op = op + parse_imm12(imm) + 0x02000000 + else + op = op + parse_gpr(q) + end + n = n + 1 + elseif p == "p" then + op = op + parse_shift(q, true); n = n + 1 + elseif p == "L" then + op = parse_load(params, nparams, n, op) + elseif p == "l" then + op = op + parse_vload(q) + elseif p == "B" then + local mode, n, s = parse_label(q, false) + waction("REL_"..mode, n, s, 1) + elseif p == "C" then -- blx gpr vs. blx label. + if match(q, "^([%w_]+):(r1?[0-9])$") or match(q, "^r(1?[0-9])$") then + op = op + parse_gpr(q) + else + if op < 0xe0000000 then werror("unconditional instruction") end + local mode, n, s = parse_label(q, false) + waction("REL_"..mode, n, s, 1) + op = 0xfa000000 + end + elseif p == "F" then + vr = "s" + elseif p == "G" then + vr = "d" + elseif p == "o" then + local r, wb = match(q, "^([^!]*)(!?)$") + op = op + shl(parse_gpr(r), 16) + (wb == "!" and 0x00200000 or 0) + n = n + 1 + elseif p == "R" then + op = op + parse_reglist(q); n = n + 1 + elseif p == "r" then + op = op + parse_vrlist(q); n = n + 1 + elseif p == "W" then + op = op + parse_imm16(q); n = n + 1 + elseif p == "v" then + op = op + parse_imm(q, 5, 7, 0, false); n = n + 1 + elseif p == "w" then + local imm = match(q, "^#(.*)$") + if imm then + op = op + parse_imm(q, 5, 7, 0, false); n = n + 1 + else + op = op + shl(parse_gpr(q), 8) + 16 + end + elseif p == "X" then + op = op + parse_imm(q, 5, 16, 0, false); n = n + 1 + elseif p == "Y" then + local imm = tonumber(match(q, "^#(.*)$")); n = n + 1 + if not imm or shr(imm, 8) ~= 0 then + werror("bad immediate operand") + end + op = op + shl(band(imm, 0xf0), 12) + band(imm, 0x0f) + elseif p == "K" then + local imm = tonumber(match(q, "^#(.*)$")); n = n + 1 + if not imm or shr(imm, 16) ~= 0 then + werror("bad immediate operand") + end + op = op + shl(band(imm, 0xfff0), 4) + band(imm, 0x000f) + elseif p == "T" then + op = op + parse_imm(q, 24, 0, 0, false); n = n + 1 + elseif p == "s" then + -- Ignored. + else + assert(false) + end + end + wputpos(pos, op) +end + +map_op[".template__"] = function(params, template, nparams) + if not params then return template:gsub("%x%x%x%x%x%x%x%x", "") end + + -- Limit number of section buffer positions used by a single dasm_put(). + -- A single opcode needs a maximum of 3 positions. + if secpos+3 > maxsecpos then wflush() end + local pos = wpos() + local lpos, apos, spos = #actlist, #actargs, secpos + + local ok, err + for t in gmatch(template, "[^|]+") do + ok, err = pcall(parse_template, params, t, nparams, pos) + if ok then return end + secpos = spos + actlist[lpos+1] = nil + actlist[lpos+2] = nil + actlist[lpos+3] = nil + actargs[apos+1] = nil + actargs[apos+2] = nil + actargs[apos+3] = nil + end + error(err, 0) +end + +------------------------------------------------------------------------------ + +-- Pseudo-opcode to mark the position where the action list is to be emitted. +map_op[".actionlist_1"] = function(params) + if not params then return "cvar" end + local name = params[1] -- No syntax check. You get to keep the pieces. + wline(function(out) writeactions(out, name) end) +end + +-- Pseudo-opcode to mark the position where the global enum is to be emitted. +map_op[".globals_1"] = function(params) + if not params then return "prefix" end + local prefix = params[1] -- No syntax check. You get to keep the pieces. + wline(function(out) writeglobals(out, prefix) end) +end + +-- Pseudo-opcode to mark the position where the global names are to be emitted. +map_op[".globalnames_1"] = function(params) + if not params then return "cvar" end + local name = params[1] -- No syntax check. You get to keep the pieces. + wline(function(out) writeglobalnames(out, name) end) +end + +-- Pseudo-opcode to mark the position where the extern names are to be emitted. +map_op[".externnames_1"] = function(params) + if not params then return "cvar" end + local name = params[1] -- No syntax check. You get to keep the pieces. + wline(function(out) writeexternnames(out, name) end) +end + +------------------------------------------------------------------------------ + +-- Label pseudo-opcode (converted from trailing colon form). +map_op[".label_1"] = function(params) + if not params then return "[1-9] | ->global | =>pcexpr" end + if secpos+1 > maxsecpos then wflush() end + local mode, n, s = parse_label(params[1], true) + if mode == "EXT" then werror("bad label definition") end + waction("LABEL_"..mode, n, s, 1) +end + +------------------------------------------------------------------------------ + +-- Pseudo-opcodes for data storage. +map_op[".long_*"] = function(params) + if not params then return "imm..." end + for _,p in ipairs(params) do + local n = tonumber(p) + if not n then werror("bad immediate `"..p.."'") end + if n < 0 then n = n + 2^32 end + wputw(n) + if secpos+2 > maxsecpos then wflush() end + end +end + +-- Alignment pseudo-opcode. +map_op[".align_1"] = function(params) + if not params then return "numpow2" end + if secpos+1 > maxsecpos then wflush() end + local align = tonumber(params[1]) + if align then + local x = align + -- Must be a power of 2 in the range (2 ... 256). + for i=1,8 do + x = x / 2 + if x == 1 then + waction("ALIGN", align-1, nil, 1) -- Action byte is 2**n-1. + return + end + end + end + werror("bad alignment") +end + +------------------------------------------------------------------------------ + +-- Pseudo-opcode for (primitive) type definitions (map to C types). +map_op[".type_3"] = function(params, nparams) + if not params then + return nparams == 2 and "name, ctype" or "name, ctype, reg" + end + local name, ctype, reg = params[1], params[2], params[3] + if not match(name, "^[%a_][%w_]*$") then + werror("bad type name `"..name.."'") + end + local tp = map_type[name] + if tp then + werror("duplicate type `"..name.."'") + end + -- Add #type to defines. A bit unclean to put it in map_archdef. + map_archdef["#"..name] = "sizeof("..ctype..")" + -- Add new type and emit shortcut define. + local num = ctypenum + 1 + map_type[name] = { + ctype = ctype, + ctypefmt = format("Dt%X(%%s)", num), + reg = reg, + } + wline(format("#define Dt%X(_V) (int)(ptrdiff_t)&(((%s *)0)_V)", num, ctype)) + ctypenum = num +end +map_op[".type_2"] = map_op[".type_3"] + +-- Dump type definitions. +local function dumptypes(out, lvl) + local t = {} + for name in pairs(map_type) do t[#t+1] = name end + sort(t) + out:write("Type definitions:\n") + for _,name in ipairs(t) do + local tp = map_type[name] + local reg = tp.reg or "" + out:write(format(" %-20s %-20s %s\n", name, tp.ctype, reg)) + end + out:write("\n") +end + +------------------------------------------------------------------------------ + +-- Set the current section. +function _M.section(num) + waction("SECTION", num) + wflush(true) -- SECTION is a terminal action. +end + +------------------------------------------------------------------------------ + +-- Dump architecture description. +function _M.dumparch(out) + out:write(format("DynASM %s version %s, released %s\n\n", + _info.arch, _info.version, _info.release)) + dumpactions(out) +end + +-- Dump all user defined elements. +function _M.dumpdef(out, lvl) + dumptypes(out, lvl) + dumpglobals(out, lvl) + dumpexterns(out, lvl) +end + +------------------------------------------------------------------------------ + +-- Pass callbacks from/to the DynASM core. +function _M.passcb(wl, we, wf, ww) + wline, werror, wfatal, wwarn = wl, we, wf, ww + return wflush +end + +-- Setup the arch-specific module. +function _M.setup(arch, opt) + g_arch, g_opt = arch, opt +end + +-- Merge the core maps and the arch-specific maps. +function _M.mergemaps(map_coreop, map_def) + setmetatable(map_op, { __index = function(t, k) + local v = map_coreop[k] + if v then return v end + local k1, cc, k2 = match(k, "^(.-)(..)([._].*)$") + local cv = map_cond[cc] + if cv then + local v = rawget(t, k1..k2) + if type(v) == "string" then + local scv = format("%x", cv) + return gsub(scv..sub(v, 2), "|e", "|"..scv) + end + end + end }) + setmetatable(map_def, { __index = map_archdef }) + return map_op, map_def +end + +return _M + +------------------------------------------------------------------------------ + diff --git a/lib/LuaJIT/dynasm/dasm_arm64.h b/lib/LuaJIT/dynasm/dasm_arm64.h new file mode 100644 index 0000000..ff21236 --- /dev/null +++ b/lib/LuaJIT/dynasm/dasm_arm64.h @@ -0,0 +1,519 @@ +/* +** DynASM ARM64 encoding engine. +** Copyright (C) 2005-2017 Mike Pall. All rights reserved. +** Released under the MIT license. See dynasm.lua for full copyright notice. +*/ + +#include +#include +#include +#include + +#define DASM_ARCH "arm64" + +#ifndef DASM_EXTERN +#define DASM_EXTERN(a,b,c,d) 0 +#endif + +/* Action definitions. */ +enum { + DASM_STOP, DASM_SECTION, DASM_ESC, DASM_REL_EXT, + /* The following actions need a buffer position. */ + DASM_ALIGN, DASM_REL_LG, DASM_LABEL_LG, + /* The following actions also have an argument. */ + DASM_REL_PC, DASM_LABEL_PC, + DASM_IMM, DASM_IMM6, DASM_IMM12, DASM_IMM13W, DASM_IMM13X, DASM_IMML, + DASM__MAX +}; + +/* Maximum number of section buffer positions for a single dasm_put() call. */ +#define DASM_MAXSECPOS 25 + +/* DynASM encoder status codes. Action list offset or number are or'ed in. */ +#define DASM_S_OK 0x00000000 +#define DASM_S_NOMEM 0x01000000 +#define DASM_S_PHASE 0x02000000 +#define DASM_S_MATCH_SEC 0x03000000 +#define DASM_S_RANGE_I 0x11000000 +#define DASM_S_RANGE_SEC 0x12000000 +#define DASM_S_RANGE_LG 0x13000000 +#define DASM_S_RANGE_PC 0x14000000 +#define DASM_S_RANGE_REL 0x15000000 +#define DASM_S_UNDEF_LG 0x21000000 +#define DASM_S_UNDEF_PC 0x22000000 + +/* Macros to convert positions (8 bit section + 24 bit index). */ +#define DASM_POS2IDX(pos) ((pos)&0x00ffffff) +#define DASM_POS2BIAS(pos) ((pos)&0xff000000) +#define DASM_SEC2POS(sec) ((sec)<<24) +#define DASM_POS2SEC(pos) ((pos)>>24) +#define DASM_POS2PTR(D, pos) (D->sections[DASM_POS2SEC(pos)].rbuf + (pos)) + +/* Action list type. */ +typedef const unsigned int *dasm_ActList; + +/* Per-section structure. */ +typedef struct dasm_Section { + int *rbuf; /* Biased buffer pointer (negative section bias). */ + int *buf; /* True buffer pointer. */ + size_t bsize; /* Buffer size in bytes. */ + int pos; /* Biased buffer position. */ + int epos; /* End of biased buffer position - max single put. */ + int ofs; /* Byte offset into section. */ +} dasm_Section; + +/* Core structure holding the DynASM encoding state. */ +struct dasm_State { + size_t psize; /* Allocated size of this structure. */ + dasm_ActList actionlist; /* Current actionlist pointer. */ + int *lglabels; /* Local/global chain/pos ptrs. */ + size_t lgsize; + int *pclabels; /* PC label chains/pos ptrs. */ + size_t pcsize; + void **globals; /* Array of globals (bias -10). */ + dasm_Section *section; /* Pointer to active section. */ + size_t codesize; /* Total size of all code sections. */ + int maxsection; /* 0 <= sectionidx < maxsection. */ + int status; /* Status code. */ + dasm_Section sections[1]; /* All sections. Alloc-extended. */ +}; + +/* The size of the core structure depends on the max. number of sections. */ +#define DASM_PSZ(ms) (sizeof(dasm_State)+(ms-1)*sizeof(dasm_Section)) + + +/* Initialize DynASM state. */ +void dasm_init(Dst_DECL, int maxsection) +{ + dasm_State *D; + size_t psz = 0; + int i; + Dst_REF = NULL; + DASM_M_GROW(Dst, struct dasm_State, Dst_REF, psz, DASM_PSZ(maxsection)); + D = Dst_REF; + D->psize = psz; + D->lglabels = NULL; + D->lgsize = 0; + D->pclabels = NULL; + D->pcsize = 0; + D->globals = NULL; + D->maxsection = maxsection; + for (i = 0; i < maxsection; i++) { + D->sections[i].buf = NULL; /* Need this for pass3. */ + D->sections[i].rbuf = D->sections[i].buf - DASM_SEC2POS(i); + D->sections[i].bsize = 0; + D->sections[i].epos = 0; /* Wrong, but is recalculated after resize. */ + } +} + +/* Free DynASM state. */ +void dasm_free(Dst_DECL) +{ + dasm_State *D = Dst_REF; + int i; + for (i = 0; i < D->maxsection; i++) + if (D->sections[i].buf) + DASM_M_FREE(Dst, D->sections[i].buf, D->sections[i].bsize); + if (D->pclabels) DASM_M_FREE(Dst, D->pclabels, D->pcsize); + if (D->lglabels) DASM_M_FREE(Dst, D->lglabels, D->lgsize); + DASM_M_FREE(Dst, D, D->psize); +} + +/* Setup global label array. Must be called before dasm_setup(). */ +void dasm_setupglobal(Dst_DECL, void **gl, unsigned int maxgl) +{ + dasm_State *D = Dst_REF; + D->globals = gl - 10; /* Negative bias to compensate for locals. */ + DASM_M_GROW(Dst, int, D->lglabels, D->lgsize, (10+maxgl)*sizeof(int)); +} + +/* Grow PC label array. Can be called after dasm_setup(), too. */ +void dasm_growpc(Dst_DECL, unsigned int maxpc) +{ + dasm_State *D = Dst_REF; + size_t osz = D->pcsize; + DASM_M_GROW(Dst, int, D->pclabels, D->pcsize, maxpc*sizeof(int)); + memset((void *)(((unsigned char *)D->pclabels)+osz), 0, D->pcsize-osz); +} + +/* Setup encoder. */ +void dasm_setup(Dst_DECL, const void *actionlist) +{ + dasm_State *D = Dst_REF; + int i; + D->actionlist = (dasm_ActList)actionlist; + D->status = DASM_S_OK; + D->section = &D->sections[0]; + memset((void *)D->lglabels, 0, D->lgsize); + if (D->pclabels) memset((void *)D->pclabels, 0, D->pcsize); + for (i = 0; i < D->maxsection; i++) { + D->sections[i].pos = DASM_SEC2POS(i); + D->sections[i].ofs = 0; + } +} + + +#ifdef DASM_CHECKS +#define CK(x, st) \ + do { if (!(x)) { \ + D->status = DASM_S_##st|(p-D->actionlist-1); return; } } while (0) +#define CKPL(kind, st) \ + do { if ((size_t)((char *)pl-(char *)D->kind##labels) >= D->kind##size) { \ + D->status = DASM_S_RANGE_##st|(p-D->actionlist-1); return; } } while (0) +#else +#define CK(x, st) ((void)0) +#define CKPL(kind, st) ((void)0) +#endif + +static int dasm_imm12(unsigned int n) +{ + if ((n >> 12) == 0) + return n; + else if ((n & 0xff000fff) == 0) + return (n >> 12) | 0x1000; + else + return -1; +} + +static int dasm_ffs(unsigned long long x) +{ + int n = -1; + while (x) { x >>= 1; n++; } + return n; +} + +static int dasm_imm13(int lo, int hi) +{ + int inv = 0, w = 64, s = 0xfff, xa, xb; + unsigned long long n = (((unsigned long long)hi) << 32) | (unsigned int)lo; + unsigned long long m = 1ULL, a, b, c; + if (n & 1) { n = ~n; inv = 1; } + a = n & -n; b = (n+a)&-(n+a); c = (n+a-b)&-(n+a-b); + xa = dasm_ffs(a); xb = dasm_ffs(b); + if (c) { + w = dasm_ffs(c) - xa; + if (w == 32) m = 0x0000000100000001UL; + else if (w == 16) m = 0x0001000100010001UL; + else if (w == 8) m = 0x0101010101010101UL; + else if (w == 4) m = 0x1111111111111111UL; + else if (w == 2) m = 0x5555555555555555UL; + else return -1; + s = (-2*w & 0x3f) - 1; + } else if (!a) { + return -1; + } else if (xb == -1) { + xb = 64; + } + if ((b-a) * m != n) return -1; + if (inv) { + return ((w - xb) << 6) | (s+w+xa-xb); + } else { + return ((w - xa) << 6) | (s+xb-xa); + } + return -1; +} + +/* Pass 1: Store actions and args, link branches/labels, estimate offsets. */ +void dasm_put(Dst_DECL, int start, ...) +{ + va_list ap; + dasm_State *D = Dst_REF; + dasm_ActList p = D->actionlist + start; + dasm_Section *sec = D->section; + int pos = sec->pos, ofs = sec->ofs; + int *b; + + if (pos >= sec->epos) { + DASM_M_GROW(Dst, int, sec->buf, sec->bsize, + sec->bsize + 2*DASM_MAXSECPOS*sizeof(int)); + sec->rbuf = sec->buf - DASM_POS2BIAS(pos); + sec->epos = (int)sec->bsize/sizeof(int) - DASM_MAXSECPOS+DASM_POS2BIAS(pos); + } + + b = sec->rbuf; + b[pos++] = start; + + va_start(ap, start); + while (1) { + unsigned int ins = *p++; + unsigned int action = (ins >> 16); + if (action >= DASM__MAX) { + ofs += 4; + } else { + int *pl, n = action >= DASM_REL_PC ? va_arg(ap, int) : 0; + switch (action) { + case DASM_STOP: goto stop; + case DASM_SECTION: + n = (ins & 255); CK(n < D->maxsection, RANGE_SEC); + D->section = &D->sections[n]; goto stop; + case DASM_ESC: p++; ofs += 4; break; + case DASM_REL_EXT: break; + case DASM_ALIGN: ofs += (ins & 255); b[pos++] = ofs; break; + case DASM_REL_LG: + n = (ins & 2047) - 10; pl = D->lglabels + n; + /* Bkwd rel or global. */ + if (n >= 0) { CK(n>=10||*pl<0, RANGE_LG); CKPL(lg, LG); goto putrel; } + pl += 10; n = *pl; + if (n < 0) n = 0; /* Start new chain for fwd rel if label exists. */ + goto linkrel; + case DASM_REL_PC: + pl = D->pclabels + n; CKPL(pc, PC); + putrel: + n = *pl; + if (n < 0) { /* Label exists. Get label pos and store it. */ + b[pos] = -n; + } else { + linkrel: + b[pos] = n; /* Else link to rel chain, anchored at label. */ + *pl = pos; + } + pos++; + break; + case DASM_LABEL_LG: + pl = D->lglabels + (ins & 2047) - 10; CKPL(lg, LG); goto putlabel; + case DASM_LABEL_PC: + pl = D->pclabels + n; CKPL(pc, PC); + putlabel: + n = *pl; /* n > 0: Collapse rel chain and replace with label pos. */ + while (n > 0) { int *pb = DASM_POS2PTR(D, n); n = *pb; *pb = pos; + } + *pl = -pos; /* Label exists now. */ + b[pos++] = ofs; /* Store pass1 offset estimate. */ + break; + case DASM_IMM: + CK((n & ((1<<((ins>>10)&31))-1)) == 0, RANGE_I); + n >>= ((ins>>10)&31); +#ifdef DASM_CHECKS + if ((ins & 0x8000)) + CK(((n + (1<<(((ins>>5)&31)-1)))>>((ins>>5)&31)) == 0, RANGE_I); + else + CK((n>>((ins>>5)&31)) == 0, RANGE_I); +#endif + b[pos++] = n; + break; + case DASM_IMM6: + CK((n >> 6) == 0, RANGE_I); + b[pos++] = n; + break; + case DASM_IMM12: + CK(dasm_imm12((unsigned int)n) != -1, RANGE_I); + b[pos++] = n; + break; + case DASM_IMM13W: + CK(dasm_imm13(n, n) != -1, RANGE_I); + b[pos++] = n; + break; + case DASM_IMM13X: { + int m = va_arg(ap, int); + CK(dasm_imm13(n, m) != -1, RANGE_I); + b[pos++] = n; + b[pos++] = m; + break; + } + case DASM_IMML: { +#ifdef DASM_CHECKS + int scale = (p[-2] >> 30); + CK((!(n & ((1<>scale) < 4096) || + (unsigned int)(n+256) < 512, RANGE_I); +#endif + b[pos++] = n; + break; + } + } + } + } +stop: + va_end(ap); + sec->pos = pos; + sec->ofs = ofs; +} +#undef CK + +/* Pass 2: Link sections, shrink aligns, fix label offsets. */ +int dasm_link(Dst_DECL, size_t *szp) +{ + dasm_State *D = Dst_REF; + int secnum; + int ofs = 0; + +#ifdef DASM_CHECKS + *szp = 0; + if (D->status != DASM_S_OK) return D->status; + { + int pc; + for (pc = 0; pc*sizeof(int) < D->pcsize; pc++) + if (D->pclabels[pc] > 0) return DASM_S_UNDEF_PC|pc; + } +#endif + + { /* Handle globals not defined in this translation unit. */ + int idx; + for (idx = 20; idx*sizeof(int) < D->lgsize; idx++) { + int n = D->lglabels[idx]; + /* Undefined label: Collapse rel chain and replace with marker (< 0). */ + while (n > 0) { int *pb = DASM_POS2PTR(D, n); n = *pb; *pb = -idx; } + } + } + + /* Combine all code sections. No support for data sections (yet). */ + for (secnum = 0; secnum < D->maxsection; secnum++) { + dasm_Section *sec = D->sections + secnum; + int *b = sec->rbuf; + int pos = DASM_SEC2POS(secnum); + int lastpos = sec->pos; + + while (pos != lastpos) { + dasm_ActList p = D->actionlist + b[pos++]; + while (1) { + unsigned int ins = *p++; + unsigned int action = (ins >> 16); + switch (action) { + case DASM_STOP: case DASM_SECTION: goto stop; + case DASM_ESC: p++; break; + case DASM_REL_EXT: break; + case DASM_ALIGN: ofs -= (b[pos++] + ofs) & (ins & 255); break; + case DASM_REL_LG: case DASM_REL_PC: pos++; break; + case DASM_LABEL_LG: case DASM_LABEL_PC: b[pos++] += ofs; break; + case DASM_IMM: case DASM_IMM6: case DASM_IMM12: case DASM_IMM13W: + case DASM_IMML: pos++; break; + case DASM_IMM13X: pos += 2; break; + } + } + stop: (void)0; + } + ofs += sec->ofs; /* Next section starts right after current section. */ + } + + D->codesize = ofs; /* Total size of all code sections */ + *szp = ofs; + return DASM_S_OK; +} + +#ifdef DASM_CHECKS +#define CK(x, st) \ + do { if (!(x)) return DASM_S_##st|(p-D->actionlist-1); } while (0) +#else +#define CK(x, st) ((void)0) +#endif + +/* Pass 3: Encode sections. */ +int dasm_encode(Dst_DECL, void *buffer) +{ + dasm_State *D = Dst_REF; + char *base = (char *)buffer; + unsigned int *cp = (unsigned int *)buffer; + int secnum; + + /* Encode all code sections. No support for data sections (yet). */ + for (secnum = 0; secnum < D->maxsection; secnum++) { + dasm_Section *sec = D->sections + secnum; + int *b = sec->buf; + int *endb = sec->rbuf + sec->pos; + + while (b != endb) { + dasm_ActList p = D->actionlist + *b++; + while (1) { + unsigned int ins = *p++; + unsigned int action = (ins >> 16); + int n = (action >= DASM_ALIGN && action < DASM__MAX) ? *b++ : 0; + switch (action) { + case DASM_STOP: case DASM_SECTION: goto stop; + case DASM_ESC: *cp++ = *p++; break; + case DASM_REL_EXT: + n = DASM_EXTERN(Dst, (unsigned char *)cp, (ins&2047), !(ins&2048)); + goto patchrel; + case DASM_ALIGN: + ins &= 255; while ((((char *)cp - base) & ins)) *cp++ = 0xe1a00000; + break; + case DASM_REL_LG: + CK(n >= 0, UNDEF_LG); + /* fallthrough */ + case DASM_REL_PC: + CK(n >= 0, UNDEF_PC); + n = *DASM_POS2PTR(D, n) - (int)((char *)cp - base) + 4; + patchrel: + if (!(ins & 0xf800)) { /* B, BL */ + CK((n & 3) == 0 && ((n+0x08000000) >> 28) == 0, RANGE_REL); + cp[-1] |= ((n >> 2) & 0x03ffffff); + } else if ((ins & 0x800)) { /* B.cond, CBZ, CBNZ, LDR* literal */ + CK((n & 3) == 0 && ((n+0x00100000) >> 21) == 0, RANGE_REL); + cp[-1] |= ((n << 3) & 0x00ffffe0); + } else if ((ins & 0x3000) == 0x2000) { /* ADR */ + CK(((n+0x00100000) >> 21) == 0, RANGE_REL); + cp[-1] |= ((n << 3) & 0x00ffffe0) | ((n & 3) << 29); + } else if ((ins & 0x3000) == 0x3000) { /* ADRP */ + cp[-1] |= ((n >> 9) & 0x00ffffe0) | (((n >> 12) & 3) << 29); + } else if ((ins & 0x1000)) { /* TBZ, TBNZ */ + CK((n & 3) == 0 && ((n+0x00008000) >> 16) == 0, RANGE_REL); + cp[-1] |= ((n << 3) & 0x0007ffe0); + } + break; + case DASM_LABEL_LG: + ins &= 2047; if (ins >= 20) D->globals[ins-10] = (void *)(base + n); + break; + case DASM_LABEL_PC: break; + case DASM_IMM: + cp[-1] |= (n & ((1<<((ins>>5)&31))-1)) << (ins&31); + break; + case DASM_IMM6: + cp[-1] |= ((n&31) << 19) | ((n&32) << 26); + break; + case DASM_IMM12: + cp[-1] |= (dasm_imm12((unsigned int)n) << 10); + break; + case DASM_IMM13W: + cp[-1] |= (dasm_imm13(n, n) << 10); + break; + case DASM_IMM13X: + cp[-1] |= (dasm_imm13(n, *b++) << 10); + break; + case DASM_IMML: { + int scale = (p[-2] >> 30); + cp[-1] |= (!(n & ((1<>scale) < 4096) ? + ((n << (10-scale)) | 0x01000000) : ((n & 511) << 12); + break; + } + default: *cp++ = ins; break; + } + } + stop: (void)0; + } + } + + if (base + D->codesize != (char *)cp) /* Check for phase errors. */ + return DASM_S_PHASE; + return DASM_S_OK; +} +#undef CK + +/* Get PC label offset. */ +int dasm_getpclabel(Dst_DECL, unsigned int pc) +{ + dasm_State *D = Dst_REF; + if (pc*sizeof(int) < D->pcsize) { + int pos = D->pclabels[pc]; + if (pos < 0) return *DASM_POS2PTR(D, -pos); + if (pos > 0) return -1; /* Undefined. */ + } + return -2; /* Unused or out of range. */ +} + +#ifdef DASM_CHECKS +/* Optional sanity checker to call between isolated encoding steps. */ +int dasm_checkstep(Dst_DECL, int secmatch) +{ + dasm_State *D = Dst_REF; + if (D->status == DASM_S_OK) { + int i; + for (i = 1; i <= 9; i++) { + if (D->lglabels[i] > 0) { D->status = DASM_S_UNDEF_LG|i; break; } + D->lglabels[i] = 0; + } + } + if (D->status == DASM_S_OK && secmatch >= 0 && + D->section != &D->sections[secmatch]) + D->status = DASM_S_MATCH_SEC|(D->section-D->sections); + return D->status; +} +#endif + diff --git a/lib/LuaJIT/dynasm/dasm_arm64.lua b/lib/LuaJIT/dynasm/dasm_arm64.lua new file mode 100644 index 0000000..8a5f735 --- /dev/null +++ b/lib/LuaJIT/dynasm/dasm_arm64.lua @@ -0,0 +1,1166 @@ +------------------------------------------------------------------------------ +-- DynASM ARM64 module. +-- +-- Copyright (C) 2005-2017 Mike Pall. All rights reserved. +-- See dynasm.lua for full copyright notice. +------------------------------------------------------------------------------ + +-- Module information: +local _info = { + arch = "arm", + description = "DynASM ARM64 module", + version = "1.4.0", + vernum = 10400, + release = "2015-10-18", + author = "Mike Pall", + license = "MIT", +} + +-- Exported glue functions for the arch-specific module. +local _M = { _info = _info } + +-- Cache library functions. +local type, tonumber, pairs, ipairs = type, tonumber, pairs, ipairs +local assert, setmetatable, rawget = assert, setmetatable, rawget +local _s = string +local sub, format, byte, char = _s.sub, _s.format, _s.byte, _s.char +local match, gmatch, gsub = _s.match, _s.gmatch, _s.gsub +local concat, sort, insert = table.concat, table.sort, table.insert +local bit = bit or require("bit") +local band, shl, shr, sar = bit.band, bit.lshift, bit.rshift, bit.arshift +local ror, tohex = bit.ror, bit.tohex + +-- Inherited tables and callbacks. +local g_opt, g_arch +local wline, werror, wfatal, wwarn + +-- Action name list. +-- CHECK: Keep this in sync with the C code! +local action_names = { + "STOP", "SECTION", "ESC", "REL_EXT", + "ALIGN", "REL_LG", "LABEL_LG", + "REL_PC", "LABEL_PC", "IMM", "IMM6", "IMM12", "IMM13W", "IMM13X", "IMML", +} + +-- Maximum number of section buffer positions for dasm_put(). +-- CHECK: Keep this in sync with the C code! +local maxsecpos = 25 -- Keep this low, to avoid excessively long C lines. + +-- Action name -> action number. +local map_action = {} +for n,name in ipairs(action_names) do + map_action[name] = n-1 +end + +-- Action list buffer. +local actlist = {} + +-- Argument list for next dasm_put(). Start with offset 0 into action list. +local actargs = { 0 } + +-- Current number of section buffer positions for dasm_put(). +local secpos = 1 + +------------------------------------------------------------------------------ + +-- Dump action names and numbers. +local function dumpactions(out) + out:write("DynASM encoding engine action codes:\n") + for n,name in ipairs(action_names) do + local num = map_action[name] + out:write(format(" %-10s %02X %d\n", name, num, num)) + end + out:write("\n") +end + +-- Write action list buffer as a huge static C array. +local function writeactions(out, name) + local nn = #actlist + if nn == 0 then nn = 1; actlist[0] = map_action.STOP end + out:write("static const unsigned int ", name, "[", nn, "] = {\n") + for i = 1,nn-1 do + assert(out:write("0x", tohex(actlist[i]), ",\n")) + end + assert(out:write("0x", tohex(actlist[nn]), "\n};\n\n")) +end + +------------------------------------------------------------------------------ + +-- Add word to action list. +local function wputxw(n) + assert(n >= 0 and n <= 0xffffffff and n % 1 == 0, "word out of range") + actlist[#actlist+1] = n +end + +-- Add action to list with optional arg. Advance buffer pos, too. +local function waction(action, val, a, num) + local w = assert(map_action[action], "bad action name `"..action.."'") + wputxw(w * 0x10000 + (val or 0)) + if a then actargs[#actargs+1] = a end + if a or num then secpos = secpos + (num or 1) end +end + +-- Flush action list (intervening C code or buffer pos overflow). +local function wflush(term) + if #actlist == actargs[1] then return end -- Nothing to flush. + if not term then waction("STOP") end -- Terminate action list. + wline(format("dasm_put(Dst, %s);", concat(actargs, ", ")), true) + actargs = { #actlist } -- Actionlist offset is 1st arg to next dasm_put(). + secpos = 1 -- The actionlist offset occupies a buffer position, too. +end + +-- Put escaped word. +local function wputw(n) + if n <= 0x000fffff then waction("ESC") end + wputxw(n) +end + +-- Reserve position for word. +local function wpos() + local pos = #actlist+1 + actlist[pos] = "" + return pos +end + +-- Store word to reserved position. +local function wputpos(pos, n) + assert(n >= 0 and n <= 0xffffffff and n % 1 == 0, "word out of range") + if n <= 0x000fffff then + insert(actlist, pos+1, n) + n = map_action.ESC * 0x10000 + end + actlist[pos] = n +end + +------------------------------------------------------------------------------ + +-- Global label name -> global label number. With auto assignment on 1st use. +local next_global = 20 +local map_global = setmetatable({}, { __index = function(t, name) + if not match(name, "^[%a_][%w_]*$") then werror("bad global label") end + local n = next_global + if n > 2047 then werror("too many global labels") end + next_global = n + 1 + t[name] = n + return n +end}) + +-- Dump global labels. +local function dumpglobals(out, lvl) + local t = {} + for name, n in pairs(map_global) do t[n] = name end + out:write("Global labels:\n") + for i=20,next_global-1 do + out:write(format(" %s\n", t[i])) + end + out:write("\n") +end + +-- Write global label enum. +local function writeglobals(out, prefix) + local t = {} + for name, n in pairs(map_global) do t[n] = name end + out:write("enum {\n") + for i=20,next_global-1 do + out:write(" ", prefix, t[i], ",\n") + end + out:write(" ", prefix, "_MAX\n};\n") +end + +-- Write global label names. +local function writeglobalnames(out, name) + local t = {} + for name, n in pairs(map_global) do t[n] = name end + out:write("static const char *const ", name, "[] = {\n") + for i=20,next_global-1 do + out:write(" \"", t[i], "\",\n") + end + out:write(" (const char *)0\n};\n") +end + +------------------------------------------------------------------------------ + +-- Extern label name -> extern label number. With auto assignment on 1st use. +local next_extern = 0 +local map_extern_ = {} +local map_extern = setmetatable({}, { __index = function(t, name) + -- No restrictions on the name for now. + local n = next_extern + if n > 2047 then werror("too many extern labels") end + next_extern = n + 1 + t[name] = n + map_extern_[n] = name + return n +end}) + +-- Dump extern labels. +local function dumpexterns(out, lvl) + out:write("Extern labels:\n") + for i=0,next_extern-1 do + out:write(format(" %s\n", map_extern_[i])) + end + out:write("\n") +end + +-- Write extern label names. +local function writeexternnames(out, name) + out:write("static const char *const ", name, "[] = {\n") + for i=0,next_extern-1 do + out:write(" \"", map_extern_[i], "\",\n") + end + out:write(" (const char *)0\n};\n") +end + +------------------------------------------------------------------------------ + +-- Arch-specific maps. + +-- Ext. register name -> int. name. +local map_archdef = { xzr = "@x31", wzr = "@w31", lr = "x30", } + +-- Int. register name -> ext. name. +local map_reg_rev = { ["@x31"] = "xzr", ["@w31"] = "wzr", x30 = "lr", } + +local map_type = {} -- Type name -> { ctype, reg } +local ctypenum = 0 -- Type number (for Dt... macros). + +-- Reverse defines for registers. +function _M.revdef(s) + return map_reg_rev[s] or s +end + +local map_shift = { lsl = 0, lsr = 1, asr = 2, } + +local map_extend = { + uxtb = 0, uxth = 1, uxtw = 2, uxtx = 3, + sxtb = 4, sxth = 5, sxtw = 6, sxtx = 7, +} + +local map_cond = { + eq = 0, ne = 1, cs = 2, cc = 3, mi = 4, pl = 5, vs = 6, vc = 7, + hi = 8, ls = 9, ge = 10, lt = 11, gt = 12, le = 13, al = 14, + hs = 2, lo = 3, +} + +------------------------------------------------------------------------------ + +local parse_reg_type + +local function parse_reg(expr) + if not expr then werror("expected register name") end + local tname, ovreg = match(expr, "^([%w_]+):(@?%l%d+)$") + local tp = map_type[tname or expr] + if tp then + local reg = ovreg or tp.reg + if not reg then + werror("type `"..(tname or expr).."' needs a register override") + end + expr = reg + end + local ok31, rt, r = match(expr, "^(@?)([xwqdshb])([123]?[0-9])$") + if r then + r = tonumber(r) + if r <= 30 or (r == 31 and ok31 ~= "" or (rt ~= "w" and rt ~= "x")) then + if not parse_reg_type then + parse_reg_type = rt + elseif parse_reg_type ~= rt then + werror("register size mismatch") + end + return r, tp + end + end + werror("bad register name `"..expr.."'") +end + +local function parse_reg_base(expr) + if expr == "sp" then return 0x3e0 end + local base, tp = parse_reg(expr) + if parse_reg_type ~= "x" then werror("bad register type") end + parse_reg_type = false + return shl(base, 5), tp +end + +local parse_ctx = {} + +local loadenv = setfenv and function(s) + local code = loadstring(s, "") + if code then setfenv(code, parse_ctx) end + return code +end or function(s) + return load(s, "", nil, parse_ctx) +end + +-- Try to parse simple arithmetic, too, since some basic ops are aliases. +local function parse_number(n) + local x = tonumber(n) + if x then return x end + local code = loadenv("return "..n) + if code then + local ok, y = pcall(code) + if ok then return y end + end + return nil +end + +local function parse_imm(imm, bits, shift, scale, signed) + imm = match(imm, "^#(.*)$") + if not imm then werror("expected immediate operand") end + local n = parse_number(imm) + if n then + local m = sar(n, scale) + if shl(m, scale) == n then + if signed then + local s = sar(m, bits-1) + if s == 0 then return shl(m, shift) + elseif s == -1 then return shl(m + shl(1, bits), shift) end + else + if sar(m, bits) == 0 then return shl(m, shift) end + end + end + werror("out of range immediate `"..imm.."'") + else + waction("IMM", (signed and 32768 or 0)+scale*1024+bits*32+shift, imm) + return 0 + end +end + +local function parse_imm12(imm) + imm = match(imm, "^#(.*)$") + if not imm then werror("expected immediate operand") end + local n = parse_number(imm) + if n then + if shr(n, 12) == 0 then + return shl(n, 10) + elseif band(n, 0xff000fff) == 0 then + return shr(n, 2) + 0x00400000 + end + werror("out of range immediate `"..imm.."'") + else + waction("IMM12", 0, imm) + return 0 + end +end + +local function parse_imm13(imm) + imm = match(imm, "^#(.*)$") + if not imm then werror("expected immediate operand") end + local n = parse_number(imm) + local r64 = parse_reg_type == "x" + if n and n % 1 == 0 and n >= 0 and n <= 0xffffffff then + local inv = false + if band(n, 1) == 1 then n = bit.bnot(n); inv = true end + local t = {} + for i=1,32 do t[i] = band(n, 1); n = shr(n, 1) end + local b = table.concat(t) + b = b..(r64 and (inv and "1" or "0"):rep(32) or b) + local p0, p1, p0a, p1a = b:match("^(0+)(1+)(0*)(1*)") + if p0 then + local w = p1a == "" and (r64 and 64 or 32) or #p1+#p0a + if band(w, w-1) == 0 and b == b:sub(1, w):rep(64/w) then + local s = band(-2*w, 0x3f) - 1 + if w == 64 then s = s + 0x1000 end + if inv then + return shl(w-#p1-#p0, 16) + shl(s+w-#p1, 10) + else + return shl(w-#p0, 16) + shl(s+#p1, 10) + end + end + end + werror("out of range immediate `"..imm.."'") + elseif r64 then + waction("IMM13X", 0, format("(unsigned int)(%s)", imm)) + actargs[#actargs+1] = format("(unsigned int)((unsigned long long)(%s)>>32)", imm) + return 0 + else + waction("IMM13W", 0, imm) + return 0 + end +end + +local function parse_imm6(imm) + imm = match(imm, "^#(.*)$") + if not imm then werror("expected immediate operand") end + local n = parse_number(imm) + if n then + if n >= 0 and n <= 63 then + return shl(band(n, 0x1f), 19) + (n >= 32 and 0x80000000 or 0) + end + werror("out of range immediate `"..imm.."'") + else + waction("IMM6", 0, imm) + return 0 + end +end + +local function parse_imm_load(imm, scale) + local n = parse_number(imm) + if n then + local m = sar(n, scale) + if shl(m, scale) == n and m >= 0 and m < 0x1000 then + return shl(m, 10) + 0x01000000 -- Scaled, unsigned 12 bit offset. + elseif n >= -256 and n < 256 then + return shl(band(n, 511), 12) -- Unscaled, signed 9 bit offset. + end + werror("out of range immediate `"..imm.."'") + else + waction("IMML", 0, imm) + return 0 + end +end + +local function parse_fpimm(imm) + imm = match(imm, "^#(.*)$") + if not imm then werror("expected immediate operand") end + local n = parse_number(imm) + if n then + local m, e = math.frexp(n) + local s, e2 = 0, band(e-2, 7) + if m < 0 then m = -m; s = 0x00100000 end + m = m*32-16 + if m % 1 == 0 and m >= 0 and m <= 15 and sar(shl(e2, 29), 29)+2 == e then + return s + shl(e2, 17) + shl(m, 13) + end + werror("out of range immediate `"..imm.."'") + else + werror("NYI fpimm action") + end +end + +local function parse_shift(expr) + local s, s2 = match(expr, "^(%S+)%s*(.*)$") + s = map_shift[s] + if not s then werror("expected shift operand") end + return parse_imm(s2, 6, 10, 0, false) + shl(s, 22) +end + +local function parse_lslx16(expr) + local n = match(expr, "^lsl%s*#(%d+)$") + n = tonumber(n) + if not n then werror("expected shift operand") end + if band(n, parse_reg_type == "x" and 0xffffffcf or 0xffffffef) ~= 0 then + werror("bad shift amount") + end + return shl(n, 17) +end + +local function parse_extend(expr) + local s, s2 = match(expr, "^(%S+)%s*(.*)$") + if s == "lsl" then + s = parse_reg_type == "x" and 3 or 2 + else + s = map_extend[s] + end + if not s then werror("expected extend operand") end + return (s2 == "" and 0 or parse_imm(s2, 3, 10, 0, false)) + shl(s, 13) +end + +local function parse_cond(expr, inv) + local c = map_cond[expr] + if not c then werror("expected condition operand") end + return shl(bit.bxor(c, inv), 12) +end + +local function parse_load(params, nparams, n, op) + if params[n+2] then werror("too many operands") end + local pn, p2 = params[n], params[n+1] + local p1, wb = match(pn, "^%[%s*(.-)%s*%](!?)$") + if not p1 then + if not p2 then + local reg, tailr = match(pn, "^([%w_:]+)%s*(.*)$") + if reg and tailr ~= "" then + local base, tp = parse_reg_base(reg) + if tp then + waction("IMML", 0, format(tp.ctypefmt, tailr)) + return op + base + end + end + end + werror("expected address operand") + end + local scale = shr(op, 30) + if p2 then + if wb == "!" then werror("bad use of '!'") end + op = op + parse_reg_base(p1) + parse_imm(p2, 9, 12, 0, true) + 0x400 + elseif wb == "!" then + local p1a, p2a = match(p1, "^([^,%s]*)%s*,%s*(.*)$") + if not p1a then werror("bad use of '!'") end + op = op + parse_reg_base(p1a) + parse_imm(p2a, 9, 12, 0, true) + 0xc00 + else + local p1a, p2a = match(p1, "^([^,%s]*)%s*(.*)$") + op = op + parse_reg_base(p1a) + if p2a ~= "" then + local imm = match(p2a, "^,%s*#(.*)$") + if imm then + op = op + parse_imm_load(imm, scale) + else + local p2b, p3b, p3s = match(p2a, "^,%s*([^,%s]*)%s*,?%s*(%S*)%s*(.*)$") + op = op + shl(parse_reg(p2b), 16) + 0x00200800 + if parse_reg_type ~= "x" and parse_reg_type ~= "w" then + werror("bad index register type") + end + if p3b == "" then + if parse_reg_type ~= "x" then werror("bad index register type") end + op = op + 0x6000 + else + if p3s == "" or p3s == "#0" then + elseif p3s == "#"..scale then + op = op + 0x1000 + else + werror("bad scale") + end + if parse_reg_type == "x" then + if p3b == "lsl" and p3s ~= "" then op = op + 0x6000 + elseif p3b == "sxtx" then op = op + 0xe000 + else + werror("bad extend/shift specifier") + end + else + if p3b == "uxtw" then op = op + 0x4000 + elseif p3b == "sxtw" then op = op + 0xc000 + else + werror("bad extend/shift specifier") + end + end + end + end + else + if wb == "!" then werror("bad use of '!'") end + op = op + 0x01000000 + end + end + return op +end + +local function parse_load_pair(params, nparams, n, op) + if params[n+2] then werror("too many operands") end + local pn, p2 = params[n], params[n+1] + local scale = shr(op, 30) == 0 and 2 or 3 + local p1, wb = match(pn, "^%[%s*(.-)%s*%](!?)$") + if not p1 then + if not p2 then + local reg, tailr = match(pn, "^([%w_:]+)%s*(.*)$") + if reg and tailr ~= "" then + local base, tp = parse_reg_base(reg) + if tp then + waction("IMM", 32768+7*32+15+scale*1024, format(tp.ctypefmt, tailr)) + return op + base + 0x01000000 + end + end + end + werror("expected address operand") + end + if p2 then + if wb == "!" then werror("bad use of '!'") end + op = op + 0x00800000 + else + local p1a, p2a = match(p1, "^([^,%s]*)%s*,%s*(.*)$") + if p1a then p1, p2 = p1a, p2a else p2 = "#0" end + op = op + (wb == "!" and 0x01800000 or 0x01000000) + end + return op + parse_reg_base(p1) + parse_imm(p2, 7, 15, scale, true) +end + +local function parse_label(label, def) + local prefix = sub(label, 1, 2) + -- =>label (pc label reference) + if prefix == "=>" then + return "PC", 0, sub(label, 3) + end + -- ->name (global label reference) + if prefix == "->" then + return "LG", map_global[sub(label, 3)] + end + if def then + -- [1-9] (local label definition) + if match(label, "^[1-9]$") then + return "LG", 10+tonumber(label) + end + else + -- [<>][1-9] (local label reference) + local dir, lnum = match(label, "^([<>])([1-9])$") + if dir then -- Fwd: 1-9, Bkwd: 11-19. + return "LG", lnum + (dir == ">" and 0 or 10) + end + -- extern label (extern label reference) + local extname = match(label, "^extern%s+(%S+)$") + if extname then + return "EXT", map_extern[extname] + end + end + werror("bad label `"..label.."'") +end + +local function branch_type(op) + if band(op, 0x7c000000) == 0x14000000 then return 0 -- B, BL + elseif shr(op, 24) == 0x54 or band(op, 0x7e000000) == 0x34000000 or + band(op, 0x3b000000) == 0x18000000 then + return 0x800 -- B.cond, CBZ, CBNZ, LDR* literal + elseif band(op, 0x7e000000) == 0x36000000 then return 0x1000 -- TBZ, TBNZ + elseif band(op, 0x9f000000) == 0x10000000 then return 0x2000 -- ADR + elseif band(op, 0x9f000000) == band(0x90000000) then return 0x3000 -- ADRP + else + assert(false, "unknown branch type") + end +end + +------------------------------------------------------------------------------ + +local map_op, op_template + +local function op_alias(opname, f) + return function(params, nparams) + if not params then return "-> "..opname:sub(1, -3) end + f(params, nparams) + op_template(params, map_op[opname], nparams) + end +end + +local function alias_bfx(p) + p[4] = "#("..p[3]:sub(2)..")+("..p[4]:sub(2)..")-1" +end + +local function alias_bfiz(p) + parse_reg(p[1]) + if parse_reg_type == "w" then + p[3] = "#-("..p[3]:sub(2)..")%32" + p[4] = "#("..p[4]:sub(2)..")-1" + else + p[3] = "#-("..p[3]:sub(2)..")%64" + p[4] = "#("..p[4]:sub(2)..")-1" + end +end + +local alias_lslimm = op_alias("ubfm_4", function(p) + parse_reg(p[1]) + local sh = p[3]:sub(2) + if parse_reg_type == "w" then + p[3] = "#-("..sh..")%32" + p[4] = "#31-("..sh..")" + else + p[3] = "#-("..sh..")%64" + p[4] = "#63-("..sh..")" + end +end) + +-- Template strings for ARM instructions. +map_op = { + -- Basic data processing instructions. + add_3 = "0b000000DNMg|11000000pDpNIg|8b206000pDpNMx", + add_4 = "0b000000DNMSg|0b200000DNMXg|8b200000pDpNMXx|8b200000pDpNxMwX", + adds_3 = "2b000000DNMg|31000000DpNIg|ab206000DpNMx", + adds_4 = "2b000000DNMSg|2b200000DNMXg|ab200000DpNMXx|ab200000DpNxMwX", + cmn_2 = "2b00001fNMg|3100001fpNIg|ab20601fpNMx", + cmn_3 = "2b00001fNMSg|2b20001fNMXg|ab20001fpNMXx|ab20001fpNxMwX", + + sub_3 = "4b000000DNMg|51000000pDpNIg|cb206000pDpNMx", + sub_4 = "4b000000DNMSg|4b200000DNMXg|cb200000pDpNMXx|cb200000pDpNxMwX", + subs_3 = "6b000000DNMg|71000000DpNIg|eb206000DpNMx", + subs_4 = "6b000000DNMSg|6b200000DNMXg|eb200000DpNMXx|eb200000DpNxMwX", + cmp_2 = "6b00001fNMg|7100001fpNIg|eb20601fpNMx", + cmp_3 = "6b00001fNMSg|6b20001fNMXg|eb20001fpNMXx|eb20001fpNxMwX", + + neg_2 = "4b0003e0DMg", + neg_3 = "4b0003e0DMSg", + negs_2 = "6b0003e0DMg", + negs_3 = "6b0003e0DMSg", + + adc_3 = "1a000000DNMg", + adcs_3 = "3a000000DNMg", + sbc_3 = "5a000000DNMg", + sbcs_3 = "7a000000DNMg", + ngc_2 = "5a0003e0DMg", + ngcs_2 = "7a0003e0DMg", + + and_3 = "0a000000DNMg|12000000pDNig", + and_4 = "0a000000DNMSg", + orr_3 = "2a000000DNMg|32000000pDNig", + orr_4 = "2a000000DNMSg", + eor_3 = "4a000000DNMg|52000000pDNig", + eor_4 = "4a000000DNMSg", + ands_3 = "6a000000DNMg|72000000DNig", + ands_4 = "6a000000DNMSg", + tst_2 = "6a00001fNMg|7200001fNig", + tst_3 = "6a00001fNMSg", + + bic_3 = "0a200000DNMg", + bic_4 = "0a200000DNMSg", + orn_3 = "2a200000DNMg", + orn_4 = "2a200000DNMSg", + eon_3 = "4a200000DNMg", + eon_4 = "4a200000DNMSg", + bics_3 = "6a200000DNMg", + bics_4 = "6a200000DNMSg", + + movn_2 = "12800000DWg", + movn_3 = "12800000DWRg", + movz_2 = "52800000DWg", + movz_3 = "52800000DWRg", + movk_2 = "72800000DWg", + movk_3 = "72800000DWRg", + + -- TODO: this doesn't cover all valid immediates for mov reg, #imm. + mov_2 = "2a0003e0DMg|52800000DW|320003e0pDig|11000000pDpNg", + mov_3 = "2a0003e0DMSg", + mvn_2 = "2a2003e0DMg", + mvn_3 = "2a2003e0DMSg", + + adr_2 = "10000000DBx", + adrp_2 = "90000000DBx", + + csel_4 = "1a800000DNMCg", + csinc_4 = "1a800400DNMCg", + csinv_4 = "5a800000DNMCg", + csneg_4 = "5a800400DNMCg", + cset_2 = "1a9f07e0Dcg", + csetm_2 = "5a9f03e0Dcg", + cinc_3 = "1a800400DNmcg", + cinv_3 = "5a800000DNmcg", + cneg_3 = "5a800400DNmcg", + + ccmn_4 = "3a400000NMVCg|3a400800N5VCg", + ccmp_4 = "7a400000NMVCg|7a400800N5VCg", + + madd_4 = "1b000000DNMAg", + msub_4 = "1b008000DNMAg", + mul_3 = "1b007c00DNMg", + mneg_3 = "1b00fc00DNMg", + + smaddl_4 = "9b200000DxNMwAx", + smsubl_4 = "9b208000DxNMwAx", + smull_3 = "9b207c00DxNMw", + smnegl_3 = "9b20fc00DxNMw", + smulh_3 = "9b407c00DNMx", + umaddl_4 = "9ba00000DxNMwAx", + umsubl_4 = "9ba08000DxNMwAx", + umull_3 = "9ba07c00DxNMw", + umnegl_3 = "9ba0fc00DxNMw", + umulh_3 = "9bc07c00DNMx", + + udiv_3 = "1ac00800DNMg", + sdiv_3 = "1ac00c00DNMg", + + -- Bit operations. + sbfm_4 = "13000000DN12w|93400000DN12x", + bfm_4 = "33000000DN12w|b3400000DN12x", + ubfm_4 = "53000000DN12w|d3400000DN12x", + extr_4 = "13800000DNM2w|93c00000DNM2x", + + sxtb_2 = "13001c00DNw|93401c00DNx", + sxth_2 = "13003c00DNw|93403c00DNx", + sxtw_2 = "93407c00DxNw", + uxtb_2 = "53001c00DNw", + uxth_2 = "53003c00DNw", + + sbfx_4 = op_alias("sbfm_4", alias_bfx), + bfxil_4 = op_alias("bfm_4", alias_bfx), + ubfx_4 = op_alias("ubfm_4", alias_bfx), + sbfiz_4 = op_alias("sbfm_4", alias_bfiz), + bfi_4 = op_alias("bfm_4", alias_bfiz), + ubfiz_4 = op_alias("ubfm_4", alias_bfiz), + + lsl_3 = function(params, nparams) + if params and params[3]:byte() == 35 then + return alias_lslimm(params, nparams) + else + return op_template(params, "1ac02000DNMg", nparams) + end + end, + lsr_3 = "1ac02400DNMg|53007c00DN1w|d340fc00DN1x", + asr_3 = "1ac02800DNMg|13007c00DN1w|9340fc00DN1x", + ror_3 = "1ac02c00DNMg|13800000DNm2w|93c00000DNm2x", + + clz_2 = "5ac01000DNg", + cls_2 = "5ac01400DNg", + rbit_2 = "5ac00000DNg", + rev_2 = "5ac00800DNw|dac00c00DNx", + rev16_2 = "5ac00400DNg", + rev32_2 = "dac00800DNx", + + -- Loads and stores. + ["strb_*"] = "38000000DwL", + ["ldrb_*"] = "38400000DwL", + ["ldrsb_*"] = "38c00000DwL|38800000DxL", + ["strh_*"] = "78000000DwL", + ["ldrh_*"] = "78400000DwL", + ["ldrsh_*"] = "78c00000DwL|78800000DxL", + ["str_*"] = "b8000000DwL|f8000000DxL|bc000000DsL|fc000000DdL", + ["ldr_*"] = "18000000DwB|58000000DxB|1c000000DsB|5c000000DdB|b8400000DwL|f8400000DxL|bc400000DsL|fc400000DdL", + ["ldrsw_*"] = "98000000DxB|b8800000DxL", + -- NOTE: ldur etc. are handled by ldr et al. + + ["stp_*"] = "28000000DAwP|a8000000DAxP|2c000000DAsP|6c000000DAdP", + ["ldp_*"] = "28400000DAwP|a8400000DAxP|2c400000DAsP|6c400000DAdP", + ["ldpsw_*"] = "68400000DAxP", + + -- Branches. + b_1 = "14000000B", + bl_1 = "94000000B", + blr_1 = "d63f0000Nx", + br_1 = "d61f0000Nx", + ret_0 = "d65f03c0", + ret_1 = "d65f0000Nx", + -- b.cond is added below. + cbz_2 = "34000000DBg", + cbnz_2 = "35000000DBg", + tbz_3 = "36000000DTBw|36000000DTBx", + tbnz_3 = "37000000DTBw|37000000DTBx", + + -- Miscellaneous instructions. + -- TODO: hlt, hvc, smc, svc, eret, dcps[123], drps, mrs, msr + -- TODO: sys, sysl, ic, dc, at, tlbi + -- TODO: hint, yield, wfe, wfi, sev, sevl + -- TODO: clrex, dsb, dmb, isb + nop_0 = "d503201f", + brk_0 = "d4200000", + brk_1 = "d4200000W", + + -- Floating point instructions. + fmov_2 = "1e204000DNf|1e260000DwNs|1e270000DsNw|9e660000DxNd|9e670000DdNx|1e201000DFf", + fabs_2 = "1e20c000DNf", + fneg_2 = "1e214000DNf", + fsqrt_2 = "1e21c000DNf", + + fcvt_2 = "1e22c000DdNs|1e624000DsNd", + + -- TODO: half-precision and fixed-point conversions. + fcvtas_2 = "1e240000DwNs|9e240000DxNs|1e640000DwNd|9e640000DxNd", + fcvtau_2 = "1e250000DwNs|9e250000DxNs|1e650000DwNd|9e650000DxNd", + fcvtms_2 = "1e300000DwNs|9e300000DxNs|1e700000DwNd|9e700000DxNd", + fcvtmu_2 = "1e310000DwNs|9e310000DxNs|1e710000DwNd|9e710000DxNd", + fcvtns_2 = "1e200000DwNs|9e200000DxNs|1e600000DwNd|9e600000DxNd", + fcvtnu_2 = "1e210000DwNs|9e210000DxNs|1e610000DwNd|9e610000DxNd", + fcvtps_2 = "1e280000DwNs|9e280000DxNs|1e680000DwNd|9e680000DxNd", + fcvtpu_2 = "1e290000DwNs|9e290000DxNs|1e690000DwNd|9e690000DxNd", + fcvtzs_2 = "1e380000DwNs|9e380000DxNs|1e780000DwNd|9e780000DxNd", + fcvtzu_2 = "1e390000DwNs|9e390000DxNs|1e790000DwNd|9e790000DxNd", + + scvtf_2 = "1e220000DsNw|9e220000DsNx|1e620000DdNw|9e620000DdNx", + ucvtf_2 = "1e230000DsNw|9e230000DsNx|1e630000DdNw|9e630000DdNx", + + frintn_2 = "1e244000DNf", + frintp_2 = "1e24c000DNf", + frintm_2 = "1e254000DNf", + frintz_2 = "1e25c000DNf", + frinta_2 = "1e264000DNf", + frintx_2 = "1e274000DNf", + frinti_2 = "1e27c000DNf", + + fadd_3 = "1e202800DNMf", + fsub_3 = "1e203800DNMf", + fmul_3 = "1e200800DNMf", + fnmul_3 = "1e208800DNMf", + fdiv_3 = "1e201800DNMf", + + fmadd_4 = "1f000000DNMAf", + fmsub_4 = "1f008000DNMAf", + fnmadd_4 = "1f200000DNMAf", + fnmsub_4 = "1f208000DNMAf", + + fmax_3 = "1e204800DNMf", + fmaxnm_3 = "1e206800DNMf", + fmin_3 = "1e205800DNMf", + fminnm_3 = "1e207800DNMf", + + fcmp_2 = "1e202000NMf|1e202008NZf", + fcmpe_2 = "1e202010NMf|1e202018NZf", + + fccmp_4 = "1e200400NMVCf", + fccmpe_4 = "1e200410NMVCf", + + fcsel_4 = "1e200c00DNMCf", + + -- TODO: crc32*, aes*, sha*, pmull + -- TODO: SIMD instructions. +} + +for cond,c in pairs(map_cond) do + map_op["b"..cond.."_1"] = tohex(0x54000000+c).."B" +end + +------------------------------------------------------------------------------ + +-- Handle opcodes defined with template strings. +local function parse_template(params, template, nparams, pos) + local op = tonumber(sub(template, 1, 8), 16) + local n = 1 + local rtt = {} + + parse_reg_type = false + + -- Process each character. + for p in gmatch(sub(template, 9), ".") do + local q = params[n] + if p == "D" then + op = op + parse_reg(q); n = n + 1 + elseif p == "N" then + op = op + shl(parse_reg(q), 5); n = n + 1 + elseif p == "M" then + op = op + shl(parse_reg(q), 16); n = n + 1 + elseif p == "A" then + op = op + shl(parse_reg(q), 10); n = n + 1 + elseif p == "m" then + op = op + shl(parse_reg(params[n-1]), 16) + + elseif p == "p" then + if q == "sp" then params[n] = "@x31" end + elseif p == "g" then + if parse_reg_type == "x" then + op = op + 0x80000000 + elseif parse_reg_type ~= "w" then + werror("bad register type") + end + parse_reg_type = false + elseif p == "f" then + if parse_reg_type == "d" then + op = op + 0x00400000 + elseif parse_reg_type ~= "s" then + werror("bad register type") + end + parse_reg_type = false + elseif p == "x" or p == "w" or p == "d" or p == "s" then + if parse_reg_type ~= p then + werror("register size mismatch") + end + parse_reg_type = false + + elseif p == "L" then + op = parse_load(params, nparams, n, op) + elseif p == "P" then + op = parse_load_pair(params, nparams, n, op) + + elseif p == "B" then + local mode, v, s = parse_label(q, false); n = n + 1 + local m = branch_type(op) + waction("REL_"..mode, v+m, s, 1) + + elseif p == "I" then + op = op + parse_imm12(q); n = n + 1 + elseif p == "i" then + op = op + parse_imm13(q); n = n + 1 + elseif p == "W" then + op = op + parse_imm(q, 16, 5, 0, false); n = n + 1 + elseif p == "T" then + op = op + parse_imm6(q); n = n + 1 + elseif p == "1" then + op = op + parse_imm(q, 6, 16, 0, false); n = n + 1 + elseif p == "2" then + op = op + parse_imm(q, 6, 10, 0, false); n = n + 1 + elseif p == "5" then + op = op + parse_imm(q, 5, 16, 0, false); n = n + 1 + elseif p == "V" then + op = op + parse_imm(q, 4, 0, 0, false); n = n + 1 + elseif p == "F" then + op = op + parse_fpimm(q); n = n + 1 + elseif p == "Z" then + if q ~= "#0" and q ~= "#0.0" then werror("expected zero immediate") end + n = n + 1 + + elseif p == "S" then + op = op + parse_shift(q); n = n + 1 + elseif p == "X" then + op = op + parse_extend(q); n = n + 1 + elseif p == "R" then + op = op + parse_lslx16(q); n = n + 1 + elseif p == "C" then + op = op + parse_cond(q, 0); n = n + 1 + elseif p == "c" then + op = op + parse_cond(q, 1); n = n + 1 + + else + assert(false) + end + end + wputpos(pos, op) +end + +function op_template(params, template, nparams) + if not params then return template:gsub("%x%x%x%x%x%x%x%x", "") end + + -- Limit number of section buffer positions used by a single dasm_put(). + -- A single opcode needs a maximum of 3 positions. + if secpos+3 > maxsecpos then wflush() end + local pos = wpos() + local lpos, apos, spos = #actlist, #actargs, secpos + + local ok, err + for t in gmatch(template, "[^|]+") do + ok, err = pcall(parse_template, params, t, nparams, pos) + if ok then return end + secpos = spos + actlist[lpos+1] = nil + actlist[lpos+2] = nil + actlist[lpos+3] = nil + actargs[apos+1] = nil + actargs[apos+2] = nil + actargs[apos+3] = nil + end + error(err, 0) +end + +map_op[".template__"] = op_template + +------------------------------------------------------------------------------ + +-- Pseudo-opcode to mark the position where the action list is to be emitted. +map_op[".actionlist_1"] = function(params) + if not params then return "cvar" end + local name = params[1] -- No syntax check. You get to keep the pieces. + wline(function(out) writeactions(out, name) end) +end + +-- Pseudo-opcode to mark the position where the global enum is to be emitted. +map_op[".globals_1"] = function(params) + if not params then return "prefix" end + local prefix = params[1] -- No syntax check. You get to keep the pieces. + wline(function(out) writeglobals(out, prefix) end) +end + +-- Pseudo-opcode to mark the position where the global names are to be emitted. +map_op[".globalnames_1"] = function(params) + if not params then return "cvar" end + local name = params[1] -- No syntax check. You get to keep the pieces. + wline(function(out) writeglobalnames(out, name) end) +end + +-- Pseudo-opcode to mark the position where the extern names are to be emitted. +map_op[".externnames_1"] = function(params) + if not params then return "cvar" end + local name = params[1] -- No syntax check. You get to keep the pieces. + wline(function(out) writeexternnames(out, name) end) +end + +------------------------------------------------------------------------------ + +-- Label pseudo-opcode (converted from trailing colon form). +map_op[".label_1"] = function(params) + if not params then return "[1-9] | ->global | =>pcexpr" end + if secpos+1 > maxsecpos then wflush() end + local mode, n, s = parse_label(params[1], true) + if mode == "EXT" then werror("bad label definition") end + waction("LABEL_"..mode, n, s, 1) +end + +------------------------------------------------------------------------------ + +-- Pseudo-opcodes for data storage. +map_op[".long_*"] = function(params) + if not params then return "imm..." end + for _,p in ipairs(params) do + local n = tonumber(p) + if not n then werror("bad immediate `"..p.."'") end + if n < 0 then n = n + 2^32 end + wputw(n) + if secpos+2 > maxsecpos then wflush() end + end +end + +-- Alignment pseudo-opcode. +map_op[".align_1"] = function(params) + if not params then return "numpow2" end + if secpos+1 > maxsecpos then wflush() end + local align = tonumber(params[1]) + if align then + local x = align + -- Must be a power of 2 in the range (2 ... 256). + for i=1,8 do + x = x / 2 + if x == 1 then + waction("ALIGN", align-1, nil, 1) -- Action byte is 2**n-1. + return + end + end + end + werror("bad alignment") +end + +------------------------------------------------------------------------------ + +-- Pseudo-opcode for (primitive) type definitions (map to C types). +map_op[".type_3"] = function(params, nparams) + if not params then + return nparams == 2 and "name, ctype" or "name, ctype, reg" + end + local name, ctype, reg = params[1], params[2], params[3] + if not match(name, "^[%a_][%w_]*$") then + werror("bad type name `"..name.."'") + end + local tp = map_type[name] + if tp then + werror("duplicate type `"..name.."'") + end + -- Add #type to defines. A bit unclean to put it in map_archdef. + map_archdef["#"..name] = "sizeof("..ctype..")" + -- Add new type and emit shortcut define. + local num = ctypenum + 1 + map_type[name] = { + ctype = ctype, + ctypefmt = format("Dt%X(%%s)", num), + reg = reg, + } + wline(format("#define Dt%X(_V) (int)(ptrdiff_t)&(((%s *)0)_V)", num, ctype)) + ctypenum = num +end +map_op[".type_2"] = map_op[".type_3"] + +-- Dump type definitions. +local function dumptypes(out, lvl) + local t = {} + for name in pairs(map_type) do t[#t+1] = name end + sort(t) + out:write("Type definitions:\n") + for _,name in ipairs(t) do + local tp = map_type[name] + local reg = tp.reg or "" + out:write(format(" %-20s %-20s %s\n", name, tp.ctype, reg)) + end + out:write("\n") +end + +------------------------------------------------------------------------------ + +-- Set the current section. +function _M.section(num) + waction("SECTION", num) + wflush(true) -- SECTION is a terminal action. +end + +------------------------------------------------------------------------------ + +-- Dump architecture description. +function _M.dumparch(out) + out:write(format("DynASM %s version %s, released %s\n\n", + _info.arch, _info.version, _info.release)) + dumpactions(out) +end + +-- Dump all user defined elements. +function _M.dumpdef(out, lvl) + dumptypes(out, lvl) + dumpglobals(out, lvl) + dumpexterns(out, lvl) +end + +------------------------------------------------------------------------------ + +-- Pass callbacks from/to the DynASM core. +function _M.passcb(wl, we, wf, ww) + wline, werror, wfatal, wwarn = wl, we, wf, ww + return wflush +end + +-- Setup the arch-specific module. +function _M.setup(arch, opt) + g_arch, g_opt = arch, opt +end + +-- Merge the core maps and the arch-specific maps. +function _M.mergemaps(map_coreop, map_def) + setmetatable(map_op, { __index = map_coreop }) + setmetatable(map_def, { __index = map_archdef }) + return map_op, map_def +end + +return _M + +------------------------------------------------------------------------------ + diff --git a/lib/LuaJIT/dynasm/dasm_mips.h b/lib/LuaJIT/dynasm/dasm_mips.h new file mode 100644 index 0000000..71a835b --- /dev/null +++ b/lib/LuaJIT/dynasm/dasm_mips.h @@ -0,0 +1,420 @@ +/* +** DynASM MIPS encoding engine. +** Copyright (C) 2005-2017 Mike Pall. All rights reserved. +** Released under the MIT license. See dynasm.lua for full copyright notice. +*/ + +#include +#include +#include +#include + +#define DASM_ARCH "mips" + +#ifndef DASM_EXTERN +#define DASM_EXTERN(a,b,c,d) 0 +#endif + +/* Action definitions. */ +enum { + DASM_STOP, DASM_SECTION, DASM_ESC, DASM_REL_EXT, + /* The following actions need a buffer position. */ + DASM_ALIGN, DASM_REL_LG, DASM_LABEL_LG, + /* The following actions also have an argument. */ + DASM_REL_PC, DASM_LABEL_PC, DASM_IMM, DASM_IMMS, + DASM__MAX +}; + +/* Maximum number of section buffer positions for a single dasm_put() call. */ +#define DASM_MAXSECPOS 25 + +/* DynASM encoder status codes. Action list offset or number are or'ed in. */ +#define DASM_S_OK 0x00000000 +#define DASM_S_NOMEM 0x01000000 +#define DASM_S_PHASE 0x02000000 +#define DASM_S_MATCH_SEC 0x03000000 +#define DASM_S_RANGE_I 0x11000000 +#define DASM_S_RANGE_SEC 0x12000000 +#define DASM_S_RANGE_LG 0x13000000 +#define DASM_S_RANGE_PC 0x14000000 +#define DASM_S_RANGE_REL 0x15000000 +#define DASM_S_UNDEF_LG 0x21000000 +#define DASM_S_UNDEF_PC 0x22000000 + +/* Macros to convert positions (8 bit section + 24 bit index). */ +#define DASM_POS2IDX(pos) ((pos)&0x00ffffff) +#define DASM_POS2BIAS(pos) ((pos)&0xff000000) +#define DASM_SEC2POS(sec) ((sec)<<24) +#define DASM_POS2SEC(pos) ((pos)>>24) +#define DASM_POS2PTR(D, pos) (D->sections[DASM_POS2SEC(pos)].rbuf + (pos)) + +/* Action list type. */ +typedef const unsigned int *dasm_ActList; + +/* Per-section structure. */ +typedef struct dasm_Section { + int *rbuf; /* Biased buffer pointer (negative section bias). */ + int *buf; /* True buffer pointer. */ + size_t bsize; /* Buffer size in bytes. */ + int pos; /* Biased buffer position. */ + int epos; /* End of biased buffer position - max single put. */ + int ofs; /* Byte offset into section. */ +} dasm_Section; + +/* Core structure holding the DynASM encoding state. */ +struct dasm_State { + size_t psize; /* Allocated size of this structure. */ + dasm_ActList actionlist; /* Current actionlist pointer. */ + int *lglabels; /* Local/global chain/pos ptrs. */ + size_t lgsize; + int *pclabels; /* PC label chains/pos ptrs. */ + size_t pcsize; + void **globals; /* Array of globals (bias -10). */ + dasm_Section *section; /* Pointer to active section. */ + size_t codesize; /* Total size of all code sections. */ + int maxsection; /* 0 <= sectionidx < maxsection. */ + int status; /* Status code. */ + dasm_Section sections[1]; /* All sections. Alloc-extended. */ +}; + +/* The size of the core structure depends on the max. number of sections. */ +#define DASM_PSZ(ms) (sizeof(dasm_State)+(ms-1)*sizeof(dasm_Section)) + + +/* Initialize DynASM state. */ +void dasm_init(Dst_DECL, int maxsection) +{ + dasm_State *D; + size_t psz = 0; + int i; + Dst_REF = NULL; + DASM_M_GROW(Dst, struct dasm_State, Dst_REF, psz, DASM_PSZ(maxsection)); + D = Dst_REF; + D->psize = psz; + D->lglabels = NULL; + D->lgsize = 0; + D->pclabels = NULL; + D->pcsize = 0; + D->globals = NULL; + D->maxsection = maxsection; + for (i = 0; i < maxsection; i++) { + D->sections[i].buf = NULL; /* Need this for pass3. */ + D->sections[i].rbuf = D->sections[i].buf - DASM_SEC2POS(i); + D->sections[i].bsize = 0; + D->sections[i].epos = 0; /* Wrong, but is recalculated after resize. */ + } +} + +/* Free DynASM state. */ +void dasm_free(Dst_DECL) +{ + dasm_State *D = Dst_REF; + int i; + for (i = 0; i < D->maxsection; i++) + if (D->sections[i].buf) + DASM_M_FREE(Dst, D->sections[i].buf, D->sections[i].bsize); + if (D->pclabels) DASM_M_FREE(Dst, D->pclabels, D->pcsize); + if (D->lglabels) DASM_M_FREE(Dst, D->lglabels, D->lgsize); + DASM_M_FREE(Dst, D, D->psize); +} + +/* Setup global label array. Must be called before dasm_setup(). */ +void dasm_setupglobal(Dst_DECL, void **gl, unsigned int maxgl) +{ + dasm_State *D = Dst_REF; + D->globals = gl - 10; /* Negative bias to compensate for locals. */ + DASM_M_GROW(Dst, int, D->lglabels, D->lgsize, (10+maxgl)*sizeof(int)); +} + +/* Grow PC label array. Can be called after dasm_setup(), too. */ +void dasm_growpc(Dst_DECL, unsigned int maxpc) +{ + dasm_State *D = Dst_REF; + size_t osz = D->pcsize; + DASM_M_GROW(Dst, int, D->pclabels, D->pcsize, maxpc*sizeof(int)); + memset((void *)(((unsigned char *)D->pclabels)+osz), 0, D->pcsize-osz); +} + +/* Setup encoder. */ +void dasm_setup(Dst_DECL, const void *actionlist) +{ + dasm_State *D = Dst_REF; + int i; + D->actionlist = (dasm_ActList)actionlist; + D->status = DASM_S_OK; + D->section = &D->sections[0]; + memset((void *)D->lglabels, 0, D->lgsize); + if (D->pclabels) memset((void *)D->pclabels, 0, D->pcsize); + for (i = 0; i < D->maxsection; i++) { + D->sections[i].pos = DASM_SEC2POS(i); + D->sections[i].ofs = 0; + } +} + + +#ifdef DASM_CHECKS +#define CK(x, st) \ + do { if (!(x)) { \ + D->status = DASM_S_##st|(p-D->actionlist-1); return; } } while (0) +#define CKPL(kind, st) \ + do { if ((size_t)((char *)pl-(char *)D->kind##labels) >= D->kind##size) { \ + D->status = DASM_S_RANGE_##st|(p-D->actionlist-1); return; } } while (0) +#else +#define CK(x, st) ((void)0) +#define CKPL(kind, st) ((void)0) +#endif + +/* Pass 1: Store actions and args, link branches/labels, estimate offsets. */ +void dasm_put(Dst_DECL, int start, ...) +{ + va_list ap; + dasm_State *D = Dst_REF; + dasm_ActList p = D->actionlist + start; + dasm_Section *sec = D->section; + int pos = sec->pos, ofs = sec->ofs; + int *b; + + if (pos >= sec->epos) { + DASM_M_GROW(Dst, int, sec->buf, sec->bsize, + sec->bsize + 2*DASM_MAXSECPOS*sizeof(int)); + sec->rbuf = sec->buf - DASM_POS2BIAS(pos); + sec->epos = (int)sec->bsize/sizeof(int) - DASM_MAXSECPOS+DASM_POS2BIAS(pos); + } + + b = sec->rbuf; + b[pos++] = start; + + va_start(ap, start); + while (1) { + unsigned int ins = *p++; + unsigned int action = (ins >> 16) - 0xff00; + if (action >= DASM__MAX) { + ofs += 4; + } else { + int *pl, n = action >= DASM_REL_PC ? va_arg(ap, int) : 0; + switch (action) { + case DASM_STOP: goto stop; + case DASM_SECTION: + n = (ins & 255); CK(n < D->maxsection, RANGE_SEC); + D->section = &D->sections[n]; goto stop; + case DASM_ESC: p++; ofs += 4; break; + case DASM_REL_EXT: break; + case DASM_ALIGN: ofs += (ins & 255); b[pos++] = ofs; break; + case DASM_REL_LG: + n = (ins & 2047) - 10; pl = D->lglabels + n; + /* Bkwd rel or global. */ + if (n >= 0) { CK(n>=10||*pl<0, RANGE_LG); CKPL(lg, LG); goto putrel; } + pl += 10; n = *pl; + if (n < 0) n = 0; /* Start new chain for fwd rel if label exists. */ + goto linkrel; + case DASM_REL_PC: + pl = D->pclabels + n; CKPL(pc, PC); + putrel: + n = *pl; + if (n < 0) { /* Label exists. Get label pos and store it. */ + b[pos] = -n; + } else { + linkrel: + b[pos] = n; /* Else link to rel chain, anchored at label. */ + *pl = pos; + } + pos++; + break; + case DASM_LABEL_LG: + pl = D->lglabels + (ins & 2047) - 10; CKPL(lg, LG); goto putlabel; + case DASM_LABEL_PC: + pl = D->pclabels + n; CKPL(pc, PC); + putlabel: + n = *pl; /* n > 0: Collapse rel chain and replace with label pos. */ + while (n > 0) { int *pb = DASM_POS2PTR(D, n); n = *pb; *pb = pos; + } + *pl = -pos; /* Label exists now. */ + b[pos++] = ofs; /* Store pass1 offset estimate. */ + break; + case DASM_IMM: case DASM_IMMS: +#ifdef DASM_CHECKS + CK((n & ((1<<((ins>>10)&31))-1)) == 0, RANGE_I); +#endif + n >>= ((ins>>10)&31); +#ifdef DASM_CHECKS + if (ins & 0x8000) + CK(((n + (1<<(((ins>>5)&31)-1)))>>((ins>>5)&31)) == 0, RANGE_I); + else + CK((n>>((ins>>5)&31)) == 0, RANGE_I); +#endif + b[pos++] = n; + break; + } + } + } +stop: + va_end(ap); + sec->pos = pos; + sec->ofs = ofs; +} +#undef CK + +/* Pass 2: Link sections, shrink aligns, fix label offsets. */ +int dasm_link(Dst_DECL, size_t *szp) +{ + dasm_State *D = Dst_REF; + int secnum; + int ofs = 0; + +#ifdef DASM_CHECKS + *szp = 0; + if (D->status != DASM_S_OK) return D->status; + { + int pc; + for (pc = 0; pc*sizeof(int) < D->pcsize; pc++) + if (D->pclabels[pc] > 0) return DASM_S_UNDEF_PC|pc; + } +#endif + + { /* Handle globals not defined in this translation unit. */ + int idx; + for (idx = 20; idx*sizeof(int) < D->lgsize; idx++) { + int n = D->lglabels[idx]; + /* Undefined label: Collapse rel chain and replace with marker (< 0). */ + while (n > 0) { int *pb = DASM_POS2PTR(D, n); n = *pb; *pb = -idx; } + } + } + + /* Combine all code sections. No support for data sections (yet). */ + for (secnum = 0; secnum < D->maxsection; secnum++) { + dasm_Section *sec = D->sections + secnum; + int *b = sec->rbuf; + int pos = DASM_SEC2POS(secnum); + int lastpos = sec->pos; + + while (pos != lastpos) { + dasm_ActList p = D->actionlist + b[pos++]; + while (1) { + unsigned int ins = *p++; + unsigned int action = (ins >> 16) - 0xff00; + switch (action) { + case DASM_STOP: case DASM_SECTION: goto stop; + case DASM_ESC: p++; break; + case DASM_REL_EXT: break; + case DASM_ALIGN: ofs -= (b[pos++] + ofs) & (ins & 255); break; + case DASM_REL_LG: case DASM_REL_PC: pos++; break; + case DASM_LABEL_LG: case DASM_LABEL_PC: b[pos++] += ofs; break; + case DASM_IMM: case DASM_IMMS: pos++; break; + } + } + stop: (void)0; + } + ofs += sec->ofs; /* Next section starts right after current section. */ + } + + D->codesize = ofs; /* Total size of all code sections */ + *szp = ofs; + return DASM_S_OK; +} + +#ifdef DASM_CHECKS +#define CK(x, st) \ + do { if (!(x)) return DASM_S_##st|(p-D->actionlist-1); } while (0) +#else +#define CK(x, st) ((void)0) +#endif + +/* Pass 3: Encode sections. */ +int dasm_encode(Dst_DECL, void *buffer) +{ + dasm_State *D = Dst_REF; + char *base = (char *)buffer; + unsigned int *cp = (unsigned int *)buffer; + int secnum; + + /* Encode all code sections. No support for data sections (yet). */ + for (secnum = 0; secnum < D->maxsection; secnum++) { + dasm_Section *sec = D->sections + secnum; + int *b = sec->buf; + int *endb = sec->rbuf + sec->pos; + + while (b != endb) { + dasm_ActList p = D->actionlist + *b++; + while (1) { + unsigned int ins = *p++; + unsigned int action = (ins >> 16) - 0xff00; + int n = (action >= DASM_ALIGN && action < DASM__MAX) ? *b++ : 0; + switch (action) { + case DASM_STOP: case DASM_SECTION: goto stop; + case DASM_ESC: *cp++ = *p++; break; + case DASM_REL_EXT: + n = DASM_EXTERN(Dst, (unsigned char *)cp, (ins & 2047), 1); + goto patchrel; + case DASM_ALIGN: + ins &= 255; while ((((char *)cp - base) & ins)) *cp++ = 0x60000000; + break; + case DASM_REL_LG: + CK(n >= 0, UNDEF_LG); + /* fallthrough */ + case DASM_REL_PC: + CK(n >= 0, UNDEF_PC); + n = *DASM_POS2PTR(D, n); + if (ins & 2048) + n = n - (int)((char *)cp - base); + else + n = (n + (int)(size_t)base) & 0x0fffffff; + patchrel: + CK((n & 3) == 0 && + ((n + ((ins & 2048) ? 0x00020000 : 0)) >> + ((ins & 2048) ? 18 : 28)) == 0, RANGE_REL); + cp[-1] |= ((n>>2) & ((ins & 2048) ? 0x0000ffff: 0x03ffffff)); + break; + case DASM_LABEL_LG: + ins &= 2047; if (ins >= 20) D->globals[ins-10] = (void *)(base + n); + break; + case DASM_LABEL_PC: break; + case DASM_IMMS: + cp[-1] |= ((n>>3) & 4); n &= 0x1f; + /* fallthrough */ + case DASM_IMM: + cp[-1] |= (n & ((1<<((ins>>5)&31))-1)) << (ins&31); + break; + default: *cp++ = ins; break; + } + } + stop: (void)0; + } + } + + if (base + D->codesize != (char *)cp) /* Check for phase errors. */ + return DASM_S_PHASE; + return DASM_S_OK; +} +#undef CK + +/* Get PC label offset. */ +int dasm_getpclabel(Dst_DECL, unsigned int pc) +{ + dasm_State *D = Dst_REF; + if (pc*sizeof(int) < D->pcsize) { + int pos = D->pclabels[pc]; + if (pos < 0) return *DASM_POS2PTR(D, -pos); + if (pos > 0) return -1; /* Undefined. */ + } + return -2; /* Unused or out of range. */ +} + +#ifdef DASM_CHECKS +/* Optional sanity checker to call between isolated encoding steps. */ +int dasm_checkstep(Dst_DECL, int secmatch) +{ + dasm_State *D = Dst_REF; + if (D->status == DASM_S_OK) { + int i; + for (i = 1; i <= 9; i++) { + if (D->lglabels[i] > 0) { D->status = DASM_S_UNDEF_LG|i; break; } + D->lglabels[i] = 0; + } + } + if (D->status == DASM_S_OK && secmatch >= 0 && + D->section != &D->sections[secmatch]) + D->status = DASM_S_MATCH_SEC|(D->section-D->sections); + return D->status; +} +#endif + diff --git a/lib/LuaJIT/dynasm/dasm_mips.lua b/lib/LuaJIT/dynasm/dasm_mips.lua new file mode 100644 index 0000000..bd2a2b4 --- /dev/null +++ b/lib/LuaJIT/dynasm/dasm_mips.lua @@ -0,0 +1,1008 @@ +------------------------------------------------------------------------------ +-- DynASM MIPS32/MIPS64 module. +-- +-- Copyright (C) 2005-2017 Mike Pall. All rights reserved. +-- See dynasm.lua for full copyright notice. +------------------------------------------------------------------------------ + +local mips64 = mips64 + +-- Module information: +local _info = { + arch = mips64 and "mips64" or "mips", + description = "DynASM MIPS32/MIPS64 module", + version = "1.4.0", + vernum = 10400, + release = "2016-05-24", + author = "Mike Pall", + license = "MIT", +} + +-- Exported glue functions for the arch-specific module. +local _M = { _info = _info } + +-- Cache library functions. +local type, tonumber, pairs, ipairs = type, tonumber, pairs, ipairs +local assert, setmetatable = assert, setmetatable +local _s = string +local sub, format, byte, char = _s.sub, _s.format, _s.byte, _s.char +local match, gmatch = _s.match, _s.gmatch +local concat, sort = table.concat, table.sort +local bit = bit or require("bit") +local band, shl, shr, sar = bit.band, bit.lshift, bit.rshift, bit.arshift +local tohex = bit.tohex + +-- Inherited tables and callbacks. +local g_opt, g_arch +local wline, werror, wfatal, wwarn + +-- Action name list. +-- CHECK: Keep this in sync with the C code! +local action_names = { + "STOP", "SECTION", "ESC", "REL_EXT", + "ALIGN", "REL_LG", "LABEL_LG", + "REL_PC", "LABEL_PC", "IMM", "IMMS", +} + +-- Maximum number of section buffer positions for dasm_put(). +-- CHECK: Keep this in sync with the C code! +local maxsecpos = 25 -- Keep this low, to avoid excessively long C lines. + +-- Action name -> action number. +local map_action = {} +for n,name in ipairs(action_names) do + map_action[name] = n-1 +end + +-- Action list buffer. +local actlist = {} + +-- Argument list for next dasm_put(). Start with offset 0 into action list. +local actargs = { 0 } + +-- Current number of section buffer positions for dasm_put(). +local secpos = 1 + +------------------------------------------------------------------------------ + +-- Dump action names and numbers. +local function dumpactions(out) + out:write("DynASM encoding engine action codes:\n") + for n,name in ipairs(action_names) do + local num = map_action[name] + out:write(format(" %-10s %02X %d\n", name, num, num)) + end + out:write("\n") +end + +-- Write action list buffer as a huge static C array. +local function writeactions(out, name) + local nn = #actlist + if nn == 0 then nn = 1; actlist[0] = map_action.STOP end + out:write("static const unsigned int ", name, "[", nn, "] = {\n") + for i = 1,nn-1 do + assert(out:write("0x", tohex(actlist[i]), ",\n")) + end + assert(out:write("0x", tohex(actlist[nn]), "\n};\n\n")) +end + +------------------------------------------------------------------------------ + +-- Add word to action list. +local function wputxw(n) + assert(n >= 0 and n <= 0xffffffff and n % 1 == 0, "word out of range") + actlist[#actlist+1] = n +end + +-- Add action to list with optional arg. Advance buffer pos, too. +local function waction(action, val, a, num) + local w = assert(map_action[action], "bad action name `"..action.."'") + wputxw(0xff000000 + w * 0x10000 + (val or 0)) + if a then actargs[#actargs+1] = a end + if a or num then secpos = secpos + (num or 1) end +end + +-- Flush action list (intervening C code or buffer pos overflow). +local function wflush(term) + if #actlist == actargs[1] then return end -- Nothing to flush. + if not term then waction("STOP") end -- Terminate action list. + wline(format("dasm_put(Dst, %s);", concat(actargs, ", ")), true) + actargs = { #actlist } -- Actionlist offset is 1st arg to next dasm_put(). + secpos = 1 -- The actionlist offset occupies a buffer position, too. +end + +-- Put escaped word. +local function wputw(n) + if n >= 0xff000000 then waction("ESC") end + wputxw(n) +end + +-- Reserve position for word. +local function wpos() + local pos = #actlist+1 + actlist[pos] = "" + return pos +end + +-- Store word to reserved position. +local function wputpos(pos, n) + assert(n >= 0 and n <= 0xffffffff and n % 1 == 0, "word out of range") + actlist[pos] = n +end + +------------------------------------------------------------------------------ + +-- Global label name -> global label number. With auto assignment on 1st use. +local next_global = 20 +local map_global = setmetatable({}, { __index = function(t, name) + if not match(name, "^[%a_][%w_]*$") then werror("bad global label") end + local n = next_global + if n > 2047 then werror("too many global labels") end + next_global = n + 1 + t[name] = n + return n +end}) + +-- Dump global labels. +local function dumpglobals(out, lvl) + local t = {} + for name, n in pairs(map_global) do t[n] = name end + out:write("Global labels:\n") + for i=20,next_global-1 do + out:write(format(" %s\n", t[i])) + end + out:write("\n") +end + +-- Write global label enum. +local function writeglobals(out, prefix) + local t = {} + for name, n in pairs(map_global) do t[n] = name end + out:write("enum {\n") + for i=20,next_global-1 do + out:write(" ", prefix, t[i], ",\n") + end + out:write(" ", prefix, "_MAX\n};\n") +end + +-- Write global label names. +local function writeglobalnames(out, name) + local t = {} + for name, n in pairs(map_global) do t[n] = name end + out:write("static const char *const ", name, "[] = {\n") + for i=20,next_global-1 do + out:write(" \"", t[i], "\",\n") + end + out:write(" (const char *)0\n};\n") +end + +------------------------------------------------------------------------------ + +-- Extern label name -> extern label number. With auto assignment on 1st use. +local next_extern = 0 +local map_extern_ = {} +local map_extern = setmetatable({}, { __index = function(t, name) + -- No restrictions on the name for now. + local n = next_extern + if n > 2047 then werror("too many extern labels") end + next_extern = n + 1 + t[name] = n + map_extern_[n] = name + return n +end}) + +-- Dump extern labels. +local function dumpexterns(out, lvl) + out:write("Extern labels:\n") + for i=0,next_extern-1 do + out:write(format(" %s\n", map_extern_[i])) + end + out:write("\n") +end + +-- Write extern label names. +local function writeexternnames(out, name) + out:write("static const char *const ", name, "[] = {\n") + for i=0,next_extern-1 do + out:write(" \"", map_extern_[i], "\",\n") + end + out:write(" (const char *)0\n};\n") +end + +------------------------------------------------------------------------------ + +-- Arch-specific maps. +local map_archdef = { sp="r29", ra="r31" } -- Ext. register name -> int. name. + +local map_type = {} -- Type name -> { ctype, reg } +local ctypenum = 0 -- Type number (for Dt... macros). + +-- Reverse defines for registers. +function _M.revdef(s) + if s == "r29" then return "sp" + elseif s == "r31" then return "ra" end + return s +end + +------------------------------------------------------------------------------ + +-- Template strings for MIPS instructions. +local map_op = { + -- First-level opcodes. + j_1 = "08000000J", + jal_1 = "0c000000J", + b_1 = "10000000B", + beqz_2 = "10000000SB", + beq_3 = "10000000STB", + bnez_2 = "14000000SB", + bne_3 = "14000000STB", + blez_2 = "18000000SB", + bgtz_2 = "1c000000SB", + addi_3 = "20000000TSI", + li_2 = "24000000TI", + addiu_3 = "24000000TSI", + slti_3 = "28000000TSI", + sltiu_3 = "2c000000TSI", + andi_3 = "30000000TSU", + lu_2 = "34000000TU", + ori_3 = "34000000TSU", + xori_3 = "38000000TSU", + lui_2 = "3c000000TU", + beqzl_2 = "50000000SB", + beql_3 = "50000000STB", + bnezl_2 = "54000000SB", + bnel_3 = "54000000STB", + blezl_2 = "58000000SB", + bgtzl_2 = "5c000000SB", + daddi_3 = mips64 and "60000000TSI", + daddiu_3 = mips64 and "64000000TSI", + ldl_2 = mips64 and "68000000TO", + ldr_2 = mips64 and "6c000000TO", + lb_2 = "80000000TO", + lh_2 = "84000000TO", + lwl_2 = "88000000TO", + lw_2 = "8c000000TO", + lbu_2 = "90000000TO", + lhu_2 = "94000000TO", + lwr_2 = "98000000TO", + lwu_2 = mips64 and "9c000000TO", + sb_2 = "a0000000TO", + sh_2 = "a4000000TO", + swl_2 = "a8000000TO", + sw_2 = "ac000000TO", + sdl_2 = mips64 and "b0000000TO", + sdr_2 = mips64 and "b1000000TO", + swr_2 = "b8000000TO", + cache_2 = "bc000000NO", + ll_2 = "c0000000TO", + lwc1_2 = "c4000000HO", + pref_2 = "cc000000NO", + ldc1_2 = "d4000000HO", + ld_2 = mips64 and "dc000000TO", + sc_2 = "e0000000TO", + swc1_2 = "e4000000HO", + scd_2 = mips64 and "f0000000TO", + sdc1_2 = "f4000000HO", + sd_2 = mips64 and "fc000000TO", + + -- Opcode SPECIAL. + nop_0 = "00000000", + sll_3 = "00000000DTA", + sextw_2 = "00000000DT", + movf_2 = "00000001DS", + movf_3 = "00000001DSC", + movt_2 = "00010001DS", + movt_3 = "00010001DSC", + srl_3 = "00000002DTA", + rotr_3 = "00200002DTA", + sra_3 = "00000003DTA", + sllv_3 = "00000004DTS", + srlv_3 = "00000006DTS", + rotrv_3 = "00000046DTS", + drotrv_3 = mips64 and "00000056DTS", + srav_3 = "00000007DTS", + jr_1 = "00000008S", + jalr_1 = "0000f809S", + jalr_2 = "00000009DS", + movz_3 = "0000000aDST", + movn_3 = "0000000bDST", + syscall_0 = "0000000c", + syscall_1 = "0000000cY", + break_0 = "0000000d", + break_1 = "0000000dY", + sync_0 = "0000000f", + mfhi_1 = "00000010D", + mthi_1 = "00000011S", + mflo_1 = "00000012D", + mtlo_1 = "00000013S", + dsllv_3 = mips64 and "00000014DTS", + dsrlv_3 = mips64 and "00000016DTS", + dsrav_3 = mips64 and "00000017DTS", + mult_2 = "00000018ST", + multu_2 = "00000019ST", + div_2 = "0000001aST", + divu_2 = "0000001bST", + dmult_2 = mips64 and "0000001cST", + dmultu_2 = mips64 and "0000001dST", + ddiv_2 = mips64 and "0000001eST", + ddivu_2 = mips64 and "0000001fST", + add_3 = "00000020DST", + move_2 = mips64 and "00000025DS" or "00000021DS", + addu_3 = "00000021DST", + sub_3 = "00000022DST", + negu_2 = mips64 and "0000002fDT" or "00000023DT", + subu_3 = "00000023DST", + and_3 = "00000024DST", + or_3 = "00000025DST", + xor_3 = "00000026DST", + not_2 = "00000027DS", + nor_3 = "00000027DST", + slt_3 = "0000002aDST", + sltu_3 = "0000002bDST", + dadd_3 = mips64 and "0000002cDST", + daddu_3 = mips64 and "0000002dDST", + dsub_3 = mips64 and "0000002eDST", + dsubu_3 = mips64 and "0000002fDST", + tge_2 = "00000030ST", + tge_3 = "00000030STZ", + tgeu_2 = "00000031ST", + tgeu_3 = "00000031STZ", + tlt_2 = "00000032ST", + tlt_3 = "00000032STZ", + tltu_2 = "00000033ST", + tltu_3 = "00000033STZ", + teq_2 = "00000034ST", + teq_3 = "00000034STZ", + tne_2 = "00000036ST", + tne_3 = "00000036STZ", + dsll_3 = mips64 and "00000038DTa", + dsrl_3 = mips64 and "0000003aDTa", + drotr_3 = mips64 and "0020003aDTa", + dsra_3 = mips64 and "0000003bDTa", + dsll32_3 = mips64 and "0000003cDTA", + dsrl32_3 = mips64 and "0000003eDTA", + drotr32_3 = mips64 and "0020003eDTA", + dsra32_3 = mips64 and "0000003fDTA", + + -- Opcode REGIMM. + bltz_2 = "04000000SB", + bgez_2 = "04010000SB", + bltzl_2 = "04020000SB", + bgezl_2 = "04030000SB", + tgei_2 = "04080000SI", + tgeiu_2 = "04090000SI", + tlti_2 = "040a0000SI", + tltiu_2 = "040b0000SI", + teqi_2 = "040c0000SI", + tnei_2 = "040e0000SI", + bltzal_2 = "04100000SB", + bal_1 = "04110000B", + bgezal_2 = "04110000SB", + bltzall_2 = "04120000SB", + bgezall_2 = "04130000SB", + synci_1 = "041f0000O", + + -- Opcode SPECIAL2. + madd_2 = "70000000ST", + maddu_2 = "70000001ST", + mul_3 = "70000002DST", + msub_2 = "70000004ST", + msubu_2 = "70000005ST", + clz_2 = "70000020DS=", + clo_2 = "70000021DS=", + dclz_2 = mips64 and "70000024DS=", + dclo_2 = mips64 and "70000025DS=", + sdbbp_0 = "7000003f", + sdbbp_1 = "7000003fY", + + -- Opcode SPECIAL3. + ext_4 = "7c000000TSAM", -- Note: last arg is msbd = size-1 + dextm_4 = mips64 and "7c000001TSAM", -- Args: pos | size-1-32 + dextu_4 = mips64 and "7c000002TSAM", -- Args: pos-32 | size-1 + dext_4 = mips64 and "7c000003TSAM", -- Args: pos | size-1 + zextw_2 = mips64 and "7c00f803TS", + ins_4 = "7c000004TSAM", -- Note: last arg is msb = pos+size-1 + dinsm_4 = mips64 and "7c000005TSAM", -- Args: pos | pos+size-33 + dinsu_4 = mips64 and "7c000006TSAM", -- Args: pos-32 | pos+size-33 + dins_4 = mips64 and "7c000007TSAM", -- Args: pos | pos+size-1 + wsbh_2 = "7c0000a0DT", + dsbh_2 = mips64 and "7c0000a4DT", + dshd_2 = mips64 and "7c000164DT", + seb_2 = "7c000420DT", + seh_2 = "7c000620DT", + rdhwr_2 = "7c00003bTD", + + -- Opcode COP0. + mfc0_2 = "40000000TD", + mfc0_3 = "40000000TDW", + dmfc0_2 = mips64 and "40200000TD", + dmfc0_3 = mips64 and "40200000TDW", + mtc0_2 = "40800000TD", + mtc0_3 = "40800000TDW", + dmtc0_2 = mips64 and "40a00000TD", + dmtc0_3 = mips64 and "40a00000TDW", + rdpgpr_2 = "41400000DT", + di_0 = "41606000", + di_1 = "41606000T", + ei_0 = "41606020", + ei_1 = "41606020T", + wrpgpr_2 = "41c00000DT", + tlbr_0 = "42000001", + tlbwi_0 = "42000002", + tlbwr_0 = "42000006", + tlbp_0 = "42000008", + eret_0 = "42000018", + deret_0 = "4200001f", + wait_0 = "42000020", + + -- Opcode COP1. + mfc1_2 = "44000000TG", + dmfc1_2 = mips64 and "44200000TG", + cfc1_2 = "44400000TG", + mfhc1_2 = "44600000TG", + mtc1_2 = "44800000TG", + dmtc1_2 = mips64 and "44a00000TG", + ctc1_2 = "44c00000TG", + mthc1_2 = "44e00000TG", + + bc1f_1 = "45000000B", + bc1f_2 = "45000000CB", + bc1t_1 = "45010000B", + bc1t_2 = "45010000CB", + bc1fl_1 = "45020000B", + bc1fl_2 = "45020000CB", + bc1tl_1 = "45030000B", + bc1tl_2 = "45030000CB", + + ["add.s_3"] = "46000000FGH", + ["sub.s_3"] = "46000001FGH", + ["mul.s_3"] = "46000002FGH", + ["div.s_3"] = "46000003FGH", + ["sqrt.s_2"] = "46000004FG", + ["abs.s_2"] = "46000005FG", + ["mov.s_2"] = "46000006FG", + ["neg.s_2"] = "46000007FG", + ["round.l.s_2"] = "46000008FG", + ["trunc.l.s_2"] = "46000009FG", + ["ceil.l.s_2"] = "4600000aFG", + ["floor.l.s_2"] = "4600000bFG", + ["round.w.s_2"] = "4600000cFG", + ["trunc.w.s_2"] = "4600000dFG", + ["ceil.w.s_2"] = "4600000eFG", + ["floor.w.s_2"] = "4600000fFG", + ["movf.s_2"] = "46000011FG", + ["movf.s_3"] = "46000011FGC", + ["movt.s_2"] = "46010011FG", + ["movt.s_3"] = "46010011FGC", + ["movz.s_3"] = "46000012FGT", + ["movn.s_3"] = "46000013FGT", + ["recip.s_2"] = "46000015FG", + ["rsqrt.s_2"] = "46000016FG", + ["cvt.d.s_2"] = "46000021FG", + ["cvt.w.s_2"] = "46000024FG", + ["cvt.l.s_2"] = "46000025FG", + ["cvt.ps.s_3"] = "46000026FGH", + ["c.f.s_2"] = "46000030GH", + ["c.f.s_3"] = "46000030VGH", + ["c.un.s_2"] = "46000031GH", + ["c.un.s_3"] = "46000031VGH", + ["c.eq.s_2"] = "46000032GH", + ["c.eq.s_3"] = "46000032VGH", + ["c.ueq.s_2"] = "46000033GH", + ["c.ueq.s_3"] = "46000033VGH", + ["c.olt.s_2"] = "46000034GH", + ["c.olt.s_3"] = "46000034VGH", + ["c.ult.s_2"] = "46000035GH", + ["c.ult.s_3"] = "46000035VGH", + ["c.ole.s_2"] = "46000036GH", + ["c.ole.s_3"] = "46000036VGH", + ["c.ule.s_2"] = "46000037GH", + ["c.ule.s_3"] = "46000037VGH", + ["c.sf.s_2"] = "46000038GH", + ["c.sf.s_3"] = "46000038VGH", + ["c.ngle.s_2"] = "46000039GH", + ["c.ngle.s_3"] = "46000039VGH", + ["c.seq.s_2"] = "4600003aGH", + ["c.seq.s_3"] = "4600003aVGH", + ["c.ngl.s_2"] = "4600003bGH", + ["c.ngl.s_3"] = "4600003bVGH", + ["c.lt.s_2"] = "4600003cGH", + ["c.lt.s_3"] = "4600003cVGH", + ["c.nge.s_2"] = "4600003dGH", + ["c.nge.s_3"] = "4600003dVGH", + ["c.le.s_2"] = "4600003eGH", + ["c.le.s_3"] = "4600003eVGH", + ["c.ngt.s_2"] = "4600003fGH", + ["c.ngt.s_3"] = "4600003fVGH", + + ["add.d_3"] = "46200000FGH", + ["sub.d_3"] = "46200001FGH", + ["mul.d_3"] = "46200002FGH", + ["div.d_3"] = "46200003FGH", + ["sqrt.d_2"] = "46200004FG", + ["abs.d_2"] = "46200005FG", + ["mov.d_2"] = "46200006FG", + ["neg.d_2"] = "46200007FG", + ["round.l.d_2"] = "46200008FG", + ["trunc.l.d_2"] = "46200009FG", + ["ceil.l.d_2"] = "4620000aFG", + ["floor.l.d_2"] = "4620000bFG", + ["round.w.d_2"] = "4620000cFG", + ["trunc.w.d_2"] = "4620000dFG", + ["ceil.w.d_2"] = "4620000eFG", + ["floor.w.d_2"] = "4620000fFG", + ["movf.d_2"] = "46200011FG", + ["movf.d_3"] = "46200011FGC", + ["movt.d_2"] = "46210011FG", + ["movt.d_3"] = "46210011FGC", + ["movz.d_3"] = "46200012FGT", + ["movn.d_3"] = "46200013FGT", + ["recip.d_2"] = "46200015FG", + ["rsqrt.d_2"] = "46200016FG", + ["cvt.s.d_2"] = "46200020FG", + ["cvt.w.d_2"] = "46200024FG", + ["cvt.l.d_2"] = "46200025FG", + ["c.f.d_2"] = "46200030GH", + ["c.f.d_3"] = "46200030VGH", + ["c.un.d_2"] = "46200031GH", + ["c.un.d_3"] = "46200031VGH", + ["c.eq.d_2"] = "46200032GH", + ["c.eq.d_3"] = "46200032VGH", + ["c.ueq.d_2"] = "46200033GH", + ["c.ueq.d_3"] = "46200033VGH", + ["c.olt.d_2"] = "46200034GH", + ["c.olt.d_3"] = "46200034VGH", + ["c.ult.d_2"] = "46200035GH", + ["c.ult.d_3"] = "46200035VGH", + ["c.ole.d_2"] = "46200036GH", + ["c.ole.d_3"] = "46200036VGH", + ["c.ule.d_2"] = "46200037GH", + ["c.ule.d_3"] = "46200037VGH", + ["c.sf.d_2"] = "46200038GH", + ["c.sf.d_3"] = "46200038VGH", + ["c.ngle.d_2"] = "46200039GH", + ["c.ngle.d_3"] = "46200039VGH", + ["c.seq.d_2"] = "4620003aGH", + ["c.seq.d_3"] = "4620003aVGH", + ["c.ngl.d_2"] = "4620003bGH", + ["c.ngl.d_3"] = "4620003bVGH", + ["c.lt.d_2"] = "4620003cGH", + ["c.lt.d_3"] = "4620003cVGH", + ["c.nge.d_2"] = "4620003dGH", + ["c.nge.d_3"] = "4620003dVGH", + ["c.le.d_2"] = "4620003eGH", + ["c.le.d_3"] = "4620003eVGH", + ["c.ngt.d_2"] = "4620003fGH", + ["c.ngt.d_3"] = "4620003fVGH", + + ["add.ps_3"] = "46c00000FGH", + ["sub.ps_3"] = "46c00001FGH", + ["mul.ps_3"] = "46c00002FGH", + ["abs.ps_2"] = "46c00005FG", + ["mov.ps_2"] = "46c00006FG", + ["neg.ps_2"] = "46c00007FG", + ["movf.ps_2"] = "46c00011FG", + ["movf.ps_3"] = "46c00011FGC", + ["movt.ps_2"] = "46c10011FG", + ["movt.ps_3"] = "46c10011FGC", + ["movz.ps_3"] = "46c00012FGT", + ["movn.ps_3"] = "46c00013FGT", + ["cvt.s.pu_2"] = "46c00020FG", + ["cvt.s.pl_2"] = "46c00028FG", + ["pll.ps_3"] = "46c0002cFGH", + ["plu.ps_3"] = "46c0002dFGH", + ["pul.ps_3"] = "46c0002eFGH", + ["puu.ps_3"] = "46c0002fFGH", + ["c.f.ps_2"] = "46c00030GH", + ["c.f.ps_3"] = "46c00030VGH", + ["c.un.ps_2"] = "46c00031GH", + ["c.un.ps_3"] = "46c00031VGH", + ["c.eq.ps_2"] = "46c00032GH", + ["c.eq.ps_3"] = "46c00032VGH", + ["c.ueq.ps_2"] = "46c00033GH", + ["c.ueq.ps_3"] = "46c00033VGH", + ["c.olt.ps_2"] = "46c00034GH", + ["c.olt.ps_3"] = "46c00034VGH", + ["c.ult.ps_2"] = "46c00035GH", + ["c.ult.ps_3"] = "46c00035VGH", + ["c.ole.ps_2"] = "46c00036GH", + ["c.ole.ps_3"] = "46c00036VGH", + ["c.ule.ps_2"] = "46c00037GH", + ["c.ule.ps_3"] = "46c00037VGH", + ["c.sf.ps_2"] = "46c00038GH", + ["c.sf.ps_3"] = "46c00038VGH", + ["c.ngle.ps_2"] = "46c00039GH", + ["c.ngle.ps_3"] = "46c00039VGH", + ["c.seq.ps_2"] = "46c0003aGH", + ["c.seq.ps_3"] = "46c0003aVGH", + ["c.ngl.ps_2"] = "46c0003bGH", + ["c.ngl.ps_3"] = "46c0003bVGH", + ["c.lt.ps_2"] = "46c0003cGH", + ["c.lt.ps_3"] = "46c0003cVGH", + ["c.nge.ps_2"] = "46c0003dGH", + ["c.nge.ps_3"] = "46c0003dVGH", + ["c.le.ps_2"] = "46c0003eGH", + ["c.le.ps_3"] = "46c0003eVGH", + ["c.ngt.ps_2"] = "46c0003fGH", + ["c.ngt.ps_3"] = "46c0003fVGH", + + ["cvt.s.w_2"] = "46800020FG", + ["cvt.d.w_2"] = "46800021FG", + + ["cvt.s.l_2"] = "46a00020FG", + ["cvt.d.l_2"] = "46a00021FG", + + -- Opcode COP1X. + lwxc1_2 = "4c000000FX", + ldxc1_2 = "4c000001FX", + luxc1_2 = "4c000005FX", + swxc1_2 = "4c000008FX", + sdxc1_2 = "4c000009FX", + suxc1_2 = "4c00000dFX", + prefx_2 = "4c00000fMX", + ["alnv.ps_4"] = "4c00001eFGHS", + ["madd.s_4"] = "4c000020FRGH", + ["madd.d_4"] = "4c000021FRGH", + ["madd.ps_4"] = "4c000026FRGH", + ["msub.s_4"] = "4c000028FRGH", + ["msub.d_4"] = "4c000029FRGH", + ["msub.ps_4"] = "4c00002eFRGH", + ["nmadd.s_4"] = "4c000030FRGH", + ["nmadd.d_4"] = "4c000031FRGH", + ["nmadd.ps_4"] = "4c000036FRGH", + ["nmsub.s_4"] = "4c000038FRGH", + ["nmsub.d_4"] = "4c000039FRGH", + ["nmsub.ps_4"] = "4c00003eFRGH", +} + +------------------------------------------------------------------------------ + +local function parse_gpr(expr) + local tname, ovreg = match(expr, "^([%w_]+):(r[1-3]?[0-9])$") + local tp = map_type[tname or expr] + if tp then + local reg = ovreg or tp.reg + if not reg then + werror("type `"..(tname or expr).."' needs a register override") + end + expr = reg + end + local r = match(expr, "^r([1-3]?[0-9])$") + if r then + r = tonumber(r) + if r <= 31 then return r, tp end + end + werror("bad register name `"..expr.."'") +end + +local function parse_fpr(expr) + local r = match(expr, "^f([1-3]?[0-9])$") + if r then + r = tonumber(r) + if r <= 31 then return r end + end + werror("bad register name `"..expr.."'") +end + +local function parse_imm(imm, bits, shift, scale, signed, action) + local n = tonumber(imm) + if n then + local m = sar(n, scale) + if shl(m, scale) == n then + if signed then + local s = sar(m, bits-1) + if s == 0 then return shl(m, shift) + elseif s == -1 then return shl(m + shl(1, bits), shift) end + else + if sar(m, bits) == 0 then return shl(m, shift) end + end + end + werror("out of range immediate `"..imm.."'") + elseif match(imm, "^[rf]([1-3]?[0-9])$") or + match(imm, "^([%w_]+):([rf][1-3]?[0-9])$") then + werror("expected immediate operand, got register") + else + waction(action or "IMM", + (signed and 32768 or 0)+shl(scale, 10)+shl(bits, 5)+shift, imm) + return 0 + end +end + +local function parse_disp(disp) + local imm, reg = match(disp, "^(.*)%(([%w_:]+)%)$") + if imm then + local r = shl(parse_gpr(reg), 21) + local extname = match(imm, "^extern%s+(%S+)$") + if extname then + waction("REL_EXT", map_extern[extname], nil, 1) + return r + else + return r + parse_imm(imm, 16, 0, 0, true) + end + end + local reg, tailr = match(disp, "^([%w_:]+)%s*(.*)$") + if reg and tailr ~= "" then + local r, tp = parse_gpr(reg) + if tp then + waction("IMM", 32768+16*32, format(tp.ctypefmt, tailr)) + return shl(r, 21) + end + end + werror("bad displacement `"..disp.."'") +end + +local function parse_index(idx) + local rt, rs = match(idx, "^(.*)%(([%w_:]+)%)$") + if rt then + rt = parse_gpr(rt) + rs = parse_gpr(rs) + return shl(rt, 16) + shl(rs, 21) + end + werror("bad index `"..idx.."'") +end + +local function parse_label(label, def) + local prefix = sub(label, 1, 2) + -- =>label (pc label reference) + if prefix == "=>" then + return "PC", 0, sub(label, 3) + end + -- ->name (global label reference) + if prefix == "->" then + return "LG", map_global[sub(label, 3)] + end + if def then + -- [1-9] (local label definition) + if match(label, "^[1-9]$") then + return "LG", 10+tonumber(label) + end + else + -- [<>][1-9] (local label reference) + local dir, lnum = match(label, "^([<>])([1-9])$") + if dir then -- Fwd: 1-9, Bkwd: 11-19. + return "LG", lnum + (dir == ">" and 0 or 10) + end + -- extern label (extern label reference) + local extname = match(label, "^extern%s+(%S+)$") + if extname then + return "EXT", map_extern[extname] + end + end + werror("bad label `"..label.."'") +end + +------------------------------------------------------------------------------ + +-- Handle opcodes defined with template strings. +map_op[".template__"] = function(params, template, nparams) + if not params then return sub(template, 9) end + local op = tonumber(sub(template, 1, 8), 16) + local n = 1 + + -- Limit number of section buffer positions used by a single dasm_put(). + -- A single opcode needs a maximum of 2 positions (ins/ext). + if secpos+2 > maxsecpos then wflush() end + local pos = wpos() + + -- Process each character. + for p in gmatch(sub(template, 9), ".") do + if p == "D" then + op = op + shl(parse_gpr(params[n]), 11); n = n + 1 + elseif p == "T" then + op = op + shl(parse_gpr(params[n]), 16); n = n + 1 + elseif p == "S" then + op = op + shl(parse_gpr(params[n]), 21); n = n + 1 + elseif p == "F" then + op = op + shl(parse_fpr(params[n]), 6); n = n + 1 + elseif p == "G" then + op = op + shl(parse_fpr(params[n]), 11); n = n + 1 + elseif p == "H" then + op = op + shl(parse_fpr(params[n]), 16); n = n + 1 + elseif p == "R" then + op = op + shl(parse_fpr(params[n]), 21); n = n + 1 + elseif p == "I" then + op = op + parse_imm(params[n], 16, 0, 0, true); n = n + 1 + elseif p == "U" then + op = op + parse_imm(params[n], 16, 0, 0, false); n = n + 1 + elseif p == "O" then + op = op + parse_disp(params[n]); n = n + 1 + elseif p == "X" then + op = op + parse_index(params[n]); n = n + 1 + elseif p == "B" or p == "J" then + local mode, m, s = parse_label(params[n], false) + if p == "B" then m = m + 2048 end + waction("REL_"..mode, m, s, 1) + n = n + 1 + elseif p == "A" then + op = op + parse_imm(params[n], 5, 6, 0, false); n = n + 1 + elseif p == "a" then + local m = parse_imm(params[n], 6, 6, 0, false, "IMMS"); n = n + 1 + op = op + band(m, 0x7c0) + band(shr(m, 9), 4) + elseif p == "M" then + op = op + parse_imm(params[n], 5, 11, 0, false); n = n + 1 + elseif p == "N" then + op = op + parse_imm(params[n], 5, 16, 0, false); n = n + 1 + elseif p == "C" then + op = op + parse_imm(params[n], 3, 18, 0, false); n = n + 1 + elseif p == "V" then + op = op + parse_imm(params[n], 3, 8, 0, false); n = n + 1 + elseif p == "W" then + op = op + parse_imm(params[n], 3, 0, 0, false); n = n + 1 + elseif p == "Y" then + op = op + parse_imm(params[n], 20, 6, 0, false); n = n + 1 + elseif p == "Z" then + op = op + parse_imm(params[n], 10, 6, 0, false); n = n + 1 + elseif p == "=" then + op = op + shl(band(op, 0xf800), 5) -- Copy D to T for clz, clo. + else + assert(false) + end + end + wputpos(pos, op) +end + +------------------------------------------------------------------------------ + +-- Pseudo-opcode to mark the position where the action list is to be emitted. +map_op[".actionlist_1"] = function(params) + if not params then return "cvar" end + local name = params[1] -- No syntax check. You get to keep the pieces. + wline(function(out) writeactions(out, name) end) +end + +-- Pseudo-opcode to mark the position where the global enum is to be emitted. +map_op[".globals_1"] = function(params) + if not params then return "prefix" end + local prefix = params[1] -- No syntax check. You get to keep the pieces. + wline(function(out) writeglobals(out, prefix) end) +end + +-- Pseudo-opcode to mark the position where the global names are to be emitted. +map_op[".globalnames_1"] = function(params) + if not params then return "cvar" end + local name = params[1] -- No syntax check. You get to keep the pieces. + wline(function(out) writeglobalnames(out, name) end) +end + +-- Pseudo-opcode to mark the position where the extern names are to be emitted. +map_op[".externnames_1"] = function(params) + if not params then return "cvar" end + local name = params[1] -- No syntax check. You get to keep the pieces. + wline(function(out) writeexternnames(out, name) end) +end + +------------------------------------------------------------------------------ + +-- Label pseudo-opcode (converted from trailing colon form). +map_op[".label_1"] = function(params) + if not params then return "[1-9] | ->global | =>pcexpr" end + if secpos+1 > maxsecpos then wflush() end + local mode, n, s = parse_label(params[1], true) + if mode == "EXT" then werror("bad label definition") end + waction("LABEL_"..mode, n, s, 1) +end + +------------------------------------------------------------------------------ + +-- Pseudo-opcodes for data storage. +map_op[".long_*"] = function(params) + if not params then return "imm..." end + for _,p in ipairs(params) do + local n = tonumber(p) + if not n then werror("bad immediate `"..p.."'") end + if n < 0 then n = n + 2^32 end + wputw(n) + if secpos+2 > maxsecpos then wflush() end + end +end + +-- Alignment pseudo-opcode. +map_op[".align_1"] = function(params) + if not params then return "numpow2" end + if secpos+1 > maxsecpos then wflush() end + local align = tonumber(params[1]) + if align then + local x = align + -- Must be a power of 2 in the range (2 ... 256). + for i=1,8 do + x = x / 2 + if x == 1 then + waction("ALIGN", align-1, nil, 1) -- Action byte is 2**n-1. + return + end + end + end + werror("bad alignment") +end + +------------------------------------------------------------------------------ + +-- Pseudo-opcode for (primitive) type definitions (map to C types). +map_op[".type_3"] = function(params, nparams) + if not params then + return nparams == 2 and "name, ctype" or "name, ctype, reg" + end + local name, ctype, reg = params[1], params[2], params[3] + if not match(name, "^[%a_][%w_]*$") then + werror("bad type name `"..name.."'") + end + local tp = map_type[name] + if tp then + werror("duplicate type `"..name.."'") + end + -- Add #type to defines. A bit unclean to put it in map_archdef. + map_archdef["#"..name] = "sizeof("..ctype..")" + -- Add new type and emit shortcut define. + local num = ctypenum + 1 + map_type[name] = { + ctype = ctype, + ctypefmt = format("Dt%X(%%s)", num), + reg = reg, + } + wline(format("#define Dt%X(_V) (int)(ptrdiff_t)&(((%s *)0)_V)", num, ctype)) + ctypenum = num +end +map_op[".type_2"] = map_op[".type_3"] + +-- Dump type definitions. +local function dumptypes(out, lvl) + local t = {} + for name in pairs(map_type) do t[#t+1] = name end + sort(t) + out:write("Type definitions:\n") + for _,name in ipairs(t) do + local tp = map_type[name] + local reg = tp.reg or "" + out:write(format(" %-20s %-20s %s\n", name, tp.ctype, reg)) + end + out:write("\n") +end + +------------------------------------------------------------------------------ + +-- Set the current section. +function _M.section(num) + waction("SECTION", num) + wflush(true) -- SECTION is a terminal action. +end + +------------------------------------------------------------------------------ + +-- Dump architecture description. +function _M.dumparch(out) + out:write(format("DynASM %s version %s, released %s\n\n", + _info.arch, _info.version, _info.release)) + dumpactions(out) +end + +-- Dump all user defined elements. +function _M.dumpdef(out, lvl) + dumptypes(out, lvl) + dumpglobals(out, lvl) + dumpexterns(out, lvl) +end + +------------------------------------------------------------------------------ + +-- Pass callbacks from/to the DynASM core. +function _M.passcb(wl, we, wf, ww) + wline, werror, wfatal, wwarn = wl, we, wf, ww + return wflush +end + +-- Setup the arch-specific module. +function _M.setup(arch, opt) + g_arch, g_opt = arch, opt +end + +-- Merge the core maps and the arch-specific maps. +function _M.mergemaps(map_coreop, map_def) + setmetatable(map_op, { __index = map_coreop }) + setmetatable(map_def, { __index = map_archdef }) + return map_op, map_def +end + +return _M + +------------------------------------------------------------------------------ + diff --git a/lib/LuaJIT/dynasm/dasm_mips64.lua b/lib/LuaJIT/dynasm/dasm_mips64.lua new file mode 100644 index 0000000..5636b23 --- /dev/null +++ b/lib/LuaJIT/dynasm/dasm_mips64.lua @@ -0,0 +1,12 @@ +------------------------------------------------------------------------------ +-- DynASM MIPS64 module. +-- +-- Copyright (C) 2005-2017 Mike Pall. All rights reserved. +-- See dynasm.lua for full copyright notice. +------------------------------------------------------------------------------ +-- This module just sets 64 bit mode for the combined MIPS/MIPS64 module. +-- All the interesting stuff is there. +------------------------------------------------------------------------------ + +mips64 = true -- Using a global is an ugly, but effective solution. +return require("dasm_mips") diff --git a/lib/LuaJIT/dynasm/dasm_ppc.h b/lib/LuaJIT/dynasm/dasm_ppc.h new file mode 100644 index 0000000..83fc030 --- /dev/null +++ b/lib/LuaJIT/dynasm/dasm_ppc.h @@ -0,0 +1,420 @@ +/* +** DynASM PPC/PPC64 encoding engine. +** Copyright (C) 2005-2017 Mike Pall. All rights reserved. +** Released under the MIT license. See dynasm.lua for full copyright notice. +*/ + +#include +#include +#include +#include + +#define DASM_ARCH "ppc" + +#ifndef DASM_EXTERN +#define DASM_EXTERN(a,b,c,d) 0 +#endif + +/* Action definitions. */ +enum { + DASM_STOP, DASM_SECTION, DASM_ESC, DASM_REL_EXT, + /* The following actions need a buffer position. */ + DASM_ALIGN, DASM_REL_LG, DASM_LABEL_LG, + /* The following actions also have an argument. */ + DASM_REL_PC, DASM_LABEL_PC, DASM_IMM, DASM_IMMSH, + DASM__MAX +}; + +/* Maximum number of section buffer positions for a single dasm_put() call. */ +#define DASM_MAXSECPOS 25 + +/* DynASM encoder status codes. Action list offset or number are or'ed in. */ +#define DASM_S_OK 0x00000000 +#define DASM_S_NOMEM 0x01000000 +#define DASM_S_PHASE 0x02000000 +#define DASM_S_MATCH_SEC 0x03000000 +#define DASM_S_RANGE_I 0x11000000 +#define DASM_S_RANGE_SEC 0x12000000 +#define DASM_S_RANGE_LG 0x13000000 +#define DASM_S_RANGE_PC 0x14000000 +#define DASM_S_RANGE_REL 0x15000000 +#define DASM_S_UNDEF_LG 0x21000000 +#define DASM_S_UNDEF_PC 0x22000000 + +/* Macros to convert positions (8 bit section + 24 bit index). */ +#define DASM_POS2IDX(pos) ((pos)&0x00ffffff) +#define DASM_POS2BIAS(pos) ((pos)&0xff000000) +#define DASM_SEC2POS(sec) ((sec)<<24) +#define DASM_POS2SEC(pos) ((pos)>>24) +#define DASM_POS2PTR(D, pos) (D->sections[DASM_POS2SEC(pos)].rbuf + (pos)) + +/* Action list type. */ +typedef const unsigned int *dasm_ActList; + +/* Per-section structure. */ +typedef struct dasm_Section { + int *rbuf; /* Biased buffer pointer (negative section bias). */ + int *buf; /* True buffer pointer. */ + size_t bsize; /* Buffer size in bytes. */ + int pos; /* Biased buffer position. */ + int epos; /* End of biased buffer position - max single put. */ + int ofs; /* Byte offset into section. */ +} dasm_Section; + +/* Core structure holding the DynASM encoding state. */ +struct dasm_State { + size_t psize; /* Allocated size of this structure. */ + dasm_ActList actionlist; /* Current actionlist pointer. */ + int *lglabels; /* Local/global chain/pos ptrs. */ + size_t lgsize; + int *pclabels; /* PC label chains/pos ptrs. */ + size_t pcsize; + void **globals; /* Array of globals (bias -10). */ + dasm_Section *section; /* Pointer to active section. */ + size_t codesize; /* Total size of all code sections. */ + int maxsection; /* 0 <= sectionidx < maxsection. */ + int status; /* Status code. */ + dasm_Section sections[1]; /* All sections. Alloc-extended. */ +}; + +/* The size of the core structure depends on the max. number of sections. */ +#define DASM_PSZ(ms) (sizeof(dasm_State)+(ms-1)*sizeof(dasm_Section)) + + +/* Initialize DynASM state. */ +void dasm_init(Dst_DECL, int maxsection) +{ + dasm_State *D; + size_t psz = 0; + int i; + Dst_REF = NULL; + DASM_M_GROW(Dst, struct dasm_State, Dst_REF, psz, DASM_PSZ(maxsection)); + D = Dst_REF; + D->psize = psz; + D->lglabels = NULL; + D->lgsize = 0; + D->pclabels = NULL; + D->pcsize = 0; + D->globals = NULL; + D->maxsection = maxsection; + for (i = 0; i < maxsection; i++) { + D->sections[i].buf = NULL; /* Need this for pass3. */ + D->sections[i].rbuf = D->sections[i].buf - DASM_SEC2POS(i); + D->sections[i].bsize = 0; + D->sections[i].epos = 0; /* Wrong, but is recalculated after resize. */ + } +} + +/* Free DynASM state. */ +void dasm_free(Dst_DECL) +{ + dasm_State *D = Dst_REF; + int i; + for (i = 0; i < D->maxsection; i++) + if (D->sections[i].buf) + DASM_M_FREE(Dst, D->sections[i].buf, D->sections[i].bsize); + if (D->pclabels) DASM_M_FREE(Dst, D->pclabels, D->pcsize); + if (D->lglabels) DASM_M_FREE(Dst, D->lglabels, D->lgsize); + DASM_M_FREE(Dst, D, D->psize); +} + +/* Setup global label array. Must be called before dasm_setup(). */ +void dasm_setupglobal(Dst_DECL, void **gl, unsigned int maxgl) +{ + dasm_State *D = Dst_REF; + D->globals = gl - 10; /* Negative bias to compensate for locals. */ + DASM_M_GROW(Dst, int, D->lglabels, D->lgsize, (10+maxgl)*sizeof(int)); +} + +/* Grow PC label array. Can be called after dasm_setup(), too. */ +void dasm_growpc(Dst_DECL, unsigned int maxpc) +{ + dasm_State *D = Dst_REF; + size_t osz = D->pcsize; + DASM_M_GROW(Dst, int, D->pclabels, D->pcsize, maxpc*sizeof(int)); + memset((void *)(((unsigned char *)D->pclabels)+osz), 0, D->pcsize-osz); +} + +/* Setup encoder. */ +void dasm_setup(Dst_DECL, const void *actionlist) +{ + dasm_State *D = Dst_REF; + int i; + D->actionlist = (dasm_ActList)actionlist; + D->status = DASM_S_OK; + D->section = &D->sections[0]; + memset((void *)D->lglabels, 0, D->lgsize); + if (D->pclabels) memset((void *)D->pclabels, 0, D->pcsize); + for (i = 0; i < D->maxsection; i++) { + D->sections[i].pos = DASM_SEC2POS(i); + D->sections[i].ofs = 0; + } +} + + +#ifdef DASM_CHECKS +#define CK(x, st) \ + do { if (!(x)) { \ + D->status = DASM_S_##st|(p-D->actionlist-1); return; } } while (0) +#define CKPL(kind, st) \ + do { if ((size_t)((char *)pl-(char *)D->kind##labels) >= D->kind##size) { \ + D->status = DASM_S_RANGE_##st|(p-D->actionlist-1); return; } } while (0) +#else +#define CK(x, st) ((void)0) +#define CKPL(kind, st) ((void)0) +#endif + +/* Pass 1: Store actions and args, link branches/labels, estimate offsets. */ +void dasm_put(Dst_DECL, int start, ...) +{ + va_list ap; + dasm_State *D = Dst_REF; + dasm_ActList p = D->actionlist + start; + dasm_Section *sec = D->section; + int pos = sec->pos, ofs = sec->ofs; + int *b; + + if (pos >= sec->epos) { + DASM_M_GROW(Dst, int, sec->buf, sec->bsize, + sec->bsize + 2*DASM_MAXSECPOS*sizeof(int)); + sec->rbuf = sec->buf - DASM_POS2BIAS(pos); + sec->epos = (int)sec->bsize/sizeof(int) - DASM_MAXSECPOS+DASM_POS2BIAS(pos); + } + + b = sec->rbuf; + b[pos++] = start; + + va_start(ap, start); + while (1) { + unsigned int ins = *p++; + unsigned int action = (ins >> 16); + if (action >= DASM__MAX) { + ofs += 4; + } else { + int *pl, n = action >= DASM_REL_PC ? va_arg(ap, int) : 0; + switch (action) { + case DASM_STOP: goto stop; + case DASM_SECTION: + n = (ins & 255); CK(n < D->maxsection, RANGE_SEC); + D->section = &D->sections[n]; goto stop; + case DASM_ESC: p++; ofs += 4; break; + case DASM_REL_EXT: break; + case DASM_ALIGN: ofs += (ins & 255); b[pos++] = ofs; break; + case DASM_REL_LG: + n = (ins & 2047) - 10; pl = D->lglabels + n; + /* Bkwd rel or global. */ + if (n >= 0) { CK(n>=10||*pl<0, RANGE_LG); CKPL(lg, LG); goto putrel; } + pl += 10; n = *pl; + if (n < 0) n = 0; /* Start new chain for fwd rel if label exists. */ + goto linkrel; + case DASM_REL_PC: + pl = D->pclabels + n; CKPL(pc, PC); + putrel: + n = *pl; + if (n < 0) { /* Label exists. Get label pos and store it. */ + b[pos] = -n; + } else { + linkrel: + b[pos] = n; /* Else link to rel chain, anchored at label. */ + *pl = pos; + } + pos++; + break; + case DASM_LABEL_LG: + pl = D->lglabels + (ins & 2047) - 10; CKPL(lg, LG); goto putlabel; + case DASM_LABEL_PC: + pl = D->pclabels + n; CKPL(pc, PC); + putlabel: + n = *pl; /* n > 0: Collapse rel chain and replace with label pos. */ + while (n > 0) { int *pb = DASM_POS2PTR(D, n); n = *pb; *pb = pos; + } + *pl = -pos; /* Label exists now. */ + b[pos++] = ofs; /* Store pass1 offset estimate. */ + break; + case DASM_IMM: +#ifdef DASM_CHECKS + CK((n & ((1<<((ins>>10)&31))-1)) == 0, RANGE_I); +#endif + n >>= ((ins>>10)&31); +#ifdef DASM_CHECKS + if (ins & 0x8000) + CK(((n + (1<<(((ins>>5)&31)-1)))>>((ins>>5)&31)) == 0, RANGE_I); + else + CK((n>>((ins>>5)&31)) == 0, RANGE_I); +#endif + b[pos++] = n; + break; + case DASM_IMMSH: + CK((n >> 6) == 0, RANGE_I); + b[pos++] = n; + break; + } + } + } +stop: + va_end(ap); + sec->pos = pos; + sec->ofs = ofs; +} +#undef CK + +/* Pass 2: Link sections, shrink aligns, fix label offsets. */ +int dasm_link(Dst_DECL, size_t *szp) +{ + dasm_State *D = Dst_REF; + int secnum; + int ofs = 0; + +#ifdef DASM_CHECKS + *szp = 0; + if (D->status != DASM_S_OK) return D->status; + { + int pc; + for (pc = 0; pc*sizeof(int) < D->pcsize; pc++) + if (D->pclabels[pc] > 0) return DASM_S_UNDEF_PC|pc; + } +#endif + + { /* Handle globals not defined in this translation unit. */ + int idx; + for (idx = 20; idx*sizeof(int) < D->lgsize; idx++) { + int n = D->lglabels[idx]; + /* Undefined label: Collapse rel chain and replace with marker (< 0). */ + while (n > 0) { int *pb = DASM_POS2PTR(D, n); n = *pb; *pb = -idx; } + } + } + + /* Combine all code sections. No support for data sections (yet). */ + for (secnum = 0; secnum < D->maxsection; secnum++) { + dasm_Section *sec = D->sections + secnum; + int *b = sec->rbuf; + int pos = DASM_SEC2POS(secnum); + int lastpos = sec->pos; + + while (pos != lastpos) { + dasm_ActList p = D->actionlist + b[pos++]; + while (1) { + unsigned int ins = *p++; + unsigned int action = (ins >> 16); + switch (action) { + case DASM_STOP: case DASM_SECTION: goto stop; + case DASM_ESC: p++; break; + case DASM_REL_EXT: break; + case DASM_ALIGN: ofs -= (b[pos++] + ofs) & (ins & 255); break; + case DASM_REL_LG: case DASM_REL_PC: pos++; break; + case DASM_LABEL_LG: case DASM_LABEL_PC: b[pos++] += ofs; break; + case DASM_IMM: case DASM_IMMSH: pos++; break; + } + } + stop: (void)0; + } + ofs += sec->ofs; /* Next section starts right after current section. */ + } + + D->codesize = ofs; /* Total size of all code sections */ + *szp = ofs; + return DASM_S_OK; +} + +#ifdef DASM_CHECKS +#define CK(x, st) \ + do { if (!(x)) return DASM_S_##st|(p-D->actionlist-1); } while (0) +#else +#define CK(x, st) ((void)0) +#endif + +/* Pass 3: Encode sections. */ +int dasm_encode(Dst_DECL, void *buffer) +{ + dasm_State *D = Dst_REF; + char *base = (char *)buffer; + unsigned int *cp = (unsigned int *)buffer; + int secnum; + + /* Encode all code sections. No support for data sections (yet). */ + for (secnum = 0; secnum < D->maxsection; secnum++) { + dasm_Section *sec = D->sections + secnum; + int *b = sec->buf; + int *endb = sec->rbuf + sec->pos; + + while (b != endb) { + dasm_ActList p = D->actionlist + *b++; + while (1) { + unsigned int ins = *p++; + unsigned int action = (ins >> 16); + int n = (action >= DASM_ALIGN && action < DASM__MAX) ? *b++ : 0; + switch (action) { + case DASM_STOP: case DASM_SECTION: goto stop; + case DASM_ESC: *cp++ = *p++; break; + case DASM_REL_EXT: + n = DASM_EXTERN(Dst, (unsigned char *)cp, (ins & 2047), 1) - 4; + goto patchrel; + case DASM_ALIGN: + ins &= 255; while ((((char *)cp - base) & ins)) *cp++ = 0x60000000; + break; + case DASM_REL_LG: + CK(n >= 0, UNDEF_LG); + /* fallthrough */ + case DASM_REL_PC: + CK(n >= 0, UNDEF_PC); + n = *DASM_POS2PTR(D, n) - (int)((char *)cp - base); + patchrel: + CK((n & 3) == 0 && + (((n+4) + ((ins & 2048) ? 0x00008000 : 0x02000000)) >> + ((ins & 2048) ? 16 : 26)) == 0, RANGE_REL); + cp[-1] |= ((n+4) & ((ins & 2048) ? 0x0000fffc: 0x03fffffc)); + break; + case DASM_LABEL_LG: + ins &= 2047; if (ins >= 20) D->globals[ins-10] = (void *)(base + n); + break; + case DASM_LABEL_PC: break; + case DASM_IMM: + cp[-1] |= (n & ((1<<((ins>>5)&31))-1)) << (ins&31); + break; + case DASM_IMMSH: + cp[-1] |= (ins & 1) ? ((n&31)<<11)|((n&32)>>4) : ((n&31)<<6)|(n&32); + break; + default: *cp++ = ins; break; + } + } + stop: (void)0; + } + } + + if (base + D->codesize != (char *)cp) /* Check for phase errors. */ + return DASM_S_PHASE; + return DASM_S_OK; +} +#undef CK + +/* Get PC label offset. */ +int dasm_getpclabel(Dst_DECL, unsigned int pc) +{ + dasm_State *D = Dst_REF; + if (pc*sizeof(int) < D->pcsize) { + int pos = D->pclabels[pc]; + if (pos < 0) return *DASM_POS2PTR(D, -pos); + if (pos > 0) return -1; /* Undefined. */ + } + return -2; /* Unused or out of range. */ +} + +#ifdef DASM_CHECKS +/* Optional sanity checker to call between isolated encoding steps. */ +int dasm_checkstep(Dst_DECL, int secmatch) +{ + dasm_State *D = Dst_REF; + if (D->status == DASM_S_OK) { + int i; + for (i = 1; i <= 9; i++) { + if (D->lglabels[i] > 0) { D->status = DASM_S_UNDEF_LG|i; break; } + D->lglabels[i] = 0; + } + } + if (D->status == DASM_S_OK && secmatch >= 0 && + D->section != &D->sections[secmatch]) + D->status = DASM_S_MATCH_SEC|(D->section-D->sections); + return D->status; +} +#endif + diff --git a/lib/LuaJIT/dynasm/dasm_ppc.lua b/lib/LuaJIT/dynasm/dasm_ppc.lua new file mode 100644 index 0000000..216f925 --- /dev/null +++ b/lib/LuaJIT/dynasm/dasm_ppc.lua @@ -0,0 +1,1919 @@ +------------------------------------------------------------------------------ +-- DynASM PPC/PPC64 module. +-- +-- Copyright (C) 2005-2017 Mike Pall. All rights reserved. +-- See dynasm.lua for full copyright notice. +-- +-- Support for various extensions contributed by Caio Souza Oliveira. +------------------------------------------------------------------------------ + +-- Module information: +local _info = { + arch = "ppc", + description = "DynASM PPC module", + version = "1.4.0", + vernum = 10400, + release = "2015-10-18", + author = "Mike Pall", + license = "MIT", +} + +-- Exported glue functions for the arch-specific module. +local _M = { _info = _info } + +-- Cache library functions. +local type, tonumber, pairs, ipairs = type, tonumber, pairs, ipairs +local assert, setmetatable = assert, setmetatable +local _s = string +local sub, format, byte, char = _s.sub, _s.format, _s.byte, _s.char +local match, gmatch = _s.match, _s.gmatch +local concat, sort = table.concat, table.sort +local bit = bit or require("bit") +local band, shl, shr, sar = bit.band, bit.lshift, bit.rshift, bit.arshift +local tohex = bit.tohex + +-- Inherited tables and callbacks. +local g_opt, g_arch +local wline, werror, wfatal, wwarn + +-- Action name list. +-- CHECK: Keep this in sync with the C code! +local action_names = { + "STOP", "SECTION", "ESC", "REL_EXT", + "ALIGN", "REL_LG", "LABEL_LG", + "REL_PC", "LABEL_PC", "IMM", "IMMSH" +} + +-- Maximum number of section buffer positions for dasm_put(). +-- CHECK: Keep this in sync with the C code! +local maxsecpos = 25 -- Keep this low, to avoid excessively long C lines. + +-- Action name -> action number. +local map_action = {} +for n,name in ipairs(action_names) do + map_action[name] = n-1 +end + +-- Action list buffer. +local actlist = {} + +-- Argument list for next dasm_put(). Start with offset 0 into action list. +local actargs = { 0 } + +-- Current number of section buffer positions for dasm_put(). +local secpos = 1 + +------------------------------------------------------------------------------ + +-- Dump action names and numbers. +local function dumpactions(out) + out:write("DynASM encoding engine action codes:\n") + for n,name in ipairs(action_names) do + local num = map_action[name] + out:write(format(" %-10s %02X %d\n", name, num, num)) + end + out:write("\n") +end + +-- Write action list buffer as a huge static C array. +local function writeactions(out, name) + local nn = #actlist + if nn == 0 then nn = 1; actlist[0] = map_action.STOP end + out:write("static const unsigned int ", name, "[", nn, "] = {\n") + for i = 1,nn-1 do + assert(out:write("0x", tohex(actlist[i]), ",\n")) + end + assert(out:write("0x", tohex(actlist[nn]), "\n};\n\n")) +end + +------------------------------------------------------------------------------ + +-- Add word to action list. +local function wputxw(n) + assert(n >= 0 and n <= 0xffffffff and n % 1 == 0, "word out of range") + actlist[#actlist+1] = n +end + +-- Add action to list with optional arg. Advance buffer pos, too. +local function waction(action, val, a, num) + local w = assert(map_action[action], "bad action name `"..action.."'") + wputxw(w * 0x10000 + (val or 0)) + if a then actargs[#actargs+1] = a end + if a or num then secpos = secpos + (num or 1) end +end + +-- Flush action list (intervening C code or buffer pos overflow). +local function wflush(term) + if #actlist == actargs[1] then return end -- Nothing to flush. + if not term then waction("STOP") end -- Terminate action list. + wline(format("dasm_put(Dst, %s);", concat(actargs, ", ")), true) + actargs = { #actlist } -- Actionlist offset is 1st arg to next dasm_put(). + secpos = 1 -- The actionlist offset occupies a buffer position, too. +end + +-- Put escaped word. +local function wputw(n) + if n <= 0xffffff then waction("ESC") end + wputxw(n) +end + +-- Reserve position for word. +local function wpos() + local pos = #actlist+1 + actlist[pos] = "" + return pos +end + +-- Store word to reserved position. +local function wputpos(pos, n) + assert(n >= 0 and n <= 0xffffffff and n % 1 == 0, "word out of range") + actlist[pos] = n +end + +------------------------------------------------------------------------------ + +-- Global label name -> global label number. With auto assignment on 1st use. +local next_global = 20 +local map_global = setmetatable({}, { __index = function(t, name) + if not match(name, "^[%a_][%w_]*$") then werror("bad global label") end + local n = next_global + if n > 2047 then werror("too many global labels") end + next_global = n + 1 + t[name] = n + return n +end}) + +-- Dump global labels. +local function dumpglobals(out, lvl) + local t = {} + for name, n in pairs(map_global) do t[n] = name end + out:write("Global labels:\n") + for i=20,next_global-1 do + out:write(format(" %s\n", t[i])) + end + out:write("\n") +end + +-- Write global label enum. +local function writeglobals(out, prefix) + local t = {} + for name, n in pairs(map_global) do t[n] = name end + out:write("enum {\n") + for i=20,next_global-1 do + out:write(" ", prefix, t[i], ",\n") + end + out:write(" ", prefix, "_MAX\n};\n") +end + +-- Write global label names. +local function writeglobalnames(out, name) + local t = {} + for name, n in pairs(map_global) do t[n] = name end + out:write("static const char *const ", name, "[] = {\n") + for i=20,next_global-1 do + out:write(" \"", t[i], "\",\n") + end + out:write(" (const char *)0\n};\n") +end + +------------------------------------------------------------------------------ + +-- Extern label name -> extern label number. With auto assignment on 1st use. +local next_extern = 0 +local map_extern_ = {} +local map_extern = setmetatable({}, { __index = function(t, name) + -- No restrictions on the name for now. + local n = next_extern + if n > 2047 then werror("too many extern labels") end + next_extern = n + 1 + t[name] = n + map_extern_[n] = name + return n +end}) + +-- Dump extern labels. +local function dumpexterns(out, lvl) + out:write("Extern labels:\n") + for i=0,next_extern-1 do + out:write(format(" %s\n", map_extern_[i])) + end + out:write("\n") +end + +-- Write extern label names. +local function writeexternnames(out, name) + out:write("static const char *const ", name, "[] = {\n") + for i=0,next_extern-1 do + out:write(" \"", map_extern_[i], "\",\n") + end + out:write(" (const char *)0\n};\n") +end + +------------------------------------------------------------------------------ + +-- Arch-specific maps. +local map_archdef = { sp = "r1" } -- Ext. register name -> int. name. + +local map_type = {} -- Type name -> { ctype, reg } +local ctypenum = 0 -- Type number (for Dt... macros). + +-- Reverse defines for registers. +function _M.revdef(s) + if s == "r1" then return "sp" end + return s +end + +local map_cond = { + lt = 0, gt = 1, eq = 2, so = 3, + ge = 4, le = 5, ne = 6, ns = 7, +} + +------------------------------------------------------------------------------ + +local map_op, op_template + +local function op_alias(opname, f) + return function(params, nparams) + if not params then return "-> "..opname:sub(1, -3) end + f(params, nparams) + op_template(params, map_op[opname], nparams) + end +end + +-- Template strings for PPC instructions. +map_op = { + tdi_3 = "08000000ARI", + twi_3 = "0c000000ARI", + mulli_3 = "1c000000RRI", + subfic_3 = "20000000RRI", + cmplwi_3 = "28000000XRU", + cmplwi_2 = "28000000-RU", + cmpldi_3 = "28200000XRU", + cmpldi_2 = "28200000-RU", + cmpwi_3 = "2c000000XRI", + cmpwi_2 = "2c000000-RI", + cmpdi_3 = "2c200000XRI", + cmpdi_2 = "2c200000-RI", + addic_3 = "30000000RRI", + ["addic._3"] = "34000000RRI", + addi_3 = "38000000RR0I", + li_2 = "38000000RI", + la_2 = "38000000RD", + addis_3 = "3c000000RR0I", + lis_2 = "3c000000RI", + lus_2 = "3c000000RU", + bc_3 = "40000000AAK", + bcl_3 = "40000001AAK", + bdnz_1 = "42000000K", + bdz_1 = "42400000K", + sc_0 = "44000000", + b_1 = "48000000J", + bl_1 = "48000001J", + rlwimi_5 = "50000000RR~AAA.", + rlwinm_5 = "54000000RR~AAA.", + rlwnm_5 = "5c000000RR~RAA.", + ori_3 = "60000000RR~U", + nop_0 = "60000000", + oris_3 = "64000000RR~U", + xori_3 = "68000000RR~U", + xoris_3 = "6c000000RR~U", + ["andi._3"] = "70000000RR~U", + ["andis._3"] = "74000000RR~U", + lwz_2 = "80000000RD", + lwzu_2 = "84000000RD", + lbz_2 = "88000000RD", + lbzu_2 = "8c000000RD", + stw_2 = "90000000RD", + stwu_2 = "94000000RD", + stb_2 = "98000000RD", + stbu_2 = "9c000000RD", + lhz_2 = "a0000000RD", + lhzu_2 = "a4000000RD", + lha_2 = "a8000000RD", + lhau_2 = "ac000000RD", + sth_2 = "b0000000RD", + sthu_2 = "b4000000RD", + lmw_2 = "b8000000RD", + stmw_2 = "bc000000RD", + lfs_2 = "c0000000FD", + lfsu_2 = "c4000000FD", + lfd_2 = "c8000000FD", + lfdu_2 = "cc000000FD", + stfs_2 = "d0000000FD", + stfsu_2 = "d4000000FD", + stfd_2 = "d8000000FD", + stfdu_2 = "dc000000FD", + ld_2 = "e8000000RD", -- NYI: displacement must be divisible by 4. + ldu_2 = "e8000001RD", + lwa_2 = "e8000002RD", + std_2 = "f8000000RD", + stdu_2 = "f8000001RD", + + subi_3 = op_alias("addi_3", function(p) p[3] = "-("..p[3]..")" end), + subis_3 = op_alias("addis_3", function(p) p[3] = "-("..p[3]..")" end), + subic_3 = op_alias("addic_3", function(p) p[3] = "-("..p[3]..")" end), + ["subic._3"] = op_alias("addic._3", function(p) p[3] = "-("..p[3]..")" end), + + rotlwi_3 = op_alias("rlwinm_5", function(p) + p[4] = "0"; p[5] = "31" + end), + rotrwi_3 = op_alias("rlwinm_5", function(p) + p[3] = "32-("..p[3]..")"; p[4] = "0"; p[5] = "31" + end), + rotlw_3 = op_alias("rlwnm_5", function(p) + p[4] = "0"; p[5] = "31" + end), + slwi_3 = op_alias("rlwinm_5", function(p) + p[5] = "31-("..p[3]..")"; p[4] = "0" + end), + srwi_3 = op_alias("rlwinm_5", function(p) + p[4] = p[3]; p[3] = "32-("..p[3]..")"; p[5] = "31" + end), + clrlwi_3 = op_alias("rlwinm_5", function(p) + p[4] = p[3]; p[3] = "0"; p[5] = "31" + end), + clrrwi_3 = op_alias("rlwinm_5", function(p) + p[5] = "31-("..p[3]..")"; p[3] = "0"; p[4] = "0" + end), + + -- Primary opcode 4: + mulhhwu_3 = "10000010RRR.", + machhwu_3 = "10000018RRR.", + mulhhw_3 = "10000050RRR.", + nmachhw_3 = "1000005cRRR.", + machhwsu_3 = "10000098RRR.", + machhws_3 = "100000d8RRR.", + nmachhws_3 = "100000dcRRR.", + mulchwu_3 = "10000110RRR.", + macchwu_3 = "10000118RRR.", + mulchw_3 = "10000150RRR.", + macchw_3 = "10000158RRR.", + nmacchw_3 = "1000015cRRR.", + macchwsu_3 = "10000198RRR.", + macchws_3 = "100001d8RRR.", + nmacchws_3 = "100001dcRRR.", + mullhw_3 = "10000350RRR.", + maclhw_3 = "10000358RRR.", + nmaclhw_3 = "1000035cRRR.", + maclhwsu_3 = "10000398RRR.", + maclhws_3 = "100003d8RRR.", + nmaclhws_3 = "100003dcRRR.", + machhwuo_3 = "10000418RRR.", + nmachhwo_3 = "1000045cRRR.", + machhwsuo_3 = "10000498RRR.", + machhwso_3 = "100004d8RRR.", + nmachhwso_3 = "100004dcRRR.", + macchwuo_3 = "10000518RRR.", + macchwo_3 = "10000558RRR.", + nmacchwo_3 = "1000055cRRR.", + macchwsuo_3 = "10000598RRR.", + macchwso_3 = "100005d8RRR.", + nmacchwso_3 = "100005dcRRR.", + maclhwo_3 = "10000758RRR.", + nmaclhwo_3 = "1000075cRRR.", + maclhwsuo_3 = "10000798RRR.", + maclhwso_3 = "100007d8RRR.", + nmaclhwso_3 = "100007dcRRR.", + + vaddubm_3 = "10000000VVV", + vmaxub_3 = "10000002VVV", + vrlb_3 = "10000004VVV", + vcmpequb_3 = "10000006VVV", + vmuloub_3 = "10000008VVV", + vaddfp_3 = "1000000aVVV", + vmrghb_3 = "1000000cVVV", + vpkuhum_3 = "1000000eVVV", + vmhaddshs_4 = "10000020VVVV", + vmhraddshs_4 = "10000021VVVV", + vmladduhm_4 = "10000022VVVV", + vmsumubm_4 = "10000024VVVV", + vmsummbm_4 = "10000025VVVV", + vmsumuhm_4 = "10000026VVVV", + vmsumuhs_4 = "10000027VVVV", + vmsumshm_4 = "10000028VVVV", + vmsumshs_4 = "10000029VVVV", + vsel_4 = "1000002aVVVV", + vperm_4 = "1000002bVVVV", + vsldoi_4 = "1000002cVVVP", + vpermxor_4 = "1000002dVVVV", + vmaddfp_4 = "1000002eVVVV~", + vnmsubfp_4 = "1000002fVVVV~", + vaddeuqm_4 = "1000003cVVVV", + vaddecuq_4 = "1000003dVVVV", + vsubeuqm_4 = "1000003eVVVV", + vsubecuq_4 = "1000003fVVVV", + vadduhm_3 = "10000040VVV", + vmaxuh_3 = "10000042VVV", + vrlh_3 = "10000044VVV", + vcmpequh_3 = "10000046VVV", + vmulouh_3 = "10000048VVV", + vsubfp_3 = "1000004aVVV", + vmrghh_3 = "1000004cVVV", + vpkuwum_3 = "1000004eVVV", + vadduwm_3 = "10000080VVV", + vmaxuw_3 = "10000082VVV", + vrlw_3 = "10000084VVV", + vcmpequw_3 = "10000086VVV", + vmulouw_3 = "10000088VVV", + vmuluwm_3 = "10000089VVV", + vmrghw_3 = "1000008cVVV", + vpkuhus_3 = "1000008eVVV", + vaddudm_3 = "100000c0VVV", + vmaxud_3 = "100000c2VVV", + vrld_3 = "100000c4VVV", + vcmpeqfp_3 = "100000c6VVV", + vcmpequd_3 = "100000c7VVV", + vpkuwus_3 = "100000ceVVV", + vadduqm_3 = "10000100VVV", + vmaxsb_3 = "10000102VVV", + vslb_3 = "10000104VVV", + vmulosb_3 = "10000108VVV", + vrefp_2 = "1000010aV-V", + vmrglb_3 = "1000010cVVV", + vpkshus_3 = "1000010eVVV", + vaddcuq_3 = "10000140VVV", + vmaxsh_3 = "10000142VVV", + vslh_3 = "10000144VVV", + vmulosh_3 = "10000148VVV", + vrsqrtefp_2 = "1000014aV-V", + vmrglh_3 = "1000014cVVV", + vpkswus_3 = "1000014eVVV", + vaddcuw_3 = "10000180VVV", + vmaxsw_3 = "10000182VVV", + vslw_3 = "10000184VVV", + vmulosw_3 = "10000188VVV", + vexptefp_2 = "1000018aV-V", + vmrglw_3 = "1000018cVVV", + vpkshss_3 = "1000018eVVV", + vmaxsd_3 = "100001c2VVV", + vsl_3 = "100001c4VVV", + vcmpgefp_3 = "100001c6VVV", + vlogefp_2 = "100001caV-V", + vpkswss_3 = "100001ceVVV", + vadduhs_3 = "10000240VVV", + vminuh_3 = "10000242VVV", + vsrh_3 = "10000244VVV", + vcmpgtuh_3 = "10000246VVV", + vmuleuh_3 = "10000248VVV", + vrfiz_2 = "1000024aV-V", + vsplth_3 = "1000024cVV3", + vupkhsh_2 = "1000024eV-V", + vminuw_3 = "10000282VVV", + vminud_3 = "100002c2VVV", + vcmpgtud_3 = "100002c7VVV", + vrfim_2 = "100002caV-V", + vcmpgtsb_3 = "10000306VVV", + vcfux_3 = "1000030aVVA~", + vaddshs_3 = "10000340VVV", + vminsh_3 = "10000342VVV", + vsrah_3 = "10000344VVV", + vcmpgtsh_3 = "10000346VVV", + vmulesh_3 = "10000348VVV", + vcfsx_3 = "1000034aVVA~", + vspltish_2 = "1000034cVS", + vupkhpx_2 = "1000034eV-V", + vaddsws_3 = "10000380VVV", + vminsw_3 = "10000382VVV", + vsraw_3 = "10000384VVV", + vcmpgtsw_3 = "10000386VVV", + vmulesw_3 = "10000388VVV", + vctuxs_3 = "1000038aVVA~", + vspltisw_2 = "1000038cVS", + vminsd_3 = "100003c2VVV", + vsrad_3 = "100003c4VVV", + vcmpbfp_3 = "100003c6VVV", + vcmpgtsd_3 = "100003c7VVV", + vctsxs_3 = "100003caVVA~", + vupklpx_2 = "100003ceV-V", + vsububm_3 = "10000400VVV", + ["bcdadd._4"] = "10000401VVVy.", + vavgub_3 = "10000402VVV", + vand_3 = "10000404VVV", + ["vcmpequb._3"] = "10000406VVV", + vmaxfp_3 = "1000040aVVV", + vsubuhm_3 = "10000440VVV", + ["bcdsub._4"] = "10000441VVVy.", + vavguh_3 = "10000442VVV", + vandc_3 = "10000444VVV", + ["vcmpequh._3"] = "10000446VVV", + vminfp_3 = "1000044aVVV", + vpkudum_3 = "1000044eVVV", + vsubuwm_3 = "10000480VVV", + vavguw_3 = "10000482VVV", + vor_3 = "10000484VVV", + ["vcmpequw._3"] = "10000486VVV", + vpmsumw_3 = "10000488VVV", + ["vcmpeqfp._3"] = "100004c6VVV", + ["vcmpequd._3"] = "100004c7VVV", + vpkudus_3 = "100004ceVVV", + vavgsb_3 = "10000502VVV", + vavgsh_3 = "10000542VVV", + vorc_3 = "10000544VVV", + vbpermq_3 = "1000054cVVV", + vpksdus_3 = "1000054eVVV", + vavgsw_3 = "10000582VVV", + vsld_3 = "100005c4VVV", + ["vcmpgefp._3"] = "100005c6VVV", + vpksdss_3 = "100005ceVVV", + vsububs_3 = "10000600VVV", + mfvscr_1 = "10000604V--", + vsum4ubs_3 = "10000608VVV", + vsubuhs_3 = "10000640VVV", + mtvscr_1 = "10000644--V", + ["vcmpgtuh._3"] = "10000646VVV", + vsum4shs_3 = "10000648VVV", + vupkhsw_2 = "1000064eV-V", + vsubuws_3 = "10000680VVV", + vshasigmaw_4 = "10000682VVYp", + veqv_3 = "10000684VVV", + vsum2sws_3 = "10000688VVV", + vmrgow_3 = "1000068cVVV", + vshasigmad_4 = "100006c2VVYp", + vsrd_3 = "100006c4VVV", + ["vcmpgtud._3"] = "100006c7VVV", + vupklsw_2 = "100006ceV-V", + vupkslw_2 = "100006ceV-V", + vsubsbs_3 = "10000700VVV", + vclzb_2 = "10000702V-V", + vpopcntb_2 = "10000703V-V", + ["vcmpgtsb._3"] = "10000706VVV", + vsum4sbs_3 = "10000708VVV", + vsubshs_3 = "10000740VVV", + vclzh_2 = "10000742V-V", + vpopcnth_2 = "10000743V-V", + ["vcmpgtsh._3"] = "10000746VVV", + vsubsws_3 = "10000780VVV", + vclzw_2 = "10000782V-V", + vpopcntw_2 = "10000783V-V", + ["vcmpgtsw._3"] = "10000786VVV", + vsumsws_3 = "10000788VVV", + vmrgew_3 = "1000078cVVV", + vclzd_2 = "100007c2V-V", + vpopcntd_2 = "100007c3V-V", + ["vcmpbfp._3"] = "100007c6VVV", + ["vcmpgtsd._3"] = "100007c7VVV", + + -- Primary opcode 19: + mcrf_2 = "4c000000XX", + isync_0 = "4c00012c", + crnor_3 = "4c000042CCC", + crnot_2 = "4c000042CC=", + crandc_3 = "4c000102CCC", + crxor_3 = "4c000182CCC", + crclr_1 = "4c000182C==", + crnand_3 = "4c0001c2CCC", + crand_3 = "4c000202CCC", + creqv_3 = "4c000242CCC", + crset_1 = "4c000242C==", + crorc_3 = "4c000342CCC", + cror_3 = "4c000382CCC", + crmove_2 = "4c000382CC=", + bclr_2 = "4c000020AA", + bclrl_2 = "4c000021AA", + bcctr_2 = "4c000420AA", + bcctrl_2 = "4c000421AA", + bctar_2 = "4c000460AA", + bctarl_2 = "4c000461AA", + blr_0 = "4e800020", + blrl_0 = "4e800021", + bctr_0 = "4e800420", + bctrl_0 = "4e800421", + + -- Primary opcode 31: + cmpw_3 = "7c000000XRR", + cmpw_2 = "7c000000-RR", + cmpd_3 = "7c200000XRR", + cmpd_2 = "7c200000-RR", + tw_3 = "7c000008ARR", + lvsl_3 = "7c00000cVRR", + subfc_3 = "7c000010RRR.", + subc_3 = "7c000010RRR~.", + mulhdu_3 = "7c000012RRR.", + addc_3 = "7c000014RRR.", + mulhwu_3 = "7c000016RRR.", + isel_4 = "7c00001eRRRC", + isellt_3 = "7c00001eRRR", + iselgt_3 = "7c00005eRRR", + iseleq_3 = "7c00009eRRR", + mfcr_1 = "7c000026R", + mfocrf_2 = "7c100026RG", + mtcrf_2 = "7c000120GR", + mtocrf_2 = "7c100120GR", + lwarx_3 = "7c000028RR0R", + ldx_3 = "7c00002aRR0R", + lwzx_3 = "7c00002eRR0R", + slw_3 = "7c000030RR~R.", + cntlzw_2 = "7c000034RR~", + sld_3 = "7c000036RR~R.", + and_3 = "7c000038RR~R.", + cmplw_3 = "7c000040XRR", + cmplw_2 = "7c000040-RR", + cmpld_3 = "7c200040XRR", + cmpld_2 = "7c200040-RR", + lvsr_3 = "7c00004cVRR", + subf_3 = "7c000050RRR.", + sub_3 = "7c000050RRR~.", + lbarx_3 = "7c000068RR0R", + ldux_3 = "7c00006aRR0R", + dcbst_2 = "7c00006c-RR", + lwzux_3 = "7c00006eRR0R", + cntlzd_2 = "7c000074RR~", + andc_3 = "7c000078RR~R.", + td_3 = "7c000088ARR", + lvewx_3 = "7c00008eVRR", + mulhd_3 = "7c000092RRR.", + addg6s_3 = "7c000094RRR", + mulhw_3 = "7c000096RRR.", + dlmzb_3 = "7c00009cRR~R.", + ldarx_3 = "7c0000a8RR0R", + dcbf_2 = "7c0000ac-RR", + lbzx_3 = "7c0000aeRR0R", + lvx_3 = "7c0000ceVRR", + neg_2 = "7c0000d0RR.", + lharx_3 = "7c0000e8RR0R", + lbzux_3 = "7c0000eeRR0R", + popcntb_2 = "7c0000f4RR~", + not_2 = "7c0000f8RR~%.", + nor_3 = "7c0000f8RR~R.", + stvebx_3 = "7c00010eVRR", + subfe_3 = "7c000110RRR.", + sube_3 = "7c000110RRR~.", + adde_3 = "7c000114RRR.", + stdx_3 = "7c00012aRR0R", + ["stwcx._3"] = "7c00012dRR0R.", + stwx_3 = "7c00012eRR0R", + prtyw_2 = "7c000134RR~", + stvehx_3 = "7c00014eVRR", + stdux_3 = "7c00016aRR0R", + ["stqcx._3"] = "7c00016dR:R0R.", + stwux_3 = "7c00016eRR0R", + prtyd_2 = "7c000174RR~", + stvewx_3 = "7c00018eVRR", + subfze_2 = "7c000190RR.", + addze_2 = "7c000194RR.", + ["stdcx._3"] = "7c0001adRR0R.", + stbx_3 = "7c0001aeRR0R", + stvx_3 = "7c0001ceVRR", + subfme_2 = "7c0001d0RR.", + mulld_3 = "7c0001d2RRR.", + addme_2 = "7c0001d4RR.", + mullw_3 = "7c0001d6RRR.", + dcbtst_2 = "7c0001ec-RR", + stbux_3 = "7c0001eeRR0R", + bpermd_3 = "7c0001f8RR~R", + lvepxl_3 = "7c00020eVRR", + add_3 = "7c000214RRR.", + lqarx_3 = "7c000228R:R0R", + dcbt_2 = "7c00022c-RR", + lhzx_3 = "7c00022eRR0R", + cdtbcd_2 = "7c000234RR~", + eqv_3 = "7c000238RR~R.", + lvepx_3 = "7c00024eVRR", + eciwx_3 = "7c00026cRR0R", + lhzux_3 = "7c00026eRR0R", + cbcdtd_2 = "7c000274RR~", + xor_3 = "7c000278RR~R.", + mfspefscr_1 = "7c0082a6R", + mfxer_1 = "7c0102a6R", + mflr_1 = "7c0802a6R", + mfctr_1 = "7c0902a6R", + lwax_3 = "7c0002aaRR0R", + lhax_3 = "7c0002aeRR0R", + mftb_1 = "7c0c42e6R", + mftbu_1 = "7c0d42e6R", + lvxl_3 = "7c0002ceVRR", + lwaux_3 = "7c0002eaRR0R", + lhaux_3 = "7c0002eeRR0R", + popcntw_2 = "7c0002f4RR~", + divdeu_3 = "7c000312RRR.", + divweu_3 = "7c000316RRR.", + sthx_3 = "7c00032eRR0R", + orc_3 = "7c000338RR~R.", + ecowx_3 = "7c00036cRR0R", + sthux_3 = "7c00036eRR0R", + or_3 = "7c000378RR~R.", + mr_2 = "7c000378RR~%.", + divdu_3 = "7c000392RRR.", + divwu_3 = "7c000396RRR.", + mtspefscr_1 = "7c0083a6R", + mtxer_1 = "7c0103a6R", + mtlr_1 = "7c0803a6R", + mtctr_1 = "7c0903a6R", + dcbi_2 = "7c0003ac-RR", + nand_3 = "7c0003b8RR~R.", + dsn_2 = "7c0003c6-RR", + stvxl_3 = "7c0003ceVRR", + divd_3 = "7c0003d2RRR.", + divw_3 = "7c0003d6RRR.", + popcntd_2 = "7c0003f4RR~", + cmpb_3 = "7c0003f8RR~R.", + mcrxr_1 = "7c000400X", + lbdx_3 = "7c000406RRR", + subfco_3 = "7c000410RRR.", + subco_3 = "7c000410RRR~.", + addco_3 = "7c000414RRR.", + ldbrx_3 = "7c000428RR0R", + lswx_3 = "7c00042aRR0R", + lwbrx_3 = "7c00042cRR0R", + lfsx_3 = "7c00042eFR0R", + srw_3 = "7c000430RR~R.", + srd_3 = "7c000436RR~R.", + lhdx_3 = "7c000446RRR", + subfo_3 = "7c000450RRR.", + subo_3 = "7c000450RRR~.", + lfsux_3 = "7c00046eFR0R", + lwdx_3 = "7c000486RRR", + lswi_3 = "7c0004aaRR0A", + sync_0 = "7c0004ac", + lwsync_0 = "7c2004ac", + ptesync_0 = "7c4004ac", + lfdx_3 = "7c0004aeFR0R", + lddx_3 = "7c0004c6RRR", + nego_2 = "7c0004d0RR.", + lfdux_3 = "7c0004eeFR0R", + stbdx_3 = "7c000506RRR", + subfeo_3 = "7c000510RRR.", + subeo_3 = "7c000510RRR~.", + addeo_3 = "7c000514RRR.", + stdbrx_3 = "7c000528RR0R", + stswx_3 = "7c00052aRR0R", + stwbrx_3 = "7c00052cRR0R", + stfsx_3 = "7c00052eFR0R", + sthdx_3 = "7c000546RRR", + ["stbcx._3"] = "7c00056dRRR", + stfsux_3 = "7c00056eFR0R", + stwdx_3 = "7c000586RRR", + subfzeo_2 = "7c000590RR.", + addzeo_2 = "7c000594RR.", + stswi_3 = "7c0005aaRR0A", + ["sthcx._3"] = "7c0005adRRR", + stfdx_3 = "7c0005aeFR0R", + stddx_3 = "7c0005c6RRR", + subfmeo_2 = "7c0005d0RR.", + mulldo_3 = "7c0005d2RRR.", + addmeo_2 = "7c0005d4RR.", + mullwo_3 = "7c0005d6RRR.", + dcba_2 = "7c0005ec-RR", + stfdux_3 = "7c0005eeFR0R", + stvepxl_3 = "7c00060eVRR", + addo_3 = "7c000614RRR.", + lhbrx_3 = "7c00062cRR0R", + lfdpx_3 = "7c00062eF:RR", + sraw_3 = "7c000630RR~R.", + srad_3 = "7c000634RR~R.", + lfddx_3 = "7c000646FRR", + stvepx_3 = "7c00064eVRR", + srawi_3 = "7c000670RR~A.", + sradi_3 = "7c000674RR~H.", + eieio_0 = "7c0006ac", + lfiwax_3 = "7c0006aeFR0R", + divdeuo_3 = "7c000712RRR.", + divweuo_3 = "7c000716RRR.", + sthbrx_3 = "7c00072cRR0R", + stfdpx_3 = "7c00072eF:RR", + extsh_2 = "7c000734RR~.", + stfddx_3 = "7c000746FRR", + divdeo_3 = "7c000752RRR.", + divweo_3 = "7c000756RRR.", + extsb_2 = "7c000774RR~.", + divduo_3 = "7c000792RRR.", + divwou_3 = "7c000796RRR.", + icbi_2 = "7c0007ac-RR", + stfiwx_3 = "7c0007aeFR0R", + extsw_2 = "7c0007b4RR~.", + divdo_3 = "7c0007d2RRR.", + divwo_3 = "7c0007d6RRR.", + dcbz_2 = "7c0007ec-RR", + + ["tbegin._1"] = "7c00051d1", + ["tbegin._0"] = "7c00051d", + ["tend._1"] = "7c00055dY", + ["tend._0"] = "7c00055d", + ["tendall._0"] = "7e00055d", + tcheck_1 = "7c00059cX", + ["tsr._1"] = "7c0005dd1", + ["tsuspend._0"] = "7c0005dd", + ["tresume._0"] = "7c2005dd", + ["tabortwc._3"] = "7c00061dARR", + ["tabortdc._3"] = "7c00065dARR", + ["tabortwci._3"] = "7c00069dARS", + ["tabortdci._3"] = "7c0006ddARS", + ["tabort._1"] = "7c00071d-R-", + ["treclaim._1"] = "7c00075d-R", + ["trechkpt._0"] = "7c0007dd", + + lxsiwzx_3 = "7c000018QRR", + lxsiwax_3 = "7c000098QRR", + mfvsrd_2 = "7c000066-Rq", + mfvsrwz_2 = "7c0000e6-Rq", + stxsiwx_3 = "7c000118QRR", + mtvsrd_2 = "7c000166QR", + mtvsrwa_2 = "7c0001a6QR", + lxvdsx_3 = "7c000298QRR", + lxsspx_3 = "7c000418QRR", + lxsdx_3 = "7c000498QRR", + stxsspx_3 = "7c000518QRR", + stxsdx_3 = "7c000598QRR", + lxvw4x_3 = "7c000618QRR", + lxvd2x_3 = "7c000698QRR", + stxvw4x_3 = "7c000718QRR", + stxvd2x_3 = "7c000798QRR", + + -- Primary opcode 30: + rldicl_4 = "78000000RR~HM.", + rldicr_4 = "78000004RR~HM.", + rldic_4 = "78000008RR~HM.", + rldimi_4 = "7800000cRR~HM.", + rldcl_4 = "78000010RR~RM.", + rldcr_4 = "78000012RR~RM.", + + rotldi_3 = op_alias("rldicl_4", function(p) + p[4] = "0" + end), + rotrdi_3 = op_alias("rldicl_4", function(p) + p[3] = "64-("..p[3]..")"; p[4] = "0" + end), + rotld_3 = op_alias("rldcl_4", function(p) + p[4] = "0" + end), + sldi_3 = op_alias("rldicr_4", function(p) + p[4] = "63-("..p[3]..")" + end), + srdi_3 = op_alias("rldicl_4", function(p) + p[4] = p[3]; p[3] = "64-("..p[3]..")" + end), + clrldi_3 = op_alias("rldicl_4", function(p) + p[4] = p[3]; p[3] = "0" + end), + clrrdi_3 = op_alias("rldicr_4", function(p) + p[4] = "63-("..p[3]..")"; p[3] = "0" + end), + + -- Primary opcode 56: + lq_2 = "e0000000R:D", -- NYI: displacement must be divisible by 8. + + -- Primary opcode 57: + lfdp_2 = "e4000000F:D", -- NYI: displacement must be divisible by 4. + + -- Primary opcode 59: + fdivs_3 = "ec000024FFF.", + fsubs_3 = "ec000028FFF.", + fadds_3 = "ec00002aFFF.", + fsqrts_2 = "ec00002cF-F.", + fres_2 = "ec000030F-F.", + fmuls_3 = "ec000032FF-F.", + frsqrtes_2 = "ec000034F-F.", + fmsubs_4 = "ec000038FFFF~.", + fmadds_4 = "ec00003aFFFF~.", + fnmsubs_4 = "ec00003cFFFF~.", + fnmadds_4 = "ec00003eFFFF~.", + fcfids_2 = "ec00069cF-F.", + fcfidus_2 = "ec00079cF-F.", + + dadd_3 = "ec000004FFF.", + dqua_4 = "ec000006FFFZ.", + dmul_3 = "ec000044FFF.", + drrnd_4 = "ec000046FFFZ.", + dscli_3 = "ec000084FF6.", + dquai_4 = "ec000086SF~FZ.", + dscri_3 = "ec0000c4FF6.", + drintx_4 = "ec0000c61F~FZ.", + dcmpo_3 = "ec000104XFF", + dtstex_3 = "ec000144XFF", + dtstdc_3 = "ec000184XF6", + dtstdg_3 = "ec0001c4XF6", + drintn_4 = "ec0001c61F~FZ.", + dctdp_2 = "ec000204F-F.", + dctfix_2 = "ec000244F-F.", + ddedpd_3 = "ec000284ZF~F.", + dxex_2 = "ec0002c4F-F.", + dsub_3 = "ec000404FFF.", + ddiv_3 = "ec000444FFF.", + dcmpu_3 = "ec000504XFF", + dtstsf_3 = "ec000544XFF", + drsp_2 = "ec000604F-F.", + dcffix_2 = "ec000644F-F.", + denbcd_3 = "ec000684YF~F.", + diex_3 = "ec0006c4FFF.", + + -- Primary opcode 60: + xsaddsp_3 = "f0000000QQQ", + xsmaddasp_3 = "f0000008QQQ", + xxsldwi_4 = "f0000010QQQz", + xsrsqrtesp_2 = "f0000028Q-Q", + xssqrtsp_2 = "f000002cQ-Q", + xxsel_4 = "f0000030QQQQ", + xssubsp_3 = "f0000040QQQ", + xsmaddmsp_3 = "f0000048QQQ", + xxpermdi_4 = "f0000050QQQz", + xsresp_2 = "f0000068Q-Q", + xsmulsp_3 = "f0000080QQQ", + xsmsubasp_3 = "f0000088QQQ", + xxmrghw_3 = "f0000090QQQ", + xsdivsp_3 = "f00000c0QQQ", + xsmsubmsp_3 = "f00000c8QQQ", + xsadddp_3 = "f0000100QQQ", + xsmaddadp_3 = "f0000108QQQ", + xscmpudp_3 = "f0000118XQQ", + xscvdpuxws_2 = "f0000120Q-Q", + xsrdpi_2 = "f0000124Q-Q", + xsrsqrtedp_2 = "f0000128Q-Q", + xssqrtdp_2 = "f000012cQ-Q", + xssubdp_3 = "f0000140QQQ", + xsmaddmdp_3 = "f0000148QQQ", + xscmpodp_3 = "f0000158XQQ", + xscvdpsxws_2 = "f0000160Q-Q", + xsrdpiz_2 = "f0000164Q-Q", + xsredp_2 = "f0000168Q-Q", + xsmuldp_3 = "f0000180QQQ", + xsmsubadp_3 = "f0000188QQQ", + xxmrglw_3 = "f0000190QQQ", + xsrdpip_2 = "f00001a4Q-Q", + xstsqrtdp_2 = "f00001a8X-Q", + xsrdpic_2 = "f00001acQ-Q", + xsdivdp_3 = "f00001c0QQQ", + xsmsubmdp_3 = "f00001c8QQQ", + xsrdpim_2 = "f00001e4Q-Q", + xstdivdp_3 = "f00001e8XQQ", + xvaddsp_3 = "f0000200QQQ", + xvmaddasp_3 = "f0000208QQQ", + xvcmpeqsp_3 = "f0000218QQQ", + xvcvspuxws_2 = "f0000220Q-Q", + xvrspi_2 = "f0000224Q-Q", + xvrsqrtesp_2 = "f0000228Q-Q", + xvsqrtsp_2 = "f000022cQ-Q", + xvsubsp_3 = "f0000240QQQ", + xvmaddmsp_3 = "f0000248QQQ", + xvcmpgtsp_3 = "f0000258QQQ", + xvcvspsxws_2 = "f0000260Q-Q", + xvrspiz_2 = "f0000264Q-Q", + xvresp_2 = "f0000268Q-Q", + xvmulsp_3 = "f0000280QQQ", + xvmsubasp_3 = "f0000288QQQ", + xxspltw_3 = "f0000290QQg~", + xvcmpgesp_3 = "f0000298QQQ", + xvcvuxwsp_2 = "f00002a0Q-Q", + xvrspip_2 = "f00002a4Q-Q", + xvtsqrtsp_2 = "f00002a8X-Q", + xvrspic_2 = "f00002acQ-Q", + xvdivsp_3 = "f00002c0QQQ", + xvmsubmsp_3 = "f00002c8QQQ", + xvcvsxwsp_2 = "f00002e0Q-Q", + xvrspim_2 = "f00002e4Q-Q", + xvtdivsp_3 = "f00002e8XQQ", + xvadddp_3 = "f0000300QQQ", + xvmaddadp_3 = "f0000308QQQ", + xvcmpeqdp_3 = "f0000318QQQ", + xvcvdpuxws_2 = "f0000320Q-Q", + xvrdpi_2 = "f0000324Q-Q", + xvrsqrtedp_2 = "f0000328Q-Q", + xvsqrtdp_2 = "f000032cQ-Q", + xvsubdp_3 = "f0000340QQQ", + xvmaddmdp_3 = "f0000348QQQ", + xvcmpgtdp_3 = "f0000358QQQ", + xvcvdpsxws_2 = "f0000360Q-Q", + xvrdpiz_2 = "f0000364Q-Q", + xvredp_2 = "f0000368Q-Q", + xvmuldp_3 = "f0000380QQQ", + xvmsubadp_3 = "f0000388QQQ", + xvcmpgedp_3 = "f0000398QQQ", + xvcvuxwdp_2 = "f00003a0Q-Q", + xvrdpip_2 = "f00003a4Q-Q", + xvtsqrtdp_2 = "f00003a8X-Q", + xvrdpic_2 = "f00003acQ-Q", + xvdivdp_3 = "f00003c0QQQ", + xvmsubmdp_3 = "f00003c8QQQ", + xvcvsxwdp_2 = "f00003e0Q-Q", + xvrdpim_2 = "f00003e4Q-Q", + xvtdivdp_3 = "f00003e8XQQ", + xsnmaddasp_3 = "f0000408QQQ", + xxland_3 = "f0000410QQQ", + xscvdpsp_2 = "f0000424Q-Q", + xscvdpspn_2 = "f000042cQ-Q", + xsnmaddmsp_3 = "f0000448QQQ", + xxlandc_3 = "f0000450QQQ", + xsrsp_2 = "f0000464Q-Q", + xsnmsubasp_3 = "f0000488QQQ", + xxlor_3 = "f0000490QQQ", + xscvuxdsp_2 = "f00004a0Q-Q", + xsnmsubmsp_3 = "f00004c8QQQ", + xxlxor_3 = "f00004d0QQQ", + xscvsxdsp_2 = "f00004e0Q-Q", + xsmaxdp_3 = "f0000500QQQ", + xsnmaddadp_3 = "f0000508QQQ", + xxlnor_3 = "f0000510QQQ", + xscvdpuxds_2 = "f0000520Q-Q", + xscvspdp_2 = "f0000524Q-Q", + xscvspdpn_2 = "f000052cQ-Q", + xsmindp_3 = "f0000540QQQ", + xsnmaddmdp_3 = "f0000548QQQ", + xxlorc_3 = "f0000550QQQ", + xscvdpsxds_2 = "f0000560Q-Q", + xsabsdp_2 = "f0000564Q-Q", + xscpsgndp_3 = "f0000580QQQ", + xsnmsubadp_3 = "f0000588QQQ", + xxlnand_3 = "f0000590QQQ", + xscvuxddp_2 = "f00005a0Q-Q", + xsnabsdp_2 = "f00005a4Q-Q", + xsnmsubmdp_3 = "f00005c8QQQ", + xxleqv_3 = "f00005d0QQQ", + xscvsxddp_2 = "f00005e0Q-Q", + xsnegdp_2 = "f00005e4Q-Q", + xvmaxsp_3 = "f0000600QQQ", + xvnmaddasp_3 = "f0000608QQQ", + ["xvcmpeqsp._3"] = "f0000618QQQ", + xvcvspuxds_2 = "f0000620Q-Q", + xvcvdpsp_2 = "f0000624Q-Q", + xvminsp_3 = "f0000640QQQ", + xvnmaddmsp_3 = "f0000648QQQ", + ["xvcmpgtsp._3"] = "f0000658QQQ", + xvcvspsxds_2 = "f0000660Q-Q", + xvabssp_2 = "f0000664Q-Q", + xvcpsgnsp_3 = "f0000680QQQ", + xvnmsubasp_3 = "f0000688QQQ", + ["xvcmpgesp._3"] = "f0000698QQQ", + xvcvuxdsp_2 = "f00006a0Q-Q", + xvnabssp_2 = "f00006a4Q-Q", + xvnmsubmsp_3 = "f00006c8QQQ", + xvcvsxdsp_2 = "f00006e0Q-Q", + xvnegsp_2 = "f00006e4Q-Q", + xvmaxdp_3 = "f0000700QQQ", + xvnmaddadp_3 = "f0000708QQQ", + ["xvcmpeqdp._3"] = "f0000718QQQ", + xvcvdpuxds_2 = "f0000720Q-Q", + xvcvspdp_2 = "f0000724Q-Q", + xvmindp_3 = "f0000740QQQ", + xvnmaddmdp_3 = "f0000748QQQ", + ["xvcmpgtdp._3"] = "f0000758QQQ", + xvcvdpsxds_2 = "f0000760Q-Q", + xvabsdp_2 = "f0000764Q-Q", + xvcpsgndp_3 = "f0000780QQQ", + xvnmsubadp_3 = "f0000788QQQ", + ["xvcmpgedp._3"] = "f0000798QQQ", + xvcvuxddp_2 = "f00007a0Q-Q", + xvnabsdp_2 = "f00007a4Q-Q", + xvnmsubmdp_3 = "f00007c8QQQ", + xvcvsxddp_2 = "f00007e0Q-Q", + xvnegdp_2 = "f00007e4Q-Q", + + -- Primary opcode 61: + stfdp_2 = "f4000000F:D", -- NYI: displacement must be divisible by 4. + + -- Primary opcode 62: + stq_2 = "f8000002R:D", -- NYI: displacement must be divisible by 8. + + -- Primary opcode 63: + fdiv_3 = "fc000024FFF.", + fsub_3 = "fc000028FFF.", + fadd_3 = "fc00002aFFF.", + fsqrt_2 = "fc00002cF-F.", + fsel_4 = "fc00002eFFFF~.", + fre_2 = "fc000030F-F.", + fmul_3 = "fc000032FF-F.", + frsqrte_2 = "fc000034F-F.", + fmsub_4 = "fc000038FFFF~.", + fmadd_4 = "fc00003aFFFF~.", + fnmsub_4 = "fc00003cFFFF~.", + fnmadd_4 = "fc00003eFFFF~.", + fcmpu_3 = "fc000000XFF", + fcpsgn_3 = "fc000010FFF.", + fcmpo_3 = "fc000040XFF", + mtfsb1_1 = "fc00004cA", + fneg_2 = "fc000050F-F.", + mcrfs_2 = "fc000080XX", + mtfsb0_1 = "fc00008cA", + fmr_2 = "fc000090F-F.", + frsp_2 = "fc000018F-F.", + fctiw_2 = "fc00001cF-F.", + fctiwz_2 = "fc00001eF-F.", + ftdiv_2 = "fc000100X-F.", + fctiwu_2 = "fc00011cF-F.", + fctiwuz_2 = "fc00011eF-F.", + mtfsfi_2 = "fc00010cAA", -- NYI: upshift. + fnabs_2 = "fc000110F-F.", + ftsqrt_2 = "fc000140X-F.", + fabs_2 = "fc000210F-F.", + frin_2 = "fc000310F-F.", + friz_2 = "fc000350F-F.", + frip_2 = "fc000390F-F.", + frim_2 = "fc0003d0F-F.", + mffs_1 = "fc00048eF.", + -- NYI: mtfsf, mtfsb0, mtfsb1. + fctid_2 = "fc00065cF-F.", + fctidz_2 = "fc00065eF-F.", + fmrgow_3 = "fc00068cFFF", + fcfid_2 = "fc00069cF-F.", + fctidu_2 = "fc00075cF-F.", + fctiduz_2 = "fc00075eF-F.", + fmrgew_3 = "fc00078cFFF", + fcfidu_2 = "fc00079cF-F.", + + daddq_3 = "fc000004F:F:F:.", + dquaq_4 = "fc000006F:F:F:Z.", + dmulq_3 = "fc000044F:F:F:.", + drrndq_4 = "fc000046F:F:F:Z.", + dscliq_3 = "fc000084F:F:6.", + dquaiq_4 = "fc000086SF:~F:Z.", + dscriq_3 = "fc0000c4F:F:6.", + drintxq_4 = "fc0000c61F:~F:Z.", + dcmpoq_3 = "fc000104XF:F:", + dtstexq_3 = "fc000144XF:F:", + dtstdcq_3 = "fc000184XF:6", + dtstdgq_3 = "fc0001c4XF:6", + drintnq_4 = "fc0001c61F:~F:Z.", + dctqpq_2 = "fc000204F:-F:.", + dctfixq_2 = "fc000244F:-F:.", + ddedpdq_3 = "fc000284ZF:~F:.", + dxexq_2 = "fc0002c4F:-F:.", + dsubq_3 = "fc000404F:F:F:.", + ddivq_3 = "fc000444F:F:F:.", + dcmpuq_3 = "fc000504XF:F:", + dtstsfq_3 = "fc000544XF:F:", + drdpq_2 = "fc000604F:-F:.", + dcffixq_2 = "fc000644F:-F:.", + denbcdq_3 = "fc000684YF:~F:.", + diexq_3 = "fc0006c4F:FF:.", + + -- Primary opcode 4, SPE APU extension: + evaddw_3 = "10000200RRR", + evaddiw_3 = "10000202RAR~", + evsubw_3 = "10000204RRR~", + evsubiw_3 = "10000206RAR~", + evabs_2 = "10000208RR", + evneg_2 = "10000209RR", + evextsb_2 = "1000020aRR", + evextsh_2 = "1000020bRR", + evrndw_2 = "1000020cRR", + evcntlzw_2 = "1000020dRR", + evcntlsw_2 = "1000020eRR", + brinc_3 = "1000020fRRR", + evand_3 = "10000211RRR", + evandc_3 = "10000212RRR", + evxor_3 = "10000216RRR", + evor_3 = "10000217RRR", + evmr_2 = "10000217RR=", + evnor_3 = "10000218RRR", + evnot_2 = "10000218RR=", + eveqv_3 = "10000219RRR", + evorc_3 = "1000021bRRR", + evnand_3 = "1000021eRRR", + evsrwu_3 = "10000220RRR", + evsrws_3 = "10000221RRR", + evsrwiu_3 = "10000222RRA", + evsrwis_3 = "10000223RRA", + evslw_3 = "10000224RRR", + evslwi_3 = "10000226RRA", + evrlw_3 = "10000228RRR", + evsplati_2 = "10000229RS", + evrlwi_3 = "1000022aRRA", + evsplatfi_2 = "1000022bRS", + evmergehi_3 = "1000022cRRR", + evmergelo_3 = "1000022dRRR", + evcmpgtu_3 = "10000230XRR", + evcmpgtu_2 = "10000230-RR", + evcmpgts_3 = "10000231XRR", + evcmpgts_2 = "10000231-RR", + evcmpltu_3 = "10000232XRR", + evcmpltu_2 = "10000232-RR", + evcmplts_3 = "10000233XRR", + evcmplts_2 = "10000233-RR", + evcmpeq_3 = "10000234XRR", + evcmpeq_2 = "10000234-RR", + evsel_4 = "10000278RRRW", + evsel_3 = "10000278RRR", + evfsadd_3 = "10000280RRR", + evfssub_3 = "10000281RRR", + evfsabs_2 = "10000284RR", + evfsnabs_2 = "10000285RR", + evfsneg_2 = "10000286RR", + evfsmul_3 = "10000288RRR", + evfsdiv_3 = "10000289RRR", + evfscmpgt_3 = "1000028cXRR", + evfscmpgt_2 = "1000028c-RR", + evfscmplt_3 = "1000028dXRR", + evfscmplt_2 = "1000028d-RR", + evfscmpeq_3 = "1000028eXRR", + evfscmpeq_2 = "1000028e-RR", + evfscfui_2 = "10000290R-R", + evfscfsi_2 = "10000291R-R", + evfscfuf_2 = "10000292R-R", + evfscfsf_2 = "10000293R-R", + evfsctui_2 = "10000294R-R", + evfsctsi_2 = "10000295R-R", + evfsctuf_2 = "10000296R-R", + evfsctsf_2 = "10000297R-R", + evfsctuiz_2 = "10000298R-R", + evfsctsiz_2 = "1000029aR-R", + evfststgt_3 = "1000029cXRR", + evfststgt_2 = "1000029c-RR", + evfststlt_3 = "1000029dXRR", + evfststlt_2 = "1000029d-RR", + evfststeq_3 = "1000029eXRR", + evfststeq_2 = "1000029e-RR", + efsadd_3 = "100002c0RRR", + efssub_3 = "100002c1RRR", + efsabs_2 = "100002c4RR", + efsnabs_2 = "100002c5RR", + efsneg_2 = "100002c6RR", + efsmul_3 = "100002c8RRR", + efsdiv_3 = "100002c9RRR", + efscmpgt_3 = "100002ccXRR", + efscmpgt_2 = "100002cc-RR", + efscmplt_3 = "100002cdXRR", + efscmplt_2 = "100002cd-RR", + efscmpeq_3 = "100002ceXRR", + efscmpeq_2 = "100002ce-RR", + efscfd_2 = "100002cfR-R", + efscfui_2 = "100002d0R-R", + efscfsi_2 = "100002d1R-R", + efscfuf_2 = "100002d2R-R", + efscfsf_2 = "100002d3R-R", + efsctui_2 = "100002d4R-R", + efsctsi_2 = "100002d5R-R", + efsctuf_2 = "100002d6R-R", + efsctsf_2 = "100002d7R-R", + efsctuiz_2 = "100002d8R-R", + efsctsiz_2 = "100002daR-R", + efststgt_3 = "100002dcXRR", + efststgt_2 = "100002dc-RR", + efststlt_3 = "100002ddXRR", + efststlt_2 = "100002dd-RR", + efststeq_3 = "100002deXRR", + efststeq_2 = "100002de-RR", + efdadd_3 = "100002e0RRR", + efdsub_3 = "100002e1RRR", + efdcfuid_2 = "100002e2R-R", + efdcfsid_2 = "100002e3R-R", + efdabs_2 = "100002e4RR", + efdnabs_2 = "100002e5RR", + efdneg_2 = "100002e6RR", + efdmul_3 = "100002e8RRR", + efddiv_3 = "100002e9RRR", + efdctuidz_2 = "100002eaR-R", + efdctsidz_2 = "100002ebR-R", + efdcmpgt_3 = "100002ecXRR", + efdcmpgt_2 = "100002ec-RR", + efdcmplt_3 = "100002edXRR", + efdcmplt_2 = "100002ed-RR", + efdcmpeq_3 = "100002eeXRR", + efdcmpeq_2 = "100002ee-RR", + efdcfs_2 = "100002efR-R", + efdcfui_2 = "100002f0R-R", + efdcfsi_2 = "100002f1R-R", + efdcfuf_2 = "100002f2R-R", + efdcfsf_2 = "100002f3R-R", + efdctui_2 = "100002f4R-R", + efdctsi_2 = "100002f5R-R", + efdctuf_2 = "100002f6R-R", + efdctsf_2 = "100002f7R-R", + efdctuiz_2 = "100002f8R-R", + efdctsiz_2 = "100002faR-R", + efdtstgt_3 = "100002fcXRR", + efdtstgt_2 = "100002fc-RR", + efdtstlt_3 = "100002fdXRR", + efdtstlt_2 = "100002fd-RR", + efdtsteq_3 = "100002feXRR", + efdtsteq_2 = "100002fe-RR", + evlddx_3 = "10000300RR0R", + evldd_2 = "10000301R8", + evldwx_3 = "10000302RR0R", + evldw_2 = "10000303R8", + evldhx_3 = "10000304RR0R", + evldh_2 = "10000305R8", + evlwhex_3 = "10000310RR0R", + evlwhe_2 = "10000311R4", + evlwhoux_3 = "10000314RR0R", + evlwhou_2 = "10000315R4", + evlwhosx_3 = "10000316RR0R", + evlwhos_2 = "10000317R4", + evstddx_3 = "10000320RR0R", + evstdd_2 = "10000321R8", + evstdwx_3 = "10000322RR0R", + evstdw_2 = "10000323R8", + evstdhx_3 = "10000324RR0R", + evstdh_2 = "10000325R8", + evstwhex_3 = "10000330RR0R", + evstwhe_2 = "10000331R4", + evstwhox_3 = "10000334RR0R", + evstwho_2 = "10000335R4", + evstwwex_3 = "10000338RR0R", + evstwwe_2 = "10000339R4", + evstwwox_3 = "1000033cRR0R", + evstwwo_2 = "1000033dR4", + evmhessf_3 = "10000403RRR", + evmhossf_3 = "10000407RRR", + evmheumi_3 = "10000408RRR", + evmhesmi_3 = "10000409RRR", + evmhesmf_3 = "1000040bRRR", + evmhoumi_3 = "1000040cRRR", + evmhosmi_3 = "1000040dRRR", + evmhosmf_3 = "1000040fRRR", + evmhessfa_3 = "10000423RRR", + evmhossfa_3 = "10000427RRR", + evmheumia_3 = "10000428RRR", + evmhesmia_3 = "10000429RRR", + evmhesmfa_3 = "1000042bRRR", + evmhoumia_3 = "1000042cRRR", + evmhosmia_3 = "1000042dRRR", + evmhosmfa_3 = "1000042fRRR", + evmwhssf_3 = "10000447RRR", + evmwlumi_3 = "10000448RRR", + evmwhumi_3 = "1000044cRRR", + evmwhsmi_3 = "1000044dRRR", + evmwhsmf_3 = "1000044fRRR", + evmwssf_3 = "10000453RRR", + evmwumi_3 = "10000458RRR", + evmwsmi_3 = "10000459RRR", + evmwsmf_3 = "1000045bRRR", + evmwhssfa_3 = "10000467RRR", + evmwlumia_3 = "10000468RRR", + evmwhumia_3 = "1000046cRRR", + evmwhsmia_3 = "1000046dRRR", + evmwhsmfa_3 = "1000046fRRR", + evmwssfa_3 = "10000473RRR", + evmwumia_3 = "10000478RRR", + evmwsmia_3 = "10000479RRR", + evmwsmfa_3 = "1000047bRRR", + evmra_2 = "100004c4RR", + evdivws_3 = "100004c6RRR", + evdivwu_3 = "100004c7RRR", + evmwssfaa_3 = "10000553RRR", + evmwumiaa_3 = "10000558RRR", + evmwsmiaa_3 = "10000559RRR", + evmwsmfaa_3 = "1000055bRRR", + evmwssfan_3 = "100005d3RRR", + evmwumian_3 = "100005d8RRR", + evmwsmian_3 = "100005d9RRR", + evmwsmfan_3 = "100005dbRRR", + evmergehilo_3 = "1000022eRRR", + evmergelohi_3 = "1000022fRRR", + evlhhesplatx_3 = "10000308RR0R", + evlhhesplat_2 = "10000309R2", + evlhhousplatx_3 = "1000030cRR0R", + evlhhousplat_2 = "1000030dR2", + evlhhossplatx_3 = "1000030eRR0R", + evlhhossplat_2 = "1000030fR2", + evlwwsplatx_3 = "10000318RR0R", + evlwwsplat_2 = "10000319R4", + evlwhsplatx_3 = "1000031cRR0R", + evlwhsplat_2 = "1000031dR4", + evaddusiaaw_2 = "100004c0RR", + evaddssiaaw_2 = "100004c1RR", + evsubfusiaaw_2 = "100004c2RR", + evsubfssiaaw_2 = "100004c3RR", + evaddumiaaw_2 = "100004c8RR", + evaddsmiaaw_2 = "100004c9RR", + evsubfumiaaw_2 = "100004caRR", + evsubfsmiaaw_2 = "100004cbRR", + evmheusiaaw_3 = "10000500RRR", + evmhessiaaw_3 = "10000501RRR", + evmhessfaaw_3 = "10000503RRR", + evmhousiaaw_3 = "10000504RRR", + evmhossiaaw_3 = "10000505RRR", + evmhossfaaw_3 = "10000507RRR", + evmheumiaaw_3 = "10000508RRR", + evmhesmiaaw_3 = "10000509RRR", + evmhesmfaaw_3 = "1000050bRRR", + evmhoumiaaw_3 = "1000050cRRR", + evmhosmiaaw_3 = "1000050dRRR", + evmhosmfaaw_3 = "1000050fRRR", + evmhegumiaa_3 = "10000528RRR", + evmhegsmiaa_3 = "10000529RRR", + evmhegsmfaa_3 = "1000052bRRR", + evmhogumiaa_3 = "1000052cRRR", + evmhogsmiaa_3 = "1000052dRRR", + evmhogsmfaa_3 = "1000052fRRR", + evmwlusiaaw_3 = "10000540RRR", + evmwlssiaaw_3 = "10000541RRR", + evmwlumiaaw_3 = "10000548RRR", + evmwlsmiaaw_3 = "10000549RRR", + evmheusianw_3 = "10000580RRR", + evmhessianw_3 = "10000581RRR", + evmhessfanw_3 = "10000583RRR", + evmhousianw_3 = "10000584RRR", + evmhossianw_3 = "10000585RRR", + evmhossfanw_3 = "10000587RRR", + evmheumianw_3 = "10000588RRR", + evmhesmianw_3 = "10000589RRR", + evmhesmfanw_3 = "1000058bRRR", + evmhoumianw_3 = "1000058cRRR", + evmhosmianw_3 = "1000058dRRR", + evmhosmfanw_3 = "1000058fRRR", + evmhegumian_3 = "100005a8RRR", + evmhegsmian_3 = "100005a9RRR", + evmhegsmfan_3 = "100005abRRR", + evmhogumian_3 = "100005acRRR", + evmhogsmian_3 = "100005adRRR", + evmhogsmfan_3 = "100005afRRR", + evmwlusianw_3 = "100005c0RRR", + evmwlssianw_3 = "100005c1RRR", + evmwlumianw_3 = "100005c8RRR", + evmwlsmianw_3 = "100005c9RRR", + + -- NYI: Book E instructions. +} + +-- Add mnemonics for "." variants. +do + local t = {} + for k,v in pairs(map_op) do + if type(v) == "string" and sub(v, -1) == "." then + local v2 = sub(v, 1, 7)..char(byte(v, 8)+1)..sub(v, 9, -2) + t[sub(k, 1, -3).."."..sub(k, -2)] = v2 + end + end + for k,v in pairs(t) do + map_op[k] = v + end +end + +-- Add more branch mnemonics. +for cond,c in pairs(map_cond) do + local b1 = "b"..cond + local c1 = shl(band(c, 3), 16) + (c < 4 and 0x01000000 or 0) + -- bX[l] + map_op[b1.."_1"] = tohex(0x40800000 + c1).."K" + map_op[b1.."y_1"] = tohex(0x40a00000 + c1).."K" + map_op[b1.."l_1"] = tohex(0x40800001 + c1).."K" + map_op[b1.."_2"] = tohex(0x40800000 + c1).."-XK" + map_op[b1.."y_2"] = tohex(0x40a00000 + c1).."-XK" + map_op[b1.."l_2"] = tohex(0x40800001 + c1).."-XK" + -- bXlr[l] + map_op[b1.."lr_0"] = tohex(0x4c800020 + c1) + map_op[b1.."lrl_0"] = tohex(0x4c800021 + c1) + map_op[b1.."ctr_0"] = tohex(0x4c800420 + c1) + map_op[b1.."ctrl_0"] = tohex(0x4c800421 + c1) + -- bXctr[l] + map_op[b1.."lr_1"] = tohex(0x4c800020 + c1).."-X" + map_op[b1.."lrl_1"] = tohex(0x4c800021 + c1).."-X" + map_op[b1.."ctr_1"] = tohex(0x4c800420 + c1).."-X" + map_op[b1.."ctrl_1"] = tohex(0x4c800421 + c1).."-X" +end + +------------------------------------------------------------------------------ + +local function parse_gpr(expr) + local tname, ovreg = match(expr, "^([%w_]+):(r[1-3]?[0-9])$") + local tp = map_type[tname or expr] + if tp then + local reg = ovreg or tp.reg + if not reg then + werror("type `"..(tname or expr).."' needs a register override") + end + expr = reg + end + local r = match(expr, "^r([1-3]?[0-9])$") + if r then + r = tonumber(r) + if r <= 31 then return r, tp end + end + werror("bad register name `"..expr.."'") +end + +local function parse_fpr(expr) + local r = match(expr, "^f([1-3]?[0-9])$") + if r then + r = tonumber(r) + if r <= 31 then return r end + end + werror("bad register name `"..expr.."'") +end + +local function parse_vr(expr) + local r = match(expr, "^v([1-3]?[0-9])$") + if r then + r = tonumber(r) + if r <= 31 then return r end + end + werror("bad register name `"..expr.."'") +end + +local function parse_vs(expr) + local r = match(expr, "^vs([1-6]?[0-9])$") + if r then + r = tonumber(r) + if r <= 63 then return r end + end + werror("bad register name `"..expr.."'") +end + +local function parse_cr(expr) + local r = match(expr, "^cr([0-7])$") + if r then return tonumber(r) end + werror("bad condition register name `"..expr.."'") +end + +local function parse_cond(expr) + local r, cond = match(expr, "^4%*cr([0-7])%+(%w%w)$") + if r then + r = tonumber(r) + local c = map_cond[cond] + if c and c < 4 then return r*4+c end + end + werror("bad condition bit name `"..expr.."'") +end + +local parse_ctx = {} + +local loadenv = setfenv and function(s) + local code = loadstring(s, "") + if code then setfenv(code, parse_ctx) end + return code +end or function(s) + return load(s, "", nil, parse_ctx) +end + +-- Try to parse simple arithmetic, too, since some basic ops are aliases. +local function parse_number(n) + local x = tonumber(n) + if x then return x end + local code = loadenv("return "..n) + if code then + local ok, y = pcall(code) + if ok then return y end + end + return nil +end + +local function parse_imm(imm, bits, shift, scale, signed) + local n = parse_number(imm) + if n then + local m = sar(n, scale) + if shl(m, scale) == n then + if signed then + local s = sar(m, bits-1) + if s == 0 then return shl(m, shift) + elseif s == -1 then return shl(m + shl(1, bits), shift) end + else + if sar(m, bits) == 0 then return shl(m, shift) end + end + end + werror("out of range immediate `"..imm.."'") + elseif match(imm, "^[rfv]([1-3]?[0-9])$") or + match(imm, "^vs([1-6]?[0-9])$") or + match(imm, "^([%w_]+):(r[1-3]?[0-9])$") then + werror("expected immediate operand, got register") + else + waction("IMM", (signed and 32768 or 0)+scale*1024+bits*32+shift, imm) + return 0 + end +end + +local function parse_shiftmask(imm, isshift) + local n = parse_number(imm) + if n then + if shr(n, 6) == 0 then + local lsb = band(n, 31) + local msb = n - lsb + return isshift and (shl(lsb, 11)+shr(msb, 4)) or (shl(lsb, 6)+msb) + end + werror("out of range immediate `"..imm.."'") + elseif match(imm, "^r([1-3]?[0-9])$") or + match(imm, "^([%w_]+):(r[1-3]?[0-9])$") then + werror("expected immediate operand, got register") + else + waction("IMMSH", isshift and 1 or 0, imm) + return 0; + end +end + +local function parse_disp(disp) + local imm, reg = match(disp, "^(.*)%(([%w_:]+)%)$") + if imm then + local r = parse_gpr(reg) + if r == 0 then werror("cannot use r0 in displacement") end + return shl(r, 16) + parse_imm(imm, 16, 0, 0, true) + end + local reg, tailr = match(disp, "^([%w_:]+)%s*(.*)$") + if reg and tailr ~= "" then + local r, tp = parse_gpr(reg) + if r == 0 then werror("cannot use r0 in displacement") end + if tp then + waction("IMM", 32768+16*32, format(tp.ctypefmt, tailr)) + return shl(r, 16) + end + end + werror("bad displacement `"..disp.."'") +end + +local function parse_u5disp(disp, scale) + local imm, reg = match(disp, "^(.*)%(([%w_:]+)%)$") + if imm then + local r = parse_gpr(reg) + if r == 0 then werror("cannot use r0 in displacement") end + return shl(r, 16) + parse_imm(imm, 5, 11, scale, false) + end + local reg, tailr = match(disp, "^([%w_:]+)%s*(.*)$") + if reg and tailr ~= "" then + local r, tp = parse_gpr(reg) + if r == 0 then werror("cannot use r0 in displacement") end + if tp then + waction("IMM", scale*1024+5*32+11, format(tp.ctypefmt, tailr)) + return shl(r, 16) + end + end + werror("bad displacement `"..disp.."'") +end + +local function parse_label(label, def) + local prefix = sub(label, 1, 2) + -- =>label (pc label reference) + if prefix == "=>" then + return "PC", 0, sub(label, 3) + end + -- ->name (global label reference) + if prefix == "->" then + return "LG", map_global[sub(label, 3)] + end + if def then + -- [1-9] (local label definition) + if match(label, "^[1-9]$") then + return "LG", 10+tonumber(label) + end + else + -- [<>][1-9] (local label reference) + local dir, lnum = match(label, "^([<>])([1-9])$") + if dir then -- Fwd: 1-9, Bkwd: 11-19. + return "LG", lnum + (dir == ">" and 0 or 10) + end + -- extern label (extern label reference) + local extname = match(label, "^extern%s+(%S+)$") + if extname then + return "EXT", map_extern[extname] + end + end + werror("bad label `"..label.."'") +end + +------------------------------------------------------------------------------ + +-- Handle opcodes defined with template strings. +op_template = function(params, template, nparams) + if not params then return sub(template, 9) end + local op = tonumber(sub(template, 1, 8), 16) + local n, rs = 1, 26 + + -- Limit number of section buffer positions used by a single dasm_put(). + -- A single opcode needs a maximum of 3 positions (rlwinm). + if secpos+3 > maxsecpos then wflush() end + local pos = wpos() + + -- Process each character. + for p in gmatch(sub(template, 9), ".") do + if p == "R" then + rs = rs - 5; op = op + shl(parse_gpr(params[n]), rs); n = n + 1 + elseif p == "F" then + rs = rs - 5; op = op + shl(parse_fpr(params[n]), rs); n = n + 1 + elseif p == "V" then + rs = rs - 5; op = op + shl(parse_vr(params[n]), rs); n = n + 1 + elseif p == "Q" then + local vs = parse_vs(params[n]); n = n + 1; rs = rs - 5 + local sh = rs == 6 and 2 or 3 + band(shr(rs, 1), 3) + op = op + shl(band(vs, 31), rs) + shr(band(vs, 32), sh) + elseif p == "q" then + local vs = parse_vs(params[n]); n = n + 1 + op = op + shl(band(vs, 31), 21) + shr(band(vs, 32), 5) + elseif p == "A" then + rs = rs - 5; op = op + parse_imm(params[n], 5, rs, 0, false); n = n + 1 + elseif p == "S" then + rs = rs - 5; op = op + parse_imm(params[n], 5, rs, 0, true); n = n + 1 + elseif p == "I" then + op = op + parse_imm(params[n], 16, 0, 0, true); n = n + 1 + elseif p == "U" then + op = op + parse_imm(params[n], 16, 0, 0, false); n = n + 1 + elseif p == "D" then + op = op + parse_disp(params[n]); n = n + 1 + elseif p == "2" then + op = op + parse_u5disp(params[n], 1); n = n + 1 + elseif p == "4" then + op = op + parse_u5disp(params[n], 2); n = n + 1 + elseif p == "8" then + op = op + parse_u5disp(params[n], 3); n = n + 1 + elseif p == "C" then + rs = rs - 5; op = op + shl(parse_cond(params[n]), rs); n = n + 1 + elseif p == "X" then + rs = rs - 5; op = op + shl(parse_cr(params[n]), rs+2); n = n + 1 + elseif p == "1" then + rs = rs - 5; op = op + parse_imm(params[n], 1, rs, 0, false); n = n + 1 + elseif p == "g" then + rs = rs - 5; op = op + parse_imm(params[n], 2, rs, 0, false); n = n + 1 + elseif p == "3" then + rs = rs - 5; op = op + parse_imm(params[n], 3, rs, 0, false); n = n + 1 + elseif p == "P" then + rs = rs - 5; op = op + parse_imm(params[n], 4, rs, 0, false); n = n + 1 + elseif p == "p" then + op = op + parse_imm(params[n], 4, rs, 0, false); n = n + 1 + elseif p == "6" then + rs = rs - 6; op = op + parse_imm(params[n], 6, rs, 0, false); n = n + 1 + elseif p == "Y" then + rs = rs - 5; op = op + parse_imm(params[n], 1, rs+4, 0, false); n = n + 1 + elseif p == "y" then + rs = rs - 5; op = op + parse_imm(params[n], 1, rs+3, 0, false); n = n + 1 + elseif p == "Z" then + rs = rs - 5; op = op + parse_imm(params[n], 2, rs+3, 0, false); n = n + 1 + elseif p == "z" then + rs = rs - 5; op = op + parse_imm(params[n], 2, rs+2, 0, false); n = n + 1 + elseif p == "W" then + op = op + parse_cr(params[n]); n = n + 1 + elseif p == "G" then + op = op + parse_imm(params[n], 8, 12, 0, false); n = n + 1 + elseif p == "H" then + op = op + parse_shiftmask(params[n], true); n = n + 1 + elseif p == "M" then + op = op + parse_shiftmask(params[n], false); n = n + 1 + elseif p == "J" or p == "K" then + local mode, m, s = parse_label(params[n], false) + if p == "K" then m = m + 2048 end + waction("REL_"..mode, m, s, 1) + n = n + 1 + elseif p == "0" then + if band(shr(op, rs), 31) == 0 then werror("cannot use r0") end + elseif p == "=" or p == "%" then + local t = band(shr(op, p == "%" and rs+5 or rs), 31) + rs = rs - 5 + op = op + shl(t, rs) + elseif p == "~" then + local mm = shl(31, rs) + local lo = band(op, mm) + local hi = band(op, shl(mm, 5)) + op = op - lo - hi + shl(lo, 5) + shr(hi, 5) + elseif p == ":" then + if band(shr(op, rs), 1) ~= 0 then werror("register pair expected") end + elseif p == "-" then + rs = rs - 5 + elseif p == "." then + -- Ignored. + else + assert(false) + end + end + wputpos(pos, op) +end + +map_op[".template__"] = op_template + +------------------------------------------------------------------------------ + +-- Pseudo-opcode to mark the position where the action list is to be emitted. +map_op[".actionlist_1"] = function(params) + if not params then return "cvar" end + local name = params[1] -- No syntax check. You get to keep the pieces. + wline(function(out) writeactions(out, name) end) +end + +-- Pseudo-opcode to mark the position where the global enum is to be emitted. +map_op[".globals_1"] = function(params) + if not params then return "prefix" end + local prefix = params[1] -- No syntax check. You get to keep the pieces. + wline(function(out) writeglobals(out, prefix) end) +end + +-- Pseudo-opcode to mark the position where the global names are to be emitted. +map_op[".globalnames_1"] = function(params) + if not params then return "cvar" end + local name = params[1] -- No syntax check. You get to keep the pieces. + wline(function(out) writeglobalnames(out, name) end) +end + +-- Pseudo-opcode to mark the position where the extern names are to be emitted. +map_op[".externnames_1"] = function(params) + if not params then return "cvar" end + local name = params[1] -- No syntax check. You get to keep the pieces. + wline(function(out) writeexternnames(out, name) end) +end + +------------------------------------------------------------------------------ + +-- Label pseudo-opcode (converted from trailing colon form). +map_op[".label_1"] = function(params) + if not params then return "[1-9] | ->global | =>pcexpr" end + if secpos+1 > maxsecpos then wflush() end + local mode, n, s = parse_label(params[1], true) + if mode == "EXT" then werror("bad label definition") end + waction("LABEL_"..mode, n, s, 1) +end + +------------------------------------------------------------------------------ + +-- Pseudo-opcodes for data storage. +map_op[".long_*"] = function(params) + if not params then return "imm..." end + for _,p in ipairs(params) do + local n = tonumber(p) + if not n then werror("bad immediate `"..p.."'") end + if n < 0 then n = n + 2^32 end + wputw(n) + if secpos+2 > maxsecpos then wflush() end + end +end + +-- Alignment pseudo-opcode. +map_op[".align_1"] = function(params) + if not params then return "numpow2" end + if secpos+1 > maxsecpos then wflush() end + local align = tonumber(params[1]) + if align then + local x = align + -- Must be a power of 2 in the range (2 ... 256). + for i=1,8 do + x = x / 2 + if x == 1 then + waction("ALIGN", align-1, nil, 1) -- Action byte is 2**n-1. + return + end + end + end + werror("bad alignment") +end + +------------------------------------------------------------------------------ + +-- Pseudo-opcode for (primitive) type definitions (map to C types). +map_op[".type_3"] = function(params, nparams) + if not params then + return nparams == 2 and "name, ctype" or "name, ctype, reg" + end + local name, ctype, reg = params[1], params[2], params[3] + if not match(name, "^[%a_][%w_]*$") then + werror("bad type name `"..name.."'") + end + local tp = map_type[name] + if tp then + werror("duplicate type `"..name.."'") + end + -- Add #type to defines. A bit unclean to put it in map_archdef. + map_archdef["#"..name] = "sizeof("..ctype..")" + -- Add new type and emit shortcut define. + local num = ctypenum + 1 + map_type[name] = { + ctype = ctype, + ctypefmt = format("Dt%X(%%s)", num), + reg = reg, + } + wline(format("#define Dt%X(_V) (int)(ptrdiff_t)&(((%s *)0)_V)", num, ctype)) + ctypenum = num +end +map_op[".type_2"] = map_op[".type_3"] + +-- Dump type definitions. +local function dumptypes(out, lvl) + local t = {} + for name in pairs(map_type) do t[#t+1] = name end + sort(t) + out:write("Type definitions:\n") + for _,name in ipairs(t) do + local tp = map_type[name] + local reg = tp.reg or "" + out:write(format(" %-20s %-20s %s\n", name, tp.ctype, reg)) + end + out:write("\n") +end + +------------------------------------------------------------------------------ + +-- Set the current section. +function _M.section(num) + waction("SECTION", num) + wflush(true) -- SECTION is a terminal action. +end + +------------------------------------------------------------------------------ + +-- Dump architecture description. +function _M.dumparch(out) + out:write(format("DynASM %s version %s, released %s\n\n", + _info.arch, _info.version, _info.release)) + dumpactions(out) +end + +-- Dump all user defined elements. +function _M.dumpdef(out, lvl) + dumptypes(out, lvl) + dumpglobals(out, lvl) + dumpexterns(out, lvl) +end + +------------------------------------------------------------------------------ + +-- Pass callbacks from/to the DynASM core. +function _M.passcb(wl, we, wf, ww) + wline, werror, wfatal, wwarn = wl, we, wf, ww + return wflush +end + +-- Setup the arch-specific module. +function _M.setup(arch, opt) + g_arch, g_opt = arch, opt +end + +-- Merge the core maps and the arch-specific maps. +function _M.mergemaps(map_coreop, map_def) + setmetatable(map_op, { __index = map_coreop }) + setmetatable(map_def, { __index = map_archdef }) + return map_op, map_def +end + +return _M + +------------------------------------------------------------------------------ + diff --git a/lib/LuaJIT/dynasm/dasm_proto.h b/lib/LuaJIT/dynasm/dasm_proto.h new file mode 100644 index 0000000..59d9e2b --- /dev/null +++ b/lib/LuaJIT/dynasm/dasm_proto.h @@ -0,0 +1,83 @@ +/* +** DynASM encoding engine prototypes. +** Copyright (C) 2005-2017 Mike Pall. All rights reserved. +** Released under the MIT license. See dynasm.lua for full copyright notice. +*/ + +#ifndef _DASM_PROTO_H +#define _DASM_PROTO_H + +#include +#include + +#define DASM_IDENT "DynASM 1.4.0" +#define DASM_VERSION 10400 /* 1.4.0 */ + +#ifndef Dst_DECL +#define Dst_DECL dasm_State **Dst +#endif + +#ifndef Dst_REF +#define Dst_REF (*Dst) +#endif + +#ifndef DASM_FDEF +#define DASM_FDEF extern +#endif + +#ifndef DASM_M_GROW +#define DASM_M_GROW(ctx, t, p, sz, need) \ + do { \ + size_t _sz = (sz), _need = (need); \ + if (_sz < _need) { \ + if (_sz < 16) _sz = 16; \ + while (_sz < _need) _sz += _sz; \ + (p) = (t *)realloc((p), _sz); \ + if ((p) == NULL) exit(1); \ + (sz) = _sz; \ + } \ + } while(0) +#endif + +#ifndef DASM_M_FREE +#define DASM_M_FREE(ctx, p, sz) free(p) +#endif + +/* Internal DynASM encoder state. */ +typedef struct dasm_State dasm_State; + + +/* Initialize and free DynASM state. */ +DASM_FDEF void dasm_init(Dst_DECL, int maxsection); +DASM_FDEF void dasm_free(Dst_DECL); + +/* Setup global array. Must be called before dasm_setup(). */ +DASM_FDEF void dasm_setupglobal(Dst_DECL, void **gl, unsigned int maxgl); + +/* Grow PC label array. Can be called after dasm_setup(), too. */ +DASM_FDEF void dasm_growpc(Dst_DECL, unsigned int maxpc); + +/* Setup encoder. */ +DASM_FDEF void dasm_setup(Dst_DECL, const void *actionlist); + +/* Feed encoder with actions. Calls are generated by pre-processor. */ +DASM_FDEF void dasm_put(Dst_DECL, int start, ...); + +/* Link sections and return the resulting size. */ +DASM_FDEF int dasm_link(Dst_DECL, size_t *szp); + +/* Encode sections into buffer. */ +DASM_FDEF int dasm_encode(Dst_DECL, void *buffer); + +/* Get PC label offset. */ +DASM_FDEF int dasm_getpclabel(Dst_DECL, unsigned int pc); + +#ifdef DASM_CHECKS +/* Optional sanity checker to call between isolated encoding steps. */ +DASM_FDEF int dasm_checkstep(Dst_DECL, int secmatch); +#else +#define dasm_checkstep(a, b) 0 +#endif + + +#endif /* _DASM_PROTO_H */ diff --git a/lib/LuaJIT/dynasm/dasm_x64.lua b/lib/LuaJIT/dynasm/dasm_x64.lua new file mode 100644 index 0000000..e8bdeb3 --- /dev/null +++ b/lib/LuaJIT/dynasm/dasm_x64.lua @@ -0,0 +1,12 @@ +------------------------------------------------------------------------------ +-- DynASM x64 module. +-- +-- Copyright (C) 2005-2017 Mike Pall. All rights reserved. +-- See dynasm.lua for full copyright notice. +------------------------------------------------------------------------------ +-- This module just sets 64 bit mode for the combined x86/x64 module. +-- All the interesting stuff is there. +------------------------------------------------------------------------------ + +x64 = true -- Using a global is an ugly, but effective solution. +return require("dasm_x86") diff --git a/lib/LuaJIT/dynasm/dasm_x86.h b/lib/LuaJIT/dynasm/dasm_x86.h new file mode 100644 index 0000000..dc14d88 --- /dev/null +++ b/lib/LuaJIT/dynasm/dasm_x86.h @@ -0,0 +1,509 @@ +/* +** DynASM x86 encoding engine. +** Copyright (C) 2005-2017 Mike Pall. All rights reserved. +** Released under the MIT license. See dynasm.lua for full copyright notice. +*/ + +#include +#include +#include +#include + +#define DASM_ARCH "x86" + +#ifndef DASM_EXTERN +#define DASM_EXTERN(a,b,c,d) 0 +#endif + +/* Action definitions. DASM_STOP must be 255. */ +enum { + DASM_DISP = 233, + DASM_IMM_S, DASM_IMM_B, DASM_IMM_W, DASM_IMM_D, DASM_IMM_WB, DASM_IMM_DB, + DASM_VREG, DASM_SPACE, DASM_SETLABEL, DASM_REL_A, DASM_REL_LG, DASM_REL_PC, + DASM_IMM_LG, DASM_IMM_PC, DASM_LABEL_LG, DASM_LABEL_PC, DASM_ALIGN, + DASM_EXTERN, DASM_ESC, DASM_MARK, DASM_SECTION, DASM_STOP +}; + +/* Maximum number of section buffer positions for a single dasm_put() call. */ +#define DASM_MAXSECPOS 25 + +/* DynASM encoder status codes. Action list offset or number are or'ed in. */ +#define DASM_S_OK 0x00000000 +#define DASM_S_NOMEM 0x01000000 +#define DASM_S_PHASE 0x02000000 +#define DASM_S_MATCH_SEC 0x03000000 +#define DASM_S_RANGE_I 0x11000000 +#define DASM_S_RANGE_SEC 0x12000000 +#define DASM_S_RANGE_LG 0x13000000 +#define DASM_S_RANGE_PC 0x14000000 +#define DASM_S_RANGE_VREG 0x15000000 +#define DASM_S_UNDEF_L 0x21000000 +#define DASM_S_UNDEF_PC 0x22000000 + +/* Macros to convert positions (8 bit section + 24 bit index). */ +#define DASM_POS2IDX(pos) ((pos)&0x00ffffff) +#define DASM_POS2BIAS(pos) ((pos)&0xff000000) +#define DASM_SEC2POS(sec) ((sec)<<24) +#define DASM_POS2SEC(pos) ((pos)>>24) +#define DASM_POS2PTR(D, pos) (D->sections[DASM_POS2SEC(pos)].rbuf + (pos)) + +/* Action list type. */ +typedef const unsigned char *dasm_ActList; + +/* Per-section structure. */ +typedef struct dasm_Section { + int *rbuf; /* Biased buffer pointer (negative section bias). */ + int *buf; /* True buffer pointer. */ + size_t bsize; /* Buffer size in bytes. */ + int pos; /* Biased buffer position. */ + int epos; /* End of biased buffer position - max single put. */ + int ofs; /* Byte offset into section. */ +} dasm_Section; + +/* Core structure holding the DynASM encoding state. */ +struct dasm_State { + size_t psize; /* Allocated size of this structure. */ + dasm_ActList actionlist; /* Current actionlist pointer. */ + int *lglabels; /* Local/global chain/pos ptrs. */ + size_t lgsize; + int *pclabels; /* PC label chains/pos ptrs. */ + size_t pcsize; + void **globals; /* Array of globals (bias -10). */ + dasm_Section *section; /* Pointer to active section. */ + size_t codesize; /* Total size of all code sections. */ + int maxsection; /* 0 <= sectionidx < maxsection. */ + int status; /* Status code. */ + dasm_Section sections[1]; /* All sections. Alloc-extended. */ +}; + +/* The size of the core structure depends on the max. number of sections. */ +#define DASM_PSZ(ms) (sizeof(dasm_State)+(ms-1)*sizeof(dasm_Section)) + + +/* Initialize DynASM state. */ +void dasm_init(Dst_DECL, int maxsection) +{ + dasm_State *D; + size_t psz = 0; + int i; + Dst_REF = NULL; + DASM_M_GROW(Dst, struct dasm_State, Dst_REF, psz, DASM_PSZ(maxsection)); + D = Dst_REF; + D->psize = psz; + D->lglabels = NULL; + D->lgsize = 0; + D->pclabels = NULL; + D->pcsize = 0; + D->globals = NULL; + D->maxsection = maxsection; + for (i = 0; i < maxsection; i++) { + D->sections[i].buf = NULL; /* Need this for pass3. */ + D->sections[i].rbuf = D->sections[i].buf - DASM_SEC2POS(i); + D->sections[i].bsize = 0; + D->sections[i].epos = 0; /* Wrong, but is recalculated after resize. */ + } +} + +/* Free DynASM state. */ +void dasm_free(Dst_DECL) +{ + dasm_State *D = Dst_REF; + int i; + for (i = 0; i < D->maxsection; i++) + if (D->sections[i].buf) + DASM_M_FREE(Dst, D->sections[i].buf, D->sections[i].bsize); + if (D->pclabels) DASM_M_FREE(Dst, D->pclabels, D->pcsize); + if (D->lglabels) DASM_M_FREE(Dst, D->lglabels, D->lgsize); + DASM_M_FREE(Dst, D, D->psize); +} + +/* Setup global label array. Must be called before dasm_setup(). */ +void dasm_setupglobal(Dst_DECL, void **gl, unsigned int maxgl) +{ + dasm_State *D = Dst_REF; + D->globals = gl - 10; /* Negative bias to compensate for locals. */ + DASM_M_GROW(Dst, int, D->lglabels, D->lgsize, (10+maxgl)*sizeof(int)); +} + +/* Grow PC label array. Can be called after dasm_setup(), too. */ +void dasm_growpc(Dst_DECL, unsigned int maxpc) +{ + dasm_State *D = Dst_REF; + size_t osz = D->pcsize; + DASM_M_GROW(Dst, int, D->pclabels, D->pcsize, maxpc*sizeof(int)); + memset((void *)(((unsigned char *)D->pclabels)+osz), 0, D->pcsize-osz); +} + +/* Setup encoder. */ +void dasm_setup(Dst_DECL, const void *actionlist) +{ + dasm_State *D = Dst_REF; + int i; + D->actionlist = (dasm_ActList)actionlist; + D->status = DASM_S_OK; + D->section = &D->sections[0]; + memset((void *)D->lglabels, 0, D->lgsize); + if (D->pclabels) memset((void *)D->pclabels, 0, D->pcsize); + for (i = 0; i < D->maxsection; i++) { + D->sections[i].pos = DASM_SEC2POS(i); + D->sections[i].ofs = 0; + } +} + + +#ifdef DASM_CHECKS +#define CK(x, st) \ + do { if (!(x)) { \ + D->status = DASM_S_##st|(int)(p-D->actionlist-1); return; } } while (0) +#define CKPL(kind, st) \ + do { if ((size_t)((char *)pl-(char *)D->kind##labels) >= D->kind##size) { \ + D->status=DASM_S_RANGE_##st|(int)(p-D->actionlist-1); return; } } while (0) +#else +#define CK(x, st) ((void)0) +#define CKPL(kind, st) ((void)0) +#endif + +/* Pass 1: Store actions and args, link branches/labels, estimate offsets. */ +void dasm_put(Dst_DECL, int start, ...) +{ + va_list ap; + dasm_State *D = Dst_REF; + dasm_ActList p = D->actionlist + start; + dasm_Section *sec = D->section; + int pos = sec->pos, ofs = sec->ofs, mrm = -1; + int *b; + + if (pos >= sec->epos) { + DASM_M_GROW(Dst, int, sec->buf, sec->bsize, + sec->bsize + 2*DASM_MAXSECPOS*sizeof(int)); + sec->rbuf = sec->buf - DASM_POS2BIAS(pos); + sec->epos = (int)sec->bsize/sizeof(int) - DASM_MAXSECPOS+DASM_POS2BIAS(pos); + } + + b = sec->rbuf; + b[pos++] = start; + + va_start(ap, start); + while (1) { + int action = *p++; + if (action < DASM_DISP) { + ofs++; + } else if (action <= DASM_REL_A) { + int n = va_arg(ap, int); + b[pos++] = n; + switch (action) { + case DASM_DISP: + if (n == 0) { if (mrm < 0) mrm = p[-2]; if ((mrm&7) != 5) break; } + /* fallthrough */ + case DASM_IMM_DB: if (((n+128)&-256) == 0) goto ob; /* fallthrough */ + case DASM_REL_A: /* Assumes ptrdiff_t is int. !x64 */ + case DASM_IMM_D: ofs += 4; break; + case DASM_IMM_S: CK(((n+128)&-256) == 0, RANGE_I); goto ob; + case DASM_IMM_B: CK((n&-256) == 0, RANGE_I); ob: ofs++; break; + case DASM_IMM_WB: if (((n+128)&-256) == 0) goto ob; /* fallthrough */ + case DASM_IMM_W: CK((n&-65536) == 0, RANGE_I); ofs += 2; break; + case DASM_SPACE: p++; ofs += n; break; + case DASM_SETLABEL: b[pos-2] = -0x40000000; break; /* Neg. label ofs. */ + case DASM_VREG: CK((n&-16) == 0 && (n != 4 || (*p>>5) != 2), RANGE_VREG); + if (*p < 0x40 && p[1] == DASM_DISP) mrm = n; + if (*p < 0x20 && (n&7) == 4) ofs++; + switch ((*p++ >> 3) & 3) { + case 3: n |= b[pos-3]; /* fallthrough */ + case 2: n |= b[pos-2]; /* fallthrough */ + case 1: if (n <= 7) { b[pos-1] |= 0x10; ofs--; } + } + continue; + } + mrm = -1; + } else { + int *pl, n; + switch (action) { + case DASM_REL_LG: + case DASM_IMM_LG: + n = *p++; pl = D->lglabels + n; + /* Bkwd rel or global. */ + if (n <= 246) { CK(n>=10||*pl<0, RANGE_LG); CKPL(lg, LG); goto putrel; } + pl -= 246; n = *pl; + if (n < 0) n = 0; /* Start new chain for fwd rel if label exists. */ + goto linkrel; + case DASM_REL_PC: + case DASM_IMM_PC: pl = D->pclabels + va_arg(ap, int); CKPL(pc, PC); + putrel: + n = *pl; + if (n < 0) { /* Label exists. Get label pos and store it. */ + b[pos] = -n; + } else { + linkrel: + b[pos] = n; /* Else link to rel chain, anchored at label. */ + *pl = pos; + } + pos++; + ofs += 4; /* Maximum offset needed. */ + if (action == DASM_REL_LG || action == DASM_REL_PC) + b[pos++] = ofs; /* Store pass1 offset estimate. */ + break; + case DASM_LABEL_LG: pl = D->lglabels + *p++; CKPL(lg, LG); goto putlabel; + case DASM_LABEL_PC: pl = D->pclabels + va_arg(ap, int); CKPL(pc, PC); + putlabel: + n = *pl; /* n > 0: Collapse rel chain and replace with label pos. */ + while (n > 0) { int *pb = DASM_POS2PTR(D, n); n = *pb; *pb = pos; } + *pl = -pos; /* Label exists now. */ + b[pos++] = ofs; /* Store pass1 offset estimate. */ + break; + case DASM_ALIGN: + ofs += *p++; /* Maximum alignment needed (arg is 2**n-1). */ + b[pos++] = ofs; /* Store pass1 offset estimate. */ + break; + case DASM_EXTERN: p += 2; ofs += 4; break; + case DASM_ESC: p++; ofs++; break; + case DASM_MARK: mrm = p[-2]; break; + case DASM_SECTION: + n = *p; CK(n < D->maxsection, RANGE_SEC); D->section = &D->sections[n]; + case DASM_STOP: goto stop; + } + } + } +stop: + va_end(ap); + sec->pos = pos; + sec->ofs = ofs; +} +#undef CK + +/* Pass 2: Link sections, shrink branches/aligns, fix label offsets. */ +int dasm_link(Dst_DECL, size_t *szp) +{ + dasm_State *D = Dst_REF; + int secnum; + int ofs = 0; + +#ifdef DASM_CHECKS + *szp = 0; + if (D->status != DASM_S_OK) return D->status; + { + int pc; + for (pc = 0; pc*sizeof(int) < D->pcsize; pc++) + if (D->pclabels[pc] > 0) return DASM_S_UNDEF_PC|pc; + } +#endif + + { /* Handle globals not defined in this translation unit. */ + int idx; + for (idx = 10; idx*sizeof(int) < D->lgsize; idx++) { + int n = D->lglabels[idx]; + /* Undefined label: Collapse rel chain and replace with marker (< 0). */ + while (n > 0) { int *pb = DASM_POS2PTR(D, n); n = *pb; *pb = -idx; } + } + } + + /* Combine all code sections. No support for data sections (yet). */ + for (secnum = 0; secnum < D->maxsection; secnum++) { + dasm_Section *sec = D->sections + secnum; + int *b = sec->rbuf; + int pos = DASM_SEC2POS(secnum); + int lastpos = sec->pos; + + while (pos != lastpos) { + dasm_ActList p = D->actionlist + b[pos++]; + while (1) { + int op, action = *p++; + switch (action) { + case DASM_REL_LG: p++; op = p[-3]; goto rel_pc; + case DASM_REL_PC: op = p[-2]; rel_pc: { + int shrink = op == 0xe9 ? 3 : ((op&0xf0) == 0x80 ? 4 : 0); + if (shrink) { /* Shrinkable branch opcode? */ + int lofs, lpos = b[pos]; + if (lpos < 0) goto noshrink; /* Ext global? */ + lofs = *DASM_POS2PTR(D, lpos); + if (lpos > pos) { /* Fwd label: add cumulative section offsets. */ + int i; + for (i = secnum; i < DASM_POS2SEC(lpos); i++) + lofs += D->sections[i].ofs; + } else { + lofs -= ofs; /* Bkwd label: unfix offset. */ + } + lofs -= b[pos+1]; /* Short branch ok? */ + if (lofs >= -128-shrink && lofs <= 127) ofs -= shrink; /* Yes. */ + else { noshrink: shrink = 0; } /* No, cannot shrink op. */ + } + b[pos+1] = shrink; + pos += 2; + break; + } + /* fallthrough */ + case DASM_SPACE: case DASM_IMM_LG: case DASM_VREG: p++; + /* fallthrough */ + case DASM_DISP: case DASM_IMM_S: case DASM_IMM_B: case DASM_IMM_W: + case DASM_IMM_D: case DASM_IMM_WB: case DASM_IMM_DB: + case DASM_SETLABEL: case DASM_REL_A: case DASM_IMM_PC: pos++; break; + case DASM_LABEL_LG: p++; + /* fallthrough */ + case DASM_LABEL_PC: b[pos++] += ofs; break; /* Fix label offset. */ + case DASM_ALIGN: ofs -= (b[pos++]+ofs)&*p++; break; /* Adjust ofs. */ + case DASM_EXTERN: p += 2; break; + case DASM_ESC: p++; break; + case DASM_MARK: break; + case DASM_SECTION: case DASM_STOP: goto stop; + } + } + stop: (void)0; + } + ofs += sec->ofs; /* Next section starts right after current section. */ + } + + D->codesize = ofs; /* Total size of all code sections */ + *szp = ofs; + return DASM_S_OK; +} + +#define dasmb(x) *cp++ = (unsigned char)(x) +#ifndef DASM_ALIGNED_WRITES +#define dasmw(x) \ + do { *((unsigned short *)cp) = (unsigned short)(x); cp+=2; } while (0) +#define dasmd(x) \ + do { *((unsigned int *)cp) = (unsigned int)(x); cp+=4; } while (0) +#else +#define dasmw(x) do { dasmb(x); dasmb((x)>>8); } while (0) +#define dasmd(x) do { dasmw(x); dasmw((x)>>16); } while (0) +#endif + +/* Pass 3: Encode sections. */ +int dasm_encode(Dst_DECL, void *buffer) +{ + dasm_State *D = Dst_REF; + unsigned char *base = (unsigned char *)buffer; + unsigned char *cp = base; + int secnum; + + /* Encode all code sections. No support for data sections (yet). */ + for (secnum = 0; secnum < D->maxsection; secnum++) { + dasm_Section *sec = D->sections + secnum; + int *b = sec->buf; + int *endb = sec->rbuf + sec->pos; + + while (b != endb) { + dasm_ActList p = D->actionlist + *b++; + unsigned char *mark = NULL; + while (1) { + int action = *p++; + int n = (action >= DASM_DISP && action <= DASM_ALIGN) ? *b++ : 0; + switch (action) { + case DASM_DISP: if (!mark) mark = cp; { + unsigned char *mm = mark; + if (*p != DASM_IMM_DB && *p != DASM_IMM_WB) mark = NULL; + if (n == 0) { int mrm = mm[-1]&7; if (mrm == 4) mrm = mm[0]&7; + if (mrm != 5) { mm[-1] -= 0x80; break; } } + if (((n+128) & -256) != 0) goto wd; else mm[-1] -= 0x40; + } + /* fallthrough */ + case DASM_IMM_S: case DASM_IMM_B: wb: dasmb(n); break; + case DASM_IMM_DB: if (((n+128)&-256) == 0) { + db: if (!mark) mark = cp; mark[-2] += 2; mark = NULL; goto wb; + } else mark = NULL; + /* fallthrough */ + case DASM_IMM_D: wd: dasmd(n); break; + case DASM_IMM_WB: if (((n+128)&-256) == 0) goto db; else mark = NULL; + /* fallthrough */ + case DASM_IMM_W: dasmw(n); break; + case DASM_VREG: { + int t = *p++; + unsigned char *ex = cp - (t&7); + if ((n & 8) && t < 0xa0) { + if (*ex & 0x80) ex[1] ^= 0x20 << (t>>6); else *ex ^= 1 << (t>>6); + n &= 7; + } else if (n & 0x10) { + if (*ex & 0x80) { + *ex = 0xc5; ex[1] = (ex[1] & 0x80) | ex[2]; ex += 2; + } + while (++ex < cp) ex[-1] = *ex; + if (mark) mark--; + cp--; + n &= 7; + } + if (t >= 0xc0) n <<= 4; + else if (t >= 0x40) n <<= 3; + else if (n == 4 && t < 0x20) { cp[-1] ^= n; *cp++ = 0x20; } + cp[-1] ^= n; + break; + } + case DASM_REL_LG: p++; if (n >= 0) goto rel_pc; + b++; n = (int)(ptrdiff_t)D->globals[-n]; + /* fallthrough */ + case DASM_REL_A: rel_a: + n -= (unsigned int)(ptrdiff_t)(cp+4); goto wd; /* !x64 */ + case DASM_REL_PC: rel_pc: { + int shrink = *b++; + int *pb = DASM_POS2PTR(D, n); if (*pb < 0) { n = pb[1]; goto rel_a; } + n = *pb - ((int)(cp-base) + 4-shrink); + if (shrink == 0) goto wd; + if (shrink == 4) { cp--; cp[-1] = *cp-0x10; } else cp[-1] = 0xeb; + goto wb; + } + case DASM_IMM_LG: + p++; if (n < 0) { n = (int)(ptrdiff_t)D->globals[-n]; goto wd; } + /* fallthrough */ + case DASM_IMM_PC: { + int *pb = DASM_POS2PTR(D, n); + n = *pb < 0 ? pb[1] : (*pb + (int)(ptrdiff_t)base); + goto wd; + } + case DASM_LABEL_LG: { + int idx = *p++; + if (idx >= 10) + D->globals[idx] = (void *)(base + (*p == DASM_SETLABEL ? *b : n)); + break; + } + case DASM_LABEL_PC: case DASM_SETLABEL: break; + case DASM_SPACE: { int fill = *p++; while (n--) *cp++ = fill; break; } + case DASM_ALIGN: + n = *p++; + while (((cp-base) & n)) *cp++ = 0x90; /* nop */ + break; + case DASM_EXTERN: n = DASM_EXTERN(Dst, cp, p[1], *p); p += 2; goto wd; + case DASM_MARK: mark = cp; break; + case DASM_ESC: action = *p++; + /* fallthrough */ + default: *cp++ = action; break; + case DASM_SECTION: case DASM_STOP: goto stop; + } + } + stop: (void)0; + } + } + + if (base + D->codesize != cp) /* Check for phase errors. */ + return DASM_S_PHASE; + return DASM_S_OK; +} + +/* Get PC label offset. */ +int dasm_getpclabel(Dst_DECL, unsigned int pc) +{ + dasm_State *D = Dst_REF; + if (pc*sizeof(int) < D->pcsize) { + int pos = D->pclabels[pc]; + if (pos < 0) return *DASM_POS2PTR(D, -pos); + if (pos > 0) return -1; /* Undefined. */ + } + return -2; /* Unused or out of range. */ +} + +#ifdef DASM_CHECKS +/* Optional sanity checker to call between isolated encoding steps. */ +int dasm_checkstep(Dst_DECL, int secmatch) +{ + dasm_State *D = Dst_REF; + if (D->status == DASM_S_OK) { + int i; + for (i = 1; i <= 9; i++) { + if (D->lglabels[i] > 0) { D->status = DASM_S_UNDEF_L|i; break; } + D->lglabels[i] = 0; + } + } + if (D->status == DASM_S_OK && secmatch >= 0 && + D->section != &D->sections[secmatch]) + D->status = DASM_S_MATCH_SEC|(int)(D->section-D->sections); + return D->status; +} +#endif + diff --git a/lib/LuaJIT/dynasm/dasm_x86.lua b/lib/LuaJIT/dynasm/dasm_x86.lua new file mode 100644 index 0000000..7f536af --- /dev/null +++ b/lib/LuaJIT/dynasm/dasm_x86.lua @@ -0,0 +1,2360 @@ +------------------------------------------------------------------------------ +-- DynASM x86/x64 module. +-- +-- Copyright (C) 2005-2017 Mike Pall. All rights reserved. +-- See dynasm.lua for full copyright notice. +------------------------------------------------------------------------------ + +local x64 = x64 + +-- Module information: +local _info = { + arch = x64 and "x64" or "x86", + description = "DynASM x86/x64 module", + version = "1.4.0", + vernum = 10400, + release = "2015-10-18", + author = "Mike Pall", + license = "MIT", +} + +-- Exported glue functions for the arch-specific module. +local _M = { _info = _info } + +-- Cache library functions. +local type, tonumber, pairs, ipairs = type, tonumber, pairs, ipairs +local assert, unpack, setmetatable = assert, unpack or table.unpack, setmetatable +local _s = string +local sub, format, byte, char = _s.sub, _s.format, _s.byte, _s.char +local find, match, gmatch, gsub = _s.find, _s.match, _s.gmatch, _s.gsub +local concat, sort, remove = table.concat, table.sort, table.remove +local bit = bit or require("bit") +local band, bxor, shl, shr = bit.band, bit.bxor, bit.lshift, bit.rshift + +-- Inherited tables and callbacks. +local g_opt, g_arch +local wline, werror, wfatal, wwarn + +-- Action name list. +-- CHECK: Keep this in sync with the C code! +local action_names = { + -- int arg, 1 buffer pos: + "DISP", "IMM_S", "IMM_B", "IMM_W", "IMM_D", "IMM_WB", "IMM_DB", + -- action arg (1 byte), int arg, 1 buffer pos (reg/num): + "VREG", "SPACE", + -- ptrdiff_t arg, 1 buffer pos (address): !x64 + "SETLABEL", "REL_A", + -- action arg (1 byte) or int arg, 2 buffer pos (link, offset): + "REL_LG", "REL_PC", + -- action arg (1 byte) or int arg, 1 buffer pos (link): + "IMM_LG", "IMM_PC", + -- action arg (1 byte) or int arg, 1 buffer pos (offset): + "LABEL_LG", "LABEL_PC", + -- action arg (1 byte), 1 buffer pos (offset): + "ALIGN", + -- action args (2 bytes), no buffer pos. + "EXTERN", + -- action arg (1 byte), no buffer pos. + "ESC", + -- no action arg, no buffer pos. + "MARK", + -- action arg (1 byte), no buffer pos, terminal action: + "SECTION", + -- no args, no buffer pos, terminal action: + "STOP" +} + +-- Maximum number of section buffer positions for dasm_put(). +-- CHECK: Keep this in sync with the C code! +local maxsecpos = 25 -- Keep this low, to avoid excessively long C lines. + +-- Action name -> action number (dynamically generated below). +local map_action = {} +-- First action number. Everything below does not need to be escaped. +local actfirst = 256-#action_names + +-- Action list buffer and string (only used to remove dupes). +local actlist = {} +local actstr = "" + +-- Argument list for next dasm_put(). Start with offset 0 into action list. +local actargs = { 0 } + +-- Current number of section buffer positions for dasm_put(). +local secpos = 1 + +-- VREG kind encodings, pre-shifted by 5 bits. +local map_vreg = { + ["modrm.rm.m"] = 0x00, + ["modrm.rm.r"] = 0x20, + ["opcode"] = 0x20, + ["sib.base"] = 0x20, + ["sib.index"] = 0x40, + ["modrm.reg"] = 0x80, + ["vex.v"] = 0xa0, + ["imm.hi"] = 0xc0, +} + +-- Current number of VREG actions contributing to REX/VEX shrinkage. +local vreg_shrink_count = 0 + +------------------------------------------------------------------------------ + +-- Compute action numbers for action names. +for n,name in ipairs(action_names) do + local num = actfirst + n - 1 + map_action[name] = num +end + +-- Dump action names and numbers. +local function dumpactions(out) + out:write("DynASM encoding engine action codes:\n") + for n,name in ipairs(action_names) do + local num = map_action[name] + out:write(format(" %-10s %02X %d\n", name, num, num)) + end + out:write("\n") +end + +-- Write action list buffer as a huge static C array. +local function writeactions(out, name) + local nn = #actlist + local last = actlist[nn] or 255 + actlist[nn] = nil -- Remove last byte. + if nn == 0 then nn = 1 end + out:write("static const unsigned char ", name, "[", nn, "] = {\n") + local s = " " + for n,b in ipairs(actlist) do + s = s..b.."," + if #s >= 75 then + assert(out:write(s, "\n")) + s = " " + end + end + out:write(s, last, "\n};\n\n") -- Add last byte back. +end + +------------------------------------------------------------------------------ + +-- Add byte to action list. +local function wputxb(n) + assert(n >= 0 and n <= 255 and n % 1 == 0, "byte out of range") + actlist[#actlist+1] = n +end + +-- Add action to list with optional arg. Advance buffer pos, too. +local function waction(action, a, num) + wputxb(assert(map_action[action], "bad action name `"..action.."'")) + if a then actargs[#actargs+1] = a end + if a or num then secpos = secpos + (num or 1) end +end + +-- Optionally add a VREG action. +local function wvreg(kind, vreg, psz, sk, defer) + if not vreg then return end + waction("VREG", vreg) + local b = assert(map_vreg[kind], "bad vreg kind `"..vreg.."'") + if b < (sk or 0) then + vreg_shrink_count = vreg_shrink_count + 1 + end + if not defer then + b = b + vreg_shrink_count * 8 + vreg_shrink_count = 0 + end + wputxb(b + (psz or 0)) +end + +-- Add call to embedded DynASM C code. +local function wcall(func, args) + wline(format("dasm_%s(Dst, %s);", func, concat(args, ", ")), true) +end + +-- Delete duplicate action list chunks. A tad slow, but so what. +local function dedupechunk(offset) + local al, as = actlist, actstr + local chunk = char(unpack(al, offset+1, #al)) + local orig = find(as, chunk, 1, true) + if orig then + actargs[1] = orig-1 -- Replace with original offset. + for i=offset+1,#al do al[i] = nil end -- Kill dupe. + else + actstr = as..chunk + end +end + +-- Flush action list (intervening C code or buffer pos overflow). +local function wflush(term) + local offset = actargs[1] + if #actlist == offset then return end -- Nothing to flush. + if not term then waction("STOP") end -- Terminate action list. + dedupechunk(offset) + wcall("put", actargs) -- Add call to dasm_put(). + actargs = { #actlist } -- Actionlist offset is 1st arg to next dasm_put(). + secpos = 1 -- The actionlist offset occupies a buffer position, too. +end + +-- Put escaped byte. +local function wputb(n) + if n >= actfirst then waction("ESC") end -- Need to escape byte. + wputxb(n) +end + +------------------------------------------------------------------------------ + +-- Global label name -> global label number. With auto assignment on 1st use. +local next_global = 10 +local map_global = setmetatable({}, { __index = function(t, name) + if not match(name, "^[%a_][%w_@]*$") then werror("bad global label") end + local n = next_global + if n > 246 then werror("too many global labels") end + next_global = n + 1 + t[name] = n + return n +end}) + +-- Dump global labels. +local function dumpglobals(out, lvl) + local t = {} + for name, n in pairs(map_global) do t[n] = name end + out:write("Global labels:\n") + for i=10,next_global-1 do + out:write(format(" %s\n", t[i])) + end + out:write("\n") +end + +-- Write global label enum. +local function writeglobals(out, prefix) + local t = {} + for name, n in pairs(map_global) do t[n] = name end + out:write("enum {\n") + for i=10,next_global-1 do + out:write(" ", prefix, gsub(t[i], "@.*", ""), ",\n") + end + out:write(" ", prefix, "_MAX\n};\n") +end + +-- Write global label names. +local function writeglobalnames(out, name) + local t = {} + for name, n in pairs(map_global) do t[n] = name end + out:write("static const char *const ", name, "[] = {\n") + for i=10,next_global-1 do + out:write(" \"", t[i], "\",\n") + end + out:write(" (const char *)0\n};\n") +end + +------------------------------------------------------------------------------ + +-- Extern label name -> extern label number. With auto assignment on 1st use. +local next_extern = -1 +local map_extern = setmetatable({}, { __index = function(t, name) + -- No restrictions on the name for now. + local n = next_extern + if n < -256 then werror("too many extern labels") end + next_extern = n - 1 + t[name] = n + return n +end}) + +-- Dump extern labels. +local function dumpexterns(out, lvl) + local t = {} + for name, n in pairs(map_extern) do t[-n] = name end + out:write("Extern labels:\n") + for i=1,-next_extern-1 do + out:write(format(" %s\n", t[i])) + end + out:write("\n") +end + +-- Write extern label names. +local function writeexternnames(out, name) + local t = {} + for name, n in pairs(map_extern) do t[-n] = name end + out:write("static const char *const ", name, "[] = {\n") + for i=1,-next_extern-1 do + out:write(" \"", t[i], "\",\n") + end + out:write(" (const char *)0\n};\n") +end + +------------------------------------------------------------------------------ + +-- Arch-specific maps. +local map_archdef = {} -- Ext. register name -> int. name. +local map_reg_rev = {} -- Int. register name -> ext. name. +local map_reg_num = {} -- Int. register name -> register number. +local map_reg_opsize = {} -- Int. register name -> operand size. +local map_reg_valid_base = {} -- Int. register name -> valid base register? +local map_reg_valid_index = {} -- Int. register name -> valid index register? +local map_reg_needrex = {} -- Int. register name -> need rex vs. no rex. +local reg_list = {} -- Canonical list of int. register names. + +local map_type = {} -- Type name -> { ctype, reg } +local ctypenum = 0 -- Type number (for _PTx macros). + +local addrsize = x64 and "q" or "d" -- Size for address operands. + +-- Helper functions to fill register maps. +local function mkrmap(sz, cl, names) + local cname = format("@%s", sz) + reg_list[#reg_list+1] = cname + map_archdef[cl] = cname + map_reg_rev[cname] = cl + map_reg_num[cname] = -1 + map_reg_opsize[cname] = sz + if sz == addrsize or sz == "d" then + map_reg_valid_base[cname] = true + map_reg_valid_index[cname] = true + end + if names then + for n,name in ipairs(names) do + local iname = format("@%s%x", sz, n-1) + reg_list[#reg_list+1] = iname + map_archdef[name] = iname + map_reg_rev[iname] = name + map_reg_num[iname] = n-1 + map_reg_opsize[iname] = sz + if sz == "b" and n > 4 then map_reg_needrex[iname] = false end + if sz == addrsize or sz == "d" then + map_reg_valid_base[iname] = true + map_reg_valid_index[iname] = true + end + end + end + for i=0,(x64 and sz ~= "f") and 15 or 7 do + local needrex = sz == "b" and i > 3 + local iname = format("@%s%x%s", sz, i, needrex and "R" or "") + if needrex then map_reg_needrex[iname] = true end + local name + if sz == "o" or sz == "y" then name = format("%s%d", cl, i) + elseif sz == "f" then name = format("st%d", i) + else name = format("r%d%s", i, sz == addrsize and "" or sz) end + map_archdef[name] = iname + if not map_reg_rev[iname] then + reg_list[#reg_list+1] = iname + map_reg_rev[iname] = name + map_reg_num[iname] = i + map_reg_opsize[iname] = sz + if sz == addrsize or sz == "d" then + map_reg_valid_base[iname] = true + map_reg_valid_index[iname] = true + end + end + end + reg_list[#reg_list+1] = "" +end + +-- Integer registers (qword, dword, word and byte sized). +if x64 then + mkrmap("q", "Rq", {"rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi"}) +end +mkrmap("d", "Rd", {"eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi"}) +mkrmap("w", "Rw", {"ax", "cx", "dx", "bx", "sp", "bp", "si", "di"}) +mkrmap("b", "Rb", {"al", "cl", "dl", "bl", "ah", "ch", "dh", "bh"}) +map_reg_valid_index[map_archdef.esp] = false +if x64 then map_reg_valid_index[map_archdef.rsp] = false end +if x64 then map_reg_needrex[map_archdef.Rb] = true end +map_archdef["Ra"] = "@"..addrsize + +-- FP registers (internally tword sized, but use "f" as operand size). +mkrmap("f", "Rf") + +-- SSE registers (oword sized, but qword and dword accessible). +mkrmap("o", "xmm") + +-- AVX registers (yword sized, but oword, qword and dword accessible). +mkrmap("y", "ymm") + +-- Operand size prefixes to codes. +local map_opsize = { + byte = "b", word = "w", dword = "d", qword = "q", oword = "o", yword = "y", + tword = "t", aword = addrsize, +} + +-- Operand size code to number. +local map_opsizenum = { + b = 1, w = 2, d = 4, q = 8, o = 16, y = 32, t = 10, +} + +-- Operand size code to name. +local map_opsizename = { + b = "byte", w = "word", d = "dword", q = "qword", o = "oword", y = "yword", + t = "tword", f = "fpword", +} + +-- Valid index register scale factors. +local map_xsc = { + ["1"] = 0, ["2"] = 1, ["4"] = 2, ["8"] = 3, +} + +-- Condition codes. +local map_cc = { + o = 0, no = 1, b = 2, nb = 3, e = 4, ne = 5, be = 6, nbe = 7, + s = 8, ns = 9, p = 10, np = 11, l = 12, nl = 13, le = 14, nle = 15, + c = 2, nae = 2, nc = 3, ae = 3, z = 4, nz = 5, na = 6, a = 7, + pe = 10, po = 11, nge = 12, ge = 13, ng = 14, g = 15, +} + + +-- Reverse defines for registers. +function _M.revdef(s) + return gsub(s, "@%w+", map_reg_rev) +end + +-- Dump register names and numbers +local function dumpregs(out) + out:write("Register names, sizes and internal numbers:\n") + for _,reg in ipairs(reg_list) do + if reg == "" then + out:write("\n") + else + local name = map_reg_rev[reg] + local num = map_reg_num[reg] + local opsize = map_opsizename[map_reg_opsize[reg]] + out:write(format(" %-5s %-8s %s\n", name, opsize, + num < 0 and "(variable)" or num)) + end + end +end + +------------------------------------------------------------------------------ + +-- Put action for label arg (IMM_LG, IMM_PC, REL_LG, REL_PC). +local function wputlabel(aprefix, imm, num) + if type(imm) == "number" then + if imm < 0 then + waction("EXTERN") + wputxb(aprefix == "IMM_" and 0 or 1) + imm = -imm-1 + else + waction(aprefix.."LG", nil, num); + end + wputxb(imm) + else + waction(aprefix.."PC", imm, num) + end +end + +-- Put signed byte or arg. +local function wputsbarg(n) + if type(n) == "number" then + if n < -128 or n > 127 then + werror("signed immediate byte out of range") + end + if n < 0 then n = n + 256 end + wputb(n) + else waction("IMM_S", n) end +end + +-- Put unsigned byte or arg. +local function wputbarg(n) + if type(n) == "number" then + if n < 0 or n > 255 then + werror("unsigned immediate byte out of range") + end + wputb(n) + else waction("IMM_B", n) end +end + +-- Put unsigned word or arg. +local function wputwarg(n) + if type(n) == "number" then + if shr(n, 16) ~= 0 then + werror("unsigned immediate word out of range") + end + wputb(band(n, 255)); wputb(shr(n, 8)); + else waction("IMM_W", n) end +end + +-- Put signed or unsigned dword or arg. +local function wputdarg(n) + local tn = type(n) + if tn == "number" then + wputb(band(n, 255)) + wputb(band(shr(n, 8), 255)) + wputb(band(shr(n, 16), 255)) + wputb(shr(n, 24)) + elseif tn == "table" then + wputlabel("IMM_", n[1], 1) + else + waction("IMM_D", n) + end +end + +-- Put operand-size dependent number or arg (defaults to dword). +local function wputszarg(sz, n) + if not sz or sz == "d" or sz == "q" then wputdarg(n) + elseif sz == "w" then wputwarg(n) + elseif sz == "b" then wputbarg(n) + elseif sz == "s" then wputsbarg(n) + else werror("bad operand size") end +end + +-- Put multi-byte opcode with operand-size dependent modifications. +local function wputop(sz, op, rex, vex, vregr, vregxb) + local psz, sk = 0, nil + if vex then + local tail + if vex.m == 1 and band(rex, 11) == 0 then + if x64 and vregxb then + sk = map_vreg["modrm.reg"] + else + wputb(0xc5) + tail = shl(bxor(band(rex, 4), 4), 5) + psz = 3 + end + end + if not tail then + wputb(0xc4) + wputb(shl(bxor(band(rex, 7), 7), 5) + vex.m) + tail = shl(band(rex, 8), 4) + psz = 4 + end + local reg, vreg = 0, nil + if vex.v then + reg = vex.v.reg + if not reg then werror("bad vex operand") end + if reg < 0 then reg = 0; vreg = vex.v.vreg end + end + if sz == "y" or vex.l then tail = tail + 4 end + wputb(tail + shl(bxor(reg, 15), 3) + vex.p) + wvreg("vex.v", vreg) + rex = 0 + if op >= 256 then werror("bad vex opcode") end + else + if rex ~= 0 then + if not x64 then werror("bad operand size") end + elseif (vregr or vregxb) and x64 then + rex = 0x10 + sk = map_vreg["vex.v"] + end + end + local r + if sz == "w" then wputb(102) end + -- Needs >32 bit numbers, but only for crc32 eax, word [ebx] + if op >= 4294967296 then r = op%4294967296 wputb((op-r)/4294967296) op = r end + if op >= 16777216 then wputb(shr(op, 24)); op = band(op, 0xffffff) end + if op >= 65536 then + if rex ~= 0 then + local opc3 = band(op, 0xffff00) + if opc3 == 0x0f3a00 or opc3 == 0x0f3800 then + wputb(64 + band(rex, 15)); rex = 0; psz = 2 + end + end + wputb(shr(op, 16)); op = band(op, 0xffff); psz = psz + 1 + end + if op >= 256 then + local b = shr(op, 8) + if b == 15 and rex ~= 0 then wputb(64 + band(rex, 15)); rex = 0; psz = 2 end + wputb(b); op = band(op, 255); psz = psz + 1 + end + if rex ~= 0 then wputb(64 + band(rex, 15)); psz = 2 end + if sz == "b" then op = op - 1 end + wputb(op) + return psz, sk +end + +-- Put ModRM or SIB formatted byte. +local function wputmodrm(m, s, rm, vs, vrm) + assert(m < 4 and s < 16 and rm < 16, "bad modrm operands") + wputb(shl(m, 6) + shl(band(s, 7), 3) + band(rm, 7)) +end + +-- Put ModRM/SIB plus optional displacement. +local function wputmrmsib(t, imark, s, vsreg, psz, sk) + local vreg, vxreg + local reg, xreg = t.reg, t.xreg + if reg and reg < 0 then reg = 0; vreg = t.vreg end + if xreg and xreg < 0 then xreg = 0; vxreg = t.vxreg end + if s < 0 then s = 0 end + + -- Register mode. + if sub(t.mode, 1, 1) == "r" then + wputmodrm(3, s, reg) + wvreg("modrm.reg", vsreg, psz+1, sk, vreg) + wvreg("modrm.rm.r", vreg, psz+1, sk) + return + end + + local disp = t.disp + local tdisp = type(disp) + -- No base register? + if not reg then + local riprel = false + if xreg then + -- Indexed mode with index register only. + -- [xreg*xsc+disp] -> (0, s, esp) (xsc, xreg, ebp) + wputmodrm(0, s, 4) + if imark == "I" then waction("MARK") end + wvreg("modrm.reg", vsreg, psz+1, sk, vxreg) + wputmodrm(t.xsc, xreg, 5) + wvreg("sib.index", vxreg, psz+2, sk) + else + -- Pure 32 bit displacement. + if x64 and tdisp ~= "table" then + wputmodrm(0, s, 4) -- [disp] -> (0, s, esp) (0, esp, ebp) + wvreg("modrm.reg", vsreg, psz+1, sk) + if imark == "I" then waction("MARK") end + wputmodrm(0, 4, 5) + else + riprel = x64 + wputmodrm(0, s, 5) -- [disp|rip-label] -> (0, s, ebp) + wvreg("modrm.reg", vsreg, psz+1, sk) + if imark == "I" then waction("MARK") end + end + end + if riprel then -- Emit rip-relative displacement. + if match("UWSiI", imark) then + werror("NYI: rip-relative displacement followed by immediate") + end + -- The previous byte in the action buffer cannot be 0xe9 or 0x80-0x8f. + wputlabel("REL_", disp[1], 2) + else + wputdarg(disp) + end + return + end + + local m + if tdisp == "number" then -- Check displacement size at assembly time. + if disp == 0 and band(reg, 7) ~= 5 then -- [ebp] -> [ebp+0] (in SIB, too) + if not vreg then m = 0 end -- Force DISP to allow [Rd(5)] -> [ebp+0] + elseif disp >= -128 and disp <= 127 then m = 1 + else m = 2 end + elseif tdisp == "table" then + m = 2 + end + + -- Index register present or esp as base register: need SIB encoding. + if xreg or band(reg, 7) == 4 then + wputmodrm(m or 2, s, 4) -- ModRM. + if m == nil or imark == "I" then waction("MARK") end + wvreg("modrm.reg", vsreg, psz+1, sk, vxreg or vreg) + wputmodrm(t.xsc or 0, xreg or 4, reg) -- SIB. + wvreg("sib.index", vxreg, psz+2, sk, vreg) + wvreg("sib.base", vreg, psz+2, sk) + else + wputmodrm(m or 2, s, reg) -- ModRM. + if (imark == "I" and (m == 1 or m == 2)) or + (m == nil and (vsreg or vreg)) then waction("MARK") end + wvreg("modrm.reg", vsreg, psz+1, sk, vreg) + wvreg("modrm.rm.m", vreg, psz+1, sk) + end + + -- Put displacement. + if m == 1 then wputsbarg(disp) + elseif m == 2 then wputdarg(disp) + elseif m == nil then waction("DISP", disp) end +end + +------------------------------------------------------------------------------ + +-- Return human-readable operand mode string. +local function opmodestr(op, args) + local m = {} + for i=1,#args do + local a = args[i] + m[#m+1] = sub(a.mode, 1, 1)..(a.opsize or "?") + end + return op.." "..concat(m, ",") +end + +-- Convert number to valid integer or nil. +local function toint(expr) + local n = tonumber(expr) + if n then + if n % 1 ~= 0 or n < -2147483648 or n > 4294967295 then + werror("bad integer number `"..expr.."'") + end + return n + end +end + +-- Parse immediate expression. +local function immexpr(expr) + -- &expr (pointer) + if sub(expr, 1, 1) == "&" then + return "iPJ", format("(ptrdiff_t)(%s)", sub(expr,2)) + end + + local prefix = sub(expr, 1, 2) + -- =>expr (pc label reference) + if prefix == "=>" then + return "iJ", sub(expr, 3) + end + -- ->name (global label reference) + if prefix == "->" then + return "iJ", map_global[sub(expr, 3)] + end + + -- [<>][1-9] (local label reference) + local dir, lnum = match(expr, "^([<>])([1-9])$") + if dir then -- Fwd: 247-255, Bkwd: 1-9. + return "iJ", lnum + (dir == ">" and 246 or 0) + end + + local extname = match(expr, "^extern%s+(%S+)$") + if extname then + return "iJ", map_extern[extname] + end + + -- expr (interpreted as immediate) + return "iI", expr +end + +-- Parse displacement expression: +-num, +-expr, +-opsize*num +local function dispexpr(expr) + local disp = expr == "" and 0 or toint(expr) + if disp then return disp end + local c, dispt = match(expr, "^([+-])%s*(.+)$") + if c == "+" then + expr = dispt + elseif not c then + werror("bad displacement expression `"..expr.."'") + end + local opsize, tailops = match(dispt, "^(%w+)%s*%*%s*(.+)$") + local ops, imm = map_opsize[opsize], toint(tailops) + if ops and imm then + if c == "-" then imm = -imm end + return imm*map_opsizenum[ops] + end + local mode, iexpr = immexpr(dispt) + if mode == "iJ" then + if c == "-" then werror("cannot invert label reference") end + return { iexpr } + end + return expr -- Need to return original signed expression. +end + +-- Parse register or type expression. +local function rtexpr(expr) + if not expr then return end + local tname, ovreg = match(expr, "^([%w_]+):(@[%w_]+)$") + local tp = map_type[tname or expr] + if tp then + local reg = ovreg or tp.reg + local rnum = map_reg_num[reg] + if not rnum then + werror("type `"..(tname or expr).."' needs a register override") + end + if not map_reg_valid_base[reg] then + werror("bad base register override `"..(map_reg_rev[reg] or reg).."'") + end + return reg, rnum, tp + end + return expr, map_reg_num[expr] +end + +-- Parse operand and return { mode, opsize, reg, xreg, xsc, disp, imm }. +local function parseoperand(param) + local t = {} + + local expr = param + local opsize, tailops = match(param, "^(%w+)%s*(.+)$") + if opsize then + t.opsize = map_opsize[opsize] + if t.opsize then expr = tailops end + end + + local br = match(expr, "^%[%s*(.-)%s*%]$") + repeat + if br then + t.mode = "xm" + + -- [disp] + t.disp = toint(br) + if t.disp then + t.mode = x64 and "xm" or "xmO" + break + end + + -- [reg...] + local tp + local reg, tailr = match(br, "^([@%w_:]+)%s*(.*)$") + reg, t.reg, tp = rtexpr(reg) + if not t.reg then + -- [expr] + t.mode = x64 and "xm" or "xmO" + t.disp = dispexpr("+"..br) + break + end + + if t.reg == -1 then + t.vreg, tailr = match(tailr, "^(%b())(.*)$") + if not t.vreg then werror("bad variable register expression") end + end + + -- [xreg*xsc] or [xreg*xsc+-disp] or [xreg*xsc+-expr] + local xsc, tailsc = match(tailr, "^%*%s*([1248])%s*(.*)$") + if xsc then + if not map_reg_valid_index[reg] then + werror("bad index register `"..map_reg_rev[reg].."'") + end + t.xsc = map_xsc[xsc] + t.xreg = t.reg + t.vxreg = t.vreg + t.reg = nil + t.vreg = nil + t.disp = dispexpr(tailsc) + break + end + if not map_reg_valid_base[reg] then + werror("bad base register `"..map_reg_rev[reg].."'") + end + + -- [reg] or [reg+-disp] + t.disp = toint(tailr) or (tailr == "" and 0) + if t.disp then break end + + -- [reg+xreg...] + local xreg, tailx = match(tailr, "^+%s*([@%w_:]+)%s*(.*)$") + xreg, t.xreg, tp = rtexpr(xreg) + if not t.xreg then + -- [reg+-expr] + t.disp = dispexpr(tailr) + break + end + if not map_reg_valid_index[xreg] then + werror("bad index register `"..map_reg_rev[xreg].."'") + end + + if t.xreg == -1 then + t.vxreg, tailx = match(tailx, "^(%b())(.*)$") + if not t.vxreg then werror("bad variable register expression") end + end + + -- [reg+xreg*xsc...] + local xsc, tailsc = match(tailx, "^%*%s*([1248])%s*(.*)$") + if xsc then + t.xsc = map_xsc[xsc] + tailx = tailsc + end + + -- [...] or [...+-disp] or [...+-expr] + t.disp = dispexpr(tailx) + else + -- imm or opsize*imm + local imm = toint(expr) + if not imm and sub(expr, 1, 1) == "*" and t.opsize then + imm = toint(sub(expr, 2)) + if imm then + imm = imm * map_opsizenum[t.opsize] + t.opsize = nil + end + end + if imm then + if t.opsize then werror("bad operand size override") end + local m = "i" + if imm == 1 then m = m.."1" end + if imm >= 4294967168 and imm <= 4294967295 then imm = imm-4294967296 end + if imm >= -128 and imm <= 127 then m = m.."S" end + t.imm = imm + t.mode = m + break + end + + local tp + local reg, tailr = match(expr, "^([@%w_:]+)%s*(.*)$") + reg, t.reg, tp = rtexpr(reg) + if t.reg then + if t.reg == -1 then + t.vreg, tailr = match(tailr, "^(%b())(.*)$") + if not t.vreg then werror("bad variable register expression") end + end + -- reg + if tailr == "" then + if t.opsize then werror("bad operand size override") end + t.opsize = map_reg_opsize[reg] + if t.opsize == "f" then + t.mode = t.reg == 0 and "fF" or "f" + else + if reg == "@w4" or (x64 and reg == "@d4") then + wwarn("bad idea, try again with `"..(x64 and "rsp'" or "esp'")) + end + t.mode = t.reg == 0 and "rmR" or (reg == "@b1" and "rmC" or "rm") + end + t.needrex = map_reg_needrex[reg] + break + end + + -- type[idx], type[idx].field, type->field -> [reg+offset_expr] + if not tp then werror("bad operand `"..param.."'") end + t.mode = "xm" + t.disp = format(tp.ctypefmt, tailr) + else + t.mode, t.imm = immexpr(expr) + if sub(t.mode, -1) == "J" then + if t.opsize and t.opsize ~= addrsize then + werror("bad operand size override") + end + t.opsize = addrsize + end + end + end + until true + return t +end + +------------------------------------------------------------------------------ +-- x86 Template String Description +-- =============================== +-- +-- Each template string is a list of [match:]pattern pairs, +-- separated by "|". The first match wins. No match means a +-- bad or unsupported combination of operand modes or sizes. +-- +-- The match part and the ":" is omitted if the operation has +-- no operands. Otherwise the first N characters are matched +-- against the mode strings of each of the N operands. +-- +-- The mode string for each operand type is (see parseoperand()): +-- Integer register: "rm", +"R" for eax, ax, al, +"C" for cl +-- FP register: "f", +"F" for st0 +-- Index operand: "xm", +"O" for [disp] (pure offset) +-- Immediate: "i", +"S" for signed 8 bit, +"1" for 1, +-- +"I" for arg, +"P" for pointer +-- Any: +"J" for valid jump targets +-- +-- So a match character "m" (mixed) matches both an integer register +-- and an index operand (to be encoded with the ModRM/SIB scheme). +-- But "r" matches only a register and "x" only an index operand +-- (e.g. for FP memory access operations). +-- +-- The operand size match string starts right after the mode match +-- characters and ends before the ":". "dwb" or "qdwb" is assumed, if empty. +-- The effective data size of the operation is matched against this list. +-- +-- If only the regular "b", "w", "d", "q", "t" operand sizes are +-- present, then all operands must be the same size. Unspecified sizes +-- are ignored, but at least one operand must have a size or the pattern +-- won't match (use the "byte", "word", "dword", "qword", "tword" +-- operand size overrides. E.g.: mov dword [eax], 1). +-- +-- If the list has a "1" or "2" prefix, the operand size is taken +-- from the respective operand and any other operand sizes are ignored. +-- If the list contains only ".", all operand sizes are ignored. +-- If the list has a "/" prefix, the concatenated (mixed) operand sizes +-- are compared to the match. +-- +-- E.g. "rrdw" matches for either two dword registers or two word +-- registers. "Fx2dq" matches an st0 operand plus an index operand +-- pointing to a dword (float) or qword (double). +-- +-- Every character after the ":" is part of the pattern string: +-- Hex chars are accumulated to form the opcode (left to right). +-- "n" disables the standard opcode mods +-- (otherwise: -1 for "b", o16 prefix for "w", rex.w for "q") +-- "X" Force REX.W. +-- "r"/"R" adds the reg. number from the 1st/2nd operand to the opcode. +-- "m"/"M" generates ModRM/SIB from the 1st/2nd operand. +-- The spare 3 bits are either filled with the last hex digit or +-- the result from a previous "r"/"R". The opcode is restored. +-- "u" Use VEX encoding, vvvv unused. +-- "v"/"V" Use VEX encoding, vvvv from 1st/2nd operand (the operand is +-- removed from the list used by future characters). +-- "w" Use VEX encoding, vvvv from 3rd operand. +-- "L" Force VEX.L +-- +-- All of the following characters force a flush of the opcode: +-- "o"/"O" stores a pure 32 bit disp (offset) from the 1st/2nd operand. +-- "s" stores a 4 bit immediate from the last register operand, +-- followed by 4 zero bits. +-- "S" stores a signed 8 bit immediate from the last operand. +-- "U" stores an unsigned 8 bit immediate from the last operand. +-- "W" stores an unsigned 16 bit immediate from the last operand. +-- "i" stores an operand sized immediate from the last operand. +-- "I" dito, but generates an action code to optionally modify +-- the opcode (+2) for a signed 8 bit immediate. +-- "J" generates one of the REL action codes from the last operand. +-- +------------------------------------------------------------------------------ + +-- Template strings for x86 instructions. Ordered by first opcode byte. +-- Unimplemented opcodes (deliberate omissions) are marked with *. +local map_op = { + -- 00-05: add... + -- 06: *push es + -- 07: *pop es + -- 08-0D: or... + -- 0E: *push cs + -- 0F: two byte opcode prefix + -- 10-15: adc... + -- 16: *push ss + -- 17: *pop ss + -- 18-1D: sbb... + -- 1E: *push ds + -- 1F: *pop ds + -- 20-25: and... + es_0 = "26", + -- 27: *daa + -- 28-2D: sub... + cs_0 = "2E", + -- 2F: *das + -- 30-35: xor... + ss_0 = "36", + -- 37: *aaa + -- 38-3D: cmp... + ds_0 = "3E", + -- 3F: *aas + inc_1 = x64 and "m:FF0m" or "rdw:40r|m:FF0m", + dec_1 = x64 and "m:FF1m" or "rdw:48r|m:FF1m", + push_1 = (x64 and "rq:n50r|rw:50r|mq:nFF6m|mw:FF6m" or + "rdw:50r|mdw:FF6m").."|S.:6AS|ib:n6Ai|i.:68i", + pop_1 = x64 and "rq:n58r|rw:58r|mq:n8F0m|mw:8F0m" or "rdw:58r|mdw:8F0m", + -- 60: *pusha, *pushad, *pushaw + -- 61: *popa, *popad, *popaw + -- 62: *bound rdw,x + -- 63: x86: *arpl mw,rw + movsxd_2 = x64 and "rm/qd:63rM", + fs_0 = "64", + gs_0 = "65", + o16_0 = "66", + a16_0 = not x64 and "67" or nil, + a32_0 = x64 and "67", + -- 68: push idw + -- 69: imul rdw,mdw,idw + -- 6A: push ib + -- 6B: imul rdw,mdw,S + -- 6C: *insb + -- 6D: *insd, *insw + -- 6E: *outsb + -- 6F: *outsd, *outsw + -- 70-7F: jcc lb + -- 80: add... mb,i + -- 81: add... mdw,i + -- 82: *undefined + -- 83: add... mdw,S + test_2 = "mr:85Rm|rm:85rM|Ri:A9ri|mi:F70mi", + -- 86: xchg rb,mb + -- 87: xchg rdw,mdw + -- 88: mov mb,r + -- 89: mov mdw,r + -- 8A: mov r,mb + -- 8B: mov r,mdw + -- 8C: *mov mdw,seg + lea_2 = "rx1dq:8DrM", + -- 8E: *mov seg,mdw + -- 8F: pop mdw + nop_0 = "90", + xchg_2 = "Rrqdw:90R|rRqdw:90r|rm:87rM|mr:87Rm", + cbw_0 = "6698", + cwde_0 = "98", + cdqe_0 = "4898", + cwd_0 = "6699", + cdq_0 = "99", + cqo_0 = "4899", + -- 9A: *call iw:idw + wait_0 = "9B", + fwait_0 = "9B", + pushf_0 = "9C", + pushfd_0 = not x64 and "9C", + pushfq_0 = x64 and "9C", + popf_0 = "9D", + popfd_0 = not x64 and "9D", + popfq_0 = x64 and "9D", + sahf_0 = "9E", + lahf_0 = "9F", + mov_2 = "OR:A3o|RO:A1O|mr:89Rm|rm:8BrM|rib:nB0ri|ridw:B8ri|mi:C70mi", + movsb_0 = "A4", + movsw_0 = "66A5", + movsd_0 = "A5", + cmpsb_0 = "A6", + cmpsw_0 = "66A7", + cmpsd_0 = "A7", + -- A8: test Rb,i + -- A9: test Rdw,i + stosb_0 = "AA", + stosw_0 = "66AB", + stosd_0 = "AB", + lodsb_0 = "AC", + lodsw_0 = "66AD", + lodsd_0 = "AD", + scasb_0 = "AE", + scasw_0 = "66AF", + scasd_0 = "AF", + -- B0-B7: mov rb,i + -- B8-BF: mov rdw,i + -- C0: rol... mb,i + -- C1: rol... mdw,i + ret_1 = "i.:nC2W", + ret_0 = "C3", + -- C4: *les rdw,mq + -- C5: *lds rdw,mq + -- C6: mov mb,i + -- C7: mov mdw,i + -- C8: *enter iw,ib + leave_0 = "C9", + -- CA: *retf iw + -- CB: *retf + int3_0 = "CC", + int_1 = "i.:nCDU", + into_0 = "CE", + -- CF: *iret + -- D0: rol... mb,1 + -- D1: rol... mdw,1 + -- D2: rol... mb,cl + -- D3: rol... mb,cl + -- D4: *aam ib + -- D5: *aad ib + -- D6: *salc + -- D7: *xlat + -- D8-DF: floating point ops + -- E0: *loopne + -- E1: *loope + -- E2: *loop + -- E3: *jcxz, *jecxz + -- E4: *in Rb,ib + -- E5: *in Rdw,ib + -- E6: *out ib,Rb + -- E7: *out ib,Rdw + call_1 = x64 and "mq:nFF2m|J.:E8nJ" or "md:FF2m|J.:E8J", + jmp_1 = x64 and "mq:nFF4m|J.:E9nJ" or "md:FF4m|J.:E9J", -- short: EB + -- EA: *jmp iw:idw + -- EB: jmp ib + -- EC: *in Rb,dx + -- ED: *in Rdw,dx + -- EE: *out dx,Rb + -- EF: *out dx,Rdw + lock_0 = "F0", + int1_0 = "F1", + repne_0 = "F2", + repnz_0 = "F2", + rep_0 = "F3", + repe_0 = "F3", + repz_0 = "F3", + -- F4: *hlt + cmc_0 = "F5", + -- F6: test... mb,i; div... mb + -- F7: test... mdw,i; div... mdw + clc_0 = "F8", + stc_0 = "F9", + -- FA: *cli + cld_0 = "FC", + std_0 = "FD", + -- FE: inc... mb + -- FF: inc... mdw + + -- misc ops + not_1 = "m:F72m", + neg_1 = "m:F73m", + mul_1 = "m:F74m", + imul_1 = "m:F75m", + div_1 = "m:F76m", + idiv_1 = "m:F77m", + + imul_2 = "rmqdw:0FAFrM|rIqdw:69rmI|rSqdw:6BrmS|riqdw:69rmi", + imul_3 = "rmIqdw:69rMI|rmSqdw:6BrMS|rmiqdw:69rMi", + + movzx_2 = "rm/db:0FB6rM|rm/qb:|rm/wb:0FB6rM|rm/dw:0FB7rM|rm/qw:", + movsx_2 = "rm/db:0FBErM|rm/qb:|rm/wb:0FBErM|rm/dw:0FBFrM|rm/qw:", + + bswap_1 = "rqd:0FC8r", + bsf_2 = "rmqdw:0FBCrM", + bsr_2 = "rmqdw:0FBDrM", + bt_2 = "mrqdw:0FA3Rm|miqdw:0FBA4mU", + btc_2 = "mrqdw:0FBBRm|miqdw:0FBA7mU", + btr_2 = "mrqdw:0FB3Rm|miqdw:0FBA6mU", + bts_2 = "mrqdw:0FABRm|miqdw:0FBA5mU", + + shld_3 = "mriqdw:0FA4RmU|mrC/qq:0FA5Rm|mrC/dd:|mrC/ww:", + shrd_3 = "mriqdw:0FACRmU|mrC/qq:0FADRm|mrC/dd:|mrC/ww:", + + rdtsc_0 = "0F31", -- P1+ + rdpmc_0 = "0F33", -- P6+ + cpuid_0 = "0FA2", -- P1+ + + -- floating point ops + fst_1 = "ff:DDD0r|xd:D92m|xq:nDD2m", + fstp_1 = "ff:DDD8r|xd:D93m|xq:nDD3m|xt:DB7m", + fld_1 = "ff:D9C0r|xd:D90m|xq:nDD0m|xt:DB5m", + + fpop_0 = "DDD8", -- Alias for fstp st0. + + fist_1 = "xw:nDF2m|xd:DB2m", + fistp_1 = "xw:nDF3m|xd:DB3m|xq:nDF7m", + fild_1 = "xw:nDF0m|xd:DB0m|xq:nDF5m", + + fxch_0 = "D9C9", + fxch_1 = "ff:D9C8r", + fxch_2 = "fFf:D9C8r|Fff:D9C8R", + + fucom_1 = "ff:DDE0r", + fucom_2 = "Fff:DDE0R", + fucomp_1 = "ff:DDE8r", + fucomp_2 = "Fff:DDE8R", + fucomi_1 = "ff:DBE8r", -- P6+ + fucomi_2 = "Fff:DBE8R", -- P6+ + fucomip_1 = "ff:DFE8r", -- P6+ + fucomip_2 = "Fff:DFE8R", -- P6+ + fcomi_1 = "ff:DBF0r", -- P6+ + fcomi_2 = "Fff:DBF0R", -- P6+ + fcomip_1 = "ff:DFF0r", -- P6+ + fcomip_2 = "Fff:DFF0R", -- P6+ + fucompp_0 = "DAE9", + fcompp_0 = "DED9", + + fldenv_1 = "x.:D94m", + fnstenv_1 = "x.:D96m", + fstenv_1 = "x.:9BD96m", + fldcw_1 = "xw:nD95m", + fstcw_1 = "xw:n9BD97m", + fnstcw_1 = "xw:nD97m", + fstsw_1 = "Rw:n9BDFE0|xw:n9BDD7m", + fnstsw_1 = "Rw:nDFE0|xw:nDD7m", + fclex_0 = "9BDBE2", + fnclex_0 = "DBE2", + + fnop_0 = "D9D0", + -- D9D1-D9DF: unassigned + + fchs_0 = "D9E0", + fabs_0 = "D9E1", + -- D9E2: unassigned + -- D9E3: unassigned + ftst_0 = "D9E4", + fxam_0 = "D9E5", + -- D9E6: unassigned + -- D9E7: unassigned + fld1_0 = "D9E8", + fldl2t_0 = "D9E9", + fldl2e_0 = "D9EA", + fldpi_0 = "D9EB", + fldlg2_0 = "D9EC", + fldln2_0 = "D9ED", + fldz_0 = "D9EE", + -- D9EF: unassigned + + f2xm1_0 = "D9F0", + fyl2x_0 = "D9F1", + fptan_0 = "D9F2", + fpatan_0 = "D9F3", + fxtract_0 = "D9F4", + fprem1_0 = "D9F5", + fdecstp_0 = "D9F6", + fincstp_0 = "D9F7", + fprem_0 = "D9F8", + fyl2xp1_0 = "D9F9", + fsqrt_0 = "D9FA", + fsincos_0 = "D9FB", + frndint_0 = "D9FC", + fscale_0 = "D9FD", + fsin_0 = "D9FE", + fcos_0 = "D9FF", + + -- SSE, SSE2 + andnpd_2 = "rmo:660F55rM", + andnps_2 = "rmo:0F55rM", + andpd_2 = "rmo:660F54rM", + andps_2 = "rmo:0F54rM", + clflush_1 = "x.:0FAE7m", + cmppd_3 = "rmio:660FC2rMU", + cmpps_3 = "rmio:0FC2rMU", + cmpsd_3 = "rrio:F20FC2rMU|rxi/oq:", + cmpss_3 = "rrio:F30FC2rMU|rxi/od:", + comisd_2 = "rro:660F2FrM|rx/oq:", + comiss_2 = "rro:0F2FrM|rx/od:", + cvtdq2pd_2 = "rro:F30FE6rM|rx/oq:", + cvtdq2ps_2 = "rmo:0F5BrM", + cvtpd2dq_2 = "rmo:F20FE6rM", + cvtpd2ps_2 = "rmo:660F5ArM", + cvtpi2pd_2 = "rx/oq:660F2ArM", + cvtpi2ps_2 = "rx/oq:0F2ArM", + cvtps2dq_2 = "rmo:660F5BrM", + cvtps2pd_2 = "rro:0F5ArM|rx/oq:", + cvtsd2si_2 = "rr/do:F20F2DrM|rr/qo:|rx/dq:|rxq:", + cvtsd2ss_2 = "rro:F20F5ArM|rx/oq:", + cvtsi2sd_2 = "rm/od:F20F2ArM|rm/oq:F20F2ArXM", + cvtsi2ss_2 = "rm/od:F30F2ArM|rm/oq:F30F2ArXM", + cvtss2sd_2 = "rro:F30F5ArM|rx/od:", + cvtss2si_2 = "rr/do:F30F2DrM|rr/qo:|rxd:|rx/qd:", + cvttpd2dq_2 = "rmo:660FE6rM", + cvttps2dq_2 = "rmo:F30F5BrM", + cvttsd2si_2 = "rr/do:F20F2CrM|rr/qo:|rx/dq:|rxq:", + cvttss2si_2 = "rr/do:F30F2CrM|rr/qo:|rxd:|rx/qd:", + fxsave_1 = "x.:0FAE0m", + fxrstor_1 = "x.:0FAE1m", + ldmxcsr_1 = "xd:0FAE2m", + lfence_0 = "0FAEE8", + maskmovdqu_2 = "rro:660FF7rM", + mfence_0 = "0FAEF0", + movapd_2 = "rmo:660F28rM|mro:660F29Rm", + movaps_2 = "rmo:0F28rM|mro:0F29Rm", + movd_2 = "rm/od:660F6ErM|rm/oq:660F6ErXM|mr/do:660F7ERm|mr/qo:", + movdqa_2 = "rmo:660F6FrM|mro:660F7FRm", + movdqu_2 = "rmo:F30F6FrM|mro:F30F7FRm", + movhlps_2 = "rro:0F12rM", + movhpd_2 = "rx/oq:660F16rM|xr/qo:n660F17Rm", + movhps_2 = "rx/oq:0F16rM|xr/qo:n0F17Rm", + movlhps_2 = "rro:0F16rM", + movlpd_2 = "rx/oq:660F12rM|xr/qo:n660F13Rm", + movlps_2 = "rx/oq:0F12rM|xr/qo:n0F13Rm", + movmskpd_2 = "rr/do:660F50rM", + movmskps_2 = "rr/do:0F50rM", + movntdq_2 = "xro:660FE7Rm", + movnti_2 = "xrqd:0FC3Rm", + movntpd_2 = "xro:660F2BRm", + movntps_2 = "xro:0F2BRm", + movq_2 = "rro:F30F7ErM|rx/oq:|xr/qo:n660FD6Rm", + movsd_2 = "rro:F20F10rM|rx/oq:|xr/qo:nF20F11Rm", + movss_2 = "rro:F30F10rM|rx/od:|xr/do:F30F11Rm", + movupd_2 = "rmo:660F10rM|mro:660F11Rm", + movups_2 = "rmo:0F10rM|mro:0F11Rm", + orpd_2 = "rmo:660F56rM", + orps_2 = "rmo:0F56rM", + pause_0 = "F390", + pextrw_3 = "rri/do:660FC5rMU|xri/wo:660F3A15nRmU", -- Mem op: SSE4.1 only. + pinsrw_3 = "rri/od:660FC4rMU|rxi/ow:", + pmovmskb_2 = "rr/do:660FD7rM", + prefetchnta_1 = "xb:n0F180m", + prefetcht0_1 = "xb:n0F181m", + prefetcht1_1 = "xb:n0F182m", + prefetcht2_1 = "xb:n0F183m", + pshufd_3 = "rmio:660F70rMU", + pshufhw_3 = "rmio:F30F70rMU", + pshuflw_3 = "rmio:F20F70rMU", + pslld_2 = "rmo:660FF2rM|rio:660F726mU", + pslldq_2 = "rio:660F737mU", + psllq_2 = "rmo:660FF3rM|rio:660F736mU", + psllw_2 = "rmo:660FF1rM|rio:660F716mU", + psrad_2 = "rmo:660FE2rM|rio:660F724mU", + psraw_2 = "rmo:660FE1rM|rio:660F714mU", + psrld_2 = "rmo:660FD2rM|rio:660F722mU", + psrldq_2 = "rio:660F733mU", + psrlq_2 = "rmo:660FD3rM|rio:660F732mU", + psrlw_2 = "rmo:660FD1rM|rio:660F712mU", + rcpps_2 = "rmo:0F53rM", + rcpss_2 = "rro:F30F53rM|rx/od:", + rsqrtps_2 = "rmo:0F52rM", + rsqrtss_2 = "rmo:F30F52rM", + sfence_0 = "0FAEF8", + shufpd_3 = "rmio:660FC6rMU", + shufps_3 = "rmio:0FC6rMU", + stmxcsr_1 = "xd:0FAE3m", + ucomisd_2 = "rro:660F2ErM|rx/oq:", + ucomiss_2 = "rro:0F2ErM|rx/od:", + unpckhpd_2 = "rmo:660F15rM", + unpckhps_2 = "rmo:0F15rM", + unpcklpd_2 = "rmo:660F14rM", + unpcklps_2 = "rmo:0F14rM", + xorpd_2 = "rmo:660F57rM", + xorps_2 = "rmo:0F57rM", + + -- SSE3 ops + fisttp_1 = "xw:nDF1m|xd:DB1m|xq:nDD1m", + addsubpd_2 = "rmo:660FD0rM", + addsubps_2 = "rmo:F20FD0rM", + haddpd_2 = "rmo:660F7CrM", + haddps_2 = "rmo:F20F7CrM", + hsubpd_2 = "rmo:660F7DrM", + hsubps_2 = "rmo:F20F7DrM", + lddqu_2 = "rxo:F20FF0rM", + movddup_2 = "rmo:F20F12rM", + movshdup_2 = "rmo:F30F16rM", + movsldup_2 = "rmo:F30F12rM", + + -- SSSE3 ops + pabsb_2 = "rmo:660F381CrM", + pabsd_2 = "rmo:660F381ErM", + pabsw_2 = "rmo:660F381DrM", + palignr_3 = "rmio:660F3A0FrMU", + phaddd_2 = "rmo:660F3802rM", + phaddsw_2 = "rmo:660F3803rM", + phaddw_2 = "rmo:660F3801rM", + phsubd_2 = "rmo:660F3806rM", + phsubsw_2 = "rmo:660F3807rM", + phsubw_2 = "rmo:660F3805rM", + pmaddubsw_2 = "rmo:660F3804rM", + pmulhrsw_2 = "rmo:660F380BrM", + pshufb_2 = "rmo:660F3800rM", + psignb_2 = "rmo:660F3808rM", + psignd_2 = "rmo:660F380ArM", + psignw_2 = "rmo:660F3809rM", + + -- SSE4.1 ops + blendpd_3 = "rmio:660F3A0DrMU", + blendps_3 = "rmio:660F3A0CrMU", + blendvpd_3 = "rmRo:660F3815rM", + blendvps_3 = "rmRo:660F3814rM", + dppd_3 = "rmio:660F3A41rMU", + dpps_3 = "rmio:660F3A40rMU", + extractps_3 = "mri/do:660F3A17RmU|rri/qo:660F3A17RXmU", + insertps_3 = "rrio:660F3A41rMU|rxi/od:", + movntdqa_2 = "rxo:660F382ArM", + mpsadbw_3 = "rmio:660F3A42rMU", + packusdw_2 = "rmo:660F382BrM", + pblendvb_3 = "rmRo:660F3810rM", + pblendw_3 = "rmio:660F3A0ErMU", + pcmpeqq_2 = "rmo:660F3829rM", + pextrb_3 = "rri/do:660F3A14nRmU|rri/qo:|xri/bo:", + pextrd_3 = "mri/do:660F3A16RmU", + pextrq_3 = "mri/qo:660F3A16RmU", + -- pextrw is SSE2, mem operand is SSE4.1 only + phminposuw_2 = "rmo:660F3841rM", + pinsrb_3 = "rri/od:660F3A20nrMU|rxi/ob:", + pinsrd_3 = "rmi/od:660F3A22rMU", + pinsrq_3 = "rmi/oq:660F3A22rXMU", + pmaxsb_2 = "rmo:660F383CrM", + pmaxsd_2 = "rmo:660F383DrM", + pmaxud_2 = "rmo:660F383FrM", + pmaxuw_2 = "rmo:660F383ErM", + pminsb_2 = "rmo:660F3838rM", + pminsd_2 = "rmo:660F3839rM", + pminud_2 = "rmo:660F383BrM", + pminuw_2 = "rmo:660F383ArM", + pmovsxbd_2 = "rro:660F3821rM|rx/od:", + pmovsxbq_2 = "rro:660F3822rM|rx/ow:", + pmovsxbw_2 = "rro:660F3820rM|rx/oq:", + pmovsxdq_2 = "rro:660F3825rM|rx/oq:", + pmovsxwd_2 = "rro:660F3823rM|rx/oq:", + pmovsxwq_2 = "rro:660F3824rM|rx/od:", + pmovzxbd_2 = "rro:660F3831rM|rx/od:", + pmovzxbq_2 = "rro:660F3832rM|rx/ow:", + pmovzxbw_2 = "rro:660F3830rM|rx/oq:", + pmovzxdq_2 = "rro:660F3835rM|rx/oq:", + pmovzxwd_2 = "rro:660F3833rM|rx/oq:", + pmovzxwq_2 = "rro:660F3834rM|rx/od:", + pmuldq_2 = "rmo:660F3828rM", + pmulld_2 = "rmo:660F3840rM", + ptest_2 = "rmo:660F3817rM", + roundpd_3 = "rmio:660F3A09rMU", + roundps_3 = "rmio:660F3A08rMU", + roundsd_3 = "rrio:660F3A0BrMU|rxi/oq:", + roundss_3 = "rrio:660F3A0ArMU|rxi/od:", + + -- SSE4.2 ops + crc32_2 = "rmqd:F20F38F1rM|rm/dw:66F20F38F1rM|rm/db:F20F38F0rM|rm/qb:", + pcmpestri_3 = "rmio:660F3A61rMU", + pcmpestrm_3 = "rmio:660F3A60rMU", + pcmpgtq_2 = "rmo:660F3837rM", + pcmpistri_3 = "rmio:660F3A63rMU", + pcmpistrm_3 = "rmio:660F3A62rMU", + popcnt_2 = "rmqdw:F30FB8rM", + + -- SSE4a + extrq_2 = "rro:660F79rM", + extrq_3 = "riio:660F780mUU", + insertq_2 = "rro:F20F79rM", + insertq_4 = "rriio:F20F78rMUU", + lzcnt_2 = "rmqdw:F30FBDrM", + movntsd_2 = "xr/qo:nF20F2BRm", + movntss_2 = "xr/do:F30F2BRm", + -- popcnt is also in SSE4.2 + + -- AES-NI + aesdec_2 = "rmo:660F38DErM", + aesdeclast_2 = "rmo:660F38DFrM", + aesenc_2 = "rmo:660F38DCrM", + aesenclast_2 = "rmo:660F38DDrM", + aesimc_2 = "rmo:660F38DBrM", + aeskeygenassist_3 = "rmio:660F3ADFrMU", + pclmulqdq_3 = "rmio:660F3A44rMU", + + -- AVX FP ops + vaddsubpd_3 = "rrmoy:660FVD0rM", + vaddsubps_3 = "rrmoy:F20FVD0rM", + vandpd_3 = "rrmoy:660FV54rM", + vandps_3 = "rrmoy:0FV54rM", + vandnpd_3 = "rrmoy:660FV55rM", + vandnps_3 = "rrmoy:0FV55rM", + vblendpd_4 = "rrmioy:660F3AV0DrMU", + vblendps_4 = "rrmioy:660F3AV0CrMU", + vblendvpd_4 = "rrmroy:660F3AV4BrMs", + vblendvps_4 = "rrmroy:660F3AV4ArMs", + vbroadcastf128_2 = "rx/yo:660F38u1ArM", + vcmppd_4 = "rrmioy:660FVC2rMU", + vcmpps_4 = "rrmioy:0FVC2rMU", + vcmpsd_4 = "rrrio:F20FVC2rMU|rrxi/ooq:", + vcmpss_4 = "rrrio:F30FVC2rMU|rrxi/ood:", + vcomisd_2 = "rro:660Fu2FrM|rx/oq:", + vcomiss_2 = "rro:0Fu2FrM|rx/od:", + vcvtdq2pd_2 = "rro:F30FuE6rM|rx/oq:|rm/yo:", + vcvtdq2ps_2 = "rmoy:0Fu5BrM", + vcvtpd2dq_2 = "rmoy:F20FuE6rM", + vcvtpd2ps_2 = "rmoy:660Fu5ArM", + vcvtps2dq_2 = "rmoy:660Fu5BrM", + vcvtps2pd_2 = "rro:0Fu5ArM|rx/oq:|rm/yo:", + vcvtsd2si_2 = "rr/do:F20Fu2DrM|rx/dq:|rr/qo:|rxq:", + vcvtsd2ss_3 = "rrro:F20FV5ArM|rrx/ooq:", + vcvtsi2sd_3 = "rrm/ood:F20FV2ArM|rrm/ooq:F20FVX2ArM", + vcvtsi2ss_3 = "rrm/ood:F30FV2ArM|rrm/ooq:F30FVX2ArM", + vcvtss2sd_3 = "rrro:F30FV5ArM|rrx/ood:", + vcvtss2si_2 = "rr/do:F30Fu2DrM|rxd:|rr/qo:|rx/qd:", + vcvttpd2dq_2 = "rmo:660FuE6rM|rm/oy:660FuLE6rM", + vcvttps2dq_2 = "rmoy:F30Fu5BrM", + vcvttsd2si_2 = "rr/do:F20Fu2CrM|rx/dq:|rr/qo:|rxq:", + vcvttss2si_2 = "rr/do:F30Fu2CrM|rxd:|rr/qo:|rx/qd:", + vdppd_4 = "rrmio:660F3AV41rMU", + vdpps_4 = "rrmioy:660F3AV40rMU", + vextractf128_3 = "mri/oy:660F3AuL19RmU", + vextractps_3 = "mri/do:660F3Au17RmU", + vhaddpd_3 = "rrmoy:660FV7CrM", + vhaddps_3 = "rrmoy:F20FV7CrM", + vhsubpd_3 = "rrmoy:660FV7DrM", + vhsubps_3 = "rrmoy:F20FV7DrM", + vinsertf128_4 = "rrmi/yyo:660F3AV18rMU", + vinsertps_4 = "rrrio:660F3AV21rMU|rrxi/ood:", + vldmxcsr_1 = "xd:0FuAE2m", + vmaskmovps_3 = "rrxoy:660F38V2CrM|xrroy:660F38V2ERm", + vmaskmovpd_3 = "rrxoy:660F38V2DrM|xrroy:660F38V2FRm", + vmovapd_2 = "rmoy:660Fu28rM|mroy:660Fu29Rm", + vmovaps_2 = "rmoy:0Fu28rM|mroy:0Fu29Rm", + vmovd_2 = "rm/od:660Fu6ErM|rm/oq:660FuX6ErM|mr/do:660Fu7ERm|mr/qo:", + vmovq_2 = "rro:F30Fu7ErM|rx/oq:|xr/qo:660FuD6Rm", + vmovddup_2 = "rmy:F20Fu12rM|rro:|rx/oq:", + vmovhlps_3 = "rrro:0FV12rM", + vmovhpd_2 = "xr/qo:660Fu17Rm", + vmovhpd_3 = "rrx/ooq:660FV16rM", + vmovhps_2 = "xr/qo:0Fu17Rm", + vmovhps_3 = "rrx/ooq:0FV16rM", + vmovlhps_3 = "rrro:0FV16rM", + vmovlpd_2 = "xr/qo:660Fu13Rm", + vmovlpd_3 = "rrx/ooq:660FV12rM", + vmovlps_2 = "xr/qo:0Fu13Rm", + vmovlps_3 = "rrx/ooq:0FV12rM", + vmovmskpd_2 = "rr/do:660Fu50rM|rr/dy:660FuL50rM", + vmovmskps_2 = "rr/do:0Fu50rM|rr/dy:0FuL50rM", + vmovntpd_2 = "xroy:660Fu2BRm", + vmovntps_2 = "xroy:0Fu2BRm", + vmovsd_2 = "rx/oq:F20Fu10rM|xr/qo:F20Fu11Rm", + vmovsd_3 = "rrro:F20FV10rM", + vmovshdup_2 = "rmoy:F30Fu16rM", + vmovsldup_2 = "rmoy:F30Fu12rM", + vmovss_2 = "rx/od:F30Fu10rM|xr/do:F30Fu11Rm", + vmovss_3 = "rrro:F30FV10rM", + vmovupd_2 = "rmoy:660Fu10rM|mroy:660Fu11Rm", + vmovups_2 = "rmoy:0Fu10rM|mroy:0Fu11Rm", + vorpd_3 = "rrmoy:660FV56rM", + vorps_3 = "rrmoy:0FV56rM", + vpermilpd_3 = "rrmoy:660F38V0DrM|rmioy:660F3Au05rMU", + vpermilps_3 = "rrmoy:660F38V0CrM|rmioy:660F3Au04rMU", + vperm2f128_4 = "rrmiy:660F3AV06rMU", + vptestpd_2 = "rmoy:660F38u0FrM", + vptestps_2 = "rmoy:660F38u0ErM", + vrcpps_2 = "rmoy:0Fu53rM", + vrcpss_3 = "rrro:F30FV53rM|rrx/ood:", + vrsqrtps_2 = "rmoy:0Fu52rM", + vrsqrtss_3 = "rrro:F30FV52rM|rrx/ood:", + vroundpd_3 = "rmioy:660F3Au09rMU", + vroundps_3 = "rmioy:660F3Au08rMU", + vroundsd_4 = "rrrio:660F3AV0BrMU|rrxi/ooq:", + vroundss_4 = "rrrio:660F3AV0ArMU|rrxi/ood:", + vshufpd_4 = "rrmioy:660FVC6rMU", + vshufps_4 = "rrmioy:0FVC6rMU", + vsqrtps_2 = "rmoy:0Fu51rM", + vsqrtss_2 = "rro:F30Fu51rM|rx/od:", + vsqrtpd_2 = "rmoy:660Fu51rM", + vsqrtsd_2 = "rro:F20Fu51rM|rx/oq:", + vstmxcsr_1 = "xd:0FuAE3m", + vucomisd_2 = "rro:660Fu2ErM|rx/oq:", + vucomiss_2 = "rro:0Fu2ErM|rx/od:", + vunpckhpd_3 = "rrmoy:660FV15rM", + vunpckhps_3 = "rrmoy:0FV15rM", + vunpcklpd_3 = "rrmoy:660FV14rM", + vunpcklps_3 = "rrmoy:0FV14rM", + vxorpd_3 = "rrmoy:660FV57rM", + vxorps_3 = "rrmoy:0FV57rM", + vzeroall_0 = "0FuL77", + vzeroupper_0 = "0Fu77", + + -- AVX2 FP ops + vbroadcastss_2 = "rx/od:660F38u18rM|rx/yd:|rro:|rr/yo:", + vbroadcastsd_2 = "rx/yq:660F38u19rM|rr/yo:", + -- *vgather* (!vsib) + vpermpd_3 = "rmiy:660F3AuX01rMU", + vpermps_3 = "rrmy:660F38V16rM", + + -- AVX, AVX2 integer ops + -- In general, xmm requires AVX, ymm requires AVX2. + vaesdec_3 = "rrmo:660F38VDErM", + vaesdeclast_3 = "rrmo:660F38VDFrM", + vaesenc_3 = "rrmo:660F38VDCrM", + vaesenclast_3 = "rrmo:660F38VDDrM", + vaesimc_2 = "rmo:660F38uDBrM", + vaeskeygenassist_3 = "rmio:660F3AuDFrMU", + vlddqu_2 = "rxoy:F20FuF0rM", + vmaskmovdqu_2 = "rro:660FuF7rM", + vmovdqa_2 = "rmoy:660Fu6FrM|mroy:660Fu7FRm", + vmovdqu_2 = "rmoy:F30Fu6FrM|mroy:F30Fu7FRm", + vmovntdq_2 = "xroy:660FuE7Rm", + vmovntdqa_2 = "rxoy:660F38u2ArM", + vmpsadbw_4 = "rrmioy:660F3AV42rMU", + vpabsb_2 = "rmoy:660F38u1CrM", + vpabsd_2 = "rmoy:660F38u1ErM", + vpabsw_2 = "rmoy:660F38u1DrM", + vpackusdw_3 = "rrmoy:660F38V2BrM", + vpalignr_4 = "rrmioy:660F3AV0FrMU", + vpblendvb_4 = "rrmroy:660F3AV4CrMs", + vpblendw_4 = "rrmioy:660F3AV0ErMU", + vpclmulqdq_4 = "rrmio:660F3AV44rMU", + vpcmpeqq_3 = "rrmoy:660F38V29rM", + vpcmpestri_3 = "rmio:660F3Au61rMU", + vpcmpestrm_3 = "rmio:660F3Au60rMU", + vpcmpgtq_3 = "rrmoy:660F38V37rM", + vpcmpistri_3 = "rmio:660F3Au63rMU", + vpcmpistrm_3 = "rmio:660F3Au62rMU", + vpextrb_3 = "rri/do:660F3Au14nRmU|rri/qo:|xri/bo:", + vpextrw_3 = "rri/do:660FuC5rMU|xri/wo:660F3Au15nRmU", + vpextrd_3 = "mri/do:660F3Au16RmU", + vpextrq_3 = "mri/qo:660F3Au16RmU", + vphaddw_3 = "rrmoy:660F38V01rM", + vphaddd_3 = "rrmoy:660F38V02rM", + vphaddsw_3 = "rrmoy:660F38V03rM", + vphminposuw_2 = "rmo:660F38u41rM", + vphsubw_3 = "rrmoy:660F38V05rM", + vphsubd_3 = "rrmoy:660F38V06rM", + vphsubsw_3 = "rrmoy:660F38V07rM", + vpinsrb_4 = "rrri/ood:660F3AV20rMU|rrxi/oob:", + vpinsrw_4 = "rrri/ood:660FVC4rMU|rrxi/oow:", + vpinsrd_4 = "rrmi/ood:660F3AV22rMU", + vpinsrq_4 = "rrmi/ooq:660F3AVX22rMU", + vpmaddubsw_3 = "rrmoy:660F38V04rM", + vpmaxsb_3 = "rrmoy:660F38V3CrM", + vpmaxsd_3 = "rrmoy:660F38V3DrM", + vpmaxuw_3 = "rrmoy:660F38V3ErM", + vpmaxud_3 = "rrmoy:660F38V3FrM", + vpminsb_3 = "rrmoy:660F38V38rM", + vpminsd_3 = "rrmoy:660F38V39rM", + vpminuw_3 = "rrmoy:660F38V3ArM", + vpminud_3 = "rrmoy:660F38V3BrM", + vpmovmskb_2 = "rr/do:660FuD7rM|rr/dy:660FuLD7rM", + vpmovsxbw_2 = "rroy:660F38u20rM|rx/oq:|rx/yo:", + vpmovsxbd_2 = "rroy:660F38u21rM|rx/od:|rx/yq:", + vpmovsxbq_2 = "rroy:660F38u22rM|rx/ow:|rx/yd:", + vpmovsxwd_2 = "rroy:660F38u23rM|rx/oq:|rx/yo:", + vpmovsxwq_2 = "rroy:660F38u24rM|rx/od:|rx/yq:", + vpmovsxdq_2 = "rroy:660F38u25rM|rx/oq:|rx/yo:", + vpmovzxbw_2 = "rroy:660F38u30rM|rx/oq:|rx/yo:", + vpmovzxbd_2 = "rroy:660F38u31rM|rx/od:|rx/yq:", + vpmovzxbq_2 = "rroy:660F38u32rM|rx/ow:|rx/yd:", + vpmovzxwd_2 = "rroy:660F38u33rM|rx/oq:|rx/yo:", + vpmovzxwq_2 = "rroy:660F38u34rM|rx/od:|rx/yq:", + vpmovzxdq_2 = "rroy:660F38u35rM|rx/oq:|rx/yo:", + vpmuldq_3 = "rrmoy:660F38V28rM", + vpmulhrsw_3 = "rrmoy:660F38V0BrM", + vpmulld_3 = "rrmoy:660F38V40rM", + vpshufb_3 = "rrmoy:660F38V00rM", + vpshufd_3 = "rmioy:660Fu70rMU", + vpshufhw_3 = "rmioy:F30Fu70rMU", + vpshuflw_3 = "rmioy:F20Fu70rMU", + vpsignb_3 = "rrmoy:660F38V08rM", + vpsignw_3 = "rrmoy:660F38V09rM", + vpsignd_3 = "rrmoy:660F38V0ArM", + vpslldq_3 = "rrioy:660Fv737mU", + vpsllw_3 = "rrmoy:660FVF1rM|rrioy:660Fv716mU", + vpslld_3 = "rrmoy:660FVF2rM|rrioy:660Fv726mU", + vpsllq_3 = "rrmoy:660FVF3rM|rrioy:660Fv736mU", + vpsraw_3 = "rrmoy:660FVE1rM|rrioy:660Fv714mU", + vpsrad_3 = "rrmoy:660FVE2rM|rrioy:660Fv724mU", + vpsrldq_3 = "rrioy:660Fv733mU", + vpsrlw_3 = "rrmoy:660FVD1rM|rrioy:660Fv712mU", + vpsrld_3 = "rrmoy:660FVD2rM|rrioy:660Fv722mU", + vpsrlq_3 = "rrmoy:660FVD3rM|rrioy:660Fv732mU", + vptest_2 = "rmoy:660F38u17rM", + + -- AVX2 integer ops + vbroadcasti128_2 = "rx/yo:660F38u5ArM", + vinserti128_4 = "rrmi/yyo:660F3AV38rMU", + vextracti128_3 = "mri/oy:660F3AuL39RmU", + vpblendd_4 = "rrmioy:660F3AV02rMU", + vpbroadcastb_2 = "rro:660F38u78rM|rx/ob:|rr/yo:|rx/yb:", + vpbroadcastw_2 = "rro:660F38u79rM|rx/ow:|rr/yo:|rx/yw:", + vpbroadcastd_2 = "rro:660F38u58rM|rx/od:|rr/yo:|rx/yd:", + vpbroadcastq_2 = "rro:660F38u59rM|rx/oq:|rr/yo:|rx/yq:", + vpermd_3 = "rrmy:660F38V36rM", + vpermq_3 = "rmiy:660F3AuX00rMU", + -- *vpgather* (!vsib) + vperm2i128_4 = "rrmiy:660F3AV46rMU", + vpmaskmovd_3 = "rrxoy:660F38V8CrM|xrroy:660F38V8ERm", + vpmaskmovq_3 = "rrxoy:660F38VX8CrM|xrroy:660F38VX8ERm", + vpsllvd_3 = "rrmoy:660F38V47rM", + vpsllvq_3 = "rrmoy:660F38VX47rM", + vpsravd_3 = "rrmoy:660F38V46rM", + vpsrlvd_3 = "rrmoy:660F38V45rM", + vpsrlvq_3 = "rrmoy:660F38VX45rM", + + -- Intel ADX + adcx_2 = "rmqd:660F38F6rM", + adox_2 = "rmqd:F30F38F6rM", + + -- BMI1 + andn_3 = "rrmqd:0F38VF2rM", + bextr_3 = "rmrqd:0F38wF7rM", + blsi_2 = "rmqd:0F38vF33m", + blsmsk_2 = "rmqd:0F38vF32m", + blsr_2 = "rmqd:0F38vF31m", + tzcnt_2 = "rmqdw:F30FBCrM", + + -- BMI2 + bzhi_3 = "rmrqd:0F38wF5rM", + mulx_3 = "rrmqd:F20F38VF6rM", + pdep_3 = "rrmqd:F20F38VF5rM", + pext_3 = "rrmqd:F30F38VF5rM", + rorx_3 = "rmSqd:F20F3AuF0rMS", + sarx_3 = "rmrqd:F30F38wF7rM", + shrx_3 = "rmrqd:F20F38wF7rM", + shlx_3 = "rmrqd:660F38wF7rM", + + -- FMA3 + vfmaddsub132pd_3 = "rrmoy:660F38VX96rM", + vfmaddsub132ps_3 = "rrmoy:660F38V96rM", + vfmaddsub213pd_3 = "rrmoy:660F38VXA6rM", + vfmaddsub213ps_3 = "rrmoy:660F38VA6rM", + vfmaddsub231pd_3 = "rrmoy:660F38VXB6rM", + vfmaddsub231ps_3 = "rrmoy:660F38VB6rM", + + vfmsubadd132pd_3 = "rrmoy:660F38VX97rM", + vfmsubadd132ps_3 = "rrmoy:660F38V97rM", + vfmsubadd213pd_3 = "rrmoy:660F38VXA7rM", + vfmsubadd213ps_3 = "rrmoy:660F38VA7rM", + vfmsubadd231pd_3 = "rrmoy:660F38VXB7rM", + vfmsubadd231ps_3 = "rrmoy:660F38VB7rM", + + vfmadd132pd_3 = "rrmoy:660F38VX98rM", + vfmadd132ps_3 = "rrmoy:660F38V98rM", + vfmadd132sd_3 = "rrro:660F38VX99rM|rrx/ooq:", + vfmadd132ss_3 = "rrro:660F38V99rM|rrx/ood:", + vfmadd213pd_3 = "rrmoy:660F38VXA8rM", + vfmadd213ps_3 = "rrmoy:660F38VA8rM", + vfmadd213sd_3 = "rrro:660F38VXA9rM|rrx/ooq:", + vfmadd213ss_3 = "rrro:660F38VA9rM|rrx/ood:", + vfmadd231pd_3 = "rrmoy:660F38VXB8rM", + vfmadd231ps_3 = "rrmoy:660F38VB8rM", + vfmadd231sd_3 = "rrro:660F38VXB9rM|rrx/ooq:", + vfmadd231ss_3 = "rrro:660F38VB9rM|rrx/ood:", + + vfmsub132pd_3 = "rrmoy:660F38VX9ArM", + vfmsub132ps_3 = "rrmoy:660F38V9ArM", + vfmsub132sd_3 = "rrro:660F38VX9BrM|rrx/ooq:", + vfmsub132ss_3 = "rrro:660F38V9BrM|rrx/ood:", + vfmsub213pd_3 = "rrmoy:660F38VXAArM", + vfmsub213ps_3 = "rrmoy:660F38VAArM", + vfmsub213sd_3 = "rrro:660F38VXABrM|rrx/ooq:", + vfmsub213ss_3 = "rrro:660F38VABrM|rrx/ood:", + vfmsub231pd_3 = "rrmoy:660F38VXBArM", + vfmsub231ps_3 = "rrmoy:660F38VBArM", + vfmsub231sd_3 = "rrro:660F38VXBBrM|rrx/ooq:", + vfmsub231ss_3 = "rrro:660F38VBBrM|rrx/ood:", + + vfnmadd132pd_3 = "rrmoy:660F38VX9CrM", + vfnmadd132ps_3 = "rrmoy:660F38V9CrM", + vfnmadd132sd_3 = "rrro:660F38VX9DrM|rrx/ooq:", + vfnmadd132ss_3 = "rrro:660F38V9DrM|rrx/ood:", + vfnmadd213pd_3 = "rrmoy:660F38VXACrM", + vfnmadd213ps_3 = "rrmoy:660F38VACrM", + vfnmadd213sd_3 = "rrro:660F38VXADrM|rrx/ooq:", + vfnmadd213ss_3 = "rrro:660F38VADrM|rrx/ood:", + vfnmadd231pd_3 = "rrmoy:660F38VXBCrM", + vfnmadd231ps_3 = "rrmoy:660F38VBCrM", + vfnmadd231sd_3 = "rrro:660F38VXBDrM|rrx/ooq:", + vfnmadd231ss_3 = "rrro:660F38VBDrM|rrx/ood:", + + vfnmsub132pd_3 = "rrmoy:660F38VX9ErM", + vfnmsub132ps_3 = "rrmoy:660F38V9ErM", + vfnmsub132sd_3 = "rrro:660F38VX9FrM|rrx/ooq:", + vfnmsub132ss_3 = "rrro:660F38V9FrM|rrx/ood:", + vfnmsub213pd_3 = "rrmoy:660F38VXAErM", + vfnmsub213ps_3 = "rrmoy:660F38VAErM", + vfnmsub213sd_3 = "rrro:660F38VXAFrM|rrx/ooq:", + vfnmsub213ss_3 = "rrro:660F38VAFrM|rrx/ood:", + vfnmsub231pd_3 = "rrmoy:660F38VXBErM", + vfnmsub231ps_3 = "rrmoy:660F38VBErM", + vfnmsub231sd_3 = "rrro:660F38VXBFrM|rrx/ooq:", + vfnmsub231ss_3 = "rrro:660F38VBFrM|rrx/ood:", +} + +------------------------------------------------------------------------------ + +-- Arithmetic ops. +for name,n in pairs{ add = 0, ["or"] = 1, adc = 2, sbb = 3, + ["and"] = 4, sub = 5, xor = 6, cmp = 7 } do + local n8 = shl(n, 3) + map_op[name.."_2"] = format( + "mr:%02XRm|rm:%02XrM|mI1qdw:81%XmI|mS1qdw:83%XmS|Ri1qdwb:%02Xri|mi1qdwb:81%Xmi", + 1+n8, 3+n8, n, n, 5+n8, n) +end + +-- Shift ops. +for name,n in pairs{ rol = 0, ror = 1, rcl = 2, rcr = 3, + shl = 4, shr = 5, sar = 7, sal = 4 } do + map_op[name.."_2"] = format("m1:D1%Xm|mC1qdwb:D3%Xm|mi:C1%XmU", n, n, n) +end + +-- Conditional ops. +for cc,n in pairs(map_cc) do + map_op["j"..cc.."_1"] = format("J.:n0F8%XJ", n) -- short: 7%X + map_op["set"..cc.."_1"] = format("mb:n0F9%X2m", n) + map_op["cmov"..cc.."_2"] = format("rmqdw:0F4%XrM", n) -- P6+ +end + +-- FP arithmetic ops. +for name,n in pairs{ add = 0, mul = 1, com = 2, comp = 3, + sub = 4, subr = 5, div = 6, divr = 7 } do + local nc = 0xc0 + shl(n, 3) + local nr = nc + (n < 4 and 0 or (n % 2 == 0 and 8 or -8)) + local fn = "f"..name + map_op[fn.."_1"] = format("ff:D8%02Xr|xd:D8%Xm|xq:nDC%Xm", nc, n, n) + if n == 2 or n == 3 then + map_op[fn.."_2"] = format("Fff:D8%02XR|Fx2d:D8%XM|Fx2q:nDC%XM", nc, n, n) + else + map_op[fn.."_2"] = format("Fff:D8%02XR|fFf:DC%02Xr|Fx2d:D8%XM|Fx2q:nDC%XM", nc, nr, n, n) + map_op[fn.."p_1"] = format("ff:DE%02Xr", nr) + map_op[fn.."p_2"] = format("fFf:DE%02Xr", nr) + end + map_op["fi"..name.."_1"] = format("xd:DA%Xm|xw:nDE%Xm", n, n) +end + +-- FP conditional moves. +for cc,n in pairs{ b=0, e=1, be=2, u=3, nb=4, ne=5, nbe=6, nu=7 } do + local nc = 0xdac0 + shl(band(n, 3), 3) + shl(band(n, 4), 6) + map_op["fcmov"..cc.."_1"] = format("ff:%04Xr", nc) -- P6+ + map_op["fcmov"..cc.."_2"] = format("Fff:%04XR", nc) -- P6+ +end + +-- SSE / AVX FP arithmetic ops. +for name,n in pairs{ sqrt = 1, add = 8, mul = 9, + sub = 12, min = 13, div = 14, max = 15 } do + map_op[name.."ps_2"] = format("rmo:0F5%XrM", n) + map_op[name.."ss_2"] = format("rro:F30F5%XrM|rx/od:", n) + map_op[name.."pd_2"] = format("rmo:660F5%XrM", n) + map_op[name.."sd_2"] = format("rro:F20F5%XrM|rx/oq:", n) + if n ~= 1 then + map_op["v"..name.."ps_3"] = format("rrmoy:0FV5%XrM", n) + map_op["v"..name.."ss_3"] = format("rrro:F30FV5%XrM|rrx/ood:", n) + map_op["v"..name.."pd_3"] = format("rrmoy:660FV5%XrM", n) + map_op["v"..name.."sd_3"] = format("rrro:F20FV5%XrM|rrx/ooq:", n) + end +end + +-- SSE2 / AVX / AVX2 integer arithmetic ops (66 0F leaf). +for name,n in pairs{ + paddb = 0xFC, paddw = 0xFD, paddd = 0xFE, paddq = 0xD4, + paddsb = 0xEC, paddsw = 0xED, packssdw = 0x6B, + packsswb = 0x63, packuswb = 0x67, paddusb = 0xDC, + paddusw = 0xDD, pand = 0xDB, pandn = 0xDF, pavgb = 0xE0, + pavgw = 0xE3, pcmpeqb = 0x74, pcmpeqd = 0x76, + pcmpeqw = 0x75, pcmpgtb = 0x64, pcmpgtd = 0x66, + pcmpgtw = 0x65, pmaddwd = 0xF5, pmaxsw = 0xEE, + pmaxub = 0xDE, pminsw = 0xEA, pminub = 0xDA, + pmulhuw = 0xE4, pmulhw = 0xE5, pmullw = 0xD5, + pmuludq = 0xF4, por = 0xEB, psadbw = 0xF6, psubb = 0xF8, + psubw = 0xF9, psubd = 0xFA, psubq = 0xFB, psubsb = 0xE8, + psubsw = 0xE9, psubusb = 0xD8, psubusw = 0xD9, + punpckhbw = 0x68, punpckhwd = 0x69, punpckhdq = 0x6A, + punpckhqdq = 0x6D, punpcklbw = 0x60, punpcklwd = 0x61, + punpckldq = 0x62, punpcklqdq = 0x6C, pxor = 0xEF +} do + map_op[name.."_2"] = format("rmo:660F%02XrM", n) + map_op["v"..name.."_3"] = format("rrmoy:660FV%02XrM", n) +end + +------------------------------------------------------------------------------ + +local map_vexarg = { u = false, v = 1, V = 2 } + +-- Process pattern string. +local function dopattern(pat, args, sz, op, needrex) + local digit, addin, vex + local opcode = 0 + local szov = sz + local narg = 1 + local rex = 0 + + -- Limit number of section buffer positions used by a single dasm_put(). + -- A single opcode needs a maximum of 6 positions. + if secpos+6 > maxsecpos then wflush() end + + -- Process each character. + for c in gmatch(pat.."|", ".") do + if match(c, "%x") then -- Hex digit. + digit = byte(c) - 48 + if digit > 48 then digit = digit - 39 + elseif digit > 16 then digit = digit - 7 end + opcode = opcode*16 + digit + addin = nil + elseif c == "n" then -- Disable operand size mods for opcode. + szov = nil + elseif c == "X" then -- Force REX.W. + rex = 8 + elseif c == "L" then -- Force VEX.L. + vex.l = true + elseif c == "r" then -- Merge 1st operand regno. into opcode. + addin = args[1]; opcode = opcode + (addin.reg % 8) + if narg < 2 then narg = 2 end + elseif c == "R" then -- Merge 2nd operand regno. into opcode. + addin = args[2]; opcode = opcode + (addin.reg % 8) + narg = 3 + elseif c == "m" or c == "M" then -- Encode ModRM/SIB. + local s + if addin then + s = addin.reg + opcode = opcode - band(s, 7) -- Undo regno opcode merge. + else + s = band(opcode, 15) -- Undo last digit. + opcode = shr(opcode, 4) + end + local nn = c == "m" and 1 or 2 + local t = args[nn] + if narg <= nn then narg = nn + 1 end + if szov == "q" and rex == 0 then rex = rex + 8 end + if t.reg and t.reg > 7 then rex = rex + 1 end + if t.xreg and t.xreg > 7 then rex = rex + 2 end + if s > 7 then rex = rex + 4 end + if needrex then rex = rex + 16 end + local psz, sk = wputop(szov, opcode, rex, vex, s < 0, t.vreg or t.vxreg) + opcode = nil + local imark = sub(pat, -1) -- Force a mark (ugly). + -- Put ModRM/SIB with regno/last digit as spare. + wputmrmsib(t, imark, s, addin and addin.vreg, psz, sk) + addin = nil + elseif map_vexarg[c] ~= nil then -- Encode using VEX prefix + local b = band(opcode, 255); opcode = shr(opcode, 8) + local m = 1 + if b == 0x38 then m = 2 + elseif b == 0x3a then m = 3 end + if m ~= 1 then b = band(opcode, 255); opcode = shr(opcode, 8) end + if b ~= 0x0f then + werror("expected `0F', `0F38', or `0F3A' to precede `"..c.. + "' in pattern `"..pat.."' for `"..op.."'") + end + local v = map_vexarg[c] + if v then v = remove(args, v) end + b = band(opcode, 255) + local p = 0 + if b == 0x66 then p = 1 + elseif b == 0xf3 then p = 2 + elseif b == 0xf2 then p = 3 end + if p ~= 0 then opcode = shr(opcode, 8) end + if opcode ~= 0 then wputop(nil, opcode, 0); opcode = 0 end + vex = { m = m, p = p, v = v } + else + if opcode then -- Flush opcode. + if szov == "q" and rex == 0 then rex = rex + 8 end + if needrex then rex = rex + 16 end + if addin and addin.reg == -1 then + local psz, sk = wputop(szov, opcode - 7, rex, vex, true) + wvreg("opcode", addin.vreg, psz, sk) + else + if addin and addin.reg > 7 then rex = rex + 1 end + wputop(szov, opcode, rex, vex) + end + opcode = nil + end + if c == "|" then break end + if c == "o" then -- Offset (pure 32 bit displacement). + wputdarg(args[1].disp); if narg < 2 then narg = 2 end + elseif c == "O" then + wputdarg(args[2].disp); narg = 3 + else + -- Anything else is an immediate operand. + local a = args[narg] + narg = narg + 1 + local mode, imm = a.mode, a.imm + if mode == "iJ" and not match("iIJ", c) then + werror("bad operand size for label") + end + if c == "S" then + wputsbarg(imm) + elseif c == "U" then + wputbarg(imm) + elseif c == "W" then + wputwarg(imm) + elseif c == "i" or c == "I" then + if mode == "iJ" then + wputlabel("IMM_", imm, 1) + elseif mode == "iI" and c == "I" then + waction(sz == "w" and "IMM_WB" or "IMM_DB", imm) + else + wputszarg(sz, imm) + end + elseif c == "J" then + if mode == "iPJ" then + waction("REL_A", imm) -- !x64 (secpos) + else + wputlabel("REL_", imm, 2) + end + elseif c == "s" then + local reg = a.reg + if reg < 0 then + wputb(0) + wvreg("imm.hi", a.vreg) + else + wputb(shl(reg, 4)) + end + else + werror("bad char `"..c.."' in pattern `"..pat.."' for `"..op.."'") + end + end + end + end +end + +------------------------------------------------------------------------------ + +-- Mapping of operand modes to short names. Suppress output with '#'. +local map_modename = { + r = "reg", R = "eax", C = "cl", x = "mem", m = "mrm", i = "imm", + f = "stx", F = "st0", J = "lbl", ["1"] = "1", + I = "#", S = "#", O = "#", +} + +-- Return a table/string showing all possible operand modes. +local function templatehelp(template, nparams) + if nparams == 0 then return "" end + local t = {} + for tm in gmatch(template, "[^%|]+") do + local s = map_modename[sub(tm, 1, 1)] + s = s..gsub(sub(tm, 2, nparams), ".", function(c) + return ", "..map_modename[c] + end) + if not match(s, "#") then t[#t+1] = s end + end + return t +end + +-- Match operand modes against mode match part of template. +local function matchtm(tm, args) + for i=1,#args do + if not match(args[i].mode, sub(tm, i, i)) then return end + end + return true +end + +-- Handle opcodes defined with template strings. +map_op[".template__"] = function(params, template, nparams) + if not params then return templatehelp(template, nparams) end + local args = {} + + -- Zero-operand opcodes have no match part. + if #params == 0 then + dopattern(template, args, "d", params.op, nil) + return + end + + -- Determine common operand size (coerce undefined size) or flag as mixed. + local sz, szmix, needrex + for i,p in ipairs(params) do + args[i] = parseoperand(p) + local nsz = args[i].opsize + if nsz then + if sz and sz ~= nsz then szmix = true else sz = nsz end + end + local nrex = args[i].needrex + if nrex ~= nil then + if needrex == nil then + needrex = nrex + elseif needrex ~= nrex then + werror("bad mix of byte-addressable registers") + end + end + end + + -- Try all match:pattern pairs (separated by '|'). + local gotmatch, lastpat + for tm in gmatch(template, "[^%|]+") do + -- Split off size match (starts after mode match) and pattern string. + local szm, pat = match(tm, "^(.-):(.*)$", #args+1) + if pat == "" then pat = lastpat else lastpat = pat end + if matchtm(tm, args) then + local prefix = sub(szm, 1, 1) + if prefix == "/" then -- Exactly match leading operand sizes. + for i = #szm,1,-1 do + if i == 1 then + dopattern(pat, args, sz, params.op, needrex) -- Process pattern. + return + elseif args[i-1].opsize ~= sub(szm, i, i) then + break + end + end + else -- Match common operand size. + local szp = sz + if szm == "" then szm = x64 and "qdwb" or "dwb" end -- Default sizes. + if prefix == "1" then szp = args[1].opsize; szmix = nil + elseif prefix == "2" then szp = args[2].opsize; szmix = nil end + if not szmix and (prefix == "." or match(szm, szp or "#")) then + dopattern(pat, args, szp, params.op, needrex) -- Process pattern. + return + end + end + gotmatch = true + end + end + + local msg = "bad operand mode" + if gotmatch then + if szmix then + msg = "mixed operand size" + else + msg = sz and "bad operand size" or "missing operand size" + end + end + + werror(msg.." in `"..opmodestr(params.op, args).."'") +end + +------------------------------------------------------------------------------ + +-- x64-specific opcode for 64 bit immediates and displacements. +if x64 then + function map_op.mov64_2(params) + if not params then return { "reg, imm", "reg, [disp]", "[disp], reg" } end + if secpos+2 > maxsecpos then wflush() end + local opcode, op64, sz, rex, vreg + local op64 = match(params[1], "^%[%s*(.-)%s*%]$") + if op64 then + local a = parseoperand(params[2]) + if a.mode ~= "rmR" then werror("bad operand mode") end + sz = a.opsize + rex = sz == "q" and 8 or 0 + opcode = 0xa3 + else + op64 = match(params[2], "^%[%s*(.-)%s*%]$") + local a = parseoperand(params[1]) + if op64 then + if a.mode ~= "rmR" then werror("bad operand mode") end + sz = a.opsize + rex = sz == "q" and 8 or 0 + opcode = 0xa1 + else + if sub(a.mode, 1, 1) ~= "r" or a.opsize ~= "q" then + werror("bad operand mode") + end + op64 = params[2] + if a.reg == -1 then + vreg = a.vreg + opcode = 0xb8 + else + opcode = 0xb8 + band(a.reg, 7) + end + rex = a.reg > 7 and 9 or 8 + end + end + local psz, sk = wputop(sz, opcode, rex, nil, vreg) + wvreg("opcode", vreg, psz, sk) + waction("IMM_D", format("(unsigned int)(%s)", op64)) + waction("IMM_D", format("(unsigned int)((%s)>>32)", op64)) + end +end + +------------------------------------------------------------------------------ + +-- Pseudo-opcodes for data storage. +local function op_data(params) + if not params then return "imm..." end + local sz = sub(params.op, 2, 2) + if sz == "a" then sz = addrsize end + for _,p in ipairs(params) do + local a = parseoperand(p) + if sub(a.mode, 1, 1) ~= "i" or (a.opsize and a.opsize ~= sz) then + werror("bad mode or size in `"..p.."'") + end + if a.mode == "iJ" then + wputlabel("IMM_", a.imm, 1) + else + wputszarg(sz, a.imm) + end + if secpos+2 > maxsecpos then wflush() end + end +end + +map_op[".byte_*"] = op_data +map_op[".sbyte_*"] = op_data +map_op[".word_*"] = op_data +map_op[".dword_*"] = op_data +map_op[".aword_*"] = op_data + +------------------------------------------------------------------------------ + +-- Pseudo-opcode to mark the position where the action list is to be emitted. +map_op[".actionlist_1"] = function(params) + if not params then return "cvar" end + local name = params[1] -- No syntax check. You get to keep the pieces. + wline(function(out) writeactions(out, name) end) +end + +-- Pseudo-opcode to mark the position where the global enum is to be emitted. +map_op[".globals_1"] = function(params) + if not params then return "prefix" end + local prefix = params[1] -- No syntax check. You get to keep the pieces. + wline(function(out) writeglobals(out, prefix) end) +end + +-- Pseudo-opcode to mark the position where the global names are to be emitted. +map_op[".globalnames_1"] = function(params) + if not params then return "cvar" end + local name = params[1] -- No syntax check. You get to keep the pieces. + wline(function(out) writeglobalnames(out, name) end) +end + +-- Pseudo-opcode to mark the position where the extern names are to be emitted. +map_op[".externnames_1"] = function(params) + if not params then return "cvar" end + local name = params[1] -- No syntax check. You get to keep the pieces. + wline(function(out) writeexternnames(out, name) end) +end + +------------------------------------------------------------------------------ + +-- Label pseudo-opcode (converted from trailing colon form). +map_op[".label_2"] = function(params) + if not params then return "[1-9] | ->global | =>pcexpr [, addr]" end + if secpos+2 > maxsecpos then wflush() end + local a = parseoperand(params[1]) + local mode, imm = a.mode, a.imm + if type(imm) == "number" and (mode == "iJ" or (imm >= 1 and imm <= 9)) then + -- Local label (1: ... 9:) or global label (->global:). + waction("LABEL_LG", nil, 1) + wputxb(imm) + elseif mode == "iJ" then + -- PC label (=>pcexpr:). + waction("LABEL_PC", imm) + else + werror("bad label definition") + end + -- SETLABEL must immediately follow LABEL_LG/LABEL_PC. + local addr = params[2] + if addr then + local a = parseoperand(addr) + if a.mode == "iPJ" then + waction("SETLABEL", a.imm) + else + werror("bad label assignment") + end + end +end +map_op[".label_1"] = map_op[".label_2"] + +------------------------------------------------------------------------------ + +-- Alignment pseudo-opcode. +map_op[".align_1"] = function(params) + if not params then return "numpow2" end + if secpos+1 > maxsecpos then wflush() end + local align = tonumber(params[1]) or map_opsizenum[map_opsize[params[1]]] + if align then + local x = align + -- Must be a power of 2 in the range (2 ... 256). + for i=1,8 do + x = x / 2 + if x == 1 then + waction("ALIGN", nil, 1) + wputxb(align-1) -- Action byte is 2**n-1. + return + end + end + end + werror("bad alignment") +end + +-- Spacing pseudo-opcode. +map_op[".space_2"] = function(params) + if not params then return "num [, filler]" end + if secpos+1 > maxsecpos then wflush() end + waction("SPACE", params[1]) + local fill = params[2] + if fill then + fill = tonumber(fill) + if not fill or fill < 0 or fill > 255 then werror("bad filler") end + end + wputxb(fill or 0) +end +map_op[".space_1"] = map_op[".space_2"] + +------------------------------------------------------------------------------ + +-- Pseudo-opcode for (primitive) type definitions (map to C types). +map_op[".type_3"] = function(params, nparams) + if not params then + return nparams == 2 and "name, ctype" or "name, ctype, reg" + end + local name, ctype, reg = params[1], params[2], params[3] + if not match(name, "^[%a_][%w_]*$") then + werror("bad type name `"..name.."'") + end + local tp = map_type[name] + if tp then + werror("duplicate type `"..name.."'") + end + if reg and not map_reg_valid_base[reg] then + werror("bad base register `"..(map_reg_rev[reg] or reg).."'") + end + -- Add #type to defines. A bit unclean to put it in map_archdef. + map_archdef["#"..name] = "sizeof("..ctype..")" + -- Add new type and emit shortcut define. + local num = ctypenum + 1 + map_type[name] = { + ctype = ctype, + ctypefmt = format("Dt%X(%%s)", num), + reg = reg, + } + wline(format("#define Dt%X(_V) (int)(ptrdiff_t)&(((%s *)0)_V)", num, ctype)) + ctypenum = num +end +map_op[".type_2"] = map_op[".type_3"] + +-- Dump type definitions. +local function dumptypes(out, lvl) + local t = {} + for name in pairs(map_type) do t[#t+1] = name end + sort(t) + out:write("Type definitions:\n") + for _,name in ipairs(t) do + local tp = map_type[name] + local reg = tp.reg and map_reg_rev[tp.reg] or "" + out:write(format(" %-20s %-20s %s\n", name, tp.ctype, reg)) + end + out:write("\n") +end + +------------------------------------------------------------------------------ + +-- Set the current section. +function _M.section(num) + waction("SECTION") + wputxb(num) + wflush(true) -- SECTION is a terminal action. +end + +------------------------------------------------------------------------------ + +-- Dump architecture description. +function _M.dumparch(out) + out:write(format("DynASM %s version %s, released %s\n\n", + _info.arch, _info.version, _info.release)) + dumpregs(out) + dumpactions(out) +end + +-- Dump all user defined elements. +function _M.dumpdef(out, lvl) + dumptypes(out, lvl) + dumpglobals(out, lvl) + dumpexterns(out, lvl) +end + +------------------------------------------------------------------------------ + +-- Pass callbacks from/to the DynASM core. +function _M.passcb(wl, we, wf, ww) + wline, werror, wfatal, wwarn = wl, we, wf, ww + return wflush +end + +-- Setup the arch-specific module. +function _M.setup(arch, opt) + g_arch, g_opt = arch, opt +end + +-- Merge the core maps and the arch-specific maps. +function _M.mergemaps(map_coreop, map_def) + setmetatable(map_op, { __index = map_coreop }) + setmetatable(map_def, { __index = map_archdef }) + return map_op, map_def +end + +return _M + +------------------------------------------------------------------------------ + diff --git a/lib/LuaJIT/dynasm/dynasm.lua b/lib/LuaJIT/dynasm/dynasm.lua new file mode 100644 index 0000000..5ec21a7 --- /dev/null +++ b/lib/LuaJIT/dynasm/dynasm.lua @@ -0,0 +1,1094 @@ +------------------------------------------------------------------------------ +-- DynASM. A dynamic assembler for code generation engines. +-- Originally designed and implemented for LuaJIT. +-- +-- Copyright (C) 2005-2017 Mike Pall. All rights reserved. +-- See below for full copyright notice. +------------------------------------------------------------------------------ + +-- Application information. +local _info = { + name = "DynASM", + description = "A dynamic assembler for code generation engines", + version = "1.4.0", + vernum = 10400, + release = "2015-10-18", + author = "Mike Pall", + url = "http://luajit.org/dynasm.html", + license = "MIT", + copyright = [[ +Copyright (C) 2005-2017 Mike Pall. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +[ MIT license: http://www.opensource.org/licenses/mit-license.php ] +]], +} + +-- Cache library functions. +local type, pairs, ipairs = type, pairs, ipairs +local pcall, error, assert = pcall, error, assert +local _s = string +local sub, match, gmatch, gsub = _s.sub, _s.match, _s.gmatch, _s.gsub +local format, rep, upper = _s.format, _s.rep, _s.upper +local _t = table +local insert, remove, concat, sort = _t.insert, _t.remove, _t.concat, _t.sort +local exit = os.exit +local io = io +local stdin, stdout, stderr = io.stdin, io.stdout, io.stderr + +------------------------------------------------------------------------------ + +-- Program options. +local g_opt = {} + +-- Global state for current file. +local g_fname, g_curline, g_indent, g_lineno, g_synclineno, g_arch +local g_errcount = 0 + +-- Write buffer for output file. +local g_wbuffer, g_capbuffer + +------------------------------------------------------------------------------ + +-- Write an output line (or callback function) to the buffer. +local function wline(line, needindent) + local buf = g_capbuffer or g_wbuffer + buf[#buf+1] = needindent and g_indent..line or line + g_synclineno = g_synclineno + 1 +end + +-- Write assembler line as a comment, if requestd. +local function wcomment(aline) + if g_opt.comment then + wline(g_opt.comment..aline..g_opt.endcomment, true) + end +end + +-- Resync CPP line numbers. +local function wsync() + if g_synclineno ~= g_lineno and g_opt.cpp then + wline("#line "..g_lineno..' "'..g_fname..'"') + g_synclineno = g_lineno + end +end + +-- Dummy action flush function. Replaced with arch-specific function later. +local function wflush(term) +end + +-- Dump all buffered output lines. +local function wdumplines(out, buf) + for _,line in ipairs(buf) do + if type(line) == "string" then + assert(out:write(line, "\n")) + else + -- Special callback to dynamically insert lines after end of processing. + line(out) + end + end +end + +------------------------------------------------------------------------------ + +-- Emit an error. Processing continues with next statement. +local function werror(msg) + error(format("%s:%s: error: %s:\n%s", g_fname, g_lineno, msg, g_curline), 0) +end + +-- Emit a fatal error. Processing stops. +local function wfatal(msg) + g_errcount = "fatal" + werror(msg) +end + +-- Print a warning. Processing continues. +local function wwarn(msg) + stderr:write(format("%s:%s: warning: %s:\n%s\n", + g_fname, g_lineno, msg, g_curline)) +end + +-- Print caught error message. But suppress excessive errors. +local function wprinterr(...) + if type(g_errcount) == "number" then + -- Regular error. + g_errcount = g_errcount + 1 + if g_errcount < 21 then -- Seems to be a reasonable limit. + stderr:write(...) + elseif g_errcount == 21 then + stderr:write(g_fname, + ":*: warning: too many errors (suppressed further messages).\n") + end + else + -- Fatal error. + stderr:write(...) + return true -- Stop processing. + end +end + +------------------------------------------------------------------------------ + +-- Map holding all option handlers. +local opt_map = {} +local opt_current + +-- Print error and exit with error status. +local function opterror(...) + stderr:write("dynasm.lua: ERROR: ", ...) + stderr:write("\n") + exit(1) +end + +-- Get option parameter. +local function optparam(args) + local argn = args.argn + local p = args[argn] + if not p then + opterror("missing parameter for option `", opt_current, "'.") + end + args.argn = argn + 1 + return p +end + +------------------------------------------------------------------------------ + +-- Core pseudo-opcodes. +local map_coreop = {} +-- Dummy opcode map. Replaced by arch-specific map. +local map_op = {} + +-- Forward declarations. +local dostmt +local readfile + +------------------------------------------------------------------------------ + +-- Map for defines (initially empty, chains to arch-specific map). +local map_def = {} + +-- Pseudo-opcode to define a substitution. +map_coreop[".define_2"] = function(params, nparams) + if not params then return nparams == 1 and "name" or "name, subst" end + local name, def = params[1], params[2] or "1" + if not match(name, "^[%a_][%w_]*$") then werror("bad or duplicate define") end + map_def[name] = def +end +map_coreop[".define_1"] = map_coreop[".define_2"] + +-- Define a substitution on the command line. +function opt_map.D(args) + local namesubst = optparam(args) + local name, subst = match(namesubst, "^([%a_][%w_]*)=(.*)$") + if name then + map_def[name] = subst + elseif match(namesubst, "^[%a_][%w_]*$") then + map_def[namesubst] = "1" + else + opterror("bad define") + end +end + +-- Undefine a substitution on the command line. +function opt_map.U(args) + local name = optparam(args) + if match(name, "^[%a_][%w_]*$") then + map_def[name] = nil + else + opterror("bad define") + end +end + +-- Helper for definesubst. +local gotsubst + +local function definesubst_one(word) + local subst = map_def[word] + if subst then gotsubst = word; return subst else return word end +end + +-- Iteratively substitute defines. +local function definesubst(stmt) + -- Limit number of iterations. + for i=1,100 do + gotsubst = false + stmt = gsub(stmt, "#?[%w_]+", definesubst_one) + if not gotsubst then break end + end + if gotsubst then wfatal("recursive define involving `"..gotsubst.."'") end + return stmt +end + +-- Dump all defines. +local function dumpdefines(out, lvl) + local t = {} + for name in pairs(map_def) do + t[#t+1] = name + end + sort(t) + out:write("Defines:\n") + for _,name in ipairs(t) do + local subst = map_def[name] + if g_arch then subst = g_arch.revdef(subst) end + out:write(format(" %-20s %s\n", name, subst)) + end + out:write("\n") +end + +------------------------------------------------------------------------------ + +-- Support variables for conditional assembly. +local condlevel = 0 +local condstack = {} + +-- Evaluate condition with a Lua expression. Substitutions already performed. +local function cond_eval(cond) + local func, err + if setfenv then + func, err = loadstring("return "..cond, "=expr") + else + -- No globals. All unknown identifiers evaluate to nil. + func, err = load("return "..cond, "=expr", "t", {}) + end + if func then + if setfenv then + setfenv(func, {}) -- No globals. All unknown identifiers evaluate to nil. + end + local ok, res = pcall(func) + if ok then + if res == 0 then return false end -- Oh well. + return not not res + end + err = res + end + wfatal("bad condition: "..err) +end + +-- Skip statements until next conditional pseudo-opcode at the same level. +local function stmtskip() + local dostmt_save = dostmt + local lvl = 0 + dostmt = function(stmt) + local op = match(stmt, "^%s*(%S+)") + if op == ".if" then + lvl = lvl + 1 + elseif lvl ~= 0 then + if op == ".endif" then lvl = lvl - 1 end + elseif op == ".elif" or op == ".else" or op == ".endif" then + dostmt = dostmt_save + dostmt(stmt) + end + end +end + +-- Pseudo-opcodes for conditional assembly. +map_coreop[".if_1"] = function(params) + if not params then return "condition" end + local lvl = condlevel + 1 + local res = cond_eval(params[1]) + condlevel = lvl + condstack[lvl] = res + if not res then stmtskip() end +end + +map_coreop[".elif_1"] = function(params) + if not params then return "condition" end + if condlevel == 0 then wfatal(".elif without .if") end + local lvl = condlevel + local res = condstack[lvl] + if res then + if res == "else" then wfatal(".elif after .else") end + else + res = cond_eval(params[1]) + if res then + condstack[lvl] = res + return + end + end + stmtskip() +end + +map_coreop[".else_0"] = function(params) + if condlevel == 0 then wfatal(".else without .if") end + local lvl = condlevel + local res = condstack[lvl] + condstack[lvl] = "else" + if res then + if res == "else" then wfatal(".else after .else") end + stmtskip() + end +end + +map_coreop[".endif_0"] = function(params) + local lvl = condlevel + if lvl == 0 then wfatal(".endif without .if") end + condlevel = lvl - 1 +end + +-- Check for unfinished conditionals. +local function checkconds() + if g_errcount ~= "fatal" and condlevel ~= 0 then + wprinterr(g_fname, ":*: error: unbalanced conditional\n") + end +end + +------------------------------------------------------------------------------ + +-- Search for a file in the given path and open it for reading. +local function pathopen(path, name) + local dirsep = package and match(package.path, "\\") and "\\" or "/" + for _,p in ipairs(path) do + local fullname = p == "" and name or p..dirsep..name + local fin = io.open(fullname, "r") + if fin then + g_fname = fullname + return fin + end + end +end + +-- Include a file. +map_coreop[".include_1"] = function(params) + if not params then return "filename" end + local name = params[1] + -- Save state. Ugly, I know. but upvalues are fast. + local gf, gl, gcl, gi = g_fname, g_lineno, g_curline, g_indent + -- Read the included file. + local fatal = readfile(pathopen(g_opt.include, name) or + wfatal("include file `"..name.."' not found")) + -- Restore state. + g_synclineno = -1 + g_fname, g_lineno, g_curline, g_indent = gf, gl, gcl, gi + if fatal then wfatal("in include file") end +end + +-- Make .include and conditionals initially available, too. +map_op[".include_1"] = map_coreop[".include_1"] +map_op[".if_1"] = map_coreop[".if_1"] +map_op[".elif_1"] = map_coreop[".elif_1"] +map_op[".else_0"] = map_coreop[".else_0"] +map_op[".endif_0"] = map_coreop[".endif_0"] + +------------------------------------------------------------------------------ + +-- Support variables for macros. +local mac_capture, mac_lineno, mac_name +local mac_active = {} +local mac_list = {} + +-- Pseudo-opcode to define a macro. +map_coreop[".macro_*"] = function(mparams) + if not mparams then return "name [, params...]" end + -- Split off and validate macro name. + local name = remove(mparams, 1) + if not name then werror("missing macro name") end + if not (match(name, "^[%a_][%w_%.]*$") or match(name, "^%.[%w_%.]*$")) then + wfatal("bad macro name `"..name.."'") + end + -- Validate macro parameter names. + local mdup = {} + for _,mp in ipairs(mparams) do + if not match(mp, "^[%a_][%w_]*$") then + wfatal("bad macro parameter name `"..mp.."'") + end + if mdup[mp] then wfatal("duplicate macro parameter name `"..mp.."'") end + mdup[mp] = true + end + -- Check for duplicate or recursive macro definitions. + local opname = name.."_"..#mparams + if map_op[opname] or map_op[name.."_*"] then + wfatal("duplicate macro `"..name.."' ("..#mparams.." parameters)") + end + if mac_capture then wfatal("recursive macro definition") end + + -- Enable statement capture. + local lines = {} + mac_lineno = g_lineno + mac_name = name + mac_capture = function(stmt) -- Statement capture function. + -- Stop macro definition with .endmacro pseudo-opcode. + if not match(stmt, "^%s*.endmacro%s*$") then + lines[#lines+1] = stmt + return + end + mac_capture = nil + mac_lineno = nil + mac_name = nil + mac_list[#mac_list+1] = opname + -- Add macro-op definition. + map_op[opname] = function(params) + if not params then return mparams, lines end + -- Protect against recursive macro invocation. + if mac_active[opname] then wfatal("recursive macro invocation") end + mac_active[opname] = true + -- Setup substitution map. + local subst = {} + for i,mp in ipairs(mparams) do subst[mp] = params[i] end + local mcom + if g_opt.maccomment and g_opt.comment then + mcom = " MACRO "..name.." ("..#mparams..")" + wcomment("{"..mcom) + end + -- Loop through all captured statements + for _,stmt in ipairs(lines) do + -- Substitute macro parameters. + local st = gsub(stmt, "[%w_]+", subst) + st = definesubst(st) + st = gsub(st, "%s*%.%.%s*", "") -- Token paste a..b. + if mcom and sub(st, 1, 1) ~= "|" then wcomment(st) end + -- Emit statement. Use a protected call for better diagnostics. + local ok, err = pcall(dostmt, st) + if not ok then + -- Add the captured statement to the error. + wprinterr(err, "\n", g_indent, "| ", stmt, + "\t[MACRO ", name, " (", #mparams, ")]\n") + end + end + if mcom then wcomment("}"..mcom) end + mac_active[opname] = nil + end + end +end + +-- An .endmacro pseudo-opcode outside of a macro definition is an error. +map_coreop[".endmacro_0"] = function(params) + wfatal(".endmacro without .macro") +end + +-- Dump all macros and their contents (with -PP only). +local function dumpmacros(out, lvl) + sort(mac_list) + out:write("Macros:\n") + for _,opname in ipairs(mac_list) do + local name = sub(opname, 1, -3) + local params, lines = map_op[opname]() + out:write(format(" %-20s %s\n", name, concat(params, ", "))) + if lvl > 1 then + for _,line in ipairs(lines) do + out:write(" |", line, "\n") + end + out:write("\n") + end + end + out:write("\n") +end + +-- Check for unfinished macro definitions. +local function checkmacros() + if mac_capture then + wprinterr(g_fname, ":", mac_lineno, + ": error: unfinished .macro `", mac_name ,"'\n") + end +end + +------------------------------------------------------------------------------ + +-- Support variables for captures. +local cap_lineno, cap_name +local cap_buffers = {} +local cap_used = {} + +-- Start a capture. +map_coreop[".capture_1"] = function(params) + if not params then return "name" end + wflush() + local name = params[1] + if not match(name, "^[%a_][%w_]*$") then + wfatal("bad capture name `"..name.."'") + end + if cap_name then + wfatal("already capturing to `"..cap_name.."' since line "..cap_lineno) + end + cap_name = name + cap_lineno = g_lineno + -- Create or continue a capture buffer and start the output line capture. + local buf = cap_buffers[name] + if not buf then buf = {}; cap_buffers[name] = buf end + g_capbuffer = buf + g_synclineno = 0 +end + +-- Stop a capture. +map_coreop[".endcapture_0"] = function(params) + wflush() + if not cap_name then wfatal(".endcapture without a valid .capture") end + cap_name = nil + cap_lineno = nil + g_capbuffer = nil + g_synclineno = 0 +end + +-- Dump a capture buffer. +map_coreop[".dumpcapture_1"] = function(params) + if not params then return "name" end + wflush() + local name = params[1] + if not match(name, "^[%a_][%w_]*$") then + wfatal("bad capture name `"..name.."'") + end + cap_used[name] = true + wline(function(out) + local buf = cap_buffers[name] + if buf then wdumplines(out, buf) end + end) + g_synclineno = 0 +end + +-- Dump all captures and their buffers (with -PP only). +local function dumpcaptures(out, lvl) + out:write("Captures:\n") + for name,buf in pairs(cap_buffers) do + out:write(format(" %-20s %4s)\n", name, "("..#buf)) + if lvl > 1 then + local bar = rep("=", 76) + out:write(" ", bar, "\n") + for _,line in ipairs(buf) do + out:write(" ", line, "\n") + end + out:write(" ", bar, "\n\n") + end + end + out:write("\n") +end + +-- Check for unfinished or unused captures. +local function checkcaptures() + if cap_name then + wprinterr(g_fname, ":", cap_lineno, + ": error: unfinished .capture `", cap_name,"'\n") + return + end + for name in pairs(cap_buffers) do + if not cap_used[name] then + wprinterr(g_fname, ":*: error: missing .dumpcapture ", name ,"\n") + end + end +end + +------------------------------------------------------------------------------ + +-- Sections names. +local map_sections = {} + +-- Pseudo-opcode to define code sections. +-- TODO: Data sections, BSS sections. Needs extra C code and API. +map_coreop[".section_*"] = function(params) + if not params then return "name..." end + if #map_sections > 0 then werror("duplicate section definition") end + wflush() + for sn,name in ipairs(params) do + local opname = "."..name.."_0" + if not match(name, "^[%a][%w_]*$") or + map_op[opname] or map_op["."..name.."_*"] then + werror("bad section name `"..name.."'") + end + map_sections[#map_sections+1] = name + wline(format("#define DASM_SECTION_%s\t%d", upper(name), sn-1)) + map_op[opname] = function(params) g_arch.section(sn-1) end + end + wline(format("#define DASM_MAXSECTION\t\t%d", #map_sections)) +end + +-- Dump all sections. +local function dumpsections(out, lvl) + out:write("Sections:\n") + for _,name in ipairs(map_sections) do + out:write(format(" %s\n", name)) + end + out:write("\n") +end + +------------------------------------------------------------------------------ + +-- Replacement for customized Lua, which lacks the package library. +local prefix = "" +if not require then + function require(name) + local fp = assert(io.open(prefix..name..".lua")) + local s = fp:read("*a") + assert(fp:close()) + return assert(loadstring(s, "@"..name..".lua"))() + end +end + +-- Load architecture-specific module. +local function loadarch(arch) + if not match(arch, "^[%w_]+$") then return "bad arch name" end + local ok, m_arch = pcall(require, "dasm_"..arch) + if not ok then return "cannot load module: "..m_arch end + g_arch = m_arch + wflush = m_arch.passcb(wline, werror, wfatal, wwarn) + m_arch.setup(arch, g_opt) + map_op, map_def = m_arch.mergemaps(map_coreop, map_def) +end + +-- Dump architecture description. +function opt_map.dumparch(args) + local name = optparam(args) + if not g_arch then + local err = loadarch(name) + if err then opterror(err) end + end + + local t = {} + for name in pairs(map_coreop) do t[#t+1] = name end + for name in pairs(map_op) do t[#t+1] = name end + sort(t) + + local out = stdout + local _arch = g_arch._info + out:write(format("%s version %s, released %s, %s\n", + _info.name, _info.version, _info.release, _info.url)) + g_arch.dumparch(out) + + local pseudo = true + out:write("Pseudo-Opcodes:\n") + for _,sname in ipairs(t) do + local name, nparam = match(sname, "^(.+)_([0-9%*])$") + if name then + if pseudo and sub(name, 1, 1) ~= "." then + out:write("\nOpcodes:\n") + pseudo = false + end + local f = map_op[sname] + local s + if nparam ~= "*" then nparam = nparam + 0 end + if nparam == 0 then + s = "" + elseif type(f) == "string" then + s = map_op[".template__"](nil, f, nparam) + else + s = f(nil, nparam) + end + if type(s) == "table" then + for _,s2 in ipairs(s) do + out:write(format(" %-12s %s\n", name, s2)) + end + else + out:write(format(" %-12s %s\n", name, s)) + end + end + end + out:write("\n") + exit(0) +end + +-- Pseudo-opcode to set the architecture. +-- Only initially available (map_op is replaced when called). +map_op[".arch_1"] = function(params) + if not params then return "name" end + local err = loadarch(params[1]) + if err then wfatal(err) end + wline(format("#if DASM_VERSION != %d", _info.vernum)) + wline('#error "Version mismatch between DynASM and included encoding engine"') + wline("#endif") +end + +-- Dummy .arch pseudo-opcode to improve the error report. +map_coreop[".arch_1"] = function(params) + if not params then return "name" end + wfatal("duplicate .arch statement") +end + +------------------------------------------------------------------------------ + +-- Dummy pseudo-opcode. Don't confuse '.nop' with 'nop'. +map_coreop[".nop_*"] = function(params) + if not params then return "[ignored...]" end +end + +-- Pseudo-opcodes to raise errors. +map_coreop[".error_1"] = function(params) + if not params then return "message" end + werror(params[1]) +end + +map_coreop[".fatal_1"] = function(params) + if not params then return "message" end + wfatal(params[1]) +end + +-- Dump all user defined elements. +local function dumpdef(out) + local lvl = g_opt.dumpdef + if lvl == 0 then return end + dumpsections(out, lvl) + dumpdefines(out, lvl) + if g_arch then g_arch.dumpdef(out, lvl) end + dumpmacros(out, lvl) + dumpcaptures(out, lvl) +end + +------------------------------------------------------------------------------ + +-- Helper for splitstmt. +local splitlvl + +local function splitstmt_one(c) + if c == "(" then + splitlvl = ")"..splitlvl + elseif c == "[" then + splitlvl = "]"..splitlvl + elseif c == "{" then + splitlvl = "}"..splitlvl + elseif c == ")" or c == "]" or c == "}" then + if sub(splitlvl, 1, 1) ~= c then werror("unbalanced (), [] or {}") end + splitlvl = sub(splitlvl, 2) + elseif splitlvl == "" then + return " \0 " + end + return c +end + +-- Split statement into (pseudo-)opcode and params. +local function splitstmt(stmt) + -- Convert label with trailing-colon into .label statement. + local label = match(stmt, "^%s*(.+):%s*$") + if label then return ".label", {label} end + + -- Split at commas and equal signs, but obey parentheses and brackets. + splitlvl = "" + stmt = gsub(stmt, "[,%(%)%[%]{}]", splitstmt_one) + if splitlvl ~= "" then werror("unbalanced () or []") end + + -- Split off opcode. + local op, other = match(stmt, "^%s*([^%s%z]+)%s*(.*)$") + if not op then werror("bad statement syntax") end + + -- Split parameters. + local params = {} + for p in gmatch(other, "%s*(%Z+)%z?") do + params[#params+1] = gsub(p, "%s+$", "") + end + if #params > 16 then werror("too many parameters") end + + params.op = op + return op, params +end + +-- Process a single statement. +dostmt = function(stmt) + -- Ignore empty statements. + if match(stmt, "^%s*$") then return end + + -- Capture macro defs before substitution. + if mac_capture then return mac_capture(stmt) end + stmt = definesubst(stmt) + + -- Emit C code without parsing the line. + if sub(stmt, 1, 1) == "|" then + local tail = sub(stmt, 2) + wflush() + if sub(tail, 1, 2) == "//" then wcomment(tail) else wline(tail, true) end + return + end + + -- Split into (pseudo-)opcode and params. + local op, params = splitstmt(stmt) + + -- Get opcode handler (matching # of parameters or generic handler). + local f = map_op[op.."_"..#params] or map_op[op.."_*"] + if not f then + if not g_arch then wfatal("first statement must be .arch") end + -- Improve error report. + for i=0,9 do + if map_op[op.."_"..i] then + werror("wrong number of parameters for `"..op.."'") + end + end + werror("unknown statement `"..op.."'") + end + + -- Call opcode handler or special handler for template strings. + if type(f) == "string" then + map_op[".template__"](params, f) + else + f(params) + end +end + +-- Process a single line. +local function doline(line) + if g_opt.flushline then wflush() end + + -- Assembler line? + local indent, aline = match(line, "^(%s*)%|(.*)$") + if not aline then + -- No, plain C code line, need to flush first. + wflush() + wsync() + wline(line, false) + return + end + + g_indent = indent -- Remember current line indentation. + + -- Emit C code (even from macros). Avoids echo and line parsing. + if sub(aline, 1, 1) == "|" then + if not mac_capture then + wsync() + elseif g_opt.comment then + wsync() + wcomment(aline) + end + dostmt(aline) + return + end + + -- Echo assembler line as a comment. + if g_opt.comment then + wsync() + wcomment(aline) + end + + -- Strip assembler comments. + aline = gsub(aline, "//.*$", "") + + -- Split line into statements at semicolons. + if match(aline, ";") then + for stmt in gmatch(aline, "[^;]+") do dostmt(stmt) end + else + dostmt(aline) + end +end + +------------------------------------------------------------------------------ + +-- Write DynASM header. +local function dasmhead(out) + out:write(format([[ +/* +** This file has been pre-processed with DynASM. +** %s +** DynASM version %s, DynASM %s version %s +** DO NOT EDIT! The original file is in "%s". +*/ + +]], _info.url, + _info.version, g_arch._info.arch, g_arch._info.version, + g_fname)) +end + +-- Read input file. +readfile = function(fin) + g_indent = "" + g_lineno = 0 + g_synclineno = -1 + + -- Process all lines. + for line in fin:lines() do + g_lineno = g_lineno + 1 + g_curline = line + local ok, err = pcall(doline, line) + if not ok and wprinterr(err, "\n") then return true end + end + wflush() + + -- Close input file. + assert(fin == stdin or fin:close()) +end + +-- Write output file. +local function writefile(outfile) + local fout + + -- Open output file. + if outfile == nil or outfile == "-" then + fout = stdout + else + fout = assert(io.open(outfile, "w")) + end + + -- Write all buffered lines + wdumplines(fout, g_wbuffer) + + -- Close output file. + assert(fout == stdout or fout:close()) + + -- Optionally dump definitions. + dumpdef(fout == stdout and stderr or stdout) +end + +-- Translate an input file to an output file. +local function translate(infile, outfile) + g_wbuffer = {} + g_indent = "" + g_lineno = 0 + g_synclineno = -1 + + -- Put header. + wline(dasmhead) + + -- Read input file. + local fin + if infile == "-" then + g_fname = "(stdin)" + fin = stdin + else + g_fname = infile + fin = assert(io.open(infile, "r")) + end + readfile(fin) + + -- Check for errors. + if not g_arch then + wprinterr(g_fname, ":*: error: missing .arch directive\n") + end + checkconds() + checkmacros() + checkcaptures() + + if g_errcount ~= 0 then + stderr:write(g_fname, ":*: info: ", g_errcount, " error", + (type(g_errcount) == "number" and g_errcount > 1) and "s" or "", + " in input file -- no output file generated.\n") + dumpdef(stderr) + exit(1) + end + + -- Write output file. + writefile(outfile) +end + +------------------------------------------------------------------------------ + +-- Print help text. +function opt_map.help() + stdout:write("DynASM -- ", _info.description, ".\n") + stdout:write("DynASM ", _info.version, " ", _info.release, " ", _info.url, "\n") + stdout:write[[ + +Usage: dynasm [OPTION]... INFILE.dasc|- + + -h, --help Display this help text. + -V, --version Display version and copyright information. + + -o, --outfile FILE Output file name (default is stdout). + -I, --include DIR Add directory to the include search path. + + -c, --ccomment Use /* */ comments for assembler lines. + -C, --cppcomment Use // comments for assembler lines (default). + -N, --nocomment Suppress assembler lines in output. + -M, --maccomment Show macro expansions as comments (default off). + + -L, --nolineno Suppress CPP line number information in output. + -F, --flushline Flush action list for every line. + + -D NAME[=SUBST] Define a substitution. + -U NAME Undefine a substitution. + + -P, --dumpdef Dump defines, macros, etc. Repeat for more output. + -A, --dumparch ARCH Load architecture ARCH and dump description. +]] + exit(0) +end + +-- Print version information. +function opt_map.version() + stdout:write(format("%s version %s, released %s\n%s\n\n%s", + _info.name, _info.version, _info.release, _info.url, _info.copyright)) + exit(0) +end + +-- Misc. options. +function opt_map.outfile(args) g_opt.outfile = optparam(args) end +function opt_map.include(args) insert(g_opt.include, 1, optparam(args)) end +function opt_map.ccomment() g_opt.comment = "/*|"; g_opt.endcomment = " */" end +function opt_map.cppcomment() g_opt.comment = "//|"; g_opt.endcomment = "" end +function opt_map.nocomment() g_opt.comment = false end +function opt_map.maccomment() g_opt.maccomment = true end +function opt_map.nolineno() g_opt.cpp = false end +function opt_map.flushline() g_opt.flushline = true end +function opt_map.dumpdef() g_opt.dumpdef = g_opt.dumpdef + 1 end + +------------------------------------------------------------------------------ + +-- Short aliases for long options. +local opt_alias = { + h = "help", ["?"] = "help", V = "version", + o = "outfile", I = "include", + c = "ccomment", C = "cppcomment", N = "nocomment", M = "maccomment", + L = "nolineno", F = "flushline", + P = "dumpdef", A = "dumparch", +} + +-- Parse single option. +local function parseopt(opt, args) + opt_current = #opt == 1 and "-"..opt or "--"..opt + local f = opt_map[opt] or opt_map[opt_alias[opt]] + if not f then + opterror("unrecognized option `", opt_current, "'. Try `--help'.\n") + end + f(args) +end + +-- Parse arguments. +local function parseargs(args) + -- Default options. + g_opt.comment = "//|" + g_opt.endcomment = "" + g_opt.cpp = true + g_opt.dumpdef = 0 + g_opt.include = { "" } + + -- Process all option arguments. + args.argn = 1 + repeat + local a = args[args.argn] + if not a then break end + local lopt, opt = match(a, "^%-(%-?)(.+)") + if not opt then break end + args.argn = args.argn + 1 + if lopt == "" then + -- Loop through short options. + for o in gmatch(opt, ".") do parseopt(o, args) end + else + -- Long option. + parseopt(opt, args) + end + until false + + -- Check for proper number of arguments. + local nargs = #args - args.argn + 1 + if nargs ~= 1 then + if nargs == 0 then + if g_opt.dumpdef > 0 then return dumpdef(stdout) end + end + opt_map.help() + end + + -- Translate a single input file to a single output file + -- TODO: Handle multiple files? + translate(args[args.argn], g_opt.outfile) +end + +------------------------------------------------------------------------------ + +-- Add the directory dynasm.lua resides in to the Lua module search path. +local arg = arg +if arg and arg[0] then + prefix = match(arg[0], "^(.*[/\\])") + if package and prefix then package.path = prefix.."?.lua;"..package.path end +end + +-- Start DynASM. +parseargs{...} + +------------------------------------------------------------------------------ + diff --git a/lib/LuaJIT/etc/luajit.1 b/lib/LuaJIT/etc/luajit.1 new file mode 100644 index 0000000..0d263db --- /dev/null +++ b/lib/LuaJIT/etc/luajit.1 @@ -0,0 +1,88 @@ +.TH luajit 1 "" "" "LuaJIT documentation" +.SH NAME +luajit \- Just-In-Time Compiler for the Lua Language +\fB +.SH SYNOPSIS +.B luajit +[\fIoptions\fR]... [\fIscript\fR [\fIargs\fR]...] +.SH "WEB SITE" +.IR http://luajit.org +.SH DESCRIPTION +.PP +This is the command-line program to run Lua programs with \fBLuaJIT\fR. +.PP +\fBLuaJIT\fR is a just-in-time (JIT) compiler for the Lua language. +The virtual machine (VM) is based on a fast interpreter combined with +a trace compiler. It can significantly improve the performance of Lua programs. +.PP +\fBLuaJIT\fR is API\- and ABI-compatible with the VM of the standard +Lua\ 5.1 interpreter. When embedding the VM into an application, +the built library can be used as a drop-in replacement. +.SH OPTIONS +.TP +.BI "\-e " chunk +Run the given chunk of Lua code. +.TP +.BI "\-l " library +Load the named library, just like \fBrequire("\fR\fIlibrary\fR\fB")\fR. +.TP +.BI "\-b " ... +Save or list bytecode. Run without arguments to get help on options. +.TP +.BI "\-j " command +Perform LuaJIT control command (optional space after \fB\-j\fR). +.TP +.BI "\-O" [opt] +Control LuaJIT optimizations. +.TP +.B "\-i" +Run in interactive mode. +.TP +.B "\-v" +Show \fBLuaJIT\fR version. +.TP +.B "\-E" +Ignore environment variables. +.TP +.B "\-\-" +Stop processing options. +.TP +.B "\-" +Read script from stdin instead. +.PP +After all options are processed, the given \fIscript\fR is run. +The arguments are passed in the global \fIarg\fR table. +.PP +Interactive mode is only entered, if no \fIscript\fR and no \fB\-e\fR +option is given. Interactive mode can be left with EOF (\fICtrl\-Z\fB). +.SH EXAMPLES +.TP +luajit hello.lua world + +Prints "Hello world", assuming \fIhello.lua\fR contains: +.br + print("Hello", arg[1]) +.TP +luajit \-e "local x=0; for i=1,1e9 do x=x+i end; print(x)" + +Calculates the sum of the numbers from 1 to 1000000000. +.br +And finishes in a reasonable amount of time, too. +.TP +luajit \-jv \-e "for i=1,10 do for j=1,10 do for k=1,100 do end end end" + +Runs some nested loops and shows the resulting traces. +.SH COPYRIGHT +.PP +\fBLuaJIT\fR is Copyright \(co 2005-2017 Mike Pall. +.br +\fBLuaJIT\fR is open source software, released under the MIT license. +.SH SEE ALSO +.PP +More details in the provided HTML docs or at: +.IR http://luajit.org +.br +More about the Lua language can be found at: +.IR http://lua.org/docs.html +.PP +lua(1) diff --git a/lib/LuaJIT/etc/luajit.pc b/lib/LuaJIT/etc/luajit.pc new file mode 100644 index 0000000..a78f174 --- /dev/null +++ b/lib/LuaJIT/etc/luajit.pc @@ -0,0 +1,25 @@ +# Package information for LuaJIT to be used by pkg-config. +majver=2 +minver=1 +relver=0 +version=${majver}.${minver}.${relver}-beta3 +abiver=5.1 + +prefix=/usr/local +multilib=lib +exec_prefix=${prefix} +libdir=${exec_prefix}/${multilib} +libname=luajit-${abiver} +includedir=${prefix}/include/luajit-${majver}.${minver} + +INSTALL_LMOD=${prefix}/share/lua/${abiver} +INSTALL_CMOD=${prefix}/${multilib}/lua/${abiver} + +Name: LuaJIT +Description: Just-in-time compiler for Lua +URL: http://luajit.org +Version: ${version} +Requires: +Libs: -L${libdir} -l${libname} +Libs.private: -Wl,-E -lm -ldl +Cflags: -I${includedir} diff --git a/lib/LuaJIT/libluajit.a b/lib/LuaJIT/libluajit.a deleted file mode 100644 index c82e81cd8914d68135d55224133655172bcd90a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 866936 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%0A(gM*_8YigGup&dD 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�JxMMs8RD+ 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

p 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

UIz8j;Z=Sx3 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!H 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ΠCnQNAo4x`K6=SlqV?W()5-@;}gj{uz&0D;zka6 z)b!lq-{9Tuy+5;q9u}okA0^SN9*j2|B8N)7e#7k{Qcue=y2CI#QY-{-!8;_);1wh@ zLWh|B_pBb8g78}m>7BE5-#{+IStaG0_&RUujr|4csXf8#E#-FzbI1uq(#wy-Bu(C3 zm)dWKzODW)Oe=$^TgAjY)@!)eLS6Y@<0(rL%Pj z#mmj5`bG+L0YJVlm!aZw#-NPIbJ?mV(rvTj*^)Hnwx<9*Hq{AEW3c$dZrs+$S;Yk~gR^!scUNS~G7 zk2?O7@n7q|^CA36{r8Ce$@0$w`ELXKWWe7KcmnXR0)9T=Kh-#wXBOed=)a$PnD+}o zbuB>uQot_+{2ahr0dE7m4e$;Np3-=@Ji|ag8|2&w_$vW_mj%BQ@K*u-X8^wl@UH?s z2k^%Lp9}c!0Y4V-=W~VVLr~p0fHwg?5AY7a+W}tzcoOhYz~=*gGvJMYZvgxfz&{80 z0>Hlxcn9FS0AC3BUceUtKK)tB49X6jfX@Z|Qot_*d@pAAH zy1FU)SC-HJ8#!D){xJ4J`rqKMWRO0LA5Z@qJdT{HK#y`x0Gw&~!{vVz%8&EcF9By> z{xJQY07p501bmjF_UQi)@KXW*E8x=r-w*i3fd3Ql*8u(`;Az1B1$YVYrvSedaFp{Q z!2b>Op8)(XfNujFn96=S3jjR-QAVoG$?S^PxQGXRyD$6zE?Hat;UlJit!^d^X@ne;MG@fIbEI zvjDFL{1m`V`3b5+`Ii9wsX*Tkcs<~^0e%|bp91`Jz<&eyvjIN?;s?YV0Y3xi7Xpsu zTnhMfpdSSMOu*Lxeiq<3-qCI?mhztlIJQeO;D>>H)1L{dI~VXc{RI2fg<3w3Q+D}R z@h|k5=lxKAm~k_H7l!cZ`tK$BCzl7~?W+LCesVS7Sl>4Sj{Wc!jfczm-VkoeY5bU> zU#scv1o>Fbdcd*0(EeEdxj=sb*ncMACjx#3;3>e-U!?)Zd88L`^ba^+ybR{+ zF)sZG;7Gq2aHRhd;MgwMZ+{Nu$9d;!DCg@z&M@F5z()W-8}L!UjlUwOZVYhrx2pkf z1UcyEO+R5d<3Nvc5Xb(o2I#RLB98XC7U&Uw1KYP z3pmQZ32>DERttVJ;3)qVz)}9KfTR4kS@3rNj`G(7j`H6LIL0UM0vy}@1i)Lt{z!i& z;O_?ddcbD@j{XGW5Y&4+&|`l?9Q)gQfFAoB;-^4)-V5}Izt4j6+Sd3Jq<=r)Cxd*O zAO4^~&wlts`rpX!)^fr)_JDx462Osu2=GlH ze+}SB|6ag90rcMi{9eFM;)>FT%lS#bX9AA$uK*n74*`zyhXKD22jit*0{wQ7zaQ{#0segOdnjib z;3x<4Dk$e-phr2&0LS?4TEM>z<@qAu=x=`o_!ofwFMy-oBe?*yVTpP{Hd`bPjq`9HSc zj{=T*e+oG2-3d7A{Tbk>_vaS;7l5PQUjdGKcLR=ke+@Y5{jCN69pI=J`#;4S%w*dVNz~2M-*??od;t9a9f4%{5?4Q>Ij`X-*M*6it zkM;dOz|A~GP~ASjaozNHz;Rx{cmUh+_s`{q^Y80G&g~XCcLR>)e87Sm`*Zo92KlD}{eJ*&u;3UEvqLxWD%$ffz)gI}dJhL2 ze&37NfC=hp&`>za1}J_F>Nbt3zpa{xDFdJ|z58`t{4&vySFb+8#=wAu)G2VL>;Appt z07tvc0UXOY7jU%C#TI-X;Ml(H7CZ?!%3lCD%IN?c={o^O`b#Z%7vRT%J--Y76YbUw z^tO2r`vb>-#vfw5+5>X1AMOUdSg*^09@m>!0FHhe#}StE)j&TR>bneZZ1*bx$Nq-p z!Fs(G=&?LF-f=#C9nil5%JX`_F9AFS`0D{*4)_S*7|*;3@HEiB6Yv3OuR8%>0rX!0 zych8A0p17rPXW&W{s+K+1nvGL;8>pL9OivNMXW>lF996opAI_@*GY-ZzB8{{rAQC zCy#6NVwq5pLl$uKOV^X28)t zxSqm!0r4|HFOKU@z;6Nh{ea&J_?rO7@s90|@^L=84dh@x>TQ7Ie1!Bx(EE0vzX@=Z zgZ*kf&|^8@2{_vGU4WbX689hUORb>y4(QL*0e=t3LBIVzz_EQd0DiQV!~GoB1z7$& zfFAJ=0giU~FyQD1J_0!URmA5)y*2_pmj6z`alZH%;PoH}`^iOsW4reN{&}!7&M!!R zJ<#6;deILf{l|g+<3K+PaLjMi1AaHqw*ijwy8zDteGc$@0KX3K2cW)d0pA4l9{?Qn zZU+1lK))4ml=B_HQSYOG?|}LG*MQ#(^8W((CjrNPf_7*CdXzsKaFo9QaFmb!4fEJI zu0I9kK|hH&j?@1FdK?!R|0kh582_UjjNfpaz5(Rpc-#y)u9wmO%mKZh272`8nBTq% z=rK-S1vt`=0gm$&`jgLqUaaqD0mu4&6mZNtA^u9xi#Wz_TR;x>tIq+B@xc9nUkUPY z++lq`5A-(zy{*5YAHzKJ10ZK9$U*to53xLRfFAKz1O5e&kMkqaztuwj5exn~z){Xa zfTP}D0*>_m1RUv)h4mETIB%kyW{`vS$M!`#V?2*?FrGnrjO(zUd=T_vIqv}+%Y%Lf z<1TDp#Bsc%zdaA+BaZZ6gmy>2ggDOEUjq6U$B>WnLJQJ^9L#@i1sum0mVX7vLHSn$ zj`X)74)SrnLph&7dYCuSUp)@<7y70D0r_bEZGhwag5y02dJ!K59Ovbm0LS{i4REa2 zhb{OPz`p|JbnSOqi${U75=>{nP$EdNKq&baRQI>^WQv6lAU+@Dd>hJ->v0@MZv=Y8 z-wrtX|9b&P`Y!^G_Wvs2*q?U-j&k+@j&d%A`3~t{2RPDa07t!et_Bi? z_WUg1-vfX6KY*j&U4TCXaxh!1w?Po6<{2~{>R|;S{`>nocCW0crVbKe#`Xx0Y|_6Pryz8 z3Dcho@^OEEF5qiG4(_L5`CkL{eL$Z9JOlV~fd2~OL#!9p*Th|H|0h8X#(O^iIap4V zgZBRy$iaB&DZr6_JK$)~rvca1QvTsTgq!}2{-N$UhAQ~U{=r6nm?Qn+7J9bbNmM5M zu--jnH}k32zcB5Q2Be>J^zV$Dx-hhy|Dg}#&sD#9|J&5Yx})fSa+#U*7=uOMreO z;3oFtueSky6437k-1IT^wJtROs0aFbz)u5w4&bK)z8vr~0KWn7>40wp{7k^N0e%+X zy8$#1%R&t{I~jd{`v;MO>Tton*o0r1Nw6p;0*?( zpAQ0Vd@_H{u{wXa{KjYU-$$^6qz~iG>NoG7>3|zw#NV_7ZgQB6_W^z(1NyTT@KyuT z&$|F`1N=e2P0Y_;U{#gt7 z9Ki1ad@kS*0)8>zj{`mr@FTSEV!iEvPX{~+cst>W*VV1t4fvH>hWeo=Q7->$0j~%AD!}Ie{yM;y1O9rzZvZ?6_(s5&1HKLLG~l}d zUjew8?795CfIn9U0gSU9rs(fx0Nw}m3jogmJ^*+>;OhWi3HTn7@G-zQ0lpgW?SPL1z6bC%fFE_N_XpSa8o*}&el6e&0KX3K0l?n?_&UI^ z2YeIYZv=ch;5Pui2ko>e5zjjaD8tFyczKK0Nw-mdjT&2{yxBO2YdtITL6DQ;12`-0l@bG z{vp7pzR>%F%l~1(n*sj_;I9O{i}0fU?kd1H0{wM>e-!XL0KXIPt$=?F@UH{TdW|i1 z1AZ6K{|<1bze9g_#EZONxV|6P82^|K_}zfF1AY(SeSmKQd@bOg0Q_x$b9pxE?=}H` zFVJrX{F8w10sKC|kDBWJ!S(tS;4=XKFTfLkb9s#IIsyN0pw9um8SvWx|1{wD0sa}l z9|HWdfIk8_m&e%j3Bb1i{gfAbe{g+22Y3VE_XFMq_~!vH0{#HtYXIl+7+c>C_!oeF z3*cV_{9(Yq1o%F{w*r2`@!lU?uP+1M3i$s6d>P>X19%#6F28BB>j2*d^fv*{^v2d3 z0sjinZv*_RfbRzUYk=3i#QTHm^&sH&fPWqEIe>oy@a2Gi6Yv`V{}$jI0sl7O+W`L# z;JX2T2=F6L@c!WPe;4rSfd4Px3jqHf-~)i~0DK+b-v@jX;6DI-JK#SAd=KCc1Af#? zy+648j{rUc@E-xb0Pr6JJ^=Vmz}Er(DBzm_{|VsR0skrBdja1C_%SDXe{lJK2Kf1a zKL&Uw;6DdE2l#Hl*8~0wz&8W_OTc#k{wu(r0Q_;lr<~;d!R7xo;0=KP2JkMxe+zgK z@I8R92mE({ZwCDLfbRhO4}d=b_+G%LO!NNW^8XR=2EhLWco*P*2D}LP6M(M={4aoS z2K=vp?*RP&0N)4rKEO{n+53ab|2M!}0slMT%K-le;NyVr2YdtI{{;L2z@G&CD}b}V zeL#P=3-Esd{ZoKH1^Bd6yg#^J{|0wQ z0k5lPE-xo{4B++k3Rbx~b4M8?a{xDIq#0ih_zOVJ4S-Jpd?Vn;0lp3J7XrQ;@D~AI zcUqnLu$|2rKnCgoe=*R{0sMHtmjiB|v1K_o0B+6#F}@LS^Nu0Lw*h|QVT^d6-GHA2 zc-`sV_gsE+=NlvSfS(NX?SP*Gcpu=W0=^dTdcf}j{4~HH1l&AR%;k9;aC7HB<42sq z|9bsrI>?z0_?dvW1AZ3ZeSn`0_z>XiPqr#;bf+BP<}4O}wHa{pjwi-<0DdmWe**CH z0G~3Qxx9Lv4|oIM7XaP`_)NfyfWHjz^?)}3z8UZY;5z^}cK~wvo&dZF=%<{?-+JY5 z2D}0AS%7x|-U4_LaC0Xv%Uut6E6{HS+`LPR>30DBa-e?{aBklnOiZ8sfWHFhPdLl_ z{&4y+8}L@ZUkUg!z+VOUIN%on{wBb=JSJAS1MoROzZLMgfbRnQV!)pQd>-J_&JOC; z4)~dXb9tWd$m-ewPXc`(;PU}r3-~2~-v#&rz#jzMy!(t*KMwdppg&@US1@juMSxES zyc6(tz|GlXme2?IVxV6OxVej%>F)yE>`gKLAmEpQoW}t-?;K(JBhKM}z46iw^wRs@RfjX27CbU9e`&6e-v;Yk598w`aA{rAka@c-}|2HwF>arfad^T4)_q@Hvpao zd?Vlmz_$Tj1bjE(R|8&mK~TzXs@M0B)X5V9Eu6UkCI9fWHCob%0+F_$I*L2>5ouZvcER;BNx_n3o0R zzY*~B0e>^#oq(?eya@PBfUgJqEr4$Z{H=iR0Q_dap8)(8z^66@<-Zm1X25R)ya({N z0bT<9?SQ`l@GesIJpJ7rfWHIiw*tN%@Lhnv6Y#o3Q2uuTUJv-Y0iOf-?SOXx&gC?* z`vBnY0s3`-zZdXLfWHs$?SO9pd=KF72mGkUpk5yUd5M) ze+lsW0N)DuLx8h={Bx2sN7f9L(ktp_j+BPIp9AK%;Y=<)lisCWs+-xDE~V>ct{54q zn>k$Y{@^cW(p!*&mo3jqr3%FndP{gJTgnWlav6HnJO4&6pjKi;>gH63Pdt{+&1+09 z?rumW=pEKRtYlOWL3)WZ)ms=UdittJ=q@#I$mSm+KniFBLzVgMagB!6coD)>JAp-b?Q-UzthK%ga;gzP@DF71^vz z-Iz+HONF6qZ)Lhhs&ZIrY9yOqNpG9)vdN}~3S^g2mzg1G&(21AxpYKLUv{LJF7*z0 zima@OGHvBdrt8pqs2fukr$;iW71`2Arqt0nlt?D23j~&?_qCahWl89A(yG!hb7AStF?HF%qQa187#T%$$kch5Iedii{^6Fd_M z>@4)IN)-#aZ10+6V>0O(E3CKSfVEl#Pkx1{chLB{*!XGFv}DW)sFWwXEiC-POum#Y ztr<^{6Qf@*P3O}qGsC1XyE0F6RDWR@eTkuNNh+?!j=u69Eq*^Z7z~L;QHojFd|zf9 zJDfmt;aFyPghmmPg+x(Fx)yh*5=~y&bWPOkOyx|5dZ=M;V|T8q?$xBMI~k%`ilBp~ zw|dg&4QJA&OrOHVo*0|8Au@QPtc?wx*7gjAI)yd9-dIJpF$=>dzUFp&v1NT!R5D+S zSC4RG_zfOvyw=`yG2KhuGh!nf$1Do0vVEYcLeqzoUD)SYw^kp+6JUml`8Su@_!-gs0q)^F};P+JcVPf^99eE6h8)2 zMk?LgOUr=Cn6EllG$i@|WKqqoWi9Po7aC49Rj^IWEaAmVP?gE3L$Y^l1-f8T+A^jh zh>n=ERHEX9pX^R|bk9vClg%R(!bLjtWNG7|hxL_3&688H?6?X+VI4}B$B|RLjhx^(DgcIrRM=i}%Fly8UHmblgNJN9s z?sgK-g68|6OK1t@Uqc7&T5P7bgqrl{83(o?lPl7qpG(;&l`>EfS46atd9hw@l;#pm zH?|&EPHOBYi1n*f7QQuShO#9NSLC@kxe%t}WHLEs=_lo-nB_0gLfy$UyKaEC;^@c# zt#*1>k&B8srL}Stc11R`x}$T2x1#P+>r9KLuq};&8q?C++LSM7J*BRzP{{d>K5IpW zrqBuwrxJ5hhE~SmB~Xx-$Y(mbME1aUHqo-Rqq~WEUoyF3=^_p^DV32g3=dHZ&gmpd zgba7|q-ZqLaB7EP7pRdq9P}28WsZHq!qGruNE0 zDwf37i7RThF;WCaVnnsZ0yO{EYRcOds22ea^Gk}a!x5dhdM&%>Sc;K{Ys2HuB zh2_CQp%yuke1^lM=I|6~DV4K$Z_JcAsfiLDbJ$ewf0jmZ9}T8~%BmW;h;k2SDbqpq zb}nV8)$_UNh}oP`XEv)hmr1J~i89-}H(^ylHrG;>QM(Q+-2`Q?yl^vQ1=_snF49g4 zt^O#}$SKw;i@*eD$w^3tNF#GLuc4?{AKc|&3l)g72jKvM%HmwPStN@#Y^Z|$WRzkw zZ-VLHMAvYkROnWTzK;20U5mzO6;E4PQd*cY=?xxbXEwj8C7Y+LMSr-+-6e7aV+&aj zM={-{)_$G*?wH?`YA>qjr9B^7k4#XJ`Z7|HC~t1UztHl?mXVIRK&5Dl_AR`$c`98j zatIjR)|n*T+{`r1(LPkVlw!?Yv}g{Ql>$mz6)P{n=c(!>TpYX5<#d;yQo8ju}sI(iRlQ*CA=p?nFAKe11>Y1$@gX` zNKZENt}HE&IZiLP$~FM}?OC-K7gDiMu*I+}GjfCt7rtJh`MNwN&n9oT>1-nL6d5HZx7= z8SGYAmjB6?{`62bN3(ViYxt6)Fh^?yVp>lkSTeDSvo>nZy`^+A)~#ej=_bL zXh;VA!IsX@nM&Prl?SKXJ3AvfLcs~~4kHNj$ihOrYf$C0SWmdCgrg|Qn}#w$O?v0M z%y!)6{LE^3B8D9wr_*S^mqHnJP($~{i1n(95M~l~nPo)@N@6S*<$^7~DlSA^@&|Q= zObD4yFW&rh;e^R<=1?&lzwl6NOkJV!*YyCzMY@r-I+m5x1Q@!q zWH+N%mKD1JDvP1@N6n34k?h*VerlGy7rF#@r@wPS7>y>Ch*; zGUFIyPau}DG~pAKiyqsgWoG$G^8>}8ku{^Rr5+V!DWLJq7O}?O9Kh9*p)qGMgrvwp zIfu1G9m6uU;Jnb}t5s)6!WFK4F;kYX8O`S?Zxf!>c~=s0G%5vTw)jIKV1&$bIAv55 zQ&vH6Suh+coftEV(@JMd=wz{X)WEcMBzPhq&W?FZoiQgOKFd6s&+=hbI;C?BtsG6Z zDW6JrbWKc|hWM}rO= z14wl0zPtrgswdk|8?*X&?u0c2xf_nM_~;9@1hq&qMd_oZDt}d8DhR_TrVp@E4r}Jw zrufNjg(hl+K5rdPNkNs%go8LRV>jh9t4({+cDOCQS!Eo0L6sTo6E0qGUoqRM@>ytl z%z#s1I^{`+eHtl@(hD}TV?k%tIsa(#AG(g1_>4D;RkmQ|Q+6@(qVuB}hJ!G@Hjk`M z7n4iNCU$6jInCq8dpdyThdn4M0cmAS6@@zJV0pH(a;CD)KaAgzALH~mopz=pJhuH9 zZ@(rG+3<&Cgl^-X-V}sCuI(D4ydh2520mwzZnxjmde=jR*3{>l4!4;AC^ke zrkw3j78+}=2@g49be5u?$T8Cm6@ykU`XEc3ha<|PVrOL6Zx zY8=^QJxP4vOY1IMGNQ_&zWO1ed7;HJt>)R$QVgoot@MK*)rAv$)`z?4j0CNJN^O}u zKUSW~_IE5B8K!`Pu0Eif9y%7PU-N}hin}@aBzn%iG+HFeTy~W@*~Dpw1fgmm`3Eqv zB&>t_D?fqMYQCjM47pt9t7MWN`WvM=Sf5*2$|GdO1+58mOx92JVgGmwVKFUYK>;X z2{Ke;N}rNQrANoTr2=GoGHn3&ZuW zETEiMgNa6(7qWe3X%$Kub(hk4y2(X7Md}}$TShrzhN?r8Z>4>`1UU@8w1)0r@`BG`&oA~mps8}0IYiSK$Cfmgg*xWsTg9K3hcGeC zAzqCkb>)2ubu*J%?%@C=ZLQJBesbe_4C+Hx7p4sA0XSvE?2}d6-5bTpgWl+6(Mnfz z1<0-MnyIkv{54nX`@AThrydwcE~PlmzJo?*7kT3XH+fVuP4+URi8l{)Y_3x`{lkT! zRB3>M>eboO0Pp_s24Fad&zDAq7n5x{W*X1 z+nL~Pp&%5ebMoX1VIB()c{M50rbYSqAiKvLttzy}$huq*PJE$Qaj-mKiH6gaJY)F| zMo3b5bckC(ks_2$8OBU@#bSKwMHT4mD%4t(5E`vbyn1pej3rvDv0xTywG}cFp2d&B zqQxg+lwGYgpyFL!8mWBuWaQdN6}`0y({s4|>BSrZL0m&ah3_!z>!W)bMhg8CbRkQU zoQ1b%j{S;sHKgYG4`A@0!9$Z)_grPVUPyBkX%qL1m9rKyaynpY@&hJL(;dKMUU>$g zyB8?Sp`FZvRQDwjZxx)*nHZZWi-bHG&ts)V+RzOie5J$~J;GAVrRf2*+VVmylxCJH zXFE7i#`6#LJUZhaIVyGtOBP+gQUg#NZDP*U%29g8D$}RV(9~eP%6*qB-d5FmoFAic zZ;IsIj7U~o8tF(J6-6j(wC;qIJZj!&ToJ|Nvt%>dc&HdF>T^D=p#knit2FR3D+;Lr zb#G8dXSRW_k+G?%k^olMREX9+BqN;WBiqAFhon5@aA;ac(%|B0fm*{vBhRz}B5!LR z5}Wab0yH5+4trOaL+Pp%I$B|p4z@XzLTtXG$U9I(`_qx!RuHf9jUdwLtLm2p^K|hg2VALKp-`+Tjg^ZRb_qvrc{8v-%h#cLkBRbaz6U$_ixps1@ikH$%MC>) zo`CSpyYeBN%Ax5^&2BJm!z;fDQXjg;g``fBqP|RcXmJfDJ{(rt(-;vO8wSHHyzNm- zTv$1o$w3EglXvp5$;b`NvGdpmyIkUgYTFZYchVCQQU$pY-U=1=y`ND5Ao&h1W|w%W zg}7B&OPf!KVaxIZrqDqmg9a=4^Ag=>?=6*UT1-tuK{*G>N8zgvYg=qtxfD8v4Ns^X z!@3?Wi_RP*#eLjVo}bv&R9%940V{t`4fSpe2-}-Mk7h8l5KaLbPT+VBq&Juiw-2Wb~>N z?>YfGh>(h$tROPV#~0JX{M^~3hB;)*$SxH1D)ro(UafoOP_IuYX2%M(?O#@m`^Ww9csKQ1vCiTS8yfNk>j9$s(#z+uW9+8!EQ&AVyUCLa2 zP=j08OQCk3h>*I%b_^XAG#3D2hpUkBuf<~@NN^YgIA#02WSa6kHM#v7=90>uljo8c z2|1PAjy#SAo;@6bumHV;^UCTDbR&J!S8Me)v zVPSR^;-U$gSoyp<$A7{~j$9Spo(+>^drxnUL&gB@&GnV~iz)8`Ey_+smYR{&IFZn- zs?HFrvyPeX|qt8j43TMkVzL)BXnma-F1bH5OY>iw>nnYZ<1y} zZ=kBA3zuNBR4npNHdr? zL@EZfInQXd=hcJ}6|?ZdO~())Svps5PQ5ZGri!H6Sz4hU#Dt(#U)o4dtf~ON(tV5J z`%L_C$(PZ4SM1f$Z2Tat7f;jSi|{cxnh>b+K@Xu@Ht4!u9q=9Kh-pq;K_PhXT0-6% zR)fW~BOkJzq$HRB@Tsp0Om~Q9#j>*!WxGg(o^T6wb@)FPMrn&7|6`kL{S zDIK8HqDMJQFQgGXCa$aXyb83@0ZGD+tfJRZIcmm=q`MdX&q{N3R< z9X&o0OsEda}shdK^}np>j2WQ<5HymL%ur~a>A98~k^wiU2QxbNL#`^{Biu0(7GO5@po{8*605VG?A}uP#in$8l;3p2??jDZlyEM`7{y7=q#2EJnKsW&UkOH| z+tNC5XG1%uuK8nRC$QQQ^)8C)E64C2SzsPf;G`LX9#60tg1!coq4I=OaYY^R`lp~T9%Dt_Vn;4(?!a`?JG3qR)MpBcC~8teree+PY*M|*3%j0?D64F3 z{9F=~ia120LtLC5k{LvJ#rPqz38kXwhSKavu^_%P;*eO!E0ca>x$u)ul|6(Uf%6boiS*8Rs z7@gQDdZ})GsDzSXVfSmHu{e8r@^+Lurgt!^@W}EQvb|UYUTKNidK*#1v=MGciN@K8tP{D z7KVoCio3d*bO%so<|T_SzhI<9Nh&QVGmz>ZP7h`3X09AAj27!AWK;h`PG(KC7;deyET6Y2#m@>5zZ>Ve$F91pXZk`j-j(-*@0&uKADAKe_%taNy4g z`X6!NFA4lVa^SyC^G}2Fr>G95-ONv0`)v^TdmZ?<2<88lL;G(P_#bts|AU$z+wUh1 z{5u5wKXu^WDe&)d;NLCq|IC4ZkHG(!1OF2O|IZ!x_Y3^H9r)|0ukZ)`$1fcCj}rKQ z>A*il^JD+{l>`4YLI1Z2Gvm(uw2i;%g8uI~@HYthfA3KKR)PNy4*YWj{=E+T3p794 z{~^MR-ONv${dxrc?>g`=7x@3zfj=kkf6sw`T;TtQgZpXI=Rm%#r6hw|U2`LX}~(1HH}%|F$1V|5%qJnX>FeVsq3{}BiN zor3-!Iq>fl^#9m_f4{(gfi;hX|Gz=t-|xV`Q7HdE9r*7P^grpqzeUjhlmq`Zf&bqQ{0|A`f2l+JKP>Q{}RKxyH+xqK4fj{HGzeC`E z+@bw;3H-ly;NK(guXHH?KFyEgchG_VDM9}#2mYg;9UcF}4*XLE{?9w`*K2;PKlds6 zPkqc!TmP9M=>LKPf3v{PKE>!YKW+Nw2>dw*{!W2^$bo;E=12SG9r%|E{9kt99}xKe zp96nUsDHtM|2l#HY6t#x0{@5u|Lp?*Zyfx`MuC6KLH~UMKj)z7zgXkv0fB#m1OI~p z|N9;IcW8d>zrS^`-%f#ljf4K(LizVN=-(^w|IUGbzrg={2mT|Ta>x6Zrq)Q2yHm{=Yi#Zxs0d&w>9w&5!nbheQ3h z2>RDM@NX0N_c@gRA%Xwh4*GWr_5YiL{@nuqdmQxd5z7Bw2mXBm|N9*H>yC{2@4q_m zAEo)xfB)UVep3bgA9Bz?P0;^02mToX|3(M?W`X}74)vcS@bjKF6(QFA(<$(O%%S|t zG(V32yBzqJ3;I9qz@HQN?{?rH7x?dS;9o27Z*t&YFYtfDf&UJH|6T|FO`0Fu@1G9+ zXS2Znqyzs0LizvY!2h72|FaJDe@M{(IS2log8ru*%D-FS|DuEbJwo}v*!2GT>C#L@c-1I{5u5xpE>aF68H~uDE}UT|8NKXeFFcl z9m-$#T(6&_|9qB%{$m7wKGPVt{Z0`0_d1k+y1@Tz2mK8K|DPT7&({398I=Eh!hyeC z^W*v1=QxyqnV|nj2ma*(Kkv!Vf3f`EfWZHE2mYew$Nu*(2mb2>{ZBgZuNCz3o)Y~R ztN!Z+{-+)I?-2O^w^%4*YX8 zKlYy~4*UxQ{m*sizdeHf=Q;3SCFnoiq5K1a{+BrL7X|%CJCy%ALH{uh{A&gM(;Ujb zUeJHC1OEm=|MMNnf0v;DSO@<51pd<<%D+V@{|g-SZxi(MGbwTB&+P*L*$(C3A(Wrb zM8wsh~D9w-aN0S5pRDqw*l*F}vy-@z+ z9Qw};L4S*b{$_#yLI?gi0)MLmf2Y9zLWlY<)BM=}FL%(tT;P9|1OI?f{)-&=OM?Cv zIn@6;LH}F_{p$q&iyioH7x?En@NX3A-|oP_N#LLAV86{m`4>3o-zw;Tv4j2x1^t~4 z`gaKWk9W|&Q{aDz1OINJ{M`=a-z)I7A|5^wAvxWNend-Rxr(NJb!=e10LiwjV@Glei&vfAL6ZqfiQ2(O9 z&u7Zx+V47n|7HjNb($Z???)Z@*9-b@ap1p0;J?*@f0Mv}n*;wAf&Xm|{M!Wnw>$7Z zB=Dc*(EoM{{O@$o|G4JI_J5ZH|6W1=dmQ-p3;N&Zz+ZQ4G=IOrf&UnR|7-{QpCIsm z$U*;f&5!o~umk`3g8q*<@V5&5{7gw)|I;q;-|4{LCGdaDf&VIj|1Jmq0fGPH4*Vs7 z|858V8#F(*|0f;z*9rRXap1pQ(7(xn{|-U_Cmi@U3HjiopMQ z2mWcAAII+l4*b&v{a%hND;6LA?|Lzg^FL2=BC-Cz#wQ<|OZc5bue&2!r7|oCE_hSeCse=B8 z9r)`7{W~4_X9)Tqao}$j^grsrKU>iMBM1Hk0{=}8{5=By@zi%g{6BZ# zUoP|AJ_cYfBxmbe}ka^We)9ko525+gZ>Qy|C0{&~K|OsTJ1)M#DZl$ZFw zmi^*M4WRSsSC(nx*VXVDjD7kXs+*+xH^pP$Xa&&TwOXTo+3 zmwzQON&NR}etnF`7adYlcdv#2b20VrweWvQ^Pk~s_I?SM|8N4N@;|2e(;@zF`TtGd ztNs)EqD!}k=_lNO?j}X1{S01j(SOm&p5hmV^mAG9Gt<;`;upt{Q2%?0*6^G9cWV9N{x_iYpJ){8pG02vxyHhOqvkhy3{#l@P7D7B zH2=AVQU46{^E(+B3zz>v&3|eYetxDx;{TQAZ?D2{o=Kb&>VG$A`!CS^-2XO{qOkqj zE&9(s#bd0d|03d7?H|&=UC{p-L4V1jKd1E{AF6*yO&#BpFWK)#%^&ukOp71BCtl)z zx8^?^iRt$+|2K(Ws{a&zSe8Df|FQk=C+4vIpS0-zqSpUnB_;UBlN$Ve4h>wX{5v$i zPUHIwVgAc4{Eu1cALhTw!v7rI@vF7pr!D-`V)FAn%ToOtHUH^;&Ang3<)2FJBJuZV z{_y<8wD`GL^YgRK_*t&`^)k-?%Cx@$uCeGZYJR;9Z^$G4ZnTl}x z&k@?6-`^N+{})q$C+VNA^>ciTpK$r75I?t3SpPCXKfgaMtUqtjKd0W)IvbVK?_vE} zi~gdZpWn$8*8h8p{_C{Vd^_u_8D&@c5!he_M56|D>_W!Ac|9;J1ZT>u* z400HiF&w`=r1`_~Us(S|7XH6${+Cv%|I3MAYQJ&q5RL!h_T%?=h1-wsiIK`b<#bQ+ zIaTzhEc(}L{SBI*_4E6W!umgA(f@L-zuNfufJOf{K|jAgBdq@?7X8a(*8dTU{wD;ekk@-s{CJF!V zD*8_$eyRPR(E73c`TpIo{*@N}o3-O#Qbqp?i~bpW*$;gdXnyX0eE)7(|9uwyb!U5w z)%xE(7X3x7AMMZg*M{}~uht*#SM6H=1>89BVO!&epR;6=aQt!g43FwOB&Od(;_42g z4K|7Y4$XgVh(BD;r!4hfC)A(szYNzuY0>`;tv{T<3+tal{8InhDCp<=FT?u3Ytg@3 z>#w$c;OD#~{SOHG`To1GetynKvi~$a@T;w#Z?f<=Ykuv<{Z#mlWaprzpWB)&Fs=zrKq8Z(I0}&>c4w;%8m>`8x4S06 z3;*MqzrITSkDMawKSDdMYW!ze_@`_BYV{wq@Gpp||GzE#1DgM$D)qmY_@(xLLbv|{ z&Cl}}-+vQs|Lk^r_baj?2&YmxRlow&;KR z`Ci4V#ot$1^e^MfqUeM3FW;XL*1yi8|30n%TCW)Xzn)b8&$>5T^cS^$Y(KvLA*}y? zi~boGcsi=ZpP#nqe?aSR&_!kY^ZgBB{eQLS@7MZUgQ}|E!u9{7MgJZ_Ki?k^)<1(b zD5d`QVXePf{^tzhm-^oceAyO#u>JY@{jmOwMgN0Zzn+GaEdD24|K%3_4T64tem|^# zqecH8wf=DYp@)-So)22|FVOn2{rUOvu>K=oB-{VonVyPzUz7Jsxc;xV@GsQ-)IG{R zVg4^!_^;CZ)$+&p6Tj5{doB7~wf<`D|67axF0CKipU>}y>wg+0n5Fi=E@u6w5x>;_8-)7v`M0qC zq(%RRnDw7y(Z5-!e?riowdmia^;g^f>$B+JFVw$D(0{i@{|mL_yx8l8{=X!m?DJ8J z{waLfA$`#Q&Jy(Rvgq&8jHi`pi~670w80|vpE1p^&FD)Bm;XZIm-^2fU49%ttwQDLzrITQFQX17+3y3I z|F|mrU$OAtr}?Y3|5oCc?7v5_Kc969*Z*mY{vX8D|4)m4wb-M&)7R?5@xy#U|0T3R zDA{j+O#K%Vzf}Jdc(F+z)W1N`e}hH;DUFJ~uA2R?wdijU^e+_jZ?fob*ZP~iV)*}h zwetV0`&O3C^p6Yr7Yq7(Ec*9p{nhfPONc;f z|4oAZy9E8eu;@Rw$+PkFz|`uuu>E&g^luaNFBSB+P=F}ezftR7SVez=_@(;q)cTie zeja~4g8thr`mfXa!}$v?D}LT#(cj9K4bun5-xY%XZ&~zzKe=OiN z`!l%NEjU^Kmnr-m9{%Hst=_x;#|75^x z{M(iCTdD9b_VE9X_-BWvnvlz1@8RF2@V6`c_@1X`e`U2LP8$C`@4?R^y!-x;+y0*Q z=)YUhzeCagn2fG}8}a`#q5O^nyjFjuI9UyD!2H|(uT$ag$mskFXIS7lglEs@%15cx z%8bsxgZO3t*RAk>4)9w2-9-FzLMjt-`9JO9PvK_G;3R*K!oMBx8vnl$f71DX_;@>} zr`Kf+C;sgsJdgJ|!acs|9pe8H@S6V2e-RUtk7=d59q?NFsigATNr|!l`G8V>zx42* zeuf27F$9z@|1J-I2|nxqC+lym!e3dY+uu$6vurj2zjK(H1bEH&jKE8a^Ii$+Dw}u>H7Ui5C0l`*aD7ukpCKm|6vdRGsI7iQLQrYZ*vU}Q{Mo* zX8#uAm*s!0!v6~o|8C;HAfz%OmmlBL)A$F7zlrc@|8)xg1b9HJmH+&+ERgY(P0aq| z0I%_9aIQc=+oT{u>njTRr>-ooy|K;Zej{t3uK19(+0B-Tu$T zH%`>ce>&ll+W+~0*UEoA*)QAwCdK|cJ^YJ`$Phrg5f7lcJ^LT>r} z+{1srQvWw9{O^Ma60Q9|Qe^#gd+^^UyxV^umvmPEem@X!Kgn^sl=9o6=>Js@|LaB8 z-+dnb-3tFF75;-^fTxvTDGhv*+VB2=*X%FFht=R@`@LD=zsSRX3h^hkpG6-2a^jc$ z*Jl*|+dceO5r5M8|5p!wBjJd#4p>=9SZ*e<$C#7XHE0xZFubg{6iKI zccBMAFKd$}wVw+BuhriUrTp$x^#7EHznl1z&i|V{{DTVrT?+rx9{!IN$^VpxKZPH= z04MvOyA}Tb_V8~b{-pNvnumWZ@yqtJP2qnZOz>#u?;nXjssFjugWqo!TAxZKwVw+C zueF~VrTp$y^#6#5zk>K_7-*G&e_JcTVd_I3{wAgTzNGN~+{52N{EviGCgk$(^zd&X z{wBiX`1>mg|8yu|t^UeqTVT@o^9vsQJi;f{|AFwHp~l}xc-EiHh?PISC#u!|kW&6% zSL|=}@IO!_|M?#N%&|ZQPM$yCQ26im@EW1JyjK6~75)EJ(LVsOnHf4jo}ZH50+9{xt+uT3cbn>_rxh<^>?vHy8Y z;eXY`e>?G)CGfxO;a`FuTLLG~zb6#_ODgpGA0Ymu{_7VW{4<1y?m6PHtx5MB;Gt+@ z_g@=Hf7yP%tLWbjFZgKfcQ^5WPm)2{mP#mW1-!<;mH2m3Qmnu23ja$U{>O6`NRJ@{ zLYMy+9{x4>vMe}h|MwOCW~gAz{x^ufF<`aT@kF>H4?HgTIjQV~C$UxBj2>;8zgdeg5F$zYTcJ z{(8m!pDFfN!3m<(-yOuCRDV4l{Fez&(_n0Vtp8mFcuoKHivBMs`akU9f0g)?`u}fu z`0pov+5hiS_y(nBI#xxBhaWrsBy8f;8@b6IU|CPf36%T(s@w@HUmTFiYyFK{J2;Uec zH6geB{@~Gnko1?=&tEJ0p9}99X!Z9s;)muDajyQe0k73xWyYqI?dKJR|2hx|_#g4`uO|Ma^Z#Ew{Pha|TMGYs;XMnj{O=|Hr20Ps@LKt| zDg2|-@%Jw-_3;0w$ojv~!@pkPPb>WY~fEBxe%EMn;W>Yp%YV3cO*0i(mhr z_waWs{D&$0=fHbLTK|(;Xo-{VA3y8CmlFQH3HpB$@LK!XLHf(<*Aa^TKlkvTO#JTo z>(<{+5C0(X%kkq;3jcBNfJ!UBdg4DS!Tx0){0hP+-M{>k2md+3FHYcp+JpZu!XM+{ z(N^i60=!m#V{x%JI9Y$kD&?1h4o)k-gU+`shgvWAckAy59{gCspA;Z%z}5e|fYf0M#rrtmMz>h^CT zewdz&IG2A3;5GZ#DEt!@{yzg=EC0uc-#!0b{x>}QTNM5i75?S3bpDr#zanD2O)Evq z0I%7bx4%IA?)f_^(8LD*wkgs-pi-=ji%>m-sJm_}%jRH^6KB)e~(>$$y%{|CWdUXd+JP zKmP3DUr+q9|E*H^@i`}!sr&x*EaFejPy-54t@Ze_^ zY5!^PoJ6btdcsdiIDbzDyjK5P$$mNhTcp^(-ow9+__sLxZvT6=hku8{->C4v?BPFz z9-P7B>4^{8fa9%VWg3<@Z&O{*|P^Y(JMO`d~V)_Ft*+f6c?cgZPuKA1`_EFA@G=TWrCuYUrP9{pyq7=b(L-{;I;azA^X=*V(fp{DfSO}_`gs5CrL60yY254 z5C4Et{vTBM4~KECR{nn={-pl>12j{dRo1H4v#J4yda!ejYer|ADX5C2KT z|D^=}UwimVPPQdIB=|Qd{GWz#o>qQ8C4Tq*&9#3E;5GYq6aQGjkKej1p<|Z+*~9-D z@gMKl@3x;eJp84&*)2Hc!Serz!hbW2Q#AVzzr+%|_PhKa2fSu~xx&9m;V*-6g2sO; z@x$Z2h;z&TeSp{av&1jk-)4pX1rPt_#D8XlJ%0ZFhljsgvHwPe|2nwNX!hSt{KqBm zuLHbh|3-!X;|l+Y&`)UmPZIx$3H;*$ukmkH_&=fWulDf&hWL}(-<2NzhZO!#Dg3|i z@b7=AH9U#`IS>C1h5yqEe;1tRTKSg||JM@A|8l@<Pgf8wIcDi176dA=PB|2>vM|!lYvL$FI{R2?o_AzFs*c_0$$@EQuuFE_;2>`pGExe zdPl^${2%x5mz-+tm;Kl63jeP?{A-E-6A^Y>R#NnmhrgQmni5X2)p(d0I!w*EyTY?@ZYKM|JK9*8R9?I;difJgC73!ig^3GOW~gfJevJqCH|!G z(=14**`HPT?^gK##l!y`@n;h3KmIaZ|34G{umt>#9{j-|M>p4c!M|Jo8zG%${}Qra z-v8gD*#8#~e?9Rh-9LRQuiL-0NPK0Jj$cXmlLO0bz_ou8;5GZVD)s+m#r|J-_&-Vf zGaP=m{Xgg7e@NlKU*X@>tlR$s;!k>hcs<}X`*$e(UsL$cSg!N`iTIQ5e}3e_mq5Ef zH^zFwzgvE1wCMa}34dCEv;h}C4e*-%gNpqRD)z7U@YfK3()jIa4}a=3tLa$MAN&7@ z6#m0ob^AL#{BHYyH{dn<$13~}EBv4E@ZU`Q$0U^h$2|O%3jZSt|6e`)UnYK--i|oe z{@ot_8seAz-=hluAUVsr&xN7SdmiUmjERf7Zjl zfcU>^)d>FG^81m8e}MS65fa<)6AFLx3cdXPhxpG4m~Fs4f0qJYv%jq}e*Sz%;s2tC z|19Vi(T#Qtb`Dc_did89zx@8{QwsmYmAd`sEVukHJs5E=|M7s=?0=}r+TTQIEdTE* z{P%kJw-CR3{j|A;D&6hjA3NEml>OHa6#fZqy8RCmzkB_3?LQ9in*Ei;FWdhQ75ngevtrz^eEYi={M!hR_4lm8{~HhgDXkXh)}PCNQHNfBXAr*3(ce9P76D!>zx7irlRST(Q}q9e zhkq&Y!}LtVx%~Hd`0pqFCPHKRJ+JWp%ESKv@o$c>+p?0P|Mc*ePPO*05&SPG{4J~W z@;?Wzi|F9?KH^;aF9W<*{u_y3p8vZP{^vdXpCkSw9YW_Y^{j_~2l1B>0L%YHg}>0L z+y51~E~0bi&s_c{z-#vJoMy{^z~o~0kA6wvf7Qd^4A&)eGp!f=yZkSE_-~mWZ~wni z_-DccF3fX(n>^sTo%l0>#0H#Xsp~xWM+tvc0)8Ffwes7p=>Ka)|Cc@defY8!*A)BD z^zb(lf711Px`)3;;eTD>ztO{gRgvZYfCs;s@Ja3eXCC~mgs%!}&Ia7}_fwDkO^W@y z75fkC)$9NJ#Q$^x{~>_a>VFOKZzDXm|354IANBBm2F8WxlKS5pJp7p%w*6JwY|Qrq z-cJU*|3Vnop_^vC;NLC(2R!^ch@Z;|+yDLwf7xo?{_BY!9`8k*%l|&WYxWN+^;e?s zulMl3K>VMGu*aXDU+v+qJkx3_&;NrI{vUeyyI@?2j;6uv0sOo5zum*XllW!%AENMA zd_XV%XNZ5$A#@H?Cjnk7{~_YPg#cLphbsK{d-xxOaTU5c>jnQV|Gggmjc3Kr-%^GD zA~-=XPj~z|8pbu~-edmjBu&ave;M24gO$13_Syh<;>e}r)nI`ZrR z{JZ?MfQM{j<+q#o#}X3x->2|D>ft|%E?n;U>$ab7diYCeLSFJ8uke>&t=qqx_%{cZ z+kneI0q~mr<;344>>sc2FY@sJj`)`*@GtQ2ZzO)%ekUmWAN26ghj9tI)2tW#yY{d3 z@b6H{{{)5qMGya4;!iq%PF|~c&+{hmGUcB^ncdF|NA2KKj#`< z|F;OgDA3#nT>Z}gyrzHUEL&5u{wFE=AM!z+{{k47p-U?N%RKlz;gj^g81S0@YZUz} z6#b96*6N>j8shyNCZf2zWN;(EROD~seG4|vEncKz6;@K0CxmwNc? zi{!t^!(TopUjEez|37*7yNl%C>f!HJ_|H)IU-j^BA^xQH|FVbwA>waJS%>X^roun{ zI=%k!z5*Rzf9+9t|I5c!fQM{j^*?rQy!_8r_`gm3qiu4|HnofR*8~z9$T-I}AJX+- z0`~>z%B>gtyXVgwz-#(9Df-V+^zS8pSO4|Ie@wt^1EtRK?H>KN5kBz#i& zuLZo;eyVe$4Ra0g3V;=s`5x;x=arqzd@b4sk zK2Nazmnr;9HtP02K>Tj|!?r421K>6LhZO$2!oS_a{~Ylr-T%zkr0YLO_+zEA5O&LN zD&RH!OKNONS$@kE{jc@#?+5qQ=-mF_<-f|qpHcW*75?87zuW)fyb3z^dc*yXjZLLq z_3&2{zwAF&DE!BK)Rw>7|7MAw%a8e7edZ9})qhEm`kxJWt^V2+{o57&H+b}4PyFuu zONI?0{|S%&_ZO-EqaOWlQS|Rn^#8p_{{iB6=fBml8j>bIx~&_>W@&`P~1pUm(1b zEOjW%OKFaA9CsDr9raVCgdd#3DXq`t&eDFip9SRaCi_cIvI6Y?`xX09AD0^uyT4*_ zOj?f>+tQ%%g|Y1LD$r0Jk*b9M7Zj|y`fl{(wBMahTZ`)fi;)&#SuD^uMjZ8;oc z5uXgdN$@)bet6Gv2K>&1ALd>GKkP>^jP0z7!jr+r>P0z@Q>VdiIvt-5el`4X{E6{1 z;dd5=&jugIWhl?WZx;M!!w-+=kUtmv9EInBe=dd5lv)bU2md?@<2?TY3NHlzd+4RerP1o$Mx$#IiO4V%6?XKBWx@FlDTTIM`S4&N-5kEB;Cb8k~ zJrPM2$-`u|VW6aDlTEwjdrqFiOYPMFb+QgyeU`%P8T~fD3lD2<7#Q>EfiVvbEVEjJ z)tmZX-@N#B)O2XfW2KvR1Tlk~`d zxPGATJ(TOFpR)C@93B%vfka9VEsU0ztsSKf02+_mj28BdL2GIt92R?wC5(FOEohX! z_?k^CD_v-?6sXs3T%iH{^DgzVfpm zj}5Oz%W!iJ3N7e^g8E?|x2m+lFy*+{|L}U?a|=(0Yjb^&1HH)b7%9)LJwY+ zR2QV5F}u09U?ASKm_d+!YFnYByQ*qoSLd9r?zPR!I|@A2PqSUB0rK65Lz_{CxTQj~+k@j(z@2;gBBl+N~cbU z3gGA<_>B^BI@L_NbZli=%A_16`Co}@n zXHtr^xqG4m@;(dxXd#z5rp=vJH2rr>db|U(ZZ7$6fRE+C_OpKw1W-<=MG${9$*H>S z`3iZQO>!<5_K_xS?(#4cb?M*>;I16+{^BkjdtzbJq|Ke7mLBgE<1TIP95p%KnZ{i@ zxROQV(r{0#xpXS4iJ=^3d*pLGa;~LlbUHOJDxjlu(3?l2)2aDUL69ErY~wD?A9!-2 z(kZ;-jk|QpeUrwfN%KbE4kVqzJL9-Zr|>R0?$Rl|YmU2g3h$!hE*)E0XVaupcy}Fl z>DZgdHcdL!98V0AbZWUr-s+JTJaW8SkGpiLEiME}I(3Cd-Vu}Au?3&KVf6RlJk@5E zjy6g8tPa!H8~M9J0fp{2^8I7-Qga1P zPx|E~=NdSXEMEt5GmGMs#3w!STPdF`r8oD45dIgCj~CaY48{K#24#> z2E452yP5<=pEL4sTsMK@FMuw%OpNO||A&pdo>GP7a|ld0m5K2rr|&oNa2yE5 zYurzbJRAqIo|Vv*YrMCDe7qR%l~XBuv566ex{~QIEit(vJ zke;!pgPg-bBm|b3^sRvivNdkCk*^Ho{H*%3AkPF+5wH*YT3S;1OB(v>s%CVz7g`D* zXzwlLTe>=X`+E9Y`XK6(x~l4Yeq~= z?Ja9_n2hIR>#C+Mn6)H7=llir=P%4HY-}*G4SiLU^ZDMk=AJ@pzPqodcH#7f_Ep^- z1@KmOHh0v{TU~$N>fFMH%KVhN_T^R6=X7;+6k0&1xt6bXbq-veC^g8iPUtW>mzz5+ zw;ELevdVW%C3Bk^sNT}m-`Q7NtQyl-8xv}aRH$l?w&xm}Ya3?ebGbQznIn_GD8|Y8 z3ylT&?6{!>_Ykxux%e%6WV}97}y5wWUrh7;VH1!a%3ID&aY}p zXW;|+pbIKi^~rlaR|3^XoQN&jH$5CY?4llSn0-=J0Ne-ta7eZ{`r**#y^$N~#+R$` zabVT770s*KJJ!PW9{Tt~Pd;*43)9WD`ZQh`T=K#=AH+*Kw-W2++`98;&#KFxKW|<` zt})*@Yj#~O57pe-0V|!vr8WAfb52Z;XgpnaN9Gza$FV3%z2{geK)6hgjBa!Hs9Qp; zsSh)R80HBUw$kbOhHh#^t@gsX=kY>SWqv`vr_fO_52o$uJu)R@n#|mbDtZblDq!@v zW=+1k(9_!m<1cuUo?l%_T}yCb9)T+(wc3%Z{IDKI(u}GZP-iO(efh@j@Y-d%*oMC9 z{M-WEFm$c0tuOLAoHX!*QQzvue8ZglA{YZUR@$D)TyREicov?e;V5GS+C!MR83l6f z?X>~N-^L8;fkwEBqGiXO?g*3aBburyaDufKXj}-lw{YvTY9I7Zba@zovzSg{vSE5K z;?4KVQ_y218baKZC>8Kx@s~M^XgUY`Ie66-rjuQ+U`QWy>msE$)cgS z{IxehL4hbw6->JBnZr>tBv6J>smfltW0 z;rAxKUk;9+K%u->$j^r`I?SgZew@z=6oSL_tKrA_T!TVzZu*<8*rZtls)1L)lbSTGXAS@q?LU3qr zJN#Gp5c*u;Ib4#Iro7mYQjHoD2GSQfm=@@ zl*1$9z-^@v%K4cgiU#lx9LnKQVc>RA2<7+-94Zcu<;U2=RK}5KNuG7&og{B^}t>{qyQ%%VJ zog(DiC!3gx-nFaxnwO_4V5-XcZ5)ER$mWW^!kWHRMQd|kbE;x_Z*Quir^_CgSPa56 zVh4yhafSC`x5*2l#fWhakG!?iNe{jwT1cA7iO;~JP&0Wl;?Jq^zBtCaHy&=N8NZE* zY*)DvoQ|$o+0ue9H59u0^3V=D3fNFa>d}C?Vca*ynHhwAYMf=1=Oexe@eZFxxP=wY z@a&t(;C;%kHjfdtcu%cl9}r_FZ_l?8CG$NkiBztfsTjEjClN|KKSuN^kvfUJZ&e8F zGp~p!7l^$#!x_tb1gey0(PM@9x0q0Ol-O$}Y5O5QIY)e+O}}tV=Es=(WR^Nwlp}7k zGGVQZJ4fi#v5=OgeIGvZ8o)?_AwEeYQfz@0(`zEIi$R~GS>j5~K* z6i7~%#sQJ(-+2D!h6R-f=UC&3@b*P&9?3IGujCg^u*bZ#>0P?1it4B*jO1;LcTaC} zRJ3%hS_NAqq$)bQ`U(~2E?j(SZ(noE6?ETGXv?qYXX#Er;@)vM!IDGc z-{V4jmNMacZJh7827Yu~8u&hZE8%%w8u2(sSuCDSllU`-fnTTa&m0DRBjI`84D~;2 z82DQhJg!M7*8XjTm-e4C4EzHMK06Hj0O6(mvxb4+L3p0G#PZuP4E#>QOZ%@M2L2@l zkMrWimj94~pFIrxn+kr;F!211NohaM(-*7%5i}1d@iz?vpHc90hk-wZ@Us4M!@y5f z`0+VHvG!*bJU(wI7GJ06kIzzy#WyN=>=TN`^ByU({_r_RvG_K{etb??EWS^{DRSqW^8fz;9Lf|6v&TZ3;g=pD9-V2NeE0hk<`Y;m79< zE`J7Om~?;mNw=Nwk4qthM?1&(i~;k^I`XE;R>1u@_W$GI$Nj-rN{@5%NJZ1*Bu%A0 z>Jm{5sTHI<1wxpoi{C7Qd$nWkIzK!_hvoJ_z(xT6<1_FlPDS&!~zZ}xK{2d_E_#dVG}>3^o1d5x;y! zhB&8~QwIWApcA175++v{}&$q4-vmxf3E${dH8oJ z{MeZwv7!)j#gvrSWehem>8UAMYPs{x5m>?<g^!jIP) zm;d;8>Gs?GV(i{>01KQ`%qiSIMzjARrTnvyi_8Bp;&8> zKZ*ZDX*`78`dx>*UNl($x18# z>BOH@{yD&F_ODU+>lOYxJ^YJ^U%u;wio5OasDpIghIx=f=knqbaF4&@(Z8Iw zpyG1I^QR4djA!{S;^%r|ofyXX*F-Nb8`!?Fjo>^9>Xw1ucnTv7ufHgt2)`33d?NYpC%+v0lPG*L_>eOWew+Gt zK?YD#TrBXZjohyAFjX_-3HXdk&4wq(Ub>9FLPDQVz;ALOi80%JMI-p0imjo|DMl3i zO_TW7IMP9J5mWFz3`-nTOZaUQ_Y)6TCQxFDU*q6Z*cdh&gY36)f^SG5qw~26QRm(- zQY3xVBmVsh?SmnK7W^fP*oQBC-{CO%lW|^fcmkju@5BYm536T4_ZF}x%|)}@3*VTy z3v=Xs|3}|pHm)BBBJ6X}VP6=;i*GcbxR`GwU|+N!CT0%t{e!J22Z#M`5Z@H;oj-tb zaMTVfANJ>FtN}^hpGG~+mE8c$7zRS;895(?&j_FQ=+kM^S6Wi|=Q*jb8hP0N zGwy*B95*8&CJnrK-dC&VehB;GH5)0ag zRY|aaQqZ#BZbeT;W4S*3MG#qK$ZFHsgv$aGN-zqSJEh4DF2jO}?+#e$*&Q&%1Uqht z{W;-0wiV*+XQiAs-ctcqa|NX=TD;O@a6#BkCbUvrx(KSd`}kGCK7P{9=q_?q(Ou*a zkG4%s*sBY>GE!xa+B+-es!Vx{-M4}h4mvs5b*nkw-QQEluWs+@>u>JBjk<=rPnO7# zt~-1^gyDsm59bjxUq9jUoWiRW@5#gOte||3kS~TXI+V|aAEz&%5FE;L@MHP4C$~|u$*TkTsc3hMR}u0&m${WF7>=nq^CzmMxP}@J`cj^FrSOy z$NKR21?86rxy*m5kjr|%Ovt5Oc_HVS5X`?>$juxg9HU&8e+e9;gWG_}7wa-81c&k# z6N>(!ycK>t){^;f83AMzCy?sQW(AU6vp)Ou78t|vu-Hj z{4hPvaj|=n0w_O-h2Xy=~D~ayff2SI7^=gydRrXS|#LM z#wgz?8&GA1%_i z3Hewd-zemK4r25+AwNc>-!9~Qj+^Lrwzm(jJNFKi5_UBam)zKn0P0OaF#3%wR#ubJ zKscH(yl%boF|oD^d^n>4Gk6U$dAp-7GrW!(S^OQ7R_NZ5n;ENlDl`EUwi9nc-_ST> znp~BxkCKD(3~PFL17RMb1sT2Fis9jK#DIljpzB1q`-_CpRF=rY4_9Hp_K0J;g(ebq!@w4H_IQD&b9Fw7wcpPstj(s1#&7hKs5uV2~sDI5c@aq&jj{jM2_I>(aPk3oRj%69gz7M~J@Us3U4g1OFu9rT!-l1HVJTmfr@Iwke-VZU3eINc!g&*&m7{|U3&*Obr{>{U{m(qA!;%5y5KTg3f z9|pdh@Ur~zK8@{W-)DcN!jJc1jAK6oGE557>Jc}S@ZXO}qxXIog=2ioD+@pA%IPM8 z+X41}C}Ml~9s|z_q)Nk2I(N-4$B|lm7_3`;yLgIobg8yL|33&gY#TA^u8AjP_52pUaQunZ}RLE74`lfA~k@KyaN0|0X4L$7U}6X%GHT zI-w%>@WATgp8~vQ|A12d<$!nX$MXcTh@C$t6aRw1QX6pjaczdizf&oHe5&g5R}sIv z#^M9Sk9kXnx=OdgqyIX>%ef=Ox%z+6ga0VuQD^B~{yPD$*0DvalT;ddVXAv6kHsr7H zTZx~`nRznAe;f}7?Ca(RMOvBgHh3ivJ zIlB0UwY`0XRpBZzyZ$REOa*XHWxjUE-|I11kT3y(sRw&Ox8a#`bN z;hEjBCR1dW2!T#^JRA!>B6y)$qgq7Q<(de!Q#1Kj%O=OR`zy z&jugQ8B8}9emM%yBOlvS4TZ6N1xs9RG*7ZN1vXRnPp zEVl!qcaC{5b^Sp9@ijM^r+W`$&NVlht9s3iXhdod|1f3Eh5=Yk^>!DgEs{&l%&Ih8 zfwW_$?hV(xIjVp1b=T~E>n-?z*GZ9brmCeH z*lf;DE+NY3QG|UP8_nQd@RcxFewN^}6h9jLii*=XS8&6u4rEguZWbNlz|;;Gq7E7N1+wZNZqaOYH!UD z+Zks#ne}(W(}Dtih_^gQ(%8PLFt^ar*L)JMD|A-1VdG1gb_m|)1-McW*1W-Dxo6+n zfh)R#GX&Pb!Fj>C#8xK;=YlULTqOsLxJqsaiDx_xs|5XP;~*I(LT)@LeYN&TJ5QvF#YCi zsZ%bv64AuKGQV&gCv#!>npk!9r05k$gLwK#4IxKqxau!K+vGDwZ_j&@;_2wRV2xl^ zB`y-QCjfTx9v7t7c9WKvy|A{>^zgi$p2 z#J`!qKMpSf;C%Ycqt|6#HTWg7T4{?_^cM_T$?<(RhZSF8MIo@r= zUE17vXmZnI$0E|^jwB|A^1(ZlxJ#S66-|z{A9rbUC!@*FjtfDOHalR%qtfQ>Urjzc zE;RYz9Z}q+Q}bfN=RqG3F?a%bRensjPmEOE~0=gzpnHP6W9+l(PJZQgDTk2&;zYcOp|q=PqDxMWyv?q{Py zI7*u@2*<=AkJk&PO2=mSEH+GQE6TRm$bts#4A~ zQK1Y&=@dNxii$yQuB;L1RJb6>wVB)#ebC6q2WhzkkA?PpnAzFKM)CFH0Z4y%u<|bz zXs`q1T+_-UfL$QR zayY{DAF0&clt1o2SthjGT2Wf5Vf06?7$K;`(LAjsX2W$j6(RJDU%e+b=<`wZq*W zc^PClUR>AsOg_uVaTd@z&hs*mbC~1MUyX7&XI!_zlm7D_`8JRI8IX?`*G+D>scFt@O=0heI{zB-?8@4|U1OdP(XS~nTK$JJU`(cItBmxuhX z$ai;jw70B9RG4Yil*k-ZRb@B_m21txd(Zj$MY+bti}UjqFPzg@d;Y>auEUxNS;J?T z`r2Fa!2}r`b#>;OJ6nO&nuo`g?d`$(%6xDC@_cPxm?S3ws-~@IUe(^Q7K*386IQ$C zQBio;7tCud^fkA4R87q<>}oB9OJN)Orgk^C_tc)Z3f}6Cd<2Y(Oy&I6aT?xftz?C~e*>n|xc`$-J84GlDtB+#*zZO3qAH(iEhX z!MpM>W5^;bxMFfD4n@l#aE@59dy6p$Fz{S2cIn7TG+YO530{)UL`w zqbpnq%l-0wU3i4wLkwEl6kKZ^tn@G~bmaNMb<^T}fJGuguj0>u9IvWY8+K!UiCI{k zYnWqJT%IQw_u?7YN{ewJd+cO-+nTYqy8ECDY-uU<_J(i2N6z6o(ZRuLjXKe-O%6}* z?mk|sI})7-uj}@-PjR~PdSTnmn6E-(V+`6-adn36Z+bo#=?W|J4TX+EOJ7xQpW9l4 zR=lvGI$u?tU(nT>?`iH_S;%ASZtq+PIaTK;SLWx^wZTNTnplpi?}4Wd`JMtI__ATL zJKc1c#*%zrPjh=;Z!LGKb<1JpZtT?fdoo=;OQCf~u3GQp@^N~80bFledSa~`F7?5M zEWf(BqrdPrX>wD6VzteGL{81=kpId8ouA0?_tZe(WXwl)$QX(433f}^^VlZRqen(S z!|j>OcnKS2CwzZ<1RLcHY?RF%aCHb<=45%%cso~%+?1dlj?5(vHdNSiMM&Dc*h?hx zhW7|n(_#430k;}(?Ooo#Vnv~6_(O^up3*_pjFe4Dje0NJgpInnwbiyau{%U$FjCY8 z5qKB2dR2SAr31#P`M$N?a0Ao1q6_abvxqxP;|)6Gw9@c}kD@z*J6Z9UWic$oXEs$B~~x#~&ac^KXD3=l^jbZxr%7gnY4( zKPcoE3i)@1{30QLPRN%CIqv<24)wVheyq<_A(#5_UILh2>Vtc~p+mXU=L#X0`dlmI zQlEQ-T7P#ER%SrO0Qp?p52L9dd+DCcvN zM8-pT2mJUvmAtD&Le?MCcM3TNQQiwbEuTJ4Bz#PdZI_={Whf41+$W(Zi+|uy4pWeU zYoZX!@yBjG1z67Wqgx$$mW~G;InPJ$5^{bvU__`mILx1I#p8^S^V}}VvqH{u$|!FV za{2UZy^wR;!1P;%{74j#8xV5&bY+*2bK5o$DlGK4PEno_ay~~;o)vN~OO!VW`LQS< zw_eD{u@L;NLLSV$f_y;8d9EB`yM&z2DU_$+c?CL*&R~FCM##sr5d5r=BZi-|HaT)` zhpD%{mkDoA5llCTp@NueD0XTv*a@MS{G18G=za)r^S19M+V(v)Z_&c#FGjZeVCK!W zcO>op=OI$Xlz1L6fdFn=1L(sIM&oJNV44&7>z1M;x zlX=o4c%CDk1HF?ey&zXvOZ#kwEn0?qd15M@YzvIs%M4=b%Ua^y!74f#rY82(VydD? z*~e;F`DwFIYOZ=h9Q5F;3-HE8PxIPTMN8MJRqzBoRRN253Ki!rTzo3L-_UXeD2gcy zZTS^F&8rHjij_TG{oUd|;Oz#Vf(bKuKgaoGDZuy3^>B>$<9L6Mj(s1##wH8iKSn&> zw=<4?A0E@A<9lU1ZiFA>*!SUaE(V>%7{|U3zk~4d{An5nekb8&{hu-n{7ZzF{L6=de^udc83um0 z!rwX!e2V6Gr2eN417AXTS$;S#$@Rv*ul{(RO!DLWCF9ul;m0Zb_&kDf?ECP%hnCbI z=SdmIz7Nmy`BHzJ?_?bNKKx8Yf1DR(9Q!_ejZ%L&Ps%vZz+JT8y1ln&?7k&33vNDAMCbp;edY6a==oWwlcnX!WI3f8N=XeGjBi`M^YbF)&G$*~wv&n<+A$(+R7}C1A4t14o8rZGrzmxEC&KPk{F{LU&py}VF=#L_|{BHN~|B?9RT(-uK-%!%{*C_la zDf}hS&Ncgwz=y8jlG;xi@EZRXg?|#{=i1-x;jbY6N~1;i=a&B!9{z2_&vQwu zSA+7J{g)B{gpk^VT>dKoui3v-vHvuM|0>|o_;FnWx^n9U|1N(&q|^9^6n^aMT>F3H z;lGFYlj{GM9{v(iocjqZ|0xRpVz}^V_CHx9e?8ze`!fnZ_QkIK-}3OkK>YHV8o*=c z|5FF(`VSEvuW!=1_4hd7HT|m<{i`7(SO2*n(8}*9unV1gZ|U;i=fRf~KB@ovBH%Us z>&q>_tp77X1j&tK`O$EJ*7ToOr2eZs_$7o-YQIAsd{2@1R{*cs-=^4qj$;3!gLL~p zM*Og>B;wrqdzkRS^F>O%mGIbRq~r2u**5^M>A#-zZ=!^F{?3LUsdw{`tg)Z`J8jeeiH2gcA@NW5yCA^!S`8kKl zfY-{e{3M&Ak`ki+=faQiTz&r`!})voPhi# zq(AG4`p<_S<5+$N>Cbj@HcN=#?LV-t(6PUb@KzfBuO@sbu_4B>{9A-~&x(BUyJoa~!{TnG`w0|M|7|-^bw#S(Xe+b$&y4~bo0O4Brx%dM?=BNk~*uIEf!uT(z z190uf{$0cGo@BB~Jp=Yh=i+f&p`LIHvrOV1W|fntPtBk!eh;%-#)TSWO)v|4jGb!Q z0A62FCwxZ*eS9YcO~)|4Z-PFa!{}p~?9U$2xJeRGN=_bV?H>r1riS6j$Z?y zP&FtN?CBKUFDTsq2lg4l9hzVxD7gg?>#-Y1;RhQy2~yb4$!;w45L)l!*rVmN&6C}J zX;c3$&|sIa6*oTu^Q~cE5~?u-YJiqMWpS`$)rMCqP1QKrnDPMZPAm@iI}CHd9Kzyy z+|mSlIMF^y03fTvy4ln}0EwZFpti9pq`FT)48&p#)f*{((i1hCpt_*SZiGGAZp3Za z0`&p2L)MY9s})-?gceYd2YXhD0(z}x%*j~k@5btQZOmnlk+HFwllh1ifcAnqy8)KM zeZQ;<%x;!j4O;|t+lI_oIjbYC1lFO0v9 z;_;p?z~?rkal4;!AbN!2efZ}o9{UD~zX4Fg_Q=Z>4y1kHUD`k0=9>0gAs|;?agClZELwU!pYS zGL6_XX+OID)yVkKa{?VEQoMPGj&-=i=8q7~A*FxMALoKc8T{?`nvicjhSsEGBTE~X zj=c3K)4O*foE~dB?$Tn92pOyGWrXo*SbeU!wAm3f9+M8fA|8!P2VaMF<)(#1g>aNk z(LhPW*dY(y00_Bhhp7@FvB3f3nf@&nmloeEmy!Rs$BQkE;q3A9M}U-xJy=Y?1+pn{ zLY9d=Soof!$H;L+X5Go;f62(h^MZ$%KLPpSVhDVP7h7tBW+rA;YS?lGo}Se8+epd|h3Mj$Lxc;TGjr} z&jeiSkBj}Qs_>m8*g^%@4A#zvO&J=iAZ98anidY*mxwbEK9OAw(b)9oAFwh?Z|?r8!Qzo)aa zqhYdIsgVwnx~qlosq>PCcw^$pw8z~|X#nSQCrqMtK)ST!2tS~Vr;Hd>l{P3InV zLRuZ?&_1OrHtl#up|g2;2dsKsQM;tK2P}p!hUVLQ^UML=H0&B-HZ90u6Al|Vbno2i zBkdUWt_aY1)G*(^s=EWvyaY9MEn9Kt3bT|QRzn+uI~t~ePEZecHlY@Ivn5JIi9J(6 zXD%-!LD43lCWk1vPSaGNnP;8^$Go3(V4iKVybg}hx$;gcj>)eRa(qU|`P?Gp zQ-%C4A;)KGoF3;g(IGG16|g)5VRR^eKm1tE<06#f-37~eB!u$mLe6&}uKXNGgAV1@ z@YC|au^!7$hcG%!FZG{jq*i_+ggO1$9yz{`hYs_RcJYWA<@n5t^O16yKabd8_-RJx zoc=60Mu+*#gdfW@5JrdT=`o`@&YFKKhaq3!nka-;j@S8f8W^9qiEtas_0>&QrCOVJZ#?1$}Kue z_TezgQ#k({$3`Ai|7OFapxTulMH@cCI5ik7(Gre*zaRrT@^x@gjr8lLb5EtR z$6|OL$LljX_I>yon=H82A|A&LjAP%2$7j&!_*#c}91}5)eIK5$zfyl3r!kIwAHEgR zqLX+WpD~VoAHKt&qx$36mT~O+@M{!2j#nASz7K!Bg2!1*#{S3%(NF~RhaF}`$ z|G+(Jz2KjQQ^7Gl*T=lFfy4&d@Ff9o+pK4HgT`?j>ob<*cupceOwUH#hiIG^5yF8h zJ_Tf$=i9|sQJ(HQ;mq&$Ew2529{kOuD9_JBGUHr4mMTnCL}Q* zrXKR}Z&m7loWlQJIB_)l?;#?-?`J}ne~Aar-@mz>f#kd8*8q5}{B|hihtE9R@_Ww1 zeJ0O2_c%8y) nor}jg70uM4gCPQ3znlbuW7mG{Up0IwJ-XaL{FoOy7ythOcLS!e -- 2.39.5

Mynps_vRGKZ&uK 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�Dc~>Lrwey!OfN7(RmtZae%=LOz5u}4Ac_Vu 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%0D*ZU$$>=Ux9WgI=R0N#W*N0aXx`t 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ƾ*A->f0TH>+&lu0dF%-rL4I zdu!Fw_l=sqb+Ajo?t=(J>JUbkI;f3-+%|;qJ7l-u+U^aH!7$;#8m>O*kUB63odR@T z6dlA%|AJQ>g5MwT#|gVmI)4%0f>vt7i8)Q!g3D{^ zfTuzCIoNH2T}kXTZ{SbD=Q(j_xnD!khl#I@J&AeFg=ISvuWf8p@@EQoo#34z;c5Qh zi7jfbq%jFu7i6wX`E3MUkFC6d*6KEG>zG;M*#x`2uzRC~iJ$PcgI5Uf#P8<8I}F|o zQEDF>!{>cfcR%>!=2zx1lFq~6MZtTM=xRFWYx@`3G3vj~m&s0K^Bd##0%50hRqgC7 z8nKH*HVLw@T?=IMA&Wz{Ou`K1vvf&l;<#V)8NJZ$hAz5c)#Y;4o@3v4C_p~pqRM!bb3)`lp62;=1oZ|n$UH~FZ1@i9 z32ZL(!^9&ntnpq>c{Ajlkbl>gNA}Bo$gdfHvmhUTanN78xqAeQsMhI8JYCRBLhlkW z)O^L3cbpr6L&0^t+z)vc@@|o9{^`0kCS`pMa(p^i$dn6oJ!KDcpM&nX3~NJVl_p8z z8HTL!V_ZXpQ6+D!d|!rq5#(pnwlC7Dwo-=CeMl!{9~W8BHqIp$q(Iu0-1l_o=Ae6# zuM5AZ@5*<(8I|g_LvKIyK0Hcqsjnw>s~>tr=$$8e$e#_It4dk#f~+A~wr`hc-f=FG zs(&}8FD%(sd1lLN+uKrv-SkV!BWvmr2=3=@yq+|APcp}#xw^=2Y7QIc=$QwT{u%SF z1=Vvo$+KDDZvwv+*Oq6x4ytYbim~JI;W~Z9p#5$dx(`BkeZ+M69d4alxV7>6LEKT5 zqsHpO)@sglm=7YX(!%n{f7Xo-OXn%`#^&qrK?DRA+$Ju?r}gbP>~o7a|3uyd_ohb{ zx%y`POUr)LH|So*xPp5zLSy-PV~dFseC%h2p0Uu4u#R0;_P-OlS;lUBmqO=f7<-`i zZMkHuJPbj?wAQ2TAl-S`PQM(_W0-#&H|kvH;>w<6?B%E$oa2b1vn3yp&uIGyQeRa= zcrt!&cnbNkxIBVsGus`aW&fbhsqA1GeQqXoaSHVJK)<7gK1KlCAa;HeW?{BhOl;Bc<`ox_mH2S6O0*x#!V#aFM_B8YmhF69Ems`_$%@1`^~TVt zNt}nE*L)?`ziY%fdOfB7WHgRxwdP0jCEf$bpLX~eTuWUEu4y};71@Zg33{0sazb|% zNBvF$L3AU${Rj_9)bK_<1J}9VEI2QDC1vzO9=X3g2xGyrKk5FEr+P$njp61T-J8?! zee{PNe7>b^0ePzZnDi!gvyxj2*oW;jgV_5Z?5w z%l2JVEl>3H=wYQl+zwd^va@h)ZCJkSYVB|jWZjU3`%1AJhHM*T;jw|V`x0b>klluB z3sdV4TBMAdkpR@6+45$QoNa?^*;Lj7)s`P%e0fdTzSE`YWd9q}C+ar%#_EdH(FM@$ zgl-Dg=3CqvKxH*T^wvQy2feF;diLCNf%8D)Alm`G=b4r`3it@oVB_Aus?}fDKPJQBV0!UF1I`l+vDD8t55qs)!1-~z ztmHQ8xOqDG3GnrO#ENgZ0BfC-5IVh=F6rnzy9@f!8|m-W|H?ikJV8X7#n1Lbo`U?N zxVHLoqxxB?OS>T32-&xNnH(;O$3QZ-YHh+B>EdZ;HN_wwhHlGE+?S&1nh#xh`W~Gr z%2F=JptA)!?kx1pl7+!FJzIaq^1S2-d@bq$rXjvhn)VFRb93++XTY~0CXU7DG@+Yx zgL%2fH0%z;?h0I^FN?_`K{BD%`-d!+Dck$fBEw!ak?H+I)(%;l*dZ-EA56!zvaV!J zZ-&0lF$~>Z&~5O2Iqog!LvU|AM@JSdzf*IBf_SCP#}1;4y#@1U#>+k0>e~Wei_|hq zKqm?PLFl`&V(oQ(i56~V^w3W4bqm7iT#vPV#>w>y#JQmXPq8>RY1O&p5OlXg_osgP zMzz(16X;>e#Joovbm#hEhbt2_PYzGx zwdRM|reHf^Bi0637B#-99GBxEtJ)o!jM#36ZTwd33-E1qeHdk4*{dSoSO5c+&nl?A zd@DZe5NzA~$|Ju#Q5~qvIb_fG4{Fu{%y`EktmZ>#|C_kx);>1+F|(o;~@;crOSqbf5lw5^vX3Rcw3@798ZYU)ATz zH#4f*H8Mf_KZM`ekNqQ3kr4i<`K4rL(L(b*I|iWArw5(AJS?7uAew)I`Qc{n&#a_Z z+o6u{F#gmtl7nRmW4(Xa9)PVI!w9b%y!`>5wAW4G?FDbD-(Hcj+CE!GlMmM%_u>Af zEQb-+p1Vh{(M#MV$Oa*E<1Fc08V;NOmvL=qvF;0DOJ2mGJ3Wg%`^?+m zIGJPJczr%RwwSBms_lYp>|XBg)_MeAy+NK+<7jg^5EDJPB;mE+YdP>*4!o8Fe~~$G zm!*2B-!OX2u-GJy9nbgl;0O3o(#5gHkM=aEJf$12aQO!%y|jK<*sg2+-~IkE%H9*g zA<`|^nfxizKO`O`9wz>Z_yY02i7uSqk`AY#Onx{WVLO)&7p{xf>4nqf($RIEr9VyV zA+9CfM7-o$)BElR4R0mi#dAC9^~CfP(;H88>EBFwAMsw|-X7DxpLBuoe4g|U;&z7j zIpPE4f0dXgK0+KIK1O_k_!RMJVmRL&UAjR!V!Q|DaGBBZTMe`1dyc-Da`Fq*FK#q` ziFCfh=+s)nn3KzaUHB!*FOnX*%J`X1!#w%D^!%OT2mV_oDElgzIi=@PNfYkH-73=2e$`q34}&+7p`@OyU}9ouY}A)UR; z=poW^+GU6ZV*EPOi?1}y5(~uKHp*E(`J0T6ts;_6G2L16i>#+v{m3ikc{iH=5alIe zd^P!N40HVqH*J_A7RetXow(cN`K^YDOAWni4WkPU)0dIoZdhV`3Ca`9-y-W}mRMx{ z&Jbh7Jlm7Ua0-ksM@$nFyzeCGIMLPb!Y3>}NtRQL_v2kbKI4hfuE6->izvU`Ft^w+ zz0|Nc!%!Q2jeoI0*|>pu1F`reqf5lXkB!bfY?%BGao(E<9=&B^{-GUJuiOzy1dG9x==kV~j8NBjc9} zh6&0OPf}kGmBI6k2aS$CV3;{z=siXL@S z`rE~%U4QHP-zDTPB`zbLAbPKG9aogDH_TmanC>wwkj||$dWd`%US_57i>nQzH&BnX zM>@fH@}yJUrkA5$(%F;mtuc9w`d-@T^eV$5<4qBV)*3(CYnUgUSV249N4Cr8IPbSe zzPq0=7H=~B+|7m_F;9Mhm?p+@(wXqdt+$j6d|OVf3J3 z;u*u(zft~E@`=e|qrD#+#-AqrBf}))&HlU5#Utbsvo9E(DH)c2O*t|DlF_MO8G1$H zbJY8VVTt_o&y0={T|VqyYySH&;^V|8iBA)MMtq6r^80tBU3g*4@IKPS_-`y7#h)AI z{=+bA=hMG6c_L!z%>2&ip<{*xkNgp%^JVH2Q-3hpBSw!Ko&CLGl;LGwA)oOLy}`mQ zk?+!zCqGL}pJIBsM#Ff6q0>*FY;=B%VVd&zNk(T$=ZJY?@>G)#kuDI6#1heCI8kDZ zm}oNl#8|^P(WT2_;x~2`X+BLKdFDwscqb{Hd&T7Sbq#HDmDG>2<8ge<^fPH&ABmjV zp!(T+s_CJSJf#n3#Qvm|gqIJ|QT?!2Kz@ydSMQmAjNv&t8KTpS-^ue=SKAksSJUbL zl2mve^xFiZx*4Sse}VD{)0+y*Lv-@j5=y|Hv`f!W$>b;TeiHvLx<^QMB5$`k&&*?XW=(Q2@66W{4*YtODd)p@6< z+_hl6cS==zb96yBAVZ;{x;?t|yD%aR)%XAB(k|Q`9Pc^$fe`K1qn&&O*O48)VYT&d zj&|$Vj^5T)Eq^F99^AH~TK?%jGM+K-=Xo#ifw7}s3DF*&P0P>8$A;+fq{o_?cMj>- zk@hln@p{rzPP25rm2~nm_JsKDq}_wrw~<~%`Gk=C6}+M&EH1-&=H0P>;0#lAxsl-m zX!l&akLe@mb8NBjR|oQD;8u(FywSpw{VDQeaNb*t^v1W_h2!s^WVE}Flr_BB5^9Q zmAH`DLF^&+5w{X|5(kL;hzE&Bh)0QIHZXqTMB-FpD{&#QgV;mtBW@+`Bn}Yw5f2iN z5RVeaY-IeziNvYIR^mcp2eF6PN8C!>NgN>VBOW9kAs!`;xs~w~ClaR;TZs#a9mF1D zA8{*jCvkwdk9d%Hgm{!VrjPLxClaR;TZs#a9mF1DA8{*jCvkwdk9d%Hgm{!V<~GJp zoJgEXY$Yxvb`X1reZ;NAox}m+KH@>*5#mwem`#kIIFUG&*h*YT>>&0K`-oeKJBb6t zeZ+&rBgCV`F}E{*;zZ(9Vk>bWv4hw{>?3X^?j#Nn_Yn^gj}VU%$K1jAi4%!aiLJzi z#13K)v5&ZwxRW?Q+($e}JVHE59CIh*Cr%_zCAJb55<7@J#6IFy;!ffKaUby@@d)uK z(Hl5f6R;>YMsd!}nIDR^%(?i|_r}hfeD379H*4+6^Z)ju*twIZfbb@->0Hyjy1Q+u zH+ki%?q!p&T6x{%rPnR*YCmUryQfrV+nP>qa{JnqYu2tX>|Sk>o@J}oEMK*SbMRV!*3(SGPBL`O4+^kITtdt-?k3vR?e}02fND+S|I@yvfTtmvpRdTd{0OXFCFM z6m*xaSz`e#X5{k)l=I5*auew1#lysue4it?ahq`Lq8w zAq2_k2t(pyLC;}xD29d*EyJgy7;89tH@Oe-cLUCwm8FEamLo_{pKZ!wemley8VfHe@n3bF>?u zIV?ghKS}>d_;cwOp8OWzPh`&CjRzgN@t}*}*}MCf$(h*Cz@Plw_|l;pkBYsFLBsZ) z;7OiXE5k(wfAY)de}CL+l*Q$)1+T503O_?`Wf8?7W99++5d5RU);kiEBqB}v?Zy{*BY%QwgS5-x;S&w$X-b&_Tl&(?eJ09ya9jC-p$_@F@C2fVaw0a4!;eaZ|11A~fJ@0SXYb}6*}t>cXp0(1Q)_{_aCEul=h8sbAewha4nZF;7?TI gLIi%!p3`ez;(`mJi`!Si#bn0+a*&B@XXn`e2Q-fPp8x;= diff --git a/lib/LuaJIT/src/.gitignore b/lib/LuaJIT/src/.gitignore new file mode 100644 index 0000000..1a30573 --- /dev/null +++ b/lib/LuaJIT/src/.gitignore @@ -0,0 +1,7 @@ +luajit +lj_bcdef.h +lj_ffdef.h +lj_libdef.h +lj_recdef.h +lj_folddef.h +lj_vm.[sS] diff --git a/lib/LuaJIT/src/Makefile b/lib/LuaJIT/src/Makefile new file mode 100644 index 0000000..d22eb73 --- /dev/null +++ b/lib/LuaJIT/src/Makefile @@ -0,0 +1,721 @@ +############################################################################## +# LuaJIT Makefile. Requires GNU Make. +# +# Please read doc/install.html before changing any variables! +# +# Suitable for POSIX platforms (Linux, *BSD, OSX etc.). +# Also works with MinGW and Cygwin on Windows. +# Please check msvcbuild.bat for building with MSVC on Windows. +# +# Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h +############################################################################## + +MAJVER= 2 +MINVER= 1 +RELVER= 0 +ABIVER= 5.1 +NODOTABIVER= 51 + +############################################################################## +############################# COMPILER OPTIONS ############################# +############################################################################## +# These options mainly affect the speed of the JIT compiler itself, not the +# speed of the JIT-compiled code. Turn any of the optional settings on by +# removing the '#' in front of them. Make sure you force a full recompile +# with "make clean", followed by "make" if you change any options. +# +DEFAULT_CC = gcc +# +# LuaJIT builds as a native 32 or 64 bit binary by default. +CC= $(DEFAULT_CC) +# +# Use this if you want to force a 32 bit build on a 64 bit multilib OS. +#CC= $(DEFAULT_CC) -m32 +# +# Since the assembler part does NOT maintain a frame pointer, it's pointless +# to slow down the C part by not omitting it. Debugging, tracebacks and +# unwinding are not affected -- the assembler part has frame unwind +# information and GCC emits it where needed (x64) or with -g (see CCDEBUG). +CCOPT= -O2 -fomit-frame-pointer +# Use this if you want to generate a smaller binary (but it's slower): +#CCOPT= -Os -fomit-frame-pointer +# Note: it's no longer recommended to use -O3 with GCC 4.x. +# The I-Cache bloat usually outweighs the benefits from aggressive inlining. +# +# Target-specific compiler options: +# +# x86/x64 only: For GCC 4.2 or higher and if you don't intend to distribute +# the binaries to a different machine you could also use: -march=native +# +CCOPT_x86= -march=i686 -msse -msse2 -mfpmath=sse +CCOPT_x64= +CCOPT_arm= +CCOPT_arm64= +CCOPT_ppc= +CCOPT_mips= +# +CCDEBUG= +# Uncomment the next line to generate debug information: +#CCDEBUG= -g +# +CCWARN= -Wall +# Uncomment the next line to enable more warnings: +#CCWARN+= -Wextra -Wdeclaration-after-statement -Wredundant-decls -Wshadow -Wpointer-arith +# +############################################################################## + +############################################################################## +################################ BUILD MODE ################################ +############################################################################## +# The default build mode is mixed mode on POSIX. On Windows this is the same +# as dynamic mode. +# +# Mixed mode creates a static + dynamic library and a statically linked luajit. +BUILDMODE= mixed +# +# Static mode creates a static library and a statically linked luajit. +#BUILDMODE= static +# +# Dynamic mode creates a dynamic library and a dynamically linked luajit. +# Note: this executable will only run when the library is installed! +#BUILDMODE= dynamic +# +############################################################################## + +############################################################################## +################################# FEATURES ################################# +############################################################################## +# Enable/disable these features as needed, but make sure you force a full +# recompile with "make clean", followed by "make". +XCFLAGS= +# +# Permanently disable the FFI extension to reduce the size of the LuaJIT +# executable. But please consider that the FFI library is compiled-in, +# but NOT loaded by default. It only allocates any memory, if you actually +# make use of it. +#XCFLAGS+= -DLUAJIT_DISABLE_FFI +# +# Features from Lua 5.2 that are unlikely to break existing code are +# enabled by default. Some other features that *might* break some existing +# code (e.g. __pairs or os.execute() return values) can be enabled here. +# Note: this does not provide full compatibility with Lua 5.2 at this time. +#XCFLAGS+= -DLUAJIT_ENABLE_LUA52COMPAT +# +# Disable the JIT compiler, i.e. turn LuaJIT into a pure interpreter. +#XCFLAGS+= -DLUAJIT_DISABLE_JIT +# +# Some architectures (e.g. PPC) can use either single-number (1) or +# dual-number (2) mode. Uncomment one of these lines to override the +# default mode. Please see LJ_ARCH_NUMMODE in lj_arch.h for details. +#XCFLAGS+= -DLUAJIT_NUMMODE=1 +#XCFLAGS+= -DLUAJIT_NUMMODE=2 +# +# Enable GC64 mode for x64. +#XCFLAGS+= -DLUAJIT_ENABLE_GC64 +# +############################################################################## + +############################################################################## +############################ DEBUGGING SUPPORT ############################# +############################################################################## +# Enable these options as needed, but make sure you force a full recompile +# with "make clean", followed by "make". +# Note that most of these are NOT suitable for benchmarking or release mode! +# +# Use the system provided memory allocator (realloc) instead of the +# bundled memory allocator. This is slower, but sometimes helpful for +# debugging. This option cannot be enabled on x64 without GC64, since +# realloc usually doesn't return addresses in the right address range. +# OTOH this option is mandatory for Valgrind's memcheck tool on x64 and +# the only way to get useful results from it for all other architectures. +#XCFLAGS+= -DLUAJIT_USE_SYSMALLOC +# +# This define is required to run LuaJIT under Valgrind. The Valgrind +# header files must be installed. You should enable debug information, too. +# Use --suppressions=lj.supp to avoid some false positives. +#XCFLAGS+= -DLUAJIT_USE_VALGRIND +# +# This is the client for the GDB JIT API. GDB 7.0 or higher is required +# to make use of it. See lj_gdbjit.c for details. Enabling this causes +# a non-negligible overhead, even when not running under GDB. +#XCFLAGS+= -DLUAJIT_USE_GDBJIT +# +# Turn on assertions for the Lua/C API to debug problems with lua_* calls. +# This is rather slow -- use only while developing C libraries/embeddings. +#XCFLAGS+= -DLUA_USE_APICHECK +# +# Turn on assertions for the whole LuaJIT VM. This significantly slows down +# everything. Use only if you suspect a problem with LuaJIT itself. +#XCFLAGS+= -DLUA_USE_ASSERT +# +############################################################################## +# You probably don't need to change anything below this line! +############################################################################## + +############################################################################## +# Host system detection. +############################################################################## + +ifeq (Windows,$(findstring Windows,$(OS))$(MSYSTEM)$(TERM)) + HOST_SYS= Windows + HOST_RM= del +else + HOST_SYS:= $(shell uname -s) + ifneq (,$(findstring MINGW,$(HOST_SYS))) + HOST_SYS= Windows + HOST_MSYS= mingw + endif + ifneq (,$(findstring MSYS,$(HOST_SYS))) + HOST_SYS= Windows + HOST_MSYS= mingw + endif + ifneq (,$(findstring CYGWIN,$(HOST_SYS))) + HOST_SYS= Windows + HOST_MSYS= cygwin + endif +endif + +############################################################################## +# Flags and options for host and target. +############################################################################## + +# You can override the following variables at the make command line: +# CC HOST_CC STATIC_CC DYNAMIC_CC +# CFLAGS HOST_CFLAGS TARGET_CFLAGS +# LDFLAGS HOST_LDFLAGS TARGET_LDFLAGS TARGET_SHLDFLAGS +# LIBS HOST_LIBS TARGET_LIBS +# CROSS HOST_SYS TARGET_SYS TARGET_FLAGS +# +# Cross-compilation examples: +# make HOST_CC="gcc -m32" CROSS=i586-mingw32msvc- TARGET_SYS=Windows +# make HOST_CC="gcc -m32" CROSS=powerpc-linux-gnu- + +ASOPTIONS= $(CCOPT) $(CCWARN) $(XCFLAGS) $(CFLAGS) +CCOPTIONS= $(CCDEBUG) $(ASOPTIONS) +LDOPTIONS= $(CCDEBUG) $(LDFLAGS) + +HOST_CC= $(CC) +HOST_RM?= rm -f +# If left blank, minilua is built and used. You can supply an installed +# copy of (plain) Lua 5.1 or 5.2, plus Lua BitOp. E.g. with: HOST_LUA=lua +HOST_LUA= + +HOST_XCFLAGS= -I. +HOST_XLDFLAGS= +HOST_XLIBS= +HOST_ACFLAGS= $(CCOPTIONS) $(HOST_XCFLAGS) $(TARGET_ARCH) $(HOST_CFLAGS) +HOST_ALDFLAGS= $(LDOPTIONS) $(HOST_XLDFLAGS) $(HOST_LDFLAGS) +HOST_ALIBS= $(HOST_XLIBS) $(LIBS) $(HOST_LIBS) + +STATIC_CC = $(CROSS)$(CC) +DYNAMIC_CC = $(CROSS)$(CC) -fPIC +TARGET_CC= $(STATIC_CC) +TARGET_STCC= $(STATIC_CC) +TARGET_DYNCC= $(DYNAMIC_CC) +TARGET_LD= $(CROSS)$(CC) +TARGET_AR= $(CROSS)ar rcus +TARGET_STRIP= $(CROSS)strip + +TARGET_LIBPATH= $(or $(PREFIX),/usr/local)/$(or $(MULTILIB),lib) +TARGET_SONAME= libluajit-$(ABIVER).so.$(MAJVER) +TARGET_DYLIBNAME= libluajit-$(ABIVER).$(MAJVER).dylib +TARGET_DYLIBPATH= $(TARGET_LIBPATH)/$(TARGET_DYLIBNAME) +TARGET_DLLNAME= lua$(NODOTABIVER).dll +TARGET_XSHLDFLAGS= -shared -fPIC -Wl,-soname,$(TARGET_SONAME) +TARGET_DYNXLDOPTS= + +TARGET_LFSFLAGS= -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE +TARGET_XCFLAGS= $(TARGET_LFSFLAGS) -U_FORTIFY_SOURCE +TARGET_XLDFLAGS= +TARGET_XLIBS= -lm +TARGET_TCFLAGS= $(CCOPTIONS) $(TARGET_XCFLAGS) $(TARGET_FLAGS) $(TARGET_CFLAGS) +TARGET_ACFLAGS= $(CCOPTIONS) $(TARGET_XCFLAGS) $(TARGET_FLAGS) $(TARGET_CFLAGS) +TARGET_ASFLAGS= $(ASOPTIONS) $(TARGET_XCFLAGS) $(TARGET_FLAGS) $(TARGET_CFLAGS) +TARGET_ALDFLAGS= $(LDOPTIONS) $(TARGET_XLDFLAGS) $(TARGET_FLAGS) $(TARGET_LDFLAGS) +TARGET_ASHLDFLAGS= $(LDOPTIONS) $(TARGET_XSHLDFLAGS) $(TARGET_FLAGS) $(TARGET_SHLDFLAGS) +TARGET_ALIBS= $(TARGET_XLIBS) $(LIBS) $(TARGET_LIBS) + +TARGET_TESTARCH=$(shell $(TARGET_CC) $(TARGET_TCFLAGS) -E lj_arch.h -dM) +ifneq (,$(findstring LJ_TARGET_X64 ,$(TARGET_TESTARCH))) + TARGET_LJARCH= x64 +else +ifneq (,$(findstring LJ_TARGET_X86 ,$(TARGET_TESTARCH))) + TARGET_LJARCH= x86 +else +ifneq (,$(findstring LJ_TARGET_ARM ,$(TARGET_TESTARCH))) + TARGET_LJARCH= arm +else +ifneq (,$(findstring LJ_TARGET_ARM64 ,$(TARGET_TESTARCH))) + ifneq (,$(findstring __AARCH64EB__ ,$(TARGET_TESTARCH))) + TARGET_ARCH= -D__AARCH64EB__=1 + endif + TARGET_LJARCH= arm64 +else +ifneq (,$(findstring LJ_TARGET_PPC ,$(TARGET_TESTARCH))) + ifneq (,$(findstring LJ_LE 1,$(TARGET_TESTARCH))) + TARGET_ARCH= -DLJ_ARCH_ENDIAN=LUAJIT_LE + else + TARGET_ARCH= -DLJ_ARCH_ENDIAN=LUAJIT_BE + endif + TARGET_LJARCH= ppc +else +ifneq (,$(findstring LJ_TARGET_MIPS ,$(TARGET_TESTARCH))) + ifneq (,$(findstring MIPSEL ,$(TARGET_TESTARCH))) + TARGET_ARCH= -D__MIPSEL__=1 + endif + ifneq (,$(findstring LJ_TARGET_MIPS64 ,$(TARGET_TESTARCH))) + TARGET_LJARCH= mips64 + else + TARGET_LJARCH= mips + endif +else + $(error Unsupported target architecture) +endif +endif +endif +endif +endif +endif + +ifneq (,$(findstring LJ_TARGET_PS3 1,$(TARGET_TESTARCH))) + TARGET_SYS= PS3 + TARGET_ARCH+= -D__CELLOS_LV2__ + TARGET_XCFLAGS+= -DLUAJIT_USE_SYSMALLOC + TARGET_XLIBS+= -lpthread +endif + +TARGET_XCFLAGS+= $(CCOPT_$(TARGET_LJARCH)) +TARGET_ARCH+= $(patsubst %,-DLUAJIT_TARGET=LUAJIT_ARCH_%,$(TARGET_LJARCH)) + +ifneq (,$(PREFIX)) +ifneq (/usr/local,$(PREFIX)) + TARGET_XCFLAGS+= -DLUA_ROOT=\"$(PREFIX)\" + ifneq (/usr,$(PREFIX)) + TARGET_DYNXLDOPTS= -Wl,-rpath,$(TARGET_LIBPATH) + endif +endif +endif +ifneq (,$(MULTILIB)) + TARGET_XCFLAGS+= -DLUA_MULTILIB=\"$(MULTILIB)\" +endif +ifneq (,$(LMULTILIB)) + TARGET_XCFLAGS+= -DLUA_LMULTILIB=\"$(LMULTILIB)\" +endif + +############################################################################## +# Target system detection. +############################################################################## + +TARGET_SYS?= $(HOST_SYS) +ifeq (Windows,$(TARGET_SYS)) + TARGET_STRIP+= --strip-unneeded + TARGET_XSHLDFLAGS= -shared + TARGET_DYNXLDOPTS= +else + TARGET_AR+= 2>/dev/null +ifeq (,$(shell $(TARGET_CC) -o /dev/null -c -x c /dev/null -fno-stack-protector 2>/dev/null || echo 1)) + TARGET_XCFLAGS+= -fno-stack-protector +endif +ifeq (Darwin,$(TARGET_SYS)) + ifeq (,$(MACOSX_DEPLOYMENT_TARGET)) + export MACOSX_DEPLOYMENT_TARGET=10.4 + endif + TARGET_STRIP+= -x + TARGET_XSHLDFLAGS= -dynamiclib -single_module -undefined dynamic_lookup -fPIC + TARGET_DYNXLDOPTS= + TARGET_XSHLDFLAGS+= -install_name $(TARGET_DYLIBPATH) -compatibility_version $(MAJVER).$(MINVER) -current_version $(MAJVER).$(MINVER).$(RELVER) + ifeq (x64,$(TARGET_LJARCH)) + TARGET_XLDFLAGS+= -pagezero_size 10000 -image_base 100000000 + TARGET_XSHLDFLAGS+= -image_base 7fff04c4a000 + endif +else +ifeq (iOS,$(TARGET_SYS)) + TARGET_STRIP+= -x + TARGET_XSHLDFLAGS= -dynamiclib -single_module -undefined dynamic_lookup -fPIC + TARGET_DYNXLDOPTS= + TARGET_XSHLDFLAGS+= -install_name $(TARGET_DYLIBPATH) -compatibility_version $(MAJVER).$(MINVER) -current_version $(MAJVER).$(MINVER).$(RELVER) + ifeq (arm64,$(TARGET_LJARCH)) + TARGET_XCFLAGS+= -fno-omit-frame-pointer + endif +else + ifneq (SunOS,$(TARGET_SYS)) + ifneq (PS3,$(TARGET_SYS)) + TARGET_XLDFLAGS+= -Wl,-E + endif + endif + ifeq (Linux,$(TARGET_SYS)) + TARGET_XLIBS+= -ldl + endif + ifeq (GNU/kFreeBSD,$(TARGET_SYS)) + TARGET_XLIBS+= -ldl + endif +endif +endif +endif + +ifneq ($(HOST_SYS),$(TARGET_SYS)) + ifeq (Windows,$(TARGET_SYS)) + HOST_XCFLAGS+= -malign-double -DLUAJIT_OS=LUAJIT_OS_WINDOWS + else + ifeq (Linux,$(TARGET_SYS)) + HOST_XCFLAGS+= -DLUAJIT_OS=LUAJIT_OS_LINUX + else + ifeq (Darwin,$(TARGET_SYS)) + HOST_XCFLAGS+= -DLUAJIT_OS=LUAJIT_OS_OSX + else + ifeq (iOS,$(TARGET_SYS)) + HOST_XCFLAGS+= -DLUAJIT_OS=LUAJIT_OS_OSX + else + HOST_XCFLAGS+= -DLUAJIT_OS=LUAJIT_OS_OTHER + endif + endif + endif + endif +endif + +ifneq (,$(CCDEBUG)) + TARGET_STRIP= @: +endif + +############################################################################## +# Files and pathnames. +############################################################################## + +MINILUA_O= host/minilua.o +MINILUA_LIBS= -lm +MINILUA_T= host/minilua +MINILUA_X= $(MINILUA_T) + +ifeq (,$(HOST_LUA)) + HOST_LUA= $(MINILUA_X) + DASM_DEP= $(MINILUA_T) +endif + +DASM_DIR= ../dynasm +DASM= $(HOST_LUA) $(DASM_DIR)/dynasm.lua +DASM_XFLAGS= +DASM_AFLAGS= +DASM_ARCH= $(TARGET_LJARCH) + +ifneq (,$(findstring LJ_LE 1,$(TARGET_TESTARCH))) + DASM_AFLAGS+= -D ENDIAN_LE +else + DASM_AFLAGS+= -D ENDIAN_BE +endif +ifneq (,$(findstring LJ_ARCH_BITS 64,$(TARGET_TESTARCH))) + DASM_AFLAGS+= -D P64 +endif +ifneq (,$(findstring LJ_HASJIT 1,$(TARGET_TESTARCH))) + DASM_AFLAGS+= -D JIT +endif +ifneq (,$(findstring LJ_HASFFI 1,$(TARGET_TESTARCH))) + DASM_AFLAGS+= -D FFI +endif +ifneq (,$(findstring LJ_DUALNUM 1,$(TARGET_TESTARCH))) + DASM_AFLAGS+= -D DUALNUM +endif +ifneq (,$(findstring LJ_ARCH_HASFPU 1,$(TARGET_TESTARCH))) + DASM_AFLAGS+= -D FPU + TARGET_ARCH+= -DLJ_ARCH_HASFPU=1 +else + TARGET_ARCH+= -DLJ_ARCH_HASFPU=0 +endif +ifeq (,$(findstring LJ_ABI_SOFTFP 1,$(TARGET_TESTARCH))) + DASM_AFLAGS+= -D HFABI + TARGET_ARCH+= -DLJ_ABI_SOFTFP=0 +else + TARGET_ARCH+= -DLJ_ABI_SOFTFP=1 +endif +ifneq (,$(findstring LJ_NO_UNWIND 1,$(TARGET_TESTARCH))) + DASM_AFLAGS+= -D NO_UNWIND + TARGET_ARCH+= -DLUAJIT_NO_UNWIND +endif +DASM_AFLAGS+= -D VER=$(subst LJ_ARCH_VERSION_,,$(filter LJ_ARCH_VERSION_%,$(subst LJ_ARCH_VERSION ,LJ_ARCH_VERSION_,$(TARGET_TESTARCH)))) +ifeq (Windows,$(TARGET_SYS)) + DASM_AFLAGS+= -D WIN +endif +ifeq (x64,$(TARGET_LJARCH)) + ifeq (,$(findstring LJ_FR2 1,$(TARGET_TESTARCH))) + DASM_ARCH= x86 + endif +else +ifeq (arm,$(TARGET_LJARCH)) + ifeq (iOS,$(TARGET_SYS)) + DASM_AFLAGS+= -D IOS + endif +else +ifeq (ppc,$(TARGET_LJARCH)) + ifneq (,$(findstring LJ_ARCH_SQRT 1,$(TARGET_TESTARCH))) + DASM_AFLAGS+= -D SQRT + endif + ifneq (,$(findstring LJ_ARCH_ROUND 1,$(TARGET_TESTARCH))) + DASM_AFLAGS+= -D ROUND + endif + ifneq (,$(findstring LJ_ARCH_PPC32ON64 1,$(TARGET_TESTARCH))) + DASM_AFLAGS+= -D GPR64 + endif + ifeq (PS3,$(TARGET_SYS)) + DASM_AFLAGS+= -D PPE -D TOC + endif + ifneq (,$(findstring LJ_ARCH_PPC64 ,$(TARGET_TESTARCH))) + DASM_ARCH= ppc64 + endif +endif +endif +endif + +DASM_FLAGS= $(DASM_XFLAGS) $(DASM_AFLAGS) +DASM_DASC= vm_$(DASM_ARCH).dasc + +BUILDVM_O= host/buildvm.o host/buildvm_asm.o host/buildvm_peobj.o \ + host/buildvm_lib.o host/buildvm_fold.o +BUILDVM_T= host/buildvm +BUILDVM_X= $(BUILDVM_T) + +HOST_O= $(MINILUA_O) $(BUILDVM_O) +HOST_T= $(MINILUA_T) $(BUILDVM_T) + +LJVM_S= lj_vm.S +LJVM_O= lj_vm.o +LJVM_BOUT= $(LJVM_S) +LJVM_MODE= elfasm + +LJLIB_O= lib_base.o lib_math.o lib_bit.o lib_string.o lib_table.o \ + lib_io.o lib_os.o lib_package.o lib_debug.o lib_jit.o lib_ffi.o +LJLIB_C= $(LJLIB_O:.o=.c) + +LJCORE_O= lj_gc.o lj_err.o lj_char.o lj_bc.o lj_obj.o lj_buf.o \ + lj_str.o lj_tab.o lj_func.o lj_udata.o lj_meta.o lj_debug.o \ + lj_state.o lj_dispatch.o lj_vmevent.o lj_vmmath.o lj_strscan.o \ + lj_strfmt.o lj_strfmt_num.o lj_api.o lj_profile.o \ + lj_lex.o lj_parse.o lj_bcread.o lj_bcwrite.o lj_load.o \ + lj_ir.o lj_opt_mem.o lj_opt_fold.o lj_opt_narrow.o \ + lj_opt_dce.o lj_opt_loop.o lj_opt_split.o lj_opt_sink.o \ + lj_mcode.o lj_snap.o lj_record.o lj_crecord.o lj_ffrecord.o \ + lj_asm.o lj_trace.o lj_gdbjit.o \ + lj_ctype.o lj_cdata.o lj_cconv.o lj_ccall.o lj_ccallback.o \ + lj_carith.o lj_clib.o lj_cparse.o \ + lj_lib.o lj_alloc.o lib_aux.o \ + $(LJLIB_O) lib_init.o + +LJVMCORE_O= $(LJVM_O) $(LJCORE_O) +LJVMCORE_DYNO= $(LJVMCORE_O:.o=_dyn.o) + +LIB_VMDEF= jit/vmdef.lua +LIB_VMDEFP= $(LIB_VMDEF) + +LUAJIT_O= luajit.o +LUAJIT_A= libluajit.a +LUAJIT_SO= libluajit.so +LUAJIT_T= luajit + +ALL_T= $(LUAJIT_T) $(LUAJIT_A) $(LUAJIT_SO) $(HOST_T) +ALL_HDRGEN= lj_bcdef.h lj_ffdef.h lj_libdef.h lj_recdef.h lj_folddef.h \ + host/buildvm_arch.h +ALL_GEN= $(LJVM_S) $(ALL_HDRGEN) $(LIB_VMDEFP) +WIN_RM= *.obj *.lib *.exp *.dll *.exe *.manifest *.pdb *.ilk +ALL_RM= $(ALL_T) $(ALL_GEN) *.o host/*.o $(WIN_RM) + +############################################################################## +# Build mode handling. +############################################################################## + +# Mixed mode defaults. +TARGET_O= $(LUAJIT_A) +TARGET_T= $(LUAJIT_T) $(LUAJIT_SO) +TARGET_DEP= $(LIB_VMDEF) $(LUAJIT_SO) + +ifeq (Windows,$(TARGET_SYS)) + TARGET_DYNCC= $(STATIC_CC) + LJVM_MODE= peobj + LJVM_BOUT= $(LJVM_O) + LUAJIT_T= luajit.exe + ifeq (cygwin,$(HOST_MSYS)) + LUAJIT_SO= cyg$(TARGET_DLLNAME) + else + LUAJIT_SO= $(TARGET_DLLNAME) + endif + # Mixed mode is not supported on Windows. And static mode doesn't work well. + # C modules cannot be loaded, because they bind to lua51.dll. + ifneq (static,$(BUILDMODE)) + BUILDMODE= dynamic + TARGET_XCFLAGS+= -DLUA_BUILD_AS_DLL + endif +endif +ifeq (Darwin,$(TARGET_SYS)) + LJVM_MODE= machasm +endif +ifeq (iOS,$(TARGET_SYS)) + LJVM_MODE= machasm +endif +ifeq (SunOS,$(TARGET_SYS)) + BUILDMODE= static +endif +ifeq (PS3,$(TARGET_SYS)) + BUILDMODE= static +endif + +ifeq (Windows,$(HOST_SYS)) + MINILUA_T= host/minilua.exe + BUILDVM_T= host/buildvm.exe + ifeq (,$(HOST_MSYS)) + MINILUA_X= host\minilua + BUILDVM_X= host\buildvm + ALL_RM:= $(subst /,\,$(ALL_RM)) + endif +endif + +ifeq (static,$(BUILDMODE)) + TARGET_DYNCC= @: + TARGET_T= $(LUAJIT_T) + TARGET_DEP= $(LIB_VMDEF) +else +ifeq (dynamic,$(BUILDMODE)) + ifneq (Windows,$(TARGET_SYS)) + TARGET_CC= $(DYNAMIC_CC) + endif + TARGET_DYNCC= @: + LJVMCORE_DYNO= $(LJVMCORE_O) + TARGET_O= $(LUAJIT_SO) + TARGET_XLDFLAGS+= $(TARGET_DYNXLDOPTS) +else +ifeq (Darwin,$(TARGET_SYS)) + TARGET_DYNCC= @: + LJVMCORE_DYNO= $(LJVMCORE_O) +endif +ifeq (iOS,$(TARGET_SYS)) + TARGET_DYNCC= @: + LJVMCORE_DYNO= $(LJVMCORE_O) +endif +endif +endif + +Q= @ +E= @echo +#Q= +#E= @: + +############################################################################## +# Make targets. +############################################################################## + +default all: $(TARGET_T) + +amalg: + @grep "^[+|]" ljamalg.c + $(MAKE) all "LJCORE_O=ljamalg.o" + +clean: + $(HOST_RM) $(ALL_RM) + +libbc: + ./$(LUAJIT_T) host/genlibbc.lua -o host/buildvm_libbc.h $(LJLIB_C) + $(MAKE) all + +depend: + @for file in $(ALL_HDRGEN); do \ + test -f $$file || touch $$file; \ + done + @$(HOST_CC) $(HOST_ACFLAGS) -MM *.c host/*.c | \ + sed -e "s| [^ ]*/dasm_\S*\.h||g" \ + -e "s|^\([^l ]\)|host/\1|" \ + -e "s| lj_target_\S*\.h| lj_target_*.h|g" \ + -e "s| lj_emit_\S*\.h| lj_emit_*.h|g" \ + -e "s| lj_asm_\S*\.h| lj_asm_*.h|g" >Makefile.dep + @for file in $(ALL_HDRGEN); do \ + test -s $$file || $(HOST_RM) $$file; \ + done + +.PHONY: default all amalg clean libbc depend + +############################################################################## +# Rules for generated files. +############################################################################## + +$(MINILUA_T): $(MINILUA_O) + $(E) "HOSTLINK $@" + $(Q)$(HOST_CC) $(HOST_ALDFLAGS) -o $@ $(MINILUA_O) $(MINILUA_LIBS) $(HOST_ALIBS) + +host/buildvm_arch.h: $(DASM_DASC) $(DASM_DEP) $(DASM_DIR)/*.lua + $(E) "DYNASM $@" + $(Q)$(DASM) $(DASM_FLAGS) -o $@ $(DASM_DASC) + +host/buildvm.o: $(DASM_DIR)/dasm_*.h + +$(BUILDVM_T): $(BUILDVM_O) + $(E) "HOSTLINK $@" + $(Q)$(HOST_CC) $(HOST_ALDFLAGS) -o $@ $(BUILDVM_O) $(HOST_ALIBS) + +$(LJVM_BOUT): $(BUILDVM_T) + $(E) "BUILDVM $@" + $(Q)$(BUILDVM_X) -m $(LJVM_MODE) -o $@ + +lj_bcdef.h: $(BUILDVM_T) $(LJLIB_C) + $(E) "BUILDVM $@" + $(Q)$(BUILDVM_X) -m bcdef -o $@ $(LJLIB_C) + +lj_ffdef.h: $(BUILDVM_T) $(LJLIB_C) + $(E) "BUILDVM $@" + $(Q)$(BUILDVM_X) -m ffdef -o $@ $(LJLIB_C) + +lj_libdef.h: $(BUILDVM_T) $(LJLIB_C) + $(E) "BUILDVM $@" + $(Q)$(BUILDVM_X) -m libdef -o $@ $(LJLIB_C) + +lj_recdef.h: $(BUILDVM_T) $(LJLIB_C) + $(E) "BUILDVM $@" + $(Q)$(BUILDVM_X) -m recdef -o $@ $(LJLIB_C) + +$(LIB_VMDEF): $(BUILDVM_T) $(LJLIB_C) + $(E) "BUILDVM $@" + $(Q)$(BUILDVM_X) -m vmdef -o $(LIB_VMDEFP) $(LJLIB_C) + +lj_folddef.h: $(BUILDVM_T) lj_opt_fold.c + $(E) "BUILDVM $@" + $(Q)$(BUILDVM_X) -m folddef -o $@ lj_opt_fold.c + +############################################################################## +# Object file rules. +############################################################################## + +%.o: %.c + $(E) "CC $@" + $(Q)$(TARGET_DYNCC) $(TARGET_ACFLAGS) -c -o $(@:.o=_dyn.o) $< + $(Q)$(TARGET_CC) $(TARGET_ACFLAGS) -c -o $@ $< + +%.o: %.S + $(E) "ASM $@" + $(Q)$(TARGET_DYNCC) $(TARGET_ASFLAGS) -c -o $(@:.o=_dyn.o) $< + $(Q)$(TARGET_CC) $(TARGET_ASFLAGS) -c -o $@ $< + +$(LUAJIT_O): + $(E) "CC $@" + $(Q)$(TARGET_STCC) $(TARGET_ACFLAGS) -c -o $@ $< + +$(HOST_O): %.o: %.c + $(E) "HOSTCC $@" + $(Q)$(HOST_CC) $(HOST_ACFLAGS) -c -o $@ $< + +include Makefile.dep + +############################################################################## +# Target file rules. +############################################################################## + +$(LUAJIT_A): $(LJVMCORE_O) + $(E) "AR $@" + $(Q)$(TARGET_AR) $@ $(LJVMCORE_O) + +# The dependency on _O, but linking with _DYNO is intentional. +$(LUAJIT_SO): $(LJVMCORE_O) + $(E) "DYNLINK $@" + $(Q)$(TARGET_LD) $(TARGET_ASHLDFLAGS) -o $@ $(LJVMCORE_DYNO) $(TARGET_ALIBS) + $(Q)$(TARGET_STRIP) $@ + +$(LUAJIT_T): $(TARGET_O) $(LUAJIT_O) $(TARGET_DEP) + $(E) "LINK $@" + $(Q)$(TARGET_LD) $(TARGET_ALDFLAGS) -o $@ $(LUAJIT_O) $(TARGET_O) $(TARGET_ALIBS) + $(Q)$(TARGET_STRIP) $@ + $(E) "OK Successfully built LuaJIT" + +############################################################################## diff --git a/lib/LuaJIT/Makefile.dep b/lib/LuaJIT/src/Makefile.dep similarity index 100% rename from lib/LuaJIT/Makefile.dep rename to lib/LuaJIT/src/Makefile.dep diff --git a/lib/LuaJIT/host/.gitignore b/lib/LuaJIT/src/host/.gitignore similarity index 100% rename from lib/LuaJIT/host/.gitignore rename to lib/LuaJIT/src/host/.gitignore diff --git a/lib/LuaJIT/host/README b/lib/LuaJIT/src/host/README similarity index 100% rename from lib/LuaJIT/host/README rename to lib/LuaJIT/src/host/README diff --git a/lib/LuaJIT/host/buildvm.c b/lib/LuaJIT/src/host/buildvm.c similarity index 100% rename from lib/LuaJIT/host/buildvm.c rename to lib/LuaJIT/src/host/buildvm.c diff --git a/lib/LuaJIT/host/buildvm.h b/lib/LuaJIT/src/host/buildvm.h similarity index 100% rename from lib/LuaJIT/host/buildvm.h rename to lib/LuaJIT/src/host/buildvm.h diff --git a/lib/LuaJIT/host/buildvm_asm.c b/lib/LuaJIT/src/host/buildvm_asm.c similarity index 100% rename from lib/LuaJIT/host/buildvm_asm.c rename to lib/LuaJIT/src/host/buildvm_asm.c diff --git a/lib/LuaJIT/host/buildvm_fold.c b/lib/LuaJIT/src/host/buildvm_fold.c similarity index 100% rename from lib/LuaJIT/host/buildvm_fold.c rename to lib/LuaJIT/src/host/buildvm_fold.c diff --git a/lib/LuaJIT/host/buildvm_lib.c b/lib/LuaJIT/src/host/buildvm_lib.c similarity index 100% rename from lib/LuaJIT/host/buildvm_lib.c rename to lib/LuaJIT/src/host/buildvm_lib.c diff --git a/lib/LuaJIT/host/buildvm_libbc.h b/lib/LuaJIT/src/host/buildvm_libbc.h similarity index 100% rename from lib/LuaJIT/host/buildvm_libbc.h rename to lib/LuaJIT/src/host/buildvm_libbc.h diff --git a/lib/LuaJIT/host/buildvm_peobj.c b/lib/LuaJIT/src/host/buildvm_peobj.c similarity index 100% rename from lib/LuaJIT/host/buildvm_peobj.c rename to lib/LuaJIT/src/host/buildvm_peobj.c diff --git a/lib/LuaJIT/host/genlibbc.lua b/lib/LuaJIT/src/host/genlibbc.lua similarity index 100% rename from lib/LuaJIT/host/genlibbc.lua rename to lib/LuaJIT/src/host/genlibbc.lua diff --git a/lib/LuaJIT/host/genminilua.lua b/lib/LuaJIT/src/host/genminilua.lua similarity index 100% rename from lib/LuaJIT/host/genminilua.lua rename to lib/LuaJIT/src/host/genminilua.lua diff --git a/lib/LuaJIT/host/minilua.c b/lib/LuaJIT/src/host/minilua.c similarity index 100% rename from lib/LuaJIT/host/minilua.c rename to lib/LuaJIT/src/host/minilua.c diff --git a/lib/LuaJIT/jit/.gitignore b/lib/LuaJIT/src/jit/.gitignore similarity index 100% rename from lib/LuaJIT/jit/.gitignore rename to lib/LuaJIT/src/jit/.gitignore diff --git a/lib/LuaJIT/jit/bc.lua b/lib/LuaJIT/src/jit/bc.lua similarity index 100% rename from lib/LuaJIT/jit/bc.lua rename to lib/LuaJIT/src/jit/bc.lua diff --git a/lib/LuaJIT/jit/bcsave.lua b/lib/LuaJIT/src/jit/bcsave.lua similarity index 100% rename from lib/LuaJIT/jit/bcsave.lua rename to lib/LuaJIT/src/jit/bcsave.lua diff --git a/lib/LuaJIT/jit/dis_arm.lua b/lib/LuaJIT/src/jit/dis_arm.lua similarity index 100% rename from lib/LuaJIT/jit/dis_arm.lua rename to lib/LuaJIT/src/jit/dis_arm.lua diff --git a/lib/LuaJIT/jit/dis_arm64.lua b/lib/LuaJIT/src/jit/dis_arm64.lua similarity index 100% rename from lib/LuaJIT/jit/dis_arm64.lua rename to lib/LuaJIT/src/jit/dis_arm64.lua diff --git a/lib/LuaJIT/jit/dis_arm64be.lua b/lib/LuaJIT/src/jit/dis_arm64be.lua similarity index 100% rename from lib/LuaJIT/jit/dis_arm64be.lua rename to lib/LuaJIT/src/jit/dis_arm64be.lua diff --git a/lib/LuaJIT/jit/dis_mips.lua b/lib/LuaJIT/src/jit/dis_mips.lua similarity index 100% rename from lib/LuaJIT/jit/dis_mips.lua rename to lib/LuaJIT/src/jit/dis_mips.lua diff --git a/lib/LuaJIT/jit/dis_mips64.lua b/lib/LuaJIT/src/jit/dis_mips64.lua similarity index 100% rename from lib/LuaJIT/jit/dis_mips64.lua rename to lib/LuaJIT/src/jit/dis_mips64.lua diff --git a/lib/LuaJIT/jit/dis_mips64el.lua b/lib/LuaJIT/src/jit/dis_mips64el.lua similarity index 100% rename from lib/LuaJIT/jit/dis_mips64el.lua rename to lib/LuaJIT/src/jit/dis_mips64el.lua diff --git a/lib/LuaJIT/jit/dis_mipsel.lua b/lib/LuaJIT/src/jit/dis_mipsel.lua similarity index 100% rename from lib/LuaJIT/jit/dis_mipsel.lua rename to lib/LuaJIT/src/jit/dis_mipsel.lua diff --git a/lib/LuaJIT/jit/dis_ppc.lua b/lib/LuaJIT/src/jit/dis_ppc.lua similarity index 100% rename from lib/LuaJIT/jit/dis_ppc.lua rename to lib/LuaJIT/src/jit/dis_ppc.lua diff --git a/lib/LuaJIT/jit/dis_x64.lua b/lib/LuaJIT/src/jit/dis_x64.lua similarity index 100% rename from lib/LuaJIT/jit/dis_x64.lua rename to lib/LuaJIT/src/jit/dis_x64.lua diff --git a/lib/LuaJIT/jit/dis_x86.lua b/lib/LuaJIT/src/jit/dis_x86.lua similarity index 100% rename from lib/LuaJIT/jit/dis_x86.lua rename to lib/LuaJIT/src/jit/dis_x86.lua diff --git a/lib/LuaJIT/jit/dump.lua b/lib/LuaJIT/src/jit/dump.lua similarity index 100% rename from lib/LuaJIT/jit/dump.lua rename to lib/LuaJIT/src/jit/dump.lua diff --git a/lib/LuaJIT/jit/p.lua b/lib/LuaJIT/src/jit/p.lua similarity index 100% rename from lib/LuaJIT/jit/p.lua rename to lib/LuaJIT/src/jit/p.lua diff --git a/lib/LuaJIT/jit/v.lua b/lib/LuaJIT/src/jit/v.lua similarity index 100% rename from lib/LuaJIT/jit/v.lua rename to lib/LuaJIT/src/jit/v.lua diff --git a/lib/LuaJIT/jit/zone.lua b/lib/LuaJIT/src/jit/zone.lua similarity index 100% rename from lib/LuaJIT/jit/zone.lua rename to lib/LuaJIT/src/jit/zone.lua diff --git a/lib/LuaJIT/lauxlib.h b/lib/LuaJIT/src/lauxlib.h similarity index 100% rename from lib/LuaJIT/lauxlib.h rename to lib/LuaJIT/src/lauxlib.h diff --git a/lib/LuaJIT/lib_aux.c b/lib/LuaJIT/src/lib_aux.c similarity index 100% rename from lib/LuaJIT/lib_aux.c rename to lib/LuaJIT/src/lib_aux.c diff --git a/lib/LuaJIT/lib_base.c b/lib/LuaJIT/src/lib_base.c similarity index 100% rename from lib/LuaJIT/lib_base.c rename to lib/LuaJIT/src/lib_base.c diff --git a/lib/LuaJIT/lib_bit.c b/lib/LuaJIT/src/lib_bit.c similarity index 100% rename from lib/LuaJIT/lib_bit.c rename to lib/LuaJIT/src/lib_bit.c diff --git a/lib/LuaJIT/lib_debug.c b/lib/LuaJIT/src/lib_debug.c similarity index 100% rename from lib/LuaJIT/lib_debug.c rename to lib/LuaJIT/src/lib_debug.c diff --git a/lib/LuaJIT/lib_ffi.c b/lib/LuaJIT/src/lib_ffi.c similarity index 100% rename from lib/LuaJIT/lib_ffi.c rename to lib/LuaJIT/src/lib_ffi.c diff --git a/lib/LuaJIT/lib_init.c b/lib/LuaJIT/src/lib_init.c similarity index 100% rename from lib/LuaJIT/lib_init.c rename to lib/LuaJIT/src/lib_init.c diff --git a/lib/LuaJIT/lib_io.c b/lib/LuaJIT/src/lib_io.c similarity index 100% rename from lib/LuaJIT/lib_io.c rename to lib/LuaJIT/src/lib_io.c diff --git a/lib/LuaJIT/lib_jit.c b/lib/LuaJIT/src/lib_jit.c similarity index 100% rename from lib/LuaJIT/lib_jit.c rename to lib/LuaJIT/src/lib_jit.c diff --git a/lib/LuaJIT/lib_math.c b/lib/LuaJIT/src/lib_math.c similarity index 100% rename from lib/LuaJIT/lib_math.c rename to lib/LuaJIT/src/lib_math.c diff --git a/lib/LuaJIT/lib_os.c b/lib/LuaJIT/src/lib_os.c similarity index 100% rename from lib/LuaJIT/lib_os.c rename to lib/LuaJIT/src/lib_os.c diff --git a/lib/LuaJIT/lib_package.c b/lib/LuaJIT/src/lib_package.c similarity index 100% rename from lib/LuaJIT/lib_package.c rename to lib/LuaJIT/src/lib_package.c diff --git a/lib/LuaJIT/lib_string.c b/lib/LuaJIT/src/lib_string.c similarity index 100% rename from lib/LuaJIT/lib_string.c rename to lib/LuaJIT/src/lib_string.c diff --git a/lib/LuaJIT/lib_table.c b/lib/LuaJIT/src/lib_table.c similarity index 100% rename from lib/LuaJIT/lib_table.c rename to lib/LuaJIT/src/lib_table.c diff --git a/lib/LuaJIT/lj.supp b/lib/LuaJIT/src/lj.supp similarity index 100% rename from lib/LuaJIT/lj.supp rename to lib/LuaJIT/src/lj.supp diff --git a/lib/LuaJIT/lj_alloc.c b/lib/LuaJIT/src/lj_alloc.c similarity index 100% rename from lib/LuaJIT/lj_alloc.c rename to lib/LuaJIT/src/lj_alloc.c diff --git a/lib/LuaJIT/lj_alloc.h b/lib/LuaJIT/src/lj_alloc.h similarity index 100% rename from lib/LuaJIT/lj_alloc.h rename to lib/LuaJIT/src/lj_alloc.h diff --git a/lib/LuaJIT/lj_api.c b/lib/LuaJIT/src/lj_api.c similarity index 100% rename from lib/LuaJIT/lj_api.c rename to lib/LuaJIT/src/lj_api.c diff --git a/lib/LuaJIT/lj_arch.h b/lib/LuaJIT/src/lj_arch.h similarity index 100% rename from lib/LuaJIT/lj_arch.h rename to lib/LuaJIT/src/lj_arch.h diff --git a/lib/LuaJIT/lj_asm.c b/lib/LuaJIT/src/lj_asm.c similarity index 100% rename from lib/LuaJIT/lj_asm.c rename to lib/LuaJIT/src/lj_asm.c diff --git a/lib/LuaJIT/lj_asm.h b/lib/LuaJIT/src/lj_asm.h similarity index 100% rename from lib/LuaJIT/lj_asm.h rename to lib/LuaJIT/src/lj_asm.h diff --git a/lib/LuaJIT/lj_asm_arm.h b/lib/LuaJIT/src/lj_asm_arm.h similarity index 100% rename from lib/LuaJIT/lj_asm_arm.h rename to lib/LuaJIT/src/lj_asm_arm.h diff --git a/lib/LuaJIT/lj_asm_arm64.h b/lib/LuaJIT/src/lj_asm_arm64.h similarity index 100% rename from lib/LuaJIT/lj_asm_arm64.h rename to lib/LuaJIT/src/lj_asm_arm64.h diff --git a/lib/LuaJIT/lj_asm_mips.h b/lib/LuaJIT/src/lj_asm_mips.h similarity index 100% rename from lib/LuaJIT/lj_asm_mips.h rename to lib/LuaJIT/src/lj_asm_mips.h diff --git a/lib/LuaJIT/lj_asm_ppc.h b/lib/LuaJIT/src/lj_asm_ppc.h similarity index 100% rename from lib/LuaJIT/lj_asm_ppc.h rename to lib/LuaJIT/src/lj_asm_ppc.h diff --git a/lib/LuaJIT/lj_asm_x86.h b/lib/LuaJIT/src/lj_asm_x86.h similarity index 100% rename from lib/LuaJIT/lj_asm_x86.h rename to lib/LuaJIT/src/lj_asm_x86.h diff --git a/lib/LuaJIT/lj_bc.c b/lib/LuaJIT/src/lj_bc.c similarity index 100% rename from lib/LuaJIT/lj_bc.c rename to lib/LuaJIT/src/lj_bc.c diff --git a/lib/LuaJIT/lj_bc.h b/lib/LuaJIT/src/lj_bc.h similarity index 100% rename from lib/LuaJIT/lj_bc.h rename to lib/LuaJIT/src/lj_bc.h diff --git a/lib/LuaJIT/lj_bcdump.h b/lib/LuaJIT/src/lj_bcdump.h similarity index 100% rename from lib/LuaJIT/lj_bcdump.h rename to lib/LuaJIT/src/lj_bcdump.h diff --git a/lib/LuaJIT/lj_bcread.c b/lib/LuaJIT/src/lj_bcread.c similarity index 100% rename from lib/LuaJIT/lj_bcread.c rename to lib/LuaJIT/src/lj_bcread.c diff --git a/lib/LuaJIT/lj_bcwrite.c b/lib/LuaJIT/src/lj_bcwrite.c similarity index 100% rename from lib/LuaJIT/lj_bcwrite.c rename to lib/LuaJIT/src/lj_bcwrite.c diff --git a/lib/LuaJIT/lj_buf.c b/lib/LuaJIT/src/lj_buf.c similarity index 100% rename from lib/LuaJIT/lj_buf.c rename to lib/LuaJIT/src/lj_buf.c diff --git a/lib/LuaJIT/lj_buf.h b/lib/LuaJIT/src/lj_buf.h similarity index 100% rename from lib/LuaJIT/lj_buf.h rename to lib/LuaJIT/src/lj_buf.h diff --git a/lib/LuaJIT/lj_carith.c b/lib/LuaJIT/src/lj_carith.c similarity index 100% rename from lib/LuaJIT/lj_carith.c rename to lib/LuaJIT/src/lj_carith.c diff --git a/lib/LuaJIT/lj_carith.h b/lib/LuaJIT/src/lj_carith.h similarity index 100% rename from lib/LuaJIT/lj_carith.h rename to lib/LuaJIT/src/lj_carith.h diff --git a/lib/LuaJIT/lj_ccall.c b/lib/LuaJIT/src/lj_ccall.c similarity index 100% rename from lib/LuaJIT/lj_ccall.c rename to lib/LuaJIT/src/lj_ccall.c diff --git a/lib/LuaJIT/lj_ccall.h b/lib/LuaJIT/src/lj_ccall.h similarity index 100% rename from lib/LuaJIT/lj_ccall.h rename to lib/LuaJIT/src/lj_ccall.h diff --git a/lib/LuaJIT/lj_ccallback.c b/lib/LuaJIT/src/lj_ccallback.c similarity index 100% rename from lib/LuaJIT/lj_ccallback.c rename to lib/LuaJIT/src/lj_ccallback.c diff --git a/lib/LuaJIT/lj_ccallback.h b/lib/LuaJIT/src/lj_ccallback.h similarity index 100% rename from lib/LuaJIT/lj_ccallback.h rename to lib/LuaJIT/src/lj_ccallback.h diff --git a/lib/LuaJIT/lj_cconv.c b/lib/LuaJIT/src/lj_cconv.c similarity index 100% rename from lib/LuaJIT/lj_cconv.c rename to lib/LuaJIT/src/lj_cconv.c diff --git a/lib/LuaJIT/lj_cconv.h b/lib/LuaJIT/src/lj_cconv.h similarity index 100% rename from lib/LuaJIT/lj_cconv.h rename to lib/LuaJIT/src/lj_cconv.h diff --git a/lib/LuaJIT/lj_cdata.c b/lib/LuaJIT/src/lj_cdata.c similarity index 100% rename from lib/LuaJIT/lj_cdata.c rename to lib/LuaJIT/src/lj_cdata.c diff --git a/lib/LuaJIT/lj_cdata.h b/lib/LuaJIT/src/lj_cdata.h similarity index 100% rename from lib/LuaJIT/lj_cdata.h rename to lib/LuaJIT/src/lj_cdata.h diff --git a/lib/LuaJIT/lj_char.c b/lib/LuaJIT/src/lj_char.c similarity index 100% rename from lib/LuaJIT/lj_char.c rename to lib/LuaJIT/src/lj_char.c diff --git a/lib/LuaJIT/lj_char.h b/lib/LuaJIT/src/lj_char.h similarity index 100% rename from lib/LuaJIT/lj_char.h rename to lib/LuaJIT/src/lj_char.h diff --git a/lib/LuaJIT/lj_clib.c b/lib/LuaJIT/src/lj_clib.c similarity index 100% rename from lib/LuaJIT/lj_clib.c rename to lib/LuaJIT/src/lj_clib.c diff --git a/lib/LuaJIT/lj_clib.h b/lib/LuaJIT/src/lj_clib.h similarity index 100% rename from lib/LuaJIT/lj_clib.h rename to lib/LuaJIT/src/lj_clib.h diff --git a/lib/LuaJIT/lj_cparse.c b/lib/LuaJIT/src/lj_cparse.c similarity index 100% rename from lib/LuaJIT/lj_cparse.c rename to lib/LuaJIT/src/lj_cparse.c diff --git a/lib/LuaJIT/lj_cparse.h b/lib/LuaJIT/src/lj_cparse.h similarity index 100% rename from lib/LuaJIT/lj_cparse.h rename to lib/LuaJIT/src/lj_cparse.h diff --git a/lib/LuaJIT/lj_crecord.c b/lib/LuaJIT/src/lj_crecord.c similarity index 100% rename from lib/LuaJIT/lj_crecord.c rename to lib/LuaJIT/src/lj_crecord.c diff --git a/lib/LuaJIT/lj_crecord.h b/lib/LuaJIT/src/lj_crecord.h similarity index 100% rename from lib/LuaJIT/lj_crecord.h rename to lib/LuaJIT/src/lj_crecord.h diff --git a/lib/LuaJIT/lj_ctype.c b/lib/LuaJIT/src/lj_ctype.c similarity index 100% rename from lib/LuaJIT/lj_ctype.c rename to lib/LuaJIT/src/lj_ctype.c diff --git a/lib/LuaJIT/lj_ctype.h b/lib/LuaJIT/src/lj_ctype.h similarity index 100% rename from lib/LuaJIT/lj_ctype.h rename to lib/LuaJIT/src/lj_ctype.h diff --git a/lib/LuaJIT/lj_debug.c b/lib/LuaJIT/src/lj_debug.c similarity index 100% rename from lib/LuaJIT/lj_debug.c rename to lib/LuaJIT/src/lj_debug.c diff --git a/lib/LuaJIT/lj_debug.h b/lib/LuaJIT/src/lj_debug.h similarity index 100% rename from lib/LuaJIT/lj_debug.h rename to lib/LuaJIT/src/lj_debug.h diff --git a/lib/LuaJIT/lj_def.h b/lib/LuaJIT/src/lj_def.h similarity index 100% rename from lib/LuaJIT/lj_def.h rename to lib/LuaJIT/src/lj_def.h diff --git a/lib/LuaJIT/lj_dispatch.c b/lib/LuaJIT/src/lj_dispatch.c similarity index 100% rename from lib/LuaJIT/lj_dispatch.c rename to lib/LuaJIT/src/lj_dispatch.c diff --git a/lib/LuaJIT/lj_dispatch.h b/lib/LuaJIT/src/lj_dispatch.h similarity index 100% rename from lib/LuaJIT/lj_dispatch.h rename to lib/LuaJIT/src/lj_dispatch.h diff --git a/lib/LuaJIT/lj_emit_arm.h b/lib/LuaJIT/src/lj_emit_arm.h similarity index 100% rename from lib/LuaJIT/lj_emit_arm.h rename to lib/LuaJIT/src/lj_emit_arm.h diff --git a/lib/LuaJIT/lj_emit_arm64.h b/lib/LuaJIT/src/lj_emit_arm64.h similarity index 100% rename from lib/LuaJIT/lj_emit_arm64.h rename to lib/LuaJIT/src/lj_emit_arm64.h diff --git a/lib/LuaJIT/lj_emit_mips.h b/lib/LuaJIT/src/lj_emit_mips.h similarity index 100% rename from lib/LuaJIT/lj_emit_mips.h rename to lib/LuaJIT/src/lj_emit_mips.h diff --git a/lib/LuaJIT/lj_emit_ppc.h b/lib/LuaJIT/src/lj_emit_ppc.h similarity index 100% rename from lib/LuaJIT/lj_emit_ppc.h rename to lib/LuaJIT/src/lj_emit_ppc.h diff --git a/lib/LuaJIT/lj_emit_x86.h b/lib/LuaJIT/src/lj_emit_x86.h similarity index 100% rename from lib/LuaJIT/lj_emit_x86.h rename to lib/LuaJIT/src/lj_emit_x86.h diff --git a/lib/LuaJIT/lj_err.c b/lib/LuaJIT/src/lj_err.c similarity index 100% rename from lib/LuaJIT/lj_err.c rename to lib/LuaJIT/src/lj_err.c diff --git a/lib/LuaJIT/lj_err.h b/lib/LuaJIT/src/lj_err.h similarity index 100% rename from lib/LuaJIT/lj_err.h rename to lib/LuaJIT/src/lj_err.h diff --git a/lib/LuaJIT/lj_errmsg.h b/lib/LuaJIT/src/lj_errmsg.h similarity index 100% rename from lib/LuaJIT/lj_errmsg.h rename to lib/LuaJIT/src/lj_errmsg.h diff --git a/lib/LuaJIT/lj_ff.h b/lib/LuaJIT/src/lj_ff.h similarity index 100% rename from lib/LuaJIT/lj_ff.h rename to lib/LuaJIT/src/lj_ff.h diff --git a/lib/LuaJIT/lj_ffrecord.c b/lib/LuaJIT/src/lj_ffrecord.c similarity index 100% rename from lib/LuaJIT/lj_ffrecord.c rename to lib/LuaJIT/src/lj_ffrecord.c diff --git a/lib/LuaJIT/lj_ffrecord.h b/lib/LuaJIT/src/lj_ffrecord.h similarity index 100% rename from lib/LuaJIT/lj_ffrecord.h rename to lib/LuaJIT/src/lj_ffrecord.h diff --git a/lib/LuaJIT/lj_frame.h b/lib/LuaJIT/src/lj_frame.h similarity index 100% rename from lib/LuaJIT/lj_frame.h rename to lib/LuaJIT/src/lj_frame.h diff --git a/lib/LuaJIT/lj_func.c b/lib/LuaJIT/src/lj_func.c similarity index 100% rename from lib/LuaJIT/lj_func.c rename to lib/LuaJIT/src/lj_func.c diff --git a/lib/LuaJIT/lj_func.h b/lib/LuaJIT/src/lj_func.h similarity index 100% rename from lib/LuaJIT/lj_func.h rename to lib/LuaJIT/src/lj_func.h diff --git a/lib/LuaJIT/lj_gc.c b/lib/LuaJIT/src/lj_gc.c similarity index 100% rename from lib/LuaJIT/lj_gc.c rename to lib/LuaJIT/src/lj_gc.c diff --git a/lib/LuaJIT/lj_gc.h b/lib/LuaJIT/src/lj_gc.h similarity index 100% rename from lib/LuaJIT/lj_gc.h rename to lib/LuaJIT/src/lj_gc.h diff --git a/lib/LuaJIT/lj_gdbjit.c b/lib/LuaJIT/src/lj_gdbjit.c similarity index 100% rename from lib/LuaJIT/lj_gdbjit.c rename to lib/LuaJIT/src/lj_gdbjit.c diff --git a/lib/LuaJIT/lj_gdbjit.h b/lib/LuaJIT/src/lj_gdbjit.h similarity index 100% rename from lib/LuaJIT/lj_gdbjit.h rename to lib/LuaJIT/src/lj_gdbjit.h diff --git a/lib/LuaJIT/lj_ir.c b/lib/LuaJIT/src/lj_ir.c similarity index 100% rename from lib/LuaJIT/lj_ir.c rename to lib/LuaJIT/src/lj_ir.c diff --git a/lib/LuaJIT/lj_ir.h b/lib/LuaJIT/src/lj_ir.h similarity index 100% rename from lib/LuaJIT/lj_ir.h rename to lib/LuaJIT/src/lj_ir.h diff --git a/lib/LuaJIT/lj_ircall.h b/lib/LuaJIT/src/lj_ircall.h similarity index 100% rename from lib/LuaJIT/lj_ircall.h rename to lib/LuaJIT/src/lj_ircall.h diff --git a/lib/LuaJIT/lj_iropt.h b/lib/LuaJIT/src/lj_iropt.h similarity index 100% rename from lib/LuaJIT/lj_iropt.h rename to lib/LuaJIT/src/lj_iropt.h diff --git a/lib/LuaJIT/lj_jit.h b/lib/LuaJIT/src/lj_jit.h similarity index 100% rename from lib/LuaJIT/lj_jit.h rename to lib/LuaJIT/src/lj_jit.h diff --git a/lib/LuaJIT/lj_lex.c b/lib/LuaJIT/src/lj_lex.c similarity index 100% rename from lib/LuaJIT/lj_lex.c rename to lib/LuaJIT/src/lj_lex.c diff --git a/lib/LuaJIT/lj_lex.h b/lib/LuaJIT/src/lj_lex.h similarity index 100% rename from lib/LuaJIT/lj_lex.h rename to lib/LuaJIT/src/lj_lex.h diff --git a/lib/LuaJIT/lj_lib.c b/lib/LuaJIT/src/lj_lib.c similarity index 100% rename from lib/LuaJIT/lj_lib.c rename to lib/LuaJIT/src/lj_lib.c diff --git a/lib/LuaJIT/lj_lib.h b/lib/LuaJIT/src/lj_lib.h similarity index 100% rename from lib/LuaJIT/lj_lib.h rename to lib/LuaJIT/src/lj_lib.h diff --git a/lib/LuaJIT/lj_load.c b/lib/LuaJIT/src/lj_load.c similarity index 100% rename from lib/LuaJIT/lj_load.c rename to lib/LuaJIT/src/lj_load.c diff --git a/lib/LuaJIT/lj_mcode.c b/lib/LuaJIT/src/lj_mcode.c similarity index 100% rename from lib/LuaJIT/lj_mcode.c rename to lib/LuaJIT/src/lj_mcode.c diff --git a/lib/LuaJIT/lj_mcode.h b/lib/LuaJIT/src/lj_mcode.h similarity index 100% rename from lib/LuaJIT/lj_mcode.h rename to lib/LuaJIT/src/lj_mcode.h diff --git a/lib/LuaJIT/lj_meta.c b/lib/LuaJIT/src/lj_meta.c similarity index 100% rename from lib/LuaJIT/lj_meta.c rename to lib/LuaJIT/src/lj_meta.c diff --git a/lib/LuaJIT/lj_meta.h b/lib/LuaJIT/src/lj_meta.h similarity index 100% rename from lib/LuaJIT/lj_meta.h rename to lib/LuaJIT/src/lj_meta.h diff --git a/lib/LuaJIT/lj_obj.c b/lib/LuaJIT/src/lj_obj.c similarity index 100% rename from lib/LuaJIT/lj_obj.c rename to lib/LuaJIT/src/lj_obj.c diff --git a/lib/LuaJIT/lj_obj.h b/lib/LuaJIT/src/lj_obj.h similarity index 100% rename from lib/LuaJIT/lj_obj.h rename to lib/LuaJIT/src/lj_obj.h diff --git a/lib/LuaJIT/lj_opt_dce.c b/lib/LuaJIT/src/lj_opt_dce.c similarity index 100% rename from lib/LuaJIT/lj_opt_dce.c rename to lib/LuaJIT/src/lj_opt_dce.c diff --git a/lib/LuaJIT/lj_opt_fold.c b/lib/LuaJIT/src/lj_opt_fold.c similarity index 100% rename from lib/LuaJIT/lj_opt_fold.c rename to lib/LuaJIT/src/lj_opt_fold.c diff --git a/lib/LuaJIT/lj_opt_loop.c b/lib/LuaJIT/src/lj_opt_loop.c similarity index 100% rename from lib/LuaJIT/lj_opt_loop.c rename to lib/LuaJIT/src/lj_opt_loop.c diff --git a/lib/LuaJIT/lj_opt_mem.c b/lib/LuaJIT/src/lj_opt_mem.c similarity index 100% rename from lib/LuaJIT/lj_opt_mem.c rename to lib/LuaJIT/src/lj_opt_mem.c diff --git a/lib/LuaJIT/lj_opt_narrow.c b/lib/LuaJIT/src/lj_opt_narrow.c similarity index 100% rename from lib/LuaJIT/lj_opt_narrow.c rename to lib/LuaJIT/src/lj_opt_narrow.c diff --git a/lib/LuaJIT/lj_opt_sink.c b/lib/LuaJIT/src/lj_opt_sink.c similarity index 100% rename from lib/LuaJIT/lj_opt_sink.c rename to lib/LuaJIT/src/lj_opt_sink.c diff --git a/lib/LuaJIT/lj_opt_split.c b/lib/LuaJIT/src/lj_opt_split.c similarity index 100% rename from lib/LuaJIT/lj_opt_split.c rename to lib/LuaJIT/src/lj_opt_split.c diff --git a/lib/LuaJIT/lj_parse.c b/lib/LuaJIT/src/lj_parse.c similarity index 100% rename from lib/LuaJIT/lj_parse.c rename to lib/LuaJIT/src/lj_parse.c diff --git a/lib/LuaJIT/lj_parse.h b/lib/LuaJIT/src/lj_parse.h similarity index 100% rename from lib/LuaJIT/lj_parse.h rename to lib/LuaJIT/src/lj_parse.h diff --git a/lib/LuaJIT/lj_profile.c b/lib/LuaJIT/src/lj_profile.c similarity index 100% rename from lib/LuaJIT/lj_profile.c rename to lib/LuaJIT/src/lj_profile.c diff --git a/lib/LuaJIT/lj_profile.h b/lib/LuaJIT/src/lj_profile.h similarity index 100% rename from lib/LuaJIT/lj_profile.h rename to lib/LuaJIT/src/lj_profile.h diff --git a/lib/LuaJIT/lj_record.c b/lib/LuaJIT/src/lj_record.c similarity index 100% rename from lib/LuaJIT/lj_record.c rename to lib/LuaJIT/src/lj_record.c diff --git a/lib/LuaJIT/lj_record.h b/lib/LuaJIT/src/lj_record.h similarity index 100% rename from lib/LuaJIT/lj_record.h rename to lib/LuaJIT/src/lj_record.h diff --git a/lib/LuaJIT/lj_snap.c b/lib/LuaJIT/src/lj_snap.c similarity index 100% rename from lib/LuaJIT/lj_snap.c rename to lib/LuaJIT/src/lj_snap.c diff --git a/lib/LuaJIT/lj_snap.h b/lib/LuaJIT/src/lj_snap.h similarity index 100% rename from lib/LuaJIT/lj_snap.h rename to lib/LuaJIT/src/lj_snap.h diff --git a/lib/LuaJIT/lj_state.c b/lib/LuaJIT/src/lj_state.c similarity index 100% rename from lib/LuaJIT/lj_state.c rename to lib/LuaJIT/src/lj_state.c diff --git a/lib/LuaJIT/lj_state.h b/lib/LuaJIT/src/lj_state.h similarity index 100% rename from lib/LuaJIT/lj_state.h rename to lib/LuaJIT/src/lj_state.h diff --git a/lib/LuaJIT/lj_str.c b/lib/LuaJIT/src/lj_str.c similarity index 100% rename from lib/LuaJIT/lj_str.c rename to lib/LuaJIT/src/lj_str.c diff --git a/lib/LuaJIT/lj_str.h b/lib/LuaJIT/src/lj_str.h similarity index 100% rename from lib/LuaJIT/lj_str.h rename to lib/LuaJIT/src/lj_str.h diff --git a/lib/LuaJIT/lj_strfmt.c b/lib/LuaJIT/src/lj_strfmt.c similarity index 100% rename from lib/LuaJIT/lj_strfmt.c rename to lib/LuaJIT/src/lj_strfmt.c diff --git a/lib/LuaJIT/lj_strfmt.h b/lib/LuaJIT/src/lj_strfmt.h similarity index 100% rename from lib/LuaJIT/lj_strfmt.h rename to lib/LuaJIT/src/lj_strfmt.h diff --git a/lib/LuaJIT/lj_strfmt_num.c b/lib/LuaJIT/src/lj_strfmt_num.c similarity index 100% rename from lib/LuaJIT/lj_strfmt_num.c rename to lib/LuaJIT/src/lj_strfmt_num.c diff --git a/lib/LuaJIT/lj_strscan.c b/lib/LuaJIT/src/lj_strscan.c similarity index 100% rename from lib/LuaJIT/lj_strscan.c rename to lib/LuaJIT/src/lj_strscan.c diff --git a/lib/LuaJIT/lj_strscan.h b/lib/LuaJIT/src/lj_strscan.h similarity index 100% rename from lib/LuaJIT/lj_strscan.h rename to lib/LuaJIT/src/lj_strscan.h diff --git a/lib/LuaJIT/lj_tab.c b/lib/LuaJIT/src/lj_tab.c similarity index 100% rename from lib/LuaJIT/lj_tab.c rename to lib/LuaJIT/src/lj_tab.c diff --git a/lib/LuaJIT/lj_tab.h b/lib/LuaJIT/src/lj_tab.h similarity index 100% rename from lib/LuaJIT/lj_tab.h rename to lib/LuaJIT/src/lj_tab.h diff --git a/lib/LuaJIT/lj_target.h b/lib/LuaJIT/src/lj_target.h similarity index 100% rename from lib/LuaJIT/lj_target.h rename to lib/LuaJIT/src/lj_target.h diff --git a/lib/LuaJIT/lj_target_arm.h b/lib/LuaJIT/src/lj_target_arm.h similarity index 100% rename from lib/LuaJIT/lj_target_arm.h rename to lib/LuaJIT/src/lj_target_arm.h diff --git a/lib/LuaJIT/lj_target_arm64.h b/lib/LuaJIT/src/lj_target_arm64.h similarity index 100% rename from lib/LuaJIT/lj_target_arm64.h rename to lib/LuaJIT/src/lj_target_arm64.h diff --git a/lib/LuaJIT/lj_target_mips.h b/lib/LuaJIT/src/lj_target_mips.h similarity index 100% rename from lib/LuaJIT/lj_target_mips.h rename to lib/LuaJIT/src/lj_target_mips.h diff --git a/lib/LuaJIT/lj_target_ppc.h b/lib/LuaJIT/src/lj_target_ppc.h similarity index 100% rename from lib/LuaJIT/lj_target_ppc.h rename to lib/LuaJIT/src/lj_target_ppc.h diff --git a/lib/LuaJIT/lj_target_x86.h b/lib/LuaJIT/src/lj_target_x86.h similarity index 100% rename from lib/LuaJIT/lj_target_x86.h rename to lib/LuaJIT/src/lj_target_x86.h diff --git a/lib/LuaJIT/lj_trace.c b/lib/LuaJIT/src/lj_trace.c similarity index 100% rename from lib/LuaJIT/lj_trace.c rename to lib/LuaJIT/src/lj_trace.c diff --git a/lib/LuaJIT/lj_trace.h b/lib/LuaJIT/src/lj_trace.h similarity index 100% rename from lib/LuaJIT/lj_trace.h rename to lib/LuaJIT/src/lj_trace.h diff --git a/lib/LuaJIT/lj_traceerr.h b/lib/LuaJIT/src/lj_traceerr.h similarity index 100% rename from lib/LuaJIT/lj_traceerr.h rename to lib/LuaJIT/src/lj_traceerr.h diff --git a/lib/LuaJIT/lj_udata.c b/lib/LuaJIT/src/lj_udata.c similarity index 100% rename from lib/LuaJIT/lj_udata.c rename to lib/LuaJIT/src/lj_udata.c diff --git a/lib/LuaJIT/lj_udata.h b/lib/LuaJIT/src/lj_udata.h similarity index 100% rename from lib/LuaJIT/lj_udata.h rename to lib/LuaJIT/src/lj_udata.h diff --git a/lib/LuaJIT/lj_vm.h b/lib/LuaJIT/src/lj_vm.h similarity index 100% rename from lib/LuaJIT/lj_vm.h rename to lib/LuaJIT/src/lj_vm.h diff --git a/lib/LuaJIT/lj_vmevent.c b/lib/LuaJIT/src/lj_vmevent.c similarity index 100% rename from lib/LuaJIT/lj_vmevent.c rename to lib/LuaJIT/src/lj_vmevent.c diff --git a/lib/LuaJIT/lj_vmevent.h b/lib/LuaJIT/src/lj_vmevent.h similarity index 100% rename from lib/LuaJIT/lj_vmevent.h rename to lib/LuaJIT/src/lj_vmevent.h diff --git a/lib/LuaJIT/lj_vmmath.c b/lib/LuaJIT/src/lj_vmmath.c similarity index 100% rename from lib/LuaJIT/lj_vmmath.c rename to lib/LuaJIT/src/lj_vmmath.c diff --git a/lib/LuaJIT/ljamalg.c b/lib/LuaJIT/src/ljamalg.c similarity index 100% rename from lib/LuaJIT/ljamalg.c rename to lib/LuaJIT/src/ljamalg.c diff --git a/lib/LuaJIT/lua.h b/lib/LuaJIT/src/lua.h similarity index 100% rename from lib/LuaJIT/lua.h rename to lib/LuaJIT/src/lua.h diff --git a/lib/LuaJIT/lua.hpp b/lib/LuaJIT/src/lua.hpp similarity index 100% rename from lib/LuaJIT/lua.hpp rename to lib/LuaJIT/src/lua.hpp diff --git a/lib/LuaJIT/luaconf.h b/lib/LuaJIT/src/luaconf.h similarity index 100% rename from lib/LuaJIT/luaconf.h rename to lib/LuaJIT/src/luaconf.h diff --git a/lib/LuaJIT/luajit.c b/lib/LuaJIT/src/luajit.c similarity index 100% rename from lib/LuaJIT/luajit.c rename to lib/LuaJIT/src/luajit.c diff --git a/lib/LuaJIT/luajit.h b/lib/LuaJIT/src/luajit.h similarity index 100% rename from lib/LuaJIT/luajit.h rename to lib/LuaJIT/src/luajit.h diff --git a/lib/LuaJIT/lualib.h b/lib/LuaJIT/src/lualib.h similarity index 100% rename from lib/LuaJIT/lualib.h rename to lib/LuaJIT/src/lualib.h diff --git a/lib/LuaJIT/msvcbuild.bat b/lib/LuaJIT/src/msvcbuild.bat similarity index 100% rename from lib/LuaJIT/msvcbuild.bat rename to lib/LuaJIT/src/msvcbuild.bat diff --git a/lib/LuaJIT/ps4build.bat b/lib/LuaJIT/src/ps4build.bat similarity index 100% rename from lib/LuaJIT/ps4build.bat rename to lib/LuaJIT/src/ps4build.bat diff --git a/lib/LuaJIT/psvitabuild.bat b/lib/LuaJIT/src/psvitabuild.bat similarity index 100% rename from lib/LuaJIT/psvitabuild.bat rename to lib/LuaJIT/src/psvitabuild.bat diff --git a/lib/LuaJIT/vm_arm.dasc b/lib/LuaJIT/src/vm_arm.dasc similarity index 100% rename from lib/LuaJIT/vm_arm.dasc rename to lib/LuaJIT/src/vm_arm.dasc diff --git a/lib/LuaJIT/vm_arm64.dasc b/lib/LuaJIT/src/vm_arm64.dasc similarity index 100% rename from lib/LuaJIT/vm_arm64.dasc rename to lib/LuaJIT/src/vm_arm64.dasc diff --git a/lib/LuaJIT/vm_mips.dasc b/lib/LuaJIT/src/vm_mips.dasc similarity index 100% rename from lib/LuaJIT/vm_mips.dasc rename to lib/LuaJIT/src/vm_mips.dasc diff --git a/lib/LuaJIT/vm_mips64.dasc b/lib/LuaJIT/src/vm_mips64.dasc similarity index 100% rename from lib/LuaJIT/vm_mips64.dasc rename to lib/LuaJIT/src/vm_mips64.dasc diff --git a/lib/LuaJIT/vm_ppc.dasc b/lib/LuaJIT/src/vm_ppc.dasc similarity index 100% rename from lib/LuaJIT/vm_ppc.dasc rename to lib/LuaJIT/src/vm_ppc.dasc diff --git a/lib/LuaJIT/vm_x64.dasc b/lib/LuaJIT/src/vm_x64.dasc similarity index 100% rename from lib/LuaJIT/vm_x64.dasc rename to lib/LuaJIT/src/vm_x64.dasc diff --git a/lib/LuaJIT/vm_x86.dasc b/lib/LuaJIT/src/vm_x86.dasc similarity index 100% rename from lib/LuaJIT/vm_x86.dasc rename to lib/LuaJIT/src/vm_x86.dasc diff --git a/lib/LuaJIT/xb1build.bat b/lib/LuaJIT/src/xb1build.bat similarity index 100% rename from lib/LuaJIT/xb1build.bat rename to lib/LuaJIT/src/xb1build.bat diff --git a/lib/LuaJIT/xedkbuild.bat b/lib/LuaJIT/src/xedkbuild.bat similarity index 100% rename from lib/LuaJIT/xedkbuild.bat rename to lib/LuaJIT/src/xedkbuild.bat diff --git a/lib/libentityx.a b/lib/libentityx.a index a7eb45f3955e4c4210a7de5e9788a162daf5ce9c..c1b2a0d4fb70bdea6f039851a1fe12ae1f6cc9ec 100644 GIT binary patch literal 414808 zcmeEv3w)eK)&3@Fp(5IF5vw9B6|me&(xz7mw6qIJX-nt@s({-x*|sTZ5|T|RNEJyz zVu)5nML~s6P!N==h!sJ?MX7kJ3R)1gB1o~QRr$0k%KtfM&dfXS*(83!|*Tr z&IQx5*_Ewb*~WG2CS|j2?VZ(=v)Sf+t|Qx$>+IxEW^F1dUQM>nMO)j@GJ8U1!J?{c z^&}6bd@>~^t{zBYR1^hf8{5{jn+mE0FUr?svn?xIs1Bzu%1_H*)Sk;Wx2|Z*U65IL z`l2lG)(h9vQv;h?>en)`U{St$LiUt~&RlkRbG|c|uba1~I+H>BSPlxex)8UzI=d)) z;i~4wRmd^3hH8_XO?4F_u4(8z-^D|%lWK#A^Rp{+`3u`RnhIq&4bfILbF2cjr&vvG z*@o68l1decMX8{~gj9;Omox0hxrkajs!?=vXEt|1S3`?m__XYzhSuhM^Tj!czbccd zu7PAw$4)`H(OgT!Y=_Lw&t*GTHFV^fviXLUlMp%IoLQTJs^F)zr%+6ZQjJi?hniZbWy@g2Dp<1x0@t;@FOIy&208(Nz47iHI0C6_cu@*_D# zGMow#<<_+4FES#Zyr_9idrNNOyyoTAlV`WJwB#D|Z5?xRD;m05@^x!7lOc74N{igs z;`O5yV0*r!Zh;g7vJzFVJ9TaS>1%nAss(2psVc=2-~!Onr*^RIV08I4O|Pg#p;5)-e95J`?| z)-PC;t)6HqE~AC#BQ%12%xH@0l2c40XOBl=R2m*9B8^ELzmDoO)zoQrN3J2CYhv8Z zb&Jn(LMoOb)QDn{t-D|wT{M1GSgb+(300>0b8?;ej<$@R#)kHWM$8{F zocu{*vRk%Hu7Q1lxvvhJdo9yRSXDJQc~!7O%bSB%Bfr(5$s^9R7TNYvr0!FijH)FS zq$H`H(9qeL>&Vl(FR_Nj+ixr7Rkz-a&1xR#v$3FTYt6OhYjZ8|*;#ZG!lDbxDK)WQ zZm45w@(_cWx?HP6zCcZGO>>?sOtP|M=6bpU-+Qe;Z-jMVlD7~GS|D9%D;Q%;Ywzk@ zg=J9V`Ecbz_CC^~6R{8-Kxa;CWJ{SvM;6L;!UXgLR)D!qa)z=^x#e9eS2nk<4BL!I zRi=_DKdU)+Vcoptv}ng9AnREtU$(zAfY-qWVp32R{Gy2@JrH%TnEp+PN6itX}N1yR_v1cQHeB@YrBkSL@Nl$g-2z0pE(sGGdak45{A~p3$-A5uSrly@l{)!aE@mpE{BxG!aI4s9$n+fx8zj z-_BS{^$L1Vb|D5GaJw|gPC`6pFb@%X-zS9Wc3q~ZN$Htv^)owEbMg@ zPBAfuLx!*;5=l@!f&DkQI}O;^hW}fYjg&f-4xWgaVJELOM_Y|Gyicbzdcb)$MO>*p ztz&z;bv~?`1f3u6LSL+bViigeh&4FRYlTadm?luwi8y7cTQm{oI+Izx@N^o4Q?l9C zwvIJ8U!&7I?t;Zx>_=fGIfq4jdQd`A#7Lsz|Ay!P{g;N)ozLNf>>WP6A zKj2;&NalrlC}A8lw&WT*^pT^KENg~IiK(^8IytsXU_R5Cn1p>lnMu68pv2ulfA2IY zLd-@d6%{em$(sbxsZEI$nV*$dro=`0iEEl$>(;>NF3w_cW)67>ZCDpY=@fZj=SH@| zNI01ecFoGS$t*$(Z_V?Wct;K@L%X>oW9;=*!?*;ec-e-=MqFzcUKGLeOU^hjI(0ejj=1;feD`+G4IfBz#T9Nr8hJ+WpVV4j%%0A$zTRUca(CTQQ`p> zW*^)#Fz4RchW2*yEQa-@33pp?65j#!$~NS)R9rny(n!%Ti)shvh0kWhmxf>_HMF#} zHDV7()K$%}@M#at=Tozp#DgUa*s3h;5?1e7rNunqa?P5ywYj>5L({F9Gss%t$dEE6 z70PwwS{rk9I1#I%dpkJ9G7bo04gWbGADWrdWZE$fZTr!MjK)apfj@B+Kf;-8b`Om) z@UM+j*LSq#+hR9660ehBub=jzGw>2w(@{auRBX!TI~s6Bst!trGl6N1ZLK&%>T1l_ zt)7b=WB8P77s7k5U(8Bpk2I|VEK_UXI|X(^SUkY7S4;x~x3=g2pw4FO-xo=6S?gEx zCIl%vSKCe6;gw%xVFCMRw~M2F?k##lx-ikd;bfZ@O-zH5_e5%-IUNnHD|1$VNTfsN z{?fwNE`)~8ORu4|znf4>-){{z4`_D-qBV1pvMcQP1KHArf_NLx*`|hkgU!bi>crOE zg;}SwiQCMyfeTDRp1m^JNAgwuwBe+1UUJIUyU|7%aJHwy6u>)?AYU&KU&QE08ETK(Iz&5g zb@CKvvvV3{?SW-zony->Z8Wc5&7!XkiM}+K(d|XU`6Ayj+O36dI1G4Kx~4U^PS*CG zf0N|?2D80lpAvT-2j@Tzq=b+&X*)BhYw#bHmDbLrFc=0j#HE?y6 zSuM|NZasf;b1QBztq@lirz~sd(z6kCfCA5Vg*-n}cPcG=`QT(uE4jB}CO=M*vA2os z<`G}q9@y$URI{d>tJx4`8CZHd+DcU8QaADFQJpUAsA1!lx4-O4bC`<5Ge9`s%CG8Z zyD%scO`6h-3sx&T_^~qVVl?2Hl;wQ7C|x%^)tQPt^Q?alKQf&Tv8)Tsh7&N0bhS3q zBUiX$c` zCE4aum71Pvb1V4a-IJzA3*FeE{b=lx;=hIF!5tjS;0PexvAn<9yaK}@x2`eQo*%mY zMVT~T($gjAV03hbt77(>L%RY)qfb;4`OLFJj@xi|Zq#>0Eld{=`Vc_8SkI@6>{(f3 z9(@|Gh(6lQFm#HRL*e5I>&Fjy&1}Xc>OnD|sG7E*<=g{L)J%XME}K&J@DERc(n*55 zBkdnvl;(mImUY3iL2T|P@9cYL8>ias_0nonSR#dM12_MS;JLoxFR!Na!iM&YSfpax z-K*h&uQkuRi9b!ZxZzqEZ@bvOc0%$s%^C9mxTnQQYo>&x_AUg}R6F&sPczU7h&}G0 zDa|V^GMHCqLTPY3Lh*gybeemtx2|<9c|~|EiZ4PXpU{|Rb2IQu*S4LH%TTn35b`z` zP0nT(O`>9gXSN1#e3X%cB&0v>tUb-aI|HLLqEb)23W+o6;HmJT6IOGDy-vH7+f#SZ z=A*eG5mooEAq6d7(_Dx1tk|%iM-`H8V43S$)svcGSdwgb4`hGHRcb1l)!G-3>r_CA6wJmoYB2GL&d2)nUKxzWt19aTs^1FT-K zCQP=9NwvU*@Tw+rluOU4kd3k@TOr3VF|9c(A}d)+O_Mi)l7*_pEiT~XltU!!}}nXX;TNeHKc=)KxpeeQHS8hL`EuZaPangsD*aNoSHPyopN)_A}XUH z-6@Ch9roS$Y3+F1Ofy~CGS+y2VyLdB-F#dlqt`(26AP2&Do{jCl6=)-BOSsOCmM#9 z#th%__NOFrX$Nz`GW0MZG8y0v!(f~bEFs2@M%ywPxQcZ9rqZ9^mBOlGRv4y1LkJ?$LUA|qz} z6iiiir)s!*vj)A1mvkxnk&tDfZFV^S*o)wos>HS^-Loh|(;vuXqA9~Z<3h6GT}!hZ zhX$f9VGX1k&DbkVN?Y2Pm{54LErWeb=!R^ao=Ur?-X3{q_8l52$lhsWx``}M?8d}E zw;qc+V}s1tTYQva`U>xp!6zN?&LNqK;ombGM8&YBNi!raILfpW?Xn`WK*OfxS{s(P z;1!80>XvqP!02b`rGVMGxg5l~S(elvwi&PN%Xi@|blH~X^ZAN4?YdS20yiVG zI_NRIjw{Q`WaupkU2vl0lJi13HaLSf#k}QSk{6V)DPmk4*(*$#wDH0_ zyOS8qY2s1GPva8pGdyJ9npatCZf8jApT~@$x7PuA?6E0C>tj|7b;FLxU~JfGlFMo_ zKB&6fLkbS)A}40HmFk(I=QG&2(aGLi3HLfVVtWEFH@Fz$)eG^L( zX@P&)S?&-g_e(4zt}$i6<=0R-RauHdFLR!QK}fy_mNj8D zGB4+~&x;IrnJUYr#b?1j4s?lYmjVM^8GBC2Kueq>&vBx%16vVern8&CiPID^EX6@8 zvNptA7h9fTEEKvfQVkrJYWZXx6 z0jRO>3zXQkMU>YV_zY_uvUHUqA$f- zXCfUs%F08Y)n3ujwkDfjg(bs<&G}VywS#VV;KVbuL}|@;b}WDb(TZeM1KuLuxgu|# z6o+BJjm*fx!nnm|Cb#!OhU-1Cv-jXi%3v38#V?u6CZ+RE;OXA#P@KSf_7Pcf8Bs%3 zo9klC4FROtr(q|N6-$7vKaGIU6 zqCQW<0`iH>bmpJ956|Qhv|Bo>8VmiVCcGxHvu(u?y=OXu;pT23;@u3h-P6G(n$aSj z$z0e`6ye?IB9+4hR=g+CJODQ|<(O?^qtmd}!Q`8*F4>(a(iE65GSA8PCWmwSogmXM z%D{Axu-_@J+(gUc*E;OMv|M%&o0bQHs$x4 zJ1ppusiM9wi*7(QV0$y@ANP8NSDK)`W80TSMD!XS=%QPozoN9zZB`6!BosbHpy5^A zy4Wfd@N`yt&RO75`qMi$tFvY=ALo)UiVLqZnmYZt$k1%l`W;YyY}%9I#FHGjE@P)yIklaOD~D1 zUD7^SVYRk9+mIbL1e_1pwtO|Ns+&XMA=qq#2T0?G{6KP1>Y)J(t@NnVQTh;+VjfhC zF1Rpl%B)G(OrrWdL?z38ddh9+*8@&&Zb>kVuCsfQ;mc=4>4=y%MLZX+;I`zzXTrkU zqN1wv_|?79Z+(Stdk(zl!o#t|S*GZ7RfF*a_e3c6CKm=k;+Di<>N6ycbg+R#r|R~7$X5>7+`)GE4Ubb}+rn*J)_}ieDMf|XZ zSr+LhyV{bg@DL(X1{*7HdL&m9>+#(3w(KhYOibOp<|?{EsbyZ+l9^Xnd&)B$xw}iZ zFN+<yYUn=8 zm^hCPaxD6h-!H(`5xQxb zw8@%uya6kYMQwXS2fesqSl3e!ggI}A-r+7wSF7v*n!@>;x$Vts+Xi>(rQlK$^8+5l zw8by*cMVFsRMXzV&j6F(MN40LmFP>e{DiDfVj!!RvTR!Zl(JqdY+eIT{-rnzeyMJ? zc+U)DW}nMzM;h$7CGQV*Qkda4QCTQ!oL5eVhE|5OuI6>WUO&yNDl8#6vU1C(0lT{|ug@+nCr-+p%Q*~7 zG_%CCCB&X53}(eRtElA~WViV<a}$O>~`QX^V-I|0>{(2A(66OSh%viekA{E z4^G+qRSG7_q$^>KE&ToPQd`2C{mc37F6alyIUK$MUjZ_{g7Tzip*uw829ftV1G;QLdwNN|wK@|B8m)=V$1nrl zjOb0T1!q^7cYe(KC78-QE76kQBZE$(6&r1B?L6`Csa=CxNq$Y(uwfd)e=-SsH80h^ ztyv?E(=>LP_-WulWRoEqk4M?8GZ5+a!Q@C+b?jsT*C|jGI~QfeAsbBQJS7Vm_L50MgvoebeYy!zQJ8vHD4+?P}^#GH_MEYi!2 zX)_X^A8Nw073M>D?i-(3ydN`z+npv2y~_~uNB!wA4G``keu)|MA3fL5w7RP^KlmZg z0-+and!cpM3?r9ZycY9Rd*XdAT6paF^XZTp8khKdI#{vCNESjK*kxcJjD|+&P8#m@ zN8Vn!I9o)gksaEcAsdViLWZv6aF5-1YPexU{a4y*rATp!+D$j!c!-K`HF%}0uFkb~ zc6H!|-p#Em?FGo#sudSBv7R!|e-6H^_*5nXVDMSmlh{4T!T5dd1+!jvDC>YyUJuK6 z0HLKA*X>=MtA=O*)_Akf+J+YEU7PW@&yyo);XtSDIjzqfHsS{E9qzNas3>=9wu&Uea>vTGZTY#~J($2@JOA zo#mmCJ0AViDhyVF-0?1=`BGup2%@ii20|}k%fafFNj#ulE54t>iyvoU>yu?!JR9DV zUOcFKPleA+OS+OmYcANo~mlx4E;uE%>nI%UBV79k!#* zeJlCpsR+FanZD)NgzapsOUXIQPouX+V;gTp8#Hxs@WtBXuY;5O>P1TWta&s__*<+I zZt?e%s|gazX8)ST`e5D(vUt(UG*U>Yi?kQ4Mg&kp_YteB7qqp`#{D6BsD&d0$qRH` z5UE7D2MH3T9j}TZIP4hps~0D;C8*mn~zGakl-S# z&H*Jg%T2OSns}Kvup#0Zon*6uF+_VG(v8FQ77Z&G6o%7VDXg)r3t#6d{QPp@;Jg&I zl#?FRvXt|jB16b)^HAg_b+d00n|4YAIX!smboC_jd3dbNAy2HEXtr=uO%PA&v-qq8 zo|Z%{)O*`i_{#+)%C5+OB)^-UoV0ca??DERy>4T52OA+yVzn-Qp) z!-wJHWx-vOm#}TvjN$ut=$~P2n=8id(w3+YCF)%uyJ5;dGO()QQD7*`&WDuljnptd zG+M(fD}QSy!dy3i+~)Ssip^SUrSyW0_AJT(rwHeb4cP7E1tcB<&ao{O2WB|+HW(DK z?|~1AJqz?UC}|i>3(he;v&=hZY%Fn2HVTQ%99!1Mq{B= z$-5NZHinvQa!Rwm;VXT+zJxKysgwD* zmw%;qAo>toRxL33gu5;A@lHeue*|D5#)Fl7XwpPXBY{0>IbYl`Eib5hk!i?$c+gm? zf?p<}=1?v99-n82-H?b_+7Rxx{i>^I?{LvYo%!4vdN^oB^Ge+F;xE@#M~?Cq@;ib2 zy$RL~I}{7$6f^RP}qYp>oW1hK%9TH*R6@Vb}lbZ$n-Q*4c=?Ls%{NJQ*#$|;ZcZu8~q|LyQaON zxufp%HT<%;OxW}fe|f=FLgN7zD&NrDg1N-2S7aTK+(f(p1#elm@2;DcUC`EqLuc$q zH{{#oMZSx(OZkE%eISd(iL+@}BF+UuDF#8?APiwJKW+#me)m521`smrCn1(m&i0hhhhvg$jU*WglVj#A(jeoJ%X zMa+V`;aXz9+h?UtcV_Vy85;kWnw~gHq1~Y|V~))StOTsr^u%U!Yhy=DyYUPk^-H#u z#xw4gcI5_HOor~JtTp)$%h05kuh20u4-G2e|B`~xb%5o$mCdcO4je+u3fHclJOU$F zR*5=14#En=GjPbFhhh!XGC8HBkL$+TG;~TypFM+CyO;cu-bBvBoiX;O^n$ZR#(P1u zXIY1Cio-5l;g0YP`Vd-)qUCySZ~S5M0b8bw|30PABsG+6DyGy!+@{d8@tzYOaz@}D zd3zo)R^Y-U?|OJ?lOyoQx*At?w6(TPZR#@Dtm|49nXZ@C z&4p)=XT37^+n=ZNJmCo#%U1J}+Xe9c>+q5iJR!*!29Z@vo0_7U2nD1b#_BymH@V;G zN*lfzzzYmnT$Gfpuh%gC!=oG3lUWj-@UU{(TzgyNs_1AKVqJ8bLqW$E8r?1Q+*m@V zhV);Ay8zn{b>^`?a>~tHps?dJh2E@T-wsof=R< zKg7Qu;orxBe?oXa#&7(W+A8!Xpg)!H&xAfA^iiQd7y1jK+k`$Q^l_oT1bsrnzY_Xu z(BDXSyU^bXeNyP}K%bKE)1beX@H3!0B>XJsA0)gJ^f?LtQRtt9{#ocQp??wjSJ1yn z_<7L(#lOGf-#-M~4f;g1#u>6vnVV9>Wp z_z=)TC7cF5Ou}P9-zMS1L64B|k)Usv@Ho(;Bz%m}V}%|EI$pxZgH}nn8gzn$Ckm|* zItg^Lgr^9d3OY@~(?L&=@C>0R3Oz~a$wFreoh9@X(Ag56BQyhgs)SDit(9;c=v)b( z4mwZ5^FbF#_zci`37-kNP{NBq7fX1F(6fY|4Z2jq?*M(LgwFvzSHkCkzDvSc&}9;C z09`KOM$je+=Rj9TcqQm62{(hTmhkzYEfQV>+A85T&~^!50NNqpPSCuByFk}U_(ITi z621uZVhO)n=p~@*CHx-H_e%Iu(DzCBGSF@bZveeq!dD1=ztAf|dnEh;&|V2&1==U! z4}yM3!W%(9Ea9s`KPKU8KtCzrPk~-5;p;#@E#c3AepbTQ3%vpKeJOu6X@q9 z`~}dPC439$7bSeF(Az-2B;hZE-Y(%ypkI;jSA~8J^bQGs9rR8Ke*<*0gue-TmxRA1 z^lqW|2>mwby%O#Ry-&jTgFYbP2ZeqI^t%#%2y}~tzX$rTguf5^0}1~S^hXl@G3Zta z|3v6dh5iim5eYvk^yfl<0lH1Xj|qJo^p_HT0`ylB{2>mPQ-z5CJ(EkPfyM+G%x?95k1pSwU z|1IuY_L&O~D1g)R7`@foM5sg@i{49SORZg!cv=CE?eA?jzyXg6=Ef*MYuX z!lQ*&g6=2b{Xq|q@PVLjknlmEZm__9=t2oE0$nWOB|^^vJsba);@>+2d#BKIgq|z(JkWPZI4g7+XoG~8gEmUI2{b3+ z6`(66yb82g!mB~gmv9T{8VR?8wn?~M=mnr167B@eOSlVkt%NTGT_@p-Krfc?yFo9J z@OseqNcg=%F9m&{gfA1?4Z1oCnS6g=qDxoDbQ;rd>!bgCHxtop9Q^M!Z(2akAy!5dZUDI68d?e zUjV&X!nc5aQNp(hy$$qB68XMV zyCr-N=(i<&FKEAn?*qMG!ViExDBf)9O85^#cM5$D^p6t$6X>5MybJU%68@{uzX^RF^nWG%chG-GcsJ-jCHybY ze@plU(EmvIzo0KlI5k4%6VP%ASAdR?@JP_TB)m81C<(s?bRP-77Ia?;zYg^E5*`g& zDdGJ<_m}ViLJtIegM<$f`bN+(5`Gitn7XY_ zc!tmug`Na@vV>=X&XVvcptB`B2Q(w$Q-z)eS}Wl?p>sh`m+(B$`4V0LdWMASLC=)% zLeNDLUJSZK!e@b=E#al0?~w32LC=x!xuEAs_+6k`2`>X}knnP$ji5~u&VjCw@Ji5C z5^e@vE#dP)TO_;&v{k}wLfb(vkZ_04PSCuByM(RpIKrfQ;#h~w&@Fk$@CHx-H z_e%Iu(DzCBGSF@bZveeq!dHO4U&2=k?E(FOgnNZv1==U!4+{Md=tc>DSm;MUKPus? zg?~0KHkl zw+Q_r=&cgI4fIPA{xaz865b^AE1+MM@YjUi0s3_b-zoH)pm*WllG>i9?;?k*ws$1{ zpQ^pQziZ@O6dHZ!{pUTfk@&Se>vz}oX7KL~9Hpmz6#smPex)|rSl!Q6x|lr=?I7NU z{;or7`(8)EyWWKV)%H!IaBbg-L^z7c7{xC^{tHLd_WZn75;I4_8^8Ae*TgTQHz`ph zUQgGq+CEcjYCumVW%|&}QCtgd(vn@ZJ@pLNcK447mEGN675QBo`MoUid!79qt#7Oj zHX=8&yWb_0-_eYt1xG99Dvp9ppZStX5U9xMeb4nn6tz9~)V}!Qi%qq?BaRryzcah5 z`)hkIC)CxnC$q7(XUR3SeMB!`O02%j^|ieprGx3Qj7#4h6Z)YoSg(m#?ENyYC^A z%D)9UF>rZ*espbbWo`HUQ2hN-ofm)VC*4U!vZz>NE?;Hp#Uxy>2vmB#+D*NPn0hfV zfO}v0+nQhQAEBzp$r>q=H#?wa9-KN@!Mu+kvd3Z<0qdE=-sJB+ThcLgM z^)K{v?e1RxLRr^I?_0kcf=+c!3Rx;COl+9gOWVPoNt40+zUWkYkJR!}6otS<% z_aE)N$eqpf-o5m=3s*Hau1Ys|rjNL|>!|ceC#JIt zmPgQ(mtlu_yg^HIe243&?c#1Q8m2Je;c6v80zvMN0+(|*@(bp5$O@#rq-Y9%d3Yz~rr*rf@{k7e@ zPQL48^wClG_iU}bMk3hRg1kX?`q+U*c;=|uY4^hkVQ}WC(RZe19GyQBKfx0xm*NC2 z3%ujKH-pX#&r`v>M&DQ2vo%QOamp&C zp=jccp01}5eMfJqC-VXaDtj|emEBLl9t2+q>qV+$ty@G`$q?GT{p3j3QB;{~dAZVaU+vGHtnJwv z>j11GQl6$zZh>T^lMts840Lj;_Artl@+JvIYld0-#h?d}DzUy!t6ZMb?jL=1e^4sr z9R1_g_VJP{R_@G7itXxSwUO~xK z`x2Fuv3l7!tkkw9eu>@v(0}76B3qNE&)0Y|9E_w%zAQb;trtr!@}vV@izrsmOSCw1 z>%kxvRzK^vA=cK|iY2oRt2kHT+G&}sqd!Xe4Od=Ry;uo!-(TkC%d9>g?ptenzFXV# z3mzJ_)!n8xHrSnK;EAmneyG&IEJ+%)arA!k<~!O)JZ z7W`PDyknXe;_gw&X`W7cep1^5IsB`(=V7c$(eWZ3X-{-dfd}DsXf^~k3+i`fWvqtO zmhS#qt3sxwi)y={8$-q&%Dmmzu$~9dh#g3<%qFOv_CV+KP!u-(CW;#)y<_|+(;f)V zR<+#^jycEJB`SF-O1>E-U+)j29klRYf)#BBESE2Gz24TOCv!({=8hgJ{$|spAQ~;A zGn;E4%Jh>7lNcDT($&*4{i8pE@i=SMZb?5%-|STe z!!a}o1|G&yhuf2!i)k}qPjaJ?mr)v4 zbQy}SO3`tacUhjUWVulWANOLozP(G(JdAd~-|(|F(;{VZ;yeXQy{n5|Y+qPN%; zAQoJNBakJ2ryx&|g`>ROqvJ=nx`|dy6#P{lcE%M?2xolozwmF=0+Q(qd1 zT%H?wSl?c$YxhEs7AE-Pvada&?9Ef&iOY}WC;xIp*^Y{FI71kD*bhdg9;ZYS)73Lt zer4TA+?4uI*+|@*yr-P%dhMIaMjtb>v#h6VpO2QMZlLXO|^e4!vJ)E0jVRGD%2emFRBs-^u;!skW zfAfb~DHsQGM6FpTdMPoyBmKf{b@8_be#AJMkbE;vK15&UnPA$*q|~WlbhIRG!T&&<7Q^ z4+_L7_v6?;VtY$2d3kM_NQmunF+S^LTo*$1h~-fclo8UE`4|t-0`ZCc2^lI9)(^X) zqjna^pXRGtG-NX(ZHo4EZ)TGdckifL+BgZjU8dK1NH>u|paVeq$ny&j{%L!TxLZ9J z!$cM?vrKp+^7RyG!p>ui0wHG;VP}N_keSVUn+=+}bw5}u+LUC`NoI+*03*Wo8J6PM zNvdY?_SQlQWDaO40nF;-k~8qvyp-De zZO3s)Lt=UmlMw!=y8p4ivqe8|yZjVV2^i1$RElk_Wj z{@&oHS>XX#T^aVyo^j{E@srLoLi8pV!?)wxN{+k576c(np|Sq);wAEW<+vHOJ4$Rm z6x3L58b6e^>wRB85_7Xnw;5R7OX-9RSO)Feyzk>Rz+*Rr&*Fa;> zFf&y_fFNd6ev>>|JH|+|&K^~IGb*CHNZ1nQ^r37La`5IlqqMuQk%}$bz&rCsJXn48 zWmLYsC1M90SIMrvs!*qp3&b`OehNDT+jJJQW)ssB@)02>|jLL0FjovVVHig*xwGJp9Q4&*CK zY#d`;cu)vA2I;3|wyllqgCfqh+7mLHIwpo<_ZZik3hAA{DP(b$pp;WaJ=<7L6$Fop zjV~N%3!JNqovL88p`JTfFwoL$yg)2ww~wf0tGuJOjEpmi#&Yb(B22G=90^irr^yEt zb%8~b=0AG__0~g~Eg%soQoD*4BM~Sr>ai8I-om9==@u+J98=`T^EOvAT1!o(G^7%nsD>;zsjn&0T)Ety$f~gPW})9>``yt~!^BPWg8l$xHqccSR=!o_#U!_2n;DeQ zO>Axa<8d>NP{;rrk6@pVW)?b^3{54;^7eYHSnY5(V?TIQzqhh}_D*9jxau%fAx$E! z!i4&5wkgs%Fk>_T(5iK2IQDh@9={c-QnrV`6Qqri|jb1{=kbd|2T_>+S3|d50*zwJo zYzn?B_ZIn%3J-ZJ$B3UoQi<4fI(fu6l1d%64TlNIOK7Z*&EDX-i zdbhn`g5wB|1hvH3yWAreB#14MoMwcZ8npzn&lOk!ZwT+%{Jjbyz8NCEo-RE5S@G#; z=4P29L#`2QRzE~{GYu3o#UKci*27ahaZbvSd zC^FXsxsWA<;n??b5h6?FId&8e=#5e>bU zkcHC--W&9~i<&?>fXYPc*AJEtYm>dfyB}QTohDbZH6e>E6||N@+X=PtP?h90xyy-9 zD){=%+bOb3*hA8S_0p{r%1)zRJ1_)EC3kqf0k+D9#5d6L$41Byg$GteW~=Te@l zSvU_f$skXsq@Kl9_2|_$yxI?RQeL_)g<|&LUJ1qzT`!@PQZMPVowEX?Vl|ljo2gL6 zElu9TOlH>Jg1tO8JzHQ-#?X23n~^chy~)kY8<7Qd{s4;NHUYQ5!tcC8pm1Ip&WjHq zkUvd{TOzxD!AT^!1U=;T^O6rW2*wj~38oLZ4v0n5RA;fRE|q3kNRlsy6&)%oZ7d_N z1ic-tQMHA3w0I#w-ng~9kZI^h%>5>N7QTrJ)-HP`**_bl9D zhJEpCvy1M>jU**+yN@pxZu3ST^;H=F_*j10X_@UE)K{pZ7#<*NU+*J3N8lGy&8NW| zy2~5h@i6*K8j5vWD*pzgf;vDA0~6q$EU;$_A!}&T6`03mO`GJZHrBIH{+`MRVm=+oUYx9ZpC+51{}QA`58jZvNUjp!V*@0A>Z~m-B7> zu+@Jv>Z8K6V<@VfK|jQO8txN1L64gUH?kNXyxNlnXsD z8WtT?tPAlTVA+}!_UQY&_u{E;^JsO?7}{^Mvi?6d(s<_cjmcncEs)H{IGy+RAFQ~= zAi!{tHQI*F%W}xv-m-QUxU>;JY-1Nqz{s!{=;C?=`vCTKt9{1M4s;}&F+~Q=8U#p1 zf_5C*(dx&FsXWGwNFr?d*!?TC>BG(BVF`=MMYzG`kK9-Dj~hKJpO|j+%zp%;+`;yW z{SyjeMqyWGNAHqH%(*yF*V%{w-8p3pr+a8-nvXR(4?4tLXLZ7A84`xjU%LpD2I*szu}i>a2R8{7N=ZoGU{&5TLBd*V#g0Q3A(nDWfFd40>6+EoCiJ}S7@v%vFu+~zSm z0lW|Is)HT0(CR>$?bGMXI#(1}W(hYB(C^TbDvpyhF1#@ko(`;o>PmsMc^1d4f=(ch zf;y}cWV`Vx@e3}fw*z6zGjkXc%;e|FCL>9K=gNp{_Z%cVhB}AB?$Cuik5Ipm;oVF+ zfWN&_JyeEV0F6gb0IQS?~;YAnWzHG;JcX@aaV)4G5y?J-Mnev*b#oy ziMJ8rVv=@2VsO-YXwgak3Rs?SY@XhEibpEs5bsFY-tx6~Fw>JXJ*cN~ERyQ#8s>>0 z$w-Rf^vOGq3#%!Lk-!l5p{&E@RW?uxaabRd{fNj3agi3>oCN+=6T zw-K$LZ=~XrPfgT$9AnzNrvhmqwxwf`HO7q9P1>jwMSAgPWP%bWcF~Lyb?FtY9aV(} z@1c7-ctap1EP=pX*c1W6i7KbNMB zT8ft9!N6k-qh1(p1oDX42ID^M{_vB4(0lVpZ12o8AIY&vu21uM5muml=O$j)!BnX%yJC22Rui0LPPj$oLZ5zwFw z;BLirnt44>dMoL;x4|uEIeHKM)3|me%Pa{^qDhJjoI6l*4GMS537K82F9{+gY5vlB zkF%DThOR+<@Z9}?xmX7x90YF zy}3>B+U_Mc#Ei3^2j=zs$vyMYbKYiTj#Q!nC@6H~kLF*4tT!7s2}I)cEq-=Ub*=)78VQn1RK2o+ddCd#;(@AWhI&<4{6y&Jx1lWuRj4ziGB`uoVW5 zVp9no9#jKXEzzlodC=6ZAYV2wLF=9W>-8$4xH+&A17^1=>AUyR>mNj!Mc<@}AxDaQ znyEZT;K~uk*%s{b^&<;VnJ7-kY|YOgRdub5?$FVtyned*-Gfz*+{^3EY^#Kk+)=sn zE^z6QDLQ;0<%^eSOEa%mLpe?WkoPpmS})oyt3t83TnzTij-3--t=apgcDdZ`P!}4M z5>yt_@q`+dqh(p0lo4UASm{Z3MQ(u58NDdXkAmuZGfhw>IRiKpZAHghuR3Mk#TXdm z#5z&h&?t5_<`xyzS=MML5^G6zo!?t1V4T?=*ew@#B zpZOV_hxrfth18Y&Z|Js5h|9dJ!rSQB#fpFnk}A^{oDD*W0vj#!w{dBLacMQcJ5)~? zlU`xoNVH@6P-RS4L1a7FHIXfNRCGITIPTz0LVL^LJw^lERS?{xWD$h)$Ga)A4Oj1+ z#fupK#8s+^tge9gZ3&*+0aq^e%#^tq=-T3|04-b1B|vyCuAgeVcUO-7EZtr|5B}J; zRM(rJ1@JXu{>IJ|YrEHMOIowTieV(t0R<=8GkDE2 zJK#FO!(2$Vl{}*)+XFs6^xX+sV)V&lX*_c6%w%UJds{QAM(A`~6>(QX)0Z>ycJ1s& zp4<6C3Bkh7tF*R1W381gHs0zg=Psm~BXlD;k}7e)SQ&<9TPsb!-hsV?vXH%_H_P(M ziG%x6(8UkUIfK&_PdZ5%Sjm`Ztih&l0t+xMWReQ4Hpnx8DGhrD?kvel1Ce$)ds&KX z-Tc_M1l4p(Eg~;C(e%L<@Ke7|*{OQ>{o!P~i~JMx06i~^Dtm00HKd5l(RA%`TLk;A zF;A2{xceB72BDBaqA3Xj-#*819!)a``v<1psT=H26{LlXlkSBhGq|0YAI$^f?70o( zO11BmZ9x(JzG7Ow5B zuVl{)_Pqi50JBEGPSMpzkp2U)}F- zafa<*yq2hv)H1e9g391s7G?eBVHR8lG7)8Rav58TMZJUEx{!)2av)-~)W#{Hsdo3F z7TMj5>_YFgqMe66>?253uz9cvFN?SyE1!EuLA|-Bu?2(8gLysAn11)7Q%`#<{^NI! z!-^kiZCtbBce#6RsL6^Rdohc8(;g>+&}OUV*Iq2`_2eW}E7q zkry=;*>CaZI(7zvsnv?w%+zKZ2eW@reO3&fnnOK%VknLsuBcyR+J=zGAZ+oY@4OYi z3eEK!k*d%+p~dgI@1>*PV^yPJkUEg+lX~WzuR|!5VCoR`5Wmx-b(I7 zyN5vIE*R)`#Q1snOD>m5m9IgiY|YnG-$Dfa5W!}@kIh<~WDb@aI9Q99js6VQ;-fF$ zNVcR8eq1DmIcVKg+r0z3!y%s_rbz{N7>HnH|{K>epd{9biIkLmrN3eFOM*LMr+3bMoO?j>dULZn4nh~BAt}w zXk5?x@HRwY(}+)8qd-f09t#~i6w`FpD+t9{9(vvLZdqXlmS>F9n^0F!6$2^JzOHG6 zU4h4SaEP4?9+QEtSm%QMo}>}Hy^y6$@ctkQ=TGknNfjRZkw#QjN2~-Z0b_8w-5NL2 zttAjy<5Koo&ViO?l!$u(FLpZ6hQSbl?!+VA%*WMg46)#a2RHF3Q$KWLl}R$U-6Otn z#Qj1M@hwAK=O1`bL6Sk92Y zU0{cr+?To0Hk)1@vwkbj(Y@$MTzaqT*=?B{@jGc6T^hXNENyLv-}!DiY(@`R^XHM( zcAKxcegjGN0T;DpY&*{L5K%GVP`OIBXP!?8yOyl)rObaOH#_UP;e?6iC~Q|@F9la{ zp{!x|(O*Z+q!Hk^+?-=IBX%+L8n~lr1t;$*oY(U^dr0hR;H@XM-kr(U4z0bUCPMwg8$#T{ zyuq{8A6m4r6WLhvM;guCC0@m|=7mcp@1$q`9rJoJH^*fSPdI8)jLqrC>q|Djr$*dQ zWaOEE`!K)W0qNfC?S;VRhc0E}_q!7lWArOix_QBLxTx@G7W=Us_M;!=Cs+R2lgO~} z>zrl!A-A2y9mzXX6UtlbQ*Xpp*%2##Z^EolMPo3S6%f8}JKog*t7kTI`T6i2JPX>b zOD_(cd6=^$t3%;&=H^_w0XhnU0W%~O$EOCnyt$R&hh|ps=6BIGSYTbyaqmRZ?ebLv zntyiC$FnhxXyXfCH6U(nZ~YkJU{{|g{jQYXmFC5v%(NYVwws{!eiGV74k{YrDH{0- z_B4c#{sJ8|EGn9wC>!IYvi^Q_pUhj=8Uu=@AU&-l_Aj~-ME#6fCvO%zi$a&LAsCV# z?=Wn&?Zimk2ALQ(=Ik>uQ3Nsu7gF@O8>uDHQ&OdBX{&<%aE?qGrdlLXR84xpG`p53 z4k(I`B2vMrBPyMjwhE-=um0_s1Qz8dOw2B7Hy^0VHD%lL9r!3ydrL!Ou5Q6(^ED!n zm8}geb*HYaKYeXx!J?|{M0}B}dUEu`S#@hO_*>Law`giMGjGAPY<6X9SGIB8y6Oqp zd2RT1P42Iziz>ztdf(`s7RGue$`V=eP-iRSouWoMY327rU~9*$T_r|>hh=tQ?H90Y{*`F&ZkkVQ-ZGC^|3CRIf}J;` zraqQiY|U;~0B%Mhe*6#mHI4LZO~d)QZ0D+m4%nc4!^(I>1ws1i?EJ2LZe6w%)r{rh z#!t{o&f3KzgS^lX3|6IcHr=`Ed zuv3Q-wdv0d(qAY12A^MUA{-3tZsG6m^XCWYpAi0NpFcO?zaacWef~QG{=s6{-|X|3 z1pFDo=Vz5{{TBuNbA^AjpFS7xFA=_0{&m8i{3nEeke~j{ApHx%-_PgI z3-||iq`Sk(+T;adoPhS`CFDa7$b;8%`e|Hi76T%*w*v+WT7i`4&6A()e*WA^4k) zfAny*%cCpE<9aDW)3JWxYi-yrd~FPvf>S9?2h&_JRNSxMSwa0~3V(*rzcAo06aJAt zzaijXD*R`Ce)&@z;b36b3t!WLe&HYCr(YK2zg_s6j;BUa!c*7UPxZVhsOP?W6El@MgZ^jhKyflA4%MSd;>_{mcs99S_(%ABPaoTb z-{kYlvrY~hg+I>cHwNWz623Mbw-({=D#EYiEf{^gR~6yc7vZ-T;cqO$-&BOZwFrM# z5q{-sNbm*PFZ?ShlGTy&ZtkEopxrXwE<%`1kBgIceVms(jzk=nhi4P77XB)lpKSVy z#&XJlbnp)0ALXa_Y|0}=@_)Wa`UCf&j8iGCel@~Bh9cSetq62cffxRGO z>@tKyIzYB$T~N*?lFt-BAH-RMDAdo_316${-9`9M6sRZV|3VS|!TVChQYo$c8NyFf zB&!D^2g?6k;nR1M9sgpl{RPsK9OsCh{sG~b9JdGgJSh1j%~4d3r-c7*gk3$#*K!8L zAHfb@Ds__2zbMH6aN*NYjZ5Dd@aG7>*5{YccKJ66e_n`h<|ZnCgYakgeCR<3av=VV z!cY5rPtFetU-NOE68_u$^qwC-f*tf^n@45-K*q~_ghTyMZk%C?vrFR4iN^8f#uh0@ ztH)JE>ake#wNO3QNt{CUc)mzI4rFIpmxmo!h3b(Kohww2OQal49@iDAN0XFMs2*3A zP>&JxlnVYP)Bo%^z97)=!-ao}&tD(#=Lr8WpYN^Xn}mP7&tDy+-yrd2(16Y z*T&a_!q>*vQ^MEA*9aas@OAz2z43Lp@U`(ZNBEl0*HnbRp$PxRBK!x1U*p#w_Jc%B z@_S17s{P{)lvGNaZx0v#;eP(cWo3V4j_~LDd~uqo{3hXR_IZQw*M`y?1?2u0{sf;- zlO%o<|3TsN(6{<4`%qNpt7IIF!&-QRp9f@AaYzMclm>o>#9M}NC|d%`}OpEufMPr<&Oqq;6{m~jll>mCzO5+JL{=bQXA9YPZfS4 zJvvw7X#ISN@U`)Fo$xh1yIc6rZh2ADQ&!MNHaUd)0oX;u_=Sn-za=d&JPNor!bq|JLi5%_(@}dShvYocn8Aa z`O#E@>M)KsH&Uq_!mgd(x~W$9N#ljmuM&RJ+(7&*g|FG%n}x6G`WE49>y{nD*X+qC z9)zh>wcoy$pby3gU+aTf;h*8Bmq~@&FMLftR|>x?l-@Y*^esiwUnTqnR0-Sua#MkGMEA&wIl;O8Og0F*ZC@sQ zP3JEaev-V>sLS=jFC>o#C5|SKr-ZM`V+3!&>wSK>@Y{TOm75K0>W?|X*KB)}@OkUW z_SYGK&TbICCZijLPkrOYMPrcu!2;>iNb;2MJN)!CZe;C7Lt>MRi!UKOA{y^=L0MH? zi30nd!e`gQw$-~+*Ip$3M&Y06*TGvaFBRQAAzDv!oX6wi5y^wyJ6i|2vqJs#yzp5q zEZ;kSKae|8Z(~gXK8f)KspF&3I+D!4AIS0&$w#Z_bw&7h3t!W#Cxox*)eFK8jjeJs z;gFmT=805a@6Qna48(PMi8k7E%X5W)htDs+odrPoUn2agLj3nT{&m9VC9CZx@9x>% z!q;s56T;{2w&}fb^Mdfxe)-^!+df11$5SL*KVueo9G)wD zZJb>qe64@4E0X?h;V0SsG^+H3@aOsUqcM0&Fb2(LRw~6?;kFIl9pW@^cBN7oKM$Gj zsf?Mz|C!IHGQJm-(Ijz}`*F(6#uDYRLHJ`a-#R%WkBTwDJbSam$%pc2b7N(T@HJi8 zA$)C5V-zcie&=VL@I&cQN2&qodadv^U0Nml(?j()hjf(w$|C7+7Jic7MCrE(KS|eU z{BIOpzXjpY{3bq4`L#iR9moouy!Sz6)d-*6B&##BPnZUOvG7+T?E2IAaBN&Dk988~ z%YK~lTU>u$Bm8qhd}I75{bu36!Pl9JN_Wn-P5568rT>!4f4A^w_o<@3dBdLB%h5vfW#LCFH@~JeSb;8%iCdIi<;yi}1%L8SU|2XKYeu+~XiSr(* z$9Cas{)k!d>NY;jPGc&i&9O6upQLvrhh@Uo=8#K;pCl(rf4%UTSUGy@@_ym}*>8XO zA6!3g7k*Mdrzs6DhEu6;`RPfNAjR+?9_%P;U~3`^4uW& zLgVFTi8Cou#`#jl7U9z#j?IndX@0CzP?TPC;9oyJvH(>^P=ldBOJ1E#`Zi$ zjivs0Uh+BL&!^m6;3WQmHN;4^e`(+~!e8p!9+Jg^Ko(0SP6uUV+gffeZBQBOgdZCJ zvYA6|nJIevA%sJ1A>F*3yN%n@FZrB{ctJV5RA&Bm;j_83_3(TYbMTkkR;p*36)u(P z3*~>M)0>&XPtt8lzfAaDq4Z{7i};roNq>Ej^!>tL63XA4_fY=Zg&&%?=^z3;;+sof z`n;cJ=Q5Sj#`a9%Q$Gdr|A3RvGT|qUD{jB=lYBVhUoU*kzV-`WlmB+%Yd&Ub3ROJ$ z`Ij{CwD8|Rk*xk0@e-o`(a;!?`pb(+5h_yr9h4ZW!n~zD0sj_d7yGM7*(bmP)@ut$cui*D7_yY?5pn`uVhExBSr2?Gvm;Pw&SMJI4 zP)5!FDpC){@@ePz0nU0SX)01%V)3ux_yI202{=VX>U**HcX9jxXMfz~|8Ok+4vrt- z;rf3+7QYfmc`Cr?NZv#$Qa_BvpULq9+{RxGob<#du=Krx(=AU>c{?1g7~i@ zwN=4?qToMM@JAHKk# zRPaA3_@5PgmxBLA!T+k@&nx)f6@0gX|4YH`6S*PvfnNPri4Rkd@K=#4SMU)EzL$cJ zQt*8gd|w5By@FRN`2Grhpn@Ny;A0g0%?f_7f*+#bX$2pv;D;;tkqSOe!H-t(V-);Y z1wT%~k5}+&1)r$kH3~jS!KWzrR0W@|;4>8bLBj!B0`}ISQUp@Y58$ zPQg!C@c9aUhJv4|;ENP|iGrV{;AboNI~4pJ1wT*0vkKmz;Ef8NQ}C4v-mKu~EBG1( zZ&UCK6ueWxyA=FF1;0qa->u-6DENC6{89zKOu;uO_!SENeg(f$!9SqjS1I@h6?~(D ze?-BrR`8E2_%#atDFwey!9Szm*DLr93jR3-ze&Nrpy0PC_^k?ln}UB?!8a-RR~7tg z3jTEk|AvBpQ^CKb;CCzdJqrG91@Bkz`xX2_1^^ z{Iv@HIt3rC;FSu#zk(mA;0G!A7zKZ`g4;Jhg{57QIz)+osDh^ze5``MO~H>)@FNxc z?FxRBf*-Bm$13=E1+P-@2?}1L;FA@6ih@s5@DmjLLcx4D)?mz-mT!5EBF-(ex-u z{wD?BrQm;6@V_be^9ufV1>ddU|5ET56#Tym9y(Tbi;s$wJ9c&$1u9Y%{xP)URis8L z_}&Ws8U=r?g1=6|M=SV#3VwisAE@95Dfk-|{7nk}76pH+f*+#bX$2pv;D;;tkqSOe z!H-t(V-@^31wUTFs}y{Kg4ZbcWCfq9;L{X*x`NM8@DmmMBn6+T;HN0~90fmB!B120 zIt8Dr;PVuGfr8g7_(BC=tl(!U_)-Obr-GlW;O|oKWeUDr!5bAkr{F6Uyjj7|SMW6o z-lpK~3f`gMoeJKi;A<6poq}Ji;Fl=)dldXq1;0$eHz@cO3Vx-6_b7O;f?uWJA5`!U zDfovK{38l}wSs?4!9Stk*C_a>VmRFpqkEF&BaM5&_l3n%s7PHKi%+bI)Tb5vvkHEL zf`3lIZ&L6tDEKW3{zV19O~Jpc;F}cuD+>NK1;0bV?~LJe1B&|PZ0Q%iXYBgr8?pGN zU%si}cPsckG5iERS%@DmtYc^&sX;)@N%TPhAR%+2`or!eKFdJ;y&hhTqQk5i$IGjPtGY5bvLi%LCOO=NRt4 zaUNoV=P@o1+IrkR#^pf_58ukTJhb59Bln^oa+%-5Co(RV+&%m<#^v(5hd;nLKl$&W zsnmZM=cfch_>8^j=kyRpKh`jQLJa=|<1=FTcNpiV#X`KN8RsWjLim3fpB2LB#}vNE zIy;8v8TYN4iEjiVEnuoKI%0Dy(@;F$T&a65aONB__7d2Kkj0@A%_2+@#Qi6 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