From 29b1848551623f8233d016baf8d1664cbbe2ed9e Mon Sep 17 00:00:00 2001 From: Will Date: Sun, 20 Mar 2016 15:55:25 +0900 Subject: [PATCH] refactor dependencies & bundle openssl --- .gitignore | 16 +- Makefile | 45 +- deps/LuaJIT-2.0.4.tar.gz | Bin 0 -> 847615 bytes deps/luajit/COPYRIGHT | 56 - deps/luajit/Makefile | 151 - deps/luajit/README | 16 - deps/luajit/doc/bluequad-print.css | 166 - deps/luajit/doc/bluequad.css | 325 - deps/luajit/doc/changes.html | 978 --- deps/luajit/doc/contact.html | 102 - deps/luajit/doc/ext_c_api.html | 187 - deps/luajit/doc/ext_ffi.html | 330 - deps/luajit/doc/ext_ffi_api.html | 566 -- deps/luajit/doc/ext_ffi_semantics.html | 1245 ---- deps/luajit/doc/ext_ffi_tutorial.html | 601 -- deps/luajit/doc/ext_jit.html | 199 - deps/luajit/doc/extensions.html | 408 -- deps/luajit/doc/faq.html | 184 - deps/luajit/doc/img/contact.png | Bin 1340 -> 0 bytes deps/luajit/doc/install.html | 646 -- deps/luajit/doc/luajit.html | 234 - deps/luajit/doc/running.html | 306 - deps/luajit/doc/status.html | 116 - deps/luajit/dynasm/dasm_arm.h | 456 -- deps/luajit/dynasm/dasm_arm.lua | 1125 ---- deps/luajit/dynasm/dasm_mips.h | 416 -- deps/luajit/dynasm/dasm_mips.lua | 953 --- deps/luajit/dynasm/dasm_ppc.h | 412 -- deps/luajit/dynasm/dasm_ppc.lua | 1249 ---- deps/luajit/dynasm/dasm_proto.h | 83 - deps/luajit/dynasm/dasm_x64.lua | 12 - deps/luajit/dynasm/dasm_x86.h | 471 -- deps/luajit/dynasm/dasm_x86.lua | 1945 ------ deps/luajit/dynasm/dynasm.lua | 1094 ---- deps/luajit/etc/luajit.1 | 88 - deps/luajit/etc/luajit.pc | 25 - deps/luajit/src/Makefile | 684 --- deps/luajit/src/Makefile.dep | 226 - deps/luajit/src/host/README | 4 - deps/luajit/src/host/buildvm.c | 516 -- deps/luajit/src/host/buildvm.h | 104 - deps/luajit/src/host/buildvm_asm.c | 313 - deps/luajit/src/host/buildvm_fold.c | 229 - deps/luajit/src/host/buildvm_lib.c | 398 -- deps/luajit/src/host/buildvm_peobj.c | 368 -- deps/luajit/src/host/genminilua.lua | 428 -- deps/luajit/src/host/minilua.c | 7770 ------------------------ deps/luajit/src/jit/bc.lua | 191 - deps/luajit/src/jit/bcsave.lua | 659 -- deps/luajit/src/jit/dis_arm.lua | 689 --- deps/luajit/src/jit/dis_mips.lua | 428 -- deps/luajit/src/jit/dis_mipsel.lua | 20 - deps/luajit/src/jit/dis_ppc.lua | 591 -- deps/luajit/src/jit/dis_x64.lua | 20 - deps/luajit/src/jit/dis_x86.lua | 836 --- deps/luajit/src/jit/dump.lua | 699 --- deps/luajit/src/jit/v.lua | 167 - deps/luajit/src/lauxlib.h | 167 - deps/luajit/src/lib_aux.c | 356 -- deps/luajit/src/lib_base.c | 683 --- deps/luajit/src/lib_bit.c | 74 - deps/luajit/src/lib_debug.c | 405 -- deps/luajit/src/lib_ffi.c | 851 --- deps/luajit/src/lib_init.c | 55 - deps/luajit/src/lib_io.c | 539 -- deps/luajit/src/lib_jit.c | 663 -- deps/luajit/src/lib_math.c | 233 - deps/luajit/src/lib_os.c | 287 - deps/luajit/src/lib_package.c | 602 -- deps/luajit/src/lib_string.c | 940 --- deps/luajit/src/lib_table.c | 300 - deps/luajit/src/lj.supp | 26 - deps/luajit/src/lj_alloc.c | 1396 ----- deps/luajit/src/lj_alloc.h | 17 - deps/luajit/src/lj_api.c | 1200 ---- deps/luajit/src/lj_arch.h | 437 -- deps/luajit/src/lj_asm.c | 1920 ------ deps/luajit/src/lj_asm.h | 17 - deps/luajit/src/lj_asm_arm.h | 2361 ------- deps/luajit/src/lj_asm_mips.h | 1977 ------ deps/luajit/src/lj_asm_ppc.h | 2169 ------- deps/luajit/src/lj_asm_x86.h | 2806 --------- deps/luajit/src/lj_bc.c | 14 - deps/luajit/src/lj_bc.h | 261 - deps/luajit/src/lj_bcdump.h | 66 - deps/luajit/src/lj_bcread.c | 476 -- deps/luajit/src/lj_bcwrite.c | 396 -- deps/luajit/src/lj_carith.c | 353 -- deps/luajit/src/lj_carith.h | 27 - deps/luajit/src/lj_ccall.c | 900 --- deps/luajit/src/lj_ccall.h | 171 - deps/luajit/src/lj_ccallback.c | 644 -- deps/luajit/src/lj_ccallback.h | 25 - deps/luajit/src/lj_cconv.c | 752 --- deps/luajit/src/lj_cconv.h | 70 - deps/luajit/src/lj_cdata.c | 285 - deps/luajit/src/lj_cdata.h | 75 - deps/luajit/src/lj_char.c | 43 - deps/luajit/src/lj_char.h | 42 - deps/luajit/src/lj_clib.c | 409 -- deps/luajit/src/lj_clib.h | 29 - deps/luajit/src/lj_cparse.c | 1872 ------ deps/luajit/src/lj_cparse.h | 65 - deps/luajit/src/lj_crecord.c | 1671 ----- deps/luajit/src/lj_crecord.h | 31 - deps/luajit/src/lj_ctype.c | 634 -- deps/luajit/src/lj_ctype.h | 461 -- deps/luajit/src/lj_debug.c | 605 -- deps/luajit/src/lj_debug.h | 61 - deps/luajit/src/lj_def.h | 353 -- deps/luajit/src/lj_dispatch.c | 494 -- deps/luajit/src/lj_dispatch.h | 131 - deps/luajit/src/lj_emit_arm.h | 356 -- deps/luajit/src/lj_emit_mips.h | 211 - deps/luajit/src/lj_emit_ppc.h | 238 - deps/luajit/src/lj_emit_x86.h | 466 -- deps/luajit/src/lj_err.c | 800 --- deps/luajit/src/lj_err.h | 41 - deps/luajit/src/lj_errmsg.h | 193 - deps/luajit/src/lj_ff.h | 18 - deps/luajit/src/lj_ffrecord.c | 888 --- deps/luajit/src/lj_ffrecord.h | 24 - deps/luajit/src/lj_frame.h | 183 - deps/luajit/src/lj_func.c | 185 - deps/luajit/src/lj_func.h | 24 - deps/luajit/src/lj_gc.c | 849 --- deps/luajit/src/lj_gc.h | 134 - deps/luajit/src/lj_gdbjit.c | 795 --- deps/luajit/src/lj_gdbjit.h | 22 - deps/luajit/src/lj_ir.c | 501 -- deps/luajit/src/lj_ir.h | 551 -- deps/luajit/src/lj_ircall.h | 277 - deps/luajit/src/lj_iropt.h | 161 - deps/luajit/src/lj_jit.h | 417 -- deps/luajit/src/lj_lex.c | 482 -- deps/luajit/src/lj_lex.h | 85 - deps/luajit/src/lj_lib.c | 258 - deps/luajit/src/lj_lib.h | 112 - deps/luajit/src/lj_load.c | 168 - deps/luajit/src/lj_mcode.c | 386 -- deps/luajit/src/lj_mcode.h | 30 - deps/luajit/src/lj_meta.c | 466 -- deps/luajit/src/lj_meta.h | 37 - deps/luajit/src/lj_obj.c | 35 - deps/luajit/src/lj_obj.h | 856 --- deps/luajit/src/lj_opt_dce.c | 78 - deps/luajit/src/lj_opt_fold.c | 2304 ------- deps/luajit/src/lj_opt_loop.c | 436 -- deps/luajit/src/lj_opt_mem.c | 916 --- deps/luajit/src/lj_opt_narrow.c | 656 -- deps/luajit/src/lj_opt_sink.c | 245 - deps/luajit/src/lj_opt_split.c | 731 --- deps/luajit/src/lj_parse.c | 2754 --------- deps/luajit/src/lj_parse.h | 18 - deps/luajit/src/lj_record.c | 2252 ------- deps/luajit/src/lj_record.h | 44 - deps/luajit/src/lj_snap.c | 866 --- deps/luajit/src/lj_snap.h | 34 - deps/luajit/src/lj_state.c | 287 - deps/luajit/src/lj_state.h | 35 - deps/luajit/src/lj_str.c | 339 -- deps/luajit/src/lj_str.h | 50 - deps/luajit/src/lj_strscan.c | 498 -- deps/luajit/src/lj_strscan.h | 39 - deps/luajit/src/lj_tab.c | 631 -- deps/luajit/src/lj_tab.h | 70 - deps/luajit/src/lj_target.h | 162 - deps/luajit/src/lj_target_arm.h | 274 - deps/luajit/src/lj_target_mips.h | 257 - deps/luajit/src/lj_target_ppc.h | 280 - deps/luajit/src/lj_target_x86.h | 342 -- deps/luajit/src/lj_trace.c | 816 --- deps/luajit/src/lj_trace.h | 53 - deps/luajit/src/lj_traceerr.h | 61 - deps/luajit/src/lj_udata.c | 34 - deps/luajit/src/lj_udata.h | 14 - deps/luajit/src/lj_vm.h | 116 - deps/luajit/src/lj_vmevent.c | 57 - deps/luajit/src/lj_vmevent.h | 59 - deps/luajit/src/lj_vmmath.c | 140 - deps/luajit/src/ljamalg.c | 93 - deps/luajit/src/lua.h | 393 -- deps/luajit/src/lua.hpp | 9 - deps/luajit/src/luaconf.h | 156 - deps/luajit/src/luajit.c | 571 -- deps/luajit/src/luajit.h | 70 - deps/luajit/src/lualib.h | 43 - deps/luajit/src/msvcbuild.bat | 113 - deps/luajit/src/ps4build.bat | 103 - deps/luajit/src/psvitabuild.bat | 93 - deps/luajit/src/vm_arm.dasc | 4486 -------------- deps/luajit/src/vm_mips.dasc | 4241 ------------- deps/luajit/src/vm_ppc.dasc | 5160 ---------------- deps/luajit/src/vm_ppcspe.dasc | 3691 ----------- deps/luajit/src/vm_x86.dasc | 6377 ------------------- deps/luajit/src/xedkbuild.bat | 92 - deps/openssl-1.0.2g.tar.gz | Bin 0 -> 5266102 bytes src/script.h | 6 +- src/wrk.h | 2 +- 199 files changed, 39 insertions(+), 114300 deletions(-) create mode 100644 deps/LuaJIT-2.0.4.tar.gz delete mode 100644 deps/luajit/COPYRIGHT delete mode 100644 deps/luajit/Makefile delete mode 100644 deps/luajit/README delete mode 100644 deps/luajit/doc/bluequad-print.css delete mode 100644 deps/luajit/doc/bluequad.css delete mode 100644 deps/luajit/doc/changes.html delete mode 100644 deps/luajit/doc/contact.html delete mode 100644 deps/luajit/doc/ext_c_api.html delete mode 100644 deps/luajit/doc/ext_ffi.html delete mode 100644 deps/luajit/doc/ext_ffi_api.html delete mode 100644 deps/luajit/doc/ext_ffi_semantics.html delete mode 100644 deps/luajit/doc/ext_ffi_tutorial.html delete mode 100644 deps/luajit/doc/ext_jit.html delete mode 100644 deps/luajit/doc/extensions.html delete mode 100644 deps/luajit/doc/faq.html delete mode 100644 deps/luajit/doc/img/contact.png delete mode 100644 deps/luajit/doc/install.html delete mode 100644 deps/luajit/doc/luajit.html delete mode 100644 deps/luajit/doc/running.html delete mode 100644 deps/luajit/doc/status.html delete mode 100644 deps/luajit/dynasm/dasm_arm.h delete mode 100644 deps/luajit/dynasm/dasm_arm.lua delete mode 100644 deps/luajit/dynasm/dasm_mips.h delete mode 100644 deps/luajit/dynasm/dasm_mips.lua delete mode 100644 deps/luajit/dynasm/dasm_ppc.h delete mode 100644 deps/luajit/dynasm/dasm_ppc.lua delete mode 100644 deps/luajit/dynasm/dasm_proto.h delete mode 100644 deps/luajit/dynasm/dasm_x64.lua delete mode 100644 deps/luajit/dynasm/dasm_x86.h delete mode 100644 deps/luajit/dynasm/dasm_x86.lua delete mode 100644 deps/luajit/dynasm/dynasm.lua delete mode 100644 deps/luajit/etc/luajit.1 delete mode 100644 deps/luajit/etc/luajit.pc delete mode 100644 deps/luajit/src/Makefile delete mode 100644 deps/luajit/src/Makefile.dep delete mode 100644 deps/luajit/src/host/README delete mode 100644 deps/luajit/src/host/buildvm.c delete mode 100644 deps/luajit/src/host/buildvm.h delete mode 100644 deps/luajit/src/host/buildvm_asm.c delete mode 100644 deps/luajit/src/host/buildvm_fold.c delete mode 100644 deps/luajit/src/host/buildvm_lib.c delete mode 100644 deps/luajit/src/host/buildvm_peobj.c delete mode 100644 deps/luajit/src/host/genminilua.lua delete mode 100644 deps/luajit/src/host/minilua.c delete mode 100644 deps/luajit/src/jit/bc.lua delete mode 100644 deps/luajit/src/jit/bcsave.lua delete mode 100644 deps/luajit/src/jit/dis_arm.lua delete mode 100644 deps/luajit/src/jit/dis_mips.lua delete mode 100644 deps/luajit/src/jit/dis_mipsel.lua delete mode 100644 deps/luajit/src/jit/dis_ppc.lua delete mode 100644 deps/luajit/src/jit/dis_x64.lua delete mode 100644 deps/luajit/src/jit/dis_x86.lua delete mode 100644 deps/luajit/src/jit/dump.lua delete mode 100644 deps/luajit/src/jit/v.lua delete mode 100644 deps/luajit/src/lauxlib.h delete mode 100644 deps/luajit/src/lib_aux.c delete mode 100644 deps/luajit/src/lib_base.c delete mode 100644 deps/luajit/src/lib_bit.c delete mode 100644 deps/luajit/src/lib_debug.c delete mode 100644 deps/luajit/src/lib_ffi.c delete mode 100644 deps/luajit/src/lib_init.c delete mode 100644 deps/luajit/src/lib_io.c delete mode 100644 deps/luajit/src/lib_jit.c delete mode 100644 deps/luajit/src/lib_math.c delete mode 100644 deps/luajit/src/lib_os.c delete mode 100644 deps/luajit/src/lib_package.c delete mode 100644 deps/luajit/src/lib_string.c delete mode 100644 deps/luajit/src/lib_table.c delete mode 100644 deps/luajit/src/lj.supp delete mode 100644 deps/luajit/src/lj_alloc.c delete mode 100644 deps/luajit/src/lj_alloc.h delete mode 100644 deps/luajit/src/lj_api.c delete mode 100644 deps/luajit/src/lj_arch.h delete mode 100644 deps/luajit/src/lj_asm.c delete mode 100644 deps/luajit/src/lj_asm.h delete mode 100644 deps/luajit/src/lj_asm_arm.h delete mode 100644 deps/luajit/src/lj_asm_mips.h delete mode 100644 deps/luajit/src/lj_asm_ppc.h delete mode 100644 deps/luajit/src/lj_asm_x86.h delete mode 100644 deps/luajit/src/lj_bc.c delete mode 100644 deps/luajit/src/lj_bc.h delete mode 100644 deps/luajit/src/lj_bcdump.h delete mode 100644 deps/luajit/src/lj_bcread.c delete mode 100644 deps/luajit/src/lj_bcwrite.c delete mode 100644 deps/luajit/src/lj_carith.c delete mode 100644 deps/luajit/src/lj_carith.h delete mode 100644 deps/luajit/src/lj_ccall.c delete mode 100644 deps/luajit/src/lj_ccall.h delete mode 100644 deps/luajit/src/lj_ccallback.c delete mode 100644 deps/luajit/src/lj_ccallback.h delete mode 100644 deps/luajit/src/lj_cconv.c delete mode 100644 deps/luajit/src/lj_cconv.h delete mode 100644 deps/luajit/src/lj_cdata.c delete mode 100644 deps/luajit/src/lj_cdata.h delete mode 100644 deps/luajit/src/lj_char.c delete mode 100644 deps/luajit/src/lj_char.h delete mode 100644 deps/luajit/src/lj_clib.c delete mode 100644 deps/luajit/src/lj_clib.h delete mode 100644 deps/luajit/src/lj_cparse.c delete mode 100644 deps/luajit/src/lj_cparse.h delete mode 100644 deps/luajit/src/lj_crecord.c delete mode 100644 deps/luajit/src/lj_crecord.h delete mode 100644 deps/luajit/src/lj_ctype.c delete mode 100644 deps/luajit/src/lj_ctype.h delete mode 100644 deps/luajit/src/lj_debug.c delete mode 100644 deps/luajit/src/lj_debug.h delete mode 100644 deps/luajit/src/lj_def.h delete mode 100644 deps/luajit/src/lj_dispatch.c delete mode 100644 deps/luajit/src/lj_dispatch.h delete mode 100644 deps/luajit/src/lj_emit_arm.h delete mode 100644 deps/luajit/src/lj_emit_mips.h delete mode 100644 deps/luajit/src/lj_emit_ppc.h delete mode 100644 deps/luajit/src/lj_emit_x86.h delete mode 100644 deps/luajit/src/lj_err.c delete mode 100644 deps/luajit/src/lj_err.h delete mode 100644 deps/luajit/src/lj_errmsg.h delete mode 100644 deps/luajit/src/lj_ff.h delete mode 100644 deps/luajit/src/lj_ffrecord.c delete mode 100644 deps/luajit/src/lj_ffrecord.h delete mode 100644 deps/luajit/src/lj_frame.h delete mode 100644 deps/luajit/src/lj_func.c delete mode 100644 deps/luajit/src/lj_func.h delete mode 100644 deps/luajit/src/lj_gc.c delete mode 100644 deps/luajit/src/lj_gc.h delete mode 100644 deps/luajit/src/lj_gdbjit.c delete mode 100644 deps/luajit/src/lj_gdbjit.h delete mode 100644 deps/luajit/src/lj_ir.c delete mode 100644 deps/luajit/src/lj_ir.h delete mode 100644 deps/luajit/src/lj_ircall.h delete mode 100644 deps/luajit/src/lj_iropt.h delete mode 100644 deps/luajit/src/lj_jit.h delete mode 100644 deps/luajit/src/lj_lex.c delete mode 100644 deps/luajit/src/lj_lex.h delete mode 100644 deps/luajit/src/lj_lib.c delete mode 100644 deps/luajit/src/lj_lib.h delete mode 100644 deps/luajit/src/lj_load.c delete mode 100644 deps/luajit/src/lj_mcode.c delete mode 100644 deps/luajit/src/lj_mcode.h delete mode 100644 deps/luajit/src/lj_meta.c delete mode 100644 deps/luajit/src/lj_meta.h delete mode 100644 deps/luajit/src/lj_obj.c delete mode 100644 deps/luajit/src/lj_obj.h delete mode 100644 deps/luajit/src/lj_opt_dce.c delete mode 100644 deps/luajit/src/lj_opt_fold.c delete mode 100644 deps/luajit/src/lj_opt_loop.c delete mode 100644 deps/luajit/src/lj_opt_mem.c delete mode 100644 deps/luajit/src/lj_opt_narrow.c delete mode 100644 deps/luajit/src/lj_opt_sink.c delete mode 100644 deps/luajit/src/lj_opt_split.c delete mode 100644 deps/luajit/src/lj_parse.c delete mode 100644 deps/luajit/src/lj_parse.h delete mode 100644 deps/luajit/src/lj_record.c delete mode 100644 deps/luajit/src/lj_record.h delete mode 100644 deps/luajit/src/lj_snap.c delete mode 100644 deps/luajit/src/lj_snap.h delete mode 100644 deps/luajit/src/lj_state.c delete mode 100644 deps/luajit/src/lj_state.h delete mode 100644 deps/luajit/src/lj_str.c delete mode 100644 deps/luajit/src/lj_str.h delete mode 100644 deps/luajit/src/lj_strscan.c delete mode 100644 deps/luajit/src/lj_strscan.h delete mode 100644 deps/luajit/src/lj_tab.c delete mode 100644 deps/luajit/src/lj_tab.h delete mode 100644 deps/luajit/src/lj_target.h delete mode 100644 deps/luajit/src/lj_target_arm.h delete mode 100644 deps/luajit/src/lj_target_mips.h delete mode 100644 deps/luajit/src/lj_target_ppc.h delete mode 100644 deps/luajit/src/lj_target_x86.h delete mode 100644 deps/luajit/src/lj_trace.c delete mode 100644 deps/luajit/src/lj_trace.h delete mode 100644 deps/luajit/src/lj_traceerr.h delete mode 100644 deps/luajit/src/lj_udata.c delete mode 100644 deps/luajit/src/lj_udata.h delete mode 100644 deps/luajit/src/lj_vm.h delete mode 100644 deps/luajit/src/lj_vmevent.c delete mode 100644 deps/luajit/src/lj_vmevent.h delete mode 100644 deps/luajit/src/lj_vmmath.c delete mode 100644 deps/luajit/src/ljamalg.c delete mode 100644 deps/luajit/src/lua.h delete mode 100644 deps/luajit/src/lua.hpp delete mode 100644 deps/luajit/src/luaconf.h delete mode 100644 deps/luajit/src/luajit.c delete mode 100644 deps/luajit/src/luajit.h delete mode 100644 deps/luajit/src/lualib.h delete mode 100644 deps/luajit/src/msvcbuild.bat delete mode 100644 deps/luajit/src/ps4build.bat delete mode 100644 deps/luajit/src/psvitabuild.bat delete mode 100644 deps/luajit/src/vm_arm.dasc delete mode 100644 deps/luajit/src/vm_mips.dasc delete mode 100644 deps/luajit/src/vm_ppc.dasc delete mode 100644 deps/luajit/src/vm_ppcspe.dasc delete mode 100644 deps/luajit/src/vm_x86.dasc delete mode 100644 deps/luajit/src/xedkbuild.bat create mode 100644 deps/openssl-1.0.2g.tar.gz diff --git a/.gitignore b/.gitignore index f8548036..e25de364 100644 --- a/.gitignore +++ b/.gitignore @@ -1,16 +1,2 @@ -*.o -*.a +obj/ wrk - -deps/luajit/src/host/buildvm -deps/luajit/src/host/buildvm_arch.h -deps/luajit/src/host/minilua -deps/luajit/src/jit/vmdef.lua -deps/luajit/src/lj_bcdef.h -deps/luajit/src/lj_ffdef.h -deps/luajit/src/lj_folddef.h -deps/luajit/src/lj_libdef.h -deps/luajit/src/lj_recdef.h -deps/luajit/src/lj_vm.s -deps/luajit/src/lua/ -deps/luajit/src/luajit diff --git a/Makefile b/Makefile index a0a62c1d..407250cd 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ CFLAGS := -std=c99 -Wall -O2 -D_REENTRANT -LIBS := -lpthread -lm -lcrypto -lssl +LIBS := -lpthread -lm -lssl -lcrypto TARGET := $(shell uname -s | tr '[A-Z]' '[a-z]' 2>/dev/null || echo unknown) @@ -24,37 +24,60 @@ BIN := wrk ODIR := obj OBJ := $(patsubst %.c,$(ODIR)/%.o,$(SRC)) $(ODIR)/bytecode.o -LDIR = deps/luajit/src -LIBS := -lluajit $(LIBS) -CFLAGS += -I$(LDIR) -LDFLAGS += -L$(LDIR) +LIBS := -lluajit-5.1 $(LIBS) +CFLAGS += -I$(ODIR)/include +LDFLAGS += -L$(ODIR)/lib +DEPS := $(ODIR)/lib/libluajit-5.1.a $(ODIR)/lib/libssl.a all: $(BIN) clean: - $(RM) $(BIN) obj/* - @$(MAKE) -C deps/luajit clean + $(RM) -rf $(BIN) obj/* $(BIN): $(OBJ) @echo LINK $(BIN) @$(CC) $(LDFLAGS) -o $@ $^ $(LIBS) -$(OBJ): config.h Makefile $(LDIR)/libluajit.a | $(ODIR) +$(OBJ): config.h Makefile $(DEPS) | $(ODIR) $(ODIR): @mkdir -p $@ $(ODIR)/bytecode.o: src/wrk.lua @echo LUAJIT $< - @$(SHELL) -c 'cd $(LDIR) && ./luajit -b $(CURDIR)/$< $(CURDIR)/$@' + @$(SHELL) -c 'obj/bin/luajit -b $(CURDIR)/$< $(CURDIR)/$@' $(ODIR)/%.o : %.c @echo CC $< @$(CC) $(CFLAGS) -c -o $@ $< -$(LDIR)/libluajit.a: +# Dependencies + +LUAJIT := $(notdir $(patsubst %.tar.gz,%,$(wildcard deps/LuaJIT*.tar.gz))) +OPENSSL := $(notdir $(patsubst %.tar.gz,%,$(wildcard deps/openssl*.tar.gz))) + +OPENSSL_OPTS = no-shared no-ssl2 no-psk no-srp no-dtls no-idea --prefix=$(abspath $(ODIR)) + +$(ODIR)/$(LUAJIT): deps/$(LUAJIT).tar.gz | $(ODIR) + @tar -C $(ODIR) -xf $< + +$(ODIR)/$(OPENSSL): deps/$(OPENSSL).tar.gz | $(ODIR) + @tar -C $(ODIR) -xf $< + +$(ODIR)/lib/libluajit-5.1.a: $(ODIR)/$(LUAJIT) @echo Building LuaJIT... - @$(MAKE) -C $(LDIR) BUILDMODE=static + @$(MAKE) -C $< PREFIX=$(abspath $(ODIR)) BUILDMODE=static install + +$(ODIR)/lib/libssl.a: $(ODIR)/$(OPENSSL) + @echo Building OpenSSL... +ifeq ($(TARGET), darwin) + @$(SHELL) -c "cd $< && ./Configure $(OPENSSL_OPTS) darwin64-x86_64-cc" +else + @$(SHELL) -c "cd $< && ./config $(OPENSSL_OPTS)" +endif + @$(MAKE) -C $< depend install + +# ------------ .PHONY: all clean .SUFFIXES: diff --git a/deps/LuaJIT-2.0.4.tar.gz b/deps/LuaJIT-2.0.4.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..0713a5d6b19cea931eb4b96c9714584dd009119d GIT binary patch literal 847615 zcmV(nK=QvIiwFQ5>r_<&1MEC$cN)i*{+j+3739e=e$Xre$wrpWU_cfL0u7)zKJU%s z6y1gBs5kc_q!+*cKKE8tuQW)C6;EbH$ddB)W$Ag_95(gfqEHtUTx zIS1{N3u>Aw>6#|tAU^S!&%7I^tBP{LJj?KX!?B6slNIyW;*MN-)DDV*JIBKANpP8lt z6bz7?k2R5w!=UIcDm0KP^08&Ta;)q~3}0D>o((J+$I%^78Rz&L(*kTk@TFs#&KifN zIks-#i2RPC%%O`eoEyf+A|~B-0uWV*fD_;*vnsp%6&L|oFsU%$YuE}lMZ@usJ@~X8 z7}O-L<8glZVS>fX&jw^RIh}v(P6uQ-BNx-j&%^$pPfFbx+?Oik<8Xd9xttS#n0CkW zPh@gRy5mper{TC?A%kBori0mxOs2~4{9-g5K-+NK8(sE?;}7IL;EgA9G8&!_=RkBm zA;?gY8V+Vi?0hiooxyGQ{ctp#f2t^_!}%C#o=&EuOD?+8`LK66>Q2eU<@91Q8vy%0 zkR1=lr&HiEI3JAXDgn08NCrQ{9hseVM;)x%2P+fzY`e`rM3ECraE|p z2c85yq^&k;ZM9he-!ilnSy5luy%dXp9R~~}O$VjR2FJ$Rw=E2gO&(2QWEHTIUUh0X z&*AVn96pD`|KH*8TShY7w7}#X?SWxzj$QDNk{j?QH0D?In#NShXq@7*hJmW)F@8hV zo)HAhCW||z?}S%m#3*+SkC}}6!sXDYx!Y^teHMfxA^Qm=||a%!bIS> z#AG+jB#}|^g`Z)Ax=oYkag|Kj=g@$>Pdi3{$};MbJb7Bz{at^x~l9nfJ| zy4Y8|MuEcRhI$5FK-uv<$Df5zDJ&#M$P>d~2>5>hcNP>TBf}1FE9CY28Dyx*>=(iU zO)UdwGIj!}9DPrV9f5~33t3p4sbepVtI*@b9haw4Au=C5;gK!Ig= zfB4AbVejs0je$?&5fKnXlniYc$+f7rID=Tw0P90Bjt8v2XN;x5#-a`Z$>chIr981o zDd*iEe;!Pa327?l!?C!mE7QS9T(%VWJA7Mo6py}RLW#?<(Gei)LAfU(k4Y``y&B|ED8XgV`Q>O1rOf+d zNYslbpSFI)_~onqU^ed$r{$NgL|a)Ij%RZy%zk}8glQuPB715J$hc82mo3u^^D2c- zXh4ZK9UP~jpepuQ+z(Y~j*6^dbyHHkP3nz{%^!!7e9S~di8Yp zVS}rCeI){AqQv>Qdk#~yU1jsxr}H#S+|iY-#v(?R0;|c`W|QquzN79A3ki`KtPkef zsKjvnPcX{u{B|-^^*eO63@OgFQA}(bc=JBqS;UK8TDPjJB{KuRVNta)hsiCUfO1NP z@eW`y5oy;HW7~niL2?+)$6(CUzz|Q;!1Js)Xl1*gr4g1>ic5pXCZ9$Ux=jTP2z0YN zliYApw-B7tx8Qtb@(+a+a!oag5L3>DhH}oo%gW_=n^*-DM3Bl0mz5^ZMnt4M-;Fq< zC{xh9XOZesIsXY{IVRS%Zg`~XLJz<9EWB@?)O2=JvqRHVU^-xV`xDr$O{)Gf)-dE0 znO{lOBKT-A?mEqO!Kx!s0girpURFl^C~%p&2vnqME3-kLPd6?ktBjQVFaPCwP#@hM ztFOPvt2lpsDRH$VABkawW?+ElAx?aq%2{7ZigG#}4bW(1pyRjQls`jU<88A^x)A~p zZ{^Whwlzc(N}YH%HqAuNgGP0Qzkv*1(C}7XMJ0s*aowbN6X;O}TWBiukQ@G64=q<* z82+!fZw`{{gI0V^J&RxeL-|f<1{+;hivcXd^)olj@#^) zdHHGyr892gLB%htXlR_w%H=Z5gMjK&59{8SulyB*`44SsF|ZpBfty0vT#;C49ME%s z_r-T}vKLn|!B#qo zbmdM?o-Dzk04f#;7C^Dnrli9NlnzoD9DyvXm~grD!w;#hUl30CY#L*p0S_3I;nigX z*)3;joR(8PsZ_>uZ<&1g0@MB-4^AYTjWRNR%H$Dgc=?v*F1cnCE*SUCq7h<$j$r~G z+2}?xOF(46&Ilzcf&#(+2wF2z77P)V?c21>vuHM{W>G}2kKyt1Bz2<(mRq2x({dgr zT?V8_BxW)VT5Mb~#aX@(z}pB1mknF-HuJb_L5nKT>^!enZf84uR5~G~#Rs{U655g5 zW{F-#?ZuwTcajTyHBR5Vd}ChZR*!d`oXymV&FKPX2Dfv>E{~m`iX(jRBMqTYdI?v1 z`4TA{30U2+Sut5Og?nitP!YlHek&r5420P_G4islHWANpp;Z)4<&!5eYEknl5psK0 z+DJ%*qbiDKGHQ1=dU>;=s269G@uv>Yhfz(*5hH*n9?)N4|9?8@_Rj}@%K5(?=fCO) zhmHLHe`A0DdH?@ge8iMThqBOdxG5;r;*Sy?@Z!(!G6%d~L35dC>0@5Fmx;$5T+g}k zsAZvhn$*4u=@mY5zVICWVEoLnmOM~dWq7(|afp}4i3fcOCe8c5F% z?o8&d7z--=-lTVU2u$V_%`x#{leS_OLsB(m;plhdcZC2iJE$(HWtevz0^!qG9!0Ib z@lQxGjfNXwlSREN!|sqe*=H6uxKzjb5nAwW;dqcIIv|$Kj+B2Xv;*sw>k6Tr8v}=+ znqQJ{L>+UM{VB)UD{k0KAsNQLvL6v zk=?3MA*&|*-!B*y;8wFkTQi)$4oGe4N0AWJ1m$;#$(Gpxt8He9L8ga{JQH3*S6~bO z#(SFio<>{t>~Him+q}o+9f_9f+Zl&ug*avwz6h58G;y{Nhr^o&R3O|~Is^>F2m2#F zgfEXznzJ1UX2^hI9-&Ml%X(8lJu6&eL$ro4p~z?&?k$uarlFIC3A4^g1c{>Zv$cye zI7KK_xilRLNZeBstSU~g6ac{WA}vN*%M%xeB)HMyRaH1y2MU~9#sym&dawfG+zfV& zzrJ(yQCAgAUdzK*!T3$;;+fs(ip%Eho|H`w4fMqSwwZpGirU11ppH`F1dh9F2n#0& z9IJ4O15fp#js?Gmm?(rv)6|_1l*|DksJR|LwW`DK>jeZ8pIYvwt6Prkpwd__h#d+a z1I%KpVjgxcOh>!^96EUH75Ht~aG_Bc)>TUMBz!@nU6tQf#StakIat#>A7S?} zWo(#dJetRb_av%j0#C{~gS>GH3Ft<&R%JYu{W8l%cQV)QPHcrDJ|NpI`G+$%ohwJo zSKRjoav|?q;W4m+xy&g6An~-O4EQ#yuB1c_bw8gH@vM!pyvxNjPGjjfK@qo<&fbV< zm?j8|$N+sVBbC~0=N&AL$MwyK6XYXKkwx7&hMw!A%K-gUcKu6vqWb?yD*uO_|2(W8 z=IZ~}{{D0Q|6Kn+y#9w_@J7+rkplB5M!pcjV+bL8t;Rufv8=6EyaRgn4(f+*pkFnTkY-gEdq-V0Q10sz~X{Lq{-gfLwcwmCcqfa1s1MVMB84o(E>GK zltl-Wk|1P9z(-+U;>7T88qG~S94^MmTOm1KNU8Rg^<|5XfNNsMLhWbf>C~nb()A1q ztAR6S-Y_gTDn;o~rmngh96hE)%qFEhR>zrcMn8C7ZzO3RTJiWZ?yu+rQi#r8#LE~(?1oq*Hx?}prw1K{H^lYgND!xCCq1>^{{ zm8@leg^l)?v6t;D+e94)b^O`2)=gkrb^J-Mes8OC4RuhjySGOVT@f!b#ZW>vvr^tc z`>(lr-Y)PXR@5?>Y`C+CHQ#Efo$|*z{zw83bo0&lz;UHJ^XrG~C~bP|0h?E`1p=6x z^=d?`a04aYU&?P=WK|ypRQbrGcnjlkiSw~rJ;nP_(UXS%*=?w#QvCfZ3Qj0tA#oP( zYAyEPb~fp|h#0mDJW`gX&ZlIBP@v4G^VMZ2H7Z3&AN zXj&&8Q=Hav(WYHshmp66v?&L@eT~2cEGS{QN6HfQp7_K`++VtKFq-vyp5u-lZHdKP znvicAyPiMfjCSi&h&T7F=NmW7HLd=$_Oa+uD+f?5y;2sd!QURU|5@#2Aw==sue)lBLEV4^^ z`;=QX$+F_<&j0W))-#`O1)ZZz0VJ6&ZjjrmsU-@!AaEvy>z0y!#4Z_ zr4IZFjKE|k@=&Dws{9#bZ^yfPR}-DeJBtOBp8~Dot08WVOFak?VD;7coy$u20tUQ0 zE}`pio=5y8Rz3@k4d1E0dDDJdZImKH_zke*Qa21%j+a7?A8h0R;|C!r*ez#HD`Xpy zkv!j;qQPv0;XBGuGai?chZ`jlz_{daG~X|gmB*IHrSwC%60w+WP(b60kUvT)InNgp z@cki+{^oe(_svy&cB?MCHzRjw$iI|#HBK9N)T9|;r3`<7HZgP<0EAu? zfl6^VP5_rq-eEX39cKEn`fDIXKh0btxN2_yd`2>nn`^hjO7-l%cUW~Pfv$rWGp<2 z>fQzaYY@Vm7}QK5&SlfKK}D$4jo2aM*Q9$fybr}^7QPux^Hc0*QQO1x@@rxac=b9v z&SDfTB`erat(TK^8#{cDRv5`T<2M`Xlx8IB-zW;CvwG=7IKV>&xTK#W)pY-3+mJRb z-G!wgo^ZD{CebgFmOpIoQQ|SK4K>BAbn+2ezLsi=Ag(E;*yq#`-&cdC$8eDP%*GTf z+cBuPC#iR!Av5_dMw}C}V8I&qn)pi&qc1JU7p3th>mul=?-t$(e`%ncX(=5Kw=mzS zN19swsC43sEqh5w3XBp!@b?`1O2)Du?1k?h@oEr5H}4Uw-qlEueG?ZC1 z=ye?r-tsijKIlT+gsUwH@W5lVu^ znoT`Vyz~)Y8)X^)6mP)d#uDSip@64ify)3-e3|CI+4~bXNz%M77+-D(0R=e(MPqW< z>8$R|tgE}Hr+T`V>gwvAVynAqySjUJot-TrGb5{FIx{0DBC?J>5b=)}DhMyH_r*sP z0ewMy6%Q1BMbuYb1UVH^6hQ@#SM*gp|G)D&A|k7*duEs2r5kptDl_7VC!XW?{EqMM z`^(`Y26xTQI?cQ6ze+#s>;(AE%Bl>u4b#wDRe+b??v>tqJBtrcD&K~I$zcKGn2wUX7Y%z;p#|$t*>yaH&5?y5iw=wZnig2i4rw3B zY9Mi7mqK}8A@^QBgvI1OjqZ_EChG|elw>@On8&WPnP`pSO<9Z}FBq$xwe^R{(mNd% zL{5fdcWdk3W_j#Z`~7fxCw!QIO@zUb$~GNM;E^0|ffFd7>iXUo4yU8E+>@JGw3m)= z30p)zY);4dbb<}X{W<5_E!dhjc5coeUAepx-iQlasUYflQ$G1d@d(b5kf=oMh`jus zcOq-ByXfeCd@xuvl+h=HY?e?miIOZ=$pH3C7Qqo!Zh^$eYr8P<`@0$J=ybFT+is$_ z^@eE|gi;>9^UfXIlR55ZWFss~2h$x2c{0wlq)};YZ5T+~zJ{TtN!` z^spqA@XpN#t8mQiKG<2`-Fer}9gyc+Ya->x{qhwLS2u6p+qiqP@`Njw=jkccF{D0s zlOoLblYw^}csJF(DT_7avzU)E>~A`8?_a%lhwnY)+(|fYF$ikTUp;De*6;6>JG{NU z#`k9Mg!fVmK|&jN=P1J69+x{+zMoG?+$l5#z3eCxAu|rQw_SPp5c;1^QD5op=ltOK z2vh52OS2%rM#uGLgwbq zdKmSx6ncU8p#jBWwz`7ozPo8iK92$HC&K;FIY+7qt|-c9rQB8I3x*9pj4`rCe3o^u zl8h7Nr`A&*7V>ng`Yy_!W=$7^~dR6$}eo9*n^F#)4}=~Br!;_h}abBZY&== zv}a(5T}=S()Se7|Z6g_am1%Rsv(2*vJG<#oxO{n` z^5w<|6s?0ee6YE-dJ}ta81d9$XRvrdIGuoAHm&IVpj+UPf@Iq;*!w9gE2BHoe(W(r z2h0bKnW*snutv+8b=J{Y(vMXPm~%kRn0}3TkWGaqAmJ^Vs2#l@)?Hk=_FjxeO<}H2 z2LrlV9!Bo~;tx6XS(A^9s>NieRn5ZLa*nQux+N-$<75c`sqHfvonk4l+Cz$hqnL{J z3nw?K&4_iIPEOVs{jK|0ID=c zCU>`iVw6O1D2=1xah~u3AR{6HdDT~ek(UNMBA&G@#exI8aD*)ZjSG@?$mMROCk;^f z4Mg~(i++>WlWl08V%zd5r<(i2svJcXL4RKTPybM zWSZ^8TtEWf*9;tS+3>-Poy#3%0vfAZNS^4GOCPS@yIucWJ_kaW-94IadrrXg3G+Rz z!i{^i=1D)EzI&yW4&Z|Eg%}sx_Grbkt+neQ3F4bT(u6Zf)Po%i1Kn zA8_emLI{g0>d6q}CNTUNpVAc(M#l>XU#e*VjT?DJi%&HRE1K+KQB`9=PG&?*L>_hg z4~*H(&CS{)XqL1)MeVT~>LlVG!wesQ07K`1G)bjFu=Hf6)$3|;}4>|PzMYN4);LUlXB?IZN8uQbGTs5oRQ4Y|PVFi^u@G)8tu|i9@1KomG zuWlKfG!Vih++79BH#|XO+I#u(MVQvL@M7mmduRQn850kupRw#;@yfW59T3mdDfxwDK-61U^U;9(pVk8C?3`&ZrI$U?QH$f_($SaFO zbxqVAAJ`F?Rb2k3m|#Ve413J71{>oLDJw;hO2ajd37F%U=BJycL-Bc(+uPV1<3U8u zmlQ*rhur4_TspFLQP@MT;ky|&u4*_^stNTCW2h`I(VL+afGTmawG-ya2z_nv zWmBvyR$cSC$7vW=8tk&H-zKzWxW0O0BW#XgOkhQDv(@(0fGD}1$!9&w7)HZ_{8p7I z*%-r#jkTxR>7;C>QJbD|U&MRtbFa1QMK`3{UEV1>NQT21!+r-#8sJGr7r*ny>OGAq z>~Y-3xU1f|bARjJI(=KC5pZotK7I)Bz#a%Stmr63G0rOtQ6&7E93|Cg!OWv`(K|X9 zOGoEYd+~+R(J3Jn1jETvCviS4+UcMzXDUsm^H!TNSQX)Znm$s^EC-nkBVT|Z$z|@r z5X2l?+VOblSx(R*9$|HqSo9IDi&XXDCplM(3pu$HBbIhs&y36H(iA7R7ut}c8_T>@ zmjdi87IN;vaR-EEdrSQlTxd=Xf_7KjZIhbLZ|^MEc%tXyF}<-d%uAOTpX4g>IE0je z0s1++($RwnLoh`TeNO(7!#H|W){S|l(RpbOf6!8wm)b?z2I)w+3e;3-H;((YXHJxj z_6KZhRSx3XGpfdYsvDK;b}%{T`IqR(KUe1COA8BD)f~RIdobDsN#qB@HpYYbyV2e9 zmXnC>1T?J-k5tS87t%ZN?xAjnrFu|J<`@PEw0ieh^(9E|(>RF3+XTX7s>%&*qAh^F zvLRzK;LhrNq$?Qlf|C&mY$I$+gMJ*F~nHgU!?znrH9jse)s{6C4Y!-~g$y z*j~6&5*%x323lJ&Mr~W=Il5NygB89k42^?f+|SaakH@srmAt@x%=A4+TGpw z^|CWGuQb?)zVy`pl8ih@GCETJ)gp)w>&Op7kf%%PgJBKKZOVGdTk8 z-rv2man}_&+>pp+lz`CbG23CV=`t{_QIV~Ym(?*)zk3J$?y&DfJ!8|X=5ZQj^(4e$ z(vQ)&ke8sNwjUqO9DK9+Njk@#+Z*RX+EGtA|LJ%Aq@9<=}F74R6@nJZC^)!W7@^Sl081F!q@CL?67u!P?wa%G zzH~~~s*pGybdb@6+ab4;~<^>{ss`D(SB(D89gM*|Wu7z&srF5w~99T|O4EAZyQFxtO z*6T#yI7addF!FOMuf<}jS)g#h6Ms4;fk|@*8q8d^)f=Ez(4kG<5j^BGF$v)J7`9+d zPu7eJ#l)d1At>Y8*Al(v)vE2iWHBwfyA-!}qg;vo#FZ?LPl;8nx{i`qEz15Eu9-*A z6vYfV%tQHFEeBZCG=>pfL9m(gHS3Zdbdwf6opw5_p5Gc(-s#?c=pDJv{i=Z;NZ8dk zl4>LY{D-*2+xaofET;LT*ToiIk;V^iB*oT*r4L>Vo1N#GyxY@pc=LF?x^u^yHBlq^8?v(5R86GrGV0Q% zY4^tasEEBRT*y!*BZ;chgDRFZo%&yUwh{ z8XMk4$8EEMNRM`-LUzz+dG{@5k2O5s=#<5mj>tTqXdvZB5Mdd-Cu>ufBpAv{HF3CXGQ}I?S}pVb%?H~CZ;2nggb`%3)ZH*L zVRycG_vVAu&ASio@Fg`<%WIZQbpxHTRuV#M{4)k8n%YkDPTvkG1*9X8pwS?%Diq>` z=*PXGdE;gn5l89o8 z&WaSALZ_COc8kgv?&our{#twvUfWFCug$fS@Y?loq5WEQY1}1s1BKhomsjuIf*nQ( zlnlj&RJ^J@A>Yp=;se?1Brpvn`7da z2zT;Xn)<{3c3=yAB`ht_ZiXOio&pj=gJ$EcdyN)r-EFWxYPv<md(QQ;I5YqbGVg!f@(bwe6EU{TykqSPhFZ1`V^^l#Qbfrn$j;vB^l{ zrs{&o4|!Ra{A4BLmqJo08@FZ&c&9=AeIQDv!_>IMeUyvq{+c(R_Tpsd`ovfq4D40o zXk48mdg8|T0H)Uot8lP99u!2kCr|~8<*V=WEaZcCwShLe${8OkIm{Ko1Iku$>CRG= zODHiE3@HD1pYY>rqH-ow{2nM z<{7HV76n!Gu2BMwi?Z%+a*)p3zG>`AEMtm$8+8h7<9yPQRau8C@SC=+x~K~?e7Cj@ zs=vm}5!V%}MPzklaV&{wI%U|3aB!}_bAA5i=4Q2(dx&m4h^xk+V?MjcE9X`N!GL3$ z0|~~3hhfC6ov?YBPKSt~q@wRtZ1&s?e-tVT>es^n11S&FjKz$&kE*xs?5BqcLlnc4 z>Y?jqH8YaMgE>*(YF~_0N@OG;DFPF*=KJF3MeX1LDq9f}Qd0*w>8fv!6}+gkug~CkbEnr0@zr@(I2Mx4SSWfURi5{}`=0NB z3;gSdhd58VM!#>EUdBdtyfh9)SuVxSiZXP%ZZHCjoOj(*hMy=Ll2a40#y{ z%A}vvq-&|AK;XFJ)7;$nq^fgT<1sK~u&=8LO6s=A#r9ME!KxR%V=LJ=SX|VU(X6-E5S~IKV2uV?*p#czzFrl z#@@bt|DNLgP0Cj~7{K9Pi`;P9*y4p9&nKL3sgZefmzLG%`iQ-^qxl8#2H7z&$4%x1 z3jxh0aX$M_eGKmNbkHR4^q_6HqWm!lkebhVG|U&?JMEPeg~tg9EYt-A zN+G<3OYMahP7er>^NI?RZSU9&Urf$b*9gdiLJv-Kn}RNn^NkWg1PUhN;{D4@d?wsm z^pzUYqR~r)<GbRi7Bm z<~pjf4yK7<5Dj-_Kpu%MN)}%wt=3|}4R}S7vu&8my*-M0l1Gs6cwUwP2bytZJU1+^ z@?p{0M-VNqkA6HLjDj&YMNyuW^C2GHPIv=n3?18}=}7lypRQBi5^T-Ih0et{2Tij+ zrpyCj@hCYE(TG;pB0D(y>c=q`1yNDsRkVH}S#WMsCweLC+wvAQ-ft4R3E$7QBdK|E zR=~@Uc!0%c4ZBqEo0_W1huh{$JLUXPu!F_X^uPkb$`VC&0uQSi9;VqNw%kOOW_%Ss zQGu&<3*O8$=41HCUI(Nup;45Jq)KSsabSJ3<&A`zr-RWmU>R6N52N88$SjV6p;5!$ zuf)T(-W1yl@x=t}^$;!?#XN#7BH18e^TyVlQ1qo|pYgny208W8hLimeB2u*mb%b#+ zs;UWcXrA%^n5oHD0Q3-5aqa(E(+`Xy*UxxSv{kX_2fmV7kAZ??OQI@Z1&@3CoUdb= z-BMg(`R;n}OxZgOdzZGUCgPP_k-&|b<4BEgUe!nkRpT~kGpmDI#H}-0%!|NletYX> zNkpE3)OE(Bk{-p%Xfob+lqPm>rMY|-n9pGU?bi$$>CP)`DX{%Fq?0n^Ldlr}7r(K# zyK(Em-L+dMq~H>&kwrV{@3mk?bG`4~a}9tjIt10E3M@3YTHhn#B#?iU%dq--|9lB) zTGv#`=&3`{>`(Vfh#}JgB0Xnuvg)!Qd*6SwwSY ziUWM^!I4)T8@W+V0aa#5Gsu;5SO+&#~3vMCl!MRVjdXhe(~t*2;md;n9zQp zpTC>|%pu)M4j8&eL=!aNb-A4bHMtYmL5N;CW94|%Wt6)#R04NbqC)22#o{suq>-nu zIpJLcIxJEx2h_UWmkE>Rk4;YgbS?FlmUWZ+gK?%ha%fSc1Itq7h zAo2_M-i@uT&8z3ETOB7#-V=#&Dl3iMSajN0h^VDQz!xQBI-!-_e|$Udg&H&O1=q@3 zY$NjP;@PY`*zbh0nq}qPj0X{RJ;~|K`_pLH*4+rV1sk!2+{#LX_(P?D>K5@^{&UBgBedB+>5({m0Kg`kLF z?xfw<<~ymVLKe^fRzlqG*Av0;no%K8xzZk}qM6mC7I=oD>~)DLoO}0sWy!^PFPgwS z+>0qHfwVaTO7h|_f*hK6omNk7DWZ)4hQafK%r(b|z$$i8R#=CHsFWfB;ofoz?bc2; zty};aq-P}gZj_BWioYpmPv1dkyF3~bP4>x&tYR<99cO)MtuVI_2V-?StH2melJU}1 zY7p#X8G)>BQ&O9kimWUvWr+pf^{A-3`v0sg*gdw1P#R44tU{6;YP*uySCfO{)1>fn zqFz&6{P2F5pd?8fbKU|aw>WwvSMTm@Sj`xXlg&Epz^>KgHp4>DR*B3J73-#F zyu$sR_4{|~^!EA4@uOCJs3tcr#V|D*IjH877r5+*&XuJ|TntDfM+tMDBqrQTY<$3E z6%hu@czH#Q<6w9xi`|9;P)~P_DT{scMeyOBnH}-jgeZcOq6b!Z%f@@Tlk=WG zj*gD4BM50k){Cgxv#1?B3OozWosm~r8{L~nz%dH8N7G5pjD(MhW&XjH`HjWP^A8aBuBn#g2B%{tZ(>=h_LiSM;G%FUS@@MOFGc+#3DMk+i%rmm z)?K)_A{%g+T={?-kU0P2SLI}B2hZppOaazM*rdT9DECJD+; zmh34WYlrXx58`(BxXu2qnta}}Ocd{JGCoir7n17vekR@;HK)WI33-cWkWzTqL(c2L zXwB`{4*Y|ro-Rb@2iD7wyvxj8z;#^dq<7>Fs!%yG6jUelw=nL^b+m(XoBWEj3cxG^EG18$n-qzeUR`3FxUfKjiO}Cm0nfa zjOD^~g`{dRcpS8UqcV5G^(a^6jG3XHAdl!ujX8P6HzyY^x0jaBW=`%9+MAXPCjFdX zSp95ipqgdtnO7`1hVi&oaIhCFXbMn>H1$3kzH@KLu42t2 z$$K49Jv8&RN}}hX5LLB0UxyeJ_ho%EYow*b5#pZw^lfAn@fatmD=y33*$f{9p@QU& z+44mSEJFuY8+WlBENajJ-NPzN#i z+v#+|^BDPE3Gwnqxiy8Zo&qD7fpznAp*MPD-ywkNbgU{jc_o-pgD_q3G($IU&zoI1 znL#cZDM_Q6j8!T*Ow3J?^B^L>^!bIi&OQD)_I%Ab_I&9aLvr-9on!9dg%+6}U=C=x z{xEa*U+8W-gY2K`KeQaJ(!J~dJH$HJH8+o;tYK@baK}b z6>2&g8%|_cA&Um_z12q4iCNc2wcvq4Cv%-M!DJB7aEzj(aZQ9wEW@bRgRR^<)x%&PmF5` zPIuQ#CKu#nm{jJ2N7XU~@~HMEWSUku9&ukD`Ux(GUxcaO>-EI5hB;U@Q&B;2s#Xe0 z2kmE^s;1}Onwv2VWxY@xJ+oMrO$`U~15YQI-j-LmDSdXJHzMuHneN1Ua502U=-fPm z1m;XU?BN}-MaI0hCEvehg?cN;F>npPKTOJHf}jGI)|4M z>y%S{O<HM1>bN`ah7#w)Ng`pD8QpE)kQ~y-U-E+Vce0dd+aU&RoXS_q!q&o`E!u?0wai= zGoWgc4O`7B`k?`w+iM;%qfnshTv&?f`Z5Q;;V5-;gcc7eeJVK!m3QD1!0>E(9&n=* zDRRpLY6=YRu)TEqMosMr_D!Mp zGV<}b#N)#NUDw>4x+?Ft#pS|6B}garmg_?e`=D9X@dmpf)i*`FKhd$jj zR5Np{jc{gZd{oTVOwIic8MeHUvBv8F<&~hr3E>4dX@k)wCuqtZuehW{vN?<4ASNfZ zJ`P{~P>y902bx$=Z~NW@ncLI!U5Q?9+;c+#F3(ck^4IfD{QlmYF_fN#p~&shl6PGB z=n(+LxzGRubi;kNOCgGB*^jR)T&mF(F1fnGLVMv#d+Fli^T!#R%RuQJ;)M#Me0fJH z)&Uzg+ft;r)Q-8iv9o$(bA6YJ*g2DDsB|dF3Z)jJ_BH8Jo%DU5thv_Ox_@{5Wwoj5 zwflO=0=xZ&%+*qZUf@z@N4{dawbRCvh3bN#&p3i}HtBhpyBaD!(<$tn;g}*&lW<-C z(luGe4th{bG?FLiFROR^maJu!K=lHr#Di`S`W{B0L`7WNb5{?osTWinrfu`_&dxe< zSkAO>*93M7V@CnbESpXw2uVTc?y*e;AbYj`#Uw;Y(@ultT&ja9mAqYO@*6!3G*tx_ z3Gct#`aXiZS3kNPu~M>&ie1Y1WOFAhv2wr=jENY2lpZjW7YwpT@o}zM)wkC?DU84; zR=nW3ApAg!#(q^@%WRclJ?(<2$&}R|b7Yx;7ePKu0V3Ek+zMr10V<%BILf|fc_Zv* zn>KxY)r_49W}4ya&fuLtyL7!+BV8|+r0a5f>B^H!*9lt63Q{4Dh|ak3?^^m)oSK@= z{=PwT?gOr~gOzrnT+K!2?pFYFL-iNcQAIM@2IG`#l;gUBBY73BraDOZRtq>o{H5|3 z8y0#G%_(``63)#}E3)A^gj`2zg%1RsO;O)Zo+~%M!=-p6)0gXFXznP4uNAvV920jlhiN;Yfr%Z$9fDsZeqe?=H zHMd9tYUNA9wJk5rE3-Wq%VTjURiI?0Dtq|7+Y<&oCxnPRy7D~2qv3R0a(s1VCu$8E z5npHR!Uc<4VWrmGl|%;RISbdO zM|Y9-Q~{_zzkAan9Sm%67y9(YceZ`wiu>U7G(Iwkbv0>lNdL`+lJ-)XB1y1SG0Dn; z0DsxRS<`zB`}8p4<2z?`!nVP%-Y6ryi4<%}lmYRXCu8>VxFp}Yx+*a7n;8{S+Gm}D z<0W{NjJX?T)*4PVWbQ*&$Wa@bcj?x`=6hk)!SS4vTS8r7bG3Ind0lHBTbrB0=xtIw z4yiN@juY(?VzUzNRq}9m)2ygJ?4L*+tBGs#j%nRAF?p%o0yU#eE%~v4xjIG6I?O$| z4Hyg&9GT+IaLCBVxv=5q2lwsYrVTd*2ZZ zRLRRnnRsqfJ182mkNd4qh>{6{qCt`xAB>}xutE}cV?1{x#Vso;8O-&b8A|#VAhX0` zBHG8JZnDQUg4w8`OKLho%v|$G$Hg36*dyAi`|)t1FhDuwE_N1YIb(1!_?v8Gh-*_E)R8YRpv-?i`pl@ciPkT?z(_MLKi3c@+*FVLlv-i1;okfvW&v>aat zaa?XGMG9=fM4(ISFhfSa+S=L3FoMTgk5b*J!ioO?-R)HFgd$N)_a)u>te$&d4e_HKRK!s^E31c1pqYZ!AxMP-WXBrVqY-`neJ?FbaK=QuZEPZn@ChpfIk!?jozuW9 zJZlgQG|m1j3~80+8$&Gf@StL3&M?Soas1@4yZK<7^1xsy6a~E>73c8sglZIxAH{V7r4AriI@DnpMD44!npJF&QiTP-CUAbb z8Dch~nNaa1$5wR!I?UZ&)pystLS|f34H<4Z^Jn~sm@Ve%;G0#f6?N()KSigWk(}g* z3N5C5FiFHtZGt8`_n1H%VphS6?yRoC?YlSEw>P)mb!YwV{aq#z@`#U-V#Q%7*EIsK zwYf_=$oU#Z*v;K^QkXBsAW7sL561Cci8V*UPDq=6A1f6o5{W{h@qToWq?tgk!%LmT zR)`Gu=w+j0m`jiOz<|O}viMvcj3ph65dfTgZqvpk5dd-0Nlkr6 z8j2U^`^f>02>bxeHp=sBjS(uW4F>LCYv7sBPhSb29l*aU3s)Q0%R{)>S?pMpJ^fW8 z<+@m{(s3uw_H^;e6m~9wE;`Ip*BxQeLm&$RQ_^C;C?+fO^M{9rm@UwOb9El}n$)+T zrW)5@%qP)U-wRZ`#`Wj2==EuO^~HJo<~q~Qob4((5?F?T(EX^$C!fl3F zOAf(ZKGg}*sbUmlR5X4>Ho^U56y5xi zd9&gMEElezJX^YShK+fVvgJ_&d8|#ieAX$dpP1z{ExU`}3tseJaAB#ssp?*E`N>{z z>5aYMQfcM!BAKK)+n`jlWje+jLQt*+8RNv)O3R0q$fNfh3HWQ4XAO%qi>p)tWhsC}hV?$#eEF*Qse-Rjb<@7~LK3 zc?1mN$VT%@!yP+2JL}6~6Bkwr)@x#9E@(ICgP6nDm1kf-G1&$I0u{IKXr_at9*e8HWhPg6HKjPexmI>JTn^ zL%3KS!i6&khs7rn4sS>_lmx^2nCMQzX8#zMd2f!5)=Y34xaNh~-Ox|kqzMlSk8obz zL!>0|CRhATUJ;i)s1^ zLk3zz}ie0uZ`5p;wOMbUCc4oPoXE6D}qnY$;Au(a*Jfw za=&P9LZ4dqz)nQ?F76>5#I3t)tK#?IdXAk=x5ECjK|;T;H{IE~>E7{Hy&-s+=oolD zO*RuDiRmrXKUJZ|@S8X6lid7!wE6G>SN`VQC{2yZ0z834GYqeVOYdpI8d+*Snmd0q zXGp?K5sOKBIMXZcQ1+RCr4oc@E*Bzu@%l>9ZZpsY@)ToSRHBhWnnnjzKyOqmzEUi` za`ft}m2uu=Y?U^PY5+oy1ws>L-K1cbITtuFL8`zm9%ckWpjrjid|NpQ$S1p>XvO3+ z)N^m)Cfi)U%Nvi@41*)KcW-Uo+rGEHUDXP6Ov*r54!Uq$He?vt0UW{8jQyr2Ftc^% z#>U-sy1wLzMD&38jbdHAB*G`fE-NIGIzjpqXh%ohCBvj!)r*`d$IS_P*o543{n(Wd z?yL_GJ5EJY;l+&ajb8%xA!=Z-zoKM_BfpP?qXVi67`UR14lv`{q`)zqrF}wc?Z@rG z@VFD)i}$7=DwJvh7Xa0!BObC+7sd77>qR+14u;2`k_iutxZr|@8c9+MUI8R)IvQcD zU%B}RKoN{E=q}kL#O4>?Hegx08JdNa3X*7f;jQK{=cPk<=70}8J~H9V0|V4i_Wc(~ zL~kR^7lL8Z2_d~?Ir7N5vRb4+t;YMS8=LsYil5PGDoB;w{3>fGa=4;UFmqeWR)ke9 z803cD(>_yt1vJqEI zQHfKZS%&SHjb?-S#287o3AKnu2CWhdb_Y!p#eQy|>emrjJD*+>z4n(XC>TiMN(m-| zVSGeR0Bjfu{RJR>3D%Q5m`IFD7L%Gty1%JQPFNH_L!KEDZ@zO$zv55DzAAOFUO?!g zp~X2#C$u*!l`exOr|{r@f)|0`gXtlvb(ImLINg5aAp_KDlkzZ|7nm9haToK7X?p7h`FD`KWzq zR_iuxhmbseOHQgdaXFu%J)2O+-Aqb(cP40?Pg3@Y7&^${l`Aj~)s|0I6neO*iOfcA zdR?meI4aE4j)pLi4)^6s*j+Llkzp!UQ5_@$|VQJVzO7yHU}dN>PC8-aly zcFxmQK3~yLa0{~AA+%cw=4L{nslzbeN7v04?>xA{G-PER1TB`bPecYP)UXf?=mcdl zoFG)~LlYr-#{m)^)2$;@W_3Iv24WEA6Q~SIVag_WN^WA6EFB~VyxBEUMPo!))8+(hak*}XC+GM zYt>351K9><H$>__Nh?G2|)u}qX!s7sL3d9HrpoGH*e)7P@#xi%Mk*Cx-#QZ-2Df$a#= zVR$^XLPjBlz!}eoH2M^{C#iYoU2C^CS8wlJ3)?pz?5yuTT;05VZ{zOGiu9~JDvM(p z8K-O^=~IGHm$X3A5=MrhwcUlW=m!c9A>xS{{PnKzClj1EhjFN&nnwxv77v$0s1^?VHG;b~q2!pa->_%Z=4FDfbZ-pqzK7MI1D5Mh8hhyfFm{n|ta9FG^fZ!X#5! zPa8x{JR*d^&Dd~1_?{lN1-%pFHR&PNc1?Zcipsev^D z+Vk@-FR#td-@Jd5zqr_0Se&0U27CzKG0LH;@O^oj(aW1 z)Ap4smtJTuHnbr$WUn<=r^P;+2j*rYCrTF@(c)Zd#Z7Z<&dQorIIEFO&@`sep4-`Y z+#tC>euRSYT7#*F_v08Igswh$onD?dL@aed4|;tX^*i(#MOERp9w?np+*F%{px2;^ zMUZJcDI(%j2IonE61QyRS^G{*Iy^R5;^JMybT4gOCliytG(V!Ml*i}N+E}zp0e-Js zH;xV(tnj=@=cM*Xy28@i8n!i8R{B1V$y(^~k-KlopW$g%s=Nq#5xgh3mUlzzt&rI< z>kc8bkvs13U(UsXgst2sxj?9v^R4UVgBfoRckCh^C0~vtQ&JB8l-?Rm^l|v$^XTI_?G~G*W*@hspPg-7cI|Q?v%r7P`dfNVUrh~>GdxZb3;4zz z`eVj$`fd<$Kc3+UgXnb~iq&__dWGuBb`l!p_H8G{@k!UW3i{+x;<|Vm*I$ND-e{{% zg9sRxZr@>oDVRj`xS#zAE`;33kWrM7@B}qZ4SUyBYR z{uE#KnRXl94dKzwwZ<2+$SfEt<(3-7>y*w9_HS#MYqM zo4c9}n&W4#wHN1l_=Q}1`Gxj)?rL`7TJP!y0#H#YNYkMJbF=Yc<3eL{y>TJCK)=Em zy?fl4gA3>9+ilY6X=JXSZQ$Vb8iV6s|MnYKjt<`4xb?-y#pu0PI&WXSu`s=~bh9zX ztvZd4Q}gTO`iseEFU+$ZoD8EqqexH2dkvWFf;Ag-brb(Ga>|cLYdB2$#s0O%;`0k| zg2$+Nz#q$WN|OO)pMf^qb)%nH+YF-q0}f-uBTzEJZfxO4lI_H`Kd8nN2h7?V zFDBQS84A0KVKYpEfm^qm53e&(6QfMqW1X z+AQX`-;!1?TzH&zI{TA}X~qPaB#R6V=MmlGWR}Ti&CM2Ec|^rVVxdOS7!;oTSvm|K z-l@i*qL7aYGc{Bgi-<^ia+?Ie9^O%&DPkGNX$l5YBqT9q=LDm?>Gezr_GS+N#u>2> zh?p+D6(&*Po{z)x_=1=fk1vV8(2HJmNBsW2a`-R_5=aUn_G4nWeA>e_99|uZ8c59u zx{Tpi`g}n#{n%Dc#FCcY(6(hS#TFt>G$BAqGfzedA|=HY!i9S6p=@9Q29zURFZPqn zd71=Gg&AQ)>`RCH2~vsY;kh(Br^u5i91Np9?lS&HK9O#$AzU2JJ6ku`ceifcGE5JY z^%$8@bUJ31fA8|UGp`;DT9|=QzT?*BgPoVmP0SHOpb-X7mtJ>};ws}XYhOrE1h`;4 zH2cdeQ{aN#c)SPS&06~ltQcY+_+G91Rt6G{ol*LPf+l zS2F%39ax4A=dJv{;vAp2OTA%xaCgn^DFSTHcZoqJ(kj)k_F=y_~l;!D*Oe3aB z6Q&X|@iopL0a1^GXoy*r$NtpOTqBagTv>M&O1dNuq6wAnu`G7%P9%c3X}4_=rSg*I z6q!t+1AXO zLb8K0C}_b*>ntqE!o$h{{nn}+rZ%d)(NpUWg^kQ%h+R%YE8 z1o(x^{!=59Ta`^072duJR85Lz6)l%ss(s-wHZ=-$5lWu}!zmV0Ni+mI3lEvoZyJB; zHxh|W_x5KrvM~rxd_QwUnPEhn44vo!ie+6)<%b&&Ket{wYAO>TC!|TgpYGyFVZ_ zdQGP7M5kGJKA#KUCk^3u?l3qDg`SOFL+UcAF94m*L5+3V&5QoZik*Tmo|9fz?~FT# z`&gRDZ=loZly8wzQg~0J7fs0vhnF?@&cF-_-awOOhUT7d10untoy$(}fxw-P(J>;~ zyjkEuho=P8&P|es)xAh1M!3jNLIZ63>_{!_d6NhX&d-&mo?f9UxZ8`fGxE=>zQc2VCRgZdx$S9fcKfv(cH&Qa*gKdmXF*m=$=7yiuOmZSiL-C4uS!4@Cn^q;_ z)8N#HHvXgT!4C=kZ|UN~rAt-(-^Hi#pO41)kLPcG8ut069`^B;!_#Qbn;Gqy9n^Rl z{dtNDd>ZW`1(_^urv$4K+JS1U4nI?MrJNy$x-k8f9ebO;}37 zOJtTy;Zb~anaB&gPEv3!gdCHfuqk=57zUjyAmq=`YeBzrwc>-`v}ljplZXm8aoC0L z)A$r7;Dv6{6zM$rkdTR+SW3wET15FHbiUb6!g$E&Btlq6nRPlW>=21emG@wfMSI9d zsVxYj3YP8+d`F8r?&!F|bANd3^8QlYGl}js6YMEkE71WgN;CljvNFxUvduHcF+sO* z1gD*0mr><5{(IoVk=|}871QakZ@SPSuYvm< z>yv_M3@A#;3>sK7$M%!`$}OP)wVptGJJqcUVZG7}()I*9+r~)UQHSnN(EqcS9FVs$ z-cq`}-$)41{;}92b2I3@m zaUPl}rO5S2!Ml?d$pNQVuOCI25V}Hx#~&EFv|CmlXq=K3a~4zi0_fkdWl9`Z#7UW& zWQMnk$`7H?a%CTW!Jj|(>xqLMU__vEH5}EK3j@Iy+hK-vI__Hw=;Gx{> z$Aed1k;WydzLyTuY~|U7g$RtatBvdEFd^M>;5m^7qoRe5hdF&z@an77=2}OtZoCwO zPz~RjKhtQ1jl(n>_TjOPmtrSv!HnRT!K^)E2SEf&+j{;=@9n*_JT}}+#fj-JlG7Sk zHVse(wi;0vlmke-v$2DisG3MLzMoD(7PR5Hy+;^-YQpNpV0^D6c4~wX=9bZmGH`>K+1$w z5H`4MF=`96}IX{5ar`@1>zI-We|#}hg?fR%(Ai*Ql3sm4&5pQM~U^=c^px(UgbXl>+3HiJ>RSOB@!2pkPgH1yC63dRrsZplxV_27E zJz+)a)W~6(8Ig?YV+(;_t>+eequ8yGJmaNQrs#10I6RDLoeXi3@lhzNK>}l? zl8BfrlU$84P~kyL^b#SGHKjSxvdZyzM+gFp?76;bs)tm)8;jd=e*@FsPPmR7=8>3T zT&9+|GzUy+q+>7S83b7j5-s>>F<;$ePq-E}hCdV%7Fa3A{8i4_6|DP=G3}t6(ygG@ z6TvT@wL-b0VIqw39mc3$8jCIkGSzT-uT-9B!@RdBM@_KEL1 zHa%GAET89ocCe2Z!iCPI7xWYEEPl4QsGng+=bYE;@T(nP4ZWM(PvqT>}a4qtlpiQ!Pd7*=CO<-psJ8c~C zA~h&VxjN7tG(hNq@Sh6DzSzA?G6wfzVU=xY$9A z6vuP4z`12^0L&Vzcfy{>7e?OfIHb{_8WSBhMYPmfLbe5#64@ZNBN+$ezM)+x8%q>O zU#nXk_f@S^8&5VEE6s3zF^CJzvYa(eDq)2?l$;qLNQV74W?j=iV`7U%!#^*{xBjP> zjZ3n7Rug=_d;LUR66G;mDl!)~@f41+E4!%u^kpOSzLhRpw_l-F0`M>Q?oTjN^1qJah`}?Q{KkZ^oB=_vE z2I-6O9u_JnLGx$5+$HmJJIUB_A=ydccLdXNsHP(7ww4{Pg=>&NQyNIg#q+?sSIoYE z#S*W+Gjz-x3>+j7XL?{brdbV=btAS%IzrA}J_cKcauBYhh1e!6Y{1Kd@ui9kr*g~@ zAJVw$@(^EI3wN5KRp?_h4y0s-XyW^b2^*6}PO5;?_&LjwmUfzP)BwkWM}n3q?!fW} zyPF=0%a;}sS{>;l1?DHr2&}++4w9}g&1g%Mf7Cqk>1bl0$*x*LW!ZUIE-mq@z60w9 z1q2QA<%D!ZG%AYnxxSqdAawMNKb{EWQglSyZpXEzO(Cs{bCfrF|!7*tz4Bzjk z`X*zre0wny%B%Si-njqr3Qe_;whpyiK)~S{ew#Sdj@j-a!?Lj{nn=NM`J$VIb2mo6 zkz@3%NS#>;H7chuIUk{!7dn@omn0#0>q|?W7Xtmu_;ARIMdKLG1}rvXXt5o&%QU#q zxp>7ifhC8IL7VFBBfzlvt~+-g){o?p;VuVNb8+D)kUvZXl5!t9r#qy`d5Q##8OIw( zu#0Ul3~As`y=;NGixvSQa?U zag<|OIB^KVvpDaq><0oXOx*l%@y7g?b^EmfjYLn!{b}r0J_nH*!Qfc``co9^(|;c^ z_}@2^0p?`<@1@0ymlsO-U-<3PQ~d8oBmUPw0A1X~QylOwCJvZdDc^rR;F2&A*vO>I zzK?mzR>I|lcyyJ@V6>U7Y$aUmEL{yh5EL0+P9FK94>yqVa46TH_l+*<<3&`tss0jq z%w>EECbLlYK1|@sYClROue6Mx;+H={*=kONNWag3d1XBN)RWH(Q_Xu%#B zgE@4!as9UZR;q}BfNk_ClLueDs;gKmDd%F34&o_vzK5g%LnDUf1*Sny5^N_`R230OhA2zNNTnO#j zG^4R|;AW*aF|AbIgsfwIlZ`?=>XDRYVavLN9&?ALJYpvdmsZr^foK1HDXHBnX6Y^B zPPooAHc{x#bxZy>Gll#b{TMP8RDF~I^R}gqJtzzXM*D=u<9>Zqf}CVy{8IpzO7DP}?=de`M5qRJ>zbp`rTXXe zvOA}|ti(lWmdYWcwSd+kV_zup6hW6vHE^Wef{jra2>+N& zY%y2A5Ix=lS{mI+3k2?4?MZcYizMG6ysCqSGT$(gH8%rjrg0zv{XT6Yiq0c_2Imr> zm*@pqY@~AZ#DXr^-E^_FsXpz8UrJR(ZAR%}a<51~f z3`z&1rW_E4yN7Phe7YBLoR05vfV@#2Fmu!iIMcI&NlO5LL7IXcg)q^m6?QS&51;H7 zSB1WSqpa%wGzD^@flffho>REINwO?#3D+hp$j-1 zcWi4>Mg2aU!yt^0V>pj)2qF`io_hNTeHGC@3qzlCA;)eEOR*YJ;guFX+atdmL40d= z8}<}?sZMjz4b7Pd%K#nxD1*`rgJcEep?M#}dp(NB8l{BJV1${;F-Xkfo_uzaMSG)2 z8iiw6RHS<`7v!RAn8`wqFlYkwYZ#HBF7eES&bVCLncUj>h{{&T+0LDLYMXZg39}mXM$%9HGJ1NRR+}}kB0+)DkM+iw8=2Ts*j`o zpYOn+IxJ*@%D=SO=@0dllMW1CwSU3P{xKj@cMRz42zWGhwOooIM_ger5Hwb#6_4_R zURInp51-=+cm$#&9xgAL&w22XP00DsRNCI_C(g%pdmk4IZ+}$o1h$7Cl1>!9(&E+g zYAqj}%?%JFx_LEL;Khi=mTbS+#D(LCs%p*@Cag!A$s>wAoQ1XZ$T@j~(>6>Q!M`ymy%r;}D1pL#Mq>7&tTb}O6#JcE3(eHSLjUz`bX)t9yd$R*FV&x#O4NN6B+Lsd0SJGHkrJ zAs8pb|Kz5KX9L=NFFcz~%%D61e&&laAg73o$9;LT<-E7Ayu@L?w7a}ic@t_wzQm>) zMon>F=H}*R%^TQs8nT2z!&ST?`8C2VPVVzlXDm6b@BWj-nV#dV5c3?B8wJA2*5&c% zEFPsb#riS|4EI~X9d??IzSnD92g|5Se1FhIxKT{|8j(fjKS?Zljzt=S@$yQG+zGG3 zFUZ^0>2yGHAseV(iwd-Og5bC2D|C4auD6%_f^N+q@ZHxka32L!!|ToAmh$ zysp#PPt{pT#6-Pbn)L<$Q|pc`O%~qVxNaOCPGgyvR3>#VOea$EmvTAbLjTRtWp_k* zT5cmD!4?D5m6?*yT2hW{pJ7`oxMMN?lDtxprwoG$2`$LIlrUXqvX zP?-a9{9Azof|7aB`ABIG5WS$k9y{U9WI$veg?(KI%AM3k)o0`HoR_h8ua>E2$POS+8EvWrI`UP!C~FjKR4W0{M;hq9cHoO{PiUi`9&D-gXo96xJ-+Z$7>E|h!P&!ssZ&@b?~Esr z5&c2E=(kz+MlxH`-JqVb^PD)&2~v5gw~Ya`#@|MxW+9IO9UIQrROXB%&4_WUcES*M zn<9-C#~%SF-}W9=LA=Lt)>p1ZE?8MpYp|SD}=W zkQ8KQ<{!%p;%OGZMLn1x6lYC}$2qYeINsQ-b!I@f*4RxMKy}`&VM9ZJR2gZXyY6Ie zyIwdUL08&xi+v{crrxw*76b~7!3hkeAdVO3yWfIg0DB+pHT!aO3DF z0#_T7S9U)0KM4#-V%5fR!b;Owj0`6d&MOKDZKLU(u&>7UMi2{(-|fZ&$}&7MDQtbP z)#ZL&pC<=rWiDkcOQ1F57MA`s>Jy@x!;LZ19FZ70 zi#JCTo$Y-XLY)>RPA5Y!LWmksw%DR4wkGRKl66!kl+c7#e8_9ftF)+ezmT6p_H(Dctan#+cK`hn{g0B9T(Vm`P@F(Gb9icaPmO zdD%CE_j`^UH~4t^sKD~t8|$#pA2KfTMUBzpj>iZT^3il;DU#^6krK7k4pU7p(!l_B zfOaDtSQP*)6q|O`N$$g^0V{#BX)$lS(tadtX z%w(^ki*xpNkZmtv_Yq1?2^+8hkS7LT!$DTmY-lY|$C3j2H6VSW@H1|`@c{{9lzgeH z#zVqi(15@s&l(Odyr3ZnxSs#s=PEuPyiLO*foG<*Y}()=8&MUJ_$Wfn)Jrrj zC?nR>S*T48!#<)I6s%sCGEYpoz?*VC^LV79;UVTvX7#g+4UE%q+qKX0vTJ`@B*Vt_ z2L;bUiAL00%AmuKQ(npNt1M&s5PjT-@Y{(3nCsYxZwmLfIJQV#C^JZs`bxVO!D9*M zjjOj7EjHe^H0Kp3Fn7iuuYlu0ISpN>lI>B^x<4 zS<)I1Bil_!eMnjskG(VA?@FiV(9zI8NF;AoNaDO{7%NYJKw8)hB6+=04hmmRY-b@E z=i-s0_Yng?AugqnwpJf)0e)MvJZPz92Ne6r;0a)xr$~4vW`+50C z{Eq1fan6p3*3Mufd}WOwc6#8cn2@?l6Zqhj)-WE=j)6(-uCbtv1+iyf8>AJnm}XW- zKIov~vYWOn84Ud*MT<4*9X){wVPF~kpbb@Mr6LJQ?njxNIt}YrGd;tzB1aB|zR=GR zu?M`*h}ef!PgsJzMCM=TVHg19BKS?yE=o}1N zTq^8Z^0QZ5w(5dyBA!0QF#H^cyGc(GNLFRSjKkL18Wqw-t-i*S!*562B1}-?!0$#T zW8YF{qJ<~cjgR4#0?p2x!-8+>ik}NHuRd^wo}Sx{ql^#&tn^w|azo?6m%?4m$p7oISd(0vH z(sxD0(Y2ONw5)Jd60v!a^-LXK0(IvmfaLu3SUc5gH<)oJbM{v5cLm~D3>kE2G6tX( z&JY4Ngs5~iv@|=xT66${dPPkU^R`Lut#r|-z1B%XM#>AcawWw0EHrRoaYj!)xPlb! zBoB#Y+L#>A0L!lqhXHrpm$IlmF@t94iDrzZp+3dI*hxZT>rWYD^Gdx|o}QEUg}3hH z&~^7-#I!WHZ-OROKA?~f2KNzVZ0sJ#*ef&kb37aLi=KIe0*f>IkzGzjHntzv?HFXE zvO5O<;#~pr31@h(a)RG7>{T;%h8ai`6EsVM7B6U{JY_8(+t(|ZcV@u}48G+azm`eM z$H$*ADfDU|oJr9+0riyzPh^+;B(cNq<^wZg3jzqztj`Qqi#~;m4Hv1lokJ24hgzLHi^3p=S`qY&d?`!cRYUY>?84G=aFs?ZH*&LZf;z^ zBaweRDc0oE60+D0EwLN;G^CJey=PmDt_K9kLm!$X-w5hpr8Inc(=Gh7)w&MtI47zP%)dHUcBF! zxm@0=lIcUkhX{6DKI-!}nBpia5~>PhoktY7OR;Li<%`BKqJ*cGjoAif=<@K+4;9fF^e)|%_FZ7zt;^)we9*wUiBcw%l?sYu;CY|Gy z_bKgZAJb^xhdzC7SX{-2QHDkL`g425RlnmUxQTN+ep++;3O^k`6#!>L6XK?0O7=WX zr-8wT3UX3bAS{0hgK~{}0y=LLr;u@&plznP=R(Ek&762Ur<~O-PA9>Fa1b3axw$hcQHQI+ovS zqyourwSy11lKG7@h4 z@lhn-^CDh2T8hjS`o1NUEV56tF--&q>7b0%RSc7c#~H;$Lxnl(B7XhRq?PB5--dXY z3?0kjQs+`4&LowaSlDMcG@+!agew*k<00k9XSvf9{&3_RV#RVpoi2BC`m6Bv65NbY zvWAN#u$c^r=V5$Gf%_4||LQCBA3Xlo#f#5hx^%I`|9bi2;>D-@uOE&4uO%kLr_8S( zw#=`nbu0Dj47OLi86@?$A-FK*LV3gP!M6GG;_2Wo;WuGX^OVecvc`P=6*}jo%AB z#?>cQ3E}!FnyQk52VEJCEdQ>b_o!2BYk?(sK&TFz%7Y__*gyhnicv>3gRl&FL7AJ$ zm`czyiL02(!TvNOA71__8QDj%>FiRi+I7^RO7-Y$Y@mfs6=DMhRT<0`e#>07`&#m) zT-Xe+!qVOhjZ~1OO+c39E?iGUVuOWRaHMnf@T{S|yLRD1fbQG93@Py{Aq*k^3sv_D zccv2r{m!l^%rQYK&)c?3OP31hVWDOFI= zA&9EWWVf^!IwoX=g53#AG;AC&K;=zg$pqsNBtaQ-PB?+YB#2Ypw_}st;3lpzbpv~s zOFf`43;X`PX{CkA3pi&&HG%(=-we|Qa0QMm&e$J9+$j>9ky3<38gSRbZq)Zh8VV20 z1?Fl;;a)r@2N`3yrSN=Ccp9YL#@*Tip-1w9vNoi|-ef8Dmh~gjRS-1cInO(4|a{9~+^t+MEJ7nAR2!uKVJyJooNc>J`HA6k*23 zIJB@uMsAYx*|^M@A=fkl9h!$t4l5-kXe1|A`#i9(sOv&H2#l{9#&h?{PNDO0}tG^oY}7^A>k%)YzkIS}Y$&{t6ZJvVn6H36q# z1qpGfRMWjmm%9(#81qXPvCqvJ`rD9Qw|&l$P0T&P3CuZp-Fx}ZkSc}R?NgGKY+wr{ zRDxU`Om*B#kx~KAsuH`XBo#WUPuw>$mDP@egmWOIY+^k-o%0?${IJ=)rM^HqY5;Jq|go6+d--36M5f1dga~z7Ho6fQK zU6==G?ByG`HQkB3yJn}!Rd%;pX=|=QX{&jqUL`@~!1X>bTf9}f!TBO#$~S)_tP-Q* z&W(A|x1TW15Z1Z*s4TPXdzlkL-%EzfpaI}g86-)K)eBjvPO}-~m5+9Jn+;Hba3d(O zp3sXEdmn5hVxf@gpMj%F)bIa0I}e>1MU@i+RDE4xj_gKSk>ZLoJoLfhWoLNkljS8J z*GnH>zE~MDda|sP(p>EB`m-S)dh;P&@Mc6WoD`Y#!udqHpf}fLPLR76dT&U{SV+dZ-ginmGM@IlFWhmvrDc&Z@C|c{ zoa_4-^`0Uy>SNXaCrxO)5dpHQ_RPM^$8ur=I&-y`FE1tvV+vy;_H)r_&l)8#2iYkd=)LrT4g#0r2qe#m& zeZZnE9|)o$BSOqUtNU637DAZ2Dr!gq){wyMI2*xmOGJ-w2B?CzNepPIUWzJI`MlJX z5xNj67k9%*sho5}F-bWa6oqbljr6%n`b7L(w3eA14{6VW5RH$Mf-ZSY1mT<}K z+RLaIT4T*kx3ixbFoMibV3wBKlttRGtGRJ~N2?5QNhdsRb*(b{rJE-Z;MBXEQ=R~@ z?jFNF7ZP*InuUekW8yh4)j}@cEz;pMq8Psp6z8;hhmhnPriND6Fkz#BaR6w{j7rsB z7zi7Wu2YRH9eb_Y;IcV@W?>4kXbxmcm0&T?PUC&MN~O5eE+-d}Thb&jt{R5W;pH%+ z@c~1>Y?`?L_EdSkHb29J|NI0E4f**XZ~PRU)*I-$sN`mF0MMO+`b(xTw_DS~HgWdE z0PVo3M_w6$u6=tBw1MpEi?F<}qhN2tAip?|e}&~EGUQ9kpvc;W@r~F!aMsiV_eG|a zH<>=>t58bThvro(!2i;e)F=k#qm$p{Lom|y3Xl0{R{t2sO518?rzDXF>*`2Jvd2q# zal7dZf*5ngMf4#W!ZUQzc;{wyX~A7~HovUpFkXAPZZkV8PQy1cqQ+VCMy41WIcaid zuRY&I`9}JnzQ~i;SbZsm)&O~; zu{c=~_#k#p6RJ?>xsep&7ey^iwO}PDOfoOjY{AA1qW9fy*Z^{C%cp%(mzauA!#0j? zMMdl)u=BaVlZ}UZ8W`7N7;>I?1;cKWp966un5S2=Wkf+leW+eVbUC5mS*}L+m?|R0 zLO%pLq9K5;(ED8tkn*|m9#<($D+L0on&nkul0Yx3EoNt1_-NA}PZq`$cln`}Rm%NLVDEv+8+RQWcv`(4+Orm2#_kFO3DoH!%Dd0b=N9c{ZwXwM#o|jR$KEGLu1Q`;|Q_S0~8O`yUx6R=UY$kZeEh-eoh12sk0bWhDwFDJsv85R zjz?(olKq@fCvA*Vh=Xb(Ga?xaWFvwbT7IDDO zb8Vce?ypLzON%)jQ(TVy-gKk-tA$_Fcy(=Y1t&I7_$WGC@aOqLYVGx$o!@LPIF5I%7L z$5@3KznUqYHr&?FF4iAtvg?!dPJOy>uy-@niH$S&DdRfTC-&h?Zp+7WkUX&$lsXNE z-MDwMKinDcGrV1MI#==2^JgVb{bPB|-?W!JL*GlTdH%5E{Qgi*(OK7(ZL}4h$@)HB zYTP~1127J+T?-c+DpXY*w%aV%&SLrOV+qTb9N zu)B}<^cE$+hcK(NRnVIEI`dY3f>`F=eM?PNs%H1oi+P-RkWP$HyxF~&y~S>w zV%SqpEUP{DW@aaDm3X2)IFege@<9^SAkJW@Ku>c=7mUE#ME`ugP1|OS(H#2U8x7nWaN}$hIlhmB*Gz`_o~H2wl{Cen9BoQpgYQWK?iDLCpleJY(JgWGXgtMi|g@zc^9Fz!Z#N*M}{YpcF#&9eNsc zdm426MGLz9B89eQo^8MALBKO;mLH@TO?dtdEh*oK4o`I3e{eSkz0$gU*1wr;#|WMbVlGV@K8&QMz# z?!7>&xU4wo?^xf6N@>6nIVx5E;A6BEN(hE3Qp~uPFSA$nym0GECS;J#?T?yaXfA_e-g?GpCA$<*h9?f|LawWRM z6dHZ52q?8CM9;EsJOjfVl%`ATA#}pkSxTN$IcTh&`G8c^JjPi@7U-d}RobZ&aAKL9 z0xv-A%EVzECg3$oQtXlKa`CBIoDxK13WH`DOmPG)d1)w>9*99L8lnVrmmc$}Xu6N> ze@@&mN=d>A$H7glg5j#MHCaryT8&ow3Y^e$ZW2MgWD6|2HazgNlPDE@fRRK0{!Hp> zww(Ivxahgg2=5un#o;=sUZylTtt9_fDL5&`N+OwaQV9};0KAhQHm3@@jvyh%iAqe^ zUqp>j5s1b1^O$xbiD5qP_!g}s;4vKf|1i>!l^>BIr&a`n<| zi_O>!HVs$V#_xth7;~g}qEsH~j4%r*Qehvq8!{rnm>s56qcQb52y<^X#tM}&wN3h> z$-FIIU*0o8WzXC=#`BEl85vK&_DLy=)@f2sHNUnRAug~$7jcLj?t@vS*eI#_q~)G8 zd5&;W!lTbfs&tZvF;RtM3_FnWm^?wu+e78bTAaB}p5XH2s`Fw{rJyL!u`n)#TIDBT zPllI9_`n-W2NZq!NN!;m-WL7h8pftyu0F{uSk(~@Xi2*g$!UJwtl~`j#TAzcaiTky ztK{YJ@IX-}_9;qqPen~>K{G1Zc_5SDn7V;f>5KNDzq2#(!61rY=sex)?@^CR4Z5JVDTPkqv#yZ`Ug{;xk$eRquOdr1beT19;1rs$rdet~ktCJ4RF$;x>psa9Y}DxOeU zxGWi54PxAOE1XM}HZII0-SWy;${qnzqVEcE5-5J1OGK>jb*}KHm(krnOP;kVn}QlU zZo`kjsG}&Ol1W4}dGD0t^E%6*Yuk;MVmtc}Aud2EOL1o0Z2C|;{72^Ak9&*w1R1B=68b%do! zB(LmDu6XYVyI>Wo)>HkpF_j4}iHyP?Z%sIx`9Mm>c5#AUS61L~3nG1bt3og5V57i9 z6bc#ZWs*5vkU28N{MfjFetOICH2$C(DJYCMrV1OY|2BCYK0?J+3c!c!Sm1-jY?4>T zCU}xX?Cs*ESQO<|QytoYTK3tVRj_Y}IGhVP^N-w1~HYWRVx0rffTg4xAiBv*wS zBJ9)ma;Jt218AE=&`SC(IGw8Hm&U@mn2wcFP*WP$%*ck!ZkHD0{f zqW`bGxV7Y5E*CG&YPq%4S~i#4impo^ z7t^9#!Ic7AVtnjdVYUf7H}x|RA;t*iAAiict2z~U*Wzh+Rp!LGYiZV9)ge5~UEOPS z&ssR;t_Yq4ceZ-hmSs@gXNBRp-Z?s-cvm`uYW9ggrr1Kl&+X%n&ccja`~{WpL-Cfk z&A7piO8EwC$PEI~IbBg9*rr}2HbMxA?)`0>Xb9IYk%1;=ao zgf@<#^T*e;os-%SXRGB_L5IyQoO6xqTZSzr)IdVGWq47Rl!jp&+Q#5A3y>-BqtIm?M2iaEH=ipL^IfOTFAU9dq$;mE2g@=6v zPUFmQf~lwBp#RoZD1?385VQP&_xzQ&HChJris$_u=yC z093R}`8HmVq#&RdT@s`Hg(6@KV~4-kb*~gJ?|j4%o$mD&bG!GItW@rq)?MW5ETW`b z-_Dp1CX@_H9I8T7VT{57@SsfO26J5ItSyhG!y@5T!s|dy1hV*0?Pf(VTn!zTp%BCB zxohu9b4YJoby5ohQco-WB~sSU?k#dn!!v}kn;&wzx7!c3spng|6sXTzJjQ7zk29xGM_`*OeKpy4P-~J+!4=ji8t5_2sz!TnAN^e?3G~SA{BiEopHvHKn%nsajIM_1+epQ0k2r3 z08RHeU|oSp=5TNtS={hkNsVOG5ZB7AMP_jOJ`XVivN~C8D^V7ef_z-aPrWB{OEQvM z6mM4$LI<^t{h_D!9w~fu`_3eAfpQ=kBRB&&s2l!Zy&AR((dFGD!yh?*cF1~5e zP6zESrqjsrmYce*)3Gf>$O*JccAtlP()Dn1du8R*41u z6?Y(zd|qin6oiEfyalYjfPtzA6giRvR)u^>L%S+l{ zZqz?V=fvdR6{-2C`Mk}3JWRUy4)G9l#c`^KN}B@ztn#;1Jg6MrPltV311w^N>oOh; z5NC0K&w-!9%)^OwLX^uDreF+%S_nZ8d8!5xLMJE|jsYJ8A@^WYVksE}C5)so z*A`gKMP^cMZK7F6w;X8wx~|v+sHx$J@<2lK{@Uw=H>QQFrkD`338d?Y5N&P1W(YoX zgbFG?uZx+$ecqJx>}i%m!y6s=5Bld}5fV)*t!_-f`oLZD0Ox8>)x%t@S@js+&bNFlz^3D+@$gD9hFC$zChFLFX1{kWhC?`(uB z9c`U$(xV!HSibj6mdTn$I+$a(M!uM`@O=(bq9^_=kf5I1eB_iWuxKDN%i=%i31~~! zjTBstN+zCb#=-E5NaLM((v|uqHjL;NmS#|Zfd*P~DFm!p5DlV|_@!Ld0bJcg0}LBL zE8EITi9?;M9#Dix>(};VqG-JoP4nX6A(k)-*a@ACsSphnnV%APtaPxIF=I^0?%I~- zE9Jv8pP1BpZ>o7D<+bfNfM^LG2X0iRp3vgZ4%;!u1I67?$H)vPOZ_|qkDH%>YqzHR znsq^%2WWC-NTpr5l@dXAK`ErnCAGDF47l|)ZH-^6V*XMA@2zq8GMtdb(B|10-$^|07rU}JQ)%{vc!O=6A41u5F66?i{EB??&oB(s7ufH!sSX-(K?KvX`sFg> z_a;OGPcW5V-6z8hw=>6p^j@PL2>S~GVGX$jyXq|3jMcTV?~OrVRWhz|%LEm-OgPIe zGt2uG%=A^1B#I8UJ@P%|Fibk9q#_R{rrGTk>Lx_FzEM zK3C(Trcrln++5&=p503;K5!j^8v}|Av&BzRE z(Gj?Xcf8$i2YGs25VBe!U3@sF+7>Flwh>lBmwc<>rKV=Fek8iOvy{R z0RhFcMK)%=Q6LSV3r@)o3mP7cOgK#Q{KPX9r7#mNz=p^vE;cyx8QL?qJ-%4yd+UX| z@2PX94UDBmiz#tQG9!sy~G*#{0__Rw^KxWAK+99dR+@LCR zYjg@7BkmK&>9A8OlY_^X$+c4QWSQ)Y{0vDPoGgjM6D4sltNo93d1`E9ySH%HW8r$F zBbx__Ccl!mU`*wFO9|t_I>Q{D^{M-*vPj&<$)U}=gQc_9{B^gd9rq?-;c1m2^3B`- zbG(<>M~%x_<{9-MdfbWfXerK4BQcp5GT=HomUOMSmfE{}VC&h89`BD6;k5}adCQ?Oval4m- zK}Tki4g8}fvkzSn+sVuvydZl0RDY-Q&El;o3to8bO*(5>vV?v9-e(8wV`}@|(?WMI%r*NrXWneyEO2hlwFj@3U3?n_dqH49WJx;B(GQkk1Q1M4 zzAjJzF-m$fU$!kivN{oYcy_;yglbFh4 ztjEdgTq;4r({g$h^f_VlX=nk`1f6yq-n4CTU(_WCs7DrAmSHU$ub9=mIuvC zOXldz=OkZ1y@tg!w_pUT2^0-sx#3_=>xyw{t8q*BK zB}dq6k{Kdh{oQZsw|kWf^k^~e1E=D8E2MhzbOI1#E6EvKi5wxdo$vv?$cUm#R#QiJ zC5$;Jbltc>^-|QHh$B;xqzAD7*x9a3cZ)T~O#N*YGVYu8$n7iiGROJ~GqRA#i`uxp zt$ru)L~x@5A?2T>1cRB>Q)WMqxHx%#T)v_a*-I1W!)5jeK#z^(}X+ot<^k?GnN z5QuE=?`hFYx?2jlSqCw_lPRTGQwyD4@GGePSY?xje|3AqR=C#+dAK*=ZVsZ*w7LN} zPzJclhYCi4R-gke9%)O$RQC6;CK2Y z5I$LQRC$o{@_*s0@c#`gJ>4(%kz)Z}(;j8PT66#cb;T$g7}h1N48yuPiP5ltO^UwS zyhw^EuF7Y^RSmRAbSw)_)S(M;^*GgcTC^Of4P&*D36>ykjLcNKUBs%C1Dwq}bD=r< z--VfAAhoG3BSLiPrKXb=s(NjBtQfO1E(FEn<_xLLLBkKbgts~!nA~UBjpzEFCgn>x zCWe?Z;XK-peoPuO^5{-fBkQCXZX7;^FkWm4#GUi{G`;%b zJbrVXC2P!CCUmm50;ixnon7jg2KzcbQ11p7Hb=M^rnOM86%MUEcyEL#cR-}FFxHGd z1vu00;t?S{g1@WbT#_^*O)AnW)?5qIJCm`E?#o#HY*8_DGGK)z zRGK#xmeX-R0lj0KlSN53n&39{9ddTz9kX9i+1^D18iCRh;c}x~NOctkC_TA8yMRK5 zL$?pTf~_u!sg+4P_Ii!$x7j)k*VsChp*R5t@3=XeRc4NsS=mVYq8eyi^g45dhaTCR z88$(j4+7K(tH!t(&!I7%JLq<`S)1aO#%cjHl%V(|PI0ijg2WF{RblB!W&~@KQSVWU zTwD`z_+)&h+C*wtHbcuQ5r9yGvEaGugj)h13Ww;~cFQuC!Ttz01BHT%E|gvlH92h6 z3$BK^Ck0?mU^K!>kbeM%u;6gixUcJXj6(PJTG%`84db~Jm#un@N-1z6jG&8QV%RA=Ash)D2^whKiD1x4yZ`kEQY8$ zM+lr`lYk6OIbRdp`F5(#MEg_GAMi{+A9*T7ASY=qM<`{e(6=SJpH~(aUTw@_dP>NW zk_tuRV~1(B@@#Jb|6OfdfBD|l-P_NI%+%H+w{_FlthN>wB5rHz?b^->os38yxl0ZW z(%%bmNRa3~m!D&o8qLAE=$s7l6wZ?&$tM)H7>;q3f*q0S<%)3DU~`i=9Z}$VT}fAM zkW*Dmru`_BU}r-ry*oZz-Btyx;DHILI|y=TyJwgb4@;q2BUVUjVp+*yK3zbxBgq?K zyiFi3Fn19arJg1u;_SdxI7GbTF{jERpBC!h1v1lEJP#$La__a?v{VNy11n(oCq+=Z zzAYpt9T$?UPZB`|KDrN0x$wC_oI*9?)JTXe_4k=6QkYK8h*iPDum|51&nrP!NJcy& znjvS&&^Bgj0m9>wU?7SDE{cLZ&Z7YrvS(Yp#4=`1g~aI!>naBP6^TnONcu@S;%bC5 zQ8}vD8A7yDh3ufj7{+iNJ6v}J8w|bGm?BHUH3usrp*;j|;<_H8b=Z?raW0VMikX%? zY48ioPQPW*kd$`p!Ha55Up&e6;N9!_Zj@~!=+mHjz>-#iTH-Xx_vxgg-kQ_Fdo#!E zZJJ1#V;|#KkR7tm2Lc{MjN#;?g3g+`vKnFwVy($HCW|! zQsi5+H%w8}ne(iIghM{cpJWAU-{u*S+uaF8<&Lr#=pHDI3=KxLf3oX9-N}r9ftF^C z##f4m69r)PA;GK>cNmqYS;nw1VgXT=xqKtU*o`aE(ZDT5CP89G zOz9m6K0aicuw=}-xw90#m<%%gh&oBFWBng$3_kB=DPeWZTO*#NC$28a;!pzZsDF^; z5-HQOr4!y{Qbi$>;qV0V&A5A0-?l~L9tix>9qSfScg4Bg)$m%RVxai|2i;-9DF`?c z;t~iz>wbiD4#FI)5%;tm6HJ3N*+_b?1JEK*NE!}f41$r|qr(&SMva&XFvtS(u`Q7G zzG@}NVuBM(b!(l`YZ-JfHHcG9^(H&P1BubmU`etTV^OCFP82ntwkT+QC=?i&DWa7u;oZDA-P&a2(a#8&<+tfR2U!h)jfTZpyLA zvXt@Ub3Y0}xWq{A2FvvkDw(u7^x1PQHT7`@qwwLKaC`Oc#+qGV@1Orr8d z8ke#1c%P`Z@U`J^#;`^d&YT|5anvO=SIIt*H{Lay$f^luW0@eU1rHcif@*AIXxB7g zWTqZsBoE+RPX@raw~u@aL}#0kRZ{j7u#iIDQnP;$RbpOPPJh)0T#3tSeT-oxXqXTUd^~Z~ zIFLGqds8XQmt-&?gBahqWwWGI0#WRl_ZH=va!zSkZ@{&}dj>sOO*ky5paXt<`@shJ z#~xwOw>&t3oiI@%yOgOgj1r`S6T?Dz7SBlOtF}Fwa!mtq56{1R_vZTD2Y0sbZLQ4- z2m1cu7$vb(P6>x|SBVgK9ae^b=9|u4G>xUp(MXFPpi1Eq=@&ep z#ul6_d1?ciauH$=Q#g-D23OE`593rRAk>M#K{vWUe8$XrVRK<9g$yhwp{*b-hf@eY-;w9!%cVKoFxf59Z)Vk#cwC>2}jQn;46l zQXtj%gGH~2(NT()FsvGK2Tms%6PHOLBDz4LRn$cgAxXxWR`T+l@PPoyj&wbuT7Hrq zPSbDva5e<*p`3l}#B4j&NOF7yq4w{t;2+M(61X<|>?ZQKFfG9E?$IR4pPE+TcJ;*I z<9ZdoTiv8MV%7a9e|N>rMs`rckqzh)e6kIy@xI*VTwC`-r$!L;y1J*GPfdV|RRnjl zOZnYG9W%6tX^p|59|UHCDpI1dROkR99~I}7B>k%Jz*f{WFw#SIpM(HNIb&njTw3q7 z5=Nhrn&7}D97VzT)T#*Hp-DCyXy1G$-a@su<(cjR%*vv1p0ILDKF45RVaXIy60k*1 ziFhW+#c<={l+!2;E{A0XemrqLw|Qxy#leF}&GLQCzU+&Qg!W;ID{^&=aq%(k{FY%= zbb4>HS;y>;r3_a}6dxkiCq;ZbLzqRGWJ4L0rbWOw zq4F|u#N15+@QIMq;isskouqai(=cPzB#c|LhOgn!6tAbjSY?=&do8J^=lmjL;AjZFo#%OD+3Nc#1AsUs5}iYvq{B@$U++w7|=jHvfz5fcUfQPE~%=i&q6G$GJFDzKDKrOpUmd500@?6d0@T_3PT!cm$Vb{STvqw(>fDY>m0z&Jj{ z^6beTEFpL;k}Bb3n(wzM+Joq$ToV+_$F}ZDSV}#cscrTm!oe|RfJF+dcSaiM=uM`> zVfi6}Y=GHMB71@CSM0eqy+)c3xvMbK1+H16161*HaA}tAU_KW z;Gl#0p4E$|jQ+YQ5^qa?s$K#aO zz^B?b!M|M1&&B1r;?lCS%$!HRgpD)OVUts}IAAwdvIDvaWu6!ex-{Hj{lS@Pa*+lJ zt3p@|#E4wDnZiKiejxr_lQn$?80`s=N72j4OT&F|sIg2py2oK2laE3W>Q0~O{e_p> z@mZX*PQ&Uty(OAS30&P3f2otE>)zZdkDuz3fy?m)@(kDEokXH}e7Otc#Qq_O6U99x z?b0Q@RLg90=kpQEbClE|UvbCPx!WUNQ;#n1b3=9=J{j9Uz=~|OcWatFB^+8! zrUb$brYhAqFFf9?YUWiww_=$4sj;*7Gw}Nv*7nnIB%Qb>T(UGiI%myzX(kLK8^}X} z3)J&EoQV#@Wy7#M7Cf6{cGLBZH`7}K?!3GV{SZ2-o}D7;b||#>Cd0|yqqL!5i^`5_ zm9wD?1)Qp?F0EWRl&DU1>}QGY3Vx{y?T~Oc`tO5!kQV97<-@>*YH6!M394mLBgi92 z2rC*`S418=&q5G;7LU>cF0`QhVph1CJ@1Im9r3%eV=WMJGOgv1!um1fwElBVv{0TS z%OYcDASLr}m4O%n<|RM|d#wb8Xk<@`+qNr83_UNhYQms?U?uTvI=1r01*$nJH}oRu z#Vb|2#O7}por+<qpsUD+u$$T4wASH2#d)xG zf9oZ9n*e7q5oD3{i0oN;jH~>SEm(QTT6it63S(Juo}|$8?W{qVAmhE!K{jhdM(ONhGFfcXu#$?PcVRkNHY#xn;VB(Q#cI7Sqlq| zl5sMcjz}{X+gl(*qc~zCO9MfDl4=~5wVzScom*cM%Zs&nyMOujO%++?||}nA!qvR?ZtXPHANmK>d{yk1+EwA3z#>ay68Q+|GYV9=Q;uI1&qdP_Pbqn20~^<)?&xq9Qvm7FPv%C%Q04IeH= zH%*IEvm8@e;!3>?wB%M`v#OkOf9?vPM60s;){Q}{PME+22L6Dvdfh;lv%F+jVYd&5 zjI^k-clvhsje}zNe1iUBZ_1g3owL}cO~$~ zfrY>fplYy#N=a;ei>fxxbd3Bmt}f0<33wJW6OKvBGO^Gm^j53pIXwz!*A3*X5omQZ z-eayYVc2AzA_EhvB6wC2Td-1RMAqzl1@n!V_AX(cHB}B*U=K}258m2=ehe^4SEh$%rv988*1lM1~<%?Mdee4m=e#;_8VPZ2xAJeDPylM2F=K|m+#}MLFau};;Up@ z!q8{EMAAVpXhg}!I5IE>1r`7~g8nD8nc2zLGVfPqhRi4*OceyCFKE@x7=ynVswwU* zB)gp=Z(VNO_wd>*!R_eg@KW9Mh-*rfFQ(nkTzd&+MRF-rO@N@(NSU_2%ST-9V9L~v zaN>bz<&)1dsD#_dtqJ_7Fju`IUHqx)OwiL2#I%g&@^j zsF+4w2?3+485Dq$x@!Euw4(qI$48`-y4;Wf@!M`28S`5D1ZrTaTN{ZKQ{(-(bOlh@4XH zAwAQLk~($~#wXBuXW|qBx+5D1^TG^vkZCT4AYIE!iV$! ze#dk;hW-ih5oMlX@H!2boqT_b%H&39xiCWB@&%7!cb9pQ%$JzvVE~u5r`u5vVOQmf zTJTIsYUdCd1-#T3o3SoKhiRZI!KBl9&EI9>c%fKkrBfW68W=J5-0ihBhJcfBbi#jp z_byV&NoHXIuMQ_$tb|V9wzlQH(KUkHC`Au`=tr45WxG4VBw zN2*_f5o_F{!!(`bWl?@ZwzVZ>_I89v-A)y$dEYuy;B1U?@n!eRY85@HU3MlybKB19 zQ2kxGkjs*T4G#119-6LVVP#=e2A6L2a#u8pfg#xE_KK_F;?flnwn%JA1Oj7BE7}_q z%7CtMuW+8T=3ocOy)#6!45ON?S)?L9lD_0ka$o7VEmOK!hNtqHGVkO{*h+G)6FOsJ4f!0009#Zj zN?Fno=S-+7ooaJ68_|^p*jZQQu51HKys0&pL=zW23|7azb6s>w-WM3fGG6q0ispRA z`6SE%m(- z4F56oslC)$=v|Hw@o0f`xF>b*Fv*5&G}NXKrq--GA5idic`) zJDcJ5gBzP0Yhj~3KmYRb+Wh>@`#1TEi=BnV`T6y`jnJjXI9w)PjQjU!g?@-1tGd;WyP9c~JR7_UF7Z%=nm9*YAv*4_Ri=Cyb z;RmX>6@`E2;sV}UcOlle#rQ31`E63eu;A*1F3$K$0tnKD)Z(E$yPFRCbXlJ-8&0FJ zTfS(FIy5dBVg(4FU0S@j)E(e$Ah2-^NJR506^X4!N}d#WfRw3Wm;(mazR*H~(8A}^W?3xl4fvpP@i;nYuv+mVos8No=?|YsEYkU5l`AVR zFpunwsQt*@H|5XpG#VRu8&n^>Cm>r7mL=fkHux`6d}iI@8eEO*_xLa8Vm|+?_m#Aj z1_28AgBfoxhnrlEg9RFXq|S8@l838 z+tJU?Hcq>CdEjs7{r9fFrRVe&*3|r3sjssh$1YU4QT?a2)4_fPy>yNLI>QqN(d#-C ztM8cg3e}bFB53(`H?;nw>s^n-x= z`Z5K1v>Hx~aDskgiVva=&klA9IG_Usa|1zAA0+Xi!C#5Zl*y&_I^+a;%d2F(Sk|795k@TfqpR^%>b3#2(=!9Q)I~{f@HHYtTf~8NuFExX)QO zXW$@wO@WTcGHIV>w+6YpTRD+A%EsX+&Ej$Zf)SmY?8-DRXSVAsECB|0r^&D|8Mo+u z>mDlx(N78&uxj9WgBbfL*Ry9ZpYH9kA4j6G%022lIpAP1Wng&TF9R--N+T@s86BqFLtM0A`I9q+dZ&osMagrf#Fjh;g}y6k4W`)WHx@mpL4UpbI-o8yts5VpnvqovV3?^eqOq2zPjvQ_q+=I6E=yH`+Fj1 z76lV_@V%QjETde~eKA?RDNJDa`=B45AM~l>o}ieBmT63%(SX7#OsB=1_RS>=!{&oz zK(MVe53gMd8qtlqXihq(1s)=`T`wL(n&(YoX+INqAne-Av zNmwez6J$`qpS)&EDchwrBI|<}hKwTvLs*{WF55&kf_@kyDMB4-GipIDEKnVii|(vlVJA%y%e?_|-)0|nNK$=K`=|0n;GVv>lOJ1sT{vm)wi3T!Enb-Wdfax+(a>mSX?{Fd< zfcB^1b0G-DI9i(}5wAzaHU(0y0!9M#4K8>Jrw%3HMdL>p6F;WT(T14ws*Y253A4Cq z5{oE*M0kmo?FPqr!rxkLo2es;i{TQYAVqz=E!P+Chgl`j03viV4>3hOlY!Z4e7d zFOT?RW<8kW;v0BbCm}=s)c$z8U}JjC%nTP{>+|Ch{$8~OD%*%ZZpk8 z_e|F!DpA3dnaEvqz!*HYR)S#{!W~}%WN?5jTpdPC03Xa01w2XI`bkY=3FbnPW94=5NY|QhqK|t~VXTgA6G1v8NrzSZBzXZLICE!E zOm`6Bl#!^<8CSsgb)kJM4+R;0wCZV?-oAeC?)v8PQs<@?rP5kOScxZ+*m6xpPU2Do z{g3Ks(JUL9e?;KCEu0A;R^8U3yaP?*nw4(R^3objGOv}_ln?EtgE8R208}+2q>`G> z5MEe3dCH4t_Ixu;HlIBv%ws^P!qgHUq?%hN$QWiOI>W}l>>Z?~BgD#UO*rqRQ#=Pr zL|9UM7G%W2>1igaO3>+fY}mm~?J`6bMy6D8rDmBawzD9;5urkDfL1COD@k=HtS|xN zSo7ZI8L^EKmePbdJz5NXI_(<5TDAhgo#TGFaDiV;Y)7q;M=xTThtmq#O-@$2mLq`+ zwEBvEe};X?s@@(EJfF$C==&>3mjUsojNpi_?<2c3lBji&;^34>LHtd*Di$M6yNZ>g3M_p#dC`j$M3{@-BQhyUO3h(e#Vp?TC=(V; z`FKzW9j*t!7VgtNYUL~Kxst8_Udl1IraoScpM_WmP7#^4F0Ycc&qPSRsn1Tiz;mNw za2puEL0~)wj_bgB4rE~l?p;^jL@$Ex6wsHyfq>Gc{~a^pY=W)H zeg?gEsVP-B!t<~}i?W}AK7_kk!KZ}uk1(*IxrduA-(?=gE(!vR%X94%J?4WS^U0n+ zgh!h80Ozm~9;wbNg2IM2&|(7@RO7uc8R`?Y6xi|t#ZiGS3jP|?<7gxJv+%5UQFl6U zxzV)%%G`tJ*PAL7-rqDePi z3&}qtR8UTJET@H67G7olOL;Jy`NUt!ukk^CTj%NC>vC6~#UF3%ZQJc|N6X6)f*u7I zcLN3!y1_ShGB`^bQMcEJuCl|6+?~zF1JgsKG9a~~!80+ZJYGb} z65Q#IzqTu{%U4_r>9Y@&qm0rnB=NU`PIJ9ZG=E0-a7|Jr;%jkkfTWKxy&N@Txht}` zKUMmGggBmZt^223K>_7>w58U%lNivF8XH`%A?m|9;RIGlSgdYu%&*?qcud!q(3Rx2 z9Zs4HOwQTXINaXa*?6aMOL6EZ8VRNsE_`n%Po28z?DoUMjtauXZNUK`7X{~Q*Fr6Q zovhzSRpQvD$f&as8pKh`=kw`+eldEG7zqSfPy-u;A~)~8kNS*CZ$hH9(^q>55A0*V zjI{zJNYSEPGxcUx!nKZ`akeTzJorfw8-fyxPY+J^mXYN^dKPo}5)o?})Qs|DxyKx$ zw^4LNdBU_ZxuUeEHGwD^a5jWVc<&w?3s@(kdgPQGA0|8{C~w)DQ%^3j5TgO2iY^qJ ziWu`vCMM#vwMXhX!j5;0g$iO_>q%J>5p}^yaeLUr(qK>vJ`bA@H&>OIl~UOqKa?Q2 zbMt(@1!)tgYN=GJSi&@Tr*=fOX3%4K-tH^EC`Goht`#OZMFr{{a+?2}|P%`Nu84F~V>9ZsBl&HHleO9#E$2fGNhEXxRPg$C?JGmrfGpKxO1A z<2eElM-J^-lZ$D`{W)hs4R-;mWriG*G$g}}GE580{MfRLm04_x$;$F3@6SBu??ys{ zrJJ7_vS>@`rBV}+-2Y5pA|V+XCDyu_K2I1f$PHNK4QGN0DV(VF!XL|*qsNOquYA$T z&=cwlsEs{L1ev6GQD|mLruAC<(R6%kG*= zMhS)>P1$6SaG+g)a*tZ7x7=qB#1(HKIC-5`KWi&OE$MCobo{cMl=Grxg3HE*6&iXD z1(m47nyOS7MiFv9YJCnZiQ|%YIv$&#>ao!rXmrS83>+zby@C{@=rv3Z>m$QuwC5HB z(T61t5jST?9cprOpxmPv9yUqqL_e zbWR!9g{`!(XBb1#)Nx5LCx%vVp~d76AjKxjDQCoQgtXvf>dhZrzNqG&gi^h6Va`2= zE*>r?a@%p>Ugkvpr+K9x!rd$w1IclZc;5$3ZF!88kiP{U2(ky!X8CISZUWq5LP zSI#h!hN<5kl;=y~Glva~W3;6rnp9B_=?7T*bW4@m!n*gluniUiJB)=Rmg=mSs!Cc{ zcWfeE^(QwGlJH_@|1rA#tGFNJ*&vyaOSFVmi1^Fxa--th7&JwzQ*}vPZW&R$KjrWN`@G$^~5-k{28>AgXctgdYDn3XG zDVm~D{l0jqY|1DS54~xqLK7RP2@TlTz?+UJtdtRDxLJ4vLJVt((lG26H8?@~MoV?0 zQ}ca681C-kKwYzy1i%RE&Z#{@w=|>9(S>dY9uReo;g{n%1o^e-X7T8no6Vi02yBS_ z^^ER55C01<;O+36dpnclaZf@jdRX6Dr44Q31Fhf#Od}?aWs_>$kb!8l;AQ9B(x?1V z%dPOD`d}k@xw$ZGx37oGVR%u#c^3L0|L~hjdcz9#wK*p@EM3xC>(G1zz2rwMbS|~R zEBcUUyIxa^OPxy}N?fBG5tf6uI8587%)2fSt-tX&&d`@*CxUFC5Y|25R@ZenR&W8Q zQtZoGS>#$2UIxNcqQfDuqTsO{ahox==EK!#$+LN3TU7u`zprqgH0z^tMshL^1ysP= z6043mvy%tjxRI|r*D6WJE#H#E7{zp?)CAp>Tw-qhJbnltN>tlN$lZw5FFCSA;5lV{ zM;LZP;!!G>iINV%v$?IDNiv4(himyTW|$Ml0B8-QVOW*n05r1z@deQw94Z1eqn$1e zR6AyBh%-q5Q$Vc0G1pCF|BzO-4XiEoSpGOLiQ#a^vTDKvsGcI@vkqiZ*$FMD1hY{w zI#CsoDh-0!7SIY_fqS_Oe!^MofnEv9dZJ9ek`|$r!lXHSwyqp28$< zwS*a55M2KDWdmZeE0%Snq%gTiWE&g1+!bdO!XR*=np?EeJsXeR$gq-hhutrYmKQ|{ zn2=BSh)JJdhnw+Biy|_+5_;j39Wx&Kh#twSuv`%fE63;*@)bnkE~TPC1x4PZKG)VE zG$9w2xtSD2YD(wTulUFE#k{0YZPpZ7yP8ssJqg+61`bwIy12F*X3Y>qvZ$;AlXrr3 zE~OBc@nh5-9K`H8R^tZC1Pw{@c`U~0RSVQn?o6Ur5Zl|?WV?yjBC;T<=`BnerfKra z5gMNf_PE^@ZcR>o$=5+DDDJfLafxBoU8RoT9L1QmndBqv7Xh+_OV=eO!d>^87vJ&V zlZi`kV;H{2lwC+CL_0;MMr3dzRk9PV;burp^=02T%!M{6-YAsP`tpLt83*P|1Fw^+ z;asiL6!JyHDtRgm+b#R0NdK%ZP_M{=Lm+IW=U&gfG{Crt2qV14Ega9r98zeX>n&m-B)hw9_gad5Yt_yWai;@738I;{ja4{R-D>@vI? zCDjq&p1qkI=tpa}k{(Cw26^N9eJr;%jNCFk8}yYmQbiq)s2DsKPDcVoy_{QeWL}|7 zaur5gruLmwac8M6ve$Aqpw(Gq-sehaQ1rczVdeK4*Qu{C-u>zY@U259Tz?Ib{aZ#= zx@5k{yiTNOJ;w;|W$K37ei#xiOY!_-H=~mtPlfZ7t8&D{BWgN|*P-!;*THS)C-D36 z3Aa$c^(HtgC$B8LiYFjF)BcIAIE|Fw3}Zj1zLBbY?&~D2Gr!T~mE=`=C-~*U;;WDI zUU;j2=Lzouvo!NnRyk~5|02;Vub%BqB7KwSvEL+;H;K;jCO9jnFSt{P@M_kf6tBz#A@$wuo^(EW zQx?Fs!SyS*+mr6l@Isi-%O2BTZT#zuI}~sA?tH@8t#TOp(sL1CXX%XZvj`nI@nZiS z`0^(elPp^lk|E3RNkt67Mp(|Ad8I`c5?W}qOd=DEpZbl*7r z@sScfG!A`LRMJy--ih3HZQE3@4Xuz^3E=>H}>giHk zRkU-|YN^k*C`~nc1ZzN6VLAvDtVh>$V6|c+^?=d&8H7@N-ZY871)VNHA4P?HhNV8r((=bYCwsC z4G(Fk4XbsFyYGxh$+?p!#WYehV1)ed4!eQtu(3HMM58OTt!^eN8_wP+Q}qL>0Xj_g zk{%J#=y-%O9*PU%;Wt1n9wvMfyY5YOMlPszdcGkSF`bdJi*gEKsngstB59ib8ERC~ z<_r)je30~~)}L#;OG%$N52x)#6f>B0%~guzude8v%vD0)x12w^VY?mH#aVkqr+O7D zP?`66Mq{aU`&n{Ulr5+Q4cF};YQK#zZy zYqk-9XNc_9UNtCNinrthn_aF;O35)nM5R8Ow*c*`JIf5Mx$_Z*HWC`1812>)o{k?aK;*gb@@IPJm3+R8pAx&JM<{Vhw$1iFKDS04HAzor19X1uvG`2 z(E=ug)L8Xv0t^2?fi(Ohj0=CEJVk_aFP+5V@1w+d!!%{~GXHYTYDbjmfSQH)@vI*m z$)3^iCaIR?2MZF|G6mtovA5H)Ve(M9`O(TgUCaNhWRY(Y$MDJg&x^~;OBYN0&li_3 zEkEUd{%GWXF0qe3C4m0LB!K>KAU#F_Pm6*bgEs5`DgE&;BK`44Cf)ID(&nf1$4}{x z&p>}1`@R-t2t!)kHkPjC>y<m-JN-v{}%S?JV5c7^9Su5MPhhnC04_*$&8)3%U3q% zBCxb+8EJ%0p1ELFI6iR>5_}6rR+7aNRGijWYgodgn$wgGWoD5PP zhk5C8D015Oi^?Z|QtdAut{|gu207=Um@i;5Wo4>ZFk%jM)NA zU&if8ph#SQn*4#7!~M8)C-Iol6vX|~P?wjfVy3+H<@5m`kWNNMhI5hl5>ROD z$0d6{$u&QaCc>1JLWd>tVFu{<1B-bAZ)Q5A&9a;FFM>>yK$`iksB~CryqBxdwaNeCev(^=5an#&g~XiS=1HT zNy08mX(Wiw&|9y_$*wGy3MCb)cEm^pbWiSVTH3EB71X>9U1y5gX0gyk2v#bHa))M@ z&Ni;<$*uELlkr1oFm>;(b$hiGD^g^3I-T%Zh-1K?ROJ0V2L!G=pD%R|baSrpYcXO_ z^4O4_lylhp4XsqSc7G(*_Cj%)BB*q%=OjHNi*e!LRBPrGVOj;thhw_7{lK!vY6S*j z3Y4v`kq#}TSsgKn+S!F7AC$&ujjO=sF4j%iL?vJ}yYXFEJCz6EhbKKmTerj-&ZB!+ zG9i2@mmD2+j*mOBh}c= zm!mqw-L}Xvk7yOs`>{%(%g@=~5)x`h@e5e-b7Zj)gz^!~P&aC5?(}WC)nv8&)GHP_wo*ItWA0QRHz-aunvnIIal~Jms_@ldmV;Z_LRH2p(Jx zQzTTOTngTChgfSB<0d3gyqT_BHq#;*+I53}ow#rkTq-ES*flb1#bEwb?s6=q&YirB zj$sFo-lqYNz8p(D$Q$_KksWk0Sr4Bt(i<$ zi&L>H-;o2}WvxJy@rkxWVBURr0rmn2;*pezNrrV_r0ksU;w>{p@te4(QFw80yGuzXKuT-Q6F%S9I{rHG~?c%(K@;lBm{Q~pCzZ|6*-8{_q zlR-hBW%k#|`5oi&@{8V_A4Zc3B-VOyB2yz*=g2MaTB?zxY8CWHG^EhHJA04JpG4+O z0C*B)eoaG7Za-}T=I!DAm@`2nin9coY)AAZF^jm+%X#%_9lxZ|wK1I}BMyScD$#uP7=|Ju!&-HfYyv$Q#px&C6Z;@1 z%u?+?E&+tIYAOI#!wiiw+^*I&Yu)(ECjn!4dSmnT zw8A*c!dF_DfY|AD1h&CMyt$>)vTrAG1Mf^GMjIz1}}eK#GqS9jJnHps^l^_XHLi{;in(^X8Oj0w~w(nnk;wmB>kmg8~GJX5^W zoIS+PcOH5paV2Z`!dN-G_#%H=nFeEmSIg^)z4%+ zney9f1R7r()SgKHu8eUY{0BwacgkU+att~WYsCbOgUyV=8dG%=Q&5ohT%$G8=k zB_q*8Cn-V&Y;}20cnG(Zj+A|0TlB$%Ye|=ZW4o7-5*zh;L@{V;(QK@*ueYDSbkPW^ z7V}nTk8H=^Cv94Htk|rf>49KXJ z0xb??>m2n11j;${L_@00F+(h%osBdU9GD=cn3MU0xbUWv5Ec`xN7D)lV5vbTg!pKC z!s(YA`EUDct4`91njm--vv!rO=_hPN4Ly0rGL`BI&X=EZ( zY@1Iii)rBU!6h4~<*q1PPq57TLV%CjL_dkfaSp5drSy;(nepXJAJledUSqSviBk>6 zxVPU4Z|JqKn2&RZtBI)N`o#1{nlvoNqt0<>Aq15?%dUp_$Ksr20%sQ)Z$&1OM|$N1 zR9UBmC42u8+>P&`wIy*lx)@}TtBKz*23^>`PSa${sUkp?+L;tfd=xU&LdM6VUEVFo zdAo}YoaxBXced}{y>04t6D=-ZQUOxQ6cNc_6yA@fIZO)fb83NQQJf`dKU{jx($X?T z@l_ZF^^Kb_xbsyGE8XlUTx73L*%=|liRfwO?7>+D5ee%CAD!_;3O{4n(GipsE0(Ud zT9?Rai@938yR#8uubOkEg-@NZ^28pmU$t^b z#V){N#*Qy`7CMYffrEmp2ZT9F`aa4j5=h9_&lTn?t82^_&MU2vif0g;1n$ZZ`@lVb zX)iD0Bo%g!v`XJDil<8^kIE@x?m#Z*C0hr-*_hud8$HgN@t>n7EI%cf^%Ua3!}_&J zZ#s-JF{8*G$hB&@Om&QE8JMwSx;Y2Ao>5IWXgw6B{oBc2ghD{9L!|y=EliMvRF5lg zPg?4SxrVs~s8cX`#|SIdmTz!Lq`_nbR@ft5M@*<#Ic4dDBC1p#diuLM`l4GOyM&iM zV4ZK=iwivM$|7Jmjdsgl;jtxT6wUz|u$M3yAEb}U{F(|n#*i)2`AH{Ak-iV_Snt2NyVmD?O#K!v1?Vaa8J^`#dC|*Y6{>khH3*rK7~L&I>5K=7u2d%K zElX2gN$3=RcxQ!^x&24WLx`EhwODn+Jv+9gmxEfsM9RX_Kp(nOTsGjR(WNENck3LK zOBDyM(LRZUV<;hg_Or|Wj;l@SyDoKtTY|&2+@@Uro7s4~SsXor7LvR$#RK>nMD-`^ z{~jJIR$qN<6!yUY5RAlLTBQEYSXmiH-FTRZ>BQYufOwUaqbJ zM|hN*gTSp@SiPSd3izLzr`Fy?=gKhMYaYR6-N>ZNbj%e_eNt@5O^A=jT4_lmaiFcDkP*|%Pq70l} zKk>@h8a6vZ^DRmmW<5o7YI@Zm^3y1Dsa6~5YCzq@*4 zbA1>7y0o;mb!U6^K1-4lg*}C<9>vFG=$ddS5;rG(%Vt6nQQSkNp{Aopq!HWPL>EQg zBs$(Z;reI-b`)+?3A>UKc$K-;=BT~{xlt?9Wp{U2I4EYUwx9(SW21)=A2|`B69;m& z39ZmTxd4<=$VyTc9m03IHp<9>%AQZMiV#b@Pfc-M=`4Ne7heRm%zj#Wg3*;a;v^}{ z3M{sv)bakUjH^SjRPG^vGaWnM1x-ywVBS>ctGTN1rZRK2!rS{s3yPy5AY0TCGoD+j zPKw99Y4s_SWD>8CATK?ok11ZTF9H<*nrm4n06=`0ssZKEl)5Cdq!QYLC(EVM6;4a{ z;!%1KThnu7{H`t6hqpIK#%>v9l?HdEbX}5LCn<>ovhJ{Ey60zdkT**bI0!ri6Tj2d zEm#pNOjfryE|hR5Bw1WdTOGoaj4FiY*1tlT;htv7YJ93iw*uBoy?7XP3ZCiMDOfshoEERV>eV(Sn-ae*llA9fw#srwdJ+0+Ihkp13 z=z@#&IW`>>Y~%X2{8r&Ncc8GC?7+X(T_q!f@XYeyJ|-W!-!ZM6)(UUFyn64}5*Q{} z_=V5L6Z(34Z7samS-x;$UtjF{G-;vbNki*aXiMw5UuE<4y3NP3ahp9s=O44*y@ku% z@6BWc!nJ=w*DGwRUeBF6iYNE+&d$R%bn3tjJ2&6{i!;oovsW&k+}YLf@niNdvb2Ry zJeH+ZaB>&k3Yj{Ja?P_eYg+=J)`3o*C9RpAXVo?&P%N}08lyJ88eEfsXwDVwEi8oL#Yt$dK*on zu$*#YE0DH9t;&+v(5RXvL+@rgbsxvfYsici_J_xZJf<+n9s10cwaEjsTnIK&v7=6x zs86@X2WxAb_zFB;-Q$^Cf^;Rc>R=t=5*btFpX#ehC7oH@f}V)g&S=r3$FnxXi{0xS zwWR5vxiubp;nE93Q(ePG7mqTX<*vr8c^A`*mZs5+o-MbL7ZK=_|(CrLR3^T0r91h~L4hWQJE3 z+3`F{Vp|OqH8e)b8g6#B(wbUObIyBNDS?P#EGl>$=UTGQhRxWdRoU_eO#wB!)$R=vebFM)HX#3VBW&YkR5n+7)X{qy8$uKJsv|E>91 zZ{jmf;s3q-{L)e>|9ko3<;AD@-yexPo2EP=Ku7)3OS=gtqucx`$Pl<(p$>(C%C*eQM&Hfk3OE25DibUznqM- z6W{L4sf5^#kqiai&)$Tz$2G(;Q)mJk25YTE;_{HBJl86$_NqFQkJTf*oqDntp*cdp z?9mj{M*=Jlgo!t~H4`#gRjMeZsS-r$ry2w%udcNb@r&?4!pm9^tRWp-A97I3u`8( zbGBKdyFwdW<#L5j-U}F_$L<4)vNx{>H<@PQf|?o^wp`lRv-U|^3AL5bYvqmia%X4t z!YvBaovlA`J*K*h-uRO@lQGcX@ zgMcu^qjdUEKUc^77R4Hn{Sjf5oGIp{uqHXP-cK{x>4a{9_f*gP3id+dB=%^e`3a0ez$4BAbFzrUe@En+#=fWmf(Fqpo0;6@V z@iyu1EWbO2|mxJkFU0 z4Fod2`7xXkN4#bpe{#EE>E7CYV3S5=3gt$=<1kLLzGVmCDa4H61aqKq7H?7k!R4DB z_vRhM=VRjz)k80f@_lJxgL!eH@Mb)m>?h&P%}u%A9*_aI{LXoOLfD*6aHN%e`h~fW zvSVwu--XLa1LlLrHi;s#s9?25e0cpku6&|05COo zK!rh(2wa7nL(tR`4tMRd+ykxVn$vo&kcb}M+Au>9_n&D2s!m-5Ug z04B7XQ{pvCWf=jEd&1%flzK??CSoTsreMxd;aG7Q_$Mr;BPYnK2p+NSXou~?#R-xn z2#r}7q2fhRU#+Pt2^BMz4Za8M6FYPrZ!P&LZ@9G9wjZ3lSg3n?79~Y!Lcf|&9F94$ zq|B{u(hp5lAGrg^6!Y#eA0burObmAiE(riEE~N&H^1_>Klt{20u;MJrm>d>WcPNw` ze#>%FYUS|Pr?`nC*^)(so)$h}JO_&Ja#!lFs>1?LJjwLt0ge0KE8xMxA$0dco@=(C zL&h>-O^xYb09qxc?4oZX=*N_~f`=T87lOROiY=6p*z ztDp^OO6kawGj+nZ5nAXmXs5laSOqt5E{B?bx|Dm6fASCbzEHDHNk@Usa z!K%(#9DtZDlJagn9Qc!{ngcPbeh==K9BzzD(oKfWG7XwJ; z(lMu`n0oQB*q|F7&vf}EhbXAT|C7<){F@wO#wh>umoCkS|I@!x{D0}v^9yeYFFlR_ zf9UZaIRCo#CgZ&iKK^52>EiR1`p?f_TzHEA_)z@&ZQFNme_HVQC^bH94Czwb+b>+$=4^YrM;^Mfz@lJ0Bo z`I7y2y}S2M{>6WO`PWDP_@Do$^;?_&=qG>v`WLPL&A;Zg9%*Z;{s7X-iTcm3`^^ogJNNuThEpZGhz z>JR+3-}!rg%UAyIll=YT*Wdfv=-}mdeaX&)cmK$b|J%Foc=?C^;m`fRkN&Hbt6y~K z`Ky2VyT0!){?+gO3xDPR{&l~u@qhlMzw>Lp;MaZocYMzu{o~*Et3K~nf5Inx!XNyj zfBNG-?&Ch@V?O39e(Tr%hA;n}U;5?0(_KlwBN^`$S~zV*`GzxVzBZ297q#ih%C`+I-ld%pJ{&o5kTcb2~WFZ`_wt%Yy< zKmX>R`S!p5IiK^ZzUABg+Gl;%=X}Oz{>tC;2ma(Q{}rF{b-(W$e)re?v9J2tKl1+H z@Y~+|f!}iUzOOhq{!PWg_J8uHf8n40^nZEhE8U;?ssHcC|Ji@M zx&HQl_)q`CkN(8Jf7|M<@BX|0@Y>sM{`J50!_B$YU;CRs_?>^_2fpyF&2RcMf8|en z(|3H@r+xY#|HeQ6%YNCX{;@yt?Vs`~!B>6FAO56I`sCmF)qn7}|E}NnTYtyz`OUxm z>+*x&@OtrqG<)A@a{Op~`0$;(Kl+dV-S)kA{qR5fH$V7eKl=}U>|cNXkNnH;`=Ot{ zeC5UO{OjL;@$$-F`fLBscYNpH3&Ur>;Maz~`q%v0&-?se^SQt3^FRLMKmHH=k#G6f zkNwzx{||oM0j!zt+qk)U|E2Hw&aeA#yI=W^U-La%KXq*@c*j5Z*01<`fBK~_{G2cT z+MoT~gN?7ao&TPff=~NXzw;}8?^j1Z^@s0tKKu9m&uecRzVG3qSKs}fzxvny;LrTQ zpMT+Je*XH;y#M=-Kfd>y-?I4W-}@bF|NT$hUTFNM>!0$~-~KoM-S58nDZ`(?ntkPe z{K+5tm_M=mzXpH5weq&V)$bNR_>F(*xnK9A-~0<#@4xRW{>knyT>dYw{)f*y`j)$C zUhFPi`)|MJ8}q+*^^g9EcfaMi|Kl5e`dhLqpYfBwY4iHm4gTzZ{FrZi&yT$KtN!a3 zearQq{6nwZ|EwSSeP8{rKK)D6_k7%+{K2d5zWu4YZ-3kGKe+Yj@B7yEZyo*pUs(AA zS66=j9}55VozLmN`ltW%pPBxuZ+iRBf6cYmKJcwS_7{J{gHQdz=l{@O`S(Biu2edl{#`Q)$vu1|`;;!D40^N;=1Yv1ulzyA*|_PR%3{p}ZT{oVikYrcN^H!gn8 z|MxfkLZ|sxf5m70_@CJseBM{DUV6)S{pGLxqW`t=r9b|$t6%fN=YRHI(z>62?yvgZ zKlV9a`?jNR{`znK?yvjd-~ao6f8=BT<<`p|^Etoz;pct)*TkRv+K+axeA9zZd=UQNXKsJ@t#5eu-~5eV_Srx3 z4?l2k^9TRSH~;+p7yln0|6l*d@BVM!`W8)S%GoScnKlp{8|KG!Z`RRZ7 zyT0r`ebZ;W|0iF)^AEo2%f9JHUReFEpL^F2{O@~>zxCVa{@o<-pZ5!2{zrCJzvzeG z`%3oT!>|0-+yD6Y{rkW4%l^$Dd-o@N$2;anTc7oR{lpKw^b3Fd`(FEj@4oqU|M)ZS z{rTVK*sTL(Y$oezH5|NF@w z|8vWsBeczLmXydibTwzu`0TANc&Q{f6KDm%reL z7x(_;3Qlk~{zE3ts)U z(W^hv|L5~}Kk&CN{TxD9lr&t9Z6M z=nVz~Y(iUHA|z?0g-m`srO=Q*q}@%6A{{|<)n`%7BCj?1E6u4{jJF~0ZaW$#d*c;^ zY}CAw{MMUH-C9J8Sj@d-Fh2Zsm6qR>7{bSn6}eFn@TmLN93;u zYgwP(Az0J7+yv4rugxfe;XE>-ZWH~$%es=lhcURIGAb<$I7u8=2c?!{g&*kCtk|R6 z=Y%i^G;F=?2jP6UwNqht&?6X*IbE60A}#6>=AVzJM~pztFv?*sfNo}K(nop=`h@^r zkJ0k^8#^~!90PjXTeo)J87_ixcA>Uo3Eq=z?S#vng$rkH`cP_?E3F5%`OfY6hp;=M z`RAQx&dw#{3_a%PHkX%>O?d8v?l5o65k4D#UG7}`MY$N+RY0wW|IV+k<1Iq70>9l! z#?^kJ-PqU(o6h3MFM_P!xrlT1#+oK}nF}Gj za(M83XTgpD|9M6>7U!jHCn>Xf2{z5WI|r98V9W5^3+tz?Q||N9g|l3Ou(_S>C4XoR z5~L&E-U%OW++RK02%Ye>P?hh7;N+fUB~%AxdwcCnx%|`yUel8c8R?hr6XXZ0gkXw5%q)>9VLYr!1?tCx zoY7{*zQC)&5LTd2aj4vNIb#Wg=-VbH5QjQwaj3n4)`p;pw&@5e8hT?L31^=5P-DgG zJNt~3Bs?8aMEkE}Xdg;^g?B(1!#*fCYHl9LJd|ApmXJxv?lT^R}_0}@yBlha_ zW?8TDTMZb4MoptL3l2C$Q}7X2^ORA3&?6zIXW`2h@4}5Y$v@$Nhrz_YtcKba)wP(@IVjSfp@kQviEY5senE z;uP~lc#nnU;ep%<*O7b?vvgEvhrV=^XgvR*I~^C(mU$G>d?el8 zP?=+T7|)1XD8M&~Y%);ToFoEs?G%`A@!q*skPHl%5@BUp&99%15fRr3?;y!$LRgz9 zWaL_!Q57JDx9_J(FKz_{A&QjtV;Hi6%GLoFQ6YFJY<<&4C%g++Ff}T5N|NY;@=XYG zI>fq7&^0toObfG(DvSuc_efuygCp|JL9g$9tkxB*l^eKEJQ?Velt9yHn84$8-{wfN zLgO+mQkXSFg?Vy}mXmPj;$T&5Ci6qJewy9ZlP*ZU|ZBjM}pLnk{h%p4JSIGb(IACa;~?i!on#o0>16q{5~99^P^+Tf1Mw`w&YG1a@x{RfP7q0 zEH9m4t84Jl?#=b>&8>IcS-*RK_x|d=+w1p*C2f3=WGSTr1%`~84(S5dGRZsv5JKZU zTPACfwvVmxhI?qk9EG*Js7NPmqQ^DcNF`uy>baT;<5>x6rUK+A&Xg(|3swuI znI_EiQA-K2;v~JCRPOE9sVt6++_EEcCqW6D4sf?WOi*tp2DK(?gL9&pXE7!nXpjcC zUhPYcv?+Se^&?8un18r-=2wIt@22#)SDX(? zt#f`yN%bKU=vYOUaci4&@4}7)4g$7>hjg9a`Y!abWou(QxudE&;@zU4C50&?t%{oJ zqXAQlyBSt6b3-_ev$>P?M(5lxx)%)st~R@Qw^+Gs$a>rub?5I&|&RIRyn35h_E5FBZEm&hBiH+QZ92>AaoW6mu`*cI$qOH2@`4Y?$tzjtmC4iXKA{Ed+D%TCcX)oO9g|!daFq^8 zb0bCNj6)fmZ67#VI;xh`j}z1dJS&%%+GR^(E2}oeZ}K?S$dgXV2}&vAgp^|w!Bn+Jg?G$cSFzk zLv009W9cnXFmnuUavVrdQ>qS{{5t7nwG~s%*L8 zjP(Ogu_RcP&3(qMx#pMDj3o-9`9-9{|Ir=JPF2safb4?il}v9ix{;7;pgP>%wX(OWw$PjOIT1wpkAaK-cHbMV^ug-tkw&k>v#o9a>Q zxl0D>w(#fJoX2cz^Mk4O)TkR%C28_h;@1*zZUyexN3z-N+gy{_wIi?NqX=DzD$Xc{ zH9`qX1<1|2Ro$1co5>z7v^qG}W{H^WgetQH^*(4)_wu;hGl_ben!VbufCUgcQV?W8 zKJ`gD;nJwoKPvzxaILZxbnUTYil@!2bKVea z-Fgc#sI*mH;M6Uh|E3&xx>@G9$?5_R*Y0iY>|9GOUAf$rdr`7*j0o5mXg88~!qz9m?JhQ-JP23W z0gPr)@$ylTv^Gz=tYWVy&!N@{qTy?f(N(1$vFZ!$6Sk+w1XM)S`)w5x-Xi495hzPW zFB+#~L}5CQ#`5e#T#A%ukK4?VGdl?attc>snXm&)MIK`kb8g6T#I=in6k9#6P^t>f zp$)vOR9!mOgHPP@)I{nh5j#<@cS$n3hk4PC zx`}OG-l`Q)*0yy|8FIp7axbEa$-I43_BM3jaK=>RH5I_vowWb4!)UCxsWYeS!YCWH zhqw^hd*f*g9dC#44nq9rjmNcy`)=4ei3k5tL<&O_{qWW{oRz#TS;56)|ERrsW$w-E z56*3m+l{V-<^ByOriZAO)%Fk`wm)d8YY3CVdofL~tg6TE?EavQ58d8gJLOK|yqNUt z-EF>2Py%7I!Vf^P(=)cpjo8Lv8&SV7Fb{{oUK<4#=t3vAHcBSBw4wJhg~r)$kB8cT zW4vhSz*pHg&`V;zicsrb7ne&N1(_&nan_L=nK!NfXnqX;BRa0fB5{Xj2Fy1^wFA?h)Poco4c@5Mh}lBD1#G4GP&q;96@}YN0Ff3JifG3c_DHxZwNw=u z;0T0``-aE~Pa~3DNSW~3w7*An{HRgmx&8mM_pa@2+(^Rce3gDhhhBR~iKN*ib+Ke= z){$k$8{ZzwnRr&C(c5e`C9X*}(@jcp63uTvb;Grrl;qginLWwuT1^yC01Aadp#W5= z+m%|OUsc9D7~AP6{S@fj7_~E>saE!rNlLL5SeMnC0X*E@StcQw*bhNCz!oGM}ncYFTozyBz+1`=#c-OCa`2GzUTtsUkA`YDp`Mm#*d?VqX9}>LoZXGO?YY`R_u%b3gvo$k~XN~cc=X>w3fRs zISP(ASLC_vAe0vVtT8}LUxs`6)E@8m4maW7qoc#lm!ub9zBPHU0bhbRfbTcZ<}ORL zcUK$M=j!n7c{)iR4&O%o+U-{B=~R52LRw76zz+ehtk_X}7pJD!l%vmDueqS|8>Cka z<)qwx8#tYzqjC3Ft75=Z&qN&E5vw#Vqw*PfREo&;>+Brp zOYcLlD4npaj?q0=j%^aS-&ei9(;Y9`TBg{g5o`jnLwH{OhTVn9j6&C{(}ipDiw_5H zo*wS~zbpLRkRug-?}?t_&i~))3mB!n|KNNN-|Bh5TnC*~Q{&-N#b8tfr>4rY*=#jI zEu?gqllX@&M&J~rM4WJRXN81%&=~5;M|tr~{NaBH)Ew_IB*PiU-QKV0V-$__EJx2l-*EqZd_}d}JX&&L>xc!1u6;H{s1DwmkAr z;r&}Nxi%T&TfJedgK3N1Sq=dr3HK;!H2eQ2%WYpfP9)9yEJD)^-4ht$i*Mz&P|(`V zNf%3ebN?QMJ&kiDmR(|+s$#0uPMbwC8XW1KDBVxe=0+;>kXVW?i7NBq5-fDk25Yl_ z3U|X*oyFVa>AW$5{jqbRwzTW&fr{z6-E4j5^A^YQ_=d*x%$aXB4&C|rr@rJXaN%XE zn@@kCpT)!9rF1c`Q{dyvkjEbQe>L)8cke`@k|!nq`ZU6Mw)&Ygx=Q*V9SZ3aM>-Cw z>>tvpP}y0ddEWZu?Td!x)LeUL-DrmD+z;EYE@+#Brg?-uchiC+W-ws8xn38a$|PFV6*FTC5g}R{8WlrGPR{U1XnuB<;pHg%4H@#3^ycV{4?dL^3QZI zEz5+ZWU6QyoL>$+l1Ypw@0ZxcK;ko#%Uat5EPCR`M=W^ouewZY5Kw$IrF)3z7J!he zRZc}nS>R4vJZTbNbEt<^bfM|2l-|{ALPRcJ?a+KX00u(>WIs- zPN|s7&S|oHTV*=$K?h(E$Gvov%LOqVqIsU5Pv*eCe5hEX`vA$6<>z%rKg@sQJ*1{O zE#IOlCH)rK!A3%f*KnJq*iXvFatak}fm2U1ae_C@K7o zxs_~no=hW$`q-S50?{%1eL3;Ozx+ss8e1jc;4ysSn{+a)3sK zUWS6|Gs>v-Zyvjvjj`Y`983170(ORs@<=-lLncMyKi05F$5M0J)~FB z#FGbsc5tExM7){TnyW_%+6+Dr{GPLxO;!>F&c2vtGk zW%9i|og|kySrR#+eR6@;I--USeD7qD4H|D8DC!#$t;)N-ntop~PR5`ht(vO%_GBHLkY0!gHxs58XAQk=e&9K#+UnWwNg>&Hf z3pvTPpB~woM{bxn!uQ8{I^oNfXeZ{Dag{g(&IJ(c_aRecZ9*Ez_KzS!qVU(U#;AX?V zEJ)4`Zn`u~?-iIhb9NfA+M_#CN}oa7wXA|i5_@3AuT=BYgef^slxXCKm^i~Eu*tc8 zmrE-^tTvAB?!kLW|Mc+a{nHok^!;Q16`d%Jat{yJKy$%%l~wNZ2ru^Iwvzz(Y+i

O9cPvWb|(Exa{0fHzEdfy_Gt>B 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%0DP$hmG% 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�OFG9rytkV2c67-{Dm3^+~Cw7mwjDe8SALN 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ⅈiCi1yu|K}}@%59(H3~_qXzetW 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�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
5RwfB% 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

+#e_={V5TqpDFnub_}?RHVeDo;TU zIE?(`?v#RFj^o_5dPM=ES@b2bSN^p+`!HEN@1^@mK16_RBY%@ zy|IgGZA9HC+wR%H?}wjF)Rf z1zE2+X-hI4cZLtqR{{S33E~PFPK?0^E@mS-YaG@aIQN#uqd9!^sD`dwm^)xVkVG7o zYm5k*GpYwh3`+Up$@cs5caJ-pPb&ZY{pNOUYipAV+itJTD4P87oV4gVhot{`c?P)u zJxD#9@Ac<%%+~Opx}2-7%CiUG#j-mEt%&x#lhOS$BRa#7IXXrGg0^umET^8LVK&

Y@^96I98} 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%0D^Lg)k4fkYd}t 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�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�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%0D-2_A1@)t(v`X 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

    $; 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 literal 0 HcmV?d00001 diff --git a/deps/luajit/COPYRIGHT b/deps/luajit/COPYRIGHT deleted file mode 100644 index 1ef7df62..00000000 --- a/deps/luajit/COPYRIGHT +++ /dev/null @@ -1,56 +0,0 @@ -=============================================================================== -LuaJIT -- a Just-In-Time Compiler for Lua. http://luajit.org/ - -Copyright (C) 2005-2015 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/deps/luajit/Makefile b/deps/luajit/Makefile deleted file mode 100644 index 0cbe741a..00000000 --- a/deps/luajit/Makefile +++ /dev/null @@ -1,151 +0,0 @@ -############################################################################## -# 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.). -# 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-2015 Mike Pall. See Copyright Notice in luajit.h -############################################################################## - -MAJVER= 2 -MINVER= 0 -RELVER= 4 -VERSION= $(MAJVER).$(MINVER).$(RELVER) -ABIVER= 5.1 - -############################################################################## -# -# 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_SONAME= libluajit-$(ABIVER).so.$(MAJVER).$(MINVER).$(RELVER) -INSTALL_SOSHORT= libluajit-$(ABIVER).so -INSTALL_DYLIBNAME= libluajit-$(ABIVER).$(MAJVER).$(MINVER).$(RELVER).dylib -INSTALL_DYLIBSHORT1= libluajit-$(ABIVER).dylib -INSTALL_DYLIBSHORT2= libluajit-$(ABIVER).$(MAJVER).dylib -INSTALL_PCNAME= luajit.pc - -INSTALL_STATIC= $(INSTALL_LIB)/$(INSTALL_ANAME) -INSTALL_DYN= $(INSTALL_LIB)/$(INSTALL_SONAME) -INSTALL_SHORT1= $(INSTALL_LIB)/$(INSTALL_SOSHORT) -INSTALL_SHORT2= $(INSTALL_LIB)/$(INSTALL_SOSHORT) -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 v.lua dump.lua dis_x86.lua dis_x64.lua dis_arm.lua \ - dis_ppc.lua dis_mips.lua dis_mipsel.lua bcsave.lua vmdef.lua - -ifeq (,$(findstring Windows,$(OS))) - ifeq (Darwin,$(shell uname -s)) - INSTALL_SONAME= $(INSTALL_DYLIBNAME) - INSTALL_SHORT1= $(INSTALL_LIB)/$(INSTALL_DYLIBSHORT1) - INSTALL_SHORT2= $(INSTALL_LIB)/$(INSTALL_DYLIBSHORT2) - LDCONFIG= : - endif -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_TSYM) $(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) - $(SYMLINK) $(INSTALL_TNAME) $(INSTALL_TSYM) - @echo "==== Successfully installed LuaJIT $(VERSION) to $(PREFIX) ====" - -uninstall: - @echo "==== Uninstalling LuaJIT $(VERSION) from $(PREFIX) ====" - $(UNINSTALL) $(INSTALL_TSYM) $(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 - for file in $(FILES_INC); do \ - $(UNINSTALL) $(INSTALL_INC)/$$file; \ - done - $(LDCONFIG) $(INSTALL_LIB) - $(RMDIR) $(UNINSTALL_DIRS) || : - @echo "==== Successfully uninstalled LuaJIT $(VERSION) from $(PREFIX) ====" - -############################################################################## - -amalg: - @echo "Building LuaJIT $(VERSION)" - $(MAKE) -C src amalg - -clean: - $(MAKE) -C src clean - -.PHONY: all install amalg clean - -############################################################################## diff --git a/deps/luajit/README b/deps/luajit/README deleted file mode 100644 index 44366af5..00000000 --- a/deps/luajit/README +++ /dev/null @@ -1,16 +0,0 @@ -README for LuaJIT 2.0.4 ------------------------ - -LuaJIT is a Just-In-Time (JIT) compiler for the Lua programming language. - -Project Homepage: http://luajit.org/ - -LuaJIT is Copyright (C) 2005-2015 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/deps/luajit/doc/bluequad-print.css b/deps/luajit/doc/bluequad-print.css deleted file mode 100644 index 07f5c84a..00000000 --- a/deps/luajit/doc/bluequad-print.css +++ /dev/null @@ -1,166 +0,0 @@ -/* Copyright (C) 2004-2015 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/deps/luajit/doc/bluequad.css b/deps/luajit/doc/bluequad.css deleted file mode 100644 index ae531430..00000000 --- a/deps/luajit/doc/bluequad.css +++ /dev/null @@ -1,325 +0,0 @@ -/* Copyright (C) 2004-2015 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/deps/luajit/doc/changes.html b/deps/luajit/doc/changes.html deleted file mode 100644 index d7b83ce6..00000000 --- a/deps/luajit/doc/changes.html +++ /dev/null @@ -1,978 +0,0 @@ - - - -LuaJIT Change History - - - - - - - - - - - - -
    -

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

    -

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

    - -
    -

    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.
    • -
    -
    - -
    -

    LuaJIT 1.1.8 — 2012-04-16

    - - -

    LuaJIT 1.1.7 — 2011-05-05

    - - -

    LuaJIT 1.1.6 — 2010-03-28

    -
      -
    • Added fixes for the -» currently known bugs in Lua 5.1.4.
    • -
    • Removed wrong GC check in jit_createstate(). -Thanks to Tim Mensch.
    • -
    • Fixed bad assertions while compiling table.insert() and -table.remove().
    • -
    - -

    LuaJIT 1.1.5 — 2008-10-25

    - - -

    LuaJIT 1.1.4 — 2008-02-05

    -
      -
    • Merged with Lua 5.1.3. Fixes all -» known bugs in Lua 5.1.2.
    • -
    • Fixed possible (but unlikely) stack corruption while compiling -k^x expressions.
    • -
    • Fixed DynASM template for cmpss instruction.
    • -
    - -

    LuaJIT 1.1.3 — 2007-05-24

    -
      -
    • Merged with Lua 5.1.2. Fixes all -» known bugs in Lua 5.1.1.
    • -
    • Merged pending Lua 5.1.x fixes: "return -nil" bug, spurious count hook call.
    • -
    • Remove a (sometimes) wrong assertion in luaJIT_findpc().
    • -
    • DynASM now allows labels for displacements and .aword.
    • -
    • Fix some compiler warnings for DynASM glue (internal API change).
    • -
    • Correct naming for SSSE3 (temporarily known as SSE4) in DynASM and x86 disassembler.
    • -
    • The loadable debug modules now handle redirection to stdout -(e.g. -j trace=-).
    • -
    - -

    LuaJIT 1.1.2 — 2006-06-24

    -
      -
    • Fix MSVC inline assembly: use only local variables with -lua_number2int().
    • -
    • Fix "attempt to call a thread value" bug on Mac OS X: -make values of consts used as lightuserdata keys unique -to avoid joining by the compiler/linker.
    • -
    - -

    LuaJIT 1.1.1 — 2006-06-20

    -
      -
    • Merged with Lua 5.1.1. Fixes all -» known bugs in Lua 5.1.
    • -
    • Enforce (dynamic) linker error for EXE/DLL version mismatches.
    • -
    • Minor changes to DynASM: faster pre-processing, smaller encoding -for some immediates.
    • -
    -

    -This release is in sync with Coco 1.1.1 (see the -» Coco Change History). -

    - -

    LuaJIT 1.1.0 — 2006-03-13

    -
      -
    • Merged with Lua 5.1 (final).
    • - -
    • New JIT call frame setup: -
        -
      • The C stack is kept 16 byte aligned (faster). -Mandatory for Mac OS X on Intel, too.
      • -
      • Faster calling conventions for internal C helper functions.
      • -
      • Better instruction scheduling for function prologue, OP_CALL and -OP_RETURN.
      • -
    • - -
    • Miscellaneous optimizations: -
        -
      • Faster loads of FP constants. Remove narrow-to-wide store-to-load -forwarding stalls.
      • -
      • Use (scalar) SSE2 ops (if the CPU supports it) to speed up slot moves -and FP to integer conversions.
      • -
      • Optimized the two-argument form of OP_CONCAT (a..b).
      • -
      • Inlined OP_MOD (a%b). -With better accuracy than the C variant, too.
      • -
      • Inlined OP_POW (a^b). Unroll x^k or -use k^x = 2^(log2(k)*x) or call pow().
      • -
    • - -
    • Changes in the optimizer: -
        -
      • Improved hinting for table keys derived from table values -(t1[t2[x]]).
      • -
      • Lookup hinting now works with arbitrary object types and -supports index chains, too.
      • -
      • Generate type hints for arithmetic and comparison operators, -OP_LEN, OP_CONCAT and OP_FORPREP.
      • -
      • Remove several hint definitions in favour of a generic COMBINE hint.
      • -
      • Complete rewrite of jit.opt_inline module -(ex jit.opt_lib).
      • -
    • - -
    • Use adaptive deoptimization: -
        -
      • If runtime verification of a contract fails, the affected -instruction is recompiled and patched on-the-fly. -Regular programs will trigger deoptimization only occasionally.
      • -
      • This avoids generating code for uncommon fallback cases -most of the time. Generated code is up to 30% smaller compared to -LuaJIT 1.0.3.
      • -
      • Deoptimization is used for many opcodes and contracts: -
          -
        • OP_CALL, OP_TAILCALL: type mismatch for callable.
        • -
        • Inlined calls: closure mismatch, parameter number and type mismatches.
        • -
        • OP_GETTABLE, OP_SETTABLE: table or key type and range mismatches.
        • -
        • All arithmetic and comparison operators, OP_LEN, OP_CONCAT, -OP_FORPREP: operand type and range mismatches.
        • -
      • -
      • Complete redesign of the debug and traceback info -(bytecode ↔ mcode) to support deoptimization. -Much more flexible and needs only 50% of the space.
      • -
      • The modules jit.trace, jit.dumphints and -jit.dump handle deoptimization.
      • -
    • - -
    • Inlined many popular library functions -(for commonly used arguments only): -
        -
      • Most math.* functions (the 18 most used ones) -[2x-10x faster].
      • -
      • string.len, string.sub and string.char -[2x-10x faster].
      • -
      • table.insert, table.remove and table.getn -[3x-5x faster].
      • -
      • coroutine.yield and coroutine.resume -[3x-5x faster].
      • -
      • pairs, ipairs and the corresponding iterators -[8x-15x faster].
      • -
    • - -
    • Changes in the core and loadable modules and the stand-alone executable: -
        -
      • Added jit.version, jit.version_num -and jit.arch.
      • -
      • Reorganized some internal API functions (jit.util.*mcode*).
      • -
      • The -j dump output now shows JSUB names, too.
      • -
      • New x86 disassembler module written in pure Lua. No dependency -on ndisasm anymore. Flexible API, very compact (500 lines) -and complete (x87, MMX, SSE, SSE2, SSE3, SSSE3, privileged instructions).
      • -
      • luajit -v prints the LuaJIT version and copyright -on a separate line.
      • -
    • - -
    • Added SSE, SSE2, SSE3 and SSSE3 support to DynASM.
    • -
    • Miscellaneous doc changes. Added a section about -embedding LuaJIT.
    • -
    -

    -This release is in sync with Coco 1.1.0 (see the -» Coco Change History). -

    -
    - -
    -

    LuaJIT 1.0.3 — 2005-09-08

    -
      -
    • Even more docs.
    • -
    • Unified closure checks in jit.*.
    • -
    • Fixed some range checks in jit.util.*.
    • -
    • Fixed __newindex call originating from jit_settable_str().
    • -
    • Merged with Lua 5.1 alpha (including early bug fixes).
    • -
    -

    -This is the first public release of LuaJIT. -

    - -

    LuaJIT 1.0.2 — 2005-09-02

    -
      -
    • Add support for flushing the Valgrind translation cache
      -(MYCFLAGS= -DUSE_VALGRIND).
    • -
    • Add support for freeing executable mcode memory to the mmap()-based -variant for POSIX systems.
    • -
    • Reorganized the C function signature handling in -jit.opt_lib.
    • -
    • Changed to index-based hints for inlining C functions. -Still no support in the backend for inlining.
    • -
    • Hardcode HEAP_CREATE_ENABLE_EXECUTE value if undefined.
    • -
    • Misc. changes to the jit.* modules.
    • -
    • Misc. changes to the Makefiles.
    • -
    • Lots of new docs.
    • -
    • Complete doc reorg.
    • -
    -

    -Not released because Lua 5.1 alpha came out today. -

    - -

    LuaJIT 1.0.1 — 2005-08-31

    -
      -
    • Missing GC step in OP_CONCAT.
    • -
    • Fix result handling for C –> JIT calls.
    • -
    • Detect CPU feature bits.
    • -
    • Encode conditional moves (fucomip) only when supported.
    • -
    • Add fallback instructions for FP compares.
    • -
    • Add support for LUA_COMPAT_VARARG. Still disabled by default.
    • -
    • MSVC needs a specific place for the CALLBACK attribute -(David Burgess).
    • -
    • Misc. doc updates.
    • -
    -

    -Interim non-public release. -Special thanks to Adam D. Moss for reporting most of the bugs. -

    - -

    LuaJIT 1.0.0 — 2005-08-29

    -

    -This is the initial non-public release of LuaJIT. -

    -
    -
    -
    - - - diff --git a/deps/luajit/doc/contact.html b/deps/luajit/doc/contact.html deleted file mode 100644 index 0ef01a7c..00000000 --- a/deps/luajit/doc/contact.html +++ /dev/null @@ -1,102 +0,0 @@ - - - -Contact - - - - - - - - -
    -Lua -
    - - -
    -

    -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-2015 Mike Pall. -

    - - -
    -
    - - - diff --git a/deps/luajit/doc/ext_c_api.html b/deps/luajit/doc/ext_c_api.html deleted file mode 100644 index 65981806..00000000 --- a/deps/luajit/doc/ext_c_api.html +++ /dev/null @@ -1,187 +0,0 @@ - - - -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 on, -LUAJIT_MODE_ON to turn a feature off, 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/deps/luajit/doc/ext_ffi.html b/deps/luajit/doc/ext_ffi.html deleted file mode 100644 index 77b8e26c..00000000 --- a/deps/luajit/doc/ext_ffi.html +++ /dev/null @@ -1,330 +0,0 @@ - - - -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/deps/luajit/doc/ext_ffi_api.html b/deps/luajit/doc/ext_ffi_api.html deleted file mode 100644 index 8f577e9f..00000000 --- a/deps/luajit/doc/ext_ffi_api.html +++ /dev/null @@ -1,566 +0,0 @@ - - - -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

    -
      -
    • cdecl — An abstract C type declaration (a Lua -string).
    • -
    • ctype — A C type object. This is a special kind of -cdata returned by ffi.typeof(). It serves as a -cdata constructor when called.
    • -
    • cdata — A C data object. It holds a value of the -corresponding ctype.
    • -
    • ct — A C type specification which can be used for -most of the API functions. Either a cdecl, a ctype or a -cdata serving as a template type.
    • -
    • cb — A callback object. This is a C data object -holding a special function pointer. Calling this function from -C code runs an associated Lua function.
    • -
    • VLA — A variable-length array is declared with a -? instead of the number of elements, e.g. "int[?]". -The number of elements (nelem) must be given when it's -created.
    • -
    • VLS — A variable-length struct is a struct C -type where the last element is a VLA. The same rules for -declaration and creation apply.
    • -
    - -

    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
    - -

    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 both decimal (42LL) and hexadecimal -(0x2aLL) 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/deps/luajit/doc/ext_ffi_semantics.html b/deps/luajit/doc/ext_ffi_semantics.html deleted file mode 100644 index c267b555..00000000 --- a/deps/luajit/doc/ext_ffi_semantics.html +++ /dev/null @@ -1,1245 +0,0 @@ - - - -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 '\e' escape in character and string literals.
    • - -
    • The C99/C++ boolean type, declared with the keywords bool -or _Bool.
    • - -
    • Complex numbers, declared with the keywords complex or -_Complex.
    • - -
    • Two complex number types: complex (aka -complex double) and complex float.
    • - -
    • Vector types, declared with the GCC mode or -vector_size attribute.
    • - -
    • Unnamed ('transparent') struct/union fields -inside a struct/union.
    • - -
    • Incomplete enum declarations, handled like incomplete -struct declarations.
    • - -
    • Unnamed enum fields inside a -struct/union. This is similar to a scoped C++ -enum, except that declared constants are visible in the -global namespace, too.
    • - -
    • Scoped static const declarations inside a -struct/union (from C++).
    • - -
    • Zero-length arrays ([0]), empty -struct/union, variable-length arrays (VLA, -[?]) and variable-length structs (VLS, with a trailing -VLA).
    • - -
    • C++ reference types (int &x).
    • - -
    • Alternate GCC keywords with '__', e.g. -__const__.
    • - -
    • GCC __attribute__ with the following attributes: -aligned, packed, mode, -vector_size, cdecl, fastcall, -stdcall, thiscall.
    • - -
    • The GCC __extension__ keyword and the GCC -__alignof__ operator.
    • - -
    • GCC __asm__("symname") symbol name redirection for -function declarations.
    • - -
    • MSVC keywords for fixed-length types: __int8, -__int16, __int32 and __int64.
    • - -
    • MSVC __cdecl, __fastcall, __stdcall, -__thiscall, __ptr32, __ptr64, -__declspec(align(n)) and #pragma pack.
    • - -
    • All other GCC/MSVC-specific attributes are ignored.
    • - -
    -

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

    -
      - -
    • Vararg handling: va_list, __builtin_va_list, -__gnuc_va_list.
    • - -
    • From <stddef.h>: ptrdiff_t, -size_t, wchar_t.
    • - -
    • From <stdint.h>: int8_t, int16_t, -int32_t, int64_t, uint8_t, -uint16_t, uint32_t, uint64_t, -intptr_t, uintptr_t.
    • - -
    -

    -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: -

    -
      - -
    • A declaration must always have a type specifier; it doesn't -default to an int type.
    • - -
    • Old-style empty function declarations (K&R) are not allowed. -All C functions must have a proper prototype declaration. A -function declared without parameters (int foo();) is -treated as a function taking zero arguments, like in C++.
    • - -
    • The long double C type is parsed correctly, but -there's no support for the related conversions, accesses or arithmetic -operations.
    • - -
    • Wide character strings and character literals are not -supported.
    • - -
    • See below for features that are currently -not implemented.
    • - -
    - -

    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: -

    -
      -
    • If no initializers are given, the object is filled with zero bytes.
    • - -
    • Scalar types (numbers and pointers) accept a single initializer. -The Lua object is converted to the scalar -C type.
    • - -
    • Valarrays (complex numbers and vectors) are treated like scalars -when a single initializer is given. Otherwise they are treated like -regular arrays.
    • - -
    • Aggregate types (arrays and structs) accept either a single cdata -initializer of the same type (copy constructor), a single -table initializer, or a flat list of -initializers.
    • - -
    • The elements of an array are initialized, starting at index zero. -If a single initializer is given for an array, it's repeated for all -remaining elements. This doesn't happen if two or more initializers -are given: all remaining uninitialized elements are filled with zero -bytes.
    • - -
    • Byte arrays may also be initialized with a Lua string. This copies -the whole string plus a terminating zero-byte. The copy stops early only -if the array has a known, fixed size.
    • - -
    • The fields of a struct are initialized in the order of -their declaration. Uninitialized fields are filled with zero -bytes.
    • - -
    • Only the first field of a union can be initialized with a -flat initializer.
    • - -
    • Elements or fields which are aggregates themselves are initialized -with a single initializer, but this may be a table -initializer or a compatible aggregate.
    • - -
    • Excess initializers cause an error.
    • - -
    - -

    Table Initializers

    -

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

    -
      - -
    • If the table index [0] is non-nil, then the -table is assumed to be zero-based. Otherwise it's assumed to be -one-based.
    • - -
    • Array elements, starting at index zero, are initialized one-by-one -with the consecutive table elements, starting at either index -[0] or [1]. This process stops at the first -nil table element.
    • - -
    • If exactly one array element was initialized, it's repeated for -all the remaining elements. Otherwise all remaining uninitialized -elements are filled with zero bytes.
    • - -
    • The above logic only applies to arrays with a known fixed size. -A VLA is only initialized with the element(s) given in the table. -Depending on the use case, you may need to explicitly add a -NULL or 0 terminator to a VLA.
    • - -
    • A struct/union can be initialized in the -order of the declaration of its fields. Each field is initialized with -consecutive table elements, starting at either index [0] -or [1]. This process stops at the first nil table -element.
    • - -
    • Otherwise, if neither index [0] nor [1] is present, -a struct/union is initialized by looking up each field -name (as a string key) in the table. Each non-nil value is -used to initialize the corresponding field.
    • - -
    • Uninitialized fields of a struct are filled with zero -bytes, except for the trailing VLA of a VLS.
    • - -
    • Initialization of a union stops after one field has been -initialized. If no field has been initialized, the union is -filled with zero bytes.
    • - -
    • Elements or fields which are aggregates themselves are initialized -with a single initializer, but this may be a nested table -initializer (or a compatible aggregate).
    • - -
    • Excess initializers for an array cause an error. Excess -initializers for a struct/union are ignored. -Unrelated table entries are ignored, too.
    • - -
    -

    -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

    -
      - -
    • Indexing a pointer/array: a cdata pointer/array can be -indexed by a cdata number or a Lua number. The element address is -computed as the base address plus the number value multiplied by the -element size in bytes. A read access loads the element value and -converts it to a Lua object. A write -access converts a Lua object to the element -type and stores the converted value to the element. An error is -raised if the element size is undefined or a write access to a -constant element is attempted.
    • - -
    • Dereferencing a struct/union field: a -cdata struct/union or a pointer to a -struct/union can be dereferenced by a string key, -giving the field name. The field address is computed as the base -address plus the relative offset of the field. A read access loads the -field value and converts it to a Lua -object. A write access converts a Lua -object to the field type and stores the converted value to the -field. An error is raised if a write access to a constant -struct/union or a constant field is attempted. -Scoped enum constants or static constants are treated like a constant -field.
    • - -
    • Indexing a complex number: a complex number can be indexed -either by a cdata number or a Lua number with the values 0 or 1, or by -the strings "re" or "im". A read access loads the -real part ([0], .re) or the imaginary part -([1], .im) part of a complex number and -converts it to a Lua number. The -sub-parts of a complex number are immutable — assigning to an -index of a complex number raises an error. Accessing out-of-bound -indexes returns unspecified results, but is guaranteed not to trigger -memory access violations.
    • - -
    • Indexing a vector: a vector is treated like an array for -indexing purposes, except the vector elements are immutable — -assigning to an index of a vector raises an error.
    • - -
    -

    -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

    -
      - -
    • Constructor: a ctype object can be called and used as a -constructor. This is equivalent -to ffi.new(ct, ...), unless a __new metamethod is -defined. The __new metamethod is called with the ctype object -plus any other arguments passed to the contructor. Note that you have to -use ffi.new inside of it, since calling ct(...) would -cause infinite recursion.
    • - -
    • C function call: a cdata function or cdata function -pointer can be called. The passed arguments are -converted to the C types of the -parameters given by the function declaration. Arguments passed to the -variable argument part of vararg C function use -special conversion rules. This -C function is called and the return value (if any) is -converted to a Lua object.
      -On Windows/x86 systems, __stdcall functions are automatically -detected and a function declared as __cdecl (the default) is -silently fixed up after the first call.
    • - -
    - -

    Arithmetic on cdata objects

    -
      - -
    • Pointer arithmetic: a cdata pointer/array and a cdata -number or a Lua number can be added or subtracted. The number must be -on the right hand side for a subtraction. The result is a pointer of -the same type with an address plus or minus the number value -multiplied by the element size in bytes. An error is raised if the -element size is undefined.
    • - -
    • Pointer difference: two compatible cdata pointers/arrays -can be subtracted. The result is the difference between their -addresses, divided by the element size in bytes. An error is raised if -the element size is undefined or zero.
    • - -
    • 64 bit integer arithmetic: the standard arithmetic -operators (+ - * / % ^ and unary -minus) can be applied to two cdata numbers, or a cdata number and a -Lua number. If one of them is an uint64_t, the other side is -converted to an uint64_t and an unsigned arithmetic operation -is performed. Otherwise both sides are converted to an -int64_t and a signed arithmetic operation is performed. The -result is a boxed 64 bit cdata object.
      - -If one of the operands is an enum and the other operand is a -string, the string is converted to the value of a matching enum -constant before the above conversion.
      - -These rules ensure that 64 bit integers are "sticky". Any -expression involving at least one 64 bit integer operand results -in another one. The undefined cases for the division, modulo and power -operators return 2LL ^ 63 or -2ULL ^ 63.
      - -You'll have to explicitly convert a 64 bit integer to a Lua -number (e.g. for regular floating-point calculations) with -tonumber(). But note this may incur a precision loss.
    • - -
    - -

    Comparisons of cdata objects

    -
      - -
    • Pointer comparison: two compatible cdata pointers/arrays -can be compared. The result is the same as an unsigned comparison of -their addresses. nil is treated like a NULL pointer, -which is compatible with any other pointer type.
    • - -
    • 64 bit integer comparison: two cdata numbers, or a -cdata number and a Lua number can be compared with each other. If one -of them is an uint64_t, the other side is converted to an -uint64_t and an unsigned comparison is performed. Otherwise -both sides are converted to an int64_t and a signed -comparison is performed.
      - -If one of the operands is an enum and the other operand is a -string, the string is converted to the value of a matching enum -constant before the above conversion.
      - -
    • Comparisons for equality/inequality never raise an error. -Even incompatible pointers can be compared for equality by address. Any -other incompatible comparison (also with non-cdata objects) treats the -two sides as unequal.
    • - -
    - -

    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: -

    -
      - -
    • If you can get by with the precision of Lua numbers -(52 bits), then use tonumber() on a cdata number or -combine multiple fields of a cdata aggregate to a Lua number. Then use -the resulting Lua number as a key when indexing tables.
      -One obvious benefit: t[tonumber(2LL)] does point to -the same slot as t[2].
    • - -
    • Otherwise use either tostring() on 64 bit integers -or complex numbers or combine multiple fields of a cdata aggregate to -a Lua string (e.g. with -ffi.string()). Then -use the resulting Lua string as a key when indexing tables.
    • - -
    • Create your own specialized hash table implementation using the -C types provided by the FFI library, just like you would in -C code. Ultimately this may give much better performance than the -other alternatives or what a generic by-value hash table could -possibly provide.
    • - -
    - -

    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: -

    -
      - -
    • External functions: a cdata object with the type of the function -and its address is returned.
    • - -
    • External variables: the symbol address is dereferenced and the -loaded value is converted to a Lua object -and returned.
    • - -
    • Constant values (static const or enum -constants): the constant is converted to a -Lua object and returned.
    • - -
    -

    -This is what happens on a write access: -

    -
      - -
    • External variables: the value to be written is -converted to the C type of the -variable and then stored at the symbol address.
    • - -
    • Writing to constant variables or to any other symbol type causes -an error, like any other attempted write to a constant location.
    • - -
    -

    -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: -

    -
      -
    • C declarations are not passed through a C pre-processor, -yet.
    • -
    • The C parser is able to evaluate most constant expressions -commonly found in C header files. However it doesn't handle the -full range of C expression semantics and may fail for some -obscure constructs.
    • -
    • static const declarations only work for integer types -up to 32 bits. Neither declaring string constants nor -floating-point constants is supported.
    • -
    • Packed struct bitfields that cross container boundaries -are not implemented.
    • -
    • Native vector types may be defined with the GCC mode or -vector_size attribute. But no operations other than loading, -storing and initializing them are supported, yet.
    • -
    • The volatile type qualifier is currently ignored by -compiled code.
    • -
    • ffi.cdef silently -ignores most re-declarations. Note: avoid re-declarations which do not -conform to C99. The implementation will eventually be changed to -perform strict checks.
    • -
    -

    -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: -

    -
      -
    • Bitfield accesses and initializations.
    • -
    • Vector operations.
    • -
    • Table initializers.
    • -
    • Initialization of nested struct/union types.
    • -
    • Allocations of variable-length arrays or structs.
    • -
    • Allocations of C types with a size > 128 bytes or an -alignment > 8 bytes.
    • -
    • Conversions from lightuserdata to void *.
    • -
    • Pointer differences for element sizes that are not a power of -two.
    • -
    • Calls to C functions with aggregates passed or returned by -value.
    • -
    • Calls to ctype metamethods which are not plain functions.
    • -
    • ctype __newindex tables and non-string lookups in ctype -__index tables.
    • -
    • tostring() for cdata types.
    • -
    • Calls to ffi.cdef(), ffi.load() and -ffi.metatype().
    • -
    -

    -Other missing features: -

    -
      -
    • Bit operations for 64 bit types.
    • -
    • Arithmetic for complex numbers.
    • -
    • Passing structs by value to vararg C functions.
    • -
    • C++ exception interoperability -does not extend to C functions called via the FFI, if the call is -compiled.
    • -
    -
    -
    - - - diff --git a/deps/luajit/doc/ext_ffi_tutorial.html b/deps/luajit/doc/ext_ffi_tutorial.html deleted file mode 100644 index 8f99bfb1..00000000 --- a/deps/luajit/doc/ext_ffi_tutorial.html +++ /dev/null @@ -1,601 +0,0 @@ - - - -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/deps/luajit/doc/ext_jit.html b/deps/luajit/doc/ext_jit.html deleted file mode 100644 index 27351dd6..00000000 --- a/deps/luajit/doc/ext_jit.html +++ /dev/null @@ -1,199 +0,0 @@ - - - -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", "ppc", "ppcspe", or "mips". -

    - -

    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/deps/luajit/doc/extensions.html b/deps/luajit/doc/extensions.html deleted file mode 100644 index e9cd136c..00000000 --- a/deps/luajit/doc/extensions.html +++ /dev/null @@ -1,408 +0,0 @@ - - - -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. -

    -

    -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. -

    - -

    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 and hexadecimal 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. -

    - -

    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: -

    -
      -
    • goto and ::labels::.
    • -
    • Hex escapes '\x3F' and '\*' escape in strings.
    • -
    • load(string|reader [, chunkname [,mode [,env]]]).
    • -
    • loadstring() is an alias for load().
    • -
    • loadfile(filename [,mode [,env]]).
    • -
    • math.log(x [,base]). -
    • string.rep(s, n [,sep]). -
    • string.format(): %q reversible. -%s checks __tostring. -%a and "%A added.
    • -
    • String matching pattern %g added.
    • -
    • io.read("*L").
    • -
    • io.lines() and file:lines() process -io.read() options.
    • -
    • os.exit(status|true|false [,close]).
    • -
    • package.searchpath(name, path [, sep [, rep]]).
    • -
    • package.loadlib(name, "*").
    • -
    • debug.getinfo() returns nparams and isvararg -for option "u".
    • -
    • debug.getlocal() accepts function instead of level.
    • -
    • debug.getlocal() and debug.setlocal() accept negative -indexes for varargs.
    • -
    • debug.getupvalue() and debug.setupvalue() handle -C functions.
    • -
    • debug.upvalueid() and debug.upvaluejoin().
    • -
    • Command line option -E.
    • -
    • Command line checks __tostring for errors.
    • -
    -

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

    -
      -
    • goto is a keyword and not a valid variable name anymore.
    • -
    • break can be placed anywhere. Empty statements (;;) -are allowed.
    • -
    • __lt, __le are invoked for mixed types.
    • -
    • __len for tables. rawlen() library function.
    • -
    • pairs() and ipairs() check for __pairs and -__ipairs.
    • -
    • coroutine.running() returns two results.
    • -
    • table.pack() and table.unpack() -(same as unpack()).
    • -
    • io.write() and file:write() return file handle -instead of true.
    • -
    • os.execute() and pipe:close() return detailed -exit status.
    • -
    • debug.setmetatable() returns object.
    • -
    • debug.getuservalue() and debug.setuservalue().
    • -
    • Remove math.mod(), string.gfind(). -
    -

    -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). -

    - -

    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+Full
    Other platforms, DWARF2 unwindingGCCLimited
    Windows/x64MSVC or WinSDKFull
    Windows/x86AnyNo
    Other platformsOther compilersNo
    -

    -Full interoperability means: -

    -
      -
    • C++ exceptions can be caught on the Lua side with pcall(), -lua_pcall() etc.
    • -
    • C++ exceptions will be converted to the generic Lua error -"C++ exception", unless you use the -C call wrapper feature.
    • -
    • It's safe to throw C++ exceptions across non-protected Lua frames -on the C stack. The contents of the C++ exception object -pass through unmodified.
    • -
    • Lua errors can be caught on the C++ side with catch(...). -The corresponding Lua error message can be retrieved from the Lua stack.
    • -
    • Throwing Lua errors across C++ frames is safe. C++ destructors -will be called.
    • -
    -

    -Limited interoperability means: -

    -
      -
    • C++ exceptions can be caught on the Lua side with pcall(), -lua_pcall() etc.
    • -
    • C++ exceptions will be converted to the generic Lua error -"C++ exception", unless you use the -C call wrapper feature.
    • -
    • C++ exceptions will be caught by non-protected Lua frames and -are rethrown as a generic Lua error. The C++ exception object will -be destroyed.
    • -
    • Lua errors cannot be caught on the C++ side.
    • -
    • Throwing Lua errors across C++ frames will not call -C++ destructors.
    • -
    - -

    -No interoperability means: -

    -
      -
    • It's not safe to throw C++ exceptions across Lua frames.
    • -
    • C++ exceptions cannot be caught on the Lua side.
    • -
    • Lua errors cannot be caught on the C++ side.
    • -
    • Throwing Lua errors across C++ frames will not call -C++ destructors.
    • -
    • Additionally, on Windows/x86 with SEH-based C++ exceptions: -it's not safe to throw a Lua error across any frames containing -a C++ function with any try/catch construct or using variables with -(implicit) destructors. This also applies to any functions which may be -inlined in such a function. It doesn't matter whether lua_error() -is called inside or outside of a try/catch or whether any object actually -needs to be destroyed: the SEH chain is corrupted and this will eventually -lead to the termination of the process.
    • -
    -
    -
    - - - diff --git a/deps/luajit/doc/faq.html b/deps/luajit/doc/faq.html deleted file mode 100644 index 9902f090..00000000 --- a/deps/luajit/doc/faq.html +++ /dev/null @@ -1,184 +0,0 @@ - - - -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/deps/luajit/doc/img/contact.png b/deps/luajit/doc/img/contact.png deleted file mode 100644 index 9c73dc594efc1f47309d6c9b73d7719c3a9e04df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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.x
    GCC 3.4
    GCC 4.x
    GCC 3.4
    GCC 4.x
    GCC 3.4
    MSVC, MSVC/EE
    WinSDK
    MinGW, Cygwin
    x64 (64 bit)GCC 4.xORBIS (PS4)GCC 4.xMSVC + SDK v7.0
    WinSDK v7.0
    ARMv5+
    ARM9E+
    GCC 4.2+GCC 4.2+
    PSP2 (PS VITA)
    GCC 4.2+ 
    PPCGCC 4.3+GCC 4.3+
    GCC 4.1 (PS3)
     XEDK (Xbox 360)
    PPC/e500v2GCC 4.3+GCC 4.3+  
    MIPSGCC 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. -

    - -

    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.4.tar.gz
    -cd LuaJIT-2.0.4
    -

    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 x86, x64 or PPC 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

    -

    -The GNU Makefile-based build system allows cross-compiling on any host -for any supported target, as long as both architectures have the same -pointer size. If you want to cross-compile to any 32 bit target on an -x64 OS, 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"). -

    -

    -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. The examples -below only show some popular targets — please check the comments -in src/Makefile for more details. -

    -
    -# 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. You -can specify these when building the toolchain yourself. Or add --mcpu=... or -march=... 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. -

    -
    -# 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-A8)
    -make HOST_CC="gcc -m32" CROSS=arm-linux-gnueabi- \
    -     TARGET_CFLAGS="-mcpu=cortex-a8 -mfloat-abi=softfp"
    -
    -# ARM hard-float ABI with VFP (armhf, requires recent toolchain)
    -make HOST_CC="gcc -m32" CROSS=arm-linux-gnueabihf-
    -
    -# PPC
    -make HOST_CC="gcc -m32" CROSS=powerpc-linux-gnu-
    -# PPC/e500v2 (fast interpreter only)
    -make HOST_CC="gcc -m32" CROSS=powerpc-e500v2-linux-gnuspe-
    -
    -# MIPS big-endian
    -make HOST_CC="gcc -m32" CROSS=mips-linux-
    -# MIPS little-endian
    -make HOST_CC="gcc -m32" CROSS=mipsel-linux-
    -
    -

    -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.6
    -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.6
    -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, mips (MIPS32R1 hard-float), Android 4.0+ (ICS)
    -NDK=/opt/android/ndk
    -NDKABI=14
    -NDKVER=$NDK/toolchains/mipsel-linux-android-4.6
    -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.6
    -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. -The environment variables need to match the iOS SDK version: -

    -

    -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 -

    -
    -IXCODE=`xcode-select -print-path`
    -ISDK=$IXCODE/Platforms/iPhoneOS.platform/Developer
    -ISDKVER=iPhoneOS6.0.sdk
    -ISDKP=$ISDK/usr/bin/
    -ISDKF="-arch armv7 -isysroot $ISDK/SDKs/$ISDKVER"
    -make HOST_CC="gcc -m32 -arch i386" CROSS=$ISDKP 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
    -
    - -

    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, you need to link your main executable -with these flags: -
      --pagezero_size 10000 -image_base 100000000
      -
      -Also, it's recommended to rebase all (self-compiled) shared libraries -which are loaded at runtime on OSX/x64 (e.g. C extension modules for Lua). -See: man rebase -
    • -
    -

    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/deps/luajit/doc/luajit.html b/deps/luajit/doc/luajit.html deleted file mode 100644 index 45507c12..00000000 --- a/deps/luajit/doc/luajit.html +++ /dev/null @@ -1,234 +0,0 @@ - - - -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-2015 Mike Pall, released under the -» MIT open source license. -

    -

    -

    - -

    Compatibility

    - - -
    WindowsLinuxBSDOSXPOSIX
    - - -
    EmbeddedAndroidiOS
    - - -
    PS3PS4PS VitaXbox 360
    - - -
    GCCCLANG
    LLVM
    MSVC
    - - -
    x86x64ARMPPCe500MIPS
    - - -
    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/deps/luajit/doc/running.html b/deps/luajit/doc/running.html deleted file mode 100644 index c6e1c296..00000000 --- a/deps/luajit/doc/running.html +++ /dev/null @@ -1,306 +0,0 @@ - - - -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.
    • -
    -

    -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.4/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/deps/luajit/doc/status.html b/deps/luajit/doc/status.html deleted file mode 100644 index b4bbec79..00000000 --- a/deps/luajit/doc/status.html +++ /dev/null @@ -1,116 +0,0 @@ - - - -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). -
    • -
    • -Some checks are missing in the JIT-compiled code for obscure situations -with open upvalues aliasing one of the SSA slots later on (or -vice versa). Bonus points, if you can find a real world test case for -this. -
    • -
    • -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. -
    • -
    -
    -
    - - - diff --git a/deps/luajit/dynasm/dasm_arm.h b/deps/luajit/dynasm/dasm_arm.h deleted file mode 100644 index 57e0116f..00000000 --- a/deps/luajit/dynasm/dasm_arm.h +++ /dev/null @@ -1,456 +0,0 @@ -/* -** DynASM ARM encoding engine. -** Copyright (C) 2005-2015 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; - 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); - 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/deps/luajit/dynasm/dasm_arm.lua b/deps/luajit/dynasm/dasm_arm.lua deleted file mode 100644 index 90a259c5..00000000 --- a/deps/luajit/dynasm/dasm_arm.lua +++ /dev/null @@ -1,1125 +0,0 @@ ------------------------------------------------------------------------------- --- DynASM ARM module. --- --- Copyright (C) 2005-2015 Mike Pall. All rights reserved. --- See dynasm.lua for full copyright notice. ------------------------------------------------------------------------------- - --- Module information: -local _info = { - arch = "arm", - description = "DynASM ARM module", - version = "1.3.0", - vernum = 10300, - release = "2011-05-05", - 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/deps/luajit/dynasm/dasm_mips.h b/deps/luajit/dynasm/dasm_mips.h deleted file mode 100644 index 2f4c2d22..00000000 --- a/deps/luajit/dynasm/dasm_mips.h +++ /dev/null @@ -1,416 +0,0 @@ -/* -** DynASM MIPS encoding engine. -** Copyright (C) 2005-2015 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__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: -#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: 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); - 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)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_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/deps/luajit/dynasm/dasm_mips.lua b/deps/luajit/dynasm/dasm_mips.lua deleted file mode 100644 index ae0dbd7a..00000000 --- a/deps/luajit/dynasm/dasm_mips.lua +++ /dev/null @@ -1,953 +0,0 @@ ------------------------------------------------------------------------------- --- DynASM MIPS module. --- --- Copyright (C) 2005-2015 Mike Pall. All rights reserved. --- See dynasm.lua for full copyright notice. ------------------------------------------------------------------------------- - --- Module information: -local _info = { - arch = "mips", - description = "DynASM MIPS module", - version = "1.3.0", - vernum = 10300, - release = "2012-01-23", - 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, sar, tohex = bit.band, bit.lshift, bit.arshift, 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", -} - --- 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", - lb_2 = "80000000TO", - lh_2 = "84000000TO", - lwl_2 = "88000000TO", - lw_2 = "8c000000TO", - lbu_2 = "90000000TO", - lhu_2 = "94000000TO", - lwr_2 = "98000000TO", - sb_2 = "a0000000TO", - sh_2 = "a4000000TO", - swl_2 = "a8000000TO", - sw_2 = "ac000000TO", - swr_2 = "b8000000TO", - cache_2 = "bc000000NO", - ll_2 = "c0000000TO", - lwc1_2 = "c4000000HO", - pref_2 = "cc000000NO", - ldc1_2 = "d4000000HO", - sc_2 = "e0000000TO", - swc1_2 = "e4000000HO", - sdc1_2 = "f4000000HO", - - -- Opcode SPECIAL. - nop_0 = "00000000", - sll_3 = "00000000DTA", - 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", - 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", - mult_2 = "00000018ST", - multu_2 = "00000019ST", - div_2 = "0000001aST", - divu_2 = "0000001bST", - add_3 = "00000020DST", - move_2 = "00000021DS", - addu_3 = "00000021DST", - sub_3 = "00000022DST", - negu_2 = "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", - 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", - - -- 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=", - sdbbp_0 = "7000003f", - sdbbp_1 = "7000003fY", - - -- Opcode SPECIAL3. - ext_4 = "7c000000TSAM", -- Note: last arg is msbd = size-1 - ins_4 = "7c000004TSAM", -- Note: last arg is msb = pos+size-1 - wsbh_2 = "7c0000a0DT", - seb_2 = "7c000420DT", - seh_2 = "7c000620DT", - rdhwr_2 = "7c00003bTD", - - -- Opcode COP0. - mfc0_2 = "40000000TD", - mfc0_3 = "40000000TDW", - mtc0_2 = "40800000TD", - mtc0_3 = "40800000TDW", - 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", - cfc1_2 = "44400000TG", - mfhc1_2 = "44600000TG", - mtc1_2 = "44800000TG", - 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) - 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("IMM", (signed and 32768 or 0)+scale*1024+bits*32+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, n, s = parse_label(params[n], false) - if p == "B" then n = n + 2048 end - waction("REL_"..mode, n, s, 1) - n = n + 1 - elseif p == "A" then - op = op + parse_imm(params[n], 5, 6, 0, false); n = n + 1 - 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/deps/luajit/dynasm/dasm_ppc.h b/deps/luajit/dynasm/dasm_ppc.h deleted file mode 100644 index 7df49365..00000000 --- a/deps/luajit/dynasm/dasm_ppc.h +++ /dev/null @@ -1,412 +0,0 @@ -/* -** DynASM PPC encoding engine. -** Copyright (C) 2005-2015 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__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; - } - } - } -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: 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); - 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; - 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/deps/luajit/dynasm/dasm_ppc.lua b/deps/luajit/dynasm/dasm_ppc.lua deleted file mode 100644 index 91f4ff9a..00000000 --- a/deps/luajit/dynasm/dasm_ppc.lua +++ /dev/null @@ -1,1249 +0,0 @@ ------------------------------------------------------------------------------- --- DynASM PPC module. --- --- Copyright (C) 2005-2015 Mike Pall. All rights reserved. --- See dynasm.lua for full copyright notice. ------------------------------------------------------------------------------- - --- Module information: -local _info = { - arch = "ppc", - description = "DynASM PPC module", - version = "1.3.0", - vernum = 10300, - release = "2011-05-05", - 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", -} - --- 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, -} - ------------------------------------------------------------------------------- - --- Template strings for PPC instructions. -local 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", - - -- 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", - 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", - 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", - subf_3 = "7c000050RRR.", - sub_3 = "7c000050RRR~.", - ldux_3 = "7c00006aRR0R", - dcbst_2 = "7c00006c-RR", - lwzux_3 = "7c00006eRR0R", - cntlzd_2 = "7c000074RR~", - andc_3 = "7c000078RR~R.", - td_3 = "7c000088ARR", - mulhd_3 = "7c000092RRR.", - mulhw_3 = "7c000096RRR.", - ldarx_3 = "7c0000a8RR0R", - dcbf_2 = "7c0000ac-RR", - lbzx_3 = "7c0000aeRR0R", - neg_2 = "7c0000d0RR.", - lbzux_3 = "7c0000eeRR0R", - popcntb_2 = "7c0000f4RR~", - not_2 = "7c0000f8RR~%.", - nor_3 = "7c0000f8RR~R.", - subfe_3 = "7c000110RRR.", - sube_3 = "7c000110RRR~.", - adde_3 = "7c000114RRR.", - stdx_3 = "7c00012aRR0R", - stwcx_3 = "7c00012cRR0R.", - stwx_3 = "7c00012eRR0R", - prtyw_2 = "7c000134RR~", - stdux_3 = "7c00016aRR0R", - stwux_3 = "7c00016eRR0R", - prtyd_2 = "7c000174RR~", - subfze_2 = "7c000190RR.", - addze_2 = "7c000194RR.", - stdcx_3 = "7c0001acRR0R.", - stbx_3 = "7c0001aeRR0R", - subfme_2 = "7c0001d0RR.", - mulld_3 = "7c0001d2RRR.", - addme_2 = "7c0001d4RR.", - mullw_3 = "7c0001d6RRR.", - dcbtst_2 = "7c0001ec-RR", - stbux_3 = "7c0001eeRR0R", - add_3 = "7c000214RRR.", - dcbt_2 = "7c00022c-RR", - lhzx_3 = "7c00022eRR0R", - eqv_3 = "7c000238RR~R.", - eciwx_3 = "7c00026cRR0R", - lhzux_3 = "7c00026eRR0R", - 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", - lwaux_3 = "7c0002eaRR0R", - lhaux_3 = "7c0002eeRR0R", - 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.", - divd_3 = "7c0003d2RRR.", - divw_3 = "7c0003d6RRR.", - cmpb_3 = "7c0003f8RR~R.", - mcrxr_1 = "7c000400X", - 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.", - subfo_3 = "7c000450RRR.", - subo_3 = "7c000450RRR~.", - lfsux_3 = "7c00046eFR0R", - lswi_3 = "7c0004aaRR0A", - sync_0 = "7c0004ac", - lwsync_0 = "7c2004ac", - ptesync_0 = "7c4004ac", - lfdx_3 = "7c0004aeFR0R", - nego_2 = "7c0004d0RR.", - lfdux_3 = "7c0004eeFR0R", - subfeo_3 = "7c000510RRR.", - subeo_3 = "7c000510RRR~.", - addeo_3 = "7c000514RRR.", - stdbrx_3 = "7c000528RR0R", - stswx_3 = "7c00052aRR0R", - stwbrx_3 = "7c00052cRR0R", - stfsx_3 = "7c00052eFR0R", - stfsux_3 = "7c00056eFR0R", - subfzeo_2 = "7c000590RR.", - addzeo_2 = "7c000594RR.", - stswi_3 = "7c0005aaRR0A", - stfdx_3 = "7c0005aeFR0R", - subfmeo_2 = "7c0005d0RR.", - mulldo_3 = "7c0005d2RRR.", - addmeo_2 = "7c0005d4RR.", - mullwo_3 = "7c0005d6RRR.", - dcba_2 = "7c0005ec-RR", - stfdux_3 = "7c0005eeFR0R", - addo_3 = "7c000614RRR.", - lhbrx_3 = "7c00062cRR0R", - sraw_3 = "7c000630RR~R.", - srad_3 = "7c000634RR~R.", - srawi_3 = "7c000670RR~A.", - sradi_3 = "7c000674RR~H.", - eieio_0 = "7c0006ac", - lfiwax_3 = "7c0006aeFR0R", - sthbrx_3 = "7c00072cRR0R", - extsh_2 = "7c000734RR~.", - 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", - - -- 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.", - - -- 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~.", - - -- 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.", - mtfsfi_2 = "fc00010cAA", -- NYI: upshift. - fnabs_2 = "fc000110F-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.", - fcfid_2 = "fc00069cF-F.", - - -- 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 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_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 function parse_imm(imm, bits, shift, scale, signed) - 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, "^r([1-3]?[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 = tonumber(imm) - if n then - if shr(n, 6) == 0 then - local lsb = band(imm, 31) - local msb = imm - 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 - werror("NYI: parameterized 64 bit shift/mask") - 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. -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, 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 == "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 == "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, n, s = parse_label(params[n], false) - if p == "K" then n = n + 2048 end - waction("REL_"..mode, n, 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 - rs = rs - 5 - elseif p == "." then - -- Ignored. - 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/deps/luajit/dynasm/dasm_proto.h b/deps/luajit/dynasm/dasm_proto.h deleted file mode 100644 index a8bc6fd2..00000000 --- a/deps/luajit/dynasm/dasm_proto.h +++ /dev/null @@ -1,83 +0,0 @@ -/* -** DynASM encoding engine prototypes. -** Copyright (C) 2005-2015 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.3.0" -#define DASM_VERSION 10300 /* 1.3.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/deps/luajit/dynasm/dasm_x64.lua b/deps/luajit/dynasm/dasm_x64.lua deleted file mode 100644 index b1b62022..00000000 --- a/deps/luajit/dynasm/dasm_x64.lua +++ /dev/null @@ -1,12 +0,0 @@ ------------------------------------------------------------------------------- --- DynASM x64 module. --- --- Copyright (C) 2005-2015 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/deps/luajit/dynasm/dasm_x86.h b/deps/luajit/dynasm/dasm_x86.h deleted file mode 100644 index 652e8c99..00000000 --- a/deps/luajit/dynasm/dasm_x86.h +++ /dev/null @@ -1,471 +0,0 @@ -/* -** DynASM x86 encoding engine. -** Copyright (C) 2005-2015 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 = 4; - 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&7) == 4) mrm = p[-2]; if ((mrm&7) != 5) break; } - case DASM_IMM_DB: if (((n+128)&-256) == 0) goto ob; - 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; - 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&-8) == 0 && (n != 4 || (*p&1) == 0), RANGE_VREG); - if (*p++ == 1 && *p == DASM_DISP) mrm = n; continue; - } - mrm = 4; - } 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; - } - case DASM_SPACE: case DASM_IMM_LG: case DASM_VREG: p++; - 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++; - 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; - } - 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; - case DASM_IMM_D: wd: dasmd(n); break; - case DASM_IMM_WB: if (((n+128)&-256) == 0) goto db; else mark = NULL; - case DASM_IMM_W: dasmw(n); break; - case DASM_VREG: { int t = *p++; if (t >= 2) n<<=3; cp[-1] |= n; break; } - case DASM_REL_LG: p++; if (n >= 0) goto rel_pc; - b++; n = (int)(ptrdiff_t)D->globals[-n]; - case DASM_REL_A: rel_a: n -= (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; } - 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++; - 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/deps/luajit/dynasm/dasm_x86.lua b/deps/luajit/dynasm/dasm_x86.lua deleted file mode 100644 index 7ca061d2..00000000 --- a/deps/luajit/dynasm/dasm_x86.lua +++ /dev/null @@ -1,1945 +0,0 @@ ------------------------------------------------------------------------------- --- DynASM x86/x64 module. --- --- Copyright (C) 2005-2015 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.3.0", - vernum = 10300, - release = "2011-05-05", - 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 = table.concat, table.sort -local bit = bit or require("bit") -local band, shl, shr = bit.band, 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", -- !x64: VREG support NYI. - -- 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 - ------------------------------------------------------------------------------- - --- 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 - --- 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" then name = format("xmm%d", 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 -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") - --- Operand size prefixes to codes. -local map_opsize = { - byte = "b", word = "w", dword = "d", qword = "q", oword = "o", tword = "t", - aword = addrsize, -} - --- Operand size code to number. -local map_opsizenum = { - b = 1, w = 2, d = 4, q = 8, o = 16, t = 10, -} - --- Operand size code to name. -local map_opsizename = { - b = "byte", w = "word", d = "dword", q = "qword", o = "oword", 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) - local r - if rex ~= 0 and not x64 then werror("bad operand size") end - 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 - end - end - wputb(shr(op, 16)); op = band(op, 0xffff) - end - if op >= 256 then - local b = shr(op, 8) - if b == 15 and rex ~= 0 then wputb(64 + band(rex, 15)); rex = 0 end - wputb(b) - op = band(op, 255) - end - if rex ~= 0 then wputb(64 + band(rex, 15)) end - if sz == "b" then op = op - 1 end - wputb(op) -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) - 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) - if vsreg then waction("VREG", vsreg); wputxb(2) end - if vreg then waction("VREG", vreg); wputxb(0) end - 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 - if vsreg then waction("VREG", vsreg); wputxb(2) end - wputmodrm(t.xsc, xreg, 5) - if vxreg then waction("VREG", vxreg); wputxb(3) end - else - -- Pure 32 bit displacement. - if x64 and tdisp ~= "table" then - wputmodrm(0, s, 4) -- [disp] -> (0, s, esp) (0, esp, ebp) - if imark == "I" then waction("MARK") end - wputmodrm(0, 4, 5) - else - riprel = x64 - wputmodrm(0, s, 5) -- [disp|rip-label] -> (0, s, ebp) - if imark == "I" then waction("MARK") end - end - if vsreg then waction("VREG", vsreg); wputxb(2) 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 - if vsreg then waction("VREG", vsreg); wputxb(2) end - wputmodrm(t.xsc or 0, xreg or 4, reg) -- SIB. - if vxreg then waction("VREG", vxreg); wputxb(3) end - if vreg then waction("VREG", vreg); wputxb(1) end - 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 - if vsreg then waction("VREG", vsreg); wputxb(2) end - if vreg then waction("VREG", vreg); wputxb(1) end - 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. --- --- 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 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|mrCqdw:0FA5Rm", - shrd_3 = "mriqdw:0FACRmU|mrCqdw:0FADRm", - - rdtsc_0 = "0F31", -- P1+ - 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:F20F2CrM|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", - packssdw_2 = "rmo:660F6BrM", - packsswb_2 = "rmo:660F63rM", - packuswb_2 = "rmo:660F67rM", - paddb_2 = "rmo:660FFCrM", - paddd_2 = "rmo:660FFErM", - paddq_2 = "rmo:660FD4rM", - paddsb_2 = "rmo:660FECrM", - paddsw_2 = "rmo:660FEDrM", - paddusb_2 = "rmo:660FDCrM", - paddusw_2 = "rmo:660FDDrM", - paddw_2 = "rmo:660FFDrM", - pand_2 = "rmo:660FDBrM", - pandn_2 = "rmo:660FDFrM", - pause_0 = "F390", - pavgb_2 = "rmo:660FE0rM", - pavgw_2 = "rmo:660FE3rM", - pcmpeqb_2 = "rmo:660F74rM", - pcmpeqd_2 = "rmo:660F76rM", - pcmpeqw_2 = "rmo:660F75rM", - pcmpgtb_2 = "rmo:660F64rM", - pcmpgtd_2 = "rmo:660F66rM", - pcmpgtw_2 = "rmo:660F65rM", - pextrw_3 = "rri/do:660FC5rMU|xri/wo:660F3A15nrMU", -- Mem op: SSE4.1 only. - pinsrw_3 = "rri/od:660FC4rMU|rxi/ow:", - pmaddwd_2 = "rmo:660FF5rM", - pmaxsw_2 = "rmo:660FEErM", - pmaxub_2 = "rmo:660FDErM", - pminsw_2 = "rmo:660FEArM", - pminub_2 = "rmo:660FDArM", - pmovmskb_2 = "rr/do:660FD7rM", - pmulhuw_2 = "rmo:660FE4rM", - pmulhw_2 = "rmo:660FE5rM", - pmullw_2 = "rmo:660FD5rM", - pmuludq_2 = "rmo:660FF4rM", - por_2 = "rmo:660FEBrM", - prefetchnta_1 = "xb:n0F180m", - prefetcht0_1 = "xb:n0F181m", - prefetcht1_1 = "xb:n0F182m", - prefetcht2_1 = "xb:n0F183m", - psadbw_2 = "rmo:660FF6rM", - 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", - psubb_2 = "rmo:660FF8rM", - psubd_2 = "rmo:660FFArM", - psubq_2 = "rmo:660FFBrM", - psubsb_2 = "rmo:660FE8rM", - psubsw_2 = "rmo:660FE9rM", - psubusb_2 = "rmo:660FD8rM", - psubusw_2 = "rmo:660FD9rM", - psubw_2 = "rmo:660FF9rM", - punpckhbw_2 = "rmo:660F68rM", - punpckhdq_2 = "rmo:660F6ArM", - punpckhqdq_2 = "rmo:660F6DrM", - punpckhwd_2 = "rmo:660F69rM", - punpcklbw_2 = "rmo:660F60rM", - punpckldq_2 = "rmo:660F62rM", - punpcklqdq_2 = "rmo:660F6CrM", - punpcklwd_2 = "rmo:660F61rM", - pxor_2 = "rmo:660FEFrM", - 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 = "rmo: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 -} - ------------------------------------------------------------------------------- - --- 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 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) -end - ------------------------------------------------------------------------------- - --- Process pattern string. -local function dopattern(pat, args, sz, op, needrex) - local digit, addin - 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 5 positions. - if secpos+5 > 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 == "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 - wputop(szov, opcode, rex); 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) - addin = nil - 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 - wputop(szov, opcode - 7, rex) - waction("VREG", addin.vreg); wputxb(0) - else - if addin and addin.reg > 7 then rex = rex + 1 end - wputop(szov, opcode, rex) - 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 - 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 -- Match both operand sizes. - if args[1].opsize == sub(szm, 2, 2) and - args[2].opsize == sub(szm, 3, 3) then - dopattern(pat, args, sz, params.op, needrex) -- Process pattern. - return - 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 - wputop(sz, opcode, rex) - if vreg then waction("VREG", vreg); wputxb(0) end - 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/deps/luajit/dynasm/dynasm.lua b/deps/luajit/dynasm/dynasm.lua deleted file mode 100644 index fffda751..00000000 --- a/deps/luajit/dynasm/dynasm.lua +++ /dev/null @@ -1,1094 +0,0 @@ ------------------------------------------------------------------------------- --- DynASM. A dynamic assembler for code generation engines. --- Originally designed and implemented for LuaJIT. --- --- Copyright (C) 2005-2015 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.3.0", - vernum = 10300, - release = "2011-05-05", - author = "Mike Pall", - url = "http://luajit.org/dynasm.html", - license = "MIT", - copyright = [[ -Copyright (C) 2005-2015 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/deps/luajit/etc/luajit.1 b/deps/luajit/etc/luajit.1 deleted file mode 100644 index fd38b0a9..00000000 --- a/deps/luajit/etc/luajit.1 +++ /dev/null @@ -1,88 +0,0 @@ -.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-2015 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/deps/luajit/etc/luajit.pc b/deps/luajit/etc/luajit.pc deleted file mode 100644 index a652b40d..00000000 --- a/deps/luajit/etc/luajit.pc +++ /dev/null @@ -1,25 +0,0 @@ -# Package information for LuaJIT to be used by pkg-config. -majver=2 -minver=0 -relver=4 -version=${majver}.${minver}.${relver} -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/deps/luajit/src/Makefile b/deps/luajit/src/Makefile deleted file mode 100644 index 1d38fa25..00000000 --- a/deps/luajit/src/Makefile +++ /dev/null @@ -1,684 +0,0 @@ -############################################################################## -# 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-2015 Mike Pall. See Copyright Notice in luajit.h -############################################################################## - -MAJVER= 2 -MINVER= 0 -RELVER= 4 -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. -# -# LuaJIT builds as a native 32 or 64 bit binary by default. -CC= gcc -# -# Use this if you want to force a 32 bit build on a 64 bit multilib OS. -#CC= gcc -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 only: it's recommended to compile at least for i686. Better yet, -# compile for an architecture that has SSE2, too (-msse -msse2). -# -# 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 -CCOPT_x64= -CCOPT_arm= -CCOPT_ppc= -CCOPT_ppcspe= -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 -# -############################################################################## - -############################################################################## -############################ 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, 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! -############################################################################## - -############################################################################## -# 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- - -CCOPTIONS= $(CCDEBUG) $(CCOPT) $(CCWARN) $(XCFLAGS) $(CFLAGS) -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_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_PPC ,$(TARGET_TESTARCH))) - TARGET_LJARCH= ppc -else -ifneq (,$(findstring LJ_TARGET_PPCSPE ,$(TARGET_TESTARCH))) - TARGET_LJARCH= ppcspe -else -ifneq (,$(findstring LJ_TARGET_MIPS ,$(TARGET_TESTARCH))) - ifneq (,$(findstring MIPSEL ,$(TARGET_TESTARCH))) - TARGET_ARCH= -D__MIPSEL__=1 - endif - TARGET_LJARCH= mips -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 -endif -ifneq (,$(findstring LJ_NO_UNWIND 1,$(TARGET_TESTARCH))) - TARGET_ARCH+= -DLUAJIT_NO_UNWIND -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 - -############################################################################## -# 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 CYGWIN,$(HOST_SYS))) - HOST_SYS= Windows - HOST_MSYS= cygwin - endif -endif - -TARGET_SYS?= $(HOST_SYS) -ifeq (Windows,$(TARGET_SYS)) - TARGET_STRIP+= --strip-unneeded - TARGET_XSHLDFLAGS= -shared - TARGET_DYNXLDOPTS= -else -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_AR+= 2>/dev/null - 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_AR+= 2>/dev/null - 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) -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_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 -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 (x86,$(TARGET_LJARCH)) - ifneq (,$(findstring __SSE2__ 1,$(TARGET_TESTARCH))) - DASM_AFLAGS+= -D SSE - endif -else -ifeq (x64,$(TARGET_LJARCH)) - DASM_ARCH= x86 -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_PPC64 1,$(TARGET_TESTARCH))) - DASM_AFLAGS+= -D GPR64 - endif - ifeq (PS3,$(TARGET_SYS)) - DASM_AFLAGS+= -D PPE -D TOC - endif -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_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_api.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) - -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 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) - $(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_ACFLAGS) -c -o $(@:.o=_dyn.o) $< - $(Q)$(TARGET_CC) $(TARGET_ACFLAGS) -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/deps/luajit/src/Makefile.dep b/deps/luajit/src/Makefile.dep deleted file mode 100644 index 9e14d617..00000000 --- a/deps/luajit/src/Makefile.dep +++ /dev/null @@ -1,226 +0,0 @@ -lib_aux.o: lib_aux.c lua.h luaconf.h lauxlib.h lj_obj.h lj_def.h \ - lj_arch.h lj_err.h lj_errmsg.h lj_state.h lj_trace.h lj_jit.h lj_ir.h \ - lj_dispatch.h lj_bc.h lj_traceerr.h lj_lib.h lj_alloc.h -lib_base.o: lib_base.c lua.h luaconf.h lauxlib.h lualib.h lj_obj.h \ - lj_def.h lj_arch.h lj_gc.h lj_err.h lj_errmsg.h lj_debug.h lj_str.h \ - lj_tab.h lj_meta.h lj_state.h lj_ctype.h lj_cconv.h lj_bc.h lj_ff.h \ - lj_ffdef.h lj_dispatch.h lj_jit.h lj_ir.h lj_char.h lj_strscan.h \ - lj_lib.h lj_libdef.h -lib_bit.o: lib_bit.c lua.h luaconf.h lauxlib.h lualib.h lj_obj.h lj_def.h \ - lj_arch.h lj_err.h lj_errmsg.h lj_str.h lj_lib.h lj_libdef.h -lib_debug.o: lib_debug.c lua.h luaconf.h lauxlib.h lualib.h lj_obj.h \ - lj_def.h lj_arch.h lj_gc.h lj_err.h lj_errmsg.h lj_debug.h lj_lib.h \ - lj_libdef.h -lib_ffi.o: lib_ffi.c lua.h luaconf.h lauxlib.h lualib.h lj_obj.h lj_def.h \ - lj_arch.h lj_gc.h lj_err.h lj_errmsg.h lj_str.h lj_tab.h lj_meta.h \ - lj_ctype.h lj_cparse.h lj_cdata.h lj_cconv.h lj_carith.h lj_ccall.h \ - lj_ccallback.h lj_clib.h lj_ff.h lj_ffdef.h lj_lib.h lj_libdef.h -lib_init.o: lib_init.c lua.h luaconf.h lauxlib.h lualib.h lj_arch.h -lib_io.o: lib_io.c lua.h luaconf.h lauxlib.h lualib.h lj_obj.h lj_def.h \ - lj_arch.h lj_gc.h lj_err.h lj_errmsg.h lj_str.h lj_state.h lj_ff.h \ - lj_ffdef.h lj_lib.h lj_libdef.h -lib_jit.o: lib_jit.c lua.h luaconf.h lauxlib.h lualib.h lj_arch.h \ - lj_obj.h lj_def.h lj_err.h lj_errmsg.h lj_debug.h lj_str.h lj_tab.h \ - lj_bc.h lj_ir.h lj_jit.h lj_ircall.h lj_iropt.h lj_target.h \ - lj_target_*.h lj_dispatch.h lj_vm.h lj_vmevent.h lj_lib.h luajit.h \ - lj_libdef.h -lib_math.o: lib_math.c lua.h luaconf.h lauxlib.h lualib.h lj_obj.h \ - lj_def.h lj_arch.h lj_lib.h lj_vm.h lj_libdef.h -lib_os.o: lib_os.c lua.h luaconf.h lauxlib.h lualib.h lj_obj.h lj_def.h \ - lj_arch.h lj_err.h lj_errmsg.h lj_lib.h lj_libdef.h -lib_package.o: lib_package.c lua.h luaconf.h lauxlib.h lualib.h lj_obj.h \ - lj_def.h lj_arch.h lj_err.h lj_errmsg.h lj_lib.h -lib_string.o: lib_string.c lua.h luaconf.h lauxlib.h lualib.h lj_obj.h \ - lj_def.h lj_arch.h lj_gc.h lj_err.h lj_errmsg.h lj_str.h lj_tab.h \ - lj_meta.h lj_state.h lj_ff.h lj_ffdef.h lj_bcdump.h lj_lex.h lj_char.h \ - lj_lib.h lj_libdef.h -lib_table.o: lib_table.c lua.h luaconf.h lauxlib.h lualib.h lj_obj.h \ - lj_def.h lj_arch.h lj_gc.h lj_err.h lj_errmsg.h lj_tab.h lj_lib.h \ - lj_libdef.h -lj_alloc.o: lj_alloc.c lj_def.h lua.h luaconf.h lj_arch.h lj_alloc.h -lj_api.o: lj_api.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_gc.h \ - lj_err.h lj_errmsg.h lj_debug.h lj_str.h lj_tab.h lj_func.h lj_udata.h \ - lj_meta.h lj_state.h lj_bc.h lj_frame.h lj_trace.h lj_jit.h lj_ir.h \ - lj_dispatch.h lj_traceerr.h lj_vm.h lj_strscan.h -lj_asm.o: lj_asm.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_gc.h \ - lj_str.h lj_tab.h lj_frame.h lj_bc.h lj_ctype.h lj_ir.h lj_jit.h \ - lj_ircall.h lj_iropt.h lj_mcode.h lj_trace.h lj_dispatch.h lj_traceerr.h \ - lj_snap.h lj_asm.h lj_vm.h lj_target.h lj_target_*.h lj_emit_*.h \ - lj_asm_*.h -lj_bc.o: lj_bc.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_bc.h \ - lj_bcdef.h -lj_bcread.o: lj_bcread.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \ - lj_gc.h lj_err.h lj_errmsg.h lj_str.h lj_tab.h lj_bc.h lj_ctype.h \ - lj_cdata.h lualib.h lj_lex.h lj_bcdump.h lj_state.h -lj_bcwrite.o: lj_bcwrite.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \ - lj_gc.h lj_str.h lj_bc.h lj_ctype.h lj_dispatch.h lj_jit.h lj_ir.h \ - lj_bcdump.h lj_lex.h lj_err.h lj_errmsg.h lj_vm.h -lj_carith.o: lj_carith.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \ - lj_gc.h lj_err.h lj_errmsg.h lj_tab.h lj_meta.h lj_ctype.h lj_cconv.h \ - lj_cdata.h lj_carith.h -lj_ccall.o: lj_ccall.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \ - lj_gc.h lj_err.h lj_errmsg.h lj_str.h lj_tab.h lj_ctype.h lj_cconv.h \ - lj_cdata.h lj_ccall.h lj_trace.h lj_jit.h lj_ir.h lj_dispatch.h lj_bc.h \ - lj_traceerr.h -lj_ccallback.o: lj_ccallback.c lj_obj.h lua.h luaconf.h lj_def.h \ - lj_arch.h lj_gc.h lj_err.h lj_errmsg.h lj_tab.h lj_state.h lj_frame.h \ - lj_bc.h lj_ctype.h lj_cconv.h lj_ccall.h lj_ccallback.h lj_target.h \ - lj_target_*.h lj_mcode.h lj_jit.h lj_ir.h lj_trace.h lj_dispatch.h \ - lj_traceerr.h lj_vm.h -lj_cconv.o: lj_cconv.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \ - lj_err.h lj_errmsg.h lj_tab.h lj_ctype.h lj_gc.h lj_cdata.h lj_cconv.h \ - lj_ccallback.h -lj_cdata.o: lj_cdata.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \ - lj_gc.h lj_err.h lj_errmsg.h lj_str.h lj_tab.h lj_ctype.h lj_cconv.h \ - lj_cdata.h -lj_char.o: lj_char.c lj_char.h lj_def.h lua.h luaconf.h -lj_clib.o: lj_clib.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_gc.h \ - lj_err.h lj_errmsg.h lj_tab.h lj_str.h lj_udata.h lj_ctype.h lj_cconv.h \ - lj_cdata.h lj_clib.h -lj_cparse.o: lj_cparse.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \ - lj_gc.h lj_err.h lj_errmsg.h lj_str.h lj_ctype.h lj_cparse.h lj_frame.h \ - lj_bc.h lj_vm.h lj_char.h lj_strscan.h -lj_crecord.o: lj_crecord.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \ - lj_err.h lj_errmsg.h lj_str.h lj_tab.h lj_frame.h lj_bc.h lj_ctype.h \ - lj_gc.h lj_cdata.h lj_cparse.h lj_cconv.h lj_clib.h lj_ccall.h lj_ff.h \ - lj_ffdef.h lj_ir.h lj_jit.h lj_ircall.h lj_iropt.h lj_trace.h \ - lj_dispatch.h lj_traceerr.h lj_record.h lj_ffrecord.h lj_snap.h \ - lj_crecord.h -lj_ctype.o: lj_ctype.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \ - lj_gc.h lj_err.h lj_errmsg.h lj_str.h lj_tab.h lj_ctype.h lj_ccallback.h -lj_debug.o: lj_debug.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \ - lj_err.h lj_errmsg.h lj_debug.h lj_str.h lj_tab.h lj_state.h lj_frame.h \ - lj_bc.h lj_vm.h lj_jit.h lj_ir.h -lj_dispatch.o: lj_dispatch.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \ - lj_err.h lj_errmsg.h lj_func.h lj_str.h lj_tab.h lj_meta.h lj_debug.h \ - lj_state.h lj_frame.h lj_bc.h lj_ff.h lj_ffdef.h lj_jit.h lj_ir.h \ - lj_ccallback.h lj_ctype.h lj_gc.h lj_trace.h lj_dispatch.h lj_traceerr.h \ - lj_vm.h luajit.h -lj_err.o: lj_err.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_err.h \ - lj_errmsg.h lj_debug.h lj_str.h lj_func.h lj_state.h lj_frame.h lj_bc.h \ - lj_ff.h lj_ffdef.h lj_trace.h lj_jit.h lj_ir.h lj_dispatch.h \ - lj_traceerr.h lj_vm.h -lj_ffrecord.o: lj_ffrecord.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \ - lj_err.h lj_errmsg.h lj_str.h lj_tab.h lj_frame.h lj_bc.h lj_ff.h \ - lj_ffdef.h lj_ir.h lj_jit.h lj_ircall.h lj_iropt.h lj_trace.h \ - lj_dispatch.h lj_traceerr.h lj_record.h lj_ffrecord.h lj_crecord.h \ - lj_vm.h lj_strscan.h lj_recdef.h -lj_func.o: lj_func.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_gc.h \ - lj_func.h lj_trace.h lj_jit.h lj_ir.h lj_dispatch.h lj_bc.h \ - lj_traceerr.h lj_vm.h -lj_gc.o: lj_gc.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_gc.h \ - lj_err.h lj_errmsg.h lj_str.h lj_tab.h lj_func.h lj_udata.h lj_meta.h \ - lj_state.h lj_frame.h lj_bc.h lj_ctype.h lj_cdata.h lj_trace.h lj_jit.h \ - lj_ir.h lj_dispatch.h lj_traceerr.h lj_vm.h -lj_gdbjit.o: lj_gdbjit.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \ - lj_gc.h lj_err.h lj_errmsg.h lj_debug.h lj_frame.h lj_bc.h lj_jit.h \ - lj_ir.h lj_dispatch.h -lj_ir.o: lj_ir.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_gc.h \ - lj_str.h lj_tab.h lj_ir.h lj_jit.h lj_ircall.h lj_iropt.h lj_trace.h \ - lj_dispatch.h lj_bc.h lj_traceerr.h lj_ctype.h lj_cdata.h lj_carith.h \ - lj_vm.h lj_strscan.h lj_lib.h -lj_lex.o: lj_lex.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_gc.h \ - lj_err.h lj_errmsg.h lj_str.h lj_tab.h lj_ctype.h lj_cdata.h lualib.h \ - lj_state.h lj_lex.h lj_parse.h lj_char.h lj_strscan.h -lj_lib.o: lj_lib.c lauxlib.h lua.h luaconf.h lj_obj.h lj_def.h lj_arch.h \ - lj_gc.h lj_err.h lj_errmsg.h lj_str.h lj_tab.h lj_func.h lj_bc.h \ - lj_dispatch.h lj_jit.h lj_ir.h lj_vm.h lj_strscan.h lj_lib.h -lj_load.o: lj_load.c lua.h luaconf.h lauxlib.h lj_obj.h lj_def.h \ - lj_arch.h lj_gc.h lj_err.h lj_errmsg.h lj_str.h lj_func.h lj_frame.h \ - lj_bc.h lj_vm.h lj_lex.h lj_bcdump.h lj_parse.h -lj_mcode.o: lj_mcode.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \ - lj_gc.h lj_err.h lj_errmsg.h lj_jit.h lj_ir.h lj_mcode.h lj_trace.h \ - lj_dispatch.h lj_bc.h lj_traceerr.h lj_vm.h -lj_meta.o: lj_meta.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_gc.h \ - lj_err.h lj_errmsg.h lj_str.h lj_tab.h lj_meta.h lj_frame.h lj_bc.h \ - lj_vm.h lj_strscan.h -lj_obj.o: lj_obj.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h -lj_opt_dce.o: lj_opt_dce.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \ - lj_ir.h lj_jit.h lj_iropt.h -lj_opt_fold.o: lj_opt_fold.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \ - lj_str.h lj_tab.h lj_ir.h lj_jit.h lj_iropt.h lj_trace.h lj_dispatch.h \ - lj_bc.h lj_traceerr.h lj_ctype.h lj_gc.h lj_carith.h lj_vm.h \ - lj_strscan.h lj_folddef.h -lj_opt_loop.o: lj_opt_loop.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \ - lj_err.h lj_errmsg.h lj_str.h lj_ir.h lj_jit.h lj_iropt.h lj_trace.h \ - lj_dispatch.h lj_bc.h lj_traceerr.h lj_snap.h lj_vm.h -lj_opt_mem.o: lj_opt_mem.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \ - lj_tab.h lj_ir.h lj_jit.h lj_iropt.h -lj_opt_narrow.o: lj_opt_narrow.c lj_obj.h lua.h luaconf.h lj_def.h \ - lj_arch.h lj_bc.h lj_ir.h lj_jit.h lj_iropt.h lj_trace.h lj_dispatch.h \ - lj_traceerr.h lj_vm.h lj_strscan.h -lj_opt_sink.o: lj_opt_sink.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \ - lj_ir.h lj_jit.h lj_iropt.h lj_target.h lj_target_*.h -lj_opt_split.o: lj_opt_split.c lj_obj.h lua.h luaconf.h lj_def.h \ - lj_arch.h lj_err.h lj_errmsg.h lj_str.h lj_ir.h lj_jit.h lj_ircall.h \ - lj_iropt.h lj_vm.h -lj_parse.o: lj_parse.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \ - lj_gc.h lj_err.h lj_errmsg.h lj_debug.h lj_str.h lj_tab.h lj_func.h \ - lj_state.h lj_bc.h lj_ctype.h lj_lex.h lj_parse.h lj_vm.h lj_vmevent.h -lj_record.o: lj_record.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \ - lj_err.h lj_errmsg.h lj_str.h lj_tab.h lj_meta.h lj_frame.h lj_bc.h \ - lj_ctype.h lj_gc.h lj_ff.h lj_ffdef.h lj_ir.h lj_jit.h lj_ircall.h \ - lj_iropt.h lj_trace.h lj_dispatch.h lj_traceerr.h lj_record.h \ - lj_ffrecord.h lj_snap.h lj_vm.h -lj_snap.o: lj_snap.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_gc.h \ - lj_tab.h lj_state.h lj_frame.h lj_bc.h lj_ir.h lj_jit.h lj_iropt.h \ - lj_trace.h lj_dispatch.h lj_traceerr.h lj_snap.h lj_target.h \ - lj_target_*.h lj_ctype.h lj_cdata.h -lj_state.o: lj_state.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \ - lj_gc.h lj_err.h lj_errmsg.h lj_str.h lj_tab.h lj_func.h lj_meta.h \ - lj_state.h lj_frame.h lj_bc.h lj_ctype.h lj_trace.h lj_jit.h lj_ir.h \ - lj_dispatch.h lj_traceerr.h lj_vm.h lj_lex.h lj_alloc.h -lj_str.o: lj_str.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_gc.h \ - lj_err.h lj_errmsg.h lj_str.h lj_state.h lj_char.h -lj_strscan.o: lj_strscan.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \ - lj_char.h lj_strscan.h -lj_tab.o: lj_tab.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_gc.h \ - lj_err.h lj_errmsg.h lj_tab.h -lj_trace.o: lj_trace.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \ - lj_gc.h lj_err.h lj_errmsg.h lj_debug.h lj_str.h lj_frame.h lj_bc.h \ - lj_state.h lj_ir.h lj_jit.h lj_iropt.h lj_mcode.h lj_trace.h \ - lj_dispatch.h lj_traceerr.h lj_snap.h lj_gdbjit.h lj_record.h lj_asm.h \ - lj_vm.h lj_vmevent.h lj_target.h lj_target_*.h -lj_udata.o: lj_udata.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \ - lj_gc.h lj_udata.h -lj_vmevent.o: lj_vmevent.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \ - lj_str.h lj_tab.h lj_state.h lj_dispatch.h lj_bc.h lj_jit.h lj_ir.h \ - lj_vm.h lj_vmevent.h -lj_vmmath.o: lj_vmmath.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \ - lj_ir.h lj_vm.h -ljamalg.o: ljamalg.c lua.h luaconf.h lauxlib.h lj_gc.c lj_obj.h lj_def.h \ - lj_arch.h lj_gc.h lj_err.h lj_errmsg.h lj_str.h lj_tab.h lj_func.h \ - lj_udata.h lj_meta.h lj_state.h lj_frame.h lj_bc.h lj_ctype.h lj_cdata.h \ - lj_trace.h lj_jit.h lj_ir.h lj_dispatch.h lj_traceerr.h lj_vm.h lj_err.c \ - lj_debug.h lj_ff.h lj_ffdef.h lj_char.c lj_char.h lj_bc.c lj_bcdef.h \ - lj_obj.c lj_str.c lj_tab.c lj_func.c lj_udata.c lj_meta.c lj_strscan.h \ - lj_debug.c lj_state.c lj_lex.h lj_alloc.h lj_dispatch.c lj_ccallback.h \ - luajit.h lj_vmevent.c lj_vmevent.h lj_vmmath.c lj_strscan.c lj_api.c \ - lj_lex.c lualib.h lj_parse.h lj_parse.c lj_bcread.c lj_bcdump.h \ - lj_bcwrite.c lj_load.c lj_ctype.c lj_cdata.c lj_cconv.h lj_cconv.c \ - lj_ccall.c lj_ccall.h lj_ccallback.c lj_target.h lj_target_*.h \ - lj_mcode.h lj_carith.c lj_carith.h lj_clib.c lj_clib.h lj_cparse.c \ - lj_cparse.h lj_lib.c lj_lib.h lj_ir.c lj_ircall.h lj_iropt.h \ - lj_opt_mem.c lj_opt_fold.c lj_folddef.h lj_opt_narrow.c lj_opt_dce.c \ - lj_opt_loop.c lj_snap.h lj_opt_split.c lj_opt_sink.c lj_mcode.c \ - lj_snap.c lj_record.c lj_record.h lj_ffrecord.h lj_crecord.c \ - lj_crecord.h lj_ffrecord.c lj_recdef.h lj_asm.c lj_asm.h lj_emit_*.h \ - lj_asm_*.h lj_trace.c lj_gdbjit.h lj_gdbjit.c lj_alloc.c lib_aux.c \ - lib_base.c lj_libdef.h lib_math.c lib_string.c lib_table.c lib_io.c \ - lib_os.c lib_package.c lib_debug.c lib_bit.c lib_jit.c lib_ffi.c \ - lib_init.c -luajit.o: luajit.c lua.h luaconf.h lauxlib.h lualib.h luajit.h lj_arch.h -host/buildvm.o: host/buildvm.c host/buildvm.h lj_def.h lua.h luaconf.h \ - lj_arch.h lj_obj.h lj_def.h lj_arch.h lj_gc.h lj_obj.h lj_bc.h lj_ir.h \ - lj_ircall.h lj_ir.h lj_jit.h lj_frame.h lj_bc.h lj_dispatch.h lj_ctype.h \ - lj_gc.h lj_ccall.h lj_ctype.h luajit.h \ - host/buildvm_arch.h lj_traceerr.h -host/buildvm_asm.o: host/buildvm_asm.c host/buildvm.h lj_def.h lua.h luaconf.h \ - lj_arch.h lj_bc.h lj_def.h lj_arch.h -host/buildvm_fold.o: host/buildvm_fold.c host/buildvm.h lj_def.h lua.h \ - luaconf.h lj_arch.h lj_obj.h lj_def.h lj_arch.h lj_ir.h lj_obj.h -host/buildvm_lib.o: host/buildvm_lib.c host/buildvm.h lj_def.h lua.h luaconf.h \ - lj_arch.h lj_obj.h lj_def.h lj_arch.h lj_lib.h lj_obj.h -host/buildvm_peobj.o: host/buildvm_peobj.c host/buildvm.h lj_def.h lua.h \ - luaconf.h lj_arch.h lj_bc.h lj_def.h lj_arch.h -host/minilua.o: host/minilua.c diff --git a/deps/luajit/src/host/README b/deps/luajit/src/host/README deleted file mode 100644 index abfcdaa7..00000000 --- a/deps/luajit/src/host/README +++ /dev/null @@ -1,4 +0,0 @@ -The files in this directory are only used during the build process of LuaJIT. -For cross-compilation, they must be executed on the host, not on the target. - -These files should NOT be installed! diff --git a/deps/luajit/src/host/buildvm.c b/deps/luajit/src/host/buildvm.c deleted file mode 100644 index 07122a64..00000000 --- a/deps/luajit/src/host/buildvm.c +++ /dev/null @@ -1,516 +0,0 @@ -/* -** LuaJIT VM builder. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -** -** This is a tool to build the hand-tuned assembler code required for -** LuaJIT's bytecode interpreter. It supports a variety of output formats -** to feed different toolchains (see usage() below). -** -** This tool is not particularly optimized because it's only used while -** _building_ LuaJIT. There's no point in distributing or installing it. -** Only the object code generated by this tool is linked into LuaJIT. -** -** Caveat: some memory is not free'd, error handling is lazy. -** It's a one-shot tool -- any effort fixing this would be wasted. -*/ - -#include "buildvm.h" -#include "lj_obj.h" -#include "lj_gc.h" -#include "lj_bc.h" -#include "lj_ir.h" -#include "lj_ircall.h" -#include "lj_frame.h" -#include "lj_dispatch.h" -#if LJ_HASFFI -#include "lj_ctype.h" -#include "lj_ccall.h" -#endif -#include "luajit.h" - -#if defined(_WIN32) -#include -#include -#endif - -/* ------------------------------------------------------------------------ */ - -/* DynASM glue definitions. */ -#define Dst ctx -#define Dst_DECL BuildCtx *ctx -#define Dst_REF (ctx->D) -#define DASM_CHECKS 1 - -#include "../dynasm/dasm_proto.h" - -/* Glue macros for DynASM. */ -static int collect_reloc(BuildCtx *ctx, uint8_t *addr, int idx, int type); - -#define DASM_EXTERN(ctx, addr, idx, type) \ - collect_reloc(ctx, addr, idx, type) - -/* ------------------------------------------------------------------------ */ - -/* Avoid trouble if cross-compiling for an x86 target. Speed doesn't matter. */ -#define DASM_ALIGNED_WRITES 1 - -/* Embed architecture-specific DynASM encoder. */ -#if LJ_TARGET_X86ORX64 -#include "../dynasm/dasm_x86.h" -#elif LJ_TARGET_ARM -#include "../dynasm/dasm_arm.h" -#elif LJ_TARGET_PPC -#include "../dynasm/dasm_ppc.h" -#elif LJ_TARGET_PPCSPE -#include "../dynasm/dasm_ppc.h" -#elif LJ_TARGET_MIPS -#include "../dynasm/dasm_mips.h" -#else -#error "No support for this architecture (yet)" -#endif - -/* Embed generated architecture-specific backend. */ -#include "buildvm_arch.h" - -/* ------------------------------------------------------------------------ */ - -void owrite(BuildCtx *ctx, const void *ptr, size_t sz) -{ - if (fwrite(ptr, 1, sz, ctx->fp) != sz) { - fprintf(stderr, "Error: cannot write to output file: %s\n", - strerror(errno)); - exit(1); - } -} - -/* ------------------------------------------------------------------------ */ - -/* Emit code as raw bytes. Only used for DynASM debugging. */ -static void emit_raw(BuildCtx *ctx) -{ - owrite(ctx, ctx->code, ctx->codesz); -} - -/* -- Build machine code -------------------------------------------------- */ - -static const char *sym_decorate(BuildCtx *ctx, - const char *prefix, const char *suffix) -{ - char name[256]; - char *p; -#if LJ_64 - const char *symprefix = ctx->mode == BUILD_machasm ? "_" : ""; -#elif LJ_TARGET_XBOX360 - const char *symprefix = ""; -#else - const char *symprefix = ctx->mode != BUILD_elfasm ? "_" : ""; -#endif - sprintf(name, "%s%s%s", symprefix, prefix, suffix); - p = strchr(name, '@'); - if (p) { -#if LJ_TARGET_X86ORX64 - if (!LJ_64 && (ctx->mode == BUILD_coffasm || ctx->mode == BUILD_peobj)) - name[0] = '@'; - else - *p = '\0'; -#elif (LJ_TARGET_PPC || LJ_TARGET_PPCSPE) && !LJ_TARGET_CONSOLE - /* Keep @plt. */ -#else - *p = '\0'; -#endif - } - p = (char *)malloc(strlen(name)+1); /* MSVC doesn't like strdup. */ - strcpy(p, name); - return p; -} - -#define NRELOCSYM (sizeof(extnames)/sizeof(extnames[0])-1) - -static int relocmap[NRELOCSYM]; - -/* Collect external relocations. */ -static int collect_reloc(BuildCtx *ctx, uint8_t *addr, int idx, int type) -{ - if (ctx->nreloc >= BUILD_MAX_RELOC) { - fprintf(stderr, "Error: too many relocations, increase BUILD_MAX_RELOC.\n"); - exit(1); - } - if (relocmap[idx] < 0) { - relocmap[idx] = ctx->nrelocsym; - ctx->relocsym[ctx->nrelocsym] = sym_decorate(ctx, "", extnames[idx]); - ctx->nrelocsym++; - } - ctx->reloc[ctx->nreloc].ofs = (int32_t)(addr - ctx->code); - ctx->reloc[ctx->nreloc].sym = relocmap[idx]; - ctx->reloc[ctx->nreloc].type = type; - ctx->nreloc++; -#if LJ_TARGET_XBOX360 - return (int)(ctx->code - addr) + 4; /* Encode symbol offset of .text. */ -#else - return 0; /* Encode symbol offset of 0. */ -#endif -} - -/* Naive insertion sort. Performance doesn't matter here. */ -static void sym_insert(BuildCtx *ctx, int32_t ofs, - const char *prefix, const char *suffix) -{ - ptrdiff_t i = ctx->nsym++; - while (i > 0) { - if (ctx->sym[i-1].ofs <= ofs) - break; - ctx->sym[i] = ctx->sym[i-1]; - i--; - } - ctx->sym[i].ofs = ofs; - ctx->sym[i].name = sym_decorate(ctx, prefix, suffix); -} - -/* Build the machine code. */ -static int build_code(BuildCtx *ctx) -{ - int status; - int i; - - /* Initialize DynASM structures. */ - ctx->nglob = GLOB__MAX; - ctx->glob = (void **)malloc(ctx->nglob*sizeof(void *)); - memset(ctx->glob, 0, ctx->nglob*sizeof(void *)); - ctx->nreloc = 0; - - ctx->globnames = globnames; - ctx->relocsym = (const char **)malloc(NRELOCSYM*sizeof(const char *)); - ctx->nrelocsym = 0; - for (i = 0; i < (int)NRELOCSYM; i++) relocmap[i] = -1; - - ctx->dasm_ident = DASM_IDENT; - ctx->dasm_arch = DASM_ARCH; - - dasm_init(Dst, DASM_MAXSECTION); - dasm_setupglobal(Dst, ctx->glob, ctx->nglob); - dasm_setup(Dst, build_actionlist); - - /* Call arch-specific backend to emit the code. */ - ctx->npc = build_backend(ctx); - - /* Finalize the code. */ - (void)dasm_checkstep(Dst, -1); - if ((status = dasm_link(Dst, &ctx->codesz))) return status; - ctx->code = (uint8_t *)malloc(ctx->codesz); - if ((status = dasm_encode(Dst, (void *)ctx->code))) return status; - - /* Allocate symbol table and bytecode offsets. */ - ctx->beginsym = sym_decorate(ctx, "", LABEL_PREFIX "vm_asm_begin"); - ctx->sym = (BuildSym *)malloc((ctx->npc+ctx->nglob+1)*sizeof(BuildSym)); - ctx->nsym = 0; - ctx->bc_ofs = (int32_t *)malloc(ctx->npc*sizeof(int32_t)); - - /* Collect the opcodes (PC labels). */ - for (i = 0; i < ctx->npc; i++) { - int32_t ofs = dasm_getpclabel(Dst, i); - if (ofs < 0) return 0x22000000|i; - ctx->bc_ofs[i] = ofs; - if ((LJ_HASJIT || - !(i == BC_JFORI || i == BC_JFORL || i == BC_JITERL || i == BC_JLOOP || - i == BC_IFORL || i == BC_IITERL || i == BC_ILOOP)) && - (LJ_HASFFI || i != BC_KCDATA)) - sym_insert(ctx, ofs, LABEL_PREFIX_BC, bc_names[i]); - } - - /* Collect the globals (named labels). */ - for (i = 0; i < ctx->nglob; i++) { - const char *gl = globnames[i]; - int len = (int)strlen(gl); - if (!ctx->glob[i]) { - fprintf(stderr, "Error: undefined global %s\n", gl); - exit(2); - } - /* Skip the _Z symbols. */ - if (!(len >= 2 && gl[len-2] == '_' && gl[len-1] == 'Z')) - sym_insert(ctx, (int32_t)((uint8_t *)(ctx->glob[i]) - ctx->code), - LABEL_PREFIX, globnames[i]); - } - - /* Close the address range. */ - sym_insert(ctx, (int32_t)ctx->codesz, "", ""); - ctx->nsym--; - - dasm_free(Dst); - - return 0; -} - -/* -- Generate VM enums --------------------------------------------------- */ - -const char *const bc_names[] = { -#define BCNAME(name, ma, mb, mc, mt) #name, -BCDEF(BCNAME) -#undef BCNAME - NULL -}; - -const char *const ir_names[] = { -#define IRNAME(name, m, m1, m2) #name, -IRDEF(IRNAME) -#undef IRNAME - NULL -}; - -const char *const irt_names[] = { -#define IRTNAME(name, size) #name, -IRTDEF(IRTNAME) -#undef IRTNAME - NULL -}; - -const char *const irfpm_names[] = { -#define FPMNAME(name) #name, -IRFPMDEF(FPMNAME) -#undef FPMNAME - NULL -}; - -const char *const irfield_names[] = { -#define FLNAME(name, ofs) #name, -IRFLDEF(FLNAME) -#undef FLNAME - NULL -}; - -const char *const ircall_names[] = { -#define IRCALLNAME(cond, name, nargs, kind, type, flags) #name, -IRCALLDEF(IRCALLNAME) -#undef IRCALLNAME - NULL -}; - -static const char *const trace_errors[] = { -#define TREDEF(name, msg) msg, -#include "lj_traceerr.h" - NULL -}; - -static const char *lower(char *buf, const char *s) -{ - char *p = buf; - while (*s) { - *p++ = (*s >= 'A' && *s <= 'Z') ? *s+0x20 : *s; - s++; - } - *p = '\0'; - return buf; -} - -/* Emit C source code for bytecode-related definitions. */ -static void emit_bcdef(BuildCtx *ctx) -{ - int i; - fprintf(ctx->fp, "/* This is a generated file. DO NOT EDIT! */\n\n"); - fprintf(ctx->fp, "LJ_DATADEF const uint16_t lj_bc_ofs[] = {\n"); - for (i = 0; i < ctx->npc; i++) { - if (i != 0) - fprintf(ctx->fp, ",\n"); - fprintf(ctx->fp, "%d", ctx->bc_ofs[i]); - } -} - -/* Emit VM definitions as Lua code for debug modules. */ -static void emit_vmdef(BuildCtx *ctx) -{ - char buf[80]; - int i; - fprintf(ctx->fp, "-- This is a generated file. DO NOT EDIT!\n\n"); - fprintf(ctx->fp, "module(...)\n\n"); - - fprintf(ctx->fp, "bcnames = \""); - for (i = 0; bc_names[i]; i++) fprintf(ctx->fp, "%-6s", bc_names[i]); - fprintf(ctx->fp, "\"\n\n"); - - fprintf(ctx->fp, "irnames = \""); - for (i = 0; ir_names[i]; i++) fprintf(ctx->fp, "%-6s", ir_names[i]); - fprintf(ctx->fp, "\"\n\n"); - - fprintf(ctx->fp, "irfpm = { [0]="); - for (i = 0; irfpm_names[i]; i++) - fprintf(ctx->fp, "\"%s\", ", lower(buf, irfpm_names[i])); - fprintf(ctx->fp, "}\n\n"); - - fprintf(ctx->fp, "irfield = { [0]="); - for (i = 0; irfield_names[i]; i++) { - char *p; - lower(buf, irfield_names[i]); - p = strchr(buf, '_'); - if (p) *p = '.'; - fprintf(ctx->fp, "\"%s\", ", buf); - } - fprintf(ctx->fp, "}\n\n"); - - fprintf(ctx->fp, "ircall = {\n[0]="); - for (i = 0; ircall_names[i]; i++) - fprintf(ctx->fp, "\"%s\",\n", ircall_names[i]); - fprintf(ctx->fp, "}\n\n"); - - fprintf(ctx->fp, "traceerr = {\n[0]="); - for (i = 0; trace_errors[i]; i++) - fprintf(ctx->fp, "\"%s\",\n", trace_errors[i]); - fprintf(ctx->fp, "}\n\n"); -} - -/* -- Argument parsing ---------------------------------------------------- */ - -/* Build mode names. */ -static const char *const modenames[] = { -#define BUILDNAME(name) #name, -BUILDDEF(BUILDNAME) -#undef BUILDNAME - NULL -}; - -/* Print usage information and exit. */ -static void usage(void) -{ - int i; - fprintf(stderr, LUAJIT_VERSION " VM builder.\n"); - fprintf(stderr, LUAJIT_COPYRIGHT ", " LUAJIT_URL "\n"); - fprintf(stderr, "Target architecture: " LJ_ARCH_NAME "\n\n"); - fprintf(stderr, "Usage: buildvm -m mode [-o outfile] [infiles...]\n\n"); - fprintf(stderr, "Available modes:\n"); - for (i = 0; i < BUILD__MAX; i++) - fprintf(stderr, " %s\n", modenames[i]); - exit(1); -} - -/* Parse the output mode name. */ -static BuildMode parsemode(const char *mode) -{ - int i; - for (i = 0; modenames[i]; i++) - if (!strcmp(mode, modenames[i])) - return (BuildMode)i; - usage(); - return (BuildMode)-1; -} - -/* Parse arguments. */ -static void parseargs(BuildCtx *ctx, char **argv) -{ - const char *a; - int i; - ctx->mode = (BuildMode)-1; - ctx->outname = "-"; - for (i = 1; (a = argv[i]) != NULL; i++) { - if (a[0] != '-') - break; - switch (a[1]) { - case '-': - if (a[2]) goto err; - i++; - goto ok; - case '\0': - goto ok; - case 'm': - i++; - if (a[2] || argv[i] == NULL) goto err; - ctx->mode = parsemode(argv[i]); - break; - case 'o': - i++; - if (a[2] || argv[i] == NULL) goto err; - ctx->outname = argv[i]; - break; - default: err: - usage(); - break; - } - } -ok: - ctx->args = argv+i; - if (ctx->mode == (BuildMode)-1) goto err; -} - -int main(int argc, char **argv) -{ - BuildCtx ctx_; - BuildCtx *ctx = &ctx_; - int status, binmode; - - if (sizeof(void *) != 4*LJ_32+8*LJ_64) { - fprintf(stderr,"Error: pointer size mismatch in cross-build.\n"); - fprintf(stderr,"Try: make HOST_CC=\"gcc -m32\" CROSS=...\n\n"); - return 1; - } - - UNUSED(argc); - parseargs(ctx, argv); - - if ((status = build_code(ctx))) { - fprintf(stderr,"Error: DASM error %08x\n", status); - return 1; - } - - switch (ctx->mode) { - case BUILD_peobj: - case BUILD_raw: - binmode = 1; - break; - default: - binmode = 0; - break; - } - - if (ctx->outname[0] == '-' && ctx->outname[1] == '\0') { - ctx->fp = stdout; -#if defined(_WIN32) - if (binmode) - _setmode(_fileno(stdout), _O_BINARY); /* Yuck. */ -#endif - } else if (!(ctx->fp = fopen(ctx->outname, binmode ? "wb" : "w"))) { - fprintf(stderr, "Error: cannot open output file '%s': %s\n", - ctx->outname, strerror(errno)); - exit(1); - } - - switch (ctx->mode) { - case BUILD_elfasm: - case BUILD_coffasm: - case BUILD_machasm: - emit_asm(ctx); - emit_asm_debug(ctx); - break; - case BUILD_peobj: - emit_peobj(ctx); - break; - case BUILD_raw: - emit_raw(ctx); - break; - case BUILD_bcdef: - emit_bcdef(ctx); - emit_lib(ctx); - break; - case BUILD_vmdef: - emit_vmdef(ctx); - emit_lib(ctx); - break; - case BUILD_ffdef: - case BUILD_libdef: - case BUILD_recdef: - emit_lib(ctx); - break; - case BUILD_folddef: - emit_fold(ctx); - break; - default: - break; - } - - fflush(ctx->fp); - if (ferror(ctx->fp)) { - fprintf(stderr, "Error: cannot write to output file: %s\n", - strerror(errno)); - exit(1); - } - fclose(ctx->fp); - - return 0; -} - diff --git a/deps/luajit/src/host/buildvm.h b/deps/luajit/src/host/buildvm.h deleted file mode 100644 index b2621850..00000000 --- a/deps/luajit/src/host/buildvm.h +++ /dev/null @@ -1,104 +0,0 @@ -/* -** LuaJIT VM builder. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#ifndef _BUILDVM_H -#define _BUILDVM_H - -#include -#include -#include -#include -#include - -#include "lj_def.h" -#include "lj_arch.h" - -/* Hardcoded limits. Increase as needed. */ -#define BUILD_MAX_RELOC 200 /* Max. number of relocations. */ -#define BUILD_MAX_FOLD 4096 /* Max. number of fold rules. */ - -/* Prefix for scanned library definitions. */ -#define LIBDEF_PREFIX "LJLIB_" - -/* Prefix for scanned fold definitions. */ -#define FOLDDEF_PREFIX "LJFOLD" - -/* Prefixes for generated labels. */ -#define LABEL_PREFIX "lj_" -#define LABEL_PREFIX_BC LABEL_PREFIX "BC_" -#define LABEL_PREFIX_FF LABEL_PREFIX "ff_" -#define LABEL_PREFIX_CF LABEL_PREFIX "cf_" -#define LABEL_PREFIX_FFH LABEL_PREFIX "ffh_" -#define LABEL_PREFIX_LIBCF LABEL_PREFIX "lib_cf_" -#define LABEL_PREFIX_LIBINIT LABEL_PREFIX "lib_init_" - -/* Forward declaration. */ -struct dasm_State; - -/* Build modes. */ -#define BUILDDEF(_) \ - _(elfasm) _(coffasm) _(machasm) _(peobj) _(raw) \ - _(bcdef) _(ffdef) _(libdef) _(recdef) _(vmdef) \ - _(folddef) - -typedef enum { -#define BUILDENUM(name) BUILD_##name, -BUILDDEF(BUILDENUM) -#undef BUILDENUM - BUILD__MAX -} BuildMode; - -/* Code relocation. */ -typedef struct BuildReloc { - int32_t ofs; - int sym; - int type; -} BuildReloc; - -typedef struct BuildSym { - const char *name; - int32_t ofs; -} BuildSym; - -/* Build context structure. */ -typedef struct BuildCtx { - /* DynASM state pointer. Should be first member. */ - struct dasm_State *D; - /* Parsed command line. */ - BuildMode mode; - FILE *fp; - const char *outname; - char **args; - /* Code and symbols generated by DynASM. */ - uint8_t *code; - size_t codesz; - int npc, nglob, nsym, nreloc, nrelocsym; - void **glob; - BuildSym *sym; - const char **relocsym; - int32_t *bc_ofs; - const char *beginsym; - /* Strings generated by DynASM. */ - const char *const *globnames; - const char *dasm_ident; - const char *dasm_arch; - /* Relocations. */ - BuildReloc reloc[BUILD_MAX_RELOC]; -} BuildCtx; - -extern void owrite(BuildCtx *ctx, const void *ptr, size_t sz); -extern void emit_asm(BuildCtx *ctx); -extern void emit_peobj(BuildCtx *ctx); -extern void emit_lib(BuildCtx *ctx); -extern void emit_fold(BuildCtx *ctx); - -extern const char *const bc_names[]; -extern const char *const ir_names[]; -extern const char *const irt_names[]; -extern const char *const irfpm_names[]; -extern const char *const irfield_names[]; -extern const char *const ircall_names[]; - -#endif diff --git a/deps/luajit/src/host/buildvm_asm.c b/deps/luajit/src/host/buildvm_asm.c deleted file mode 100644 index 2c9a2d48..00000000 --- a/deps/luajit/src/host/buildvm_asm.c +++ /dev/null @@ -1,313 +0,0 @@ -/* -** LuaJIT VM builder: Assembler source code emitter. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#include "buildvm.h" -#include "lj_bc.h" - -/* ------------------------------------------------------------------------ */ - -#if LJ_TARGET_X86ORX64 -/* Emit bytes piecewise as assembler text. */ -static void emit_asm_bytes(BuildCtx *ctx, uint8_t *p, int n) -{ - int i; - for (i = 0; i < n; i++) { - if ((i & 15) == 0) - fprintf(ctx->fp, "\t.byte %d", p[i]); - else - fprintf(ctx->fp, ",%d", p[i]); - if ((i & 15) == 15) putc('\n', ctx->fp); - } - if ((n & 15) != 0) putc('\n', ctx->fp); -} - -/* Emit relocation */ -static void emit_asm_reloc(BuildCtx *ctx, int type, const char *sym) -{ - switch (ctx->mode) { - case BUILD_elfasm: - if (type) - fprintf(ctx->fp, "\t.long %s-.-4\n", sym); - else - fprintf(ctx->fp, "\t.long %s\n", sym); - break; - case BUILD_coffasm: - fprintf(ctx->fp, "\t.def %s; .scl 3; .type 32; .endef\n", sym); - if (type) - fprintf(ctx->fp, "\t.long %s-.-4\n", sym); - else - fprintf(ctx->fp, "\t.long %s\n", sym); - break; - default: /* BUILD_machasm for relative relocations handled below. */ - fprintf(ctx->fp, "\t.long %s\n", sym); - break; - } -} - -static const char *const jccnames[] = { - "jo", "jno", "jb", "jnb", "jz", "jnz", "jbe", "ja", - "js", "jns", "jpe", "jpo", "jl", "jge", "jle", "jg" -}; - -/* Emit relocation for the incredibly stupid OSX assembler. */ -static void emit_asm_reloc_mach(BuildCtx *ctx, uint8_t *cp, int n, - const char *sym) -{ - const char *opname = NULL; - if (--n < 0) goto err; - if (cp[n] == 0xe8) { - opname = "call"; - } else if (cp[n] == 0xe9) { - opname = "jmp"; - } else if (cp[n] >= 0x80 && cp[n] <= 0x8f && n > 0 && cp[n-1] == 0x0f) { - opname = jccnames[cp[n]-0x80]; - n--; - } else { -err: - fprintf(stderr, "Error: unsupported opcode for %s symbol relocation.\n", - sym); - exit(1); - } - emit_asm_bytes(ctx, cp, n); - fprintf(ctx->fp, "\t%s %s\n", opname, sym); -} -#else -/* Emit words piecewise as assembler text. */ -static void emit_asm_words(BuildCtx *ctx, uint8_t *p, int n) -{ - int i; - for (i = 0; i < n; i += 4) { - if ((i & 15) == 0) - fprintf(ctx->fp, "\t.long 0x%08x", *(uint32_t *)(p+i)); - else - fprintf(ctx->fp, ",0x%08x", *(uint32_t *)(p+i)); - if ((i & 15) == 12) putc('\n', ctx->fp); - } - if ((n & 15) != 0) putc('\n', ctx->fp); -} - -/* Emit relocation as part of an instruction. */ -static void emit_asm_wordreloc(BuildCtx *ctx, uint8_t *p, int n, - const char *sym) -{ - uint32_t ins; - emit_asm_words(ctx, p, n-4); - ins = *(uint32_t *)(p+n-4); -#if LJ_TARGET_ARM - if ((ins & 0xff000000u) == 0xfa000000u) { - fprintf(ctx->fp, "\tblx %s\n", sym); - } else if ((ins & 0x0e000000u) == 0x0a000000u) { - fprintf(ctx->fp, "\t%s%.2s %s\n", (ins & 0x01000000u) ? "bl" : "b", - &"eqnecsccmiplvsvchilsgeltgtle"[2*(ins >> 28)], sym); - } else { - fprintf(stderr, - "Error: unsupported opcode %08x for %s symbol relocation.\n", - ins, sym); - exit(1); - } -#elif LJ_TARGET_PPC || LJ_TARGET_PPCSPE -#if LJ_TARGET_PS3 -#define TOCPREFIX "." -#else -#define TOCPREFIX "" -#endif - if ((ins >> 26) == 16) { - fprintf(ctx->fp, "\t%s %d, %d, " TOCPREFIX "%s\n", - (ins & 1) ? "bcl" : "bc", (ins >> 21) & 31, (ins >> 16) & 31, sym); - } else if ((ins >> 26) == 18) { - fprintf(ctx->fp, "\t%s " TOCPREFIX "%s\n", (ins & 1) ? "bl" : "b", sym); - } else { - fprintf(stderr, - "Error: unsupported opcode %08x for %s symbol relocation.\n", - ins, sym); - exit(1); - } -#elif LJ_TARGET_MIPS - fprintf(stderr, - "Error: unsupported opcode %08x for %s symbol relocation.\n", - ins, sym); - exit(1); -#else -#error "missing relocation support for this architecture" -#endif -} -#endif - -#if LJ_TARGET_ARM -#define ELFASM_PX "%%" -#else -#define ELFASM_PX "@" -#endif - -/* Emit an assembler label. */ -static void emit_asm_label(BuildCtx *ctx, const char *name, int size, int isfunc) -{ - switch (ctx->mode) { - case BUILD_elfasm: -#if LJ_TARGET_PS3 - if (!strncmp(name, "lj_vm_", 6) && - strcmp(name, ctx->beginsym) && - !strstr(name, "hook")) { - fprintf(ctx->fp, - "\n\t.globl %s\n" - "\t.section \".opd\",\"aw\"\n" - "%s:\n" - "\t.long .%s,.TOC.@tocbase32\n" - "\t.size %s,8\n" - "\t.previous\n" - "\t.globl .%s\n" - "\t.hidden .%s\n" - "\t.type .%s, " ELFASM_PX "function\n" - "\t.size .%s, %d\n" - ".%s:\n", - name, name, name, name, name, name, name, name, size, name); - break; - } -#endif - fprintf(ctx->fp, - "\n\t.globl %s\n" - "\t.hidden %s\n" - "\t.type %s, " ELFASM_PX "%s\n" - "\t.size %s, %d\n" - "%s:\n", - name, name, name, isfunc ? "function" : "object", name, size, name); - break; - case BUILD_coffasm: - fprintf(ctx->fp, "\n\t.globl %s\n", name); - if (isfunc) - fprintf(ctx->fp, "\t.def %s; .scl 3; .type 32; .endef\n", name); - fprintf(ctx->fp, "%s:\n", name); - break; - case BUILD_machasm: - fprintf(ctx->fp, - "\n\t.private_extern %s\n" - "%s:\n", name, name); - break; - default: - break; - } -} - -/* Emit alignment. */ -static void emit_asm_align(BuildCtx *ctx, int bits) -{ - switch (ctx->mode) { - case BUILD_elfasm: - case BUILD_coffasm: - fprintf(ctx->fp, "\t.p2align %d\n", bits); - break; - case BUILD_machasm: - fprintf(ctx->fp, "\t.align %d\n", bits); - break; - default: - break; - } -} - -/* ------------------------------------------------------------------------ */ - -/* Emit assembler source code. */ -void emit_asm(BuildCtx *ctx) -{ - int i, rel; - - fprintf(ctx->fp, "\t.file \"buildvm_%s.dasc\"\n", ctx->dasm_arch); - fprintf(ctx->fp, "\t.text\n"); - emit_asm_align(ctx, 4); - -#if LJ_TARGET_PS3 - emit_asm_label(ctx, ctx->beginsym, ctx->codesz, 0); -#else - emit_asm_label(ctx, ctx->beginsym, 0, 0); -#endif - if (ctx->mode != BUILD_machasm) - fprintf(ctx->fp, ".Lbegin:\n"); - -#if LJ_TARGET_ARM && defined(__GNUC__) && !LJ_NO_UNWIND - /* This should really be moved into buildvm_arm.dasc. */ - fprintf(ctx->fp, - ".fnstart\n" - ".save {r4, r5, r6, r7, r8, r9, r10, r11, lr}\n" - ".pad #28\n"); -#endif -#if LJ_TARGET_MIPS - fprintf(ctx->fp, ".set nomips16\n.abicalls\n.set noreorder\n.set nomacro\n"); -#endif - - for (i = rel = 0; i < ctx->nsym; i++) { - int32_t ofs = ctx->sym[i].ofs; - int32_t next = ctx->sym[i+1].ofs; -#if LJ_TARGET_ARM && defined(__GNUC__) && !LJ_NO_UNWIND && LJ_HASFFI - if (!strcmp(ctx->sym[i].name, "lj_vm_ffi_call")) - fprintf(ctx->fp, - ".globl lj_err_unwind_arm\n" - ".personality lj_err_unwind_arm\n" - ".fnend\n" - ".fnstart\n" - ".save {r4, r5, r11, lr}\n" - ".setfp r11, sp\n"); -#endif - emit_asm_label(ctx, ctx->sym[i].name, next - ofs, 1); - while (rel < ctx->nreloc && ctx->reloc[rel].ofs <= next) { - BuildReloc *r = &ctx->reloc[rel]; - int n = r->ofs - ofs; -#if LJ_TARGET_X86ORX64 - if (ctx->mode == BUILD_machasm && r->type != 0) { - emit_asm_reloc_mach(ctx, ctx->code+ofs, n, ctx->relocsym[r->sym]); - } else { - emit_asm_bytes(ctx, ctx->code+ofs, n); - emit_asm_reloc(ctx, r->type, ctx->relocsym[r->sym]); - } - ofs += n+4; -#else - emit_asm_wordreloc(ctx, ctx->code+ofs, n, ctx->relocsym[r->sym]); - ofs += n; -#endif - rel++; - } -#if LJ_TARGET_X86ORX64 - emit_asm_bytes(ctx, ctx->code+ofs, next-ofs); -#else - emit_asm_words(ctx, ctx->code+ofs, next-ofs); -#endif - } - -#if LJ_TARGET_ARM && defined(__GNUC__) && !LJ_NO_UNWIND - fprintf(ctx->fp, -#if !LJ_HASFFI - ".globl lj_err_unwind_arm\n" - ".personality lj_err_unwind_arm\n" -#endif - ".fnend\n"); -#endif - - fprintf(ctx->fp, "\n"); - switch (ctx->mode) { - case BUILD_elfasm: -#if !(LJ_TARGET_PS3 || LJ_TARGET_PSVITA) - fprintf(ctx->fp, "\t.section .note.GNU-stack,\"\"," ELFASM_PX "progbits\n"); -#endif -#if LJ_TARGET_PPCSPE - /* Soft-float ABI + SPE. */ - fprintf(ctx->fp, "\t.gnu_attribute 4, 2\n\t.gnu_attribute 8, 3\n"); -#elif LJ_TARGET_PPC && !LJ_TARGET_PS3 - /* Hard-float ABI. */ - fprintf(ctx->fp, "\t.gnu_attribute 4, 1\n"); -#endif - /* fallthrough */ - case BUILD_coffasm: - fprintf(ctx->fp, "\t.ident \"%s\"\n", ctx->dasm_ident); - break; - case BUILD_machasm: - fprintf(ctx->fp, - "\t.cstring\n" - "\t.ascii \"%s\\0\"\n", ctx->dasm_ident); - break; - default: - break; - } - fprintf(ctx->fp, "\n"); -} - diff --git a/deps/luajit/src/host/buildvm_fold.c b/deps/luajit/src/host/buildvm_fold.c deleted file mode 100644 index daed7ecc..00000000 --- a/deps/luajit/src/host/buildvm_fold.c +++ /dev/null @@ -1,229 +0,0 @@ -/* -** LuaJIT VM builder: IR folding hash table generator. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#include "buildvm.h" -#include "lj_obj.h" -#include "lj_ir.h" - -/* Context for the folding hash table generator. */ -static int lineno; -static int funcidx; -static uint32_t foldkeys[BUILD_MAX_FOLD]; -static uint32_t nkeys; - -/* Try to fill the hash table with keys using the hash parameters. */ -static int tryhash(uint32_t *htab, uint32_t sz, uint32_t r, int dorol) -{ - uint32_t i; - if (dorol && ((r & 31) == 0 || (r>>5) == 0)) - return 0; /* Avoid zero rotates. */ - memset(htab, 0xff, (sz+1)*sizeof(uint32_t)); - for (i = 0; i < nkeys; i++) { - uint32_t key = foldkeys[i]; - uint32_t k = key & 0xffffff; - uint32_t h = (dorol ? lj_rol(lj_rol(k, r>>5) - k, r&31) : - (((k << (r>>5)) - k) << (r&31))) % sz; - if (htab[h] != 0xffffffff) { /* Collision on primary slot. */ - if (htab[h+1] != 0xffffffff) { /* Collision on secondary slot. */ - /* Try to move the colliding key, if possible. */ - if (h < sz-1 && htab[h+2] == 0xffffffff) { - uint32_t k2 = htab[h+1] & 0xffffff; - uint32_t h2 = (dorol ? lj_rol(lj_rol(k2, r>>5) - k2, r&31) : - (((k2 << (r>>5)) - k2) << (r&31))) % sz; - if (h2 != h+1) return 0; /* Cannot resolve collision. */ - htab[h+2] = htab[h+1]; /* Move colliding key to secondary slot. */ - } else { - return 0; /* Collision. */ - } - } - htab[h+1] = key; - } else { - htab[h] = key; - } - } - return 1; /* Success, all keys could be stored. */ -} - -/* Print the generated hash table. */ -static void printhash(BuildCtx *ctx, uint32_t *htab, uint32_t sz) -{ - uint32_t i; - fprintf(ctx->fp, "static const uint32_t fold_hash[%d] = {\n0x%08x", - sz+1, htab[0]); - for (i = 1; i < sz+1; i++) - fprintf(ctx->fp, ",\n0x%08x", htab[i]); - fprintf(ctx->fp, "\n};\n\n"); -} - -/* Exhaustive search for the shortest semi-perfect hash table. */ -static void makehash(BuildCtx *ctx) -{ - uint32_t htab[BUILD_MAX_FOLD*2+1]; - uint32_t sz, r; - /* Search for the smallest hash table with an odd size. */ - for (sz = (nkeys|1); sz < BUILD_MAX_FOLD*2; sz += 2) { - /* First try all shift hash combinations. */ - for (r = 0; r < 32*32; r++) { - if (tryhash(htab, sz, r, 0)) { - printhash(ctx, htab, sz); - fprintf(ctx->fp, - "#define fold_hashkey(k)\t(((((k)<<%u)-(k))<<%u)%%%u)\n\n", - r>>5, r&31, sz); - return; - } - } - /* Then try all rotate hash combinations. */ - for (r = 0; r < 32*32; r++) { - if (tryhash(htab, sz, r, 1)) { - printhash(ctx, htab, sz); - fprintf(ctx->fp, - "#define fold_hashkey(k)\t(lj_rol(lj_rol((k),%u)-(k),%u)%%%u)\n\n", - r>>5, r&31, sz); - return; - } - } - } - fprintf(stderr, "Error: search for perfect hash failed\n"); - exit(1); -} - -/* Parse one token of a fold rule. */ -static uint32_t nexttoken(char **pp, int allowlit, int allowany) -{ - char *p = *pp; - if (p) { - uint32_t i; - char *q = strchr(p, ' '); - if (q) *q++ = '\0'; - *pp = q; - if (allowlit && !strncmp(p, "IRFPM_", 6)) { - for (i = 0; irfpm_names[i]; i++) - if (!strcmp(irfpm_names[i], p+6)) - return i; - } else if (allowlit && !strncmp(p, "IRFL_", 5)) { - for (i = 0; irfield_names[i]; i++) - if (!strcmp(irfield_names[i], p+5)) - return i; - } else if (allowlit && !strncmp(p, "IRCALL_", 7)) { - for (i = 0; ircall_names[i]; i++) - if (!strcmp(ircall_names[i], p+7)) - return i; - } else if (allowlit && !strncmp(p, "IRCONV_", 7)) { - for (i = 0; irt_names[i]; i++) { - const char *r = strchr(p+7, '_'); - if (r && !strncmp(irt_names[i], p+7, r-(p+7))) { - uint32_t j; - for (j = 0; irt_names[j]; j++) - if (!strcmp(irt_names[j], r+1)) - return (i << 5) + j; - } - } - } else if (allowlit && *p >= '0' && *p <= '9') { - for (i = 0; *p >= '0' && *p <= '9'; p++) - i = i*10 + (*p - '0'); - if (*p == '\0') - return i; - } else if (allowany && !strcmp("any", p)) { - return allowany; - } else { - for (i = 0; ir_names[i]; i++) - if (!strcmp(ir_names[i], p)) - return i; - } - fprintf(stderr, "Error: bad fold definition token \"%s\" at line %d\n", p, lineno); - exit(1); - } - return 0; -} - -/* Parse a fold rule. */ -static void foldrule(char *p) -{ - uint32_t op = nexttoken(&p, 0, 0); - uint32_t left = nexttoken(&p, 0, 0x7f); - uint32_t right = nexttoken(&p, 1, 0x3ff); - uint32_t key = (funcidx << 24) | (op << 17) | (left << 10) | right; - uint32_t i; - if (nkeys >= BUILD_MAX_FOLD) { - fprintf(stderr, "Error: too many fold rules, increase BUILD_MAX_FOLD.\n"); - exit(1); - } - /* Simple insertion sort to detect duplicates. */ - for (i = nkeys; i > 0; i--) { - if ((foldkeys[i-1]&0xffffff) < (key & 0xffffff)) - break; - if ((foldkeys[i-1]&0xffffff) == (key & 0xffffff)) { - fprintf(stderr, "Error: duplicate fold definition at line %d\n", lineno); - exit(1); - } - foldkeys[i] = foldkeys[i-1]; - } - foldkeys[i] = key; - nkeys++; -} - -/* Emit C source code for IR folding hash table. */ -void emit_fold(BuildCtx *ctx) -{ - char buf[256]; /* We don't care about analyzing lines longer than that. */ - const char *fname = ctx->args[0]; - FILE *fp; - - if (fname == NULL) { - fprintf(stderr, "Error: missing input filename\n"); - exit(1); - } - - if (fname[0] == '-' && fname[1] == '\0') { - fp = stdin; - } else { - fp = fopen(fname, "r"); - if (!fp) { - fprintf(stderr, "Error: cannot open input file '%s': %s\n", - fname, strerror(errno)); - exit(1); - } - } - - fprintf(ctx->fp, "/* This is a generated file. DO NOT EDIT! */\n\n"); - fprintf(ctx->fp, "static const FoldFunc fold_func[] = {\n"); - - lineno = 0; - funcidx = 0; - nkeys = 0; - while (fgets(buf, sizeof(buf), fp) != NULL) { - lineno++; - /* The prefix must be at the start of a line, otherwise it's ignored. */ - if (!strncmp(buf, FOLDDEF_PREFIX, sizeof(FOLDDEF_PREFIX)-1)) { - char *p = buf+sizeof(FOLDDEF_PREFIX)-1; - char *q = strchr(p, ')'); - if (p[0] == '(' && q) { - p++; - *q = '\0'; - foldrule(p); - } else if ((p[0] == 'F' || p[0] == 'X') && p[1] == '(' && q) { - p += 2; - *q = '\0'; - if (funcidx) - fprintf(ctx->fp, ",\n"); - if (p[-2] == 'X') - fprintf(ctx->fp, " %s", p); - else - fprintf(ctx->fp, " fold_%s", p); - funcidx++; - } else { - buf[strlen(buf)-1] = '\0'; - fprintf(stderr, "Error: unknown fold definition tag %s%s at line %d\n", - FOLDDEF_PREFIX, p, lineno); - exit(1); - } - } - } - fclose(fp); - fprintf(ctx->fp, "\n};\n\n"); - - makehash(ctx); -} - diff --git a/deps/luajit/src/host/buildvm_lib.c b/deps/luajit/src/host/buildvm_lib.c deleted file mode 100644 index c37301d4..00000000 --- a/deps/luajit/src/host/buildvm_lib.c +++ /dev/null @@ -1,398 +0,0 @@ -/* -** LuaJIT VM builder: library definition compiler. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#include "buildvm.h" -#include "lj_obj.h" -#include "lj_lib.h" - -/* Context for library definitions. */ -static uint8_t obuf[8192]; -static uint8_t *optr; -static char modname[80]; -static size_t modnamelen; -static char funcname[80]; -static int modstate, regfunc; -static int ffid, recffid, ffasmfunc; - -enum { - REGFUNC_OK, - REGFUNC_NOREG, - REGFUNC_NOREGUV -}; - -static void libdef_name(const char *p, int kind) -{ - size_t n = strlen(p); - if (kind != LIBINIT_STRING) { - if (n > modnamelen && p[modnamelen] == '_' && - !strncmp(p, modname, modnamelen)) { - p += modnamelen+1; - n -= modnamelen+1; - } - } - if (n > LIBINIT_MAXSTR) { - fprintf(stderr, "Error: string too long: '%s'\n", p); - exit(1); - } - if (optr+1+n+2 > obuf+sizeof(obuf)) { /* +2 for caller. */ - fprintf(stderr, "Error: output buffer overflow\n"); - exit(1); - } - *optr++ = (uint8_t)(n | kind); - memcpy(optr, p, n); - optr += n; -} - -static void libdef_endmodule(BuildCtx *ctx) -{ - if (modstate != 0) { - char line[80]; - const uint8_t *p; - int n; - if (modstate == 1) - fprintf(ctx->fp, " (lua_CFunction)0"); - fprintf(ctx->fp, "\n};\n"); - fprintf(ctx->fp, "static const uint8_t %s%s[] = {\n", - LABEL_PREFIX_LIBINIT, modname); - line[0] = '\0'; - for (n = 0, p = obuf; p < optr; p++) { - n += sprintf(line+n, "%d,", *p); - if (n >= 75) { - fprintf(ctx->fp, "%s\n", line); - n = 0; - line[0] = '\0'; - } - } - fprintf(ctx->fp, "%s%d\n};\n#endif\n\n", line, LIBINIT_END); - } -} - -static void libdef_module(BuildCtx *ctx, char *p, int arg) -{ - UNUSED(arg); - if (ctx->mode == BUILD_libdef) { - libdef_endmodule(ctx); - optr = obuf; - *optr++ = (uint8_t)ffid; - *optr++ = (uint8_t)ffasmfunc; - *optr++ = 0; /* Hash table size. */ - modstate = 1; - fprintf(ctx->fp, "#ifdef %sMODULE_%s\n", LIBDEF_PREFIX, p); - fprintf(ctx->fp, "#undef %sMODULE_%s\n", LIBDEF_PREFIX, p); - fprintf(ctx->fp, "static const lua_CFunction %s%s[] = {\n", - LABEL_PREFIX_LIBCF, p); - } - modnamelen = strlen(p); - if (modnamelen > sizeof(modname)-1) { - fprintf(stderr, "Error: module name too long: '%s'\n", p); - exit(1); - } - strcpy(modname, p); -} - -static int find_ffofs(BuildCtx *ctx, const char *name) -{ - int i; - for (i = 0; i < ctx->nglob; i++) { - const char *gl = ctx->globnames[i]; - if (gl[0] == 'f' && gl[1] == 'f' && gl[2] == '_' && !strcmp(gl+3, name)) { - return (int)((uint8_t *)ctx->glob[i] - ctx->code); - } - } - fprintf(stderr, "Error: undefined fast function %s%s\n", - LABEL_PREFIX_FF, name); - exit(1); -} - -static void libdef_func(BuildCtx *ctx, char *p, int arg) -{ - if (arg != LIBINIT_CF) - ffasmfunc++; - if (ctx->mode == BUILD_libdef) { - if (modstate == 0) { - fprintf(stderr, "Error: no module for function definition %s\n", p); - exit(1); - } - if (regfunc == REGFUNC_NOREG) { - if (optr+1 > obuf+sizeof(obuf)) { - fprintf(stderr, "Error: output buffer overflow\n"); - exit(1); - } - *optr++ = LIBINIT_FFID; - } else { - if (arg != LIBINIT_ASM_) { - if (modstate != 1) fprintf(ctx->fp, ",\n"); - modstate = 2; - fprintf(ctx->fp, " %s%s", arg ? LABEL_PREFIX_FFH : LABEL_PREFIX_CF, p); - } - if (regfunc != REGFUNC_NOREGUV) obuf[2]++; /* Bump hash table size. */ - libdef_name(regfunc == REGFUNC_NOREGUV ? "" : p, arg); - } - } else if (ctx->mode == BUILD_ffdef) { - fprintf(ctx->fp, "FFDEF(%s)\n", p); - } else if (ctx->mode == BUILD_recdef) { - if (strlen(p) > sizeof(funcname)-1) { - fprintf(stderr, "Error: function name too long: '%s'\n", p); - exit(1); - } - strcpy(funcname, p); - } else if (ctx->mode == BUILD_vmdef) { - int i; - for (i = 1; p[i] && modname[i-1]; i++) - if (p[i] == '_') p[i] = '.'; - fprintf(ctx->fp, "\"%s\",\n", p); - } else if (ctx->mode == BUILD_bcdef) { - if (arg != LIBINIT_CF) - fprintf(ctx->fp, ",\n%d", find_ffofs(ctx, p)); - } - ffid++; - regfunc = REGFUNC_OK; -} - -static uint32_t find_rec(char *name) -{ - char *p = (char *)obuf; - uint32_t n; - for (n = 2; *p; n++) { - if (strcmp(p, name) == 0) - return n; - p += strlen(p)+1; - } - if (p+strlen(name)+1 >= (char *)obuf+sizeof(obuf)) { - fprintf(stderr, "Error: output buffer overflow\n"); - exit(1); - } - strcpy(p, name); - return n; -} - -static void libdef_rec(BuildCtx *ctx, char *p, int arg) -{ - UNUSED(arg); - if (ctx->mode == BUILD_recdef) { - char *q; - uint32_t n; - for (; recffid+1 < ffid; recffid++) - fprintf(ctx->fp, ",\n0"); - recffid = ffid; - if (*p == '.') p = funcname; - q = strchr(p, ' '); - if (q) *q++ = '\0'; - n = find_rec(p); - if (q) - fprintf(ctx->fp, ",\n0x%02x00+(%s)", n, q); - else - fprintf(ctx->fp, ",\n0x%02x00", n); - } -} - -static void memcpy_endian(void *dst, void *src, size_t n) -{ - union { uint8_t b; uint32_t u; } host_endian; - host_endian.u = 1; - if (host_endian.b == LJ_ENDIAN_SELECT(1, 0)) { - memcpy(dst, src, n); - } else { - size_t i; - for (i = 0; i < n; i++) - ((uint8_t *)dst)[i] = ((uint8_t *)src)[n-i-1]; - } -} - -static void libdef_push(BuildCtx *ctx, char *p, int arg) -{ - UNUSED(arg); - if (ctx->mode == BUILD_libdef) { - int len = (int)strlen(p); - if (*p == '"') { - if (len > 1 && p[len-1] == '"') { - p[len-1] = '\0'; - libdef_name(p+1, LIBINIT_STRING); - return; - } - } else if (*p >= '0' && *p <= '9') { - char *ep; - double d = strtod(p, &ep); - if (*ep == '\0') { - if (optr+1+sizeof(double) > obuf+sizeof(obuf)) { - fprintf(stderr, "Error: output buffer overflow\n"); - exit(1); - } - *optr++ = LIBINIT_NUMBER; - memcpy_endian(optr, &d, sizeof(double)); - optr += sizeof(double); - return; - } - } else if (!strcmp(p, "lastcl")) { - if (optr+1 > obuf+sizeof(obuf)) { - fprintf(stderr, "Error: output buffer overflow\n"); - exit(1); - } - *optr++ = LIBINIT_LASTCL; - return; - } else if (len > 4 && !strncmp(p, "top-", 4)) { - if (optr+2 > obuf+sizeof(obuf)) { - fprintf(stderr, "Error: output buffer overflow\n"); - exit(1); - } - *optr++ = LIBINIT_COPY; - *optr++ = (uint8_t)atoi(p+4); - return; - } - fprintf(stderr, "Error: bad value for %sPUSH(%s)\n", LIBDEF_PREFIX, p); - exit(1); - } -} - -static void libdef_set(BuildCtx *ctx, char *p, int arg) -{ - UNUSED(arg); - if (ctx->mode == BUILD_libdef) { - if (p[0] == '!' && p[1] == '\0') p[0] = '\0'; /* Set env. */ - libdef_name(p, LIBINIT_STRING); - *optr++ = LIBINIT_SET; - obuf[2]++; /* Bump hash table size. */ - } -} - -static void libdef_regfunc(BuildCtx *ctx, char *p, int arg) -{ - UNUSED(ctx); UNUSED(p); - regfunc = arg; -} - -typedef void (*LibDefFunc)(BuildCtx *ctx, char *p, int arg); - -typedef struct LibDefHandler { - const char *suffix; - const char *stop; - const LibDefFunc func; - const int arg; -} LibDefHandler; - -static const LibDefHandler libdef_handlers[] = { - { "MODULE_", " \t\r\n", libdef_module, 0 }, - { "CF(", ")", libdef_func, LIBINIT_CF }, - { "ASM(", ")", libdef_func, LIBINIT_ASM }, - { "ASM_(", ")", libdef_func, LIBINIT_ASM_ }, - { "REC(", ")", libdef_rec, 0 }, - { "PUSH(", ")", libdef_push, 0 }, - { "SET(", ")", libdef_set, 0 }, - { "NOREGUV", NULL, libdef_regfunc, REGFUNC_NOREGUV }, - { "NOREG", NULL, libdef_regfunc, REGFUNC_NOREG }, - { NULL, NULL, (LibDefFunc)0, 0 } -}; - -/* Emit C source code for library function definitions. */ -void emit_lib(BuildCtx *ctx) -{ - const char *fname; - - if (ctx->mode == BUILD_ffdef || ctx->mode == BUILD_libdef || - ctx->mode == BUILD_recdef) - fprintf(ctx->fp, "/* This is a generated file. DO NOT EDIT! */\n\n"); - else if (ctx->mode == BUILD_vmdef) - fprintf(ctx->fp, "ffnames = {\n[0]=\"Lua\",\n\"C\",\n"); - if (ctx->mode == BUILD_recdef) - fprintf(ctx->fp, "static const uint16_t recff_idmap[] = {\n0,\n0x0100"); - recffid = ffid = FF_C+1; - ffasmfunc = 0; - - while ((fname = *ctx->args++)) { - char buf[256]; /* We don't care about analyzing lines longer than that. */ - FILE *fp; - if (fname[0] == '-' && fname[1] == '\0') { - fp = stdin; - } else { - fp = fopen(fname, "r"); - if (!fp) { - fprintf(stderr, "Error: cannot open input file '%s': %s\n", - fname, strerror(errno)); - exit(1); - } - } - modstate = 0; - regfunc = REGFUNC_OK; - while (fgets(buf, sizeof(buf), fp) != NULL) { - char *p; - /* Simplistic pre-processor. Only handles top-level #if/#endif. */ - if (buf[0] == '#' && buf[1] == 'i' && buf[2] == 'f') { - int ok = 1; - if (!strcmp(buf, "#if LJ_52\n")) - ok = LJ_52; - else if (!strcmp(buf, "#if LJ_HASJIT\n")) - ok = LJ_HASJIT; - else if (!strcmp(buf, "#if LJ_HASFFI\n")) - ok = LJ_HASFFI; - if (!ok) { - int lvl = 1; - while (fgets(buf, sizeof(buf), fp) != NULL) { - if (buf[0] == '#' && buf[1] == 'e' && buf[2] == 'n') { - if (--lvl == 0) break; - } else if (buf[0] == '#' && buf[1] == 'i' && buf[2] == 'f') { - lvl++; - } - } - continue; - } - } - for (p = buf; (p = strstr(p, LIBDEF_PREFIX)) != NULL; ) { - const LibDefHandler *ldh; - p += sizeof(LIBDEF_PREFIX)-1; - for (ldh = libdef_handlers; ldh->suffix != NULL; ldh++) { - size_t n, len = strlen(ldh->suffix); - if (!strncmp(p, ldh->suffix, len)) { - p += len; - n = ldh->stop ? strcspn(p, ldh->stop) : 0; - if (!p[n]) break; - p[n] = '\0'; - ldh->func(ctx, p, ldh->arg); - p += n+1; - break; - } - } - if (ldh->suffix == NULL) { - buf[strlen(buf)-1] = '\0'; - fprintf(stderr, "Error: unknown library definition tag %s%s\n", - LIBDEF_PREFIX, p); - exit(1); - } - } - } - fclose(fp); - if (ctx->mode == BUILD_libdef) { - libdef_endmodule(ctx); - } - } - - if (ctx->mode == BUILD_ffdef) { - fprintf(ctx->fp, "\n#undef FFDEF\n\n"); - fprintf(ctx->fp, - "#ifndef FF_NUM_ASMFUNC\n#define FF_NUM_ASMFUNC %d\n#endif\n\n", - ffasmfunc); - } else if (ctx->mode == BUILD_vmdef) { - fprintf(ctx->fp, "}\n\n"); - } else if (ctx->mode == BUILD_bcdef) { - int i; - fprintf(ctx->fp, "\n};\n\n"); - fprintf(ctx->fp, "LJ_DATADEF const uint16_t lj_bc_mode[] = {\n"); - fprintf(ctx->fp, "BCDEF(BCMODE)\n"); - for (i = ffasmfunc-1; i > 0; i--) - fprintf(ctx->fp, "BCMODE_FF,\n"); - fprintf(ctx->fp, "BCMODE_FF\n};\n\n"); - } else if (ctx->mode == BUILD_recdef) { - char *p = (char *)obuf; - fprintf(ctx->fp, "\n};\n\n"); - fprintf(ctx->fp, "static const RecordFunc recff_func[] = {\n" - "recff_nyi,\n" - "recff_c"); - while (*p) { - fprintf(ctx->fp, ",\nrecff_%s", p); - p += strlen(p)+1; - } - fprintf(ctx->fp, "\n};\n\n"); - } -} - diff --git a/deps/luajit/src/host/buildvm_peobj.c b/deps/luajit/src/host/buildvm_peobj.c deleted file mode 100644 index 4279f500..00000000 --- a/deps/luajit/src/host/buildvm_peobj.c +++ /dev/null @@ -1,368 +0,0 @@ -/* -** LuaJIT VM builder: PE object emitter. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -** -** Only used for building on Windows, since we cannot assume the presence -** of a suitable assembler. The host and target byte order must match. -*/ - -#include "buildvm.h" -#include "lj_bc.h" - -#if LJ_TARGET_X86ORX64 || LJ_TARGET_PPC - -/* Context for PE object emitter. */ -static char *strtab; -static size_t strtabofs; - -/* -- PE object definitions ----------------------------------------------- */ - -/* PE header. */ -typedef struct PEheader { - uint16_t arch; - uint16_t nsects; - uint32_t time; - uint32_t symtabofs; - uint32_t nsyms; - uint16_t opthdrsz; - uint16_t flags; -} PEheader; - -/* PE section. */ -typedef struct PEsection { - char name[8]; - uint32_t vsize; - uint32_t vaddr; - uint32_t size; - uint32_t ofs; - uint32_t relocofs; - uint32_t lineofs; - uint16_t nreloc; - uint16_t nline; - uint32_t flags; -} PEsection; - -/* PE relocation. */ -typedef struct PEreloc { - uint32_t vaddr; - uint32_t symidx; - uint16_t type; -} PEreloc; - -/* Cannot use sizeof, because it pads up to the max. alignment. */ -#define PEOBJ_RELOC_SIZE (4+4+2) - -/* PE symbol table entry. */ -typedef struct PEsym { - union { - char name[8]; - uint32_t nameref[2]; - } n; - uint32_t value; - int16_t sect; - uint16_t type; - uint8_t scl; - uint8_t naux; -} PEsym; - -/* PE symbol table auxiliary entry for a section. */ -typedef struct PEsymaux { - uint32_t size; - uint16_t nreloc; - uint16_t nline; - uint32_t cksum; - uint16_t assoc; - uint8_t comdatsel; - uint8_t unused[3]; -} PEsymaux; - -/* Cannot use sizeof, because it pads up to the max. alignment. */ -#define PEOBJ_SYM_SIZE (8+4+2+2+1+1) - -/* PE object CPU specific defines. */ -#if LJ_TARGET_X86 -#define PEOBJ_ARCH_TARGET 0x014c -#define PEOBJ_RELOC_REL32 0x14 /* MS: REL32, GNU: DISP32. */ -#define PEOBJ_RELOC_DIR32 0x06 -#define PEOBJ_RELOC_OFS 0 -#define PEOBJ_TEXT_FLAGS 0x60500020 /* 60=r+x, 50=align16, 20=code. */ -#elif LJ_TARGET_X64 -#define PEOBJ_ARCH_TARGET 0x8664 -#define PEOBJ_RELOC_REL32 0x04 /* MS: REL32, GNU: DISP32. */ -#define PEOBJ_RELOC_DIR32 0x02 -#define PEOBJ_RELOC_ADDR32NB 0x03 -#define PEOBJ_RELOC_OFS 0 -#define PEOBJ_TEXT_FLAGS 0x60500020 /* 60=r+x, 50=align16, 20=code. */ -#elif LJ_TARGET_PPC -#define PEOBJ_ARCH_TARGET 0x01f2 -#define PEOBJ_RELOC_REL32 0x06 -#define PEOBJ_RELOC_DIR32 0x02 -#define PEOBJ_RELOC_OFS (-4) -#define PEOBJ_TEXT_FLAGS 0x60400020 /* 60=r+x, 40=align8, 20=code. */ -#endif - -/* Section numbers (0-based). */ -enum { - PEOBJ_SECT_ABS = -2, - PEOBJ_SECT_UNDEF = -1, - PEOBJ_SECT_TEXT, -#if LJ_TARGET_X64 - PEOBJ_SECT_PDATA, - PEOBJ_SECT_XDATA, -#endif - PEOBJ_SECT_RDATA_Z, - PEOBJ_NSECTIONS -}; - -/* Symbol types. */ -#define PEOBJ_TYPE_NULL 0 -#define PEOBJ_TYPE_FUNC 0x20 - -/* Symbol storage class. */ -#define PEOBJ_SCL_EXTERN 2 -#define PEOBJ_SCL_STATIC 3 - -/* -- PE object emitter --------------------------------------------------- */ - -/* Emit PE object symbol. */ -static void emit_peobj_sym(BuildCtx *ctx, const char *name, uint32_t value, - int sect, int type, int scl) -{ - PEsym sym; - size_t len = strlen(name); - if (!strtab) { /* Pass 1: only calculate string table length. */ - if (len > 8) strtabofs += len+1; - return; - } - if (len <= 8) { - memcpy(sym.n.name, name, len); - memset(sym.n.name+len, 0, 8-len); - } else { - sym.n.nameref[0] = 0; - sym.n.nameref[1] = (uint32_t)strtabofs; - memcpy(strtab + strtabofs, name, len); - strtab[strtabofs+len] = 0; - strtabofs += len+1; - } - sym.value = value; - sym.sect = (int16_t)(sect+1); /* 1-based section number. */ - sym.type = (uint16_t)type; - sym.scl = (uint8_t)scl; - sym.naux = 0; - owrite(ctx, &sym, PEOBJ_SYM_SIZE); -} - -/* Emit PE object section symbol. */ -static void emit_peobj_sym_sect(BuildCtx *ctx, PEsection *pesect, int sect) -{ - PEsym sym; - PEsymaux aux; - if (!strtab) return; /* Pass 1: no output. */ - memcpy(sym.n.name, pesect[sect].name, 8); - sym.value = 0; - sym.sect = (int16_t)(sect+1); /* 1-based section number. */ - sym.type = PEOBJ_TYPE_NULL; - sym.scl = PEOBJ_SCL_STATIC; - sym.naux = 1; - owrite(ctx, &sym, PEOBJ_SYM_SIZE); - memset(&aux, 0, sizeof(PEsymaux)); - aux.size = pesect[sect].size; - aux.nreloc = pesect[sect].nreloc; - owrite(ctx, &aux, PEOBJ_SYM_SIZE); -} - -/* Emit Windows PE object file. */ -void emit_peobj(BuildCtx *ctx) -{ - PEheader pehdr; - PEsection pesect[PEOBJ_NSECTIONS]; - uint32_t sofs; - int i, nrsym; - union { uint8_t b; uint32_t u; } host_endian; - - sofs = sizeof(PEheader) + PEOBJ_NSECTIONS*sizeof(PEsection); - - /* Fill in PE sections. */ - memset(&pesect, 0, PEOBJ_NSECTIONS*sizeof(PEsection)); - memcpy(pesect[PEOBJ_SECT_TEXT].name, ".text", sizeof(".text")-1); - pesect[PEOBJ_SECT_TEXT].ofs = sofs; - sofs += (pesect[PEOBJ_SECT_TEXT].size = (uint32_t)ctx->codesz); - pesect[PEOBJ_SECT_TEXT].relocofs = sofs; - sofs += (pesect[PEOBJ_SECT_TEXT].nreloc = (uint16_t)ctx->nreloc) * PEOBJ_RELOC_SIZE; - /* Flags: 60 = read+execute, 50 = align16, 20 = code. */ - pesect[PEOBJ_SECT_TEXT].flags = PEOBJ_TEXT_FLAGS; - -#if LJ_TARGET_X64 - memcpy(pesect[PEOBJ_SECT_PDATA].name, ".pdata", sizeof(".pdata")-1); - pesect[PEOBJ_SECT_PDATA].ofs = sofs; - sofs += (pesect[PEOBJ_SECT_PDATA].size = 6*4); - pesect[PEOBJ_SECT_PDATA].relocofs = sofs; - sofs += (pesect[PEOBJ_SECT_PDATA].nreloc = 6) * PEOBJ_RELOC_SIZE; - /* Flags: 40 = read, 30 = align4, 40 = initialized data. */ - pesect[PEOBJ_SECT_PDATA].flags = 0x40300040; - - memcpy(pesect[PEOBJ_SECT_XDATA].name, ".xdata", sizeof(".xdata")-1); - pesect[PEOBJ_SECT_XDATA].ofs = sofs; - sofs += (pesect[PEOBJ_SECT_XDATA].size = 8*2+4+6*2); /* See below. */ - pesect[PEOBJ_SECT_XDATA].relocofs = sofs; - sofs += (pesect[PEOBJ_SECT_XDATA].nreloc = 1) * PEOBJ_RELOC_SIZE; - /* Flags: 40 = read, 30 = align4, 40 = initialized data. */ - pesect[PEOBJ_SECT_XDATA].flags = 0x40300040; -#endif - - memcpy(pesect[PEOBJ_SECT_RDATA_Z].name, ".rdata$Z", sizeof(".rdata$Z")-1); - pesect[PEOBJ_SECT_RDATA_Z].ofs = sofs; - sofs += (pesect[PEOBJ_SECT_RDATA_Z].size = (uint32_t)strlen(ctx->dasm_ident)+1); - /* Flags: 40 = read, 30 = align4, 40 = initialized data. */ - pesect[PEOBJ_SECT_RDATA_Z].flags = 0x40300040; - - /* Fill in PE header. */ - pehdr.arch = PEOBJ_ARCH_TARGET; - pehdr.nsects = PEOBJ_NSECTIONS; - pehdr.time = 0; /* Timestamp is optional. */ - pehdr.symtabofs = sofs; - pehdr.opthdrsz = 0; - pehdr.flags = 0; - - /* Compute the size of the symbol table: - ** @feat.00 + nsections*2 - ** + asm_start + nsym - ** + nrsym - */ - nrsym = ctx->nrelocsym; - pehdr.nsyms = 1+PEOBJ_NSECTIONS*2 + 1+ctx->nsym + nrsym; -#if LJ_TARGET_X64 - pehdr.nsyms += 1; /* Symbol for lj_err_unwind_win64. */ -#endif - - /* Write PE object header and all sections. */ - owrite(ctx, &pehdr, sizeof(PEheader)); - owrite(ctx, &pesect, sizeof(PEsection)*PEOBJ_NSECTIONS); - - /* Write .text section. */ - host_endian.u = 1; - if (host_endian.b != LJ_ENDIAN_SELECT(1, 0)) { -#if LJ_TARGET_PPC - uint32_t *p = (uint32_t *)ctx->code; - int n = (int)(ctx->codesz >> 2); - for (i = 0; i < n; i++, p++) - *p = lj_bswap(*p); /* Byteswap .text section. */ -#else - fprintf(stderr, "Error: different byte order for host and target\n"); - exit(1); -#endif - } - owrite(ctx, ctx->code, ctx->codesz); - for (i = 0; i < ctx->nreloc; i++) { - PEreloc reloc; - reloc.vaddr = (uint32_t)ctx->reloc[i].ofs + PEOBJ_RELOC_OFS; - reloc.symidx = 1+2+ctx->reloc[i].sym; /* Reloc syms are after .text sym. */ - reloc.type = ctx->reloc[i].type ? PEOBJ_RELOC_REL32 : PEOBJ_RELOC_DIR32; - owrite(ctx, &reloc, PEOBJ_RELOC_SIZE); - } - -#if LJ_TARGET_X64 - { /* Write .pdata section. */ - uint32_t fcofs = (uint32_t)ctx->sym[ctx->nsym-1].ofs; - uint32_t pdata[3]; /* Start of .text, end of .text and .xdata. */ - PEreloc reloc; - pdata[0] = 0; pdata[1] = fcofs; pdata[2] = 0; - owrite(ctx, &pdata, sizeof(pdata)); - pdata[0] = fcofs; pdata[1] = (uint32_t)ctx->codesz; pdata[2] = 20; - owrite(ctx, &pdata, sizeof(pdata)); - reloc.vaddr = 0; reloc.symidx = 1+2+nrsym+2+2+1; - reloc.type = PEOBJ_RELOC_ADDR32NB; - owrite(ctx, &reloc, PEOBJ_RELOC_SIZE); - reloc.vaddr = 4; reloc.symidx = 1+2+nrsym+2+2+1; - reloc.type = PEOBJ_RELOC_ADDR32NB; - owrite(ctx, &reloc, PEOBJ_RELOC_SIZE); - reloc.vaddr = 8; reloc.symidx = 1+2+nrsym+2; - reloc.type = PEOBJ_RELOC_ADDR32NB; - owrite(ctx, &reloc, PEOBJ_RELOC_SIZE); - reloc.vaddr = 12; reloc.symidx = 1+2+nrsym+2+2+1; - reloc.type = PEOBJ_RELOC_ADDR32NB; - owrite(ctx, &reloc, PEOBJ_RELOC_SIZE); - reloc.vaddr = 16; reloc.symidx = 1+2+nrsym+2+2+1; - reloc.type = PEOBJ_RELOC_ADDR32NB; - owrite(ctx, &reloc, PEOBJ_RELOC_SIZE); - reloc.vaddr = 20; reloc.symidx = 1+2+nrsym+2; - reloc.type = PEOBJ_RELOC_ADDR32NB; - owrite(ctx, &reloc, PEOBJ_RELOC_SIZE); - } - { /* Write .xdata section. */ - uint16_t xdata[8+2+6]; - PEreloc reloc; - xdata[0] = 0x01|0x08|0x10; /* Ver. 1, uhandler/ehandler, prolog size 0. */ - xdata[1] = 0x0005; /* Number of unwind codes, no frame pointer. */ - xdata[2] = 0x4200; /* Stack offset 4*8+8 = aword*5. */ - xdata[3] = 0x3000; /* Push rbx. */ - xdata[4] = 0x6000; /* Push rsi. */ - xdata[5] = 0x7000; /* Push rdi. */ - xdata[6] = 0x5000; /* Push rbp. */ - xdata[7] = 0; /* Alignment. */ - xdata[8] = xdata[9] = 0; /* Relocated address of exception handler. */ - xdata[10] = 0x01; /* Ver. 1, no handler, prolog size 0. */ - xdata[11] = 0x1504; /* Number of unwind codes, fp = rbp, fpofs = 16. */ - xdata[12] = 0x0300; /* set_fpreg. */ - xdata[13] = 0x0200; /* stack offset 0*8+8 = aword*1. */ - xdata[14] = 0x3000; /* Push rbx. */ - xdata[15] = 0x5000; /* Push rbp. */ - owrite(ctx, &xdata, sizeof(xdata)); - reloc.vaddr = 2*8; reloc.symidx = 1+2+nrsym+2+2; - reloc.type = PEOBJ_RELOC_ADDR32NB; - owrite(ctx, &reloc, PEOBJ_RELOC_SIZE); - } -#endif - - /* Write .rdata$Z section. */ - owrite(ctx, ctx->dasm_ident, strlen(ctx->dasm_ident)+1); - - /* Write symbol table. */ - strtab = NULL; /* 1st pass: collect string sizes. */ - for (;;) { - strtabofs = 4; - /* Mark as SafeSEH compliant. */ - emit_peobj_sym(ctx, "@feat.00", 1, - PEOBJ_SECT_ABS, PEOBJ_TYPE_NULL, PEOBJ_SCL_STATIC); - - emit_peobj_sym_sect(ctx, pesect, PEOBJ_SECT_TEXT); - for (i = 0; i < nrsym; i++) - emit_peobj_sym(ctx, ctx->relocsym[i], 0, - PEOBJ_SECT_UNDEF, PEOBJ_TYPE_FUNC, PEOBJ_SCL_EXTERN); - -#if LJ_TARGET_X64 - emit_peobj_sym_sect(ctx, pesect, PEOBJ_SECT_PDATA); - emit_peobj_sym_sect(ctx, pesect, PEOBJ_SECT_XDATA); - emit_peobj_sym(ctx, "lj_err_unwind_win64", 0, - PEOBJ_SECT_UNDEF, PEOBJ_TYPE_FUNC, PEOBJ_SCL_EXTERN); -#endif - - emit_peobj_sym(ctx, ctx->beginsym, 0, - PEOBJ_SECT_TEXT, PEOBJ_TYPE_NULL, PEOBJ_SCL_EXTERN); - for (i = 0; i < ctx->nsym; i++) - emit_peobj_sym(ctx, ctx->sym[i].name, (uint32_t)ctx->sym[i].ofs, - PEOBJ_SECT_TEXT, PEOBJ_TYPE_FUNC, PEOBJ_SCL_EXTERN); - - emit_peobj_sym_sect(ctx, pesect, PEOBJ_SECT_RDATA_Z); - - if (strtab) - break; - /* 2nd pass: alloc strtab, write syms and copy strings. */ - strtab = (char *)malloc(strtabofs); - *(uint32_t *)strtab = (uint32_t)strtabofs; - } - - /* Write string table. */ - owrite(ctx, strtab, strtabofs); -} - -#else - -void emit_peobj(BuildCtx *ctx) -{ - UNUSED(ctx); - fprintf(stderr, "Error: no PE object support for this target\n"); - exit(1); -} - -#endif diff --git a/deps/luajit/src/host/genminilua.lua b/deps/luajit/src/host/genminilua.lua deleted file mode 100644 index cd0d9466..00000000 --- a/deps/luajit/src/host/genminilua.lua +++ /dev/null @@ -1,428 +0,0 @@ ----------------------------------------------------------------------------- --- Lua script to generate a customized, minified version of Lua. --- The resulting 'minilua' is used for the build process of LuaJIT. ----------------------------------------------------------------------------- --- Copyright (C) 2005-2015 Mike Pall. All rights reserved. --- Released under the MIT license. See Copyright Notice in luajit.h ----------------------------------------------------------------------------- - -local sub, match, gsub = string.sub, string.match, string.gsub - -local LUA_VERSION = "5.1.5" -local LUA_SOURCE - -local function usage() - io.stderr:write("Usage: ", arg and arg[0] or "genminilua", - " lua-", LUA_VERSION, "-source-dir\n") - os.exit(1) -end - -local function find_sources() - LUA_SOURCE = arg and arg[1] - if not LUA_SOURCE then usage() end - if sub(LUA_SOURCE, -1) ~= "/" then LUA_SOURCE = LUA_SOURCE.."/" end - local fp = io.open(LUA_SOURCE .. "lua.h") - if not fp then - LUA_SOURCE = LUA_SOURCE.."src/" - fp = io.open(LUA_SOURCE .. "lua.h") - if not fp then usage() end - end - local all = fp:read("*a") - fp:close() - if not match(all, 'LUA_RELEASE%s*"Lua '..LUA_VERSION..'"') then - io.stderr:write("Error: version mismatch\n") - usage() - end -end - -local LUA_FILES = { -"lmem.c", "lobject.c", "ltm.c", "lfunc.c", "ldo.c", "lstring.c", "ltable.c", -"lgc.c", "lstate.c", "ldebug.c", "lzio.c", "lopcodes.c", -"llex.c", "lcode.c", "lparser.c", "lvm.c", "lapi.c", "lauxlib.c", -"lbaselib.c", "ltablib.c", "liolib.c", "loslib.c", "lstrlib.c", "linit.c", -} - -local REMOVE_LIB = {} -gsub([[ -collectgarbage dofile gcinfo getfenv getmetatable load print rawequal rawset -select tostring xpcall -foreach foreachi getn maxn setn -popen tmpfile seek setvbuf __tostring -clock date difftime execute getenv rename setlocale time tmpname -dump gfind len reverse -LUA_LOADLIBNAME LUA_MATHLIBNAME LUA_DBLIBNAME -]], "%S+", function(name) - REMOVE_LIB[name] = true -end) - -local REMOVE_EXTINC = { [""] = true, [""] = true, } - -local CUSTOM_MAIN = [[ -typedef unsigned int UB; -static UB barg(lua_State *L,int idx){ -union{lua_Number n;U64 b;}bn; -bn.n=lua_tonumber(L,idx)+6755399441055744.0; -if (bn.n==0.0&&!lua_isnumber(L,idx))luaL_typerror(L,idx,"number"); -return(UB)bn.b; -} -#define BRET(b) lua_pushnumber(L,(lua_Number)(int)(b));return 1; -static int tobit(lua_State *L){ -BRET(barg(L,1))} -static int bnot(lua_State *L){ -BRET(~barg(L,1))} -static int band(lua_State *L){ -int i;UB b=barg(L,1);for(i=lua_gettop(L);i>1;i--)b&=barg(L,i);BRET(b)} -static int bor(lua_State *L){ -int i;UB b=barg(L,1);for(i=lua_gettop(L);i>1;i--)b|=barg(L,i);BRET(b)} -static int bxor(lua_State *L){ -int i;UB b=barg(L,1);for(i=lua_gettop(L);i>1;i--)b^=barg(L,i);BRET(b)} -static int lshift(lua_State *L){ -UB b=barg(L,1),n=barg(L,2)&31;BRET(b<>n)} -static int arshift(lua_State *L){ -UB b=barg(L,1),n=barg(L,2)&31;BRET((int)b>>n)} -static int rol(lua_State *L){ -UB b=barg(L,1),n=barg(L,2)&31;BRET((b<>(32-n)))} -static int ror(lua_State *L){ -UB b=barg(L,1),n=barg(L,2)&31;BRET((b>>n)|(b<<(32-n)))} -static int bswap(lua_State *L){ -UB b=barg(L,1);b=(b>>24)|((b>>8)&0xff00)|((b&0xff00)<<8)|(b<<24);BRET(b)} -static int tohex(lua_State *L){ -UB b=barg(L,1); -int n=lua_isnone(L,2)?8:(int)barg(L,2); -const char *hexdigits="0123456789abcdef"; -char buf[8]; -int i; -if(n<0){n=-n;hexdigits="0123456789ABCDEF";} -if(n>8)n=8; -for(i=(int)n;--i>=0;){buf[i]=hexdigits[b&15];b>>=4;} -lua_pushlstring(L,buf,(size_t)n); -return 1; -} -static const struct luaL_Reg bitlib[] = { -{"tobit",tobit}, -{"bnot",bnot}, -{"band",band}, -{"bor",bor}, -{"bxor",bxor}, -{"lshift",lshift}, -{"rshift",rshift}, -{"arshift",arshift}, -{"rol",rol}, -{"ror",ror}, -{"bswap",bswap}, -{"tohex",tohex}, -{NULL,NULL} -}; -int main(int argc, char **argv){ - lua_State *L = luaL_newstate(); - int i; - luaL_openlibs(L); - luaL_register(L, "bit", bitlib); - if (argc < 2) return sizeof(void *); - lua_createtable(L, 0, 1); - lua_pushstring(L, argv[1]); - lua_rawseti(L, -2, 0); - lua_setglobal(L, "arg"); - if (luaL_loadfile(L, argv[1])) - goto err; - for (i = 2; i < argc; i++) - lua_pushstring(L, argv[i]); - if (lua_pcall(L, argc - 2, 0, 0)) { - err: - fprintf(stderr, "Error: %s\n", lua_tostring(L, -1)); - return 1; - } - lua_close(L); - return 0; -} -]] - -local function read_sources() - local t = {} - for i, name in ipairs(LUA_FILES) do - local fp = assert(io.open(LUA_SOURCE..name, "r")) - t[i] = fp:read("*a") - assert(fp:close()) - end - t[#t+1] = CUSTOM_MAIN - return table.concat(t) -end - -local includes = {} - -local function merge_includes(src) - return gsub(src, '#include%s*"([^"]*)"%s*\n', function(name) - if includes[name] then return "" end - includes[name] = true - local fp = assert(io.open(LUA_SOURCE..name, "r")) - local src = fp:read("*a") - assert(fp:close()) - src = gsub(src, "#ifndef%s+%w+_h\n#define%s+%w+_h\n", "") - src = gsub(src, "#endif%s*$", "") - return merge_includes(src) - end) -end - -local function get_license(src) - return match(src, "/%*+\n%* Copyright %(.-%*/\n") -end - -local function fold_lines(src) - return gsub(src, "\\\n", " ") -end - -local strings = {} - -local function save_str(str) - local n = #strings+1 - strings[n] = str - return "\1"..n.."\2" -end - -local function save_strings(src) - src = gsub(src, '"[^"\n]*"', save_str) - return gsub(src, "'[^'\n]*'", save_str) -end - -local function restore_strings(src) - return gsub(src, "\1(%d+)\2", function(numstr) - return strings[tonumber(numstr)] - end) -end - -local function def_istrue(def) - return def == "INT_MAX > 2147483640L" or - def == "LUAI_BITSINT >= 32" or - def == "SIZE_Bx < LUAI_BITSINT-1" or - def == "cast" or - def == "defined(LUA_CORE)" or - def == "MINSTRTABSIZE" or - def == "LUA_MINBUFFER" or - def == "HARDSTACKTESTS" or - def == "UNUSED" -end - -local head, defs = {[[ -#ifdef _MSC_VER -typedef unsigned __int64 U64; -#else -typedef unsigned long long U64; -#endif -int _CRT_glob = 0; -]]}, {} - -local function preprocess(src) - local t = { match(src, "^(.-)#") } - local lvl, on, oldon = 0, true, {} - for pp, def, txt in string.gmatch(src, "#(%w+) *([^\n]*)\n([^#]*)") do - if pp == "if" or pp == "ifdef" or pp == "ifndef" then - lvl = lvl + 1 - oldon[lvl] = on - on = def_istrue(def) - elseif pp == "else" then - if oldon[lvl] then - if on == false then on = true else on = false end - end - elseif pp == "elif" then - if oldon[lvl] then - on = def_istrue(def) - end - elseif pp == "endif" then - on = oldon[lvl] - lvl = lvl - 1 - elseif on then - if pp == "include" then - if not head[def] and not REMOVE_EXTINC[def] then - head[def] = true - head[#head+1] = "#include "..def.."\n" - end - elseif pp == "define" then - local k, sp, v = match(def, "([%w_]+)(%s*)(.*)") - if k and not (sp == "" and sub(v, 1, 1) == "(") then - defs[k] = gsub(v, "%a[%w_]*", function(tok) - return defs[tok] or tok - end) - else - t[#t+1] = "#define "..def.."\n" - end - elseif pp ~= "undef" then - error("unexpected directive: "..pp.." "..def) - end - end - if on then t[#t+1] = txt end - end - return gsub(table.concat(t), "%a[%w_]*", function(tok) - return defs[tok] or tok - end) -end - -local function merge_header(src, license) - local hdr = string.format([[ -/* This is a heavily customized and minimized copy of Lua %s. */ -/* It's only used to build LuaJIT. It does NOT have all standard functions! */ -]], LUA_VERSION) - return hdr..license..table.concat(head)..src -end - -local function strip_unused1(src) - return gsub(src, '( {"?([%w_]+)"?,%s+%a[%w_]*},\n)', function(line, func) - return REMOVE_LIB[func] and "" or line - end) -end - -local function strip_unused2(src) - return gsub(src, "Symbolic Execution.-}=", "") -end - -local function strip_unused3(src) - src = gsub(src, "extern", "static") - src = gsub(src, "\nstatic([^\n]-)%(([^)]*)%)%(", "\nstatic%1 %2(") - src = gsub(src, "#define lua_assert[^\n]*\n", "") - src = gsub(src, "lua_assert%b();?", "") - src = gsub(src, "default:\n}", "default:;\n}") - src = gsub(src, "lua_lock%b();", "") - src = gsub(src, "lua_unlock%b();", "") - src = gsub(src, "luai_threadyield%b();", "") - src = gsub(src, "luai_userstateopen%b();", "{}") - src = gsub(src, "luai_userstate%w+%b();", "") - src = gsub(src, "%(%(c==.*luaY_parser%)", "luaY_parser") - src = gsub(src, "trydecpoint%(ls,seminfo%)", - "luaX_lexerror(ls,\"malformed number\",TK_NUMBER)") - src = gsub(src, "int c=luaZ_lookahead%b();", "") - src = gsub(src, "luaL_register%(L,[^,]*,co_funcs%);\nreturn 2;", - "return 1;") - src = gsub(src, "getfuncname%b():", "NULL:") - src = gsub(src, "getobjname%b():", "NULL:") - src = gsub(src, "if%([^\n]*hookmask[^\n]*%)\n[^\n]*\n", "") - src = gsub(src, "if%([^\n]*hookmask[^\n]*%)%b{}\n", "") - src = gsub(src, "if%([^\n]*hookmask[^\n]*&&\n[^\n]*%b{}\n", "") - src = gsub(src, "(twoto%b()%()", "%1(size_t)") - src = gsub(src, "i -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -typedef enum{ -TM_INDEX, -TM_NEWINDEX, -TM_GC, -TM_MODE, -TM_EQ, -TM_ADD, -TM_SUB, -TM_MUL, -TM_DIV, -TM_MOD, -TM_POW, -TM_UNM, -TM_LEN, -TM_LT, -TM_LE, -TM_CONCAT, -TM_CALL, -TM_N -}TMS; -enum OpMode{iABC,iABx,iAsBx}; -typedef enum{ -OP_MOVE, -OP_LOADK, -OP_LOADBOOL, -OP_LOADNIL, -OP_GETUPVAL, -OP_GETGLOBAL, -OP_GETTABLE, -OP_SETGLOBAL, -OP_SETUPVAL, -OP_SETTABLE, -OP_NEWTABLE, -OP_SELF, -OP_ADD, -OP_SUB, -OP_MUL, -OP_DIV, -OP_MOD, -OP_POW, -OP_UNM, -OP_NOT, -OP_LEN, -OP_CONCAT, -OP_JMP, -OP_EQ, -OP_LT, -OP_LE, -OP_TEST, -OP_TESTSET, -OP_CALL, -OP_TAILCALL, -OP_RETURN, -OP_FORLOOP, -OP_FORPREP, -OP_TFORLOOP, -OP_SETLIST, -OP_CLOSE, -OP_CLOSURE, -OP_VARARG -}OpCode; -enum OpArgMask{ -OpArgN, -OpArgU, -OpArgR, -OpArgK -}; -typedef enum{ -VVOID, -VNIL, -VTRUE, -VFALSE, -VK, -VKNUM, -VLOCAL, -VUPVAL, -VGLOBAL, -VINDEXED, -VJMP, -VRELOCABLE, -VNONRELOC, -VCALL, -VVARARG -}expkind; -enum RESERVED{ -TK_AND=257,TK_BREAK, -TK_DO,TK_ELSE,TK_ELSEIF,TK_END,TK_FALSE,TK_FOR,TK_FUNCTION, -TK_IF,TK_IN,TK_LOCAL,TK_NIL,TK_NOT,TK_OR,TK_REPEAT, -TK_RETURN,TK_THEN,TK_TRUE,TK_UNTIL,TK_WHILE, -TK_CONCAT,TK_DOTS,TK_EQ,TK_GE,TK_LE,TK_NE,TK_NUMBER, -TK_NAME,TK_STRING,TK_EOS -}; -typedef enum BinOpr{ -OPR_ADD,OPR_SUB,OPR_MUL,OPR_DIV,OPR_MOD,OPR_POW, -OPR_CONCAT, -OPR_NE,OPR_EQ, -OPR_LT,OPR_LE,OPR_GT,OPR_GE, -OPR_AND,OPR_OR, -OPR_NOBINOPR -}BinOpr; -typedef enum UnOpr{OPR_MINUS,OPR_NOT,OPR_LEN,OPR_NOUNOPR}UnOpr; -#define LUA_QL(x)"'"x"'" -#define luai_apicheck(L,o){(void)L;} -#define lua_number2str(s,n)sprintf((s),"%.14g",(n)) -#define lua_str2number(s,p)strtod((s),(p)) -#define luai_numadd(a,b)((a)+(b)) -#define luai_numsub(a,b)((a)-(b)) -#define luai_nummul(a,b)((a)*(b)) -#define luai_numdiv(a,b)((a)/(b)) -#define luai_nummod(a,b)((a)-floor((a)/(b))*(b)) -#define luai_numpow(a,b)(pow(a,b)) -#define luai_numunm(a)(-(a)) -#define luai_numeq(a,b)((a)==(b)) -#define luai_numlt(a,b)((a)<(b)) -#define luai_numle(a,b)((a)<=(b)) -#define luai_numisnan(a)(!luai_numeq((a),(a))) -#define lua_number2int(i,d)((i)=(int)(d)) -#define lua_number2integer(i,d)((i)=(lua_Integer)(d)) -#define LUAI_THROW(L,c)longjmp((c)->b,1) -#define LUAI_TRY(L,c,a)if(setjmp((c)->b)==0){a} -#define lua_pclose(L,file)((void)((void)L,file),0) -#define lua_upvalueindex(i)((-10002)-(i)) -typedef struct lua_State lua_State; -typedef int(*lua_CFunction)(lua_State*L); -typedef const char*(*lua_Reader)(lua_State*L,void*ud,size_t*sz); -typedef void*(*lua_Alloc)(void*ud,void*ptr,size_t osize,size_t nsize); -typedef double lua_Number; -typedef ptrdiff_t lua_Integer; -static void lua_settop(lua_State*L,int idx); -static int lua_type(lua_State*L,int idx); -static const char* lua_tolstring(lua_State*L,int idx,size_t*len); -static size_t lua_objlen(lua_State*L,int idx); -static void lua_pushlstring(lua_State*L,const char*s,size_t l); -static void lua_pushcclosure(lua_State*L,lua_CFunction fn,int n); -static void lua_createtable(lua_State*L,int narr,int nrec); -static void lua_setfield(lua_State*L,int idx,const char*k); -#define lua_pop(L,n)lua_settop(L,-(n)-1) -#define lua_newtable(L)lua_createtable(L,0,0) -#define lua_pushcfunction(L,f)lua_pushcclosure(L,(f),0) -#define lua_strlen(L,i)lua_objlen(L,(i)) -#define lua_isfunction(L,n)(lua_type(L,(n))==6) -#define lua_istable(L,n)(lua_type(L,(n))==5) -#define lua_isnil(L,n)(lua_type(L,(n))==0) -#define lua_isboolean(L,n)(lua_type(L,(n))==1) -#define lua_isnone(L,n)(lua_type(L,(n))==(-1)) -#define lua_isnoneornil(L,n)(lua_type(L,(n))<=0) -#define lua_pushliteral(L,s)lua_pushlstring(L,""s,(sizeof(s)/sizeof(char))-1) -#define lua_setglobal(L,s)lua_setfield(L,(-10002),(s)) -#define lua_tostring(L,i)lua_tolstring(L,(i),NULL) -typedef struct lua_Debug lua_Debug; -typedef void(*lua_Hook)(lua_State*L,lua_Debug*ar); -struct lua_Debug{ -int event; -const char*name; -const char*namewhat; -const char*what; -const char*source; -int currentline; -int nups; -int linedefined; -int lastlinedefined; -char short_src[60]; -int i_ci; -}; -typedef unsigned int lu_int32; -typedef size_t lu_mem; -typedef ptrdiff_t l_mem; -typedef unsigned char lu_byte; -#define IntPoint(p)((unsigned int)(lu_mem)(p)) -typedef union{double u;void*s;long l;}L_Umaxalign; -typedef double l_uacNumber; -#define check_exp(c,e)(e) -#define UNUSED(x)((void)(x)) -#define cast(t,exp)((t)(exp)) -#define cast_byte(i)cast(lu_byte,(i)) -#define cast_num(i)cast(lua_Number,(i)) -#define cast_int(i)cast(int,(i)) -typedef lu_int32 Instruction; -#define condhardstacktests(x)((void)0) -typedef union GCObject GCObject; -typedef struct GCheader{ -GCObject*next;lu_byte tt;lu_byte marked; -}GCheader; -typedef union{ -GCObject*gc; -void*p; -lua_Number n; -int b; -}Value; -typedef struct lua_TValue{ -Value value;int tt; -}TValue; -#define ttisnil(o)(ttype(o)==0) -#define ttisnumber(o)(ttype(o)==3) -#define ttisstring(o)(ttype(o)==4) -#define ttistable(o)(ttype(o)==5) -#define ttisfunction(o)(ttype(o)==6) -#define ttisboolean(o)(ttype(o)==1) -#define ttisuserdata(o)(ttype(o)==7) -#define ttisthread(o)(ttype(o)==8) -#define ttislightuserdata(o)(ttype(o)==2) -#define ttype(o)((o)->tt) -#define gcvalue(o)check_exp(iscollectable(o),(o)->value.gc) -#define pvalue(o)check_exp(ttislightuserdata(o),(o)->value.p) -#define nvalue(o)check_exp(ttisnumber(o),(o)->value.n) -#define rawtsvalue(o)check_exp(ttisstring(o),&(o)->value.gc->ts) -#define tsvalue(o)(&rawtsvalue(o)->tsv) -#define rawuvalue(o)check_exp(ttisuserdata(o),&(o)->value.gc->u) -#define uvalue(o)(&rawuvalue(o)->uv) -#define clvalue(o)check_exp(ttisfunction(o),&(o)->value.gc->cl) -#define hvalue(o)check_exp(ttistable(o),&(o)->value.gc->h) -#define bvalue(o)check_exp(ttisboolean(o),(o)->value.b) -#define thvalue(o)check_exp(ttisthread(o),&(o)->value.gc->th) -#define l_isfalse(o)(ttisnil(o)||(ttisboolean(o)&&bvalue(o)==0)) -#define checkconsistency(obj) -#define checkliveness(g,obj) -#define setnilvalue(obj)((obj)->tt=0) -#define setnvalue(obj,x){TValue*i_o=(obj);i_o->value.n=(x);i_o->tt=3;} -#define setbvalue(obj,x){TValue*i_o=(obj);i_o->value.b=(x);i_o->tt=1;} -#define setsvalue(L,obj,x){TValue*i_o=(obj);i_o->value.gc=cast(GCObject*,(x));i_o->tt=4;checkliveness(G(L),i_o);} -#define setuvalue(L,obj,x){TValue*i_o=(obj);i_o->value.gc=cast(GCObject*,(x));i_o->tt=7;checkliveness(G(L),i_o);} -#define setthvalue(L,obj,x){TValue*i_o=(obj);i_o->value.gc=cast(GCObject*,(x));i_o->tt=8;checkliveness(G(L),i_o);} -#define setclvalue(L,obj,x){TValue*i_o=(obj);i_o->value.gc=cast(GCObject*,(x));i_o->tt=6;checkliveness(G(L),i_o);} -#define sethvalue(L,obj,x){TValue*i_o=(obj);i_o->value.gc=cast(GCObject*,(x));i_o->tt=5;checkliveness(G(L),i_o);} -#define setptvalue(L,obj,x){TValue*i_o=(obj);i_o->value.gc=cast(GCObject*,(x));i_o->tt=(8+1);checkliveness(G(L),i_o);} -#define setobj(L,obj1,obj2){const TValue*o2=(obj2);TValue*o1=(obj1);o1->value=o2->value;o1->tt=o2->tt;checkliveness(G(L),o1);} -#define setttype(obj,tt)(ttype(obj)=(tt)) -#define iscollectable(o)(ttype(o)>=4) -typedef TValue*StkId; -typedef union TString{ -L_Umaxalign dummy; -struct{ -GCObject*next;lu_byte tt;lu_byte marked; -lu_byte reserved; -unsigned int hash; -size_t len; -}tsv; -}TString; -#define getstr(ts)cast(const char*,(ts)+1) -#define svalue(o)getstr(rawtsvalue(o)) -typedef union Udata{ -L_Umaxalign dummy; -struct{ -GCObject*next;lu_byte tt;lu_byte marked; -struct Table*metatable; -struct Table*env; -size_t len; -}uv; -}Udata; -typedef struct Proto{ -GCObject*next;lu_byte tt;lu_byte marked; -TValue*k; -Instruction*code; -struct Proto**p; -int*lineinfo; -struct LocVar*locvars; -TString**upvalues; -TString*source; -int sizeupvalues; -int sizek; -int sizecode; -int sizelineinfo; -int sizep; -int sizelocvars; -int linedefined; -int lastlinedefined; -GCObject*gclist; -lu_byte nups; -lu_byte numparams; -lu_byte is_vararg; -lu_byte maxstacksize; -}Proto; -typedef struct LocVar{ -TString*varname; -int startpc; -int endpc; -}LocVar; -typedef struct UpVal{ -GCObject*next;lu_byte tt;lu_byte marked; -TValue*v; -union{ -TValue value; -struct{ -struct UpVal*prev; -struct UpVal*next; -}l; -}u; -}UpVal; -typedef struct CClosure{ -GCObject*next;lu_byte tt;lu_byte marked;lu_byte isC;lu_byte nupvalues;GCObject*gclist;struct Table*env; -lua_CFunction f; -TValue upvalue[1]; -}CClosure; -typedef struct LClosure{ -GCObject*next;lu_byte tt;lu_byte marked;lu_byte isC;lu_byte nupvalues;GCObject*gclist;struct Table*env; -struct Proto*p; -UpVal*upvals[1]; -}LClosure; -typedef union Closure{ -CClosure c; -LClosure l; -}Closure; -#define iscfunction(o)(ttype(o)==6&&clvalue(o)->c.isC) -typedef union TKey{ -struct{ -Value value;int tt; -struct Node*next; -}nk; -TValue tvk; -}TKey; -typedef struct Node{ -TValue i_val; -TKey i_key; -}Node; -typedef struct Table{ -GCObject*next;lu_byte tt;lu_byte marked; -lu_byte flags; -lu_byte lsizenode; -struct Table*metatable; -TValue*array; -Node*node; -Node*lastfree; -GCObject*gclist; -int sizearray; -}Table; -#define lmod(s,size)(check_exp((size&(size-1))==0,(cast(int,(s)&((size)-1))))) -#define twoto(x)((size_t)1<<(x)) -#define sizenode(t)(twoto((t)->lsizenode)) -static const TValue luaO_nilobject_; -#define ceillog2(x)(luaO_log2((x)-1)+1) -static int luaO_log2(unsigned int x); -#define gfasttm(g,et,e)((et)==NULL?NULL:((et)->flags&(1u<<(e)))?NULL:luaT_gettm(et,e,(g)->tmname[e])) -#define fasttm(l,et,e)gfasttm(G(l),et,e) -static const TValue*luaT_gettm(Table*events,TMS event,TString*ename); -#define luaM_reallocv(L,b,on,n,e)((cast(size_t,(n)+1)<=((size_t)(~(size_t)0)-2)/(e))?luaM_realloc_(L,(b),(on)*(e),(n)*(e)):luaM_toobig(L)) -#define luaM_freemem(L,b,s)luaM_realloc_(L,(b),(s),0) -#define luaM_free(L,b)luaM_realloc_(L,(b),sizeof(*(b)),0) -#define luaM_freearray(L,b,n,t)luaM_reallocv(L,(b),n,0,sizeof(t)) -#define luaM_malloc(L,t)luaM_realloc_(L,NULL,0,(t)) -#define luaM_new(L,t)cast(t*,luaM_malloc(L,sizeof(t))) -#define luaM_newvector(L,n,t)cast(t*,luaM_reallocv(L,NULL,0,n,sizeof(t))) -#define luaM_growvector(L,v,nelems,size,t,limit,e)if((nelems)+1>(size))((v)=cast(t*,luaM_growaux_(L,v,&(size),sizeof(t),limit,e))) -#define luaM_reallocvector(L,v,oldn,n,t)((v)=cast(t*,luaM_reallocv(L,v,oldn,n,sizeof(t)))) -static void*luaM_realloc_(lua_State*L,void*block,size_t oldsize, -size_t size); -static void*luaM_toobig(lua_State*L); -static void*luaM_growaux_(lua_State*L,void*block,int*size, -size_t size_elem,int limit, -const char*errormsg); -typedef struct Zio ZIO; -#define char2int(c)cast(int,cast(unsigned char,(c))) -#define zgetc(z)(((z)->n--)>0?char2int(*(z)->p++):luaZ_fill(z)) -typedef struct Mbuffer{ -char*buffer; -size_t n; -size_t buffsize; -}Mbuffer; -#define luaZ_initbuffer(L,buff)((buff)->buffer=NULL,(buff)->buffsize=0) -#define luaZ_buffer(buff)((buff)->buffer) -#define luaZ_sizebuffer(buff)((buff)->buffsize) -#define luaZ_bufflen(buff)((buff)->n) -#define luaZ_resetbuffer(buff)((buff)->n=0) -#define luaZ_resizebuffer(L,buff,size)(luaM_reallocvector(L,(buff)->buffer,(buff)->buffsize,size,char),(buff)->buffsize=size) -#define luaZ_freebuffer(L,buff)luaZ_resizebuffer(L,buff,0) -struct Zio{ -size_t n; -const char*p; -lua_Reader reader; -void*data; -lua_State*L; -}; -static int luaZ_fill(ZIO*z); -struct lua_longjmp; -#define gt(L)(&L->l_gt) -#define registry(L)(&G(L)->l_registry) -typedef struct stringtable{ -GCObject**hash; -lu_int32 nuse; -int size; -}stringtable; -typedef struct CallInfo{ -StkId base; -StkId func; -StkId top; -const Instruction*savedpc; -int nresults; -int tailcalls; -}CallInfo; -#define curr_func(L)(clvalue(L->ci->func)) -#define ci_func(ci)(clvalue((ci)->func)) -#define f_isLua(ci)(!ci_func(ci)->c.isC) -#define isLua(ci)(ttisfunction((ci)->func)&&f_isLua(ci)) -typedef struct global_State{ -stringtable strt; -lua_Alloc frealloc; -void*ud; -lu_byte currentwhite; -lu_byte gcstate; -int sweepstrgc; -GCObject*rootgc; -GCObject**sweepgc; -GCObject*gray; -GCObject*grayagain; -GCObject*weak; -GCObject*tmudata; -Mbuffer buff; -lu_mem GCthreshold; -lu_mem totalbytes; -lu_mem estimate; -lu_mem gcdept; -int gcpause; -int gcstepmul; -lua_CFunction panic; -TValue l_registry; -struct lua_State*mainthread; -UpVal uvhead; -struct Table*mt[(8+1)]; -TString*tmname[TM_N]; -}global_State; -struct lua_State{ -GCObject*next;lu_byte tt;lu_byte marked; -lu_byte status; -StkId top; -StkId base; -global_State*l_G; -CallInfo*ci; -const Instruction*savedpc; -StkId stack_last; -StkId stack; -CallInfo*end_ci; -CallInfo*base_ci; -int stacksize; -int size_ci; -unsigned short nCcalls; -unsigned short baseCcalls; -lu_byte hookmask; -lu_byte allowhook; -int basehookcount; -int hookcount; -lua_Hook hook; -TValue l_gt; -TValue env; -GCObject*openupval; -GCObject*gclist; -struct lua_longjmp*errorJmp; -ptrdiff_t errfunc; -}; -#define G(L)(L->l_G) -union GCObject{ -GCheader gch; -union TString ts; -union Udata u; -union Closure cl; -struct Table h; -struct Proto p; -struct UpVal uv; -struct lua_State th; -}; -#define rawgco2ts(o)check_exp((o)->gch.tt==4,&((o)->ts)) -#define gco2ts(o)(&rawgco2ts(o)->tsv) -#define rawgco2u(o)check_exp((o)->gch.tt==7,&((o)->u)) -#define gco2u(o)(&rawgco2u(o)->uv) -#define gco2cl(o)check_exp((o)->gch.tt==6,&((o)->cl)) -#define gco2h(o)check_exp((o)->gch.tt==5,&((o)->h)) -#define gco2p(o)check_exp((o)->gch.tt==(8+1),&((o)->p)) -#define gco2uv(o)check_exp((o)->gch.tt==(8+2),&((o)->uv)) -#define ngcotouv(o)check_exp((o)==NULL||(o)->gch.tt==(8+2),&((o)->uv)) -#define gco2th(o)check_exp((o)->gch.tt==8,&((o)->th)) -#define obj2gco(v)(cast(GCObject*,(v))) -static void luaE_freethread(lua_State*L,lua_State*L1); -#define pcRel(pc,p)(cast(int,(pc)-(p)->code)-1) -#define getline_(f,pc)(((f)->lineinfo)?(f)->lineinfo[pc]:0) -#define resethookcount(L)(L->hookcount=L->basehookcount) -static void luaG_typeerror(lua_State*L,const TValue*o, -const char*opname); -static void luaG_runerror(lua_State*L,const char*fmt,...); -#define luaD_checkstack(L,n)if((char*)L->stack_last-(char*)L->top<=(n)*(int)sizeof(TValue))luaD_growstack(L,n);else condhardstacktests(luaD_reallocstack(L,L->stacksize-5-1)); -#define incr_top(L){luaD_checkstack(L,1);L->top++;} -#define savestack(L,p)((char*)(p)-(char*)L->stack) -#define restorestack(L,n)((TValue*)((char*)L->stack+(n))) -#define saveci(L,p)((char*)(p)-(char*)L->base_ci) -#define restoreci(L,n)((CallInfo*)((char*)L->base_ci+(n))) -typedef void(*Pfunc)(lua_State*L,void*ud); -static int luaD_poscall(lua_State*L,StkId firstResult); -static void luaD_reallocCI(lua_State*L,int newsize); -static void luaD_reallocstack(lua_State*L,int newsize); -static void luaD_growstack(lua_State*L,int n); -static void luaD_throw(lua_State*L,int errcode); -static void*luaM_growaux_(lua_State*L,void*block,int*size,size_t size_elems, -int limit,const char*errormsg){ -void*newblock; -int newsize; -if(*size>=limit/2){ -if(*size>=limit) -luaG_runerror(L,errormsg); -newsize=limit; -} -else{ -newsize=(*size)*2; -if(newsize<4) -newsize=4; -} -newblock=luaM_reallocv(L,block,*size,newsize,size_elems); -*size=newsize; -return newblock; -} -static void*luaM_toobig(lua_State*L){ -luaG_runerror(L,"memory allocation error: block too big"); -return NULL; -} -static void*luaM_realloc_(lua_State*L,void*block,size_t osize,size_t nsize){ -global_State*g=G(L); -block=(*g->frealloc)(g->ud,block,osize,nsize); -if(block==NULL&&nsize>0) -luaD_throw(L,4); -g->totalbytes=(g->totalbytes-osize)+nsize; -return block; -} -#define resetbits(x,m)((x)&=cast(lu_byte,~(m))) -#define setbits(x,m)((x)|=(m)) -#define testbits(x,m)((x)&(m)) -#define bitmask(b)(1<<(b)) -#define bit2mask(b1,b2)(bitmask(b1)|bitmask(b2)) -#define l_setbit(x,b)setbits(x,bitmask(b)) -#define resetbit(x,b)resetbits(x,bitmask(b)) -#define testbit(x,b)testbits(x,bitmask(b)) -#define set2bits(x,b1,b2)setbits(x,(bit2mask(b1,b2))) -#define reset2bits(x,b1,b2)resetbits(x,(bit2mask(b1,b2))) -#define test2bits(x,b1,b2)testbits(x,(bit2mask(b1,b2))) -#define iswhite(x)test2bits((x)->gch.marked,0,1) -#define isblack(x)testbit((x)->gch.marked,2) -#define isgray(x)(!isblack(x)&&!iswhite(x)) -#define otherwhite(g)(g->currentwhite^bit2mask(0,1)) -#define isdead(g,v)((v)->gch.marked&otherwhite(g)&bit2mask(0,1)) -#define changewhite(x)((x)->gch.marked^=bit2mask(0,1)) -#define gray2black(x)l_setbit((x)->gch.marked,2) -#define valiswhite(x)(iscollectable(x)&&iswhite(gcvalue(x))) -#define luaC_white(g)cast(lu_byte,(g)->currentwhite&bit2mask(0,1)) -#define luaC_checkGC(L){condhardstacktests(luaD_reallocstack(L,L->stacksize-5-1));if(G(L)->totalbytes>=G(L)->GCthreshold)luaC_step(L);} -#define luaC_barrier(L,p,v){if(valiswhite(v)&&isblack(obj2gco(p)))luaC_barrierf(L,obj2gco(p),gcvalue(v));} -#define luaC_barriert(L,t,v){if(valiswhite(v)&&isblack(obj2gco(t)))luaC_barrierback(L,t);} -#define luaC_objbarrier(L,p,o){if(iswhite(obj2gco(o))&&isblack(obj2gco(p)))luaC_barrierf(L,obj2gco(p),obj2gco(o));} -#define luaC_objbarriert(L,t,o){if(iswhite(obj2gco(o))&&isblack(obj2gco(t)))luaC_barrierback(L,t);} -static void luaC_step(lua_State*L); -static void luaC_link(lua_State*L,GCObject*o,lu_byte tt); -static void luaC_linkupval(lua_State*L,UpVal*uv); -static void luaC_barrierf(lua_State*L,GCObject*o,GCObject*v); -static void luaC_barrierback(lua_State*L,Table*t); -#define sizestring(s)(sizeof(union TString)+((s)->len+1)*sizeof(char)) -#define sizeudata(u)(sizeof(union Udata)+(u)->len) -#define luaS_new(L,s)(luaS_newlstr(L,s,strlen(s))) -#define luaS_newliteral(L,s)(luaS_newlstr(L,""s,(sizeof(s)/sizeof(char))-1)) -#define luaS_fix(s)l_setbit((s)->tsv.marked,5) -static TString*luaS_newlstr(lua_State*L,const char*str,size_t l); -#define tostring(L,o)((ttype(o)==4)||(luaV_tostring(L,o))) -#define tonumber(o,n)(ttype(o)==3||(((o)=luaV_tonumber(o,n))!=NULL)) -#define equalobj(L,o1,o2)(ttype(o1)==ttype(o2)&&luaV_equalval(L,o1,o2)) -static int luaV_equalval(lua_State*L,const TValue*t1,const TValue*t2); -static const TValue*luaV_tonumber(const TValue*obj,TValue*n); -static int luaV_tostring(lua_State*L,StkId obj); -static void luaV_execute(lua_State*L,int nexeccalls); -static void luaV_concat(lua_State*L,int total,int last); -static const TValue luaO_nilobject_={{NULL},0}; -static int luaO_int2fb(unsigned int x){ -int e=0; -while(x>=16){ -x=(x+1)>>1; -e++; -} -if(x<8)return x; -else return((e+1)<<3)|(cast_int(x)-8); -} -static int luaO_fb2int(int x){ -int e=(x>>3)&31; -if(e==0)return x; -else return((x&7)+8)<<(e-1); -} -static int luaO_log2(unsigned int x){ -static const lu_byte log_2[256]={ -0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, -7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, -7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, -8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, -8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, -8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, -8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8 -}; -int l=-1; -while(x>=256){l+=8;x>>=8;} -return l+log_2[x]; -} -static int luaO_rawequalObj(const TValue*t1,const TValue*t2){ -if(ttype(t1)!=ttype(t2))return 0; -else switch(ttype(t1)){ -case 0: -return 1; -case 3: -return luai_numeq(nvalue(t1),nvalue(t2)); -case 1: -return bvalue(t1)==bvalue(t2); -case 2: -return pvalue(t1)==pvalue(t2); -default: -return gcvalue(t1)==gcvalue(t2); -} -} -static int luaO_str2d(const char*s,lua_Number*result){ -char*endptr; -*result=lua_str2number(s,&endptr); -if(endptr==s)return 0; -if(*endptr=='x'||*endptr=='X') -*result=cast_num(strtoul(s,&endptr,16)); -if(*endptr=='\0')return 1; -while(isspace(cast(unsigned char,*endptr)))endptr++; -if(*endptr!='\0')return 0; -return 1; -} -static void pushstr(lua_State*L,const char*str){ -setsvalue(L,L->top,luaS_new(L,str)); -incr_top(L); -} -static const char*luaO_pushvfstring(lua_State*L,const char*fmt,va_list argp){ -int n=1; -pushstr(L,""); -for(;;){ -const char*e=strchr(fmt,'%'); -if(e==NULL)break; -setsvalue(L,L->top,luaS_newlstr(L,fmt,e-fmt)); -incr_top(L); -switch(*(e+1)){ -case's':{ -const char*s=va_arg(argp,char*); -if(s==NULL)s="(null)"; -pushstr(L,s); -break; -} -case'c':{ -char buff[2]; -buff[0]=cast(char,va_arg(argp,int)); -buff[1]='\0'; -pushstr(L,buff); -break; -} -case'd':{ -setnvalue(L->top,cast_num(va_arg(argp,int))); -incr_top(L); -break; -} -case'f':{ -setnvalue(L->top,cast_num(va_arg(argp,l_uacNumber))); -incr_top(L); -break; -} -case'p':{ -char buff[4*sizeof(void*)+8]; -sprintf(buff,"%p",va_arg(argp,void*)); -pushstr(L,buff); -break; -} -case'%':{ -pushstr(L,"%"); -break; -} -default:{ -char buff[3]; -buff[0]='%'; -buff[1]=*(e+1); -buff[2]='\0'; -pushstr(L,buff); -break; -} -} -n+=2; -fmt=e+2; -} -pushstr(L,fmt); -luaV_concat(L,n+1,cast_int(L->top-L->base)-1); -L->top-=n; -return svalue(L->top-1); -} -static const char*luaO_pushfstring(lua_State*L,const char*fmt,...){ -const char*msg; -va_list argp; -va_start(argp,fmt); -msg=luaO_pushvfstring(L,fmt,argp); -va_end(argp); -return msg; -} -static void luaO_chunkid(char*out,const char*source,size_t bufflen){ -if(*source=='='){ -strncpy(out,source+1,bufflen); -out[bufflen-1]='\0'; -} -else{ -if(*source=='@'){ -size_t l; -source++; -bufflen-=sizeof(" '...' "); -l=strlen(source); -strcpy(out,""); -if(l>bufflen){ -source+=(l-bufflen); -strcat(out,"..."); -} -strcat(out,source); -} -else{ -size_t len=strcspn(source,"\n\r"); -bufflen-=sizeof(" [string \"...\"] "); -if(len>bufflen)len=bufflen; -strcpy(out,"[string \""); -if(source[len]!='\0'){ -strncat(out,source,len); -strcat(out,"..."); -} -else -strcat(out,source); -strcat(out,"\"]"); -} -} -} -#define gnode(t,i)(&(t)->node[i]) -#define gkey(n)(&(n)->i_key.nk) -#define gval(n)(&(n)->i_val) -#define gnext(n)((n)->i_key.nk.next) -#define key2tval(n)(&(n)->i_key.tvk) -static TValue*luaH_setnum(lua_State*L,Table*t,int key); -static const TValue*luaH_getstr(Table*t,TString*key); -static TValue*luaH_set(lua_State*L,Table*t,const TValue*key); -static const char*const luaT_typenames[]={ -"nil","boolean","userdata","number", -"string","table","function","userdata","thread", -"proto","upval" -}; -static void luaT_init(lua_State*L){ -static const char*const luaT_eventname[]={ -"__index","__newindex", -"__gc","__mode","__eq", -"__add","__sub","__mul","__div","__mod", -"__pow","__unm","__len","__lt","__le", -"__concat","__call" -}; -int i; -for(i=0;itmname[i]=luaS_new(L,luaT_eventname[i]); -luaS_fix(G(L)->tmname[i]); -} -} -static const TValue*luaT_gettm(Table*events,TMS event,TString*ename){ -const TValue*tm=luaH_getstr(events,ename); -if(ttisnil(tm)){ -events->flags|=cast_byte(1u<metatable; -break; -case 7: -mt=uvalue(o)->metatable; -break; -default: -mt=G(L)->mt[ttype(o)]; -} -return(mt?luaH_getstr(mt,G(L)->tmname[event]):(&luaO_nilobject_)); -} -#define sizeCclosure(n)(cast(int,sizeof(CClosure))+cast(int,sizeof(TValue)*((n)-1))) -#define sizeLclosure(n)(cast(int,sizeof(LClosure))+cast(int,sizeof(TValue*)*((n)-1))) -static Closure*luaF_newCclosure(lua_State*L,int nelems,Table*e){ -Closure*c=cast(Closure*,luaM_malloc(L,sizeCclosure(nelems))); -luaC_link(L,obj2gco(c),6); -c->c.isC=1; -c->c.env=e; -c->c.nupvalues=cast_byte(nelems); -return c; -} -static Closure*luaF_newLclosure(lua_State*L,int nelems,Table*e){ -Closure*c=cast(Closure*,luaM_malloc(L,sizeLclosure(nelems))); -luaC_link(L,obj2gco(c),6); -c->l.isC=0; -c->l.env=e; -c->l.nupvalues=cast_byte(nelems); -while(nelems--)c->l.upvals[nelems]=NULL; -return c; -} -static UpVal*luaF_newupval(lua_State*L){ -UpVal*uv=luaM_new(L,UpVal); -luaC_link(L,obj2gco(uv),(8+2)); -uv->v=&uv->u.value; -setnilvalue(uv->v); -return uv; -} -static UpVal*luaF_findupval(lua_State*L,StkId level){ -global_State*g=G(L); -GCObject**pp=&L->openupval; -UpVal*p; -UpVal*uv; -while(*pp!=NULL&&(p=ngcotouv(*pp))->v>=level){ -if(p->v==level){ -if(isdead(g,obj2gco(p))) -changewhite(obj2gco(p)); -return p; -} -pp=&p->next; -} -uv=luaM_new(L,UpVal); -uv->tt=(8+2); -uv->marked=luaC_white(g); -uv->v=level; -uv->next=*pp; -*pp=obj2gco(uv); -uv->u.l.prev=&g->uvhead; -uv->u.l.next=g->uvhead.u.l.next; -uv->u.l.next->u.l.prev=uv; -g->uvhead.u.l.next=uv; -return uv; -} -static void unlinkupval(UpVal*uv){ -uv->u.l.next->u.l.prev=uv->u.l.prev; -uv->u.l.prev->u.l.next=uv->u.l.next; -} -static void luaF_freeupval(lua_State*L,UpVal*uv){ -if(uv->v!=&uv->u.value) -unlinkupval(uv); -luaM_free(L,uv); -} -static void luaF_close(lua_State*L,StkId level){ -UpVal*uv; -global_State*g=G(L); -while(L->openupval!=NULL&&(uv=ngcotouv(L->openupval))->v>=level){ -GCObject*o=obj2gco(uv); -L->openupval=uv->next; -if(isdead(g,o)) -luaF_freeupval(L,uv); -else{ -unlinkupval(uv); -setobj(L,&uv->u.value,uv->v); -uv->v=&uv->u.value; -luaC_linkupval(L,uv); -} -} -} -static Proto*luaF_newproto(lua_State*L){ -Proto*f=luaM_new(L,Proto); -luaC_link(L,obj2gco(f),(8+1)); -f->k=NULL; -f->sizek=0; -f->p=NULL; -f->sizep=0; -f->code=NULL; -f->sizecode=0; -f->sizelineinfo=0; -f->sizeupvalues=0; -f->nups=0; -f->upvalues=NULL; -f->numparams=0; -f->is_vararg=0; -f->maxstacksize=0; -f->lineinfo=NULL; -f->sizelocvars=0; -f->locvars=NULL; -f->linedefined=0; -f->lastlinedefined=0; -f->source=NULL; -return f; -} -static void luaF_freeproto(lua_State*L,Proto*f){ -luaM_freearray(L,f->code,f->sizecode,Instruction); -luaM_freearray(L,f->p,f->sizep,Proto*); -luaM_freearray(L,f->k,f->sizek,TValue); -luaM_freearray(L,f->lineinfo,f->sizelineinfo,int); -luaM_freearray(L,f->locvars,f->sizelocvars,struct LocVar); -luaM_freearray(L,f->upvalues,f->sizeupvalues,TString*); -luaM_free(L,f); -} -static void luaF_freeclosure(lua_State*L,Closure*c){ -int size=(c->c.isC)?sizeCclosure(c->c.nupvalues): -sizeLclosure(c->l.nupvalues); -luaM_freemem(L,c,size); -} -#define MASK1(n,p)((~((~(Instruction)0)<>0)&MASK1(6,0))) -#define SET_OPCODE(i,o)((i)=(((i)&MASK0(6,0))|((cast(Instruction,o)<<0)&MASK1(6,0)))) -#define GETARG_A(i)(cast(int,((i)>>(0+6))&MASK1(8,0))) -#define SETARG_A(i,u)((i)=(((i)&MASK0(8,(0+6)))|((cast(Instruction,u)<<(0+6))&MASK1(8,(0+6))))) -#define GETARG_B(i)(cast(int,((i)>>(((0+6)+8)+9))&MASK1(9,0))) -#define SETARG_B(i,b)((i)=(((i)&MASK0(9,(((0+6)+8)+9)))|((cast(Instruction,b)<<(((0+6)+8)+9))&MASK1(9,(((0+6)+8)+9))))) -#define GETARG_C(i)(cast(int,((i)>>((0+6)+8))&MASK1(9,0))) -#define SETARG_C(i,b)((i)=(((i)&MASK0(9,((0+6)+8)))|((cast(Instruction,b)<<((0+6)+8))&MASK1(9,((0+6)+8))))) -#define GETARG_Bx(i)(cast(int,((i)>>((0+6)+8))&MASK1((9+9),0))) -#define SETARG_Bx(i,b)((i)=(((i)&MASK0((9+9),((0+6)+8)))|((cast(Instruction,b)<<((0+6)+8))&MASK1((9+9),((0+6)+8))))) -#define GETARG_sBx(i)(GETARG_Bx(i)-(((1<<(9+9))-1)>>1)) -#define SETARG_sBx(i,b)SETARG_Bx((i),cast(unsigned int,(b)+(((1<<(9+9))-1)>>1))) -#define CREATE_ABC(o,a,b,c)((cast(Instruction,o)<<0)|(cast(Instruction,a)<<(0+6))|(cast(Instruction,b)<<(((0+6)+8)+9))|(cast(Instruction,c)<<((0+6)+8))) -#define CREATE_ABx(o,a,bc)((cast(Instruction,o)<<0)|(cast(Instruction,a)<<(0+6))|(cast(Instruction,bc)<<((0+6)+8))) -#define ISK(x)((x)&(1<<(9-1))) -#define INDEXK(r)((int)(r)&~(1<<(9-1))) -#define RKASK(x)((x)|(1<<(9-1))) -static const lu_byte luaP_opmodes[(cast(int,OP_VARARG)+1)]; -#define getBMode(m)(cast(enum OpArgMask,(luaP_opmodes[m]>>4)&3)) -#define getCMode(m)(cast(enum OpArgMask,(luaP_opmodes[m]>>2)&3)) -#define testTMode(m)(luaP_opmodes[m]&(1<<7)) -typedef struct expdesc{ -expkind k; -union{ -struct{int info,aux;}s; -lua_Number nval; -}u; -int t; -int f; -}expdesc; -typedef struct upvaldesc{ -lu_byte k; -lu_byte info; -}upvaldesc; -struct BlockCnt; -typedef struct FuncState{ -Proto*f; -Table*h; -struct FuncState*prev; -struct LexState*ls; -struct lua_State*L; -struct BlockCnt*bl; -int pc; -int lasttarget; -int jpc; -int freereg; -int nk; -int np; -short nlocvars; -lu_byte nactvar; -upvaldesc upvalues[60]; -unsigned short actvar[200]; -}FuncState; -static Proto*luaY_parser(lua_State*L,ZIO*z,Mbuffer*buff, -const char*name); -struct lua_longjmp{ -struct lua_longjmp*previous; -jmp_buf b; -volatile int status; -}; -static void luaD_seterrorobj(lua_State*L,int errcode,StkId oldtop){ -switch(errcode){ -case 4:{ -setsvalue(L,oldtop,luaS_newliteral(L,"not enough memory")); -break; -} -case 5:{ -setsvalue(L,oldtop,luaS_newliteral(L,"error in error handling")); -break; -} -case 3: -case 2:{ -setobj(L,oldtop,L->top-1); -break; -} -} -L->top=oldtop+1; -} -static void restore_stack_limit(lua_State*L){ -if(L->size_ci>20000){ -int inuse=cast_int(L->ci-L->base_ci); -if(inuse+1<20000) -luaD_reallocCI(L,20000); -} -} -static void resetstack(lua_State*L,int status){ -L->ci=L->base_ci; -L->base=L->ci->base; -luaF_close(L,L->base); -luaD_seterrorobj(L,status,L->base); -L->nCcalls=L->baseCcalls; -L->allowhook=1; -restore_stack_limit(L); -L->errfunc=0; -L->errorJmp=NULL; -} -static void luaD_throw(lua_State*L,int errcode){ -if(L->errorJmp){ -L->errorJmp->status=errcode; -LUAI_THROW(L,L->errorJmp); -} -else{ -L->status=cast_byte(errcode); -if(G(L)->panic){ -resetstack(L,errcode); -G(L)->panic(L); -} -exit(EXIT_FAILURE); -} -} -static int luaD_rawrunprotected(lua_State*L,Pfunc f,void*ud){ -struct lua_longjmp lj; -lj.status=0; -lj.previous=L->errorJmp; -L->errorJmp=&lj; -LUAI_TRY(L,&lj, -(*f)(L,ud); -); -L->errorJmp=lj.previous; -return lj.status; -} -static void correctstack(lua_State*L,TValue*oldstack){ -CallInfo*ci; -GCObject*up; -L->top=(L->top-oldstack)+L->stack; -for(up=L->openupval;up!=NULL;up=up->gch.next) -gco2uv(up)->v=(gco2uv(up)->v-oldstack)+L->stack; -for(ci=L->base_ci;ci<=L->ci;ci++){ -ci->top=(ci->top-oldstack)+L->stack; -ci->base=(ci->base-oldstack)+L->stack; -ci->func=(ci->func-oldstack)+L->stack; -} -L->base=(L->base-oldstack)+L->stack; -} -static void luaD_reallocstack(lua_State*L,int newsize){ -TValue*oldstack=L->stack; -int realsize=newsize+1+5; -luaM_reallocvector(L,L->stack,L->stacksize,realsize,TValue); -L->stacksize=realsize; -L->stack_last=L->stack+newsize; -correctstack(L,oldstack); -} -static void luaD_reallocCI(lua_State*L,int newsize){ -CallInfo*oldci=L->base_ci; -luaM_reallocvector(L,L->base_ci,L->size_ci,newsize,CallInfo); -L->size_ci=newsize; -L->ci=(L->ci-oldci)+L->base_ci; -L->end_ci=L->base_ci+L->size_ci-1; -} -static void luaD_growstack(lua_State*L,int n){ -if(n<=L->stacksize) -luaD_reallocstack(L,2*L->stacksize); -else -luaD_reallocstack(L,L->stacksize+n); -} -static CallInfo*growCI(lua_State*L){ -if(L->size_ci>20000) -luaD_throw(L,5); -else{ -luaD_reallocCI(L,2*L->size_ci); -if(L->size_ci>20000) -luaG_runerror(L,"stack overflow"); -} -return++L->ci; -} -static StkId adjust_varargs(lua_State*L,Proto*p,int actual){ -int i; -int nfixargs=p->numparams; -Table*htab=NULL; -StkId base,fixed; -for(;actualtop++); -fixed=L->top-actual; -base=L->top; -for(i=0;itop++,fixed+i); -setnilvalue(fixed+i); -} -if(htab){ -sethvalue(L,L->top++,htab); -} -return base; -} -static StkId tryfuncTM(lua_State*L,StkId func){ -const TValue*tm=luaT_gettmbyobj(L,func,TM_CALL); -StkId p; -ptrdiff_t funcr=savestack(L,func); -if(!ttisfunction(tm)) -luaG_typeerror(L,func,"call"); -for(p=L->top;p>func;p--)setobj(L,p,p-1); -incr_top(L); -func=restorestack(L,funcr); -setobj(L,func,tm); -return func; -} -#define inc_ci(L)((L->ci==L->end_ci)?growCI(L):(condhardstacktests(luaD_reallocCI(L,L->size_ci)),++L->ci)) -static int luaD_precall(lua_State*L,StkId func,int nresults){ -LClosure*cl; -ptrdiff_t funcr; -if(!ttisfunction(func)) -func=tryfuncTM(L,func); -funcr=savestack(L,func); -cl=&clvalue(func)->l; -L->ci->savedpc=L->savedpc; -if(!cl->isC){ -CallInfo*ci; -StkId st,base; -Proto*p=cl->p; -luaD_checkstack(L,p->maxstacksize); -func=restorestack(L,funcr); -if(!p->is_vararg){ -base=func+1; -if(L->top>base+p->numparams) -L->top=base+p->numparams; -} -else{ -int nargs=cast_int(L->top-func)-1; -base=adjust_varargs(L,p,nargs); -func=restorestack(L,funcr); -} -ci=inc_ci(L); -ci->func=func; -L->base=ci->base=base; -ci->top=L->base+p->maxstacksize; -L->savedpc=p->code; -ci->tailcalls=0; -ci->nresults=nresults; -for(st=L->top;sttop;st++) -setnilvalue(st); -L->top=ci->top; -return 0; -} -else{ -CallInfo*ci; -int n; -luaD_checkstack(L,20); -ci=inc_ci(L); -ci->func=restorestack(L,funcr); -L->base=ci->base=ci->func+1; -ci->top=L->top+20; -ci->nresults=nresults; -n=(*curr_func(L)->c.f)(L); -if(n<0) -return 2; -else{ -luaD_poscall(L,L->top-n); -return 1; -} -} -} -static int luaD_poscall(lua_State*L,StkId firstResult){ -StkId res; -int wanted,i; -CallInfo*ci; -ci=L->ci--; -res=ci->func; -wanted=ci->nresults; -L->base=(ci-1)->base; -L->savedpc=(ci-1)->savedpc; -for(i=wanted;i!=0&&firstResulttop;i--) -setobj(L,res++,firstResult++); -while(i-->0) -setnilvalue(res++); -L->top=res; -return(wanted-(-1)); -} -static void luaD_call(lua_State*L,StkId func,int nResults){ -if(++L->nCcalls>=200){ -if(L->nCcalls==200) -luaG_runerror(L,"C stack overflow"); -else if(L->nCcalls>=(200+(200>>3))) -luaD_throw(L,5); -} -if(luaD_precall(L,func,nResults)==0) -luaV_execute(L,1); -L->nCcalls--; -luaC_checkGC(L); -} -static int luaD_pcall(lua_State*L,Pfunc func,void*u, -ptrdiff_t old_top,ptrdiff_t ef){ -int status; -unsigned short oldnCcalls=L->nCcalls; -ptrdiff_t old_ci=saveci(L,L->ci); -lu_byte old_allowhooks=L->allowhook; -ptrdiff_t old_errfunc=L->errfunc; -L->errfunc=ef; -status=luaD_rawrunprotected(L,func,u); -if(status!=0){ -StkId oldtop=restorestack(L,old_top); -luaF_close(L,oldtop); -luaD_seterrorobj(L,status,oldtop); -L->nCcalls=oldnCcalls; -L->ci=restoreci(L,old_ci); -L->base=L->ci->base; -L->savedpc=L->ci->savedpc; -L->allowhook=old_allowhooks; -restore_stack_limit(L); -} -L->errfunc=old_errfunc; -return status; -} -struct SParser{ -ZIO*z; -Mbuffer buff; -const char*name; -}; -static void f_parser(lua_State*L,void*ud){ -int i; -Proto*tf; -Closure*cl; -struct SParser*p=cast(struct SParser*,ud); -luaC_checkGC(L); -tf=luaY_parser(L,p->z, -&p->buff,p->name); -cl=luaF_newLclosure(L,tf->nups,hvalue(gt(L))); -cl->l.p=tf; -for(i=0;inups;i++) -cl->l.upvals[i]=luaF_newupval(L); -setclvalue(L,L->top,cl); -incr_top(L); -} -static int luaD_protectedparser(lua_State*L,ZIO*z,const char*name){ -struct SParser p; -int status; -p.z=z;p.name=name; -luaZ_initbuffer(L,&p.buff); -status=luaD_pcall(L,f_parser,&p,savestack(L,L->top),L->errfunc); -luaZ_freebuffer(L,&p.buff); -return status; -} -static void luaS_resize(lua_State*L,int newsize){ -GCObject**newhash; -stringtable*tb; -int i; -if(G(L)->gcstate==2) -return; -newhash=luaM_newvector(L,newsize,GCObject*); -tb=&G(L)->strt; -for(i=0;isize;i++){ -GCObject*p=tb->hash[i]; -while(p){ -GCObject*next=p->gch.next; -unsigned int h=gco2ts(p)->hash; -int h1=lmod(h,newsize); -p->gch.next=newhash[h1]; -newhash[h1]=p; -p=next; -} -} -luaM_freearray(L,tb->hash,tb->size,TString*); -tb->size=newsize; -tb->hash=newhash; -} -static TString*newlstr(lua_State*L,const char*str,size_t l, -unsigned int h){ -TString*ts; -stringtable*tb; -if(l+1>(((size_t)(~(size_t)0)-2)-sizeof(TString))/sizeof(char)) -luaM_toobig(L); -ts=cast(TString*,luaM_malloc(L,(l+1)*sizeof(char)+sizeof(TString))); -ts->tsv.len=l; -ts->tsv.hash=h; -ts->tsv.marked=luaC_white(G(L)); -ts->tsv.tt=4; -ts->tsv.reserved=0; -memcpy(ts+1,str,l*sizeof(char)); -((char*)(ts+1))[l]='\0'; -tb=&G(L)->strt; -h=lmod(h,tb->size); -ts->tsv.next=tb->hash[h]; -tb->hash[h]=obj2gco(ts); -tb->nuse++; -if(tb->nuse>cast(lu_int32,tb->size)&&tb->size<=(INT_MAX-2)/2) -luaS_resize(L,tb->size*2); -return ts; -} -static TString*luaS_newlstr(lua_State*L,const char*str,size_t l){ -GCObject*o; -unsigned int h=cast(unsigned int,l); -size_t step=(l>>5)+1; -size_t l1; -for(l1=l;l1>=step;l1-=step) -h=h^((h<<5)+(h>>2)+cast(unsigned char,str[l1-1])); -for(o=G(L)->strt.hash[lmod(h,G(L)->strt.size)]; -o!=NULL; -o=o->gch.next){ -TString*ts=rawgco2ts(o); -if(ts->tsv.len==l&&(memcmp(str,getstr(ts),l)==0)){ -if(isdead(G(L),o))changewhite(o); -return ts; -} -} -return newlstr(L,str,l,h); -} -static Udata*luaS_newudata(lua_State*L,size_t s,Table*e){ -Udata*u; -if(s>((size_t)(~(size_t)0)-2)-sizeof(Udata)) -luaM_toobig(L); -u=cast(Udata*,luaM_malloc(L,s+sizeof(Udata))); -u->uv.marked=luaC_white(G(L)); -u->uv.tt=7; -u->uv.len=s; -u->uv.metatable=NULL; -u->uv.env=e; -u->uv.next=G(L)->mainthread->next; -G(L)->mainthread->next=obj2gco(u); -return u; -} -#define hashpow2(t,n)(gnode(t,lmod((n),sizenode(t)))) -#define hashstr(t,str)hashpow2(t,(str)->tsv.hash) -#define hashboolean(t,p)hashpow2(t,p) -#define hashmod(t,n)(gnode(t,((n)%((sizenode(t)-1)|1)))) -#define hashpointer(t,p)hashmod(t,IntPoint(p)) -static const Node dummynode_={ -{{NULL},0}, -{{{NULL},0,NULL}} -}; -static Node*hashnum(const Table*t,lua_Number n){ -unsigned int a[cast_int(sizeof(lua_Number)/sizeof(int))]; -int i; -if(luai_numeq(n,0)) -return gnode(t,0); -memcpy(a,&n,sizeof(a)); -for(i=1;isizearray) -return i-1; -else{ -Node*n=mainposition(t,key); -do{ -if(luaO_rawequalObj(key2tval(n),key)|| -(ttype(gkey(n))==(8+3)&&iscollectable(key)&& -gcvalue(gkey(n))==gcvalue(key))){ -i=cast_int(n-gnode(t,0)); -return i+t->sizearray; -} -else n=gnext(n); -}while(n); -luaG_runerror(L,"invalid key to "LUA_QL("next")); -return 0; -} -} -static int luaH_next(lua_State*L,Table*t,StkId key){ -int i=findindex(L,t,key); -for(i++;isizearray;i++){ -if(!ttisnil(&t->array[i])){ -setnvalue(key,cast_num(i+1)); -setobj(L,key+1,&t->array[i]); -return 1; -} -} -for(i-=t->sizearray;i<(int)sizenode(t);i++){ -if(!ttisnil(gval(gnode(t,i)))){ -setobj(L,key,key2tval(gnode(t,i))); -setobj(L,key+1,gval(gnode(t,i))); -return 1; -} -} -return 0; -} -static int computesizes(int nums[],int*narray){ -int i; -int twotoi; -int a=0; -int na=0; -int n=0; -for(i=0,twotoi=1;twotoi/2<*narray;i++,twotoi*=2){ -if(nums[i]>0){ -a+=nums[i]; -if(a>twotoi/2){ -n=twotoi; -na=a; -} -} -if(a==*narray)break; -} -*narray=n; -return na; -} -static int countint(const TValue*key,int*nums){ -int k=arrayindex(key); -if(0t->sizearray){ -lim=t->sizearray; -if(i>lim) -break; -} -for(;i<=lim;i++){ -if(!ttisnil(&t->array[i-1])) -lc++; -} -nums[lg]+=lc; -ause+=lc; -} -return ause; -} -static int numusehash(const Table*t,int*nums,int*pnasize){ -int totaluse=0; -int ause=0; -int i=sizenode(t); -while(i--){ -Node*n=&t->node[i]; -if(!ttisnil(gval(n))){ -ause+=countint(key2tval(n),nums); -totaluse++; -} -} -*pnasize+=ause; -return totaluse; -} -static void setarrayvector(lua_State*L,Table*t,int size){ -int i; -luaM_reallocvector(L,t->array,t->sizearray,size,TValue); -for(i=t->sizearray;iarray[i]); -t->sizearray=size; -} -static void setnodevector(lua_State*L,Table*t,int size){ -int lsize; -if(size==0){ -t->node=cast(Node*,(&dummynode_)); -lsize=0; -} -else{ -int i; -lsize=ceillog2(size); -if(lsize>(32-2)) -luaG_runerror(L,"table overflow"); -size=twoto(lsize); -t->node=luaM_newvector(L,size,Node); -for(i=0;ilsizenode=cast_byte(lsize); -t->lastfree=gnode(t,size); -} -static void resize(lua_State*L,Table*t,int nasize,int nhsize){ -int i; -int oldasize=t->sizearray; -int oldhsize=t->lsizenode; -Node*nold=t->node; -if(nasize>oldasize) -setarrayvector(L,t,nasize); -setnodevector(L,t,nhsize); -if(nasizesizearray=nasize; -for(i=nasize;iarray[i])) -setobj(L,luaH_setnum(L,t,i+1),&t->array[i]); -} -luaM_reallocvector(L,t->array,oldasize,nasize,TValue); -} -for(i=twoto(oldhsize)-1;i>=0;i--){ -Node*old=nold+i; -if(!ttisnil(gval(old))) -setobj(L,luaH_set(L,t,key2tval(old)),gval(old)); -} -if(nold!=(&dummynode_)) -luaM_freearray(L,nold,twoto(oldhsize),Node); -} -static void luaH_resizearray(lua_State*L,Table*t,int nasize){ -int nsize=(t->node==(&dummynode_))?0:sizenode(t); -resize(L,t,nasize,nsize); -} -static void rehash(lua_State*L,Table*t,const TValue*ek){ -int nasize,na; -int nums[(32-2)+1]; -int i; -int totaluse; -for(i=0;i<=(32-2);i++)nums[i]=0; -nasize=numusearray(t,nums); -totaluse=nasize; -totaluse+=numusehash(t,nums,&nasize); -nasize+=countint(ek,nums); -totaluse++; -na=computesizes(nums,&nasize); -resize(L,t,nasize,totaluse-na); -} -static Table*luaH_new(lua_State*L,int narray,int nhash){ -Table*t=luaM_new(L,Table); -luaC_link(L,obj2gco(t),5); -t->metatable=NULL; -t->flags=cast_byte(~0); -t->array=NULL; -t->sizearray=0; -t->lsizenode=0; -t->node=cast(Node*,(&dummynode_)); -setarrayvector(L,t,narray); -setnodevector(L,t,nhash); -return t; -} -static void luaH_free(lua_State*L,Table*t){ -if(t->node!=(&dummynode_)) -luaM_freearray(L,t->node,sizenode(t),Node); -luaM_freearray(L,t->array,t->sizearray,TValue); -luaM_free(L,t); -} -static Node*getfreepos(Table*t){ -while(t->lastfree-->t->node){ -if(ttisnil(gkey(t->lastfree))) -return t->lastfree; -} -return NULL; -} -static TValue*newkey(lua_State*L,Table*t,const TValue*key){ -Node*mp=mainposition(t,key); -if(!ttisnil(gval(mp))||mp==(&dummynode_)){ -Node*othern; -Node*n=getfreepos(t); -if(n==NULL){ -rehash(L,t,key); -return luaH_set(L,t,key); -} -othern=mainposition(t,key2tval(mp)); -if(othern!=mp){ -while(gnext(othern)!=mp)othern=gnext(othern); -gnext(othern)=n; -*n=*mp; -gnext(mp)=NULL; -setnilvalue(gval(mp)); -} -else{ -gnext(n)=gnext(mp); -gnext(mp)=n; -mp=n; -} -} -gkey(mp)->value=key->value;gkey(mp)->tt=key->tt; -luaC_barriert(L,t,key); -return gval(mp); -} -static const TValue*luaH_getnum(Table*t,int key){ -if(cast(unsigned int,key-1)sizearray)) -return&t->array[key-1]; -else{ -lua_Number nk=cast_num(key); -Node*n=hashnum(t,nk); -do{ -if(ttisnumber(gkey(n))&&luai_numeq(nvalue(gkey(n)),nk)) -return gval(n); -else n=gnext(n); -}while(n); -return(&luaO_nilobject_); -} -} -static const TValue*luaH_getstr(Table*t,TString*key){ -Node*n=hashstr(t,key); -do{ -if(ttisstring(gkey(n))&&rawtsvalue(gkey(n))==key) -return gval(n); -else n=gnext(n); -}while(n); -return(&luaO_nilobject_); -} -static const TValue*luaH_get(Table*t,const TValue*key){ -switch(ttype(key)){ -case 0:return(&luaO_nilobject_); -case 4:return luaH_getstr(t,rawtsvalue(key)); -case 3:{ -int k; -lua_Number n=nvalue(key); -lua_number2int(k,n); -if(luai_numeq(cast_num(k),nvalue(key))) -return luaH_getnum(t,k); -} -default:{ -Node*n=mainposition(t,key); -do{ -if(luaO_rawequalObj(key2tval(n),key)) -return gval(n); -else n=gnext(n); -}while(n); -return(&luaO_nilobject_); -} -} -} -static TValue*luaH_set(lua_State*L,Table*t,const TValue*key){ -const TValue*p=luaH_get(t,key); -t->flags=0; -if(p!=(&luaO_nilobject_)) -return cast(TValue*,p); -else{ -if(ttisnil(key))luaG_runerror(L,"table index is nil"); -else if(ttisnumber(key)&&luai_numisnan(nvalue(key))) -luaG_runerror(L,"table index is NaN"); -return newkey(L,t,key); -} -} -static TValue*luaH_setnum(lua_State*L,Table*t,int key){ -const TValue*p=luaH_getnum(t,key); -if(p!=(&luaO_nilobject_)) -return cast(TValue*,p); -else{ -TValue k; -setnvalue(&k,cast_num(key)); -return newkey(L,t,&k); -} -} -static TValue*luaH_setstr(lua_State*L,Table*t,TString*key){ -const TValue*p=luaH_getstr(t,key); -if(p!=(&luaO_nilobject_)) -return cast(TValue*,p); -else{ -TValue k; -setsvalue(L,&k,key); -return newkey(L,t,&k); -} -} -static int unbound_search(Table*t,unsigned int j){ -unsigned int i=j; -j++; -while(!ttisnil(luaH_getnum(t,j))){ -i=j; -j*=2; -if(j>cast(unsigned int,(INT_MAX-2))){ -i=1; -while(!ttisnil(luaH_getnum(t,i)))i++; -return i-1; -} -} -while(j-i>1){ -unsigned int m=(i+j)/2; -if(ttisnil(luaH_getnum(t,m)))j=m; -else i=m; -} -return i; -} -static int luaH_getn(Table*t){ -unsigned int j=t->sizearray; -if(j>0&&ttisnil(&t->array[j-1])){ -unsigned int i=0; -while(j-i>1){ -unsigned int m=(i+j)/2; -if(ttisnil(&t->array[m-1]))j=m; -else i=m; -} -return i; -} -else if(t->node==(&dummynode_)) -return j; -else return unbound_search(t,j); -} -#define makewhite(g,x)((x)->gch.marked=cast_byte(((x)->gch.marked&cast_byte(~(bitmask(2)|bit2mask(0,1))))|luaC_white(g))) -#define white2gray(x)reset2bits((x)->gch.marked,0,1) -#define black2gray(x)resetbit((x)->gch.marked,2) -#define stringmark(s)reset2bits((s)->tsv.marked,0,1) -#define isfinalized(u)testbit((u)->marked,3) -#define markfinalized(u)l_setbit((u)->marked,3) -#define markvalue(g,o){checkconsistency(o);if(iscollectable(o)&&iswhite(gcvalue(o)))reallymarkobject(g,gcvalue(o));} -#define markobject(g,t){if(iswhite(obj2gco(t)))reallymarkobject(g,obj2gco(t));} -#define setthreshold(g)(g->GCthreshold=(g->estimate/100)*g->gcpause) -static void removeentry(Node*n){ -if(iscollectable(gkey(n))) -setttype(gkey(n),(8+3)); -} -static void reallymarkobject(global_State*g,GCObject*o){ -white2gray(o); -switch(o->gch.tt){ -case 4:{ -return; -} -case 7:{ -Table*mt=gco2u(o)->metatable; -gray2black(o); -if(mt)markobject(g,mt); -markobject(g,gco2u(o)->env); -return; -} -case(8+2):{ -UpVal*uv=gco2uv(o); -markvalue(g,uv->v); -if(uv->v==&uv->u.value) -gray2black(o); -return; -} -case 6:{ -gco2cl(o)->c.gclist=g->gray; -g->gray=o; -break; -} -case 5:{ -gco2h(o)->gclist=g->gray; -g->gray=o; -break; -} -case 8:{ -gco2th(o)->gclist=g->gray; -g->gray=o; -break; -} -case(8+1):{ -gco2p(o)->gclist=g->gray; -g->gray=o; -break; -} -default:; -} -} -static void marktmu(global_State*g){ -GCObject*u=g->tmudata; -if(u){ -do{ -u=u->gch.next; -makewhite(g,u); -reallymarkobject(g,u); -}while(u!=g->tmudata); -} -} -static size_t luaC_separateudata(lua_State*L,int all){ -global_State*g=G(L); -size_t deadmem=0; -GCObject**p=&g->mainthread->next; -GCObject*curr; -while((curr=*p)!=NULL){ -if(!(iswhite(curr)||all)||isfinalized(gco2u(curr))) -p=&curr->gch.next; -else if(fasttm(L,gco2u(curr)->metatable,TM_GC)==NULL){ -markfinalized(gco2u(curr)); -p=&curr->gch.next; -} -else{ -deadmem+=sizeudata(gco2u(curr)); -markfinalized(gco2u(curr)); -*p=curr->gch.next; -if(g->tmudata==NULL) -g->tmudata=curr->gch.next=curr; -else{ -curr->gch.next=g->tmudata->gch.next; -g->tmudata->gch.next=curr; -g->tmudata=curr; -} -} -} -return deadmem; -} -static int traversetable(global_State*g,Table*h){ -int i; -int weakkey=0; -int weakvalue=0; -const TValue*mode; -if(h->metatable) -markobject(g,h->metatable); -mode=gfasttm(g,h->metatable,TM_MODE); -if(mode&&ttisstring(mode)){ -weakkey=(strchr(svalue(mode),'k')!=NULL); -weakvalue=(strchr(svalue(mode),'v')!=NULL); -if(weakkey||weakvalue){ -h->marked&=~(bitmask(3)|bitmask(4)); -h->marked|=cast_byte((weakkey<<3)| -(weakvalue<<4)); -h->gclist=g->weak; -g->weak=obj2gco(h); -} -} -if(weakkey&&weakvalue)return 1; -if(!weakvalue){ -i=h->sizearray; -while(i--) -markvalue(g,&h->array[i]); -} -i=sizenode(h); -while(i--){ -Node*n=gnode(h,i); -if(ttisnil(gval(n))) -removeentry(n); -else{ -if(!weakkey)markvalue(g,gkey(n)); -if(!weakvalue)markvalue(g,gval(n)); -} -} -return weakkey||weakvalue; -} -static void traverseproto(global_State*g,Proto*f){ -int i; -if(f->source)stringmark(f->source); -for(i=0;isizek;i++) -markvalue(g,&f->k[i]); -for(i=0;isizeupvalues;i++){ -if(f->upvalues[i]) -stringmark(f->upvalues[i]); -} -for(i=0;isizep;i++){ -if(f->p[i]) -markobject(g,f->p[i]); -} -for(i=0;isizelocvars;i++){ -if(f->locvars[i].varname) -stringmark(f->locvars[i].varname); -} -} -static void traverseclosure(global_State*g,Closure*cl){ -markobject(g,cl->c.env); -if(cl->c.isC){ -int i; -for(i=0;ic.nupvalues;i++) -markvalue(g,&cl->c.upvalue[i]); -} -else{ -int i; -markobject(g,cl->l.p); -for(i=0;il.nupvalues;i++) -markobject(g,cl->l.upvals[i]); -} -} -static void checkstacksizes(lua_State*L,StkId max){ -int ci_used=cast_int(L->ci-L->base_ci); -int s_used=cast_int(max-L->stack); -if(L->size_ci>20000) -return; -if(4*ci_usedsize_ci&&2*8size_ci) -luaD_reallocCI(L,L->size_ci/2); -condhardstacktests(luaD_reallocCI(L,ci_used+1)); -if(4*s_usedstacksize&& -2*((2*20)+5)stacksize) -luaD_reallocstack(L,L->stacksize/2); -condhardstacktests(luaD_reallocstack(L,s_used)); -} -static void traversestack(global_State*g,lua_State*l){ -StkId o,lim; -CallInfo*ci; -markvalue(g,gt(l)); -lim=l->top; -for(ci=l->base_ci;ci<=l->ci;ci++){ -if(limtop)lim=ci->top; -} -for(o=l->stack;otop;o++) -markvalue(g,o); -for(;o<=lim;o++) -setnilvalue(o); -checkstacksizes(l,lim); -} -static l_mem propagatemark(global_State*g){ -GCObject*o=g->gray; -gray2black(o); -switch(o->gch.tt){ -case 5:{ -Table*h=gco2h(o); -g->gray=h->gclist; -if(traversetable(g,h)) -black2gray(o); -return sizeof(Table)+sizeof(TValue)*h->sizearray+ -sizeof(Node)*sizenode(h); -} -case 6:{ -Closure*cl=gco2cl(o); -g->gray=cl->c.gclist; -traverseclosure(g,cl); -return(cl->c.isC)?sizeCclosure(cl->c.nupvalues): -sizeLclosure(cl->l.nupvalues); -} -case 8:{ -lua_State*th=gco2th(o); -g->gray=th->gclist; -th->gclist=g->grayagain; -g->grayagain=o; -black2gray(o); -traversestack(g,th); -return sizeof(lua_State)+sizeof(TValue)*th->stacksize+ -sizeof(CallInfo)*th->size_ci; -} -case(8+1):{ -Proto*p=gco2p(o); -g->gray=p->gclist; -traverseproto(g,p); -return sizeof(Proto)+sizeof(Instruction)*p->sizecode+ -sizeof(Proto*)*p->sizep+ -sizeof(TValue)*p->sizek+ -sizeof(int)*p->sizelineinfo+ -sizeof(LocVar)*p->sizelocvars+ -sizeof(TString*)*p->sizeupvalues; -} -default:return 0; -} -} -static size_t propagateall(global_State*g){ -size_t m=0; -while(g->gray)m+=propagatemark(g); -return m; -} -static int iscleared(const TValue*o,int iskey){ -if(!iscollectable(o))return 0; -if(ttisstring(o)){ -stringmark(rawtsvalue(o)); -return 0; -} -return iswhite(gcvalue(o))|| -(ttisuserdata(o)&&(!iskey&&isfinalized(uvalue(o)))); -} -static void cleartable(GCObject*l){ -while(l){ -Table*h=gco2h(l); -int i=h->sizearray; -if(testbit(h->marked,4)){ -while(i--){ -TValue*o=&h->array[i]; -if(iscleared(o,0)) -setnilvalue(o); -} -} -i=sizenode(h); -while(i--){ -Node*n=gnode(h,i); -if(!ttisnil(gval(n))&& -(iscleared(key2tval(n),1)||iscleared(gval(n),0))){ -setnilvalue(gval(n)); -removeentry(n); -} -} -l=h->gclist; -} -} -static void freeobj(lua_State*L,GCObject*o){ -switch(o->gch.tt){ -case(8+1):luaF_freeproto(L,gco2p(o));break; -case 6:luaF_freeclosure(L,gco2cl(o));break; -case(8+2):luaF_freeupval(L,gco2uv(o));break; -case 5:luaH_free(L,gco2h(o));break; -case 8:{ -luaE_freethread(L,gco2th(o)); -break; -} -case 4:{ -G(L)->strt.nuse--; -luaM_freemem(L,o,sizestring(gco2ts(o))); -break; -} -case 7:{ -luaM_freemem(L,o,sizeudata(gco2u(o))); -break; -} -default:; -} -} -#define sweepwholelist(L,p)sweeplist(L,p,((lu_mem)(~(lu_mem)0)-2)) -static GCObject**sweeplist(lua_State*L,GCObject**p,lu_mem count){ -GCObject*curr; -global_State*g=G(L); -int deadmask=otherwhite(g); -while((curr=*p)!=NULL&&count-->0){ -if(curr->gch.tt==8) -sweepwholelist(L,&gco2th(curr)->openupval); -if((curr->gch.marked^bit2mask(0,1))&deadmask){ -makewhite(g,curr); -p=&curr->gch.next; -} -else{ -*p=curr->gch.next; -if(curr==g->rootgc) -g->rootgc=curr->gch.next; -freeobj(L,curr); -} -} -return p; -} -static void checkSizes(lua_State*L){ -global_State*g=G(L); -if(g->strt.nusestrt.size/4)&& -g->strt.size>32*2) -luaS_resize(L,g->strt.size/2); -if(luaZ_sizebuffer(&g->buff)>32*2){ -size_t newsize=luaZ_sizebuffer(&g->buff)/2; -luaZ_resizebuffer(L,&g->buff,newsize); -} -} -static void GCTM(lua_State*L){ -global_State*g=G(L); -GCObject*o=g->tmudata->gch.next; -Udata*udata=rawgco2u(o); -const TValue*tm; -if(o==g->tmudata) -g->tmudata=NULL; -else -g->tmudata->gch.next=udata->uv.next; -udata->uv.next=g->mainthread->next; -g->mainthread->next=o; -makewhite(g,o); -tm=fasttm(L,udata->uv.metatable,TM_GC); -if(tm!=NULL){ -lu_byte oldah=L->allowhook; -lu_mem oldt=g->GCthreshold; -L->allowhook=0; -g->GCthreshold=2*g->totalbytes; -setobj(L,L->top,tm); -setuvalue(L,L->top+1,udata); -L->top+=2; -luaD_call(L,L->top-2,0); -L->allowhook=oldah; -g->GCthreshold=oldt; -} -} -static void luaC_callGCTM(lua_State*L){ -while(G(L)->tmudata) -GCTM(L); -} -static void luaC_freeall(lua_State*L){ -global_State*g=G(L); -int i; -g->currentwhite=bit2mask(0,1)|bitmask(6); -sweepwholelist(L,&g->rootgc); -for(i=0;istrt.size;i++) -sweepwholelist(L,&g->strt.hash[i]); -} -static void markmt(global_State*g){ -int i; -for(i=0;i<(8+1);i++) -if(g->mt[i])markobject(g,g->mt[i]); -} -static void markroot(lua_State*L){ -global_State*g=G(L); -g->gray=NULL; -g->grayagain=NULL; -g->weak=NULL; -markobject(g,g->mainthread); -markvalue(g,gt(g->mainthread)); -markvalue(g,registry(L)); -markmt(g); -g->gcstate=1; -} -static void remarkupvals(global_State*g){ -UpVal*uv; -for(uv=g->uvhead.u.l.next;uv!=&g->uvhead;uv=uv->u.l.next){ -if(isgray(obj2gco(uv))) -markvalue(g,uv->v); -} -} -static void atomic(lua_State*L){ -global_State*g=G(L); -size_t udsize; -remarkupvals(g); -propagateall(g); -g->gray=g->weak; -g->weak=NULL; -markobject(g,L); -markmt(g); -propagateall(g); -g->gray=g->grayagain; -g->grayagain=NULL; -propagateall(g); -udsize=luaC_separateudata(L,0); -marktmu(g); -udsize+=propagateall(g); -cleartable(g->weak); -g->currentwhite=cast_byte(otherwhite(g)); -g->sweepstrgc=0; -g->sweepgc=&g->rootgc; -g->gcstate=2; -g->estimate=g->totalbytes-udsize; -} -static l_mem singlestep(lua_State*L){ -global_State*g=G(L); -switch(g->gcstate){ -case 0:{ -markroot(L); -return 0; -} -case 1:{ -if(g->gray) -return propagatemark(g); -else{ -atomic(L); -return 0; -} -} -case 2:{ -lu_mem old=g->totalbytes; -sweepwholelist(L,&g->strt.hash[g->sweepstrgc++]); -if(g->sweepstrgc>=g->strt.size) -g->gcstate=3; -g->estimate-=old-g->totalbytes; -return 10; -} -case 3:{ -lu_mem old=g->totalbytes; -g->sweepgc=sweeplist(L,g->sweepgc,40); -if(*g->sweepgc==NULL){ -checkSizes(L); -g->gcstate=4; -} -g->estimate-=old-g->totalbytes; -return 40*10; -} -case 4:{ -if(g->tmudata){ -GCTM(L); -if(g->estimate>100) -g->estimate-=100; -return 100; -} -else{ -g->gcstate=0; -g->gcdept=0; -return 0; -} -} -default:return 0; -} -} -static void luaC_step(lua_State*L){ -global_State*g=G(L); -l_mem lim=(1024u/100)*g->gcstepmul; -if(lim==0) -lim=(((lu_mem)(~(lu_mem)0)-2)-1)/2; -g->gcdept+=g->totalbytes-g->GCthreshold; -do{ -lim-=singlestep(L); -if(g->gcstate==0) -break; -}while(lim>0); -if(g->gcstate!=0){ -if(g->gcdept<1024u) -g->GCthreshold=g->totalbytes+1024u; -else{ -g->gcdept-=1024u; -g->GCthreshold=g->totalbytes; -} -} -else{ -setthreshold(g); -} -} -static void luaC_barrierf(lua_State*L,GCObject*o,GCObject*v){ -global_State*g=G(L); -if(g->gcstate==1) -reallymarkobject(g,v); -else -makewhite(g,o); -} -static void luaC_barrierback(lua_State*L,Table*t){ -global_State*g=G(L); -GCObject*o=obj2gco(t); -black2gray(o); -t->gclist=g->grayagain; -g->grayagain=o; -} -static void luaC_link(lua_State*L,GCObject*o,lu_byte tt){ -global_State*g=G(L); -o->gch.next=g->rootgc; -g->rootgc=o; -o->gch.marked=luaC_white(g); -o->gch.tt=tt; -} -static void luaC_linkupval(lua_State*L,UpVal*uv){ -global_State*g=G(L); -GCObject*o=obj2gco(uv); -o->gch.next=g->rootgc; -g->rootgc=o; -if(isgray(o)){ -if(g->gcstate==1){ -gray2black(o); -luaC_barrier(L,uv,uv->v); -} -else{ -makewhite(g,o); -} -} -} -typedef union{ -lua_Number r; -TString*ts; -}SemInfo; -typedef struct Token{ -int token; -SemInfo seminfo; -}Token; -typedef struct LexState{ -int current; -int linenumber; -int lastline; -Token t; -Token lookahead; -struct FuncState*fs; -struct lua_State*L; -ZIO*z; -Mbuffer*buff; -TString*source; -char decpoint; -}LexState; -static void luaX_init(lua_State*L); -static void luaX_lexerror(LexState*ls,const char*msg,int token); -#define state_size(x)(sizeof(x)+0) -#define fromstate(l)(cast(lu_byte*,(l))-0) -#define tostate(l)(cast(lua_State*,cast(lu_byte*,l)+0)) -typedef struct LG{ -lua_State l; -global_State g; -}LG; -static void stack_init(lua_State*L1,lua_State*L){ -L1->base_ci=luaM_newvector(L,8,CallInfo); -L1->ci=L1->base_ci; -L1->size_ci=8; -L1->end_ci=L1->base_ci+L1->size_ci-1; -L1->stack=luaM_newvector(L,(2*20)+5,TValue); -L1->stacksize=(2*20)+5; -L1->top=L1->stack; -L1->stack_last=L1->stack+(L1->stacksize-5)-1; -L1->ci->func=L1->top; -setnilvalue(L1->top++); -L1->base=L1->ci->base=L1->top; -L1->ci->top=L1->top+20; -} -static void freestack(lua_State*L,lua_State*L1){ -luaM_freearray(L,L1->base_ci,L1->size_ci,CallInfo); -luaM_freearray(L,L1->stack,L1->stacksize,TValue); -} -static void f_luaopen(lua_State*L,void*ud){ -global_State*g=G(L); -UNUSED(ud); -stack_init(L,L); -sethvalue(L,gt(L),luaH_new(L,0,2)); -sethvalue(L,registry(L),luaH_new(L,0,2)); -luaS_resize(L,32); -luaT_init(L); -luaX_init(L); -luaS_fix(luaS_newliteral(L,"not enough memory")); -g->GCthreshold=4*g->totalbytes; -} -static void preinit_state(lua_State*L,global_State*g){ -G(L)=g; -L->stack=NULL; -L->stacksize=0; -L->errorJmp=NULL; -L->hook=NULL; -L->hookmask=0; -L->basehookcount=0; -L->allowhook=1; -resethookcount(L); -L->openupval=NULL; -L->size_ci=0; -L->nCcalls=L->baseCcalls=0; -L->status=0; -L->base_ci=L->ci=NULL; -L->savedpc=NULL; -L->errfunc=0; -setnilvalue(gt(L)); -} -static void close_state(lua_State*L){ -global_State*g=G(L); -luaF_close(L,L->stack); -luaC_freeall(L); -luaM_freearray(L,G(L)->strt.hash,G(L)->strt.size,TString*); -luaZ_freebuffer(L,&g->buff); -freestack(L,L); -(*g->frealloc)(g->ud,fromstate(L),state_size(LG),0); -} -static void luaE_freethread(lua_State*L,lua_State*L1){ -luaF_close(L1,L1->stack); -freestack(L,L1); -luaM_freemem(L,fromstate(L1),state_size(lua_State)); -} -static lua_State*lua_newstate(lua_Alloc f,void*ud){ -int i; -lua_State*L; -global_State*g; -void*l=(*f)(ud,NULL,0,state_size(LG)); -if(l==NULL)return NULL; -L=tostate(l); -g=&((LG*)L)->g; -L->next=NULL; -L->tt=8; -g->currentwhite=bit2mask(0,5); -L->marked=luaC_white(g); -set2bits(L->marked,5,6); -preinit_state(L,g); -g->frealloc=f; -g->ud=ud; -g->mainthread=L; -g->uvhead.u.l.prev=&g->uvhead; -g->uvhead.u.l.next=&g->uvhead; -g->GCthreshold=0; -g->strt.size=0; -g->strt.nuse=0; -g->strt.hash=NULL; -setnilvalue(registry(L)); -luaZ_initbuffer(L,&g->buff); -g->panic=NULL; -g->gcstate=0; -g->rootgc=obj2gco(L); -g->sweepstrgc=0; -g->sweepgc=&g->rootgc; -g->gray=NULL; -g->grayagain=NULL; -g->weak=NULL; -g->tmudata=NULL; -g->totalbytes=sizeof(LG); -g->gcpause=200; -g->gcstepmul=200; -g->gcdept=0; -for(i=0;i<(8+1);i++)g->mt[i]=NULL; -if(luaD_rawrunprotected(L,f_luaopen,NULL)!=0){ -close_state(L); -L=NULL; -} -else -{} -return L; -} -static void callallgcTM(lua_State*L,void*ud){ -UNUSED(ud); -luaC_callGCTM(L); -} -static void lua_close(lua_State*L){ -L=G(L)->mainthread; -luaF_close(L,L->stack); -luaC_separateudata(L,1); -L->errfunc=0; -do{ -L->ci=L->base_ci; -L->base=L->top=L->ci->base; -L->nCcalls=L->baseCcalls=0; -}while(luaD_rawrunprotected(L,callallgcTM,NULL)!=0); -close_state(L); -} -#define getcode(fs,e)((fs)->f->code[(e)->u.s.info]) -#define luaK_codeAsBx(fs,o,A,sBx)luaK_codeABx(fs,o,A,(sBx)+(((1<<(9+9))-1)>>1)) -#define luaK_setmultret(fs,e)luaK_setreturns(fs,e,(-1)) -static int luaK_codeABx(FuncState*fs,OpCode o,int A,unsigned int Bx); -static int luaK_codeABC(FuncState*fs,OpCode o,int A,int B,int C); -static void luaK_setreturns(FuncState*fs,expdesc*e,int nresults); -static void luaK_patchtohere(FuncState*fs,int list); -static void luaK_concat(FuncState*fs,int*l1,int l2); -static int currentpc(lua_State*L,CallInfo*ci){ -if(!isLua(ci))return-1; -if(ci==L->ci) -ci->savedpc=L->savedpc; -return pcRel(ci->savedpc,ci_func(ci)->l.p); -} -static int currentline(lua_State*L,CallInfo*ci){ -int pc=currentpc(L,ci); -if(pc<0) -return-1; -else -return getline_(ci_func(ci)->l.p,pc); -} -static int lua_getstack(lua_State*L,int level,lua_Debug*ar){ -int status; -CallInfo*ci; -for(ci=L->ci;level>0&&ci>L->base_ci;ci--){ -level--; -if(f_isLua(ci)) -level-=ci->tailcalls; -} -if(level==0&&ci>L->base_ci){ -status=1; -ar->i_ci=cast_int(ci-L->base_ci); -} -else if(level<0){ -status=1; -ar->i_ci=0; -} -else status=0; -return status; -} -static Proto*getluaproto(CallInfo*ci){ -return(isLua(ci)?ci_func(ci)->l.p:NULL); -} -static void funcinfo(lua_Debug*ar,Closure*cl){ -if(cl->c.isC){ -ar->source="=[C]"; -ar->linedefined=-1; -ar->lastlinedefined=-1; -ar->what="C"; -} -else{ -ar->source=getstr(cl->l.p->source); -ar->linedefined=cl->l.p->linedefined; -ar->lastlinedefined=cl->l.p->lastlinedefined; -ar->what=(ar->linedefined==0)?"main":"Lua"; -} -luaO_chunkid(ar->short_src,ar->source,60); -} -static void info_tailcall(lua_Debug*ar){ -ar->name=ar->namewhat=""; -ar->what="tail"; -ar->lastlinedefined=ar->linedefined=ar->currentline=-1; -ar->source="=(tail call)"; -luaO_chunkid(ar->short_src,ar->source,60); -ar->nups=0; -} -static void collectvalidlines(lua_State*L,Closure*f){ -if(f==NULL||f->c.isC){ -setnilvalue(L->top); -} -else{ -Table*t=luaH_new(L,0,0); -int*lineinfo=f->l.p->lineinfo; -int i; -for(i=0;il.p->sizelineinfo;i++) -setbvalue(luaH_setnum(L,t,lineinfo[i]),1); -sethvalue(L,L->top,t); -} -incr_top(L); -} -static int auxgetinfo(lua_State*L,const char*what,lua_Debug*ar, -Closure*f,CallInfo*ci){ -int status=1; -if(f==NULL){ -info_tailcall(ar); -return status; -} -for(;*what;what++){ -switch(*what){ -case'S':{ -funcinfo(ar,f); -break; -} -case'l':{ -ar->currentline=(ci)?currentline(L,ci):-1; -break; -} -case'u':{ -ar->nups=f->c.nupvalues; -break; -} -case'n':{ -ar->namewhat=(ci)?NULL:NULL; -if(ar->namewhat==NULL){ -ar->namewhat=""; -ar->name=NULL; -} -break; -} -case'L': -case'f': -break; -default:status=0; -} -} -return status; -} -static int lua_getinfo(lua_State*L,const char*what,lua_Debug*ar){ -int status; -Closure*f=NULL; -CallInfo*ci=NULL; -if(*what=='>'){ -StkId func=L->top-1; -luai_apicheck(L,ttisfunction(func)); -what++; -f=clvalue(func); -L->top--; -} -else if(ar->i_ci!=0){ -ci=L->base_ci+ar->i_ci; -f=clvalue(ci->func); -} -status=auxgetinfo(L,what,ar,f,ci); -if(strchr(what,'f')){ -if(f==NULL)setnilvalue(L->top); -else setclvalue(L,L->top,f); -incr_top(L); -} -if(strchr(what,'L')) -collectvalidlines(L,f); -return status; -} -static int isinstack(CallInfo*ci,const TValue*o){ -StkId p; -for(p=ci->base;ptop;p++) -if(o==p)return 1; -return 0; -} -static void luaG_typeerror(lua_State*L,const TValue*o,const char*op){ -const char*name=NULL; -const char*t=luaT_typenames[ttype(o)]; -const char*kind=(isinstack(L->ci,o))? -NULL: -NULL; -if(kind) -luaG_runerror(L,"attempt to %s %s "LUA_QL("%s")" (a %s value)", -op,kind,name,t); -else -luaG_runerror(L,"attempt to %s a %s value",op,t); -} -static void luaG_concaterror(lua_State*L,StkId p1,StkId p2){ -if(ttisstring(p1)||ttisnumber(p1))p1=p2; -luaG_typeerror(L,p1,"concatenate"); -} -static void luaG_aritherror(lua_State*L,const TValue*p1,const TValue*p2){ -TValue temp; -if(luaV_tonumber(p1,&temp)==NULL) -p2=p1; -luaG_typeerror(L,p2,"perform arithmetic on"); -} -static int luaG_ordererror(lua_State*L,const TValue*p1,const TValue*p2){ -const char*t1=luaT_typenames[ttype(p1)]; -const char*t2=luaT_typenames[ttype(p2)]; -if(t1[2]==t2[2]) -luaG_runerror(L,"attempt to compare two %s values",t1); -else -luaG_runerror(L,"attempt to compare %s with %s",t1,t2); -return 0; -} -static void addinfo(lua_State*L,const char*msg){ -CallInfo*ci=L->ci; -if(isLua(ci)){ -char buff[60]; -int line=currentline(L,ci); -luaO_chunkid(buff,getstr(getluaproto(ci)->source),60); -luaO_pushfstring(L,"%s:%d: %s",buff,line,msg); -} -} -static void luaG_errormsg(lua_State*L){ -if(L->errfunc!=0){ -StkId errfunc=restorestack(L,L->errfunc); -if(!ttisfunction(errfunc))luaD_throw(L,5); -setobj(L,L->top,L->top-1); -setobj(L,L->top-1,errfunc); -incr_top(L); -luaD_call(L,L->top-2,1); -} -luaD_throw(L,2); -} -static void luaG_runerror(lua_State*L,const char*fmt,...){ -va_list argp; -va_start(argp,fmt); -addinfo(L,luaO_pushvfstring(L,fmt,argp)); -va_end(argp); -luaG_errormsg(L); -} -static int luaZ_fill(ZIO*z){ -size_t size; -lua_State*L=z->L; -const char*buff; -buff=z->reader(L,z->data,&size); -if(buff==NULL||size==0)return(-1); -z->n=size-1; -z->p=buff; -return char2int(*(z->p++)); -} -static void luaZ_init(lua_State*L,ZIO*z,lua_Reader reader,void*data){ -z->L=L; -z->reader=reader; -z->data=data; -z->n=0; -z->p=NULL; -} -static char*luaZ_openspace(lua_State*L,Mbuffer*buff,size_t n){ -if(n>buff->buffsize){ -if(n<32)n=32; -luaZ_resizebuffer(L,buff,n); -} -return buff->buffer; -} -#define opmode(t,a,b,c,m)(((t)<<7)|((a)<<6)|((b)<<4)|((c)<<2)|(m)) -static const lu_byte luaP_opmodes[(cast(int,OP_VARARG)+1)]={ -opmode(0,1,OpArgR,OpArgN,iABC) -,opmode(0,1,OpArgK,OpArgN,iABx) -,opmode(0,1,OpArgU,OpArgU,iABC) -,opmode(0,1,OpArgR,OpArgN,iABC) -,opmode(0,1,OpArgU,OpArgN,iABC) -,opmode(0,1,OpArgK,OpArgN,iABx) -,opmode(0,1,OpArgR,OpArgK,iABC) -,opmode(0,0,OpArgK,OpArgN,iABx) -,opmode(0,0,OpArgU,OpArgN,iABC) -,opmode(0,0,OpArgK,OpArgK,iABC) -,opmode(0,1,OpArgU,OpArgU,iABC) -,opmode(0,1,OpArgR,OpArgK,iABC) -,opmode(0,1,OpArgK,OpArgK,iABC) -,opmode(0,1,OpArgK,OpArgK,iABC) -,opmode(0,1,OpArgK,OpArgK,iABC) -,opmode(0,1,OpArgK,OpArgK,iABC) -,opmode(0,1,OpArgK,OpArgK,iABC) -,opmode(0,1,OpArgK,OpArgK,iABC) -,opmode(0,1,OpArgR,OpArgN,iABC) -,opmode(0,1,OpArgR,OpArgN,iABC) -,opmode(0,1,OpArgR,OpArgN,iABC) -,opmode(0,1,OpArgR,OpArgR,iABC) -,opmode(0,0,OpArgR,OpArgN,iAsBx) -,opmode(1,0,OpArgK,OpArgK,iABC) -,opmode(1,0,OpArgK,OpArgK,iABC) -,opmode(1,0,OpArgK,OpArgK,iABC) -,opmode(1,1,OpArgR,OpArgU,iABC) -,opmode(1,1,OpArgR,OpArgU,iABC) -,opmode(0,1,OpArgU,OpArgU,iABC) -,opmode(0,1,OpArgU,OpArgU,iABC) -,opmode(0,0,OpArgU,OpArgN,iABC) -,opmode(0,1,OpArgR,OpArgN,iAsBx) -,opmode(0,1,OpArgR,OpArgN,iAsBx) -,opmode(1,0,OpArgN,OpArgU,iABC) -,opmode(0,0,OpArgU,OpArgU,iABC) -,opmode(0,0,OpArgN,OpArgN,iABC) -,opmode(0,1,OpArgU,OpArgN,iABx) -,opmode(0,1,OpArgU,OpArgN,iABC) -}; -#define next(ls)(ls->current=zgetc(ls->z)) -#define currIsNewline(ls)(ls->current=='\n'||ls->current=='\r') -static const char*const luaX_tokens[]={ -"and","break","do","else","elseif", -"end","false","for","function","if", -"in","local","nil","not","or","repeat", -"return","then","true","until","while", -"..","...","==",">=","<=","~=", -"","","","", -NULL -}; -#define save_and_next(ls)(save(ls,ls->current),next(ls)) -static void save(LexState*ls,int c){ -Mbuffer*b=ls->buff; -if(b->n+1>b->buffsize){ -size_t newsize; -if(b->buffsize>=((size_t)(~(size_t)0)-2)/2) -luaX_lexerror(ls,"lexical element too long",0); -newsize=b->buffsize*2; -luaZ_resizebuffer(ls->L,b,newsize); -} -b->buffer[b->n++]=cast(char,c); -} -static void luaX_init(lua_State*L){ -int i; -for(i=0;i<(cast(int,TK_WHILE-257+1));i++){ -TString*ts=luaS_new(L,luaX_tokens[i]); -luaS_fix(ts); -ts->tsv.reserved=cast_byte(i+1); -} -} -static const char*luaX_token2str(LexState*ls,int token){ -if(token<257){ -return(iscntrl(token))?luaO_pushfstring(ls->L,"char(%d)",token): -luaO_pushfstring(ls->L,"%c",token); -} -else -return luaX_tokens[token-257]; -} -static const char*txtToken(LexState*ls,int token){ -switch(token){ -case TK_NAME: -case TK_STRING: -case TK_NUMBER: -save(ls,'\0'); -return luaZ_buffer(ls->buff); -default: -return luaX_token2str(ls,token); -} -} -static void luaX_lexerror(LexState*ls,const char*msg,int token){ -char buff[80]; -luaO_chunkid(buff,getstr(ls->source),80); -msg=luaO_pushfstring(ls->L,"%s:%d: %s",buff,ls->linenumber,msg); -if(token) -luaO_pushfstring(ls->L,"%s near "LUA_QL("%s"),msg,txtToken(ls,token)); -luaD_throw(ls->L,3); -} -static void luaX_syntaxerror(LexState*ls,const char*msg){ -luaX_lexerror(ls,msg,ls->t.token); -} -static TString*luaX_newstring(LexState*ls,const char*str,size_t l){ -lua_State*L=ls->L; -TString*ts=luaS_newlstr(L,str,l); -TValue*o=luaH_setstr(L,ls->fs->h,ts); -if(ttisnil(o)){ -setbvalue(o,1); -luaC_checkGC(L); -} -return ts; -} -static void inclinenumber(LexState*ls){ -int old=ls->current; -next(ls); -if(currIsNewline(ls)&&ls->current!=old) -next(ls); -if(++ls->linenumber>=(INT_MAX-2)) -luaX_syntaxerror(ls,"chunk has too many lines"); -} -static void luaX_setinput(lua_State*L,LexState*ls,ZIO*z,TString*source){ -ls->decpoint='.'; -ls->L=L; -ls->lookahead.token=TK_EOS; -ls->z=z; -ls->fs=NULL; -ls->linenumber=1; -ls->lastline=1; -ls->source=source; -luaZ_resizebuffer(ls->L,ls->buff,32); -next(ls); -} -static int check_next(LexState*ls,const char*set){ -if(!strchr(set,ls->current)) -return 0; -save_and_next(ls); -return 1; -} -static void buffreplace(LexState*ls,char from,char to){ -size_t n=luaZ_bufflen(ls->buff); -char*p=luaZ_buffer(ls->buff); -while(n--) -if(p[n]==from)p[n]=to; -} -static void read_numeral(LexState*ls,SemInfo*seminfo){ -do{ -save_and_next(ls); -}while(isdigit(ls->current)||ls->current=='.'); -if(check_next(ls,"Ee")) -check_next(ls,"+-"); -while(isalnum(ls->current)||ls->current=='_') -save_and_next(ls); -save(ls,'\0'); -buffreplace(ls,'.',ls->decpoint); -if(!luaO_str2d(luaZ_buffer(ls->buff),&seminfo->r)) -luaX_lexerror(ls,"malformed number",TK_NUMBER); -} -static int skip_sep(LexState*ls){ -int count=0; -int s=ls->current; -save_and_next(ls); -while(ls->current=='='){ -save_and_next(ls); -count++; -} -return(ls->current==s)?count:(-count)-1; -} -static void read_long_string(LexState*ls,SemInfo*seminfo,int sep){ -int cont=0; -(void)(cont); -save_and_next(ls); -if(currIsNewline(ls)) -inclinenumber(ls); -for(;;){ -switch(ls->current){ -case(-1): -luaX_lexerror(ls,(seminfo)?"unfinished long string": -"unfinished long comment",TK_EOS); -break; -case']':{ -if(skip_sep(ls)==sep){ -save_and_next(ls); -goto endloop; -} -break; -} -case'\n': -case'\r':{ -save(ls,'\n'); -inclinenumber(ls); -if(!seminfo)luaZ_resetbuffer(ls->buff); -break; -} -default:{ -if(seminfo)save_and_next(ls); -else next(ls); -} -} -}endloop: -if(seminfo) -seminfo->ts=luaX_newstring(ls,luaZ_buffer(ls->buff)+(2+sep), -luaZ_bufflen(ls->buff)-2*(2+sep)); -} -static void read_string(LexState*ls,int del,SemInfo*seminfo){ -save_and_next(ls); -while(ls->current!=del){ -switch(ls->current){ -case(-1): -luaX_lexerror(ls,"unfinished string",TK_EOS); -continue; -case'\n': -case'\r': -luaX_lexerror(ls,"unfinished string",TK_STRING); -continue; -case'\\':{ -int c; -next(ls); -switch(ls->current){ -case'a':c='\a';break; -case'b':c='\b';break; -case'f':c='\f';break; -case'n':c='\n';break; -case'r':c='\r';break; -case't':c='\t';break; -case'v':c='\v';break; -case'\n': -case'\r':save(ls,'\n');inclinenumber(ls);continue; -case(-1):continue; -default:{ -if(!isdigit(ls->current)) -save_and_next(ls); -else{ -int i=0; -c=0; -do{ -c=10*c+(ls->current-'0'); -next(ls); -}while(++i<3&&isdigit(ls->current)); -if(c>UCHAR_MAX) -luaX_lexerror(ls,"escape sequence too large",TK_STRING); -save(ls,c); -} -continue; -} -} -save(ls,c); -next(ls); -continue; -} -default: -save_and_next(ls); -} -} -save_and_next(ls); -seminfo->ts=luaX_newstring(ls,luaZ_buffer(ls->buff)+1, -luaZ_bufflen(ls->buff)-2); -} -static int llex(LexState*ls,SemInfo*seminfo){ -luaZ_resetbuffer(ls->buff); -for(;;){ -switch(ls->current){ -case'\n': -case'\r':{ -inclinenumber(ls); -continue; -} -case'-':{ -next(ls); -if(ls->current!='-')return'-'; -next(ls); -if(ls->current=='['){ -int sep=skip_sep(ls); -luaZ_resetbuffer(ls->buff); -if(sep>=0){ -read_long_string(ls,NULL,sep); -luaZ_resetbuffer(ls->buff); -continue; -} -} -while(!currIsNewline(ls)&&ls->current!=(-1)) -next(ls); -continue; -} -case'[':{ -int sep=skip_sep(ls); -if(sep>=0){ -read_long_string(ls,seminfo,sep); -return TK_STRING; -} -else if(sep==-1)return'['; -else luaX_lexerror(ls,"invalid long string delimiter",TK_STRING); -} -case'=':{ -next(ls); -if(ls->current!='=')return'='; -else{next(ls);return TK_EQ;} -} -case'<':{ -next(ls); -if(ls->current!='=')return'<'; -else{next(ls);return TK_LE;} -} -case'>':{ -next(ls); -if(ls->current!='=')return'>'; -else{next(ls);return TK_GE;} -} -case'~':{ -next(ls); -if(ls->current!='=')return'~'; -else{next(ls);return TK_NE;} -} -case'"': -case'\'':{ -read_string(ls,ls->current,seminfo); -return TK_STRING; -} -case'.':{ -save_and_next(ls); -if(check_next(ls,".")){ -if(check_next(ls,".")) -return TK_DOTS; -else return TK_CONCAT; -} -else if(!isdigit(ls->current))return'.'; -else{ -read_numeral(ls,seminfo); -return TK_NUMBER; -} -} -case(-1):{ -return TK_EOS; -} -default:{ -if(isspace(ls->current)){ -next(ls); -continue; -} -else if(isdigit(ls->current)){ -read_numeral(ls,seminfo); -return TK_NUMBER; -} -else if(isalpha(ls->current)||ls->current=='_'){ -TString*ts; -do{ -save_and_next(ls); -}while(isalnum(ls->current)||ls->current=='_'); -ts=luaX_newstring(ls,luaZ_buffer(ls->buff), -luaZ_bufflen(ls->buff)); -if(ts->tsv.reserved>0) -return ts->tsv.reserved-1+257; -else{ -seminfo->ts=ts; -return TK_NAME; -} -} -else{ -int c=ls->current; -next(ls); -return c; -} -} -} -} -} -static void luaX_next(LexState*ls){ -ls->lastline=ls->linenumber; -if(ls->lookahead.token!=TK_EOS){ -ls->t=ls->lookahead; -ls->lookahead.token=TK_EOS; -} -else -ls->t.token=llex(ls,&ls->t.seminfo); -} -static void luaX_lookahead(LexState*ls){ -ls->lookahead.token=llex(ls,&ls->lookahead.seminfo); -} -#define hasjumps(e)((e)->t!=(e)->f) -static int isnumeral(expdesc*e){ -return(e->k==VKNUM&&e->t==(-1)&&e->f==(-1)); -} -static void luaK_nil(FuncState*fs,int from,int n){ -Instruction*previous; -if(fs->pc>fs->lasttarget){ -if(fs->pc==0){ -if(from>=fs->nactvar) -return; -} -else{ -previous=&fs->f->code[fs->pc-1]; -if(GET_OPCODE(*previous)==OP_LOADNIL){ -int pfrom=GETARG_A(*previous); -int pto=GETARG_B(*previous); -if(pfrom<=from&&from<=pto+1){ -if(from+n-1>pto) -SETARG_B(*previous,from+n-1); -return; -} -} -} -} -luaK_codeABC(fs,OP_LOADNIL,from,from+n-1,0); -} -static int luaK_jump(FuncState*fs){ -int jpc=fs->jpc; -int j; -fs->jpc=(-1); -j=luaK_codeAsBx(fs,OP_JMP,0,(-1)); -luaK_concat(fs,&j,jpc); -return j; -} -static void luaK_ret(FuncState*fs,int first,int nret){ -luaK_codeABC(fs,OP_RETURN,first,nret+1,0); -} -static int condjump(FuncState*fs,OpCode op,int A,int B,int C){ -luaK_codeABC(fs,op,A,B,C); -return luaK_jump(fs); -} -static void fixjump(FuncState*fs,int pc,int dest){ -Instruction*jmp=&fs->f->code[pc]; -int offset=dest-(pc+1); -if(abs(offset)>(((1<<(9+9))-1)>>1)) -luaX_syntaxerror(fs->ls,"control structure too long"); -SETARG_sBx(*jmp,offset); -} -static int luaK_getlabel(FuncState*fs){ -fs->lasttarget=fs->pc; -return fs->pc; -} -static int getjump(FuncState*fs,int pc){ -int offset=GETARG_sBx(fs->f->code[pc]); -if(offset==(-1)) -return(-1); -else -return(pc+1)+offset; -} -static Instruction*getjumpcontrol(FuncState*fs,int pc){ -Instruction*pi=&fs->f->code[pc]; -if(pc>=1&&testTMode(GET_OPCODE(*(pi-1)))) -return pi-1; -else -return pi; -} -static int need_value(FuncState*fs,int list){ -for(;list!=(-1);list=getjump(fs,list)){ -Instruction i=*getjumpcontrol(fs,list); -if(GET_OPCODE(i)!=OP_TESTSET)return 1; -} -return 0; -} -static int patchtestreg(FuncState*fs,int node,int reg){ -Instruction*i=getjumpcontrol(fs,node); -if(GET_OPCODE(*i)!=OP_TESTSET) -return 0; -if(reg!=((1<<8)-1)&®!=GETARG_B(*i)) -SETARG_A(*i,reg); -else -*i=CREATE_ABC(OP_TEST,GETARG_B(*i),0,GETARG_C(*i)); -return 1; -} -static void removevalues(FuncState*fs,int list){ -for(;list!=(-1);list=getjump(fs,list)) -patchtestreg(fs,list,((1<<8)-1)); -} -static void patchlistaux(FuncState*fs,int list,int vtarget,int reg, -int dtarget){ -while(list!=(-1)){ -int next=getjump(fs,list); -if(patchtestreg(fs,list,reg)) -fixjump(fs,list,vtarget); -else -fixjump(fs,list,dtarget); -list=next; -} -} -static void dischargejpc(FuncState*fs){ -patchlistaux(fs,fs->jpc,fs->pc,((1<<8)-1),fs->pc); -fs->jpc=(-1); -} -static void luaK_patchlist(FuncState*fs,int list,int target){ -if(target==fs->pc) -luaK_patchtohere(fs,list); -else{ -patchlistaux(fs,list,target,((1<<8)-1),target); -} -} -static void luaK_patchtohere(FuncState*fs,int list){ -luaK_getlabel(fs); -luaK_concat(fs,&fs->jpc,list); -} -static void luaK_concat(FuncState*fs,int*l1,int l2){ -if(l2==(-1))return; -else if(*l1==(-1)) -*l1=l2; -else{ -int list=*l1; -int next; -while((next=getjump(fs,list))!=(-1)) -list=next; -fixjump(fs,list,l2); -} -} -static void luaK_checkstack(FuncState*fs,int n){ -int newstack=fs->freereg+n; -if(newstack>fs->f->maxstacksize){ -if(newstack>=250) -luaX_syntaxerror(fs->ls,"function or expression too complex"); -fs->f->maxstacksize=cast_byte(newstack); -} -} -static void luaK_reserveregs(FuncState*fs,int n){ -luaK_checkstack(fs,n); -fs->freereg+=n; -} -static void freereg(FuncState*fs,int reg){ -if(!ISK(reg)&®>=fs->nactvar){ -fs->freereg--; -} -} -static void freeexp(FuncState*fs,expdesc*e){ -if(e->k==VNONRELOC) -freereg(fs,e->u.s.info); -} -static int addk(FuncState*fs,TValue*k,TValue*v){ -lua_State*L=fs->L; -TValue*idx=luaH_set(L,fs->h,k); -Proto*f=fs->f; -int oldsize=f->sizek; -if(ttisnumber(idx)){ -return cast_int(nvalue(idx)); -} -else{ -setnvalue(idx,cast_num(fs->nk)); -luaM_growvector(L,f->k,fs->nk,f->sizek,TValue, -((1<<(9+9))-1),"constant table overflow"); -while(oldsizesizek)setnilvalue(&f->k[oldsize++]); -setobj(L,&f->k[fs->nk],v); -luaC_barrier(L,f,v); -return fs->nk++; -} -} -static int luaK_stringK(FuncState*fs,TString*s){ -TValue o; -setsvalue(fs->L,&o,s); -return addk(fs,&o,&o); -} -static int luaK_numberK(FuncState*fs,lua_Number r){ -TValue o; -setnvalue(&o,r); -return addk(fs,&o,&o); -} -static int boolK(FuncState*fs,int b){ -TValue o; -setbvalue(&o,b); -return addk(fs,&o,&o); -} -static int nilK(FuncState*fs){ -TValue k,v; -setnilvalue(&v); -sethvalue(fs->L,&k,fs->h); -return addk(fs,&k,&v); -} -static void luaK_setreturns(FuncState*fs,expdesc*e,int nresults){ -if(e->k==VCALL){ -SETARG_C(getcode(fs,e),nresults+1); -} -else if(e->k==VVARARG){ -SETARG_B(getcode(fs,e),nresults+1); -SETARG_A(getcode(fs,e),fs->freereg); -luaK_reserveregs(fs,1); -} -} -static void luaK_setoneret(FuncState*fs,expdesc*e){ -if(e->k==VCALL){ -e->k=VNONRELOC; -e->u.s.info=GETARG_A(getcode(fs,e)); -} -else if(e->k==VVARARG){ -SETARG_B(getcode(fs,e),2); -e->k=VRELOCABLE; -} -} -static void luaK_dischargevars(FuncState*fs,expdesc*e){ -switch(e->k){ -case VLOCAL:{ -e->k=VNONRELOC; -break; -} -case VUPVAL:{ -e->u.s.info=luaK_codeABC(fs,OP_GETUPVAL,0,e->u.s.info,0); -e->k=VRELOCABLE; -break; -} -case VGLOBAL:{ -e->u.s.info=luaK_codeABx(fs,OP_GETGLOBAL,0,e->u.s.info); -e->k=VRELOCABLE; -break; -} -case VINDEXED:{ -freereg(fs,e->u.s.aux); -freereg(fs,e->u.s.info); -e->u.s.info=luaK_codeABC(fs,OP_GETTABLE,0,e->u.s.info,e->u.s.aux); -e->k=VRELOCABLE; -break; -} -case VVARARG: -case VCALL:{ -luaK_setoneret(fs,e); -break; -} -default:break; -} -} -static int code_label(FuncState*fs,int A,int b,int jump){ -luaK_getlabel(fs); -return luaK_codeABC(fs,OP_LOADBOOL,A,b,jump); -} -static void discharge2reg(FuncState*fs,expdesc*e,int reg){ -luaK_dischargevars(fs,e); -switch(e->k){ -case VNIL:{ -luaK_nil(fs,reg,1); -break; -} -case VFALSE:case VTRUE:{ -luaK_codeABC(fs,OP_LOADBOOL,reg,e->k==VTRUE,0); -break; -} -case VK:{ -luaK_codeABx(fs,OP_LOADK,reg,e->u.s.info); -break; -} -case VKNUM:{ -luaK_codeABx(fs,OP_LOADK,reg,luaK_numberK(fs,e->u.nval)); -break; -} -case VRELOCABLE:{ -Instruction*pc=&getcode(fs,e); -SETARG_A(*pc,reg); -break; -} -case VNONRELOC:{ -if(reg!=e->u.s.info) -luaK_codeABC(fs,OP_MOVE,reg,e->u.s.info,0); -break; -} -default:{ -return; -} -} -e->u.s.info=reg; -e->k=VNONRELOC; -} -static void discharge2anyreg(FuncState*fs,expdesc*e){ -if(e->k!=VNONRELOC){ -luaK_reserveregs(fs,1); -discharge2reg(fs,e,fs->freereg-1); -} -} -static void exp2reg(FuncState*fs,expdesc*e,int reg){ -discharge2reg(fs,e,reg); -if(e->k==VJMP) -luaK_concat(fs,&e->t,e->u.s.info); -if(hasjumps(e)){ -int final; -int p_f=(-1); -int p_t=(-1); -if(need_value(fs,e->t)||need_value(fs,e->f)){ -int fj=(e->k==VJMP)?(-1):luaK_jump(fs); -p_f=code_label(fs,reg,0,1); -p_t=code_label(fs,reg,1,0); -luaK_patchtohere(fs,fj); -} -final=luaK_getlabel(fs); -patchlistaux(fs,e->f,final,reg,p_f); -patchlistaux(fs,e->t,final,reg,p_t); -} -e->f=e->t=(-1); -e->u.s.info=reg; -e->k=VNONRELOC; -} -static void luaK_exp2nextreg(FuncState*fs,expdesc*e){ -luaK_dischargevars(fs,e); -freeexp(fs,e); -luaK_reserveregs(fs,1); -exp2reg(fs,e,fs->freereg-1); -} -static int luaK_exp2anyreg(FuncState*fs,expdesc*e){ -luaK_dischargevars(fs,e); -if(e->k==VNONRELOC){ -if(!hasjumps(e))return e->u.s.info; -if(e->u.s.info>=fs->nactvar){ -exp2reg(fs,e,e->u.s.info); -return e->u.s.info; -} -} -luaK_exp2nextreg(fs,e); -return e->u.s.info; -} -static void luaK_exp2val(FuncState*fs,expdesc*e){ -if(hasjumps(e)) -luaK_exp2anyreg(fs,e); -else -luaK_dischargevars(fs,e); -} -static int luaK_exp2RK(FuncState*fs,expdesc*e){ -luaK_exp2val(fs,e); -switch(e->k){ -case VKNUM: -case VTRUE: -case VFALSE: -case VNIL:{ -if(fs->nk<=((1<<(9-1))-1)){ -e->u.s.info=(e->k==VNIL)?nilK(fs): -(e->k==VKNUM)?luaK_numberK(fs,e->u.nval): -boolK(fs,(e->k==VTRUE)); -e->k=VK; -return RKASK(e->u.s.info); -} -else break; -} -case VK:{ -if(e->u.s.info<=((1<<(9-1))-1)) -return RKASK(e->u.s.info); -else break; -} -default:break; -} -return luaK_exp2anyreg(fs,e); -} -static void luaK_storevar(FuncState*fs,expdesc*var,expdesc*ex){ -switch(var->k){ -case VLOCAL:{ -freeexp(fs,ex); -exp2reg(fs,ex,var->u.s.info); -return; -} -case VUPVAL:{ -int e=luaK_exp2anyreg(fs,ex); -luaK_codeABC(fs,OP_SETUPVAL,e,var->u.s.info,0); -break; -} -case VGLOBAL:{ -int e=luaK_exp2anyreg(fs,ex); -luaK_codeABx(fs,OP_SETGLOBAL,e,var->u.s.info); -break; -} -case VINDEXED:{ -int e=luaK_exp2RK(fs,ex); -luaK_codeABC(fs,OP_SETTABLE,var->u.s.info,var->u.s.aux,e); -break; -} -default:{ -break; -} -} -freeexp(fs,ex); -} -static void luaK_self(FuncState*fs,expdesc*e,expdesc*key){ -int func; -luaK_exp2anyreg(fs,e); -freeexp(fs,e); -func=fs->freereg; -luaK_reserveregs(fs,2); -luaK_codeABC(fs,OP_SELF,func,e->u.s.info,luaK_exp2RK(fs,key)); -freeexp(fs,key); -e->u.s.info=func; -e->k=VNONRELOC; -} -static void invertjump(FuncState*fs,expdesc*e){ -Instruction*pc=getjumpcontrol(fs,e->u.s.info); -SETARG_A(*pc,!(GETARG_A(*pc))); -} -static int jumponcond(FuncState*fs,expdesc*e,int cond){ -if(e->k==VRELOCABLE){ -Instruction ie=getcode(fs,e); -if(GET_OPCODE(ie)==OP_NOT){ -fs->pc--; -return condjump(fs,OP_TEST,GETARG_B(ie),0,!cond); -} -} -discharge2anyreg(fs,e); -freeexp(fs,e); -return condjump(fs,OP_TESTSET,((1<<8)-1),e->u.s.info,cond); -} -static void luaK_goiftrue(FuncState*fs,expdesc*e){ -int pc; -luaK_dischargevars(fs,e); -switch(e->k){ -case VK:case VKNUM:case VTRUE:{ -pc=(-1); -break; -} -case VJMP:{ -invertjump(fs,e); -pc=e->u.s.info; -break; -} -default:{ -pc=jumponcond(fs,e,0); -break; -} -} -luaK_concat(fs,&e->f,pc); -luaK_patchtohere(fs,e->t); -e->t=(-1); -} -static void luaK_goiffalse(FuncState*fs,expdesc*e){ -int pc; -luaK_dischargevars(fs,e); -switch(e->k){ -case VNIL:case VFALSE:{ -pc=(-1); -break; -} -case VJMP:{ -pc=e->u.s.info; -break; -} -default:{ -pc=jumponcond(fs,e,1); -break; -} -} -luaK_concat(fs,&e->t,pc); -luaK_patchtohere(fs,e->f); -e->f=(-1); -} -static void codenot(FuncState*fs,expdesc*e){ -luaK_dischargevars(fs,e); -switch(e->k){ -case VNIL:case VFALSE:{ -e->k=VTRUE; -break; -} -case VK:case VKNUM:case VTRUE:{ -e->k=VFALSE; -break; -} -case VJMP:{ -invertjump(fs,e); -break; -} -case VRELOCABLE: -case VNONRELOC:{ -discharge2anyreg(fs,e); -freeexp(fs,e); -e->u.s.info=luaK_codeABC(fs,OP_NOT,0,e->u.s.info,0); -e->k=VRELOCABLE; -break; -} -default:{ -break; -} -} -{int temp=e->f;e->f=e->t;e->t=temp;} -removevalues(fs,e->f); -removevalues(fs,e->t); -} -static void luaK_indexed(FuncState*fs,expdesc*t,expdesc*k){ -t->u.s.aux=luaK_exp2RK(fs,k); -t->k=VINDEXED; -} -static int constfolding(OpCode op,expdesc*e1,expdesc*e2){ -lua_Number v1,v2,r; -if(!isnumeral(e1)||!isnumeral(e2))return 0; -v1=e1->u.nval; -v2=e2->u.nval; -switch(op){ -case OP_ADD:r=luai_numadd(v1,v2);break; -case OP_SUB:r=luai_numsub(v1,v2);break; -case OP_MUL:r=luai_nummul(v1,v2);break; -case OP_DIV: -if(v2==0)return 0; -r=luai_numdiv(v1,v2);break; -case OP_MOD: -if(v2==0)return 0; -r=luai_nummod(v1,v2);break; -case OP_POW:r=luai_numpow(v1,v2);break; -case OP_UNM:r=luai_numunm(v1);break; -case OP_LEN:return 0; -default:r=0;break; -} -if(luai_numisnan(r))return 0; -e1->u.nval=r; -return 1; -} -static void codearith(FuncState*fs,OpCode op,expdesc*e1,expdesc*e2){ -if(constfolding(op,e1,e2)) -return; -else{ -int o2=(op!=OP_UNM&&op!=OP_LEN)?luaK_exp2RK(fs,e2):0; -int o1=luaK_exp2RK(fs,e1); -if(o1>o2){ -freeexp(fs,e1); -freeexp(fs,e2); -} -else{ -freeexp(fs,e2); -freeexp(fs,e1); -} -e1->u.s.info=luaK_codeABC(fs,op,0,o1,o2); -e1->k=VRELOCABLE; -} -} -static void codecomp(FuncState*fs,OpCode op,int cond,expdesc*e1, -expdesc*e2){ -int o1=luaK_exp2RK(fs,e1); -int o2=luaK_exp2RK(fs,e2); -freeexp(fs,e2); -freeexp(fs,e1); -if(cond==0&&op!=OP_EQ){ -int temp; -temp=o1;o1=o2;o2=temp; -cond=1; -} -e1->u.s.info=condjump(fs,op,cond,o1,o2); -e1->k=VJMP; -} -static void luaK_prefix(FuncState*fs,UnOpr op,expdesc*e){ -expdesc e2; -e2.t=e2.f=(-1);e2.k=VKNUM;e2.u.nval=0; -switch(op){ -case OPR_MINUS:{ -if(!isnumeral(e)) -luaK_exp2anyreg(fs,e); -codearith(fs,OP_UNM,e,&e2); -break; -} -case OPR_NOT:codenot(fs,e);break; -case OPR_LEN:{ -luaK_exp2anyreg(fs,e); -codearith(fs,OP_LEN,e,&e2); -break; -} -default:; -} -} -static void luaK_infix(FuncState*fs,BinOpr op,expdesc*v){ -switch(op){ -case OPR_AND:{ -luaK_goiftrue(fs,v); -break; -} -case OPR_OR:{ -luaK_goiffalse(fs,v); -break; -} -case OPR_CONCAT:{ -luaK_exp2nextreg(fs,v); -break; -} -case OPR_ADD:case OPR_SUB:case OPR_MUL:case OPR_DIV: -case OPR_MOD:case OPR_POW:{ -if(!isnumeral(v))luaK_exp2RK(fs,v); -break; -} -default:{ -luaK_exp2RK(fs,v); -break; -} -} -} -static void luaK_posfix(FuncState*fs,BinOpr op,expdesc*e1,expdesc*e2){ -switch(op){ -case OPR_AND:{ -luaK_dischargevars(fs,e2); -luaK_concat(fs,&e2->f,e1->f); -*e1=*e2; -break; -} -case OPR_OR:{ -luaK_dischargevars(fs,e2); -luaK_concat(fs,&e2->t,e1->t); -*e1=*e2; -break; -} -case OPR_CONCAT:{ -luaK_exp2val(fs,e2); -if(e2->k==VRELOCABLE&&GET_OPCODE(getcode(fs,e2))==OP_CONCAT){ -freeexp(fs,e1); -SETARG_B(getcode(fs,e2),e1->u.s.info); -e1->k=VRELOCABLE;e1->u.s.info=e2->u.s.info; -} -else{ -luaK_exp2nextreg(fs,e2); -codearith(fs,OP_CONCAT,e1,e2); -} -break; -} -case OPR_ADD:codearith(fs,OP_ADD,e1,e2);break; -case OPR_SUB:codearith(fs,OP_SUB,e1,e2);break; -case OPR_MUL:codearith(fs,OP_MUL,e1,e2);break; -case OPR_DIV:codearith(fs,OP_DIV,e1,e2);break; -case OPR_MOD:codearith(fs,OP_MOD,e1,e2);break; -case OPR_POW:codearith(fs,OP_POW,e1,e2);break; -case OPR_EQ:codecomp(fs,OP_EQ,1,e1,e2);break; -case OPR_NE:codecomp(fs,OP_EQ,0,e1,e2);break; -case OPR_LT:codecomp(fs,OP_LT,1,e1,e2);break; -case OPR_LE:codecomp(fs,OP_LE,1,e1,e2);break; -case OPR_GT:codecomp(fs,OP_LT,0,e1,e2);break; -case OPR_GE:codecomp(fs,OP_LE,0,e1,e2);break; -default:; -} -} -static void luaK_fixline(FuncState*fs,int line){ -fs->f->lineinfo[fs->pc-1]=line; -} -static int luaK_code(FuncState*fs,Instruction i,int line){ -Proto*f=fs->f; -dischargejpc(fs); -luaM_growvector(fs->L,f->code,fs->pc,f->sizecode,Instruction, -(INT_MAX-2),"code size overflow"); -f->code[fs->pc]=i; -luaM_growvector(fs->L,f->lineinfo,fs->pc,f->sizelineinfo,int, -(INT_MAX-2),"code size overflow"); -f->lineinfo[fs->pc]=line; -return fs->pc++; -} -static int luaK_codeABC(FuncState*fs,OpCode o,int a,int b,int c){ -return luaK_code(fs,CREATE_ABC(o,a,b,c),fs->ls->lastline); -} -static int luaK_codeABx(FuncState*fs,OpCode o,int a,unsigned int bc){ -return luaK_code(fs,CREATE_ABx(o,a,bc),fs->ls->lastline); -} -static void luaK_setlist(FuncState*fs,int base,int nelems,int tostore){ -int c=(nelems-1)/50+1; -int b=(tostore==(-1))?0:tostore; -if(c<=((1<<9)-1)) -luaK_codeABC(fs,OP_SETLIST,base,b,c); -else{ -luaK_codeABC(fs,OP_SETLIST,base,b,0); -luaK_code(fs,cast(Instruction,c),fs->ls->lastline); -} -fs->freereg=base+1; -} -#define hasmultret(k)((k)==VCALL||(k)==VVARARG) -#define getlocvar(fs,i)((fs)->f->locvars[(fs)->actvar[i]]) -#define luaY_checklimit(fs,v,l,m)if((v)>(l))errorlimit(fs,l,m) -typedef struct BlockCnt{ -struct BlockCnt*previous; -int breaklist; -lu_byte nactvar; -lu_byte upval; -lu_byte isbreakable; -}BlockCnt; -static void chunk(LexState*ls); -static void expr(LexState*ls,expdesc*v); -static void anchor_token(LexState*ls){ -if(ls->t.token==TK_NAME||ls->t.token==TK_STRING){ -TString*ts=ls->t.seminfo.ts; -luaX_newstring(ls,getstr(ts),ts->tsv.len); -} -} -static void error_expected(LexState*ls,int token){ -luaX_syntaxerror(ls, -luaO_pushfstring(ls->L,LUA_QL("%s")" expected",luaX_token2str(ls,token))); -} -static void errorlimit(FuncState*fs,int limit,const char*what){ -const char*msg=(fs->f->linedefined==0)? -luaO_pushfstring(fs->L,"main function has more than %d %s",limit,what): -luaO_pushfstring(fs->L,"function at line %d has more than %d %s", -fs->f->linedefined,limit,what); -luaX_lexerror(fs->ls,msg,0); -} -static int testnext(LexState*ls,int c){ -if(ls->t.token==c){ -luaX_next(ls); -return 1; -} -else return 0; -} -static void check(LexState*ls,int c){ -if(ls->t.token!=c) -error_expected(ls,c); -} -static void checknext(LexState*ls,int c){ -check(ls,c); -luaX_next(ls); -} -#define check_condition(ls,c,msg){if(!(c))luaX_syntaxerror(ls,msg);} -static void check_match(LexState*ls,int what,int who,int where){ -if(!testnext(ls,what)){ -if(where==ls->linenumber) -error_expected(ls,what); -else{ -luaX_syntaxerror(ls,luaO_pushfstring(ls->L, -LUA_QL("%s")" expected (to close "LUA_QL("%s")" at line %d)", -luaX_token2str(ls,what),luaX_token2str(ls,who),where)); -} -} -} -static TString*str_checkname(LexState*ls){ -TString*ts; -check(ls,TK_NAME); -ts=ls->t.seminfo.ts; -luaX_next(ls); -return ts; -} -static void init_exp(expdesc*e,expkind k,int i){ -e->f=e->t=(-1); -e->k=k; -e->u.s.info=i; -} -static void codestring(LexState*ls,expdesc*e,TString*s){ -init_exp(e,VK,luaK_stringK(ls->fs,s)); -} -static void checkname(LexState*ls,expdesc*e){ -codestring(ls,e,str_checkname(ls)); -} -static int registerlocalvar(LexState*ls,TString*varname){ -FuncState*fs=ls->fs; -Proto*f=fs->f; -int oldsize=f->sizelocvars; -luaM_growvector(ls->L,f->locvars,fs->nlocvars,f->sizelocvars, -LocVar,SHRT_MAX,"too many local variables"); -while(oldsizesizelocvars)f->locvars[oldsize++].varname=NULL; -f->locvars[fs->nlocvars].varname=varname; -luaC_objbarrier(ls->L,f,varname); -return fs->nlocvars++; -} -#define new_localvarliteral(ls,v,n)new_localvar(ls,luaX_newstring(ls,""v,(sizeof(v)/sizeof(char))-1),n) -static void new_localvar(LexState*ls,TString*name,int n){ -FuncState*fs=ls->fs; -luaY_checklimit(fs,fs->nactvar+n+1,200,"local variables"); -fs->actvar[fs->nactvar+n]=cast(unsigned short,registerlocalvar(ls,name)); -} -static void adjustlocalvars(LexState*ls,int nvars){ -FuncState*fs=ls->fs; -fs->nactvar=cast_byte(fs->nactvar+nvars); -for(;nvars;nvars--){ -getlocvar(fs,fs->nactvar-nvars).startpc=fs->pc; -} -} -static void removevars(LexState*ls,int tolevel){ -FuncState*fs=ls->fs; -while(fs->nactvar>tolevel) -getlocvar(fs,--fs->nactvar).endpc=fs->pc; -} -static int indexupvalue(FuncState*fs,TString*name,expdesc*v){ -int i; -Proto*f=fs->f; -int oldsize=f->sizeupvalues; -for(i=0;inups;i++){ -if(fs->upvalues[i].k==v->k&&fs->upvalues[i].info==v->u.s.info){ -return i; -} -} -luaY_checklimit(fs,f->nups+1,60,"upvalues"); -luaM_growvector(fs->L,f->upvalues,f->nups,f->sizeupvalues, -TString*,(INT_MAX-2),""); -while(oldsizesizeupvalues)f->upvalues[oldsize++]=NULL; -f->upvalues[f->nups]=name; -luaC_objbarrier(fs->L,f,name); -fs->upvalues[f->nups].k=cast_byte(v->k); -fs->upvalues[f->nups].info=cast_byte(v->u.s.info); -return f->nups++; -} -static int searchvar(FuncState*fs,TString*n){ -int i; -for(i=fs->nactvar-1;i>=0;i--){ -if(n==getlocvar(fs,i).varname) -return i; -} -return-1; -} -static void markupval(FuncState*fs,int level){ -BlockCnt*bl=fs->bl; -while(bl&&bl->nactvar>level)bl=bl->previous; -if(bl)bl->upval=1; -} -static int singlevaraux(FuncState*fs,TString*n,expdesc*var,int base){ -if(fs==NULL){ -init_exp(var,VGLOBAL,((1<<8)-1)); -return VGLOBAL; -} -else{ -int v=searchvar(fs,n); -if(v>=0){ -init_exp(var,VLOCAL,v); -if(!base) -markupval(fs,v); -return VLOCAL; -} -else{ -if(singlevaraux(fs->prev,n,var,0)==VGLOBAL) -return VGLOBAL; -var->u.s.info=indexupvalue(fs,n,var); -var->k=VUPVAL; -return VUPVAL; -} -} -} -static void singlevar(LexState*ls,expdesc*var){ -TString*varname=str_checkname(ls); -FuncState*fs=ls->fs; -if(singlevaraux(fs,varname,var,1)==VGLOBAL) -var->u.s.info=luaK_stringK(fs,varname); -} -static void adjust_assign(LexState*ls,int nvars,int nexps,expdesc*e){ -FuncState*fs=ls->fs; -int extra=nvars-nexps; -if(hasmultret(e->k)){ -extra++; -if(extra<0)extra=0; -luaK_setreturns(fs,e,extra); -if(extra>1)luaK_reserveregs(fs,extra-1); -} -else{ -if(e->k!=VVOID)luaK_exp2nextreg(fs,e); -if(extra>0){ -int reg=fs->freereg; -luaK_reserveregs(fs,extra); -luaK_nil(fs,reg,extra); -} -} -} -static void enterlevel(LexState*ls){ -if(++ls->L->nCcalls>200) -luaX_lexerror(ls,"chunk has too many syntax levels",0); -} -#define leavelevel(ls)((ls)->L->nCcalls--) -static void enterblock(FuncState*fs,BlockCnt*bl,lu_byte isbreakable){ -bl->breaklist=(-1); -bl->isbreakable=isbreakable; -bl->nactvar=fs->nactvar; -bl->upval=0; -bl->previous=fs->bl; -fs->bl=bl; -} -static void leaveblock(FuncState*fs){ -BlockCnt*bl=fs->bl; -fs->bl=bl->previous; -removevars(fs->ls,bl->nactvar); -if(bl->upval) -luaK_codeABC(fs,OP_CLOSE,bl->nactvar,0,0); -fs->freereg=fs->nactvar; -luaK_patchtohere(fs,bl->breaklist); -} -static void pushclosure(LexState*ls,FuncState*func,expdesc*v){ -FuncState*fs=ls->fs; -Proto*f=fs->f; -int oldsize=f->sizep; -int i; -luaM_growvector(ls->L,f->p,fs->np,f->sizep,Proto*, -((1<<(9+9))-1),"constant table overflow"); -while(oldsizesizep)f->p[oldsize++]=NULL; -f->p[fs->np++]=func->f; -luaC_objbarrier(ls->L,f,func->f); -init_exp(v,VRELOCABLE,luaK_codeABx(fs,OP_CLOSURE,0,fs->np-1)); -for(i=0;if->nups;i++){ -OpCode o=(func->upvalues[i].k==VLOCAL)?OP_MOVE:OP_GETUPVAL; -luaK_codeABC(fs,o,0,func->upvalues[i].info,0); -} -} -static void open_func(LexState*ls,FuncState*fs){ -lua_State*L=ls->L; -Proto*f=luaF_newproto(L); -fs->f=f; -fs->prev=ls->fs; -fs->ls=ls; -fs->L=L; -ls->fs=fs; -fs->pc=0; -fs->lasttarget=-1; -fs->jpc=(-1); -fs->freereg=0; -fs->nk=0; -fs->np=0; -fs->nlocvars=0; -fs->nactvar=0; -fs->bl=NULL; -f->source=ls->source; -f->maxstacksize=2; -fs->h=luaH_new(L,0,0); -sethvalue(L,L->top,fs->h); -incr_top(L); -setptvalue(L,L->top,f); -incr_top(L); -} -static void close_func(LexState*ls){ -lua_State*L=ls->L; -FuncState*fs=ls->fs; -Proto*f=fs->f; -removevars(ls,0); -luaK_ret(fs,0,0); -luaM_reallocvector(L,f->code,f->sizecode,fs->pc,Instruction); -f->sizecode=fs->pc; -luaM_reallocvector(L,f->lineinfo,f->sizelineinfo,fs->pc,int); -f->sizelineinfo=fs->pc; -luaM_reallocvector(L,f->k,f->sizek,fs->nk,TValue); -f->sizek=fs->nk; -luaM_reallocvector(L,f->p,f->sizep,fs->np,Proto*); -f->sizep=fs->np; -luaM_reallocvector(L,f->locvars,f->sizelocvars,fs->nlocvars,LocVar); -f->sizelocvars=fs->nlocvars; -luaM_reallocvector(L,f->upvalues,f->sizeupvalues,f->nups,TString*); -f->sizeupvalues=f->nups; -ls->fs=fs->prev; -if(fs)anchor_token(ls); -L->top-=2; -} -static Proto*luaY_parser(lua_State*L,ZIO*z,Mbuffer*buff,const char*name){ -struct LexState lexstate; -struct FuncState funcstate; -lexstate.buff=buff; -luaX_setinput(L,&lexstate,z,luaS_new(L,name)); -open_func(&lexstate,&funcstate); -funcstate.f->is_vararg=2; -luaX_next(&lexstate); -chunk(&lexstate); -check(&lexstate,TK_EOS); -close_func(&lexstate); -return funcstate.f; -} -static void field(LexState*ls,expdesc*v){ -FuncState*fs=ls->fs; -expdesc key; -luaK_exp2anyreg(fs,v); -luaX_next(ls); -checkname(ls,&key); -luaK_indexed(fs,v,&key); -} -static void yindex(LexState*ls,expdesc*v){ -luaX_next(ls); -expr(ls,v); -luaK_exp2val(ls->fs,v); -checknext(ls,']'); -} -struct ConsControl{ -expdesc v; -expdesc*t; -int nh; -int na; -int tostore; -}; -static void recfield(LexState*ls,struct ConsControl*cc){ -FuncState*fs=ls->fs; -int reg=ls->fs->freereg; -expdesc key,val; -int rkkey; -if(ls->t.token==TK_NAME){ -luaY_checklimit(fs,cc->nh,(INT_MAX-2),"items in a constructor"); -checkname(ls,&key); -} -else -yindex(ls,&key); -cc->nh++; -checknext(ls,'='); -rkkey=luaK_exp2RK(fs,&key); -expr(ls,&val); -luaK_codeABC(fs,OP_SETTABLE,cc->t->u.s.info,rkkey,luaK_exp2RK(fs,&val)); -fs->freereg=reg; -} -static void closelistfield(FuncState*fs,struct ConsControl*cc){ -if(cc->v.k==VVOID)return; -luaK_exp2nextreg(fs,&cc->v); -cc->v.k=VVOID; -if(cc->tostore==50){ -luaK_setlist(fs,cc->t->u.s.info,cc->na,cc->tostore); -cc->tostore=0; -} -} -static void lastlistfield(FuncState*fs,struct ConsControl*cc){ -if(cc->tostore==0)return; -if(hasmultret(cc->v.k)){ -luaK_setmultret(fs,&cc->v); -luaK_setlist(fs,cc->t->u.s.info,cc->na,(-1)); -cc->na--; -} -else{ -if(cc->v.k!=VVOID) -luaK_exp2nextreg(fs,&cc->v); -luaK_setlist(fs,cc->t->u.s.info,cc->na,cc->tostore); -} -} -static void listfield(LexState*ls,struct ConsControl*cc){ -expr(ls,&cc->v); -luaY_checklimit(ls->fs,cc->na,(INT_MAX-2),"items in a constructor"); -cc->na++; -cc->tostore++; -} -static void constructor(LexState*ls,expdesc*t){ -FuncState*fs=ls->fs; -int line=ls->linenumber; -int pc=luaK_codeABC(fs,OP_NEWTABLE,0,0,0); -struct ConsControl cc; -cc.na=cc.nh=cc.tostore=0; -cc.t=t; -init_exp(t,VRELOCABLE,pc); -init_exp(&cc.v,VVOID,0); -luaK_exp2nextreg(ls->fs,t); -checknext(ls,'{'); -do{ -if(ls->t.token=='}')break; -closelistfield(fs,&cc); -switch(ls->t.token){ -case TK_NAME:{ -luaX_lookahead(ls); -if(ls->lookahead.token!='=') -listfield(ls,&cc); -else -recfield(ls,&cc); -break; -} -case'[':{ -recfield(ls,&cc); -break; -} -default:{ -listfield(ls,&cc); -break; -} -} -}while(testnext(ls,',')||testnext(ls,';')); -check_match(ls,'}','{',line); -lastlistfield(fs,&cc); -SETARG_B(fs->f->code[pc],luaO_int2fb(cc.na)); -SETARG_C(fs->f->code[pc],luaO_int2fb(cc.nh)); -} -static void parlist(LexState*ls){ -FuncState*fs=ls->fs; -Proto*f=fs->f; -int nparams=0; -f->is_vararg=0; -if(ls->t.token!=')'){ -do{ -switch(ls->t.token){ -case TK_NAME:{ -new_localvar(ls,str_checkname(ls),nparams++); -break; -} -case TK_DOTS:{ -luaX_next(ls); -f->is_vararg|=2; -break; -} -default:luaX_syntaxerror(ls," or "LUA_QL("...")" expected"); -} -}while(!f->is_vararg&&testnext(ls,',')); -} -adjustlocalvars(ls,nparams); -f->numparams=cast_byte(fs->nactvar-(f->is_vararg&1)); -luaK_reserveregs(fs,fs->nactvar); -} -static void body(LexState*ls,expdesc*e,int needself,int line){ -FuncState new_fs; -open_func(ls,&new_fs); -new_fs.f->linedefined=line; -checknext(ls,'('); -if(needself){ -new_localvarliteral(ls,"self",0); -adjustlocalvars(ls,1); -} -parlist(ls); -checknext(ls,')'); -chunk(ls); -new_fs.f->lastlinedefined=ls->linenumber; -check_match(ls,TK_END,TK_FUNCTION,line); -close_func(ls); -pushclosure(ls,&new_fs,e); -} -static int explist1(LexState*ls,expdesc*v){ -int n=1; -expr(ls,v); -while(testnext(ls,',')){ -luaK_exp2nextreg(ls->fs,v); -expr(ls,v); -n++; -} -return n; -} -static void funcargs(LexState*ls,expdesc*f){ -FuncState*fs=ls->fs; -expdesc args; -int base,nparams; -int line=ls->linenumber; -switch(ls->t.token){ -case'(':{ -if(line!=ls->lastline) -luaX_syntaxerror(ls,"ambiguous syntax (function call x new statement)"); -luaX_next(ls); -if(ls->t.token==')') -args.k=VVOID; -else{ -explist1(ls,&args); -luaK_setmultret(fs,&args); -} -check_match(ls,')','(',line); -break; -} -case'{':{ -constructor(ls,&args); -break; -} -case TK_STRING:{ -codestring(ls,&args,ls->t.seminfo.ts); -luaX_next(ls); -break; -} -default:{ -luaX_syntaxerror(ls,"function arguments expected"); -return; -} -} -base=f->u.s.info; -if(hasmultret(args.k)) -nparams=(-1); -else{ -if(args.k!=VVOID) -luaK_exp2nextreg(fs,&args); -nparams=fs->freereg-(base+1); -} -init_exp(f,VCALL,luaK_codeABC(fs,OP_CALL,base,nparams+1,2)); -luaK_fixline(fs,line); -fs->freereg=base+1; -} -static void prefixexp(LexState*ls,expdesc*v){ -switch(ls->t.token){ -case'(':{ -int line=ls->linenumber; -luaX_next(ls); -expr(ls,v); -check_match(ls,')','(',line); -luaK_dischargevars(ls->fs,v); -return; -} -case TK_NAME:{ -singlevar(ls,v); -return; -} -default:{ -luaX_syntaxerror(ls,"unexpected symbol"); -return; -} -} -} -static void primaryexp(LexState*ls,expdesc*v){ -FuncState*fs=ls->fs; -prefixexp(ls,v); -for(;;){ -switch(ls->t.token){ -case'.':{ -field(ls,v); -break; -} -case'[':{ -expdesc key; -luaK_exp2anyreg(fs,v); -yindex(ls,&key); -luaK_indexed(fs,v,&key); -break; -} -case':':{ -expdesc key; -luaX_next(ls); -checkname(ls,&key); -luaK_self(fs,v,&key); -funcargs(ls,v); -break; -} -case'(':case TK_STRING:case'{':{ -luaK_exp2nextreg(fs,v); -funcargs(ls,v); -break; -} -default:return; -} -} -} -static void simpleexp(LexState*ls,expdesc*v){ -switch(ls->t.token){ -case TK_NUMBER:{ -init_exp(v,VKNUM,0); -v->u.nval=ls->t.seminfo.r; -break; -} -case TK_STRING:{ -codestring(ls,v,ls->t.seminfo.ts); -break; -} -case TK_NIL:{ -init_exp(v,VNIL,0); -break; -} -case TK_TRUE:{ -init_exp(v,VTRUE,0); -break; -} -case TK_FALSE:{ -init_exp(v,VFALSE,0); -break; -} -case TK_DOTS:{ -FuncState*fs=ls->fs; -check_condition(ls,fs->f->is_vararg, -"cannot use "LUA_QL("...")" outside a vararg function"); -fs->f->is_vararg&=~4; -init_exp(v,VVARARG,luaK_codeABC(fs,OP_VARARG,0,1,0)); -break; -} -case'{':{ -constructor(ls,v); -return; -} -case TK_FUNCTION:{ -luaX_next(ls); -body(ls,v,0,ls->linenumber); -return; -} -default:{ -primaryexp(ls,v); -return; -} -} -luaX_next(ls); -} -static UnOpr getunopr(int op){ -switch(op){ -case TK_NOT:return OPR_NOT; -case'-':return OPR_MINUS; -case'#':return OPR_LEN; -default:return OPR_NOUNOPR; -} -} -static BinOpr getbinopr(int op){ -switch(op){ -case'+':return OPR_ADD; -case'-':return OPR_SUB; -case'*':return OPR_MUL; -case'/':return OPR_DIV; -case'%':return OPR_MOD; -case'^':return OPR_POW; -case TK_CONCAT:return OPR_CONCAT; -case TK_NE:return OPR_NE; -case TK_EQ:return OPR_EQ; -case'<':return OPR_LT; -case TK_LE:return OPR_LE; -case'>':return OPR_GT; -case TK_GE:return OPR_GE; -case TK_AND:return OPR_AND; -case TK_OR:return OPR_OR; -default:return OPR_NOBINOPR; -} -} -static const struct{ -lu_byte left; -lu_byte right; -}priority[]={ -{6,6},{6,6},{7,7},{7,7},{7,7}, -{10,9},{5,4}, -{3,3},{3,3}, -{3,3},{3,3},{3,3},{3,3}, -{2,2},{1,1} -}; -static BinOpr subexpr(LexState*ls,expdesc*v,unsigned int limit){ -BinOpr op; -UnOpr uop; -enterlevel(ls); -uop=getunopr(ls->t.token); -if(uop!=OPR_NOUNOPR){ -luaX_next(ls); -subexpr(ls,v,8); -luaK_prefix(ls->fs,uop,v); -} -else simpleexp(ls,v); -op=getbinopr(ls->t.token); -while(op!=OPR_NOBINOPR&&priority[op].left>limit){ -expdesc v2; -BinOpr nextop; -luaX_next(ls); -luaK_infix(ls->fs,op,v); -nextop=subexpr(ls,&v2,priority[op].right); -luaK_posfix(ls->fs,op,v,&v2); -op=nextop; -} -leavelevel(ls); -return op; -} -static void expr(LexState*ls,expdesc*v){ -subexpr(ls,v,0); -} -static int block_follow(int token){ -switch(token){ -case TK_ELSE:case TK_ELSEIF:case TK_END: -case TK_UNTIL:case TK_EOS: -return 1; -default:return 0; -} -} -static void block(LexState*ls){ -FuncState*fs=ls->fs; -BlockCnt bl; -enterblock(fs,&bl,0); -chunk(ls); -leaveblock(fs); -} -struct LHS_assign{ -struct LHS_assign*prev; -expdesc v; -}; -static void check_conflict(LexState*ls,struct LHS_assign*lh,expdesc*v){ -FuncState*fs=ls->fs; -int extra=fs->freereg; -int conflict=0; -for(;lh;lh=lh->prev){ -if(lh->v.k==VINDEXED){ -if(lh->v.u.s.info==v->u.s.info){ -conflict=1; -lh->v.u.s.info=extra; -} -if(lh->v.u.s.aux==v->u.s.info){ -conflict=1; -lh->v.u.s.aux=extra; -} -} -} -if(conflict){ -luaK_codeABC(fs,OP_MOVE,fs->freereg,v->u.s.info,0); -luaK_reserveregs(fs,1); -} -} -static void assignment(LexState*ls,struct LHS_assign*lh,int nvars){ -expdesc e; -check_condition(ls,VLOCAL<=lh->v.k&&lh->v.k<=VINDEXED, -"syntax error"); -if(testnext(ls,',')){ -struct LHS_assign nv; -nv.prev=lh; -primaryexp(ls,&nv.v); -if(nv.v.k==VLOCAL) -check_conflict(ls,lh,&nv.v); -luaY_checklimit(ls->fs,nvars,200-ls->L->nCcalls, -"variables in assignment"); -assignment(ls,&nv,nvars+1); -} -else{ -int nexps; -checknext(ls,'='); -nexps=explist1(ls,&e); -if(nexps!=nvars){ -adjust_assign(ls,nvars,nexps,&e); -if(nexps>nvars) -ls->fs->freereg-=nexps-nvars; -} -else{ -luaK_setoneret(ls->fs,&e); -luaK_storevar(ls->fs,&lh->v,&e); -return; -} -} -init_exp(&e,VNONRELOC,ls->fs->freereg-1); -luaK_storevar(ls->fs,&lh->v,&e); -} -static int cond(LexState*ls){ -expdesc v; -expr(ls,&v); -if(v.k==VNIL)v.k=VFALSE; -luaK_goiftrue(ls->fs,&v); -return v.f; -} -static void breakstat(LexState*ls){ -FuncState*fs=ls->fs; -BlockCnt*bl=fs->bl; -int upval=0; -while(bl&&!bl->isbreakable){ -upval|=bl->upval; -bl=bl->previous; -} -if(!bl) -luaX_syntaxerror(ls,"no loop to break"); -if(upval) -luaK_codeABC(fs,OP_CLOSE,bl->nactvar,0,0); -luaK_concat(fs,&bl->breaklist,luaK_jump(fs)); -} -static void whilestat(LexState*ls,int line){ -FuncState*fs=ls->fs; -int whileinit; -int condexit; -BlockCnt bl; -luaX_next(ls); -whileinit=luaK_getlabel(fs); -condexit=cond(ls); -enterblock(fs,&bl,1); -checknext(ls,TK_DO); -block(ls); -luaK_patchlist(fs,luaK_jump(fs),whileinit); -check_match(ls,TK_END,TK_WHILE,line); -leaveblock(fs); -luaK_patchtohere(fs,condexit); -} -static void repeatstat(LexState*ls,int line){ -int condexit; -FuncState*fs=ls->fs; -int repeat_init=luaK_getlabel(fs); -BlockCnt bl1,bl2; -enterblock(fs,&bl1,1); -enterblock(fs,&bl2,0); -luaX_next(ls); -chunk(ls); -check_match(ls,TK_UNTIL,TK_REPEAT,line); -condexit=cond(ls); -if(!bl2.upval){ -leaveblock(fs); -luaK_patchlist(ls->fs,condexit,repeat_init); -} -else{ -breakstat(ls); -luaK_patchtohere(ls->fs,condexit); -leaveblock(fs); -luaK_patchlist(ls->fs,luaK_jump(fs),repeat_init); -} -leaveblock(fs); -} -static int exp1(LexState*ls){ -expdesc e; -int k; -expr(ls,&e); -k=e.k; -luaK_exp2nextreg(ls->fs,&e); -return k; -} -static void forbody(LexState*ls,int base,int line,int nvars,int isnum){ -BlockCnt bl; -FuncState*fs=ls->fs; -int prep,endfor; -adjustlocalvars(ls,3); -checknext(ls,TK_DO); -prep=isnum?luaK_codeAsBx(fs,OP_FORPREP,base,(-1)):luaK_jump(fs); -enterblock(fs,&bl,0); -adjustlocalvars(ls,nvars); -luaK_reserveregs(fs,nvars); -block(ls); -leaveblock(fs); -luaK_patchtohere(fs,prep); -endfor=(isnum)?luaK_codeAsBx(fs,OP_FORLOOP,base,(-1)): -luaK_codeABC(fs,OP_TFORLOOP,base,0,nvars); -luaK_fixline(fs,line); -luaK_patchlist(fs,(isnum?endfor:luaK_jump(fs)),prep+1); -} -static void fornum(LexState*ls,TString*varname,int line){ -FuncState*fs=ls->fs; -int base=fs->freereg; -new_localvarliteral(ls,"(for index)",0); -new_localvarliteral(ls,"(for limit)",1); -new_localvarliteral(ls,"(for step)",2); -new_localvar(ls,varname,3); -checknext(ls,'='); -exp1(ls); -checknext(ls,','); -exp1(ls); -if(testnext(ls,',')) -exp1(ls); -else{ -luaK_codeABx(fs,OP_LOADK,fs->freereg,luaK_numberK(fs,1)); -luaK_reserveregs(fs,1); -} -forbody(ls,base,line,1,1); -} -static void forlist(LexState*ls,TString*indexname){ -FuncState*fs=ls->fs; -expdesc e; -int nvars=0; -int line; -int base=fs->freereg; -new_localvarliteral(ls,"(for generator)",nvars++); -new_localvarliteral(ls,"(for state)",nvars++); -new_localvarliteral(ls,"(for control)",nvars++); -new_localvar(ls,indexname,nvars++); -while(testnext(ls,',')) -new_localvar(ls,str_checkname(ls),nvars++); -checknext(ls,TK_IN); -line=ls->linenumber; -adjust_assign(ls,3,explist1(ls,&e),&e); -luaK_checkstack(fs,3); -forbody(ls,base,line,nvars-3,0); -} -static void forstat(LexState*ls,int line){ -FuncState*fs=ls->fs; -TString*varname; -BlockCnt bl; -enterblock(fs,&bl,1); -luaX_next(ls); -varname=str_checkname(ls); -switch(ls->t.token){ -case'=':fornum(ls,varname,line);break; -case',':case TK_IN:forlist(ls,varname);break; -default:luaX_syntaxerror(ls,LUA_QL("=")" or "LUA_QL("in")" expected"); -} -check_match(ls,TK_END,TK_FOR,line); -leaveblock(fs); -} -static int test_then_block(LexState*ls){ -int condexit; -luaX_next(ls); -condexit=cond(ls); -checknext(ls,TK_THEN); -block(ls); -return condexit; -} -static void ifstat(LexState*ls,int line){ -FuncState*fs=ls->fs; -int flist; -int escapelist=(-1); -flist=test_then_block(ls); -while(ls->t.token==TK_ELSEIF){ -luaK_concat(fs,&escapelist,luaK_jump(fs)); -luaK_patchtohere(fs,flist); -flist=test_then_block(ls); -} -if(ls->t.token==TK_ELSE){ -luaK_concat(fs,&escapelist,luaK_jump(fs)); -luaK_patchtohere(fs,flist); -luaX_next(ls); -block(ls); -} -else -luaK_concat(fs,&escapelist,flist); -luaK_patchtohere(fs,escapelist); -check_match(ls,TK_END,TK_IF,line); -} -static void localfunc(LexState*ls){ -expdesc v,b; -FuncState*fs=ls->fs; -new_localvar(ls,str_checkname(ls),0); -init_exp(&v,VLOCAL,fs->freereg); -luaK_reserveregs(fs,1); -adjustlocalvars(ls,1); -body(ls,&b,0,ls->linenumber); -luaK_storevar(fs,&v,&b); -getlocvar(fs,fs->nactvar-1).startpc=fs->pc; -} -static void localstat(LexState*ls){ -int nvars=0; -int nexps; -expdesc e; -do{ -new_localvar(ls,str_checkname(ls),nvars++); -}while(testnext(ls,',')); -if(testnext(ls,'=')) -nexps=explist1(ls,&e); -else{ -e.k=VVOID; -nexps=0; -} -adjust_assign(ls,nvars,nexps,&e); -adjustlocalvars(ls,nvars); -} -static int funcname(LexState*ls,expdesc*v){ -int needself=0; -singlevar(ls,v); -while(ls->t.token=='.') -field(ls,v); -if(ls->t.token==':'){ -needself=1; -field(ls,v); -} -return needself; -} -static void funcstat(LexState*ls,int line){ -int needself; -expdesc v,b; -luaX_next(ls); -needself=funcname(ls,&v); -body(ls,&b,needself,line); -luaK_storevar(ls->fs,&v,&b); -luaK_fixline(ls->fs,line); -} -static void exprstat(LexState*ls){ -FuncState*fs=ls->fs; -struct LHS_assign v; -primaryexp(ls,&v.v); -if(v.v.k==VCALL) -SETARG_C(getcode(fs,&v.v),1); -else{ -v.prev=NULL; -assignment(ls,&v,1); -} -} -static void retstat(LexState*ls){ -FuncState*fs=ls->fs; -expdesc e; -int first,nret; -luaX_next(ls); -if(block_follow(ls->t.token)||ls->t.token==';') -first=nret=0; -else{ -nret=explist1(ls,&e); -if(hasmultret(e.k)){ -luaK_setmultret(fs,&e); -if(e.k==VCALL&&nret==1){ -SET_OPCODE(getcode(fs,&e),OP_TAILCALL); -} -first=fs->nactvar; -nret=(-1); -} -else{ -if(nret==1) -first=luaK_exp2anyreg(fs,&e); -else{ -luaK_exp2nextreg(fs,&e); -first=fs->nactvar; -} -} -} -luaK_ret(fs,first,nret); -} -static int statement(LexState*ls){ -int line=ls->linenumber; -switch(ls->t.token){ -case TK_IF:{ -ifstat(ls,line); -return 0; -} -case TK_WHILE:{ -whilestat(ls,line); -return 0; -} -case TK_DO:{ -luaX_next(ls); -block(ls); -check_match(ls,TK_END,TK_DO,line); -return 0; -} -case TK_FOR:{ -forstat(ls,line); -return 0; -} -case TK_REPEAT:{ -repeatstat(ls,line); -return 0; -} -case TK_FUNCTION:{ -funcstat(ls,line); -return 0; -} -case TK_LOCAL:{ -luaX_next(ls); -if(testnext(ls,TK_FUNCTION)) -localfunc(ls); -else -localstat(ls); -return 0; -} -case TK_RETURN:{ -retstat(ls); -return 1; -} -case TK_BREAK:{ -luaX_next(ls); -breakstat(ls); -return 1; -} -default:{ -exprstat(ls); -return 0; -} -} -} -static void chunk(LexState*ls){ -int islast=0; -enterlevel(ls); -while(!islast&&!block_follow(ls->t.token)){ -islast=statement(ls); -testnext(ls,';'); -ls->fs->freereg=ls->fs->nactvar; -} -leavelevel(ls); -} -static const TValue*luaV_tonumber(const TValue*obj,TValue*n){ -lua_Number num; -if(ttisnumber(obj))return obj; -if(ttisstring(obj)&&luaO_str2d(svalue(obj),&num)){ -setnvalue(n,num); -return n; -} -else -return NULL; -} -static int luaV_tostring(lua_State*L,StkId obj){ -if(!ttisnumber(obj)) -return 0; -else{ -char s[32]; -lua_Number n=nvalue(obj); -lua_number2str(s,n); -setsvalue(L,obj,luaS_new(L,s)); -return 1; -} -} -static void callTMres(lua_State*L,StkId res,const TValue*f, -const TValue*p1,const TValue*p2){ -ptrdiff_t result=savestack(L,res); -setobj(L,L->top,f); -setobj(L,L->top+1,p1); -setobj(L,L->top+2,p2); -luaD_checkstack(L,3); -L->top+=3; -luaD_call(L,L->top-3,1); -res=restorestack(L,result); -L->top--; -setobj(L,res,L->top); -} -static void callTM(lua_State*L,const TValue*f,const TValue*p1, -const TValue*p2,const TValue*p3){ -setobj(L,L->top,f); -setobj(L,L->top+1,p1); -setobj(L,L->top+2,p2); -setobj(L,L->top+3,p3); -luaD_checkstack(L,4); -L->top+=4; -luaD_call(L,L->top-4,0); -} -static void luaV_gettable(lua_State*L,const TValue*t,TValue*key,StkId val){ -int loop; -for(loop=0;loop<100;loop++){ -const TValue*tm; -if(ttistable(t)){ -Table*h=hvalue(t); -const TValue*res=luaH_get(h,key); -if(!ttisnil(res)|| -(tm=fasttm(L,h->metatable,TM_INDEX))==NULL){ -setobj(L,val,res); -return; -} -} -else if(ttisnil(tm=luaT_gettmbyobj(L,t,TM_INDEX))) -luaG_typeerror(L,t,"index"); -if(ttisfunction(tm)){ -callTMres(L,val,tm,t,key); -return; -} -t=tm; -} -luaG_runerror(L,"loop in gettable"); -} -static void luaV_settable(lua_State*L,const TValue*t,TValue*key,StkId val){ -int loop; -TValue temp; -for(loop=0;loop<100;loop++){ -const TValue*tm; -if(ttistable(t)){ -Table*h=hvalue(t); -TValue*oldval=luaH_set(L,h,key); -if(!ttisnil(oldval)|| -(tm=fasttm(L,h->metatable,TM_NEWINDEX))==NULL){ -setobj(L,oldval,val); -h->flags=0; -luaC_barriert(L,h,val); -return; -} -} -else if(ttisnil(tm=luaT_gettmbyobj(L,t,TM_NEWINDEX))) -luaG_typeerror(L,t,"index"); -if(ttisfunction(tm)){ -callTM(L,tm,t,key,val); -return; -} -setobj(L,&temp,tm); -t=&temp; -} -luaG_runerror(L,"loop in settable"); -} -static int call_binTM(lua_State*L,const TValue*p1,const TValue*p2, -StkId res,TMS event){ -const TValue*tm=luaT_gettmbyobj(L,p1,event); -if(ttisnil(tm)) -tm=luaT_gettmbyobj(L,p2,event); -if(ttisnil(tm))return 0; -callTMres(L,res,tm,p1,p2); -return 1; -} -static const TValue*get_compTM(lua_State*L,Table*mt1,Table*mt2, -TMS event){ -const TValue*tm1=fasttm(L,mt1,event); -const TValue*tm2; -if(tm1==NULL)return NULL; -if(mt1==mt2)return tm1; -tm2=fasttm(L,mt2,event); -if(tm2==NULL)return NULL; -if(luaO_rawequalObj(tm1,tm2)) -return tm1; -return NULL; -} -static int call_orderTM(lua_State*L,const TValue*p1,const TValue*p2, -TMS event){ -const TValue*tm1=luaT_gettmbyobj(L,p1,event); -const TValue*tm2; -if(ttisnil(tm1))return-1; -tm2=luaT_gettmbyobj(L,p2,event); -if(!luaO_rawequalObj(tm1,tm2)) -return-1; -callTMres(L,L->top,tm1,p1,p2); -return!l_isfalse(L->top); -} -static int l_strcmp(const TString*ls,const TString*rs){ -const char*l=getstr(ls); -size_t ll=ls->tsv.len; -const char*r=getstr(rs); -size_t lr=rs->tsv.len; -for(;;){ -int temp=strcoll(l,r); -if(temp!=0)return temp; -else{ -size_t len=strlen(l); -if(len==lr) -return(len==ll)?0:1; -else if(len==ll) -return-1; -len++; -l+=len;ll-=len;r+=len;lr-=len; -} -} -} -static int luaV_lessthan(lua_State*L,const TValue*l,const TValue*r){ -int res; -if(ttype(l)!=ttype(r)) -return luaG_ordererror(L,l,r); -else if(ttisnumber(l)) -return luai_numlt(nvalue(l),nvalue(r)); -else if(ttisstring(l)) -return l_strcmp(rawtsvalue(l),rawtsvalue(r))<0; -else if((res=call_orderTM(L,l,r,TM_LT))!=-1) -return res; -return luaG_ordererror(L,l,r); -} -static int lessequal(lua_State*L,const TValue*l,const TValue*r){ -int res; -if(ttype(l)!=ttype(r)) -return luaG_ordererror(L,l,r); -else if(ttisnumber(l)) -return luai_numle(nvalue(l),nvalue(r)); -else if(ttisstring(l)) -return l_strcmp(rawtsvalue(l),rawtsvalue(r))<=0; -else if((res=call_orderTM(L,l,r,TM_LE))!=-1) -return res; -else if((res=call_orderTM(L,r,l,TM_LT))!=-1) -return!res; -return luaG_ordererror(L,l,r); -} -static int luaV_equalval(lua_State*L,const TValue*t1,const TValue*t2){ -const TValue*tm; -switch(ttype(t1)){ -case 0:return 1; -case 3:return luai_numeq(nvalue(t1),nvalue(t2)); -case 1:return bvalue(t1)==bvalue(t2); -case 2:return pvalue(t1)==pvalue(t2); -case 7:{ -if(uvalue(t1)==uvalue(t2))return 1; -tm=get_compTM(L,uvalue(t1)->metatable,uvalue(t2)->metatable, -TM_EQ); -break; -} -case 5:{ -if(hvalue(t1)==hvalue(t2))return 1; -tm=get_compTM(L,hvalue(t1)->metatable,hvalue(t2)->metatable,TM_EQ); -break; -} -default:return gcvalue(t1)==gcvalue(t2); -} -if(tm==NULL)return 0; -callTMres(L,L->top,tm,t1,t2); -return!l_isfalse(L->top); -} -static void luaV_concat(lua_State*L,int total,int last){ -do{ -StkId top=L->base+last+1; -int n=2; -if(!(ttisstring(top-2)||ttisnumber(top-2))||!tostring(L,top-1)){ -if(!call_binTM(L,top-2,top-1,top-2,TM_CONCAT)) -luaG_concaterror(L,top-2,top-1); -}else if(tsvalue(top-1)->len==0) -(void)tostring(L,top-2); -else{ -size_t tl=tsvalue(top-1)->len; -char*buffer; -int i; -for(n=1;nlen; -if(l>=((size_t)(~(size_t)0)-2)-tl)luaG_runerror(L,"string length overflow"); -tl+=l; -} -buffer=luaZ_openspace(L,&G(L)->buff,tl); -tl=0; -for(i=n;i>0;i--){ -size_t l=tsvalue(top-i)->len; -memcpy(buffer+tl,svalue(top-i),l); -tl+=l; -} -setsvalue(L,top-n,luaS_newlstr(L,buffer,tl)); -} -total-=n-1; -last-=n-1; -}while(total>1); -} -static void Arith(lua_State*L,StkId ra,const TValue*rb, -const TValue*rc,TMS op){ -TValue tempb,tempc; -const TValue*b,*c; -if((b=luaV_tonumber(rb,&tempb))!=NULL&& -(c=luaV_tonumber(rc,&tempc))!=NULL){ -lua_Number nb=nvalue(b),nc=nvalue(c); -switch(op){ -case TM_ADD:setnvalue(ra,luai_numadd(nb,nc));break; -case TM_SUB:setnvalue(ra,luai_numsub(nb,nc));break; -case TM_MUL:setnvalue(ra,luai_nummul(nb,nc));break; -case TM_DIV:setnvalue(ra,luai_numdiv(nb,nc));break; -case TM_MOD:setnvalue(ra,luai_nummod(nb,nc));break; -case TM_POW:setnvalue(ra,luai_numpow(nb,nc));break; -case TM_UNM:setnvalue(ra,luai_numunm(nb));break; -default:break; -} -} -else if(!call_binTM(L,rb,rc,ra,op)) -luaG_aritherror(L,rb,rc); -} -#define runtime_check(L,c){if(!(c))break;} -#define RA(i)(base+GETARG_A(i)) -#define RB(i)check_exp(getBMode(GET_OPCODE(i))==OpArgR,base+GETARG_B(i)) -#define RKB(i)check_exp(getBMode(GET_OPCODE(i))==OpArgK,ISK(GETARG_B(i))?k+INDEXK(GETARG_B(i)):base+GETARG_B(i)) -#define RKC(i)check_exp(getCMode(GET_OPCODE(i))==OpArgK,ISK(GETARG_C(i))?k+INDEXK(GETARG_C(i)):base+GETARG_C(i)) -#define KBx(i)check_exp(getBMode(GET_OPCODE(i))==OpArgK,k+GETARG_Bx(i)) -#define dojump(L,pc,i){(pc)+=(i);} -#define Protect(x){L->savedpc=pc;{x;};base=L->base;} -#define arith_op(op,tm){TValue*rb=RKB(i);TValue*rc=RKC(i);if(ttisnumber(rb)&&ttisnumber(rc)){lua_Number nb=nvalue(rb),nc=nvalue(rc);setnvalue(ra,op(nb,nc));}else Protect(Arith(L,ra,rb,rc,tm));} -static void luaV_execute(lua_State*L,int nexeccalls){ -LClosure*cl; -StkId base; -TValue*k; -const Instruction*pc; -reentry: -pc=L->savedpc; -cl=&clvalue(L->ci->func)->l; -base=L->base; -k=cl->p->k; -for(;;){ -const Instruction i=*pc++; -StkId ra; -ra=RA(i); -switch(GET_OPCODE(i)){ -case OP_MOVE:{ -setobj(L,ra,RB(i)); -continue; -} -case OP_LOADK:{ -setobj(L,ra,KBx(i)); -continue; -} -case OP_LOADBOOL:{ -setbvalue(ra,GETARG_B(i)); -if(GETARG_C(i))pc++; -continue; -} -case OP_LOADNIL:{ -TValue*rb=RB(i); -do{ -setnilvalue(rb--); -}while(rb>=ra); -continue; -} -case OP_GETUPVAL:{ -int b=GETARG_B(i); -setobj(L,ra,cl->upvals[b]->v); -continue; -} -case OP_GETGLOBAL:{ -TValue g; -TValue*rb=KBx(i); -sethvalue(L,&g,cl->env); -Protect(luaV_gettable(L,&g,rb,ra)); -continue; -} -case OP_GETTABLE:{ -Protect(luaV_gettable(L,RB(i),RKC(i),ra)); -continue; -} -case OP_SETGLOBAL:{ -TValue g; -sethvalue(L,&g,cl->env); -Protect(luaV_settable(L,&g,KBx(i),ra)); -continue; -} -case OP_SETUPVAL:{ -UpVal*uv=cl->upvals[GETARG_B(i)]; -setobj(L,uv->v,ra); -luaC_barrier(L,uv,ra); -continue; -} -case OP_SETTABLE:{ -Protect(luaV_settable(L,ra,RKB(i),RKC(i))); -continue; -} -case OP_NEWTABLE:{ -int b=GETARG_B(i); -int c=GETARG_C(i); -sethvalue(L,ra,luaH_new(L,luaO_fb2int(b),luaO_fb2int(c))); -Protect(luaC_checkGC(L)); -continue; -} -case OP_SELF:{ -StkId rb=RB(i); -setobj(L,ra+1,rb); -Protect(luaV_gettable(L,rb,RKC(i),ra)); -continue; -} -case OP_ADD:{ -arith_op(luai_numadd,TM_ADD); -continue; -} -case OP_SUB:{ -arith_op(luai_numsub,TM_SUB); -continue; -} -case OP_MUL:{ -arith_op(luai_nummul,TM_MUL); -continue; -} -case OP_DIV:{ -arith_op(luai_numdiv,TM_DIV); -continue; -} -case OP_MOD:{ -arith_op(luai_nummod,TM_MOD); -continue; -} -case OP_POW:{ -arith_op(luai_numpow,TM_POW); -continue; -} -case OP_UNM:{ -TValue*rb=RB(i); -if(ttisnumber(rb)){ -lua_Number nb=nvalue(rb); -setnvalue(ra,luai_numunm(nb)); -} -else{ -Protect(Arith(L,ra,rb,rb,TM_UNM)); -} -continue; -} -case OP_NOT:{ -int res=l_isfalse(RB(i)); -setbvalue(ra,res); -continue; -} -case OP_LEN:{ -const TValue*rb=RB(i); -switch(ttype(rb)){ -case 5:{ -setnvalue(ra,cast_num(luaH_getn(hvalue(rb)))); -break; -} -case 4:{ -setnvalue(ra,cast_num(tsvalue(rb)->len)); -break; -} -default:{ -Protect( -if(!call_binTM(L,rb,(&luaO_nilobject_),ra,TM_LEN)) -luaG_typeerror(L,rb,"get length of"); -) -} -} -continue; -} -case OP_CONCAT:{ -int b=GETARG_B(i); -int c=GETARG_C(i); -Protect(luaV_concat(L,c-b+1,c);luaC_checkGC(L)); -setobj(L,RA(i),base+b); -continue; -} -case OP_JMP:{ -dojump(L,pc,GETARG_sBx(i)); -continue; -} -case OP_EQ:{ -TValue*rb=RKB(i); -TValue*rc=RKC(i); -Protect( -if(equalobj(L,rb,rc)==GETARG_A(i)) -dojump(L,pc,GETARG_sBx(*pc)); -) -pc++; -continue; -} -case OP_LT:{ -Protect( -if(luaV_lessthan(L,RKB(i),RKC(i))==GETARG_A(i)) -dojump(L,pc,GETARG_sBx(*pc)); -) -pc++; -continue; -} -case OP_LE:{ -Protect( -if(lessequal(L,RKB(i),RKC(i))==GETARG_A(i)) -dojump(L,pc,GETARG_sBx(*pc)); -) -pc++; -continue; -} -case OP_TEST:{ -if(l_isfalse(ra)!=GETARG_C(i)) -dojump(L,pc,GETARG_sBx(*pc)); -pc++; -continue; -} -case OP_TESTSET:{ -TValue*rb=RB(i); -if(l_isfalse(rb)!=GETARG_C(i)){ -setobj(L,ra,rb); -dojump(L,pc,GETARG_sBx(*pc)); -} -pc++; -continue; -} -case OP_CALL:{ -int b=GETARG_B(i); -int nresults=GETARG_C(i)-1; -if(b!=0)L->top=ra+b; -L->savedpc=pc; -switch(luaD_precall(L,ra,nresults)){ -case 0:{ -nexeccalls++; -goto reentry; -} -case 1:{ -if(nresults>=0)L->top=L->ci->top; -base=L->base; -continue; -} -default:{ -return; -} -} -} -case OP_TAILCALL:{ -int b=GETARG_B(i); -if(b!=0)L->top=ra+b; -L->savedpc=pc; -switch(luaD_precall(L,ra,(-1))){ -case 0:{ -CallInfo*ci=L->ci-1; -int aux; -StkId func=ci->func; -StkId pfunc=(ci+1)->func; -if(L->openupval)luaF_close(L,ci->base); -L->base=ci->base=ci->func+((ci+1)->base-pfunc); -for(aux=0;pfunc+auxtop;aux++) -setobj(L,func+aux,pfunc+aux); -ci->top=L->top=func+aux; -ci->savedpc=L->savedpc; -ci->tailcalls++; -L->ci--; -goto reentry; -} -case 1:{ -base=L->base; -continue; -} -default:{ -return; -} -} -} -case OP_RETURN:{ -int b=GETARG_B(i); -if(b!=0)L->top=ra+b-1; -if(L->openupval)luaF_close(L,base); -L->savedpc=pc; -b=luaD_poscall(L,ra); -if(--nexeccalls==0) -return; -else{ -if(b)L->top=L->ci->top; -goto reentry; -} -} -case OP_FORLOOP:{ -lua_Number step=nvalue(ra+2); -lua_Number idx=luai_numadd(nvalue(ra),step); -lua_Number limit=nvalue(ra+1); -if(luai_numlt(0,step)?luai_numle(idx,limit) -:luai_numle(limit,idx)){ -dojump(L,pc,GETARG_sBx(i)); -setnvalue(ra,idx); -setnvalue(ra+3,idx); -} -continue; -} -case OP_FORPREP:{ -const TValue*init=ra; -const TValue*plimit=ra+1; -const TValue*pstep=ra+2; -L->savedpc=pc; -if(!tonumber(init,ra)) -luaG_runerror(L,LUA_QL("for")" initial value must be a number"); -else if(!tonumber(plimit,ra+1)) -luaG_runerror(L,LUA_QL("for")" limit must be a number"); -else if(!tonumber(pstep,ra+2)) -luaG_runerror(L,LUA_QL("for")" step must be a number"); -setnvalue(ra,luai_numsub(nvalue(ra),nvalue(pstep))); -dojump(L,pc,GETARG_sBx(i)); -continue; -} -case OP_TFORLOOP:{ -StkId cb=ra+3; -setobj(L,cb+2,ra+2); -setobj(L,cb+1,ra+1); -setobj(L,cb,ra); -L->top=cb+3; -Protect(luaD_call(L,cb,GETARG_C(i))); -L->top=L->ci->top; -cb=RA(i)+3; -if(!ttisnil(cb)){ -setobj(L,cb-1,cb); -dojump(L,pc,GETARG_sBx(*pc)); -} -pc++; -continue; -} -case OP_SETLIST:{ -int n=GETARG_B(i); -int c=GETARG_C(i); -int last; -Table*h; -if(n==0){ -n=cast_int(L->top-ra)-1; -L->top=L->ci->top; -} -if(c==0)c=cast_int(*pc++); -runtime_check(L,ttistable(ra)); -h=hvalue(ra); -last=((c-1)*50)+n; -if(last>h->sizearray) -luaH_resizearray(L,h,last); -for(;n>0;n--){ -TValue*val=ra+n; -setobj(L,luaH_setnum(L,h,last--),val); -luaC_barriert(L,h,val); -} -continue; -} -case OP_CLOSE:{ -luaF_close(L,ra); -continue; -} -case OP_CLOSURE:{ -Proto*p; -Closure*ncl; -int nup,j; -p=cl->p->p[GETARG_Bx(i)]; -nup=p->nups; -ncl=luaF_newLclosure(L,nup,cl->env); -ncl->l.p=p; -for(j=0;jl.upvals[j]=cl->upvals[GETARG_B(*pc)]; -else{ -ncl->l.upvals[j]=luaF_findupval(L,base+GETARG_B(*pc)); -} -} -setclvalue(L,ra,ncl); -Protect(luaC_checkGC(L)); -continue; -} -case OP_VARARG:{ -int b=GETARG_B(i)-1; -int j; -CallInfo*ci=L->ci; -int n=cast_int(ci->base-ci->func)-cl->p->numparams-1; -if(b==(-1)){ -Protect(luaD_checkstack(L,n)); -ra=RA(i); -b=n; -L->top=ra+n; -} -for(j=0;jbase-n+j); -} -else{ -setnilvalue(ra+j); -} -} -continue; -} -} -} -} -#define api_checknelems(L,n)luai_apicheck(L,(n)<=(L->top-L->base)) -#define api_checkvalidindex(L,i)luai_apicheck(L,(i)!=(&luaO_nilobject_)) -#define api_incr_top(L){luai_apicheck(L,L->topci->top);L->top++;} -static TValue*index2adr(lua_State*L,int idx){ -if(idx>0){ -TValue*o=L->base+(idx-1); -luai_apicheck(L,idx<=L->ci->top-L->base); -if(o>=L->top)return cast(TValue*,(&luaO_nilobject_)); -else return o; -} -else if(idx>(-10000)){ -luai_apicheck(L,idx!=0&&-idx<=L->top-L->base); -return L->top+idx; -} -else switch(idx){ -case(-10000):return registry(L); -case(-10001):{ -Closure*func=curr_func(L); -sethvalue(L,&L->env,func->c.env); -return&L->env; -} -case(-10002):return gt(L); -default:{ -Closure*func=curr_func(L); -idx=(-10002)-idx; -return(idx<=func->c.nupvalues) -?&func->c.upvalue[idx-1] -:cast(TValue*,(&luaO_nilobject_)); -} -} -} -static Table*getcurrenv(lua_State*L){ -if(L->ci==L->base_ci) -return hvalue(gt(L)); -else{ -Closure*func=curr_func(L); -return func->c.env; -} -} -static int lua_checkstack(lua_State*L,int size){ -int res=1; -if(size>8000||(L->top-L->base+size)>8000) -res=0; -else if(size>0){ -luaD_checkstack(L,size); -if(L->ci->toptop+size) -L->ci->top=L->top+size; -} -return res; -} -static lua_CFunction lua_atpanic(lua_State*L,lua_CFunction panicf){ -lua_CFunction old; -old=G(L)->panic; -G(L)->panic=panicf; -return old; -} -static int lua_gettop(lua_State*L){ -return cast_int(L->top-L->base); -} -static void lua_settop(lua_State*L,int idx){ -if(idx>=0){ -luai_apicheck(L,idx<=L->stack_last-L->base); -while(L->topbase+idx) -setnilvalue(L->top++); -L->top=L->base+idx; -} -else{ -luai_apicheck(L,-(idx+1)<=(L->top-L->base)); -L->top+=idx+1; -} -} -static void lua_remove(lua_State*L,int idx){ -StkId p; -p=index2adr(L,idx); -api_checkvalidindex(L,p); -while(++ptop)setobj(L,p-1,p); -L->top--; -} -static void lua_insert(lua_State*L,int idx){ -StkId p; -StkId q; -p=index2adr(L,idx); -api_checkvalidindex(L,p); -for(q=L->top;q>p;q--)setobj(L,q,q-1); -setobj(L,p,L->top); -} -static void lua_replace(lua_State*L,int idx){ -StkId o; -if(idx==(-10001)&&L->ci==L->base_ci) -luaG_runerror(L,"no calling environment"); -api_checknelems(L,1); -o=index2adr(L,idx); -api_checkvalidindex(L,o); -if(idx==(-10001)){ -Closure*func=curr_func(L); -luai_apicheck(L,ttistable(L->top-1)); -func->c.env=hvalue(L->top-1); -luaC_barrier(L,func,L->top-1); -} -else{ -setobj(L,o,L->top-1); -if(idx<(-10002)) -luaC_barrier(L,curr_func(L),L->top-1); -} -L->top--; -} -static void lua_pushvalue(lua_State*L,int idx){ -setobj(L,L->top,index2adr(L,idx)); -api_incr_top(L); -} -static int lua_type(lua_State*L,int idx){ -StkId o=index2adr(L,idx); -return(o==(&luaO_nilobject_))?(-1):ttype(o); -} -static const char*lua_typename(lua_State*L,int t){ -UNUSED(L); -return(t==(-1))?"no value":luaT_typenames[t]; -} -static int lua_iscfunction(lua_State*L,int idx){ -StkId o=index2adr(L,idx); -return iscfunction(o); -} -static int lua_isnumber(lua_State*L,int idx){ -TValue n; -const TValue*o=index2adr(L,idx); -return tonumber(o,&n); -} -static int lua_isstring(lua_State*L,int idx){ -int t=lua_type(L,idx); -return(t==4||t==3); -} -static int lua_rawequal(lua_State*L,int index1,int index2){ -StkId o1=index2adr(L,index1); -StkId o2=index2adr(L,index2); -return(o1==(&luaO_nilobject_)||o2==(&luaO_nilobject_))?0 -:luaO_rawequalObj(o1,o2); -} -static int lua_lessthan(lua_State*L,int index1,int index2){ -StkId o1,o2; -int i; -o1=index2adr(L,index1); -o2=index2adr(L,index2); -i=(o1==(&luaO_nilobject_)||o2==(&luaO_nilobject_))?0 -:luaV_lessthan(L,o1,o2); -return i; -} -static lua_Number lua_tonumber(lua_State*L,int idx){ -TValue n; -const TValue*o=index2adr(L,idx); -if(tonumber(o,&n)) -return nvalue(o); -else -return 0; -} -static lua_Integer lua_tointeger(lua_State*L,int idx){ -TValue n; -const TValue*o=index2adr(L,idx); -if(tonumber(o,&n)){ -lua_Integer res; -lua_Number num=nvalue(o); -lua_number2integer(res,num); -return res; -} -else -return 0; -} -static int lua_toboolean(lua_State*L,int idx){ -const TValue*o=index2adr(L,idx); -return!l_isfalse(o); -} -static const char*lua_tolstring(lua_State*L,int idx,size_t*len){ -StkId o=index2adr(L,idx); -if(!ttisstring(o)){ -if(!luaV_tostring(L,o)){ -if(len!=NULL)*len=0; -return NULL; -} -luaC_checkGC(L); -o=index2adr(L,idx); -} -if(len!=NULL)*len=tsvalue(o)->len; -return svalue(o); -} -static size_t lua_objlen(lua_State*L,int idx){ -StkId o=index2adr(L,idx); -switch(ttype(o)){ -case 4:return tsvalue(o)->len; -case 7:return uvalue(o)->len; -case 5:return luaH_getn(hvalue(o)); -case 3:{ -size_t l; -l=(luaV_tostring(L,o)?tsvalue(o)->len:0); -return l; -} -default:return 0; -} -} -static lua_CFunction lua_tocfunction(lua_State*L,int idx){ -StkId o=index2adr(L,idx); -return(!iscfunction(o))?NULL:clvalue(o)->c.f; -} -static void*lua_touserdata(lua_State*L,int idx){ -StkId o=index2adr(L,idx); -switch(ttype(o)){ -case 7:return(rawuvalue(o)+1); -case 2:return pvalue(o); -default:return NULL; -} -} -static void lua_pushnil(lua_State*L){ -setnilvalue(L->top); -api_incr_top(L); -} -static void lua_pushnumber(lua_State*L,lua_Number n){ -setnvalue(L->top,n); -api_incr_top(L); -} -static void lua_pushinteger(lua_State*L,lua_Integer n){ -setnvalue(L->top,cast_num(n)); -api_incr_top(L); -} -static void lua_pushlstring(lua_State*L,const char*s,size_t len){ -luaC_checkGC(L); -setsvalue(L,L->top,luaS_newlstr(L,s,len)); -api_incr_top(L); -} -static void lua_pushstring(lua_State*L,const char*s){ -if(s==NULL) -lua_pushnil(L); -else -lua_pushlstring(L,s,strlen(s)); -} -static const char*lua_pushvfstring(lua_State*L,const char*fmt, -va_list argp){ -const char*ret; -luaC_checkGC(L); -ret=luaO_pushvfstring(L,fmt,argp); -return ret; -} -static const char*lua_pushfstring(lua_State*L,const char*fmt,...){ -const char*ret; -va_list argp; -luaC_checkGC(L); -va_start(argp,fmt); -ret=luaO_pushvfstring(L,fmt,argp); -va_end(argp); -return ret; -} -static void lua_pushcclosure(lua_State*L,lua_CFunction fn,int n){ -Closure*cl; -luaC_checkGC(L); -api_checknelems(L,n); -cl=luaF_newCclosure(L,n,getcurrenv(L)); -cl->c.f=fn; -L->top-=n; -while(n--) -setobj(L,&cl->c.upvalue[n],L->top+n); -setclvalue(L,L->top,cl); -api_incr_top(L); -} -static void lua_pushboolean(lua_State*L,int b){ -setbvalue(L->top,(b!=0)); -api_incr_top(L); -} -static int lua_pushthread(lua_State*L){ -setthvalue(L,L->top,L); -api_incr_top(L); -return(G(L)->mainthread==L); -} -static void lua_gettable(lua_State*L,int idx){ -StkId t; -t=index2adr(L,idx); -api_checkvalidindex(L,t); -luaV_gettable(L,t,L->top-1,L->top-1); -} -static void lua_getfield(lua_State*L,int idx,const char*k){ -StkId t; -TValue key; -t=index2adr(L,idx); -api_checkvalidindex(L,t); -setsvalue(L,&key,luaS_new(L,k)); -luaV_gettable(L,t,&key,L->top); -api_incr_top(L); -} -static void lua_rawget(lua_State*L,int idx){ -StkId t; -t=index2adr(L,idx); -luai_apicheck(L,ttistable(t)); -setobj(L,L->top-1,luaH_get(hvalue(t),L->top-1)); -} -static void lua_rawgeti(lua_State*L,int idx,int n){ -StkId o; -o=index2adr(L,idx); -luai_apicheck(L,ttistable(o)); -setobj(L,L->top,luaH_getnum(hvalue(o),n)); -api_incr_top(L); -} -static void lua_createtable(lua_State*L,int narray,int nrec){ -luaC_checkGC(L); -sethvalue(L,L->top,luaH_new(L,narray,nrec)); -api_incr_top(L); -} -static int lua_getmetatable(lua_State*L,int objindex){ -const TValue*obj; -Table*mt=NULL; -int res; -obj=index2adr(L,objindex); -switch(ttype(obj)){ -case 5: -mt=hvalue(obj)->metatable; -break; -case 7: -mt=uvalue(obj)->metatable; -break; -default: -mt=G(L)->mt[ttype(obj)]; -break; -} -if(mt==NULL) -res=0; -else{ -sethvalue(L,L->top,mt); -api_incr_top(L); -res=1; -} -return res; -} -static void lua_getfenv(lua_State*L,int idx){ -StkId o; -o=index2adr(L,idx); -api_checkvalidindex(L,o); -switch(ttype(o)){ -case 6: -sethvalue(L,L->top,clvalue(o)->c.env); -break; -case 7: -sethvalue(L,L->top,uvalue(o)->env); -break; -case 8: -setobj(L,L->top,gt(thvalue(o))); -break; -default: -setnilvalue(L->top); -break; -} -api_incr_top(L); -} -static void lua_settable(lua_State*L,int idx){ -StkId t; -api_checknelems(L,2); -t=index2adr(L,idx); -api_checkvalidindex(L,t); -luaV_settable(L,t,L->top-2,L->top-1); -L->top-=2; -} -static void lua_setfield(lua_State*L,int idx,const char*k){ -StkId t; -TValue key; -api_checknelems(L,1); -t=index2adr(L,idx); -api_checkvalidindex(L,t); -setsvalue(L,&key,luaS_new(L,k)); -luaV_settable(L,t,&key,L->top-1); -L->top--; -} -static void lua_rawset(lua_State*L,int idx){ -StkId t; -api_checknelems(L,2); -t=index2adr(L,idx); -luai_apicheck(L,ttistable(t)); -setobj(L,luaH_set(L,hvalue(t),L->top-2),L->top-1); -luaC_barriert(L,hvalue(t),L->top-1); -L->top-=2; -} -static void lua_rawseti(lua_State*L,int idx,int n){ -StkId o; -api_checknelems(L,1); -o=index2adr(L,idx); -luai_apicheck(L,ttistable(o)); -setobj(L,luaH_setnum(L,hvalue(o),n),L->top-1); -luaC_barriert(L,hvalue(o),L->top-1); -L->top--; -} -static int lua_setmetatable(lua_State*L,int objindex){ -TValue*obj; -Table*mt; -api_checknelems(L,1); -obj=index2adr(L,objindex); -api_checkvalidindex(L,obj); -if(ttisnil(L->top-1)) -mt=NULL; -else{ -luai_apicheck(L,ttistable(L->top-1)); -mt=hvalue(L->top-1); -} -switch(ttype(obj)){ -case 5:{ -hvalue(obj)->metatable=mt; -if(mt) -luaC_objbarriert(L,hvalue(obj),mt); -break; -} -case 7:{ -uvalue(obj)->metatable=mt; -if(mt) -luaC_objbarrier(L,rawuvalue(obj),mt); -break; -} -default:{ -G(L)->mt[ttype(obj)]=mt; -break; -} -} -L->top--; -return 1; -} -static int lua_setfenv(lua_State*L,int idx){ -StkId o; -int res=1; -api_checknelems(L,1); -o=index2adr(L,idx); -api_checkvalidindex(L,o); -luai_apicheck(L,ttistable(L->top-1)); -switch(ttype(o)){ -case 6: -clvalue(o)->c.env=hvalue(L->top-1); -break; -case 7: -uvalue(o)->env=hvalue(L->top-1); -break; -case 8: -sethvalue(L,gt(thvalue(o)),hvalue(L->top-1)); -break; -default: -res=0; -break; -} -if(res)luaC_objbarrier(L,gcvalue(o),hvalue(L->top-1)); -L->top--; -return res; -} -#define adjustresults(L,nres){if(nres==(-1)&&L->top>=L->ci->top)L->ci->top=L->top;} -#define checkresults(L,na,nr)luai_apicheck(L,(nr)==(-1)||(L->ci->top-L->top>=(nr)-(na))) -static void lua_call(lua_State*L,int nargs,int nresults){ -StkId func; -api_checknelems(L,nargs+1); -checkresults(L,nargs,nresults); -func=L->top-(nargs+1); -luaD_call(L,func,nresults); -adjustresults(L,nresults); -} -struct CallS{ -StkId func; -int nresults; -}; -static void f_call(lua_State*L,void*ud){ -struct CallS*c=cast(struct CallS*,ud); -luaD_call(L,c->func,c->nresults); -} -static int lua_pcall(lua_State*L,int nargs,int nresults,int errfunc){ -struct CallS c; -int status; -ptrdiff_t func; -api_checknelems(L,nargs+1); -checkresults(L,nargs,nresults); -if(errfunc==0) -func=0; -else{ -StkId o=index2adr(L,errfunc); -api_checkvalidindex(L,o); -func=savestack(L,o); -} -c.func=L->top-(nargs+1); -c.nresults=nresults; -status=luaD_pcall(L,f_call,&c,savestack(L,c.func),func); -adjustresults(L,nresults); -return status; -} -static int lua_load(lua_State*L,lua_Reader reader,void*data, -const char*chunkname){ -ZIO z; -int status; -if(!chunkname)chunkname="?"; -luaZ_init(L,&z,reader,data); -status=luaD_protectedparser(L,&z,chunkname); -return status; -} -static int lua_error(lua_State*L){ -api_checknelems(L,1); -luaG_errormsg(L); -return 0; -} -static int lua_next(lua_State*L,int idx){ -StkId t; -int more; -t=index2adr(L,idx); -luai_apicheck(L,ttistable(t)); -more=luaH_next(L,hvalue(t),L->top-1); -if(more){ -api_incr_top(L); -} -else -L->top-=1; -return more; -} -static void lua_concat(lua_State*L,int n){ -api_checknelems(L,n); -if(n>=2){ -luaC_checkGC(L); -luaV_concat(L,n,cast_int(L->top-L->base)-1); -L->top-=(n-1); -} -else if(n==0){ -setsvalue(L,L->top,luaS_newlstr(L,"",0)); -api_incr_top(L); -} -} -static void*lua_newuserdata(lua_State*L,size_t size){ -Udata*u; -luaC_checkGC(L); -u=luaS_newudata(L,size,getcurrenv(L)); -setuvalue(L,L->top,u); -api_incr_top(L); -return u+1; -} -#define luaL_getn(L,i)((int)lua_objlen(L,i)) -#define luaL_setn(L,i,j)((void)0) -typedef struct luaL_Reg{ -const char*name; -lua_CFunction func; -}luaL_Reg; -static void luaI_openlib(lua_State*L,const char*libname, -const luaL_Reg*l,int nup); -static int luaL_argerror(lua_State*L,int numarg,const char*extramsg); -static const char* luaL_checklstring(lua_State*L,int numArg, -size_t*l); -static const char* luaL_optlstring(lua_State*L,int numArg, -const char*def,size_t*l); -static lua_Integer luaL_checkinteger(lua_State*L,int numArg); -static lua_Integer luaL_optinteger(lua_State*L,int nArg, -lua_Integer def); -static int luaL_error(lua_State*L,const char*fmt,...); -static const char* luaL_findtable(lua_State*L,int idx, -const char*fname,int szhint); -#define luaL_argcheck(L,cond,numarg,extramsg)((void)((cond)||luaL_argerror(L,(numarg),(extramsg)))) -#define luaL_checkstring(L,n)(luaL_checklstring(L,(n),NULL)) -#define luaL_optstring(L,n,d)(luaL_optlstring(L,(n),(d),NULL)) -#define luaL_checkint(L,n)((int)luaL_checkinteger(L,(n))) -#define luaL_optint(L,n,d)((int)luaL_optinteger(L,(n),(d))) -#define luaL_typename(L,i)lua_typename(L,lua_type(L,(i))) -#define luaL_getmetatable(L,n)(lua_getfield(L,(-10000),(n))) -#define luaL_opt(L,f,n,d)(lua_isnoneornil(L,(n))?(d):f(L,(n))) -typedef struct luaL_Buffer{ -char*p; -int lvl; -lua_State*L; -char buffer[BUFSIZ]; -}luaL_Buffer; -#define luaL_addchar(B,c)((void)((B)->p<((B)->buffer+BUFSIZ)||luaL_prepbuffer(B)),(*(B)->p++=(char)(c))) -#define luaL_addsize(B,n)((B)->p+=(n)) -static char* luaL_prepbuffer(luaL_Buffer*B); -static int luaL_argerror(lua_State*L,int narg,const char*extramsg){ -lua_Debug ar; -if(!lua_getstack(L,0,&ar)) -return luaL_error(L,"bad argument #%d (%s)",narg,extramsg); -lua_getinfo(L,"n",&ar); -if(strcmp(ar.namewhat,"method")==0){ -narg--; -if(narg==0) -return luaL_error(L,"calling "LUA_QL("%s")" on bad self (%s)", -ar.name,extramsg); -} -if(ar.name==NULL) -ar.name="?"; -return luaL_error(L,"bad argument #%d to "LUA_QL("%s")" (%s)", -narg,ar.name,extramsg); -} -static int luaL_typerror(lua_State*L,int narg,const char*tname){ -const char*msg=lua_pushfstring(L,"%s expected, got %s", -tname,luaL_typename(L,narg)); -return luaL_argerror(L,narg,msg); -} -static void tag_error(lua_State*L,int narg,int tag){ -luaL_typerror(L,narg,lua_typename(L,tag)); -} -static void luaL_where(lua_State*L,int level){ -lua_Debug ar; -if(lua_getstack(L,level,&ar)){ -lua_getinfo(L,"Sl",&ar); -if(ar.currentline>0){ -lua_pushfstring(L,"%s:%d: ",ar.short_src,ar.currentline); -return; -} -} -lua_pushliteral(L,""); -} -static int luaL_error(lua_State*L,const char*fmt,...){ -va_list argp; -va_start(argp,fmt); -luaL_where(L,1); -lua_pushvfstring(L,fmt,argp); -va_end(argp); -lua_concat(L,2); -return lua_error(L); -} -static int luaL_newmetatable(lua_State*L,const char*tname){ -lua_getfield(L,(-10000),tname); -if(!lua_isnil(L,-1)) -return 0; -lua_pop(L,1); -lua_newtable(L); -lua_pushvalue(L,-1); -lua_setfield(L,(-10000),tname); -return 1; -} -static void*luaL_checkudata(lua_State*L,int ud,const char*tname){ -void*p=lua_touserdata(L,ud); -if(p!=NULL){ -if(lua_getmetatable(L,ud)){ -lua_getfield(L,(-10000),tname); -if(lua_rawequal(L,-1,-2)){ -lua_pop(L,2); -return p; -} -} -} -luaL_typerror(L,ud,tname); -return NULL; -} -static void luaL_checkstack(lua_State*L,int space,const char*mes){ -if(!lua_checkstack(L,space)) -luaL_error(L,"stack overflow (%s)",mes); -} -static void luaL_checktype(lua_State*L,int narg,int t){ -if(lua_type(L,narg)!=t) -tag_error(L,narg,t); -} -static void luaL_checkany(lua_State*L,int narg){ -if(lua_type(L,narg)==(-1)) -luaL_argerror(L,narg,"value expected"); -} -static const char*luaL_checklstring(lua_State*L,int narg,size_t*len){ -const char*s=lua_tolstring(L,narg,len); -if(!s)tag_error(L,narg,4); -return s; -} -static const char*luaL_optlstring(lua_State*L,int narg, -const char*def,size_t*len){ -if(lua_isnoneornil(L,narg)){ -if(len) -*len=(def?strlen(def):0); -return def; -} -else return luaL_checklstring(L,narg,len); -} -static lua_Number luaL_checknumber(lua_State*L,int narg){ -lua_Number d=lua_tonumber(L,narg); -if(d==0&&!lua_isnumber(L,narg)) -tag_error(L,narg,3); -return d; -} -static lua_Integer luaL_checkinteger(lua_State*L,int narg){ -lua_Integer d=lua_tointeger(L,narg); -if(d==0&&!lua_isnumber(L,narg)) -tag_error(L,narg,3); -return d; -} -static lua_Integer luaL_optinteger(lua_State*L,int narg, -lua_Integer def){ -return luaL_opt(L,luaL_checkinteger,narg,def); -} -static int luaL_getmetafield(lua_State*L,int obj,const char*event){ -if(!lua_getmetatable(L,obj)) -return 0; -lua_pushstring(L,event); -lua_rawget(L,-2); -if(lua_isnil(L,-1)){ -lua_pop(L,2); -return 0; -} -else{ -lua_remove(L,-2); -return 1; -} -} -static void luaL_register(lua_State*L,const char*libname, -const luaL_Reg*l){ -luaI_openlib(L,libname,l,0); -} -static int libsize(const luaL_Reg*l){ -int size=0; -for(;l->name;l++)size++; -return size; -} -static void luaI_openlib(lua_State*L,const char*libname, -const luaL_Reg*l,int nup){ -if(libname){ -int size=libsize(l); -luaL_findtable(L,(-10000),"_LOADED",1); -lua_getfield(L,-1,libname); -if(!lua_istable(L,-1)){ -lua_pop(L,1); -if(luaL_findtable(L,(-10002),libname,size)!=NULL) -luaL_error(L,"name conflict for module "LUA_QL("%s"),libname); -lua_pushvalue(L,-1); -lua_setfield(L,-3,libname); -} -lua_remove(L,-2); -lua_insert(L,-(nup+1)); -} -for(;l->name;l++){ -int i; -for(i=0;ifunc,nup); -lua_setfield(L,-(nup+2),l->name); -} -lua_pop(L,nup); -} -static const char*luaL_findtable(lua_State*L,int idx, -const char*fname,int szhint){ -const char*e; -lua_pushvalue(L,idx); -do{ -e=strchr(fname,'.'); -if(e==NULL)e=fname+strlen(fname); -lua_pushlstring(L,fname,e-fname); -lua_rawget(L,-2); -if(lua_isnil(L,-1)){ -lua_pop(L,1); -lua_createtable(L,0,(*e=='.'?1:szhint)); -lua_pushlstring(L,fname,e-fname); -lua_pushvalue(L,-2); -lua_settable(L,-4); -} -else if(!lua_istable(L,-1)){ -lua_pop(L,2); -return fname; -} -lua_remove(L,-2); -fname=e+1; -}while(*e=='.'); -return NULL; -} -#define bufflen(B)((B)->p-(B)->buffer) -#define bufffree(B)((size_t)(BUFSIZ-bufflen(B))) -static int emptybuffer(luaL_Buffer*B){ -size_t l=bufflen(B); -if(l==0)return 0; -else{ -lua_pushlstring(B->L,B->buffer,l); -B->p=B->buffer; -B->lvl++; -return 1; -} -} -static void adjuststack(luaL_Buffer*B){ -if(B->lvl>1){ -lua_State*L=B->L; -int toget=1; -size_t toplen=lua_strlen(L,-1); -do{ -size_t l=lua_strlen(L,-(toget+1)); -if(B->lvl-toget+1>=(20/2)||toplen>l){ -toplen+=l; -toget++; -} -else break; -}while(togetlvl); -lua_concat(L,toget); -B->lvl=B->lvl-toget+1; -} -} -static char*luaL_prepbuffer(luaL_Buffer*B){ -if(emptybuffer(B)) -adjuststack(B); -return B->buffer; -} -static void luaL_addlstring(luaL_Buffer*B,const char*s,size_t l){ -while(l--) -luaL_addchar(B,*s++); -} -static void luaL_pushresult(luaL_Buffer*B){ -emptybuffer(B); -lua_concat(B->L,B->lvl); -B->lvl=1; -} -static void luaL_addvalue(luaL_Buffer*B){ -lua_State*L=B->L; -size_t vl; -const char*s=lua_tolstring(L,-1,&vl); -if(vl<=bufffree(B)){ -memcpy(B->p,s,vl); -B->p+=vl; -lua_pop(L,1); -} -else{ -if(emptybuffer(B)) -lua_insert(L,-2); -B->lvl++; -adjuststack(B); -} -} -static void luaL_buffinit(lua_State*L,luaL_Buffer*B){ -B->L=L; -B->p=B->buffer; -B->lvl=0; -} -typedef struct LoadF{ -int extraline; -FILE*f; -char buff[BUFSIZ]; -}LoadF; -static const char*getF(lua_State*L,void*ud,size_t*size){ -LoadF*lf=(LoadF*)ud; -(void)L; -if(lf->extraline){ -lf->extraline=0; -*size=1; -return"\n"; -} -if(feof(lf->f))return NULL; -*size=fread(lf->buff,1,sizeof(lf->buff),lf->f); -return(*size>0)?lf->buff:NULL; -} -static int errfile(lua_State*L,const char*what,int fnameindex){ -const char*serr=strerror(errno); -const char*filename=lua_tostring(L,fnameindex)+1; -lua_pushfstring(L,"cannot %s %s: %s",what,filename,serr); -lua_remove(L,fnameindex); -return(5+1); -} -static int luaL_loadfile(lua_State*L,const char*filename){ -LoadF lf; -int status,readstatus; -int c; -int fnameindex=lua_gettop(L)+1; -lf.extraline=0; -if(filename==NULL){ -lua_pushliteral(L,"=stdin"); -lf.f=stdin; -} -else{ -lua_pushfstring(L,"@%s",filename); -lf.f=fopen(filename,"r"); -if(lf.f==NULL)return errfile(L,"open",fnameindex); -} -c=getc(lf.f); -if(c=='#'){ -lf.extraline=1; -while((c=getc(lf.f))!=EOF&&c!='\n'); -if(c=='\n')c=getc(lf.f); -} -if(c=="\033Lua"[0]&&filename){ -lf.f=freopen(filename,"rb",lf.f); -if(lf.f==NULL)return errfile(L,"reopen",fnameindex); -while((c=getc(lf.f))!=EOF&&c!="\033Lua"[0]); -lf.extraline=0; -} -ungetc(c,lf.f); -status=lua_load(L,getF,&lf,lua_tostring(L,-1)); -readstatus=ferror(lf.f); -if(filename)fclose(lf.f); -if(readstatus){ -lua_settop(L,fnameindex); -return errfile(L,"read",fnameindex); -} -lua_remove(L,fnameindex); -return status; -} -typedef struct LoadS{ -const char*s; -size_t size; -}LoadS; -static const char*getS(lua_State*L,void*ud,size_t*size){ -LoadS*ls=(LoadS*)ud; -(void)L; -if(ls->size==0)return NULL; -*size=ls->size; -ls->size=0; -return ls->s; -} -static int luaL_loadbuffer(lua_State*L,const char*buff,size_t size, -const char*name){ -LoadS ls; -ls.s=buff; -ls.size=size; -return lua_load(L,getS,&ls,name); -} -static void*l_alloc(void*ud,void*ptr,size_t osize,size_t nsize){ -(void)ud; -(void)osize; -if(nsize==0){ -free(ptr); -return NULL; -} -else -return realloc(ptr,nsize); -} -static int panic(lua_State*L){ -(void)L; -fprintf(stderr,"PANIC: unprotected error in call to Lua API (%s)\n", -lua_tostring(L,-1)); -return 0; -} -static lua_State*luaL_newstate(void){ -lua_State*L=lua_newstate(l_alloc,NULL); -if(L)lua_atpanic(L,&panic); -return L; -} -static int luaB_tonumber(lua_State*L){ -int base=luaL_optint(L,2,10); -if(base==10){ -luaL_checkany(L,1); -if(lua_isnumber(L,1)){ -lua_pushnumber(L,lua_tonumber(L,1)); -return 1; -} -} -else{ -const char*s1=luaL_checkstring(L,1); -char*s2; -unsigned long n; -luaL_argcheck(L,2<=base&&base<=36,2,"base out of range"); -n=strtoul(s1,&s2,base); -if(s1!=s2){ -while(isspace((unsigned char)(*s2)))s2++; -if(*s2=='\0'){ -lua_pushnumber(L,(lua_Number)n); -return 1; -} -} -} -lua_pushnil(L); -return 1; -} -static int luaB_error(lua_State*L){ -int level=luaL_optint(L,2,1); -lua_settop(L,1); -if(lua_isstring(L,1)&&level>0){ -luaL_where(L,level); -lua_pushvalue(L,1); -lua_concat(L,2); -} -return lua_error(L); -} -static int luaB_setmetatable(lua_State*L){ -int t=lua_type(L,2); -luaL_checktype(L,1,5); -luaL_argcheck(L,t==0||t==5,2, -"nil or table expected"); -if(luaL_getmetafield(L,1,"__metatable")) -luaL_error(L,"cannot change a protected metatable"); -lua_settop(L,2); -lua_setmetatable(L,1); -return 1; -} -static void getfunc(lua_State*L,int opt){ -if(lua_isfunction(L,1))lua_pushvalue(L,1); -else{ -lua_Debug ar; -int level=opt?luaL_optint(L,1,1):luaL_checkint(L,1); -luaL_argcheck(L,level>=0,1,"level must be non-negative"); -if(lua_getstack(L,level,&ar)==0) -luaL_argerror(L,1,"invalid level"); -lua_getinfo(L,"f",&ar); -if(lua_isnil(L,-1)) -luaL_error(L,"no function environment for tail call at level %d", -level); -} -} -static int luaB_setfenv(lua_State*L){ -luaL_checktype(L,2,5); -getfunc(L,0); -lua_pushvalue(L,2); -if(lua_isnumber(L,1)&&lua_tonumber(L,1)==0){ -lua_pushthread(L); -lua_insert(L,-2); -lua_setfenv(L,-2); -return 0; -} -else if(lua_iscfunction(L,-2)||lua_setfenv(L,-2)==0) -luaL_error(L, -LUA_QL("setfenv")" cannot change environment of given object"); -return 1; -} -static int luaB_rawget(lua_State*L){ -luaL_checktype(L,1,5); -luaL_checkany(L,2); -lua_settop(L,2); -lua_rawget(L,1); -return 1; -} -static int luaB_type(lua_State*L){ -luaL_checkany(L,1); -lua_pushstring(L,luaL_typename(L,1)); -return 1; -} -static int luaB_next(lua_State*L){ -luaL_checktype(L,1,5); -lua_settop(L,2); -if(lua_next(L,1)) -return 2; -else{ -lua_pushnil(L); -return 1; -} -} -static int luaB_pairs(lua_State*L){ -luaL_checktype(L,1,5); -lua_pushvalue(L,lua_upvalueindex(1)); -lua_pushvalue(L,1); -lua_pushnil(L); -return 3; -} -static int ipairsaux(lua_State*L){ -int i=luaL_checkint(L,2); -luaL_checktype(L,1,5); -i++; -lua_pushinteger(L,i); -lua_rawgeti(L,1,i); -return(lua_isnil(L,-1))?0:2; -} -static int luaB_ipairs(lua_State*L){ -luaL_checktype(L,1,5); -lua_pushvalue(L,lua_upvalueindex(1)); -lua_pushvalue(L,1); -lua_pushinteger(L,0); -return 3; -} -static int load_aux(lua_State*L,int status){ -if(status==0) -return 1; -else{ -lua_pushnil(L); -lua_insert(L,-2); -return 2; -} -} -static int luaB_loadstring(lua_State*L){ -size_t l; -const char*s=luaL_checklstring(L,1,&l); -const char*chunkname=luaL_optstring(L,2,s); -return load_aux(L,luaL_loadbuffer(L,s,l,chunkname)); -} -static int luaB_loadfile(lua_State*L){ -const char*fname=luaL_optstring(L,1,NULL); -return load_aux(L,luaL_loadfile(L,fname)); -} -static int luaB_assert(lua_State*L){ -luaL_checkany(L,1); -if(!lua_toboolean(L,1)) -return luaL_error(L,"%s",luaL_optstring(L,2,"assertion failed!")); -return lua_gettop(L); -} -static int luaB_unpack(lua_State*L){ -int i,e,n; -luaL_checktype(L,1,5); -i=luaL_optint(L,2,1); -e=luaL_opt(L,luaL_checkint,3,luaL_getn(L,1)); -if(i>e)return 0; -n=e-i+1; -if(n<=0||!lua_checkstack(L,n)) -return luaL_error(L,"too many results to unpack"); -lua_rawgeti(L,1,i); -while(i++e)e=pos; -for(i=e;i>pos;i--){ -lua_rawgeti(L,1,i-1); -lua_rawseti(L,1,i); -} -break; -} -default:{ -return luaL_error(L,"wrong number of arguments to "LUA_QL("insert")); -} -} -luaL_setn(L,1,e); -lua_rawseti(L,1,pos); -return 0; -} -static int tremove(lua_State*L){ -int e=aux_getn(L,1); -int pos=luaL_optint(L,2,e); -if(!(1<=pos&&pos<=e)) -return 0; -luaL_setn(L,1,e-1); -lua_rawgeti(L,1,pos); -for(;posu)luaL_error(L,"invalid order function for sorting"); -lua_pop(L,1); -} -while(lua_rawgeti(L,1,--j),sort_comp(L,-3,-1)){ -if(j0); -} -l=strlen(p); -if(l==0||p[l-1]!='\n') -luaL_addsize(&b,l); -else{ -luaL_addsize(&b,l-1); -luaL_pushresult(&b); -return 1; -} -} -} -static int read_chars(lua_State*L,FILE*f,size_t n){ -size_t rlen; -size_t nr; -luaL_Buffer b; -luaL_buffinit(L,&b); -rlen=BUFSIZ; -do{ -char*p=luaL_prepbuffer(&b); -if(rlen>n)rlen=n; -nr=fread(p,sizeof(char),rlen,f); -luaL_addsize(&b,nr); -n-=nr; -}while(n>0&&nr==rlen); -luaL_pushresult(&b); -return(n==0||lua_objlen(L,-1)>0); -} -static int g_read(lua_State*L,FILE*f,int first){ -int nargs=lua_gettop(L)-1; -int success; -int n; -clearerr(f); -if(nargs==0){ -success=read_line(L,f); -n=first+1; -} -else{ -luaL_checkstack(L,nargs+20,"too many arguments"); -success=1; -for(n=first;nargs--&&success;n++){ -if(lua_type(L,n)==3){ -size_t l=(size_t)lua_tointeger(L,n); -success=(l==0)?test_eof(L,f):read_chars(L,f,l); -} -else{ -const char*p=lua_tostring(L,n); -luaL_argcheck(L,p&&p[0]=='*',n,"invalid option"); -switch(p[1]){ -case'n': -success=read_number(L,f); -break; -case'l': -success=read_line(L,f); -break; -case'a': -read_chars(L,f,~((size_t)0)); -success=1; -break; -default: -return luaL_argerror(L,n,"invalid format"); -} -} -} -} -if(ferror(f)) -return pushresult(L,0,NULL); -if(!success){ -lua_pop(L,1); -lua_pushnil(L); -} -return n-first; -} -static int io_read(lua_State*L){ -return g_read(L,getiofile(L,1),1); -} -static int f_read(lua_State*L){ -return g_read(L,tofile(L),2); -} -static int io_readline(lua_State*L){ -FILE*f=*(FILE**)lua_touserdata(L,lua_upvalueindex(1)); -int sucess; -if(f==NULL) -luaL_error(L,"file is already closed"); -sucess=read_line(L,f); -if(ferror(f)) -return luaL_error(L,"%s",strerror(errno)); -if(sucess)return 1; -else{ -if(lua_toboolean(L,lua_upvalueindex(2))){ -lua_settop(L,0); -lua_pushvalue(L,lua_upvalueindex(1)); -aux_close(L); -} -return 0; -} -} -static int g_write(lua_State*L,FILE*f,int arg){ -int nargs=lua_gettop(L)-1; -int status=1; -for(;nargs--;arg++){ -if(lua_type(L,arg)==3){ -status=status&& -fprintf(f,"%.14g",lua_tonumber(L,arg))>0; -} -else{ -size_t l; -const char*s=luaL_checklstring(L,arg,&l); -status=status&&(fwrite(s,sizeof(char),l,f)==l); -} -} -return pushresult(L,status,NULL); -} -static int io_write(lua_State*L){ -return g_write(L,getiofile(L,2),1); -} -static int f_write(lua_State*L){ -return g_write(L,tofile(L),2); -} -static int io_flush(lua_State*L){ -return pushresult(L,fflush(getiofile(L,2))==0,NULL); -} -static int f_flush(lua_State*L){ -return pushresult(L,fflush(tofile(L))==0,NULL); -} -static const luaL_Reg iolib[]={ -{"close",io_close}, -{"flush",io_flush}, -{"input",io_input}, -{"lines",io_lines}, -{"open",io_open}, -{"output",io_output}, -{"read",io_read}, -{"type",io_type}, -{"write",io_write}, -{NULL,NULL} -}; -static const luaL_Reg flib[]={ -{"close",io_close}, -{"flush",f_flush}, -{"lines",f_lines}, -{"read",f_read}, -{"write",f_write}, -{"__gc",io_gc}, -{NULL,NULL} -}; -static void createmeta(lua_State*L){ -luaL_newmetatable(L,"FILE*"); -lua_pushvalue(L,-1); -lua_setfield(L,-2,"__index"); -luaL_register(L,NULL,flib); -} -static void createstdfile(lua_State*L,FILE*f,int k,const char*fname){ -*newfile(L)=f; -if(k>0){ -lua_pushvalue(L,-1); -lua_rawseti(L,(-10001),k); -} -lua_pushvalue(L,-2); -lua_setfenv(L,-2); -lua_setfield(L,-3,fname); -} -static void newfenv(lua_State*L,lua_CFunction cls){ -lua_createtable(L,0,1); -lua_pushcfunction(L,cls); -lua_setfield(L,-2,"__close"); -} -static int luaopen_io(lua_State*L){ -createmeta(L); -newfenv(L,io_fclose); -lua_replace(L,(-10001)); -luaL_register(L,"io",iolib); -newfenv(L,io_noclose); -createstdfile(L,stdin,1,"stdin"); -createstdfile(L,stdout,2,"stdout"); -createstdfile(L,stderr,0,"stderr"); -lua_pop(L,1); -lua_getfield(L,-1,"popen"); -newfenv(L,io_pclose); -lua_setfenv(L,-2); -lua_pop(L,1); -return 1; -} -static int os_pushresult(lua_State*L,int i,const char*filename){ -int en=errno; -if(i){ -lua_pushboolean(L,1); -return 1; -} -else{ -lua_pushnil(L); -lua_pushfstring(L,"%s: %s",filename,strerror(en)); -lua_pushinteger(L,en); -return 3; -} -} -static int os_remove(lua_State*L){ -const char*filename=luaL_checkstring(L,1); -return os_pushresult(L,remove(filename)==0,filename); -} -static int os_exit(lua_State*L){ -exit(luaL_optint(L,1,EXIT_SUCCESS)); -} -static const luaL_Reg syslib[]={ -{"exit",os_exit}, -{"remove",os_remove}, -{NULL,NULL} -}; -static int luaopen_os(lua_State*L){ -luaL_register(L,"os",syslib); -return 1; -} -#define uchar(c)((unsigned char)(c)) -static ptrdiff_t posrelat(ptrdiff_t pos,size_t len){ -if(pos<0)pos+=(ptrdiff_t)len+1; -return(pos>=0)?pos:0; -} -static int str_sub(lua_State*L){ -size_t l; -const char*s=luaL_checklstring(L,1,&l); -ptrdiff_t start=posrelat(luaL_checkinteger(L,2),l); -ptrdiff_t end=posrelat(luaL_optinteger(L,3,-1),l); -if(start<1)start=1; -if(end>(ptrdiff_t)l)end=(ptrdiff_t)l; -if(start<=end) -lua_pushlstring(L,s+start-1,end-start+1); -else lua_pushliteral(L,""); -return 1; -} -static int str_lower(lua_State*L){ -size_t l; -size_t i; -luaL_Buffer b; -const char*s=luaL_checklstring(L,1,&l); -luaL_buffinit(L,&b); -for(i=0;i0) -luaL_addlstring(&b,s,l); -luaL_pushresult(&b); -return 1; -} -static int str_byte(lua_State*L){ -size_t l; -const char*s=luaL_checklstring(L,1,&l); -ptrdiff_t posi=posrelat(luaL_optinteger(L,2,1),l); -ptrdiff_t pose=posrelat(luaL_optinteger(L,3,posi),l); -int n,i; -if(posi<=0)posi=1; -if((size_t)pose>l)pose=l; -if(posi>pose)return 0; -n=(int)(pose-posi+1); -if(posi+n<=pose) -luaL_error(L,"string slice too long"); -luaL_checkstack(L,n,"string slice too long"); -for(i=0;i=ms->level||ms->capture[l].len==(-1)) -return luaL_error(ms->L,"invalid capture index"); -return l; -} -static int capture_to_close(MatchState*ms){ -int level=ms->level; -for(level--;level>=0;level--) -if(ms->capture[level].len==(-1))return level; -return luaL_error(ms->L,"invalid pattern capture"); -} -static const char*classend(MatchState*ms,const char*p){ -switch(*p++){ -case'%':{ -if(*p=='\0') -luaL_error(ms->L,"malformed pattern (ends with "LUA_QL("%%")")"); -return p+1; -} -case'[':{ -if(*p=='^')p++; -do{ -if(*p=='\0') -luaL_error(ms->L,"malformed pattern (missing "LUA_QL("]")")"); -if(*(p++)=='%'&&*p!='\0') -p++; -}while(*p!=']'); -return p+1; -} -default:{ -return p; -} -} -} -static int match_class(int c,int cl){ -int res; -switch(tolower(cl)){ -case'a':res=isalpha(c);break; -case'c':res=iscntrl(c);break; -case'd':res=isdigit(c);break; -case'l':res=islower(c);break; -case'p':res=ispunct(c);break; -case's':res=isspace(c);break; -case'u':res=isupper(c);break; -case'w':res=isalnum(c);break; -case'x':res=isxdigit(c);break; -case'z':res=(c==0);break; -default:return(cl==c); -} -return(islower(cl)?res:!res); -} -static int matchbracketclass(int c,const char*p,const char*ec){ -int sig=1; -if(*(p+1)=='^'){ -sig=0; -p++; -} -while(++pL,"unbalanced pattern"); -if(*s!=*p)return NULL; -else{ -int b=*p; -int e=*(p+1); -int cont=1; -while(++ssrc_end){ -if(*s==e){ -if(--cont==0)return s+1; -} -else if(*s==b)cont++; -} -} -return NULL; -} -static const char*max_expand(MatchState*ms,const char*s, -const char*p,const char*ep){ -ptrdiff_t i=0; -while((s+i)src_end&&singlematch(uchar(*(s+i)),p,ep)) -i++; -while(i>=0){ -const char*res=match(ms,(s+i),ep+1); -if(res)return res; -i--; -} -return NULL; -} -static const char*min_expand(MatchState*ms,const char*s, -const char*p,const char*ep){ -for(;;){ -const char*res=match(ms,s,ep+1); -if(res!=NULL) -return res; -else if(ssrc_end&&singlematch(uchar(*s),p,ep)) -s++; -else return NULL; -} -} -static const char*start_capture(MatchState*ms,const char*s, -const char*p,int what){ -const char*res; -int level=ms->level; -if(level>=32)luaL_error(ms->L,"too many captures"); -ms->capture[level].init=s; -ms->capture[level].len=what; -ms->level=level+1; -if((res=match(ms,s,p))==NULL) -ms->level--; -return res; -} -static const char*end_capture(MatchState*ms,const char*s, -const char*p){ -int l=capture_to_close(ms); -const char*res; -ms->capture[l].len=s-ms->capture[l].init; -if((res=match(ms,s,p))==NULL) -ms->capture[l].len=(-1); -return res; -} -static const char*match_capture(MatchState*ms,const char*s,int l){ -size_t len; -l=check_capture(ms,l); -len=ms->capture[l].len; -if((size_t)(ms->src_end-s)>=len&& -memcmp(ms->capture[l].init,s,len)==0) -return s+len; -else return NULL; -} -static const char*match(MatchState*ms,const char*s,const char*p){ -init: -switch(*p){ -case'(':{ -if(*(p+1)==')') -return start_capture(ms,s,p+2,(-2)); -else -return start_capture(ms,s,p+1,(-1)); -} -case')':{ -return end_capture(ms,s,p+1); -} -case'%':{ -switch(*(p+1)){ -case'b':{ -s=matchbalance(ms,s,p+2); -if(s==NULL)return NULL; -p+=4;goto init; -} -case'f':{ -const char*ep;char previous; -p+=2; -if(*p!='[') -luaL_error(ms->L,"missing "LUA_QL("[")" after " -LUA_QL("%%f")" in pattern"); -ep=classend(ms,p); -previous=(s==ms->src_init)?'\0':*(s-1); -if(matchbracketclass(uchar(previous),p,ep-1)|| -!matchbracketclass(uchar(*s),p,ep-1))return NULL; -p=ep;goto init; -} -default:{ -if(isdigit(uchar(*(p+1)))){ -s=match_capture(ms,s,uchar(*(p+1))); -if(s==NULL)return NULL; -p+=2;goto init; -} -goto dflt; -} -} -} -case'\0':{ -return s; -} -case'$':{ -if(*(p+1)=='\0') -return(s==ms->src_end)?s:NULL; -else goto dflt; -} -default:dflt:{ -const char*ep=classend(ms,p); -int m=ssrc_end&&singlematch(uchar(*s),p,ep); -switch(*ep){ -case'?':{ -const char*res; -if(m&&((res=match(ms,s+1,ep+1))!=NULL)) -return res; -p=ep+1;goto init; -} -case'*':{ -return max_expand(ms,s,p,ep); -} -case'+':{ -return(m?max_expand(ms,s+1,p,ep):NULL); -} -case'-':{ -return min_expand(ms,s,p,ep); -} -default:{ -if(!m)return NULL; -s++;p=ep;goto init; -} -} -} -} -} -static const char*lmemfind(const char*s1,size_t l1, -const char*s2,size_t l2){ -if(l2==0)return s1; -else if(l2>l1)return NULL; -else{ -const char*init; -l2--; -l1=l1-l2; -while(l1>0&&(init=(const char*)memchr(s1,*s2,l1))!=NULL){ -init++; -if(memcmp(init,s2+1,l2)==0) -return init-1; -else{ -l1-=init-s1; -s1=init; -} -} -return NULL; -} -} -static void push_onecapture(MatchState*ms,int i,const char*s, -const char*e){ -if(i>=ms->level){ -if(i==0) -lua_pushlstring(ms->L,s,e-s); -else -luaL_error(ms->L,"invalid capture index"); -} -else{ -ptrdiff_t l=ms->capture[i].len; -if(l==(-1))luaL_error(ms->L,"unfinished capture"); -if(l==(-2)) -lua_pushinteger(ms->L,ms->capture[i].init-ms->src_init+1); -else -lua_pushlstring(ms->L,ms->capture[i].init,l); -} -} -static int push_captures(MatchState*ms,const char*s,const char*e){ -int i; -int nlevels=(ms->level==0&&s)?1:ms->level; -luaL_checkstack(ms->L,nlevels,"too many captures"); -for(i=0;il1)init=(ptrdiff_t)l1; -if(find&&(lua_toboolean(L,4)|| -strpbrk(p,"^$*+?.([%-")==NULL)){ -const char*s2=lmemfind(s+init,l1-init,p,l2); -if(s2){ -lua_pushinteger(L,s2-s+1); -lua_pushinteger(L,s2-s+l2); -return 2; -} -} -else{ -MatchState ms; -int anchor=(*p=='^')?(p++,1):0; -const char*s1=s+init; -ms.L=L; -ms.src_init=s; -ms.src_end=s+l1; -do{ -const char*res; -ms.level=0; -if((res=match(&ms,s1,p))!=NULL){ -if(find){ -lua_pushinteger(L,s1-s+1); -lua_pushinteger(L,res-s); -return push_captures(&ms,NULL,0)+2; -} -else -return push_captures(&ms,s1,res); -} -}while(s1++L,3,&l); -for(i=0;iL; -switch(lua_type(L,3)){ -case 3: -case 4:{ -add_s(ms,b,s,e); -return; -} -case 6:{ -int n; -lua_pushvalue(L,3); -n=push_captures(ms,s,e); -lua_call(L,n,1); -break; -} -case 5:{ -push_onecapture(ms,0,s,e); -lua_gettable(L,3); -break; -} -} -if(!lua_toboolean(L,-1)){ -lua_pop(L,1); -lua_pushlstring(L,s,e-s); -} -else if(!lua_isstring(L,-1)) -luaL_error(L,"invalid replacement value (a %s)",luaL_typename(L,-1)); -luaL_addvalue(b); -} -static int str_gsub(lua_State*L){ -size_t srcl; -const char*src=luaL_checklstring(L,1,&srcl); -const char*p=luaL_checkstring(L,2); -int tr=lua_type(L,3); -int max_s=luaL_optint(L,4,srcl+1); -int anchor=(*p=='^')?(p++,1):0; -int n=0; -MatchState ms; -luaL_Buffer b; -luaL_argcheck(L,tr==3||tr==4|| -tr==6||tr==5,3, -"string/function/table expected"); -luaL_buffinit(L,&b); -ms.L=L; -ms.src_init=src; -ms.src_end=src+srcl; -while(nsrc) -src=e; -else if(src=sizeof("-+ #0")) -luaL_error(L,"invalid format (repeated flags)"); -if(isdigit(uchar(*p)))p++; -if(isdigit(uchar(*p)))p++; -if(*p=='.'){ -p++; -if(isdigit(uchar(*p)))p++; -if(isdigit(uchar(*p)))p++; -} -if(isdigit(uchar(*p))) -luaL_error(L,"invalid format (width or precision too long)"); -*(form++)='%'; -strncpy(form,strfrmt,p-strfrmt+1); -form+=p-strfrmt+1; -*form='\0'; -return p; -} -static void addintlen(char*form){ -size_t l=strlen(form); -char spec=form[l-1]; -strcpy(form+l-1,"l"); -form[l+sizeof("l")-2]=spec; -form[l+sizeof("l")-1]='\0'; -} -static int str_format(lua_State*L){ -int top=lua_gettop(L); -int arg=1; -size_t sfl; -const char*strfrmt=luaL_checklstring(L,arg,&sfl); -const char*strfrmt_end=strfrmt+sfl; -luaL_Buffer b; -luaL_buffinit(L,&b); -while(strfrmttop) -luaL_argerror(L,arg,"no value"); -strfrmt=scanformat(L,strfrmt,form); -switch(*strfrmt++){ -case'c':{ -sprintf(buff,form,(int)luaL_checknumber(L,arg)); -break; -} -case'd':case'i':{ -addintlen(form); -sprintf(buff,form,(long)luaL_checknumber(L,arg)); -break; -} -case'o':case'u':case'x':case'X':{ -addintlen(form); -sprintf(buff,form,(unsigned long)luaL_checknumber(L,arg)); -break; -} -case'e':case'E':case'f': -case'g':case'G':{ -sprintf(buff,form,(double)luaL_checknumber(L,arg)); -break; -} -case'q':{ -addquoted(L,&b,arg); -continue; -} -case's':{ -size_t l; -const char*s=luaL_checklstring(L,arg,&l); -if(!strchr(form,'.')&&l>=100){ -lua_pushvalue(L,arg); -luaL_addvalue(&b); -continue; -} -else{ -sprintf(buff,form,s); -break; -} -} -default:{ -return luaL_error(L,"invalid option "LUA_QL("%%%c")" to " -LUA_QL("format"),*(strfrmt-1)); -} -} -luaL_addlstring(&b,buff,strlen(buff)); -} -} -luaL_pushresult(&b); -return 1; -} -static const luaL_Reg strlib[]={ -{"byte",str_byte}, -{"char",str_char}, -{"find",str_find}, -{"format",str_format}, -{"gmatch",gmatch}, -{"gsub",str_gsub}, -{"lower",str_lower}, -{"match",str_match}, -{"rep",str_rep}, -{"sub",str_sub}, -{"upper",str_upper}, -{NULL,NULL} -}; -static void createmetatable(lua_State*L){ -lua_createtable(L,0,1); -lua_pushliteral(L,""); -lua_pushvalue(L,-2); -lua_setmetatable(L,-2); -lua_pop(L,1); -lua_pushvalue(L,-2); -lua_setfield(L,-2,"__index"); -lua_pop(L,1); -} -static int luaopen_string(lua_State*L){ -luaL_register(L,"string",strlib); -createmetatable(L); -return 1; -} -static const luaL_Reg lualibs[]={ -{"",luaopen_base}, -{"table",luaopen_table}, -{"io",luaopen_io}, -{"os",luaopen_os}, -{"string",luaopen_string}, -{NULL,NULL} -}; -static void luaL_openlibs(lua_State*L){ -const luaL_Reg*lib=lualibs; -for(;lib->func;lib++){ -lua_pushcfunction(L,lib->func); -lua_pushstring(L,lib->name); -lua_call(L,1,0); -} -} -typedef unsigned int UB; -static UB barg(lua_State*L,int idx){ -union{lua_Number n;U64 b;}bn; -bn.n=lua_tonumber(L,idx)+6755399441055744.0; -if(bn.n==0.0&&!lua_isnumber(L,idx))luaL_typerror(L,idx,"number"); -return(UB)bn.b; -} -#define BRET(b)lua_pushnumber(L,(lua_Number)(int)(b));return 1; -static int tobit(lua_State*L){ -BRET(barg(L,1))} -static int bnot(lua_State*L){ -BRET(~barg(L,1))} -static int band(lua_State*L){ -int i;UB b=barg(L,1);for(i=lua_gettop(L);i>1;i--)b&=barg(L,i);BRET(b)} -static int bor(lua_State*L){ -int i;UB b=barg(L,1);for(i=lua_gettop(L);i>1;i--)b|=barg(L,i);BRET(b)} -static int bxor(lua_State*L){ -int i;UB b=barg(L,1);for(i=lua_gettop(L);i>1;i--)b^=barg(L,i);BRET(b)} -static int lshift(lua_State*L){ -UB b=barg(L,1),n=barg(L,2)&31;BRET(b<>n)} -static int arshift(lua_State*L){ -UB b=barg(L,1),n=barg(L,2)&31;BRET((int)b>>n)} -static int rol(lua_State*L){ -UB b=barg(L,1),n=barg(L,2)&31;BRET((b<>(32-n)))} -static int ror(lua_State*L){ -UB b=barg(L,1),n=barg(L,2)&31;BRET((b>>n)|(b<<(32-n)))} -static int bswap(lua_State*L){ -UB b=barg(L,1);b=(b>>24)|((b>>8)&0xff00)|((b&0xff00)<<8)|(b<<24);BRET(b)} -static int tohex(lua_State*L){ -UB b=barg(L,1); -int n=lua_isnone(L,2)?8:(int)barg(L,2); -const char*hexdigits="0123456789abcdef"; -char buf[8]; -int i; -if(n<0){n=-n;hexdigits="0123456789ABCDEF";} -if(n>8)n=8; -for(i=(int)n;--i>=0;){buf[i]=hexdigits[b&15];b>>=4;} -lua_pushlstring(L,buf,(size_t)n); -return 1; -} -static const struct luaL_Reg bitlib[]={ -{"tobit",tobit}, -{"bnot",bnot}, -{"band",band}, -{"bor",bor}, -{"bxor",bxor}, -{"lshift",lshift}, -{"rshift",rshift}, -{"arshift",arshift}, -{"rol",rol}, -{"ror",ror}, -{"bswap",bswap}, -{"tohex",tohex}, -{NULL,NULL} -}; -int main(int argc,char**argv){ -lua_State*L=luaL_newstate(); -int i; -luaL_openlibs(L); -luaL_register(L,"bit",bitlib); -if(argc<2)return sizeof(void*); -lua_createtable(L,0,1); -lua_pushstring(L,argv[1]); -lua_rawseti(L,-2,0); -lua_setglobal(L,"arg"); -if(luaL_loadfile(L,argv[1])) -goto err; -for(i=2;i -- BYTECODE -- [...] --- print(bc.line(foo, 2)) --> 0002 KSTR 1 1 ; "hello" --- --- local out = { --- -- Do something with each line: --- write = function(t, ...) io.write(...) end, --- close = function(t) end, --- flush = function(t) end, --- } --- bc.dump(foo, out) --- ------------------------------------------------------------------------------- - --- Cache some library functions and objects. -local jit = require("jit") -assert(jit.version_num == 20004, "LuaJIT core/library version mismatch") -local jutil = require("jit.util") -local vmdef = require("jit.vmdef") -local bit = require("bit") -local sub, gsub, format = string.sub, string.gsub, string.format -local byte, band, shr = string.byte, bit.band, bit.rshift -local funcinfo, funcbc, funck = jutil.funcinfo, jutil.funcbc, jutil.funck -local funcuvname = jutil.funcuvname -local bcnames = vmdef.bcnames -local stdout, stderr = io.stdout, io.stderr - ------------------------------------------------------------------------------- - -local function ctlsub(c) - if c == "\n" then return "\\n" - elseif c == "\r" then return "\\r" - elseif c == "\t" then return "\\t" - else return format("\\%03d", byte(c)) - end -end - --- Return one bytecode line. -local function bcline(func, pc, prefix) - local ins, m = funcbc(func, pc) - if not ins then return end - local ma, mb, mc = band(m, 7), band(m, 15*8), band(m, 15*128) - local a = band(shr(ins, 8), 0xff) - local oidx = 6*band(ins, 0xff) - local op = sub(bcnames, oidx+1, oidx+6) - local s = format("%04d %s %-6s %3s ", - pc, prefix or " ", op, ma == 0 and "" or a) - local d = shr(ins, 16) - if mc == 13*128 then -- BCMjump - return format("%s=> %04d\n", s, pc+d-0x7fff) - end - if mb ~= 0 then - d = band(d, 0xff) - elseif mc == 0 then - return s.."\n" - end - local kc - if mc == 10*128 then -- BCMstr - kc = funck(func, -d-1) - kc = format(#kc > 40 and '"%.40s"~' or '"%s"', gsub(kc, "%c", ctlsub)) - elseif mc == 9*128 then -- BCMnum - kc = funck(func, d) - if op == "TSETM " then kc = kc - 2^52 end - elseif mc == 12*128 then -- BCMfunc - local fi = funcinfo(funck(func, -d-1)) - if fi.ffid then - kc = vmdef.ffnames[fi.ffid] - else - kc = fi.loc - end - elseif mc == 5*128 then -- BCMuv - kc = funcuvname(func, d) - end - if ma == 5 then -- BCMuv - local ka = funcuvname(func, a) - if kc then kc = ka.." ; "..kc else kc = ka end - end - if mb ~= 0 then - local b = shr(ins, 24) - if kc then return format("%s%3d %3d ; %s\n", s, b, d, kc) end - return format("%s%3d %3d\n", s, b, d) - end - if kc then return format("%s%3d ; %s\n", s, d, kc) end - if mc == 7*128 and d > 32767 then d = d - 65536 end -- BCMlits - return format("%s%3d\n", s, d) -end - --- Collect branch targets of a function. -local function bctargets(func) - local target = {} - for pc=1,1000000000 do - local ins, m = funcbc(func, pc) - if not ins then break end - if band(m, 15*128) == 13*128 then target[pc+shr(ins, 16)-0x7fff] = true end - end - return target -end - --- Dump bytecode instructions of a function. -local function bcdump(func, out, all) - if not out then out = stdout end - local fi = funcinfo(func) - if all and fi.children then - for n=-1,-1000000000,-1 do - local k = funck(func, n) - if not k then break end - if type(k) == "proto" then bcdump(k, out, true) end - end - end - out:write(format("-- BYTECODE -- %s-%d\n", fi.loc, fi.lastlinedefined)) - local target = bctargets(func) - for pc=1,1000000000 do - local s = bcline(func, pc, target[pc] and "=>") - if not s then break end - out:write(s) - end - out:write("\n") - out:flush() -end - ------------------------------------------------------------------------------- - --- Active flag and output file handle. -local active, out - --- List handler. -local function h_list(func) - return bcdump(func, out) -end - --- Detach list handler. -local function bclistoff() - if active then - active = false - jit.attach(h_list) - if out and out ~= stdout and out ~= stderr then out:close() end - out = nil - end -end - --- Open the output file and attach list handler. -local function bcliston(outfile) - if active then bclistoff() end - if not outfile then outfile = os.getenv("LUAJIT_LISTFILE") end - if outfile then - out = outfile == "-" and stdout or assert(io.open(outfile, "w")) - else - out = stderr - end - jit.attach(h_list, "bc") - active = true -end - --- Public module functions. -module(...) - -line = bcline -dump = bcdump -targets = bctargets - -on = bcliston -off = bclistoff -start = bcliston -- For -j command line option. - diff --git a/deps/luajit/src/jit/bcsave.lua b/deps/luajit/src/jit/bcsave.lua deleted file mode 100644 index 0319b3d2..00000000 --- a/deps/luajit/src/jit/bcsave.lua +++ /dev/null @@ -1,659 +0,0 @@ ----------------------------------------------------------------------------- --- LuaJIT module to save/list bytecode. --- --- Copyright (C) 2005-2015 Mike Pall. All rights reserved. --- Released under the MIT license. See Copyright Notice in luajit.h ----------------------------------------------------------------------------- --- --- This module saves or lists the bytecode for an input file. --- It's run by the -b command line option. --- ------------------------------------------------------------------------------- - -local jit = require("jit") -assert(jit.version_num == 20004, "LuaJIT core/library version mismatch") -local bit = require("bit") - --- Symbol name prefix for LuaJIT bytecode. -local LJBC_PREFIX = "luaJIT_BC_" - ------------------------------------------------------------------------------- - -local function usage() - io.stderr:write[[ -Save LuaJIT bytecode: luajit -b[options] input output - -l Only list bytecode. - -s Strip debug info (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. - -- Stop handling options. - - Use stdin as input and/or stdout as output. - -File types: c h obj o raw (default) -]] - os.exit(1) -end - -local function check(ok, ...) - if ok then return ok, ... end - io.stderr:write("luajit: ", ...) - io.stderr:write("\n") - os.exit(1) -end - -local function readfile(input) - if type(input) == "function" then return input end - if input == "-" then input = nil end - return check(loadfile(input)) -end - -local function savefile(name, mode) - if name == "-" then return io.stdout end - return check(io.open(name, mode)) -end - ------------------------------------------------------------------------------- - -local map_type = { - raw = "raw", c = "c", h = "h", o = "obj", obj = "obj", -} - -local map_arch = { - x86 = true, x64 = true, arm = true, ppc = true, ppcspe = true, - mips = true, mipsel = true, -} - -local map_os = { - linux = true, windows = true, osx = true, freebsd = true, netbsd = true, - openbsd = true, dragonfly = true, solaris = true, -} - -local function checkarg(str, map, err) - str = string.lower(str) - local s = check(map[str], "unknown ", err) - return s == true and str or s -end - -local function detecttype(str) - local ext = string.match(string.lower(str), "%.(%a+)$") - return map_type[ext] or "raw" -end - -local function checkmodname(str) - check(string.match(str, "^[%w_.%-]+$"), "bad module name") - return string.gsub(str, "[%.%-]", "_") -end - -local function detectmodname(str) - if type(str) == "string" then - local tail = string.match(str, "[^/\\]+$") - if tail then str = tail end - local head = string.match(str, "^(.*)%.[^.]*$") - if head then str = head end - str = string.match(str, "^[%w_.%-]+") - else - str = nil - end - check(str, "cannot derive module name, use -n name") - return string.gsub(str, "[%.%-]", "_") -end - ------------------------------------------------------------------------------- - -local function bcsave_tail(fp, output, s) - local ok, err = fp:write(s) - if ok and output ~= "-" then ok, err = fp:close() end - check(ok, "cannot write ", output, ": ", err) -end - -local function bcsave_raw(output, s) - local fp = savefile(output, "wb") - bcsave_tail(fp, output, s) -end - -local function bcsave_c(ctx, output, s) - local fp = savefile(output, "w") - if ctx.type == "c" then - fp:write(string.format([[ -#ifdef _cplusplus -extern "C" -#endif -#ifdef _WIN32 -__declspec(dllexport) -#endif -const char %s%s[] = { -]], LJBC_PREFIX, ctx.modname)) - else - fp:write(string.format([[ -#define %s%s_SIZE %d -static const char %s%s[] = { -]], LJBC_PREFIX, ctx.modname, #s, LJBC_PREFIX, ctx.modname)) - end - local t, n, m = {}, 0, 0 - for i=1,#s do - local b = tostring(string.byte(s, i)) - m = m + #b + 1 - if m > 78 then - fp:write(table.concat(t, ",", 1, n), ",\n") - n, m = 0, #b + 1 - end - n = n + 1 - t[n] = b - end - bcsave_tail(fp, output, table.concat(t, ",", 1, n).."\n};\n") -end - -local function bcsave_elfobj(ctx, output, s, ffi) - ffi.cdef[[ -typedef struct { - uint8_t emagic[4], eclass, eendian, eversion, eosabi, eabiversion, epad[7]; - uint16_t type, machine; - uint32_t version; - uint32_t entry, phofs, shofs; - uint32_t flags; - uint16_t ehsize, phentsize, phnum, shentsize, shnum, shstridx; -} ELF32header; -typedef struct { - uint8_t emagic[4], eclass, eendian, eversion, eosabi, eabiversion, epad[7]; - uint16_t type, machine; - uint32_t version; - uint64_t entry, phofs, shofs; - uint32_t flags; - uint16_t ehsize, phentsize, phnum, shentsize, shnum, shstridx; -} ELF64header; -typedef struct { - uint32_t name, type, flags, addr, ofs, size, link, info, align, entsize; -} ELF32sectheader; -typedef struct { - uint32_t name, type; - uint64_t flags, addr, ofs, size; - uint32_t link, info; - uint64_t align, entsize; -} ELF64sectheader; -typedef struct { - uint32_t name, value, size; - uint8_t info, other; - uint16_t sectidx; -} ELF32symbol; -typedef struct { - uint32_t name; - uint8_t info, other; - uint16_t sectidx; - uint64_t value, size; -} ELF64symbol; -typedef struct { - ELF32header hdr; - ELF32sectheader sect[6]; - ELF32symbol sym[2]; - uint8_t space[4096]; -} ELF32obj; -typedef struct { - ELF64header hdr; - ELF64sectheader sect[6]; - ELF64symbol sym[2]; - uint8_t space[4096]; -} ELF64obj; -]] - local symname = LJBC_PREFIX..ctx.modname - local is64, isbe = false, false - if ctx.arch == "x64" then - is64 = true - elseif ctx.arch == "ppc" or ctx.arch == "ppcspe" or ctx.arch == "mips" then - isbe = true - end - - -- Handle different host/target endianess. - local function f32(x) return x end - local f16, fofs = f32, f32 - if ffi.abi("be") ~= isbe then - f32 = bit.bswap - function f16(x) return bit.rshift(bit.bswap(x), 16) end - if is64 then - local two32 = ffi.cast("int64_t", 2^32) - function fofs(x) return bit.bswap(x)*two32 end - else - fofs = f32 - end - end - - -- Create ELF object and fill in header. - local o = ffi.new(is64 and "ELF64obj" or "ELF32obj") - local hdr = o.hdr - if ctx.os == "bsd" or ctx.os == "other" then -- Determine native hdr.eosabi. - local bf = assert(io.open("/bin/ls", "rb")) - local bs = bf:read(9) - bf:close() - ffi.copy(o, bs, 9) - check(hdr.emagic[0] == 127, "no support for writing native object files") - else - hdr.emagic = "\127ELF" - hdr.eosabi = ({ freebsd=9, netbsd=2, openbsd=12, solaris=6 })[ctx.os] or 0 - end - hdr.eclass = is64 and 2 or 1 - hdr.eendian = isbe and 2 or 1 - hdr.eversion = 1 - hdr.type = f16(1) - hdr.machine = f16(({ x86=3, x64=62, arm=40, ppc=20, ppcspe=20, mips=8, mipsel=8 })[ctx.arch]) - if ctx.arch == "mips" or ctx.arch == "mipsel" then - hdr.flags = 0x50001006 - end - hdr.version = f32(1) - hdr.shofs = fofs(ffi.offsetof(o, "sect")) - hdr.ehsize = f16(ffi.sizeof(hdr)) - hdr.shentsize = f16(ffi.sizeof(o.sect[0])) - hdr.shnum = f16(6) - hdr.shstridx = f16(2) - - -- Fill in sections and symbols. - local sofs, ofs = ffi.offsetof(o, "space"), 1 - for i,name in ipairs{ - ".symtab", ".shstrtab", ".strtab", ".rodata", ".note.GNU-stack", - } do - local sect = o.sect[i] - sect.align = fofs(1) - sect.name = f32(ofs) - ffi.copy(o.space+ofs, name) - ofs = ofs + #name+1 - end - o.sect[1].type = f32(2) -- .symtab - o.sect[1].link = f32(3) - o.sect[1].info = f32(1) - o.sect[1].align = fofs(8) - o.sect[1].ofs = fofs(ffi.offsetof(o, "sym")) - o.sect[1].entsize = fofs(ffi.sizeof(o.sym[0])) - o.sect[1].size = fofs(ffi.sizeof(o.sym)) - o.sym[1].name = f32(1) - o.sym[1].sectidx = f16(4) - o.sym[1].size = fofs(#s) - o.sym[1].info = 17 - o.sect[2].type = f32(3) -- .shstrtab - o.sect[2].ofs = fofs(sofs) - o.sect[2].size = fofs(ofs) - o.sect[3].type = f32(3) -- .strtab - o.sect[3].ofs = fofs(sofs + ofs) - o.sect[3].size = fofs(#symname+1) - ffi.copy(o.space+ofs+1, symname) - ofs = ofs + #symname + 2 - o.sect[4].type = f32(1) -- .rodata - o.sect[4].flags = fofs(2) - o.sect[4].ofs = fofs(sofs + ofs) - o.sect[4].size = fofs(#s) - o.sect[5].type = f32(1) -- .note.GNU-stack - o.sect[5].ofs = fofs(sofs + ofs + #s) - - -- Write ELF object file. - local fp = savefile(output, "wb") - fp:write(ffi.string(o, ffi.sizeof(o)-4096+ofs)) - bcsave_tail(fp, output, s) -end - -local function bcsave_peobj(ctx, output, s, ffi) - ffi.cdef[[ -typedef struct { - uint16_t arch, nsects; - uint32_t time, symtabofs, nsyms; - uint16_t opthdrsz, flags; -} PEheader; -typedef struct { - char name[8]; - uint32_t vsize, vaddr, size, ofs, relocofs, lineofs; - uint16_t nreloc, nline; - uint32_t flags; -} PEsection; -typedef struct __attribute((packed)) { - union { - char name[8]; - uint32_t nameref[2]; - }; - uint32_t value; - int16_t sect; - uint16_t type; - uint8_t scl, naux; -} PEsym; -typedef struct __attribute((packed)) { - uint32_t size; - uint16_t nreloc, nline; - uint32_t cksum; - uint16_t assoc; - uint8_t comdatsel, unused[3]; -} PEsymaux; -typedef struct { - PEheader hdr; - PEsection sect[2]; - // Must be an even number of symbol structs. - PEsym sym0; - PEsymaux sym0aux; - PEsym sym1; - PEsymaux sym1aux; - PEsym sym2; - PEsym sym3; - uint32_t strtabsize; - uint8_t space[4096]; -} PEobj; -]] - local symname = LJBC_PREFIX..ctx.modname - local is64 = false - if ctx.arch == "x86" then - symname = "_"..symname - elseif ctx.arch == "x64" then - is64 = true - end - local symexport = " /EXPORT:"..symname..",DATA " - - -- The file format is always little-endian. Swap if the host is big-endian. - local function f32(x) return x end - local f16 = f32 - if ffi.abi("be") then - f32 = bit.bswap - function f16(x) return bit.rshift(bit.bswap(x), 16) end - end - - -- Create PE object and fill in header. - local o = ffi.new("PEobj") - local hdr = o.hdr - hdr.arch = f16(({ x86=0x14c, x64=0x8664, arm=0x1c0, ppc=0x1f2, mips=0x366, mipsel=0x366 })[ctx.arch]) - hdr.nsects = f16(2) - hdr.symtabofs = f32(ffi.offsetof(o, "sym0")) - hdr.nsyms = f32(6) - - -- Fill in sections and symbols. - o.sect[0].name = ".drectve" - o.sect[0].size = f32(#symexport) - o.sect[0].flags = f32(0x00100a00) - o.sym0.sect = f16(1) - o.sym0.scl = 3 - o.sym0.name = ".drectve" - o.sym0.naux = 1 - o.sym0aux.size = f32(#symexport) - o.sect[1].name = ".rdata" - o.sect[1].size = f32(#s) - o.sect[1].flags = f32(0x40300040) - o.sym1.sect = f16(2) - o.sym1.scl = 3 - o.sym1.name = ".rdata" - o.sym1.naux = 1 - o.sym1aux.size = f32(#s) - o.sym2.sect = f16(2) - o.sym2.scl = 2 - o.sym2.nameref[1] = f32(4) - o.sym3.sect = f16(-1) - o.sym3.scl = 2 - o.sym3.value = f32(1) - o.sym3.name = "@feat.00" -- Mark as SafeSEH compliant. - ffi.copy(o.space, symname) - local ofs = #symname + 1 - o.strtabsize = f32(ofs + 4) - o.sect[0].ofs = f32(ffi.offsetof(o, "space") + ofs) - ffi.copy(o.space + ofs, symexport) - ofs = ofs + #symexport - o.sect[1].ofs = f32(ffi.offsetof(o, "space") + ofs) - - -- Write PE object file. - local fp = savefile(output, "wb") - fp:write(ffi.string(o, ffi.sizeof(o)-4096+ofs)) - bcsave_tail(fp, output, s) -end - -local function bcsave_machobj(ctx, output, s, ffi) - ffi.cdef[[ -typedef struct -{ - uint32_t magic, cputype, cpusubtype, filetype, ncmds, sizeofcmds, flags; -} mach_header; -typedef struct -{ - mach_header; uint32_t reserved; -} mach_header_64; -typedef struct { - uint32_t cmd, cmdsize; - char segname[16]; - uint32_t vmaddr, vmsize, fileoff, filesize; - uint32_t maxprot, initprot, nsects, flags; -} mach_segment_command; -typedef struct { - uint32_t cmd, cmdsize; - char segname[16]; - uint64_t vmaddr, vmsize, fileoff, filesize; - uint32_t maxprot, initprot, nsects, flags; -} mach_segment_command_64; -typedef struct { - char sectname[16], segname[16]; - uint32_t addr, size; - uint32_t offset, align, reloff, nreloc, flags; - uint32_t reserved1, reserved2; -} mach_section; -typedef struct { - char sectname[16], segname[16]; - uint64_t addr, size; - uint32_t offset, align, reloff, nreloc, flags; - uint32_t reserved1, reserved2, reserved3; -} mach_section_64; -typedef struct { - uint32_t cmd, cmdsize, symoff, nsyms, stroff, strsize; -} mach_symtab_command; -typedef struct { - int32_t strx; - uint8_t type, sect; - int16_t desc; - uint32_t value; -} mach_nlist; -typedef struct { - uint32_t strx; - uint8_t type, sect; - uint16_t desc; - uint64_t value; -} mach_nlist_64; -typedef struct -{ - uint32_t magic, nfat_arch; -} mach_fat_header; -typedef struct -{ - uint32_t cputype, cpusubtype, offset, size, align; -} mach_fat_arch; -typedef struct { - struct { - mach_header hdr; - mach_segment_command seg; - mach_section sec; - mach_symtab_command sym; - } arch[1]; - mach_nlist sym_entry; - uint8_t space[4096]; -} mach_obj; -typedef struct { - struct { - mach_header_64 hdr; - mach_segment_command_64 seg; - mach_section_64 sec; - mach_symtab_command sym; - } arch[1]; - mach_nlist_64 sym_entry; - uint8_t space[4096]; -} mach_obj_64; -typedef struct { - mach_fat_header fat; - mach_fat_arch fat_arch[4]; - struct { - mach_header hdr; - mach_segment_command seg; - mach_section sec; - mach_symtab_command sym; - } arch[4]; - mach_nlist sym_entry; - uint8_t space[4096]; -} mach_fat_obj; -]] - local symname = '_'..LJBC_PREFIX..ctx.modname - local isfat, is64, align, mobj = false, false, 4, "mach_obj" - if ctx.arch == "x64" then - is64, align, mobj = true, 8, "mach_obj_64" - elseif ctx.arch == "arm" then - isfat, mobj = true, "mach_fat_obj" - else - check(ctx.arch == "x86", "unsupported architecture for OSX") - end - local function aligned(v, a) return bit.band(v+a-1, -a) end - local be32 = bit.bswap -- Mach-O FAT is BE, supported archs are LE. - - -- Create Mach-O object and fill in header. - local o = ffi.new(mobj) - local mach_size = aligned(ffi.offsetof(o, "space")+#symname+2, align) - local cputype = ({ x86={7}, x64={0x01000007}, arm={7,12,12,12} })[ctx.arch] - local cpusubtype = ({ x86={3}, x64={3}, arm={3,6,9,11} })[ctx.arch] - if isfat then - o.fat.magic = be32(0xcafebabe) - o.fat.nfat_arch = be32(#cpusubtype) - end - - -- Fill in sections and symbols. - for i=0,#cpusubtype-1 do - local ofs = 0 - if isfat then - local a = o.fat_arch[i] - a.cputype = be32(cputype[i+1]) - a.cpusubtype = be32(cpusubtype[i+1]) - -- Subsequent slices overlap each other to share data. - ofs = ffi.offsetof(o, "arch") + i*ffi.sizeof(o.arch[0]) - a.offset = be32(ofs) - a.size = be32(mach_size-ofs+#s) - end - local a = o.arch[i] - a.hdr.magic = is64 and 0xfeedfacf or 0xfeedface - a.hdr.cputype = cputype[i+1] - a.hdr.cpusubtype = cpusubtype[i+1] - a.hdr.filetype = 1 - a.hdr.ncmds = 2 - a.hdr.sizeofcmds = ffi.sizeof(a.seg)+ffi.sizeof(a.sec)+ffi.sizeof(a.sym) - a.seg.cmd = is64 and 0x19 or 0x1 - a.seg.cmdsize = ffi.sizeof(a.seg)+ffi.sizeof(a.sec) - a.seg.vmsize = #s - a.seg.fileoff = mach_size-ofs - a.seg.filesize = #s - a.seg.maxprot = 1 - a.seg.initprot = 1 - a.seg.nsects = 1 - ffi.copy(a.sec.sectname, "__data") - ffi.copy(a.sec.segname, "__DATA") - a.sec.size = #s - a.sec.offset = mach_size-ofs - a.sym.cmd = 2 - a.sym.cmdsize = ffi.sizeof(a.sym) - a.sym.symoff = ffi.offsetof(o, "sym_entry")-ofs - a.sym.nsyms = 1 - a.sym.stroff = ffi.offsetof(o, "sym_entry")+ffi.sizeof(o.sym_entry)-ofs - a.sym.strsize = aligned(#symname+2, align) - end - o.sym_entry.type = 0xf - o.sym_entry.sect = 1 - o.sym_entry.strx = 1 - ffi.copy(o.space+1, symname) - - -- Write Macho-O object file. - local fp = savefile(output, "wb") - fp:write(ffi.string(o, mach_size)) - bcsave_tail(fp, output, s) -end - -local function bcsave_obj(ctx, output, s) - local ok, ffi = pcall(require, "ffi") - check(ok, "FFI library required to write this file type") - if ctx.os == "windows" then - return bcsave_peobj(ctx, output, s, ffi) - elseif ctx.os == "osx" then - return bcsave_machobj(ctx, output, s, ffi) - else - return bcsave_elfobj(ctx, output, s, ffi) - end -end - ------------------------------------------------------------------------------- - -local function bclist(input, output) - local f = readfile(input) - require("jit.bc").dump(f, savefile(output, "w"), true) -end - -local function bcsave(ctx, input, output) - local f = readfile(input) - local s = string.dump(f, ctx.strip) - local t = ctx.type - if not t then - t = detecttype(output) - ctx.type = t - end - if t == "raw" then - bcsave_raw(output, s) - else - if not ctx.modname then ctx.modname = detectmodname(input) end - if t == "obj" then - bcsave_obj(ctx, output, s) - else - bcsave_c(ctx, output, s) - end - end -end - -local function docmd(...) - local arg = {...} - local n = 1 - local list = false - local ctx = { - strip = true, arch = jit.arch, os = string.lower(jit.os), - type = false, modname = false, - } - while n <= #arg do - local a = arg[n] - if type(a) == "string" and string.sub(a, 1, 1) == "-" and a ~= "-" then - table.remove(arg, n) - if a == "--" then break end - for m=2,#a do - local opt = string.sub(a, m, m) - if opt == "l" then - list = true - elseif opt == "s" then - ctx.strip = true - elseif opt == "g" then - ctx.strip = false - else - if arg[n] == nil or m ~= #a then usage() end - if opt == "e" then - if n ~= 1 then usage() end - arg[1] = check(loadstring(arg[1])) - elseif opt == "n" then - ctx.modname = checkmodname(table.remove(arg, n)) - elseif opt == "t" then - ctx.type = checkarg(table.remove(arg, n), map_type, "file type") - elseif opt == "a" then - ctx.arch = checkarg(table.remove(arg, n), map_arch, "architecture") - elseif opt == "o" then - ctx.os = checkarg(table.remove(arg, n), map_os, "OS name") - else - usage() - end - end - end - else - n = n + 1 - end - end - if list then - if #arg == 0 or #arg > 2 then usage() end - bclist(arg[1], arg[2] or "-") - else - if #arg ~= 2 then usage() end - bcsave(ctx, arg[1], arg[2]) - end -end - ------------------------------------------------------------------------------- - --- Public module functions. -module(...) - -start = docmd -- Process -b command line option. - diff --git a/deps/luajit/src/jit/dis_arm.lua b/deps/luajit/src/jit/dis_arm.lua deleted file mode 100644 index 59be715a..00000000 --- a/deps/luajit/src/jit/dis_arm.lua +++ /dev/null @@ -1,689 +0,0 @@ ----------------------------------------------------------------------------- --- LuaJIT ARM disassembler module. --- --- Copyright (C) 2005-2015 Mike Pall. All rights reserved. --- Released under the MIT license. See Copyright Notice in luajit.h ----------------------------------------------------------------------------- --- This is a helper module used by the LuaJIT machine code dumper module. --- --- It disassembles most user-mode ARMv7 instructions --- NYI: Advanced SIMD and VFP instructions. ------------------------------------------------------------------------------- - -local type = type -local sub, byte, format = string.sub, string.byte, string.format -local match, gmatch, gsub = string.match, string.gmatch, string.gsub -local concat = table.concat -local bit = require("bit") -local band, bor, ror, tohex = bit.band, bit.bor, bit.ror, bit.tohex -local lshift, rshift, arshift = bit.lshift, bit.rshift, bit.arshift - ------------------------------------------------------------------------------- --- Opcode maps ------------------------------------------------------------------------------- - -local map_loadc = { - shift = 8, mask = 15, - [10] = { - shift = 20, mask = 1, - [0] = { - shift = 23, mask = 3, - [0] = "vmovFmDN", "vstmFNdr", - _ = { - shift = 21, mask = 1, - [0] = "vstrFdl", - { shift = 16, mask = 15, [13] = "vpushFdr", _ = "vstmdbFNdr", } - }, - }, - { - shift = 23, mask = 3, - [0] = "vmovFDNm", - { shift = 16, mask = 15, [13] = "vpopFdr", _ = "vldmFNdr", }, - _ = { - shift = 21, mask = 1, - [0] = "vldrFdl", "vldmdbFNdr", - }, - }, - }, - [11] = { - shift = 20, mask = 1, - [0] = { - shift = 23, mask = 3, - [0] = "vmovGmDN", "vstmGNdr", - _ = { - shift = 21, mask = 1, - [0] = "vstrGdl", - { shift = 16, mask = 15, [13] = "vpushGdr", _ = "vstmdbGNdr", } - }, - }, - { - shift = 23, mask = 3, - [0] = "vmovGDNm", - { shift = 16, mask = 15, [13] = "vpopGdr", _ = "vldmGNdr", }, - _ = { - shift = 21, mask = 1, - [0] = "vldrGdl", "vldmdbGNdr", - }, - }, - }, - _ = { - shift = 0, mask = 0 -- NYI ldc, mcrr, mrrc. - }, -} - -local map_vfps = { - shift = 6, mask = 0x2c001, - [0] = "vmlaF.dnm", "vmlsF.dnm", - [0x04000] = "vnmlsF.dnm", [0x04001] = "vnmlaF.dnm", - [0x08000] = "vmulF.dnm", [0x08001] = "vnmulF.dnm", - [0x0c000] = "vaddF.dnm", [0x0c001] = "vsubF.dnm", - [0x20000] = "vdivF.dnm", - [0x24000] = "vfnmsF.dnm", [0x24001] = "vfnmaF.dnm", - [0x28000] = "vfmaF.dnm", [0x28001] = "vfmsF.dnm", - [0x2c000] = "vmovF.dY", - [0x2c001] = { - shift = 7, mask = 0x1e01, - [0] = "vmovF.dm", "vabsF.dm", - [0x0200] = "vnegF.dm", [0x0201] = "vsqrtF.dm", - [0x0800] = "vcmpF.dm", [0x0801] = "vcmpeF.dm", - [0x0a00] = "vcmpzF.d", [0x0a01] = "vcmpzeF.d", - [0x0e01] = "vcvtG.dF.m", - [0x1000] = "vcvt.f32.u32Fdm", [0x1001] = "vcvt.f32.s32Fdm", - [0x1800] = "vcvtr.u32F.dm", [0x1801] = "vcvt.u32F.dm", - [0x1a00] = "vcvtr.s32F.dm", [0x1a01] = "vcvt.s32F.dm", - }, -} - -local map_vfpd = { - shift = 6, mask = 0x2c001, - [0] = "vmlaG.dnm", "vmlsG.dnm", - [0x04000] = "vnmlsG.dnm", [0x04001] = "vnmlaG.dnm", - [0x08000] = "vmulG.dnm", [0x08001] = "vnmulG.dnm", - [0x0c000] = "vaddG.dnm", [0x0c001] = "vsubG.dnm", - [0x20000] = "vdivG.dnm", - [0x24000] = "vfnmsG.dnm", [0x24001] = "vfnmaG.dnm", - [0x28000] = "vfmaG.dnm", [0x28001] = "vfmsG.dnm", - [0x2c000] = "vmovG.dY", - [0x2c001] = { - shift = 7, mask = 0x1e01, - [0] = "vmovG.dm", "vabsG.dm", - [0x0200] = "vnegG.dm", [0x0201] = "vsqrtG.dm", - [0x0800] = "vcmpG.dm", [0x0801] = "vcmpeG.dm", - [0x0a00] = "vcmpzG.d", [0x0a01] = "vcmpzeG.d", - [0x0e01] = "vcvtF.dG.m", - [0x1000] = "vcvt.f64.u32GdFm", [0x1001] = "vcvt.f64.s32GdFm", - [0x1800] = "vcvtr.u32FdG.m", [0x1801] = "vcvt.u32FdG.m", - [0x1a00] = "vcvtr.s32FdG.m", [0x1a01] = "vcvt.s32FdG.m", - }, -} - -local map_datac = { - shift = 24, mask = 1, - [0] = { - shift = 4, mask = 1, - [0] = { - shift = 8, mask = 15, - [10] = map_vfps, - [11] = map_vfpd, - -- NYI cdp, mcr, mrc. - }, - { - shift = 8, mask = 15, - [10] = { - shift = 20, mask = 15, - [0] = "vmovFnD", "vmovFDn", - [14] = "vmsrD", - [15] = { shift = 12, mask = 15, [15] = "vmrs", _ = "vmrsD", }, - }, - }, - }, - "svcT", -} - -local map_loadcu = { - shift = 0, mask = 0, -- NYI unconditional CP load/store. -} - -local map_datacu = { - shift = 0, mask = 0, -- NYI unconditional CP data. -} - -local map_simddata = { - shift = 0, mask = 0, -- NYI SIMD data. -} - -local map_simdload = { - shift = 0, mask = 0, -- NYI SIMD load/store, preload. -} - -local map_preload = { - shift = 0, mask = 0, -- NYI preload. -} - -local map_media = { - shift = 20, mask = 31, - [0] = false, - { --01 - shift = 5, mask = 7, - [0] = "sadd16DNM", "sasxDNM", "ssaxDNM", "ssub16DNM", - "sadd8DNM", false, false, "ssub8DNM", - }, - { --02 - shift = 5, mask = 7, - [0] = "qadd16DNM", "qasxDNM", "qsaxDNM", "qsub16DNM", - "qadd8DNM", false, false, "qsub8DNM", - }, - { --03 - shift = 5, mask = 7, - [0] = "shadd16DNM", "shasxDNM", "shsaxDNM", "shsub16DNM", - "shadd8DNM", false, false, "shsub8DNM", - }, - false, - { --05 - shift = 5, mask = 7, - [0] = "uadd16DNM", "uasxDNM", "usaxDNM", "usub16DNM", - "uadd8DNM", false, false, "usub8DNM", - }, - { --06 - shift = 5, mask = 7, - [0] = "uqadd16DNM", "uqasxDNM", "uqsaxDNM", "uqsub16DNM", - "uqadd8DNM", false, false, "uqsub8DNM", - }, - { --07 - shift = 5, mask = 7, - [0] = "uhadd16DNM", "uhasxDNM", "uhsaxDNM", "uhsub16DNM", - "uhadd8DNM", false, false, "uhsub8DNM", - }, - { --08 - shift = 5, mask = 7, - [0] = "pkhbtDNMU", false, "pkhtbDNMU", - { shift = 16, mask = 15, [15] = "sxtb16DMU", _ = "sxtab16DNMU", }, - "pkhbtDNMU", "selDNM", "pkhtbDNMU", - }, - false, - { --0a - shift = 5, mask = 7, - [0] = "ssatDxMu", "ssat16DxM", "ssatDxMu", - { shift = 16, mask = 15, [15] = "sxtbDMU", _ = "sxtabDNMU", }, - "ssatDxMu", false, "ssatDxMu", - }, - { --0b - shift = 5, mask = 7, - [0] = "ssatDxMu", "revDM", "ssatDxMu", - { shift = 16, mask = 15, [15] = "sxthDMU", _ = "sxtahDNMU", }, - "ssatDxMu", "rev16DM", "ssatDxMu", - }, - { --0c - shift = 5, mask = 7, - [3] = { shift = 16, mask = 15, [15] = "uxtb16DMU", _ = "uxtab16DNMU", }, - }, - false, - { --0e - shift = 5, mask = 7, - [0] = "usatDwMu", "usat16DwM", "usatDwMu", - { shift = 16, mask = 15, [15] = "uxtbDMU", _ = "uxtabDNMU", }, - "usatDwMu", false, "usatDwMu", - }, - { --0f - shift = 5, mask = 7, - [0] = "usatDwMu", "rbitDM", "usatDwMu", - { shift = 16, mask = 15, [15] = "uxthDMU", _ = "uxtahDNMU", }, - "usatDwMu", "revshDM", "usatDwMu", - }, - { --10 - shift = 12, mask = 15, - [15] = { - shift = 5, mask = 7, - "smuadNMS", "smuadxNMS", "smusdNMS", "smusdxNMS", - }, - _ = { - shift = 5, mask = 7, - [0] = "smladNMSD", "smladxNMSD", "smlsdNMSD", "smlsdxNMSD", - }, - }, - false, false, false, - { --14 - shift = 5, mask = 7, - [0] = "smlaldDNMS", "smlaldxDNMS", "smlsldDNMS", "smlsldxDNMS", - }, - { --15 - shift = 5, mask = 7, - [0] = { shift = 12, mask = 15, [15] = "smmulNMS", _ = "smmlaNMSD", }, - { shift = 12, mask = 15, [15] = "smmulrNMS", _ = "smmlarNMSD", }, - false, false, false, false, - "smmlsNMSD", "smmlsrNMSD", - }, - false, false, - { --18 - shift = 5, mask = 7, - [0] = { shift = 12, mask = 15, [15] = "usad8NMS", _ = "usada8NMSD", }, - }, - false, - { --1a - shift = 5, mask = 3, [2] = "sbfxDMvw", - }, - { --1b - shift = 5, mask = 3, [2] = "sbfxDMvw", - }, - { --1c - shift = 5, mask = 3, - [0] = { shift = 0, mask = 15, [15] = "bfcDvX", _ = "bfiDMvX", }, - }, - { --1d - shift = 5, mask = 3, - [0] = { shift = 0, mask = 15, [15] = "bfcDvX", _ = "bfiDMvX", }, - }, - { --1e - shift = 5, mask = 3, [2] = "ubfxDMvw", - }, - { --1f - shift = 5, mask = 3, [2] = "ubfxDMvw", - }, -} - -local map_load = { - shift = 21, mask = 9, - { - shift = 20, mask = 5, - [0] = "strtDL", "ldrtDL", [4] = "strbtDL", [5] = "ldrbtDL", - }, - _ = { - shift = 20, mask = 5, - [0] = "strDL", "ldrDL", [4] = "strbDL", [5] = "ldrbDL", - } -} - -local map_load1 = { - shift = 4, mask = 1, - [0] = map_load, map_media, -} - -local map_loadm = { - shift = 20, mask = 1, - [0] = { - shift = 23, mask = 3, - [0] = "stmdaNR", "stmNR", - { shift = 16, mask = 63, [45] = "pushR", _ = "stmdbNR", }, "stmibNR", - }, - { - shift = 23, mask = 3, - [0] = "ldmdaNR", { shift = 16, mask = 63, [61] = "popR", _ = "ldmNR", }, - "ldmdbNR", "ldmibNR", - }, -} - -local map_data = { - shift = 21, mask = 15, - [0] = "andDNPs", "eorDNPs", "subDNPs", "rsbDNPs", - "addDNPs", "adcDNPs", "sbcDNPs", "rscDNPs", - "tstNP", "teqNP", "cmpNP", "cmnNP", - "orrDNPs", "movDPs", "bicDNPs", "mvnDPs", -} - -local map_mul = { - shift = 21, mask = 7, - [0] = "mulNMSs", "mlaNMSDs", "umaalDNMS", "mlsDNMS", - "umullDNMSs", "umlalDNMSs", "smullDNMSs", "smlalDNMSs", -} - -local map_sync = { - shift = 20, mask = 15, -- NYI: brackets around N. R(D+1) for ldrexd/strexd. - [0] = "swpDMN", false, false, false, - "swpbDMN", false, false, false, - "strexDMN", "ldrexDN", "strexdDN", "ldrexdDN", - "strexbDMN", "ldrexbDN", "strexhDN", "ldrexhDN", -} - -local map_mulh = { - shift = 21, mask = 3, - [0] = { shift = 5, mask = 3, - [0] = "smlabbNMSD", "smlatbNMSD", "smlabtNMSD", "smlattNMSD", }, - { shift = 5, mask = 3, - [0] = "smlawbNMSD", "smulwbNMS", "smlawtNMSD", "smulwtNMS", }, - { shift = 5, mask = 3, - [0] = "smlalbbDNMS", "smlaltbDNMS", "smlalbtDNMS", "smlalttDNMS", }, - { shift = 5, mask = 3, - [0] = "smulbbNMS", "smultbNMS", "smulbtNMS", "smulttNMS", }, -} - -local map_misc = { - shift = 4, mask = 7, - -- NYI: decode PSR bits of msr. - [0] = { shift = 21, mask = 1, [0] = "mrsD", "msrM", }, - { shift = 21, mask = 3, "bxM", false, "clzDM", }, - { shift = 21, mask = 3, "bxjM", }, - { shift = 21, mask = 3, "blxM", }, - false, - { shift = 21, mask = 3, [0] = "qaddDMN", "qsubDMN", "qdaddDMN", "qdsubDMN", }, - false, - { shift = 21, mask = 3, "bkptK", }, -} - -local map_datar = { - shift = 4, mask = 9, - [9] = { - shift = 5, mask = 3, - [0] = { shift = 24, mask = 1, [0] = map_mul, map_sync, }, - { shift = 20, mask = 1, [0] = "strhDL", "ldrhDL", }, - { shift = 20, mask = 1, [0] = "ldrdDL", "ldrsbDL", }, - { shift = 20, mask = 1, [0] = "strdDL", "ldrshDL", }, - }, - _ = { - shift = 20, mask = 25, - [16] = { shift = 7, mask = 1, [0] = map_misc, map_mulh, }, - _ = { - shift = 0, mask = 0xffffffff, - [bor(0xe1a00000)] = "nop", - _ = map_data, - } - }, -} - -local map_datai = { - shift = 20, mask = 31, -- NYI: decode PSR bits of msr. Decode imm12. - [16] = "movwDW", [20] = "movtDW", - [18] = { shift = 0, mask = 0xf00ff, [0] = "nopv6", _ = "msrNW", }, - [22] = "msrNW", - _ = map_data, -} - -local map_branch = { - shift = 24, mask = 1, - [0] = "bB", "blB" -} - -local map_condins = { - [0] = map_datar, map_datai, map_load, map_load1, - map_loadm, map_branch, map_loadc, map_datac -} - --- NYI: setend. -local map_uncondins = { - [0] = false, map_simddata, map_simdload, map_preload, - false, "blxB", map_loadcu, map_datacu, -} - ------------------------------------------------------------------------------- - -local map_gpr = { - [0] = "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", - "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc", -} - -local map_cond = { - [0] = "eq", "ne", "hs", "lo", "mi", "pl", "vs", "vc", - "hi", "ls", "ge", "lt", "gt", "le", "al", -} - -local map_shift = { [0] = "lsl", "lsr", "asr", "ror", } - ------------------------------------------------------------------------------- - --- Output a nicely formatted line with an opcode and operands. -local function putop(ctx, text, operands) - local pos = ctx.pos - local extra = "" - if ctx.rel then - local sym = ctx.symtab[ctx.rel] - if sym then - extra = "\t->"..sym - elseif band(ctx.op, 0x0e000000) ~= 0x0a000000 then - extra = "\t; 0x"..tohex(ctx.rel) - end - end - if ctx.hexdump > 0 then - ctx.out(format("%08x %s %-5s %s%s\n", - ctx.addr+pos, tohex(ctx.op), text, concat(operands, ", "), extra)) - else - ctx.out(format("%08x %-5s %s%s\n", - ctx.addr+pos, text, concat(operands, ", "), extra)) - end - ctx.pos = pos + 4 -end - --- Fallback for unknown opcodes. -local function unknown(ctx) - return putop(ctx, ".long", { "0x"..tohex(ctx.op) }) -end - --- Format operand 2 of load/store opcodes. -local function fmtload(ctx, op, pos) - local base = map_gpr[band(rshift(op, 16), 15)] - local x, ofs - local ext = (band(op, 0x04000000) == 0) - if not ext and band(op, 0x02000000) == 0 then - ofs = band(op, 4095) - if band(op, 0x00800000) == 0 then ofs = -ofs end - if base == "pc" then ctx.rel = ctx.addr + pos + 8 + ofs end - ofs = "#"..ofs - elseif ext and band(op, 0x00400000) ~= 0 then - ofs = band(op, 15) + band(rshift(op, 4), 0xf0) - if band(op, 0x00800000) == 0 then ofs = -ofs end - if base == "pc" then ctx.rel = ctx.addr + pos + 8 + ofs end - ofs = "#"..ofs - else - ofs = map_gpr[band(op, 15)] - if ext or band(op, 0xfe0) == 0 then - elseif band(op, 0xfe0) == 0x60 then - ofs = format("%s, rrx", ofs) - else - local sh = band(rshift(op, 7), 31) - if sh == 0 then sh = 32 end - ofs = format("%s, %s #%d", ofs, map_shift[band(rshift(op, 5), 3)], sh) - end - if band(op, 0x00800000) == 0 then ofs = "-"..ofs end - end - if ofs == "#0" then - x = format("[%s]", base) - elseif band(op, 0x01000000) == 0 then - x = format("[%s], %s", base, ofs) - else - x = format("[%s, %s]", base, ofs) - end - if band(op, 0x01200000) == 0x01200000 then x = x.."!" end - return x -end - --- Format operand 2 of vector load/store opcodes. -local function fmtvload(ctx, op, pos) - local base = map_gpr[band(rshift(op, 16), 15)] - local ofs = band(op, 255)*4 - if band(op, 0x00800000) == 0 then ofs = -ofs end - if base == "pc" then ctx.rel = ctx.addr + pos + 8 + ofs end - if ofs == 0 then - return format("[%s]", base) - else - return format("[%s, #%d]", base, ofs) - end -end - -local function fmtvr(op, vr, sh0, sh1) - if vr == "s" then - return format("s%d", 2*band(rshift(op, sh0), 15)+band(rshift(op, sh1), 1)) - else - return format("d%d", band(rshift(op, sh0), 15)+band(rshift(op, sh1-4), 16)) - end -end - --- Disassemble a single instruction. -local function disass_ins(ctx) - local pos = ctx.pos - local b0, b1, b2, b3 = byte(ctx.code, pos+1, pos+4) - local op = bor(lshift(b3, 24), lshift(b2, 16), lshift(b1, 8), b0) - local operands = {} - local suffix = "" - local last, name, pat - local vr - ctx.op = op - ctx.rel = nil - - local cond = rshift(op, 28) - local opat - if cond == 15 then - opat = map_uncondins[band(rshift(op, 25), 7)] - else - if cond ~= 14 then suffix = map_cond[cond] end - opat = map_condins[band(rshift(op, 25), 7)] - end - while type(opat) ~= "string" do - if not opat then return unknown(ctx) end - opat = opat[band(rshift(op, opat.shift), opat.mask)] or opat._ - end - name, pat = match(opat, "^([a-z0-9]*)(.*)") - if sub(pat, 1, 1) == "." then - local s2, p2 = match(pat, "^([a-z0-9.]*)(.*)") - suffix = suffix..s2 - pat = p2 - end - - for p in gmatch(pat, ".") do - local x = nil - if p == "D" then - x = map_gpr[band(rshift(op, 12), 15)] - elseif p == "N" then - x = map_gpr[band(rshift(op, 16), 15)] - elseif p == "S" then - x = map_gpr[band(rshift(op, 8), 15)] - elseif p == "M" then - x = map_gpr[band(op, 15)] - elseif p == "d" then - x = fmtvr(op, vr, 12, 22) - elseif p == "n" then - x = fmtvr(op, vr, 16, 7) - elseif p == "m" then - x = fmtvr(op, vr, 0, 5) - elseif p == "P" then - if band(op, 0x02000000) ~= 0 then - x = ror(band(op, 255), 2*band(rshift(op, 8), 15)) - else - x = map_gpr[band(op, 15)] - if band(op, 0xff0) ~= 0 then - operands[#operands+1] = x - local s = map_shift[band(rshift(op, 5), 3)] - local r = nil - if band(op, 0xf90) == 0 then - if s == "ror" then s = "rrx" else r = "#32" end - elseif band(op, 0x10) == 0 then - r = "#"..band(rshift(op, 7), 31) - else - r = map_gpr[band(rshift(op, 8), 15)] - end - if name == "mov" then name = s; x = r - elseif r then x = format("%s %s", s, r) - else x = s end - end - end - elseif p == "L" then - x = fmtload(ctx, op, pos) - elseif p == "l" then - x = fmtvload(ctx, op, pos) - elseif p == "B" then - local addr = ctx.addr + pos + 8 + arshift(lshift(op, 8), 6) - if cond == 15 then addr = addr + band(rshift(op, 23), 2) end - ctx.rel = addr - x = "0x"..tohex(addr) - elseif p == "F" then - vr = "s" - elseif p == "G" then - vr = "d" - elseif p == "." then - suffix = suffix..(vr == "s" and ".f32" or ".f64") - elseif p == "R" then - if band(op, 0x00200000) ~= 0 and #operands == 1 then - operands[1] = operands[1].."!" - end - local t = {} - for i=0,15 do - if band(rshift(op, i), 1) == 1 then t[#t+1] = map_gpr[i] end - end - x = "{"..concat(t, ", ").."}" - elseif p == "r" then - if band(op, 0x00200000) ~= 0 and #operands == 2 then - operands[1] = operands[1].."!" - end - local s = tonumber(sub(last, 2)) - local n = band(op, 255) - if vr == "d" then n = rshift(n, 1) end - operands[#operands] = format("{%s-%s%d}", last, vr, s+n-1) - elseif p == "W" then - x = band(op, 0x0fff) + band(rshift(op, 4), 0xf000) - elseif p == "T" then - x = "#0x"..tohex(band(op, 0x00ffffff), 6) - elseif p == "U" then - x = band(rshift(op, 7), 31) - if x == 0 then x = nil end - elseif p == "u" then - x = band(rshift(op, 7), 31) - if band(op, 0x40) == 0 then - if x == 0 then x = nil else x = "lsl #"..x end - else - if x == 0 then x = "asr #32" else x = "asr #"..x end - end - elseif p == "v" then - x = band(rshift(op, 7), 31) - elseif p == "w" then - x = band(rshift(op, 16), 31) - elseif p == "x" then - x = band(rshift(op, 16), 31) + 1 - elseif p == "X" then - x = band(rshift(op, 16), 31) - last + 1 - elseif p == "Y" then - x = band(rshift(op, 12), 0xf0) + band(op, 0x0f) - elseif p == "K" then - x = "#0x"..tohex(band(rshift(op, 4), 0x0000fff0) + band(op, 15), 4) - elseif p == "s" then - if band(op, 0x00100000) ~= 0 then suffix = "s"..suffix end - else - assert(false) - end - if x then - last = x - if type(x) == "number" then x = "#"..x end - operands[#operands+1] = x - end - end - - return putop(ctx, name..suffix, operands) -end - ------------------------------------------------------------------------------- - --- Disassemble a block of code. -local function disass_block(ctx, ofs, len) - if not ofs then ofs = 0 end - local stop = len and ofs+len or #ctx.code - ctx.pos = ofs - ctx.rel = nil - while ctx.pos < stop do disass_ins(ctx) end -end - --- Extended API: create a disassembler context. Then call ctx:disass(ofs, len). -local function create_(code, addr, out) - local ctx = {} - ctx.code = code - ctx.addr = addr or 0 - ctx.out = out or io.write - ctx.symtab = {} - ctx.disass = disass_block - ctx.hexdump = 8 - return ctx -end - --- Simple API: disassemble code (a string) at address and output via out. -local function disass_(code, addr, out) - create_(code, addr, out):disass() -end - --- Return register name for RID. -local function regname_(r) - if r < 16 then return map_gpr[r] end - return "d"..(r-16) -end - --- Public module functions. -module(...) - -create = create_ -disass = disass_ -regname = regname_ - diff --git a/deps/luajit/src/jit/dis_mips.lua b/deps/luajit/src/jit/dis_mips.lua deleted file mode 100644 index acdd2be1..00000000 --- a/deps/luajit/src/jit/dis_mips.lua +++ /dev/null @@ -1,428 +0,0 @@ ----------------------------------------------------------------------------- --- LuaJIT MIPS disassembler module. --- --- Copyright (C) 2005-2015 Mike Pall. All rights reserved. --- Released under the MIT/X license. See Copyright Notice in luajit.h ----------------------------------------------------------------------------- --- This is a helper module used by the LuaJIT machine code dumper module. --- --- It disassembles all standard MIPS32R1/R2 instructions. --- Default mode is big-endian, but see: dis_mipsel.lua ------------------------------------------------------------------------------- - -local type = type -local sub, byte, format = string.sub, string.byte, string.format -local match, gmatch, gsub = string.match, string.gmatch, string.gsub -local concat = table.concat -local bit = require("bit") -local band, bor, tohex = bit.band, bit.bor, bit.tohex -local lshift, rshift, arshift = bit.lshift, bit.rshift, bit.arshift - ------------------------------------------------------------------------------- --- Primary and extended opcode maps ------------------------------------------------------------------------------- - -local map_movci = { shift = 16, mask = 1, [0] = "movfDSC", "movtDSC", } -local map_srl = { shift = 21, mask = 1, [0] = "srlDTA", "rotrDTA", } -local map_srlv = { shift = 6, mask = 1, [0] = "srlvDTS", "rotrvDTS", } - -local map_special = { - shift = 0, mask = 63, - [0] = { shift = 0, mask = -1, [0] = "nop", _ = "sllDTA" }, - map_movci, map_srl, "sraDTA", - "sllvDTS", false, map_srlv, "sravDTS", - "jrS", "jalrD1S", "movzDST", "movnDST", - "syscallY", "breakY", false, "sync", - "mfhiD", "mthiS", "mfloD", "mtloS", - false, false, false, false, - "multST", "multuST", "divST", "divuST", - false, false, false, false, - "addDST", "addu|moveDST0", "subDST", "subu|neguDS0T", - "andDST", "orDST", "xorDST", "nor|notDST0", - false, false, "sltDST", "sltuDST", - false, false, false, false, - "tgeSTZ", "tgeuSTZ", "tltSTZ", "tltuSTZ", - "teqSTZ", false, "tneSTZ", -} - -local map_special2 = { - shift = 0, mask = 63, - [0] = "maddST", "madduST", "mulDST", false, - "msubST", "msubuST", - [32] = "clzDS", [33] = "cloDS", - [63] = "sdbbpY", -} - -local map_bshfl = { - shift = 6, mask = 31, - [2] = "wsbhDT", - [16] = "sebDT", - [24] = "sehDT", -} - -local map_special3 = { - shift = 0, mask = 63, - [0] = "extTSAK", [4] = "insTSAL", - [32] = map_bshfl, - [59] = "rdhwrTD", -} - -local map_regimm = { - shift = 16, mask = 31, - [0] = "bltzSB", "bgezSB", "bltzlSB", "bgezlSB", - false, false, false, false, - "tgeiSI", "tgeiuSI", "tltiSI", "tltiuSI", - "teqiSI", false, "tneiSI", false, - "bltzalSB", "bgezalSB", "bltzallSB", "bgezallSB", - false, false, false, false, - false, false, false, false, - false, false, false, "synciSO", -} - -local map_cop0 = { - shift = 25, mask = 1, - [0] = { - shift = 21, mask = 15, - [0] = "mfc0TDW", [4] = "mtc0TDW", - [10] = "rdpgprDT", - [11] = { shift = 5, mask = 1, [0] = "diT0", "eiT0", }, - [14] = "wrpgprDT", - }, { - shift = 0, mask = 63, - [1] = "tlbr", [2] = "tlbwi", [6] = "tlbwr", [8] = "tlbp", - [24] = "eret", [31] = "deret", - [32] = "wait", - }, -} - -local map_cop1s = { - shift = 0, mask = 63, - [0] = "add.sFGH", "sub.sFGH", "mul.sFGH", "div.sFGH", - "sqrt.sFG", "abs.sFG", "mov.sFG", "neg.sFG", - "round.l.sFG", "trunc.l.sFG", "ceil.l.sFG", "floor.l.sFG", - "round.w.sFG", "trunc.w.sFG", "ceil.w.sFG", "floor.w.sFG", - false, - { shift = 16, mask = 1, [0] = "movf.sFGC", "movt.sFGC" }, - "movz.sFGT", "movn.sFGT", - false, "recip.sFG", "rsqrt.sFG", false, - false, false, false, false, - false, false, false, false, - false, "cvt.d.sFG", false, false, - "cvt.w.sFG", "cvt.l.sFG", "cvt.ps.sFGH", false, - false, false, false, false, - false, false, false, false, - "c.f.sVGH", "c.un.sVGH", "c.eq.sVGH", "c.ueq.sVGH", - "c.olt.sVGH", "c.ult.sVGH", "c.ole.sVGH", "c.ule.sVGH", - "c.sf.sVGH", "c.ngle.sVGH", "c.seq.sVGH", "c.ngl.sVGH", - "c.lt.sVGH", "c.nge.sVGH", "c.le.sVGH", "c.ngt.sVGH", -} - -local map_cop1d = { - shift = 0, mask = 63, - [0] = "add.dFGH", "sub.dFGH", "mul.dFGH", "div.dFGH", - "sqrt.dFG", "abs.dFG", "mov.dFG", "neg.dFG", - "round.l.dFG", "trunc.l.dFG", "ceil.l.dFG", "floor.l.dFG", - "round.w.dFG", "trunc.w.dFG", "ceil.w.dFG", "floor.w.dFG", - false, - { shift = 16, mask = 1, [0] = "movf.dFGC", "movt.dFGC" }, - "movz.dFGT", "movn.dFGT", - false, "recip.dFG", "rsqrt.dFG", false, - false, false, false, false, - false, false, false, false, - "cvt.s.dFG", false, false, false, - "cvt.w.dFG", "cvt.l.dFG", false, false, - false, false, false, false, - false, false, false, false, - "c.f.dVGH", "c.un.dVGH", "c.eq.dVGH", "c.ueq.dVGH", - "c.olt.dVGH", "c.ult.dVGH", "c.ole.dVGH", "c.ule.dVGH", - "c.df.dVGH", "c.ngle.dVGH", "c.deq.dVGH", "c.ngl.dVGH", - "c.lt.dVGH", "c.nge.dVGH", "c.le.dVGH", "c.ngt.dVGH", -} - -local map_cop1ps = { - shift = 0, mask = 63, - [0] = "add.psFGH", "sub.psFGH", "mul.psFGH", false, - false, "abs.psFG", "mov.psFG", "neg.psFG", - false, false, false, false, - false, false, false, false, - false, - { shift = 16, mask = 1, [0] = "movf.psFGC", "movt.psFGC" }, - "movz.psFGT", "movn.psFGT", - false, false, false, false, - false, false, false, false, - false, false, false, false, - "cvt.s.puFG", false, false, false, - false, false, false, false, - "cvt.s.plFG", false, false, false, - "pll.psFGH", "plu.psFGH", "pul.psFGH", "puu.psFGH", - "c.f.psVGH", "c.un.psVGH", "c.eq.psVGH", "c.ueq.psVGH", - "c.olt.psVGH", "c.ult.psVGH", "c.ole.psVGH", "c.ule.psVGH", - "c.psf.psVGH", "c.ngle.psVGH", "c.pseq.psVGH", "c.ngl.psVGH", - "c.lt.psVGH", "c.nge.psVGH", "c.le.psVGH", "c.ngt.psVGH", -} - -local map_cop1w = { - shift = 0, mask = 63, - [32] = "cvt.s.wFG", [33] = "cvt.d.wFG", -} - -local map_cop1l = { - shift = 0, mask = 63, - [32] = "cvt.s.lFG", [33] = "cvt.d.lFG", -} - -local map_cop1bc = { - shift = 16, mask = 3, - [0] = "bc1fCB", "bc1tCB", "bc1flCB", "bc1tlCB", -} - -local map_cop1 = { - shift = 21, mask = 31, - [0] = "mfc1TG", false, "cfc1TG", "mfhc1TG", - "mtc1TG", false, "ctc1TG", "mthc1TG", - map_cop1bc, false, false, false, - false, false, false, false, - map_cop1s, map_cop1d, false, false, - map_cop1w, map_cop1l, map_cop1ps, -} - -local map_cop1x = { - shift = 0, mask = 63, - [0] = "lwxc1FSX", "ldxc1FSX", false, false, - false, "luxc1FSX", false, false, - "swxc1FSX", "sdxc1FSX", false, false, - false, "suxc1FSX", false, "prefxMSX", - false, false, false, false, - false, false, false, false, - false, false, false, false, - false, false, "alnv.psFGHS", false, - "madd.sFRGH", "madd.dFRGH", false, false, - false, false, "madd.psFRGH", false, - "msub.sFRGH", "msub.dFRGH", false, false, - false, false, "msub.psFRGH", false, - "nmadd.sFRGH", "nmadd.dFRGH", false, false, - false, false, "nmadd.psFRGH", false, - "nmsub.sFRGH", "nmsub.dFRGH", false, false, - false, false, "nmsub.psFRGH", false, -} - -local map_pri = { - [0] = map_special, map_regimm, "jJ", "jalJ", - "beq|beqz|bST00B", "bne|bnezST0B", "blezSB", "bgtzSB", - "addiTSI", "addiu|liTS0I", "sltiTSI", "sltiuTSI", - "andiTSU", "ori|liTS0U", "xoriTSU", "luiTU", - map_cop0, map_cop1, false, map_cop1x, - "beql|beqzlST0B", "bnel|bnezlST0B", "blezlSB", "bgtzlSB", - false, false, false, false, - map_special2, false, false, map_special3, - "lbTSO", "lhTSO", "lwlTSO", "lwTSO", - "lbuTSO", "lhuTSO", "lwrTSO", false, - "sbTSO", "shTSO", "swlTSO", "swTSO", - false, false, "swrTSO", "cacheNSO", - "llTSO", "lwc1HSO", "lwc2TSO", "prefNSO", - false, "ldc1HSO", "ldc2TSO", false, - "scTSO", "swc1HSO", "swc2TSO", false, - false, "sdc1HSO", "sdc2TSO", false, -} - ------------------------------------------------------------------------------- - -local map_gpr = { - [0] = "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", - "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", - "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23", - "r24", "r25", "r26", "r27", "r28", "sp", "r30", "ra", -} - ------------------------------------------------------------------------------- - --- Output a nicely formatted line with an opcode and operands. -local function putop(ctx, text, operands) - local pos = ctx.pos - local extra = "" - if ctx.rel then - local sym = ctx.symtab[ctx.rel] - if sym then extra = "\t->"..sym end - end - if ctx.hexdump > 0 then - ctx.out(format("%08x %s %-7s %s%s\n", - ctx.addr+pos, tohex(ctx.op), text, concat(operands, ", "), extra)) - else - ctx.out(format("%08x %-7s %s%s\n", - ctx.addr+pos, text, concat(operands, ", "), extra)) - end - ctx.pos = pos + 4 -end - --- Fallback for unknown opcodes. -local function unknown(ctx) - return putop(ctx, ".long", { "0x"..tohex(ctx.op) }) -end - -local function get_be(ctx) - local pos = ctx.pos - local b0, b1, b2, b3 = byte(ctx.code, pos+1, pos+4) - return bor(lshift(b0, 24), lshift(b1, 16), lshift(b2, 8), b3) -end - -local function get_le(ctx) - local pos = ctx.pos - local b0, b1, b2, b3 = byte(ctx.code, pos+1, pos+4) - return bor(lshift(b3, 24), lshift(b2, 16), lshift(b1, 8), b0) -end - --- Disassemble a single instruction. -local function disass_ins(ctx) - local op = ctx:get() - local operands = {} - local last = nil - ctx.op = op - ctx.rel = nil - - local opat = map_pri[rshift(op, 26)] - while type(opat) ~= "string" do - if not opat then return unknown(ctx) end - opat = opat[band(rshift(op, opat.shift), opat.mask)] or opat._ - end - local name, pat = match(opat, "^([a-z0-9_.]*)(.*)") - local altname, pat2 = match(pat, "|([a-z0-9_.|]*)(.*)") - if altname then pat = pat2 end - - for p in gmatch(pat, ".") do - local x = nil - if p == "S" then - x = map_gpr[band(rshift(op, 21), 31)] - elseif p == "T" then - x = map_gpr[band(rshift(op, 16), 31)] - elseif p == "D" then - x = map_gpr[band(rshift(op, 11), 31)] - elseif p == "F" then - x = "f"..band(rshift(op, 6), 31) - elseif p == "G" then - x = "f"..band(rshift(op, 11), 31) - elseif p == "H" then - x = "f"..band(rshift(op, 16), 31) - elseif p == "R" then - x = "f"..band(rshift(op, 21), 31) - elseif p == "A" then - x = band(rshift(op, 6), 31) - elseif p == "M" then - x = band(rshift(op, 11), 31) - elseif p == "N" then - x = band(rshift(op, 16), 31) - elseif p == "C" then - x = band(rshift(op, 18), 7) - if x == 0 then x = nil end - elseif p == "K" then - x = band(rshift(op, 11), 31) + 1 - elseif p == "L" then - x = band(rshift(op, 11), 31) - last + 1 - elseif p == "I" then - x = arshift(lshift(op, 16), 16) - elseif p == "U" then - x = band(op, 0xffff) - elseif p == "O" then - local disp = arshift(lshift(op, 16), 16) - operands[#operands] = format("%d(%s)", disp, last) - elseif p == "X" then - local index = map_gpr[band(rshift(op, 16), 31)] - operands[#operands] = format("%s(%s)", index, last) - elseif p == "B" then - x = ctx.addr + ctx.pos + arshift(lshift(op, 16), 16)*4 + 4 - ctx.rel = x - x = "0x"..tohex(x) - elseif p == "J" then - x = band(ctx.addr + ctx.pos, 0xf0000000) + band(op, 0x03ffffff)*4 - ctx.rel = x - x = "0x"..tohex(x) - elseif p == "V" then - x = band(rshift(op, 8), 7) - if x == 0 then x = nil end - elseif p == "W" then - x = band(op, 7) - if x == 0 then x = nil end - elseif p == "Y" then - x = band(rshift(op, 6), 0x000fffff) - if x == 0 then x = nil end - elseif p == "Z" then - x = band(rshift(op, 6), 1023) - if x == 0 then x = nil end - elseif p == "0" then - if last == "r0" or last == 0 then - local n = #operands - operands[n] = nil - last = operands[n-1] - if altname then - local a1, a2 = match(altname, "([^|]*)|(.*)") - if a1 then name, altname = a1, a2 - else name = altname end - end - end - elseif p == "1" then - if last == "ra" then - operands[#operands] = nil - end - else - assert(false) - end - if x then operands[#operands+1] = x; last = x end - end - - return putop(ctx, name, operands) -end - ------------------------------------------------------------------------------- - --- Disassemble a block of code. -local function disass_block(ctx, ofs, len) - if not ofs then ofs = 0 end - local stop = len and ofs+len or #ctx.code - stop = stop - stop % 4 - ctx.pos = ofs - ofs % 4 - ctx.rel = nil - while ctx.pos < stop do disass_ins(ctx) end -end - --- Extended API: create a disassembler context. Then call ctx:disass(ofs, len). -local function create_(code, addr, out) - local ctx = {} - ctx.code = code - ctx.addr = addr or 0 - ctx.out = out or io.write - ctx.symtab = {} - ctx.disass = disass_block - ctx.hexdump = 8 - ctx.get = get_be - return ctx -end - -local function create_el_(code, addr, out) - local ctx = create_(code, addr, out) - ctx.get = get_le - return ctx -end - --- Simple API: disassemble code (a string) at address and output via out. -local function disass_(code, addr, out) - create_(code, addr, out):disass() -end - -local function disass_el_(code, addr, out) - create_el_(code, addr, out):disass() -end - --- Return register name for RID. -local function regname_(r) - if r < 32 then return map_gpr[r] end - return "f"..(r-32) -end - --- Public module functions. -module(...) - -create = create_ -create_el = create_el_ -disass = disass_ -disass_el = disass_el_ -regname = regname_ - diff --git a/deps/luajit/src/jit/dis_mipsel.lua b/deps/luajit/src/jit/dis_mipsel.lua deleted file mode 100644 index dd9d26ae..00000000 --- a/deps/luajit/src/jit/dis_mipsel.lua +++ /dev/null @@ -1,20 +0,0 @@ ----------------------------------------------------------------------------- --- LuaJIT MIPSEL disassembler wrapper module. --- --- Copyright (C) 2005-2015 Mike Pall. All rights reserved. --- Released under the MIT license. See Copyright Notice in luajit.h ----------------------------------------------------------------------------- --- This module just exports the little-endian functions from the --- MIPS disassembler module. All the interesting stuff is there. ------------------------------------------------------------------------------- - -local require = require - -module(...) - -local dis_mips = require(_PACKAGE.."dis_mips") - -create = dis_mips.create_el -disass = dis_mips.disass_el -regname = dis_mips.regname - diff --git a/deps/luajit/src/jit/dis_ppc.lua b/deps/luajit/src/jit/dis_ppc.lua deleted file mode 100644 index d05c4311..00000000 --- a/deps/luajit/src/jit/dis_ppc.lua +++ /dev/null @@ -1,591 +0,0 @@ ----------------------------------------------------------------------------- --- LuaJIT PPC disassembler module. --- --- Copyright (C) 2005-2015 Mike Pall. All rights reserved. --- Released under the MIT/X license. See Copyright Notice in luajit.h ----------------------------------------------------------------------------- --- This is a helper module used by the LuaJIT machine code dumper module. --- --- It disassembles all common, non-privileged 32/64 bit PowerPC instructions --- plus the e500 SPE instructions and some Cell/Xenon extensions. --- --- NYI: VMX, VMX128 ------------------------------------------------------------------------------- - -local type = type -local sub, byte, format = string.sub, string.byte, string.format -local match, gmatch, gsub = string.match, string.gmatch, string.gsub -local concat = table.concat -local bit = require("bit") -local band, bor, tohex = bit.band, bit.bor, bit.tohex -local lshift, rshift, arshift = bit.lshift, bit.rshift, bit.arshift - ------------------------------------------------------------------------------- --- Primary and extended opcode maps ------------------------------------------------------------------------------- - -local map_crops = { - shift = 1, mask = 1023, - [0] = "mcrfXX", - [33] = "crnor|crnotCCC=", [129] = "crandcCCC", - [193] = "crxor|crclrCCC%", [225] = "crnandCCC", - [257] = "crandCCC", [289] = "creqv|crsetCCC%", - [417] = "crorcCCC", [449] = "cror|crmoveCCC=", - [16] = "b_lrKB", [528] = "b_ctrKB", - [150] = "isync", -} - -local map_rlwinm = setmetatable({ - shift = 0, mask = -1, -}, -{ __index = function(t, x) - local rot = band(rshift(x, 11), 31) - local mb = band(rshift(x, 6), 31) - local me = band(rshift(x, 1), 31) - if mb == 0 and me == 31-rot then - return "slwiRR~A." - elseif me == 31 and mb == 32-rot then - return "srwiRR~-A." - else - return "rlwinmRR~AAA." - end - end -}) - -local map_rld = { - shift = 2, mask = 7, - [0] = "rldiclRR~HM.", "rldicrRR~HM.", "rldicRR~HM.", "rldimiRR~HM.", - { - shift = 1, mask = 1, - [0] = "rldclRR~RM.", "rldcrRR~RM.", - }, -} - -local map_ext = setmetatable({ - shift = 1, mask = 1023, - - [0] = "cmp_YLRR", [32] = "cmpl_YLRR", - [4] = "twARR", [68] = "tdARR", - - [8] = "subfcRRR.", [40] = "subfRRR.", - [104] = "negRR.", [136] = "subfeRRR.", - [200] = "subfzeRR.", [232] = "subfmeRR.", - [520] = "subfcoRRR.", [552] = "subfoRRR.", - [616] = "negoRR.", [648] = "subfeoRRR.", - [712] = "subfzeoRR.", [744] = "subfmeoRR.", - - [9] = "mulhduRRR.", [73] = "mulhdRRR.", [233] = "mulldRRR.", - [457] = "divduRRR.", [489] = "divdRRR.", - [745] = "mulldoRRR.", - [969] = "divduoRRR.", [1001] = "divdoRRR.", - - [10] = "addcRRR.", [138] = "addeRRR.", - [202] = "addzeRR.", [234] = "addmeRR.", [266] = "addRRR.", - [522] = "addcoRRR.", [650] = "addeoRRR.", - [714] = "addzeoRR.", [746] = "addmeoRR.", [778] = "addoRRR.", - - [11] = "mulhwuRRR.", [75] = "mulhwRRR.", [235] = "mullwRRR.", - [459] = "divwuRRR.", [491] = "divwRRR.", - [747] = "mullwoRRR.", - [971] = "divwouRRR.", [1003] = "divwoRRR.", - - [15] = "iselltRRR", [47] = "iselgtRRR", [79] = "iseleqRRR", - - [144] = { shift = 20, mask = 1, [0] = "mtcrfRZ~", "mtocrfRZ~", }, - [19] = { shift = 20, mask = 1, [0] = "mfcrR", "mfocrfRZ", }, - [371] = { shift = 11, mask = 1023, [392] = "mftbR", [424] = "mftbuR", }, - [339] = { - shift = 11, mask = 1023, - [32] = "mferR", [256] = "mflrR", [288] = "mfctrR", [16] = "mfspefscrR", - }, - [467] = { - shift = 11, mask = 1023, - [32] = "mtxerR", [256] = "mtlrR", [288] = "mtctrR", [16] = "mtspefscrR", - }, - - [20] = "lwarxRR0R", [84] = "ldarxRR0R", - - [21] = "ldxRR0R", [53] = "lduxRRR", - [149] = "stdxRR0R", [181] = "stduxRRR", - [341] = "lwaxRR0R", [373] = "lwauxRRR", - - [23] = "lwzxRR0R", [55] = "lwzuxRRR", - [87] = "lbzxRR0R", [119] = "lbzuxRRR", - [151] = "stwxRR0R", [183] = "stwuxRRR", - [215] = "stbxRR0R", [247] = "stbuxRRR", - [279] = "lhzxRR0R", [311] = "lhzuxRRR", - [343] = "lhaxRR0R", [375] = "lhauxRRR", - [407] = "sthxRR0R", [439] = "sthuxRRR", - - [54] = "dcbst-R0R", [86] = "dcbf-R0R", - [150] = "stwcxRR0R.", [214] = "stdcxRR0R.", - [246] = "dcbtst-R0R", [278] = "dcbt-R0R", - [310] = "eciwxRR0R", [438] = "ecowxRR0R", - [470] = "dcbi-RR", - - [598] = { - shift = 21, mask = 3, - [0] = "sync", "lwsync", "ptesync", - }, - [758] = "dcba-RR", - [854] = "eieio", [982] = "icbi-R0R", [1014] = "dcbz-R0R", - - [26] = "cntlzwRR~", [58] = "cntlzdRR~", - [122] = "popcntbRR~", - [154] = "prtywRR~", [186] = "prtydRR~", - - [28] = "andRR~R.", [60] = "andcRR~R.", [124] = "nor|notRR~R=.", - [284] = "eqvRR~R.", [316] = "xorRR~R.", - [412] = "orcRR~R.", [444] = "or|mrRR~R=.", [476] = "nandRR~R.", - [508] = "cmpbRR~R", - - [512] = "mcrxrX", - - [532] = "ldbrxRR0R", [660] = "stdbrxRR0R", - - [533] = "lswxRR0R", [597] = "lswiRR0A", - [661] = "stswxRR0R", [725] = "stswiRR0A", - - [534] = "lwbrxRR0R", [662] = "stwbrxRR0R", - [790] = "lhbrxRR0R", [918] = "sthbrxRR0R", - - [535] = "lfsxFR0R", [567] = "lfsuxFRR", - [599] = "lfdxFR0R", [631] = "lfduxFRR", - [663] = "stfsxFR0R", [695] = "stfsuxFRR", - [727] = "stfdxFR0R", [759] = "stfduxFR0R", - [855] = "lfiwaxFR0R", - [983] = "stfiwxFR0R", - - [24] = "slwRR~R.", - - [27] = "sldRR~R.", [536] = "srwRR~R.", - [792] = "srawRR~R.", [824] = "srawiRR~A.", - - [794] = "sradRR~R.", [826] = "sradiRR~H.", [827] = "sradiRR~H.", - [922] = "extshRR~.", [954] = "extsbRR~.", [986] = "extswRR~.", - - [539] = "srdRR~R.", -}, -{ __index = function(t, x) - if band(x, 31) == 15 then return "iselRRRC" end - end -}) - -local map_ld = { - shift = 0, mask = 3, - [0] = "ldRRE", "lduRRE", "lwaRRE", -} - -local map_std = { - shift = 0, mask = 3, - [0] = "stdRRE", "stduRRE", -} - -local map_fps = { - shift = 5, mask = 1, - { - shift = 1, mask = 15, - [0] = false, false, "fdivsFFF.", false, - "fsubsFFF.", "faddsFFF.", "fsqrtsF-F.", false, - "fresF-F.", "fmulsFF-F.", "frsqrtesF-F.", false, - "fmsubsFFFF~.", "fmaddsFFFF~.", "fnmsubsFFFF~.", "fnmaddsFFFF~.", - } -} - -local map_fpd = { - shift = 5, mask = 1, - [0] = { - shift = 1, mask = 1023, - [0] = "fcmpuXFF", [32] = "fcmpoXFF", [64] = "mcrfsXX", - [38] = "mtfsb1A.", [70] = "mtfsb0A.", [134] = "mtfsfiA>>-A>", - [8] = "fcpsgnFFF.", [40] = "fnegF-F.", [72] = "fmrF-F.", - [136] = "fnabsF-F.", [264] = "fabsF-F.", - [12] = "frspF-F.", - [14] = "fctiwF-F.", [15] = "fctiwzF-F.", - [583] = "mffsF.", [711] = "mtfsfZF.", - [392] = "frinF-F.", [424] = "frizF-F.", - [456] = "fripF-F.", [488] = "frimF-F.", - [814] = "fctidF-F.", [815] = "fctidzF-F.", [846] = "fcfidF-F.", - }, - { - shift = 1, mask = 15, - [0] = false, false, "fdivFFF.", false, - "fsubFFF.", "faddFFF.", "fsqrtF-F.", "fselFFFF~.", - "freF-F.", "fmulFF-F.", "frsqrteF-F.", false, - "fmsubFFFF~.", "fmaddFFFF~.", "fnmsubFFFF~.", "fnmaddFFFF~.", - } -} - -local map_spe = { - shift = 0, mask = 2047, - - [512] = "evaddwRRR", [514] = "evaddiwRAR~", - [516] = "evsubwRRR~", [518] = "evsubiwRAR~", - [520] = "evabsRR", [521] = "evnegRR", - [522] = "evextsbRR", [523] = "evextshRR", [524] = "evrndwRR", - [525] = "evcntlzwRR", [526] = "evcntlswRR", - - [527] = "brincRRR", - - [529] = "evandRRR", [530] = "evandcRRR", [534] = "evxorRRR", - [535] = "evor|evmrRRR=", [536] = "evnor|evnotRRR=", - [537] = "eveqvRRR", [539] = "evorcRRR", [542] = "evnandRRR", - - [544] = "evsrwuRRR", [545] = "evsrwsRRR", - [546] = "evsrwiuRRA", [547] = "evsrwisRRA", - [548] = "evslwRRR", [550] = "evslwiRRA", - [552] = "evrlwRRR", [553] = "evsplatiRS", - [554] = "evrlwiRRA", [555] = "evsplatfiRS", - [556] = "evmergehiRRR", [557] = "evmergeloRRR", - [558] = "evmergehiloRRR", [559] = "evmergelohiRRR", - - [560] = "evcmpgtuYRR", [561] = "evcmpgtsYRR", - [562] = "evcmpltuYRR", [563] = "evcmpltsYRR", - [564] = "evcmpeqYRR", - - [632] = "evselRRR", [633] = "evselRRRW", - [634] = "evselRRRW", [635] = "evselRRRW", - [636] = "evselRRRW", [637] = "evselRRRW", - [638] = "evselRRRW", [639] = "evselRRRW", - - [640] = "evfsaddRRR", [641] = "evfssubRRR", - [644] = "evfsabsRR", [645] = "evfsnabsRR", [646] = "evfsnegRR", - [648] = "evfsmulRRR", [649] = "evfsdivRRR", - [652] = "evfscmpgtYRR", [653] = "evfscmpltYRR", [654] = "evfscmpeqYRR", - [656] = "evfscfuiR-R", [657] = "evfscfsiR-R", - [658] = "evfscfufR-R", [659] = "evfscfsfR-R", - [660] = "evfsctuiR-R", [661] = "evfsctsiR-R", - [662] = "evfsctufR-R", [663] = "evfsctsfR-R", - [664] = "evfsctuizR-R", [666] = "evfsctsizR-R", - [668] = "evfststgtYRR", [669] = "evfststltYRR", [670] = "evfststeqYRR", - - [704] = "efsaddRRR", [705] = "efssubRRR", - [708] = "efsabsRR", [709] = "efsnabsRR", [710] = "efsnegRR", - [712] = "efsmulRRR", [713] = "efsdivRRR", - [716] = "efscmpgtYRR", [717] = "efscmpltYRR", [718] = "efscmpeqYRR", - [719] = "efscfdR-R", - [720] = "efscfuiR-R", [721] = "efscfsiR-R", - [722] = "efscfufR-R", [723] = "efscfsfR-R", - [724] = "efsctuiR-R", [725] = "efsctsiR-R", - [726] = "efsctufR-R", [727] = "efsctsfR-R", - [728] = "efsctuizR-R", [730] = "efsctsizR-R", - [732] = "efststgtYRR", [733] = "efststltYRR", [734] = "efststeqYRR", - - [736] = "efdaddRRR", [737] = "efdsubRRR", - [738] = "efdcfuidR-R", [739] = "efdcfsidR-R", - [740] = "efdabsRR", [741] = "efdnabsRR", [742] = "efdnegRR", - [744] = "efdmulRRR", [745] = "efddivRRR", - [746] = "efdctuidzR-R", [747] = "efdctsidzR-R", - [748] = "efdcmpgtYRR", [749] = "efdcmpltYRR", [750] = "efdcmpeqYRR", - [751] = "efdcfsR-R", - [752] = "efdcfuiR-R", [753] = "efdcfsiR-R", - [754] = "efdcfufR-R", [755] = "efdcfsfR-R", - [756] = "efdctuiR-R", [757] = "efdctsiR-R", - [758] = "efdctufR-R", [759] = "efdctsfR-R", - [760] = "efdctuizR-R", [762] = "efdctsizR-R", - [764] = "efdtstgtYRR", [765] = "efdtstltYRR", [766] = "efdtsteqYRR", - - [768] = "evlddxRR0R", [769] = "evlddRR8", - [770] = "evldwxRR0R", [771] = "evldwRR8", - [772] = "evldhxRR0R", [773] = "evldhRR8", - [776] = "evlhhesplatxRR0R", [777] = "evlhhesplatRR2", - [780] = "evlhhousplatxRR0R", [781] = "evlhhousplatRR2", - [782] = "evlhhossplatxRR0R", [783] = "evlhhossplatRR2", - [784] = "evlwhexRR0R", [785] = "evlwheRR4", - [788] = "evlwhouxRR0R", [789] = "evlwhouRR4", - [790] = "evlwhosxRR0R", [791] = "evlwhosRR4", - [792] = "evlwwsplatxRR0R", [793] = "evlwwsplatRR4", - [796] = "evlwhsplatxRR0R", [797] = "evlwhsplatRR4", - - [800] = "evstddxRR0R", [801] = "evstddRR8", - [802] = "evstdwxRR0R", [803] = "evstdwRR8", - [804] = "evstdhxRR0R", [805] = "evstdhRR8", - [816] = "evstwhexRR0R", [817] = "evstwheRR4", - [820] = "evstwhoxRR0R", [821] = "evstwhoRR4", - [824] = "evstwwexRR0R", [825] = "evstwweRR4", - [828] = "evstwwoxRR0R", [829] = "evstwwoRR4", - - [1027] = "evmhessfRRR", [1031] = "evmhossfRRR", [1032] = "evmheumiRRR", - [1033] = "evmhesmiRRR", [1035] = "evmhesmfRRR", [1036] = "evmhoumiRRR", - [1037] = "evmhosmiRRR", [1039] = "evmhosmfRRR", [1059] = "evmhessfaRRR", - [1063] = "evmhossfaRRR", [1064] = "evmheumiaRRR", [1065] = "evmhesmiaRRR", - [1067] = "evmhesmfaRRR", [1068] = "evmhoumiaRRR", [1069] = "evmhosmiaRRR", - [1071] = "evmhosmfaRRR", [1095] = "evmwhssfRRR", [1096] = "evmwlumiRRR", - [1100] = "evmwhumiRRR", [1101] = "evmwhsmiRRR", [1103] = "evmwhsmfRRR", - [1107] = "evmwssfRRR", [1112] = "evmwumiRRR", [1113] = "evmwsmiRRR", - [1115] = "evmwsmfRRR", [1127] = "evmwhssfaRRR", [1128] = "evmwlumiaRRR", - [1132] = "evmwhumiaRRR", [1133] = "evmwhsmiaRRR", [1135] = "evmwhsmfaRRR", - [1139] = "evmwssfaRRR", [1144] = "evmwumiaRRR", [1145] = "evmwsmiaRRR", - [1147] = "evmwsmfaRRR", - - [1216] = "evaddusiaawRR", [1217] = "evaddssiaawRR", - [1218] = "evsubfusiaawRR", [1219] = "evsubfssiaawRR", - [1220] = "evmraRR", - [1222] = "evdivwsRRR", [1223] = "evdivwuRRR", - [1224] = "evaddumiaawRR", [1225] = "evaddsmiaawRR", - [1226] = "evsubfumiaawRR", [1227] = "evsubfsmiaawRR", - - [1280] = "evmheusiaawRRR", [1281] = "evmhessiaawRRR", - [1283] = "evmhessfaawRRR", [1284] = "evmhousiaawRRR", - [1285] = "evmhossiaawRRR", [1287] = "evmhossfaawRRR", - [1288] = "evmheumiaawRRR", [1289] = "evmhesmiaawRRR", - [1291] = "evmhesmfaawRRR", [1292] = "evmhoumiaawRRR", - [1293] = "evmhosmiaawRRR", [1295] = "evmhosmfaawRRR", - [1320] = "evmhegumiaaRRR", [1321] = "evmhegsmiaaRRR", - [1323] = "evmhegsmfaaRRR", [1324] = "evmhogumiaaRRR", - [1325] = "evmhogsmiaaRRR", [1327] = "evmhogsmfaaRRR", - [1344] = "evmwlusiaawRRR", [1345] = "evmwlssiaawRRR", - [1352] = "evmwlumiaawRRR", [1353] = "evmwlsmiaawRRR", - [1363] = "evmwssfaaRRR", [1368] = "evmwumiaaRRR", - [1369] = "evmwsmiaaRRR", [1371] = "evmwsmfaaRRR", - [1408] = "evmheusianwRRR", [1409] = "evmhessianwRRR", - [1411] = "evmhessfanwRRR", [1412] = "evmhousianwRRR", - [1413] = "evmhossianwRRR", [1415] = "evmhossfanwRRR", - [1416] = "evmheumianwRRR", [1417] = "evmhesmianwRRR", - [1419] = "evmhesmfanwRRR", [1420] = "evmhoumianwRRR", - [1421] = "evmhosmianwRRR", [1423] = "evmhosmfanwRRR", - [1448] = "evmhegumianRRR", [1449] = "evmhegsmianRRR", - [1451] = "evmhegsmfanRRR", [1452] = "evmhogumianRRR", - [1453] = "evmhogsmianRRR", [1455] = "evmhogsmfanRRR", - [1472] = "evmwlusianwRRR", [1473] = "evmwlssianwRRR", - [1480] = "evmwlumianwRRR", [1481] = "evmwlsmianwRRR", - [1491] = "evmwssfanRRR", [1496] = "evmwumianRRR", - [1497] = "evmwsmianRRR", [1499] = "evmwsmfanRRR", -} - -local map_pri = { - [0] = false, false, "tdiARI", "twiARI", - map_spe, false, false, "mulliRRI", - "subficRRI", false, "cmpl_iYLRU", "cmp_iYLRI", - "addicRRI", "addic.RRI", "addi|liRR0I", "addis|lisRR0I", - "b_KBJ", "sc", "bKJ", map_crops, - "rlwimiRR~AAA.", map_rlwinm, false, "rlwnmRR~RAA.", - "oriNRR~U", "orisRR~U", "xoriRR~U", "xorisRR~U", - "andi.RR~U", "andis.RR~U", map_rld, map_ext, - "lwzRRD", "lwzuRRD", "lbzRRD", "lbzuRRD", - "stwRRD", "stwuRRD", "stbRRD", "stbuRRD", - "lhzRRD", "lhzuRRD", "lhaRRD", "lhauRRD", - "sthRRD", "sthuRRD", "lmwRRD", "stmwRRD", - "lfsFRD", "lfsuFRD", "lfdFRD", "lfduFRD", - "stfsFRD", "stfsuFRD", "stfdFRD", "stfduFRD", - false, false, map_ld, map_fps, - false, false, map_std, map_fpd, -} - ------------------------------------------------------------------------------- - -local map_gpr = { - [0] = "r0", "sp", "r2", "r3", "r4", "r5", "r6", "r7", - "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", - "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23", - "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31", -} - -local map_cond = { [0] = "lt", "gt", "eq", "so", "ge", "le", "ne", "ns", } - --- Format a condition bit. -local function condfmt(cond) - if cond <= 3 then - return map_cond[band(cond, 3)] - else - return format("4*cr%d+%s", rshift(cond, 2), map_cond[band(cond, 3)]) - end -end - ------------------------------------------------------------------------------- - --- Output a nicely formatted line with an opcode and operands. -local function putop(ctx, text, operands) - local pos = ctx.pos - local extra = "" - if ctx.rel then - local sym = ctx.symtab[ctx.rel] - if sym then extra = "\t->"..sym end - end - if ctx.hexdump > 0 then - ctx.out(format("%08x %s %-7s %s%s\n", - ctx.addr+pos, tohex(ctx.op), text, concat(operands, ", "), extra)) - else - ctx.out(format("%08x %-7s %s%s\n", - ctx.addr+pos, text, concat(operands, ", "), extra)) - end - ctx.pos = pos + 4 -end - --- Fallback for unknown opcodes. -local function unknown(ctx) - return putop(ctx, ".long", { "0x"..tohex(ctx.op) }) -end - --- Disassemble a single instruction. -local function disass_ins(ctx) - local pos = ctx.pos - local b0, b1, b2, b3 = byte(ctx.code, pos+1, pos+4) - local op = bor(lshift(b0, 24), lshift(b1, 16), lshift(b2, 8), b3) - local operands = {} - local last = nil - local rs = 21 - ctx.op = op - ctx.rel = nil - - local opat = map_pri[rshift(b0, 2)] - while type(opat) ~= "string" do - if not opat then return unknown(ctx) end - opat = opat[band(rshift(op, opat.shift), opat.mask)] - end - local name, pat = match(opat, "^([a-z0-9_.]*)(.*)") - local altname, pat2 = match(pat, "|([a-z0-9_.]*)(.*)") - if altname then pat = pat2 end - - for p in gmatch(pat, ".") do - local x = nil - if p == "R" then - x = map_gpr[band(rshift(op, rs), 31)] - rs = rs - 5 - elseif p == "F" then - x = "f"..band(rshift(op, rs), 31) - rs = rs - 5 - elseif p == "A" then - x = band(rshift(op, rs), 31) - rs = rs - 5 - elseif p == "S" then - x = arshift(lshift(op, 27-rs), 27) - rs = rs - 5 - elseif p == "I" then - x = arshift(lshift(op, 16), 16) - elseif p == "U" then - x = band(op, 0xffff) - elseif p == "D" or p == "E" then - local disp = arshift(lshift(op, 16), 16) - if p == "E" then disp = band(disp, -4) end - if last == "r0" then last = "0" end - operands[#operands] = format("%d(%s)", disp, last) - elseif p >= "2" and p <= "8" then - local disp = band(rshift(op, rs), 31) * p - if last == "r0" then last = "0" end - operands[#operands] = format("%d(%s)", disp, last) - elseif p == "H" then - x = band(rshift(op, rs), 31) + lshift(band(op, 2), 4) - rs = rs - 5 - elseif p == "M" then - x = band(rshift(op, rs), 31) + band(op, 0x20) - elseif p == "C" then - x = condfmt(band(rshift(op, rs), 31)) - rs = rs - 5 - elseif p == "B" then - local bo = rshift(op, 21) - local cond = band(rshift(op, 16), 31) - local cn = "" - rs = rs - 10 - if band(bo, 4) == 0 then - cn = band(bo, 2) == 0 and "dnz" or "dz" - if band(bo, 0x10) == 0 then - cn = cn..(band(bo, 8) == 0 and "f" or "t") - end - if band(bo, 0x10) == 0 then x = condfmt(cond) end - name = name..(band(bo, 1) == band(rshift(op, 15), 1) and "-" or "+") - elseif band(bo, 0x10) == 0 then - cn = map_cond[band(cond, 3) + (band(bo, 8) == 0 and 4 or 0)] - if cond > 3 then x = "cr"..rshift(cond, 2) end - name = name..(band(bo, 1) == band(rshift(op, 15), 1) and "-" or "+") - end - name = gsub(name, "_", cn) - elseif p == "J" then - x = arshift(lshift(op, 27-rs), 29-rs)*4 - if band(op, 2) == 0 then x = ctx.addr + pos + x end - ctx.rel = x - x = "0x"..tohex(x) - elseif p == "K" then - if band(op, 1) ~= 0 then name = name.."l" end - if band(op, 2) ~= 0 then name = name.."a" end - elseif p == "X" or p == "Y" then - x = band(rshift(op, rs+2), 7) - if x == 0 and p == "Y" then x = nil else x = "cr"..x end - rs = rs - 5 - elseif p == "W" then - x = "cr"..band(op, 7) - elseif p == "Z" then - x = band(rshift(op, rs-4), 255) - rs = rs - 10 - elseif p == ">" then - operands[#operands] = rshift(operands[#operands], 1) - elseif p == "0" then - if last == "r0" then - operands[#operands] = nil - if altname then name = altname end - end - elseif p == "L" then - name = gsub(name, "_", band(op, 0x00200000) ~= 0 and "d" or "w") - elseif p == "." then - if band(op, 1) == 1 then name = name.."." end - elseif p == "N" then - if op == 0x60000000 then name = "nop"; break end - elseif p == "~" then - local n = #operands - operands[n-1], operands[n] = operands[n], operands[n-1] - elseif p == "=" then - local n = #operands - if last == operands[n-1] then - operands[n] = nil - name = altname - end - elseif p == "%" then - local n = #operands - if last == operands[n-1] and last == operands[n-2] then - operands[n] = nil - operands[n-1] = nil - name = altname - end - elseif p == "-" then - rs = rs - 5 - else - assert(false) - end - if x then operands[#operands+1] = x; last = x end - end - - return putop(ctx, name, operands) -end - ------------------------------------------------------------------------------- - --- Disassemble a block of code. -local function disass_block(ctx, ofs, len) - if not ofs then ofs = 0 end - local stop = len and ofs+len or #ctx.code - stop = stop - stop % 4 - ctx.pos = ofs - ofs % 4 - ctx.rel = nil - while ctx.pos < stop do disass_ins(ctx) end -end - --- Extended API: create a disassembler context. Then call ctx:disass(ofs, len). -local function create_(code, addr, out) - local ctx = {} - ctx.code = code - ctx.addr = addr or 0 - ctx.out = out or io.write - ctx.symtab = {} - ctx.disass = disass_block - ctx.hexdump = 8 - return ctx -end - --- Simple API: disassemble code (a string) at address and output via out. -local function disass_(code, addr, out) - create_(code, addr, out):disass() -end - --- Return register name for RID. -local function regname_(r) - if r < 32 then return map_gpr[r] end - return "f"..(r-32) -end - --- Public module functions. -module(...) - -create = create_ -disass = disass_ -regname = regname_ - diff --git a/deps/luajit/src/jit/dis_x64.lua b/deps/luajit/src/jit/dis_x64.lua deleted file mode 100644 index a80981bd..00000000 --- a/deps/luajit/src/jit/dis_x64.lua +++ /dev/null @@ -1,20 +0,0 @@ ----------------------------------------------------------------------------- --- LuaJIT x64 disassembler wrapper module. --- --- Copyright (C) 2005-2015 Mike Pall. All rights reserved. --- Released under the MIT license. See Copyright Notice in luajit.h ----------------------------------------------------------------------------- --- This module just exports the 64 bit functions from the combined --- x86/x64 disassembler module. All the interesting stuff is there. ------------------------------------------------------------------------------- - -local require = require - -module(...) - -local dis_x86 = require(_PACKAGE.."dis_x86") - -create = dis_x86.create64 -disass = dis_x86.disass64 -regname = dis_x86.regname64 - diff --git a/deps/luajit/src/jit/dis_x86.lua b/deps/luajit/src/jit/dis_x86.lua deleted file mode 100644 index 078d6094..00000000 --- a/deps/luajit/src/jit/dis_x86.lua +++ /dev/null @@ -1,836 +0,0 @@ ----------------------------------------------------------------------------- --- LuaJIT x86/x64 disassembler module. --- --- Copyright (C) 2005-2015 Mike Pall. All rights reserved. --- Released under the MIT license. See Copyright Notice in luajit.h ----------------------------------------------------------------------------- --- This is a helper module used by the LuaJIT machine code dumper module. --- --- Sending small code snippets to an external disassembler and mixing the --- output with our own stuff was too fragile. So I had to bite the bullet --- and write yet another x86 disassembler. Oh well ... --- --- The output format is very similar to what ndisasm generates. But it has --- been developed independently by looking at the opcode tables from the --- Intel and AMD manuals. The supported instruction set is quite extensive --- and reflects what a current generation Intel or AMD CPU implements in --- 32 bit and 64 bit mode. Yes, this includes MMX, SSE, SSE2, SSE3, SSSE3, --- SSE4.1, SSE4.2, SSE4a and even privileged and hypervisor (VMX/SVM) --- instructions. --- --- Notes: --- * The (useless) a16 prefix, 3DNow and pre-586 opcodes are unsupported. --- * No attempt at optimization has been made -- it's fast enough for my needs. --- * The public API may change when more architectures are added. ------------------------------------------------------------------------------- - -local type = type -local sub, byte, format = string.sub, string.byte, string.format -local match, gmatch, gsub = string.match, string.gmatch, string.gsub -local lower, rep = string.lower, string.rep - --- Map for 1st opcode byte in 32 bit mode. Ugly? Well ... read on. -local map_opc1_32 = { ---0x -[0]="addBmr","addVmr","addBrm","addVrm","addBai","addVai","push es","pop es", -"orBmr","orVmr","orBrm","orVrm","orBai","orVai","push cs","opc2*", ---1x -"adcBmr","adcVmr","adcBrm","adcVrm","adcBai","adcVai","push ss","pop ss", -"sbbBmr","sbbVmr","sbbBrm","sbbVrm","sbbBai","sbbVai","push ds","pop ds", ---2x -"andBmr","andVmr","andBrm","andVrm","andBai","andVai","es:seg","daa", -"subBmr","subVmr","subBrm","subVrm","subBai","subVai","cs:seg","das", ---3x -"xorBmr","xorVmr","xorBrm","xorVrm","xorBai","xorVai","ss:seg","aaa", -"cmpBmr","cmpVmr","cmpBrm","cmpVrm","cmpBai","cmpVai","ds:seg","aas", ---4x -"incVR","incVR","incVR","incVR","incVR","incVR","incVR","incVR", -"decVR","decVR","decVR","decVR","decVR","decVR","decVR","decVR", ---5x -"pushUR","pushUR","pushUR","pushUR","pushUR","pushUR","pushUR","pushUR", -"popUR","popUR","popUR","popUR","popUR","popUR","popUR","popUR", ---6x -"sz*pushaw,pusha","sz*popaw,popa","boundVrm","arplWmr", -"fs:seg","gs:seg","o16:","a16", -"pushUi","imulVrmi","pushBs","imulVrms", -"insb","insVS","outsb","outsVS", ---7x -"joBj","jnoBj","jbBj","jnbBj","jzBj","jnzBj","jbeBj","jaBj", -"jsBj","jnsBj","jpeBj","jpoBj","jlBj","jgeBj","jleBj","jgBj", ---8x -"arith!Bmi","arith!Vmi","arith!Bmi","arith!Vms", -"testBmr","testVmr","xchgBrm","xchgVrm", -"movBmr","movVmr","movBrm","movVrm", -"movVmg","leaVrm","movWgm","popUm", ---9x -"nop*xchgVaR|pause|xchgWaR|repne nop","xchgVaR","xchgVaR","xchgVaR", -"xchgVaR","xchgVaR","xchgVaR","xchgVaR", -"sz*cbw,cwde,cdqe","sz*cwd,cdq,cqo","call farViw","wait", -"sz*pushfw,pushf","sz*popfw,popf","sahf","lahf", ---Ax -"movBao","movVao","movBoa","movVoa", -"movsb","movsVS","cmpsb","cmpsVS", -"testBai","testVai","stosb","stosVS", -"lodsb","lodsVS","scasb","scasVS", ---Bx -"movBRi","movBRi","movBRi","movBRi","movBRi","movBRi","movBRi","movBRi", -"movVRI","movVRI","movVRI","movVRI","movVRI","movVRI","movVRI","movVRI", ---Cx -"shift!Bmu","shift!Vmu","retBw","ret","$lesVrm","$ldsVrm","movBmi","movVmi", -"enterBwu","leave","retfBw","retf","int3","intBu","into","iretVS", ---Dx -"shift!Bm1","shift!Vm1","shift!Bmc","shift!Vmc","aamBu","aadBu","salc","xlatb", -"fp*0","fp*1","fp*2","fp*3","fp*4","fp*5","fp*6","fp*7", ---Ex -"loopneBj","loopeBj","loopBj","sz*jcxzBj,jecxzBj,jrcxzBj", -"inBau","inVau","outBua","outVua", -"callVj","jmpVj","jmp farViw","jmpBj","inBad","inVad","outBda","outVda", ---Fx -"lock:","int1","repne:rep","rep:","hlt","cmc","testb!Bm","testv!Vm", -"clc","stc","cli","sti","cld","std","incb!Bm","incd!Vm", -} -assert(#map_opc1_32 == 255) - --- Map for 1st opcode byte in 64 bit mode (overrides only). -local map_opc1_64 = setmetatable({ - [0x06]=false, [0x07]=false, [0x0e]=false, - [0x16]=false, [0x17]=false, [0x1e]=false, [0x1f]=false, - [0x27]=false, [0x2f]=false, [0x37]=false, [0x3f]=false, - [0x60]=false, [0x61]=false, [0x62]=false, [0x63]="movsxdVrDmt", [0x67]="a32:", - [0x40]="rex*", [0x41]="rex*b", [0x42]="rex*x", [0x43]="rex*xb", - [0x44]="rex*r", [0x45]="rex*rb", [0x46]="rex*rx", [0x47]="rex*rxb", - [0x48]="rex*w", [0x49]="rex*wb", [0x4a]="rex*wx", [0x4b]="rex*wxb", - [0x4c]="rex*wr", [0x4d]="rex*wrb", [0x4e]="rex*wrx", [0x4f]="rex*wrxb", - [0x82]=false, [0x9a]=false, [0xc4]=false, [0xc5]=false, [0xce]=false, - [0xd4]=false, [0xd5]=false, [0xd6]=false, [0xea]=false, -}, { __index = map_opc1_32 }) - --- Map for 2nd opcode byte (0F xx). True CISC hell. Hey, I told you. --- Prefix dependent MMX/SSE opcodes: (none)|rep|o16|repne, -|F3|66|F2 -local map_opc2 = { ---0x -[0]="sldt!Dmp","sgdt!Ump","larVrm","lslVrm",nil,"syscall","clts","sysret", -"invd","wbinvd",nil,"ud1",nil,"$prefetch!Bm","femms","3dnowMrmu", ---1x -"movupsXrm|movssXrm|movupdXrm|movsdXrm", -"movupsXmr|movssXmr|movupdXmr|movsdXmr", -"movhlpsXrm$movlpsXrm|movsldupXrm|movlpdXrm|movddupXrm", -"movlpsXmr||movlpdXmr", -"unpcklpsXrm||unpcklpdXrm", -"unpckhpsXrm||unpckhpdXrm", -"movlhpsXrm$movhpsXrm|movshdupXrm|movhpdXrm", -"movhpsXmr||movhpdXmr", -"$prefetcht!Bm","hintnopVm","hintnopVm","hintnopVm", -"hintnopVm","hintnopVm","hintnopVm","hintnopVm", ---2x -"movUmx$","movUmy$","movUxm$","movUym$","movUmz$",nil,"movUzm$",nil, -"movapsXrm||movapdXrm", -"movapsXmr||movapdXmr", -"cvtpi2psXrMm|cvtsi2ssXrVmt|cvtpi2pdXrMm|cvtsi2sdXrVmt", -"movntpsXmr|movntssXmr|movntpdXmr|movntsdXmr", -"cvttps2piMrXm|cvttss2siVrXm|cvttpd2piMrXm|cvttsd2siVrXm", -"cvtps2piMrXm|cvtss2siVrXm|cvtpd2piMrXm|cvtsd2siVrXm", -"ucomissXrm||ucomisdXrm", -"comissXrm||comisdXrm", ---3x -"wrmsr","rdtsc","rdmsr","rdpmc","sysenter","sysexit",nil,"getsec", -"opc3*38",nil,"opc3*3a",nil,nil,nil,nil,nil, ---4x -"cmovoVrm","cmovnoVrm","cmovbVrm","cmovnbVrm", -"cmovzVrm","cmovnzVrm","cmovbeVrm","cmovaVrm", -"cmovsVrm","cmovnsVrm","cmovpeVrm","cmovpoVrm", -"cmovlVrm","cmovgeVrm","cmovleVrm","cmovgVrm", ---5x -"movmskpsVrXm$||movmskpdVrXm$","sqrtpsXrm|sqrtssXrm|sqrtpdXrm|sqrtsdXrm", -"rsqrtpsXrm|rsqrtssXrm","rcppsXrm|rcpssXrm", -"andpsXrm||andpdXrm","andnpsXrm||andnpdXrm", -"orpsXrm||orpdXrm","xorpsXrm||xorpdXrm", -"addpsXrm|addssXrm|addpdXrm|addsdXrm","mulpsXrm|mulssXrm|mulpdXrm|mulsdXrm", -"cvtps2pdXrm|cvtss2sdXrm|cvtpd2psXrm|cvtsd2ssXrm", -"cvtdq2psXrm|cvttps2dqXrm|cvtps2dqXrm", -"subpsXrm|subssXrm|subpdXrm|subsdXrm","minpsXrm|minssXrm|minpdXrm|minsdXrm", -"divpsXrm|divssXrm|divpdXrm|divsdXrm","maxpsXrm|maxssXrm|maxpdXrm|maxsdXrm", ---6x -"punpcklbwPrm","punpcklwdPrm","punpckldqPrm","packsswbPrm", -"pcmpgtbPrm","pcmpgtwPrm","pcmpgtdPrm","packuswbPrm", -"punpckhbwPrm","punpckhwdPrm","punpckhdqPrm","packssdwPrm", -"||punpcklqdqXrm","||punpckhqdqXrm", -"movPrVSm","movqMrm|movdquXrm|movdqaXrm", ---7x -"pshufwMrmu|pshufhwXrmu|pshufdXrmu|pshuflwXrmu","pshiftw!Pmu", -"pshiftd!Pmu","pshiftq!Mmu||pshiftdq!Xmu", -"pcmpeqbPrm","pcmpeqwPrm","pcmpeqdPrm","emms|", -"vmreadUmr||extrqXmuu$|insertqXrmuu$","vmwriteUrm||extrqXrm$|insertqXrm$", -nil,nil, -"||haddpdXrm|haddpsXrm","||hsubpdXrm|hsubpsXrm", -"movVSmMr|movqXrm|movVSmXr","movqMmr|movdquXmr|movdqaXmr", ---8x -"joVj","jnoVj","jbVj","jnbVj","jzVj","jnzVj","jbeVj","jaVj", -"jsVj","jnsVj","jpeVj","jpoVj","jlVj","jgeVj","jleVj","jgVj", ---9x -"setoBm","setnoBm","setbBm","setnbBm","setzBm","setnzBm","setbeBm","setaBm", -"setsBm","setnsBm","setpeBm","setpoBm","setlBm","setgeBm","setleBm","setgBm", ---Ax -"push fs","pop fs","cpuid","btVmr","shldVmru","shldVmrc",nil,nil, -"push gs","pop gs","rsm","btsVmr","shrdVmru","shrdVmrc","fxsave!Dmp","imulVrm", ---Bx -"cmpxchgBmr","cmpxchgVmr","$lssVrm","btrVmr", -"$lfsVrm","$lgsVrm","movzxVrBmt","movzxVrWmt", -"|popcntVrm","ud2Dp","bt!Vmu","btcVmr", -"bsfVrm","bsrVrm|lzcntVrm|bsrWrm","movsxVrBmt","movsxVrWmt", ---Cx -"xaddBmr","xaddVmr", -"cmppsXrmu|cmpssXrmu|cmppdXrmu|cmpsdXrmu","$movntiVmr|", -"pinsrwPrWmu","pextrwDrPmu", -"shufpsXrmu||shufpdXrmu","$cmpxchg!Qmp", -"bswapVR","bswapVR","bswapVR","bswapVR","bswapVR","bswapVR","bswapVR","bswapVR", ---Dx -"||addsubpdXrm|addsubpsXrm","psrlwPrm","psrldPrm","psrlqPrm", -"paddqPrm","pmullwPrm", -"|movq2dqXrMm|movqXmr|movdq2qMrXm$","pmovmskbVrMm||pmovmskbVrXm", -"psubusbPrm","psubuswPrm","pminubPrm","pandPrm", -"paddusbPrm","padduswPrm","pmaxubPrm","pandnPrm", ---Ex -"pavgbPrm","psrawPrm","psradPrm","pavgwPrm", -"pmulhuwPrm","pmulhwPrm", -"|cvtdq2pdXrm|cvttpd2dqXrm|cvtpd2dqXrm","$movntqMmr||$movntdqXmr", -"psubsbPrm","psubswPrm","pminswPrm","porPrm", -"paddsbPrm","paddswPrm","pmaxswPrm","pxorPrm", ---Fx -"|||lddquXrm","psllwPrm","pslldPrm","psllqPrm", -"pmuludqPrm","pmaddwdPrm","psadbwPrm","maskmovqMrm||maskmovdquXrm$", -"psubbPrm","psubwPrm","psubdPrm","psubqPrm", -"paddbPrm","paddwPrm","padddPrm","ud", -} -assert(map_opc2[255] == "ud") - --- Map for three-byte opcodes. Can't wait for their next invention. -local map_opc3 = { -["38"] = { -- [66] 0f 38 xx ---0x -[0]="pshufbPrm","phaddwPrm","phadddPrm","phaddswPrm", -"pmaddubswPrm","phsubwPrm","phsubdPrm","phsubswPrm", -"psignbPrm","psignwPrm","psigndPrm","pmulhrswPrm", -nil,nil,nil,nil, ---1x -"||pblendvbXrma",nil,nil,nil, -"||blendvpsXrma","||blendvpdXrma",nil,"||ptestXrm", -nil,nil,nil,nil, -"pabsbPrm","pabswPrm","pabsdPrm",nil, ---2x -"||pmovsxbwXrm","||pmovsxbdXrm","||pmovsxbqXrm","||pmovsxwdXrm", -"||pmovsxwqXrm","||pmovsxdqXrm",nil,nil, -"||pmuldqXrm","||pcmpeqqXrm","||$movntdqaXrm","||packusdwXrm", -nil,nil,nil,nil, ---3x -"||pmovzxbwXrm","||pmovzxbdXrm","||pmovzxbqXrm","||pmovzxwdXrm", -"||pmovzxwqXrm","||pmovzxdqXrm",nil,"||pcmpgtqXrm", -"||pminsbXrm","||pminsdXrm","||pminuwXrm","||pminudXrm", -"||pmaxsbXrm","||pmaxsdXrm","||pmaxuwXrm","||pmaxudXrm", ---4x -"||pmulddXrm","||phminposuwXrm", ---Fx -[0xf0] = "|||crc32TrBmt",[0xf1] = "|||crc32TrVmt", -}, - -["3a"] = { -- [66] 0f 3a xx ---0x -[0x00]=nil,nil,nil,nil,nil,nil,nil,nil, -"||roundpsXrmu","||roundpdXrmu","||roundssXrmu","||roundsdXrmu", -"||blendpsXrmu","||blendpdXrmu","||pblendwXrmu","palignrPrmu", ---1x -nil,nil,nil,nil, -"||pextrbVmXru","||pextrwVmXru","||pextrVmSXru","||extractpsVmXru", -nil,nil,nil,nil,nil,nil,nil,nil, ---2x -"||pinsrbXrVmu","||insertpsXrmu","||pinsrXrVmuS",nil, ---4x -[0x40] = "||dppsXrmu", -[0x41] = "||dppdXrmu", -[0x42] = "||mpsadbwXrmu", ---6x -[0x60] = "||pcmpestrmXrmu",[0x61] = "||pcmpestriXrmu", -[0x62] = "||pcmpistrmXrmu",[0x63] = "||pcmpistriXrmu", -}, -} - --- Map for VMX/SVM opcodes 0F 01 C0-FF (sgdt group with register operands). -local map_opcvm = { -[0xc1]="vmcall",[0xc2]="vmlaunch",[0xc3]="vmresume",[0xc4]="vmxoff", -[0xc8]="monitor",[0xc9]="mwait", -[0xd8]="vmrun",[0xd9]="vmmcall",[0xda]="vmload",[0xdb]="vmsave", -[0xdc]="stgi",[0xdd]="clgi",[0xde]="skinit",[0xdf]="invlpga", -[0xf8]="swapgs",[0xf9]="rdtscp", -} - --- Map for FP opcodes. And you thought stack machines are simple? -local map_opcfp = { --- D8-DF 00-BF: opcodes with a memory operand. --- D8 -[0]="faddFm","fmulFm","fcomFm","fcompFm","fsubFm","fsubrFm","fdivFm","fdivrFm", -"fldFm",nil,"fstFm","fstpFm","fldenvVm","fldcwWm","fnstenvVm","fnstcwWm", --- DA -"fiaddDm","fimulDm","ficomDm","ficompDm", -"fisubDm","fisubrDm","fidivDm","fidivrDm", --- DB -"fildDm","fisttpDm","fistDm","fistpDm",nil,"fld twordFmp",nil,"fstp twordFmp", --- DC -"faddGm","fmulGm","fcomGm","fcompGm","fsubGm","fsubrGm","fdivGm","fdivrGm", --- DD -"fldGm","fisttpQm","fstGm","fstpGm","frstorDmp",nil,"fnsaveDmp","fnstswWm", --- DE -"fiaddWm","fimulWm","ficomWm","ficompWm", -"fisubWm","fisubrWm","fidivWm","fidivrWm", --- DF -"fildWm","fisttpWm","fistWm","fistpWm", -"fbld twordFmp","fildQm","fbstp twordFmp","fistpQm", --- xx C0-FF: opcodes with a pseudo-register operand. --- D8 -"faddFf","fmulFf","fcomFf","fcompFf","fsubFf","fsubrFf","fdivFf","fdivrFf", --- D9 -"fldFf","fxchFf",{"fnop"},nil, -{"fchs","fabs",nil,nil,"ftst","fxam"}, -{"fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz"}, -{"f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp"}, -{"fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos"}, --- DA -"fcmovbFf","fcmoveFf","fcmovbeFf","fcmovuFf",nil,{nil,"fucompp"},nil,nil, --- DB -"fcmovnbFf","fcmovneFf","fcmovnbeFf","fcmovnuFf", -{nil,nil,"fnclex","fninit"},"fucomiFf","fcomiFf",nil, --- DC -"fadd toFf","fmul toFf",nil,nil, -"fsub toFf","fsubr toFf","fdivr toFf","fdiv toFf", --- DD -"ffreeFf",nil,"fstFf","fstpFf","fucomFf","fucompFf",nil,nil, --- DE -"faddpFf","fmulpFf",nil,{nil,"fcompp"}, -"fsubrpFf","fsubpFf","fdivrpFf","fdivpFf", --- DF -nil,nil,nil,nil,{"fnstsw ax"},"fucomipFf","fcomipFf",nil, -} -assert(map_opcfp[126] == "fcomipFf") - --- Map for opcode groups. The subkey is sp from the ModRM byte. -local map_opcgroup = { - arith = { "add", "or", "adc", "sbb", "and", "sub", "xor", "cmp" }, - shift = { "rol", "ror", "rcl", "rcr", "shl", "shr", "sal", "sar" }, - testb = { "testBmi", "testBmi", "not", "neg", "mul", "imul", "div", "idiv" }, - testv = { "testVmi", "testVmi", "not", "neg", "mul", "imul", "div", "idiv" }, - incb = { "inc", "dec" }, - incd = { "inc", "dec", "callUmp", "$call farDmp", - "jmpUmp", "$jmp farDmp", "pushUm" }, - sldt = { "sldt", "str", "lldt", "ltr", "verr", "verw" }, - sgdt = { "vm*$sgdt", "vm*$sidt", "$lgdt", "vm*$lidt", - "smsw", nil, "lmsw", "vm*$invlpg" }, - bt = { nil, nil, nil, nil, "bt", "bts", "btr", "btc" }, - cmpxchg = { nil, "sz*,cmpxchg8bQmp,cmpxchg16bXmp", nil, nil, - nil, nil, "vmptrld|vmxon|vmclear", "vmptrst" }, - pshiftw = { nil, nil, "psrlw", nil, "psraw", nil, "psllw" }, - pshiftd = { nil, nil, "psrld", nil, "psrad", nil, "pslld" }, - pshiftq = { nil, nil, "psrlq", nil, nil, nil, "psllq" }, - pshiftdq = { nil, nil, "psrlq", "psrldq", nil, nil, "psllq", "pslldq" }, - fxsave = { "$fxsave", "$fxrstor", "$ldmxcsr", "$stmxcsr", - nil, "lfenceDp$", "mfenceDp$", "sfenceDp$clflush" }, - prefetch = { "prefetch", "prefetchw" }, - prefetcht = { "prefetchnta", "prefetcht0", "prefetcht1", "prefetcht2" }, -} - ------------------------------------------------------------------------------- - --- Maps for register names. -local map_regs = { - B = { "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh", - "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b" }, - B64 = { "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil", - "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b" }, - W = { "ax", "cx", "dx", "bx", "sp", "bp", "si", "di", - "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w" }, - D = { "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi", - "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d" }, - Q = { "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi", - "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15" }, - M = { "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7", - "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7" }, -- No x64 ext! - X = { "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7", - "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15" }, -} -local map_segregs = { "es", "cs", "ss", "ds", "fs", "gs", "segr6", "segr7" } - --- Maps for size names. -local map_sz2n = { - B = 1, W = 2, D = 4, Q = 8, M = 8, X = 16, -} -local map_sz2prefix = { - B = "byte", W = "word", D = "dword", - Q = "qword", - M = "qword", X = "xword", - F = "dword", G = "qword", -- No need for sizes/register names for these two. -} - ------------------------------------------------------------------------------- - --- Output a nicely formatted line with an opcode and operands. -local function putop(ctx, text, operands) - local code, pos, hex = ctx.code, ctx.pos, "" - local hmax = ctx.hexdump - if hmax > 0 then - for i=ctx.start,pos-1 do - hex = hex..format("%02X", byte(code, i, i)) - end - if #hex > hmax then hex = sub(hex, 1, hmax)..". " - else hex = hex..rep(" ", hmax-#hex+2) end - end - if operands then text = text.." "..operands end - if ctx.o16 then text = "o16 "..text; ctx.o16 = false end - if ctx.a32 then text = "a32 "..text; ctx.a32 = false end - if ctx.rep then text = ctx.rep.." "..text; ctx.rep = false end - if ctx.rex then - local t = (ctx.rexw and "w" or "")..(ctx.rexr and "r" or "").. - (ctx.rexx and "x" or "")..(ctx.rexb and "b" or "") - if t ~= "" then text = "rex."..t.." "..text end - ctx.rexw = false; ctx.rexr = false; ctx.rexx = false; ctx.rexb = false - ctx.rex = false - end - if ctx.seg then - local text2, n = gsub(text, "%[", "["..ctx.seg..":") - if n == 0 then text = ctx.seg.." "..text else text = text2 end - ctx.seg = false - end - if ctx.lock then text = "lock "..text; ctx.lock = false end - local imm = ctx.imm - if imm then - local sym = ctx.symtab[imm] - if sym then text = text.."\t->"..sym end - end - ctx.out(format("%08x %s%s\n", ctx.addr+ctx.start, hex, text)) - ctx.mrm = false - ctx.start = pos - ctx.imm = nil -end - --- Clear all prefix flags. -local function clearprefixes(ctx) - ctx.o16 = false; ctx.seg = false; ctx.lock = false; ctx.rep = false - ctx.rexw = false; ctx.rexr = false; ctx.rexx = false; ctx.rexb = false - ctx.rex = false; ctx.a32 = false -end - --- Fallback for incomplete opcodes at the end. -local function incomplete(ctx) - ctx.pos = ctx.stop+1 - clearprefixes(ctx) - return putop(ctx, "(incomplete)") -end - --- Fallback for unknown opcodes. -local function unknown(ctx) - clearprefixes(ctx) - return putop(ctx, "(unknown)") -end - --- Return an immediate of the specified size. -local function getimm(ctx, pos, n) - if pos+n-1 > ctx.stop then return incomplete(ctx) end - local code = ctx.code - if n == 1 then - local b1 = byte(code, pos, pos) - return b1 - elseif n == 2 then - local b1, b2 = byte(code, pos, pos+1) - return b1+b2*256 - else - local b1, b2, b3, b4 = byte(code, pos, pos+3) - local imm = b1+b2*256+b3*65536+b4*16777216 - ctx.imm = imm - return imm - end -end - --- Process pattern string and generate the operands. -local function putpat(ctx, name, pat) - local operands, regs, sz, mode, sp, rm, sc, rx, sdisp - local code, pos, stop = ctx.code, ctx.pos, ctx.stop - - -- Chars used: 1DFGIMPQRSTUVWXacdfgijmoprstuwxyz - for p in gmatch(pat, ".") do - local x = nil - if p == "V" or p == "U" then - if ctx.rexw then sz = "Q"; ctx.rexw = false - elseif ctx.o16 then sz = "W"; ctx.o16 = false - elseif p == "U" and ctx.x64 then sz = "Q" - else sz = "D" end - regs = map_regs[sz] - elseif p == "T" then - if ctx.rexw then sz = "Q"; ctx.rexw = false else sz = "D" end - regs = map_regs[sz] - elseif p == "B" then - sz = "B" - regs = ctx.rex and map_regs.B64 or map_regs.B - elseif match(p, "[WDQMXFG]") then - sz = p - regs = map_regs[sz] - elseif p == "P" then - sz = ctx.o16 and "X" or "M"; ctx.o16 = false - regs = map_regs[sz] - elseif p == "S" then - name = name..lower(sz) - elseif p == "s" then - local imm = getimm(ctx, pos, 1); if not imm then return end - x = imm <= 127 and format("+0x%02x", imm) - or format("-0x%02x", 256-imm) - pos = pos+1 - elseif p == "u" then - local imm = getimm(ctx, pos, 1); if not imm then return end - x = format("0x%02x", imm) - pos = pos+1 - elseif p == "w" then - local imm = getimm(ctx, pos, 2); if not imm then return end - x = format("0x%x", imm) - pos = pos+2 - elseif p == "o" then -- [offset] - if ctx.x64 then - local imm1 = getimm(ctx, pos, 4); if not imm1 then return end - local imm2 = getimm(ctx, pos+4, 4); if not imm2 then return end - x = format("[0x%08x%08x]", imm2, imm1) - pos = pos+8 - else - local imm = getimm(ctx, pos, 4); if not imm then return end - x = format("[0x%08x]", imm) - pos = pos+4 - end - elseif p == "i" or p == "I" then - local n = map_sz2n[sz] - if n == 8 and ctx.x64 and p == "I" then - local imm1 = getimm(ctx, pos, 4); if not imm1 then return end - local imm2 = getimm(ctx, pos+4, 4); if not imm2 then return end - x = format("0x%08x%08x", imm2, imm1) - else - if n == 8 then n = 4 end - local imm = getimm(ctx, pos, n); if not imm then return end - if sz == "Q" and (imm < 0 or imm > 0x7fffffff) then - imm = (0xffffffff+1)-imm - x = format(imm > 65535 and "-0x%08x" or "-0x%x", imm) - else - x = format(imm > 65535 and "0x%08x" or "0x%x", imm) - end - end - pos = pos+n - elseif p == "j" then - local n = map_sz2n[sz] - if n == 8 then n = 4 end - local imm = getimm(ctx, pos, n); if not imm then return end - if sz == "B" and imm > 127 then imm = imm-256 - elseif imm > 2147483647 then imm = imm-4294967296 end - pos = pos+n - imm = imm + pos + ctx.addr - if imm > 4294967295 and not ctx.x64 then imm = imm-4294967296 end - ctx.imm = imm - if sz == "W" then - x = format("word 0x%04x", imm%65536) - elseif ctx.x64 then - local lo = imm % 0x1000000 - x = format("0x%02x%06x", (imm-lo) / 0x1000000, lo) - else - x = format("0x%08x", imm) - end - elseif p == "R" then - local r = byte(code, pos-1, pos-1)%8 - if ctx.rexb then r = r + 8; ctx.rexb = false end - x = regs[r+1] - elseif p == "a" then x = regs[1] - elseif p == "c" then x = "cl" - elseif p == "d" then x = "dx" - elseif p == "1" then x = "1" - else - if not mode then - mode = ctx.mrm - if not mode then - if pos > stop then return incomplete(ctx) end - mode = byte(code, pos, pos) - pos = pos+1 - end - rm = mode%8; mode = (mode-rm)/8 - sp = mode%8; mode = (mode-sp)/8 - sdisp = "" - if mode < 3 then - if rm == 4 then - if pos > stop then return incomplete(ctx) end - sc = byte(code, pos, pos) - pos = pos+1 - rm = sc%8; sc = (sc-rm)/8 - rx = sc%8; sc = (sc-rx)/8 - if ctx.rexx then rx = rx + 8; ctx.rexx = false end - if rx == 4 then rx = nil end - end - if mode > 0 or rm == 5 then - local dsz = mode - if dsz ~= 1 then dsz = 4 end - local disp = getimm(ctx, pos, dsz); if not disp then return end - if mode == 0 then rm = nil end - if rm or rx or (not sc and ctx.x64 and not ctx.a32) then - if dsz == 1 and disp > 127 then - sdisp = format("-0x%x", 256-disp) - elseif disp >= 0 and disp <= 0x7fffffff then - sdisp = format("+0x%x", disp) - else - sdisp = format("-0x%x", (0xffffffff+1)-disp) - end - else - sdisp = format(ctx.x64 and not ctx.a32 and - not (disp >= 0 and disp <= 0x7fffffff) - and "0xffffffff%08x" or "0x%08x", disp) - end - pos = pos+dsz - end - end - if rm and ctx.rexb then rm = rm + 8; ctx.rexb = false end - if ctx.rexr then sp = sp + 8; ctx.rexr = false end - end - if p == "m" then - if mode == 3 then x = regs[rm+1] - else - local aregs = ctx.a32 and map_regs.D or ctx.aregs - local srm, srx = "", "" - if rm then srm = aregs[rm+1] - elseif not sc and ctx.x64 and not ctx.a32 then srm = "rip" end - ctx.a32 = false - if rx then - if rm then srm = srm.."+" end - srx = aregs[rx+1] - if sc > 0 then srx = srx.."*"..(2^sc) end - end - x = format("[%s%s%s]", srm, srx, sdisp) - end - if mode < 3 and - (not match(pat, "[aRrgp]") or match(pat, "t")) then -- Yuck. - x = map_sz2prefix[sz].." "..x - end - elseif p == "r" then x = regs[sp+1] - elseif p == "g" then x = map_segregs[sp+1] - elseif p == "p" then -- Suppress prefix. - elseif p == "f" then x = "st"..rm - elseif p == "x" then - if sp == 0 and ctx.lock and not ctx.x64 then - x = "CR8"; ctx.lock = false - else - x = "CR"..sp - end - elseif p == "y" then x = "DR"..sp - elseif p == "z" then x = "TR"..sp - elseif p == "t" then - else - error("bad pattern `"..pat.."'") - end - end - if x then operands = operands and operands..", "..x or x end - end - ctx.pos = pos - return putop(ctx, name, operands) -end - --- Forward declaration. -local map_act - --- Fetch and cache MRM byte. -local function getmrm(ctx) - local mrm = ctx.mrm - if not mrm then - local pos = ctx.pos - if pos > ctx.stop then return nil end - mrm = byte(ctx.code, pos, pos) - ctx.pos = pos+1 - ctx.mrm = mrm - end - return mrm -end - --- Dispatch to handler depending on pattern. -local function dispatch(ctx, opat, patgrp) - if not opat then return unknown(ctx) end - if match(opat, "%|") then -- MMX/SSE variants depending on prefix. - local p - if ctx.rep then - p = ctx.rep=="rep" and "%|([^%|]*)" or "%|[^%|]*%|[^%|]*%|([^%|]*)" - ctx.rep = false - elseif ctx.o16 then p = "%|[^%|]*%|([^%|]*)"; ctx.o16 = false - else p = "^[^%|]*" end - opat = match(opat, p) - if not opat then return unknown(ctx) end --- ctx.rep = false; ctx.o16 = false - --XXX fails for 66 f2 0f 38 f1 06 crc32 eax,WORD PTR [esi] - --XXX remove in branches? - end - if match(opat, "%$") then -- reg$mem variants. - local mrm = getmrm(ctx); if not mrm then return incomplete(ctx) end - opat = match(opat, mrm >= 192 and "^[^%$]*" or "%$(.*)") - if opat == "" then return unknown(ctx) end - end - if opat == "" then return unknown(ctx) end - local name, pat = match(opat, "^([a-z0-9 ]*)(.*)") - if pat == "" and patgrp then pat = patgrp end - return map_act[sub(pat, 1, 1)](ctx, name, pat) -end - --- Get a pattern from an opcode map and dispatch to handler. -local function dispatchmap(ctx, opcmap) - local pos = ctx.pos - local opat = opcmap[byte(ctx.code, pos, pos)] - pos = pos + 1 - ctx.pos = pos - return dispatch(ctx, opat) -end - --- Map for action codes. The key is the first char after the name. -map_act = { - -- Simple opcodes without operands. - [""] = function(ctx, name, pat) - return putop(ctx, name) - end, - - -- Operand size chars fall right through. - B = putpat, W = putpat, D = putpat, Q = putpat, - V = putpat, U = putpat, T = putpat, - M = putpat, X = putpat, P = putpat, - F = putpat, G = putpat, - - -- Collect prefixes. - [":"] = function(ctx, name, pat) - ctx[pat == ":" and name or sub(pat, 2)] = name - if ctx.pos - ctx.start > 5 then return unknown(ctx) end -- Limit #prefixes. - end, - - -- Chain to special handler specified by name. - ["*"] = function(ctx, name, pat) - return map_act[name](ctx, name, sub(pat, 2)) - end, - - -- Use named subtable for opcode group. - ["!"] = function(ctx, name, pat) - local mrm = getmrm(ctx); if not mrm then return incomplete(ctx) end - return dispatch(ctx, map_opcgroup[name][((mrm-(mrm%8))/8)%8+1], sub(pat, 2)) - end, - - -- o16,o32[,o64] variants. - sz = function(ctx, name, pat) - if ctx.o16 then ctx.o16 = false - else - pat = match(pat, ",(.*)") - if ctx.rexw then - local p = match(pat, ",(.*)") - if p then pat = p; ctx.rexw = false end - end - end - pat = match(pat, "^[^,]*") - return dispatch(ctx, pat) - end, - - -- Two-byte opcode dispatch. - opc2 = function(ctx, name, pat) - return dispatchmap(ctx, map_opc2) - end, - - -- Three-byte opcode dispatch. - opc3 = function(ctx, name, pat) - return dispatchmap(ctx, map_opc3[pat]) - end, - - -- VMX/SVM dispatch. - vm = function(ctx, name, pat) - return dispatch(ctx, map_opcvm[ctx.mrm]) - end, - - -- Floating point opcode dispatch. - fp = function(ctx, name, pat) - local mrm = getmrm(ctx); if not mrm then return incomplete(ctx) end - local rm = mrm%8 - local idx = pat*8 + ((mrm-rm)/8)%8 - if mrm >= 192 then idx = idx + 64 end - local opat = map_opcfp[idx] - if type(opat) == "table" then opat = opat[rm+1] end - return dispatch(ctx, opat) - end, - - -- REX prefix. - rex = function(ctx, name, pat) - if ctx.rex then return unknown(ctx) end -- Only 1 REX prefix allowed. - for p in gmatch(pat, ".") do ctx["rex"..p] = true end - ctx.rex = true - end, - - -- Special case for nop with REX prefix. - nop = function(ctx, name, pat) - return dispatch(ctx, ctx.rex and pat or "nop") - end, -} - ------------------------------------------------------------------------------- - --- Disassemble a block of code. -local function disass_block(ctx, ofs, len) - if not ofs then ofs = 0 end - local stop = len and ofs+len or #ctx.code - ofs = ofs + 1 - ctx.start = ofs - ctx.pos = ofs - ctx.stop = stop - ctx.imm = nil - ctx.mrm = false - clearprefixes(ctx) - while ctx.pos <= stop do dispatchmap(ctx, ctx.map1) end - if ctx.pos ~= ctx.start then incomplete(ctx) end -end - --- Extended API: create a disassembler context. Then call ctx:disass(ofs, len). -local function create_(code, addr, out) - local ctx = {} - ctx.code = code - ctx.addr = (addr or 0) - 1 - ctx.out = out or io.write - ctx.symtab = {} - ctx.disass = disass_block - ctx.hexdump = 16 - ctx.x64 = false - ctx.map1 = map_opc1_32 - ctx.aregs = map_regs.D - return ctx -end - -local function create64_(code, addr, out) - local ctx = create_(code, addr, out) - ctx.x64 = true - ctx.map1 = map_opc1_64 - ctx.aregs = map_regs.Q - return ctx -end - --- Simple API: disassemble code (a string) at address and output via out. -local function disass_(code, addr, out) - create_(code, addr, out):disass() -end - -local function disass64_(code, addr, out) - create64_(code, addr, out):disass() -end - --- Return register name for RID. -local function regname_(r) - if r < 8 then return map_regs.D[r+1] end - return map_regs.X[r-7] -end - -local function regname64_(r) - if r < 16 then return map_regs.Q[r+1] end - return map_regs.X[r-15] -end - --- Public module functions. -module(...) - -create = create_ -create64 = create64_ -disass = disass_ -disass64 = disass64_ -regname = regname_ -regname64 = regname64_ - diff --git a/deps/luajit/src/jit/dump.lua b/deps/luajit/src/jit/dump.lua deleted file mode 100644 index d15c528e..00000000 --- a/deps/luajit/src/jit/dump.lua +++ /dev/null @@ -1,699 +0,0 @@ ----------------------------------------------------------------------------- --- LuaJIT compiler dump module. --- --- Copyright (C) 2005-2015 Mike Pall. All rights reserved. --- Released under the MIT license. See Copyright Notice in luajit.h ----------------------------------------------------------------------------- --- --- This module can be used to debug the JIT compiler itself. It dumps the --- code representations and structures used in various compiler stages. --- --- Example usage: --- --- luajit -jdump -e "local x=0; for i=1,1e6 do x=x+i end; print(x)" --- luajit -jdump=im -e "for i=1,1000 do for j=1,1000 do end end" | less -R --- luajit -jdump=is myapp.lua | less -R --- luajit -jdump=-b myapp.lua --- luajit -jdump=+aH,myapp.html myapp.lua --- luajit -jdump=ixT,myapp.dump myapp.lua --- --- The first argument specifies the dump mode. The second argument gives --- the output file name. Default output is to stdout, unless the environment --- variable LUAJIT_DUMPFILE is set. The file is overwritten every time the --- module is started. --- --- Different features can be turned on or off with the dump mode. If the --- mode starts with a '+', the following features are added to the default --- set of features; a '-' removes them. Otherwise the features are replaced. --- --- The following dump features are available (* marks the default): --- --- * t Print a line for each started, ended or aborted trace (see also -jv). --- * b Dump the traced bytecode. --- * i Dump the IR (intermediate representation). --- r Augment the IR with register/stack slots. --- s Dump the snapshot map. --- * m Dump the generated machine code. --- x Print each taken trace exit. --- X Print each taken trace exit and the contents of all registers. --- a Print the IR of aborted traces, too. --- --- The output format can be set with the following characters: --- --- T Plain text output. --- A ANSI-colored text output --- H Colorized HTML + CSS output. --- --- The default output format is plain text. It's set to ANSI-colored text --- if the COLORTERM variable is set. Note: this is independent of any output --- redirection, which is actually considered a feature. --- --- You probably want to use less -R to enjoy viewing ANSI-colored text from --- a pipe or a file. Add this to your ~/.bashrc: export LESS="-R" --- ------------------------------------------------------------------------------- - --- Cache some library functions and objects. -local jit = require("jit") -assert(jit.version_num == 20004, "LuaJIT core/library version mismatch") -local jutil = require("jit.util") -local vmdef = require("jit.vmdef") -local funcinfo, funcbc = jutil.funcinfo, jutil.funcbc -local traceinfo, traceir, tracek = jutil.traceinfo, jutil.traceir, jutil.tracek -local tracemc, tracesnap = jutil.tracemc, jutil.tracesnap -local traceexitstub, ircalladdr = jutil.traceexitstub, jutil.ircalladdr -local bit = require("bit") -local band, shl, shr = bit.band, bit.lshift, bit.rshift -local sub, gsub, format = string.sub, string.gsub, string.format -local byte, char, rep = string.byte, string.char, string.rep -local type, tostring = type, tostring -local stdout, stderr = io.stdout, io.stderr - --- Load other modules on-demand. -local bcline, disass - --- Active flag, output file handle and dump mode. -local active, out, dumpmode - ------------------------------------------------------------------------------- - -local symtabmt = { __index = false } -local symtab = {} -local nexitsym = 0 - --- Fill nested symbol table with per-trace exit stub addresses. -local function fillsymtab_tr(tr, nexit) - local t = {} - symtabmt.__index = t - if jit.arch == "mips" or jit.arch == "mipsel" then - t[traceexitstub(tr, 0)] = "exit" - return - end - for i=0,nexit-1 do - local addr = traceexitstub(tr, i) - t[addr] = tostring(i) - end - local addr = traceexitstub(tr, nexit) - if addr then t[addr] = "stack_check" end -end - --- Fill symbol table with trace exit stub addresses. -local function fillsymtab(tr, nexit) - local t = symtab - if nexitsym == 0 then - local ircall = vmdef.ircall - for i=0,#ircall do - local addr = ircalladdr(i) - if addr ~= 0 then t[addr] = ircall[i] end - end - end - if nexitsym == 1000000 then -- Per-trace exit stubs. - fillsymtab_tr(tr, nexit) - elseif nexit > nexitsym then -- Shared exit stubs. - for i=nexitsym,nexit-1 do - local addr = traceexitstub(i) - if addr == nil then -- Fall back to per-trace exit stubs. - fillsymtab_tr(tr, nexit) - setmetatable(symtab, symtabmt) - nexit = 1000000 - break - end - t[addr] = tostring(i) - end - nexitsym = nexit - end - return t -end - -local function dumpwrite(s) - out:write(s) -end - --- Disassemble machine code. -local function dump_mcode(tr) - local info = traceinfo(tr) - if not info then return end - local mcode, addr, loop = tracemc(tr) - if not mcode then return end - if not disass then disass = require("jit.dis_"..jit.arch) end - out:write("---- TRACE ", tr, " mcode ", #mcode, "\n") - local ctx = disass.create(mcode, addr, dumpwrite) - ctx.hexdump = 0 - ctx.symtab = fillsymtab(tr, info.nexit) - if loop ~= 0 then - symtab[addr+loop] = "LOOP" - ctx:disass(0, loop) - out:write("->LOOP:\n") - ctx:disass(loop, #mcode-loop) - symtab[addr+loop] = nil - else - ctx:disass(0, #mcode) - end -end - ------------------------------------------------------------------------------- - -local irtype_text = { - [0] = "nil", - "fal", - "tru", - "lud", - "str", - "p32", - "thr", - "pro", - "fun", - "p64", - "cdt", - "tab", - "udt", - "flt", - "num", - "i8 ", - "u8 ", - "i16", - "u16", - "int", - "u32", - "i64", - "u64", - "sfp", -} - -local colortype_ansi = { - [0] = "%s", - "%s", - "%s", - "\027[36m%s\027[m", - "\027[32m%s\027[m", - "%s", - "\027[1m%s\027[m", - "%s", - "\027[1m%s\027[m", - "%s", - "\027[33m%s\027[m", - "\027[31m%s\027[m", - "\027[36m%s\027[m", - "\027[34m%s\027[m", - "\027[34m%s\027[m", - "\027[35m%s\027[m", - "\027[35m%s\027[m", - "\027[35m%s\027[m", - "\027[35m%s\027[m", - "\027[35m%s\027[m", - "\027[35m%s\027[m", - "\027[35m%s\027[m", - "\027[35m%s\027[m", - "\027[35m%s\027[m", -} - -local function colorize_text(s, t) - return s -end - -local function colorize_ansi(s, t) - return format(colortype_ansi[t], s) -end - -local irtype_ansi = setmetatable({}, - { __index = function(tab, t) - local s = colorize_ansi(irtype_text[t], t); tab[t] = s; return s; end }) - -local html_escape = { ["<"] = "<", [">"] = ">", ["&"] = "&", } - -local function colorize_html(s, t) - s = gsub(s, "[<>&]", html_escape) - return format('%s', irtype_text[t], s) -end - -local irtype_html = setmetatable({}, - { __index = function(tab, t) - local s = colorize_html(irtype_text[t], t); tab[t] = s; return s; end }) - -local header_html = [[ - -]] - -local colorize, irtype - --- Lookup tables to convert some literals into names. -local litname = { - ["SLOAD "] = setmetatable({}, { __index = function(t, mode) - local s = "" - if band(mode, 1) ~= 0 then s = s.."P" end - if band(mode, 2) ~= 0 then s = s.."F" end - if band(mode, 4) ~= 0 then s = s.."T" end - if band(mode, 8) ~= 0 then s = s.."C" end - if band(mode, 16) ~= 0 then s = s.."R" end - if band(mode, 32) ~= 0 then s = s.."I" end - t[mode] = s - return s - end}), - ["XLOAD "] = { [0] = "", "R", "V", "RV", "U", "RU", "VU", "RVU", }, - ["CONV "] = setmetatable({}, { __index = function(t, mode) - local s = irtype[band(mode, 31)] - s = irtype[band(shr(mode, 5), 31)].."."..s - if band(mode, 0x400) ~= 0 then s = s.." trunc" - elseif band(mode, 0x800) ~= 0 then s = s.." sext" end - local c = shr(mode, 14) - if c == 2 then s = s.." index" elseif c == 3 then s = s.." check" end - t[mode] = s - return s - end}), - ["FLOAD "] = vmdef.irfield, - ["FREF "] = vmdef.irfield, - ["FPMATH"] = vmdef.irfpm, -} - -local function ctlsub(c) - if c == "\n" then return "\\n" - elseif c == "\r" then return "\\r" - elseif c == "\t" then return "\\t" - else return format("\\%03d", byte(c)) - end -end - -local function fmtfunc(func, pc) - local fi = funcinfo(func, pc) - if fi.loc then - return fi.loc - elseif fi.ffid then - return vmdef.ffnames[fi.ffid] - elseif fi.addr then - return format("C:%x", fi.addr) - else - return "(?)" - end -end - -local function formatk(tr, idx) - local k, t, slot = tracek(tr, idx) - local tn = type(k) - local s - if tn == "number" then - if k == 2^52+2^51 then - s = "bias" - else - s = format("%+.14g", k) - end - elseif tn == "string" then - s = format(#k > 20 and '"%.20s"~' or '"%s"', gsub(k, "%c", ctlsub)) - elseif tn == "function" then - s = fmtfunc(k) - elseif tn == "table" then - s = format("{%p}", k) - elseif tn == "userdata" then - if t == 12 then - s = format("userdata:%p", k) - else - s = format("[%p]", k) - if s == "[0x00000000]" then s = "NULL" end - end - elseif t == 21 then -- int64_t - s = sub(tostring(k), 1, -3) - if sub(s, 1, 1) ~= "-" then s = "+"..s end - else - s = tostring(k) -- For primitives. - end - s = colorize(format("%-4s", s), t) - if slot then - s = format("%s @%d", s, slot) - end - return s -end - -local function printsnap(tr, snap) - local n = 2 - for s=0,snap[1]-1 do - local sn = snap[n] - if shr(sn, 24) == s then - n = n + 1 - local ref = band(sn, 0xffff) - 0x8000 -- REF_BIAS - if ref < 0 then - out:write(formatk(tr, ref)) - elseif band(sn, 0x80000) ~= 0 then -- SNAP_SOFTFPNUM - out:write(colorize(format("%04d/%04d", ref, ref+1), 14)) - else - local m, ot, op1, op2 = traceir(tr, ref) - out:write(colorize(format("%04d", ref), band(ot, 31))) - end - out:write(band(sn, 0x10000) == 0 and " " or "|") -- SNAP_FRAME - else - out:write("---- ") - end - end - out:write("]\n") -end - --- Dump snapshots (not interleaved with IR). -local function dump_snap(tr) - out:write("---- TRACE ", tr, " snapshots\n") - for i=0,1000000000 do - local snap = tracesnap(tr, i) - if not snap then break end - out:write(format("#%-3d %04d [ ", i, snap[0])) - printsnap(tr, snap) - end -end - --- Return a register name or stack slot for a rid/sp location. -local function ridsp_name(ridsp, ins) - if not disass then disass = require("jit.dis_"..jit.arch) end - local rid, slot = band(ridsp, 0xff), shr(ridsp, 8) - if rid == 253 or rid == 254 then - return (slot == 0 or slot == 255) and " {sink" or format(" {%04d", ins-slot) - end - if ridsp > 255 then return format("[%x]", slot*4) end - if rid < 128 then return disass.regname(rid) end - return "" -end - --- Dump CALL* function ref and return optional ctype. -local function dumpcallfunc(tr, ins) - local ctype - if ins > 0 then - local m, ot, op1, op2 = traceir(tr, ins) - if band(ot, 31) == 0 then -- nil type means CARG(func, ctype). - ins = op1 - ctype = formatk(tr, op2) - end - end - if ins < 0 then - out:write(format("[0x%x](", tonumber((tracek(tr, ins))))) - else - out:write(format("%04d (", ins)) - end - return ctype -end - --- Recursively gather CALL* args and dump them. -local function dumpcallargs(tr, ins) - if ins < 0 then - out:write(formatk(tr, ins)) - else - local m, ot, op1, op2 = traceir(tr, ins) - local oidx = 6*shr(ot, 8) - local op = sub(vmdef.irnames, oidx+1, oidx+6) - if op == "CARG " then - dumpcallargs(tr, op1) - if op2 < 0 then - out:write(" ", formatk(tr, op2)) - else - out:write(" ", format("%04d", op2)) - end - else - out:write(format("%04d", ins)) - end - end -end - --- Dump IR and interleaved snapshots. -local function dump_ir(tr, dumpsnap, dumpreg) - local info = traceinfo(tr) - if not info then return end - local nins = info.nins - out:write("---- TRACE ", tr, " IR\n") - local irnames = vmdef.irnames - local snapref = 65536 - local snap, snapno - if dumpsnap then - snap = tracesnap(tr, 0) - snapref = snap[0] - snapno = 0 - end - for ins=1,nins do - if ins >= snapref then - if dumpreg then - out:write(format(".... SNAP #%-3d [ ", snapno)) - else - out:write(format(".... SNAP #%-3d [ ", snapno)) - end - printsnap(tr, snap) - snapno = snapno + 1 - snap = tracesnap(tr, snapno) - snapref = snap and snap[0] or 65536 - end - local m, ot, op1, op2, ridsp = traceir(tr, ins) - local oidx, t = 6*shr(ot, 8), band(ot, 31) - local op = sub(irnames, oidx+1, oidx+6) - if op == "LOOP " then - if dumpreg then - out:write(format("%04d ------------ LOOP ------------\n", ins)) - else - out:write(format("%04d ------ LOOP ------------\n", ins)) - end - elseif op ~= "NOP " and op ~= "CARG " and - (dumpreg or op ~= "RENAME") then - local rid = band(ridsp, 255) - if dumpreg then - out:write(format("%04d %-6s", ins, ridsp_name(ridsp, ins))) - else - out:write(format("%04d ", ins)) - end - out:write(format("%s%s %s %s ", - (rid == 254 or rid == 253) and "}" or - (band(ot, 128) == 0 and " " or ">"), - band(ot, 64) == 0 and " " or "+", - irtype[t], op)) - local m1, m2 = band(m, 3), band(m, 3*4) - if sub(op, 1, 4) == "CALL" then - local ctype - if m2 == 1*4 then -- op2 == IRMlit - out:write(format("%-10s (", vmdef.ircall[op2])) - else - ctype = dumpcallfunc(tr, op2) - end - if op1 ~= -1 then dumpcallargs(tr, op1) end - out:write(")") - if ctype then out:write(" ctype ", ctype) end - elseif op == "CNEW " and op2 == -1 then - out:write(formatk(tr, op1)) - elseif m1 ~= 3 then -- op1 != IRMnone - if op1 < 0 then - out:write(formatk(tr, op1)) - else - out:write(format(m1 == 0 and "%04d" or "#%-3d", op1)) - end - if m2 ~= 3*4 then -- op2 != IRMnone - if m2 == 1*4 then -- op2 == IRMlit - local litn = litname[op] - if litn and litn[op2] then - out:write(" ", litn[op2]) - elseif op == "UREFO " or op == "UREFC " then - out:write(format(" #%-3d", shr(op2, 8))) - else - out:write(format(" #%-3d", op2)) - end - elseif op2 < 0 then - out:write(" ", formatk(tr, op2)) - else - out:write(format(" %04d", op2)) - end - end - end - out:write("\n") - end - end - if snap then - if dumpreg then - out:write(format(".... SNAP #%-3d [ ", snapno)) - else - out:write(format(".... SNAP #%-3d [ ", snapno)) - end - printsnap(tr, snap) - end -end - ------------------------------------------------------------------------------- - -local recprefix = "" -local recdepth = 0 - --- Format trace error message. -local function fmterr(err, info) - if type(err) == "number" then - if type(info) == "function" then info = fmtfunc(info) end - err = format(vmdef.traceerr[err], info) - end - return err -end - --- Dump trace states. -local function dump_trace(what, tr, func, pc, otr, oex) - if what == "stop" or (what == "abort" and dumpmode.a) then - if dumpmode.i then dump_ir(tr, dumpmode.s, dumpmode.r and what == "stop") - elseif dumpmode.s then dump_snap(tr) end - if dumpmode.m then dump_mcode(tr) end - end - if what == "start" then - if dumpmode.H then out:write('
    \n') end
    -    out:write("---- TRACE ", tr, " ", what)
    -    if otr then out:write(" ", otr, "/", oex) end
    -    out:write(" ", fmtfunc(func, pc), "\n")
    -  elseif what == "stop" or what == "abort" then
    -    out:write("---- TRACE ", tr, " ", what)
    -    if what == "abort" then
    -      out:write(" ", fmtfunc(func, pc), " -- ", fmterr(otr, oex), "\n")
    -    else
    -      local info = traceinfo(tr)
    -      local link, ltype = info.link, info.linktype
    -      if link == tr or link == 0 then
    -	out:write(" -> ", ltype, "\n")
    -      elseif ltype == "root" then
    -	out:write(" -> ", link, "\n")
    -      else
    -	out:write(" -> ", link, " ", ltype, "\n")
    -      end
    -    end
    -    if dumpmode.H then out:write("
    \n\n") else out:write("\n") end - else - out:write("---- TRACE ", what, "\n\n") - end - out:flush() -end - --- Dump recorded bytecode. -local function dump_record(tr, func, pc, depth, callee) - if depth ~= recdepth then - recdepth = depth - recprefix = rep(" .", depth) - end - local line - if pc >= 0 then - line = bcline(func, pc, recprefix) - if dumpmode.H then line = gsub(line, "[<>&]", html_escape) end - else - line = "0000 "..recprefix.." FUNCC \n" - callee = func - end - if pc <= 0 then - out:write(sub(line, 1, -2), " ; ", fmtfunc(func), "\n") - else - out:write(line) - end - if pc >= 0 and band(funcbc(func, pc), 0xff) < 16 then -- ORDER BC - out:write(bcline(func, pc+1, recprefix)) -- Write JMP for cond. - end -end - ------------------------------------------------------------------------------- - --- Dump taken trace exits. -local function dump_texit(tr, ex, ngpr, nfpr, ...) - out:write("---- TRACE ", tr, " exit ", ex, "\n") - if dumpmode.X then - local regs = {...} - if jit.arch == "x64" then - for i=1,ngpr do - out:write(format(" %016x", regs[i])) - if i % 4 == 0 then out:write("\n") end - end - else - for i=1,ngpr do - out:write(format(" %08x", regs[i])) - if i % 8 == 0 then out:write("\n") end - end - end - if jit.arch == "mips" or jit.arch == "mipsel" then - for i=1,nfpr,2 do - out:write(format(" %+17.14g", regs[ngpr+i])) - if i % 8 == 7 then out:write("\n") end - end - else - for i=1,nfpr do - out:write(format(" %+17.14g", regs[ngpr+i])) - if i % 4 == 0 then out:write("\n") end - end - end - end -end - ------------------------------------------------------------------------------- - --- Detach dump handlers. -local function dumpoff() - if active then - active = false - jit.attach(dump_texit) - jit.attach(dump_record) - jit.attach(dump_trace) - if out and out ~= stdout and out ~= stderr then out:close() end - out = nil - end -end - --- Open the output file and attach dump handlers. -local function dumpon(opt, outfile) - if active then dumpoff() end - - local colormode = os.getenv("COLORTERM") and "A" or "T" - if opt then - opt = gsub(opt, "[TAH]", function(mode) colormode = mode; return ""; end) - end - - local m = { t=true, b=true, i=true, m=true, } - if opt and opt ~= "" then - local o = sub(opt, 1, 1) - if o ~= "+" and o ~= "-" then m = {} end - for i=1,#opt do m[sub(opt, i, i)] = (o ~= "-") end - end - dumpmode = m - - if m.t or m.b or m.i or m.s or m.m then - jit.attach(dump_trace, "trace") - end - if m.b then - jit.attach(dump_record, "record") - if not bcline then bcline = require("jit.bc").line end - end - if m.x or m.X then - jit.attach(dump_texit, "texit") - end - - if not outfile then outfile = os.getenv("LUAJIT_DUMPFILE") end - if outfile then - out = outfile == "-" and stdout or assert(io.open(outfile, "w")) - else - out = stdout - end - - m[colormode] = true - if colormode == "A" then - colorize = colorize_ansi - irtype = irtype_ansi - elseif colormode == "H" then - colorize = colorize_html - irtype = irtype_html - out:write(header_html) - else - colorize = colorize_text - irtype = irtype_text - end - - active = true -end - --- Public module functions. -module(...) - -on = dumpon -off = dumpoff -start = dumpon -- For -j command line option. - diff --git a/deps/luajit/src/jit/v.lua b/deps/luajit/src/jit/v.lua deleted file mode 100644 index 32666fd1..00000000 --- a/deps/luajit/src/jit/v.lua +++ /dev/null @@ -1,167 +0,0 @@ ----------------------------------------------------------------------------- --- Verbose mode of the LuaJIT compiler. --- --- Copyright (C) 2005-2015 Mike Pall. All rights reserved. --- Released under the MIT license. See Copyright Notice in luajit.h ----------------------------------------------------------------------------- --- --- This module shows verbose information about the progress of the --- JIT compiler. It prints one line for each generated trace. This module --- is useful to see which code has been compiled or where the compiler --- punts and falls back to the interpreter. --- --- Example usage: --- --- luajit -jv -e "for i=1,1000 do for j=1,1000 do end end" --- luajit -jv=myapp.out myapp.lua --- --- Default output is to stderr. To redirect the output to a file, pass a --- filename as an argument (use '-' for stdout) or set the environment --- variable LUAJIT_VERBOSEFILE. The file is overwritten every time the --- module is started. --- --- The output from the first example should look like this: --- --- [TRACE 1 (command line):1 loop] --- [TRACE 2 (1/3) (command line):1 -> 1] --- --- The first number in each line is the internal trace number. Next are --- the file name ('(command line)') and the line number (':1') where the --- trace has started. Side traces also show the parent trace number and --- the exit number where they are attached to in parentheses ('(1/3)'). --- An arrow at the end shows where the trace links to ('-> 1'), unless --- it loops to itself. --- --- In this case the inner loop gets hot and is traced first, generating --- a root trace. Then the last exit from the 1st trace gets hot, too, --- and triggers generation of the 2nd trace. The side trace follows the --- path along the outer loop and *around* the inner loop, back to its --- start, and then links to the 1st trace. Yes, this may seem unusual, --- if you know how traditional compilers work. Trace compilers are full --- of surprises like this -- have fun! :-) --- --- Aborted traces are shown like this: --- --- [TRACE --- foo.lua:44 -- leaving loop in root trace at foo:lua:50] --- --- Don't worry -- trace aborts are quite common, even in programs which --- can be fully compiled. The compiler may retry several times until it --- finds a suitable trace. --- --- Of course this doesn't work with features that are not-yet-implemented --- (NYI error messages). The VM simply falls back to the interpreter. This --- may not matter at all if the particular trace is not very high up in --- the CPU usage profile. Oh, and the interpreter is quite fast, too. --- --- Also check out the -jdump module, which prints all the gory details. --- ------------------------------------------------------------------------------- - --- Cache some library functions and objects. -local jit = require("jit") -assert(jit.version_num == 20004, "LuaJIT core/library version mismatch") -local jutil = require("jit.util") -local vmdef = require("jit.vmdef") -local funcinfo, traceinfo = jutil.funcinfo, jutil.traceinfo -local type, format = type, string.format -local stdout, stderr = io.stdout, io.stderr - --- Active flag and output file handle. -local active, out - ------------------------------------------------------------------------------- - -local startloc, startex - -local function fmtfunc(func, pc) - local fi = funcinfo(func, pc) - if fi.loc then - return fi.loc - elseif fi.ffid then - return vmdef.ffnames[fi.ffid] - elseif fi.addr then - return format("C:%x", fi.addr) - else - return "(?)" - end -end - --- Format trace error message. -local function fmterr(err, info) - if type(err) == "number" then - if type(info) == "function" then info = fmtfunc(info) end - err = format(vmdef.traceerr[err], info) - end - return err -end - --- Dump trace states. -local function dump_trace(what, tr, func, pc, otr, oex) - if what == "start" then - startloc = fmtfunc(func, pc) - startex = otr and "("..otr.."/"..oex..") " or "" - else - if what == "abort" then - local loc = fmtfunc(func, pc) - if loc ~= startloc then - out:write(format("[TRACE --- %s%s -- %s at %s]\n", - startex, startloc, fmterr(otr, oex), loc)) - else - out:write(format("[TRACE --- %s%s -- %s]\n", - startex, startloc, fmterr(otr, oex))) - end - elseif what == "stop" then - local info = traceinfo(tr) - local link, ltype = info.link, info.linktype - if ltype == "interpreter" then - out:write(format("[TRACE %3s %s%s -- fallback to interpreter]\n", - tr, startex, startloc)) - elseif link == tr or link == 0 then - out:write(format("[TRACE %3s %s%s %s]\n", - tr, startex, startloc, ltype)) - elseif ltype == "root" then - out:write(format("[TRACE %3s %s%s -> %d]\n", - tr, startex, startloc, link)) - else - out:write(format("[TRACE %3s %s%s -> %d %s]\n", - tr, startex, startloc, link, ltype)) - end - else - out:write(format("[TRACE %s]\n", what)) - end - out:flush() - end -end - ------------------------------------------------------------------------------- - --- Detach dump handlers. -local function dumpoff() - if active then - active = false - jit.attach(dump_trace) - if out and out ~= stdout and out ~= stderr then out:close() end - out = nil - end -end - --- Open the output file and attach dump handlers. -local function dumpon(outfile) - if active then dumpoff() end - if not outfile then outfile = os.getenv("LUAJIT_VERBOSEFILE") end - if outfile then - out = outfile == "-" and stdout or assert(io.open(outfile, "w")) - else - out = stderr - end - jit.attach(dump_trace, "trace") - active = true -end - --- Public module functions. -module(...) - -on = dumpon -off = dumpoff -start = dumpon -- For -j command line option. - diff --git a/deps/luajit/src/lauxlib.h b/deps/luajit/src/lauxlib.h deleted file mode 100644 index fed1491b..00000000 --- a/deps/luajit/src/lauxlib.h +++ /dev/null @@ -1,167 +0,0 @@ -/* -** $Id: lauxlib.h,v 1.88.1.1 2007/12/27 13:02:25 roberto Exp $ -** Auxiliary functions for building Lua libraries -** See Copyright Notice in lua.h -*/ - - -#ifndef lauxlib_h -#define lauxlib_h - - -#include -#include - -#include "lua.h" - - -#define luaL_getn(L,i) ((int)lua_objlen(L, i)) -#define luaL_setn(L,i,j) ((void)0) /* no op! */ - -/* extra error code for `luaL_load' */ -#define LUA_ERRFILE (LUA_ERRERR+1) - -typedef struct luaL_Reg { - const char *name; - lua_CFunction func; -} luaL_Reg; - -LUALIB_API void (luaL_openlib) (lua_State *L, const char *libname, - const luaL_Reg *l, int nup); -LUALIB_API void (luaL_register) (lua_State *L, const char *libname, - const luaL_Reg *l); -LUALIB_API int (luaL_getmetafield) (lua_State *L, int obj, const char *e); -LUALIB_API int (luaL_callmeta) (lua_State *L, int obj, const char *e); -LUALIB_API int (luaL_typerror) (lua_State *L, int narg, const char *tname); -LUALIB_API int (luaL_argerror) (lua_State *L, int numarg, const char *extramsg); -LUALIB_API const char *(luaL_checklstring) (lua_State *L, int numArg, - size_t *l); -LUALIB_API const char *(luaL_optlstring) (lua_State *L, int numArg, - const char *def, size_t *l); -LUALIB_API lua_Number (luaL_checknumber) (lua_State *L, int numArg); -LUALIB_API lua_Number (luaL_optnumber) (lua_State *L, int nArg, lua_Number def); - -LUALIB_API lua_Integer (luaL_checkinteger) (lua_State *L, int numArg); -LUALIB_API lua_Integer (luaL_optinteger) (lua_State *L, int nArg, - lua_Integer def); - -LUALIB_API void (luaL_checkstack) (lua_State *L, int sz, const char *msg); -LUALIB_API void (luaL_checktype) (lua_State *L, int narg, int t); -LUALIB_API void (luaL_checkany) (lua_State *L, int narg); - -LUALIB_API int (luaL_newmetatable) (lua_State *L, const char *tname); -LUALIB_API void *(luaL_checkudata) (lua_State *L, int ud, const char *tname); - -LUALIB_API void (luaL_where) (lua_State *L, int lvl); -LUALIB_API int (luaL_error) (lua_State *L, const char *fmt, ...); - -LUALIB_API int (luaL_checkoption) (lua_State *L, int narg, const char *def, - const char *const lst[]); - -LUALIB_API int (luaL_ref) (lua_State *L, int t); -LUALIB_API void (luaL_unref) (lua_State *L, int t, int ref); - -LUALIB_API int (luaL_loadfile) (lua_State *L, const char *filename); -LUALIB_API int (luaL_loadbuffer) (lua_State *L, const char *buff, size_t sz, - const char *name); -LUALIB_API int (luaL_loadstring) (lua_State *L, const char *s); - -LUALIB_API lua_State *(luaL_newstate) (void); - - -LUALIB_API const char *(luaL_gsub) (lua_State *L, const char *s, const char *p, - const char *r); - -LUALIB_API const char *(luaL_findtable) (lua_State *L, int idx, - const char *fname, int szhint); - -/* From Lua 5.2. */ -LUALIB_API int luaL_fileresult(lua_State *L, int stat, const char *fname); -LUALIB_API int luaL_execresult(lua_State *L, int stat); -LUALIB_API int (luaL_loadfilex) (lua_State *L, const char *filename, - const char *mode); -LUALIB_API int (luaL_loadbufferx) (lua_State *L, const char *buff, size_t sz, - const char *name, const char *mode); -LUALIB_API void luaL_traceback (lua_State *L, lua_State *L1, const char *msg, - int level); - - -/* -** =============================================================== -** some useful macros -** =============================================================== -*/ - -#define luaL_argcheck(L, cond,numarg,extramsg) \ - ((void)((cond) || luaL_argerror(L, (numarg), (extramsg)))) -#define luaL_checkstring(L,n) (luaL_checklstring(L, (n), NULL)) -#define luaL_optstring(L,n,d) (luaL_optlstring(L, (n), (d), NULL)) -#define luaL_checkint(L,n) ((int)luaL_checkinteger(L, (n))) -#define luaL_optint(L,n,d) ((int)luaL_optinteger(L, (n), (d))) -#define luaL_checklong(L,n) ((long)luaL_checkinteger(L, (n))) -#define luaL_optlong(L,n,d) ((long)luaL_optinteger(L, (n), (d))) - -#define luaL_typename(L,i) lua_typename(L, lua_type(L,(i))) - -#define luaL_dofile(L, fn) \ - (luaL_loadfile(L, fn) || lua_pcall(L, 0, LUA_MULTRET, 0)) - -#define luaL_dostring(L, s) \ - (luaL_loadstring(L, s) || lua_pcall(L, 0, LUA_MULTRET, 0)) - -#define luaL_getmetatable(L,n) (lua_getfield(L, LUA_REGISTRYINDEX, (n))) - -#define luaL_opt(L,f,n,d) (lua_isnoneornil(L,(n)) ? (d) : f(L,(n))) - -/* -** {====================================================== -** Generic Buffer manipulation -** ======================================================= -*/ - - - -typedef struct luaL_Buffer { - char *p; /* current position in buffer */ - int lvl; /* number of strings in the stack (level) */ - lua_State *L; - char buffer[LUAL_BUFFERSIZE]; -} luaL_Buffer; - -#define luaL_addchar(B,c) \ - ((void)((B)->p < ((B)->buffer+LUAL_BUFFERSIZE) || luaL_prepbuffer(B)), \ - (*(B)->p++ = (char)(c))) - -/* compatibility only */ -#define luaL_putchar(B,c) luaL_addchar(B,c) - -#define luaL_addsize(B,n) ((B)->p += (n)) - -LUALIB_API void (luaL_buffinit) (lua_State *L, luaL_Buffer *B); -LUALIB_API char *(luaL_prepbuffer) (luaL_Buffer *B); -LUALIB_API void (luaL_addlstring) (luaL_Buffer *B, const char *s, size_t l); -LUALIB_API void (luaL_addstring) (luaL_Buffer *B, const char *s); -LUALIB_API void (luaL_addvalue) (luaL_Buffer *B); -LUALIB_API void (luaL_pushresult) (luaL_Buffer *B); - - -/* }====================================================== */ - - -/* compatibility with ref system */ - -/* pre-defined references */ -#define LUA_NOREF (-2) -#define LUA_REFNIL (-1) - -#define lua_ref(L,lock) ((lock) ? luaL_ref(L, LUA_REGISTRYINDEX) : \ - (lua_pushstring(L, "unlocked references are obsolete"), lua_error(L), 0)) - -#define lua_unref(L,ref) luaL_unref(L, LUA_REGISTRYINDEX, (ref)) - -#define lua_getref(L,ref) lua_rawgeti(L, LUA_REGISTRYINDEX, (ref)) - - -#define luaL_reg luaL_Reg - -#endif diff --git a/deps/luajit/src/lib_aux.c b/deps/luajit/src/lib_aux.c deleted file mode 100644 index 4a1b70dd..00000000 --- a/deps/luajit/src/lib_aux.c +++ /dev/null @@ -1,356 +0,0 @@ -/* -** Auxiliary library for the Lua/C API. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -** -** Major parts taken verbatim or adapted from the Lua interpreter. -** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h -*/ - -#include -#include -#include - -#define lib_aux_c -#define LUA_LIB - -#include "lua.h" -#include "lauxlib.h" - -#include "lj_obj.h" -#include "lj_err.h" -#include "lj_state.h" -#include "lj_trace.h" -#include "lj_lib.h" - -#if LJ_TARGET_POSIX -#include -#endif - -/* -- I/O error handling -------------------------------------------------- */ - -LUALIB_API int luaL_fileresult(lua_State *L, int stat, const char *fname) -{ - if (stat) { - setboolV(L->top++, 1); - return 1; - } else { - int en = errno; /* Lua API calls may change this value. */ - setnilV(L->top++); - if (fname) - lua_pushfstring(L, "%s: %s", fname, strerror(en)); - else - lua_pushfstring(L, "%s", strerror(en)); - setintV(L->top++, en); - lj_trace_abort(G(L)); - return 3; - } -} - -LUALIB_API int luaL_execresult(lua_State *L, int stat) -{ - if (stat != -1) { -#if LJ_TARGET_POSIX - if (WIFSIGNALED(stat)) { - stat = WTERMSIG(stat); - setnilV(L->top++); - lua_pushliteral(L, "signal"); - } else { - if (WIFEXITED(stat)) - stat = WEXITSTATUS(stat); - if (stat == 0) - setboolV(L->top++, 1); - else - setnilV(L->top++); - lua_pushliteral(L, "exit"); - } -#else - if (stat == 0) - setboolV(L->top++, 1); - else - setnilV(L->top++); - lua_pushliteral(L, "exit"); -#endif - setintV(L->top++, stat); - return 3; - } - return luaL_fileresult(L, 0, NULL); -} - -/* -- Module registration ------------------------------------------------- */ - -LUALIB_API const char *luaL_findtable(lua_State *L, int idx, - const char *fname, int szhint) -{ - const char *e; - lua_pushvalue(L, idx); - do { - e = strchr(fname, '.'); - if (e == NULL) e = fname + strlen(fname); - lua_pushlstring(L, fname, (size_t)(e - fname)); - lua_rawget(L, -2); - if (lua_isnil(L, -1)) { /* no such field? */ - lua_pop(L, 1); /* remove this nil */ - lua_createtable(L, 0, (*e == '.' ? 1 : szhint)); /* new table for field */ - lua_pushlstring(L, fname, (size_t)(e - fname)); - lua_pushvalue(L, -2); - lua_settable(L, -4); /* set new table into field */ - } else if (!lua_istable(L, -1)) { /* field has a non-table value? */ - lua_pop(L, 2); /* remove table and value */ - return fname; /* return problematic part of the name */ - } - lua_remove(L, -2); /* remove previous table */ - fname = e + 1; - } while (*e == '.'); - return NULL; -} - -static int libsize(const luaL_Reg *l) -{ - int size = 0; - for (; l->name; l++) size++; - return size; -} - -LUALIB_API void luaL_openlib(lua_State *L, const char *libname, - const luaL_Reg *l, int nup) -{ - lj_lib_checkfpu(L); - if (libname) { - int size = libsize(l); - /* check whether lib already exists */ - luaL_findtable(L, LUA_REGISTRYINDEX, "_LOADED", 16); - lua_getfield(L, -1, libname); /* get _LOADED[libname] */ - if (!lua_istable(L, -1)) { /* not found? */ - lua_pop(L, 1); /* remove previous result */ - /* try global variable (and create one if it does not exist) */ - if (luaL_findtable(L, LUA_GLOBALSINDEX, libname, size) != NULL) - lj_err_callerv(L, LJ_ERR_BADMODN, libname); - lua_pushvalue(L, -1); - lua_setfield(L, -3, libname); /* _LOADED[libname] = new table */ - } - lua_remove(L, -2); /* remove _LOADED table */ - lua_insert(L, -(nup+1)); /* move library table to below upvalues */ - } - for (; l->name; l++) { - int i; - for (i = 0; i < nup; i++) /* copy upvalues to the top */ - lua_pushvalue(L, -nup); - lua_pushcclosure(L, l->func, nup); - lua_setfield(L, -(nup+2), l->name); - } - lua_pop(L, nup); /* remove upvalues */ -} - -LUALIB_API void luaL_register(lua_State *L, const char *libname, - const luaL_Reg *l) -{ - luaL_openlib(L, libname, l, 0); -} - -LUALIB_API const char *luaL_gsub(lua_State *L, const char *s, - const char *p, const char *r) -{ - const char *wild; - size_t l = strlen(p); - luaL_Buffer b; - luaL_buffinit(L, &b); - while ((wild = strstr(s, p)) != NULL) { - luaL_addlstring(&b, s, (size_t)(wild - s)); /* push prefix */ - luaL_addstring(&b, r); /* push replacement in place of pattern */ - s = wild + l; /* continue after `p' */ - } - luaL_addstring(&b, s); /* push last suffix */ - luaL_pushresult(&b); - return lua_tostring(L, -1); -} - -/* -- Buffer handling ----------------------------------------------------- */ - -#define bufflen(B) ((size_t)((B)->p - (B)->buffer)) -#define bufffree(B) ((size_t)(LUAL_BUFFERSIZE - bufflen(B))) - -static int emptybuffer(luaL_Buffer *B) -{ - size_t l = bufflen(B); - if (l == 0) - return 0; /* put nothing on stack */ - lua_pushlstring(B->L, B->buffer, l); - B->p = B->buffer; - B->lvl++; - return 1; -} - -static void adjuststack(luaL_Buffer *B) -{ - if (B->lvl > 1) { - lua_State *L = B->L; - int toget = 1; /* number of levels to concat */ - size_t toplen = lua_strlen(L, -1); - do { - size_t l = lua_strlen(L, -(toget+1)); - if (!(B->lvl - toget + 1 >= LUA_MINSTACK/2 || toplen > l)) - break; - toplen += l; - toget++; - } while (toget < B->lvl); - lua_concat(L, toget); - B->lvl = B->lvl - toget + 1; - } -} - -LUALIB_API char *luaL_prepbuffer(luaL_Buffer *B) -{ - if (emptybuffer(B)) - adjuststack(B); - return B->buffer; -} - -LUALIB_API void luaL_addlstring(luaL_Buffer *B, const char *s, size_t l) -{ - while (l--) - luaL_addchar(B, *s++); -} - -LUALIB_API void luaL_addstring(luaL_Buffer *B, const char *s) -{ - luaL_addlstring(B, s, strlen(s)); -} - -LUALIB_API void luaL_pushresult(luaL_Buffer *B) -{ - emptybuffer(B); - lua_concat(B->L, B->lvl); - B->lvl = 1; -} - -LUALIB_API void luaL_addvalue(luaL_Buffer *B) -{ - lua_State *L = B->L; - size_t vl; - const char *s = lua_tolstring(L, -1, &vl); - if (vl <= bufffree(B)) { /* fit into buffer? */ - memcpy(B->p, s, vl); /* put it there */ - B->p += vl; - lua_pop(L, 1); /* remove from stack */ - } else { - if (emptybuffer(B)) - lua_insert(L, -2); /* put buffer before new value */ - B->lvl++; /* add new value into B stack */ - adjuststack(B); - } -} - -LUALIB_API void luaL_buffinit(lua_State *L, luaL_Buffer *B) -{ - B->L = L; - B->p = B->buffer; - B->lvl = 0; -} - -/* -- Reference management ------------------------------------------------ */ - -#define FREELIST_REF 0 - -/* Convert a stack index to an absolute index. */ -#define abs_index(L, i) \ - ((i) > 0 || (i) <= LUA_REGISTRYINDEX ? (i) : lua_gettop(L) + (i) + 1) - -LUALIB_API int luaL_ref(lua_State *L, int t) -{ - int ref; - t = abs_index(L, t); - if (lua_isnil(L, -1)) { - lua_pop(L, 1); /* remove from stack */ - return LUA_REFNIL; /* `nil' has a unique fixed reference */ - } - lua_rawgeti(L, t, FREELIST_REF); /* get first free element */ - ref = (int)lua_tointeger(L, -1); /* ref = t[FREELIST_REF] */ - lua_pop(L, 1); /* remove it from stack */ - if (ref != 0) { /* any free element? */ - lua_rawgeti(L, t, ref); /* remove it from list */ - lua_rawseti(L, t, FREELIST_REF); /* (t[FREELIST_REF] = t[ref]) */ - } else { /* no free elements */ - ref = (int)lua_objlen(L, t); - ref++; /* create new reference */ - } - lua_rawseti(L, t, ref); - return ref; -} - -LUALIB_API void luaL_unref(lua_State *L, int t, int ref) -{ - if (ref >= 0) { - t = abs_index(L, t); - lua_rawgeti(L, t, FREELIST_REF); - lua_rawseti(L, t, ref); /* t[ref] = t[FREELIST_REF] */ - lua_pushinteger(L, ref); - lua_rawseti(L, t, FREELIST_REF); /* t[FREELIST_REF] = ref */ - } -} - -/* -- Default allocator and panic function -------------------------------- */ - -static int panic(lua_State *L) -{ - const char *s = lua_tostring(L, -1); - fputs("PANIC: unprotected error in call to Lua API (", stderr); - fputs(s ? s : "?", stderr); - fputc(')', stderr); fputc('\n', stderr); - fflush(stderr); - return 0; -} - -#ifdef LUAJIT_USE_SYSMALLOC - -#if LJ_64 && !defined(LUAJIT_USE_VALGRIND) -#error "Must use builtin allocator for 64 bit target" -#endif - -static void *mem_alloc(void *ud, void *ptr, size_t osize, size_t nsize) -{ - (void)ud; - (void)osize; - if (nsize == 0) { - free(ptr); - return NULL; - } else { - return realloc(ptr, nsize); - } -} - -LUALIB_API lua_State *luaL_newstate(void) -{ - lua_State *L = lua_newstate(mem_alloc, NULL); - if (L) G(L)->panic = panic; - return L; -} - -#else - -#include "lj_alloc.h" - -LUALIB_API lua_State *luaL_newstate(void) -{ - lua_State *L; - void *ud = lj_alloc_create(); - if (ud == NULL) return NULL; -#if LJ_64 - L = lj_state_newstate(lj_alloc_f, ud); -#else - L = lua_newstate(lj_alloc_f, ud); -#endif - if (L) G(L)->panic = panic; - return L; -} - -#if LJ_64 -LUA_API lua_State *lua_newstate(lua_Alloc f, void *ud) -{ - UNUSED(f); UNUSED(ud); - fputs("Must use luaL_newstate() for 64 bit target\n", stderr); - return NULL; -} -#endif - -#endif - diff --git a/deps/luajit/src/lib_base.c b/deps/luajit/src/lib_base.c deleted file mode 100644 index 17b9525d..00000000 --- a/deps/luajit/src/lib_base.c +++ /dev/null @@ -1,683 +0,0 @@ -/* -** Base and coroutine library. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -** -** Major portions taken verbatim or adapted from the Lua interpreter. -** Copyright (C) 1994-2011 Lua.org, PUC-Rio. See Copyright Notice in lua.h -*/ - -#include - -#define lib_base_c -#define LUA_LIB - -#include "lua.h" -#include "lauxlib.h" -#include "lualib.h" - -#include "lj_obj.h" -#include "lj_gc.h" -#include "lj_err.h" -#include "lj_debug.h" -#include "lj_str.h" -#include "lj_tab.h" -#include "lj_meta.h" -#include "lj_state.h" -#if LJ_HASFFI -#include "lj_ctype.h" -#include "lj_cconv.h" -#endif -#include "lj_bc.h" -#include "lj_ff.h" -#include "lj_dispatch.h" -#include "lj_char.h" -#include "lj_strscan.h" -#include "lj_lib.h" - -/* -- Base library: checks ------------------------------------------------ */ - -#define LJLIB_MODULE_base - -LJLIB_ASM(assert) LJLIB_REC(.) -{ - GCstr *s; - lj_lib_checkany(L, 1); - s = lj_lib_optstr(L, 2); - if (s) - lj_err_callermsg(L, strdata(s)); - else - lj_err_caller(L, LJ_ERR_ASSERT); - return FFH_UNREACHABLE; -} - -/* ORDER LJ_T */ -LJLIB_PUSH("nil") -LJLIB_PUSH("boolean") -LJLIB_PUSH(top-1) /* boolean */ -LJLIB_PUSH("userdata") -LJLIB_PUSH("string") -LJLIB_PUSH("upval") -LJLIB_PUSH("thread") -LJLIB_PUSH("proto") -LJLIB_PUSH("function") -LJLIB_PUSH("trace") -LJLIB_PUSH("cdata") -LJLIB_PUSH("table") -LJLIB_PUSH(top-9) /* userdata */ -LJLIB_PUSH("number") -LJLIB_ASM_(type) LJLIB_REC(.) -/* Recycle the lj_lib_checkany(L, 1) from assert. */ - -/* -- Base library: iterators --------------------------------------------- */ - -/* This solves a circular dependency problem -- change FF_next_N as needed. */ -LJ_STATIC_ASSERT((int)FF_next == FF_next_N); - -LJLIB_ASM(next) -{ - lj_lib_checktab(L, 1); - return FFH_UNREACHABLE; -} - -#if LJ_52 || LJ_HASFFI -static int ffh_pairs(lua_State *L, MMS mm) -{ - TValue *o = lj_lib_checkany(L, 1); - cTValue *mo = lj_meta_lookup(L, o, mm); - if ((LJ_52 || tviscdata(o)) && !tvisnil(mo)) { - L->top = o+1; /* Only keep one argument. */ - copyTV(L, L->base-1, mo); /* Replace callable. */ - return FFH_TAILCALL; - } else { - if (!tvistab(o)) lj_err_argt(L, 1, LUA_TTABLE); - setfuncV(L, o-1, funcV(lj_lib_upvalue(L, 1))); - if (mm == MM_pairs) setnilV(o+1); else setintV(o+1, 0); - return FFH_RES(3); - } -} -#else -#define ffh_pairs(L, mm) (lj_lib_checktab(L, 1), FFH_UNREACHABLE) -#endif - -LJLIB_PUSH(lastcl) -LJLIB_ASM(pairs) -{ - return ffh_pairs(L, MM_pairs); -} - -LJLIB_NOREGUV LJLIB_ASM(ipairs_aux) LJLIB_REC(.) -{ - lj_lib_checktab(L, 1); - lj_lib_checkint(L, 2); - return FFH_UNREACHABLE; -} - -LJLIB_PUSH(lastcl) -LJLIB_ASM(ipairs) LJLIB_REC(.) -{ - return ffh_pairs(L, MM_ipairs); -} - -/* -- Base library: getters and setters ----------------------------------- */ - -LJLIB_ASM_(getmetatable) LJLIB_REC(.) -/* Recycle the lj_lib_checkany(L, 1) from assert. */ - -LJLIB_ASM(setmetatable) LJLIB_REC(.) -{ - GCtab *t = lj_lib_checktab(L, 1); - GCtab *mt = lj_lib_checktabornil(L, 2); - if (!tvisnil(lj_meta_lookup(L, L->base, MM_metatable))) - lj_err_caller(L, LJ_ERR_PROTMT); - setgcref(t->metatable, obj2gco(mt)); - if (mt) { lj_gc_objbarriert(L, t, mt); } - settabV(L, L->base-1, t); - return FFH_RES(1); -} - -LJLIB_CF(getfenv) -{ - GCfunc *fn; - cTValue *o = L->base; - if (!(o < L->top && tvisfunc(o))) { - int level = lj_lib_optint(L, 1, 1); - o = lj_debug_frame(L, level, &level); - if (o == NULL) - lj_err_arg(L, 1, LJ_ERR_INVLVL); - } - fn = &gcval(o)->fn; - settabV(L, L->top++, isluafunc(fn) ? tabref(fn->l.env) : tabref(L->env)); - return 1; -} - -LJLIB_CF(setfenv) -{ - GCfunc *fn; - GCtab *t = lj_lib_checktab(L, 2); - cTValue *o = L->base; - if (!(o < L->top && tvisfunc(o))) { - int level = lj_lib_checkint(L, 1); - if (level == 0) { - /* NOBARRIER: A thread (i.e. L) is never black. */ - setgcref(L->env, obj2gco(t)); - return 0; - } - o = lj_debug_frame(L, level, &level); - if (o == NULL) - lj_err_arg(L, 1, LJ_ERR_INVLVL); - } - fn = &gcval(o)->fn; - if (!isluafunc(fn)) - lj_err_caller(L, LJ_ERR_SETFENV); - setgcref(fn->l.env, obj2gco(t)); - lj_gc_objbarrier(L, obj2gco(fn), t); - setfuncV(L, L->top++, fn); - return 1; -} - -LJLIB_ASM(rawget) LJLIB_REC(.) -{ - lj_lib_checktab(L, 1); - lj_lib_checkany(L, 2); - return FFH_UNREACHABLE; -} - -LJLIB_CF(rawset) LJLIB_REC(.) -{ - lj_lib_checktab(L, 1); - lj_lib_checkany(L, 2); - L->top = 1+lj_lib_checkany(L, 3); - lua_rawset(L, 1); - return 1; -} - -LJLIB_CF(rawequal) LJLIB_REC(.) -{ - cTValue *o1 = lj_lib_checkany(L, 1); - cTValue *o2 = lj_lib_checkany(L, 2); - setboolV(L->top-1, lj_obj_equal(o1, o2)); - return 1; -} - -#if LJ_52 -LJLIB_CF(rawlen) LJLIB_REC(.) -{ - cTValue *o = L->base; - int32_t len; - if (L->top > o && tvisstr(o)) - len = (int32_t)strV(o)->len; - else - len = (int32_t)lj_tab_len(lj_lib_checktab(L, 1)); - setintV(L->top-1, len); - return 1; -} -#endif - -LJLIB_CF(unpack) -{ - GCtab *t = lj_lib_checktab(L, 1); - int32_t n, i = lj_lib_optint(L, 2, 1); - int32_t e = (L->base+3-1 < L->top && !tvisnil(L->base+3-1)) ? - lj_lib_checkint(L, 3) : (int32_t)lj_tab_len(t); - if (i > e) return 0; - n = e - i + 1; - if (n <= 0 || !lua_checkstack(L, n)) - lj_err_caller(L, LJ_ERR_UNPACK); - do { - cTValue *tv = lj_tab_getint(t, i); - if (tv) { - copyTV(L, L->top++, tv); - } else { - setnilV(L->top++); - } - } while (i++ < e); - return n; -} - -LJLIB_CF(select) LJLIB_REC(.) -{ - int32_t n = (int32_t)(L->top - L->base); - if (n >= 1 && tvisstr(L->base) && *strVdata(L->base) == '#') { - setintV(L->top-1, n-1); - return 1; - } else { - int32_t i = lj_lib_checkint(L, 1); - if (i < 0) i = n + i; else if (i > n) i = n; - if (i < 1) - lj_err_arg(L, 1, LJ_ERR_IDXRNG); - return n - i; - } -} - -/* -- Base library: conversions ------------------------------------------- */ - -LJLIB_ASM(tonumber) LJLIB_REC(.) -{ - int32_t base = lj_lib_optint(L, 2, 10); - if (base == 10) { - TValue *o = lj_lib_checkany(L, 1); - if (lj_strscan_numberobj(o)) { - copyTV(L, L->base-1, o); - return FFH_RES(1); - } -#if LJ_HASFFI - if (tviscdata(o)) { - CTState *cts = ctype_cts(L); - CType *ct = lj_ctype_rawref(cts, cdataV(o)->ctypeid); - if (ctype_isenum(ct->info)) ct = ctype_child(cts, ct); - if (ctype_isnum(ct->info) || ctype_iscomplex(ct->info)) { - if (LJ_DUALNUM && ctype_isinteger_or_bool(ct->info) && - ct->size <= 4 && !(ct->size == 4 && (ct->info & CTF_UNSIGNED))) { - int32_t i; - lj_cconv_ct_tv(cts, ctype_get(cts, CTID_INT32), (uint8_t *)&i, o, 0); - setintV(L->base-1, i); - return FFH_RES(1); - } - lj_cconv_ct_tv(cts, ctype_get(cts, CTID_DOUBLE), - (uint8_t *)&(L->base-1)->n, o, 0); - return FFH_RES(1); - } - } -#endif - } else { - const char *p = strdata(lj_lib_checkstr(L, 1)); - char *ep; - unsigned long ul; - if (base < 2 || base > 36) - lj_err_arg(L, 2, LJ_ERR_BASERNG); - ul = strtoul(p, &ep, base); - if (p != ep) { - while (lj_char_isspace((unsigned char)(*ep))) ep++; - if (*ep == '\0') { - if (LJ_DUALNUM && LJ_LIKELY(ul < 0x80000000u)) - setintV(L->base-1, (int32_t)ul); - else - setnumV(L->base-1, (lua_Number)ul); - return FFH_RES(1); - } - } - } - setnilV(L->base-1); - return FFH_RES(1); -} - -LJLIB_PUSH("nil") -LJLIB_PUSH("false") -LJLIB_PUSH("true") -LJLIB_ASM(tostring) LJLIB_REC(.) -{ - TValue *o = lj_lib_checkany(L, 1); - cTValue *mo; - L->top = o+1; /* Only keep one argument. */ - if (!tvisnil(mo = lj_meta_lookup(L, o, MM_tostring))) { - copyTV(L, L->base-1, mo); /* Replace callable. */ - return FFH_TAILCALL; - } else { - GCstr *s; - if (tvisnumber(o)) { - s = lj_str_fromnumber(L, o); - } else if (tvispri(o)) { - s = strV(lj_lib_upvalue(L, -(int32_t)itype(o))); - } else { - if (tvisfunc(o) && isffunc(funcV(o))) - lua_pushfstring(L, "function: builtin#%d", funcV(o)->c.ffid); - else - lua_pushfstring(L, "%s: %p", lj_typename(o), lua_topointer(L, 1)); - /* Note: lua_pushfstring calls the GC which may invalidate o. */ - s = strV(L->top-1); - } - setstrV(L, L->base-1, s); - return FFH_RES(1); - } -} - -/* -- Base library: throw and catch errors -------------------------------- */ - -LJLIB_CF(error) -{ - int32_t level = lj_lib_optint(L, 2, 1); - lua_settop(L, 1); - if (lua_isstring(L, 1) && level > 0) { - luaL_where(L, level); - lua_pushvalue(L, 1); - lua_concat(L, 2); - } - return lua_error(L); -} - -LJLIB_ASM(pcall) LJLIB_REC(.) -{ - lj_lib_checkany(L, 1); - lj_lib_checkfunc(L, 2); /* For xpcall only. */ - return FFH_UNREACHABLE; -} -LJLIB_ASM_(xpcall) LJLIB_REC(.) - -/* -- Base library: load Lua code ----------------------------------------- */ - -static int load_aux(lua_State *L, int status, int envarg) -{ - if (status == 0) { - if (tvistab(L->base+envarg-1)) { - GCfunc *fn = funcV(L->top-1); - GCtab *t = tabV(L->base+envarg-1); - setgcref(fn->c.env, obj2gco(t)); - lj_gc_objbarrier(L, fn, t); - } - return 1; - } else { - setnilV(L->top-2); - return 2; - } -} - -LJLIB_CF(loadfile) -{ - GCstr *fname = lj_lib_optstr(L, 1); - GCstr *mode = lj_lib_optstr(L, 2); - int status; - lua_settop(L, 3); /* Ensure env arg exists. */ - status = luaL_loadfilex(L, fname ? strdata(fname) : NULL, - mode ? strdata(mode) : NULL); - return load_aux(L, status, 3); -} - -static const char *reader_func(lua_State *L, void *ud, size_t *size) -{ - UNUSED(ud); - luaL_checkstack(L, 2, "too many nested functions"); - copyTV(L, L->top++, L->base); - lua_call(L, 0, 1); /* Call user-supplied function. */ - L->top--; - if (tvisnil(L->top)) { - *size = 0; - return NULL; - } else if (tvisstr(L->top) || tvisnumber(L->top)) { - copyTV(L, L->base+4, L->top); /* Anchor string in reserved stack slot. */ - return lua_tolstring(L, 5, size); - } else { - lj_err_caller(L, LJ_ERR_RDRSTR); - return NULL; - } -} - -LJLIB_CF(load) -{ - GCstr *name = lj_lib_optstr(L, 2); - GCstr *mode = lj_lib_optstr(L, 3); - int status; - if (L->base < L->top && (tvisstr(L->base) || tvisnumber(L->base))) { - GCstr *s = lj_lib_checkstr(L, 1); - lua_settop(L, 4); /* Ensure env arg exists. */ - status = luaL_loadbufferx(L, strdata(s), s->len, strdata(name ? name : s), - mode ? strdata(mode) : NULL); - } else { - lj_lib_checkfunc(L, 1); - lua_settop(L, 5); /* Reserve a slot for the string from the reader. */ - status = lua_loadx(L, reader_func, NULL, name ? strdata(name) : "=(load)", - mode ? strdata(mode) : NULL); - } - return load_aux(L, status, 4); -} - -LJLIB_CF(loadstring) -{ - return lj_cf_load(L); -} - -LJLIB_CF(dofile) -{ - GCstr *fname = lj_lib_optstr(L, 1); - setnilV(L->top); - L->top = L->base+1; - if (luaL_loadfile(L, fname ? strdata(fname) : NULL) != 0) - lua_error(L); - lua_call(L, 0, LUA_MULTRET); - return (int)(L->top - L->base) - 1; -} - -/* -- Base library: GC control -------------------------------------------- */ - -LJLIB_CF(gcinfo) -{ - setintV(L->top++, (G(L)->gc.total >> 10)); - return 1; -} - -LJLIB_CF(collectgarbage) -{ - int opt = lj_lib_checkopt(L, 1, LUA_GCCOLLECT, /* ORDER LUA_GC* */ - "\4stop\7restart\7collect\5count\1\377\4step\10setpause\12setstepmul"); - int32_t data = lj_lib_optint(L, 2, 0); - if (opt == LUA_GCCOUNT) { - setnumV(L->top, (lua_Number)G(L)->gc.total/1024.0); - } else { - int res = lua_gc(L, opt, data); - if (opt == LUA_GCSTEP) - setboolV(L->top, res); - else - setintV(L->top, res); - } - L->top++; - return 1; -} - -/* -- Base library: miscellaneous functions ------------------------------- */ - -LJLIB_PUSH(top-2) /* Upvalue holds weak table. */ -LJLIB_CF(newproxy) -{ - lua_settop(L, 1); - lua_newuserdata(L, 0); - if (lua_toboolean(L, 1) == 0) { /* newproxy(): without metatable. */ - return 1; - } else if (lua_isboolean(L, 1)) { /* newproxy(true): with metatable. */ - lua_newtable(L); - lua_pushvalue(L, -1); - lua_pushboolean(L, 1); - lua_rawset(L, lua_upvalueindex(1)); /* Remember mt in weak table. */ - } else { /* newproxy(proxy): inherit metatable. */ - int validproxy = 0; - if (lua_getmetatable(L, 1)) { - lua_rawget(L, lua_upvalueindex(1)); - validproxy = lua_toboolean(L, -1); - lua_pop(L, 1); - } - if (!validproxy) - lj_err_arg(L, 1, LJ_ERR_NOPROXY); - lua_getmetatable(L, 1); - } - lua_setmetatable(L, 2); - return 1; -} - -LJLIB_PUSH("tostring") -LJLIB_CF(print) -{ - ptrdiff_t i, nargs = L->top - L->base; - cTValue *tv = lj_tab_getstr(tabref(L->env), strV(lj_lib_upvalue(L, 1))); - int shortcut; - if (tv && !tvisnil(tv)) { - copyTV(L, L->top++, tv); - } else { - setstrV(L, L->top++, strV(lj_lib_upvalue(L, 1))); - lua_gettable(L, LUA_GLOBALSINDEX); - tv = L->top-1; - } - shortcut = (tvisfunc(tv) && funcV(tv)->c.ffid == FF_tostring); - for (i = 0; i < nargs; i++) { - const char *str; - size_t size; - cTValue *o = &L->base[i]; - if (shortcut && tvisstr(o)) { - str = strVdata(o); - size = strV(o)->len; - } else if (shortcut && tvisint(o)) { - char buf[LJ_STR_INTBUF]; - char *p = lj_str_bufint(buf, intV(o)); - size = (size_t)(buf+LJ_STR_INTBUF-p); - str = p; - } else if (shortcut && tvisnum(o)) { - char buf[LJ_STR_NUMBUF]; - size = lj_str_bufnum(buf, o); - str = buf; - } else { - copyTV(L, L->top+1, o); - copyTV(L, L->top, L->top-1); - L->top += 2; - lua_call(L, 1, 1); - str = lua_tolstring(L, -1, &size); - if (!str) - lj_err_caller(L, LJ_ERR_PRTOSTR); - L->top--; - } - if (i) - putchar('\t'); - fwrite(str, 1, size, stdout); - } - putchar('\n'); - return 0; -} - -LJLIB_PUSH(top-3) -LJLIB_SET(_VERSION) - -#include "lj_libdef.h" - -/* -- Coroutine library --------------------------------------------------- */ - -#define LJLIB_MODULE_coroutine - -LJLIB_CF(coroutine_status) -{ - const char *s; - lua_State *co; - if (!(L->top > L->base && tvisthread(L->base))) - lj_err_arg(L, 1, LJ_ERR_NOCORO); - co = threadV(L->base); - if (co == L) s = "running"; - else if (co->status == LUA_YIELD) s = "suspended"; - else if (co->status != 0) s = "dead"; - else if (co->base > tvref(co->stack)+1) s = "normal"; - else if (co->top == co->base) s = "dead"; - else s = "suspended"; - lua_pushstring(L, s); - return 1; -} - -LJLIB_CF(coroutine_running) -{ -#if LJ_52 - int ismain = lua_pushthread(L); - setboolV(L->top++, ismain); - return 2; -#else - if (lua_pushthread(L)) - setnilV(L->top++); - return 1; -#endif -} - -LJLIB_CF(coroutine_create) -{ - lua_State *L1; - if (!(L->base < L->top && tvisfunc(L->base))) - lj_err_argt(L, 1, LUA_TFUNCTION); - L1 = lua_newthread(L); - setfuncV(L, L1->top++, funcV(L->base)); - return 1; -} - -LJLIB_ASM(coroutine_yield) -{ - lj_err_caller(L, LJ_ERR_CYIELD); - return FFH_UNREACHABLE; -} - -static int ffh_resume(lua_State *L, lua_State *co, int wrap) -{ - if (co->cframe != NULL || co->status > LUA_YIELD || - (co->status == 0 && co->top == co->base)) { - ErrMsg em = co->cframe ? LJ_ERR_CORUN : LJ_ERR_CODEAD; - if (wrap) lj_err_caller(L, em); - setboolV(L->base-1, 0); - setstrV(L, L->base, lj_err_str(L, em)); - return FFH_RES(2); - } - lj_state_growstack(co, (MSize)(L->top - L->base)); - return FFH_RETRY; -} - -LJLIB_ASM(coroutine_resume) -{ - if (!(L->top > L->base && tvisthread(L->base))) - lj_err_arg(L, 1, LJ_ERR_NOCORO); - return ffh_resume(L, threadV(L->base), 0); -} - -LJLIB_NOREG LJLIB_ASM(coroutine_wrap_aux) -{ - return ffh_resume(L, threadV(lj_lib_upvalue(L, 1)), 1); -} - -/* Inline declarations. */ -LJ_ASMF void lj_ff_coroutine_wrap_aux(void); -#if !(LJ_TARGET_MIPS && defined(ljamalg_c)) -LJ_FUNCA_NORET void LJ_FASTCALL lj_ffh_coroutine_wrap_err(lua_State *L, - lua_State *co); -#endif - -/* Error handler, called from assembler VM. */ -void LJ_FASTCALL lj_ffh_coroutine_wrap_err(lua_State *L, lua_State *co) -{ - co->top--; copyTV(L, L->top, co->top); L->top++; - if (tvisstr(L->top-1)) - lj_err_callermsg(L, strVdata(L->top-1)); - else - lj_err_run(L); -} - -/* Forward declaration. */ -static void setpc_wrap_aux(lua_State *L, GCfunc *fn); - -LJLIB_CF(coroutine_wrap) -{ - lj_cf_coroutine_create(L); - lj_lib_pushcc(L, lj_ffh_coroutine_wrap_aux, FF_coroutine_wrap_aux, 1); - setpc_wrap_aux(L, funcV(L->top-1)); - return 1; -} - -#include "lj_libdef.h" - -/* Fix the PC of wrap_aux. Really ugly workaround. */ -static void setpc_wrap_aux(lua_State *L, GCfunc *fn) -{ - setmref(fn->c.pc, &L2GG(L)->bcff[lj_lib_init_coroutine[1]+2]); -} - -/* ------------------------------------------------------------------------ */ - -static void newproxy_weaktable(lua_State *L) -{ - /* NOBARRIER: The table is new (marked white). */ - GCtab *t = lj_tab_new(L, 0, 1); - settabV(L, L->top++, t); - setgcref(t->metatable, obj2gco(t)); - setstrV(L, lj_tab_setstr(L, t, lj_str_newlit(L, "__mode")), - lj_str_newlit(L, "kv")); - t->nomm = (uint8_t)(~(1u<env); - settabV(L, lj_tab_setstr(L, env, lj_str_newlit(L, "_G")), env); - lua_pushliteral(L, LUA_VERSION); /* top-3. */ - newproxy_weaktable(L); /* top-2. */ - LJ_LIB_REG(L, "_G", base); - LJ_LIB_REG(L, LUA_COLIBNAME, coroutine); - return 2; -} - diff --git a/deps/luajit/src/lib_bit.c b/deps/luajit/src/lib_bit.c deleted file mode 100644 index 583e04b0..00000000 --- a/deps/luajit/src/lib_bit.c +++ /dev/null @@ -1,74 +0,0 @@ -/* -** Bit manipulation library. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#define lib_bit_c -#define LUA_LIB - -#include "lua.h" -#include "lauxlib.h" -#include "lualib.h" - -#include "lj_obj.h" -#include "lj_err.h" -#include "lj_str.h" -#include "lj_lib.h" - -/* ------------------------------------------------------------------------ */ - -#define LJLIB_MODULE_bit - -LJLIB_ASM(bit_tobit) LJLIB_REC(bit_unary IR_TOBIT) -{ - lj_lib_checknumber(L, 1); - return FFH_RETRY; -} -LJLIB_ASM_(bit_bnot) LJLIB_REC(bit_unary IR_BNOT) -LJLIB_ASM_(bit_bswap) LJLIB_REC(bit_unary IR_BSWAP) - -LJLIB_ASM(bit_lshift) LJLIB_REC(bit_shift IR_BSHL) -{ - lj_lib_checknumber(L, 1); - lj_lib_checkbit(L, 2); - return FFH_RETRY; -} -LJLIB_ASM_(bit_rshift) LJLIB_REC(bit_shift IR_BSHR) -LJLIB_ASM_(bit_arshift) LJLIB_REC(bit_shift IR_BSAR) -LJLIB_ASM_(bit_rol) LJLIB_REC(bit_shift IR_BROL) -LJLIB_ASM_(bit_ror) LJLIB_REC(bit_shift IR_BROR) - -LJLIB_ASM(bit_band) LJLIB_REC(bit_nary IR_BAND) -{ - int i = 0; - do { lj_lib_checknumber(L, ++i); } while (L->base+i < L->top); - return FFH_RETRY; -} -LJLIB_ASM_(bit_bor) LJLIB_REC(bit_nary IR_BOR) -LJLIB_ASM_(bit_bxor) LJLIB_REC(bit_nary IR_BXOR) - -/* ------------------------------------------------------------------------ */ - -LJLIB_CF(bit_tohex) -{ - uint32_t b = (uint32_t)lj_lib_checkbit(L, 1); - int32_t i, n = L->base+1 >= L->top ? 8 : lj_lib_checkbit(L, 2); - const char *hexdigits = "0123456789abcdef"; - char buf[8]; - if (n < 0) { n = -n; hexdigits = "0123456789ABCDEF"; } - if (n > 8) n = 8; - for (i = n; --i >= 0; ) { buf[i] = hexdigits[b & 15]; b >>= 4; } - lua_pushlstring(L, buf, (size_t)n); - return 1; -} - -/* ------------------------------------------------------------------------ */ - -#include "lj_libdef.h" - -LUALIB_API int luaopen_bit(lua_State *L) -{ - LJ_LIB_REG(L, LUA_BITLIBNAME, bit); - return 1; -} - diff --git a/deps/luajit/src/lib_debug.c b/deps/luajit/src/lib_debug.c deleted file mode 100644 index e87c35cf..00000000 --- a/deps/luajit/src/lib_debug.c +++ /dev/null @@ -1,405 +0,0 @@ -/* -** Debug library. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -** -** Major portions taken verbatim or adapted from the Lua interpreter. -** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h -*/ - -#define lib_debug_c -#define LUA_LIB - -#include "lua.h" -#include "lauxlib.h" -#include "lualib.h" - -#include "lj_obj.h" -#include "lj_gc.h" -#include "lj_err.h" -#include "lj_debug.h" -#include "lj_lib.h" - -/* ------------------------------------------------------------------------ */ - -#define LJLIB_MODULE_debug - -LJLIB_CF(debug_getregistry) -{ - copyTV(L, L->top++, registry(L)); - return 1; -} - -LJLIB_CF(debug_getmetatable) -{ - lj_lib_checkany(L, 1); - if (!lua_getmetatable(L, 1)) { - setnilV(L->top-1); - } - return 1; -} - -LJLIB_CF(debug_setmetatable) -{ - lj_lib_checktabornil(L, 2); - L->top = L->base+2; - lua_setmetatable(L, 1); -#if !LJ_52 - setboolV(L->top-1, 1); -#endif - return 1; -} - -LJLIB_CF(debug_getfenv) -{ - lj_lib_checkany(L, 1); - lua_getfenv(L, 1); - return 1; -} - -LJLIB_CF(debug_setfenv) -{ - lj_lib_checktab(L, 2); - L->top = L->base+2; - if (!lua_setfenv(L, 1)) - lj_err_caller(L, LJ_ERR_SETFENV); - return 1; -} - -/* ------------------------------------------------------------------------ */ - -static void settabss(lua_State *L, const char *i, const char *v) -{ - lua_pushstring(L, v); - lua_setfield(L, -2, i); -} - -static void settabsi(lua_State *L, const char *i, int v) -{ - lua_pushinteger(L, v); - lua_setfield(L, -2, i); -} - -static void settabsb(lua_State *L, const char *i, int v) -{ - lua_pushboolean(L, v); - lua_setfield(L, -2, i); -} - -static lua_State *getthread(lua_State *L, int *arg) -{ - if (L->base < L->top && tvisthread(L->base)) { - *arg = 1; - return threadV(L->base); - } else { - *arg = 0; - return L; - } -} - -static void treatstackoption(lua_State *L, lua_State *L1, const char *fname) -{ - if (L == L1) { - lua_pushvalue(L, -2); - lua_remove(L, -3); - } - else - lua_xmove(L1, L, 1); - lua_setfield(L, -2, fname); -} - -LJLIB_CF(debug_getinfo) -{ - lj_Debug ar; - int arg, opt_f = 0, opt_L = 0; - lua_State *L1 = getthread(L, &arg); - const char *options = luaL_optstring(L, arg+2, "flnSu"); - if (lua_isnumber(L, arg+1)) { - if (!lua_getstack(L1, (int)lua_tointeger(L, arg+1), (lua_Debug *)&ar)) { - setnilV(L->top-1); - return 1; - } - } else if (L->base+arg < L->top && tvisfunc(L->base+arg)) { - options = lua_pushfstring(L, ">%s", options); - setfuncV(L1, L1->top++, funcV(L->base+arg)); - } else { - lj_err_arg(L, arg+1, LJ_ERR_NOFUNCL); - } - if (!lj_debug_getinfo(L1, options, &ar, 1)) - lj_err_arg(L, arg+2, LJ_ERR_INVOPT); - lua_createtable(L, 0, 16); /* Create result table. */ - for (; *options; options++) { - switch (*options) { - case 'S': - settabss(L, "source", ar.source); - settabss(L, "short_src", ar.short_src); - settabsi(L, "linedefined", ar.linedefined); - settabsi(L, "lastlinedefined", ar.lastlinedefined); - settabss(L, "what", ar.what); - break; - case 'l': - settabsi(L, "currentline", ar.currentline); - break; - case 'u': - settabsi(L, "nups", ar.nups); - settabsi(L, "nparams", ar.nparams); - settabsb(L, "isvararg", ar.isvararg); - break; - case 'n': - settabss(L, "name", ar.name); - settabss(L, "namewhat", ar.namewhat); - break; - case 'f': opt_f = 1; break; - case 'L': opt_L = 1; break; - default: break; - } - } - if (opt_L) treatstackoption(L, L1, "activelines"); - if (opt_f) treatstackoption(L, L1, "func"); - return 1; /* Return result table. */ -} - -LJLIB_CF(debug_getlocal) -{ - int arg; - lua_State *L1 = getthread(L, &arg); - lua_Debug ar; - const char *name; - int slot = lj_lib_checkint(L, arg+2); - if (tvisfunc(L->base+arg)) { - L->top = L->base+arg+1; - lua_pushstring(L, lua_getlocal(L, NULL, slot)); - return 1; - } - if (!lua_getstack(L1, lj_lib_checkint(L, arg+1), &ar)) - lj_err_arg(L, arg+1, LJ_ERR_LVLRNG); - name = lua_getlocal(L1, &ar, slot); - if (name) { - lua_xmove(L1, L, 1); - lua_pushstring(L, name); - lua_pushvalue(L, -2); - return 2; - } else { - setnilV(L->top-1); - return 1; - } -} - -LJLIB_CF(debug_setlocal) -{ - int arg; - lua_State *L1 = getthread(L, &arg); - lua_Debug ar; - TValue *tv; - if (!lua_getstack(L1, lj_lib_checkint(L, arg+1), &ar)) - lj_err_arg(L, arg+1, LJ_ERR_LVLRNG); - tv = lj_lib_checkany(L, arg+3); - copyTV(L1, L1->top++, tv); - lua_pushstring(L, lua_setlocal(L1, &ar, lj_lib_checkint(L, arg+2))); - return 1; -} - -static int debug_getupvalue(lua_State *L, int get) -{ - int32_t n = lj_lib_checkint(L, 2); - const char *name; - lj_lib_checkfunc(L, 1); - name = get ? lua_getupvalue(L, 1, n) : lua_setupvalue(L, 1, n); - if (name) { - lua_pushstring(L, name); - if (!get) return 1; - copyTV(L, L->top, L->top-2); - L->top++; - return 2; - } - return 0; -} - -LJLIB_CF(debug_getupvalue) -{ - return debug_getupvalue(L, 1); -} - -LJLIB_CF(debug_setupvalue) -{ - lj_lib_checkany(L, 3); - return debug_getupvalue(L, 0); -} - -LJLIB_CF(debug_upvalueid) -{ - GCfunc *fn = lj_lib_checkfunc(L, 1); - int32_t n = lj_lib_checkint(L, 2) - 1; - if ((uint32_t)n >= fn->l.nupvalues) - lj_err_arg(L, 2, LJ_ERR_IDXRNG); - setlightudV(L->top-1, isluafunc(fn) ? (void *)gcref(fn->l.uvptr[n]) : - (void *)&fn->c.upvalue[n]); - return 1; -} - -LJLIB_CF(debug_upvaluejoin) -{ - GCfunc *fn[2]; - GCRef *p[2]; - int i; - for (i = 0; i < 2; i++) { - int32_t n; - fn[i] = lj_lib_checkfunc(L, 2*i+1); - if (!isluafunc(fn[i])) - lj_err_arg(L, 2*i+1, LJ_ERR_NOLFUNC); - n = lj_lib_checkint(L, 2*i+2) - 1; - if ((uint32_t)n >= fn[i]->l.nupvalues) - lj_err_arg(L, 2*i+2, LJ_ERR_IDXRNG); - p[i] = &fn[i]->l.uvptr[n]; - } - setgcrefr(*p[0], *p[1]); - lj_gc_objbarrier(L, fn[0], gcref(*p[1])); - return 0; -} - -#if LJ_52 -LJLIB_CF(debug_getuservalue) -{ - TValue *o = L->base; - if (o < L->top && tvisudata(o)) - settabV(L, o, tabref(udataV(o)->env)); - else - setnilV(o); - L->top = o+1; - return 1; -} - -LJLIB_CF(debug_setuservalue) -{ - TValue *o = L->base; - if (!(o < L->top && tvisudata(o))) - lj_err_argt(L, 1, LUA_TUSERDATA); - if (!(o+1 < L->top && tvistab(o+1))) - lj_err_argt(L, 2, LUA_TTABLE); - L->top = o+2; - lua_setfenv(L, 1); - return 1; -} -#endif - -/* ------------------------------------------------------------------------ */ - -static const char KEY_HOOK = 'h'; - -static void hookf(lua_State *L, lua_Debug *ar) -{ - static const char *const hooknames[] = - {"call", "return", "line", "count", "tail return"}; - lua_pushlightuserdata(L, (void *)&KEY_HOOK); - lua_rawget(L, LUA_REGISTRYINDEX); - if (lua_isfunction(L, -1)) { - lua_pushstring(L, hooknames[(int)ar->event]); - if (ar->currentline >= 0) - lua_pushinteger(L, ar->currentline); - else lua_pushnil(L); - lua_call(L, 2, 0); - } -} - -static int makemask(const char *smask, int count) -{ - int mask = 0; - if (strchr(smask, 'c')) mask |= LUA_MASKCALL; - if (strchr(smask, 'r')) mask |= LUA_MASKRET; - if (strchr(smask, 'l')) mask |= LUA_MASKLINE; - if (count > 0) mask |= LUA_MASKCOUNT; - return mask; -} - -static char *unmakemask(int mask, char *smask) -{ - int i = 0; - if (mask & LUA_MASKCALL) smask[i++] = 'c'; - if (mask & LUA_MASKRET) smask[i++] = 'r'; - if (mask & LUA_MASKLINE) smask[i++] = 'l'; - smask[i] = '\0'; - return smask; -} - -LJLIB_CF(debug_sethook) -{ - int arg, mask, count; - lua_Hook func; - (void)getthread(L, &arg); - if (lua_isnoneornil(L, arg+1)) { - lua_settop(L, arg+1); - func = NULL; mask = 0; count = 0; /* turn off hooks */ - } else { - const char *smask = luaL_checkstring(L, arg+2); - luaL_checktype(L, arg+1, LUA_TFUNCTION); - count = luaL_optint(L, arg+3, 0); - func = hookf; mask = makemask(smask, count); - } - lua_pushlightuserdata(L, (void *)&KEY_HOOK); - lua_pushvalue(L, arg+1); - lua_rawset(L, LUA_REGISTRYINDEX); - lua_sethook(L, func, mask, count); - return 0; -} - -LJLIB_CF(debug_gethook) -{ - char buff[5]; - int mask = lua_gethookmask(L); - lua_Hook hook = lua_gethook(L); - if (hook != NULL && hook != hookf) { /* external hook? */ - lua_pushliteral(L, "external hook"); - } else { - lua_pushlightuserdata(L, (void *)&KEY_HOOK); - lua_rawget(L, LUA_REGISTRYINDEX); /* get hook */ - } - lua_pushstring(L, unmakemask(mask, buff)); - lua_pushinteger(L, lua_gethookcount(L)); - return 3; -} - -/* ------------------------------------------------------------------------ */ - -LJLIB_CF(debug_debug) -{ - for (;;) { - char buffer[250]; - fputs("lua_debug> ", stderr); - if (fgets(buffer, sizeof(buffer), stdin) == 0 || - strcmp(buffer, "cont\n") == 0) - return 0; - if (luaL_loadbuffer(L, buffer, strlen(buffer), "=(debug command)") || - lua_pcall(L, 0, 0, 0)) { - fputs(lua_tostring(L, -1), stderr); - fputs("\n", stderr); - } - lua_settop(L, 0); /* remove eventual returns */ - } -} - -/* ------------------------------------------------------------------------ */ - -#define LEVELS1 12 /* size of the first part of the stack */ -#define LEVELS2 10 /* size of the second part of the stack */ - -LJLIB_CF(debug_traceback) -{ - int arg; - lua_State *L1 = getthread(L, &arg); - const char *msg = lua_tostring(L, arg+1); - if (msg == NULL && L->top > L->base+arg) - L->top = L->base+arg+1; - else - luaL_traceback(L, L1, msg, lj_lib_optint(L, arg+2, (L == L1))); - return 1; -} - -/* ------------------------------------------------------------------------ */ - -#include "lj_libdef.h" - -LUALIB_API int luaopen_debug(lua_State *L) -{ - LJ_LIB_REG(L, LUA_DBLIBNAME, debug); - return 1; -} - diff --git a/deps/luajit/src/lib_ffi.c b/deps/luajit/src/lib_ffi.c deleted file mode 100644 index f6df39d6..00000000 --- a/deps/luajit/src/lib_ffi.c +++ /dev/null @@ -1,851 +0,0 @@ -/* -** FFI library. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#define lib_ffi_c -#define LUA_LIB - -#include - -#include "lua.h" -#include "lauxlib.h" -#include "lualib.h" - -#include "lj_obj.h" - -#if LJ_HASFFI - -#include "lj_gc.h" -#include "lj_err.h" -#include "lj_str.h" -#include "lj_tab.h" -#include "lj_meta.h" -#include "lj_ctype.h" -#include "lj_cparse.h" -#include "lj_cdata.h" -#include "lj_cconv.h" -#include "lj_carith.h" -#include "lj_ccall.h" -#include "lj_ccallback.h" -#include "lj_clib.h" -#include "lj_ff.h" -#include "lj_lib.h" - -/* -- C type checks ------------------------------------------------------- */ - -/* Check first argument for a C type and returns its ID. */ -static CTypeID ffi_checkctype(lua_State *L, CTState *cts, TValue *param) -{ - TValue *o = L->base; - if (!(o < L->top)) { - err_argtype: - lj_err_argtype(L, 1, "C type"); - } - if (tvisstr(o)) { /* Parse an abstract C type declaration. */ - GCstr *s = strV(o); - CPState cp; - int errcode; - cp.L = L; - cp.cts = cts; - cp.srcname = strdata(s); - cp.p = strdata(s); - cp.param = param; - cp.mode = CPARSE_MODE_ABSTRACT|CPARSE_MODE_NOIMPLICIT; - errcode = lj_cparse(&cp); - if (errcode) lj_err_throw(L, errcode); /* Propagate errors. */ - return cp.val.id; - } else { - GCcdata *cd; - if (!tviscdata(o)) goto err_argtype; - if (param && param < L->top) lj_err_arg(L, 1, LJ_ERR_FFI_NUMPARAM); - cd = cdataV(o); - return cd->ctypeid == CTID_CTYPEID ? *(CTypeID *)cdataptr(cd) : cd->ctypeid; - } -} - -/* Check argument for C data and return it. */ -static GCcdata *ffi_checkcdata(lua_State *L, int narg) -{ - TValue *o = L->base + narg-1; - if (!(o < L->top && tviscdata(o))) - lj_err_argt(L, narg, LUA_TCDATA); - return cdataV(o); -} - -/* Convert argument to C pointer. */ -static void *ffi_checkptr(lua_State *L, int narg, CTypeID id) -{ - CTState *cts = ctype_cts(L); - TValue *o = L->base + narg-1; - void *p; - if (o >= L->top) - lj_err_arg(L, narg, LJ_ERR_NOVAL); - lj_cconv_ct_tv(cts, ctype_get(cts, id), (uint8_t *)&p, o, CCF_ARG(narg)); - return p; -} - -/* Convert argument to int32_t. */ -static int32_t ffi_checkint(lua_State *L, int narg) -{ - CTState *cts = ctype_cts(L); - TValue *o = L->base + narg-1; - int32_t i; - if (o >= L->top) - lj_err_arg(L, narg, LJ_ERR_NOVAL); - lj_cconv_ct_tv(cts, ctype_get(cts, CTID_INT32), (uint8_t *)&i, o, - CCF_ARG(narg)); - return i; -} - -/* -- C type metamethods -------------------------------------------------- */ - -#define LJLIB_MODULE_ffi_meta - -/* Handle ctype __index/__newindex metamethods. */ -static int ffi_index_meta(lua_State *L, CTState *cts, CType *ct, MMS mm) -{ - CTypeID id = ctype_typeid(cts, ct); - cTValue *tv = lj_ctype_meta(cts, id, mm); - TValue *base = L->base; - if (!tv) { - const char *s; - err_index: - s = strdata(lj_ctype_repr(L, id, NULL)); - if (tvisstr(L->base+1)) { - lj_err_callerv(L, LJ_ERR_FFI_BADMEMBER, s, strVdata(L->base+1)); - } else { - const char *key = tviscdata(L->base+1) ? - strdata(lj_ctype_repr(L, cdataV(L->base+1)->ctypeid, NULL)) : - lj_typename(L->base+1); - lj_err_callerv(L, LJ_ERR_FFI_BADIDXW, s, key); - } - } - if (!tvisfunc(tv)) { - if (mm == MM_index) { - cTValue *o = lj_meta_tget(L, tv, base+1); - if (o) { - if (tvisnil(o)) goto err_index; - copyTV(L, L->top-1, o); - return 1; - } - } else { - TValue *o = lj_meta_tset(L, tv, base+1); - if (o) { - copyTV(L, o, base+2); - return 0; - } - } - copyTV(L, base, L->top); - tv = L->top-1; - } - return lj_meta_tailcall(L, tv); -} - -LJLIB_CF(ffi_meta___index) LJLIB_REC(cdata_index 0) -{ - CTState *cts = ctype_cts(L); - CTInfo qual = 0; - CType *ct; - uint8_t *p; - TValue *o = L->base; - if (!(o+1 < L->top && tviscdata(o))) /* Also checks for presence of key. */ - lj_err_argt(L, 1, LUA_TCDATA); - ct = lj_cdata_index(cts, cdataV(o), o+1, &p, &qual); - if ((qual & 1)) - return ffi_index_meta(L, cts, ct, MM_index); - if (lj_cdata_get(cts, ct, L->top-1, p)) - lj_gc_check(L); - return 1; -} - -LJLIB_CF(ffi_meta___newindex) LJLIB_REC(cdata_index 1) -{ - CTState *cts = ctype_cts(L); - CTInfo qual = 0; - CType *ct; - uint8_t *p; - TValue *o = L->base; - if (!(o+2 < L->top && tviscdata(o))) /* Also checks for key and value. */ - lj_err_argt(L, 1, LUA_TCDATA); - ct = lj_cdata_index(cts, cdataV(o), o+1, &p, &qual); - if ((qual & 1)) { - if ((qual & CTF_CONST)) - lj_err_caller(L, LJ_ERR_FFI_WRCONST); - return ffi_index_meta(L, cts, ct, MM_newindex); - } - lj_cdata_set(cts, ct, p, o+2, qual); - return 0; -} - -/* Common handler for cdata arithmetic. */ -static int ffi_arith(lua_State *L) -{ - MMS mm = (MMS)(curr_func(L)->c.ffid - (int)FF_ffi_meta___eq + (int)MM_eq); - return lj_carith_op(L, mm); -} - -/* The following functions must be in contiguous ORDER MM. */ -LJLIB_CF(ffi_meta___eq) LJLIB_REC(cdata_arith MM_eq) -{ - return ffi_arith(L); -} - -LJLIB_CF(ffi_meta___len) LJLIB_REC(cdata_arith MM_len) -{ - return ffi_arith(L); -} - -LJLIB_CF(ffi_meta___lt) LJLIB_REC(cdata_arith MM_lt) -{ - return ffi_arith(L); -} - -LJLIB_CF(ffi_meta___le) LJLIB_REC(cdata_arith MM_le) -{ - return ffi_arith(L); -} - -LJLIB_CF(ffi_meta___concat) LJLIB_REC(cdata_arith MM_concat) -{ - return ffi_arith(L); -} - -/* Forward declaration. */ -static int lj_cf_ffi_new(lua_State *L); - -LJLIB_CF(ffi_meta___call) LJLIB_REC(cdata_call) -{ - CTState *cts = ctype_cts(L); - GCcdata *cd = ffi_checkcdata(L, 1); - CTypeID id = cd->ctypeid; - CType *ct; - cTValue *tv; - MMS mm = MM_call; - if (cd->ctypeid == CTID_CTYPEID) { - id = *(CTypeID *)cdataptr(cd); - mm = MM_new; - } else { - int ret = lj_ccall_func(L, cd); - if (ret >= 0) - return ret; - } - /* Handle ctype __call/__new metamethod. */ - ct = ctype_raw(cts, id); - if (ctype_isptr(ct->info)) id = ctype_cid(ct->info); - tv = lj_ctype_meta(cts, id, mm); - if (tv) - return lj_meta_tailcall(L, tv); - else if (mm == MM_call) - lj_err_callerv(L, LJ_ERR_FFI_BADCALL, strdata(lj_ctype_repr(L, id, NULL))); - return lj_cf_ffi_new(L); -} - -LJLIB_CF(ffi_meta___add) LJLIB_REC(cdata_arith MM_add) -{ - return ffi_arith(L); -} - -LJLIB_CF(ffi_meta___sub) LJLIB_REC(cdata_arith MM_sub) -{ - return ffi_arith(L); -} - -LJLIB_CF(ffi_meta___mul) LJLIB_REC(cdata_arith MM_mul) -{ - return ffi_arith(L); -} - -LJLIB_CF(ffi_meta___div) LJLIB_REC(cdata_arith MM_div) -{ - return ffi_arith(L); -} - -LJLIB_CF(ffi_meta___mod) LJLIB_REC(cdata_arith MM_mod) -{ - return ffi_arith(L); -} - -LJLIB_CF(ffi_meta___pow) LJLIB_REC(cdata_arith MM_pow) -{ - return ffi_arith(L); -} - -LJLIB_CF(ffi_meta___unm) LJLIB_REC(cdata_arith MM_unm) -{ - return ffi_arith(L); -} -/* End of contiguous ORDER MM. */ - -LJLIB_CF(ffi_meta___tostring) -{ - GCcdata *cd = ffi_checkcdata(L, 1); - const char *msg = "cdata<%s>: %p"; - CTypeID id = cd->ctypeid; - void *p = cdataptr(cd); - if (id == CTID_CTYPEID) { - msg = "ctype<%s>"; - id = *(CTypeID *)p; - } else { - CTState *cts = ctype_cts(L); - CType *ct = ctype_raw(cts, id); - if (ctype_isref(ct->info)) { - p = *(void **)p; - ct = ctype_rawchild(cts, ct); - } - if (ctype_iscomplex(ct->info)) { - setstrV(L, L->top-1, lj_ctype_repr_complex(L, cdataptr(cd), ct->size)); - goto checkgc; - } else if (ct->size == 8 && ctype_isinteger(ct->info)) { - setstrV(L, L->top-1, lj_ctype_repr_int64(L, *(uint64_t *)cdataptr(cd), - (ct->info & CTF_UNSIGNED))); - goto checkgc; - } else if (ctype_isfunc(ct->info)) { - p = *(void **)p; - } else if (ctype_isenum(ct->info)) { - msg = "cdata<%s>: %d"; - p = (void *)(uintptr_t)*(uint32_t **)p; - } else { - if (ctype_isptr(ct->info)) { - p = cdata_getptr(p, ct->size); - ct = ctype_rawchild(cts, ct); - } - if (ctype_isstruct(ct->info) || ctype_isvector(ct->info)) { - /* Handle ctype __tostring metamethod. */ - cTValue *tv = lj_ctype_meta(cts, ctype_typeid(cts, ct), MM_tostring); - if (tv) - return lj_meta_tailcall(L, tv); - } - } - } - lj_str_pushf(L, msg, strdata(lj_ctype_repr(L, id, NULL)), p); -checkgc: - lj_gc_check(L); - return 1; -} - -static int ffi_pairs(lua_State *L, MMS mm) -{ - CTState *cts = ctype_cts(L); - CTypeID id = ffi_checkcdata(L, 1)->ctypeid; - CType *ct = ctype_raw(cts, id); - cTValue *tv; - if (ctype_isptr(ct->info)) id = ctype_cid(ct->info); - tv = lj_ctype_meta(cts, id, mm); - if (!tv) - lj_err_callerv(L, LJ_ERR_FFI_BADMM, strdata(lj_ctype_repr(L, id, NULL)), - strdata(mmname_str(G(L), mm))); - return lj_meta_tailcall(L, tv); -} - -LJLIB_CF(ffi_meta___pairs) -{ - return ffi_pairs(L, MM_pairs); -} - -LJLIB_CF(ffi_meta___ipairs) -{ - return ffi_pairs(L, MM_ipairs); -} - -LJLIB_PUSH("ffi") LJLIB_SET(__metatable) - -#include "lj_libdef.h" - -/* -- C library metamethods ----------------------------------------------- */ - -#define LJLIB_MODULE_ffi_clib - -/* Index C library by a name. */ -static TValue *ffi_clib_index(lua_State *L) -{ - TValue *o = L->base; - CLibrary *cl; - if (!(o < L->top && tvisudata(o) && udataV(o)->udtype == UDTYPE_FFI_CLIB)) - lj_err_argt(L, 1, LUA_TUSERDATA); - cl = (CLibrary *)uddata(udataV(o)); - if (!(o+1 < L->top && tvisstr(o+1))) - lj_err_argt(L, 2, LUA_TSTRING); - return lj_clib_index(L, cl, strV(o+1)); -} - -LJLIB_CF(ffi_clib___index) LJLIB_REC(clib_index 1) -{ - TValue *tv = ffi_clib_index(L); - if (tviscdata(tv)) { - CTState *cts = ctype_cts(L); - GCcdata *cd = cdataV(tv); - CType *s = ctype_get(cts, cd->ctypeid); - if (ctype_isextern(s->info)) { - CTypeID sid = ctype_cid(s->info); - void *sp = *(void **)cdataptr(cd); - CType *ct = ctype_raw(cts, sid); - if (lj_cconv_tv_ct(cts, ct, sid, L->top-1, sp)) - lj_gc_check(L); - return 1; - } - } - copyTV(L, L->top-1, tv); - return 1; -} - -LJLIB_CF(ffi_clib___newindex) LJLIB_REC(clib_index 0) -{ - TValue *tv = ffi_clib_index(L); - TValue *o = L->base+2; - if (o < L->top && tviscdata(tv)) { - CTState *cts = ctype_cts(L); - GCcdata *cd = cdataV(tv); - CType *d = ctype_get(cts, cd->ctypeid); - if (ctype_isextern(d->info)) { - CTInfo qual = 0; - for (;;) { /* Skip attributes and collect qualifiers. */ - d = ctype_child(cts, d); - if (!ctype_isattrib(d->info)) break; - if (ctype_attrib(d->info) == CTA_QUAL) qual |= d->size; - } - if (!((d->info|qual) & CTF_CONST)) { - lj_cconv_ct_tv(cts, d, *(void **)cdataptr(cd), o, 0); - return 0; - } - } - } - lj_err_caller(L, LJ_ERR_FFI_WRCONST); - return 0; /* unreachable */ -} - -LJLIB_CF(ffi_clib___gc) -{ - TValue *o = L->base; - if (o < L->top && tvisudata(o) && udataV(o)->udtype == UDTYPE_FFI_CLIB) - lj_clib_unload((CLibrary *)uddata(udataV(o))); - return 0; -} - -#include "lj_libdef.h" - -/* -- Callback function metamethods --------------------------------------- */ - -#define LJLIB_MODULE_ffi_callback - -static int ffi_callback_set(lua_State *L, GCfunc *fn) -{ - GCcdata *cd = ffi_checkcdata(L, 1); - CTState *cts = ctype_cts(L); - CType *ct = ctype_raw(cts, cd->ctypeid); - if (ctype_isptr(ct->info) && (LJ_32 || ct->size == 8)) { - MSize slot = lj_ccallback_ptr2slot(cts, *(void **)cdataptr(cd)); - if (slot < cts->cb.sizeid && cts->cb.cbid[slot] != 0) { - GCtab *t = cts->miscmap; - TValue *tv = lj_tab_setint(L, t, (int32_t)slot); - if (fn) { - setfuncV(L, tv, fn); - lj_gc_anybarriert(L, t); - } else { - setnilV(tv); - cts->cb.cbid[slot] = 0; - cts->cb.topid = slot < cts->cb.topid ? slot : cts->cb.topid; - } - return 0; - } - } - lj_err_caller(L, LJ_ERR_FFI_BADCBACK); - return 0; -} - -LJLIB_CF(ffi_callback_free) -{ - return ffi_callback_set(L, NULL); -} - -LJLIB_CF(ffi_callback_set) -{ - GCfunc *fn = lj_lib_checkfunc(L, 2); - return ffi_callback_set(L, fn); -} - -LJLIB_PUSH(top-1) LJLIB_SET(__index) - -#include "lj_libdef.h" - -/* -- FFI library functions ----------------------------------------------- */ - -#define LJLIB_MODULE_ffi - -LJLIB_CF(ffi_cdef) -{ - GCstr *s = lj_lib_checkstr(L, 1); - CPState cp; - int errcode; - cp.L = L; - cp.cts = ctype_cts(L); - cp.srcname = strdata(s); - cp.p = strdata(s); - cp.param = L->base+1; - cp.mode = CPARSE_MODE_MULTI|CPARSE_MODE_DIRECT; - errcode = lj_cparse(&cp); - if (errcode) lj_err_throw(L, errcode); /* Propagate errors. */ - lj_gc_check(L); - return 0; -} - -LJLIB_CF(ffi_new) LJLIB_REC(.) -{ - CTState *cts = ctype_cts(L); - CTypeID id = ffi_checkctype(L, cts, NULL); - CType *ct = ctype_raw(cts, id); - CTSize sz; - CTInfo info = lj_ctype_info(cts, id, &sz); - TValue *o = L->base+1; - GCcdata *cd; - if ((info & CTF_VLA)) { - o++; - sz = lj_ctype_vlsize(cts, ct, (CTSize)ffi_checkint(L, 2)); - } - if (sz == CTSIZE_INVALID) - lj_err_arg(L, 1, LJ_ERR_FFI_INVSIZE); - if (!(info & CTF_VLA) && ctype_align(info) <= CT_MEMALIGN) - cd = lj_cdata_new(cts, id, sz); - else - cd = lj_cdata_newv(cts, id, sz, ctype_align(info)); - setcdataV(L, o-1, cd); /* Anchor the uninitialized cdata. */ - lj_cconv_ct_init(cts, ct, sz, cdataptr(cd), - o, (MSize)(L->top - o)); /* Initialize cdata. */ - if (ctype_isstruct(ct->info)) { - /* Handle ctype __gc metamethod. Use the fast lookup here. */ - cTValue *tv = lj_tab_getinth(cts->miscmap, -(int32_t)id); - if (tv && tvistab(tv) && (tv = lj_meta_fast(L, tabV(tv), MM_gc))) { - GCtab *t = cts->finalizer; - if (gcref(t->metatable)) { - /* Add to finalizer table, if still enabled. */ - copyTV(L, lj_tab_set(L, t, o-1), tv); - lj_gc_anybarriert(L, t); - cd->marked |= LJ_GC_CDATA_FIN; - } - } - } - L->top = o; /* Only return the cdata itself. */ - lj_gc_check(L); - return 1; -} - -LJLIB_CF(ffi_cast) LJLIB_REC(ffi_new) -{ - CTState *cts = ctype_cts(L); - CTypeID id = ffi_checkctype(L, cts, NULL); - CType *d = ctype_raw(cts, id); - TValue *o = lj_lib_checkany(L, 2); - L->top = o+1; /* Make sure this is the last item on the stack. */ - if (!(ctype_isnum(d->info) || ctype_isptr(d->info) || ctype_isenum(d->info))) - lj_err_arg(L, 1, LJ_ERR_FFI_INVTYPE); - if (!(tviscdata(o) && cdataV(o)->ctypeid == id)) { - GCcdata *cd = lj_cdata_new(cts, id, d->size); - lj_cconv_ct_tv(cts, d, cdataptr(cd), o, CCF_CAST); - setcdataV(L, o, cd); - lj_gc_check(L); - } - return 1; -} - -LJLIB_CF(ffi_typeof) LJLIB_REC(.) -{ - CTState *cts = ctype_cts(L); - CTypeID id = ffi_checkctype(L, cts, L->base+1); - GCcdata *cd = lj_cdata_new(cts, CTID_CTYPEID, 4); - *(CTypeID *)cdataptr(cd) = id; - setcdataV(L, L->top-1, cd); - lj_gc_check(L); - return 1; -} - -LJLIB_CF(ffi_istype) LJLIB_REC(.) -{ - CTState *cts = ctype_cts(L); - CTypeID id1 = ffi_checkctype(L, cts, NULL); - TValue *o = lj_lib_checkany(L, 2); - int b = 0; - if (tviscdata(o)) { - GCcdata *cd = cdataV(o); - CTypeID id2 = cd->ctypeid == CTID_CTYPEID ? *(CTypeID *)cdataptr(cd) : - cd->ctypeid; - CType *ct1 = lj_ctype_rawref(cts, id1); - CType *ct2 = lj_ctype_rawref(cts, id2); - if (ct1 == ct2) { - b = 1; - } else if (ctype_type(ct1->info) == ctype_type(ct2->info) && - ct1->size == ct2->size) { - if (ctype_ispointer(ct1->info)) - b = lj_cconv_compatptr(cts, ct1, ct2, CCF_IGNQUAL); - else if (ctype_isnum(ct1->info) || ctype_isvoid(ct1->info)) - b = (((ct1->info ^ ct2->info) & ~(CTF_QUAL|CTF_LONG)) == 0); - } else if (ctype_isstruct(ct1->info) && ctype_isptr(ct2->info) && - ct1 == ctype_rawchild(cts, ct2)) { - b = 1; - } - } - setboolV(L->top-1, b); - setboolV(&G(L)->tmptv2, b); /* Remember for trace recorder. */ - return 1; -} - -LJLIB_CF(ffi_sizeof) LJLIB_REC(ffi_xof FF_ffi_sizeof) -{ - CTState *cts = ctype_cts(L); - CTypeID id = ffi_checkctype(L, cts, NULL); - CTSize sz; - if (LJ_UNLIKELY(tviscdata(L->base) && cdataisv(cdataV(L->base)))) { - sz = cdatavlen(cdataV(L->base)); - } else { - CType *ct = lj_ctype_rawref(cts, id); - if (ctype_isvltype(ct->info)) - sz = lj_ctype_vlsize(cts, ct, (CTSize)ffi_checkint(L, 2)); - else - sz = ctype_hassize(ct->info) ? ct->size : CTSIZE_INVALID; - if (LJ_UNLIKELY(sz == CTSIZE_INVALID)) { - setnilV(L->top-1); - return 1; - } - } - setintV(L->top-1, (int32_t)sz); - return 1; -} - -LJLIB_CF(ffi_alignof) LJLIB_REC(ffi_xof FF_ffi_alignof) -{ - CTState *cts = ctype_cts(L); - CTypeID id = ffi_checkctype(L, cts, NULL); - CTSize sz = 0; - CTInfo info = lj_ctype_info(cts, id, &sz); - setintV(L->top-1, 1 << ctype_align(info)); - return 1; -} - -LJLIB_CF(ffi_offsetof) LJLIB_REC(ffi_xof FF_ffi_offsetof) -{ - CTState *cts = ctype_cts(L); - CTypeID id = ffi_checkctype(L, cts, NULL); - GCstr *name = lj_lib_checkstr(L, 2); - CType *ct = lj_ctype_rawref(cts, id); - CTSize ofs; - if (ctype_isstruct(ct->info) && ct->size != CTSIZE_INVALID) { - CType *fct = lj_ctype_getfield(cts, ct, name, &ofs); - if (fct) { - setintV(L->top-1, ofs); - if (ctype_isfield(fct->info)) { - return 1; - } else if (ctype_isbitfield(fct->info)) { - setintV(L->top++, ctype_bitpos(fct->info)); - setintV(L->top++, ctype_bitbsz(fct->info)); - return 3; - } - } - } - return 0; -} - -LJLIB_CF(ffi_errno) LJLIB_REC(.) -{ - int err = errno; - if (L->top > L->base) - errno = ffi_checkint(L, 1); - setintV(L->top++, err); - return 1; -} - -LJLIB_CF(ffi_string) LJLIB_REC(.) -{ - CTState *cts = ctype_cts(L); - TValue *o = lj_lib_checkany(L, 1); - const char *p; - size_t len; - if (o+1 < L->top && !tvisnil(o+1)) { - len = (size_t)ffi_checkint(L, 2); - lj_cconv_ct_tv(cts, ctype_get(cts, CTID_P_CVOID), (uint8_t *)&p, o, - CCF_ARG(1)); - } else { - lj_cconv_ct_tv(cts, ctype_get(cts, CTID_P_CCHAR), (uint8_t *)&p, o, - CCF_ARG(1)); - len = strlen(p); - } - L->top = o+1; /* Make sure this is the last item on the stack. */ - setstrV(L, o, lj_str_new(L, p, len)); - lj_gc_check(L); - return 1; -} - -LJLIB_CF(ffi_copy) LJLIB_REC(.) -{ - void *dp = ffi_checkptr(L, 1, CTID_P_VOID); - void *sp = ffi_checkptr(L, 2, CTID_P_CVOID); - TValue *o = L->base+1; - CTSize len; - if (tvisstr(o) && o+1 >= L->top) - len = strV(o)->len+1; /* Copy Lua string including trailing '\0'. */ - else - len = (CTSize)ffi_checkint(L, 3); - memcpy(dp, sp, len); - return 0; -} - -LJLIB_CF(ffi_fill) LJLIB_REC(.) -{ - void *dp = ffi_checkptr(L, 1, CTID_P_VOID); - CTSize len = (CTSize)ffi_checkint(L, 2); - int32_t fill = 0; - if (L->base+2 < L->top && !tvisnil(L->base+2)) fill = ffi_checkint(L, 3); - memset(dp, fill, len); - return 0; -} - -#define H_(le, be) LJ_ENDIAN_SELECT(0x##le, 0x##be) - -/* Test ABI string. */ -LJLIB_CF(ffi_abi) LJLIB_REC(.) -{ - GCstr *s = lj_lib_checkstr(L, 1); - int b = 0; - switch (s->hash) { -#if LJ_64 - case H_(849858eb,ad35fd06): b = 1; break; /* 64bit */ -#else - case H_(662d3c79,d0e22477): b = 1; break; /* 32bit */ -#endif -#if LJ_ARCH_HASFPU - case H_(e33ee463,e33ee463): b = 1; break; /* fpu */ -#endif -#if LJ_ABI_SOFTFP - case H_(61211a23,c2e8c81c): b = 1; break; /* softfp */ -#else - case H_(539417a8,8ce0812f): b = 1; break; /* hardfp */ -#endif -#if LJ_ABI_EABI - case H_(2182df8f,f2ed1152): b = 1; break; /* eabi */ -#endif -#if LJ_ABI_WIN - case H_(4ab624a8,4ab624a8): b = 1; break; /* win */ -#endif - case H_(3af93066,1f001464): b = 1; break; /* le/be */ - default: - break; - } - setboolV(L->top-1, b); - setboolV(&G(L)->tmptv2, b); /* Remember for trace recorder. */ - return 1; -} - -#undef H_ - -LJLIB_PUSH(top-8) LJLIB_SET(!) /* Store reference to miscmap table. */ - -LJLIB_CF(ffi_metatype) -{ - CTState *cts = ctype_cts(L); - CTypeID id = ffi_checkctype(L, cts, NULL); - GCtab *mt = lj_lib_checktab(L, 2); - GCtab *t = cts->miscmap; - CType *ct = ctype_get(cts, id); /* Only allow raw types. */ - TValue *tv; - GCcdata *cd; - if (!(ctype_isstruct(ct->info) || ctype_iscomplex(ct->info) || - ctype_isvector(ct->info))) - lj_err_arg(L, 1, LJ_ERR_FFI_INVTYPE); - tv = lj_tab_setinth(L, t, -(int32_t)id); - if (!tvisnil(tv)) - lj_err_caller(L, LJ_ERR_PROTMT); - settabV(L, tv, mt); - lj_gc_anybarriert(L, t); - cd = lj_cdata_new(cts, CTID_CTYPEID, 4); - *(CTypeID *)cdataptr(cd) = id; - setcdataV(L, L->top-1, cd); - lj_gc_check(L); - return 1; -} - -LJLIB_PUSH(top-7) LJLIB_SET(!) /* Store reference to finalizer table. */ - -LJLIB_CF(ffi_gc) LJLIB_REC(.) -{ - GCcdata *cd = ffi_checkcdata(L, 1); - TValue *fin = lj_lib_checkany(L, 2); - CTState *cts = ctype_cts(L); - GCtab *t = cts->finalizer; - CType *ct = ctype_raw(cts, cd->ctypeid); - if (!(ctype_isptr(ct->info) || ctype_isstruct(ct->info) || - ctype_isrefarray(ct->info))) - lj_err_arg(L, 1, LJ_ERR_FFI_INVTYPE); - if (gcref(t->metatable)) { /* Update finalizer table, if still enabled. */ - copyTV(L, lj_tab_set(L, t, L->base), fin); - lj_gc_anybarriert(L, t); - if (!tvisnil(fin)) - cd->marked |= LJ_GC_CDATA_FIN; - else - cd->marked &= ~LJ_GC_CDATA_FIN; - } - L->top = L->base+1; /* Pass through the cdata object. */ - return 1; -} - -LJLIB_PUSH(top-5) LJLIB_SET(!) /* Store clib metatable in func environment. */ - -LJLIB_CF(ffi_load) -{ - GCstr *name = lj_lib_checkstr(L, 1); - int global = (L->base+1 < L->top && tvistruecond(L->base+1)); - lj_clib_load(L, tabref(curr_func(L)->c.env), name, global); - return 1; -} - -LJLIB_PUSH(top-4) LJLIB_SET(C) -LJLIB_PUSH(top-3) LJLIB_SET(os) -LJLIB_PUSH(top-2) LJLIB_SET(arch) - -#include "lj_libdef.h" - -/* ------------------------------------------------------------------------ */ - -/* Create special weak-keyed finalizer table. */ -static GCtab *ffi_finalizer(lua_State *L) -{ - /* NOBARRIER: The table is new (marked white). */ - GCtab *t = lj_tab_new(L, 0, 1); - settabV(L, L->top++, t); - setgcref(t->metatable, obj2gco(t)); - setstrV(L, lj_tab_setstr(L, t, lj_str_newlit(L, "__mode")), - lj_str_newlit(L, "K")); - t->nomm = (uint8_t)(~(1u<top-1); - lj_gc_anybarriert(L, t); - } -} - -LUALIB_API int luaopen_ffi(lua_State *L) -{ - CTState *cts = lj_ctype_init(L); - settabV(L, L->top++, (cts->miscmap = lj_tab_new(L, 0, 1))); - cts->finalizer = ffi_finalizer(L); - LJ_LIB_REG(L, NULL, ffi_meta); - /* NOBARRIER: basemt is a GC root. */ - setgcref(basemt_it(G(L), LJ_TCDATA), obj2gco(tabV(L->top-1))); - LJ_LIB_REG(L, NULL, ffi_clib); - LJ_LIB_REG(L, NULL, ffi_callback); - /* NOBARRIER: the key is new and lj_tab_newkey() handles the barrier. */ - settabV(L, lj_tab_setstr(L, cts->miscmap, &cts->g->strempty), tabV(L->top-1)); - L->top--; - lj_clib_default(L, tabV(L->top-1)); /* Create ffi.C default namespace. */ - lua_pushliteral(L, LJ_OS_NAME); - lua_pushliteral(L, LJ_ARCH_NAME); - LJ_LIB_REG(L, NULL, ffi); /* Note: no global "ffi" created! */ - ffi_register_module(L); - return 1; -} - -#endif diff --git a/deps/luajit/src/lib_init.c b/deps/luajit/src/lib_init.c deleted file mode 100644 index 85c194af..00000000 --- a/deps/luajit/src/lib_init.c +++ /dev/null @@ -1,55 +0,0 @@ -/* -** Library initialization. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -** -** Major parts taken verbatim from the Lua interpreter. -** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h -*/ - -#define lib_init_c -#define LUA_LIB - -#include "lua.h" -#include "lauxlib.h" -#include "lualib.h" - -#include "lj_arch.h" - -static const luaL_Reg lj_lib_load[] = { - { "", luaopen_base }, - { LUA_LOADLIBNAME, luaopen_package }, - { LUA_TABLIBNAME, luaopen_table }, - { LUA_IOLIBNAME, luaopen_io }, - { LUA_OSLIBNAME, luaopen_os }, - { LUA_STRLIBNAME, luaopen_string }, - { LUA_MATHLIBNAME, luaopen_math }, - { LUA_DBLIBNAME, luaopen_debug }, - { LUA_BITLIBNAME, luaopen_bit }, - { LUA_JITLIBNAME, luaopen_jit }, - { NULL, NULL } -}; - -static const luaL_Reg lj_lib_preload[] = { -#if LJ_HASFFI - { LUA_FFILIBNAME, luaopen_ffi }, -#endif - { NULL, NULL } -}; - -LUALIB_API void luaL_openlibs(lua_State *L) -{ - const luaL_Reg *lib; - for (lib = lj_lib_load; lib->func; lib++) { - lua_pushcfunction(L, lib->func); - lua_pushstring(L, lib->name); - lua_call(L, 1, 0); - } - luaL_findtable(L, LUA_REGISTRYINDEX, "_PRELOAD", - sizeof(lj_lib_preload)/sizeof(lj_lib_preload[0])-1); - for (lib = lj_lib_preload; lib->func; lib++) { - lua_pushcfunction(L, lib->func); - lua_setfield(L, -2, lib->name); - } - lua_pop(L, 1); -} - diff --git a/deps/luajit/src/lib_io.c b/deps/luajit/src/lib_io.c deleted file mode 100644 index 037aa28e..00000000 --- a/deps/luajit/src/lib_io.c +++ /dev/null @@ -1,539 +0,0 @@ -/* -** I/O library. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -** -** Major portions taken verbatim or adapted from the Lua interpreter. -** Copyright (C) 1994-2011 Lua.org, PUC-Rio. See Copyright Notice in lua.h -*/ - -#include -#include - -#define lib_io_c -#define LUA_LIB - -#include "lua.h" -#include "lauxlib.h" -#include "lualib.h" - -#include "lj_obj.h" -#include "lj_gc.h" -#include "lj_err.h" -#include "lj_str.h" -#include "lj_state.h" -#include "lj_ff.h" -#include "lj_lib.h" - -/* Userdata payload for I/O file. */ -typedef struct IOFileUD { - FILE *fp; /* File handle. */ - uint32_t type; /* File type. */ -} IOFileUD; - -#define IOFILE_TYPE_FILE 0 /* Regular file. */ -#define IOFILE_TYPE_PIPE 1 /* Pipe. */ -#define IOFILE_TYPE_STDF 2 /* Standard file handle. */ -#define IOFILE_TYPE_MASK 3 - -#define IOFILE_FLAG_CLOSE 4 /* Close after io.lines() iterator. */ - -#define IOSTDF_UD(L, id) (&gcref(G(L)->gcroot[(id)])->ud) -#define IOSTDF_IOF(L, id) ((IOFileUD *)uddata(IOSTDF_UD(L, (id)))) - -/* -- Open/close helpers -------------------------------------------------- */ - -static IOFileUD *io_tofilep(lua_State *L) -{ - if (!(L->base < L->top && tvisudata(L->base) && - udataV(L->base)->udtype == UDTYPE_IO_FILE)) - lj_err_argtype(L, 1, "FILE*"); - return (IOFileUD *)uddata(udataV(L->base)); -} - -static IOFileUD *io_tofile(lua_State *L) -{ - IOFileUD *iof = io_tofilep(L); - if (iof->fp == NULL) - lj_err_caller(L, LJ_ERR_IOCLFL); - return iof; -} - -static FILE *io_stdfile(lua_State *L, ptrdiff_t id) -{ - IOFileUD *iof = IOSTDF_IOF(L, id); - if (iof->fp == NULL) - lj_err_caller(L, LJ_ERR_IOSTDCL); - return iof->fp; -} - -static IOFileUD *io_file_new(lua_State *L) -{ - IOFileUD *iof = (IOFileUD *)lua_newuserdata(L, sizeof(IOFileUD)); - GCudata *ud = udataV(L->top-1); - ud->udtype = UDTYPE_IO_FILE; - /* NOBARRIER: The GCudata is new (marked white). */ - setgcrefr(ud->metatable, curr_func(L)->c.env); - iof->fp = NULL; - iof->type = IOFILE_TYPE_FILE; - return iof; -} - -static IOFileUD *io_file_open(lua_State *L, const char *mode) -{ - const char *fname = strdata(lj_lib_checkstr(L, 1)); - IOFileUD *iof = io_file_new(L); - iof->fp = fopen(fname, mode); - if (iof->fp == NULL) - luaL_argerror(L, 1, lj_str_pushf(L, "%s: %s", fname, strerror(errno))); - return iof; -} - -static int io_file_close(lua_State *L, IOFileUD *iof) -{ - int ok; - if ((iof->type & IOFILE_TYPE_MASK) == IOFILE_TYPE_FILE) { - ok = (fclose(iof->fp) == 0); - } else if ((iof->type & IOFILE_TYPE_MASK) == IOFILE_TYPE_PIPE) { - int stat = -1; -#if LJ_TARGET_POSIX - stat = pclose(iof->fp); -#elif LJ_TARGET_WINDOWS - stat = _pclose(iof->fp); -#else - lua_assert(0); - return 0; -#endif -#if LJ_52 - iof->fp = NULL; - return luaL_execresult(L, stat); -#else - ok = (stat != -1); -#endif - } else { - lua_assert((iof->type & IOFILE_TYPE_MASK) == IOFILE_TYPE_STDF); - setnilV(L->top++); - lua_pushliteral(L, "cannot close standard file"); - return 2; - } - iof->fp = NULL; - return luaL_fileresult(L, ok, NULL); -} - -/* -- Read/write helpers -------------------------------------------------- */ - -static int io_file_readnum(lua_State *L, FILE *fp) -{ - lua_Number d; - if (fscanf(fp, LUA_NUMBER_SCAN, &d) == 1) { - if (LJ_DUALNUM) { - int32_t i = lj_num2int(d); - if (d == (lua_Number)i && !tvismzero((cTValue *)&d)) { - setintV(L->top++, i); - return 1; - } - } - setnumV(L->top++, d); - return 1; - } else { - setnilV(L->top++); - return 0; - } -} - -static int io_file_readline(lua_State *L, FILE *fp, MSize chop) -{ - MSize m = LUAL_BUFFERSIZE, n = 0, ok = 0; - char *buf; - for (;;) { - buf = lj_str_needbuf(L, &G(L)->tmpbuf, m); - if (fgets(buf+n, m-n, fp) == NULL) break; - n += (MSize)strlen(buf+n); - ok |= n; - if (n && buf[n-1] == '\n') { n -= chop; break; } - if (n >= m - 64) m += m; - } - setstrV(L, L->top++, lj_str_new(L, buf, (size_t)n)); - lj_gc_check(L); - return (int)ok; -} - -static void io_file_readall(lua_State *L, FILE *fp) -{ - MSize m, n; - for (m = LUAL_BUFFERSIZE, n = 0; ; m += m) { - char *buf = lj_str_needbuf(L, &G(L)->tmpbuf, m); - n += (MSize)fread(buf+n, 1, m-n, fp); - if (n != m) { - setstrV(L, L->top++, lj_str_new(L, buf, (size_t)n)); - lj_gc_check(L); - return; - } - } -} - -static int io_file_readlen(lua_State *L, FILE *fp, MSize m) -{ - if (m) { - char *buf = lj_str_needbuf(L, &G(L)->tmpbuf, m); - MSize n = (MSize)fread(buf, 1, m, fp); - setstrV(L, L->top++, lj_str_new(L, buf, (size_t)n)); - lj_gc_check(L); - return (n > 0 || m == 0); - } else { - int c = getc(fp); - ungetc(c, fp); - setstrV(L, L->top++, &G(L)->strempty); - return (c != EOF); - } -} - -static int io_file_read(lua_State *L, FILE *fp, int start) -{ - int ok, n, nargs = (int)(L->top - L->base) - start; - clearerr(fp); - if (nargs == 0) { - ok = io_file_readline(L, fp, 1); - n = start+1; /* Return 1 result. */ - } else { - /* The results plus the buffers go on top of the args. */ - luaL_checkstack(L, nargs+LUA_MINSTACK, "too many arguments"); - ok = 1; - for (n = start; nargs-- && ok; n++) { - if (tvisstr(L->base+n)) { - const char *p = strVdata(L->base+n); - if (p[0] != '*') - lj_err_arg(L, n+1, LJ_ERR_INVOPT); - if (p[1] == 'n') - ok = io_file_readnum(L, fp); - else if ((p[1] & ~0x20) == 'L') - ok = io_file_readline(L, fp, (p[1] == 'l')); - else if (p[1] == 'a') - io_file_readall(L, fp); - else - lj_err_arg(L, n+1, LJ_ERR_INVFMT); - } else if (tvisnumber(L->base+n)) { - ok = io_file_readlen(L, fp, (MSize)lj_lib_checkint(L, n+1)); - } else { - lj_err_arg(L, n+1, LJ_ERR_INVOPT); - } - } - } - if (ferror(fp)) - return luaL_fileresult(L, 0, NULL); - if (!ok) - setnilV(L->top-1); /* Replace last result with nil. */ - return n - start; -} - -static int io_file_write(lua_State *L, FILE *fp, int start) -{ - cTValue *tv; - int status = 1; - for (tv = L->base+start; tv < L->top; tv++) { - if (tvisstr(tv)) { - MSize len = strV(tv)->len; - status = status && (fwrite(strVdata(tv), 1, len, fp) == len); - } else if (tvisint(tv)) { - char buf[LJ_STR_INTBUF]; - char *p = lj_str_bufint(buf, intV(tv)); - size_t len = (size_t)(buf+LJ_STR_INTBUF-p); - status = status && (fwrite(p, 1, len, fp) == len); - } else if (tvisnum(tv)) { - status = status && (fprintf(fp, LUA_NUMBER_FMT, numV(tv)) > 0); - } else { - lj_err_argt(L, (int)(tv - L->base) + 1, LUA_TSTRING); - } - } - if (LJ_52 && status) { - L->top = L->base+1; - if (start == 0) - setudataV(L, L->base, IOSTDF_UD(L, GCROOT_IO_OUTPUT)); - return 1; - } - return luaL_fileresult(L, status, NULL); -} - -static int io_file_iter(lua_State *L) -{ - GCfunc *fn = curr_func(L); - IOFileUD *iof = uddata(udataV(&fn->c.upvalue[0])); - int n = fn->c.nupvalues - 1; - if (iof->fp == NULL) - lj_err_caller(L, LJ_ERR_IOCLFL); - L->top = L->base; - if (n) { /* Copy upvalues with options to stack. */ - if (n > LUAI_MAXCSTACK) - lj_err_caller(L, LJ_ERR_STKOV); - lj_state_checkstack(L, (MSize)n); - memcpy(L->top, &fn->c.upvalue[1], n*sizeof(TValue)); - L->top += n; - } - n = io_file_read(L, iof->fp, 0); - if (ferror(iof->fp)) - lj_err_callermsg(L, strVdata(L->top-2)); - if (tvisnil(L->base) && (iof->type & IOFILE_FLAG_CLOSE)) { - io_file_close(L, iof); /* Return values are ignored. */ - return 0; - } - return n; -} - -/* -- I/O file methods ---------------------------------------------------- */ - -#define LJLIB_MODULE_io_method - -LJLIB_CF(io_method_close) -{ - IOFileUD *iof = L->base < L->top ? io_tofile(L) : - IOSTDF_IOF(L, GCROOT_IO_OUTPUT); - return io_file_close(L, iof); -} - -LJLIB_CF(io_method_read) -{ - return io_file_read(L, io_tofile(L)->fp, 1); -} - -LJLIB_CF(io_method_write) LJLIB_REC(io_write 0) -{ - return io_file_write(L, io_tofile(L)->fp, 1); -} - -LJLIB_CF(io_method_flush) LJLIB_REC(io_flush 0) -{ - return luaL_fileresult(L, fflush(io_tofile(L)->fp) == 0, NULL); -} - -LJLIB_CF(io_method_seek) -{ - FILE *fp = io_tofile(L)->fp; - int opt = lj_lib_checkopt(L, 2, 1, "\3set\3cur\3end"); - int64_t ofs = 0; - cTValue *o; - int res; - if (opt == 0) opt = SEEK_SET; - else if (opt == 1) opt = SEEK_CUR; - else if (opt == 2) opt = SEEK_END; - o = L->base+2; - if (o < L->top) { - if (tvisint(o)) - ofs = (int64_t)intV(o); - else if (tvisnum(o)) - ofs = (int64_t)numV(o); - else if (!tvisnil(o)) - lj_err_argt(L, 3, LUA_TNUMBER); - } -#if LJ_TARGET_POSIX - res = fseeko(fp, ofs, opt); -#elif _MSC_VER >= 1400 - res = _fseeki64(fp, ofs, opt); -#elif defined(__MINGW32__) - res = fseeko64(fp, ofs, opt); -#else - res = fseek(fp, (long)ofs, opt); -#endif - if (res) - return luaL_fileresult(L, 0, NULL); -#if LJ_TARGET_POSIX - ofs = ftello(fp); -#elif _MSC_VER >= 1400 - ofs = _ftelli64(fp); -#elif defined(__MINGW32__) - ofs = ftello64(fp); -#else - ofs = (int64_t)ftell(fp); -#endif - setint64V(L->top-1, ofs); - return 1; -} - -LJLIB_CF(io_method_setvbuf) -{ - FILE *fp = io_tofile(L)->fp; - int opt = lj_lib_checkopt(L, 2, -1, "\4full\4line\2no"); - size_t sz = (size_t)lj_lib_optint(L, 3, LUAL_BUFFERSIZE); - if (opt == 0) opt = _IOFBF; - else if (opt == 1) opt = _IOLBF; - else if (opt == 2) opt = _IONBF; - return luaL_fileresult(L, setvbuf(fp, NULL, opt, sz) == 0, NULL); -} - -LJLIB_CF(io_method_lines) -{ - io_tofile(L); - lua_pushcclosure(L, io_file_iter, (int)(L->top - L->base)); - return 1; -} - -LJLIB_CF(io_method___gc) -{ - IOFileUD *iof = io_tofilep(L); - if (iof->fp != NULL && (iof->type & IOFILE_TYPE_MASK) != IOFILE_TYPE_STDF) - io_file_close(L, iof); - return 0; -} - -LJLIB_CF(io_method___tostring) -{ - IOFileUD *iof = io_tofilep(L); - if (iof->fp != NULL) - lua_pushfstring(L, "file (%p)", iof->fp); - else - lua_pushliteral(L, "file (closed)"); - return 1; -} - -LJLIB_PUSH(top-1) LJLIB_SET(__index) - -#include "lj_libdef.h" - -/* -- I/O library functions ----------------------------------------------- */ - -#define LJLIB_MODULE_io - -LJLIB_PUSH(top-2) LJLIB_SET(!) /* Set environment. */ - -LJLIB_CF(io_open) -{ - const char *fname = strdata(lj_lib_checkstr(L, 1)); - GCstr *s = lj_lib_optstr(L, 2); - const char *mode = s ? strdata(s) : "r"; - IOFileUD *iof = io_file_new(L); - iof->fp = fopen(fname, mode); - return iof->fp != NULL ? 1 : luaL_fileresult(L, 0, fname); -} - -LJLIB_CF(io_popen) -{ -#if LJ_TARGET_POSIX || LJ_TARGET_WINDOWS - const char *fname = strdata(lj_lib_checkstr(L, 1)); - GCstr *s = lj_lib_optstr(L, 2); - const char *mode = s ? strdata(s) : "r"; - IOFileUD *iof = io_file_new(L); - iof->type = IOFILE_TYPE_PIPE; -#if LJ_TARGET_POSIX - fflush(NULL); - iof->fp = popen(fname, mode); -#else - iof->fp = _popen(fname, mode); -#endif - return iof->fp != NULL ? 1 : luaL_fileresult(L, 0, fname); -#else - return luaL_error(L, LUA_QL("popen") " not supported"); -#endif -} - -LJLIB_CF(io_tmpfile) -{ - IOFileUD *iof = io_file_new(L); -#if LJ_TARGET_PS3 || LJ_TARGET_PS4 || LJ_TARGET_PSVITA - iof->fp = NULL; errno = ENOSYS; -#else - iof->fp = tmpfile(); -#endif - return iof->fp != NULL ? 1 : luaL_fileresult(L, 0, NULL); -} - -LJLIB_CF(io_close) -{ - return lj_cf_io_method_close(L); -} - -LJLIB_CF(io_read) -{ - return io_file_read(L, io_stdfile(L, GCROOT_IO_INPUT), 0); -} - -LJLIB_CF(io_write) LJLIB_REC(io_write GCROOT_IO_OUTPUT) -{ - return io_file_write(L, io_stdfile(L, GCROOT_IO_OUTPUT), 0); -} - -LJLIB_CF(io_flush) LJLIB_REC(io_flush GCROOT_IO_OUTPUT) -{ - return luaL_fileresult(L, fflush(io_stdfile(L, GCROOT_IO_OUTPUT)) == 0, NULL); -} - -static int io_std_getset(lua_State *L, ptrdiff_t id, const char *mode) -{ - if (L->base < L->top && !tvisnil(L->base)) { - if (tvisudata(L->base)) { - io_tofile(L); - L->top = L->base+1; - } else { - io_file_open(L, mode); - } - /* NOBARRIER: The standard I/O handles are GC roots. */ - setgcref(G(L)->gcroot[id], gcV(L->top-1)); - } else { - setudataV(L, L->top++, IOSTDF_UD(L, id)); - } - return 1; -} - -LJLIB_CF(io_input) -{ - return io_std_getset(L, GCROOT_IO_INPUT, "r"); -} - -LJLIB_CF(io_output) -{ - return io_std_getset(L, GCROOT_IO_OUTPUT, "w"); -} - -LJLIB_CF(io_lines) -{ - if (L->base == L->top) setnilV(L->top++); - if (!tvisnil(L->base)) { /* io.lines(fname) */ - IOFileUD *iof = io_file_open(L, "r"); - iof->type = IOFILE_TYPE_FILE|IOFILE_FLAG_CLOSE; - L->top--; - setudataV(L, L->base, udataV(L->top)); - } else { /* io.lines() iterates over stdin. */ - setudataV(L, L->base, IOSTDF_UD(L, GCROOT_IO_INPUT)); - } - lua_pushcclosure(L, io_file_iter, (int)(L->top - L->base)); - return 1; -} - -LJLIB_CF(io_type) -{ - cTValue *o = lj_lib_checkany(L, 1); - if (!(tvisudata(o) && udataV(o)->udtype == UDTYPE_IO_FILE)) - setnilV(L->top++); - else if (((IOFileUD *)uddata(udataV(o)))->fp != NULL) - lua_pushliteral(L, "file"); - else - lua_pushliteral(L, "closed file"); - return 1; -} - -#include "lj_libdef.h" - -/* ------------------------------------------------------------------------ */ - -static GCobj *io_std_new(lua_State *L, FILE *fp, const char *name) -{ - IOFileUD *iof = (IOFileUD *)lua_newuserdata(L, sizeof(IOFileUD)); - GCudata *ud = udataV(L->top-1); - ud->udtype = UDTYPE_IO_FILE; - /* NOBARRIER: The GCudata is new (marked white). */ - setgcref(ud->metatable, gcV(L->top-3)); - iof->fp = fp; - iof->type = IOFILE_TYPE_STDF; - lua_setfield(L, -2, name); - return obj2gco(ud); -} - -LUALIB_API int luaopen_io(lua_State *L) -{ - LJ_LIB_REG(L, NULL, io_method); - copyTV(L, L->top, L->top-1); L->top++; - lua_setfield(L, LUA_REGISTRYINDEX, LUA_FILEHANDLE); - LJ_LIB_REG(L, LUA_IOLIBNAME, io); - setgcref(G(L)->gcroot[GCROOT_IO_INPUT], io_std_new(L, stdin, "stdin")); - setgcref(G(L)->gcroot[GCROOT_IO_OUTPUT], io_std_new(L, stdout, "stdout")); - io_std_new(L, stderr, "stderr"); - return 1; -} - diff --git a/deps/luajit/src/lib_jit.c b/deps/luajit/src/lib_jit.c deleted file mode 100644 index 96525faf..00000000 --- a/deps/luajit/src/lib_jit.c +++ /dev/null @@ -1,663 +0,0 @@ -/* -** JIT library. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#define lib_jit_c -#define LUA_LIB - -#include "lua.h" -#include "lauxlib.h" -#include "lualib.h" - -#include "lj_arch.h" -#include "lj_obj.h" -#include "lj_err.h" -#include "lj_debug.h" -#include "lj_str.h" -#include "lj_tab.h" -#include "lj_bc.h" -#if LJ_HASJIT -#include "lj_ir.h" -#include "lj_jit.h" -#include "lj_ircall.h" -#include "lj_iropt.h" -#include "lj_target.h" -#endif -#include "lj_dispatch.h" -#include "lj_vm.h" -#include "lj_vmevent.h" -#include "lj_lib.h" - -#include "luajit.h" - -/* -- jit.* functions ----------------------------------------------------- */ - -#define LJLIB_MODULE_jit - -static int setjitmode(lua_State *L, int mode) -{ - int idx = 0; - if (L->base == L->top || tvisnil(L->base)) { /* jit.on/off/flush([nil]) */ - mode |= LUAJIT_MODE_ENGINE; - } else { - /* jit.on/off/flush(func|proto, nil|true|false) */ - if (tvisfunc(L->base) || tvisproto(L->base)) - idx = 1; - else if (!tvistrue(L->base)) /* jit.on/off/flush(true, nil|true|false) */ - goto err; - if (L->base+1 < L->top && tvisbool(L->base+1)) - mode |= boolV(L->base+1) ? LUAJIT_MODE_ALLFUNC : LUAJIT_MODE_ALLSUBFUNC; - else - mode |= LUAJIT_MODE_FUNC; - } - if (luaJIT_setmode(L, idx, mode) != 1) { - if ((mode & LUAJIT_MODE_MASK) == LUAJIT_MODE_ENGINE) - lj_err_caller(L, LJ_ERR_NOJIT); - err: - lj_err_argt(L, 1, LUA_TFUNCTION); - } - return 0; -} - -LJLIB_CF(jit_on) -{ - return setjitmode(L, LUAJIT_MODE_ON); -} - -LJLIB_CF(jit_off) -{ - return setjitmode(L, LUAJIT_MODE_OFF); -} - -LJLIB_CF(jit_flush) -{ -#if LJ_HASJIT - if (L->base < L->top && tvisnumber(L->base)) { - int traceno = lj_lib_checkint(L, 1); - luaJIT_setmode(L, traceno, LUAJIT_MODE_FLUSH|LUAJIT_MODE_TRACE); - return 0; - } -#endif - return setjitmode(L, LUAJIT_MODE_FLUSH); -} - -#if LJ_HASJIT -/* Push a string for every flag bit that is set. */ -static void flagbits_to_strings(lua_State *L, uint32_t flags, uint32_t base, - const char *str) -{ - for (; *str; base <<= 1, str += 1+*str) - if (flags & base) - setstrV(L, L->top++, lj_str_new(L, str+1, *(uint8_t *)str)); -} -#endif - -LJLIB_CF(jit_status) -{ -#if LJ_HASJIT - jit_State *J = L2J(L); - L->top = L->base; - setboolV(L->top++, (J->flags & JIT_F_ON) ? 1 : 0); - flagbits_to_strings(L, J->flags, JIT_F_CPU_FIRST, JIT_F_CPUSTRING); - flagbits_to_strings(L, J->flags, JIT_F_OPT_FIRST, JIT_F_OPTSTRING); - return (int)(L->top - L->base); -#else - setboolV(L->top++, 0); - return 1; -#endif -} - -LJLIB_CF(jit_attach) -{ -#ifdef LUAJIT_DISABLE_VMEVENT - luaL_error(L, "vmevent API disabled"); -#else - GCfunc *fn = lj_lib_checkfunc(L, 1); - GCstr *s = lj_lib_optstr(L, 2); - luaL_findtable(L, LUA_REGISTRYINDEX, LJ_VMEVENTS_REGKEY, LJ_VMEVENTS_HSIZE); - if (s) { /* Attach to given event. */ - const uint8_t *p = (const uint8_t *)strdata(s); - uint32_t h = s->len; - while (*p) h = h ^ (lj_rol(h, 6) + *p++); - lua_pushvalue(L, 1); - lua_rawseti(L, -2, VMEVENT_HASHIDX(h)); - G(L)->vmevmask = VMEVENT_NOCACHE; /* Invalidate cache. */ - } else { /* Detach if no event given. */ - setnilV(L->top++); - while (lua_next(L, -2)) { - L->top--; - if (tvisfunc(L->top) && funcV(L->top) == fn) { - setnilV(lj_tab_set(L, tabV(L->top-2), L->top-1)); - } - } - } -#endif - return 0; -} - -LJLIB_PUSH(top-5) LJLIB_SET(os) -LJLIB_PUSH(top-4) LJLIB_SET(arch) -LJLIB_PUSH(top-3) LJLIB_SET(version_num) -LJLIB_PUSH(top-2) LJLIB_SET(version) - -#include "lj_libdef.h" - -/* -- jit.util.* functions ------------------------------------------------ */ - -#define LJLIB_MODULE_jit_util - -/* -- Reflection API for Lua functions ------------------------------------ */ - -/* Return prototype of first argument (Lua function or prototype object) */ -static GCproto *check_Lproto(lua_State *L, int nolua) -{ - TValue *o = L->base; - if (L->top > o) { - if (tvisproto(o)) { - return protoV(o); - } else if (tvisfunc(o)) { - if (isluafunc(funcV(o))) - return funcproto(funcV(o)); - else if (nolua) - return NULL; - } - } - lj_err_argt(L, 1, LUA_TFUNCTION); - return NULL; /* unreachable */ -} - -static void setintfield(lua_State *L, GCtab *t, const char *name, int32_t val) -{ - setintV(lj_tab_setstr(L, t, lj_str_newz(L, name)), val); -} - -/* local info = jit.util.funcinfo(func [,pc]) */ -LJLIB_CF(jit_util_funcinfo) -{ - GCproto *pt = check_Lproto(L, 1); - if (pt) { - BCPos pc = (BCPos)lj_lib_optint(L, 2, 0); - GCtab *t; - lua_createtable(L, 0, 16); /* Increment hash size if fields are added. */ - t = tabV(L->top-1); - setintfield(L, t, "linedefined", pt->firstline); - setintfield(L, t, "lastlinedefined", pt->firstline + pt->numline); - setintfield(L, t, "stackslots", pt->framesize); - setintfield(L, t, "params", pt->numparams); - setintfield(L, t, "bytecodes", (int32_t)pt->sizebc); - setintfield(L, t, "gcconsts", (int32_t)pt->sizekgc); - setintfield(L, t, "nconsts", (int32_t)pt->sizekn); - setintfield(L, t, "upvalues", (int32_t)pt->sizeuv); - if (pc < pt->sizebc) - setintfield(L, t, "currentline", lj_debug_line(pt, pc)); - lua_pushboolean(L, (pt->flags & PROTO_VARARG)); - lua_setfield(L, -2, "isvararg"); - lua_pushboolean(L, (pt->flags & PROTO_CHILD)); - lua_setfield(L, -2, "children"); - setstrV(L, L->top++, proto_chunkname(pt)); - lua_setfield(L, -2, "source"); - lj_debug_pushloc(L, pt, pc); - lua_setfield(L, -2, "loc"); - } else { - GCfunc *fn = funcV(L->base); - GCtab *t; - lua_createtable(L, 0, 4); /* Increment hash size if fields are added. */ - t = tabV(L->top-1); - if (!iscfunc(fn)) - setintfield(L, t, "ffid", fn->c.ffid); - setintptrV(lj_tab_setstr(L, t, lj_str_newlit(L, "addr")), - (intptr_t)(void *)fn->c.f); - setintfield(L, t, "upvalues", fn->c.nupvalues); - } - return 1; -} - -/* local ins, m = jit.util.funcbc(func, pc) */ -LJLIB_CF(jit_util_funcbc) -{ - GCproto *pt = check_Lproto(L, 0); - BCPos pc = (BCPos)lj_lib_checkint(L, 2); - if (pc < pt->sizebc) { - BCIns ins = proto_bc(pt)[pc]; - BCOp op = bc_op(ins); - lua_assert(op < BC__MAX); - setintV(L->top, ins); - setintV(L->top+1, lj_bc_mode[op]); - L->top += 2; - return 2; - } - return 0; -} - -/* local k = jit.util.funck(func, idx) */ -LJLIB_CF(jit_util_funck) -{ - GCproto *pt = check_Lproto(L, 0); - ptrdiff_t idx = (ptrdiff_t)lj_lib_checkint(L, 2); - if (idx >= 0) { - if (idx < (ptrdiff_t)pt->sizekn) { - copyTV(L, L->top-1, proto_knumtv(pt, idx)); - return 1; - } - } else { - if (~idx < (ptrdiff_t)pt->sizekgc) { - GCobj *gc = proto_kgc(pt, idx); - setgcV(L, L->top-1, gc, ~gc->gch.gct); - return 1; - } - } - return 0; -} - -/* local name = jit.util.funcuvname(func, idx) */ -LJLIB_CF(jit_util_funcuvname) -{ - GCproto *pt = check_Lproto(L, 0); - uint32_t idx = (uint32_t)lj_lib_checkint(L, 2); - if (idx < pt->sizeuv) { - setstrV(L, L->top-1, lj_str_newz(L, lj_debug_uvname(pt, idx))); - return 1; - } - return 0; -} - -/* -- Reflection API for traces ------------------------------------------- */ - -#if LJ_HASJIT - -/* Check trace argument. Must not throw for non-existent trace numbers. */ -static GCtrace *jit_checktrace(lua_State *L) -{ - TraceNo tr = (TraceNo)lj_lib_checkint(L, 1); - jit_State *J = L2J(L); - if (tr > 0 && tr < J->sizetrace) - return traceref(J, tr); - return NULL; -} - -/* Names of link types. ORDER LJ_TRLINK */ -static const char *const jit_trlinkname[] = { - "none", "root", "loop", "tail-recursion", "up-recursion", "down-recursion", - "interpreter", "return" -}; - -/* local info = jit.util.traceinfo(tr) */ -LJLIB_CF(jit_util_traceinfo) -{ - GCtrace *T = jit_checktrace(L); - if (T) { - GCtab *t; - lua_createtable(L, 0, 8); /* Increment hash size if fields are added. */ - t = tabV(L->top-1); - setintfield(L, t, "nins", (int32_t)T->nins - REF_BIAS - 1); - setintfield(L, t, "nk", REF_BIAS - (int32_t)T->nk); - setintfield(L, t, "link", T->link); - setintfield(L, t, "nexit", T->nsnap); - setstrV(L, L->top++, lj_str_newz(L, jit_trlinkname[T->linktype])); - lua_setfield(L, -2, "linktype"); - /* There are many more fields. Add them only when needed. */ - return 1; - } - return 0; -} - -/* local m, ot, op1, op2, prev = jit.util.traceir(tr, idx) */ -LJLIB_CF(jit_util_traceir) -{ - GCtrace *T = jit_checktrace(L); - IRRef ref = (IRRef)lj_lib_checkint(L, 2) + REF_BIAS; - if (T && ref >= REF_BIAS && ref < T->nins) { - IRIns *ir = &T->ir[ref]; - int32_t m = lj_ir_mode[ir->o]; - setintV(L->top-2, m); - setintV(L->top-1, ir->ot); - setintV(L->top++, (int32_t)ir->op1 - (irm_op1(m)==IRMref ? REF_BIAS : 0)); - setintV(L->top++, (int32_t)ir->op2 - (irm_op2(m)==IRMref ? REF_BIAS : 0)); - setintV(L->top++, ir->prev); - return 5; - } - return 0; -} - -/* local k, t [, slot] = jit.util.tracek(tr, idx) */ -LJLIB_CF(jit_util_tracek) -{ - GCtrace *T = jit_checktrace(L); - IRRef ref = (IRRef)lj_lib_checkint(L, 2) + REF_BIAS; - if (T && ref >= T->nk && ref < REF_BIAS) { - IRIns *ir = &T->ir[ref]; - int32_t slot = -1; - if (ir->o == IR_KSLOT) { - slot = ir->op2; - ir = &T->ir[ir->op1]; - } - lj_ir_kvalue(L, L->top-2, ir); - setintV(L->top-1, (int32_t)irt_type(ir->t)); - if (slot == -1) - return 2; - setintV(L->top++, slot); - return 3; - } - return 0; -} - -/* local snap = jit.util.tracesnap(tr, sn) */ -LJLIB_CF(jit_util_tracesnap) -{ - GCtrace *T = jit_checktrace(L); - SnapNo sn = (SnapNo)lj_lib_checkint(L, 2); - if (T && sn < T->nsnap) { - SnapShot *snap = &T->snap[sn]; - SnapEntry *map = &T->snapmap[snap->mapofs]; - MSize n, nent = snap->nent; - GCtab *t; - lua_createtable(L, nent+2, 0); - t = tabV(L->top-1); - setintV(lj_tab_setint(L, t, 0), (int32_t)snap->ref - REF_BIAS); - setintV(lj_tab_setint(L, t, 1), (int32_t)snap->nslots); - for (n = 0; n < nent; n++) - setintV(lj_tab_setint(L, t, (int32_t)(n+2)), (int32_t)map[n]); - setintV(lj_tab_setint(L, t, (int32_t)(nent+2)), (int32_t)SNAP(255, 0, 0)); - return 1; - } - return 0; -} - -/* local mcode, addr, loop = jit.util.tracemc(tr) */ -LJLIB_CF(jit_util_tracemc) -{ - GCtrace *T = jit_checktrace(L); - if (T && T->mcode != NULL) { - setstrV(L, L->top-1, lj_str_new(L, (const char *)T->mcode, T->szmcode)); - setintptrV(L->top++, (intptr_t)(void *)T->mcode); - setintV(L->top++, T->mcloop); - return 3; - } - return 0; -} - -/* local addr = jit.util.traceexitstub([tr,] exitno) */ -LJLIB_CF(jit_util_traceexitstub) -{ -#ifdef EXITSTUBS_PER_GROUP - ExitNo exitno = (ExitNo)lj_lib_checkint(L, 1); - jit_State *J = L2J(L); - if (exitno < EXITSTUBS_PER_GROUP*LJ_MAX_EXITSTUBGR) { - setintptrV(L->top-1, (intptr_t)(void *)exitstub_addr(J, exitno)); - return 1; - } -#else - if (L->top > L->base+1) { /* Don't throw for one-argument variant. */ - GCtrace *T = jit_checktrace(L); - ExitNo exitno = (ExitNo)lj_lib_checkint(L, 2); - ExitNo maxexit = T->root ? T->nsnap+1 : T->nsnap; - if (T && T->mcode != NULL && exitno < maxexit) { - setintptrV(L->top-1, (intptr_t)(void *)exitstub_trace_addr(T, exitno)); - return 1; - } - } -#endif - return 0; -} - -/* local addr = jit.util.ircalladdr(idx) */ -LJLIB_CF(jit_util_ircalladdr) -{ - uint32_t idx = (uint32_t)lj_lib_checkint(L, 1); - if (idx < IRCALL__MAX) { - setintptrV(L->top-1, (intptr_t)(void *)lj_ir_callinfo[idx].func); - return 1; - } - return 0; -} - -#endif - -#include "lj_libdef.h" - -/* -- jit.opt module ------------------------------------------------------ */ - -#if LJ_HASJIT - -#define LJLIB_MODULE_jit_opt - -/* Parse optimization level. */ -static int jitopt_level(jit_State *J, const char *str) -{ - if (str[0] >= '0' && str[0] <= '9' && str[1] == '\0') { - uint32_t flags; - if (str[0] == '0') flags = JIT_F_OPT_0; - else if (str[0] == '1') flags = JIT_F_OPT_1; - else if (str[0] == '2') flags = JIT_F_OPT_2; - else flags = JIT_F_OPT_3; - J->flags = (J->flags & ~JIT_F_OPT_MASK) | flags; - return 1; /* Ok. */ - } - return 0; /* No match. */ -} - -/* Parse optimization flag. */ -static int jitopt_flag(jit_State *J, const char *str) -{ - const char *lst = JIT_F_OPTSTRING; - uint32_t opt; - int set = 1; - if (str[0] == '+') { - str++; - } else if (str[0] == '-') { - str++; - set = 0; - } else if (str[0] == 'n' && str[1] == 'o') { - str += str[2] == '-' ? 3 : 2; - set = 0; - } - for (opt = JIT_F_OPT_FIRST; ; opt <<= 1) { - size_t len = *(const uint8_t *)lst; - if (len == 0) - break; - if (strncmp(str, lst+1, len) == 0 && str[len] == '\0') { - if (set) J->flags |= opt; else J->flags &= ~opt; - return 1; /* Ok. */ - } - lst += 1+len; - } - return 0; /* No match. */ -} - -/* Parse optimization parameter. */ -static int jitopt_param(jit_State *J, const char *str) -{ - const char *lst = JIT_P_STRING; - int i; - for (i = 0; i < JIT_P__MAX; i++) { - size_t len = *(const uint8_t *)lst; - lua_assert(len != 0); - if (strncmp(str, lst+1, len) == 0 && str[len] == '=') { - int32_t n = 0; - const char *p = &str[len+1]; - while (*p >= '0' && *p <= '9') - n = n*10 + (*p++ - '0'); - if (*p) return 0; /* Malformed number. */ - J->param[i] = n; - if (i == JIT_P_hotloop) - lj_dispatch_init_hotcount(J2G(J)); - return 1; /* Ok. */ - } - lst += 1+len; - } - return 0; /* No match. */ -} - -/* jit.opt.start(flags...) */ -LJLIB_CF(jit_opt_start) -{ - jit_State *J = L2J(L); - int nargs = (int)(L->top - L->base); - if (nargs == 0) { - J->flags = (J->flags & ~JIT_F_OPT_MASK) | JIT_F_OPT_DEFAULT; - } else { - int i; - for (i = 1; i <= nargs; i++) { - const char *str = strdata(lj_lib_checkstr(L, i)); - if (!jitopt_level(J, str) && - !jitopt_flag(J, str) && - !jitopt_param(J, str)) - lj_err_callerv(L, LJ_ERR_JITOPT, str); - } - } - return 0; -} - -#include "lj_libdef.h" - -#endif - -/* -- JIT compiler initialization ----------------------------------------- */ - -#if LJ_HASJIT -/* Default values for JIT parameters. */ -static const int32_t jit_param_default[JIT_P__MAX+1] = { -#define JIT_PARAMINIT(len, name, value) (value), -JIT_PARAMDEF(JIT_PARAMINIT) -#undef JIT_PARAMINIT - 0 -}; -#endif - -#if LJ_TARGET_ARM && LJ_TARGET_LINUX -#include -#endif - -/* Arch-dependent CPU detection. */ -static uint32_t jit_cpudetect(lua_State *L) -{ - uint32_t flags = 0; -#if LJ_TARGET_X86ORX64 - uint32_t vendor[4]; - uint32_t features[4]; - if (lj_vm_cpuid(0, vendor) && lj_vm_cpuid(1, features)) { -#if !LJ_HASJIT -#define JIT_F_CMOV 1 -#define JIT_F_SSE2 2 -#endif - flags |= ((features[3] >> 15)&1) * JIT_F_CMOV; - flags |= ((features[3] >> 26)&1) * JIT_F_SSE2; -#if LJ_HASJIT - flags |= ((features[2] >> 0)&1) * JIT_F_SSE3; - flags |= ((features[2] >> 19)&1) * JIT_F_SSE4_1; - if (vendor[2] == 0x6c65746e) { /* Intel. */ - if ((features[0] & 0x0ff00f00) == 0x00000f00) /* P4. */ - flags |= JIT_F_P4; /* Currently unused. */ - else if ((features[0] & 0x0fff0ff0) == 0x000106c0) /* Atom. */ - flags |= JIT_F_LEA_AGU; - } else if (vendor[2] == 0x444d4163) { /* AMD. */ - uint32_t fam = (features[0] & 0x0ff00f00); - if (fam == 0x00000f00) /* K8. */ - flags |= JIT_F_SPLIT_XMM; - if (fam >= 0x00000f00) /* K8, K10. */ - flags |= JIT_F_PREFER_IMUL; - } -#endif - } - /* Check for required instruction set support on x86 (unnecessary on x64). */ -#if LJ_TARGET_X86 -#if !defined(LUAJIT_CPU_NOCMOV) - if (!(flags & JIT_F_CMOV)) - luaL_error(L, "CPU not supported"); -#endif -#if defined(LUAJIT_CPU_SSE2) - if (!(flags & JIT_F_SSE2)) - luaL_error(L, "CPU does not support SSE2 (recompile without -DLUAJIT_CPU_SSE2)"); -#endif -#endif -#elif LJ_TARGET_ARM -#if LJ_HASJIT - int ver = LJ_ARCH_VERSION; /* Compile-time ARM CPU detection. */ -#if LJ_TARGET_LINUX - if (ver < 70) { /* Runtime ARM CPU detection. */ - struct utsname ut; - uname(&ut); - if (strncmp(ut.machine, "armv", 4) == 0) { - if (ut.machine[4] >= '7') - ver = 70; - else if (ut.machine[4] == '6') - ver = 60; - } - } -#endif - flags |= ver >= 70 ? JIT_F_ARMV7 : - ver >= 61 ? JIT_F_ARMV6T2_ : - ver >= 60 ? JIT_F_ARMV6_ : 0; - flags |= LJ_ARCH_HASFPU == 0 ? 0 : ver >= 70 ? JIT_F_VFPV3 : JIT_F_VFPV2; -#endif -#elif LJ_TARGET_PPC -#if LJ_HASJIT -#if LJ_ARCH_SQRT - flags |= JIT_F_SQRT; -#endif -#if LJ_ARCH_ROUND - flags |= JIT_F_ROUND; -#endif -#endif -#elif LJ_TARGET_PPCSPE - /* Nothing to do. */ -#elif LJ_TARGET_MIPS -#if LJ_HASJIT - /* Compile-time MIPS CPU detection. */ -#if LJ_ARCH_VERSION >= 20 - flags |= JIT_F_MIPS32R2; -#endif - /* Runtime MIPS CPU detection. */ -#if defined(__GNUC__) - if (!(flags & JIT_F_MIPS32R2)) { - int x; - /* On MIPS32R1 rotr is treated as srl. rotr r2,r2,1 -> srl r2,r2,1. */ - __asm__("li $2, 1\n\t.long 0x00221042\n\tmove %0, $2" : "=r"(x) : : "$2"); - if (x) flags |= JIT_F_MIPS32R2; /* Either 0x80000000 (R2) or 0 (R1). */ - } -#endif -#endif -#else -#error "Missing CPU detection for this architecture" -#endif - UNUSED(L); - return flags; -} - -/* Initialize JIT compiler. */ -static void jit_init(lua_State *L) -{ - uint32_t flags = jit_cpudetect(L); -#if LJ_HASJIT - jit_State *J = L2J(L); -#if LJ_TARGET_X86 - /* Silently turn off the JIT compiler on CPUs without SSE2. */ - if ((flags & JIT_F_SSE2)) -#endif - J->flags = flags | JIT_F_ON | JIT_F_OPT_DEFAULT; - memcpy(J->param, jit_param_default, sizeof(J->param)); - lj_dispatch_update(G(L)); -#else - UNUSED(flags); -#endif -} - -LUALIB_API int luaopen_jit(lua_State *L) -{ - lua_pushliteral(L, LJ_OS_NAME); - lua_pushliteral(L, LJ_ARCH_NAME); - lua_pushinteger(L, LUAJIT_VERSION_NUM); - lua_pushliteral(L, LUAJIT_VERSION); - LJ_LIB_REG(L, LUA_JITLIBNAME, jit); -#ifndef LUAJIT_DISABLE_JITUTIL - LJ_LIB_REG(L, "jit.util", jit_util); -#endif -#if LJ_HASJIT - LJ_LIB_REG(L, "jit.opt", jit_opt); -#endif - L->top -= 2; - jit_init(L); - return 1; -} - diff --git a/deps/luajit/src/lib_math.c b/deps/luajit/src/lib_math.c deleted file mode 100644 index 40f29142..00000000 --- a/deps/luajit/src/lib_math.c +++ /dev/null @@ -1,233 +0,0 @@ -/* -** Math library. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#include - -#define lib_math_c -#define LUA_LIB - -#include "lua.h" -#include "lauxlib.h" -#include "lualib.h" - -#include "lj_obj.h" -#include "lj_lib.h" -#include "lj_vm.h" - -/* ------------------------------------------------------------------------ */ - -#define LJLIB_MODULE_math - -LJLIB_ASM(math_abs) LJLIB_REC(.) -{ - lj_lib_checknumber(L, 1); - return FFH_RETRY; -} -LJLIB_ASM_(math_floor) LJLIB_REC(math_round IRFPM_FLOOR) -LJLIB_ASM_(math_ceil) LJLIB_REC(math_round IRFPM_CEIL) - -LJLIB_ASM(math_sqrt) LJLIB_REC(math_unary IRFPM_SQRT) -{ - lj_lib_checknum(L, 1); - return FFH_RETRY; -} -LJLIB_ASM_(math_log10) LJLIB_REC(math_unary IRFPM_LOG10) -LJLIB_ASM_(math_exp) LJLIB_REC(math_unary IRFPM_EXP) -LJLIB_ASM_(math_sin) LJLIB_REC(math_unary IRFPM_SIN) -LJLIB_ASM_(math_cos) LJLIB_REC(math_unary IRFPM_COS) -LJLIB_ASM_(math_tan) LJLIB_REC(math_unary IRFPM_TAN) -LJLIB_ASM_(math_asin) LJLIB_REC(math_atrig FF_math_asin) -LJLIB_ASM_(math_acos) LJLIB_REC(math_atrig FF_math_acos) -LJLIB_ASM_(math_atan) LJLIB_REC(math_atrig FF_math_atan) -LJLIB_ASM_(math_sinh) LJLIB_REC(math_htrig IRCALL_sinh) -LJLIB_ASM_(math_cosh) LJLIB_REC(math_htrig IRCALL_cosh) -LJLIB_ASM_(math_tanh) LJLIB_REC(math_htrig IRCALL_tanh) -LJLIB_ASM_(math_frexp) -LJLIB_ASM_(math_modf) LJLIB_REC(.) - -LJLIB_PUSH(57.29577951308232) -LJLIB_ASM_(math_deg) LJLIB_REC(math_degrad) - -LJLIB_PUSH(0.017453292519943295) -LJLIB_ASM_(math_rad) LJLIB_REC(math_degrad) - -LJLIB_ASM(math_log) LJLIB_REC(math_log) -{ - double x = lj_lib_checknum(L, 1); - if (L->base+1 < L->top) { - double y = lj_lib_checknum(L, 2); -#ifdef LUAJIT_NO_LOG2 - x = log(x); y = 1.0 / log(y); -#else - x = lj_vm_log2(x); y = 1.0 / lj_vm_log2(y); -#endif - setnumV(L->base-1, x*y); /* Do NOT join the expression to x / y. */ - return FFH_RES(1); - } - return FFH_RETRY; -} - -LJLIB_ASM(math_atan2) LJLIB_REC(.) -{ - lj_lib_checknum(L, 1); - lj_lib_checknum(L, 2); - return FFH_RETRY; -} -LJLIB_ASM_(math_pow) LJLIB_REC(.) -LJLIB_ASM_(math_fmod) - -LJLIB_ASM(math_ldexp) LJLIB_REC(.) -{ - lj_lib_checknum(L, 1); -#if LJ_DUALNUM && !LJ_TARGET_X86ORX64 - lj_lib_checkint(L, 2); -#else - lj_lib_checknum(L, 2); -#endif - return FFH_RETRY; -} - -LJLIB_ASM(math_min) LJLIB_REC(math_minmax IR_MIN) -{ - int i = 0; - do { lj_lib_checknumber(L, ++i); } while (L->base+i < L->top); - return FFH_RETRY; -} -LJLIB_ASM_(math_max) LJLIB_REC(math_minmax IR_MAX) - -LJLIB_PUSH(3.14159265358979323846) LJLIB_SET(pi) -LJLIB_PUSH(1e310) LJLIB_SET(huge) - -/* ------------------------------------------------------------------------ */ - -/* This implements a Tausworthe PRNG with period 2^223. Based on: -** Tables of maximally-equidistributed combined LFSR generators, -** Pierre L'Ecuyer, 1991, table 3, 1st entry. -** Full-period ME-CF generator with L=64, J=4, k=223, N1=49. -*/ - -/* PRNG state. */ -struct RandomState { - uint64_t gen[4]; /* State of the 4 LFSR generators. */ - int valid; /* State is valid. */ -}; - -/* Union needed for bit-pattern conversion between uint64_t and double. */ -typedef union { uint64_t u64; double d; } U64double; - -/* Update generator i and compute a running xor of all states. */ -#define TW223_GEN(i, k, q, s) \ - z = rs->gen[i]; \ - z = (((z<> (k-s)) ^ ((z&((uint64_t)(int64_t)-1 << (64-k)))<gen[i] = z; - -/* PRNG step function. Returns a double in the range 1.0 <= d < 2.0. */ -LJ_NOINLINE uint64_t LJ_FASTCALL lj_math_random_step(RandomState *rs) -{ - uint64_t z, r = 0; - TW223_GEN(0, 63, 31, 18) - TW223_GEN(1, 58, 19, 28) - TW223_GEN(2, 55, 24, 7) - TW223_GEN(3, 47, 21, 8) - return (r & U64x(000fffff,ffffffff)) | U64x(3ff00000,00000000); -} - -/* PRNG initialization function. */ -static void random_init(RandomState *rs, double d) -{ - uint32_t r = 0x11090601; /* 64-k[i] as four 8 bit constants. */ - int i; - for (i = 0; i < 4; i++) { - U64double u; - uint32_t m = 1u << (r&255); - r >>= 8; - u.d = d = d * 3.14159265358979323846 + 2.7182818284590452354; - if (u.u64 < m) u.u64 += m; /* Ensure k[i] MSB of gen[i] are non-zero. */ - rs->gen[i] = u.u64; - } - rs->valid = 1; - for (i = 0; i < 10; i++) - lj_math_random_step(rs); -} - -/* PRNG extract function. */ -LJLIB_PUSH(top-2) /* Upvalue holds userdata with RandomState. */ -LJLIB_CF(math_random) LJLIB_REC(.) -{ - int n = (int)(L->top - L->base); - RandomState *rs = (RandomState *)(uddata(udataV(lj_lib_upvalue(L, 1)))); - U64double u; - double d; - if (LJ_UNLIKELY(!rs->valid)) random_init(rs, 0.0); - u.u64 = lj_math_random_step(rs); - d = u.d - 1.0; - if (n > 0) { -#if LJ_DUALNUM - int isint = 1; - double r1; - lj_lib_checknumber(L, 1); - if (tvisint(L->base)) { - r1 = (lua_Number)intV(L->base); - } else { - isint = 0; - r1 = numV(L->base); - } -#else - double r1 = lj_lib_checknum(L, 1); -#endif - if (n == 1) { - d = lj_vm_floor(d*r1) + 1.0; /* d is an int in range [1, r1] */ - } else { -#if LJ_DUALNUM - double r2; - lj_lib_checknumber(L, 2); - if (tvisint(L->base+1)) { - r2 = (lua_Number)intV(L->base+1); - } else { - isint = 0; - r2 = numV(L->base+1); - } -#else - double r2 = lj_lib_checknum(L, 2); -#endif - d = lj_vm_floor(d*(r2-r1+1.0)) + r1; /* d is an int in range [r1, r2] */ - } -#if LJ_DUALNUM - if (isint) { - setintV(L->top-1, lj_num2int(d)); - return 1; - } -#endif - } /* else: d is a double in range [0, 1] */ - setnumV(L->top++, d); - return 1; -} - -/* PRNG seed function. */ -LJLIB_PUSH(top-2) /* Upvalue holds userdata with RandomState. */ -LJLIB_CF(math_randomseed) -{ - RandomState *rs = (RandomState *)(uddata(udataV(lj_lib_upvalue(L, 1)))); - random_init(rs, lj_lib_checknum(L, 1)); - return 0; -} - -/* ------------------------------------------------------------------------ */ - -#include "lj_libdef.h" - -LUALIB_API int luaopen_math(lua_State *L) -{ - RandomState *rs; - rs = (RandomState *)lua_newuserdata(L, sizeof(RandomState)); - rs->valid = 0; /* Use lazy initialization to save some time on startup. */ - LJ_LIB_REG(L, LUA_MATHLIBNAME, math); -#if defined(LUA_COMPAT_MOD) && !LJ_52 - lua_getfield(L, -1, "fmod"); - lua_setfield(L, -2, "mod"); -#endif - return 1; -} - diff --git a/deps/luajit/src/lib_os.c b/deps/luajit/src/lib_os.c deleted file mode 100644 index bb5a141e..00000000 --- a/deps/luajit/src/lib_os.c +++ /dev/null @@ -1,287 +0,0 @@ -/* -** OS library. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -** -** Major portions taken verbatim or adapted from the Lua interpreter. -** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h -*/ - -#include -#include - -#define lib_os_c -#define LUA_LIB - -#include "lua.h" -#include "lauxlib.h" -#include "lualib.h" - -#include "lj_obj.h" -#include "lj_err.h" -#include "lj_lib.h" - -#if LJ_TARGET_POSIX -#include -#else -#include -#endif - -#if !LJ_TARGET_PSVITA -#include -#endif - -/* ------------------------------------------------------------------------ */ - -#define LJLIB_MODULE_os - -LJLIB_CF(os_execute) -{ -#if LJ_TARGET_CONSOLE -#if LJ_52 - errno = ENOSYS; - return luaL_fileresult(L, 0, NULL); -#else - lua_pushinteger(L, -1); - return 1; -#endif -#else - const char *cmd = luaL_optstring(L, 1, NULL); - int stat = system(cmd); -#if LJ_52 - if (cmd) - return luaL_execresult(L, stat); - setboolV(L->top++, 1); -#else - setintV(L->top++, stat); -#endif - return 1; -#endif -} - -LJLIB_CF(os_remove) -{ - const char *filename = luaL_checkstring(L, 1); - return luaL_fileresult(L, remove(filename) == 0, filename); -} - -LJLIB_CF(os_rename) -{ - const char *fromname = luaL_checkstring(L, 1); - const char *toname = luaL_checkstring(L, 2); - return luaL_fileresult(L, rename(fromname, toname) == 0, fromname); -} - -LJLIB_CF(os_tmpname) -{ -#if LJ_TARGET_PS3 || LJ_TARGET_PS4 || LJ_TARGET_PSVITA - lj_err_caller(L, LJ_ERR_OSUNIQF); - return 0; -#else -#if LJ_TARGET_POSIX - char buf[15+1]; - int fp; - strcpy(buf, "/tmp/lua_XXXXXX"); - fp = mkstemp(buf); - if (fp != -1) - close(fp); - else - lj_err_caller(L, LJ_ERR_OSUNIQF); -#else - char buf[L_tmpnam]; - if (tmpnam(buf) == NULL) - lj_err_caller(L, LJ_ERR_OSUNIQF); -#endif - lua_pushstring(L, buf); - return 1; -#endif -} - -LJLIB_CF(os_getenv) -{ -#if LJ_TARGET_CONSOLE - lua_pushnil(L); -#else - lua_pushstring(L, getenv(luaL_checkstring(L, 1))); /* if NULL push nil */ -#endif - return 1; -} - -LJLIB_CF(os_exit) -{ - int status; - if (L->base < L->top && tvisbool(L->base)) - status = boolV(L->base) ? EXIT_SUCCESS : EXIT_FAILURE; - else - status = lj_lib_optint(L, 1, EXIT_SUCCESS); - if (L->base+1 < L->top && tvistruecond(L->base+1)) - lua_close(L); - exit(status); - return 0; /* Unreachable. */ -} - -LJLIB_CF(os_clock) -{ - setnumV(L->top++, ((lua_Number)clock())*(1.0/(lua_Number)CLOCKS_PER_SEC)); - return 1; -} - -/* ------------------------------------------------------------------------ */ - -static void setfield(lua_State *L, const char *key, int value) -{ - lua_pushinteger(L, value); - lua_setfield(L, -2, key); -} - -static void setboolfield(lua_State *L, const char *key, int value) -{ - if (value < 0) /* undefined? */ - return; /* does not set field */ - lua_pushboolean(L, value); - lua_setfield(L, -2, key); -} - -static int getboolfield(lua_State *L, const char *key) -{ - int res; - lua_getfield(L, -1, key); - res = lua_isnil(L, -1) ? -1 : lua_toboolean(L, -1); - lua_pop(L, 1); - return res; -} - -static int getfield(lua_State *L, const char *key, int d) -{ - int res; - lua_getfield(L, -1, key); - if (lua_isnumber(L, -1)) { - res = (int)lua_tointeger(L, -1); - } else { - if (d < 0) - lj_err_callerv(L, LJ_ERR_OSDATEF, key); - res = d; - } - lua_pop(L, 1); - return res; -} - -LJLIB_CF(os_date) -{ - const char *s = luaL_optstring(L, 1, "%c"); - time_t t = luaL_opt(L, (time_t)luaL_checknumber, 2, time(NULL)); - struct tm *stm; -#if LJ_TARGET_POSIX - struct tm rtm; -#endif - if (*s == '!') { /* UTC? */ - s++; /* Skip '!' */ -#if LJ_TARGET_POSIX - stm = gmtime_r(&t, &rtm); -#else - stm = gmtime(&t); -#endif - } else { -#if LJ_TARGET_POSIX - stm = localtime_r(&t, &rtm); -#else - stm = localtime(&t); -#endif - } - if (stm == NULL) { /* Invalid date? */ - setnilV(L->top-1); - } else if (strcmp(s, "*t") == 0) { - lua_createtable(L, 0, 9); /* 9 = number of fields */ - setfield(L, "sec", stm->tm_sec); - setfield(L, "min", stm->tm_min); - setfield(L, "hour", stm->tm_hour); - setfield(L, "day", stm->tm_mday); - setfield(L, "month", stm->tm_mon+1); - setfield(L, "year", stm->tm_year+1900); - setfield(L, "wday", stm->tm_wday+1); - setfield(L, "yday", stm->tm_yday+1); - setboolfield(L, "isdst", stm->tm_isdst); - } else { - char cc[3]; - luaL_Buffer b; - cc[0] = '%'; cc[2] = '\0'; - luaL_buffinit(L, &b); - for (; *s; s++) { - if (*s != '%' || *(s + 1) == '\0') { /* No conversion specifier? */ - luaL_addchar(&b, *s); - } else { - size_t reslen; - char buff[200]; /* Should be big enough for any conversion result. */ - cc[1] = *(++s); - reslen = strftime(buff, sizeof(buff), cc, stm); - luaL_addlstring(&b, buff, reslen); - } - } - luaL_pushresult(&b); - } - return 1; -} - -LJLIB_CF(os_time) -{ - time_t t; - if (lua_isnoneornil(L, 1)) { /* called without args? */ - t = time(NULL); /* get current time */ - } else { - struct tm ts; - luaL_checktype(L, 1, LUA_TTABLE); - lua_settop(L, 1); /* make sure table is at the top */ - ts.tm_sec = getfield(L, "sec", 0); - ts.tm_min = getfield(L, "min", 0); - ts.tm_hour = getfield(L, "hour", 12); - ts.tm_mday = getfield(L, "day", -1); - ts.tm_mon = getfield(L, "month", -1) - 1; - ts.tm_year = getfield(L, "year", -1) - 1900; - ts.tm_isdst = getboolfield(L, "isdst"); - t = mktime(&ts); - } - if (t == (time_t)(-1)) - lua_pushnil(L); - else - lua_pushnumber(L, (lua_Number)t); - return 1; -} - -LJLIB_CF(os_difftime) -{ - lua_pushnumber(L, difftime((time_t)(luaL_checknumber(L, 1)), - (time_t)(luaL_optnumber(L, 2, (lua_Number)0)))); - return 1; -} - -/* ------------------------------------------------------------------------ */ - -LJLIB_CF(os_setlocale) -{ -#if LJ_TARGET_PSVITA - lua_pushliteral(L, "C"); -#else - GCstr *s = lj_lib_optstr(L, 1); - const char *str = s ? strdata(s) : NULL; - int opt = lj_lib_checkopt(L, 2, 6, - "\5ctype\7numeric\4time\7collate\10monetary\1\377\3all"); - if (opt == 0) opt = LC_CTYPE; - else if (opt == 1) opt = LC_NUMERIC; - else if (opt == 2) opt = LC_TIME; - else if (opt == 3) opt = LC_COLLATE; - else if (opt == 4) opt = LC_MONETARY; - else if (opt == 6) opt = LC_ALL; - lua_pushstring(L, setlocale(opt, str)); -#endif - return 1; -} - -/* ------------------------------------------------------------------------ */ - -#include "lj_libdef.h" - -LUALIB_API int luaopen_os(lua_State *L) -{ - LJ_LIB_REG(L, LUA_OSLIBNAME, os); - return 1; -} - diff --git a/deps/luajit/src/lib_package.c b/deps/luajit/src/lib_package.c deleted file mode 100644 index ac38c815..00000000 --- a/deps/luajit/src/lib_package.c +++ /dev/null @@ -1,602 +0,0 @@ -/* -** Package library. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -** -** Major portions taken verbatim or adapted from the Lua interpreter. -** Copyright (C) 1994-2012 Lua.org, PUC-Rio. See Copyright Notice in lua.h -*/ - -#define lib_package_c -#define LUA_LIB - -#include "lua.h" -#include "lauxlib.h" -#include "lualib.h" - -#include "lj_obj.h" -#include "lj_err.h" -#include "lj_lib.h" - -/* ------------------------------------------------------------------------ */ - -/* Error codes for ll_loadfunc. */ -#define PACKAGE_ERR_LIB 1 -#define PACKAGE_ERR_FUNC 2 -#define PACKAGE_ERR_LOAD 3 - -/* Redefined in platform specific part. */ -#define PACKAGE_LIB_FAIL "open" -#define setprogdir(L) ((void)0) - -/* Symbol name prefixes. */ -#define SYMPREFIX_CF "luaopen_%s" -#define SYMPREFIX_BC "luaJIT_BC_%s" - -#if LJ_TARGET_DLOPEN - -#include - -static void ll_unloadlib(void *lib) -{ - dlclose(lib); -} - -static void *ll_load(lua_State *L, const char *path, int gl) -{ - void *lib = dlopen(path, RTLD_NOW | (gl ? RTLD_GLOBAL : RTLD_LOCAL)); - if (lib == NULL) lua_pushstring(L, dlerror()); - return lib; -} - -static lua_CFunction ll_sym(lua_State *L, void *lib, const char *sym) -{ - lua_CFunction f = (lua_CFunction)dlsym(lib, sym); - if (f == NULL) lua_pushstring(L, dlerror()); - return f; -} - -static const char *ll_bcsym(void *lib, const char *sym) -{ -#if defined(RTLD_DEFAULT) - if (lib == NULL) lib = RTLD_DEFAULT; -#elif LJ_TARGET_OSX || LJ_TARGET_BSD - if (lib == NULL) lib = (void *)(intptr_t)-2; -#endif - return (const char *)dlsym(lib, sym); -} - -#elif LJ_TARGET_WINDOWS - -#define WIN32_LEAN_AND_MEAN -#include - -#ifndef GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS -#define GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS 4 -#define GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT 2 -BOOL WINAPI GetModuleHandleExA(DWORD, LPCSTR, HMODULE*); -#endif - -#undef setprogdir - -static void setprogdir(lua_State *L) -{ - char buff[MAX_PATH + 1]; - char *lb; - DWORD nsize = sizeof(buff); - DWORD n = GetModuleFileNameA(NULL, buff, nsize); - if (n == 0 || n == nsize || (lb = strrchr(buff, '\\')) == NULL) { - luaL_error(L, "unable to get ModuleFileName"); - } else { - *lb = '\0'; - luaL_gsub(L, lua_tostring(L, -1), LUA_EXECDIR, buff); - lua_remove(L, -2); /* remove original string */ - } -} - -static void pusherror(lua_State *L) -{ - DWORD error = GetLastError(); - char buffer[128]; - if (FormatMessageA(FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM, - NULL, error, 0, buffer, sizeof(buffer), NULL)) - lua_pushstring(L, buffer); - else - lua_pushfstring(L, "system error %d\n", error); -} - -static void ll_unloadlib(void *lib) -{ - FreeLibrary((HINSTANCE)lib); -} - -static void *ll_load(lua_State *L, const char *path, int gl) -{ - HINSTANCE lib = LoadLibraryA(path); - if (lib == NULL) pusherror(L); - UNUSED(gl); - return lib; -} - -static lua_CFunction ll_sym(lua_State *L, void *lib, const char *sym) -{ - lua_CFunction f = (lua_CFunction)GetProcAddress((HINSTANCE)lib, sym); - if (f == NULL) pusherror(L); - return f; -} - -static const char *ll_bcsym(void *lib, const char *sym) -{ - if (lib) { - return (const char *)GetProcAddress((HINSTANCE)lib, sym); - } else { - HINSTANCE h = GetModuleHandleA(NULL); - const char *p = (const char *)GetProcAddress(h, sym); - if (p == NULL && GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS|GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, - (const char *)ll_bcsym, &h)) - p = (const char *)GetProcAddress(h, sym); - return p; - } -} - -#else - -#undef PACKAGE_LIB_FAIL -#define PACKAGE_LIB_FAIL "absent" - -#define DLMSG "dynamic libraries not enabled; no support for target OS" - -static void ll_unloadlib(void *lib) -{ - UNUSED(lib); -} - -static void *ll_load(lua_State *L, const char *path, int gl) -{ - UNUSED(path); UNUSED(gl); - lua_pushliteral(L, DLMSG); - return NULL; -} - -static lua_CFunction ll_sym(lua_State *L, void *lib, const char *sym) -{ - UNUSED(lib); UNUSED(sym); - lua_pushliteral(L, DLMSG); - return NULL; -} - -static const char *ll_bcsym(void *lib, const char *sym) -{ - UNUSED(lib); UNUSED(sym); - return NULL; -} - -#endif - -/* ------------------------------------------------------------------------ */ - -static void **ll_register(lua_State *L, const char *path) -{ - void **plib; - lua_pushfstring(L, "LOADLIB: %s", path); - lua_gettable(L, LUA_REGISTRYINDEX); /* check library in registry? */ - if (!lua_isnil(L, -1)) { /* is there an entry? */ - plib = (void **)lua_touserdata(L, -1); - } else { /* no entry yet; create one */ - lua_pop(L, 1); - plib = (void **)lua_newuserdata(L, sizeof(void *)); - *plib = NULL; - luaL_getmetatable(L, "_LOADLIB"); - lua_setmetatable(L, -2); - lua_pushfstring(L, "LOADLIB: %s", path); - lua_pushvalue(L, -2); - lua_settable(L, LUA_REGISTRYINDEX); - } - return plib; -} - -static const char *mksymname(lua_State *L, const char *modname, - const char *prefix) -{ - const char *funcname; - const char *mark = strchr(modname, *LUA_IGMARK); - if (mark) modname = mark + 1; - funcname = luaL_gsub(L, modname, ".", "_"); - funcname = lua_pushfstring(L, prefix, funcname); - lua_remove(L, -2); /* remove 'gsub' result */ - return funcname; -} - -static int ll_loadfunc(lua_State *L, const char *path, const char *name, int r) -{ - void **reg = ll_register(L, path); - if (*reg == NULL) *reg = ll_load(L, path, (*name == '*')); - if (*reg == NULL) { - return PACKAGE_ERR_LIB; /* Unable to load library. */ - } else if (*name == '*') { /* Only load library into global namespace. */ - lua_pushboolean(L, 1); - return 0; - } else { - const char *sym = r ? name : mksymname(L, name, SYMPREFIX_CF); - lua_CFunction f = ll_sym(L, *reg, sym); - if (f) { - lua_pushcfunction(L, f); - return 0; - } - if (!r) { - const char *bcdata = ll_bcsym(*reg, mksymname(L, name, SYMPREFIX_BC)); - lua_pop(L, 1); - if (bcdata) { - if (luaL_loadbuffer(L, bcdata, ~(size_t)0, name) != 0) - return PACKAGE_ERR_LOAD; - return 0; - } - } - return PACKAGE_ERR_FUNC; /* Unable to find function. */ - } -} - -static int lj_cf_package_loadlib(lua_State *L) -{ - const char *path = luaL_checkstring(L, 1); - const char *init = luaL_checkstring(L, 2); - int st = ll_loadfunc(L, path, init, 1); - if (st == 0) { /* no errors? */ - return 1; /* return the loaded function */ - } else { /* error; error message is on stack top */ - lua_pushnil(L); - lua_insert(L, -2); - lua_pushstring(L, (st == PACKAGE_ERR_LIB) ? PACKAGE_LIB_FAIL : "init"); - return 3; /* return nil, error message, and where */ - } -} - -static int lj_cf_package_unloadlib(lua_State *L) -{ - void **lib = (void **)luaL_checkudata(L, 1, "_LOADLIB"); - if (*lib) ll_unloadlib(*lib); - *lib = NULL; /* mark library as closed */ - return 0; -} - -/* ------------------------------------------------------------------------ */ - -static int readable(const char *filename) -{ - FILE *f = fopen(filename, "r"); /* try to open file */ - if (f == NULL) return 0; /* open failed */ - fclose(f); - return 1; -} - -static const char *pushnexttemplate(lua_State *L, const char *path) -{ - const char *l; - while (*path == *LUA_PATHSEP) path++; /* skip separators */ - if (*path == '\0') return NULL; /* no more templates */ - l = strchr(path, *LUA_PATHSEP); /* find next separator */ - if (l == NULL) l = path + strlen(path); - lua_pushlstring(L, path, (size_t)(l - path)); /* template */ - return l; -} - -static const char *searchpath (lua_State *L, const char *name, - const char *path, const char *sep, - const char *dirsep) -{ - luaL_Buffer msg; /* to build error message */ - luaL_buffinit(L, &msg); - if (*sep != '\0') /* non-empty separator? */ - name = luaL_gsub(L, name, sep, dirsep); /* replace it by 'dirsep' */ - while ((path = pushnexttemplate(L, path)) != NULL) { - const char *filename = luaL_gsub(L, lua_tostring(L, -1), - LUA_PATH_MARK, name); - lua_remove(L, -2); /* remove path template */ - if (readable(filename)) /* does file exist and is readable? */ - return filename; /* return that file name */ - lua_pushfstring(L, "\n\tno file " LUA_QS, filename); - lua_remove(L, -2); /* remove file name */ - luaL_addvalue(&msg); /* concatenate error msg. entry */ - } - luaL_pushresult(&msg); /* create error message */ - return NULL; /* not found */ -} - -static int lj_cf_package_searchpath(lua_State *L) -{ - const char *f = searchpath(L, luaL_checkstring(L, 1), - luaL_checkstring(L, 2), - luaL_optstring(L, 3, "."), - luaL_optstring(L, 4, LUA_DIRSEP)); - if (f != NULL) { - return 1; - } else { /* error message is on top of the stack */ - lua_pushnil(L); - lua_insert(L, -2); - return 2; /* return nil + error message */ - } -} - -static const char *findfile(lua_State *L, const char *name, - const char *pname) -{ - const char *path; - lua_getfield(L, LUA_ENVIRONINDEX, pname); - path = lua_tostring(L, -1); - if (path == NULL) - luaL_error(L, LUA_QL("package.%s") " must be a string", pname); - return searchpath(L, name, path, ".", LUA_DIRSEP); -} - -static void loaderror(lua_State *L, const char *filename) -{ - luaL_error(L, "error loading module " LUA_QS " from file " LUA_QS ":\n\t%s", - lua_tostring(L, 1), filename, lua_tostring(L, -1)); -} - -static int lj_cf_package_loader_lua(lua_State *L) -{ - const char *filename; - const char *name = luaL_checkstring(L, 1); - filename = findfile(L, name, "path"); - if (filename == NULL) return 1; /* library not found in this path */ - if (luaL_loadfile(L, filename) != 0) - loaderror(L, filename); - return 1; /* library loaded successfully */ -} - -static int lj_cf_package_loader_c(lua_State *L) -{ - const char *name = luaL_checkstring(L, 1); - const char *filename = findfile(L, name, "cpath"); - if (filename == NULL) return 1; /* library not found in this path */ - if (ll_loadfunc(L, filename, name, 0) != 0) - loaderror(L, filename); - return 1; /* library loaded successfully */ -} - -static int lj_cf_package_loader_croot(lua_State *L) -{ - const char *filename; - const char *name = luaL_checkstring(L, 1); - const char *p = strchr(name, '.'); - int st; - if (p == NULL) return 0; /* is root */ - lua_pushlstring(L, name, (size_t)(p - name)); - filename = findfile(L, lua_tostring(L, -1), "cpath"); - if (filename == NULL) return 1; /* root not found */ - if ((st = ll_loadfunc(L, filename, name, 0)) != 0) { - if (st != PACKAGE_ERR_FUNC) loaderror(L, filename); /* real error */ - lua_pushfstring(L, "\n\tno module " LUA_QS " in file " LUA_QS, - name, filename); - return 1; /* function not found */ - } - return 1; -} - -static int lj_cf_package_loader_preload(lua_State *L) -{ - const char *name = luaL_checkstring(L, 1); - lua_getfield(L, LUA_ENVIRONINDEX, "preload"); - if (!lua_istable(L, -1)) - luaL_error(L, LUA_QL("package.preload") " must be a table"); - lua_getfield(L, -1, name); - if (lua_isnil(L, -1)) { /* Not found? */ - const char *bcname = mksymname(L, name, SYMPREFIX_BC); - const char *bcdata = ll_bcsym(NULL, bcname); - if (bcdata == NULL || luaL_loadbuffer(L, bcdata, ~(size_t)0, name) != 0) - lua_pushfstring(L, "\n\tno field package.preload['%s']", name); - } - return 1; -} - -/* ------------------------------------------------------------------------ */ - -static const int sentinel_ = 0; -#define sentinel ((void *)&sentinel_) - -static int lj_cf_package_require(lua_State *L) -{ - const char *name = luaL_checkstring(L, 1); - int i; - lua_settop(L, 1); /* _LOADED table will be at index 2 */ - lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED"); - lua_getfield(L, 2, name); - if (lua_toboolean(L, -1)) { /* is it there? */ - if (lua_touserdata(L, -1) == sentinel) /* check loops */ - luaL_error(L, "loop or previous error loading module " LUA_QS, name); - return 1; /* package is already loaded */ - } - /* else must load it; iterate over available loaders */ - lua_getfield(L, LUA_ENVIRONINDEX, "loaders"); - if (!lua_istable(L, -1)) - luaL_error(L, LUA_QL("package.loaders") " must be a table"); - lua_pushliteral(L, ""); /* error message accumulator */ - for (i = 1; ; i++) { - lua_rawgeti(L, -2, i); /* get a loader */ - if (lua_isnil(L, -1)) - luaL_error(L, "module " LUA_QS " not found:%s", - name, lua_tostring(L, -2)); - lua_pushstring(L, name); - lua_call(L, 1, 1); /* call it */ - if (lua_isfunction(L, -1)) /* did it find module? */ - break; /* module loaded successfully */ - else if (lua_isstring(L, -1)) /* loader returned error message? */ - lua_concat(L, 2); /* accumulate it */ - else - lua_pop(L, 1); - } - lua_pushlightuserdata(L, sentinel); - lua_setfield(L, 2, name); /* _LOADED[name] = sentinel */ - lua_pushstring(L, name); /* pass name as argument to module */ - lua_call(L, 1, 1); /* run loaded module */ - if (!lua_isnil(L, -1)) /* non-nil return? */ - lua_setfield(L, 2, name); /* _LOADED[name] = returned value */ - lua_getfield(L, 2, name); - if (lua_touserdata(L, -1) == sentinel) { /* module did not set a value? */ - lua_pushboolean(L, 1); /* use true as result */ - lua_pushvalue(L, -1); /* extra copy to be returned */ - lua_setfield(L, 2, name); /* _LOADED[name] = true */ - } - lj_lib_checkfpu(L); - return 1; -} - -/* ------------------------------------------------------------------------ */ - -static void setfenv(lua_State *L) -{ - lua_Debug ar; - if (lua_getstack(L, 1, &ar) == 0 || - lua_getinfo(L, "f", &ar) == 0 || /* get calling function */ - lua_iscfunction(L, -1)) - luaL_error(L, LUA_QL("module") " not called from a Lua function"); - lua_pushvalue(L, -2); - lua_setfenv(L, -2); - lua_pop(L, 1); -} - -static void dooptions(lua_State *L, int n) -{ - int i; - for (i = 2; i <= n; i++) { - lua_pushvalue(L, i); /* get option (a function) */ - lua_pushvalue(L, -2); /* module */ - lua_call(L, 1, 0); - } -} - -static void modinit(lua_State *L, const char *modname) -{ - const char *dot; - lua_pushvalue(L, -1); - lua_setfield(L, -2, "_M"); /* module._M = module */ - lua_pushstring(L, modname); - lua_setfield(L, -2, "_NAME"); - dot = strrchr(modname, '.'); /* look for last dot in module name */ - if (dot == NULL) dot = modname; else dot++; - /* set _PACKAGE as package name (full module name minus last part) */ - lua_pushlstring(L, modname, (size_t)(dot - modname)); - lua_setfield(L, -2, "_PACKAGE"); -} - -static int lj_cf_package_module(lua_State *L) -{ - const char *modname = luaL_checkstring(L, 1); - int loaded = lua_gettop(L) + 1; /* index of _LOADED table */ - lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED"); - lua_getfield(L, loaded, modname); /* get _LOADED[modname] */ - if (!lua_istable(L, -1)) { /* not found? */ - lua_pop(L, 1); /* remove previous result */ - /* try global variable (and create one if it does not exist) */ - if (luaL_findtable(L, LUA_GLOBALSINDEX, modname, 1) != NULL) - lj_err_callerv(L, LJ_ERR_BADMODN, modname); - lua_pushvalue(L, -1); - lua_setfield(L, loaded, modname); /* _LOADED[modname] = new table */ - } - /* check whether table already has a _NAME field */ - lua_getfield(L, -1, "_NAME"); - if (!lua_isnil(L, -1)) { /* is table an initialized module? */ - lua_pop(L, 1); - } else { /* no; initialize it */ - lua_pop(L, 1); - modinit(L, modname); - } - lua_pushvalue(L, -1); - setfenv(L); - dooptions(L, loaded - 1); - return 0; -} - -static int lj_cf_package_seeall(lua_State *L) -{ - luaL_checktype(L, 1, LUA_TTABLE); - if (!lua_getmetatable(L, 1)) { - lua_createtable(L, 0, 1); /* create new metatable */ - lua_pushvalue(L, -1); - lua_setmetatable(L, 1); - } - lua_pushvalue(L, LUA_GLOBALSINDEX); - lua_setfield(L, -2, "__index"); /* mt.__index = _G */ - return 0; -} - -/* ------------------------------------------------------------------------ */ - -#define AUXMARK "\1" - -static void setpath(lua_State *L, const char *fieldname, const char *envname, - const char *def, int noenv) -{ -#if LJ_TARGET_CONSOLE - const char *path = NULL; - UNUSED(envname); -#else - const char *path = getenv(envname); -#endif - if (path == NULL || noenv) { - lua_pushstring(L, def); - } else { - path = luaL_gsub(L, path, LUA_PATHSEP LUA_PATHSEP, - LUA_PATHSEP AUXMARK LUA_PATHSEP); - luaL_gsub(L, path, AUXMARK, def); - lua_remove(L, -2); - } - setprogdir(L); - lua_setfield(L, -2, fieldname); -} - -static const luaL_Reg package_lib[] = { - { "loadlib", lj_cf_package_loadlib }, - { "searchpath", lj_cf_package_searchpath }, - { "seeall", lj_cf_package_seeall }, - { NULL, NULL } -}; - -static const luaL_Reg package_global[] = { - { "module", lj_cf_package_module }, - { "require", lj_cf_package_require }, - { NULL, NULL } -}; - -static const lua_CFunction package_loaders[] = -{ - lj_cf_package_loader_preload, - lj_cf_package_loader_lua, - lj_cf_package_loader_c, - lj_cf_package_loader_croot, - NULL -}; - -LUALIB_API int luaopen_package(lua_State *L) -{ - int i; - int noenv; - luaL_newmetatable(L, "_LOADLIB"); - lj_lib_pushcf(L, lj_cf_package_unloadlib, 1); - lua_setfield(L, -2, "__gc"); - luaL_register(L, LUA_LOADLIBNAME, package_lib); - lua_pushvalue(L, -1); - lua_replace(L, LUA_ENVIRONINDEX); - lua_createtable(L, sizeof(package_loaders)/sizeof(package_loaders[0])-1, 0); - for (i = 0; package_loaders[i] != NULL; i++) { - lj_lib_pushcf(L, package_loaders[i], 1); - lua_rawseti(L, -2, i+1); - } - lua_setfield(L, -2, "loaders"); - lua_getfield(L, LUA_REGISTRYINDEX, "LUA_NOENV"); - noenv = lua_toboolean(L, -1); - lua_pop(L, 1); - setpath(L, "path", LUA_PATH, LUA_PATH_DEFAULT, noenv); - setpath(L, "cpath", LUA_CPATH, LUA_CPATH_DEFAULT, noenv); - lua_pushliteral(L, LUA_PATH_CONFIG); - lua_setfield(L, -2, "config"); - luaL_findtable(L, LUA_REGISTRYINDEX, "_LOADED", 16); - lua_setfield(L, -2, "loaded"); - luaL_findtable(L, LUA_REGISTRYINDEX, "_PRELOAD", 4); - lua_setfield(L, -2, "preload"); - lua_pushvalue(L, LUA_GLOBALSINDEX); - luaL_register(L, NULL, package_global); - lua_pop(L, 1); - return 1; -} - diff --git a/deps/luajit/src/lib_string.c b/deps/luajit/src/lib_string.c deleted file mode 100644 index c6168edb..00000000 --- a/deps/luajit/src/lib_string.c +++ /dev/null @@ -1,940 +0,0 @@ -/* -** String library. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -** -** Major portions taken verbatim or adapted from the Lua interpreter. -** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h -*/ - -#include - -#define lib_string_c -#define LUA_LIB - -#include "lua.h" -#include "lauxlib.h" -#include "lualib.h" - -#include "lj_obj.h" -#include "lj_gc.h" -#include "lj_err.h" -#include "lj_str.h" -#include "lj_tab.h" -#include "lj_meta.h" -#include "lj_state.h" -#include "lj_ff.h" -#include "lj_bcdump.h" -#include "lj_char.h" -#include "lj_lib.h" - -/* ------------------------------------------------------------------------ */ - -#define LJLIB_MODULE_string - -LJLIB_ASM(string_len) LJLIB_REC(.) -{ - lj_lib_checkstr(L, 1); - return FFH_RETRY; -} - -LJLIB_ASM(string_byte) LJLIB_REC(string_range 0) -{ - GCstr *s = lj_lib_checkstr(L, 1); - int32_t len = (int32_t)s->len; - int32_t start = lj_lib_optint(L, 2, 1); - int32_t stop = lj_lib_optint(L, 3, start); - int32_t n, i; - const unsigned char *p; - if (stop < 0) stop += len+1; - if (start < 0) start += len+1; - if (start <= 0) start = 1; - if (stop > len) stop = len; - if (start > stop) return FFH_RES(0); /* Empty interval: return no results. */ - start--; - n = stop - start; - if ((uint32_t)n > LUAI_MAXCSTACK) - lj_err_caller(L, LJ_ERR_STRSLC); - lj_state_checkstack(L, (MSize)n); - p = (const unsigned char *)strdata(s) + start; - for (i = 0; i < n; i++) - setintV(L->base + i-1, p[i]); - return FFH_RES(n); -} - -LJLIB_ASM(string_char) -{ - int i, nargs = (int)(L->top - L->base); - char *buf = lj_str_needbuf(L, &G(L)->tmpbuf, (MSize)nargs); - for (i = 1; i <= nargs; i++) { - int32_t k = lj_lib_checkint(L, i); - if (!checku8(k)) - lj_err_arg(L, i, LJ_ERR_BADVAL); - buf[i-1] = (char)k; - } - setstrV(L, L->base-1, lj_str_new(L, buf, (size_t)nargs)); - return FFH_RES(1); -} - -LJLIB_ASM(string_sub) LJLIB_REC(string_range 1) -{ - lj_lib_checkstr(L, 1); - lj_lib_checkint(L, 2); - setintV(L->base+2, lj_lib_optint(L, 3, -1)); - return FFH_RETRY; -} - -LJLIB_ASM(string_rep) -{ - GCstr *s = lj_lib_checkstr(L, 1); - int32_t k = lj_lib_checkint(L, 2); - GCstr *sep = lj_lib_optstr(L, 3); - int32_t len = (int32_t)s->len; - global_State *g = G(L); - int64_t tlen; - const char *src; - char *buf; - if (k <= 0) { - empty: - setstrV(L, L->base-1, &g->strempty); - return FFH_RES(1); - } - if (sep) { - tlen = (int64_t)len + sep->len; - if (tlen > LJ_MAX_STR) - lj_err_caller(L, LJ_ERR_STROV); - tlen *= k; - if (tlen > LJ_MAX_STR) - lj_err_caller(L, LJ_ERR_STROV); - } else { - tlen = (int64_t)k * len; - if (tlen > LJ_MAX_STR) - lj_err_caller(L, LJ_ERR_STROV); - } - if (tlen == 0) goto empty; - buf = lj_str_needbuf(L, &g->tmpbuf, (MSize)tlen); - src = strdata(s); - if (sep) { - tlen -= sep->len; /* Ignore trailing separator. */ - if (k > 1) { /* Paste one string and one separator. */ - int32_t i; - i = 0; while (i < len) *buf++ = src[i++]; - src = strdata(sep); len = sep->len; - i = 0; while (i < len) *buf++ = src[i++]; - src = g->tmpbuf.buf; len += s->len; k--; /* Now copy that k-1 times. */ - } - } - do { - int32_t i = 0; - do { *buf++ = src[i++]; } while (i < len); - } while (--k > 0); - setstrV(L, L->base-1, lj_str_new(L, g->tmpbuf.buf, (size_t)tlen)); - return FFH_RES(1); -} - -LJLIB_ASM(string_reverse) -{ - GCstr *s = lj_lib_checkstr(L, 1); - lj_str_needbuf(L, &G(L)->tmpbuf, s->len); - return FFH_RETRY; -} -LJLIB_ASM_(string_lower) -LJLIB_ASM_(string_upper) - -/* ------------------------------------------------------------------------ */ - -static int writer_buf(lua_State *L, const void *p, size_t size, void *b) -{ - luaL_addlstring((luaL_Buffer *)b, (const char *)p, size); - UNUSED(L); - return 0; -} - -LJLIB_CF(string_dump) -{ - GCfunc *fn = lj_lib_checkfunc(L, 1); - int strip = L->base+1 < L->top && tvistruecond(L->base+1); - luaL_Buffer b; - L->top = L->base+1; - luaL_buffinit(L, &b); - if (!isluafunc(fn) || lj_bcwrite(L, funcproto(fn), writer_buf, &b, strip)) - lj_err_caller(L, LJ_ERR_STRDUMP); - luaL_pushresult(&b); - return 1; -} - -/* ------------------------------------------------------------------------ */ - -/* macro to `unsign' a character */ -#define uchar(c) ((unsigned char)(c)) - -#define CAP_UNFINISHED (-1) -#define CAP_POSITION (-2) - -typedef struct MatchState { - const char *src_init; /* init of source string */ - const char *src_end; /* end (`\0') of source string */ - lua_State *L; - int level; /* total number of captures (finished or unfinished) */ - int depth; - struct { - const char *init; - ptrdiff_t len; - } capture[LUA_MAXCAPTURES]; -} MatchState; - -#define L_ESC '%' -#define SPECIALS "^$*+?.([%-" - -static int check_capture(MatchState *ms, int l) -{ - l -= '1'; - if (l < 0 || l >= ms->level || ms->capture[l].len == CAP_UNFINISHED) - lj_err_caller(ms->L, LJ_ERR_STRCAPI); - return l; -} - -static int capture_to_close(MatchState *ms) -{ - int level = ms->level; - for (level--; level>=0; level--) - if (ms->capture[level].len == CAP_UNFINISHED) return level; - lj_err_caller(ms->L, LJ_ERR_STRPATC); - return 0; /* unreachable */ -} - -static const char *classend(MatchState *ms, const char *p) -{ - switch (*p++) { - case L_ESC: - if (*p == '\0') - lj_err_caller(ms->L, LJ_ERR_STRPATE); - return p+1; - case '[': - if (*p == '^') p++; - do { /* look for a `]' */ - if (*p == '\0') - lj_err_caller(ms->L, LJ_ERR_STRPATM); - if (*(p++) == L_ESC && *p != '\0') - p++; /* skip escapes (e.g. `%]') */ - } while (*p != ']'); - return p+1; - default: - return p; - } -} - -static const unsigned char match_class_map[32] = { - 0,LJ_CHAR_ALPHA,0,LJ_CHAR_CNTRL,LJ_CHAR_DIGIT,0,0,LJ_CHAR_GRAPH,0,0,0,0, - LJ_CHAR_LOWER,0,0,0,LJ_CHAR_PUNCT,0,0,LJ_CHAR_SPACE,0, - LJ_CHAR_UPPER,0,LJ_CHAR_ALNUM,LJ_CHAR_XDIGIT,0,0,0,0,0,0,0 -}; - -static int match_class(int c, int cl) -{ - if ((cl & 0xc0) == 0x40) { - int t = match_class_map[(cl&0x1f)]; - if (t) { - t = lj_char_isa(c, t); - return (cl & 0x20) ? t : !t; - } - if (cl == 'z') return c == 0; - if (cl == 'Z') return c != 0; - } - return (cl == c); -} - -static int matchbracketclass(int c, const char *p, const char *ec) -{ - int sig = 1; - if (*(p+1) == '^') { - sig = 0; - p++; /* skip the `^' */ - } - while (++p < ec) { - if (*p == L_ESC) { - p++; - if (match_class(c, uchar(*p))) - return sig; - } - else if ((*(p+1) == '-') && (p+2 < ec)) { - p+=2; - if (uchar(*(p-2)) <= c && c <= uchar(*p)) - return sig; - } - else if (uchar(*p) == c) return sig; - } - return !sig; -} - -static int singlematch(int c, const char *p, const char *ep) -{ - switch (*p) { - case '.': return 1; /* matches any char */ - case L_ESC: return match_class(c, uchar(*(p+1))); - case '[': return matchbracketclass(c, p, ep-1); - default: return (uchar(*p) == c); - } -} - -static const char *match(MatchState *ms, const char *s, const char *p); - -static const char *matchbalance(MatchState *ms, const char *s, const char *p) -{ - if (*p == 0 || *(p+1) == 0) - lj_err_caller(ms->L, LJ_ERR_STRPATU); - if (*s != *p) { - return NULL; - } else { - int b = *p; - int e = *(p+1); - int cont = 1; - while (++s < ms->src_end) { - if (*s == e) { - if (--cont == 0) return s+1; - } else if (*s == b) { - cont++; - } - } - } - return NULL; /* string ends out of balance */ -} - -static const char *max_expand(MatchState *ms, const char *s, - const char *p, const char *ep) -{ - ptrdiff_t i = 0; /* counts maximum expand for item */ - while ((s+i)src_end && singlematch(uchar(*(s+i)), p, ep)) - i++; - /* keeps trying to match with the maximum repetitions */ - while (i>=0) { - const char *res = match(ms, (s+i), ep+1); - if (res) return res; - i--; /* else didn't match; reduce 1 repetition to try again */ - } - return NULL; -} - -static const char *min_expand(MatchState *ms, const char *s, - const char *p, const char *ep) -{ - for (;;) { - const char *res = match(ms, s, ep+1); - if (res != NULL) - return res; - else if (ssrc_end && singlematch(uchar(*s), p, ep)) - s++; /* try with one more repetition */ - else - return NULL; - } -} - -static const char *start_capture(MatchState *ms, const char *s, - const char *p, int what) -{ - const char *res; - int level = ms->level; - if (level >= LUA_MAXCAPTURES) lj_err_caller(ms->L, LJ_ERR_STRCAPN); - ms->capture[level].init = s; - ms->capture[level].len = what; - ms->level = level+1; - if ((res=match(ms, s, p)) == NULL) /* match failed? */ - ms->level--; /* undo capture */ - return res; -} - -static const char *end_capture(MatchState *ms, const char *s, - const char *p) -{ - int l = capture_to_close(ms); - const char *res; - ms->capture[l].len = s - ms->capture[l].init; /* close capture */ - if ((res = match(ms, s, p)) == NULL) /* match failed? */ - ms->capture[l].len = CAP_UNFINISHED; /* undo capture */ - return res; -} - -static const char *match_capture(MatchState *ms, const char *s, int l) -{ - size_t len; - l = check_capture(ms, l); - len = (size_t)ms->capture[l].len; - if ((size_t)(ms->src_end-s) >= len && - memcmp(ms->capture[l].init, s, len) == 0) - return s+len; - else - return NULL; -} - -static const char *match(MatchState *ms, const char *s, const char *p) -{ - if (++ms->depth > LJ_MAX_XLEVEL) - lj_err_caller(ms->L, LJ_ERR_STRPATX); - init: /* using goto's to optimize tail recursion */ - switch (*p) { - case '(': /* start capture */ - if (*(p+1) == ')') /* position capture? */ - s = start_capture(ms, s, p+2, CAP_POSITION); - else - s = start_capture(ms, s, p+1, CAP_UNFINISHED); - break; - case ')': /* end capture */ - s = end_capture(ms, s, p+1); - break; - case L_ESC: - switch (*(p+1)) { - case 'b': /* balanced string? */ - s = matchbalance(ms, s, p+2); - if (s == NULL) break; - p+=4; - goto init; /* else s = match(ms, s, p+4); */ - case 'f': { /* frontier? */ - const char *ep; char previous; - p += 2; - if (*p != '[') - lj_err_caller(ms->L, LJ_ERR_STRPATB); - ep = classend(ms, p); /* points to what is next */ - previous = (s == ms->src_init) ? '\0' : *(s-1); - if (matchbracketclass(uchar(previous), p, ep-1) || - !matchbracketclass(uchar(*s), p, ep-1)) { s = NULL; break; } - p=ep; - goto init; /* else s = match(ms, s, ep); */ - } - default: - if (lj_char_isdigit(uchar(*(p+1)))) { /* capture results (%0-%9)? */ - s = match_capture(ms, s, uchar(*(p+1))); - if (s == NULL) break; - p+=2; - goto init; /* else s = match(ms, s, p+2) */ - } - goto dflt; /* case default */ - } - break; - case '\0': /* end of pattern */ - break; /* match succeeded */ - case '$': - /* is the `$' the last char in pattern? */ - if (*(p+1) != '\0') goto dflt; - if (s != ms->src_end) s = NULL; /* check end of string */ - break; - default: dflt: { /* it is a pattern item */ - const char *ep = classend(ms, p); /* points to what is next */ - int m = ssrc_end && singlematch(uchar(*s), p, ep); - switch (*ep) { - case '?': { /* optional */ - const char *res; - if (m && ((res=match(ms, s+1, ep+1)) != NULL)) { - s = res; - break; - } - p=ep+1; - goto init; /* else s = match(ms, s, ep+1); */ - } - case '*': /* 0 or more repetitions */ - s = max_expand(ms, s, p, ep); - break; - case '+': /* 1 or more repetitions */ - s = (m ? max_expand(ms, s+1, p, ep) : NULL); - break; - case '-': /* 0 or more repetitions (minimum) */ - s = min_expand(ms, s, p, ep); - break; - default: - if (m) { s++; p=ep; goto init; } /* else s = match(ms, s+1, ep); */ - s = NULL; - break; - } - break; - } - } - ms->depth--; - return s; -} - -static const char *lmemfind(const char *s1, size_t l1, - const char *s2, size_t l2) -{ - if (l2 == 0) { - return s1; /* empty strings are everywhere */ - } else if (l2 > l1) { - return NULL; /* avoids a negative `l1' */ - } else { - const char *init; /* to search for a `*s2' inside `s1' */ - l2--; /* 1st char will be checked by `memchr' */ - l1 = l1-l2; /* `s2' cannot be found after that */ - while (l1 > 0 && (init = (const char *)memchr(s1, *s2, l1)) != NULL) { - init++; /* 1st char is already checked */ - if (memcmp(init, s2+1, l2) == 0) { - return init-1; - } else { /* correct `l1' and `s1' to try again */ - l1 -= (size_t)(init-s1); - s1 = init; - } - } - return NULL; /* not found */ - } -} - -static void push_onecapture(MatchState *ms, int i, const char *s, const char *e) -{ - if (i >= ms->level) { - if (i == 0) /* ms->level == 0, too */ - lua_pushlstring(ms->L, s, (size_t)(e - s)); /* add whole match */ - else - lj_err_caller(ms->L, LJ_ERR_STRCAPI); - } else { - ptrdiff_t l = ms->capture[i].len; - if (l == CAP_UNFINISHED) lj_err_caller(ms->L, LJ_ERR_STRCAPU); - if (l == CAP_POSITION) - lua_pushinteger(ms->L, ms->capture[i].init - ms->src_init + 1); - else - lua_pushlstring(ms->L, ms->capture[i].init, (size_t)l); - } -} - -static int push_captures(MatchState *ms, const char *s, const char *e) -{ - int i; - int nlevels = (ms->level == 0 && s) ? 1 : ms->level; - luaL_checkstack(ms->L, nlevels, "too many captures"); - for (i = 0; i < nlevels; i++) - push_onecapture(ms, i, s, e); - return nlevels; /* number of strings pushed */ -} - -static ptrdiff_t posrelat(ptrdiff_t pos, size_t len) -{ - /* relative string position: negative means back from end */ - if (pos < 0) pos += (ptrdiff_t)len + 1; - return (pos >= 0) ? pos : 0; -} - -static int str_find_aux(lua_State *L, int find) -{ - size_t l1, l2; - const char *s = luaL_checklstring(L, 1, &l1); - const char *p = luaL_checklstring(L, 2, &l2); - ptrdiff_t init = posrelat(luaL_optinteger(L, 3, 1), l1) - 1; - if (init < 0) { - init = 0; - } else if ((size_t)(init) > l1) { -#if LJ_52 - setnilV(L->top-1); - return 1; -#else - init = (ptrdiff_t)l1; -#endif - } - if (find && (lua_toboolean(L, 4) || /* explicit request? */ - strpbrk(p, SPECIALS) == NULL)) { /* or no special characters? */ - /* do a plain search */ - const char *s2 = lmemfind(s+init, l1-(size_t)init, p, l2); - if (s2) { - lua_pushinteger(L, s2-s+1); - lua_pushinteger(L, s2-s+(ptrdiff_t)l2); - return 2; - } - } else { - MatchState ms; - int anchor = (*p == '^') ? (p++, 1) : 0; - const char *s1=s+init; - ms.L = L; - ms.src_init = s; - ms.src_end = s+l1; - do { - const char *res; - ms.level = ms.depth = 0; - if ((res=match(&ms, s1, p)) != NULL) { - if (find) { - lua_pushinteger(L, s1-s+1); /* start */ - lua_pushinteger(L, res-s); /* end */ - return push_captures(&ms, NULL, 0) + 2; - } else { - return push_captures(&ms, s1, res); - } - } - } while (s1++ < ms.src_end && !anchor); - } - lua_pushnil(L); /* not found */ - return 1; -} - -LJLIB_CF(string_find) -{ - return str_find_aux(L, 1); -} - -LJLIB_CF(string_match) -{ - return str_find_aux(L, 0); -} - -LJLIB_NOREG LJLIB_CF(string_gmatch_aux) -{ - const char *p = strVdata(lj_lib_upvalue(L, 2)); - GCstr *str = strV(lj_lib_upvalue(L, 1)); - const char *s = strdata(str); - TValue *tvpos = lj_lib_upvalue(L, 3); - const char *src = s + tvpos->u32.lo; - MatchState ms; - ms.L = L; - ms.src_init = s; - ms.src_end = s + str->len; - for (; src <= ms.src_end; src++) { - const char *e; - ms.level = ms.depth = 0; - if ((e = match(&ms, src, p)) != NULL) { - int32_t pos = (int32_t)(e - s); - if (e == src) pos++; /* Ensure progress for empty match. */ - tvpos->u32.lo = (uint32_t)pos; - return push_captures(&ms, src, e); - } - } - return 0; /* not found */ -} - -LJLIB_CF(string_gmatch) -{ - lj_lib_checkstr(L, 1); - lj_lib_checkstr(L, 2); - L->top = L->base+3; - (L->top-1)->u64 = 0; - lj_lib_pushcc(L, lj_cf_string_gmatch_aux, FF_string_gmatch_aux, 3); - return 1; -} - -static void add_s(MatchState *ms, luaL_Buffer *b, const char *s, const char *e) -{ - size_t l, i; - const char *news = lua_tolstring(ms->L, 3, &l); - for (i = 0; i < l; i++) { - if (news[i] != L_ESC) { - luaL_addchar(b, news[i]); - } else { - i++; /* skip ESC */ - if (!lj_char_isdigit(uchar(news[i]))) { - luaL_addchar(b, news[i]); - } else if (news[i] == '0') { - luaL_addlstring(b, s, (size_t)(e - s)); - } else { - push_onecapture(ms, news[i] - '1', s, e); - luaL_addvalue(b); /* add capture to accumulated result */ - } - } - } -} - -static void add_value(MatchState *ms, luaL_Buffer *b, - const char *s, const char *e) -{ - lua_State *L = ms->L; - switch (lua_type(L, 3)) { - case LUA_TNUMBER: - case LUA_TSTRING: { - add_s(ms, b, s, e); - return; - } - case LUA_TFUNCTION: { - int n; - lua_pushvalue(L, 3); - n = push_captures(ms, s, e); - lua_call(L, n, 1); - break; - } - case LUA_TTABLE: { - push_onecapture(ms, 0, s, e); - lua_gettable(L, 3); - break; - } - } - if (!lua_toboolean(L, -1)) { /* nil or false? */ - lua_pop(L, 1); - lua_pushlstring(L, s, (size_t)(e - s)); /* keep original text */ - } else if (!lua_isstring(L, -1)) { - lj_err_callerv(L, LJ_ERR_STRGSRV, luaL_typename(L, -1)); - } - luaL_addvalue(b); /* add result to accumulator */ -} - -LJLIB_CF(string_gsub) -{ - size_t srcl; - const char *src = luaL_checklstring(L, 1, &srcl); - const char *p = luaL_checkstring(L, 2); - int tr = lua_type(L, 3); - int max_s = luaL_optint(L, 4, (int)(srcl+1)); - int anchor = (*p == '^') ? (p++, 1) : 0; - int n = 0; - MatchState ms; - luaL_Buffer b; - if (!(tr == LUA_TNUMBER || tr == LUA_TSTRING || - tr == LUA_TFUNCTION || tr == LUA_TTABLE)) - lj_err_arg(L, 3, LJ_ERR_NOSFT); - luaL_buffinit(L, &b); - ms.L = L; - ms.src_init = src; - ms.src_end = src+srcl; - while (n < max_s) { - const char *e; - ms.level = ms.depth = 0; - e = match(&ms, src, p); - if (e) { - n++; - add_value(&ms, &b, src, e); - } - if (e && e>src) /* non empty match? */ - src = e; /* skip it */ - else if (src < ms.src_end) - luaL_addchar(&b, *src++); - else - break; - if (anchor) - break; - } - luaL_addlstring(&b, src, (size_t)(ms.src_end-src)); - luaL_pushresult(&b); - lua_pushinteger(L, n); /* number of substitutions */ - return 2; -} - -/* ------------------------------------------------------------------------ */ - -/* maximum size of each formatted item (> len(format('%99.99f', -1e308))) */ -#define MAX_FMTITEM 512 -/* valid flags in a format specification */ -#define FMT_FLAGS "-+ #0" -/* -** maximum size of each format specification (such as '%-099.99d') -** (+10 accounts for %99.99x plus margin of error) -*/ -#define MAX_FMTSPEC (sizeof(FMT_FLAGS) + sizeof(LUA_INTFRMLEN) + 10) - -static void addquoted(lua_State *L, luaL_Buffer *b, int arg) -{ - GCstr *str = lj_lib_checkstr(L, arg); - int32_t len = (int32_t)str->len; - const char *s = strdata(str); - luaL_addchar(b, '"'); - while (len--) { - uint32_t c = uchar(*s); - if (c == '"' || c == '\\' || c == '\n') { - luaL_addchar(b, '\\'); - } else if (lj_char_iscntrl(c)) { /* This can only be 0-31 or 127. */ - uint32_t d; - luaL_addchar(b, '\\'); - if (c >= 100 || lj_char_isdigit(uchar(s[1]))) { - luaL_addchar(b, '0'+(c >= 100)); if (c >= 100) c -= 100; - goto tens; - } else if (c >= 10) { - tens: - d = (c * 205) >> 11; c -= d * 10; luaL_addchar(b, '0'+d); - } - c += '0'; - } - luaL_addchar(b, c); - s++; - } - luaL_addchar(b, '"'); -} - -static const char *scanformat(lua_State *L, const char *strfrmt, char *form) -{ - const char *p = strfrmt; - while (*p != '\0' && strchr(FMT_FLAGS, *p) != NULL) p++; /* skip flags */ - if ((size_t)(p - strfrmt) >= sizeof(FMT_FLAGS)) - lj_err_caller(L, LJ_ERR_STRFMTR); - if (lj_char_isdigit(uchar(*p))) p++; /* skip width */ - if (lj_char_isdigit(uchar(*p))) p++; /* (2 digits at most) */ - if (*p == '.') { - p++; - if (lj_char_isdigit(uchar(*p))) p++; /* skip precision */ - if (lj_char_isdigit(uchar(*p))) p++; /* (2 digits at most) */ - } - if (lj_char_isdigit(uchar(*p))) - lj_err_caller(L, LJ_ERR_STRFMTW); - *(form++) = '%'; - strncpy(form, strfrmt, (size_t)(p - strfrmt + 1)); - form += p - strfrmt + 1; - *form = '\0'; - return p; -} - -static void addintlen(char *form) -{ - size_t l = strlen(form); - char spec = form[l - 1]; - strcpy(form + l - 1, LUA_INTFRMLEN); - form[l + sizeof(LUA_INTFRMLEN) - 2] = spec; - form[l + sizeof(LUA_INTFRMLEN) - 1] = '\0'; -} - -static unsigned LUA_INTFRM_T num2intfrm(lua_State *L, int arg) -{ - if (sizeof(LUA_INTFRM_T) == 4) { - return (LUA_INTFRM_T)lj_lib_checkbit(L, arg); - } else { - cTValue *o; - lj_lib_checknumber(L, arg); - o = L->base+arg-1; - if (tvisint(o)) - return (LUA_INTFRM_T)intV(o); - else - return (LUA_INTFRM_T)numV(o); - } -} - -static unsigned LUA_INTFRM_T num2uintfrm(lua_State *L, int arg) -{ - if (sizeof(LUA_INTFRM_T) == 4) { - return (unsigned LUA_INTFRM_T)lj_lib_checkbit(L, arg); - } else { - cTValue *o; - lj_lib_checknumber(L, arg); - o = L->base+arg-1; - if (tvisint(o)) - return (unsigned LUA_INTFRM_T)intV(o); - else if ((int32_t)o->u32.hi < 0) - return (unsigned LUA_INTFRM_T)(LUA_INTFRM_T)numV(o); - else - return (unsigned LUA_INTFRM_T)numV(o); - } -} - -static GCstr *meta_tostring(lua_State *L, int arg) -{ - TValue *o = L->base+arg-1; - cTValue *mo; - lua_assert(o < L->top); /* Caller already checks for existence. */ - if (LJ_LIKELY(tvisstr(o))) - return strV(o); - if (!tvisnil(mo = lj_meta_lookup(L, o, MM_tostring))) { - copyTV(L, L->top++, mo); - copyTV(L, L->top++, o); - lua_call(L, 1, 1); - L->top--; - if (tvisstr(L->top)) - return strV(L->top); - o = L->base+arg-1; - copyTV(L, o, L->top); - } - if (tvisnumber(o)) { - return lj_str_fromnumber(L, o); - } else if (tvisnil(o)) { - return lj_str_newlit(L, "nil"); - } else if (tvisfalse(o)) { - return lj_str_newlit(L, "false"); - } else if (tvistrue(o)) { - return lj_str_newlit(L, "true"); - } else { - if (tvisfunc(o) && isffunc(funcV(o))) - lj_str_pushf(L, "function: builtin#%d", funcV(o)->c.ffid); - else - lj_str_pushf(L, "%s: %p", lj_typename(o), lua_topointer(L, arg)); - L->top--; - return strV(L->top); - } -} - -LJLIB_CF(string_format) -{ - int arg = 1, top = (int)(L->top - L->base); - GCstr *fmt = lj_lib_checkstr(L, arg); - const char *strfrmt = strdata(fmt); - const char *strfrmt_end = strfrmt + fmt->len; - luaL_Buffer b; - luaL_buffinit(L, &b); - while (strfrmt < strfrmt_end) { - if (*strfrmt != L_ESC) { - luaL_addchar(&b, *strfrmt++); - } else if (*++strfrmt == L_ESC) { - luaL_addchar(&b, *strfrmt++); /* %% */ - } else { /* format item */ - char form[MAX_FMTSPEC]; /* to store the format (`%...') */ - char buff[MAX_FMTITEM]; /* to store the formatted item */ - if (++arg > top) - luaL_argerror(L, arg, lj_obj_typename[0]); - strfrmt = scanformat(L, strfrmt, form); - switch (*strfrmt++) { - case 'c': - sprintf(buff, form, lj_lib_checkint(L, arg)); - break; - case 'd': case 'i': - addintlen(form); - sprintf(buff, form, num2intfrm(L, arg)); - break; - case 'o': case 'u': case 'x': case 'X': - addintlen(form); - sprintf(buff, form, num2uintfrm(L, arg)); - break; - case 'e': case 'E': case 'f': case 'g': case 'G': case 'a': case 'A': { - TValue tv; - tv.n = lj_lib_checknum(L, arg); - if (LJ_UNLIKELY((tv.u32.hi << 1) >= 0xffe00000)) { - /* Canonicalize output of non-finite values. */ - char *p, nbuf[LJ_STR_NUMBUF]; - size_t len = lj_str_bufnum(nbuf, &tv); - if (strfrmt[-1] < 'a') { - nbuf[len-3] = nbuf[len-3] - 0x20; - nbuf[len-2] = nbuf[len-2] - 0x20; - nbuf[len-1] = nbuf[len-1] - 0x20; - } - nbuf[len] = '\0'; - for (p = form; *p < 'A' && *p != '.'; p++) ; - *p++ = 's'; *p = '\0'; - sprintf(buff, form, nbuf); - break; - } - sprintf(buff, form, (double)tv.n); - break; - } - case 'q': - addquoted(L, &b, arg); - continue; - case 'p': - lj_str_pushf(L, "%p", lua_topointer(L, arg)); - luaL_addvalue(&b); - continue; - case 's': { - GCstr *str = meta_tostring(L, arg); - if (!strchr(form, '.') && str->len >= 100) { - /* no precision and string is too long to be formatted; - keep original string */ - setstrV(L, L->top++, str); - luaL_addvalue(&b); - continue; - } - sprintf(buff, form, strdata(str)); - break; - } - default: - lj_err_callerv(L, LJ_ERR_STRFMTO, *(strfrmt -1)); - break; - } - luaL_addlstring(&b, buff, strlen(buff)); - } - } - luaL_pushresult(&b); - return 1; -} - -/* ------------------------------------------------------------------------ */ - -#include "lj_libdef.h" - -LUALIB_API int luaopen_string(lua_State *L) -{ - GCtab *mt; - global_State *g; - LJ_LIB_REG(L, LUA_STRLIBNAME, string); -#if defined(LUA_COMPAT_GFIND) && !LJ_52 - lua_getfield(L, -1, "gmatch"); - lua_setfield(L, -2, "gfind"); -#endif - mt = lj_tab_new(L, 0, 1); - /* NOBARRIER: basemt is a GC root. */ - g = G(L); - setgcref(basemt_it(g, LJ_TSTR), obj2gco(mt)); - settabV(L, lj_tab_setstr(L, mt, mmname_str(g, MM_index)), tabV(L->top-1)); - mt->nomm = (uint8_t)(~(1u<top, func); - setintV(L->top+1, i); - val = lj_tab_getint(t, (int32_t)i); - if (val) { copyTV(L, L->top+2, val); } else { setnilV(L->top+2); } - L->top += 3; - lua_call(L, 2, 1); - if (!tvisnil(L->top-1)) - return 1; - L->top--; - } - return 0; -} - -LJLIB_CF(table_foreach) -{ - GCtab *t = lj_lib_checktab(L, 1); - GCfunc *func = lj_lib_checkfunc(L, 2); - L->top = L->base+3; - setnilV(L->top-1); - while (lj_tab_next(L, t, L->top-1)) { - copyTV(L, L->top+2, L->top); - copyTV(L, L->top+1, L->top-1); - setfuncV(L, L->top, func); - L->top += 3; - lua_call(L, 2, 1); - if (!tvisnil(L->top-1)) - return 1; - L->top--; - } - return 0; -} - -LJLIB_ASM(table_getn) LJLIB_REC(.) -{ - lj_lib_checktab(L, 1); - return FFH_UNREACHABLE; -} - -LJLIB_CF(table_maxn) -{ - GCtab *t = lj_lib_checktab(L, 1); - TValue *array = tvref(t->array); - Node *node; - lua_Number m = 0; - ptrdiff_t i; - for (i = (ptrdiff_t)t->asize - 1; i >= 0; i--) - if (!tvisnil(&array[i])) { - m = (lua_Number)(int32_t)i; - break; - } - node = noderef(t->node); - for (i = (ptrdiff_t)t->hmask; i >= 0; i--) - if (!tvisnil(&node[i].val) && tvisnumber(&node[i].key)) { - lua_Number n = numberVnum(&node[i].key); - if (n > m) m = n; - } - setnumV(L->top-1, m); - return 1; -} - -LJLIB_CF(table_insert) LJLIB_REC(.) -{ - GCtab *t = lj_lib_checktab(L, 1); - int32_t n, i = (int32_t)lj_tab_len(t) + 1; - int nargs = (int)((char *)L->top - (char *)L->base); - if (nargs != 2*sizeof(TValue)) { - if (nargs != 3*sizeof(TValue)) - lj_err_caller(L, LJ_ERR_TABINS); - /* NOBARRIER: This just moves existing elements around. */ - for (n = lj_lib_checkint(L, 2); i > n; i--) { - /* The set may invalidate the get pointer, so need to do it first! */ - TValue *dst = lj_tab_setint(L, t, i); - cTValue *src = lj_tab_getint(t, i-1); - if (src) { - copyTV(L, dst, src); - } else { - setnilV(dst); - } - } - i = n; - } - { - TValue *dst = lj_tab_setint(L, t, i); - copyTV(L, dst, L->top-1); /* Set new value. */ - lj_gc_barriert(L, t, dst); - } - return 0; -} - -LJLIB_CF(table_remove) LJLIB_REC(.) -{ - GCtab *t = lj_lib_checktab(L, 1); - int32_t e = (int32_t)lj_tab_len(t); - int32_t pos = lj_lib_optint(L, 2, e); - if (!(1 <= pos && pos <= e)) /* Nothing to remove? */ - return 0; - lua_rawgeti(L, 1, pos); /* Get previous value. */ - /* NOBARRIER: This just moves existing elements around. */ - for (; pos < e; pos++) { - cTValue *src = lj_tab_getint(t, pos+1); - TValue *dst = lj_tab_setint(L, t, pos); - if (src) { - copyTV(L, dst, src); - } else { - setnilV(dst); - } - } - setnilV(lj_tab_setint(L, t, e)); /* Remove (last) value. */ - return 1; /* Return previous value. */ -} - -LJLIB_CF(table_concat) -{ - luaL_Buffer b; - GCtab *t = lj_lib_checktab(L, 1); - GCstr *sep = lj_lib_optstr(L, 2); - MSize seplen = sep ? sep->len : 0; - int32_t i = lj_lib_optint(L, 3, 1); - int32_t e = (L->base+3 < L->top && !tvisnil(L->base+3)) ? - lj_lib_checkint(L, 4) : (int32_t)lj_tab_len(t); - luaL_buffinit(L, &b); - if (i <= e) { - for (;;) { - cTValue *o; - lua_rawgeti(L, 1, i); - o = L->top-1; - if (!(tvisstr(o) || tvisnumber(o))) - lj_err_callerv(L, LJ_ERR_TABCAT, lj_typename(o), i); - luaL_addvalue(&b); - if (i++ == e) break; - if (seplen) - luaL_addlstring(&b, strdata(sep), seplen); - } - } - luaL_pushresult(&b); - return 1; -} - -/* ------------------------------------------------------------------------ */ - -static void set2(lua_State *L, int i, int j) -{ - lua_rawseti(L, 1, i); - lua_rawseti(L, 1, j); -} - -static int sort_comp(lua_State *L, int a, int b) -{ - if (!lua_isnil(L, 2)) { /* function? */ - int res; - lua_pushvalue(L, 2); - lua_pushvalue(L, a-1); /* -1 to compensate function */ - lua_pushvalue(L, b-2); /* -2 to compensate function and `a' */ - lua_call(L, 2, 1); - res = lua_toboolean(L, -1); - lua_pop(L, 1); - return res; - } else { /* a < b? */ - return lua_lessthan(L, a, b); - } -} - -static void auxsort(lua_State *L, int l, int u) -{ - while (l < u) { /* for tail recursion */ - int i, j; - /* sort elements a[l], a[(l+u)/2] and a[u] */ - lua_rawgeti(L, 1, l); - lua_rawgeti(L, 1, u); - if (sort_comp(L, -1, -2)) /* a[u] < a[l]? */ - set2(L, l, u); /* swap a[l] - a[u] */ - else - lua_pop(L, 2); - if (u-l == 1) break; /* only 2 elements */ - i = (l+u)/2; - lua_rawgeti(L, 1, i); - lua_rawgeti(L, 1, l); - if (sort_comp(L, -2, -1)) { /* a[i]= P */ - while (lua_rawgeti(L, 1, ++i), sort_comp(L, -1, -2)) { - if (i>=u) lj_err_caller(L, LJ_ERR_TABSORT); - lua_pop(L, 1); /* remove a[i] */ - } - /* repeat --j until a[j] <= P */ - while (lua_rawgeti(L, 1, --j), sort_comp(L, -3, -1)) { - if (j<=l) lj_err_caller(L, LJ_ERR_TABSORT); - lua_pop(L, 1); /* remove a[j] */ - } - if (jbase+1)) - lj_lib_checkfunc(L, 2); - auxsort(L, 1, n); - return 0; -} - -#if LJ_52 -LJLIB_PUSH("n") -LJLIB_CF(table_pack) -{ - TValue *array, *base = L->base; - MSize i, n = (uint32_t)(L->top - base); - GCtab *t = lj_tab_new(L, n ? n+1 : 0, 1); - /* NOBARRIER: The table is new (marked white). */ - setintV(lj_tab_setstr(L, t, strV(lj_lib_upvalue(L, 1))), (int32_t)n); - for (array = tvref(t->array) + 1, i = 0; i < n; i++) - copyTV(L, &array[i], &base[i]); - settabV(L, base, t); - L->top = base+1; - lj_gc_check(L); - return 1; -} -#endif - -/* ------------------------------------------------------------------------ */ - -#include "lj_libdef.h" - -LUALIB_API int luaopen_table(lua_State *L) -{ - LJ_LIB_REG(L, LUA_TABLIBNAME, table); -#if LJ_52 - lua_getglobal(L, "unpack"); - lua_setfield(L, -2, "unpack"); -#endif - return 1; -} - diff --git a/deps/luajit/src/lj.supp b/deps/luajit/src/lj.supp deleted file mode 100644 index 411f2617..00000000 --- a/deps/luajit/src/lj.supp +++ /dev/null @@ -1,26 +0,0 @@ -# Valgrind suppression file for LuaJIT 2.0. -{ - Optimized string compare - Memcheck:Addr4 - fun:lj_str_cmp -} -{ - Optimized string compare - Memcheck:Addr1 - fun:lj_str_cmp -} -{ - Optimized string compare - Memcheck:Addr4 - fun:lj_str_new -} -{ - Optimized string compare - Memcheck:Addr1 - fun:lj_str_new -} -{ - Optimized string compare - Memcheck:Cond - fun:lj_str_new -} diff --git a/deps/luajit/src/lj_alloc.c b/deps/luajit/src/lj_alloc.c deleted file mode 100644 index 7c7ec678..00000000 --- a/deps/luajit/src/lj_alloc.c +++ /dev/null @@ -1,1396 +0,0 @@ -/* -** Bundled memory allocator. -** -** Beware: this is a HEAVILY CUSTOMIZED version of dlmalloc. -** The original bears the following remark: -** -** 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. -** -** * Version pre-2.8.4 Wed Mar 29 19:46:29 2006 (dl at gee) -** -** No additional copyright is claimed over the customizations. -** Please do NOT bother the original author about this version here! -** -** If you want to use dlmalloc in another project, you should get -** the original from: ftp://gee.cs.oswego.edu/pub/misc/ -** For thread-safe derivatives, take a look at: -** - ptmalloc: http://www.malloc.de/ -** - nedmalloc: http://www.nedprod.com/programs/portable/nedmalloc/ -*/ - -#define lj_alloc_c -#define LUA_CORE - -/* To get the mremap prototype. Must be defined before any system includes. */ -#if defined(__linux__) && !defined(_GNU_SOURCE) -#define _GNU_SOURCE -#endif - -#include "lj_def.h" -#include "lj_arch.h" -#include "lj_alloc.h" - -#ifndef LUAJIT_USE_SYSMALLOC - -#define MAX_SIZE_T (~(size_t)0) -#define MALLOC_ALIGNMENT ((size_t)8U) - -#define DEFAULT_GRANULARITY ((size_t)128U * (size_t)1024U) -#define DEFAULT_TRIM_THRESHOLD ((size_t)2U * (size_t)1024U * (size_t)1024U) -#define DEFAULT_MMAP_THRESHOLD ((size_t)128U * (size_t)1024U) -#define MAX_RELEASE_CHECK_RATE 255 - -/* ------------------- size_t and alignment properties -------------------- */ - -/* The byte and bit size of a size_t */ -#define SIZE_T_SIZE (sizeof(size_t)) -#define SIZE_T_BITSIZE (sizeof(size_t) << 3) - -/* Some constants coerced to size_t */ -/* Annoying but necessary to avoid errors on some platforms */ -#define SIZE_T_ZERO ((size_t)0) -#define SIZE_T_ONE ((size_t)1) -#define SIZE_T_TWO ((size_t)2) -#define TWO_SIZE_T_SIZES (SIZE_T_SIZE<<1) -#define FOUR_SIZE_T_SIZES (SIZE_T_SIZE<<2) -#define SIX_SIZE_T_SIZES (FOUR_SIZE_T_SIZES+TWO_SIZE_T_SIZES) - -/* The bit mask value corresponding to MALLOC_ALIGNMENT */ -#define CHUNK_ALIGN_MASK (MALLOC_ALIGNMENT - SIZE_T_ONE) - -/* the number of bytes to offset an address to align it */ -#define align_offset(A)\ - ((((size_t)(A) & CHUNK_ALIGN_MASK) == 0)? 0 :\ - ((MALLOC_ALIGNMENT - ((size_t)(A) & CHUNK_ALIGN_MASK)) & CHUNK_ALIGN_MASK)) - -/* -------------------------- MMAP support ------------------------------- */ - -#define MFAIL ((void *)(MAX_SIZE_T)) -#define CMFAIL ((char *)(MFAIL)) /* defined for convenience */ - -#define IS_DIRECT_BIT (SIZE_T_ONE) - -#if LJ_TARGET_WINDOWS - -#define WIN32_LEAN_AND_MEAN -#include - -#if LJ_64 - -/* Undocumented, but hey, that's what we all love so much about Windows. */ -typedef long (*PNTAVM)(HANDLE handle, void **addr, ULONG zbits, - size_t *size, ULONG alloctype, ULONG prot); -static PNTAVM ntavm; - -/* Number of top bits of the lower 32 bits of an address that must be zero. -** Apparently 0 gives us full 64 bit addresses and 1 gives us the lower 2GB. -*/ -#define NTAVM_ZEROBITS 1 - -static void INIT_MMAP(void) -{ - ntavm = (PNTAVM)GetProcAddress(GetModuleHandleA("ntdll.dll"), - "NtAllocateVirtualMemory"); -} - -/* Win64 32 bit MMAP via NtAllocateVirtualMemory. */ -static LJ_AINLINE void *CALL_MMAP(size_t size) -{ - DWORD olderr = GetLastError(); - void *ptr = NULL; - long st = ntavm(INVALID_HANDLE_VALUE, &ptr, NTAVM_ZEROBITS, &size, - MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE); - SetLastError(olderr); - return st == 0 ? ptr : MFAIL; -} - -/* For direct MMAP, use MEM_TOP_DOWN to minimize interference */ -static LJ_AINLINE void *DIRECT_MMAP(size_t size) -{ - DWORD olderr = GetLastError(); - void *ptr = NULL; - long st = ntavm(INVALID_HANDLE_VALUE, &ptr, NTAVM_ZEROBITS, &size, - MEM_RESERVE|MEM_COMMIT|MEM_TOP_DOWN, PAGE_READWRITE); - SetLastError(olderr); - return st == 0 ? ptr : MFAIL; -} - -#else - -#define INIT_MMAP() ((void)0) - -/* Win32 MMAP via VirtualAlloc */ -static LJ_AINLINE void *CALL_MMAP(size_t size) -{ - DWORD olderr = GetLastError(); - void *ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE); - SetLastError(olderr); - return ptr ? ptr : MFAIL; -} - -/* For direct MMAP, use MEM_TOP_DOWN to minimize interference */ -static LJ_AINLINE void *DIRECT_MMAP(size_t size) -{ - DWORD olderr = GetLastError(); - void *ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT|MEM_TOP_DOWN, - PAGE_READWRITE); - SetLastError(olderr); - return ptr ? ptr : MFAIL; -} - -#endif - -/* This function supports releasing coalesed segments */ -static LJ_AINLINE int CALL_MUNMAP(void *ptr, size_t size) -{ - DWORD olderr = GetLastError(); - MEMORY_BASIC_INFORMATION minfo; - char *cptr = (char *)ptr; - while (size) { - if (VirtualQuery(cptr, &minfo, sizeof(minfo)) == 0) - return -1; - if (minfo.BaseAddress != cptr || minfo.AllocationBase != cptr || - minfo.State != MEM_COMMIT || minfo.RegionSize > size) - return -1; - if (VirtualFree(cptr, 0, MEM_RELEASE) == 0) - return -1; - cptr += minfo.RegionSize; - size -= minfo.RegionSize; - } - SetLastError(olderr); - return 0; -} - -#else - -#include -#include - -#define MMAP_PROT (PROT_READ|PROT_WRITE) -#if !defined(MAP_ANONYMOUS) && defined(MAP_ANON) -#define MAP_ANONYMOUS MAP_ANON -#endif -#define MMAP_FLAGS (MAP_PRIVATE|MAP_ANONYMOUS) - -#if LJ_64 -/* 64 bit mode needs special support for allocating memory in the lower 2GB. */ - -#if defined(MAP_32BIT) - -#if defined(__sun__) -#define MMAP_REGION_START ((uintptr_t)0x1000) -#else -/* Actually this only gives us max. 1GB in current Linux kernels. */ -#define MMAP_REGION_START ((uintptr_t)0) -#endif - -static LJ_AINLINE void *CALL_MMAP(size_t size) -{ - int olderr = errno; - void *ptr = mmap((void *)MMAP_REGION_START, size, MMAP_PROT, MAP_32BIT|MMAP_FLAGS, -1, 0); - errno = olderr; - return ptr; -} - -#elif LJ_TARGET_OSX || LJ_TARGET_PS4 || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) || defined(__sun__) - -/* OSX and FreeBSD mmap() use a naive first-fit linear search. -** That's perfect for us. Except that -pagezero_size must be set for OSX, -** otherwise the lower 4GB are blocked. And the 32GB RLIMIT_DATA needs -** to be reduced to 250MB on FreeBSD. -*/ -#if LJ_TARGET_OSX || defined(__DragonFly__) -#define MMAP_REGION_START ((uintptr_t)0x10000) -#elif LJ_TARGET_PS4 -#define MMAP_REGION_START ((uintptr_t)0x4000) -#else -#define MMAP_REGION_START ((uintptr_t)0x10000000) -#endif -#define MMAP_REGION_END ((uintptr_t)0x80000000) - -#if (defined(__FreeBSD__) || defined(__FreeBSD_kernel__)) && !LJ_TARGET_PS4 -#include -#endif - -static LJ_AINLINE void *CALL_MMAP(size_t size) -{ - int olderr = errno; - /* Hint for next allocation. Doesn't need to be thread-safe. */ - static uintptr_t alloc_hint = MMAP_REGION_START; - int retry = 0; -#if (defined(__FreeBSD__) || defined(__FreeBSD_kernel__)) && !LJ_TARGET_PS4 - static int rlimit_modified = 0; - if (LJ_UNLIKELY(rlimit_modified == 0)) { - struct rlimit rlim; - rlim.rlim_cur = rlim.rlim_max = MMAP_REGION_START; - setrlimit(RLIMIT_DATA, &rlim); /* Ignore result. May fail below. */ - rlimit_modified = 1; - } -#endif - for (;;) { - void *p = mmap((void *)alloc_hint, size, MMAP_PROT, MMAP_FLAGS, -1, 0); - if ((uintptr_t)p >= MMAP_REGION_START && - (uintptr_t)p + size < MMAP_REGION_END) { - alloc_hint = (uintptr_t)p + size; - errno = olderr; - return p; - } - if (p != CMFAIL) munmap(p, size); -#if defined(__sun__) || defined(__DragonFly__) - alloc_hint += 0x1000000; /* Need near-exhaustive linear scan. */ - if (alloc_hint + size < MMAP_REGION_END) continue; -#endif - if (retry) break; - retry = 1; - alloc_hint = MMAP_REGION_START; - } - errno = olderr; - return CMFAIL; -} - -#else - -#error "NYI: need an equivalent of MAP_32BIT for this 64 bit OS" - -#endif - -#else - -/* 32 bit mode is easy. */ -static LJ_AINLINE void *CALL_MMAP(size_t size) -{ - int olderr = errno; - void *ptr = mmap(NULL, size, MMAP_PROT, MMAP_FLAGS, -1, 0); - errno = olderr; - return ptr; -} - -#endif - -#define INIT_MMAP() ((void)0) -#define DIRECT_MMAP(s) CALL_MMAP(s) - -static LJ_AINLINE int CALL_MUNMAP(void *ptr, size_t size) -{ - int olderr = errno; - int ret = munmap(ptr, size); - errno = olderr; - return ret; -} - -#if LJ_TARGET_LINUX -/* Need to define _GNU_SOURCE to get the mremap prototype. */ -static LJ_AINLINE void *CALL_MREMAP_(void *ptr, size_t osz, size_t nsz, - int flags) -{ - int olderr = errno; - ptr = mremap(ptr, osz, nsz, flags); - errno = olderr; - return ptr; -} - -#define CALL_MREMAP(addr, osz, nsz, mv) CALL_MREMAP_((addr), (osz), (nsz), (mv)) -#define CALL_MREMAP_NOMOVE 0 -#define CALL_MREMAP_MAYMOVE 1 -#if LJ_64 -#define CALL_MREMAP_MV CALL_MREMAP_NOMOVE -#else -#define CALL_MREMAP_MV CALL_MREMAP_MAYMOVE -#endif -#endif - -#endif - -#ifndef CALL_MREMAP -#define CALL_MREMAP(addr, osz, nsz, mv) ((void)osz, MFAIL) -#endif - -/* ----------------------- Chunk representations ------------------------ */ - -struct malloc_chunk { - size_t prev_foot; /* Size of previous chunk (if free). */ - size_t head; /* Size and inuse bits. */ - struct malloc_chunk *fd; /* double links -- used only if free. */ - struct malloc_chunk *bk; -}; - -typedef struct malloc_chunk mchunk; -typedef struct malloc_chunk *mchunkptr; -typedef struct malloc_chunk *sbinptr; /* The type of bins of chunks */ -typedef size_t bindex_t; /* Described below */ -typedef unsigned int binmap_t; /* Described below */ -typedef unsigned int flag_t; /* The type of various bit flag sets */ - -/* ------------------- Chunks sizes and alignments ----------------------- */ - -#define MCHUNK_SIZE (sizeof(mchunk)) - -#define CHUNK_OVERHEAD (SIZE_T_SIZE) - -/* Direct chunks need a second word of overhead ... */ -#define DIRECT_CHUNK_OVERHEAD (TWO_SIZE_T_SIZES) -/* ... and additional padding for fake next-chunk at foot */ -#define DIRECT_FOOT_PAD (FOUR_SIZE_T_SIZES) - -/* The smallest size we can malloc is an aligned minimal chunk */ -#define MIN_CHUNK_SIZE\ - ((MCHUNK_SIZE + CHUNK_ALIGN_MASK) & ~CHUNK_ALIGN_MASK) - -/* conversion from malloc headers to user pointers, and back */ -#define chunk2mem(p) ((void *)((char *)(p) + TWO_SIZE_T_SIZES)) -#define mem2chunk(mem) ((mchunkptr)((char *)(mem) - TWO_SIZE_T_SIZES)) -/* chunk associated with aligned address A */ -#define align_as_chunk(A) (mchunkptr)((A) + align_offset(chunk2mem(A))) - -/* Bounds on request (not chunk) sizes. */ -#define MAX_REQUEST ((~MIN_CHUNK_SIZE+1) << 2) -#define MIN_REQUEST (MIN_CHUNK_SIZE - CHUNK_OVERHEAD - SIZE_T_ONE) - -/* pad request bytes into a usable size */ -#define pad_request(req) \ - (((req) + CHUNK_OVERHEAD + CHUNK_ALIGN_MASK) & ~CHUNK_ALIGN_MASK) - -/* pad request, checking for minimum (but not maximum) */ -#define request2size(req) \ - (((req) < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(req)) - -/* ------------------ Operations on head and foot fields ----------------- */ - -#define PINUSE_BIT (SIZE_T_ONE) -#define CINUSE_BIT (SIZE_T_TWO) -#define INUSE_BITS (PINUSE_BIT|CINUSE_BIT) - -/* Head value for fenceposts */ -#define FENCEPOST_HEAD (INUSE_BITS|SIZE_T_SIZE) - -/* extraction of fields from head words */ -#define cinuse(p) ((p)->head & CINUSE_BIT) -#define pinuse(p) ((p)->head & PINUSE_BIT) -#define chunksize(p) ((p)->head & ~(INUSE_BITS)) - -#define clear_pinuse(p) ((p)->head &= ~PINUSE_BIT) -#define clear_cinuse(p) ((p)->head &= ~CINUSE_BIT) - -/* Treat space at ptr +/- offset as a chunk */ -#define chunk_plus_offset(p, s) ((mchunkptr)(((char *)(p)) + (s))) -#define chunk_minus_offset(p, s) ((mchunkptr)(((char *)(p)) - (s))) - -/* Ptr to next or previous physical malloc_chunk. */ -#define next_chunk(p) ((mchunkptr)(((char *)(p)) + ((p)->head & ~INUSE_BITS))) -#define prev_chunk(p) ((mchunkptr)(((char *)(p)) - ((p)->prev_foot) )) - -/* extract next chunk's pinuse bit */ -#define next_pinuse(p) ((next_chunk(p)->head) & PINUSE_BIT) - -/* Get/set size at footer */ -#define get_foot(p, s) (((mchunkptr)((char *)(p) + (s)))->prev_foot) -#define set_foot(p, s) (((mchunkptr)((char *)(p) + (s)))->prev_foot = (s)) - -/* Set size, pinuse bit, and foot */ -#define set_size_and_pinuse_of_free_chunk(p, s)\ - ((p)->head = (s|PINUSE_BIT), set_foot(p, s)) - -/* Set size, pinuse bit, foot, and clear next pinuse */ -#define set_free_with_pinuse(p, s, n)\ - (clear_pinuse(n), set_size_and_pinuse_of_free_chunk(p, s)) - -#define is_direct(p)\ - (!((p)->head & PINUSE_BIT) && ((p)->prev_foot & IS_DIRECT_BIT)) - -/* Get the internal overhead associated with chunk p */ -#define overhead_for(p)\ - (is_direct(p)? DIRECT_CHUNK_OVERHEAD : CHUNK_OVERHEAD) - -/* ---------------------- Overlaid data structures ----------------------- */ - -struct malloc_tree_chunk { - /* The first four fields must be compatible with malloc_chunk */ - size_t prev_foot; - size_t head; - struct malloc_tree_chunk *fd; - struct malloc_tree_chunk *bk; - - struct malloc_tree_chunk *child[2]; - struct malloc_tree_chunk *parent; - bindex_t index; -}; - -typedef struct malloc_tree_chunk tchunk; -typedef struct malloc_tree_chunk *tchunkptr; -typedef struct malloc_tree_chunk *tbinptr; /* The type of bins of trees */ - -/* A little helper macro for trees */ -#define leftmost_child(t) ((t)->child[0] != 0? (t)->child[0] : (t)->child[1]) - -/* ----------------------------- Segments -------------------------------- */ - -struct malloc_segment { - char *base; /* base address */ - size_t size; /* allocated size */ - struct malloc_segment *next; /* ptr to next segment */ -}; - -typedef struct malloc_segment msegment; -typedef struct malloc_segment *msegmentptr; - -/* ---------------------------- malloc_state ----------------------------- */ - -/* Bin types, widths and sizes */ -#define NSMALLBINS (32U) -#define NTREEBINS (32U) -#define SMALLBIN_SHIFT (3U) -#define SMALLBIN_WIDTH (SIZE_T_ONE << SMALLBIN_SHIFT) -#define TREEBIN_SHIFT (8U) -#define MIN_LARGE_SIZE (SIZE_T_ONE << TREEBIN_SHIFT) -#define MAX_SMALL_SIZE (MIN_LARGE_SIZE - SIZE_T_ONE) -#define MAX_SMALL_REQUEST (MAX_SMALL_SIZE - CHUNK_ALIGN_MASK - CHUNK_OVERHEAD) - -struct malloc_state { - binmap_t smallmap; - binmap_t treemap; - size_t dvsize; - size_t topsize; - mchunkptr dv; - mchunkptr top; - size_t trim_check; - size_t release_checks; - mchunkptr smallbins[(NSMALLBINS+1)*2]; - tbinptr treebins[NTREEBINS]; - msegment seg; -}; - -typedef struct malloc_state *mstate; - -#define is_initialized(M) ((M)->top != 0) - -/* -------------------------- system alloc setup ------------------------- */ - -/* page-align a size */ -#define page_align(S)\ - (((S) + (LJ_PAGESIZE - SIZE_T_ONE)) & ~(LJ_PAGESIZE - SIZE_T_ONE)) - -/* granularity-align a size */ -#define granularity_align(S)\ - (((S) + (DEFAULT_GRANULARITY - SIZE_T_ONE))\ - & ~(DEFAULT_GRANULARITY - SIZE_T_ONE)) - -#if LJ_TARGET_WINDOWS -#define mmap_align(S) granularity_align(S) -#else -#define mmap_align(S) page_align(S) -#endif - -/* True if segment S holds address A */ -#define segment_holds(S, A)\ - ((char *)(A) >= S->base && (char *)(A) < S->base + S->size) - -/* Return segment holding given address */ -static msegmentptr segment_holding(mstate m, char *addr) -{ - msegmentptr sp = &m->seg; - for (;;) { - if (addr >= sp->base && addr < sp->base + sp->size) - return sp; - if ((sp = sp->next) == 0) - return 0; - } -} - -/* Return true if segment contains a segment link */ -static int has_segment_link(mstate m, msegmentptr ss) -{ - msegmentptr sp = &m->seg; - for (;;) { - if ((char *)sp >= ss->base && (char *)sp < ss->base + ss->size) - return 1; - if ((sp = sp->next) == 0) - return 0; - } -} - -/* - TOP_FOOT_SIZE is padding at the end of a segment, including space - that may be needed to place segment records and fenceposts when new - noncontiguous segments are added. -*/ -#define TOP_FOOT_SIZE\ - (align_offset(chunk2mem(0))+pad_request(sizeof(struct malloc_segment))+MIN_CHUNK_SIZE) - -/* ---------------------------- Indexing Bins ---------------------------- */ - -#define is_small(s) (((s) >> SMALLBIN_SHIFT) < NSMALLBINS) -#define small_index(s) ((s) >> SMALLBIN_SHIFT) -#define small_index2size(i) ((i) << SMALLBIN_SHIFT) -#define MIN_SMALL_INDEX (small_index(MIN_CHUNK_SIZE)) - -/* addressing by index. See above about smallbin repositioning */ -#define smallbin_at(M, i) ((sbinptr)((char *)&((M)->smallbins[(i)<<1]))) -#define treebin_at(M,i) (&((M)->treebins[i])) - -/* assign tree index for size S to variable I */ -#define compute_tree_index(S, I)\ -{\ - unsigned int X = (unsigned int)(S >> TREEBIN_SHIFT);\ - if (X == 0) {\ - I = 0;\ - } else if (X > 0xFFFF) {\ - I = NTREEBINS-1;\ - } else {\ - unsigned int K = lj_fls(X);\ - I = (bindex_t)((K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1)));\ - }\ -} - -/* Bit representing maximum resolved size in a treebin at i */ -#define bit_for_tree_index(i) \ - (i == NTREEBINS-1)? (SIZE_T_BITSIZE-1) : (((i) >> 1) + TREEBIN_SHIFT - 2) - -/* Shift placing maximum resolved bit in a treebin at i as sign bit */ -#define leftshift_for_tree_index(i) \ - ((i == NTREEBINS-1)? 0 : \ - ((SIZE_T_BITSIZE-SIZE_T_ONE) - (((i) >> 1) + TREEBIN_SHIFT - 2))) - -/* The size of the smallest chunk held in bin with index i */ -#define minsize_for_tree_index(i) \ - ((SIZE_T_ONE << (((i) >> 1) + TREEBIN_SHIFT)) | \ - (((size_t)((i) & SIZE_T_ONE)) << (((i) >> 1) + TREEBIN_SHIFT - 1))) - -/* ------------------------ Operations on bin maps ----------------------- */ - -/* bit corresponding to given index */ -#define idx2bit(i) ((binmap_t)(1) << (i)) - -/* Mark/Clear bits with given index */ -#define mark_smallmap(M,i) ((M)->smallmap |= idx2bit(i)) -#define clear_smallmap(M,i) ((M)->smallmap &= ~idx2bit(i)) -#define smallmap_is_marked(M,i) ((M)->smallmap & idx2bit(i)) - -#define mark_treemap(M,i) ((M)->treemap |= idx2bit(i)) -#define clear_treemap(M,i) ((M)->treemap &= ~idx2bit(i)) -#define treemap_is_marked(M,i) ((M)->treemap & idx2bit(i)) - -/* mask with all bits to left of least bit of x on */ -#define left_bits(x) ((x<<1) | (~(x<<1)+1)) - -/* Set cinuse bit and pinuse bit of next chunk */ -#define set_inuse(M,p,s)\ - ((p)->head = (((p)->head & PINUSE_BIT)|s|CINUSE_BIT),\ - ((mchunkptr)(((char *)(p)) + (s)))->head |= PINUSE_BIT) - -/* Set cinuse and pinuse of this chunk and pinuse of next chunk */ -#define set_inuse_and_pinuse(M,p,s)\ - ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\ - ((mchunkptr)(((char *)(p)) + (s)))->head |= PINUSE_BIT) - -/* Set size, cinuse and pinuse bit of this chunk */ -#define set_size_and_pinuse_of_inuse_chunk(M, p, s)\ - ((p)->head = (s|PINUSE_BIT|CINUSE_BIT)) - -/* ----------------------- Operations on smallbins ----------------------- */ - -/* Link a free chunk into a smallbin */ -#define insert_small_chunk(M, P, S) {\ - bindex_t I = small_index(S);\ - mchunkptr B = smallbin_at(M, I);\ - mchunkptr F = B;\ - if (!smallmap_is_marked(M, I))\ - mark_smallmap(M, I);\ - else\ - F = B->fd;\ - B->fd = P;\ - F->bk = P;\ - P->fd = F;\ - P->bk = B;\ -} - -/* Unlink a chunk from a smallbin */ -#define unlink_small_chunk(M, P, S) {\ - mchunkptr F = P->fd;\ - mchunkptr B = P->bk;\ - bindex_t I = small_index(S);\ - if (F == B) {\ - clear_smallmap(M, I);\ - } else {\ - F->bk = B;\ - B->fd = F;\ - }\ -} - -/* Unlink the first chunk from a smallbin */ -#define unlink_first_small_chunk(M, B, P, I) {\ - mchunkptr F = P->fd;\ - if (B == F) {\ - clear_smallmap(M, I);\ - } else {\ - B->fd = F;\ - F->bk = B;\ - }\ -} - -/* Replace dv node, binning the old one */ -/* Used only when dvsize known to be small */ -#define replace_dv(M, P, S) {\ - size_t DVS = M->dvsize;\ - if (DVS != 0) {\ - mchunkptr DV = M->dv;\ - insert_small_chunk(M, DV, DVS);\ - }\ - M->dvsize = S;\ - M->dv = P;\ -} - -/* ------------------------- Operations on trees ------------------------- */ - -/* Insert chunk into tree */ -#define insert_large_chunk(M, X, S) {\ - tbinptr *H;\ - bindex_t I;\ - compute_tree_index(S, I);\ - H = treebin_at(M, I);\ - X->index = I;\ - X->child[0] = X->child[1] = 0;\ - if (!treemap_is_marked(M, I)) {\ - mark_treemap(M, I);\ - *H = X;\ - X->parent = (tchunkptr)H;\ - X->fd = X->bk = X;\ - } else {\ - tchunkptr T = *H;\ - size_t K = S << leftshift_for_tree_index(I);\ - for (;;) {\ - if (chunksize(T) != S) {\ - tchunkptr *C = &(T->child[(K >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1]);\ - K <<= 1;\ - if (*C != 0) {\ - T = *C;\ - } else {\ - *C = X;\ - X->parent = T;\ - X->fd = X->bk = X;\ - break;\ - }\ - } else {\ - tchunkptr F = T->fd;\ - T->fd = F->bk = X;\ - X->fd = F;\ - X->bk = T;\ - X->parent = 0;\ - break;\ - }\ - }\ - }\ -} - -#define unlink_large_chunk(M, X) {\ - tchunkptr XP = X->parent;\ - tchunkptr R;\ - if (X->bk != X) {\ - tchunkptr F = X->fd;\ - R = X->bk;\ - F->bk = R;\ - R->fd = F;\ - } else {\ - tchunkptr *RP;\ - if (((R = *(RP = &(X->child[1]))) != 0) ||\ - ((R = *(RP = &(X->child[0]))) != 0)) {\ - tchunkptr *CP;\ - while ((*(CP = &(R->child[1])) != 0) ||\ - (*(CP = &(R->child[0])) != 0)) {\ - R = *(RP = CP);\ - }\ - *RP = 0;\ - }\ - }\ - if (XP != 0) {\ - tbinptr *H = treebin_at(M, X->index);\ - if (X == *H) {\ - if ((*H = R) == 0) \ - clear_treemap(M, X->index);\ - } else {\ - if (XP->child[0] == X) \ - XP->child[0] = R;\ - else \ - XP->child[1] = R;\ - }\ - if (R != 0) {\ - tchunkptr C0, C1;\ - R->parent = XP;\ - if ((C0 = X->child[0]) != 0) {\ - R->child[0] = C0;\ - C0->parent = R;\ - }\ - if ((C1 = X->child[1]) != 0) {\ - R->child[1] = C1;\ - C1->parent = R;\ - }\ - }\ - }\ -} - -/* Relays to large vs small bin operations */ - -#define insert_chunk(M, P, S)\ - if (is_small(S)) { insert_small_chunk(M, P, S)\ - } else { tchunkptr TP = (tchunkptr)(P); insert_large_chunk(M, TP, S); } - -#define unlink_chunk(M, P, S)\ - if (is_small(S)) { unlink_small_chunk(M, P, S)\ - } else { tchunkptr TP = (tchunkptr)(P); unlink_large_chunk(M, TP); } - -/* ----------------------- Direct-mmapping chunks ----------------------- */ - -static void *direct_alloc(size_t nb) -{ - size_t mmsize = mmap_align(nb + SIX_SIZE_T_SIZES + CHUNK_ALIGN_MASK); - if (LJ_LIKELY(mmsize > nb)) { /* Check for wrap around 0 */ - char *mm = (char *)(DIRECT_MMAP(mmsize)); - if (mm != CMFAIL) { - size_t offset = align_offset(chunk2mem(mm)); - size_t psize = mmsize - offset - DIRECT_FOOT_PAD; - mchunkptr p = (mchunkptr)(mm + offset); - p->prev_foot = offset | IS_DIRECT_BIT; - p->head = psize|CINUSE_BIT; - chunk_plus_offset(p, psize)->head = FENCEPOST_HEAD; - chunk_plus_offset(p, psize+SIZE_T_SIZE)->head = 0; - return chunk2mem(p); - } - } - return NULL; -} - -static mchunkptr direct_resize(mchunkptr oldp, size_t nb) -{ - size_t oldsize = chunksize(oldp); - if (is_small(nb)) /* Can't shrink direct regions below small size */ - return NULL; - /* Keep old chunk if big enough but not too big */ - if (oldsize >= nb + SIZE_T_SIZE && - (oldsize - nb) <= (DEFAULT_GRANULARITY >> 1)) { - return oldp; - } else { - size_t offset = oldp->prev_foot & ~IS_DIRECT_BIT; - size_t oldmmsize = oldsize + offset + DIRECT_FOOT_PAD; - size_t newmmsize = mmap_align(nb + SIX_SIZE_T_SIZES + CHUNK_ALIGN_MASK); - char *cp = (char *)CALL_MREMAP((char *)oldp - offset, - oldmmsize, newmmsize, CALL_MREMAP_MV); - if (cp != CMFAIL) { - mchunkptr newp = (mchunkptr)(cp + offset); - size_t psize = newmmsize - offset - DIRECT_FOOT_PAD; - newp->head = psize|CINUSE_BIT; - chunk_plus_offset(newp, psize)->head = FENCEPOST_HEAD; - chunk_plus_offset(newp, psize+SIZE_T_SIZE)->head = 0; - return newp; - } - } - return NULL; -} - -/* -------------------------- mspace management -------------------------- */ - -/* Initialize top chunk and its size */ -static void init_top(mstate m, mchunkptr p, size_t psize) -{ - /* Ensure alignment */ - size_t offset = align_offset(chunk2mem(p)); - p = (mchunkptr)((char *)p + offset); - psize -= offset; - - m->top = p; - m->topsize = psize; - p->head = psize | PINUSE_BIT; - /* set size of fake trailing chunk holding overhead space only once */ - chunk_plus_offset(p, psize)->head = TOP_FOOT_SIZE; - m->trim_check = DEFAULT_TRIM_THRESHOLD; /* reset on each update */ -} - -/* Initialize bins for a new mstate that is otherwise zeroed out */ -static void init_bins(mstate m) -{ - /* Establish circular links for smallbins */ - bindex_t i; - for (i = 0; i < NSMALLBINS; i++) { - sbinptr bin = smallbin_at(m,i); - bin->fd = bin->bk = bin; - } -} - -/* Allocate chunk and prepend remainder with chunk in successor base. */ -static void *prepend_alloc(mstate m, char *newbase, char *oldbase, size_t nb) -{ - mchunkptr p = align_as_chunk(newbase); - mchunkptr oldfirst = align_as_chunk(oldbase); - size_t psize = (size_t)((char *)oldfirst - (char *)p); - mchunkptr q = chunk_plus_offset(p, nb); - size_t qsize = psize - nb; - set_size_and_pinuse_of_inuse_chunk(m, p, nb); - - /* consolidate remainder with first chunk of old base */ - if (oldfirst == m->top) { - size_t tsize = m->topsize += qsize; - m->top = q; - q->head = tsize | PINUSE_BIT; - } else if (oldfirst == m->dv) { - size_t dsize = m->dvsize += qsize; - m->dv = q; - set_size_and_pinuse_of_free_chunk(q, dsize); - } else { - if (!cinuse(oldfirst)) { - size_t nsize = chunksize(oldfirst); - unlink_chunk(m, oldfirst, nsize); - oldfirst = chunk_plus_offset(oldfirst, nsize); - qsize += nsize; - } - set_free_with_pinuse(q, qsize, oldfirst); - insert_chunk(m, q, qsize); - } - - return chunk2mem(p); -} - -/* Add a segment to hold a new noncontiguous region */ -static void add_segment(mstate m, char *tbase, size_t tsize) -{ - /* Determine locations and sizes of segment, fenceposts, old top */ - char *old_top = (char *)m->top; - msegmentptr oldsp = segment_holding(m, old_top); - char *old_end = oldsp->base + oldsp->size; - size_t ssize = pad_request(sizeof(struct malloc_segment)); - char *rawsp = old_end - (ssize + FOUR_SIZE_T_SIZES + CHUNK_ALIGN_MASK); - size_t offset = align_offset(chunk2mem(rawsp)); - char *asp = rawsp + offset; - char *csp = (asp < (old_top + MIN_CHUNK_SIZE))? old_top : asp; - mchunkptr sp = (mchunkptr)csp; - msegmentptr ss = (msegmentptr)(chunk2mem(sp)); - mchunkptr tnext = chunk_plus_offset(sp, ssize); - mchunkptr p = tnext; - - /* reset top to new space */ - init_top(m, (mchunkptr)tbase, tsize - TOP_FOOT_SIZE); - - /* Set up segment record */ - set_size_and_pinuse_of_inuse_chunk(m, sp, ssize); - *ss = m->seg; /* Push current record */ - m->seg.base = tbase; - m->seg.size = tsize; - m->seg.next = ss; - - /* Insert trailing fenceposts */ - for (;;) { - mchunkptr nextp = chunk_plus_offset(p, SIZE_T_SIZE); - p->head = FENCEPOST_HEAD; - if ((char *)(&(nextp->head)) < old_end) - p = nextp; - else - break; - } - - /* Insert the rest of old top into a bin as an ordinary free chunk */ - if (csp != old_top) { - mchunkptr q = (mchunkptr)old_top; - size_t psize = (size_t)(csp - old_top); - mchunkptr tn = chunk_plus_offset(q, psize); - set_free_with_pinuse(q, psize, tn); - insert_chunk(m, q, psize); - } -} - -/* -------------------------- System allocation -------------------------- */ - -static void *alloc_sys(mstate m, size_t nb) -{ - char *tbase = CMFAIL; - size_t tsize = 0; - - /* Directly map large chunks */ - if (LJ_UNLIKELY(nb >= DEFAULT_MMAP_THRESHOLD)) { - void *mem = direct_alloc(nb); - if (mem != 0) - return mem; - } - - { - size_t req = nb + TOP_FOOT_SIZE + SIZE_T_ONE; - size_t rsize = granularity_align(req); - if (LJ_LIKELY(rsize > nb)) { /* Fail if wraps around zero */ - char *mp = (char *)(CALL_MMAP(rsize)); - if (mp != CMFAIL) { - tbase = mp; - tsize = rsize; - } - } - } - - if (tbase != CMFAIL) { - msegmentptr sp = &m->seg; - /* Try to merge with an existing segment */ - while (sp != 0 && tbase != sp->base + sp->size) - sp = sp->next; - if (sp != 0 && segment_holds(sp, m->top)) { /* append */ - sp->size += tsize; - init_top(m, m->top, m->topsize + tsize); - } else { - sp = &m->seg; - while (sp != 0 && sp->base != tbase + tsize) - sp = sp->next; - if (sp != 0) { - char *oldbase = sp->base; - sp->base = tbase; - sp->size += tsize; - return prepend_alloc(m, tbase, oldbase, nb); - } else { - add_segment(m, tbase, tsize); - } - } - - if (nb < m->topsize) { /* Allocate from new or extended top space */ - size_t rsize = m->topsize -= nb; - mchunkptr p = m->top; - mchunkptr r = m->top = chunk_plus_offset(p, nb); - r->head = rsize | PINUSE_BIT; - set_size_and_pinuse_of_inuse_chunk(m, p, nb); - return chunk2mem(p); - } - } - - return NULL; -} - -/* ----------------------- system deallocation -------------------------- */ - -/* Unmap and unlink any mmapped segments that don't contain used chunks */ -static size_t release_unused_segments(mstate m) -{ - size_t released = 0; - size_t nsegs = 0; - msegmentptr pred = &m->seg; - msegmentptr sp = pred->next; - while (sp != 0) { - char *base = sp->base; - size_t size = sp->size; - msegmentptr next = sp->next; - nsegs++; - { - mchunkptr p = align_as_chunk(base); - size_t psize = chunksize(p); - /* Can unmap if first chunk holds entire segment and not pinned */ - if (!cinuse(p) && (char *)p + psize >= base + size - TOP_FOOT_SIZE) { - tchunkptr tp = (tchunkptr)p; - if (p == m->dv) { - m->dv = 0; - m->dvsize = 0; - } else { - unlink_large_chunk(m, tp); - } - if (CALL_MUNMAP(base, size) == 0) { - released += size; - /* unlink obsoleted record */ - sp = pred; - sp->next = next; - } else { /* back out if cannot unmap */ - insert_large_chunk(m, tp, psize); - } - } - } - pred = sp; - sp = next; - } - /* Reset check counter */ - m->release_checks = nsegs > MAX_RELEASE_CHECK_RATE ? - nsegs : MAX_RELEASE_CHECK_RATE; - return released; -} - -static int alloc_trim(mstate m, size_t pad) -{ - size_t released = 0; - if (pad < MAX_REQUEST && is_initialized(m)) { - pad += TOP_FOOT_SIZE; /* ensure enough room for segment overhead */ - - if (m->topsize > pad) { - /* Shrink top space in granularity-size units, keeping at least one */ - size_t unit = DEFAULT_GRANULARITY; - size_t extra = ((m->topsize - pad + (unit - SIZE_T_ONE)) / unit - - SIZE_T_ONE) * unit; - msegmentptr sp = segment_holding(m, (char *)m->top); - - if (sp->size >= extra && - !has_segment_link(m, sp)) { /* can't shrink if pinned */ - size_t newsize = sp->size - extra; - /* Prefer mremap, fall back to munmap */ - if ((CALL_MREMAP(sp->base, sp->size, newsize, CALL_MREMAP_NOMOVE) != MFAIL) || - (CALL_MUNMAP(sp->base + newsize, extra) == 0)) { - released = extra; - } - } - - if (released != 0) { - sp->size -= released; - init_top(m, m->top, m->topsize - released); - } - } - - /* Unmap any unused mmapped segments */ - released += release_unused_segments(m); - - /* On failure, disable autotrim to avoid repeated failed future calls */ - if (released == 0 && m->topsize > m->trim_check) - m->trim_check = MAX_SIZE_T; - } - - return (released != 0)? 1 : 0; -} - -/* ---------------------------- malloc support --------------------------- */ - -/* allocate a large request from the best fitting chunk in a treebin */ -static void *tmalloc_large(mstate m, size_t nb) -{ - tchunkptr v = 0; - size_t rsize = ~nb+1; /* Unsigned negation */ - tchunkptr t; - bindex_t idx; - compute_tree_index(nb, idx); - - if ((t = *treebin_at(m, idx)) != 0) { - /* Traverse tree for this bin looking for node with size == nb */ - size_t sizebits = nb << leftshift_for_tree_index(idx); - tchunkptr rst = 0; /* The deepest untaken right subtree */ - for (;;) { - tchunkptr rt; - size_t trem = chunksize(t) - nb; - if (trem < rsize) { - v = t; - if ((rsize = trem) == 0) - break; - } - rt = t->child[1]; - t = t->child[(sizebits >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1]; - if (rt != 0 && rt != t) - rst = rt; - if (t == 0) { - t = rst; /* set t to least subtree holding sizes > nb */ - break; - } - sizebits <<= 1; - } - } - - if (t == 0 && v == 0) { /* set t to root of next non-empty treebin */ - binmap_t leftbits = left_bits(idx2bit(idx)) & m->treemap; - if (leftbits != 0) - t = *treebin_at(m, lj_ffs(leftbits)); - } - - while (t != 0) { /* find smallest of tree or subtree */ - size_t trem = chunksize(t) - nb; - if (trem < rsize) { - rsize = trem; - v = t; - } - t = leftmost_child(t); - } - - /* If dv is a better fit, return NULL so malloc will use it */ - if (v != 0 && rsize < (size_t)(m->dvsize - nb)) { - mchunkptr r = chunk_plus_offset(v, nb); - unlink_large_chunk(m, v); - if (rsize < MIN_CHUNK_SIZE) { - set_inuse_and_pinuse(m, v, (rsize + nb)); - } else { - set_size_and_pinuse_of_inuse_chunk(m, v, nb); - set_size_and_pinuse_of_free_chunk(r, rsize); - insert_chunk(m, r, rsize); - } - return chunk2mem(v); - } - return NULL; -} - -/* allocate a small request from the best fitting chunk in a treebin */ -static void *tmalloc_small(mstate m, size_t nb) -{ - tchunkptr t, v; - mchunkptr r; - size_t rsize; - bindex_t i = lj_ffs(m->treemap); - - v = t = *treebin_at(m, i); - rsize = chunksize(t) - nb; - - while ((t = leftmost_child(t)) != 0) { - size_t trem = chunksize(t) - nb; - if (trem < rsize) { - rsize = trem; - v = t; - } - } - - r = chunk_plus_offset(v, nb); - unlink_large_chunk(m, v); - if (rsize < MIN_CHUNK_SIZE) { - set_inuse_and_pinuse(m, v, (rsize + nb)); - } else { - set_size_and_pinuse_of_inuse_chunk(m, v, nb); - set_size_and_pinuse_of_free_chunk(r, rsize); - replace_dv(m, r, rsize); - } - return chunk2mem(v); -} - -/* ----------------------------------------------------------------------- */ - -void *lj_alloc_create(void) -{ - size_t tsize = DEFAULT_GRANULARITY; - char *tbase; - INIT_MMAP(); - tbase = (char *)(CALL_MMAP(tsize)); - if (tbase != CMFAIL) { - size_t msize = pad_request(sizeof(struct malloc_state)); - mchunkptr mn; - mchunkptr msp = align_as_chunk(tbase); - mstate m = (mstate)(chunk2mem(msp)); - memset(m, 0, msize); - msp->head = (msize|PINUSE_BIT|CINUSE_BIT); - m->seg.base = tbase; - m->seg.size = tsize; - m->release_checks = MAX_RELEASE_CHECK_RATE; - init_bins(m); - mn = next_chunk(mem2chunk(m)); - init_top(m, mn, (size_t)((tbase + tsize) - (char *)mn) - TOP_FOOT_SIZE); - return m; - } - return NULL; -} - -void lj_alloc_destroy(void *msp) -{ - mstate ms = (mstate)msp; - msegmentptr sp = &ms->seg; - while (sp != 0) { - char *base = sp->base; - size_t size = sp->size; - sp = sp->next; - CALL_MUNMAP(base, size); - } -} - -static LJ_NOINLINE void *lj_alloc_malloc(void *msp, size_t nsize) -{ - mstate ms = (mstate)msp; - void *mem; - size_t nb; - if (nsize <= MAX_SMALL_REQUEST) { - bindex_t idx; - binmap_t smallbits; - nb = (nsize < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(nsize); - idx = small_index(nb); - smallbits = ms->smallmap >> idx; - - if ((smallbits & 0x3U) != 0) { /* Remainderless fit to a smallbin. */ - mchunkptr b, p; - idx += ~smallbits & 1; /* Uses next bin if idx empty */ - b = smallbin_at(ms, idx); - p = b->fd; - unlink_first_small_chunk(ms, b, p, idx); - set_inuse_and_pinuse(ms, p, small_index2size(idx)); - mem = chunk2mem(p); - return mem; - } else if (nb > ms->dvsize) { - if (smallbits != 0) { /* Use chunk in next nonempty smallbin */ - mchunkptr b, p, r; - size_t rsize; - binmap_t leftbits = (smallbits << idx) & left_bits(idx2bit(idx)); - bindex_t i = lj_ffs(leftbits); - b = smallbin_at(ms, i); - p = b->fd; - unlink_first_small_chunk(ms, b, p, i); - rsize = small_index2size(i) - nb; - /* Fit here cannot be remainderless if 4byte sizes */ - if (SIZE_T_SIZE != 4 && rsize < MIN_CHUNK_SIZE) { - set_inuse_and_pinuse(ms, p, small_index2size(i)); - } else { - set_size_and_pinuse_of_inuse_chunk(ms, p, nb); - r = chunk_plus_offset(p, nb); - set_size_and_pinuse_of_free_chunk(r, rsize); - replace_dv(ms, r, rsize); - } - mem = chunk2mem(p); - return mem; - } else if (ms->treemap != 0 && (mem = tmalloc_small(ms, nb)) != 0) { - return mem; - } - } - } else if (nsize >= MAX_REQUEST) { - nb = MAX_SIZE_T; /* Too big to allocate. Force failure (in sys alloc) */ - } else { - nb = pad_request(nsize); - if (ms->treemap != 0 && (mem = tmalloc_large(ms, nb)) != 0) { - return mem; - } - } - - if (nb <= ms->dvsize) { - size_t rsize = ms->dvsize - nb; - mchunkptr p = ms->dv; - if (rsize >= MIN_CHUNK_SIZE) { /* split dv */ - mchunkptr r = ms->dv = chunk_plus_offset(p, nb); - ms->dvsize = rsize; - set_size_and_pinuse_of_free_chunk(r, rsize); - set_size_and_pinuse_of_inuse_chunk(ms, p, nb); - } else { /* exhaust dv */ - size_t dvs = ms->dvsize; - ms->dvsize = 0; - ms->dv = 0; - set_inuse_and_pinuse(ms, p, dvs); - } - mem = chunk2mem(p); - return mem; - } else if (nb < ms->topsize) { /* Split top */ - size_t rsize = ms->topsize -= nb; - mchunkptr p = ms->top; - mchunkptr r = ms->top = chunk_plus_offset(p, nb); - r->head = rsize | PINUSE_BIT; - set_size_and_pinuse_of_inuse_chunk(ms, p, nb); - mem = chunk2mem(p); - return mem; - } - return alloc_sys(ms, nb); -} - -static LJ_NOINLINE void *lj_alloc_free(void *msp, void *ptr) -{ - if (ptr != 0) { - mchunkptr p = mem2chunk(ptr); - mstate fm = (mstate)msp; - size_t psize = chunksize(p); - mchunkptr next = chunk_plus_offset(p, psize); - if (!pinuse(p)) { - size_t prevsize = p->prev_foot; - if ((prevsize & IS_DIRECT_BIT) != 0) { - prevsize &= ~IS_DIRECT_BIT; - psize += prevsize + DIRECT_FOOT_PAD; - CALL_MUNMAP((char *)p - prevsize, psize); - return NULL; - } else { - mchunkptr prev = chunk_minus_offset(p, prevsize); - psize += prevsize; - p = prev; - /* consolidate backward */ - if (p != fm->dv) { - unlink_chunk(fm, p, prevsize); - } else if ((next->head & INUSE_BITS) == INUSE_BITS) { - fm->dvsize = psize; - set_free_with_pinuse(p, psize, next); - return NULL; - } - } - } - if (!cinuse(next)) { /* consolidate forward */ - if (next == fm->top) { - size_t tsize = fm->topsize += psize; - fm->top = p; - p->head = tsize | PINUSE_BIT; - if (p == fm->dv) { - fm->dv = 0; - fm->dvsize = 0; - } - if (tsize > fm->trim_check) - alloc_trim(fm, 0); - return NULL; - } else if (next == fm->dv) { - size_t dsize = fm->dvsize += psize; - fm->dv = p; - set_size_and_pinuse_of_free_chunk(p, dsize); - return NULL; - } else { - size_t nsize = chunksize(next); - psize += nsize; - unlink_chunk(fm, next, nsize); - set_size_and_pinuse_of_free_chunk(p, psize); - if (p == fm->dv) { - fm->dvsize = psize; - return NULL; - } - } - } else { - set_free_with_pinuse(p, psize, next); - } - - if (is_small(psize)) { - insert_small_chunk(fm, p, psize); - } else { - tchunkptr tp = (tchunkptr)p; - insert_large_chunk(fm, tp, psize); - if (--fm->release_checks == 0) - release_unused_segments(fm); - } - } - return NULL; -} - -static LJ_NOINLINE void *lj_alloc_realloc(void *msp, void *ptr, size_t nsize) -{ - if (nsize >= MAX_REQUEST) { - return NULL; - } else { - mstate m = (mstate)msp; - mchunkptr oldp = mem2chunk(ptr); - size_t oldsize = chunksize(oldp); - mchunkptr next = chunk_plus_offset(oldp, oldsize); - mchunkptr newp = 0; - size_t nb = request2size(nsize); - - /* Try to either shrink or extend into top. Else malloc-copy-free */ - if (is_direct(oldp)) { - newp = direct_resize(oldp, nb); /* this may return NULL. */ - } else if (oldsize >= nb) { /* already big enough */ - size_t rsize = oldsize - nb; - newp = oldp; - if (rsize >= MIN_CHUNK_SIZE) { - mchunkptr rem = chunk_plus_offset(newp, nb); - set_inuse(m, newp, nb); - set_inuse(m, rem, rsize); - lj_alloc_free(m, chunk2mem(rem)); - } - } else if (next == m->top && oldsize + m->topsize > nb) { - /* Expand into top */ - size_t newsize = oldsize + m->topsize; - size_t newtopsize = newsize - nb; - mchunkptr newtop = chunk_plus_offset(oldp, nb); - set_inuse(m, oldp, nb); - newtop->head = newtopsize |PINUSE_BIT; - m->top = newtop; - m->topsize = newtopsize; - newp = oldp; - } - - if (newp != 0) { - return chunk2mem(newp); - } else { - void *newmem = lj_alloc_malloc(m, nsize); - if (newmem != 0) { - size_t oc = oldsize - overhead_for(oldp); - memcpy(newmem, ptr, oc < nsize ? oc : nsize); - lj_alloc_free(m, ptr); - } - return newmem; - } - } -} - -void *lj_alloc_f(void *msp, void *ptr, size_t osize, size_t nsize) -{ - (void)osize; - if (nsize == 0) { - return lj_alloc_free(msp, ptr); - } else if (ptr == NULL) { - return lj_alloc_malloc(msp, nsize); - } else { - return lj_alloc_realloc(msp, ptr, nsize); - } -} - -#endif diff --git a/deps/luajit/src/lj_alloc.h b/deps/luajit/src/lj_alloc.h deleted file mode 100644 index f87a7cf3..00000000 --- a/deps/luajit/src/lj_alloc.h +++ /dev/null @@ -1,17 +0,0 @@ -/* -** Bundled memory allocator. -** Donated to the public domain. -*/ - -#ifndef _LJ_ALLOC_H -#define _LJ_ALLOC_H - -#include "lj_def.h" - -#ifndef LUAJIT_USE_SYSMALLOC -LJ_FUNC void *lj_alloc_create(void); -LJ_FUNC void lj_alloc_destroy(void *msp); -LJ_FUNC void *lj_alloc_f(void *msp, void *ptr, size_t osize, size_t nsize); -#endif - -#endif diff --git a/deps/luajit/src/lj_api.c b/deps/luajit/src/lj_api.c deleted file mode 100644 index 3bedb39f..00000000 --- a/deps/luajit/src/lj_api.c +++ /dev/null @@ -1,1200 +0,0 @@ -/* -** Public Lua/C API. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -** -** Major portions taken verbatim or adapted from the Lua interpreter. -** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h -*/ - -#define lj_api_c -#define LUA_CORE - -#include "lj_obj.h" -#include "lj_gc.h" -#include "lj_err.h" -#include "lj_debug.h" -#include "lj_str.h" -#include "lj_tab.h" -#include "lj_func.h" -#include "lj_udata.h" -#include "lj_meta.h" -#include "lj_state.h" -#include "lj_bc.h" -#include "lj_frame.h" -#include "lj_trace.h" -#include "lj_vm.h" -#include "lj_strscan.h" - -/* -- Common helper functions --------------------------------------------- */ - -#define api_checknelems(L, n) api_check(L, (n) <= (L->top - L->base)) -#define api_checkvalidindex(L, i) api_check(L, (i) != niltv(L)) - -static TValue *index2adr(lua_State *L, int idx) -{ - if (idx > 0) { - TValue *o = L->base + (idx - 1); - return o < L->top ? o : niltv(L); - } else if (idx > LUA_REGISTRYINDEX) { - api_check(L, idx != 0 && -idx <= L->top - L->base); - return L->top + idx; - } else if (idx == LUA_GLOBALSINDEX) { - TValue *o = &G(L)->tmptv; - settabV(L, o, tabref(L->env)); - return o; - } else if (idx == LUA_REGISTRYINDEX) { - return registry(L); - } else { - GCfunc *fn = curr_func(L); - api_check(L, fn->c.gct == ~LJ_TFUNC && !isluafunc(fn)); - if (idx == LUA_ENVIRONINDEX) { - TValue *o = &G(L)->tmptv; - settabV(L, o, tabref(fn->c.env)); - return o; - } else { - idx = LUA_GLOBALSINDEX - idx; - return idx <= fn->c.nupvalues ? &fn->c.upvalue[idx-1] : niltv(L); - } - } -} - -static TValue *stkindex2adr(lua_State *L, int idx) -{ - if (idx > 0) { - TValue *o = L->base + (idx - 1); - return o < L->top ? o : niltv(L); - } else { - api_check(L, idx != 0 && -idx <= L->top - L->base); - return L->top + idx; - } -} - -static GCtab *getcurrenv(lua_State *L) -{ - GCfunc *fn = curr_func(L); - return fn->c.gct == ~LJ_TFUNC ? tabref(fn->c.env) : tabref(L->env); -} - -/* -- Miscellaneous API functions ----------------------------------------- */ - -LUA_API int lua_status(lua_State *L) -{ - return L->status; -} - -LUA_API int lua_checkstack(lua_State *L, int size) -{ - if (size > LUAI_MAXCSTACK || (L->top - L->base + size) > LUAI_MAXCSTACK) { - return 0; /* Stack overflow. */ - } else if (size > 0) { - lj_state_checkstack(L, (MSize)size); - } - return 1; -} - -LUALIB_API void luaL_checkstack(lua_State *L, int size, const char *msg) -{ - if (!lua_checkstack(L, size)) - lj_err_callerv(L, LJ_ERR_STKOVM, msg); -} - -LUA_API void lua_xmove(lua_State *from, lua_State *to, int n) -{ - TValue *f, *t; - if (from == to) return; - api_checknelems(from, n); - api_check(from, G(from) == G(to)); - lj_state_checkstack(to, (MSize)n); - f = from->top; - t = to->top = to->top + n; - while (--n >= 0) copyTV(to, --t, --f); - from->top = f; -} - -/* -- Stack manipulation -------------------------------------------------- */ - -LUA_API int lua_gettop(lua_State *L) -{ - return (int)(L->top - L->base); -} - -LUA_API void lua_settop(lua_State *L, int idx) -{ - if (idx >= 0) { - api_check(L, idx <= tvref(L->maxstack) - L->base); - if (L->base + idx > L->top) { - if (L->base + idx >= tvref(L->maxstack)) - lj_state_growstack(L, (MSize)idx - (MSize)(L->top - L->base)); - do { setnilV(L->top++); } while (L->top < L->base + idx); - } else { - L->top = L->base + idx; - } - } else { - api_check(L, -(idx+1) <= (L->top - L->base)); - L->top += idx+1; /* Shrinks top (idx < 0). */ - } -} - -LUA_API void lua_remove(lua_State *L, int idx) -{ - TValue *p = stkindex2adr(L, idx); - api_checkvalidindex(L, p); - while (++p < L->top) copyTV(L, p-1, p); - L->top--; -} - -LUA_API void lua_insert(lua_State *L, int idx) -{ - TValue *q, *p = stkindex2adr(L, idx); - api_checkvalidindex(L, p); - for (q = L->top; q > p; q--) copyTV(L, q, q-1); - copyTV(L, p, L->top); -} - -LUA_API void lua_replace(lua_State *L, int idx) -{ - api_checknelems(L, 1); - if (idx == LUA_GLOBALSINDEX) { - api_check(L, tvistab(L->top-1)); - /* NOBARRIER: A thread (i.e. L) is never black. */ - setgcref(L->env, obj2gco(tabV(L->top-1))); - } else if (idx == LUA_ENVIRONINDEX) { - GCfunc *fn = curr_func(L); - if (fn->c.gct != ~LJ_TFUNC) - lj_err_msg(L, LJ_ERR_NOENV); - api_check(L, tvistab(L->top-1)); - setgcref(fn->c.env, obj2gco(tabV(L->top-1))); - lj_gc_barrier(L, fn, L->top-1); - } else { - TValue *o = index2adr(L, idx); - api_checkvalidindex(L, o); - copyTV(L, o, L->top-1); - if (idx < LUA_GLOBALSINDEX) /* Need a barrier for upvalues. */ - lj_gc_barrier(L, curr_func(L), L->top-1); - } - L->top--; -} - -LUA_API void lua_pushvalue(lua_State *L, int idx) -{ - copyTV(L, L->top, index2adr(L, idx)); - incr_top(L); -} - -/* -- Stack getters ------------------------------------------------------- */ - -LUA_API int lua_type(lua_State *L, int idx) -{ - cTValue *o = index2adr(L, idx); - if (tvisnumber(o)) { - return LUA_TNUMBER; -#if LJ_64 - } else if (tvislightud(o)) { - return LUA_TLIGHTUSERDATA; -#endif - } else if (o == niltv(L)) { - return LUA_TNONE; - } else { /* Magic internal/external tag conversion. ORDER LJ_T */ - uint32_t t = ~itype(o); -#if LJ_64 - int tt = (int)((U64x(75a06,98042110) >> 4*t) & 15u); -#else - int tt = (int)(((t < 8 ? 0x98042110u : 0x75a06u) >> 4*(t&7)) & 15u); -#endif - lua_assert(tt != LUA_TNIL || tvisnil(o)); - return tt; - } -} - -LUALIB_API void luaL_checktype(lua_State *L, int idx, int tt) -{ - if (lua_type(L, idx) != tt) - lj_err_argt(L, idx, tt); -} - -LUALIB_API void luaL_checkany(lua_State *L, int idx) -{ - if (index2adr(L, idx) == niltv(L)) - lj_err_arg(L, idx, LJ_ERR_NOVAL); -} - -LUA_API const char *lua_typename(lua_State *L, int t) -{ - UNUSED(L); - return lj_obj_typename[t+1]; -} - -LUA_API int lua_iscfunction(lua_State *L, int idx) -{ - cTValue *o = index2adr(L, idx); - return tvisfunc(o) && !isluafunc(funcV(o)); -} - -LUA_API int lua_isnumber(lua_State *L, int idx) -{ - cTValue *o = index2adr(L, idx); - TValue tmp; - return (tvisnumber(o) || (tvisstr(o) && lj_strscan_number(strV(o), &tmp))); -} - -LUA_API int lua_isstring(lua_State *L, int idx) -{ - cTValue *o = index2adr(L, idx); - return (tvisstr(o) || tvisnumber(o)); -} - -LUA_API int lua_isuserdata(lua_State *L, int idx) -{ - cTValue *o = index2adr(L, idx); - return (tvisudata(o) || tvislightud(o)); -} - -LUA_API int lua_rawequal(lua_State *L, int idx1, int idx2) -{ - cTValue *o1 = index2adr(L, idx1); - cTValue *o2 = index2adr(L, idx2); - return (o1 == niltv(L) || o2 == niltv(L)) ? 0 : lj_obj_equal(o1, o2); -} - -LUA_API int lua_equal(lua_State *L, int idx1, int idx2) -{ - cTValue *o1 = index2adr(L, idx1); - cTValue *o2 = index2adr(L, idx2); - if (tvisint(o1) && tvisint(o2)) { - return intV(o1) == intV(o2); - } else if (tvisnumber(o1) && tvisnumber(o2)) { - return numberVnum(o1) == numberVnum(o2); - } else if (itype(o1) != itype(o2)) { - return 0; - } else if (tvispri(o1)) { - return o1 != niltv(L) && o2 != niltv(L); -#if LJ_64 - } else if (tvislightud(o1)) { - return o1->u64 == o2->u64; -#endif - } else if (gcrefeq(o1->gcr, o2->gcr)) { - return 1; - } else if (!tvistabud(o1)) { - return 0; - } else { - TValue *base = lj_meta_equal(L, gcV(o1), gcV(o2), 0); - if ((uintptr_t)base <= 1) { - return (int)(uintptr_t)base; - } else { - L->top = base+2; - lj_vm_call(L, base, 1+1); - L->top -= 2; - return tvistruecond(L->top+1); - } - } -} - -LUA_API int lua_lessthan(lua_State *L, int idx1, int idx2) -{ - cTValue *o1 = index2adr(L, idx1); - cTValue *o2 = index2adr(L, idx2); - if (o1 == niltv(L) || o2 == niltv(L)) { - return 0; - } else if (tvisint(o1) && tvisint(o2)) { - return intV(o1) < intV(o2); - } else if (tvisnumber(o1) && tvisnumber(o2)) { - return numberVnum(o1) < numberVnum(o2); - } else { - TValue *base = lj_meta_comp(L, o1, o2, 0); - if ((uintptr_t)base <= 1) { - return (int)(uintptr_t)base; - } else { - L->top = base+2; - lj_vm_call(L, base, 1+1); - L->top -= 2; - return tvistruecond(L->top+1); - } - } -} - -LUA_API lua_Number lua_tonumber(lua_State *L, int idx) -{ - cTValue *o = index2adr(L, idx); - TValue tmp; - if (LJ_LIKELY(tvisnumber(o))) - return numberVnum(o); - else if (tvisstr(o) && lj_strscan_num(strV(o), &tmp)) - return numV(&tmp); - else - return 0; -} - -LUALIB_API lua_Number luaL_checknumber(lua_State *L, int idx) -{ - cTValue *o = index2adr(L, idx); - TValue tmp; - if (LJ_LIKELY(tvisnumber(o))) - return numberVnum(o); - else if (!(tvisstr(o) && lj_strscan_num(strV(o), &tmp))) - lj_err_argt(L, idx, LUA_TNUMBER); - return numV(&tmp); -} - -LUALIB_API lua_Number luaL_optnumber(lua_State *L, int idx, lua_Number def) -{ - cTValue *o = index2adr(L, idx); - TValue tmp; - if (LJ_LIKELY(tvisnumber(o))) - return numberVnum(o); - else if (tvisnil(o)) - return def; - else if (!(tvisstr(o) && lj_strscan_num(strV(o), &tmp))) - lj_err_argt(L, idx, LUA_TNUMBER); - return numV(&tmp); -} - -LUA_API lua_Integer lua_tointeger(lua_State *L, int idx) -{ - cTValue *o = index2adr(L, idx); - TValue tmp; - lua_Number n; - if (LJ_LIKELY(tvisint(o))) { - return intV(o); - } else if (LJ_LIKELY(tvisnum(o))) { - n = numV(o); - } else { - if (!(tvisstr(o) && lj_strscan_number(strV(o), &tmp))) - return 0; - if (tvisint(&tmp)) - return (lua_Integer)intV(&tmp); - n = numV(&tmp); - } -#if LJ_64 - return (lua_Integer)n; -#else - return lj_num2int(n); -#endif -} - -LUALIB_API lua_Integer luaL_checkinteger(lua_State *L, int idx) -{ - cTValue *o = index2adr(L, idx); - TValue tmp; - lua_Number n; - if (LJ_LIKELY(tvisint(o))) { - return intV(o); - } else if (LJ_LIKELY(tvisnum(o))) { - n = numV(o); - } else { - if (!(tvisstr(o) && lj_strscan_number(strV(o), &tmp))) - lj_err_argt(L, idx, LUA_TNUMBER); - if (tvisint(&tmp)) - return (lua_Integer)intV(&tmp); - n = numV(&tmp); - } -#if LJ_64 - return (lua_Integer)n; -#else - return lj_num2int(n); -#endif -} - -LUALIB_API lua_Integer luaL_optinteger(lua_State *L, int idx, lua_Integer def) -{ - cTValue *o = index2adr(L, idx); - TValue tmp; - lua_Number n; - if (LJ_LIKELY(tvisint(o))) { - return intV(o); - } else if (LJ_LIKELY(tvisnum(o))) { - n = numV(o); - } else if (tvisnil(o)) { - return def; - } else { - if (!(tvisstr(o) && lj_strscan_number(strV(o), &tmp))) - lj_err_argt(L, idx, LUA_TNUMBER); - if (tvisint(&tmp)) - return (lua_Integer)intV(&tmp); - n = numV(&tmp); - } -#if LJ_64 - return (lua_Integer)n; -#else - return lj_num2int(n); -#endif -} - -LUA_API int lua_toboolean(lua_State *L, int idx) -{ - cTValue *o = index2adr(L, idx); - return tvistruecond(o); -} - -LUA_API const char *lua_tolstring(lua_State *L, int idx, size_t *len) -{ - TValue *o = index2adr(L, idx); - GCstr *s; - if (LJ_LIKELY(tvisstr(o))) { - s = strV(o); - } else if (tvisnumber(o)) { - lj_gc_check(L); - o = index2adr(L, idx); /* GC may move the stack. */ - s = lj_str_fromnumber(L, o); - setstrV(L, o, s); - } else { - if (len != NULL) *len = 0; - return NULL; - } - if (len != NULL) *len = s->len; - return strdata(s); -} - -LUALIB_API const char *luaL_checklstring(lua_State *L, int idx, size_t *len) -{ - TValue *o = index2adr(L, idx); - GCstr *s; - if (LJ_LIKELY(tvisstr(o))) { - s = strV(o); - } else if (tvisnumber(o)) { - lj_gc_check(L); - o = index2adr(L, idx); /* GC may move the stack. */ - s = lj_str_fromnumber(L, o); - setstrV(L, o, s); - } else { - lj_err_argt(L, idx, LUA_TSTRING); - } - if (len != NULL) *len = s->len; - return strdata(s); -} - -LUALIB_API const char *luaL_optlstring(lua_State *L, int idx, - const char *def, size_t *len) -{ - TValue *o = index2adr(L, idx); - GCstr *s; - if (LJ_LIKELY(tvisstr(o))) { - s = strV(o); - } else if (tvisnil(o)) { - if (len != NULL) *len = def ? strlen(def) : 0; - return def; - } else if (tvisnumber(o)) { - lj_gc_check(L); - o = index2adr(L, idx); /* GC may move the stack. */ - s = lj_str_fromnumber(L, o); - setstrV(L, o, s); - } else { - lj_err_argt(L, idx, LUA_TSTRING); - } - if (len != NULL) *len = s->len; - return strdata(s); -} - -LUALIB_API int luaL_checkoption(lua_State *L, int idx, const char *def, - const char *const lst[]) -{ - ptrdiff_t i; - const char *s = lua_tolstring(L, idx, NULL); - if (s == NULL && (s = def) == NULL) - lj_err_argt(L, idx, LUA_TSTRING); - for (i = 0; lst[i]; i++) - if (strcmp(lst[i], s) == 0) - return (int)i; - lj_err_argv(L, idx, LJ_ERR_INVOPTM, s); -} - -LUA_API size_t lua_objlen(lua_State *L, int idx) -{ - TValue *o = index2adr(L, idx); - if (tvisstr(o)) { - return strV(o)->len; - } else if (tvistab(o)) { - return (size_t)lj_tab_len(tabV(o)); - } else if (tvisudata(o)) { - return udataV(o)->len; - } else if (tvisnumber(o)) { - GCstr *s = lj_str_fromnumber(L, o); - setstrV(L, o, s); - return s->len; - } else { - return 0; - } -} - -LUA_API lua_CFunction lua_tocfunction(lua_State *L, int idx) -{ - cTValue *o = index2adr(L, idx); - if (tvisfunc(o)) { - BCOp op = bc_op(*mref(funcV(o)->c.pc, BCIns)); - if (op == BC_FUNCC || op == BC_FUNCCW) - return funcV(o)->c.f; - } - return NULL; -} - -LUA_API void *lua_touserdata(lua_State *L, int idx) -{ - cTValue *o = index2adr(L, idx); - if (tvisudata(o)) - return uddata(udataV(o)); - else if (tvislightud(o)) - return lightudV(o); - else - return NULL; -} - -LUA_API lua_State *lua_tothread(lua_State *L, int idx) -{ - cTValue *o = index2adr(L, idx); - return (!tvisthread(o)) ? NULL : threadV(o); -} - -LUA_API const void *lua_topointer(lua_State *L, int idx) -{ - cTValue *o = index2adr(L, idx); - if (tvisudata(o)) - return uddata(udataV(o)); - else if (tvislightud(o)) - return lightudV(o); - else if (tviscdata(o)) - return cdataptr(cdataV(o)); - else if (tvisgcv(o)) - return gcV(o); - else - return NULL; -} - -/* -- Stack setters (object creation) ------------------------------------- */ - -LUA_API void lua_pushnil(lua_State *L) -{ - setnilV(L->top); - incr_top(L); -} - -LUA_API void lua_pushnumber(lua_State *L, lua_Number n) -{ - setnumV(L->top, n); - if (LJ_UNLIKELY(tvisnan(L->top))) - setnanV(L->top); /* Canonicalize injected NaNs. */ - incr_top(L); -} - -LUA_API void lua_pushinteger(lua_State *L, lua_Integer n) -{ - setintptrV(L->top, n); - incr_top(L); -} - -LUA_API void lua_pushlstring(lua_State *L, const char *str, size_t len) -{ - GCstr *s; - lj_gc_check(L); - s = lj_str_new(L, str, len); - setstrV(L, L->top, s); - incr_top(L); -} - -LUA_API void lua_pushstring(lua_State *L, const char *str) -{ - if (str == NULL) { - setnilV(L->top); - } else { - GCstr *s; - lj_gc_check(L); - s = lj_str_newz(L, str); - setstrV(L, L->top, s); - } - incr_top(L); -} - -LUA_API const char *lua_pushvfstring(lua_State *L, const char *fmt, - va_list argp) -{ - lj_gc_check(L); - return lj_str_pushvf(L, fmt, argp); -} - -LUA_API const char *lua_pushfstring(lua_State *L, const char *fmt, ...) -{ - const char *ret; - va_list argp; - lj_gc_check(L); - va_start(argp, fmt); - ret = lj_str_pushvf(L, fmt, argp); - va_end(argp); - return ret; -} - -LUA_API void lua_pushcclosure(lua_State *L, lua_CFunction f, int n) -{ - GCfunc *fn; - lj_gc_check(L); - api_checknelems(L, n); - fn = lj_func_newC(L, (MSize)n, getcurrenv(L)); - fn->c.f = f; - L->top -= n; - while (n--) - copyTV(L, &fn->c.upvalue[n], L->top+n); - setfuncV(L, L->top, fn); - lua_assert(iswhite(obj2gco(fn))); - incr_top(L); -} - -LUA_API void lua_pushboolean(lua_State *L, int b) -{ - setboolV(L->top, (b != 0)); - incr_top(L); -} - -LUA_API void lua_pushlightuserdata(lua_State *L, void *p) -{ - setlightudV(L->top, checklightudptr(L, p)); - incr_top(L); -} - -LUA_API void lua_createtable(lua_State *L, int narray, int nrec) -{ - GCtab *t; - lj_gc_check(L); - t = lj_tab_new(L, (uint32_t)(narray > 0 ? narray+1 : 0), hsize2hbits(nrec)); - settabV(L, L->top, t); - incr_top(L); -} - -LUALIB_API int luaL_newmetatable(lua_State *L, const char *tname) -{ - GCtab *regt = tabV(registry(L)); - TValue *tv = lj_tab_setstr(L, regt, lj_str_newz(L, tname)); - if (tvisnil(tv)) { - GCtab *mt = lj_tab_new(L, 0, 1); - settabV(L, tv, mt); - settabV(L, L->top++, mt); - lj_gc_anybarriert(L, regt); - return 1; - } else { - copyTV(L, L->top++, tv); - return 0; - } -} - -LUA_API int lua_pushthread(lua_State *L) -{ - setthreadV(L, L->top, L); - incr_top(L); - return (mainthread(G(L)) == L); -} - -LUA_API lua_State *lua_newthread(lua_State *L) -{ - lua_State *L1; - lj_gc_check(L); - L1 = lj_state_new(L); - setthreadV(L, L->top, L1); - incr_top(L); - return L1; -} - -LUA_API void *lua_newuserdata(lua_State *L, size_t size) -{ - GCudata *ud; - lj_gc_check(L); - if (size > LJ_MAX_UDATA) - lj_err_msg(L, LJ_ERR_UDATAOV); - ud = lj_udata_new(L, (MSize)size, getcurrenv(L)); - setudataV(L, L->top, ud); - incr_top(L); - return uddata(ud); -} - -LUA_API void lua_concat(lua_State *L, int n) -{ - api_checknelems(L, n); - if (n >= 2) { - n--; - do { - TValue *top = lj_meta_cat(L, L->top-1, -n); - if (top == NULL) { - L->top -= n; - break; - } - n -= (int)(L->top - top); - L->top = top+2; - lj_vm_call(L, top, 1+1); - L->top--; - copyTV(L, L->top-1, L->top); - } while (--n > 0); - } else if (n == 0) { /* Push empty string. */ - setstrV(L, L->top, &G(L)->strempty); - incr_top(L); - } - /* else n == 1: nothing to do. */ -} - -/* -- Object getters ------------------------------------------------------ */ - -LUA_API void lua_gettable(lua_State *L, int idx) -{ - cTValue *v, *t = index2adr(L, idx); - api_checkvalidindex(L, t); - v = lj_meta_tget(L, t, L->top-1); - if (v == NULL) { - L->top += 2; - lj_vm_call(L, L->top-2, 1+1); - L->top -= 2; - v = L->top+1; - } - copyTV(L, L->top-1, v); -} - -LUA_API void lua_getfield(lua_State *L, int idx, const char *k) -{ - cTValue *v, *t = index2adr(L, idx); - TValue key; - api_checkvalidindex(L, t); - setstrV(L, &key, lj_str_newz(L, k)); - v = lj_meta_tget(L, t, &key); - if (v == NULL) { - L->top += 2; - lj_vm_call(L, L->top-2, 1+1); - L->top -= 2; - v = L->top+1; - } - copyTV(L, L->top, v); - incr_top(L); -} - -LUA_API void lua_rawget(lua_State *L, int idx) -{ - cTValue *t = index2adr(L, idx); - api_check(L, tvistab(t)); - copyTV(L, L->top-1, lj_tab_get(L, tabV(t), L->top-1)); -} - -LUA_API void lua_rawgeti(lua_State *L, int idx, int n) -{ - cTValue *v, *t = index2adr(L, idx); - api_check(L, tvistab(t)); - v = lj_tab_getint(tabV(t), n); - if (v) { - copyTV(L, L->top, v); - } else { - setnilV(L->top); - } - incr_top(L); -} - -LUA_API int lua_getmetatable(lua_State *L, int idx) -{ - cTValue *o = index2adr(L, idx); - GCtab *mt = NULL; - if (tvistab(o)) - mt = tabref(tabV(o)->metatable); - else if (tvisudata(o)) - mt = tabref(udataV(o)->metatable); - else - mt = tabref(basemt_obj(G(L), o)); - if (mt == NULL) - return 0; - settabV(L, L->top, mt); - incr_top(L); - return 1; -} - -LUALIB_API int luaL_getmetafield(lua_State *L, int idx, const char *field) -{ - if (lua_getmetatable(L, idx)) { - cTValue *tv = lj_tab_getstr(tabV(L->top-1), lj_str_newz(L, field)); - if (tv && !tvisnil(tv)) { - copyTV(L, L->top-1, tv); - return 1; - } - L->top--; - } - return 0; -} - -LUA_API void lua_getfenv(lua_State *L, int idx) -{ - cTValue *o = index2adr(L, idx); - api_checkvalidindex(L, o); - if (tvisfunc(o)) { - settabV(L, L->top, tabref(funcV(o)->c.env)); - } else if (tvisudata(o)) { - settabV(L, L->top, tabref(udataV(o)->env)); - } else if (tvisthread(o)) { - settabV(L, L->top, tabref(threadV(o)->env)); - } else { - setnilV(L->top); - } - incr_top(L); -} - -LUA_API int lua_next(lua_State *L, int idx) -{ - cTValue *t = index2adr(L, idx); - int more; - api_check(L, tvistab(t)); - more = lj_tab_next(L, tabV(t), L->top-1); - if (more) { - incr_top(L); /* Return new key and value slot. */ - } else { /* End of traversal. */ - L->top--; /* Remove key slot. */ - } - return more; -} - -LUA_API const char *lua_getupvalue(lua_State *L, int idx, int n) -{ - TValue *val; - const char *name = lj_debug_uvnamev(index2adr(L, idx), (uint32_t)(n-1), &val); - if (name) { - copyTV(L, L->top, val); - incr_top(L); - } - return name; -} - -LUA_API void *lua_upvalueid(lua_State *L, int idx, int n) -{ - GCfunc *fn = funcV(index2adr(L, idx)); - n--; - api_check(L, (uint32_t)n < fn->l.nupvalues); - return isluafunc(fn) ? (void *)gcref(fn->l.uvptr[n]) : - (void *)&fn->c.upvalue[n]; -} - -LUA_API void lua_upvaluejoin(lua_State *L, int idx1, int n1, int idx2, int n2) -{ - GCfunc *fn1 = funcV(index2adr(L, idx1)); - GCfunc *fn2 = funcV(index2adr(L, idx2)); - n1--; n2--; - api_check(L, isluafunc(fn1) && (uint32_t)n1 < fn1->l.nupvalues); - api_check(L, isluafunc(fn2) && (uint32_t)n2 < fn2->l.nupvalues); - setgcrefr(fn1->l.uvptr[n1], fn2->l.uvptr[n2]); - lj_gc_objbarrier(L, fn1, gcref(fn1->l.uvptr[n1])); -} - -LUALIB_API void *luaL_checkudata(lua_State *L, int idx, const char *tname) -{ - cTValue *o = index2adr(L, idx); - if (tvisudata(o)) { - GCudata *ud = udataV(o); - cTValue *tv = lj_tab_getstr(tabV(registry(L)), lj_str_newz(L, tname)); - if (tv && tvistab(tv) && tabV(tv) == tabref(ud->metatable)) - return uddata(ud); - } - lj_err_argtype(L, idx, tname); - return NULL; /* unreachable */ -} - -/* -- Object setters ------------------------------------------------------ */ - -LUA_API void lua_settable(lua_State *L, int idx) -{ - TValue *o; - cTValue *t = index2adr(L, idx); - api_checknelems(L, 2); - api_checkvalidindex(L, t); - o = lj_meta_tset(L, t, L->top-2); - if (o) { - /* NOBARRIER: lj_meta_tset ensures the table is not black. */ - copyTV(L, o, L->top-1); - L->top -= 2; - } else { - L->top += 3; - copyTV(L, L->top-1, L->top-6); - lj_vm_call(L, L->top-3, 0+1); - L->top -= 3; - } -} - -LUA_API void lua_setfield(lua_State *L, int idx, const char *k) -{ - TValue *o; - TValue key; - cTValue *t = index2adr(L, idx); - api_checknelems(L, 1); - api_checkvalidindex(L, t); - setstrV(L, &key, lj_str_newz(L, k)); - o = lj_meta_tset(L, t, &key); - if (o) { - L->top--; - /* NOBARRIER: lj_meta_tset ensures the table is not black. */ - copyTV(L, o, L->top); - } else { - L->top += 3; - copyTV(L, L->top-1, L->top-6); - lj_vm_call(L, L->top-3, 0+1); - L->top -= 2; - } -} - -LUA_API void lua_rawset(lua_State *L, int idx) -{ - GCtab *t = tabV(index2adr(L, idx)); - TValue *dst, *key; - api_checknelems(L, 2); - key = L->top-2; - dst = lj_tab_set(L, t, key); - copyTV(L, dst, key+1); - lj_gc_anybarriert(L, t); - L->top = key; -} - -LUA_API void lua_rawseti(lua_State *L, int idx, int n) -{ - GCtab *t = tabV(index2adr(L, idx)); - TValue *dst, *src; - api_checknelems(L, 1); - dst = lj_tab_setint(L, t, n); - src = L->top-1; - copyTV(L, dst, src); - lj_gc_barriert(L, t, dst); - L->top = src; -} - -LUA_API int lua_setmetatable(lua_State *L, int idx) -{ - global_State *g; - GCtab *mt; - cTValue *o = index2adr(L, idx); - api_checknelems(L, 1); - api_checkvalidindex(L, o); - if (tvisnil(L->top-1)) { - mt = NULL; - } else { - api_check(L, tvistab(L->top-1)); - mt = tabV(L->top-1); - } - g = G(L); - if (tvistab(o)) { - setgcref(tabV(o)->metatable, obj2gco(mt)); - if (mt) - lj_gc_objbarriert(L, tabV(o), mt); - } else if (tvisudata(o)) { - setgcref(udataV(o)->metatable, obj2gco(mt)); - if (mt) - lj_gc_objbarrier(L, udataV(o), mt); - } else { - /* Flush cache, since traces specialize to basemt. But not during __gc. */ - if (lj_trace_flushall(L)) - lj_err_caller(L, LJ_ERR_NOGCMM); - if (tvisbool(o)) { - /* NOBARRIER: basemt is a GC root. */ - setgcref(basemt_it(g, LJ_TTRUE), obj2gco(mt)); - setgcref(basemt_it(g, LJ_TFALSE), obj2gco(mt)); - } else { - /* NOBARRIER: basemt is a GC root. */ - setgcref(basemt_obj(g, o), obj2gco(mt)); - } - } - L->top--; - return 1; -} - -LUA_API int lua_setfenv(lua_State *L, int idx) -{ - cTValue *o = index2adr(L, idx); - GCtab *t; - api_checknelems(L, 1); - api_checkvalidindex(L, o); - api_check(L, tvistab(L->top-1)); - t = tabV(L->top-1); - if (tvisfunc(o)) { - setgcref(funcV(o)->c.env, obj2gco(t)); - } else if (tvisudata(o)) { - setgcref(udataV(o)->env, obj2gco(t)); - } else if (tvisthread(o)) { - setgcref(threadV(o)->env, obj2gco(t)); - } else { - L->top--; - return 0; - } - lj_gc_objbarrier(L, gcV(o), t); - L->top--; - return 1; -} - -LUA_API const char *lua_setupvalue(lua_State *L, int idx, int n) -{ - cTValue *f = index2adr(L, idx); - TValue *val; - const char *name; - api_checknelems(L, 1); - name = lj_debug_uvnamev(f, (uint32_t)(n-1), &val); - if (name) { - L->top--; - copyTV(L, val, L->top); - lj_gc_barrier(L, funcV(f), L->top); - } - return name; -} - -/* -- Calls --------------------------------------------------------------- */ - -LUA_API void lua_call(lua_State *L, int nargs, int nresults) -{ - api_check(L, L->status == 0 || L->status == LUA_ERRERR); - api_checknelems(L, nargs+1); - lj_vm_call(L, L->top - nargs, nresults+1); -} - -LUA_API int lua_pcall(lua_State *L, int nargs, int nresults, int errfunc) -{ - global_State *g = G(L); - uint8_t oldh = hook_save(g); - ptrdiff_t ef; - int status; - api_check(L, L->status == 0 || L->status == LUA_ERRERR); - api_checknelems(L, nargs+1); - if (errfunc == 0) { - ef = 0; - } else { - cTValue *o = stkindex2adr(L, errfunc); - api_checkvalidindex(L, o); - ef = savestack(L, o); - } - status = lj_vm_pcall(L, L->top - nargs, nresults+1, ef); - if (status) hook_restore(g, oldh); - return status; -} - -static TValue *cpcall(lua_State *L, lua_CFunction func, void *ud) -{ - GCfunc *fn = lj_func_newC(L, 0, getcurrenv(L)); - fn->c.f = func; - setfuncV(L, L->top, fn); - setlightudV(L->top+1, checklightudptr(L, ud)); - cframe_nres(L->cframe) = 1+0; /* Zero results. */ - L->top += 2; - return L->top-1; /* Now call the newly allocated C function. */ -} - -LUA_API int lua_cpcall(lua_State *L, lua_CFunction func, void *ud) -{ - global_State *g = G(L); - uint8_t oldh = hook_save(g); - int status; - api_check(L, L->status == 0 || L->status == LUA_ERRERR); - status = lj_vm_cpcall(L, func, ud, cpcall); - if (status) hook_restore(g, oldh); - return status; -} - -LUALIB_API int luaL_callmeta(lua_State *L, int idx, const char *field) -{ - if (luaL_getmetafield(L, idx, field)) { - TValue *base = L->top--; - copyTV(L, base, index2adr(L, idx)); - L->top = base+1; - lj_vm_call(L, base, 1+1); - return 1; - } - return 0; -} - -/* -- Coroutine yield and resume ------------------------------------------ */ - -LUA_API int lua_yield(lua_State *L, int nresults) -{ - void *cf = L->cframe; - global_State *g = G(L); - if (cframe_canyield(cf)) { - cf = cframe_raw(cf); - if (!hook_active(g)) { /* Regular yield: move results down if needed. */ - cTValue *f = L->top - nresults; - if (f > L->base) { - TValue *t = L->base; - while (--nresults >= 0) copyTV(L, t++, f++); - L->top = t; - } - L->cframe = NULL; - L->status = LUA_YIELD; - return -1; - } else { /* Yield from hook: add a pseudo-frame. */ - TValue *top = L->top; - hook_leave(g); - top->u64 = cframe_multres(cf); - setcont(top+1, lj_cont_hook); - setframe_pc(top+1, cframe_pc(cf)-1); - setframe_gc(top+2, obj2gco(L)); - setframe_ftsz(top+2, (int)((char *)(top+3)-(char *)L->base)+FRAME_CONT); - L->top = L->base = top+3; -#if LJ_TARGET_X64 - lj_err_throw(L, LUA_YIELD); -#else - L->cframe = NULL; - L->status = LUA_YIELD; - lj_vm_unwind_c(cf, LUA_YIELD); -#endif - } - } - lj_err_msg(L, LJ_ERR_CYIELD); - return 0; /* unreachable */ -} - -LUA_API int lua_resume(lua_State *L, int nargs) -{ - if (L->cframe == NULL && L->status <= LUA_YIELD) - return lj_vm_resume(L, L->top - nargs, 0, 0); - L->top = L->base; - setstrV(L, L->top, lj_err_str(L, LJ_ERR_COSUSP)); - incr_top(L); - return LUA_ERRRUN; -} - -/* -- GC and memory management -------------------------------------------- */ - -LUA_API int lua_gc(lua_State *L, int what, int data) -{ - global_State *g = G(L); - int res = 0; - switch (what) { - case LUA_GCSTOP: - g->gc.threshold = LJ_MAX_MEM; - break; - case LUA_GCRESTART: - g->gc.threshold = data == -1 ? (g->gc.total/100)*g->gc.pause : g->gc.total; - break; - case LUA_GCCOLLECT: - lj_gc_fullgc(L); - break; - case LUA_GCCOUNT: - res = (int)(g->gc.total >> 10); - break; - case LUA_GCCOUNTB: - res = (int)(g->gc.total & 0x3ff); - break; - case LUA_GCSTEP: { - MSize a = (MSize)data << 10; - g->gc.threshold = (a <= g->gc.total) ? (g->gc.total - a) : 0; - while (g->gc.total >= g->gc.threshold) - if (lj_gc_step(L) > 0) { - res = 1; - break; - } - break; - } - case LUA_GCSETPAUSE: - res = (int)(g->gc.pause); - g->gc.pause = (MSize)data; - break; - case LUA_GCSETSTEPMUL: - res = (int)(g->gc.stepmul); - g->gc.stepmul = (MSize)data; - break; - default: - res = -1; /* Invalid option. */ - } - return res; -} - -LUA_API lua_Alloc lua_getallocf(lua_State *L, void **ud) -{ - global_State *g = G(L); - if (ud) *ud = g->allocd; - return g->allocf; -} - -LUA_API void lua_setallocf(lua_State *L, lua_Alloc f, void *ud) -{ - global_State *g = G(L); - g->allocd = ud; - g->allocf = f; -} - diff --git a/deps/luajit/src/lj_arch.h b/deps/luajit/src/lj_arch.h deleted file mode 100644 index d3a9d57d..00000000 --- a/deps/luajit/src/lj_arch.h +++ /dev/null @@ -1,437 +0,0 @@ -/* -** Target architecture selection. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#ifndef _LJ_ARCH_H -#define _LJ_ARCH_H - -#include "lua.h" - -/* Target endianess. */ -#define LUAJIT_LE 0 -#define LUAJIT_BE 1 - -/* Target architectures. */ -#define LUAJIT_ARCH_X86 1 -#define LUAJIT_ARCH_x86 1 -#define LUAJIT_ARCH_X64 2 -#define LUAJIT_ARCH_x64 2 -#define LUAJIT_ARCH_ARM 3 -#define LUAJIT_ARCH_arm 3 -#define LUAJIT_ARCH_PPC 4 -#define LUAJIT_ARCH_ppc 4 -#define LUAJIT_ARCH_PPCSPE 5 -#define LUAJIT_ARCH_ppcspe 5 -#define LUAJIT_ARCH_MIPS 6 -#define LUAJIT_ARCH_mips 6 - -/* Target OS. */ -#define LUAJIT_OS_OTHER 0 -#define LUAJIT_OS_WINDOWS 1 -#define LUAJIT_OS_LINUX 2 -#define LUAJIT_OS_OSX 3 -#define LUAJIT_OS_BSD 4 -#define LUAJIT_OS_POSIX 5 - -/* Select native target if no target defined. */ -#ifndef LUAJIT_TARGET - -#if defined(__i386) || defined(__i386__) || defined(_M_IX86) -#define LUAJIT_TARGET LUAJIT_ARCH_X86 -#elif defined(__x86_64__) || defined(__x86_64) || defined(_M_X64) || defined(_M_AMD64) -#define LUAJIT_TARGET LUAJIT_ARCH_X64 -#elif defined(__arm__) || defined(__arm) || defined(__ARM__) || defined(__ARM) -#define LUAJIT_TARGET LUAJIT_ARCH_ARM -#elif defined(__ppc__) || defined(__ppc) || defined(__PPC__) || defined(__PPC) || defined(__powerpc__) || defined(__powerpc) || defined(__POWERPC__) || defined(__POWERPC) || defined(_M_PPC) -#ifdef __NO_FPRS__ -#define LUAJIT_TARGET LUAJIT_ARCH_PPCSPE -#else -#define LUAJIT_TARGET LUAJIT_ARCH_PPC -#endif -#elif defined(__mips__) || defined(__mips) || defined(__MIPS__) || defined(__MIPS) -#define LUAJIT_TARGET LUAJIT_ARCH_MIPS -#else -#error "No support for this architecture (yet)" -#endif - -#endif - -/* Select native OS if no target OS defined. */ -#ifndef LUAJIT_OS - -#if defined(_WIN32) && !defined(_XBOX_VER) -#define LUAJIT_OS LUAJIT_OS_WINDOWS -#elif defined(__linux__) -#define LUAJIT_OS LUAJIT_OS_LINUX -#elif defined(__MACH__) && defined(__APPLE__) -#define LUAJIT_OS LUAJIT_OS_OSX -#elif (defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || \ - defined(__NetBSD__) || defined(__OpenBSD__) || \ - defined(__DragonFly__)) && !defined(__ORBIS__) -#define LUAJIT_OS LUAJIT_OS_BSD -#elif (defined(__sun__) && defined(__svr4__)) || defined(__CYGWIN__) -#define LUAJIT_OS LUAJIT_OS_POSIX -#else -#define LUAJIT_OS LUAJIT_OS_OTHER -#endif - -#endif - -/* Set target OS properties. */ -#if LUAJIT_OS == LUAJIT_OS_WINDOWS -#define LJ_OS_NAME "Windows" -#elif LUAJIT_OS == LUAJIT_OS_LINUX -#define LJ_OS_NAME "Linux" -#elif LUAJIT_OS == LUAJIT_OS_OSX -#define LJ_OS_NAME "OSX" -#elif LUAJIT_OS == LUAJIT_OS_BSD -#define LJ_OS_NAME "BSD" -#elif LUAJIT_OS == LUAJIT_OS_POSIX -#define LJ_OS_NAME "POSIX" -#else -#define LJ_OS_NAME "Other" -#endif - -#define LJ_TARGET_WINDOWS (LUAJIT_OS == LUAJIT_OS_WINDOWS) -#define LJ_TARGET_LINUX (LUAJIT_OS == LUAJIT_OS_LINUX) -#define LJ_TARGET_OSX (LUAJIT_OS == LUAJIT_OS_OSX) -#define LJ_TARGET_IOS (LJ_TARGET_OSX && LUAJIT_TARGET == LUAJIT_ARCH_ARM) -#define LJ_TARGET_POSIX (LUAJIT_OS > LUAJIT_OS_WINDOWS) -#define LJ_TARGET_DLOPEN LJ_TARGET_POSIX - -#ifdef __CELLOS_LV2__ -#define LJ_TARGET_PS3 1 -#define LJ_TARGET_CONSOLE 1 -#endif - -#ifdef __ORBIS__ -#define LJ_TARGET_PS4 1 -#define LJ_TARGET_CONSOLE 1 -#undef NULL -#define NULL ((void*)0) -#endif - -#ifdef __psp2__ -#define LJ_TARGET_PSVITA 1 -#define LJ_TARGET_CONSOLE 1 -#endif - -#if _XBOX_VER >= 200 -#define LJ_TARGET_XBOX360 1 -#define LJ_TARGET_CONSOLE 1 -#endif - -#define LJ_NUMMODE_SINGLE 0 /* Single-number mode only. */ -#define LJ_NUMMODE_SINGLE_DUAL 1 /* Default to single-number mode. */ -#define LJ_NUMMODE_DUAL 2 /* Dual-number mode only. */ -#define LJ_NUMMODE_DUAL_SINGLE 3 /* Default to dual-number mode. */ - -/* Set target architecture properties. */ -#if LUAJIT_TARGET == LUAJIT_ARCH_X86 - -#define LJ_ARCH_NAME "x86" -#define LJ_ARCH_BITS 32 -#define LJ_ARCH_ENDIAN LUAJIT_LE -#if LJ_TARGET_WINDOWS || __CYGWIN__ -#define LJ_ABI_WIN 1 -#else -#define LJ_ABI_WIN 0 -#endif -#define LJ_TARGET_X86 1 -#define LJ_TARGET_X86ORX64 1 -#define LJ_TARGET_EHRETREG 0 -#define LJ_TARGET_MASKSHIFT 1 -#define LJ_TARGET_MASKROT 1 -#define LJ_TARGET_UNALIGNED 1 -#define LJ_ARCH_NUMMODE LJ_NUMMODE_SINGLE_DUAL - -#elif LUAJIT_TARGET == LUAJIT_ARCH_X64 - -#define LJ_ARCH_NAME "x64" -#define LJ_ARCH_BITS 64 -#define LJ_ARCH_ENDIAN LUAJIT_LE -#define LJ_ABI_WIN LJ_TARGET_WINDOWS -#define LJ_TARGET_X64 1 -#define LJ_TARGET_X86ORX64 1 -#define LJ_TARGET_EHRETREG 0 -#define LJ_TARGET_JUMPRANGE 31 /* +-2^31 = +-2GB */ -#define LJ_TARGET_MASKSHIFT 1 -#define LJ_TARGET_MASKROT 1 -#define LJ_TARGET_UNALIGNED 1 -#define LJ_ARCH_NUMMODE LJ_NUMMODE_SINGLE_DUAL - -#elif LUAJIT_TARGET == LUAJIT_ARCH_ARM - -#define LJ_ARCH_NAME "arm" -#define LJ_ARCH_BITS 32 -#define LJ_ARCH_ENDIAN LUAJIT_LE -#if !defined(LJ_ARCH_HASFPU) && __SOFTFP__ -#define LJ_ARCH_HASFPU 0 -#endif -#if !defined(LJ_ABI_SOFTFP) && !__ARM_PCS_VFP -#define LJ_ABI_SOFTFP 1 -#endif -#define LJ_ABI_EABI 1 -#define LJ_TARGET_ARM 1 -#define LJ_TARGET_EHRETREG 0 -#define LJ_TARGET_JUMPRANGE 25 /* +-2^25 = +-32MB */ -#define LJ_TARGET_MASKSHIFT 0 -#define LJ_TARGET_MASKROT 1 -#define LJ_TARGET_UNIFYROT 2 /* Want only IR_BROR. */ -#define LJ_ARCH_NUMMODE LJ_NUMMODE_DUAL - -#if __ARM_ARCH____ARM_ARCH_8__ || __ARM_ARCH_8A__ -#define LJ_ARCH_VERSION 80 -#elif __ARM_ARCH_7__ || __ARM_ARCH_7A__ || __ARM_ARCH_7R__ || __ARM_ARCH_7S__ || __ARM_ARCH_7VE__ -#define LJ_ARCH_VERSION 70 -#elif __ARM_ARCH_6T2__ -#define LJ_ARCH_VERSION 61 -#elif __ARM_ARCH_6__ || __ARM_ARCH_6J__ || __ARM_ARCH_6K__ || __ARM_ARCH_6Z__ || __ARM_ARCH_6ZK__ -#define LJ_ARCH_VERSION 60 -#else -#define LJ_ARCH_VERSION 50 -#endif - -#elif LUAJIT_TARGET == LUAJIT_ARCH_PPC - -#define LJ_ARCH_NAME "ppc" -#if _LP64 -#define LJ_ARCH_BITS 64 -#else -#define LJ_ARCH_BITS 32 -#endif -#define LJ_ARCH_ENDIAN LUAJIT_BE -#define LJ_TARGET_PPC 1 -#define LJ_TARGET_EHRETREG 3 -#define LJ_TARGET_JUMPRANGE 25 /* +-2^25 = +-32MB */ -#define LJ_TARGET_MASKSHIFT 0 -#define LJ_TARGET_MASKROT 1 -#define LJ_TARGET_UNIFYROT 1 /* Want only IR_BROL. */ -#define LJ_ARCH_NUMMODE LJ_NUMMODE_DUAL_SINGLE - -#if _ARCH_PWR7 -#define LJ_ARCH_VERSION 70 -#elif _ARCH_PWR6 -#define LJ_ARCH_VERSION 60 -#elif _ARCH_PWR5X -#define LJ_ARCH_VERSION 51 -#elif _ARCH_PWR5 -#define LJ_ARCH_VERSION 50 -#elif _ARCH_PWR4 -#define LJ_ARCH_VERSION 40 -#else -#define LJ_ARCH_VERSION 0 -#endif -#if __PPC64__ || __powerpc64__ || LJ_TARGET_CONSOLE -#define LJ_ARCH_PPC64 1 -#define LJ_ARCH_NOFFI 1 -#endif -#if _ARCH_PPCSQ -#define LJ_ARCH_SQRT 1 -#endif -#if _ARCH_PWR5X -#define LJ_ARCH_ROUND 1 -#endif -#if __PPU__ -#define LJ_ARCH_CELL 1 -#endif -#if LJ_TARGET_XBOX360 -#define LJ_ARCH_XENON 1 -#endif - -#elif LUAJIT_TARGET == LUAJIT_ARCH_PPCSPE - -#define LJ_ARCH_NAME "ppcspe" -#define LJ_ARCH_BITS 32 -#define LJ_ARCH_ENDIAN LUAJIT_BE -#ifndef LJ_ABI_SOFTFP -#define LJ_ABI_SOFTFP 1 -#endif -#define LJ_ABI_EABI 1 -#define LJ_TARGET_PPCSPE 1 -#define LJ_TARGET_EHRETREG 3 -#define LJ_TARGET_JUMPRANGE 25 /* +-2^25 = +-32MB */ -#define LJ_TARGET_MASKSHIFT 0 -#define LJ_TARGET_MASKROT 1 -#define LJ_TARGET_UNIFYROT 1 /* Want only IR_BROL. */ -#define LJ_ARCH_NUMMODE LJ_NUMMODE_SINGLE -#define LJ_ARCH_NOFFI 1 /* NYI: comparisons, calls. */ -#define LJ_ARCH_NOJIT 1 - -#elif LUAJIT_TARGET == LUAJIT_ARCH_MIPS - -#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) -#define LJ_ARCH_NAME "mipsel" -#define LJ_ARCH_ENDIAN LUAJIT_LE -#else -#define LJ_ARCH_NAME "mips" -#define LJ_ARCH_ENDIAN LUAJIT_BE -#endif -#define LJ_ARCH_BITS 32 -#define LJ_TARGET_MIPS 1 -#define LJ_TARGET_EHRETREG 4 -#define LJ_TARGET_JUMPRANGE 27 /* 2*2^27 = 256MB-aligned region */ -#define LJ_TARGET_MASKSHIFT 1 -#define LJ_TARGET_MASKROT 1 -#define LJ_TARGET_UNIFYROT 2 /* Want only IR_BROR. */ -#define LJ_ARCH_NUMMODE LJ_NUMMODE_SINGLE - -#if _MIPS_ARCH_MIPS32R2 -#define LJ_ARCH_VERSION 20 -#else -#define LJ_ARCH_VERSION 10 -#endif - -#else -#error "No target architecture defined" -#endif - -#ifndef LJ_PAGESIZE -#define LJ_PAGESIZE 4096 -#endif - -/* Check for minimum required compiler versions. */ -#if defined(__GNUC__) -#if LJ_TARGET_X86 -#if (__GNUC__ < 3) || ((__GNUC__ == 3) && __GNUC_MINOR__ < 4) -#error "Need at least GCC 3.4 or newer" -#endif -#elif LJ_TARGET_X64 -#if __GNUC__ < 4 -#error "Need at least GCC 4.0 or newer" -#endif -#elif LJ_TARGET_ARM -#if (__GNUC__ < 4) || ((__GNUC__ == 4) && __GNUC_MINOR__ < 2) -#error "Need at least GCC 4.2 or newer" -#endif -#elif !LJ_TARGET_PS3 -#if (__GNUC__ < 4) || ((__GNUC__ == 4) && __GNUC_MINOR__ < 3) -#error "Need at least GCC 4.3 or newer" -#endif -#endif -#endif - -/* Check target-specific constraints. */ -#ifndef _BUILDVM_H -#if LJ_TARGET_X64 -#if __USING_SJLJ_EXCEPTIONS__ -#error "Need a C compiler with native exception handling on x64" -#endif -#elif LJ_TARGET_ARM -#if defined(__ARMEB__) -#error "No support for big-endian ARM" -#endif -#if __ARM_ARCH_6M__ || __ARM_ARCH_7M__ || __ARM_ARCH_7EM__ -#error "No support for Cortex-M CPUs" -#endif -#if !(__ARM_EABI__ || LJ_TARGET_IOS) -#error "Only ARM EABI or iOS 3.0+ ABI is supported" -#endif -#elif LJ_TARGET_PPC || LJ_TARGET_PPCSPE -#if defined(_SOFT_FLOAT) || defined(_SOFT_DOUBLE) -#error "No support for PowerPC CPUs without double-precision FPU" -#endif -#if defined(_LITTLE_ENDIAN) -#error "No support for little-endian PowerPC" -#endif -#if defined(_LP64) -#error "No support for PowerPC 64 bit mode" -#endif -#elif LJ_TARGET_MIPS -#if defined(__mips_soft_float) -#error "No support for MIPS CPUs without FPU" -#endif -#if defined(_LP64) -#error "No support for MIPS64" -#endif -#endif -#endif - -/* Enable or disable the dual-number mode for the VM. */ -#if (LJ_ARCH_NUMMODE == LJ_NUMMODE_SINGLE && LUAJIT_NUMMODE == 2) || \ - (LJ_ARCH_NUMMODE == LJ_NUMMODE_DUAL && LUAJIT_NUMMODE == 1) -#error "No support for this number mode on this architecture" -#endif -#if LJ_ARCH_NUMMODE == LJ_NUMMODE_DUAL || \ - (LJ_ARCH_NUMMODE == LJ_NUMMODE_DUAL_SINGLE && LUAJIT_NUMMODE != 1) || \ - (LJ_ARCH_NUMMODE == LJ_NUMMODE_SINGLE_DUAL && LUAJIT_NUMMODE == 2) -#define LJ_DUALNUM 1 -#else -#define LJ_DUALNUM 0 -#endif - -#if LJ_TARGET_IOS || LJ_TARGET_CONSOLE -/* Runtime code generation is restricted on iOS. Complain to Apple, not me. */ -/* Ditto for the consoles. Complain to Sony or MS, not me. */ -#ifndef LUAJIT_ENABLE_JIT -#define LJ_OS_NOJIT 1 -#endif -#endif - -/* Disable or enable the JIT compiler. */ -#if defined(LUAJIT_DISABLE_JIT) || defined(LJ_ARCH_NOJIT) || defined(LJ_OS_NOJIT) -#define LJ_HASJIT 0 -#else -#define LJ_HASJIT 1 -#endif - -/* Disable or enable the FFI extension. */ -#if defined(LUAJIT_DISABLE_FFI) || defined(LJ_ARCH_NOFFI) -#define LJ_HASFFI 0 -#else -#define LJ_HASFFI 1 -#endif - -#ifndef LJ_ARCH_HASFPU -#define LJ_ARCH_HASFPU 1 -#endif -#ifndef LJ_ABI_SOFTFP -#define LJ_ABI_SOFTFP 0 -#endif -#define LJ_SOFTFP (!LJ_ARCH_HASFPU) - -#if LJ_ARCH_ENDIAN == LUAJIT_BE -#define LJ_LE 0 -#define LJ_BE 1 -#define LJ_ENDIAN_SELECT(le, be) be -#define LJ_ENDIAN_LOHI(lo, hi) hi lo -#else -#define LJ_LE 1 -#define LJ_BE 0 -#define LJ_ENDIAN_SELECT(le, be) le -#define LJ_ENDIAN_LOHI(lo, hi) lo hi -#endif - -#if LJ_ARCH_BITS == 32 -#define LJ_32 1 -#define LJ_64 0 -#else -#define LJ_32 0 -#define LJ_64 1 -#endif - -#ifndef LJ_TARGET_UNALIGNED -#define LJ_TARGET_UNALIGNED 0 -#endif - -/* Various workarounds for embedded operating systems. */ -#if (defined(__ANDROID__) && !defined(LJ_TARGET_X86ORX64)) || defined(__symbian__) || LJ_TARGET_XBOX360 -#define LUAJIT_NO_LOG2 -#endif -#if defined(__symbian__) -#define LUAJIT_NO_EXP2 -#endif - -#if defined(LUAJIT_NO_UNWIND) || defined(__symbian__) || LJ_TARGET_IOS || LJ_TARGET_PS3 -#define LJ_NO_UNWIND 1 -#endif - -/* Compatibility with Lua 5.1 vs. 5.2. */ -#ifdef LUAJIT_ENABLE_LUA52COMPAT -#define LJ_52 1 -#else -#define LJ_52 0 -#endif - -#endif diff --git a/deps/luajit/src/lj_asm.c b/deps/luajit/src/lj_asm.c deleted file mode 100644 index 804b4dc8..00000000 --- a/deps/luajit/src/lj_asm.c +++ /dev/null @@ -1,1920 +0,0 @@ -/* -** IR assembler (SSA IR -> machine code). -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#define lj_asm_c -#define LUA_CORE - -#include "lj_obj.h" - -#if LJ_HASJIT - -#include "lj_gc.h" -#include "lj_str.h" -#include "lj_tab.h" -#include "lj_frame.h" -#if LJ_HASFFI -#include "lj_ctype.h" -#endif -#include "lj_ir.h" -#include "lj_jit.h" -#include "lj_ircall.h" -#include "lj_iropt.h" -#include "lj_mcode.h" -#include "lj_iropt.h" -#include "lj_trace.h" -#include "lj_snap.h" -#include "lj_asm.h" -#include "lj_dispatch.h" -#include "lj_vm.h" -#include "lj_target.h" - -#ifdef LUA_USE_ASSERT -#include -#endif - -/* -- Assembler state and common macros ----------------------------------- */ - -/* Assembler state. */ -typedef struct ASMState { - RegCost cost[RID_MAX]; /* Reference and blended allocation cost for regs. */ - - MCode *mcp; /* Current MCode pointer (grows down). */ - MCode *mclim; /* Lower limit for MCode memory + red zone. */ -#ifdef LUA_USE_ASSERT - MCode *mcp_prev; /* Red zone overflow check. */ -#endif - - IRIns *ir; /* Copy of pointer to IR instructions/constants. */ - jit_State *J; /* JIT compiler state. */ - -#if LJ_TARGET_X86ORX64 - x86ModRM mrm; /* Fused x86 address operand. */ -#endif - - RegSet freeset; /* Set of free registers. */ - RegSet modset; /* Set of registers modified inside the loop. */ - RegSet weakset; /* Set of weakly referenced registers. */ - RegSet phiset; /* Set of PHI registers. */ - - uint32_t flags; /* Copy of JIT compiler flags. */ - int loopinv; /* Loop branch inversion (0:no, 1:yes, 2:yes+CC_P). */ - - int32_t evenspill; /* Next even spill slot. */ - int32_t oddspill; /* Next odd spill slot (or 0). */ - - IRRef curins; /* Reference of current instruction. */ - IRRef stopins; /* Stop assembly before hitting this instruction. */ - IRRef orignins; /* Original T->nins. */ - - IRRef snapref; /* Current snapshot is active after this reference. */ - IRRef snaprename; /* Rename highwater mark for snapshot check. */ - SnapNo snapno; /* Current snapshot number. */ - SnapNo loopsnapno; /* Loop snapshot number. */ - - IRRef fuseref; /* Fusion limit (loopref, 0 or FUSE_DISABLED). */ - IRRef sectref; /* Section base reference (loopref or 0). */ - IRRef loopref; /* Reference of LOOP instruction (or 0). */ - - BCReg topslot; /* Number of slots for stack check (unless 0). */ - int32_t gcsteps; /* Accumulated number of GC steps (per section). */ - - GCtrace *T; /* Trace to assemble. */ - GCtrace *parent; /* Parent trace (or NULL). */ - - MCode *mcbot; /* Bottom of reserved MCode. */ - MCode *mctop; /* Top of generated MCode. */ - MCode *mcloop; /* Pointer to loop MCode (or NULL). */ - MCode *invmcp; /* Points to invertible loop branch (or NULL). */ - MCode *flagmcp; /* Pending opportunity to merge flag setting ins. */ - MCode *realign; /* Realign loop if not NULL. */ - -#ifdef RID_NUM_KREF - int32_t krefk[RID_NUM_KREF]; -#endif - IRRef1 phireg[RID_MAX]; /* PHI register references. */ - uint16_t parentmap[LJ_MAX_JSLOTS]; /* Parent instruction to RegSP map. */ -} ASMState; - -#define IR(ref) (&as->ir[(ref)]) - -#define ASMREF_TMP1 REF_TRUE /* Temp. register. */ -#define ASMREF_TMP2 REF_FALSE /* Temp. register. */ -#define ASMREF_L REF_NIL /* Stores register for L. */ - -/* Check for variant to invariant references. */ -#define iscrossref(as, ref) ((ref) < as->sectref) - -/* Inhibit memory op fusion from variant to invariant references. */ -#define FUSE_DISABLED (~(IRRef)0) -#define mayfuse(as, ref) ((ref) > as->fuseref) -#define neverfuse(as) (as->fuseref == FUSE_DISABLED) -#define canfuse(as, ir) (!neverfuse(as) && !irt_isphi((ir)->t)) -#define opisfusableload(o) \ - ((o) == IR_ALOAD || (o) == IR_HLOAD || (o) == IR_ULOAD || \ - (o) == IR_FLOAD || (o) == IR_XLOAD || (o) == IR_SLOAD || (o) == IR_VLOAD) - -/* Sparse limit checks using a red zone before the actual limit. */ -#define MCLIM_REDZONE 64 - -static LJ_NORET LJ_NOINLINE void asm_mclimit(ASMState *as) -{ - lj_mcode_limiterr(as->J, (size_t)(as->mctop - as->mcp + 4*MCLIM_REDZONE)); -} - -static LJ_AINLINE void checkmclim(ASMState *as) -{ -#ifdef LUA_USE_ASSERT - if (as->mcp + MCLIM_REDZONE < as->mcp_prev) { - IRIns *ir = IR(as->curins+1); - fprintf(stderr, "RED ZONE OVERFLOW: %p IR %04d %02d %04d %04d\n", as->mcp, - as->curins+1-REF_BIAS, ir->o, ir->op1-REF_BIAS, ir->op2-REF_BIAS); - lua_assert(0); - } -#endif - if (LJ_UNLIKELY(as->mcp < as->mclim)) asm_mclimit(as); -#ifdef LUA_USE_ASSERT - as->mcp_prev = as->mcp; -#endif -} - -#ifdef RID_NUM_KREF -#define ra_iskref(ref) ((ref) < RID_NUM_KREF) -#define ra_krefreg(ref) ((Reg)(RID_MIN_KREF + (Reg)(ref))) -#define ra_krefk(as, ref) (as->krefk[(ref)]) - -static LJ_AINLINE void ra_setkref(ASMState *as, Reg r, int32_t k) -{ - IRRef ref = (IRRef)(r - RID_MIN_KREF); - as->krefk[ref] = k; - as->cost[r] = REGCOST(ref, ref); -} - -#else -#define ra_iskref(ref) 0 -#define ra_krefreg(ref) RID_MIN_GPR -#define ra_krefk(as, ref) 0 -#endif - -/* Arch-specific field offsets. */ -static const uint8_t field_ofs[IRFL__MAX+1] = { -#define FLOFS(name, ofs) (uint8_t)(ofs), -IRFLDEF(FLOFS) -#undef FLOFS - 0 -}; - -/* -- Target-specific instruction emitter --------------------------------- */ - -#if LJ_TARGET_X86ORX64 -#include "lj_emit_x86.h" -#elif LJ_TARGET_ARM -#include "lj_emit_arm.h" -#elif LJ_TARGET_PPC -#include "lj_emit_ppc.h" -#elif LJ_TARGET_MIPS -#include "lj_emit_mips.h" -#else -#error "Missing instruction emitter for target CPU" -#endif - -/* -- Register allocator debugging ---------------------------------------- */ - -/* #define LUAJIT_DEBUG_RA */ - -#ifdef LUAJIT_DEBUG_RA - -#include -#include - -#define RIDNAME(name) #name, -static const char *const ra_regname[] = { - GPRDEF(RIDNAME) - FPRDEF(RIDNAME) - VRIDDEF(RIDNAME) - NULL -}; -#undef RIDNAME - -static char ra_dbg_buf[65536]; -static char *ra_dbg_p; -static char *ra_dbg_merge; -static MCode *ra_dbg_mcp; - -static void ra_dstart(void) -{ - ra_dbg_p = ra_dbg_buf; - ra_dbg_merge = NULL; - ra_dbg_mcp = NULL; -} - -static void ra_dflush(void) -{ - fwrite(ra_dbg_buf, 1, (size_t)(ra_dbg_p-ra_dbg_buf), stdout); - ra_dstart(); -} - -static void ra_dprintf(ASMState *as, const char *fmt, ...) -{ - char *p; - va_list argp; - va_start(argp, fmt); - p = ra_dbg_mcp == as->mcp ? ra_dbg_merge : ra_dbg_p; - ra_dbg_mcp = NULL; - p += sprintf(p, "%08x \e[36m%04d ", (uintptr_t)as->mcp, as->curins-REF_BIAS); - for (;;) { - const char *e = strchr(fmt, '$'); - if (e == NULL) break; - memcpy(p, fmt, (size_t)(e-fmt)); - p += e-fmt; - if (e[1] == 'r') { - Reg r = va_arg(argp, Reg) & RID_MASK; - if (r <= RID_MAX) { - const char *q; - for (q = ra_regname[r]; *q; q++) - *p++ = *q >= 'A' && *q <= 'Z' ? *q + 0x20 : *q; - } else { - *p++ = '?'; - lua_assert(0); - } - } else if (e[1] == 'f' || e[1] == 'i') { - IRRef ref; - if (e[1] == 'f') - ref = va_arg(argp, IRRef); - else - ref = va_arg(argp, IRIns *) - as->ir; - if (ref >= REF_BIAS) - p += sprintf(p, "%04d", ref - REF_BIAS); - else - p += sprintf(p, "K%03d", REF_BIAS - ref); - } else if (e[1] == 's') { - uint32_t slot = va_arg(argp, uint32_t); - p += sprintf(p, "[sp+0x%x]", sps_scale(slot)); - } else if (e[1] == 'x') { - p += sprintf(p, "%08x", va_arg(argp, int32_t)); - } else { - lua_assert(0); - } - fmt = e+2; - } - va_end(argp); - while (*fmt) - *p++ = *fmt++; - *p++ = '\e'; *p++ = '['; *p++ = 'm'; *p++ = '\n'; - if (p > ra_dbg_buf+sizeof(ra_dbg_buf)-256) { - fwrite(ra_dbg_buf, 1, (size_t)(p-ra_dbg_buf), stdout); - p = ra_dbg_buf; - } - ra_dbg_p = p; -} - -#define RA_DBG_START() ra_dstart() -#define RA_DBG_FLUSH() ra_dflush() -#define RA_DBG_REF() \ - do { char *_p = ra_dbg_p; ra_dprintf(as, ""); \ - ra_dbg_merge = _p; ra_dbg_mcp = as->mcp; } while (0) -#define RA_DBGX(x) ra_dprintf x - -#else -#define RA_DBG_START() ((void)0) -#define RA_DBG_FLUSH() ((void)0) -#define RA_DBG_REF() ((void)0) -#define RA_DBGX(x) ((void)0) -#endif - -/* -- Register allocator -------------------------------------------------- */ - -#define ra_free(as, r) rset_set(as->freeset, (r)) -#define ra_modified(as, r) rset_set(as->modset, (r)) -#define ra_weak(as, r) rset_set(as->weakset, (r)) -#define ra_noweak(as, r) rset_clear(as->weakset, (r)) - -#define ra_used(ir) (ra_hasreg((ir)->r) || ra_hasspill((ir)->s)) - -/* Setup register allocator. */ -static void ra_setup(ASMState *as) -{ - Reg r; - /* Initially all regs (except the stack pointer) are free for use. */ - as->freeset = RSET_INIT; - as->modset = RSET_EMPTY; - as->weakset = RSET_EMPTY; - as->phiset = RSET_EMPTY; - memset(as->phireg, 0, sizeof(as->phireg)); - for (r = RID_MIN_GPR; r < RID_MAX; r++) - as->cost[r] = REGCOST(~0u, 0u); -} - -/* Rematerialize constants. */ -static Reg ra_rematk(ASMState *as, IRRef ref) -{ - IRIns *ir; - Reg r; - if (ra_iskref(ref)) { - r = ra_krefreg(ref); - lua_assert(!rset_test(as->freeset, r)); - ra_free(as, r); - ra_modified(as, r); - emit_loadi(as, r, ra_krefk(as, ref)); - return r; - } - ir = IR(ref); - r = ir->r; - lua_assert(ra_hasreg(r) && !ra_hasspill(ir->s)); - ra_free(as, r); - ra_modified(as, r); - ir->r = RID_INIT; /* Do not keep any hint. */ - RA_DBGX((as, "remat $i $r", ir, r)); -#if !LJ_SOFTFP - if (ir->o == IR_KNUM) { - emit_loadn(as, r, ir_knum(ir)); - } else -#endif - if (emit_canremat(REF_BASE) && ir->o == IR_BASE) { - ra_sethint(ir->r, RID_BASE); /* Restore BASE register hint. */ - emit_getgl(as, r, jit_base); - } else if (emit_canremat(ASMREF_L) && ir->o == IR_KPRI) { - lua_assert(irt_isnil(ir->t)); /* REF_NIL stores ASMREF_L register. */ - emit_getgl(as, r, jit_L); -#if LJ_64 - } else if (ir->o == IR_KINT64) { - emit_loadu64(as, r, ir_kint64(ir)->u64); -#endif - } else { - lua_assert(ir->o == IR_KINT || ir->o == IR_KGC || - ir->o == IR_KPTR || ir->o == IR_KKPTR || ir->o == IR_KNULL); - emit_loadi(as, r, ir->i); - } - return r; -} - -/* Force a spill. Allocate a new spill slot if needed. */ -static int32_t ra_spill(ASMState *as, IRIns *ir) -{ - int32_t slot = ir->s; - lua_assert(ir >= as->ir + REF_TRUE); - if (!ra_hasspill(slot)) { - if (irt_is64(ir->t)) { - slot = as->evenspill; - as->evenspill += 2; - } else if (as->oddspill) { - slot = as->oddspill; - as->oddspill = 0; - } else { - slot = as->evenspill; - as->oddspill = slot+1; - as->evenspill += 2; - } - if (as->evenspill > 256) - lj_trace_err(as->J, LJ_TRERR_SPILLOV); - ir->s = (uint8_t)slot; - } - return sps_scale(slot); -} - -/* Release the temporarily allocated register in ASMREF_TMP1/ASMREF_TMP2. */ -static Reg ra_releasetmp(ASMState *as, IRRef ref) -{ - IRIns *ir = IR(ref); - Reg r = ir->r; - lua_assert(ra_hasreg(r) && !ra_hasspill(ir->s)); - ra_free(as, r); - ra_modified(as, r); - ir->r = RID_INIT; - return r; -} - -/* Restore a register (marked as free). Rematerialize or force a spill. */ -static Reg ra_restore(ASMState *as, IRRef ref) -{ - if (emit_canremat(ref)) { - return ra_rematk(as, ref); - } else { - IRIns *ir = IR(ref); - int32_t ofs = ra_spill(as, ir); /* Force a spill slot. */ - Reg r = ir->r; - lua_assert(ra_hasreg(r)); - ra_sethint(ir->r, r); /* Keep hint. */ - ra_free(as, r); - if (!rset_test(as->weakset, r)) { /* Only restore non-weak references. */ - ra_modified(as, r); - RA_DBGX((as, "restore $i $r", ir, r)); - emit_spload(as, ir, r, ofs); - } - return r; - } -} - -/* Save a register to a spill slot. */ -static void ra_save(ASMState *as, IRIns *ir, Reg r) -{ - RA_DBGX((as, "save $i $r", ir, r)); - emit_spstore(as, ir, r, sps_scale(ir->s)); -} - -#define MINCOST(name) \ - if (rset_test(RSET_ALL, RID_##name) && \ - LJ_LIKELY(allow&RID2RSET(RID_##name)) && as->cost[RID_##name] < cost) \ - cost = as->cost[RID_##name]; - -/* Evict the register with the lowest cost, forcing a restore. */ -static Reg ra_evict(ASMState *as, RegSet allow) -{ - IRRef ref; - RegCost cost = ~(RegCost)0; - lua_assert(allow != RSET_EMPTY); - if (RID_NUM_FPR == 0 || allow < RID2RSET(RID_MAX_GPR)) { - GPRDEF(MINCOST) - } else { - FPRDEF(MINCOST) - } - ref = regcost_ref(cost); - lua_assert(ra_iskref(ref) || (ref >= as->T->nk && ref < as->T->nins)); - /* Preferably pick any weak ref instead of a non-weak, non-const ref. */ - if (!irref_isk(ref) && (as->weakset & allow)) { - IRIns *ir = IR(ref); - if (!rset_test(as->weakset, ir->r)) - ref = regcost_ref(as->cost[rset_pickbot((as->weakset & allow))]); - } - return ra_restore(as, ref); -} - -/* Pick any register (marked as free). Evict on-demand. */ -static Reg ra_pick(ASMState *as, RegSet allow) -{ - RegSet pick = as->freeset & allow; - if (!pick) - return ra_evict(as, allow); - else - return rset_picktop(pick); -} - -/* Get a scratch register (marked as free). */ -static Reg ra_scratch(ASMState *as, RegSet allow) -{ - Reg r = ra_pick(as, allow); - ra_modified(as, r); - RA_DBGX((as, "scratch $r", r)); - return r; -} - -/* Evict all registers from a set (if not free). */ -static void ra_evictset(ASMState *as, RegSet drop) -{ - RegSet work; - as->modset |= drop; -#if !LJ_SOFTFP - work = (drop & ~as->freeset) & RSET_FPR; - while (work) { - Reg r = rset_pickbot(work); - ra_restore(as, regcost_ref(as->cost[r])); - rset_clear(work, r); - checkmclim(as); - } -#endif - work = (drop & ~as->freeset); - while (work) { - Reg r = rset_pickbot(work); - ra_restore(as, regcost_ref(as->cost[r])); - rset_clear(work, r); - checkmclim(as); - } -} - -/* Evict (rematerialize) all registers allocated to constants. */ -static void ra_evictk(ASMState *as) -{ - RegSet work; -#if !LJ_SOFTFP - work = ~as->freeset & RSET_FPR; - while (work) { - Reg r = rset_pickbot(work); - IRRef ref = regcost_ref(as->cost[r]); - if (emit_canremat(ref) && irref_isk(ref)) { - ra_rematk(as, ref); - checkmclim(as); - } - rset_clear(work, r); - } -#endif - work = ~as->freeset & RSET_GPR; - while (work) { - Reg r = rset_pickbot(work); - IRRef ref = regcost_ref(as->cost[r]); - if (emit_canremat(ref) && irref_isk(ref)) { - ra_rematk(as, ref); - checkmclim(as); - } - rset_clear(work, r); - } -} - -#ifdef RID_NUM_KREF -/* Allocate a register for a constant. */ -static Reg ra_allock(ASMState *as, int32_t k, RegSet allow) -{ - /* First try to find a register which already holds the same constant. */ - RegSet pick, work = ~as->freeset & RSET_GPR; - Reg r; - while (work) { - IRRef ref; - r = rset_pickbot(work); - ref = regcost_ref(as->cost[r]); - if (ref < ASMREF_L && - k == (ra_iskref(ref) ? ra_krefk(as, ref) : IR(ref)->i)) - return r; - rset_clear(work, r); - } - pick = as->freeset & allow; - if (pick) { - /* Constants should preferably get unmodified registers. */ - if ((pick & ~as->modset)) - pick &= ~as->modset; - r = rset_pickbot(pick); /* Reduce conflicts with inverse allocation. */ - } else { - r = ra_evict(as, allow); - } - RA_DBGX((as, "allock $x $r", k, r)); - ra_setkref(as, r, k); - rset_clear(as->freeset, r); - ra_noweak(as, r); - return r; -} - -/* Allocate a specific register for a constant. */ -static void ra_allockreg(ASMState *as, int32_t k, Reg r) -{ - Reg kr = ra_allock(as, k, RID2RSET(r)); - if (kr != r) { - IRIns irdummy; - irdummy.t.irt = IRT_INT; - ra_scratch(as, RID2RSET(r)); - emit_movrr(as, &irdummy, r, kr); - } -} -#else -#define ra_allockreg(as, k, r) emit_loadi(as, (r), (k)) -#endif - -/* Allocate a register for ref from the allowed set of registers. -** Note: this function assumes the ref does NOT have a register yet! -** Picks an optimal register, sets the cost and marks the register as non-free. -*/ -static Reg ra_allocref(ASMState *as, IRRef ref, RegSet allow) -{ - IRIns *ir = IR(ref); - RegSet pick = as->freeset & allow; - Reg r; - lua_assert(ra_noreg(ir->r)); - if (pick) { - /* First check register hint from propagation or PHI. */ - if (ra_hashint(ir->r)) { - r = ra_gethint(ir->r); - if (rset_test(pick, r)) /* Use hint register if possible. */ - goto found; - /* Rematerialization is cheaper than missing a hint. */ - if (rset_test(allow, r) && emit_canremat(regcost_ref(as->cost[r]))) { - ra_rematk(as, regcost_ref(as->cost[r])); - goto found; - } - RA_DBGX((as, "hintmiss $f $r", ref, r)); - } - /* Invariants should preferably get unmodified registers. */ - if (ref < as->loopref && !irt_isphi(ir->t)) { - if ((pick & ~as->modset)) - pick &= ~as->modset; - r = rset_pickbot(pick); /* Reduce conflicts with inverse allocation. */ - } else { - /* We've got plenty of regs, so get callee-save regs if possible. */ - if (RID_NUM_GPR > 8 && (pick & ~RSET_SCRATCH)) - pick &= ~RSET_SCRATCH; - r = rset_picktop(pick); - } - } else { - r = ra_evict(as, allow); - } -found: - RA_DBGX((as, "alloc $f $r", ref, r)); - ir->r = (uint8_t)r; - rset_clear(as->freeset, r); - ra_noweak(as, r); - as->cost[r] = REGCOST_REF_T(ref, irt_t(ir->t)); - return r; -} - -/* Allocate a register on-demand. */ -static Reg ra_alloc1(ASMState *as, IRRef ref, RegSet allow) -{ - Reg r = IR(ref)->r; - /* Note: allow is ignored if the register is already allocated. */ - if (ra_noreg(r)) r = ra_allocref(as, ref, allow); - ra_noweak(as, r); - return r; -} - -/* Rename register allocation and emit move. */ -static void ra_rename(ASMState *as, Reg down, Reg up) -{ - IRRef ren, ref = regcost_ref(as->cost[up] = as->cost[down]); - IRIns *ir = IR(ref); - ir->r = (uint8_t)up; - as->cost[down] = 0; - lua_assert((down < RID_MAX_GPR) == (up < RID_MAX_GPR)); - lua_assert(!rset_test(as->freeset, down) && rset_test(as->freeset, up)); - ra_free(as, down); /* 'down' is free ... */ - ra_modified(as, down); - rset_clear(as->freeset, up); /* ... and 'up' is now allocated. */ - ra_noweak(as, up); - RA_DBGX((as, "rename $f $r $r", regcost_ref(as->cost[up]), down, up)); - emit_movrr(as, ir, down, up); /* Backwards codegen needs inverse move. */ - if (!ra_hasspill(IR(ref)->s)) { /* Add the rename to the IR. */ - lj_ir_set(as->J, IRT(IR_RENAME, IRT_NIL), ref, as->snapno); - ren = tref_ref(lj_ir_emit(as->J)); - as->ir = as->T->ir; /* The IR may have been reallocated. */ - IR(ren)->r = (uint8_t)down; - IR(ren)->s = SPS_NONE; - } -} - -/* Pick a destination register (marked as free). -** Caveat: allow is ignored if there's already a destination register. -** Use ra_destreg() to get a specific register. -*/ -static Reg ra_dest(ASMState *as, IRIns *ir, RegSet allow) -{ - Reg dest = ir->r; - if (ra_hasreg(dest)) { - ra_free(as, dest); - ra_modified(as, dest); - } else { - if (ra_hashint(dest) && rset_test((as->freeset&allow), ra_gethint(dest))) { - dest = ra_gethint(dest); - ra_modified(as, dest); - RA_DBGX((as, "dest $r", dest)); - } else { - dest = ra_scratch(as, allow); - } - ir->r = dest; - } - if (LJ_UNLIKELY(ra_hasspill(ir->s))) ra_save(as, ir, dest); - return dest; -} - -/* Force a specific destination register (marked as free). */ -static void ra_destreg(ASMState *as, IRIns *ir, Reg r) -{ - Reg dest = ra_dest(as, ir, RID2RSET(r)); - if (dest != r) { - lua_assert(rset_test(as->freeset, r)); - ra_modified(as, r); - emit_movrr(as, ir, dest, r); - } -} - -#if LJ_TARGET_X86ORX64 -/* Propagate dest register to left reference. Emit moves as needed. -** This is a required fixup step for all 2-operand machine instructions. -*/ -static void ra_left(ASMState *as, Reg dest, IRRef lref) -{ - IRIns *ir = IR(lref); - Reg left = ir->r; - if (ra_noreg(left)) { - if (irref_isk(lref)) { - if (ir->o == IR_KNUM) { - cTValue *tv = ir_knum(ir); - /* FP remat needs a load except for +0. Still better than eviction. */ - if (tvispzero(tv) || !(as->freeset & RSET_FPR)) { - emit_loadn(as, dest, tv); - return; - } -#if LJ_64 - } else if (ir->o == IR_KINT64) { - emit_loadu64(as, dest, ir_kint64(ir)->u64); - return; -#endif - } else { - lua_assert(ir->o == IR_KINT || ir->o == IR_KGC || - ir->o == IR_KPTR || ir->o == IR_KKPTR || ir->o == IR_KNULL); - emit_loadi(as, dest, ir->i); - return; - } - } - if (!ra_hashint(left) && !iscrossref(as, lref)) - ra_sethint(ir->r, dest); /* Propagate register hint. */ - left = ra_allocref(as, lref, dest < RID_MAX_GPR ? RSET_GPR : RSET_FPR); - } - ra_noweak(as, left); - /* Move needed for true 3-operand instruction: y=a+b ==> y=a; y+=b. */ - if (dest != left) { - /* Use register renaming if dest is the PHI reg. */ - if (irt_isphi(ir->t) && as->phireg[dest] == lref) { - ra_modified(as, left); - ra_rename(as, left, dest); - } else { - emit_movrr(as, ir, dest, left); - } - } -} -#else -/* Similar to ra_left, except we override any hints. */ -static void ra_leftov(ASMState *as, Reg dest, IRRef lref) -{ - IRIns *ir = IR(lref); - Reg left = ir->r; - if (ra_noreg(left)) { - ra_sethint(ir->r, dest); /* Propagate register hint. */ - left = ra_allocref(as, lref, - (LJ_SOFTFP || dest < RID_MAX_GPR) ? RSET_GPR : RSET_FPR); - } - ra_noweak(as, left); - if (dest != left) { - /* Use register renaming if dest is the PHI reg. */ - if (irt_isphi(ir->t) && as->phireg[dest] == lref) { - ra_modified(as, left); - ra_rename(as, left, dest); - } else { - emit_movrr(as, ir, dest, left); - } - } -} -#endif - -#if !LJ_64 -/* Force a RID_RETLO/RID_RETHI destination register pair (marked as free). */ -static void ra_destpair(ASMState *as, IRIns *ir) -{ - Reg destlo = ir->r, desthi = (ir+1)->r; - /* First spill unrelated refs blocking the destination registers. */ - if (!rset_test(as->freeset, RID_RETLO) && - destlo != RID_RETLO && desthi != RID_RETLO) - ra_restore(as, regcost_ref(as->cost[RID_RETLO])); - if (!rset_test(as->freeset, RID_RETHI) && - destlo != RID_RETHI && desthi != RID_RETHI) - ra_restore(as, regcost_ref(as->cost[RID_RETHI])); - /* Next free the destination registers (if any). */ - if (ra_hasreg(destlo)) { - ra_free(as, destlo); - ra_modified(as, destlo); - } else { - destlo = RID_RETLO; - } - if (ra_hasreg(desthi)) { - ra_free(as, desthi); - ra_modified(as, desthi); - } else { - desthi = RID_RETHI; - } - /* Check for conflicts and shuffle the registers as needed. */ - if (destlo == RID_RETHI) { - if (desthi == RID_RETLO) { -#if LJ_TARGET_X86 - *--as->mcp = XI_XCHGa + RID_RETHI; -#else - emit_movrr(as, ir, RID_RETHI, RID_TMP); - emit_movrr(as, ir, RID_RETLO, RID_RETHI); - emit_movrr(as, ir, RID_TMP, RID_RETLO); -#endif - } else { - emit_movrr(as, ir, RID_RETHI, RID_RETLO); - if (desthi != RID_RETHI) emit_movrr(as, ir, desthi, RID_RETHI); - } - } else if (desthi == RID_RETLO) { - emit_movrr(as, ir, RID_RETLO, RID_RETHI); - if (destlo != RID_RETLO) emit_movrr(as, ir, destlo, RID_RETLO); - } else { - if (desthi != RID_RETHI) emit_movrr(as, ir, desthi, RID_RETHI); - if (destlo != RID_RETLO) emit_movrr(as, ir, destlo, RID_RETLO); - } - /* Restore spill slots (if any). */ - if (ra_hasspill((ir+1)->s)) ra_save(as, ir+1, RID_RETHI); - if (ra_hasspill(ir->s)) ra_save(as, ir, RID_RETLO); -} -#endif - -/* -- Snapshot handling --------- ----------------------------------------- */ - -/* Can we rematerialize a KNUM instead of forcing a spill? */ -static int asm_snap_canremat(ASMState *as) -{ - Reg r; - for (r = RID_MIN_FPR; r < RID_MAX_FPR; r++) - if (irref_isk(regcost_ref(as->cost[r]))) - return 1; - return 0; -} - -/* Check whether a sunk store corresponds to an allocation. */ -static int asm_sunk_store(ASMState *as, IRIns *ira, IRIns *irs) -{ - if (irs->s == 255) { - if (irs->o == IR_ASTORE || irs->o == IR_HSTORE || - irs->o == IR_FSTORE || irs->o == IR_XSTORE) { - IRIns *irk = IR(irs->op1); - if (irk->o == IR_AREF || irk->o == IR_HREFK) - irk = IR(irk->op1); - return (IR(irk->op1) == ira); - } - return 0; - } else { - return (ira + irs->s == irs); /* Quick check. */ - } -} - -/* Allocate register or spill slot for a ref that escapes to a snapshot. */ -static void asm_snap_alloc1(ASMState *as, IRRef ref) -{ - IRIns *ir = IR(ref); - if (!irref_isk(ref) && (!(ra_used(ir) || ir->r == RID_SUNK))) { - if (ir->r == RID_SINK) { - ir->r = RID_SUNK; -#if LJ_HASFFI - if (ir->o == IR_CNEWI) { /* Allocate CNEWI value. */ - asm_snap_alloc1(as, ir->op2); - if (LJ_32 && (ir+1)->o == IR_HIOP) - asm_snap_alloc1(as, (ir+1)->op2); - } else -#endif - { /* Allocate stored values for TNEW, TDUP and CNEW. */ - IRIns *irs; - lua_assert(ir->o == IR_TNEW || ir->o == IR_TDUP || ir->o == IR_CNEW); - for (irs = IR(as->snapref-1); irs > ir; irs--) - if (irs->r == RID_SINK && asm_sunk_store(as, ir, irs)) { - lua_assert(irs->o == IR_ASTORE || irs->o == IR_HSTORE || - irs->o == IR_FSTORE || irs->o == IR_XSTORE); - asm_snap_alloc1(as, irs->op2); - if (LJ_32 && (irs+1)->o == IR_HIOP) - asm_snap_alloc1(as, (irs+1)->op2); - } - } - } else { - RegSet allow; - if (ir->o == IR_CONV && ir->op2 == IRCONV_NUM_INT) { - IRIns *irc; - for (irc = IR(as->curins); irc > ir; irc--) - if ((irc->op1 == ref || irc->op2 == ref) && - !(irc->r == RID_SINK || irc->r == RID_SUNK)) - goto nosink; /* Don't sink conversion if result is used. */ - asm_snap_alloc1(as, ir->op1); - return; - } - nosink: - allow = (!LJ_SOFTFP && irt_isfp(ir->t)) ? RSET_FPR : RSET_GPR; - if ((as->freeset & allow) || - (allow == RSET_FPR && asm_snap_canremat(as))) { - /* Get a weak register if we have a free one or can rematerialize. */ - Reg r = ra_allocref(as, ref, allow); /* Allocate a register. */ - if (!irt_isphi(ir->t)) - ra_weak(as, r); /* But mark it as weakly referenced. */ - checkmclim(as); - RA_DBGX((as, "snapreg $f $r", ref, ir->r)); - } else { - ra_spill(as, ir); /* Otherwise force a spill slot. */ - RA_DBGX((as, "snapspill $f $s", ref, ir->s)); - } - } - } -} - -/* Allocate refs escaping to a snapshot. */ -static void asm_snap_alloc(ASMState *as) -{ - SnapShot *snap = &as->T->snap[as->snapno]; - SnapEntry *map = &as->T->snapmap[snap->mapofs]; - MSize n, nent = snap->nent; - for (n = 0; n < nent; n++) { - SnapEntry sn = map[n]; - IRRef ref = snap_ref(sn); - if (!irref_isk(ref)) { - asm_snap_alloc1(as, ref); - if (LJ_SOFTFP && (sn & SNAP_SOFTFPNUM)) { - lua_assert(irt_type(IR(ref+1)->t) == IRT_SOFTFP); - asm_snap_alloc1(as, ref+1); - } - } - } -} - -/* All guards for a snapshot use the same exitno. This is currently the -** same as the snapshot number. Since the exact origin of the exit cannot -** be determined, all guards for the same snapshot must exit with the same -** RegSP mapping. -** A renamed ref which has been used in a prior guard for the same snapshot -** would cause an inconsistency. The easy way out is to force a spill slot. -*/ -static int asm_snap_checkrename(ASMState *as, IRRef ren) -{ - SnapShot *snap = &as->T->snap[as->snapno]; - SnapEntry *map = &as->T->snapmap[snap->mapofs]; - MSize n, nent = snap->nent; - for (n = 0; n < nent; n++) { - SnapEntry sn = map[n]; - IRRef ref = snap_ref(sn); - if (ref == ren || (LJ_SOFTFP && (sn & SNAP_SOFTFPNUM) && ++ref == ren)) { - IRIns *ir = IR(ref); - ra_spill(as, ir); /* Register renamed, so force a spill slot. */ - RA_DBGX((as, "snaprensp $f $s", ref, ir->s)); - return 1; /* Found. */ - } - } - return 0; /* Not found. */ -} - -/* Prepare snapshot for next guard instruction. */ -static void asm_snap_prep(ASMState *as) -{ - if (as->curins < as->snapref) { - do { - if (as->snapno == 0) return; /* Called by sunk stores before snap #0. */ - as->snapno--; - as->snapref = as->T->snap[as->snapno].ref; - } while (as->curins < as->snapref); - asm_snap_alloc(as); - as->snaprename = as->T->nins; - } else { - /* Process any renames above the highwater mark. */ - for (; as->snaprename < as->T->nins; as->snaprename++) { - IRIns *ir = IR(as->snaprename); - if (asm_snap_checkrename(as, ir->op1)) - ir->op2 = REF_BIAS-1; /* Kill rename. */ - } - } -} - -/* -- Miscellaneous helpers ----------------------------------------------- */ - -/* Collect arguments from CALL* and CARG instructions. */ -static void asm_collectargs(ASMState *as, IRIns *ir, - const CCallInfo *ci, IRRef *args) -{ - uint32_t n = CCI_NARGS(ci); - lua_assert(n <= CCI_NARGS_MAX*2); /* Account for split args. */ - if ((ci->flags & CCI_L)) { *args++ = ASMREF_L; n--; } - while (n-- > 1) { - ir = IR(ir->op1); - lua_assert(ir->o == IR_CARG); - args[n] = ir->op2 == REF_NIL ? 0 : ir->op2; - } - args[0] = ir->op1 == REF_NIL ? 0 : ir->op1; - lua_assert(IR(ir->op1)->o != IR_CARG); -} - -/* Reconstruct CCallInfo flags for CALLX*. */ -static uint32_t asm_callx_flags(ASMState *as, IRIns *ir) -{ - uint32_t nargs = 0; - if (ir->op1 != REF_NIL) { /* Count number of arguments first. */ - IRIns *ira = IR(ir->op1); - nargs++; - while (ira->o == IR_CARG) { nargs++; ira = IR(ira->op1); } - } -#if LJ_HASFFI - if (IR(ir->op2)->o == IR_CARG) { /* Copy calling convention info. */ - CTypeID id = (CTypeID)IR(IR(ir->op2)->op2)->i; - CType *ct = ctype_get(ctype_ctsG(J2G(as->J)), id); - nargs |= ((ct->info & CTF_VARARG) ? CCI_VARARG : 0); -#if LJ_TARGET_X86 - nargs |= (ctype_cconv(ct->info) << CCI_CC_SHIFT); -#endif - } -#endif - return (nargs | (ir->t.irt << CCI_OTSHIFT)); -} - -/* Calculate stack adjustment. */ -static int32_t asm_stack_adjust(ASMState *as) -{ - if (as->evenspill <= SPS_FIXED) - return 0; - return sps_scale(sps_align(as->evenspill)); -} - -/* Must match with hash*() in lj_tab.c. */ -static uint32_t ir_khash(IRIns *ir) -{ - uint32_t lo, hi; - if (irt_isstr(ir->t)) { - return ir_kstr(ir)->hash; - } else if (irt_isnum(ir->t)) { - lo = ir_knum(ir)->u32.lo; - hi = ir_knum(ir)->u32.hi << 1; - } else if (irt_ispri(ir->t)) { - lua_assert(!irt_isnil(ir->t)); - return irt_type(ir->t)-IRT_FALSE; - } else { - lua_assert(irt_isgcv(ir->t)); - lo = u32ptr(ir_kgc(ir)); - hi = lo + HASH_BIAS; - } - return hashrot(lo, hi); -} - -/* -- Allocations --------------------------------------------------------- */ - -static void asm_gencall(ASMState *as, const CCallInfo *ci, IRRef *args); -static void asm_setupresult(ASMState *as, IRIns *ir, const CCallInfo *ci); - -static void asm_snew(ASMState *as, IRIns *ir) -{ - const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_str_new]; - IRRef args[3]; - args[0] = ASMREF_L; /* lua_State *L */ - args[1] = ir->op1; /* const char *str */ - args[2] = ir->op2; /* size_t len */ - as->gcsteps++; - asm_setupresult(as, ir, ci); /* GCstr * */ - asm_gencall(as, ci, args); -} - -static void asm_tnew(ASMState *as, IRIns *ir) -{ - const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_tab_new1]; - IRRef args[2]; - args[0] = ASMREF_L; /* lua_State *L */ - args[1] = ASMREF_TMP1; /* uint32_t ahsize */ - as->gcsteps++; - asm_setupresult(as, ir, ci); /* GCtab * */ - asm_gencall(as, ci, args); - ra_allockreg(as, ir->op1 | (ir->op2 << 24), ra_releasetmp(as, ASMREF_TMP1)); -} - -static void asm_tdup(ASMState *as, IRIns *ir) -{ - const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_tab_dup]; - IRRef args[2]; - args[0] = ASMREF_L; /* lua_State *L */ - args[1] = ir->op1; /* const GCtab *kt */ - as->gcsteps++; - asm_setupresult(as, ir, ci); /* GCtab * */ - asm_gencall(as, ci, args); -} - -static void asm_gc_check(ASMState *as); - -/* Explicit GC step. */ -static void asm_gcstep(ASMState *as, IRIns *ir) -{ - IRIns *ira; - for (ira = IR(as->stopins+1); ira < ir; ira++) - if ((ira->o == IR_TNEW || ira->o == IR_TDUP || - (LJ_HASFFI && (ira->o == IR_CNEW || ira->o == IR_CNEWI))) && - ra_used(ira)) - as->gcsteps++; - if (as->gcsteps) - asm_gc_check(as); - as->gcsteps = 0x80000000; /* Prevent implicit GC check further up. */ -} - -/* -- PHI and loop handling ----------------------------------------------- */ - -/* Break a PHI cycle by renaming to a free register (evict if needed). */ -static void asm_phi_break(ASMState *as, RegSet blocked, RegSet blockedby, - RegSet allow) -{ - RegSet candidates = blocked & allow; - if (candidates) { /* If this register file has candidates. */ - /* Note: the set for ra_pick cannot be empty, since each register file - ** has some registers never allocated to PHIs. - */ - Reg down, up = ra_pick(as, ~blocked & allow); /* Get a free register. */ - if (candidates & ~blockedby) /* Optimize shifts, else it's a cycle. */ - candidates = candidates & ~blockedby; - down = rset_picktop(candidates); /* Pick candidate PHI register. */ - ra_rename(as, down, up); /* And rename it to the free register. */ - } -} - -/* PHI register shuffling. -** -** The allocator tries hard to preserve PHI register assignments across -** the loop body. Most of the time this loop does nothing, since there -** are no register mismatches. -** -** If a register mismatch is detected and ... -** - the register is currently free: rename it. -** - the register is blocked by an invariant: restore/remat and rename it. -** - Otherwise the register is used by another PHI, so mark it as blocked. -** -** The renames are order-sensitive, so just retry the loop if a register -** is marked as blocked, but has been freed in the meantime. A cycle is -** detected if all of the blocked registers are allocated. To break the -** cycle rename one of them to a free register and retry. -** -** Note that PHI spill slots are kept in sync and don't need to be shuffled. -*/ -static void asm_phi_shuffle(ASMState *as) -{ - RegSet work; - - /* Find and resolve PHI register mismatches. */ - for (;;) { - RegSet blocked = RSET_EMPTY; - RegSet blockedby = RSET_EMPTY; - RegSet phiset = as->phiset; - while (phiset) { /* Check all left PHI operand registers. */ - Reg r = rset_pickbot(phiset); - IRIns *irl = IR(as->phireg[r]); - Reg left = irl->r; - if (r != left) { /* Mismatch? */ - if (!rset_test(as->freeset, r)) { /* PHI register blocked? */ - IRRef ref = regcost_ref(as->cost[r]); - /* Blocked by other PHI (w/reg)? */ - if (!ra_iskref(ref) && irt_ismarked(IR(ref)->t)) { - rset_set(blocked, r); - if (ra_hasreg(left)) - rset_set(blockedby, left); - left = RID_NONE; - } else { /* Otherwise grab register from invariant. */ - ra_restore(as, ref); - checkmclim(as); - } - } - if (ra_hasreg(left)) { - ra_rename(as, left, r); - checkmclim(as); - } - } - rset_clear(phiset, r); - } - if (!blocked) break; /* Finished. */ - if (!(as->freeset & blocked)) { /* Break cycles if none are free. */ - asm_phi_break(as, blocked, blockedby, RSET_GPR); - if (!LJ_SOFTFP) asm_phi_break(as, blocked, blockedby, RSET_FPR); - checkmclim(as); - } /* Else retry some more renames. */ - } - - /* Restore/remat invariants whose registers are modified inside the loop. */ -#if !LJ_SOFTFP - work = as->modset & ~(as->freeset | as->phiset) & RSET_FPR; - while (work) { - Reg r = rset_pickbot(work); - ra_restore(as, regcost_ref(as->cost[r])); - rset_clear(work, r); - checkmclim(as); - } -#endif - work = as->modset & ~(as->freeset | as->phiset); - while (work) { - Reg r = rset_pickbot(work); - ra_restore(as, regcost_ref(as->cost[r])); - rset_clear(work, r); - checkmclim(as); - } - - /* Allocate and save all unsaved PHI regs and clear marks. */ - work = as->phiset; - while (work) { - Reg r = rset_picktop(work); - IRRef lref = as->phireg[r]; - IRIns *ir = IR(lref); - if (ra_hasspill(ir->s)) { /* Left PHI gained a spill slot? */ - irt_clearmark(ir->t); /* Handled here, so clear marker now. */ - ra_alloc1(as, lref, RID2RSET(r)); - ra_save(as, ir, r); /* Save to spill slot inside the loop. */ - checkmclim(as); - } - rset_clear(work, r); - } -} - -/* Copy unsynced left/right PHI spill slots. Rarely needed. */ -static void asm_phi_copyspill(ASMState *as) -{ - int need = 0; - IRIns *ir; - for (ir = IR(as->orignins-1); ir->o == IR_PHI; ir--) - if (ra_hasspill(ir->s) && ra_hasspill(IR(ir->op1)->s)) - need |= irt_isfp(ir->t) ? 2 : 1; /* Unsynced spill slot? */ - if ((need & 1)) { /* Copy integer spill slots. */ -#if !LJ_TARGET_X86ORX64 - Reg r = RID_TMP; -#else - Reg r = RID_RET; - if ((as->freeset & RSET_GPR)) - r = rset_pickbot((as->freeset & RSET_GPR)); - else - emit_spload(as, IR(regcost_ref(as->cost[r])), r, SPOFS_TMP); -#endif - for (ir = IR(as->orignins-1); ir->o == IR_PHI; ir--) { - if (ra_hasspill(ir->s)) { - IRIns *irl = IR(ir->op1); - if (ra_hasspill(irl->s) && !irt_isfp(ir->t)) { - emit_spstore(as, irl, r, sps_scale(irl->s)); - emit_spload(as, ir, r, sps_scale(ir->s)); - checkmclim(as); - } - } - } -#if LJ_TARGET_X86ORX64 - if (!rset_test(as->freeset, r)) - emit_spstore(as, IR(regcost_ref(as->cost[r])), r, SPOFS_TMP); -#endif - } -#if !LJ_SOFTFP - if ((need & 2)) { /* Copy FP spill slots. */ -#if LJ_TARGET_X86 - Reg r = RID_XMM0; -#else - Reg r = RID_FPRET; -#endif - if ((as->freeset & RSET_FPR)) - r = rset_pickbot((as->freeset & RSET_FPR)); - if (!rset_test(as->freeset, r)) - emit_spload(as, IR(regcost_ref(as->cost[r])), r, SPOFS_TMP); - for (ir = IR(as->orignins-1); ir->o == IR_PHI; ir--) { - if (ra_hasspill(ir->s)) { - IRIns *irl = IR(ir->op1); - if (ra_hasspill(irl->s) && irt_isfp(ir->t)) { - emit_spstore(as, irl, r, sps_scale(irl->s)); - emit_spload(as, ir, r, sps_scale(ir->s)); - checkmclim(as); - } - } - } - if (!rset_test(as->freeset, r)) - emit_spstore(as, IR(regcost_ref(as->cost[r])), r, SPOFS_TMP); - } -#endif -} - -/* Emit renames for left PHIs which are only spilled outside the loop. */ -static void asm_phi_fixup(ASMState *as) -{ - RegSet work = as->phiset; - while (work) { - Reg r = rset_picktop(work); - IRRef lref = as->phireg[r]; - IRIns *ir = IR(lref); - if (irt_ismarked(ir->t)) { - irt_clearmark(ir->t); - /* Left PHI gained a spill slot before the loop? */ - if (ra_hasspill(ir->s)) { - IRRef ren; - lj_ir_set(as->J, IRT(IR_RENAME, IRT_NIL), lref, as->loopsnapno); - ren = tref_ref(lj_ir_emit(as->J)); - as->ir = as->T->ir; /* The IR may have been reallocated. */ - IR(ren)->r = (uint8_t)r; - IR(ren)->s = SPS_NONE; - } - } - rset_clear(work, r); - } -} - -/* Setup right PHI reference. */ -static void asm_phi(ASMState *as, IRIns *ir) -{ - RegSet allow = ((!LJ_SOFTFP && irt_isfp(ir->t)) ? RSET_FPR : RSET_GPR) & - ~as->phiset; - RegSet afree = (as->freeset & allow); - IRIns *irl = IR(ir->op1); - IRIns *irr = IR(ir->op2); - if (ir->r == RID_SINK) /* Sink PHI. */ - return; - /* Spill slot shuffling is not implemented yet (but rarely needed). */ - if (ra_hasspill(irl->s) || ra_hasspill(irr->s)) - lj_trace_err(as->J, LJ_TRERR_NYIPHI); - /* Leave at least one register free for non-PHIs (and PHI cycle breaking). */ - if ((afree & (afree-1))) { /* Two or more free registers? */ - Reg r; - if (ra_noreg(irr->r)) { /* Get a register for the right PHI. */ - r = ra_allocref(as, ir->op2, allow); - } else { /* Duplicate right PHI, need a copy (rare). */ - r = ra_scratch(as, allow); - emit_movrr(as, irr, r, irr->r); - } - ir->r = (uint8_t)r; - rset_set(as->phiset, r); - as->phireg[r] = (IRRef1)ir->op1; - irt_setmark(irl->t); /* Marks left PHIs _with_ register. */ - if (ra_noreg(irl->r)) - ra_sethint(irl->r, r); /* Set register hint for left PHI. */ - } else { /* Otherwise allocate a spill slot. */ - /* This is overly restrictive, but it triggers only on synthetic code. */ - if (ra_hasreg(irl->r) || ra_hasreg(irr->r)) - lj_trace_err(as->J, LJ_TRERR_NYIPHI); - ra_spill(as, ir); - irr->s = ir->s; /* Set right PHI spill slot. Sync left slot later. */ - } -} - -static void asm_loop_fixup(ASMState *as); - -/* Middle part of a loop. */ -static void asm_loop(ASMState *as) -{ - MCode *mcspill; - /* LOOP is a guard, so the snapno is up to date. */ - as->loopsnapno = as->snapno; - if (as->gcsteps) - asm_gc_check(as); - /* LOOP marks the transition from the variant to the invariant part. */ - as->flagmcp = as->invmcp = NULL; - as->sectref = 0; - if (!neverfuse(as)) as->fuseref = 0; - asm_phi_shuffle(as); - mcspill = as->mcp; - asm_phi_copyspill(as); - asm_loop_fixup(as); - as->mcloop = as->mcp; - RA_DBGX((as, "===== LOOP =====")); - if (!as->realign) RA_DBG_FLUSH(); - if (as->mcp != mcspill) - emit_jmp(as, mcspill); -} - -/* -- Target-specific assembler ------------------------------------------- */ - -#if LJ_TARGET_X86ORX64 -#include "lj_asm_x86.h" -#elif LJ_TARGET_ARM -#include "lj_asm_arm.h" -#elif LJ_TARGET_PPC -#include "lj_asm_ppc.h" -#elif LJ_TARGET_MIPS -#include "lj_asm_mips.h" -#else -#error "Missing assembler for target CPU" -#endif - -/* -- Head of trace ------------------------------------------------------- */ - -/* Head of a root trace. */ -static void asm_head_root(ASMState *as) -{ - int32_t spadj; - asm_head_root_base(as); - emit_setvmstate(as, (int32_t)as->T->traceno); - spadj = asm_stack_adjust(as); - as->T->spadjust = (uint16_t)spadj; - emit_spsub(as, spadj); - /* Root traces assume a checked stack for the starting proto. */ - as->T->topslot = gcref(as->T->startpt)->pt.framesize; -} - -/* Head of a side trace. -** -** The current simplistic algorithm requires that all slots inherited -** from the parent are live in a register between pass 2 and pass 3. This -** avoids the complexity of stack slot shuffling. But of course this may -** overflow the register set in some cases and cause the dreaded error: -** "NYI: register coalescing too complex". A refined algorithm is needed. -*/ -static void asm_head_side(ASMState *as) -{ - IRRef1 sloadins[RID_MAX]; - RegSet allow = RSET_ALL; /* Inverse of all coalesced registers. */ - RegSet live = RSET_EMPTY; /* Live parent registers. */ - IRIns *irp = &as->parent->ir[REF_BASE]; /* Parent base. */ - int32_t spadj, spdelta; - int pass2 = 0; - int pass3 = 0; - IRRef i; - - if (as->snapno && as->topslot > as->parent->topslot) { - /* Force snap #0 alloc to prevent register overwrite in stack check. */ - as->snapno = 0; - asm_snap_alloc(as); - } - allow = asm_head_side_base(as, irp, allow); - - /* Scan all parent SLOADs and collect register dependencies. */ - for (i = as->stopins; i > REF_BASE; i--) { - IRIns *ir = IR(i); - RegSP rs; - lua_assert((ir->o == IR_SLOAD && (ir->op2 & IRSLOAD_PARENT)) || - (LJ_SOFTFP && ir->o == IR_HIOP) || ir->o == IR_PVAL); - rs = as->parentmap[i - REF_FIRST]; - if (ra_hasreg(ir->r)) { - rset_clear(allow, ir->r); - if (ra_hasspill(ir->s)) { - ra_save(as, ir, ir->r); - checkmclim(as); - } - } else if (ra_hasspill(ir->s)) { - irt_setmark(ir->t); - pass2 = 1; - } - if (ir->r == rs) { /* Coalesce matching registers right now. */ - ra_free(as, ir->r); - } else if (ra_hasspill(regsp_spill(rs))) { - if (ra_hasreg(ir->r)) - pass3 = 1; - } else if (ra_used(ir)) { - sloadins[rs] = (IRRef1)i; - rset_set(live, rs); /* Block live parent register. */ - } - } - - /* Calculate stack frame adjustment. */ - spadj = asm_stack_adjust(as); - spdelta = spadj - (int32_t)as->parent->spadjust; - if (spdelta < 0) { /* Don't shrink the stack frame. */ - spadj = (int32_t)as->parent->spadjust; - spdelta = 0; - } - as->T->spadjust = (uint16_t)spadj; - - /* Reload spilled target registers. */ - if (pass2) { - for (i = as->stopins; i > REF_BASE; i--) { - IRIns *ir = IR(i); - if (irt_ismarked(ir->t)) { - RegSet mask; - Reg r; - RegSP rs; - irt_clearmark(ir->t); - rs = as->parentmap[i - REF_FIRST]; - if (!ra_hasspill(regsp_spill(rs))) - ra_sethint(ir->r, rs); /* Hint may be gone, set it again. */ - else if (sps_scale(regsp_spill(rs))+spdelta == sps_scale(ir->s)) - continue; /* Same spill slot, do nothing. */ - mask = ((!LJ_SOFTFP && irt_isfp(ir->t)) ? RSET_FPR : RSET_GPR) & allow; - if (mask == RSET_EMPTY) - lj_trace_err(as->J, LJ_TRERR_NYICOAL); - r = ra_allocref(as, i, mask); - ra_save(as, ir, r); - rset_clear(allow, r); - if (r == rs) { /* Coalesce matching registers right now. */ - ra_free(as, r); - rset_clear(live, r); - } else if (ra_hasspill(regsp_spill(rs))) { - pass3 = 1; - } - checkmclim(as); - } - } - } - - /* Store trace number and adjust stack frame relative to the parent. */ - emit_setvmstate(as, (int32_t)as->T->traceno); - emit_spsub(as, spdelta); - -#if !LJ_TARGET_X86ORX64 - /* Restore BASE register from parent spill slot. */ - if (ra_hasspill(irp->s)) - emit_spload(as, IR(REF_BASE), IR(REF_BASE)->r, sps_scale(irp->s)); -#endif - - /* Restore target registers from parent spill slots. */ - if (pass3) { - RegSet work = ~as->freeset & RSET_ALL; - while (work) { - Reg r = rset_pickbot(work); - IRRef ref = regcost_ref(as->cost[r]); - RegSP rs = as->parentmap[ref - REF_FIRST]; - rset_clear(work, r); - if (ra_hasspill(regsp_spill(rs))) { - int32_t ofs = sps_scale(regsp_spill(rs)); - ra_free(as, r); - emit_spload(as, IR(ref), r, ofs); - checkmclim(as); - } - } - } - - /* Shuffle registers to match up target regs with parent regs. */ - for (;;) { - RegSet work; - - /* Repeatedly coalesce free live registers by moving to their target. */ - while ((work = as->freeset & live) != RSET_EMPTY) { - Reg rp = rset_pickbot(work); - IRIns *ir = IR(sloadins[rp]); - rset_clear(live, rp); - rset_clear(allow, rp); - ra_free(as, ir->r); - emit_movrr(as, ir, ir->r, rp); - checkmclim(as); - } - - /* We're done if no live registers remain. */ - if (live == RSET_EMPTY) - break; - - /* Break cycles by renaming one target to a temp. register. */ - if (live & RSET_GPR) { - RegSet tmpset = as->freeset & ~live & allow & RSET_GPR; - if (tmpset == RSET_EMPTY) - lj_trace_err(as->J, LJ_TRERR_NYICOAL); - ra_rename(as, rset_pickbot(live & RSET_GPR), rset_pickbot(tmpset)); - } - if (!LJ_SOFTFP && (live & RSET_FPR)) { - RegSet tmpset = as->freeset & ~live & allow & RSET_FPR; - if (tmpset == RSET_EMPTY) - lj_trace_err(as->J, LJ_TRERR_NYICOAL); - ra_rename(as, rset_pickbot(live & RSET_FPR), rset_pickbot(tmpset)); - } - checkmclim(as); - /* Continue with coalescing to fix up the broken cycle(s). */ - } - - /* Inherit top stack slot already checked by parent trace. */ - as->T->topslot = as->parent->topslot; - if (as->topslot > as->T->topslot) { /* Need to check for higher slot? */ -#ifdef EXITSTATE_CHECKEXIT - /* Highest exit + 1 indicates stack check. */ - ExitNo exitno = as->T->nsnap; -#else - /* Reuse the parent exit in the context of the parent trace. */ - ExitNo exitno = as->J->exitno; -#endif - as->T->topslot = (uint8_t)as->topslot; /* Remember for child traces. */ - asm_stack_check(as, as->topslot, irp, allow & RSET_GPR, exitno); - } -} - -/* -- Tail of trace ------------------------------------------------------- */ - -/* Get base slot for a snapshot. */ -static BCReg asm_baseslot(ASMState *as, SnapShot *snap, int *gotframe) -{ - SnapEntry *map = &as->T->snapmap[snap->mapofs]; - MSize n; - for (n = snap->nent; n > 0; n--) { - SnapEntry sn = map[n-1]; - if ((sn & SNAP_FRAME)) { - *gotframe = 1; - return snap_slot(sn); - } - } - return 0; -} - -/* Link to another trace. */ -static void asm_tail_link(ASMState *as) -{ - SnapNo snapno = as->T->nsnap-1; /* Last snapshot. */ - SnapShot *snap = &as->T->snap[snapno]; - int gotframe = 0; - BCReg baseslot = asm_baseslot(as, snap, &gotframe); - - as->topslot = snap->topslot; - checkmclim(as); - ra_allocref(as, REF_BASE, RID2RSET(RID_BASE)); - - if (as->T->link == 0) { - /* Setup fixed registers for exit to interpreter. */ - const BCIns *pc = snap_pc(as->T->snapmap[snap->mapofs + snap->nent]); - int32_t mres; - if (bc_op(*pc) == BC_JLOOP) { /* NYI: find a better way to do this. */ - BCIns *retpc = &traceref(as->J, bc_d(*pc))->startins; - if (bc_isret(bc_op(*retpc))) - pc = retpc; - } - ra_allockreg(as, i32ptr(J2GG(as->J)->dispatch), RID_DISPATCH); - ra_allockreg(as, i32ptr(pc), RID_LPC); - mres = (int32_t)(snap->nslots - baseslot); - switch (bc_op(*pc)) { - case BC_CALLM: case BC_CALLMT: - mres -= (int32_t)(1 + bc_a(*pc) + bc_c(*pc)); break; - case BC_RETM: mres -= (int32_t)(bc_a(*pc) + bc_d(*pc)); break; - case BC_TSETM: mres -= (int32_t)bc_a(*pc); break; - default: if (bc_op(*pc) < BC_FUNCF) mres = 0; break; - } - ra_allockreg(as, mres, RID_RET); /* Return MULTRES or 0. */ - } else if (baseslot) { - /* Save modified BASE for linking to trace with higher start frame. */ - emit_setgl(as, RID_BASE, jit_base); - } - emit_addptr(as, RID_BASE, 8*(int32_t)baseslot); - - /* Sync the interpreter state with the on-trace state. */ - asm_stack_restore(as, snap); - - /* Root traces that add frames need to check the stack at the end. */ - if (!as->parent && gotframe) - asm_stack_check(as, as->topslot, NULL, as->freeset & RSET_GPR, snapno); -} - -/* -- Trace setup --------------------------------------------------------- */ - -/* Clear reg/sp for all instructions and add register hints. */ -static void asm_setup_regsp(ASMState *as) -{ - GCtrace *T = as->T; - int sink = T->sinktags; - IRRef nins = T->nins; - IRIns *ir, *lastir; - int inloop; -#if LJ_TARGET_ARM - uint32_t rload = 0xa6402a64; -#endif - - ra_setup(as); - - /* Clear reg/sp for constants. */ - for (ir = IR(T->nk), lastir = IR(REF_BASE); ir < lastir; ir++) - ir->prev = REGSP_INIT; - - /* REF_BASE is used for implicit references to the BASE register. */ - lastir->prev = REGSP_HINT(RID_BASE); - - ir = IR(nins-1); - if (ir->o == IR_RENAME) { - do { ir--; nins--; } while (ir->o == IR_RENAME); - T->nins = nins; /* Remove any renames left over from ASM restart. */ - } - as->snaprename = nins; - as->snapref = nins; - as->snapno = T->nsnap; - - as->stopins = REF_BASE; - as->orignins = nins; - as->curins = nins; - - /* Setup register hints for parent link instructions. */ - ir = IR(REF_FIRST); - if (as->parent) { - uint16_t *p; - lastir = lj_snap_regspmap(as->parent, as->J->exitno, ir); - if (lastir - ir > LJ_MAX_JSLOTS) - lj_trace_err(as->J, LJ_TRERR_NYICOAL); - as->stopins = (IRRef)((lastir-1) - as->ir); - for (p = as->parentmap; ir < lastir; ir++) { - RegSP rs = ir->prev; - *p++ = (uint16_t)rs; /* Copy original parent RegSP to parentmap. */ - if (!ra_hasspill(regsp_spill(rs))) - ir->prev = (uint16_t)REGSP_HINT(regsp_reg(rs)); - else - ir->prev = REGSP_INIT; - } - } - - inloop = 0; - as->evenspill = SPS_FIRST; - for (lastir = IR(nins); ir < lastir; ir++) { - if (sink) { - if (ir->r == RID_SINK) - continue; - if (ir->r == RID_SUNK) { /* Revert after ASM restart. */ - ir->r = RID_SINK; - continue; - } - } - switch (ir->o) { - case IR_LOOP: - inloop = 1; - break; -#if LJ_TARGET_ARM - case IR_SLOAD: - if (!((ir->op2 & IRSLOAD_TYPECHECK) || (ir+1)->o == IR_HIOP)) - break; - /* fallthrough */ - case IR_ALOAD: case IR_HLOAD: case IR_ULOAD: case IR_VLOAD: - if (!LJ_SOFTFP && irt_isnum(ir->t)) break; - ir->prev = (uint16_t)REGSP_HINT((rload & 15)); - rload = lj_ror(rload, 4); - continue; -#endif - case IR_CALLXS: { - CCallInfo ci; - ci.flags = asm_callx_flags(as, ir); - ir->prev = asm_setup_call_slots(as, ir, &ci); - if (inloop) - as->modset |= RSET_SCRATCH; - continue; - } - case IR_CALLN: case IR_CALLL: case IR_CALLS: { - const CCallInfo *ci = &lj_ir_callinfo[ir->op2]; - ir->prev = asm_setup_call_slots(as, ir, ci); - if (inloop) - as->modset |= (ci->flags & CCI_NOFPRCLOBBER) ? - (RSET_SCRATCH & ~RSET_FPR) : RSET_SCRATCH; - continue; - } -#if LJ_SOFTFP || (LJ_32 && LJ_HASFFI) - case IR_HIOP: - switch ((ir-1)->o) { -#if LJ_SOFTFP && LJ_TARGET_ARM - case IR_SLOAD: case IR_ALOAD: case IR_HLOAD: case IR_ULOAD: case IR_VLOAD: - if (ra_hashint((ir-1)->r)) { - ir->prev = (ir-1)->prev + 1; - continue; - } - break; -#endif -#if !LJ_SOFTFP && LJ_NEED_FP64 - case IR_CONV: - if (irt_isfp((ir-1)->t)) { - ir->prev = REGSP_HINT(RID_FPRET); - continue; - } - /* fallthrough */ -#endif - case IR_CALLN: case IR_CALLXS: -#if LJ_SOFTFP - case IR_MIN: case IR_MAX: -#endif - (ir-1)->prev = REGSP_HINT(RID_RETLO); - ir->prev = REGSP_HINT(RID_RETHI); - continue; - default: - break; - } - break; -#endif -#if LJ_SOFTFP - case IR_MIN: case IR_MAX: - if ((ir+1)->o != IR_HIOP) break; - /* fallthrough */ -#endif - /* C calls evict all scratch regs and return results in RID_RET. */ - case IR_SNEW: case IR_XSNEW: case IR_NEWREF: - if (REGARG_NUMGPR < 3 && as->evenspill < 3) - as->evenspill = 3; /* lj_str_new and lj_tab_newkey need 3 args. */ - case IR_TNEW: case IR_TDUP: case IR_CNEW: case IR_CNEWI: case IR_TOSTR: - ir->prev = REGSP_HINT(RID_RET); - if (inloop) - as->modset = RSET_SCRATCH; - continue; - case IR_STRTO: case IR_OBAR: - if (inloop) - as->modset = RSET_SCRATCH; - break; -#if !LJ_TARGET_X86ORX64 && !LJ_SOFTFP - case IR_ATAN2: case IR_LDEXP: -#endif - case IR_POW: - if (!LJ_SOFTFP && irt_isnum(ir->t)) { -#if LJ_TARGET_X86ORX64 - ir->prev = REGSP_HINT(RID_XMM0); - if (inloop) - as->modset |= RSET_RANGE(RID_XMM0, RID_XMM1+1)|RID2RSET(RID_EAX); -#else - ir->prev = REGSP_HINT(RID_FPRET); - if (inloop) - as->modset |= RSET_SCRATCH; -#endif - continue; - } - /* fallthrough for integer POW */ - case IR_DIV: case IR_MOD: - if (!irt_isnum(ir->t)) { - ir->prev = REGSP_HINT(RID_RET); - if (inloop) - as->modset |= (RSET_SCRATCH & RSET_GPR); - continue; - } - break; - case IR_FPMATH: -#if LJ_TARGET_X86ORX64 - if (ir->op2 == IRFPM_EXP2) { /* May be joined to lj_vm_pow_sse. */ - ir->prev = REGSP_HINT(RID_XMM0); -#if !LJ_64 - if (as->evenspill < 4) /* Leave room for 16 byte scratch area. */ - as->evenspill = 4; -#endif - if (inloop) - as->modset |= RSET_RANGE(RID_XMM0, RID_XMM2+1)|RID2RSET(RID_EAX); - continue; - } else if (ir->op2 <= IRFPM_TRUNC && !(as->flags & JIT_F_SSE4_1)) { - ir->prev = REGSP_HINT(RID_XMM0); - if (inloop) - as->modset |= RSET_RANGE(RID_XMM0, RID_XMM3+1)|RID2RSET(RID_EAX); - continue; - } - break; -#else - ir->prev = REGSP_HINT(RID_FPRET); - if (inloop) - as->modset |= RSET_SCRATCH; - continue; -#endif -#if LJ_TARGET_X86ORX64 - /* Non-constant shift counts need to be in RID_ECX on x86/x64. */ - case IR_BSHL: case IR_BSHR: case IR_BSAR: case IR_BROL: case IR_BROR: - if (!irref_isk(ir->op2) && !ra_hashint(IR(ir->op2)->r)) { - IR(ir->op2)->r = REGSP_HINT(RID_ECX); - if (inloop) - rset_set(as->modset, RID_ECX); - } - break; -#endif - /* Do not propagate hints across type conversions or loads. */ - case IR_TOBIT: - case IR_XLOAD: -#if !LJ_TARGET_ARM - case IR_ALOAD: case IR_HLOAD: case IR_ULOAD: case IR_VLOAD: -#endif - break; - case IR_CONV: - if (irt_isfp(ir->t) || (ir->op2 & IRCONV_SRCMASK) == IRT_NUM || - (ir->op2 & IRCONV_SRCMASK) == IRT_FLOAT) - break; - /* fallthrough */ - default: - /* Propagate hints across likely 'op reg, imm' or 'op reg'. */ - if (irref_isk(ir->op2) && !irref_isk(ir->op1) && - ra_hashint(regsp_reg(IR(ir->op1)->prev))) { - ir->prev = IR(ir->op1)->prev; - continue; - } - break; - } - ir->prev = REGSP_INIT; - } - if ((as->evenspill & 1)) - as->oddspill = as->evenspill++; - else - as->oddspill = 0; -} - -/* -- Assembler core ------------------------------------------------------ */ - -/* Assemble a trace. */ -void lj_asm_trace(jit_State *J, GCtrace *T) -{ - ASMState as_; - ASMState *as = &as_; - MCode *origtop; - - /* Ensure an initialized instruction beyond the last one for HIOP checks. */ - J->cur.nins = lj_ir_nextins(J); - J->cur.ir[J->cur.nins].o = IR_NOP; - - /* Setup initial state. Copy some fields to reduce indirections. */ - as->J = J; - as->T = T; - as->ir = T->ir; - as->flags = J->flags; - as->loopref = J->loopref; - as->realign = NULL; - as->loopinv = 0; - as->parent = J->parent ? traceref(J, J->parent) : NULL; - - /* Reserve MCode memory. */ - as->mctop = origtop = lj_mcode_reserve(J, &as->mcbot); - as->mcp = as->mctop; - as->mclim = as->mcbot + MCLIM_REDZONE; - asm_setup_target(as); - - do { - as->mcp = as->mctop; -#ifdef LUA_USE_ASSERT - as->mcp_prev = as->mcp; -#endif - as->curins = T->nins; - RA_DBG_START(); - RA_DBGX((as, "===== STOP =====")); - - /* General trace setup. Emit tail of trace. */ - asm_tail_prep(as); - as->mcloop = NULL; - as->flagmcp = NULL; - as->topslot = 0; - as->gcsteps = 0; - as->sectref = as->loopref; - as->fuseref = (as->flags & JIT_F_OPT_FUSE) ? as->loopref : FUSE_DISABLED; - asm_setup_regsp(as); - if (!as->loopref) - asm_tail_link(as); - - /* Assemble a trace in linear backwards order. */ - for (as->curins--; as->curins > as->stopins; as->curins--) { - IRIns *ir = IR(as->curins); - lua_assert(!(LJ_32 && irt_isint64(ir->t))); /* Handled by SPLIT. */ - if (!ra_used(ir) && !ir_sideeff(ir) && (as->flags & JIT_F_OPT_DCE)) - continue; /* Dead-code elimination can be soooo easy. */ - if (irt_isguard(ir->t)) - asm_snap_prep(as); - RA_DBG_REF(); - checkmclim(as); - asm_ir(as, ir); - } - } while (as->realign); /* Retry in case the MCode needs to be realigned. */ - - /* Emit head of trace. */ - RA_DBG_REF(); - checkmclim(as); - if (as->gcsteps > 0) { - as->curins = as->T->snap[0].ref; - asm_snap_prep(as); /* The GC check is a guard. */ - asm_gc_check(as); - } - ra_evictk(as); - if (as->parent) - asm_head_side(as); - else - asm_head_root(as); - asm_phi_fixup(as); - - RA_DBGX((as, "===== START ====")); - RA_DBG_FLUSH(); - if (as->freeset != RSET_ALL) - lj_trace_err(as->J, LJ_TRERR_BADRA); /* Ouch! Should never happen. */ - - /* Set trace entry point before fixing up tail to allow link to self. */ - T->mcode = as->mcp; - T->mcloop = as->mcloop ? (MSize)((char *)as->mcloop - (char *)as->mcp) : 0; - if (!as->loopref) - asm_tail_fixup(as, T->link); /* Note: this may change as->mctop! */ - T->szmcode = (MSize)((char *)as->mctop - (char *)as->mcp); - lj_mcode_sync(T->mcode, origtop); -} - -#undef IR - -#endif diff --git a/deps/luajit/src/lj_asm.h b/deps/luajit/src/lj_asm.h deleted file mode 100644 index 85f29763..00000000 --- a/deps/luajit/src/lj_asm.h +++ /dev/null @@ -1,17 +0,0 @@ -/* -** IR assembler (SSA IR -> machine code). -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#ifndef _LJ_ASM_H -#define _LJ_ASM_H - -#include "lj_jit.h" - -#if LJ_HASJIT -LJ_FUNC void lj_asm_trace(jit_State *J, GCtrace *T); -LJ_FUNC void lj_asm_patchexit(jit_State *J, GCtrace *T, ExitNo exitno, - MCode *target); -#endif - -#endif diff --git a/deps/luajit/src/lj_asm_arm.h b/deps/luajit/src/lj_asm_arm.h deleted file mode 100644 index 9e4cf436..00000000 --- a/deps/luajit/src/lj_asm_arm.h +++ /dev/null @@ -1,2361 +0,0 @@ -/* -** ARM IR assembler (SSA IR -> machine code). -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -/* -- Register allocator extensions --------------------------------------- */ - -/* Allocate a register with a hint. */ -static Reg ra_hintalloc(ASMState *as, IRRef ref, Reg hint, RegSet allow) -{ - Reg r = IR(ref)->r; - if (ra_noreg(r)) { - if (!ra_hashint(r) && !iscrossref(as, ref)) - ra_sethint(IR(ref)->r, hint); /* Propagate register hint. */ - r = ra_allocref(as, ref, allow); - } - ra_noweak(as, r); - return r; -} - -/* Allocate a scratch register pair. */ -static Reg ra_scratchpair(ASMState *as, RegSet allow) -{ - RegSet pick1 = as->freeset & allow; - RegSet pick2 = pick1 & (pick1 >> 1) & RSET_GPREVEN; - Reg r; - if (pick2) { - r = rset_picktop(pick2); - } else { - RegSet pick = pick1 & (allow >> 1) & RSET_GPREVEN; - if (pick) { - r = rset_picktop(pick); - ra_restore(as, regcost_ref(as->cost[r+1])); - } else { - pick = pick1 & (allow << 1) & RSET_GPRODD; - if (pick) { - r = ra_restore(as, regcost_ref(as->cost[rset_picktop(pick)-1])); - } else { - r = ra_evict(as, allow & (allow >> 1) & RSET_GPREVEN); - ra_restore(as, regcost_ref(as->cost[r+1])); - } - } - } - lua_assert(rset_test(RSET_GPREVEN, r)); - ra_modified(as, r); - ra_modified(as, r+1); - RA_DBGX((as, "scratchpair $r $r", r, r+1)); - return r; -} - -#if !LJ_SOFTFP -/* Allocate two source registers for three-operand instructions. */ -static Reg ra_alloc2(ASMState *as, IRIns *ir, RegSet allow) -{ - IRIns *irl = IR(ir->op1), *irr = IR(ir->op2); - Reg left = irl->r, right = irr->r; - if (ra_hasreg(left)) { - ra_noweak(as, left); - if (ra_noreg(right)) - right = ra_allocref(as, ir->op2, rset_exclude(allow, left)); - else - ra_noweak(as, right); - } else if (ra_hasreg(right)) { - ra_noweak(as, right); - left = ra_allocref(as, ir->op1, rset_exclude(allow, right)); - } else if (ra_hashint(right)) { - right = ra_allocref(as, ir->op2, allow); - left = ra_alloc1(as, ir->op1, rset_exclude(allow, right)); - } else { - left = ra_allocref(as, ir->op1, allow); - right = ra_alloc1(as, ir->op2, rset_exclude(allow, left)); - } - return left | (right << 8); -} -#endif - -/* -- Guard handling ------------------------------------------------------ */ - -/* Generate an exit stub group at the bottom of the reserved MCode memory. */ -static MCode *asm_exitstub_gen(ASMState *as, ExitNo group) -{ - MCode *mxp = as->mcbot; - int i; - if (mxp + 4*4+4*EXITSTUBS_PER_GROUP >= as->mctop) - asm_mclimit(as); - /* str lr, [sp]; bl ->vm_exit_handler; .long DISPATCH_address, group. */ - *mxp++ = ARMI_STR|ARMI_LS_P|ARMI_LS_U|ARMF_D(RID_LR)|ARMF_N(RID_SP); - *mxp = ARMI_BL|((((MCode *)(void *)lj_vm_exit_handler-mxp)-2)&0x00ffffffu); - mxp++; - *mxp++ = (MCode)i32ptr(J2GG(as->J)->dispatch); /* DISPATCH address */ - *mxp++ = group*EXITSTUBS_PER_GROUP; - for (i = 0; i < EXITSTUBS_PER_GROUP; i++) - *mxp++ = ARMI_B|((-6-i)&0x00ffffffu); - lj_mcode_sync(as->mcbot, mxp); - lj_mcode_commitbot(as->J, mxp); - as->mcbot = mxp; - as->mclim = as->mcbot + MCLIM_REDZONE; - return mxp - EXITSTUBS_PER_GROUP; -} - -/* Setup all needed exit stubs. */ -static void asm_exitstub_setup(ASMState *as, ExitNo nexits) -{ - ExitNo i; - if (nexits >= EXITSTUBS_PER_GROUP*LJ_MAX_EXITSTUBGR) - lj_trace_err(as->J, LJ_TRERR_SNAPOV); - for (i = 0; i < (nexits+EXITSTUBS_PER_GROUP-1)/EXITSTUBS_PER_GROUP; i++) - if (as->J->exitstubgroup[i] == NULL) - as->J->exitstubgroup[i] = asm_exitstub_gen(as, i); -} - -/* Emit conditional branch to exit for guard. */ -static void asm_guardcc(ASMState *as, ARMCC cc) -{ - MCode *target = exitstub_addr(as->J, as->snapno); - MCode *p = as->mcp; - if (LJ_UNLIKELY(p == as->invmcp)) { - as->loopinv = 1; - *p = ARMI_BL | ((target-p-2) & 0x00ffffffu); - emit_branch(as, ARMF_CC(ARMI_B, cc^1), p+1); - return; - } - emit_branch(as, ARMF_CC(ARMI_BL, cc), target); -} - -/* -- Operand fusion ------------------------------------------------------ */ - -/* Limit linear search to this distance. Avoids O(n^2) behavior. */ -#define CONFLICT_SEARCH_LIM 31 - -/* Check if there's no conflicting instruction between curins and ref. */ -static int noconflict(ASMState *as, IRRef ref, IROp conflict) -{ - IRIns *ir = as->ir; - IRRef i = as->curins; - if (i > ref + CONFLICT_SEARCH_LIM) - return 0; /* Give up, ref is too far away. */ - while (--i > ref) - if (ir[i].o == conflict) - return 0; /* Conflict found. */ - return 1; /* Ok, no conflict. */ -} - -/* Fuse the array base of colocated arrays. */ -static int32_t asm_fuseabase(ASMState *as, IRRef ref) -{ - IRIns *ir = IR(ref); - if (ir->o == IR_TNEW && ir->op1 <= LJ_MAX_COLOSIZE && - !neverfuse(as) && noconflict(as, ref, IR_NEWREF)) - return (int32_t)sizeof(GCtab); - return 0; -} - -/* Fuse array/hash/upvalue reference into register+offset operand. */ -static Reg asm_fuseahuref(ASMState *as, IRRef ref, int32_t *ofsp, RegSet allow, - int lim) -{ - IRIns *ir = IR(ref); - if (ra_noreg(ir->r)) { - if (ir->o == IR_AREF) { - if (mayfuse(as, ref)) { - if (irref_isk(ir->op2)) { - IRRef tab = IR(ir->op1)->op1; - int32_t ofs = asm_fuseabase(as, tab); - IRRef refa = ofs ? tab : ir->op1; - ofs += 8*IR(ir->op2)->i; - if (ofs > -lim && ofs < lim) { - *ofsp = ofs; - return ra_alloc1(as, refa, allow); - } - } - } - } else if (ir->o == IR_HREFK) { - if (mayfuse(as, ref)) { - int32_t ofs = (int32_t)(IR(ir->op2)->op2 * sizeof(Node)); - if (ofs < lim) { - *ofsp = ofs; - return ra_alloc1(as, ir->op1, allow); - } - } - } else if (ir->o == IR_UREFC) { - if (irref_isk(ir->op1)) { - GCfunc *fn = ir_kfunc(IR(ir->op1)); - int32_t ofs = i32ptr(&gcref(fn->l.uvptr[(ir->op2 >> 8)])->uv.tv); - *ofsp = (ofs & 255); /* Mask out less bits to allow LDRD. */ - return ra_allock(as, (ofs & ~255), allow); - } - } - } - *ofsp = 0; - return ra_alloc1(as, ref, allow); -} - -/* Fuse m operand into arithmetic/logic instructions. */ -static uint32_t asm_fuseopm(ASMState *as, ARMIns ai, IRRef ref, RegSet allow) -{ - IRIns *ir = IR(ref); - if (ra_hasreg(ir->r)) { - ra_noweak(as, ir->r); - return ARMF_M(ir->r); - } else if (irref_isk(ref)) { - uint32_t k = emit_isk12(ai, ir->i); - if (k) - return k; - } else if (mayfuse(as, ref)) { - if (ir->o >= IR_BSHL && ir->o <= IR_BROR) { - Reg m = ra_alloc1(as, ir->op1, allow); - ARMShift sh = ir->o == IR_BSHL ? ARMSH_LSL : - ir->o == IR_BSHR ? ARMSH_LSR : - ir->o == IR_BSAR ? ARMSH_ASR : ARMSH_ROR; - if (irref_isk(ir->op2)) { - return m | ARMF_SH(sh, (IR(ir->op2)->i & 31)); - } else { - Reg s = ra_alloc1(as, ir->op2, rset_exclude(allow, m)); - return m | ARMF_RSH(sh, s); - } - } else if (ir->o == IR_ADD && ir->op1 == ir->op2) { - Reg m = ra_alloc1(as, ir->op1, allow); - return m | ARMF_SH(ARMSH_LSL, 1); - } - } - return ra_allocref(as, ref, allow); -} - -/* Fuse shifts into loads/stores. Only bother with BSHL 2 => lsl #2. */ -static IRRef asm_fuselsl2(ASMState *as, IRRef ref) -{ - IRIns *ir = IR(ref); - if (ra_noreg(ir->r) && mayfuse(as, ref) && ir->o == IR_BSHL && - irref_isk(ir->op2) && IR(ir->op2)->i == 2) - return ir->op1; - return 0; /* No fusion. */ -} - -/* Fuse XLOAD/XSTORE reference into load/store operand. */ -static void asm_fusexref(ASMState *as, ARMIns ai, Reg rd, IRRef ref, - RegSet allow, int32_t ofs) -{ - IRIns *ir = IR(ref); - Reg base; - if (ra_noreg(ir->r) && canfuse(as, ir)) { - int32_t lim = (!LJ_SOFTFP && (ai & 0x08000000)) ? 1024 : - (ai & 0x04000000) ? 4096 : 256; - if (ir->o == IR_ADD) { - int32_t ofs2; - if (irref_isk(ir->op2) && - (ofs2 = ofs + IR(ir->op2)->i) > -lim && ofs2 < lim && - (!(!LJ_SOFTFP && (ai & 0x08000000)) || !(ofs2 & 3))) { - ofs = ofs2; - ref = ir->op1; - } else if (ofs == 0 && !(!LJ_SOFTFP && (ai & 0x08000000))) { - IRRef lref = ir->op1, rref = ir->op2; - Reg rn, rm; - if ((ai & 0x04000000)) { - IRRef sref = asm_fuselsl2(as, rref); - if (sref) { - rref = sref; - ai |= ARMF_SH(ARMSH_LSL, 2); - } else if ((sref = asm_fuselsl2(as, lref)) != 0) { - lref = rref; - rref = sref; - ai |= ARMF_SH(ARMSH_LSL, 2); - } - } - rn = ra_alloc1(as, lref, allow); - rm = ra_alloc1(as, rref, rset_exclude(allow, rn)); - if ((ai & 0x04000000)) ai |= ARMI_LS_R; - emit_dnm(as, ai|ARMI_LS_P|ARMI_LS_U, rd, rn, rm); - return; - } - } else if (ir->o == IR_STRREF && !(!LJ_SOFTFP && (ai & 0x08000000))) { - lua_assert(ofs == 0); - ofs = (int32_t)sizeof(GCstr); - if (irref_isk(ir->op2)) { - ofs += IR(ir->op2)->i; - ref = ir->op1; - } else if (irref_isk(ir->op1)) { - ofs += IR(ir->op1)->i; - ref = ir->op2; - } else { - /* NYI: Fuse ADD with constant. */ - Reg rn = ra_alloc1(as, ir->op1, allow); - uint32_t m = asm_fuseopm(as, 0, ir->op2, rset_exclude(allow, rn)); - if ((ai & 0x04000000)) - emit_lso(as, ai, rd, rd, ofs); - else - emit_lsox(as, ai, rd, rd, ofs); - emit_dn(as, ARMI_ADD^m, rd, rn); - return; - } - if (ofs <= -lim || ofs >= lim) { - Reg rn = ra_alloc1(as, ref, allow); - Reg rm = ra_allock(as, ofs, rset_exclude(allow, rn)); - if ((ai & 0x04000000)) ai |= ARMI_LS_R; - emit_dnm(as, ai|ARMI_LS_P|ARMI_LS_U, rd, rn, rm); - return; - } - } - } - base = ra_alloc1(as, ref, allow); -#if !LJ_SOFTFP - if ((ai & 0x08000000)) - emit_vlso(as, ai, rd, base, ofs); - else -#endif - if ((ai & 0x04000000)) - emit_lso(as, ai, rd, base, ofs); - else - emit_lsox(as, ai, rd, base, ofs); -} - -#if !LJ_SOFTFP -/* Fuse to multiply-add/sub instruction. */ -static int asm_fusemadd(ASMState *as, IRIns *ir, ARMIns ai, ARMIns air) -{ - IRRef lref = ir->op1, rref = ir->op2; - IRIns *irm; - if (lref != rref && - ((mayfuse(as, lref) && (irm = IR(lref), irm->o == IR_MUL) && - ra_noreg(irm->r)) || - (mayfuse(as, rref) && (irm = IR(rref), irm->o == IR_MUL) && - (rref = lref, ai = air, ra_noreg(irm->r))))) { - Reg dest = ra_dest(as, ir, RSET_FPR); - Reg add = ra_hintalloc(as, rref, dest, RSET_FPR); - Reg right, left = ra_alloc2(as, irm, - rset_exclude(rset_exclude(RSET_FPR, dest), add)); - right = (left >> 8); left &= 255; - emit_dnm(as, ai, (dest & 15), (left & 15), (right & 15)); - if (dest != add) emit_dm(as, ARMI_VMOV_D, (dest & 15), (add & 15)); - return 1; - } - return 0; -} -#endif - -/* -- Calls --------------------------------------------------------------- */ - -/* Generate a call to a C function. */ -static void asm_gencall(ASMState *as, const CCallInfo *ci, IRRef *args) -{ - uint32_t n, nargs = CCI_NARGS(ci); - int32_t ofs = 0; -#if LJ_SOFTFP - Reg gpr = REGARG_FIRSTGPR; -#else - Reg gpr, fpr = REGARG_FIRSTFPR, fprodd = 0; -#endif - if ((void *)ci->func) - emit_call(as, (void *)ci->func); -#if !LJ_SOFTFP - for (gpr = REGARG_FIRSTGPR; gpr <= REGARG_LASTGPR; gpr++) - as->cost[gpr] = REGCOST(~0u, ASMREF_L); - gpr = REGARG_FIRSTGPR; -#endif - for (n = 0; n < nargs; n++) { /* Setup args. */ - IRRef ref = args[n]; - IRIns *ir = IR(ref); -#if !LJ_SOFTFP - if (ref && irt_isfp(ir->t)) { - RegSet of = as->freeset; - Reg src; - if (!LJ_ABI_SOFTFP && !(ci->flags & CCI_VARARG)) { - if (irt_isnum(ir->t)) { - if (fpr <= REGARG_LASTFPR) { - ra_leftov(as, fpr, ref); - fpr++; - continue; - } - } else if (fprodd) { /* Ick. */ - src = ra_alloc1(as, ref, RSET_FPR); - emit_dm(as, ARMI_VMOV_S, (fprodd & 15), (src & 15) | 0x00400000); - fprodd = 0; - continue; - } else if (fpr <= REGARG_LASTFPR) { - ra_leftov(as, fpr, ref); - fprodd = fpr++; - continue; - } - /* Workaround to protect argument GPRs from being used for remat. */ - as->freeset &= ~RSET_RANGE(REGARG_FIRSTGPR, REGARG_LASTGPR+1); - src = ra_alloc1(as, ref, RSET_FPR); /* May alloc GPR to remat FPR. */ - as->freeset |= (of & RSET_RANGE(REGARG_FIRSTGPR, REGARG_LASTGPR+1)); - fprodd = 0; - goto stackfp; - } - /* Workaround to protect argument GPRs from being used for remat. */ - as->freeset &= ~RSET_RANGE(REGARG_FIRSTGPR, REGARG_LASTGPR+1); - src = ra_alloc1(as, ref, RSET_FPR); /* May alloc GPR to remat FPR. */ - as->freeset |= (of & RSET_RANGE(REGARG_FIRSTGPR, REGARG_LASTGPR+1)); - if (irt_isnum(ir->t)) gpr = (gpr+1) & ~1u; - if (gpr <= REGARG_LASTGPR) { - lua_assert(rset_test(as->freeset, gpr)); /* Must have been evicted. */ - if (irt_isnum(ir->t)) { - lua_assert(rset_test(as->freeset, gpr+1)); /* Ditto. */ - emit_dnm(as, ARMI_VMOV_RR_D, gpr, gpr+1, (src & 15)); - gpr += 2; - } else { - emit_dn(as, ARMI_VMOV_R_S, gpr, (src & 15)); - gpr++; - } - } else { - stackfp: - if (irt_isnum(ir->t)) ofs = (ofs + 4) & ~4; - emit_spstore(as, ir, src, ofs); - ofs += irt_isnum(ir->t) ? 8 : 4; - } - } else -#endif - { - if (gpr <= REGARG_LASTGPR) { - lua_assert(rset_test(as->freeset, gpr)); /* Must have been evicted. */ - if (ref) ra_leftov(as, gpr, ref); - gpr++; - } else { - if (ref) { - Reg r = ra_alloc1(as, ref, RSET_GPR); - emit_spstore(as, ir, r, ofs); - } - ofs += 4; - } - } - } -} - -/* Setup result reg/sp for call. Evict scratch regs. */ -static void asm_setupresult(ASMState *as, IRIns *ir, const CCallInfo *ci) -{ - RegSet drop = RSET_SCRATCH; - int hiop = ((ir+1)->o == IR_HIOP); - if (ra_hasreg(ir->r)) - rset_clear(drop, ir->r); /* Dest reg handled below. */ - if (hiop && ra_hasreg((ir+1)->r)) - rset_clear(drop, (ir+1)->r); /* Dest reg handled below. */ - ra_evictset(as, drop); /* Evictions must be performed first. */ - if (ra_used(ir)) { - lua_assert(!irt_ispri(ir->t)); - if (!LJ_SOFTFP && irt_isfp(ir->t)) { - if (LJ_ABI_SOFTFP || (ci->flags & (CCI_CASTU64|CCI_VARARG))) { - Reg dest = (ra_dest(as, ir, RSET_FPR) & 15); - if (irt_isnum(ir->t)) - emit_dnm(as, ARMI_VMOV_D_RR, RID_RETLO, RID_RETHI, dest); - else - emit_dn(as, ARMI_VMOV_S_R, RID_RET, dest); - } else { - ra_destreg(as, ir, RID_FPRET); - } - } else if (hiop) { - ra_destpair(as, ir); - } else { - ra_destreg(as, ir, RID_RET); - } - } - UNUSED(ci); -} - -static void asm_call(ASMState *as, IRIns *ir) -{ - IRRef args[CCI_NARGS_MAX]; - const CCallInfo *ci = &lj_ir_callinfo[ir->op2]; - asm_collectargs(as, ir, ci, args); - asm_setupresult(as, ir, ci); - asm_gencall(as, ci, args); -} - -static void asm_callx(ASMState *as, IRIns *ir) -{ - IRRef args[CCI_NARGS_MAX*2]; - CCallInfo ci; - IRRef func; - IRIns *irf; - ci.flags = asm_callx_flags(as, ir); - asm_collectargs(as, ir, &ci, args); - asm_setupresult(as, ir, &ci); - func = ir->op2; irf = IR(func); - if (irf->o == IR_CARG) { func = irf->op1; irf = IR(func); } - if (irref_isk(func)) { /* Call to constant address. */ - ci.func = (ASMFunction)(void *)(irf->i); - } else { /* Need a non-argument register for indirect calls. */ - Reg freg = ra_alloc1(as, func, RSET_RANGE(RID_R4, RID_R12+1)); - emit_m(as, ARMI_BLXr, freg); - ci.func = (ASMFunction)(void *)0; - } - asm_gencall(as, &ci, args); -} - -/* -- Returns ------------------------------------------------------------- */ - -/* Return to lower frame. Guard that it goes to the right spot. */ -static void asm_retf(ASMState *as, IRIns *ir) -{ - Reg base = ra_alloc1(as, REF_BASE, RSET_GPR); - void *pc = ir_kptr(IR(ir->op2)); - int32_t delta = 1+bc_a(*((const BCIns *)pc - 1)); - as->topslot -= (BCReg)delta; - if ((int32_t)as->topslot < 0) as->topslot = 0; - irt_setmark(IR(REF_BASE)->t); /* Children must not coalesce with BASE reg. */ - /* Need to force a spill on REF_BASE now to update the stack slot. */ - emit_lso(as, ARMI_STR, base, RID_SP, ra_spill(as, IR(REF_BASE))); - emit_setgl(as, base, jit_base); - emit_addptr(as, base, -8*delta); - asm_guardcc(as, CC_NE); - emit_nm(as, ARMI_CMP, RID_TMP, - ra_allock(as, i32ptr(pc), rset_exclude(RSET_GPR, base))); - emit_lso(as, ARMI_LDR, RID_TMP, base, -4); -} - -/* -- Type conversions ---------------------------------------------------- */ - -#if !LJ_SOFTFP -static void asm_tointg(ASMState *as, IRIns *ir, Reg left) -{ - Reg tmp = ra_scratch(as, rset_exclude(RSET_FPR, left)); - Reg dest = ra_dest(as, ir, RSET_GPR); - asm_guardcc(as, CC_NE); - emit_d(as, ARMI_VMRS, 0); - emit_dm(as, ARMI_VCMP_D, (tmp & 15), (left & 15)); - emit_dm(as, ARMI_VCVT_F64_S32, (tmp & 15), (tmp & 15)); - emit_dn(as, ARMI_VMOV_R_S, dest, (tmp & 15)); - emit_dm(as, ARMI_VCVT_S32_F64, (tmp & 15), (left & 15)); -} - -static void asm_tobit(ASMState *as, IRIns *ir) -{ - RegSet allow = RSET_FPR; - Reg left = ra_alloc1(as, ir->op1, allow); - Reg right = ra_alloc1(as, ir->op2, rset_clear(allow, left)); - Reg tmp = ra_scratch(as, rset_clear(allow, right)); - Reg dest = ra_dest(as, ir, RSET_GPR); - emit_dn(as, ARMI_VMOV_R_S, dest, (tmp & 15)); - emit_dnm(as, ARMI_VADD_D, (tmp & 15), (left & 15), (right & 15)); -} -#endif - -static void asm_conv(ASMState *as, IRIns *ir) -{ - IRType st = (IRType)(ir->op2 & IRCONV_SRCMASK); -#if !LJ_SOFTFP - int stfp = (st == IRT_NUM || st == IRT_FLOAT); -#endif - IRRef lref = ir->op1; - /* 64 bit integer conversions are handled by SPLIT. */ - lua_assert(!irt_isint64(ir->t) && !(st == IRT_I64 || st == IRT_U64)); -#if LJ_SOFTFP - /* FP conversions are handled by SPLIT. */ - lua_assert(!irt_isfp(ir->t) && !(st == IRT_NUM || st == IRT_FLOAT)); - /* Can't check for same types: SPLIT uses CONV int.int + BXOR for sfp NEG. */ -#else - lua_assert(irt_type(ir->t) != st); - if (irt_isfp(ir->t)) { - Reg dest = ra_dest(as, ir, RSET_FPR); - if (stfp) { /* FP to FP conversion. */ - emit_dm(as, st == IRT_NUM ? ARMI_VCVT_F32_F64 : ARMI_VCVT_F64_F32, - (dest & 15), (ra_alloc1(as, lref, RSET_FPR) & 15)); - } else { /* Integer to FP conversion. */ - Reg left = ra_alloc1(as, lref, RSET_GPR); - ARMIns ai = irt_isfloat(ir->t) ? - (st == IRT_INT ? ARMI_VCVT_F32_S32 : ARMI_VCVT_F32_U32) : - (st == IRT_INT ? ARMI_VCVT_F64_S32 : ARMI_VCVT_F64_U32); - emit_dm(as, ai, (dest & 15), (dest & 15)); - emit_dn(as, ARMI_VMOV_S_R, left, (dest & 15)); - } - } else if (stfp) { /* FP to integer conversion. */ - if (irt_isguard(ir->t)) { - /* Checked conversions are only supported from number to int. */ - lua_assert(irt_isint(ir->t) && st == IRT_NUM); - asm_tointg(as, ir, ra_alloc1(as, lref, RSET_FPR)); - } else { - Reg left = ra_alloc1(as, lref, RSET_FPR); - Reg tmp = ra_scratch(as, rset_exclude(RSET_FPR, left)); - Reg dest = ra_dest(as, ir, RSET_GPR); - ARMIns ai; - emit_dn(as, ARMI_VMOV_R_S, dest, (tmp & 15)); - ai = irt_isint(ir->t) ? - (st == IRT_NUM ? ARMI_VCVT_S32_F64 : ARMI_VCVT_S32_F32) : - (st == IRT_NUM ? ARMI_VCVT_U32_F64 : ARMI_VCVT_U32_F32); - emit_dm(as, ai, (tmp & 15), (left & 15)); - } - } else -#endif - { - Reg dest = ra_dest(as, ir, RSET_GPR); - if (st >= IRT_I8 && st <= IRT_U16) { /* Extend to 32 bit integer. */ - Reg left = ra_alloc1(as, lref, RSET_GPR); - lua_assert(irt_isint(ir->t) || irt_isu32(ir->t)); - if ((as->flags & JIT_F_ARMV6)) { - ARMIns ai = st == IRT_I8 ? ARMI_SXTB : - st == IRT_U8 ? ARMI_UXTB : - st == IRT_I16 ? ARMI_SXTH : ARMI_UXTH; - emit_dm(as, ai, dest, left); - } else if (st == IRT_U8) { - emit_dn(as, ARMI_AND|ARMI_K12|255, dest, left); - } else { - uint32_t shift = st == IRT_I8 ? 24 : 16; - ARMShift sh = st == IRT_U16 ? ARMSH_LSR : ARMSH_ASR; - emit_dm(as, ARMI_MOV|ARMF_SH(sh, shift), dest, RID_TMP); - emit_dm(as, ARMI_MOV|ARMF_SH(ARMSH_LSL, shift), RID_TMP, left); - } - } else { /* Handle 32/32 bit no-op (cast). */ - ra_leftov(as, dest, lref); /* Do nothing, but may need to move regs. */ - } - } -} - -#if !LJ_SOFTFP && LJ_HASFFI -static void asm_conv64(ASMState *as, IRIns *ir) -{ - IRType st = (IRType)((ir-1)->op2 & IRCONV_SRCMASK); - IRType dt = (((ir-1)->op2 & IRCONV_DSTMASK) >> IRCONV_DSH); - IRCallID id; - CCallInfo ci; - IRRef args[2]; - args[0] = (ir-1)->op1; - args[1] = ir->op1; - if (st == IRT_NUM || st == IRT_FLOAT) { - id = IRCALL_fp64_d2l + ((st == IRT_FLOAT) ? 2 : 0) + (dt - IRT_I64); - ir--; - } else { - id = IRCALL_fp64_l2d + ((dt == IRT_FLOAT) ? 2 : 0) + (st - IRT_I64); - } - ci = lj_ir_callinfo[id]; -#if !LJ_ABI_SOFTFP - ci.flags |= CCI_VARARG; /* These calls don't use the hard-float ABI! */ -#endif - asm_setupresult(as, ir, &ci); - asm_gencall(as, &ci, args); -} -#endif - -static void asm_strto(ASMState *as, IRIns *ir) -{ - const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_strscan_num]; - IRRef args[2]; - Reg rlo = 0, rhi = 0, tmp; - int destused = ra_used(ir); - int32_t ofs = 0; - ra_evictset(as, RSET_SCRATCH); -#if LJ_SOFTFP - if (destused) { - if (ra_hasspill(ir->s) && ra_hasspill((ir+1)->s) && - (ir->s & 1) == 0 && ir->s + 1 == (ir+1)->s) { - int i; - for (i = 0; i < 2; i++) { - Reg r = (ir+i)->r; - if (ra_hasreg(r)) { - ra_free(as, r); - ra_modified(as, r); - emit_spload(as, ir+i, r, sps_scale((ir+i)->s)); - } - } - ofs = sps_scale(ir->s); - destused = 0; - } else { - rhi = ra_dest(as, ir+1, RSET_GPR); - rlo = ra_dest(as, ir, rset_exclude(RSET_GPR, rhi)); - } - } - asm_guardcc(as, CC_EQ); - if (destused) { - emit_lso(as, ARMI_LDR, rhi, RID_SP, 4); - emit_lso(as, ARMI_LDR, rlo, RID_SP, 0); - } -#else - UNUSED(rhi); - if (destused) { - if (ra_hasspill(ir->s)) { - ofs = sps_scale(ir->s); - destused = 0; - if (ra_hasreg(ir->r)) { - ra_free(as, ir->r); - ra_modified(as, ir->r); - emit_spload(as, ir, ir->r, ofs); - } - } else { - rlo = ra_dest(as, ir, RSET_FPR); - } - } - asm_guardcc(as, CC_EQ); - if (destused) - emit_vlso(as, ARMI_VLDR_D, rlo, RID_SP, 0); -#endif - emit_n(as, ARMI_CMP|ARMI_K12|0, RID_RET); /* Test return status. */ - args[0] = ir->op1; /* GCstr *str */ - args[1] = ASMREF_TMP1; /* TValue *n */ - asm_gencall(as, ci, args); - tmp = ra_releasetmp(as, ASMREF_TMP1); - if (ofs == 0) - emit_dm(as, ARMI_MOV, tmp, RID_SP); - else - emit_opk(as, ARMI_ADD, tmp, RID_SP, ofs, RSET_GPR); -} - -/* Get pointer to TValue. */ -static void asm_tvptr(ASMState *as, Reg dest, IRRef ref) -{ - IRIns *ir = IR(ref); - if (irt_isnum(ir->t)) { - if (irref_isk(ref)) { - /* Use the number constant itself as a TValue. */ - ra_allockreg(as, i32ptr(ir_knum(ir)), dest); - } else { -#if LJ_SOFTFP - lua_assert(0); -#else - /* Otherwise force a spill and use the spill slot. */ - emit_opk(as, ARMI_ADD, dest, RID_SP, ra_spill(as, ir), RSET_GPR); -#endif - } - } else { - /* Otherwise use [sp] and [sp+4] to hold the TValue. */ - RegSet allow = rset_exclude(RSET_GPR, dest); - Reg type; - emit_dm(as, ARMI_MOV, dest, RID_SP); - if (!irt_ispri(ir->t)) { - Reg src = ra_alloc1(as, ref, allow); - emit_lso(as, ARMI_STR, src, RID_SP, 0); - } - if ((ir+1)->o == IR_HIOP) - type = ra_alloc1(as, ref+1, allow); - else - type = ra_allock(as, irt_toitype(ir->t), allow); - emit_lso(as, ARMI_STR, type, RID_SP, 4); - } -} - -static void asm_tostr(ASMState *as, IRIns *ir) -{ - IRRef args[2]; - args[0] = ASMREF_L; - as->gcsteps++; - if (irt_isnum(IR(ir->op1)->t) || (ir+1)->o == IR_HIOP) { - const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_str_fromnum]; - args[1] = ASMREF_TMP1; /* const lua_Number * */ - asm_setupresult(as, ir, ci); /* GCstr * */ - asm_gencall(as, ci, args); - asm_tvptr(as, ra_releasetmp(as, ASMREF_TMP1), ir->op1); - } else { - const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_str_fromint]; - args[1] = ir->op1; /* int32_t k */ - asm_setupresult(as, ir, ci); /* GCstr * */ - asm_gencall(as, ci, args); - } -} - -/* -- Memory references --------------------------------------------------- */ - -static void asm_aref(ASMState *as, IRIns *ir) -{ - Reg dest = ra_dest(as, ir, RSET_GPR); - Reg idx, base; - if (irref_isk(ir->op2)) { - IRRef tab = IR(ir->op1)->op1; - int32_t ofs = asm_fuseabase(as, tab); - IRRef refa = ofs ? tab : ir->op1; - uint32_t k = emit_isk12(ARMI_ADD, ofs + 8*IR(ir->op2)->i); - if (k) { - base = ra_alloc1(as, refa, RSET_GPR); - emit_dn(as, ARMI_ADD^k, dest, base); - return; - } - } - base = ra_alloc1(as, ir->op1, RSET_GPR); - idx = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, base)); - emit_dnm(as, ARMI_ADD|ARMF_SH(ARMSH_LSL, 3), dest, base, idx); -} - -/* Inlined hash lookup. Specialized for key type and for const keys. -** The equivalent C code is: -** Node *n = hashkey(t, key); -** do { -** if (lj_obj_equal(&n->key, key)) return &n->val; -** } while ((n = nextnode(n))); -** return niltv(L); -*/ -static void asm_href(ASMState *as, IRIns *ir, IROp merge) -{ - RegSet allow = RSET_GPR; - int destused = ra_used(ir); - Reg dest = ra_dest(as, ir, allow); - Reg tab = ra_alloc1(as, ir->op1, rset_clear(allow, dest)); - Reg key = 0, keyhi = 0, keynumhi = RID_NONE, tmp = RID_TMP; - IRRef refkey = ir->op2; - IRIns *irkey = IR(refkey); - IRType1 kt = irkey->t; - int32_t k = 0, khi = emit_isk12(ARMI_CMP, irt_toitype(kt)); - uint32_t khash; - MCLabel l_end, l_loop; - rset_clear(allow, tab); - if (!irref_isk(refkey) || irt_isstr(kt)) { -#if LJ_SOFTFP - key = ra_alloc1(as, refkey, allow); - rset_clear(allow, key); - if (irkey[1].o == IR_HIOP) { - if (ra_hasreg((irkey+1)->r)) { - keynumhi = (irkey+1)->r; - keyhi = RID_TMP; - ra_noweak(as, keynumhi); - } else { - keyhi = keynumhi = ra_allocref(as, refkey+1, allow); - } - rset_clear(allow, keynumhi); - khi = 0; - } -#else - if (irt_isnum(kt)) { - key = ra_scratch(as, allow); - rset_clear(allow, key); - keyhi = keynumhi = ra_scratch(as, allow); - rset_clear(allow, keyhi); - khi = 0; - } else { - key = ra_alloc1(as, refkey, allow); - rset_clear(allow, key); - } -#endif - } else if (irt_isnum(kt)) { - int32_t val = (int32_t)ir_knum(irkey)->u32.lo; - k = emit_isk12(ARMI_CMP, val); - if (!k) { - key = ra_allock(as, val, allow); - rset_clear(allow, key); - } - val = (int32_t)ir_knum(irkey)->u32.hi; - khi = emit_isk12(ARMI_CMP, val); - if (!khi) { - keyhi = ra_allock(as, val, allow); - rset_clear(allow, keyhi); - } - } else if (!irt_ispri(kt)) { - k = emit_isk12(ARMI_CMP, irkey->i); - if (!k) { - key = ra_alloc1(as, refkey, allow); - rset_clear(allow, key); - } - } - if (!irt_ispri(kt)) - tmp = ra_scratchpair(as, allow); - - /* Key not found in chain: jump to exit (if merged) or load niltv. */ - l_end = emit_label(as); - as->invmcp = NULL; - if (merge == IR_NE) - asm_guardcc(as, CC_AL); - else if (destused) - emit_loada(as, dest, niltvg(J2G(as->J))); - - /* Follow hash chain until the end. */ - l_loop = --as->mcp; - emit_n(as, ARMI_CMP|ARMI_K12|0, dest); - emit_lso(as, ARMI_LDR, dest, dest, (int32_t)offsetof(Node, next)); - - /* Type and value comparison. */ - if (merge == IR_EQ) - asm_guardcc(as, CC_EQ); - else - emit_branch(as, ARMF_CC(ARMI_B, CC_EQ), l_end); - if (!irt_ispri(kt)) { - emit_nm(as, ARMF_CC(ARMI_CMP, CC_EQ)^k, tmp, key); - emit_nm(as, ARMI_CMP^khi, tmp+1, keyhi); - emit_lsox(as, ARMI_LDRD, tmp, dest, (int32_t)offsetof(Node, key)); - } else { - emit_n(as, ARMI_CMP^khi, tmp); - emit_lso(as, ARMI_LDR, tmp, dest, (int32_t)offsetof(Node, key.it)); - } - *l_loop = ARMF_CC(ARMI_B, CC_NE) | ((as->mcp-l_loop-2) & 0x00ffffffu); - - /* Load main position relative to tab->node into dest. */ - khash = irref_isk(refkey) ? ir_khash(irkey) : 1; - if (khash == 0) { - emit_lso(as, ARMI_LDR, dest, tab, (int32_t)offsetof(GCtab, node)); - } else { - emit_dnm(as, ARMI_ADD|ARMF_SH(ARMSH_LSL, 3), dest, dest, tmp); - emit_dnm(as, ARMI_ADD|ARMF_SH(ARMSH_LSL, 1), tmp, tmp, tmp); - if (irt_isstr(kt)) { /* Fetch of str->hash is cheaper than ra_allock. */ - emit_dnm(as, ARMI_AND, tmp, tmp+1, RID_TMP); - emit_lso(as, ARMI_LDR, dest, tab, (int32_t)offsetof(GCtab, node)); - emit_lso(as, ARMI_LDR, tmp+1, key, (int32_t)offsetof(GCstr, hash)); - emit_lso(as, ARMI_LDR, RID_TMP, tab, (int32_t)offsetof(GCtab, hmask)); - } else if (irref_isk(refkey)) { - emit_opk(as, ARMI_AND, tmp, RID_TMP, (int32_t)khash, - rset_exclude(rset_exclude(RSET_GPR, tab), dest)); - emit_lso(as, ARMI_LDR, dest, tab, (int32_t)offsetof(GCtab, node)); - emit_lso(as, ARMI_LDR, RID_TMP, tab, (int32_t)offsetof(GCtab, hmask)); - } else { /* Must match with hash*() in lj_tab.c. */ - if (ra_hasreg(keynumhi)) { /* Canonicalize +-0.0 to 0.0. */ - if (keyhi == RID_TMP) - emit_dm(as, ARMF_CC(ARMI_MOV, CC_NE), keyhi, keynumhi); - emit_d(as, ARMF_CC(ARMI_MOV, CC_EQ)|ARMI_K12|0, keyhi); - } - emit_dnm(as, ARMI_AND, tmp, tmp, RID_TMP); - emit_dnm(as, ARMI_SUB|ARMF_SH(ARMSH_ROR, 32-HASH_ROT3), tmp, tmp, tmp+1); - emit_lso(as, ARMI_LDR, dest, tab, (int32_t)offsetof(GCtab, node)); - emit_dnm(as, ARMI_EOR|ARMF_SH(ARMSH_ROR, 32-((HASH_ROT2+HASH_ROT1)&31)), - tmp, tmp+1, tmp); - emit_lso(as, ARMI_LDR, RID_TMP, tab, (int32_t)offsetof(GCtab, hmask)); - emit_dnm(as, ARMI_SUB|ARMF_SH(ARMSH_ROR, 32-HASH_ROT1), tmp+1, tmp+1, tmp); - if (ra_hasreg(keynumhi)) { - emit_dnm(as, ARMI_EOR, tmp+1, tmp, key); - emit_dnm(as, ARMI_ORR|ARMI_S, RID_TMP, tmp, key); /* Test for +-0.0. */ - emit_dnm(as, ARMI_ADD, tmp, keynumhi, keynumhi); -#if !LJ_SOFTFP - emit_dnm(as, ARMI_VMOV_RR_D, key, keynumhi, - (ra_alloc1(as, refkey, RSET_FPR) & 15)); -#endif - } else { - emit_dnm(as, ARMI_EOR, tmp+1, tmp, key); - emit_opk(as, ARMI_ADD, tmp, key, (int32_t)HASH_BIAS, - rset_exclude(rset_exclude(RSET_GPR, tab), key)); - } - } - } -} - -static void asm_hrefk(ASMState *as, IRIns *ir) -{ - IRIns *kslot = IR(ir->op2); - IRIns *irkey = IR(kslot->op1); - int32_t ofs = (int32_t)(kslot->op2 * sizeof(Node)); - int32_t kofs = ofs + (int32_t)offsetof(Node, key); - Reg dest = (ra_used(ir) || ofs > 4095) ? ra_dest(as, ir, RSET_GPR) : RID_NONE; - Reg node = ra_alloc1(as, ir->op1, RSET_GPR); - Reg key = RID_NONE, type = RID_TMP, idx = node; - RegSet allow = rset_exclude(RSET_GPR, node); - lua_assert(ofs % sizeof(Node) == 0); - if (ofs > 4095) { - idx = dest; - rset_clear(allow, dest); - kofs = (int32_t)offsetof(Node, key); - } else if (ra_hasreg(dest)) { - emit_opk(as, ARMI_ADD, dest, node, ofs, allow); - } - asm_guardcc(as, CC_NE); - if (!irt_ispri(irkey->t)) { - RegSet even = (as->freeset & allow); - even = even & (even >> 1) & RSET_GPREVEN; - if (even) { - key = ra_scratch(as, even); - if (rset_test(as->freeset, key+1)) { - type = key+1; - ra_modified(as, type); - } - } else { - key = ra_scratch(as, allow); - } - rset_clear(allow, key); - } - rset_clear(allow, type); - if (irt_isnum(irkey->t)) { - emit_opk(as, ARMF_CC(ARMI_CMP, CC_EQ), 0, type, - (int32_t)ir_knum(irkey)->u32.hi, allow); - emit_opk(as, ARMI_CMP, 0, key, - (int32_t)ir_knum(irkey)->u32.lo, allow); - } else { - if (ra_hasreg(key)) - emit_opk(as, ARMF_CC(ARMI_CMP, CC_EQ), 0, key, irkey->i, allow); - emit_n(as, ARMI_CMN|ARMI_K12|-irt_toitype(irkey->t), type); - } - emit_lso(as, ARMI_LDR, type, idx, kofs+4); - if (ra_hasreg(key)) emit_lso(as, ARMI_LDR, key, idx, kofs); - if (ofs > 4095) - emit_opk(as, ARMI_ADD, dest, node, ofs, RSET_GPR); -} - -static void asm_newref(ASMState *as, IRIns *ir) -{ - const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_tab_newkey]; - IRRef args[3]; - if (ir->r == RID_SINK) - return; - args[0] = ASMREF_L; /* lua_State *L */ - args[1] = ir->op1; /* GCtab *t */ - args[2] = ASMREF_TMP1; /* cTValue *key */ - asm_setupresult(as, ir, ci); /* TValue * */ - asm_gencall(as, ci, args); - asm_tvptr(as, ra_releasetmp(as, ASMREF_TMP1), ir->op2); -} - -static void asm_uref(ASMState *as, IRIns *ir) -{ - /* NYI: Check that UREFO is still open and not aliasing a slot. */ - Reg dest = ra_dest(as, ir, RSET_GPR); - if (irref_isk(ir->op1)) { - GCfunc *fn = ir_kfunc(IR(ir->op1)); - MRef *v = &gcref(fn->l.uvptr[(ir->op2 >> 8)])->uv.v; - emit_lsptr(as, ARMI_LDR, dest, v); - } else { - Reg uv = ra_scratch(as, RSET_GPR); - Reg func = ra_alloc1(as, ir->op1, RSET_GPR); - if (ir->o == IR_UREFC) { - asm_guardcc(as, CC_NE); - emit_n(as, ARMI_CMP|ARMI_K12|1, RID_TMP); - emit_opk(as, ARMI_ADD, dest, uv, - (int32_t)offsetof(GCupval, tv), RSET_GPR); - emit_lso(as, ARMI_LDRB, RID_TMP, uv, (int32_t)offsetof(GCupval, closed)); - } else { - emit_lso(as, ARMI_LDR, dest, uv, (int32_t)offsetof(GCupval, v)); - } - emit_lso(as, ARMI_LDR, uv, func, - (int32_t)offsetof(GCfuncL, uvptr) + 4*(int32_t)(ir->op2 >> 8)); - } -} - -static void asm_fref(ASMState *as, IRIns *ir) -{ - UNUSED(as); UNUSED(ir); - lua_assert(!ra_used(ir)); -} - -static void asm_strref(ASMState *as, IRIns *ir) -{ - Reg dest = ra_dest(as, ir, RSET_GPR); - IRRef ref = ir->op2, refk = ir->op1; - Reg r; - if (irref_isk(ref)) { - IRRef tmp = refk; refk = ref; ref = tmp; - } else if (!irref_isk(refk)) { - uint32_t k, m = ARMI_K12|sizeof(GCstr); - Reg right, left = ra_alloc1(as, ir->op1, RSET_GPR); - IRIns *irr = IR(ir->op2); - if (ra_hasreg(irr->r)) { - ra_noweak(as, irr->r); - right = irr->r; - } else if (mayfuse(as, irr->op2) && - irr->o == IR_ADD && irref_isk(irr->op2) && - (k = emit_isk12(ARMI_ADD, - (int32_t)sizeof(GCstr) + IR(irr->op2)->i))) { - m = k; - right = ra_alloc1(as, irr->op1, rset_exclude(RSET_GPR, left)); - } else { - right = ra_allocref(as, ir->op2, rset_exclude(RSET_GPR, left)); - } - emit_dn(as, ARMI_ADD^m, dest, dest); - emit_dnm(as, ARMI_ADD, dest, left, right); - return; - } - r = ra_alloc1(as, ref, RSET_GPR); - emit_opk(as, ARMI_ADD, dest, r, - sizeof(GCstr) + IR(refk)->i, rset_exclude(RSET_GPR, r)); -} - -/* -- Loads and stores ---------------------------------------------------- */ - -static ARMIns asm_fxloadins(IRIns *ir) -{ - switch (irt_type(ir->t)) { - case IRT_I8: return ARMI_LDRSB; - case IRT_U8: return ARMI_LDRB; - case IRT_I16: return ARMI_LDRSH; - case IRT_U16: return ARMI_LDRH; - case IRT_NUM: lua_assert(!LJ_SOFTFP); return ARMI_VLDR_D; - case IRT_FLOAT: if (!LJ_SOFTFP) return ARMI_VLDR_S; - default: return ARMI_LDR; - } -} - -static ARMIns asm_fxstoreins(IRIns *ir) -{ - switch (irt_type(ir->t)) { - case IRT_I8: case IRT_U8: return ARMI_STRB; - case IRT_I16: case IRT_U16: return ARMI_STRH; - case IRT_NUM: lua_assert(!LJ_SOFTFP); return ARMI_VSTR_D; - case IRT_FLOAT: if (!LJ_SOFTFP) return ARMI_VSTR_S; - default: return ARMI_STR; - } -} - -static void asm_fload(ASMState *as, IRIns *ir) -{ - Reg dest = ra_dest(as, ir, RSET_GPR); - Reg idx = ra_alloc1(as, ir->op1, RSET_GPR); - ARMIns ai = asm_fxloadins(ir); - int32_t ofs; - if (ir->op2 == IRFL_TAB_ARRAY) { - ofs = asm_fuseabase(as, ir->op1); - if (ofs) { /* Turn the t->array load into an add for colocated arrays. */ - emit_dn(as, ARMI_ADD|ARMI_K12|ofs, dest, idx); - return; - } - } - ofs = field_ofs[ir->op2]; - if ((ai & 0x04000000)) - emit_lso(as, ai, dest, idx, ofs); - else - emit_lsox(as, ai, dest, idx, ofs); -} - -static void asm_fstore(ASMState *as, IRIns *ir) -{ - if (ir->r != RID_SINK) { - Reg src = ra_alloc1(as, ir->op2, RSET_GPR); - IRIns *irf = IR(ir->op1); - Reg idx = ra_alloc1(as, irf->op1, rset_exclude(RSET_GPR, src)); - int32_t ofs = field_ofs[irf->op2]; - ARMIns ai = asm_fxstoreins(ir); - if ((ai & 0x04000000)) - emit_lso(as, ai, src, idx, ofs); - else - emit_lsox(as, ai, src, idx, ofs); - } -} - -static void asm_xload(ASMState *as, IRIns *ir) -{ - Reg dest = ra_dest(as, ir, - (!LJ_SOFTFP && irt_isfp(ir->t)) ? RSET_FPR : RSET_GPR); - lua_assert(!(ir->op2 & IRXLOAD_UNALIGNED)); - asm_fusexref(as, asm_fxloadins(ir), dest, ir->op1, RSET_GPR, 0); -} - -static void asm_xstore(ASMState *as, IRIns *ir, int32_t ofs) -{ - if (ir->r != RID_SINK) { - Reg src = ra_alloc1(as, ir->op2, - (!LJ_SOFTFP && irt_isfp(ir->t)) ? RSET_FPR : RSET_GPR); - asm_fusexref(as, asm_fxstoreins(ir), src, ir->op1, - rset_exclude(RSET_GPR, src), ofs); - } -} - -static void asm_ahuvload(ASMState *as, IRIns *ir) -{ - int hiop = (LJ_SOFTFP && (ir+1)->o == IR_HIOP); - IRType t = hiop ? IRT_NUM : irt_type(ir->t); - Reg dest = RID_NONE, type = RID_NONE, idx; - RegSet allow = RSET_GPR; - int32_t ofs = 0; - if (hiop && ra_used(ir+1)) { - type = ra_dest(as, ir+1, allow); - rset_clear(allow, type); - } - if (ra_used(ir)) { - lua_assert((LJ_SOFTFP ? 0 : irt_isnum(ir->t)) || - irt_isint(ir->t) || irt_isaddr(ir->t)); - dest = ra_dest(as, ir, (!LJ_SOFTFP && t == IRT_NUM) ? RSET_FPR : allow); - rset_clear(allow, dest); - } - idx = asm_fuseahuref(as, ir->op1, &ofs, allow, - (!LJ_SOFTFP && t == IRT_NUM) ? 1024 : 4096); - if (!hiop || type == RID_NONE) { - rset_clear(allow, idx); - if (ofs < 256 && ra_hasreg(dest) && (dest & 1) == 0 && - rset_test((as->freeset & allow), dest+1)) { - type = dest+1; - ra_modified(as, type); - } else { - type = RID_TMP; - } - } - asm_guardcc(as, t == IRT_NUM ? CC_HS : CC_NE); - emit_n(as, ARMI_CMN|ARMI_K12|-irt_toitype_(t), type); - if (ra_hasreg(dest)) { -#if !LJ_SOFTFP - if (t == IRT_NUM) - emit_vlso(as, ARMI_VLDR_D, dest, idx, ofs); - else -#endif - emit_lso(as, ARMI_LDR, dest, idx, ofs); - } - emit_lso(as, ARMI_LDR, type, idx, ofs+4); -} - -static void asm_ahustore(ASMState *as, IRIns *ir) -{ - if (ir->r != RID_SINK) { - RegSet allow = RSET_GPR; - Reg idx, src = RID_NONE, type = RID_NONE; - int32_t ofs = 0; -#if !LJ_SOFTFP - if (irt_isnum(ir->t)) { - src = ra_alloc1(as, ir->op2, RSET_FPR); - idx = asm_fuseahuref(as, ir->op1, &ofs, allow, 1024); - emit_vlso(as, ARMI_VSTR_D, src, idx, ofs); - } else -#endif - { - int hiop = (LJ_SOFTFP && (ir+1)->o == IR_HIOP); - if (!irt_ispri(ir->t)) { - src = ra_alloc1(as, ir->op2, allow); - rset_clear(allow, src); - } - if (hiop) - type = ra_alloc1(as, (ir+1)->op2, allow); - else - type = ra_allock(as, (int32_t)irt_toitype(ir->t), allow); - idx = asm_fuseahuref(as, ir->op1, &ofs, rset_exclude(allow, type), 4096); - if (ra_hasreg(src)) emit_lso(as, ARMI_STR, src, idx, ofs); - emit_lso(as, ARMI_STR, type, idx, ofs+4); - } - } -} - -static void asm_sload(ASMState *as, IRIns *ir) -{ - int32_t ofs = 8*((int32_t)ir->op1-1) + ((ir->op2 & IRSLOAD_FRAME) ? 4 : 0); - int hiop = (LJ_SOFTFP && (ir+1)->o == IR_HIOP); - IRType t = hiop ? IRT_NUM : irt_type(ir->t); - Reg dest = RID_NONE, type = RID_NONE, base; - RegSet allow = RSET_GPR; - lua_assert(!(ir->op2 & IRSLOAD_PARENT)); /* Handled by asm_head_side(). */ - lua_assert(irt_isguard(ir->t) || !(ir->op2 & IRSLOAD_TYPECHECK)); -#if LJ_SOFTFP - lua_assert(!(ir->op2 & IRSLOAD_CONVERT)); /* Handled by LJ_SOFTFP SPLIT. */ - if (hiop && ra_used(ir+1)) { - type = ra_dest(as, ir+1, allow); - rset_clear(allow, type); - } -#else - if ((ir->op2 & IRSLOAD_CONVERT) && irt_isguard(ir->t) && t == IRT_INT) { - dest = ra_scratch(as, RSET_FPR); - asm_tointg(as, ir, dest); - t = IRT_NUM; /* Continue with a regular number type check. */ - } else -#endif - if (ra_used(ir)) { - Reg tmp = RID_NONE; - if ((ir->op2 & IRSLOAD_CONVERT)) - tmp = ra_scratch(as, t == IRT_INT ? RSET_FPR : RSET_GPR); - lua_assert((LJ_SOFTFP ? 0 : irt_isnum(ir->t)) || - irt_isint(ir->t) || irt_isaddr(ir->t)); - dest = ra_dest(as, ir, (!LJ_SOFTFP && t == IRT_NUM) ? RSET_FPR : allow); - rset_clear(allow, dest); - base = ra_alloc1(as, REF_BASE, allow); - if ((ir->op2 & IRSLOAD_CONVERT)) { - if (t == IRT_INT) { - emit_dn(as, ARMI_VMOV_R_S, dest, (tmp & 15)); - emit_dm(as, ARMI_VCVT_S32_F64, (tmp & 15), (tmp & 15)); - t = IRT_NUM; /* Check for original type. */ - } else { - emit_dm(as, ARMI_VCVT_F64_S32, (dest & 15), (dest & 15)); - emit_dn(as, ARMI_VMOV_S_R, tmp, (dest & 15)); - t = IRT_INT; /* Check for original type. */ - } - dest = tmp; - } - goto dotypecheck; - } - base = ra_alloc1(as, REF_BASE, allow); -dotypecheck: - rset_clear(allow, base); - if ((ir->op2 & IRSLOAD_TYPECHECK)) { - if (ra_noreg(type)) { - if (ofs < 256 && ra_hasreg(dest) && (dest & 1) == 0 && - rset_test((as->freeset & allow), dest+1)) { - type = dest+1; - ra_modified(as, type); - } else { - type = RID_TMP; - } - } - asm_guardcc(as, t == IRT_NUM ? CC_HS : CC_NE); - emit_n(as, ARMI_CMN|ARMI_K12|-irt_toitype_(t), type); - } - if (ra_hasreg(dest)) { -#if !LJ_SOFTFP - if (t == IRT_NUM) { - if (ofs < 1024) { - emit_vlso(as, ARMI_VLDR_D, dest, base, ofs); - } else { - if (ra_hasreg(type)) emit_lso(as, ARMI_LDR, type, base, ofs+4); - emit_vlso(as, ARMI_VLDR_D, dest, RID_TMP, 0); - emit_opk(as, ARMI_ADD, RID_TMP, base, ofs, allow); - return; - } - } else -#endif - emit_lso(as, ARMI_LDR, dest, base, ofs); - } - if (ra_hasreg(type)) emit_lso(as, ARMI_LDR, type, base, ofs+4); -} - -/* -- Allocations --------------------------------------------------------- */ - -#if LJ_HASFFI -static void asm_cnew(ASMState *as, IRIns *ir) -{ - CTState *cts = ctype_ctsG(J2G(as->J)); - CTypeID ctypeid = (CTypeID)IR(ir->op1)->i; - CTSize sz = (ir->o == IR_CNEWI || ir->op2 == REF_NIL) ? - lj_ctype_size(cts, ctypeid) : (CTSize)IR(ir->op2)->i; - const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_mem_newgco]; - IRRef args[2]; - RegSet allow = (RSET_GPR & ~RSET_SCRATCH); - RegSet drop = RSET_SCRATCH; - lua_assert(sz != CTSIZE_INVALID); - - args[0] = ASMREF_L; /* lua_State *L */ - args[1] = ASMREF_TMP1; /* MSize size */ - as->gcsteps++; - - if (ra_hasreg(ir->r)) - rset_clear(drop, ir->r); /* Dest reg handled below. */ - ra_evictset(as, drop); - if (ra_used(ir)) - ra_destreg(as, ir, RID_RET); /* GCcdata * */ - - /* Initialize immutable cdata object. */ - if (ir->o == IR_CNEWI) { - int32_t ofs = sizeof(GCcdata); - lua_assert(sz == 4 || sz == 8); - if (sz == 8) { - ofs += 4; ir++; - lua_assert(ir->o == IR_HIOP); - } - for (;;) { - Reg r = ra_alloc1(as, ir->op2, allow); - emit_lso(as, ARMI_STR, r, RID_RET, ofs); - rset_clear(allow, r); - if (ofs == sizeof(GCcdata)) break; - ofs -= 4; ir--; - } - } - /* Initialize gct and ctypeid. lj_mem_newgco() already sets marked. */ - { - uint32_t k = emit_isk12(ARMI_MOV, ctypeid); - Reg r = k ? RID_R1 : ra_allock(as, ctypeid, allow); - emit_lso(as, ARMI_STRB, RID_TMP, RID_RET, offsetof(GCcdata, gct)); - emit_lsox(as, ARMI_STRH, r, RID_RET, offsetof(GCcdata, ctypeid)); - emit_d(as, ARMI_MOV|ARMI_K12|~LJ_TCDATA, RID_TMP); - if (k) emit_d(as, ARMI_MOV^k, RID_R1); - } - asm_gencall(as, ci, args); - ra_allockreg(as, (int32_t)(sz+sizeof(GCcdata)), - ra_releasetmp(as, ASMREF_TMP1)); -} -#else -#define asm_cnew(as, ir) ((void)0) -#endif - -/* -- Write barriers ------------------------------------------------------ */ - -static void asm_tbar(ASMState *as, IRIns *ir) -{ - Reg tab = ra_alloc1(as, ir->op1, RSET_GPR); - Reg link = ra_scratch(as, rset_exclude(RSET_GPR, tab)); - Reg gr = ra_allock(as, i32ptr(J2G(as->J)), - rset_exclude(rset_exclude(RSET_GPR, tab), link)); - Reg mark = RID_TMP; - MCLabel l_end = emit_label(as); - emit_lso(as, ARMI_STR, link, tab, (int32_t)offsetof(GCtab, gclist)); - emit_lso(as, ARMI_STRB, mark, tab, (int32_t)offsetof(GCtab, marked)); - emit_lso(as, ARMI_STR, tab, gr, - (int32_t)offsetof(global_State, gc.grayagain)); - emit_dn(as, ARMI_BIC|ARMI_K12|LJ_GC_BLACK, mark, mark); - emit_lso(as, ARMI_LDR, link, gr, - (int32_t)offsetof(global_State, gc.grayagain)); - emit_branch(as, ARMF_CC(ARMI_B, CC_EQ), l_end); - emit_n(as, ARMI_TST|ARMI_K12|LJ_GC_BLACK, mark); - emit_lso(as, ARMI_LDRB, mark, tab, (int32_t)offsetof(GCtab, marked)); -} - -static void asm_obar(ASMState *as, IRIns *ir) -{ - const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_gc_barrieruv]; - IRRef args[2]; - MCLabel l_end; - Reg obj, val, tmp; - /* No need for other object barriers (yet). */ - lua_assert(IR(ir->op1)->o == IR_UREFC); - ra_evictset(as, RSET_SCRATCH); - l_end = emit_label(as); - args[0] = ASMREF_TMP1; /* global_State *g */ - args[1] = ir->op1; /* TValue *tv */ - asm_gencall(as, ci, args); - if ((l_end[-1] >> 28) == CC_AL) - l_end[-1] = ARMF_CC(l_end[-1], CC_NE); - else - emit_branch(as, ARMF_CC(ARMI_B, CC_EQ), l_end); - ra_allockreg(as, i32ptr(J2G(as->J)), ra_releasetmp(as, ASMREF_TMP1)); - obj = IR(ir->op1)->r; - tmp = ra_scratch(as, rset_exclude(RSET_GPR, obj)); - emit_n(as, ARMF_CC(ARMI_TST, CC_NE)|ARMI_K12|LJ_GC_BLACK, tmp); - emit_n(as, ARMI_TST|ARMI_K12|LJ_GC_WHITES, RID_TMP); - val = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, obj)); - emit_lso(as, ARMI_LDRB, tmp, obj, - (int32_t)offsetof(GCupval, marked)-(int32_t)offsetof(GCupval, tv)); - emit_lso(as, ARMI_LDRB, RID_TMP, val, (int32_t)offsetof(GChead, marked)); -} - -/* -- Arithmetic and logic operations ------------------------------------- */ - -#if !LJ_SOFTFP -static void asm_fparith(ASMState *as, IRIns *ir, ARMIns ai) -{ - Reg dest = ra_dest(as, ir, RSET_FPR); - Reg right, left = ra_alloc2(as, ir, RSET_FPR); - right = (left >> 8); left &= 255; - emit_dnm(as, ai, (dest & 15), (left & 15), (right & 15)); -} - -static void asm_fpunary(ASMState *as, IRIns *ir, ARMIns ai) -{ - Reg dest = ra_dest(as, ir, RSET_FPR); - Reg left = ra_hintalloc(as, ir->op1, dest, RSET_FPR); - emit_dm(as, ai, (dest & 15), (left & 15)); -} - -static int asm_fpjoin_pow(ASMState *as, IRIns *ir) -{ - IRIns *irp = IR(ir->op1); - if (irp == ir-1 && irp->o == IR_MUL && !ra_used(irp)) { - IRIns *irpp = IR(irp->op1); - if (irpp == ir-2 && irpp->o == IR_FPMATH && - irpp->op2 == IRFPM_LOG2 && !ra_used(irpp)) { - const CCallInfo *ci = &lj_ir_callinfo[IRCALL_pow]; - IRRef args[2]; - args[0] = irpp->op1; - args[1] = irp->op2; - asm_setupresult(as, ir, ci); - asm_gencall(as, ci, args); - return 1; - } - } - return 0; -} -#endif - -static int asm_swapops(ASMState *as, IRRef lref, IRRef rref) -{ - IRIns *ir; - if (irref_isk(rref)) - return 0; /* Don't swap constants to the left. */ - if (irref_isk(lref)) - return 1; /* But swap constants to the right. */ - ir = IR(rref); - if ((ir->o >= IR_BSHL && ir->o <= IR_BROR) || - (ir->o == IR_ADD && ir->op1 == ir->op2)) - return 0; /* Don't swap fusable operands to the left. */ - ir = IR(lref); - if ((ir->o >= IR_BSHL && ir->o <= IR_BROR) || - (ir->o == IR_ADD && ir->op1 == ir->op2)) - return 1; /* But swap fusable operands to the right. */ - return 0; /* Otherwise don't swap. */ -} - -static void asm_intop(ASMState *as, IRIns *ir, ARMIns ai) -{ - IRRef lref = ir->op1, rref = ir->op2; - Reg left, dest = ra_dest(as, ir, RSET_GPR); - uint32_t m; - if (asm_swapops(as, lref, rref)) { - IRRef tmp = lref; lref = rref; rref = tmp; - if ((ai & ~ARMI_S) == ARMI_SUB || (ai & ~ARMI_S) == ARMI_SBC) - ai ^= (ARMI_SUB^ARMI_RSB); - } - left = ra_hintalloc(as, lref, dest, RSET_GPR); - m = asm_fuseopm(as, ai, rref, rset_exclude(RSET_GPR, left)); - if (irt_isguard(ir->t)) { /* For IR_ADDOV etc. */ - asm_guardcc(as, CC_VS); - ai |= ARMI_S; - } - emit_dn(as, ai^m, dest, left); -} - -static void asm_intop_s(ASMState *as, IRIns *ir, ARMIns ai) -{ - if (as->flagmcp == as->mcp) { /* Drop cmp r, #0. */ - as->flagmcp = NULL; - as->mcp++; - ai |= ARMI_S; - } - asm_intop(as, ir, ai); -} - -static void asm_bitop(ASMState *as, IRIns *ir, ARMIns ai) -{ - if (as->flagmcp == as->mcp) { /* Try to drop cmp r, #0. */ - uint32_t cc = (as->mcp[1] >> 28); - as->flagmcp = NULL; - if (cc <= CC_NE) { - as->mcp++; - ai |= ARMI_S; - } else if (cc == CC_GE) { - *++as->mcp ^= ((CC_GE^CC_PL) << 28); - ai |= ARMI_S; - } else if (cc == CC_LT) { - *++as->mcp ^= ((CC_LT^CC_MI) << 28); - ai |= ARMI_S; - } /* else: other conds don't work with bit ops. */ - } - if (ir->op2 == 0) { - Reg dest = ra_dest(as, ir, RSET_GPR); - uint32_t m = asm_fuseopm(as, ai, ir->op1, RSET_GPR); - emit_d(as, ai^m, dest); - } else { - /* NYI: Turn BAND !k12 into uxtb, uxth or bfc or shl+shr. */ - asm_intop(as, ir, ai); - } -} - -static void asm_intneg(ASMState *as, IRIns *ir, ARMIns ai) -{ - Reg dest = ra_dest(as, ir, RSET_GPR); - Reg left = ra_hintalloc(as, ir->op1, dest, RSET_GPR); - emit_dn(as, ai|ARMI_K12|0, dest, left); -} - -/* NYI: use add/shift for MUL(OV) with constants. FOLD only does 2^k. */ -static void asm_intmul(ASMState *as, IRIns *ir) -{ - Reg dest = ra_dest(as, ir, RSET_GPR); - Reg left = ra_alloc1(as, ir->op1, rset_exclude(RSET_GPR, dest)); - Reg right = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, left)); - Reg tmp = RID_NONE; - /* ARMv5 restriction: dest != left and dest_hi != left. */ - if (dest == left && left != right) { left = right; right = dest; } - if (irt_isguard(ir->t)) { /* IR_MULOV */ - if (!(as->flags & JIT_F_ARMV6) && dest == left) - tmp = left = ra_scratch(as, rset_exclude(RSET_GPR, left)); - asm_guardcc(as, CC_NE); - emit_nm(as, ARMI_TEQ|ARMF_SH(ARMSH_ASR, 31), RID_TMP, dest); - emit_dnm(as, ARMI_SMULL|ARMF_S(right), dest, RID_TMP, left); - } else { - if (!(as->flags & JIT_F_ARMV6) && dest == left) tmp = left = RID_TMP; - emit_nm(as, ARMI_MUL|ARMF_S(right), dest, left); - } - /* Only need this for the dest == left == right case. */ - if (ra_hasreg(tmp)) emit_dm(as, ARMI_MOV, tmp, right); -} - -static void asm_add(ASMState *as, IRIns *ir) -{ -#if !LJ_SOFTFP - if (irt_isnum(ir->t)) { - if (!asm_fusemadd(as, ir, ARMI_VMLA_D, ARMI_VMLA_D)) - asm_fparith(as, ir, ARMI_VADD_D); - return; - } -#endif - asm_intop_s(as, ir, ARMI_ADD); -} - -static void asm_sub(ASMState *as, IRIns *ir) -{ -#if !LJ_SOFTFP - if (irt_isnum(ir->t)) { - if (!asm_fusemadd(as, ir, ARMI_VNMLS_D, ARMI_VMLS_D)) - asm_fparith(as, ir, ARMI_VSUB_D); - return; - } -#endif - asm_intop_s(as, ir, ARMI_SUB); -} - -static void asm_mul(ASMState *as, IRIns *ir) -{ -#if !LJ_SOFTFP - if (irt_isnum(ir->t)) { - asm_fparith(as, ir, ARMI_VMUL_D); - return; - } -#endif - asm_intmul(as, ir); -} - -static void asm_neg(ASMState *as, IRIns *ir) -{ -#if !LJ_SOFTFP - if (irt_isnum(ir->t)) { - asm_fpunary(as, ir, ARMI_VNEG_D); - return; - } -#endif - asm_intneg(as, ir, ARMI_RSB); -} - -static void asm_callid(ASMState *as, IRIns *ir, IRCallID id) -{ - const CCallInfo *ci = &lj_ir_callinfo[id]; - IRRef args[2]; - args[0] = ir->op1; - args[1] = ir->op2; - asm_setupresult(as, ir, ci); - asm_gencall(as, ci, args); -} - -#if !LJ_SOFTFP -static void asm_callround(ASMState *as, IRIns *ir, int id) -{ - /* The modified regs must match with the *.dasc implementation. */ - RegSet drop = RID2RSET(RID_R0)|RID2RSET(RID_R1)|RID2RSET(RID_R2)| - RID2RSET(RID_R3)|RID2RSET(RID_R12); - RegSet of; - Reg dest, src; - ra_evictset(as, drop); - dest = ra_dest(as, ir, RSET_FPR); - emit_dnm(as, ARMI_VMOV_D_RR, RID_RETLO, RID_RETHI, (dest & 15)); - emit_call(as, id == IRFPM_FLOOR ? (void *)lj_vm_floor_sf : - id == IRFPM_CEIL ? (void *)lj_vm_ceil_sf : - (void *)lj_vm_trunc_sf); - /* Workaround to protect argument GPRs from being used for remat. */ - of = as->freeset; - as->freeset &= ~RSET_RANGE(RID_R0, RID_R1+1); - as->cost[RID_R0] = as->cost[RID_R1] = REGCOST(~0u, ASMREF_L); - src = ra_alloc1(as, ir->op1, RSET_FPR); /* May alloc GPR to remat FPR. */ - as->freeset |= (of & RSET_RANGE(RID_R0, RID_R1+1)); - emit_dnm(as, ARMI_VMOV_RR_D, RID_R0, RID_R1, (src & 15)); -} -#endif - -static void asm_bitswap(ASMState *as, IRIns *ir) -{ - Reg dest = ra_dest(as, ir, RSET_GPR); - Reg left = ra_alloc1(as, ir->op1, RSET_GPR); - if ((as->flags & JIT_F_ARMV6)) { - emit_dm(as, ARMI_REV, dest, left); - } else { - Reg tmp2 = dest; - if (tmp2 == left) - tmp2 = ra_scratch(as, rset_exclude(rset_exclude(RSET_GPR, dest), left)); - emit_dnm(as, ARMI_EOR|ARMF_SH(ARMSH_LSR, 8), dest, tmp2, RID_TMP); - emit_dm(as, ARMI_MOV|ARMF_SH(ARMSH_ROR, 8), tmp2, left); - emit_dn(as, ARMI_BIC|ARMI_K12|256*8|255, RID_TMP, RID_TMP); - emit_dnm(as, ARMI_EOR|ARMF_SH(ARMSH_ROR, 16), RID_TMP, left, left); - } -} - -static void asm_bitshift(ASMState *as, IRIns *ir, ARMShift sh) -{ - if (irref_isk(ir->op2)) { /* Constant shifts. */ - /* NYI: Turn SHL+SHR or BAND+SHR into uxtb, uxth or ubfx. */ - /* NYI: Turn SHL+ASR into sxtb, sxth or sbfx. */ - Reg dest = ra_dest(as, ir, RSET_GPR); - Reg left = ra_alloc1(as, ir->op1, RSET_GPR); - int32_t shift = (IR(ir->op2)->i & 31); - emit_dm(as, ARMI_MOV|ARMF_SH(sh, shift), dest, left); - } else { - Reg dest = ra_dest(as, ir, RSET_GPR); - Reg left = ra_alloc1(as, ir->op1, RSET_GPR); - Reg right = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, left)); - emit_dm(as, ARMI_MOV|ARMF_RSH(sh, right), dest, left); - } -} - -static void asm_intmin_max(ASMState *as, IRIns *ir, int cc) -{ - uint32_t kcmp = 0, kmov = 0; - Reg dest = ra_dest(as, ir, RSET_GPR); - Reg left = ra_hintalloc(as, ir->op1, dest, RSET_GPR); - Reg right = 0; - if (irref_isk(ir->op2)) { - kcmp = emit_isk12(ARMI_CMP, IR(ir->op2)->i); - if (kcmp) kmov = emit_isk12(ARMI_MOV, IR(ir->op2)->i); - } - if (!kmov) { - kcmp = 0; - right = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, left)); - } - if (kmov || dest != right) { - emit_dm(as, ARMF_CC(ARMI_MOV, cc)^kmov, dest, right); - cc ^= 1; /* Must use opposite conditions for paired moves. */ - } else { - cc ^= (CC_LT^CC_GT); /* Otherwise may swap CC_LT <-> CC_GT. */ - } - if (dest != left) emit_dm(as, ARMF_CC(ARMI_MOV, cc), dest, left); - emit_nm(as, ARMI_CMP^kcmp, left, right); -} - -#if LJ_SOFTFP -static void asm_sfpmin_max(ASMState *as, IRIns *ir, int cc) -{ - const CCallInfo *ci = &lj_ir_callinfo[IRCALL_softfp_cmp]; - RegSet drop = RSET_SCRATCH; - Reg r; - IRRef args[4]; - args[0] = ir->op1; args[1] = (ir+1)->op1; - args[2] = ir->op2; args[3] = (ir+1)->op2; - /* __aeabi_cdcmple preserves r0-r3. */ - if (ra_hasreg(ir->r)) rset_clear(drop, ir->r); - if (ra_hasreg((ir+1)->r)) rset_clear(drop, (ir+1)->r); - if (!rset_test(as->freeset, RID_R2) && - regcost_ref(as->cost[RID_R2]) == args[2]) rset_clear(drop, RID_R2); - if (!rset_test(as->freeset, RID_R3) && - regcost_ref(as->cost[RID_R3]) == args[3]) rset_clear(drop, RID_R3); - ra_evictset(as, drop); - ra_destpair(as, ir); - emit_dm(as, ARMF_CC(ARMI_MOV, cc), RID_RETHI, RID_R3); - emit_dm(as, ARMF_CC(ARMI_MOV, cc), RID_RETLO, RID_R2); - emit_call(as, (void *)ci->func); - for (r = RID_R0; r <= RID_R3; r++) - ra_leftov(as, r, args[r-RID_R0]); -} -#else -static void asm_fpmin_max(ASMState *as, IRIns *ir, int cc) -{ - Reg dest = (ra_dest(as, ir, RSET_FPR) & 15); - Reg right, left = ra_alloc2(as, ir, RSET_FPR); - right = ((left >> 8) & 15); left &= 15; - if (dest != left) emit_dm(as, ARMF_CC(ARMI_VMOV_D, cc^1), dest, left); - if (dest != right) emit_dm(as, ARMF_CC(ARMI_VMOV_D, cc), dest, right); - emit_d(as, ARMI_VMRS, 0); - emit_dm(as, ARMI_VCMP_D, left, right); -} -#endif - -static void asm_min_max(ASMState *as, IRIns *ir, int cc, int fcc) -{ -#if LJ_SOFTFP - UNUSED(fcc); -#else - if (irt_isnum(ir->t)) - asm_fpmin_max(as, ir, fcc); - else -#endif - asm_intmin_max(as, ir, cc); -} - -/* -- Comparisons --------------------------------------------------------- */ - -/* Map of comparisons to flags. ORDER IR. */ -static const uint8_t asm_compmap[IR_ABC+1] = { - /* op FP swp int cc FP cc */ - /* LT */ CC_GE + (CC_HS << 4), - /* GE x */ CC_LT + (CC_HI << 4), - /* LE */ CC_GT + (CC_HI << 4), - /* GT x */ CC_LE + (CC_HS << 4), - /* ULT x */ CC_HS + (CC_LS << 4), - /* UGE */ CC_LO + (CC_LO << 4), - /* ULE x */ CC_HI + (CC_LO << 4), - /* UGT */ CC_LS + (CC_LS << 4), - /* EQ */ CC_NE + (CC_NE << 4), - /* NE */ CC_EQ + (CC_EQ << 4), - /* ABC */ CC_LS + (CC_LS << 4) /* Same as UGT. */ -}; - -#if LJ_SOFTFP -/* FP comparisons. */ -static void asm_sfpcomp(ASMState *as, IRIns *ir) -{ - const CCallInfo *ci = &lj_ir_callinfo[IRCALL_softfp_cmp]; - RegSet drop = RSET_SCRATCH; - Reg r; - IRRef args[4]; - int swp = (((ir->o ^ (ir->o >> 2)) & ~(ir->o >> 3) & 1) << 1); - args[swp^0] = ir->op1; args[swp^1] = (ir+1)->op1; - args[swp^2] = ir->op2; args[swp^3] = (ir+1)->op2; - /* __aeabi_cdcmple preserves r0-r3. This helps to reduce spills. */ - for (r = RID_R0; r <= RID_R3; r++) - if (!rset_test(as->freeset, r) && - regcost_ref(as->cost[r]) == args[r-RID_R0]) rset_clear(drop, r); - ra_evictset(as, drop); - asm_guardcc(as, (asm_compmap[ir->o] >> 4)); - emit_call(as, (void *)ci->func); - for (r = RID_R0; r <= RID_R3; r++) - ra_leftov(as, r, args[r-RID_R0]); -} -#else -/* FP comparisons. */ -static void asm_fpcomp(ASMState *as, IRIns *ir) -{ - Reg left, right; - ARMIns ai; - int swp = ((ir->o ^ (ir->o >> 2)) & ~(ir->o >> 3) & 1); - if (!swp && irref_isk(ir->op2) && ir_knum(IR(ir->op2))->u64 == 0) { - left = (ra_alloc1(as, ir->op1, RSET_FPR) & 15); - right = 0; - ai = ARMI_VCMPZ_D; - } else { - left = ra_alloc2(as, ir, RSET_FPR); - if (swp) { - right = (left & 15); left = ((left >> 8) & 15); - } else { - right = ((left >> 8) & 15); left &= 15; - } - ai = ARMI_VCMP_D; - } - asm_guardcc(as, (asm_compmap[ir->o] >> 4)); - emit_d(as, ARMI_VMRS, 0); - emit_dm(as, ai, left, right); -} -#endif - -/* Integer comparisons. */ -static void asm_intcomp(ASMState *as, IRIns *ir) -{ - ARMCC cc = (asm_compmap[ir->o] & 15); - IRRef lref = ir->op1, rref = ir->op2; - Reg left; - uint32_t m; - int cmpprev0 = 0; - lua_assert(irt_isint(ir->t) || irt_isu32(ir->t) || irt_isaddr(ir->t)); - if (asm_swapops(as, lref, rref)) { - Reg tmp = lref; lref = rref; rref = tmp; - if (cc >= CC_GE) cc ^= 7; /* LT <-> GT, LE <-> GE */ - else if (cc > CC_NE) cc ^= 11; /* LO <-> HI, LS <-> HS */ - } - if (irref_isk(rref) && IR(rref)->i == 0) { - IRIns *irl = IR(lref); - cmpprev0 = (irl+1 == ir); - /* Combine comp(BAND(left, right), 0) into tst left, right. */ - if (cmpprev0 && irl->o == IR_BAND && !ra_used(irl)) { - IRRef blref = irl->op1, brref = irl->op2; - uint32_t m2 = 0; - Reg bleft; - if (asm_swapops(as, blref, brref)) { - Reg tmp = blref; blref = brref; brref = tmp; - } - if (irref_isk(brref)) { - m2 = emit_isk12(ARMI_AND, IR(brref)->i); - if ((m2 & (ARMI_AND^ARMI_BIC))) - goto notst; /* Not beneficial if we miss a constant operand. */ - } - if (cc == CC_GE) cc = CC_PL; - else if (cc == CC_LT) cc = CC_MI; - else if (cc > CC_NE) goto notst; /* Other conds don't work with tst. */ - bleft = ra_alloc1(as, blref, RSET_GPR); - if (!m2) m2 = asm_fuseopm(as, 0, brref, rset_exclude(RSET_GPR, bleft)); - asm_guardcc(as, cc); - emit_n(as, ARMI_TST^m2, bleft); - return; - } - } -notst: - left = ra_alloc1(as, lref, RSET_GPR); - m = asm_fuseopm(as, ARMI_CMP, rref, rset_exclude(RSET_GPR, left)); - asm_guardcc(as, cc); - emit_n(as, ARMI_CMP^m, left); - /* Signed comparison with zero and referencing previous ins? */ - if (cmpprev0 && (cc <= CC_NE || cc >= CC_GE)) - as->flagmcp = as->mcp; /* Allow elimination of the compare. */ -} - -#if LJ_HASFFI -/* 64 bit integer comparisons. */ -static void asm_int64comp(ASMState *as, IRIns *ir) -{ - int signedcomp = (ir->o <= IR_GT); - ARMCC cclo, cchi; - Reg leftlo, lefthi; - uint32_t mlo, mhi; - RegSet allow = RSET_GPR, oldfree; - - /* Always use unsigned comparison for loword. */ - cclo = asm_compmap[ir->o + (signedcomp ? 4 : 0)] & 15; - leftlo = ra_alloc1(as, ir->op1, allow); - oldfree = as->freeset; - mlo = asm_fuseopm(as, ARMI_CMP, ir->op2, rset_clear(allow, leftlo)); - allow &= ~(oldfree & ~as->freeset); /* Update for allocs of asm_fuseopm. */ - - /* Use signed or unsigned comparison for hiword. */ - cchi = asm_compmap[ir->o] & 15; - lefthi = ra_alloc1(as, (ir+1)->op1, allow); - mhi = asm_fuseopm(as, ARMI_CMP, (ir+1)->op2, rset_clear(allow, lefthi)); - - /* All register allocations must be performed _before_ this point. */ - if (signedcomp) { - MCLabel l_around = emit_label(as); - asm_guardcc(as, cclo); - emit_n(as, ARMI_CMP^mlo, leftlo); - emit_branch(as, ARMF_CC(ARMI_B, CC_NE), l_around); - if (cchi == CC_GE || cchi == CC_LE) cchi ^= 6; /* GE -> GT, LE -> LT */ - asm_guardcc(as, cchi); - } else { - asm_guardcc(as, cclo); - emit_n(as, ARMF_CC(ARMI_CMP, CC_EQ)^mlo, leftlo); - } - emit_n(as, ARMI_CMP^mhi, lefthi); -} -#endif - -/* -- Support for 64 bit ops in 32 bit mode ------------------------------- */ - -/* Hiword op of a split 64 bit op. Previous op must be the loword op. */ -static void asm_hiop(ASMState *as, IRIns *ir) -{ -#if LJ_HASFFI || LJ_SOFTFP - /* HIOP is marked as a store because it needs its own DCE logic. */ - int uselo = ra_used(ir-1), usehi = ra_used(ir); /* Loword/hiword used? */ - if (LJ_UNLIKELY(!(as->flags & JIT_F_OPT_DCE))) uselo = usehi = 1; - if ((ir-1)->o <= IR_NE) { /* 64 bit integer or FP comparisons. ORDER IR. */ - as->curins--; /* Always skip the loword comparison. */ -#if LJ_SOFTFP - if (!irt_isint(ir->t)) { - asm_sfpcomp(as, ir-1); - return; - } -#endif -#if LJ_HASFFI - asm_int64comp(as, ir-1); -#endif - return; -#if LJ_SOFTFP - } else if ((ir-1)->o == IR_MIN || (ir-1)->o == IR_MAX) { - as->curins--; /* Always skip the loword min/max. */ - if (uselo || usehi) - asm_sfpmin_max(as, ir-1, (ir-1)->o == IR_MIN ? CC_HI : CC_LO); - return; -#elif LJ_HASFFI - } else if ((ir-1)->o == IR_CONV) { - as->curins--; /* Always skip the CONV. */ - if (usehi || uselo) - asm_conv64(as, ir); - return; -#endif - } else if ((ir-1)->o == IR_XSTORE) { - if ((ir-1)->r != RID_SINK) - asm_xstore(as, ir, 4); - return; - } - if (!usehi) return; /* Skip unused hiword op for all remaining ops. */ - switch ((ir-1)->o) { -#if LJ_HASFFI - case IR_ADD: - as->curins--; - asm_intop(as, ir, ARMI_ADC); - asm_intop(as, ir-1, ARMI_ADD|ARMI_S); - break; - case IR_SUB: - as->curins--; - asm_intop(as, ir, ARMI_SBC); - asm_intop(as, ir-1, ARMI_SUB|ARMI_S); - break; - case IR_NEG: - as->curins--; - asm_intneg(as, ir, ARMI_RSC); - asm_intneg(as, ir-1, ARMI_RSB|ARMI_S); - break; -#endif -#if LJ_SOFTFP - case IR_SLOAD: case IR_ALOAD: case IR_HLOAD: case IR_ULOAD: case IR_VLOAD: - case IR_STRTO: - if (!uselo) - ra_allocref(as, ir->op1, RSET_GPR); /* Mark lo op as used. */ - break; -#endif - case IR_CALLN: - case IR_CALLS: - case IR_CALLXS: - if (!uselo) - ra_allocref(as, ir->op1, RID2RSET(RID_RETLO)); /* Mark lo op as used. */ - break; -#if LJ_SOFTFP - case IR_ASTORE: case IR_HSTORE: case IR_USTORE: case IR_TOSTR: -#endif - case IR_CNEWI: - /* Nothing to do here. Handled by lo op itself. */ - break; - default: lua_assert(0); break; - } -#else - UNUSED(as); UNUSED(ir); lua_assert(0); -#endif -} - -/* -- Stack handling ------------------------------------------------------ */ - -/* Check Lua stack size for overflow. Use exit handler as fallback. */ -static void asm_stack_check(ASMState *as, BCReg topslot, - IRIns *irp, RegSet allow, ExitNo exitno) -{ - Reg pbase; - uint32_t k; - if (irp) { - if (!ra_hasspill(irp->s)) { - pbase = irp->r; - lua_assert(ra_hasreg(pbase)); - } else if (allow) { - pbase = rset_pickbot(allow); - } else { - pbase = RID_RET; - emit_lso(as, ARMI_LDR, RID_RET, RID_SP, 0); /* Restore temp. register. */ - } - } else { - pbase = RID_BASE; - } - emit_branch(as, ARMF_CC(ARMI_BL, CC_LS), exitstub_addr(as->J, exitno)); - k = emit_isk12(0, (int32_t)(8*topslot)); - lua_assert(k); - emit_n(as, ARMI_CMP^k, RID_TMP); - emit_dnm(as, ARMI_SUB, RID_TMP, RID_TMP, pbase); - emit_lso(as, ARMI_LDR, RID_TMP, RID_TMP, - (int32_t)offsetof(lua_State, maxstack)); - if (irp) { /* Must not spill arbitrary registers in head of side trace. */ - int32_t i = i32ptr(&J2G(as->J)->jit_L); - if (ra_hasspill(irp->s)) - emit_lso(as, ARMI_LDR, pbase, RID_SP, sps_scale(irp->s)); - emit_lso(as, ARMI_LDR, RID_TMP, RID_TMP, (i & 4095)); - if (ra_hasspill(irp->s) && !allow) - emit_lso(as, ARMI_STR, RID_RET, RID_SP, 0); /* Save temp. register. */ - emit_loadi(as, RID_TMP, (i & ~4095)); - } else { - emit_getgl(as, RID_TMP, jit_L); - } -} - -/* Restore Lua stack from on-trace state. */ -static void asm_stack_restore(ASMState *as, SnapShot *snap) -{ - SnapEntry *map = &as->T->snapmap[snap->mapofs]; - SnapEntry *flinks = &as->T->snapmap[snap_nextofs(as->T, snap)-1]; - MSize n, nent = snap->nent; - /* Store the value of all modified slots to the Lua stack. */ - for (n = 0; n < nent; n++) { - SnapEntry sn = map[n]; - BCReg s = snap_slot(sn); - int32_t ofs = 8*((int32_t)s-1); - IRRef ref = snap_ref(sn); - IRIns *ir = IR(ref); - if ((sn & SNAP_NORESTORE)) - continue; - if (irt_isnum(ir->t)) { -#if LJ_SOFTFP - RegSet odd = rset_exclude(RSET_GPRODD, RID_BASE); - Reg tmp; - lua_assert(irref_isk(ref)); /* LJ_SOFTFP: must be a number constant. */ - tmp = ra_allock(as, (int32_t)ir_knum(ir)->u32.lo, - rset_exclude(RSET_GPREVEN, RID_BASE)); - emit_lso(as, ARMI_STR, tmp, RID_BASE, ofs); - if (rset_test(as->freeset, tmp+1)) odd = RID2RSET(tmp+1); - tmp = ra_allock(as, (int32_t)ir_knum(ir)->u32.hi, odd); - emit_lso(as, ARMI_STR, tmp, RID_BASE, ofs+4); -#else - Reg src = ra_alloc1(as, ref, RSET_FPR); - emit_vlso(as, ARMI_VSTR_D, src, RID_BASE, ofs); -#endif - } else { - RegSet odd = rset_exclude(RSET_GPRODD, RID_BASE); - Reg type; - lua_assert(irt_ispri(ir->t) || irt_isaddr(ir->t) || irt_isinteger(ir->t)); - if (!irt_ispri(ir->t)) { - Reg src = ra_alloc1(as, ref, rset_exclude(RSET_GPREVEN, RID_BASE)); - emit_lso(as, ARMI_STR, src, RID_BASE, ofs); - if (rset_test(as->freeset, src+1)) odd = RID2RSET(src+1); - } - if ((sn & (SNAP_CONT|SNAP_FRAME))) { - if (s == 0) continue; /* Do not overwrite link to previous frame. */ - type = ra_allock(as, (int32_t)(*flinks--), odd); -#if LJ_SOFTFP - } else if ((sn & SNAP_SOFTFPNUM)) { - type = ra_alloc1(as, ref+1, rset_exclude(RSET_GPRODD, RID_BASE)); -#endif - } else { - type = ra_allock(as, (int32_t)irt_toitype(ir->t), odd); - } - emit_lso(as, ARMI_STR, type, RID_BASE, ofs+4); - } - checkmclim(as); - } - lua_assert(map + nent == flinks); -} - -/* -- GC handling --------------------------------------------------------- */ - -/* Check GC threshold and do one or more GC steps. */ -static void asm_gc_check(ASMState *as) -{ - const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_gc_step_jit]; - IRRef args[2]; - MCLabel l_end; - Reg tmp1, tmp2; - ra_evictset(as, RSET_SCRATCH); - l_end = emit_label(as); - /* Exit trace if in GCSatomic or GCSfinalize. Avoids syncing GC objects. */ - asm_guardcc(as, CC_NE); /* Assumes asm_snap_prep() already done. */ - emit_n(as, ARMI_CMP|ARMI_K12|0, RID_RET); - args[0] = ASMREF_TMP1; /* global_State *g */ - args[1] = ASMREF_TMP2; /* MSize steps */ - asm_gencall(as, ci, args); - tmp1 = ra_releasetmp(as, ASMREF_TMP1); - tmp2 = ra_releasetmp(as, ASMREF_TMP2); - emit_loadi(as, tmp2, as->gcsteps); - /* Jump around GC step if GC total < GC threshold. */ - emit_branch(as, ARMF_CC(ARMI_B, CC_LS), l_end); - emit_nm(as, ARMI_CMP, RID_TMP, tmp2); - emit_lso(as, ARMI_LDR, tmp2, tmp1, - (int32_t)offsetof(global_State, gc.threshold)); - emit_lso(as, ARMI_LDR, RID_TMP, tmp1, - (int32_t)offsetof(global_State, gc.total)); - ra_allockreg(as, i32ptr(J2G(as->J)), tmp1); - as->gcsteps = 0; - checkmclim(as); -} - -/* -- Loop handling ------------------------------------------------------- */ - -/* Fixup the loop branch. */ -static void asm_loop_fixup(ASMState *as) -{ - MCode *p = as->mctop; - MCode *target = as->mcp; - if (as->loopinv) { /* Inverted loop branch? */ - /* asm_guardcc already inverted the bcc and patched the final bl. */ - p[-2] |= ((uint32_t)(target-p) & 0x00ffffffu); - } else { - p[-1] = ARMI_B | ((uint32_t)((target-p)-1) & 0x00ffffffu); - } -} - -/* -- Head of trace ------------------------------------------------------- */ - -/* Reload L register from g->jit_L. */ -static void asm_head_lreg(ASMState *as) -{ - IRIns *ir = IR(ASMREF_L); - if (ra_used(ir)) { - Reg r = ra_dest(as, ir, RSET_GPR); - emit_getgl(as, r, jit_L); - ra_evictk(as); - } -} - -/* Coalesce BASE register for a root trace. */ -static void asm_head_root_base(ASMState *as) -{ - IRIns *ir; - asm_head_lreg(as); - ir = IR(REF_BASE); - if (ra_hasreg(ir->r) && (rset_test(as->modset, ir->r) || irt_ismarked(ir->t))) - ra_spill(as, ir); - ra_destreg(as, ir, RID_BASE); -} - -/* Coalesce BASE register for a side trace. */ -static RegSet asm_head_side_base(ASMState *as, IRIns *irp, RegSet allow) -{ - IRIns *ir; - asm_head_lreg(as); - ir = IR(REF_BASE); - if (ra_hasreg(ir->r) && (rset_test(as->modset, ir->r) || irt_ismarked(ir->t))) - ra_spill(as, ir); - if (ra_hasspill(irp->s)) { - rset_clear(allow, ra_dest(as, ir, allow)); - } else { - Reg r = irp->r; - lua_assert(ra_hasreg(r)); - rset_clear(allow, r); - if (r != ir->r && !rset_test(as->freeset, r)) - ra_restore(as, regcost_ref(as->cost[r])); - ra_destreg(as, ir, r); - } - return allow; -} - -/* -- Tail of trace ------------------------------------------------------- */ - -/* Fixup the tail code. */ -static void asm_tail_fixup(ASMState *as, TraceNo lnk) -{ - MCode *p = as->mctop; - MCode *target; - int32_t spadj = as->T->spadjust; - if (spadj == 0) { - as->mctop = --p; - } else { - /* Patch stack adjustment. */ - uint32_t k = emit_isk12(ARMI_ADD, spadj); - lua_assert(k); - p[-2] = (ARMI_ADD^k) | ARMF_D(RID_SP) | ARMF_N(RID_SP); - } - /* Patch exit branch. */ - target = lnk ? traceref(as->J, lnk)->mcode : (MCode *)lj_vm_exit_interp; - p[-1] = ARMI_B|(((target-p)-1)&0x00ffffffu); -} - -/* Prepare tail of code. */ -static void asm_tail_prep(ASMState *as) -{ - MCode *p = as->mctop - 1; /* Leave room for exit branch. */ - if (as->loopref) { - as->invmcp = as->mcp = p; - } else { - as->mcp = p-1; /* Leave room for stack pointer adjustment. */ - as->invmcp = NULL; - } - *p = 0; /* Prevent load/store merging. */ -} - -/* -- Instruction dispatch ------------------------------------------------ */ - -/* Assemble a single instruction. */ -static void asm_ir(ASMState *as, IRIns *ir) -{ - switch ((IROp)ir->o) { - /* Miscellaneous ops. */ - case IR_LOOP: asm_loop(as); break; - case IR_NOP: case IR_XBAR: lua_assert(!ra_used(ir)); break; - case IR_USE: - ra_alloc1(as, ir->op1, irt_isfp(ir->t) ? RSET_FPR : RSET_GPR); break; - case IR_PHI: asm_phi(as, ir); break; - case IR_HIOP: asm_hiop(as, ir); break; - case IR_GCSTEP: asm_gcstep(as, ir); break; - - /* Guarded assertions. */ - case IR_EQ: case IR_NE: - if ((ir-1)->o == IR_HREF && ir->op1 == as->curins-1) { - as->curins--; - asm_href(as, ir-1, (IROp)ir->o); - break; - } - /* fallthrough */ - case IR_LT: case IR_GE: case IR_LE: case IR_GT: - case IR_ULT: case IR_UGE: case IR_ULE: case IR_UGT: - case IR_ABC: -#if !LJ_SOFTFP - if (irt_isnum(ir->t)) { asm_fpcomp(as, ir); break; } -#endif - asm_intcomp(as, ir); - break; - - case IR_RETF: asm_retf(as, ir); break; - - /* Bit ops. */ - case IR_BNOT: asm_bitop(as, ir, ARMI_MVN); break; - case IR_BSWAP: asm_bitswap(as, ir); break; - - case IR_BAND: asm_bitop(as, ir, ARMI_AND); break; - case IR_BOR: asm_bitop(as, ir, ARMI_ORR); break; - case IR_BXOR: asm_bitop(as, ir, ARMI_EOR); break; - - case IR_BSHL: asm_bitshift(as, ir, ARMSH_LSL); break; - case IR_BSHR: asm_bitshift(as, ir, ARMSH_LSR); break; - case IR_BSAR: asm_bitshift(as, ir, ARMSH_ASR); break; - case IR_BROR: asm_bitshift(as, ir, ARMSH_ROR); break; - case IR_BROL: lua_assert(0); break; - - /* Arithmetic ops. */ - case IR_ADD: case IR_ADDOV: asm_add(as, ir); break; - case IR_SUB: case IR_SUBOV: asm_sub(as, ir); break; - case IR_MUL: case IR_MULOV: asm_mul(as, ir); break; - case IR_MOD: asm_callid(as, ir, IRCALL_lj_vm_modi); break; - case IR_NEG: asm_neg(as, ir); break; - -#if LJ_SOFTFP - case IR_DIV: case IR_POW: case IR_ABS: - case IR_ATAN2: case IR_LDEXP: case IR_FPMATH: case IR_TOBIT: - lua_assert(0); /* Unused for LJ_SOFTFP. */ - break; -#else - case IR_DIV: asm_fparith(as, ir, ARMI_VDIV_D); break; - case IR_POW: asm_callid(as, ir, IRCALL_lj_vm_powi); break; - case IR_ABS: asm_fpunary(as, ir, ARMI_VABS_D); break; - case IR_ATAN2: asm_callid(as, ir, IRCALL_atan2); break; - case IR_LDEXP: asm_callid(as, ir, IRCALL_ldexp); break; - case IR_FPMATH: - if (ir->op2 == IRFPM_EXP2 && asm_fpjoin_pow(as, ir)) - break; - if (ir->op2 <= IRFPM_TRUNC) - asm_callround(as, ir, ir->op2); - else if (ir->op2 == IRFPM_SQRT) - asm_fpunary(as, ir, ARMI_VSQRT_D); - else - asm_callid(as, ir, IRCALL_lj_vm_floor + ir->op2); - break; - case IR_TOBIT: asm_tobit(as, ir); break; -#endif - - case IR_MIN: asm_min_max(as, ir, CC_GT, CC_HI); break; - case IR_MAX: asm_min_max(as, ir, CC_LT, CC_LO); break; - - /* Memory references. */ - case IR_AREF: asm_aref(as, ir); break; - case IR_HREF: asm_href(as, ir, 0); break; - case IR_HREFK: asm_hrefk(as, ir); break; - case IR_NEWREF: asm_newref(as, ir); break; - case IR_UREFO: case IR_UREFC: asm_uref(as, ir); break; - case IR_FREF: asm_fref(as, ir); break; - case IR_STRREF: asm_strref(as, ir); break; - - /* Loads and stores. */ - case IR_ALOAD: case IR_HLOAD: case IR_ULOAD: case IR_VLOAD: - asm_ahuvload(as, ir); - break; - case IR_FLOAD: asm_fload(as, ir); break; - case IR_XLOAD: asm_xload(as, ir); break; - case IR_SLOAD: asm_sload(as, ir); break; - - case IR_ASTORE: case IR_HSTORE: case IR_USTORE: asm_ahustore(as, ir); break; - case IR_FSTORE: asm_fstore(as, ir); break; - case IR_XSTORE: asm_xstore(as, ir, 0); break; - - /* Allocations. */ - case IR_SNEW: case IR_XSNEW: asm_snew(as, ir); break; - case IR_TNEW: asm_tnew(as, ir); break; - case IR_TDUP: asm_tdup(as, ir); break; - case IR_CNEW: case IR_CNEWI: asm_cnew(as, ir); break; - - /* Write barriers. */ - case IR_TBAR: asm_tbar(as, ir); break; - case IR_OBAR: asm_obar(as, ir); break; - - /* Type conversions. */ - case IR_CONV: asm_conv(as, ir); break; - case IR_TOSTR: asm_tostr(as, ir); break; - case IR_STRTO: asm_strto(as, ir); break; - - /* Calls. */ - case IR_CALLN: case IR_CALLL: case IR_CALLS: asm_call(as, ir); break; - case IR_CALLXS: asm_callx(as, ir); break; - case IR_CARG: break; - - default: - setintV(&as->J->errinfo, ir->o); - lj_trace_err_info(as->J, LJ_TRERR_NYIIR); - break; - } -} - -/* -- Trace setup --------------------------------------------------------- */ - -/* Ensure there are enough stack slots for call arguments. */ -static Reg asm_setup_call_slots(ASMState *as, IRIns *ir, const CCallInfo *ci) -{ - IRRef args[CCI_NARGS_MAX*2]; - uint32_t i, nargs = (int)CCI_NARGS(ci); - int nslots = 0, ngpr = REGARG_NUMGPR, nfpr = REGARG_NUMFPR, fprodd = 0; - asm_collectargs(as, ir, ci, args); - for (i = 0; i < nargs; i++) { - if (!LJ_SOFTFP && args[i] && irt_isfp(IR(args[i])->t)) { - if (!LJ_ABI_SOFTFP && !(ci->flags & CCI_VARARG)) { - if (irt_isnum(IR(args[i])->t)) { - if (nfpr > 0) nfpr--; - else fprodd = 0, nslots = (nslots + 3) & ~1; - } else { - if (fprodd) fprodd--; - else if (nfpr > 0) fprodd = 1, nfpr--; - else nslots++; - } - } else if (irt_isnum(IR(args[i])->t)) { - ngpr &= ~1; - if (ngpr > 0) ngpr -= 2; else nslots += 2; - } else { - if (ngpr > 0) ngpr--; else nslots++; - } - } else { - if (ngpr > 0) ngpr--; else nslots++; - } - } - if (nslots > as->evenspill) /* Leave room for args in stack slots. */ - as->evenspill = nslots; - return REGSP_HINT(RID_RET); -} - -static void asm_setup_target(ASMState *as) -{ - /* May need extra exit for asm_stack_check on side traces. */ - asm_exitstub_setup(as, as->T->nsnap + (as->parent ? 1 : 0)); -} - -/* -- Trace patching ------------------------------------------------------ */ - -/* Patch exit jumps of existing machine code to a new target. */ -void lj_asm_patchexit(jit_State *J, GCtrace *T, ExitNo exitno, MCode *target) -{ - MCode *p = T->mcode; - MCode *pe = (MCode *)((char *)p + T->szmcode); - MCode *cstart = NULL, *cend = p; - MCode *mcarea = lj_mcode_patch(J, p, 0); - MCode *px = exitstub_addr(J, exitno) - 2; - for (; p < pe; p++) { - /* Look for bl_cc exitstub, replace with b_cc target. */ - uint32_t ins = *p; - if ((ins & 0x0f000000u) == 0x0b000000u && ins < 0xf0000000u && - ((ins ^ (px-p)) & 0x00ffffffu) == 0) { - *p = (ins & 0xfe000000u) | (((target-p)-2) & 0x00ffffffu); - cend = p+1; - if (!cstart) cstart = p; - } - } - lua_assert(cstart != NULL); - lj_mcode_sync(cstart, cend); - lj_mcode_patch(J, mcarea, 1); -} - diff --git a/deps/luajit/src/lj_asm_mips.h b/deps/luajit/src/lj_asm_mips.h deleted file mode 100644 index 78bd26d5..00000000 --- a/deps/luajit/src/lj_asm_mips.h +++ /dev/null @@ -1,1977 +0,0 @@ -/* -** MIPS IR assembler (SSA IR -> machine code). -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -/* -- Register allocator extensions --------------------------------------- */ - -/* Allocate a register with a hint. */ -static Reg ra_hintalloc(ASMState *as, IRRef ref, Reg hint, RegSet allow) -{ - Reg r = IR(ref)->r; - if (ra_noreg(r)) { - if (!ra_hashint(r) && !iscrossref(as, ref)) - ra_sethint(IR(ref)->r, hint); /* Propagate register hint. */ - r = ra_allocref(as, ref, allow); - } - ra_noweak(as, r); - return r; -} - -/* Allocate a register or RID_ZERO. */ -static Reg ra_alloc1z(ASMState *as, IRRef ref, RegSet allow) -{ - Reg r = IR(ref)->r; - if (ra_noreg(r)) { - if (!(allow & RSET_FPR) && irref_isk(ref) && IR(ref)->i == 0) - return RID_ZERO; - r = ra_allocref(as, ref, allow); - } else { - ra_noweak(as, r); - } - return r; -} - -/* Allocate two source registers for three-operand instructions. */ -static Reg ra_alloc2(ASMState *as, IRIns *ir, RegSet allow) -{ - IRIns *irl = IR(ir->op1), *irr = IR(ir->op2); - Reg left = irl->r, right = irr->r; - if (ra_hasreg(left)) { - ra_noweak(as, left); - if (ra_noreg(right)) - right = ra_alloc1z(as, ir->op2, rset_exclude(allow, left)); - else - ra_noweak(as, right); - } else if (ra_hasreg(right)) { - ra_noweak(as, right); - left = ra_alloc1z(as, ir->op1, rset_exclude(allow, right)); - } else if (ra_hashint(right)) { - right = ra_alloc1z(as, ir->op2, allow); - left = ra_alloc1z(as, ir->op1, rset_exclude(allow, right)); - } else { - left = ra_alloc1z(as, ir->op1, allow); - right = ra_alloc1z(as, ir->op2, rset_exclude(allow, left)); - } - return left | (right << 8); -} - -/* -- Guard handling ------------------------------------------------------ */ - -/* Need some spare long-range jump slots, for out-of-range branches. */ -#define MIPS_SPAREJUMP 4 - -/* Setup spare long-range jump slots per mcarea. */ -static void asm_sparejump_setup(ASMState *as) -{ - MCode *mxp = as->mcbot; - /* Assumes sizeof(MCLink) == 8. */ - if (((uintptr_t)mxp & (LJ_PAGESIZE-1)) == 8) { - lua_assert(MIPSI_NOP == 0); - memset(mxp+2, 0, MIPS_SPAREJUMP*8); - mxp += MIPS_SPAREJUMP*2; - lua_assert(mxp < as->mctop); - lj_mcode_sync(as->mcbot, mxp); - lj_mcode_commitbot(as->J, mxp); - as->mcbot = mxp; - as->mclim = as->mcbot + MCLIM_REDZONE; - } -} - -/* Setup exit stub after the end of each trace. */ -static void asm_exitstub_setup(ASMState *as) -{ - MCode *mxp = as->mctop; - /* sw TMP, 0(sp); j ->vm_exit_handler; li TMP, traceno */ - *--mxp = MIPSI_LI|MIPSF_T(RID_TMP)|as->T->traceno; - *--mxp = MIPSI_J|((((uintptr_t)(void *)lj_vm_exit_handler)>>2)&0x03ffffffu); - lua_assert(((uintptr_t)mxp ^ (uintptr_t)(void *)lj_vm_exit_handler)>>28 == 0); - *--mxp = MIPSI_SW|MIPSF_T(RID_TMP)|MIPSF_S(RID_SP)|0; - as->mctop = mxp; -} - -/* Keep this in-sync with exitstub_trace_addr(). */ -#define asm_exitstub_addr(as) ((as)->mctop) - -/* Emit conditional branch to exit for guard. */ -static void asm_guard(ASMState *as, MIPSIns mi, Reg rs, Reg rt) -{ - MCode *target = asm_exitstub_addr(as); - MCode *p = as->mcp; - if (LJ_UNLIKELY(p == as->invmcp)) { - as->invmcp = NULL; - as->loopinv = 1; - as->mcp = p+1; - mi = mi ^ ((mi>>28) == 1 ? 0x04000000u : 0x00010000u); /* Invert cond. */ - target = p; /* Patch target later in asm_loop_fixup. */ - } - emit_ti(as, MIPSI_LI, RID_TMP, as->snapno); - emit_branch(as, mi, rs, rt, target); -} - -/* -- Operand fusion ------------------------------------------------------ */ - -/* Limit linear search to this distance. Avoids O(n^2) behavior. */ -#define CONFLICT_SEARCH_LIM 31 - -/* Check if there's no conflicting instruction between curins and ref. */ -static int noconflict(ASMState *as, IRRef ref, IROp conflict) -{ - IRIns *ir = as->ir; - IRRef i = as->curins; - if (i > ref + CONFLICT_SEARCH_LIM) - return 0; /* Give up, ref is too far away. */ - while (--i > ref) - if (ir[i].o == conflict) - return 0; /* Conflict found. */ - return 1; /* Ok, no conflict. */ -} - -/* Fuse the array base of colocated arrays. */ -static int32_t asm_fuseabase(ASMState *as, IRRef ref) -{ - IRIns *ir = IR(ref); - if (ir->o == IR_TNEW && ir->op1 <= LJ_MAX_COLOSIZE && - !neverfuse(as) && noconflict(as, ref, IR_NEWREF)) - return (int32_t)sizeof(GCtab); - return 0; -} - -/* Fuse array/hash/upvalue reference into register+offset operand. */ -static Reg asm_fuseahuref(ASMState *as, IRRef ref, int32_t *ofsp, RegSet allow) -{ - IRIns *ir = IR(ref); - if (ra_noreg(ir->r)) { - if (ir->o == IR_AREF) { - if (mayfuse(as, ref)) { - if (irref_isk(ir->op2)) { - IRRef tab = IR(ir->op1)->op1; - int32_t ofs = asm_fuseabase(as, tab); - IRRef refa = ofs ? tab : ir->op1; - ofs += 8*IR(ir->op2)->i; - if (checki16(ofs)) { - *ofsp = ofs; - return ra_alloc1(as, refa, allow); - } - } - } - } else if (ir->o == IR_HREFK) { - if (mayfuse(as, ref)) { - int32_t ofs = (int32_t)(IR(ir->op2)->op2 * sizeof(Node)); - if (checki16(ofs)) { - *ofsp = ofs; - return ra_alloc1(as, ir->op1, allow); - } - } - } else if (ir->o == IR_UREFC) { - if (irref_isk(ir->op1)) { - GCfunc *fn = ir_kfunc(IR(ir->op1)); - int32_t ofs = i32ptr(&gcref(fn->l.uvptr[(ir->op2 >> 8)])->uv.tv); - int32_t jgl = (intptr_t)J2G(as->J); - if ((uint32_t)(ofs-jgl) < 65536) { - *ofsp = ofs-jgl-32768; - return RID_JGL; - } else { - *ofsp = (int16_t)ofs; - return ra_allock(as, ofs-(int16_t)ofs, allow); - } - } - } - } - *ofsp = 0; - return ra_alloc1(as, ref, allow); -} - -/* Fuse XLOAD/XSTORE reference into load/store operand. */ -static void asm_fusexref(ASMState *as, MIPSIns mi, Reg rt, IRRef ref, - RegSet allow, int32_t ofs) -{ - IRIns *ir = IR(ref); - Reg base; - if (ra_noreg(ir->r) && canfuse(as, ir)) { - if (ir->o == IR_ADD) { - int32_t ofs2; - if (irref_isk(ir->op2) && (ofs2 = ofs + IR(ir->op2)->i, checki16(ofs2))) { - ref = ir->op1; - ofs = ofs2; - } - } else if (ir->o == IR_STRREF) { - int32_t ofs2 = 65536; - lua_assert(ofs == 0); - ofs = (int32_t)sizeof(GCstr); - if (irref_isk(ir->op2)) { - ofs2 = ofs + IR(ir->op2)->i; - ref = ir->op1; - } else if (irref_isk(ir->op1)) { - ofs2 = ofs + IR(ir->op1)->i; - ref = ir->op2; - } - if (!checki16(ofs2)) { - /* NYI: Fuse ADD with constant. */ - Reg right, left = ra_alloc2(as, ir, allow); - right = (left >> 8); left &= 255; - emit_hsi(as, mi, rt, RID_TMP, ofs); - emit_dst(as, MIPSI_ADDU, RID_TMP, left, right); - return; - } - ofs = ofs2; - } - } - base = ra_alloc1(as, ref, allow); - emit_hsi(as, mi, rt, base, ofs); -} - -/* -- Calls --------------------------------------------------------------- */ - -/* Generate a call to a C function. */ -static void asm_gencall(ASMState *as, const CCallInfo *ci, IRRef *args) -{ - uint32_t n, nargs = CCI_NARGS(ci); - int32_t ofs = 16; - Reg gpr, fpr = REGARG_FIRSTFPR; - if ((void *)ci->func) - emit_call(as, (void *)ci->func); - for (gpr = REGARG_FIRSTGPR; gpr <= REGARG_LASTGPR; gpr++) - as->cost[gpr] = REGCOST(~0u, ASMREF_L); - gpr = REGARG_FIRSTGPR; - for (n = 0; n < nargs; n++) { /* Setup args. */ - IRRef ref = args[n]; - if (ref) { - IRIns *ir = IR(ref); - if (irt_isfp(ir->t) && fpr <= REGARG_LASTFPR && - !(ci->flags & CCI_VARARG)) { - lua_assert(rset_test(as->freeset, fpr)); /* Already evicted. */ - ra_leftov(as, fpr, ref); - fpr += 2; - gpr += irt_isnum(ir->t) ? 2 : 1; - } else { - fpr = REGARG_LASTFPR+1; - if (irt_isnum(ir->t)) gpr = (gpr+1) & ~1; - if (gpr <= REGARG_LASTGPR) { - lua_assert(rset_test(as->freeset, gpr)); /* Already evicted. */ - if (irt_isfp(ir->t)) { - RegSet of = as->freeset; - Reg r; - /* Workaround to protect argument GPRs from being used for remat. */ - as->freeset &= ~RSET_RANGE(REGARG_FIRSTGPR, REGARG_LASTGPR+1); - r = ra_alloc1(as, ref, RSET_FPR); - as->freeset |= (of & RSET_RANGE(REGARG_FIRSTGPR, REGARG_LASTGPR+1)); - if (irt_isnum(ir->t)) { - emit_tg(as, MIPSI_MFC1, gpr+(LJ_BE?0:1), r+1); - emit_tg(as, MIPSI_MFC1, gpr+(LJ_BE?1:0), r); - lua_assert(rset_test(as->freeset, gpr+1)); /* Already evicted. */ - gpr += 2; - } else if (irt_isfloat(ir->t)) { - emit_tg(as, MIPSI_MFC1, gpr, r); - gpr++; - } - } else { - ra_leftov(as, gpr, ref); - gpr++; - } - } else { - Reg r = ra_alloc1z(as, ref, irt_isfp(ir->t) ? RSET_FPR : RSET_GPR); - if (irt_isnum(ir->t)) ofs = (ofs + 4) & ~4; - emit_spstore(as, ir, r, ofs); - ofs += irt_isnum(ir->t) ? 8 : 4; - } - } - } else { - fpr = REGARG_LASTFPR+1; - if (gpr <= REGARG_LASTGPR) - gpr++; - else - ofs += 4; - } - checkmclim(as); - } -} - -/* Setup result reg/sp for call. Evict scratch regs. */ -static void asm_setupresult(ASMState *as, IRIns *ir, const CCallInfo *ci) -{ - RegSet drop = RSET_SCRATCH; - int hiop = ((ir+1)->o == IR_HIOP); - if ((ci->flags & CCI_NOFPRCLOBBER)) - drop &= ~RSET_FPR; - if (ra_hasreg(ir->r)) - rset_clear(drop, ir->r); /* Dest reg handled below. */ - if (hiop && ra_hasreg((ir+1)->r)) - rset_clear(drop, (ir+1)->r); /* Dest reg handled below. */ - ra_evictset(as, drop); /* Evictions must be performed first. */ - if (ra_used(ir)) { - lua_assert(!irt_ispri(ir->t)); - if (irt_isfp(ir->t)) { - if ((ci->flags & CCI_CASTU64)) { - int32_t ofs = sps_scale(ir->s); - Reg dest = ir->r; - if (ra_hasreg(dest)) { - ra_free(as, dest); - ra_modified(as, dest); - emit_tg(as, MIPSI_MTC1, RID_RETHI, dest+1); - emit_tg(as, MIPSI_MTC1, RID_RETLO, dest); - } - if (ofs) { - emit_tsi(as, MIPSI_SW, RID_RETLO, RID_SP, ofs+(LJ_BE?4:0)); - emit_tsi(as, MIPSI_SW, RID_RETHI, RID_SP, ofs+(LJ_BE?0:4)); - } - } else { - ra_destreg(as, ir, RID_FPRET); - } - } else if (hiop) { - ra_destpair(as, ir); - } else { - ra_destreg(as, ir, RID_RET); - } - } -} - -static void asm_call(ASMState *as, IRIns *ir) -{ - IRRef args[CCI_NARGS_MAX]; - const CCallInfo *ci = &lj_ir_callinfo[ir->op2]; - asm_collectargs(as, ir, ci, args); - asm_setupresult(as, ir, ci); - asm_gencall(as, ci, args); -} - -static void asm_callx(ASMState *as, IRIns *ir) -{ - IRRef args[CCI_NARGS_MAX*2]; - CCallInfo ci; - IRRef func; - IRIns *irf; - ci.flags = asm_callx_flags(as, ir); - asm_collectargs(as, ir, &ci, args); - asm_setupresult(as, ir, &ci); - func = ir->op2; irf = IR(func); - if (irf->o == IR_CARG) { func = irf->op1; irf = IR(func); } - if (irref_isk(func)) { /* Call to constant address. */ - ci.func = (ASMFunction)(void *)(irf->i); - } else { /* Need specific register for indirect calls. */ - Reg r = ra_alloc1(as, func, RID2RSET(RID_CFUNCADDR)); - MCode *p = as->mcp; - if (r == RID_CFUNCADDR) - *--p = MIPSI_NOP; - else - *--p = MIPSI_MOVE | MIPSF_D(RID_CFUNCADDR) | MIPSF_S(r); - *--p = MIPSI_JALR | MIPSF_S(r); - as->mcp = p; - ci.func = (ASMFunction)(void *)0; - } - asm_gencall(as, &ci, args); -} - -static void asm_callid(ASMState *as, IRIns *ir, IRCallID id) -{ - const CCallInfo *ci = &lj_ir_callinfo[id]; - IRRef args[2]; - args[0] = ir->op1; - args[1] = ir->op2; - asm_setupresult(as, ir, ci); - asm_gencall(as, ci, args); -} - -static void asm_callround(ASMState *as, IRIns *ir, IRCallID id) -{ - /* The modified regs must match with the *.dasc implementation. */ - RegSet drop = RID2RSET(RID_R1)|RID2RSET(RID_R12)|RID2RSET(RID_FPRET)| - RID2RSET(RID_F2)|RID2RSET(RID_F4)|RID2RSET(REGARG_FIRSTFPR); - if (ra_hasreg(ir->r)) rset_clear(drop, ir->r); - ra_evictset(as, drop); - ra_destreg(as, ir, RID_FPRET); - emit_call(as, (void *)lj_ir_callinfo[id].func); - ra_leftov(as, REGARG_FIRSTFPR, ir->op1); -} - -/* -- Returns ------------------------------------------------------------- */ - -/* Return to lower frame. Guard that it goes to the right spot. */ -static void asm_retf(ASMState *as, IRIns *ir) -{ - Reg base = ra_alloc1(as, REF_BASE, RSET_GPR); - void *pc = ir_kptr(IR(ir->op2)); - int32_t delta = 1+bc_a(*((const BCIns *)pc - 1)); - as->topslot -= (BCReg)delta; - if ((int32_t)as->topslot < 0) as->topslot = 0; - irt_setmark(IR(REF_BASE)->t); /* Children must not coalesce with BASE reg. */ - emit_setgl(as, base, jit_base); - emit_addptr(as, base, -8*delta); - asm_guard(as, MIPSI_BNE, RID_TMP, - ra_allock(as, i32ptr(pc), rset_exclude(RSET_GPR, base))); - emit_tsi(as, MIPSI_LW, RID_TMP, base, -8); -} - -/* -- Type conversions ---------------------------------------------------- */ - -static void asm_tointg(ASMState *as, IRIns *ir, Reg left) -{ - Reg tmp = ra_scratch(as, rset_exclude(RSET_FPR, left)); - Reg dest = ra_dest(as, ir, RSET_GPR); - asm_guard(as, MIPSI_BC1F, 0, 0); - emit_fgh(as, MIPSI_C_EQ_D, 0, tmp, left); - emit_fg(as, MIPSI_CVT_D_W, tmp, tmp); - emit_tg(as, MIPSI_MFC1, dest, tmp); - emit_fg(as, MIPSI_CVT_W_D, tmp, left); -} - -static void asm_tobit(ASMState *as, IRIns *ir) -{ - RegSet allow = RSET_FPR; - Reg dest = ra_dest(as, ir, RSET_GPR); - Reg left = ra_alloc1(as, ir->op1, allow); - Reg right = ra_alloc1(as, ir->op2, rset_clear(allow, left)); - Reg tmp = ra_scratch(as, rset_clear(allow, right)); - emit_tg(as, MIPSI_MFC1, dest, tmp); - emit_fgh(as, MIPSI_ADD_D, tmp, left, right); -} - -static void asm_conv(ASMState *as, IRIns *ir) -{ - IRType st = (IRType)(ir->op2 & IRCONV_SRCMASK); - int stfp = (st == IRT_NUM || st == IRT_FLOAT); - IRRef lref = ir->op1; - lua_assert(irt_type(ir->t) != st); - lua_assert(!(irt_isint64(ir->t) || - (st == IRT_I64 || st == IRT_U64))); /* Handled by SPLIT. */ - if (irt_isfp(ir->t)) { - Reg dest = ra_dest(as, ir, RSET_FPR); - if (stfp) { /* FP to FP conversion. */ - emit_fg(as, st == IRT_NUM ? MIPSI_CVT_S_D : MIPSI_CVT_D_S, - dest, ra_alloc1(as, lref, RSET_FPR)); - } else if (st == IRT_U32) { /* U32 to FP conversion. */ - /* y = (x ^ 0x8000000) + 2147483648.0 */ - Reg left = ra_alloc1(as, lref, RSET_GPR); - Reg tmp = ra_scratch(as, rset_exclude(RSET_FPR, dest)); - emit_fgh(as, irt_isfloat(ir->t) ? MIPSI_ADD_S : MIPSI_ADD_D, - dest, dest, tmp); - emit_fg(as, irt_isfloat(ir->t) ? MIPSI_CVT_S_W : MIPSI_CVT_D_W, - dest, dest); - if (irt_isfloat(ir->t)) - emit_lsptr(as, MIPSI_LWC1, (tmp & 31), - (void *)lj_ir_k64_find(as->J, U64x(4f000000,4f000000)), - RSET_GPR); - else - emit_lsptr(as, MIPSI_LDC1, (tmp & 31), - (void *)lj_ir_k64_find(as->J, U64x(41e00000,00000000)), - RSET_GPR); - emit_tg(as, MIPSI_MTC1, RID_TMP, dest); - emit_dst(as, MIPSI_XOR, RID_TMP, RID_TMP, left); - emit_ti(as, MIPSI_LUI, RID_TMP, 0x8000); - } else { /* Integer to FP conversion. */ - Reg left = ra_alloc1(as, lref, RSET_GPR); - emit_fg(as, irt_isfloat(ir->t) ? MIPSI_CVT_S_W : MIPSI_CVT_D_W, - dest, dest); - emit_tg(as, MIPSI_MTC1, left, dest); - } - } else if (stfp) { /* FP to integer conversion. */ - if (irt_isguard(ir->t)) { - /* Checked conversions are only supported from number to int. */ - lua_assert(irt_isint(ir->t) && st == IRT_NUM); - asm_tointg(as, ir, ra_alloc1(as, lref, RSET_FPR)); - } else { - Reg dest = ra_dest(as, ir, RSET_GPR); - Reg left = ra_alloc1(as, lref, RSET_FPR); - Reg tmp = ra_scratch(as, rset_exclude(RSET_FPR, left)); - if (irt_isu32(ir->t)) { - /* y = (int)floor(x - 2147483648.0) ^ 0x80000000 */ - emit_dst(as, MIPSI_XOR, dest, dest, RID_TMP); - emit_ti(as, MIPSI_LUI, RID_TMP, 0x8000); - emit_tg(as, MIPSI_MFC1, dest, tmp); - emit_fg(as, st == IRT_FLOAT ? MIPSI_FLOOR_W_S : MIPSI_FLOOR_W_D, - tmp, tmp); - emit_fgh(as, st == IRT_FLOAT ? MIPSI_SUB_S : MIPSI_SUB_D, - tmp, left, tmp); - if (st == IRT_FLOAT) - emit_lsptr(as, MIPSI_LWC1, (tmp & 31), - (void *)lj_ir_k64_find(as->J, U64x(4f000000,4f000000)), - RSET_GPR); - else - emit_lsptr(as, MIPSI_LDC1, (tmp & 31), - (void *)lj_ir_k64_find(as->J, U64x(41e00000,00000000)), - RSET_GPR); - } else { - emit_tg(as, MIPSI_MFC1, dest, tmp); - emit_fg(as, st == IRT_FLOAT ? MIPSI_TRUNC_W_S : MIPSI_TRUNC_W_D, - tmp, left); - } - } - } else { - Reg dest = ra_dest(as, ir, RSET_GPR); - if (st >= IRT_I8 && st <= IRT_U16) { /* Extend to 32 bit integer. */ - Reg left = ra_alloc1(as, ir->op1, RSET_GPR); - lua_assert(irt_isint(ir->t) || irt_isu32(ir->t)); - if ((ir->op2 & IRCONV_SEXT)) { - if ((as->flags & JIT_F_MIPS32R2)) { - emit_dst(as, st == IRT_I8 ? MIPSI_SEB : MIPSI_SEH, dest, 0, left); - } else { - uint32_t shift = st == IRT_I8 ? 24 : 16; - emit_dta(as, MIPSI_SRA, dest, dest, shift); - emit_dta(as, MIPSI_SLL, dest, left, shift); - } - } else { - emit_tsi(as, MIPSI_ANDI, dest, left, - (int32_t)(st == IRT_U8 ? 0xff : 0xffff)); - } - } else { /* 32/64 bit integer conversions. */ - /* Only need to handle 32/32 bit no-op (cast) on 32 bit archs. */ - ra_leftov(as, dest, lref); /* Do nothing, but may need to move regs. */ - } - } -} - -#if LJ_HASFFI -static void asm_conv64(ASMState *as, IRIns *ir) -{ - IRType st = (IRType)((ir-1)->op2 & IRCONV_SRCMASK); - IRType dt = (((ir-1)->op2 & IRCONV_DSTMASK) >> IRCONV_DSH); - IRCallID id; - const CCallInfo *ci; - IRRef args[2]; - args[LJ_BE?0:1] = ir->op1; - args[LJ_BE?1:0] = (ir-1)->op1; - if (st == IRT_NUM || st == IRT_FLOAT) { - id = IRCALL_fp64_d2l + ((st == IRT_FLOAT) ? 2 : 0) + (dt - IRT_I64); - ir--; - } else { - id = IRCALL_fp64_l2d + ((dt == IRT_FLOAT) ? 2 : 0) + (st - IRT_I64); - } - ci = &lj_ir_callinfo[id]; - asm_setupresult(as, ir, ci); - asm_gencall(as, ci, args); -} -#endif - -static void asm_strto(ASMState *as, IRIns *ir) -{ - const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_strscan_num]; - IRRef args[2]; - RegSet drop = RSET_SCRATCH; - if (ra_hasreg(ir->r)) rset_set(drop, ir->r); /* Spill dest reg (if any). */ - ra_evictset(as, drop); - asm_guard(as, MIPSI_BEQ, RID_RET, RID_ZERO); /* Test return status. */ - args[0] = ir->op1; /* GCstr *str */ - args[1] = ASMREF_TMP1; /* TValue *n */ - asm_gencall(as, ci, args); - /* Store the result to the spill slot or temp slots. */ - emit_tsi(as, MIPSI_ADDIU, ra_releasetmp(as, ASMREF_TMP1), - RID_SP, sps_scale(ir->s)); -} - -/* Get pointer to TValue. */ -static void asm_tvptr(ASMState *as, Reg dest, IRRef ref) -{ - IRIns *ir = IR(ref); - if (irt_isnum(ir->t)) { - if (irref_isk(ref)) /* Use the number constant itself as a TValue. */ - ra_allockreg(as, i32ptr(ir_knum(ir)), dest); - else /* Otherwise force a spill and use the spill slot. */ - emit_tsi(as, MIPSI_ADDIU, dest, RID_SP, ra_spill(as, ir)); - } else { - /* Otherwise use g->tmptv to hold the TValue. */ - RegSet allow = rset_exclude(RSET_GPR, dest); - Reg type; - emit_tsi(as, MIPSI_ADDIU, dest, RID_JGL, offsetof(global_State, tmptv)-32768); - if (!irt_ispri(ir->t)) { - Reg src = ra_alloc1(as, ref, allow); - emit_setgl(as, src, tmptv.gcr); - } - type = ra_allock(as, irt_toitype(ir->t), allow); - emit_setgl(as, type, tmptv.it); - } -} - -static void asm_tostr(ASMState *as, IRIns *ir) -{ - IRRef args[2]; - args[0] = ASMREF_L; - as->gcsteps++; - if (irt_isnum(IR(ir->op1)->t) || (ir+1)->o == IR_HIOP) { - const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_str_fromnum]; - args[1] = ASMREF_TMP1; /* const lua_Number * */ - asm_setupresult(as, ir, ci); /* GCstr * */ - asm_gencall(as, ci, args); - asm_tvptr(as, ra_releasetmp(as, ASMREF_TMP1), ir->op1); - } else { - const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_str_fromint]; - args[1] = ir->op1; /* int32_t k */ - asm_setupresult(as, ir, ci); /* GCstr * */ - asm_gencall(as, ci, args); - } -} - -/* -- Memory references --------------------------------------------------- */ - -static void asm_aref(ASMState *as, IRIns *ir) -{ - Reg dest = ra_dest(as, ir, RSET_GPR); - Reg idx, base; - if (irref_isk(ir->op2)) { - IRRef tab = IR(ir->op1)->op1; - int32_t ofs = asm_fuseabase(as, tab); - IRRef refa = ofs ? tab : ir->op1; - ofs += 8*IR(ir->op2)->i; - if (checki16(ofs)) { - base = ra_alloc1(as, refa, RSET_GPR); - emit_tsi(as, MIPSI_ADDIU, dest, base, ofs); - return; - } - } - base = ra_alloc1(as, ir->op1, RSET_GPR); - idx = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, base)); - emit_dst(as, MIPSI_ADDU, dest, RID_TMP, base); - emit_dta(as, MIPSI_SLL, RID_TMP, idx, 3); -} - -/* Inlined hash lookup. Specialized for key type and for const keys. -** The equivalent C code is: -** Node *n = hashkey(t, key); -** do { -** if (lj_obj_equal(&n->key, key)) return &n->val; -** } while ((n = nextnode(n))); -** return niltv(L); -*/ -static void asm_href(ASMState *as, IRIns *ir) -{ - RegSet allow = RSET_GPR; - int destused = ra_used(ir); - Reg dest = ra_dest(as, ir, allow); - Reg tab = ra_alloc1(as, ir->op1, rset_clear(allow, dest)); - Reg key = RID_NONE, type = RID_NONE, tmpnum = RID_NONE, tmp1 = RID_TMP, tmp2; - IRRef refkey = ir->op2; - IRIns *irkey = IR(refkey); - IRType1 kt = irkey->t; - uint32_t khash; - MCLabel l_end, l_loop, l_next; - - rset_clear(allow, tab); - if (irt_isnum(kt)) { - key = ra_alloc1(as, refkey, RSET_FPR); - tmpnum = ra_scratch(as, rset_exclude(RSET_FPR, key)); - } else if (!irt_ispri(kt)) { - key = ra_alloc1(as, refkey, allow); - rset_clear(allow, key); - type = ra_allock(as, irt_toitype(irkey->t), allow); - rset_clear(allow, type); - } - tmp2 = ra_scratch(as, allow); - rset_clear(allow, tmp2); - - /* Key not found in chain: load niltv. */ - l_end = emit_label(as); - if (destused) - emit_loada(as, dest, niltvg(J2G(as->J))); - else - *--as->mcp = MIPSI_NOP; - /* Follow hash chain until the end. */ - emit_move(as, dest, tmp1); - l_loop = --as->mcp; - emit_tsi(as, MIPSI_LW, tmp1, dest, (int32_t)offsetof(Node, next)); - l_next = emit_label(as); - - /* Type and value comparison. */ - if (irt_isnum(kt)) { - emit_branch(as, MIPSI_BC1T, 0, 0, l_end); - emit_fgh(as, MIPSI_C_EQ_D, 0, tmpnum, key); - emit_tg(as, MIPSI_MFC1, tmp1, key+1); - emit_branch(as, MIPSI_BEQ, tmp1, RID_ZERO, l_next); - emit_tsi(as, MIPSI_SLTIU, tmp1, tmp1, (int32_t)LJ_TISNUM); - emit_hsi(as, MIPSI_LDC1, tmpnum, dest, (int32_t)offsetof(Node, key.n)); - } else { - if (irt_ispri(kt)) { - emit_branch(as, MIPSI_BEQ, tmp1, type, l_end); - } else { - emit_branch(as, MIPSI_BEQ, tmp2, key, l_end); - emit_tsi(as, MIPSI_LW, tmp2, dest, (int32_t)offsetof(Node, key.gcr)); - emit_branch(as, MIPSI_BNE, tmp1, type, l_next); - } - } - emit_tsi(as, MIPSI_LW, tmp1, dest, (int32_t)offsetof(Node, key.it)); - *l_loop = MIPSI_BNE | MIPSF_S(tmp1) | ((as->mcp-l_loop-1) & 0xffffu); - - /* Load main position relative to tab->node into dest. */ - khash = irref_isk(refkey) ? ir_khash(irkey) : 1; - if (khash == 0) { - emit_tsi(as, MIPSI_LW, dest, tab, (int32_t)offsetof(GCtab, node)); - } else { - Reg tmphash = tmp1; - if (irref_isk(refkey)) - tmphash = ra_allock(as, khash, allow); - emit_dst(as, MIPSI_ADDU, dest, dest, tmp1); - lua_assert(sizeof(Node) == 24); - emit_dst(as, MIPSI_SUBU, tmp1, tmp2, tmp1); - emit_dta(as, MIPSI_SLL, tmp1, tmp1, 3); - emit_dta(as, MIPSI_SLL, tmp2, tmp1, 5); - emit_dst(as, MIPSI_AND, tmp1, tmp2, tmphash); - emit_tsi(as, MIPSI_LW, dest, tab, (int32_t)offsetof(GCtab, node)); - emit_tsi(as, MIPSI_LW, tmp2, tab, (int32_t)offsetof(GCtab, hmask)); - if (irref_isk(refkey)) { - /* Nothing to do. */ - } else if (irt_isstr(kt)) { - emit_tsi(as, MIPSI_LW, tmp1, key, (int32_t)offsetof(GCstr, hash)); - } else { /* Must match with hash*() in lj_tab.c. */ - emit_dst(as, MIPSI_SUBU, tmp1, tmp1, tmp2); - emit_rotr(as, tmp2, tmp2, dest, (-HASH_ROT3)&31); - emit_dst(as, MIPSI_XOR, tmp1, tmp1, tmp2); - emit_rotr(as, tmp1, tmp1, dest, (-HASH_ROT2-HASH_ROT1)&31); - emit_dst(as, MIPSI_SUBU, tmp2, tmp2, dest); - if (irt_isnum(kt)) { - emit_dst(as, MIPSI_XOR, tmp2, tmp2, tmp1); - if ((as->flags & JIT_F_MIPS32R2)) { - emit_dta(as, MIPSI_ROTR, dest, tmp1, (-HASH_ROT1)&31); - } else { - emit_dst(as, MIPSI_OR, dest, dest, tmp1); - emit_dta(as, MIPSI_SLL, tmp1, tmp1, HASH_ROT1); - emit_dta(as, MIPSI_SRL, dest, tmp1, (-HASH_ROT1)&31); - } - emit_dst(as, MIPSI_ADDU, tmp1, tmp1, tmp1); - emit_tg(as, MIPSI_MFC1, tmp2, key); - emit_tg(as, MIPSI_MFC1, tmp1, key+1); - } else { - emit_dst(as, MIPSI_XOR, tmp2, key, tmp1); - emit_rotr(as, dest, tmp1, tmp2, (-HASH_ROT1)&31); - emit_dst(as, MIPSI_ADDU, tmp1, key, ra_allock(as, HASH_BIAS, allow)); - } - } - } -} - -static void asm_hrefk(ASMState *as, IRIns *ir) -{ - IRIns *kslot = IR(ir->op2); - IRIns *irkey = IR(kslot->op1); - int32_t ofs = (int32_t)(kslot->op2 * sizeof(Node)); - int32_t kofs = ofs + (int32_t)offsetof(Node, key); - Reg dest = (ra_used(ir)||ofs > 32736) ? ra_dest(as, ir, RSET_GPR) : RID_NONE; - Reg node = ra_alloc1(as, ir->op1, RSET_GPR); - Reg key = RID_NONE, type = RID_TMP, idx = node; - RegSet allow = rset_exclude(RSET_GPR, node); - int32_t lo, hi; - lua_assert(ofs % sizeof(Node) == 0); - if (ofs > 32736) { - idx = dest; - rset_clear(allow, dest); - kofs = (int32_t)offsetof(Node, key); - } else if (ra_hasreg(dest)) { - emit_tsi(as, MIPSI_ADDIU, dest, node, ofs); - } - if (!irt_ispri(irkey->t)) { - key = ra_scratch(as, allow); - rset_clear(allow, key); - } - if (irt_isnum(irkey->t)) { - lo = (int32_t)ir_knum(irkey)->u32.lo; - hi = (int32_t)ir_knum(irkey)->u32.hi; - } else { - lo = irkey->i; - hi = irt_toitype(irkey->t); - if (!ra_hasreg(key)) - goto nolo; - } - asm_guard(as, MIPSI_BNE, key, lo ? ra_allock(as, lo, allow) : RID_ZERO); -nolo: - asm_guard(as, MIPSI_BNE, type, hi ? ra_allock(as, hi, allow) : RID_ZERO); - if (ra_hasreg(key)) emit_tsi(as, MIPSI_LW, key, idx, kofs+(LJ_BE?4:0)); - emit_tsi(as, MIPSI_LW, type, idx, kofs+(LJ_BE?0:4)); - if (ofs > 32736) - emit_tsi(as, MIPSI_ADDU, dest, node, ra_allock(as, ofs, allow)); -} - -static void asm_newref(ASMState *as, IRIns *ir) -{ - if (ir->r != RID_SINK) { - const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_tab_newkey]; - IRRef args[3]; - args[0] = ASMREF_L; /* lua_State *L */ - args[1] = ir->op1; /* GCtab *t */ - args[2] = ASMREF_TMP1; /* cTValue *key */ - asm_setupresult(as, ir, ci); /* TValue * */ - asm_gencall(as, ci, args); - asm_tvptr(as, ra_releasetmp(as, ASMREF_TMP1), ir->op2); - } -} - -static void asm_uref(ASMState *as, IRIns *ir) -{ - /* NYI: Check that UREFO is still open and not aliasing a slot. */ - Reg dest = ra_dest(as, ir, RSET_GPR); - if (irref_isk(ir->op1)) { - GCfunc *fn = ir_kfunc(IR(ir->op1)); - MRef *v = &gcref(fn->l.uvptr[(ir->op2 >> 8)])->uv.v; - emit_lsptr(as, MIPSI_LW, dest, v, RSET_GPR); - } else { - Reg uv = ra_scratch(as, RSET_GPR); - Reg func = ra_alloc1(as, ir->op1, RSET_GPR); - if (ir->o == IR_UREFC) { - asm_guard(as, MIPSI_BEQ, RID_TMP, RID_ZERO); - emit_tsi(as, MIPSI_ADDIU, dest, uv, (int32_t)offsetof(GCupval, tv)); - emit_tsi(as, MIPSI_LBU, RID_TMP, uv, (int32_t)offsetof(GCupval, closed)); - } else { - emit_tsi(as, MIPSI_LW, dest, uv, (int32_t)offsetof(GCupval, v)); - } - emit_tsi(as, MIPSI_LW, uv, func, - (int32_t)offsetof(GCfuncL, uvptr) + 4*(int32_t)(ir->op2 >> 8)); - } -} - -static void asm_fref(ASMState *as, IRIns *ir) -{ - UNUSED(as); UNUSED(ir); - lua_assert(!ra_used(ir)); -} - -static void asm_strref(ASMState *as, IRIns *ir) -{ - Reg dest = ra_dest(as, ir, RSET_GPR); - IRRef ref = ir->op2, refk = ir->op1; - int32_t ofs = (int32_t)sizeof(GCstr); - Reg r; - if (irref_isk(ref)) { - IRRef tmp = refk; refk = ref; ref = tmp; - } else if (!irref_isk(refk)) { - Reg right, left = ra_alloc1(as, ir->op1, RSET_GPR); - IRIns *irr = IR(ir->op2); - if (ra_hasreg(irr->r)) { - ra_noweak(as, irr->r); - right = irr->r; - } else if (mayfuse(as, irr->op2) && - irr->o == IR_ADD && irref_isk(irr->op2) && - checki16(ofs + IR(irr->op2)->i)) { - ofs += IR(irr->op2)->i; - right = ra_alloc1(as, irr->op1, rset_exclude(RSET_GPR, left)); - } else { - right = ra_allocref(as, ir->op2, rset_exclude(RSET_GPR, left)); - } - emit_tsi(as, MIPSI_ADDIU, dest, dest, ofs); - emit_dst(as, MIPSI_ADDU, dest, left, right); - return; - } - r = ra_alloc1(as, ref, RSET_GPR); - ofs += IR(refk)->i; - if (checki16(ofs)) - emit_tsi(as, MIPSI_ADDIU, dest, r, ofs); - else - emit_dst(as, MIPSI_ADDU, dest, r, - ra_allock(as, ofs, rset_exclude(RSET_GPR, r))); -} - -/* -- Loads and stores ---------------------------------------------------- */ - -static MIPSIns asm_fxloadins(IRIns *ir) -{ - switch (irt_type(ir->t)) { - case IRT_I8: return MIPSI_LB; - case IRT_U8: return MIPSI_LBU; - case IRT_I16: return MIPSI_LH; - case IRT_U16: return MIPSI_LHU; - case IRT_NUM: return MIPSI_LDC1; - case IRT_FLOAT: return MIPSI_LWC1; - default: return MIPSI_LW; - } -} - -static MIPSIns asm_fxstoreins(IRIns *ir) -{ - switch (irt_type(ir->t)) { - case IRT_I8: case IRT_U8: return MIPSI_SB; - case IRT_I16: case IRT_U16: return MIPSI_SH; - case IRT_NUM: return MIPSI_SDC1; - case IRT_FLOAT: return MIPSI_SWC1; - default: return MIPSI_SW; - } -} - -static void asm_fload(ASMState *as, IRIns *ir) -{ - Reg dest = ra_dest(as, ir, RSET_GPR); - Reg idx = ra_alloc1(as, ir->op1, RSET_GPR); - MIPSIns mi = asm_fxloadins(ir); - int32_t ofs; - if (ir->op2 == IRFL_TAB_ARRAY) { - ofs = asm_fuseabase(as, ir->op1); - if (ofs) { /* Turn the t->array load into an add for colocated arrays. */ - emit_tsi(as, MIPSI_ADDIU, dest, idx, ofs); - return; - } - } - ofs = field_ofs[ir->op2]; - lua_assert(!irt_isfp(ir->t)); - emit_tsi(as, mi, dest, idx, ofs); -} - -static void asm_fstore(ASMState *as, IRIns *ir) -{ - if (ir->r != RID_SINK) { - Reg src = ra_alloc1z(as, ir->op2, RSET_GPR); - IRIns *irf = IR(ir->op1); - Reg idx = ra_alloc1(as, irf->op1, rset_exclude(RSET_GPR, src)); - int32_t ofs = field_ofs[irf->op2]; - MIPSIns mi = asm_fxstoreins(ir); - lua_assert(!irt_isfp(ir->t)); - emit_tsi(as, mi, src, idx, ofs); - } -} - -static void asm_xload(ASMState *as, IRIns *ir) -{ - Reg dest = ra_dest(as, ir, irt_isfp(ir->t) ? RSET_FPR : RSET_GPR); - lua_assert(!(ir->op2 & IRXLOAD_UNALIGNED)); - asm_fusexref(as, asm_fxloadins(ir), dest, ir->op1, RSET_GPR, 0); -} - -static void asm_xstore(ASMState *as, IRIns *ir, int32_t ofs) -{ - if (ir->r != RID_SINK) { - Reg src = ra_alloc1z(as, ir->op2, irt_isfp(ir->t) ? RSET_FPR : RSET_GPR); - asm_fusexref(as, asm_fxstoreins(ir), src, ir->op1, - rset_exclude(RSET_GPR, src), ofs); - } -} - -static void asm_ahuvload(ASMState *as, IRIns *ir) -{ - IRType1 t = ir->t; - Reg dest = RID_NONE, type = RID_TMP, idx; - RegSet allow = RSET_GPR; - int32_t ofs = 0; - if (ra_used(ir)) { - lua_assert(irt_isnum(t) || irt_isint(t) || irt_isaddr(t)); - dest = ra_dest(as, ir, irt_isnum(t) ? RSET_FPR : RSET_GPR); - rset_clear(allow, dest); - } - idx = asm_fuseahuref(as, ir->op1, &ofs, allow); - rset_clear(allow, idx); - if (irt_isnum(t)) { - asm_guard(as, MIPSI_BEQ, type, RID_ZERO); - emit_tsi(as, MIPSI_SLTIU, type, type, (int32_t)LJ_TISNUM); - if (ra_hasreg(dest)) - emit_hsi(as, MIPSI_LDC1, dest, idx, ofs); - } else { - asm_guard(as, MIPSI_BNE, type, ra_allock(as, irt_toitype(t), allow)); - if (ra_hasreg(dest)) emit_tsi(as, MIPSI_LW, dest, idx, ofs+(LJ_BE?4:0)); - } - emit_tsi(as, MIPSI_LW, type, idx, ofs+(LJ_BE?0:4)); -} - -static void asm_ahustore(ASMState *as, IRIns *ir) -{ - RegSet allow = RSET_GPR; - Reg idx, src = RID_NONE, type = RID_NONE; - int32_t ofs = 0; - if (ir->r == RID_SINK) - return; - if (irt_isnum(ir->t)) { - src = ra_alloc1(as, ir->op2, RSET_FPR); - } else { - if (!irt_ispri(ir->t)) { - src = ra_alloc1(as, ir->op2, allow); - rset_clear(allow, src); - } - type = ra_allock(as, (int32_t)irt_toitype(ir->t), allow); - rset_clear(allow, type); - } - idx = asm_fuseahuref(as, ir->op1, &ofs, allow); - if (irt_isnum(ir->t)) { - emit_hsi(as, MIPSI_SDC1, src, idx, ofs); - } else { - if (ra_hasreg(src)) - emit_tsi(as, MIPSI_SW, src, idx, ofs+(LJ_BE?4:0)); - emit_tsi(as, MIPSI_SW, type, idx, ofs+(LJ_BE?0:4)); - } -} - -static void asm_sload(ASMState *as, IRIns *ir) -{ - int32_t ofs = 8*((int32_t)ir->op1-1) + ((ir->op2 & IRSLOAD_FRAME) ? 4 : 0); - IRType1 t = ir->t; - Reg dest = RID_NONE, type = RID_NONE, base; - RegSet allow = RSET_GPR; - lua_assert(!(ir->op2 & IRSLOAD_PARENT)); /* Handled by asm_head_side(). */ - lua_assert(irt_isguard(t) || !(ir->op2 & IRSLOAD_TYPECHECK)); - lua_assert(!irt_isint(t) || (ir->op2 & (IRSLOAD_CONVERT|IRSLOAD_FRAME))); - if ((ir->op2 & IRSLOAD_CONVERT) && irt_isguard(t) && irt_isint(t)) { - dest = ra_scratch(as, RSET_FPR); - asm_tointg(as, ir, dest); - t.irt = IRT_NUM; /* Continue with a regular number type check. */ - } else if (ra_used(ir)) { - lua_assert(irt_isnum(t) || irt_isint(t) || irt_isaddr(t)); - dest = ra_dest(as, ir, irt_isnum(t) ? RSET_FPR : RSET_GPR); - rset_clear(allow, dest); - base = ra_alloc1(as, REF_BASE, allow); - rset_clear(allow, base); - if ((ir->op2 & IRSLOAD_CONVERT)) { - if (irt_isint(t)) { - Reg tmp = ra_scratch(as, RSET_FPR); - emit_tg(as, MIPSI_MFC1, dest, tmp); - emit_fg(as, MIPSI_CVT_W_D, tmp, tmp); - dest = tmp; - t.irt = IRT_NUM; /* Check for original type. */ - } else { - Reg tmp = ra_scratch(as, RSET_GPR); - emit_fg(as, MIPSI_CVT_D_W, dest, dest); - emit_tg(as, MIPSI_MTC1, tmp, dest); - dest = tmp; - t.irt = IRT_INT; /* Check for original type. */ - } - } - goto dotypecheck; - } - base = ra_alloc1(as, REF_BASE, allow); - rset_clear(allow, base); -dotypecheck: - if (irt_isnum(t)) { - if ((ir->op2 & IRSLOAD_TYPECHECK)) { - asm_guard(as, MIPSI_BEQ, RID_TMP, RID_ZERO); - emit_tsi(as, MIPSI_SLTIU, RID_TMP, RID_TMP, (int32_t)LJ_TISNUM); - type = RID_TMP; - } - if (ra_hasreg(dest)) emit_hsi(as, MIPSI_LDC1, dest, base, ofs); - } else { - if ((ir->op2 & IRSLOAD_TYPECHECK)) { - Reg ktype = ra_allock(as, irt_toitype(t), allow); - asm_guard(as, MIPSI_BNE, RID_TMP, ktype); - type = RID_TMP; - } - if (ra_hasreg(dest)) emit_tsi(as, MIPSI_LW, dest, base, ofs ^ (LJ_BE?4:0)); - } - if (ra_hasreg(type)) emit_tsi(as, MIPSI_LW, type, base, ofs ^ (LJ_BE?0:4)); -} - -/* -- Allocations --------------------------------------------------------- */ - -#if LJ_HASFFI -static void asm_cnew(ASMState *as, IRIns *ir) -{ - CTState *cts = ctype_ctsG(J2G(as->J)); - CTypeID ctypeid = (CTypeID)IR(ir->op1)->i; - CTSize sz = (ir->o == IR_CNEWI || ir->op2 == REF_NIL) ? - lj_ctype_size(cts, ctypeid) : (CTSize)IR(ir->op2)->i; - const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_mem_newgco]; - IRRef args[2]; - RegSet allow = (RSET_GPR & ~RSET_SCRATCH); - RegSet drop = RSET_SCRATCH; - lua_assert(sz != CTSIZE_INVALID); - - args[0] = ASMREF_L; /* lua_State *L */ - args[1] = ASMREF_TMP1; /* MSize size */ - as->gcsteps++; - - if (ra_hasreg(ir->r)) - rset_clear(drop, ir->r); /* Dest reg handled below. */ - ra_evictset(as, drop); - if (ra_used(ir)) - ra_destreg(as, ir, RID_RET); /* GCcdata * */ - - /* Initialize immutable cdata object. */ - if (ir->o == IR_CNEWI) { - int32_t ofs = sizeof(GCcdata); - lua_assert(sz == 4 || sz == 8); - if (sz == 8) { - ofs += 4; - lua_assert((ir+1)->o == IR_HIOP); - if (LJ_LE) ir++; - } - for (;;) { - Reg r = ra_alloc1z(as, ir->op2, allow); - emit_tsi(as, MIPSI_SW, r, RID_RET, ofs); - rset_clear(allow, r); - if (ofs == sizeof(GCcdata)) break; - ofs -= 4; if (LJ_BE) ir++; else ir--; - } - } - /* Initialize gct and ctypeid. lj_mem_newgco() already sets marked. */ - emit_tsi(as, MIPSI_SB, RID_RET+1, RID_RET, offsetof(GCcdata, gct)); - emit_tsi(as, MIPSI_SH, RID_TMP, RID_RET, offsetof(GCcdata, ctypeid)); - emit_ti(as, MIPSI_LI, RID_RET+1, ~LJ_TCDATA); - emit_ti(as, MIPSI_LI, RID_TMP, ctypeid); /* Lower 16 bit used. Sign-ext ok. */ - asm_gencall(as, ci, args); - ra_allockreg(as, (int32_t)(sz+sizeof(GCcdata)), - ra_releasetmp(as, ASMREF_TMP1)); -} -#else -#define asm_cnew(as, ir) ((void)0) -#endif - -/* -- Write barriers ------------------------------------------------------ */ - -static void asm_tbar(ASMState *as, IRIns *ir) -{ - Reg tab = ra_alloc1(as, ir->op1, RSET_GPR); - Reg mark = ra_scratch(as, rset_exclude(RSET_GPR, tab)); - Reg link = RID_TMP; - MCLabel l_end = emit_label(as); - emit_tsi(as, MIPSI_SW, link, tab, (int32_t)offsetof(GCtab, gclist)); - emit_tsi(as, MIPSI_SB, mark, tab, (int32_t)offsetof(GCtab, marked)); - emit_setgl(as, tab, gc.grayagain); - emit_getgl(as, link, gc.grayagain); - emit_dst(as, MIPSI_XOR, mark, mark, RID_TMP); /* Clear black bit. */ - emit_branch(as, MIPSI_BEQ, RID_TMP, RID_ZERO, l_end); - emit_tsi(as, MIPSI_ANDI, RID_TMP, mark, LJ_GC_BLACK); - emit_tsi(as, MIPSI_LBU, mark, tab, (int32_t)offsetof(GCtab, marked)); -} - -static void asm_obar(ASMState *as, IRIns *ir) -{ - const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_gc_barrieruv]; - IRRef args[2]; - MCLabel l_end; - Reg obj, val, tmp; - /* No need for other object barriers (yet). */ - lua_assert(IR(ir->op1)->o == IR_UREFC); - ra_evictset(as, RSET_SCRATCH); - l_end = emit_label(as); - args[0] = ASMREF_TMP1; /* global_State *g */ - args[1] = ir->op1; /* TValue *tv */ - asm_gencall(as, ci, args); - emit_tsi(as, MIPSI_ADDIU, ra_releasetmp(as, ASMREF_TMP1), RID_JGL, -32768); - obj = IR(ir->op1)->r; - tmp = ra_scratch(as, rset_exclude(RSET_GPR, obj)); - emit_branch(as, MIPSI_BEQ, RID_TMP, RID_ZERO, l_end); - emit_tsi(as, MIPSI_ANDI, tmp, tmp, LJ_GC_BLACK); - emit_branch(as, MIPSI_BEQ, RID_TMP, RID_ZERO, l_end); - emit_tsi(as, MIPSI_ANDI, RID_TMP, RID_TMP, LJ_GC_WHITES); - val = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, obj)); - emit_tsi(as, MIPSI_LBU, tmp, obj, - (int32_t)offsetof(GCupval, marked)-(int32_t)offsetof(GCupval, tv)); - emit_tsi(as, MIPSI_LBU, RID_TMP, val, (int32_t)offsetof(GChead, marked)); -} - -/* -- Arithmetic and logic operations ------------------------------------- */ - -static void asm_fparith(ASMState *as, IRIns *ir, MIPSIns mi) -{ - Reg dest = ra_dest(as, ir, RSET_FPR); - Reg right, left = ra_alloc2(as, ir, RSET_FPR); - right = (left >> 8); left &= 255; - emit_fgh(as, mi, dest, left, right); -} - -static void asm_fpunary(ASMState *as, IRIns *ir, MIPSIns mi) -{ - Reg dest = ra_dest(as, ir, RSET_FPR); - Reg left = ra_hintalloc(as, ir->op1, dest, RSET_FPR); - emit_fg(as, mi, dest, left); -} - -static int asm_fpjoin_pow(ASMState *as, IRIns *ir) -{ - IRIns *irp = IR(ir->op1); - if (irp == ir-1 && irp->o == IR_MUL && !ra_used(irp)) { - IRIns *irpp = IR(irp->op1); - if (irpp == ir-2 && irpp->o == IR_FPMATH && - irpp->op2 == IRFPM_LOG2 && !ra_used(irpp)) { - const CCallInfo *ci = &lj_ir_callinfo[IRCALL_pow]; - IRRef args[2]; - args[0] = irpp->op1; - args[1] = irp->op2; - asm_setupresult(as, ir, ci); - asm_gencall(as, ci, args); - return 1; - } - } - return 0; -} - -static void asm_add(ASMState *as, IRIns *ir) -{ - if (irt_isnum(ir->t)) { - asm_fparith(as, ir, MIPSI_ADD_D); - } else { - Reg dest = ra_dest(as, ir, RSET_GPR); - Reg right, left = ra_hintalloc(as, ir->op1, dest, RSET_GPR); - if (irref_isk(ir->op2)) { - int32_t k = IR(ir->op2)->i; - if (checki16(k)) { - emit_tsi(as, MIPSI_ADDIU, dest, left, k); - return; - } - } - right = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, left)); - emit_dst(as, MIPSI_ADDU, dest, left, right); - } -} - -static void asm_sub(ASMState *as, IRIns *ir) -{ - if (irt_isnum(ir->t)) { - asm_fparith(as, ir, MIPSI_SUB_D); - } else { - Reg dest = ra_dest(as, ir, RSET_GPR); - Reg right, left = ra_alloc2(as, ir, RSET_GPR); - right = (left >> 8); left &= 255; - emit_dst(as, MIPSI_SUBU, dest, left, right); - } -} - -static void asm_mul(ASMState *as, IRIns *ir) -{ - if (irt_isnum(ir->t)) { - asm_fparith(as, ir, MIPSI_MUL_D); - } else { - Reg dest = ra_dest(as, ir, RSET_GPR); - Reg right, left = ra_alloc2(as, ir, RSET_GPR); - right = (left >> 8); left &= 255; - emit_dst(as, MIPSI_MUL, dest, left, right); - } -} - -static void asm_neg(ASMState *as, IRIns *ir) -{ - if (irt_isnum(ir->t)) { - asm_fpunary(as, ir, MIPSI_NEG_D); - } else { - Reg dest = ra_dest(as, ir, RSET_GPR); - Reg left = ra_hintalloc(as, ir->op1, dest, RSET_GPR); - emit_dst(as, MIPSI_SUBU, dest, RID_ZERO, left); - } -} - -static void asm_arithov(ASMState *as, IRIns *ir) -{ - Reg right, left, tmp, dest = ra_dest(as, ir, RSET_GPR); - if (irref_isk(ir->op2)) { - int k = IR(ir->op2)->i; - if (ir->o == IR_SUBOV) k = -k; - if (checki16(k)) { /* (dest < left) == (k >= 0 ? 1 : 0) */ - left = ra_alloc1(as, ir->op1, RSET_GPR); - asm_guard(as, k >= 0 ? MIPSI_BNE : MIPSI_BEQ, RID_TMP, RID_ZERO); - emit_dst(as, MIPSI_SLT, RID_TMP, dest, dest == left ? RID_TMP : left); - emit_tsi(as, MIPSI_ADDIU, dest, left, k); - if (dest == left) emit_move(as, RID_TMP, left); - return; - } - } - left = ra_alloc2(as, ir, RSET_GPR); - right = (left >> 8); left &= 255; - tmp = ra_scratch(as, rset_exclude(rset_exclude(rset_exclude(RSET_GPR, left), - right), dest)); - asm_guard(as, MIPSI_BLTZ, RID_TMP, 0); - emit_dst(as, MIPSI_AND, RID_TMP, RID_TMP, tmp); - if (ir->o == IR_ADDOV) { /* ((dest^left) & (dest^right)) < 0 */ - emit_dst(as, MIPSI_XOR, RID_TMP, dest, dest == right ? RID_TMP : right); - } else { /* ((dest^left) & (dest^~right)) < 0 */ - emit_dst(as, MIPSI_XOR, RID_TMP, RID_TMP, dest); - emit_dst(as, MIPSI_NOR, RID_TMP, dest == right ? RID_TMP : right, RID_ZERO); - } - emit_dst(as, MIPSI_XOR, tmp, dest, dest == left ? RID_TMP : left); - emit_dst(as, ir->o == IR_ADDOV ? MIPSI_ADDU : MIPSI_SUBU, dest, left, right); - if (dest == left || dest == right) - emit_move(as, RID_TMP, dest == left ? left : right); -} - -static void asm_mulov(ASMState *as, IRIns *ir) -{ -#if LJ_DUALNUM -#error "NYI: MULOV" -#else - UNUSED(as); UNUSED(ir); lua_assert(0); /* Unused in single-number mode. */ -#endif -} - -#if LJ_HASFFI -static void asm_add64(ASMState *as, IRIns *ir) -{ - Reg dest = ra_dest(as, ir, RSET_GPR); - Reg right, left = ra_alloc1(as, ir->op1, RSET_GPR); - if (irref_isk(ir->op2)) { - int32_t k = IR(ir->op2)->i; - if (k == 0) { - emit_dst(as, MIPSI_ADDU, dest, left, RID_TMP); - goto loarith; - } else if (checki16(k)) { - emit_dst(as, MIPSI_ADDU, dest, dest, RID_TMP); - emit_tsi(as, MIPSI_ADDIU, dest, left, k); - goto loarith; - } - } - emit_dst(as, MIPSI_ADDU, dest, dest, RID_TMP); - right = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, left)); - emit_dst(as, MIPSI_ADDU, dest, left, right); -loarith: - ir--; - dest = ra_dest(as, ir, RSET_GPR); - left = ra_alloc1(as, ir->op1, RSET_GPR); - if (irref_isk(ir->op2)) { - int32_t k = IR(ir->op2)->i; - if (k == 0) { - if (dest != left) - emit_move(as, dest, left); - return; - } else if (checki16(k)) { - if (dest == left) { - Reg tmp = ra_scratch(as, rset_exclude(RSET_GPR, left)); - emit_move(as, dest, tmp); - dest = tmp; - } - emit_dst(as, MIPSI_SLTU, RID_TMP, dest, left); - emit_tsi(as, MIPSI_ADDIU, dest, left, k); - return; - } - } - right = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, left)); - if (dest == left && dest == right) { - Reg tmp = ra_scratch(as, rset_exclude(rset_exclude(RSET_GPR, left), right)); - emit_move(as, dest, tmp); - dest = tmp; - } - emit_dst(as, MIPSI_SLTU, RID_TMP, dest, dest == left ? right : left); - emit_dst(as, MIPSI_ADDU, dest, left, right); -} - -static void asm_sub64(ASMState *as, IRIns *ir) -{ - Reg dest = ra_dest(as, ir, RSET_GPR); - Reg right, left = ra_alloc2(as, ir, RSET_GPR); - right = (left >> 8); left &= 255; - emit_dst(as, MIPSI_SUBU, dest, dest, RID_TMP); - emit_dst(as, MIPSI_SUBU, dest, left, right); - ir--; - dest = ra_dest(as, ir, RSET_GPR); - left = ra_alloc2(as, ir, RSET_GPR); - right = (left >> 8); left &= 255; - if (dest == left) { - Reg tmp = ra_scratch(as, rset_exclude(rset_exclude(RSET_GPR, left), right)); - emit_move(as, dest, tmp); - dest = tmp; - } - emit_dst(as, MIPSI_SLTU, RID_TMP, left, dest); - emit_dst(as, MIPSI_SUBU, dest, left, right); -} - -static void asm_neg64(ASMState *as, IRIns *ir) -{ - Reg dest = ra_dest(as, ir, RSET_GPR); - Reg left = ra_alloc1(as, ir->op1, RSET_GPR); - emit_dst(as, MIPSI_SUBU, dest, dest, RID_TMP); - emit_dst(as, MIPSI_SUBU, dest, RID_ZERO, left); - ir--; - dest = ra_dest(as, ir, RSET_GPR); - left = ra_alloc1(as, ir->op1, RSET_GPR); - emit_dst(as, MIPSI_SLTU, RID_TMP, RID_ZERO, dest); - emit_dst(as, MIPSI_SUBU, dest, RID_ZERO, left); -} -#endif - -static void asm_bitnot(ASMState *as, IRIns *ir) -{ - Reg left, right, dest = ra_dest(as, ir, RSET_GPR); - IRIns *irl = IR(ir->op1); - if (mayfuse(as, ir->op1) && irl->o == IR_BOR) { - left = ra_alloc2(as, irl, RSET_GPR); - right = (left >> 8); left &= 255; - } else { - left = ra_hintalloc(as, ir->op1, dest, RSET_GPR); - right = RID_ZERO; - } - emit_dst(as, MIPSI_NOR, dest, left, right); -} - -static void asm_bitswap(ASMState *as, IRIns *ir) -{ - Reg dest = ra_dest(as, ir, RSET_GPR); - Reg left = ra_alloc1(as, ir->op1, RSET_GPR); - if ((as->flags & JIT_F_MIPS32R2)) { - emit_dta(as, MIPSI_ROTR, dest, RID_TMP, 16); - emit_dst(as, MIPSI_WSBH, RID_TMP, 0, left); - } else { - Reg tmp = ra_scratch(as, rset_exclude(rset_exclude(RSET_GPR, left), dest)); - emit_dst(as, MIPSI_OR, dest, dest, tmp); - emit_dst(as, MIPSI_OR, dest, dest, RID_TMP); - emit_tsi(as, MIPSI_ANDI, dest, dest, 0xff00); - emit_dta(as, MIPSI_SLL, RID_TMP, RID_TMP, 8); - emit_dta(as, MIPSI_SRL, dest, left, 8); - emit_tsi(as, MIPSI_ANDI, RID_TMP, left, 0xff00); - emit_dst(as, MIPSI_OR, tmp, tmp, RID_TMP); - emit_dta(as, MIPSI_SRL, tmp, left, 24); - emit_dta(as, MIPSI_SLL, RID_TMP, left, 24); - } -} - -static void asm_bitop(ASMState *as, IRIns *ir, MIPSIns mi, MIPSIns mik) -{ - Reg dest = ra_dest(as, ir, RSET_GPR); - Reg right, left = ra_hintalloc(as, ir->op1, dest, RSET_GPR); - if (irref_isk(ir->op2)) { - int32_t k = IR(ir->op2)->i; - if (checku16(k)) { - emit_tsi(as, mik, dest, left, k); - return; - } - } - right = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, left)); - emit_dst(as, mi, dest, left, right); -} - -static void asm_bitshift(ASMState *as, IRIns *ir, MIPSIns mi, MIPSIns mik) -{ - Reg dest = ra_dest(as, ir, RSET_GPR); - if (irref_isk(ir->op2)) { /* Constant shifts. */ - uint32_t shift = (uint32_t)(IR(ir->op2)->i & 31); - emit_dta(as, mik, dest, ra_hintalloc(as, ir->op1, dest, RSET_GPR), shift); - } else { - Reg right, left = ra_alloc2(as, ir, RSET_GPR); - right = (left >> 8); left &= 255; - emit_dst(as, mi, dest, right, left); /* Shift amount is in rs. */ - } -} - -static void asm_bitror(ASMState *as, IRIns *ir) -{ - if ((as->flags & JIT_F_MIPS32R2)) { - asm_bitshift(as, ir, MIPSI_ROTRV, MIPSI_ROTR); - } else { - Reg dest = ra_dest(as, ir, RSET_GPR); - if (irref_isk(ir->op2)) { /* Constant shifts. */ - uint32_t shift = (uint32_t)(IR(ir->op2)->i & 31); - Reg left = ra_hintalloc(as, ir->op1, dest, RSET_GPR); - emit_rotr(as, dest, left, RID_TMP, shift); - } else { - Reg right, left = ra_alloc2(as, ir, RSET_GPR); - right = (left >> 8); left &= 255; - emit_dst(as, MIPSI_OR, dest, dest, RID_TMP); - emit_dst(as, MIPSI_SRLV, dest, right, left); - emit_dst(as, MIPSI_SLLV, RID_TMP, RID_TMP, left); - emit_dst(as, MIPSI_SUBU, RID_TMP, ra_allock(as, 32, RSET_GPR), right); - } - } -} - -static void asm_min_max(ASMState *as, IRIns *ir, int ismax) -{ - if (irt_isnum(ir->t)) { - Reg dest = ra_dest(as, ir, RSET_FPR); - Reg right, left = ra_alloc2(as, ir, RSET_FPR); - right = (left >> 8); left &= 255; - if (dest == left) { - emit_fg(as, MIPSI_MOVT_D, dest, right); - } else { - emit_fg(as, MIPSI_MOVF_D, dest, left); - if (dest != right) emit_fg(as, MIPSI_MOV_D, dest, right); - } - emit_fgh(as, MIPSI_C_OLT_D, 0, ismax ? left : right, ismax ? right : left); - } else { - Reg dest = ra_dest(as, ir, RSET_GPR); - Reg right, left = ra_alloc2(as, ir, RSET_GPR); - right = (left >> 8); left &= 255; - if (dest == left) { - emit_dst(as, MIPSI_MOVN, dest, right, RID_TMP); - } else { - emit_dst(as, MIPSI_MOVZ, dest, left, RID_TMP); - if (dest != right) emit_move(as, dest, right); - } - emit_dst(as, MIPSI_SLT, RID_TMP, - ismax ? left : right, ismax ? right : left); - } -} - -/* -- Comparisons --------------------------------------------------------- */ - -static void asm_comp(ASMState *as, IRIns *ir) -{ - /* ORDER IR: LT GE LE GT ULT UGE ULE UGT. */ - IROp op = ir->o; - if (irt_isnum(ir->t)) { - Reg right, left = ra_alloc2(as, ir, RSET_FPR); - right = (left >> 8); left &= 255; - asm_guard(as, (op&1) ? MIPSI_BC1T : MIPSI_BC1F, 0, 0); - emit_fgh(as, MIPSI_C_OLT_D + ((op&3) ^ ((op>>2)&1)), 0, left, right); - } else { - Reg right, left = ra_alloc1(as, ir->op1, RSET_GPR); - if (op == IR_ABC) op = IR_UGT; - if ((op&4) == 0 && irref_isk(ir->op2) && IR(ir->op2)->i == 0) { - MIPSIns mi = (op&2) ? ((op&1) ? MIPSI_BLEZ : MIPSI_BGTZ) : - ((op&1) ? MIPSI_BLTZ : MIPSI_BGEZ); - asm_guard(as, mi, left, 0); - } else { - if (irref_isk(ir->op2)) { - int32_t k = IR(ir->op2)->i; - if ((op&2)) k++; - if (checki16(k)) { - asm_guard(as, (op&1) ? MIPSI_BNE : MIPSI_BEQ, RID_TMP, RID_ZERO); - emit_tsi(as, (op&4) ? MIPSI_SLTIU : MIPSI_SLTI, - RID_TMP, left, k); - return; - } - } - right = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, left)); - asm_guard(as, ((op^(op>>1))&1) ? MIPSI_BNE : MIPSI_BEQ, RID_TMP, RID_ZERO); - emit_dst(as, (op&4) ? MIPSI_SLTU : MIPSI_SLT, - RID_TMP, (op&2) ? right : left, (op&2) ? left : right); - } - } -} - -static void asm_compeq(ASMState *as, IRIns *ir) -{ - Reg right, left = ra_alloc2(as, ir, irt_isnum(ir->t) ? RSET_FPR : RSET_GPR); - right = (left >> 8); left &= 255; - if (irt_isnum(ir->t)) { - asm_guard(as, (ir->o & 1) ? MIPSI_BC1T : MIPSI_BC1F, 0, 0); - emit_fgh(as, MIPSI_C_EQ_D, 0, left, right); - } else { - asm_guard(as, (ir->o & 1) ? MIPSI_BEQ : MIPSI_BNE, left, right); - } -} - -#if LJ_HASFFI -/* 64 bit integer comparisons. */ -static void asm_comp64(ASMState *as, IRIns *ir) -{ - /* ORDER IR: LT GE LE GT ULT UGE ULE UGT. */ - IROp op = (ir-1)->o; - MCLabel l_end; - Reg rightlo, leftlo, righthi, lefthi = ra_alloc2(as, ir, RSET_GPR); - righthi = (lefthi >> 8); lefthi &= 255; - leftlo = ra_alloc2(as, ir-1, - rset_exclude(rset_exclude(RSET_GPR, lefthi), righthi)); - rightlo = (leftlo >> 8); leftlo &= 255; - asm_guard(as, ((op^(op>>1))&1) ? MIPSI_BNE : MIPSI_BEQ, RID_TMP, RID_ZERO); - l_end = emit_label(as); - if (lefthi != righthi) - emit_dst(as, (op&4) ? MIPSI_SLTU : MIPSI_SLT, RID_TMP, - (op&2) ? righthi : lefthi, (op&2) ? lefthi : righthi); - emit_dst(as, MIPSI_SLTU, RID_TMP, - (op&2) ? rightlo : leftlo, (op&2) ? leftlo : rightlo); - if (lefthi != righthi) - emit_branch(as, MIPSI_BEQ, lefthi, righthi, l_end); -} - -static void asm_comp64eq(ASMState *as, IRIns *ir) -{ - Reg tmp, right, left = ra_alloc2(as, ir, RSET_GPR); - right = (left >> 8); left &= 255; - asm_guard(as, ((ir-1)->o & 1) ? MIPSI_BEQ : MIPSI_BNE, RID_TMP, RID_ZERO); - tmp = ra_scratch(as, rset_exclude(rset_exclude(RSET_GPR, left), right)); - emit_dst(as, MIPSI_OR, RID_TMP, RID_TMP, tmp); - emit_dst(as, MIPSI_XOR, tmp, left, right); - left = ra_alloc2(as, ir-1, RSET_GPR); - right = (left >> 8); left &= 255; - emit_dst(as, MIPSI_XOR, RID_TMP, left, right); -} -#endif - -/* -- Support for 64 bit ops in 32 bit mode ------------------------------- */ - -/* Hiword op of a split 64 bit op. Previous op must be the loword op. */ -static void asm_hiop(ASMState *as, IRIns *ir) -{ -#if LJ_HASFFI - /* HIOP is marked as a store because it needs its own DCE logic. */ - int uselo = ra_used(ir-1), usehi = ra_used(ir); /* Loword/hiword used? */ - if (LJ_UNLIKELY(!(as->flags & JIT_F_OPT_DCE))) uselo = usehi = 1; - if ((ir-1)->o == IR_CONV) { /* Conversions to/from 64 bit. */ - as->curins--; /* Always skip the CONV. */ - if (usehi || uselo) - asm_conv64(as, ir); - return; - } else if ((ir-1)->o < IR_EQ) { /* 64 bit integer comparisons. ORDER IR. */ - as->curins--; /* Always skip the loword comparison. */ - asm_comp64(as, ir); - return; - } else if ((ir-1)->o <= IR_NE) { /* 64 bit integer comparisons. ORDER IR. */ - as->curins--; /* Always skip the loword comparison. */ - asm_comp64eq(as, ir); - return; - } else if ((ir-1)->o == IR_XSTORE) { - as->curins--; /* Handle both stores here. */ - if ((ir-1)->r != RID_SINK) { - asm_xstore(as, ir, LJ_LE ? 4 : 0); - asm_xstore(as, ir-1, LJ_LE ? 0 : 4); - } - return; - } - if (!usehi) return; /* Skip unused hiword op for all remaining ops. */ - switch ((ir-1)->o) { - case IR_ADD: as->curins--; asm_add64(as, ir); break; - case IR_SUB: as->curins--; asm_sub64(as, ir); break; - case IR_NEG: as->curins--; asm_neg64(as, ir); break; - case IR_CALLN: - case IR_CALLXS: - if (!uselo) - ra_allocref(as, ir->op1, RID2RSET(RID_RETLO)); /* Mark lo op as used. */ - break; - case IR_CNEWI: - /* Nothing to do here. Handled by lo op itself. */ - break; - default: lua_assert(0); break; - } -#else - UNUSED(as); UNUSED(ir); lua_assert(0); /* Unused without FFI. */ -#endif -} - -/* -- Stack handling ------------------------------------------------------ */ - -/* Check Lua stack size for overflow. Use exit handler as fallback. */ -static void asm_stack_check(ASMState *as, BCReg topslot, - IRIns *irp, RegSet allow, ExitNo exitno) -{ - /* Try to get an unused temp. register, otherwise spill/restore RID_RET*. */ - Reg tmp, pbase = irp ? (ra_hasreg(irp->r) ? irp->r : RID_TMP) : RID_BASE; - ExitNo oldsnap = as->snapno; - rset_clear(allow, pbase); - tmp = allow ? rset_pickbot(allow) : - (pbase == RID_RETHI ? RID_RETLO : RID_RETHI); - as->snapno = exitno; - asm_guard(as, MIPSI_BNE, RID_TMP, RID_ZERO); - as->snapno = oldsnap; - if (allow == RSET_EMPTY) /* Restore temp. register. */ - emit_tsi(as, MIPSI_LW, tmp, RID_SP, 0); - else - ra_modified(as, tmp); - emit_tsi(as, MIPSI_SLTIU, RID_TMP, RID_TMP, (int32_t)(8*topslot)); - emit_dst(as, MIPSI_SUBU, RID_TMP, tmp, pbase); - emit_tsi(as, MIPSI_LW, tmp, tmp, offsetof(lua_State, maxstack)); - if (pbase == RID_TMP) - emit_getgl(as, RID_TMP, jit_base); - emit_getgl(as, tmp, jit_L); - if (allow == RSET_EMPTY) /* Spill temp. register. */ - emit_tsi(as, MIPSI_SW, tmp, RID_SP, 0); -} - -/* Restore Lua stack from on-trace state. */ -static void asm_stack_restore(ASMState *as, SnapShot *snap) -{ - SnapEntry *map = &as->T->snapmap[snap->mapofs]; - SnapEntry *flinks = &as->T->snapmap[snap_nextofs(as->T, snap)-1]; - MSize n, nent = snap->nent; - /* Store the value of all modified slots to the Lua stack. */ - for (n = 0; n < nent; n++) { - SnapEntry sn = map[n]; - BCReg s = snap_slot(sn); - int32_t ofs = 8*((int32_t)s-1); - IRRef ref = snap_ref(sn); - IRIns *ir = IR(ref); - if ((sn & SNAP_NORESTORE)) - continue; - if (irt_isnum(ir->t)) { - Reg src = ra_alloc1(as, ref, RSET_FPR); - emit_hsi(as, MIPSI_SDC1, src, RID_BASE, ofs); - } else { - Reg type; - RegSet allow = rset_exclude(RSET_GPR, RID_BASE); - lua_assert(irt_ispri(ir->t) || irt_isaddr(ir->t) || irt_isinteger(ir->t)); - if (!irt_ispri(ir->t)) { - Reg src = ra_alloc1(as, ref, allow); - rset_clear(allow, src); - emit_tsi(as, MIPSI_SW, src, RID_BASE, ofs+(LJ_BE?4:0)); - } - if ((sn & (SNAP_CONT|SNAP_FRAME))) { - if (s == 0) continue; /* Do not overwrite link to previous frame. */ - type = ra_allock(as, (int32_t)(*flinks--), allow); - } else { - type = ra_allock(as, (int32_t)irt_toitype(ir->t), allow); - } - emit_tsi(as, MIPSI_SW, type, RID_BASE, ofs+(LJ_BE?0:4)); - } - checkmclim(as); - } - lua_assert(map + nent == flinks); -} - -/* -- GC handling --------------------------------------------------------- */ - -/* Check GC threshold and do one or more GC steps. */ -static void asm_gc_check(ASMState *as) -{ - const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_gc_step_jit]; - IRRef args[2]; - MCLabel l_end; - Reg tmp; - ra_evictset(as, RSET_SCRATCH); - l_end = emit_label(as); - /* Exit trace if in GCSatomic or GCSfinalize. Avoids syncing GC objects. */ - /* Assumes asm_snap_prep() already done. */ - asm_guard(as, MIPSI_BNE, RID_RET, RID_ZERO); - args[0] = ASMREF_TMP1; /* global_State *g */ - args[1] = ASMREF_TMP2; /* MSize steps */ - asm_gencall(as, ci, args); - emit_tsi(as, MIPSI_ADDIU, ra_releasetmp(as, ASMREF_TMP1), RID_JGL, -32768); - tmp = ra_releasetmp(as, ASMREF_TMP2); - emit_loadi(as, tmp, as->gcsteps); - /* Jump around GC step if GC total < GC threshold. */ - emit_branch(as, MIPSI_BNE, RID_TMP, RID_ZERO, l_end); - emit_dst(as, MIPSI_SLTU, RID_TMP, RID_TMP, tmp); - emit_getgl(as, tmp, gc.threshold); - emit_getgl(as, RID_TMP, gc.total); - as->gcsteps = 0; - checkmclim(as); -} - -/* -- Loop handling ------------------------------------------------------- */ - -/* Fixup the loop branch. */ -static void asm_loop_fixup(ASMState *as) -{ - MCode *p = as->mctop; - MCode *target = as->mcp; - p[-1] = MIPSI_NOP; - if (as->loopinv) { /* Inverted loop branch? */ - /* asm_guard already inverted the cond branch. Only patch the target. */ - p[-3] |= ((target-p+2) & 0x0000ffffu); - } else { - p[-2] = MIPSI_J|(((uintptr_t)target>>2)&0x03ffffffu); - } -} - -/* -- Head of trace ------------------------------------------------------- */ - -/* Coalesce BASE register for a root trace. */ -static void asm_head_root_base(ASMState *as) -{ - IRIns *ir = IR(REF_BASE); - Reg r = ir->r; - if (as->loopinv) as->mctop--; - if (ra_hasreg(r)) { - ra_free(as, r); - if (rset_test(as->modset, r) || irt_ismarked(ir->t)) - ir->r = RID_INIT; /* No inheritance for modified BASE register. */ - if (r != RID_BASE) - emit_move(as, r, RID_BASE); - } -} - -/* Coalesce BASE register for a side trace. */ -static RegSet asm_head_side_base(ASMState *as, IRIns *irp, RegSet allow) -{ - IRIns *ir = IR(REF_BASE); - Reg r = ir->r; - if (as->loopinv) as->mctop--; - if (ra_hasreg(r)) { - ra_free(as, r); - if (rset_test(as->modset, r) || irt_ismarked(ir->t)) - ir->r = RID_INIT; /* No inheritance for modified BASE register. */ - if (irp->r == r) { - rset_clear(allow, r); /* Mark same BASE register as coalesced. */ - } else if (ra_hasreg(irp->r) && rset_test(as->freeset, irp->r)) { - rset_clear(allow, irp->r); - emit_move(as, r, irp->r); /* Move from coalesced parent reg. */ - } else { - emit_getgl(as, r, jit_base); /* Otherwise reload BASE. */ - } - } - return allow; -} - -/* -- Tail of trace ------------------------------------------------------- */ - -/* Fixup the tail code. */ -static void asm_tail_fixup(ASMState *as, TraceNo lnk) -{ - MCode *target = lnk ? traceref(as->J,lnk)->mcode : (MCode *)lj_vm_exit_interp; - int32_t spadj = as->T->spadjust; - MCode *p = as->mctop-1; - *p = spadj ? (MIPSI_ADDIU|MIPSF_T(RID_SP)|MIPSF_S(RID_SP)|spadj) : MIPSI_NOP; - p[-1] = MIPSI_J|(((uintptr_t)target>>2)&0x03ffffffu); -} - -/* Prepare tail of code. */ -static void asm_tail_prep(ASMState *as) -{ - as->mcp = as->mctop-2; /* Leave room for branch plus nop or stack adj. */ - as->invmcp = as->loopref ? as->mcp : NULL; -} - -/* -- Instruction dispatch ------------------------------------------------ */ - -/* Assemble a single instruction. */ -static void asm_ir(ASMState *as, IRIns *ir) -{ - switch ((IROp)ir->o) { - /* Miscellaneous ops. */ - case IR_LOOP: asm_loop(as); break; - case IR_NOP: case IR_XBAR: lua_assert(!ra_used(ir)); break; - case IR_USE: - ra_alloc1(as, ir->op1, irt_isfp(ir->t) ? RSET_FPR : RSET_GPR); break; - case IR_PHI: asm_phi(as, ir); break; - case IR_HIOP: asm_hiop(as, ir); break; - case IR_GCSTEP: asm_gcstep(as, ir); break; - - /* Guarded assertions. */ - case IR_EQ: case IR_NE: asm_compeq(as, ir); break; - case IR_LT: case IR_GE: case IR_LE: case IR_GT: - case IR_ULT: case IR_UGE: case IR_ULE: case IR_UGT: - case IR_ABC: - asm_comp(as, ir); - break; - - case IR_RETF: asm_retf(as, ir); break; - - /* Bit ops. */ - case IR_BNOT: asm_bitnot(as, ir); break; - case IR_BSWAP: asm_bitswap(as, ir); break; - - case IR_BAND: asm_bitop(as, ir, MIPSI_AND, MIPSI_ANDI); break; - case IR_BOR: asm_bitop(as, ir, MIPSI_OR, MIPSI_ORI); break; - case IR_BXOR: asm_bitop(as, ir, MIPSI_XOR, MIPSI_XORI); break; - - case IR_BSHL: asm_bitshift(as, ir, MIPSI_SLLV, MIPSI_SLL); break; - case IR_BSHR: asm_bitshift(as, ir, MIPSI_SRLV, MIPSI_SRL); break; - case IR_BSAR: asm_bitshift(as, ir, MIPSI_SRAV, MIPSI_SRA); break; - case IR_BROL: lua_assert(0); break; - case IR_BROR: asm_bitror(as, ir); break; - - /* Arithmetic ops. */ - case IR_ADD: asm_add(as, ir); break; - case IR_SUB: asm_sub(as, ir); break; - case IR_MUL: asm_mul(as, ir); break; - case IR_DIV: asm_fparith(as, ir, MIPSI_DIV_D); break; - case IR_MOD: asm_callid(as, ir, IRCALL_lj_vm_modi); break; - case IR_POW: asm_callid(as, ir, IRCALL_lj_vm_powi); break; - case IR_NEG: asm_neg(as, ir); break; - - case IR_ABS: asm_fpunary(as, ir, MIPSI_ABS_D); break; - case IR_ATAN2: asm_callid(as, ir, IRCALL_atan2); break; - case IR_LDEXP: asm_callid(as, ir, IRCALL_ldexp); break; - case IR_MIN: asm_min_max(as, ir, 0); break; - case IR_MAX: asm_min_max(as, ir, 1); break; - case IR_FPMATH: - if (ir->op2 == IRFPM_EXP2 && asm_fpjoin_pow(as, ir)) - break; - if (ir->op2 <= IRFPM_TRUNC) - asm_callround(as, ir, IRCALL_lj_vm_floor + ir->op2); - else if (ir->op2 == IRFPM_SQRT) - asm_fpunary(as, ir, MIPSI_SQRT_D); - else - asm_callid(as, ir, IRCALL_lj_vm_floor + ir->op2); - break; - - /* Overflow-checking arithmetic ops. */ - case IR_ADDOV: asm_arithov(as, ir); break; - case IR_SUBOV: asm_arithov(as, ir); break; - case IR_MULOV: asm_mulov(as, ir); break; - - /* Memory references. */ - case IR_AREF: asm_aref(as, ir); break; - case IR_HREF: asm_href(as, ir); break; - case IR_HREFK: asm_hrefk(as, ir); break; - case IR_NEWREF: asm_newref(as, ir); break; - case IR_UREFO: case IR_UREFC: asm_uref(as, ir); break; - case IR_FREF: asm_fref(as, ir); break; - case IR_STRREF: asm_strref(as, ir); break; - - /* Loads and stores. */ - case IR_ALOAD: case IR_HLOAD: case IR_ULOAD: case IR_VLOAD: - asm_ahuvload(as, ir); - break; - case IR_FLOAD: asm_fload(as, ir); break; - case IR_XLOAD: asm_xload(as, ir); break; - case IR_SLOAD: asm_sload(as, ir); break; - - case IR_ASTORE: case IR_HSTORE: case IR_USTORE: asm_ahustore(as, ir); break; - case IR_FSTORE: asm_fstore(as, ir); break; - case IR_XSTORE: asm_xstore(as, ir, 0); break; - - /* Allocations. */ - case IR_SNEW: case IR_XSNEW: asm_snew(as, ir); break; - case IR_TNEW: asm_tnew(as, ir); break; - case IR_TDUP: asm_tdup(as, ir); break; - case IR_CNEW: case IR_CNEWI: asm_cnew(as, ir); break; - - /* Write barriers. */ - case IR_TBAR: asm_tbar(as, ir); break; - case IR_OBAR: asm_obar(as, ir); break; - - /* Type conversions. */ - case IR_CONV: asm_conv(as, ir); break; - case IR_TOBIT: asm_tobit(as, ir); break; - case IR_TOSTR: asm_tostr(as, ir); break; - case IR_STRTO: asm_strto(as, ir); break; - - /* Calls. */ - case IR_CALLN: case IR_CALLL: case IR_CALLS: asm_call(as, ir); break; - case IR_CALLXS: asm_callx(as, ir); break; - case IR_CARG: break; - - default: - setintV(&as->J->errinfo, ir->o); - lj_trace_err_info(as->J, LJ_TRERR_NYIIR); - break; - } -} - -/* -- Trace setup --------------------------------------------------------- */ - -/* Ensure there are enough stack slots for call arguments. */ -static Reg asm_setup_call_slots(ASMState *as, IRIns *ir, const CCallInfo *ci) -{ - IRRef args[CCI_NARGS_MAX*2]; - uint32_t i, nargs = (int)CCI_NARGS(ci); - int nslots = 4, ngpr = REGARG_NUMGPR, nfpr = REGARG_NUMFPR; - asm_collectargs(as, ir, ci, args); - for (i = 0; i < nargs; i++) { - if (args[i] && irt_isfp(IR(args[i])->t) && - nfpr > 0 && !(ci->flags & CCI_VARARG)) { - nfpr--; - ngpr -= irt_isnum(IR(args[i])->t) ? 2 : 1; - } else if (args[i] && irt_isnum(IR(args[i])->t)) { - nfpr = 0; - ngpr = ngpr & ~1; - if (ngpr > 0) ngpr -= 2; else nslots = (nslots+3) & ~1; - } else { - nfpr = 0; - if (ngpr > 0) ngpr--; else nslots++; - } - } - if (nslots > as->evenspill) /* Leave room for args in stack slots. */ - as->evenspill = nslots; - return irt_isfp(ir->t) ? REGSP_HINT(RID_FPRET) : REGSP_HINT(RID_RET); -} - -static void asm_setup_target(ASMState *as) -{ - asm_sparejump_setup(as); - asm_exitstub_setup(as); -} - -/* -- Trace patching ------------------------------------------------------ */ - -/* Patch exit jumps of existing machine code to a new target. */ -void lj_asm_patchexit(jit_State *J, GCtrace *T, ExitNo exitno, MCode *target) -{ - MCode *p = T->mcode; - MCode *pe = (MCode *)((char *)p + T->szmcode); - MCode *px = exitstub_trace_addr(T, exitno); - MCode *cstart = NULL, *cstop = NULL; - MCode *mcarea = lj_mcode_patch(J, p, 0); - MCode exitload = MIPSI_LI | MIPSF_T(RID_TMP) | exitno; - MCode tjump = MIPSI_J|(((uintptr_t)target>>2)&0x03ffffffu); - for (p++; p < pe; p++) { - if (*p == exitload) { /* Look for load of exit number. */ - if (((p[-1] ^ (px-p)) & 0xffffu) == 0) { /* Look for exitstub branch. */ - ptrdiff_t delta = target - p; - if (((delta + 0x8000) >> 16) == 0) { /* Patch in-range branch. */ - patchbranch: - p[-1] = (p[-1] & 0xffff0000u) | (delta & 0xffffu); - *p = MIPSI_NOP; /* Replace the load of the exit number. */ - cstop = p; - if (!cstart) cstart = p-1; - } else { /* Branch out of range. Use spare jump slot in mcarea. */ - int i; - for (i = 2; i < 2+MIPS_SPAREJUMP*2; i += 2) { - if (mcarea[i] == tjump) { - delta = mcarea+i - p; - goto patchbranch; - } else if (mcarea[i] == MIPSI_NOP) { - mcarea[i] = tjump; - cstart = mcarea+i; - delta = mcarea+i - p; - goto patchbranch; - } - } - /* Ignore jump slot overflow. Child trace is simply not attached. */ - } - } else if (p+1 == pe) { - /* Patch NOP after code for inverted loop branch. Use of J is ok. */ - lua_assert(p[1] == MIPSI_NOP); - p[1] = tjump; - *p = MIPSI_NOP; /* Replace the load of the exit number. */ - cstop = p+2; - if (!cstart) cstart = p+1; - } - } - } - if (cstart) lj_mcode_sync(cstart, cstop); - lj_mcode_patch(J, mcarea, 1); -} - diff --git a/deps/luajit/src/lj_asm_ppc.h b/deps/luajit/src/lj_asm_ppc.h deleted file mode 100644 index 2c5d74a8..00000000 --- a/deps/luajit/src/lj_asm_ppc.h +++ /dev/null @@ -1,2169 +0,0 @@ -/* -** PPC IR assembler (SSA IR -> machine code). -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -/* -- Register allocator extensions --------------------------------------- */ - -/* Allocate a register with a hint. */ -static Reg ra_hintalloc(ASMState *as, IRRef ref, Reg hint, RegSet allow) -{ - Reg r = IR(ref)->r; - if (ra_noreg(r)) { - if (!ra_hashint(r) && !iscrossref(as, ref)) - ra_sethint(IR(ref)->r, hint); /* Propagate register hint. */ - r = ra_allocref(as, ref, allow); - } - ra_noweak(as, r); - return r; -} - -/* Allocate two source registers for three-operand instructions. */ -static Reg ra_alloc2(ASMState *as, IRIns *ir, RegSet allow) -{ - IRIns *irl = IR(ir->op1), *irr = IR(ir->op2); - Reg left = irl->r, right = irr->r; - if (ra_hasreg(left)) { - ra_noweak(as, left); - if (ra_noreg(right)) - right = ra_allocref(as, ir->op2, rset_exclude(allow, left)); - else - ra_noweak(as, right); - } else if (ra_hasreg(right)) { - ra_noweak(as, right); - left = ra_allocref(as, ir->op1, rset_exclude(allow, right)); - } else if (ra_hashint(right)) { - right = ra_allocref(as, ir->op2, allow); - left = ra_alloc1(as, ir->op1, rset_exclude(allow, right)); - } else { - left = ra_allocref(as, ir->op1, allow); - right = ra_alloc1(as, ir->op2, rset_exclude(allow, left)); - } - return left | (right << 8); -} - -/* -- Guard handling ------------------------------------------------------ */ - -/* Setup exit stubs after the end of each trace. */ -static void asm_exitstub_setup(ASMState *as, ExitNo nexits) -{ - ExitNo i; - MCode *mxp = as->mctop; - if (mxp - (nexits + 3 + MCLIM_REDZONE) < as->mclim) - asm_mclimit(as); - /* 1: mflr r0; bl ->vm_exit_handler; li r0, traceno; bl <1; bl <1; ... */ - for (i = nexits-1; (int32_t)i >= 0; i--) - *--mxp = PPCI_BL|(((-3-i)&0x00ffffffu)<<2); - *--mxp = PPCI_LI|PPCF_T(RID_TMP)|as->T->traceno; /* Read by exit handler. */ - mxp--; - *mxp = PPCI_BL|((((MCode *)(void *)lj_vm_exit_handler-mxp)&0x00ffffffu)<<2); - *--mxp = PPCI_MFLR|PPCF_T(RID_TMP); - as->mctop = mxp; -} - -static MCode *asm_exitstub_addr(ASMState *as, ExitNo exitno) -{ - /* Keep this in-sync with exitstub_trace_addr(). */ - return as->mctop + exitno + 3; -} - -/* Emit conditional branch to exit for guard. */ -static void asm_guardcc(ASMState *as, PPCCC cc) -{ - MCode *target = asm_exitstub_addr(as, as->snapno); - MCode *p = as->mcp; - if (LJ_UNLIKELY(p == as->invmcp)) { - as->loopinv = 1; - *p = PPCI_B | (((target-p) & 0x00ffffffu) << 2); - emit_condbranch(as, PPCI_BC, cc^4, p); - return; - } - emit_condbranch(as, PPCI_BC, cc, target); -} - -/* -- Operand fusion ------------------------------------------------------ */ - -/* Limit linear search to this distance. Avoids O(n^2) behavior. */ -#define CONFLICT_SEARCH_LIM 31 - -/* Check if there's no conflicting instruction between curins and ref. */ -static int noconflict(ASMState *as, IRRef ref, IROp conflict) -{ - IRIns *ir = as->ir; - IRRef i = as->curins; - if (i > ref + CONFLICT_SEARCH_LIM) - return 0; /* Give up, ref is too far away. */ - while (--i > ref) - if (ir[i].o == conflict) - return 0; /* Conflict found. */ - return 1; /* Ok, no conflict. */ -} - -/* Fuse the array base of colocated arrays. */ -static int32_t asm_fuseabase(ASMState *as, IRRef ref) -{ - IRIns *ir = IR(ref); - if (ir->o == IR_TNEW && ir->op1 <= LJ_MAX_COLOSIZE && - !neverfuse(as) && noconflict(as, ref, IR_NEWREF)) - return (int32_t)sizeof(GCtab); - return 0; -} - -/* Indicates load/store indexed is ok. */ -#define AHUREF_LSX ((int32_t)0x80000000) - -/* Fuse array/hash/upvalue reference into register+offset operand. */ -static Reg asm_fuseahuref(ASMState *as, IRRef ref, int32_t *ofsp, RegSet allow) -{ - IRIns *ir = IR(ref); - if (ra_noreg(ir->r)) { - if (ir->o == IR_AREF) { - if (mayfuse(as, ref)) { - if (irref_isk(ir->op2)) { - IRRef tab = IR(ir->op1)->op1; - int32_t ofs = asm_fuseabase(as, tab); - IRRef refa = ofs ? tab : ir->op1; - ofs += 8*IR(ir->op2)->i; - if (checki16(ofs)) { - *ofsp = ofs; - return ra_alloc1(as, refa, allow); - } - } - if (*ofsp == AHUREF_LSX) { - Reg base = ra_alloc1(as, ir->op1, allow); - Reg idx = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, base)); - return base | (idx << 8); - } - } - } else if (ir->o == IR_HREFK) { - if (mayfuse(as, ref)) { - int32_t ofs = (int32_t)(IR(ir->op2)->op2 * sizeof(Node)); - if (checki16(ofs)) { - *ofsp = ofs; - return ra_alloc1(as, ir->op1, allow); - } - } - } else if (ir->o == IR_UREFC) { - if (irref_isk(ir->op1)) { - GCfunc *fn = ir_kfunc(IR(ir->op1)); - int32_t ofs = i32ptr(&gcref(fn->l.uvptr[(ir->op2 >> 8)])->uv.tv); - int32_t jgl = (intptr_t)J2G(as->J); - if ((uint32_t)(ofs-jgl) < 65536) { - *ofsp = ofs-jgl-32768; - return RID_JGL; - } else { - *ofsp = (int16_t)ofs; - return ra_allock(as, ofs-(int16_t)ofs, allow); - } - } - } - } - *ofsp = 0; - return ra_alloc1(as, ref, allow); -} - -/* Fuse XLOAD/XSTORE reference into load/store operand. */ -static void asm_fusexref(ASMState *as, PPCIns pi, Reg rt, IRRef ref, - RegSet allow, int32_t ofs) -{ - IRIns *ir = IR(ref); - Reg base; - if (ra_noreg(ir->r) && canfuse(as, ir)) { - if (ir->o == IR_ADD) { - int32_t ofs2; - if (irref_isk(ir->op2) && (ofs2 = ofs + IR(ir->op2)->i, checki16(ofs2))) { - ofs = ofs2; - ref = ir->op1; - } else if (ofs == 0) { - Reg right, left = ra_alloc2(as, ir, allow); - right = (left >> 8); left &= 255; - emit_fab(as, PPCI_LWZX | ((pi >> 20) & 0x780), rt, left, right); - return; - } - } else if (ir->o == IR_STRREF) { - lua_assert(ofs == 0); - ofs = (int32_t)sizeof(GCstr); - if (irref_isk(ir->op2)) { - ofs += IR(ir->op2)->i; - ref = ir->op1; - } else if (irref_isk(ir->op1)) { - ofs += IR(ir->op1)->i; - ref = ir->op2; - } else { - /* NYI: Fuse ADD with constant. */ - Reg tmp, right, left = ra_alloc2(as, ir, allow); - right = (left >> 8); left &= 255; - tmp = ra_scratch(as, rset_exclude(rset_exclude(allow, left), right)); - emit_fai(as, pi, rt, tmp, ofs); - emit_tab(as, PPCI_ADD, tmp, left, right); - return; - } - if (!checki16(ofs)) { - Reg left = ra_alloc1(as, ref, allow); - Reg right = ra_allock(as, ofs, rset_exclude(allow, left)); - emit_fab(as, PPCI_LWZX | ((pi >> 20) & 0x780), rt, left, right); - return; - } - } - } - base = ra_alloc1(as, ref, allow); - emit_fai(as, pi, rt, base, ofs); -} - -/* Fuse XLOAD/XSTORE reference into indexed-only load/store operand. */ -static void asm_fusexrefx(ASMState *as, PPCIns pi, Reg rt, IRRef ref, - RegSet allow) -{ - IRIns *ira = IR(ref); - Reg right, left; - if (canfuse(as, ira) && ira->o == IR_ADD && ra_noreg(ira->r)) { - left = ra_alloc2(as, ira, allow); - right = (left >> 8); left &= 255; - } else { - right = ra_alloc1(as, ref, allow); - left = RID_R0; - } - emit_tab(as, pi, rt, left, right); -} - -/* Fuse to multiply-add/sub instruction. */ -static int asm_fusemadd(ASMState *as, IRIns *ir, PPCIns pi, PPCIns pir) -{ - IRRef lref = ir->op1, rref = ir->op2; - IRIns *irm; - if (lref != rref && - ((mayfuse(as, lref) && (irm = IR(lref), irm->o == IR_MUL) && - ra_noreg(irm->r)) || - (mayfuse(as, rref) && (irm = IR(rref), irm->o == IR_MUL) && - (rref = lref, pi = pir, ra_noreg(irm->r))))) { - Reg dest = ra_dest(as, ir, RSET_FPR); - Reg add = ra_alloc1(as, rref, RSET_FPR); - Reg right, left = ra_alloc2(as, irm, rset_exclude(RSET_FPR, add)); - right = (left >> 8); left &= 255; - emit_facb(as, pi, dest, left, right, add); - return 1; - } - return 0; -} - -/* -- Calls --------------------------------------------------------------- */ - -/* Generate a call to a C function. */ -static void asm_gencall(ASMState *as, const CCallInfo *ci, IRRef *args) -{ - uint32_t n, nargs = CCI_NARGS(ci); - int32_t ofs = 8; - Reg gpr = REGARG_FIRSTGPR, fpr = REGARG_FIRSTFPR; - if ((void *)ci->func) - emit_call(as, (void *)ci->func); - for (n = 0; n < nargs; n++) { /* Setup args. */ - IRRef ref = args[n]; - if (ref) { - IRIns *ir = IR(ref); - if (irt_isfp(ir->t)) { - if (fpr <= REGARG_LASTFPR) { - lua_assert(rset_test(as->freeset, fpr)); /* Already evicted. */ - ra_leftov(as, fpr, ref); - fpr++; - } else { - Reg r = ra_alloc1(as, ref, RSET_FPR); - if (irt_isnum(ir->t)) ofs = (ofs + 4) & ~4; - emit_spstore(as, ir, r, ofs); - ofs += irt_isnum(ir->t) ? 8 : 4; - } - } else { - if (gpr <= REGARG_LASTGPR) { - lua_assert(rset_test(as->freeset, gpr)); /* Already evicted. */ - ra_leftov(as, gpr, ref); - gpr++; - } else { - Reg r = ra_alloc1(as, ref, RSET_GPR); - emit_spstore(as, ir, r, ofs); - ofs += 4; - } - } - } else { - if (gpr <= REGARG_LASTGPR) - gpr++; - else - ofs += 4; - } - checkmclim(as); - } - if ((ci->flags & CCI_VARARG)) /* Vararg calls need to know about FPR use. */ - emit_tab(as, fpr == REGARG_FIRSTFPR ? PPCI_CRXOR : PPCI_CREQV, 6, 6, 6); -} - -/* Setup result reg/sp for call. Evict scratch regs. */ -static void asm_setupresult(ASMState *as, IRIns *ir, const CCallInfo *ci) -{ - RegSet drop = RSET_SCRATCH; - int hiop = ((ir+1)->o == IR_HIOP); - if ((ci->flags & CCI_NOFPRCLOBBER)) - drop &= ~RSET_FPR; - if (ra_hasreg(ir->r)) - rset_clear(drop, ir->r); /* Dest reg handled below. */ - if (hiop && ra_hasreg((ir+1)->r)) - rset_clear(drop, (ir+1)->r); /* Dest reg handled below. */ - ra_evictset(as, drop); /* Evictions must be performed first. */ - if (ra_used(ir)) { - lua_assert(!irt_ispri(ir->t)); - if (irt_isfp(ir->t)) { - if ((ci->flags & CCI_CASTU64)) { - /* Use spill slot or temp slots. */ - int32_t ofs = ir->s ? sps_scale(ir->s) : SPOFS_TMP; - Reg dest = ir->r; - if (ra_hasreg(dest)) { - ra_free(as, dest); - ra_modified(as, dest); - emit_fai(as, PPCI_LFD, dest, RID_SP, ofs); - } - emit_tai(as, PPCI_STW, RID_RETHI, RID_SP, ofs); - emit_tai(as, PPCI_STW, RID_RETLO, RID_SP, ofs+4); - } else { - ra_destreg(as, ir, RID_FPRET); - } - } else if (hiop) { - ra_destpair(as, ir); - } else { - ra_destreg(as, ir, RID_RET); - } - } -} - -static void asm_call(ASMState *as, IRIns *ir) -{ - IRRef args[CCI_NARGS_MAX]; - const CCallInfo *ci = &lj_ir_callinfo[ir->op2]; - asm_collectargs(as, ir, ci, args); - asm_setupresult(as, ir, ci); - asm_gencall(as, ci, args); -} - -static void asm_callx(ASMState *as, IRIns *ir) -{ - IRRef args[CCI_NARGS_MAX*2]; - CCallInfo ci; - IRRef func; - IRIns *irf; - ci.flags = asm_callx_flags(as, ir); - asm_collectargs(as, ir, &ci, args); - asm_setupresult(as, ir, &ci); - func = ir->op2; irf = IR(func); - if (irf->o == IR_CARG) { func = irf->op1; irf = IR(func); } - if (irref_isk(func)) { /* Call to constant address. */ - ci.func = (ASMFunction)(void *)(irf->i); - } else { /* Need a non-argument register for indirect calls. */ - RegSet allow = RSET_GPR & ~RSET_RANGE(RID_R0, REGARG_LASTGPR+1); - Reg freg = ra_alloc1(as, func, allow); - *--as->mcp = PPCI_BCTRL; - *--as->mcp = PPCI_MTCTR | PPCF_T(freg); - ci.func = (ASMFunction)(void *)0; - } - asm_gencall(as, &ci, args); -} - -static void asm_callid(ASMState *as, IRIns *ir, IRCallID id) -{ - const CCallInfo *ci = &lj_ir_callinfo[id]; - IRRef args[2]; - args[0] = ir->op1; - args[1] = ir->op2; - asm_setupresult(as, ir, ci); - asm_gencall(as, ci, args); -} - -/* -- Returns ------------------------------------------------------------- */ - -/* Return to lower frame. Guard that it goes to the right spot. */ -static void asm_retf(ASMState *as, IRIns *ir) -{ - Reg base = ra_alloc1(as, REF_BASE, RSET_GPR); - void *pc = ir_kptr(IR(ir->op2)); - int32_t delta = 1+bc_a(*((const BCIns *)pc - 1)); - as->topslot -= (BCReg)delta; - if ((int32_t)as->topslot < 0) as->topslot = 0; - irt_setmark(IR(REF_BASE)->t); /* Children must not coalesce with BASE reg. */ - emit_setgl(as, base, jit_base); - emit_addptr(as, base, -8*delta); - asm_guardcc(as, CC_NE); - emit_ab(as, PPCI_CMPW, RID_TMP, - ra_allock(as, i32ptr(pc), rset_exclude(RSET_GPR, base))); - emit_tai(as, PPCI_LWZ, RID_TMP, base, -8); -} - -/* -- Type conversions ---------------------------------------------------- */ - -static void asm_tointg(ASMState *as, IRIns *ir, Reg left) -{ - RegSet allow = RSET_FPR; - Reg tmp = ra_scratch(as, rset_clear(allow, left)); - Reg fbias = ra_scratch(as, rset_clear(allow, tmp)); - Reg dest = ra_dest(as, ir, RSET_GPR); - Reg hibias = ra_allock(as, 0x43300000, rset_exclude(RSET_GPR, dest)); - asm_guardcc(as, CC_NE); - emit_fab(as, PPCI_FCMPU, 0, tmp, left); - emit_fab(as, PPCI_FSUB, tmp, tmp, fbias); - emit_fai(as, PPCI_LFD, tmp, RID_SP, SPOFS_TMP); - emit_tai(as, PPCI_STW, RID_TMP, RID_SP, SPOFS_TMPLO); - emit_tai(as, PPCI_STW, hibias, RID_SP, SPOFS_TMPHI); - emit_asi(as, PPCI_XORIS, RID_TMP, dest, 0x8000); - emit_tai(as, PPCI_LWZ, dest, RID_SP, SPOFS_TMPLO); - emit_lsptr(as, PPCI_LFS, (fbias & 31), - (void *)lj_ir_k64_find(as->J, U64x(59800004,59800000)), - RSET_GPR); - emit_fai(as, PPCI_STFD, tmp, RID_SP, SPOFS_TMP); - emit_fb(as, PPCI_FCTIWZ, tmp, left); -} - -static void asm_tobit(ASMState *as, IRIns *ir) -{ - RegSet allow = RSET_FPR; - Reg dest = ra_dest(as, ir, RSET_GPR); - Reg left = ra_alloc1(as, ir->op1, allow); - Reg right = ra_alloc1(as, ir->op2, rset_clear(allow, left)); - Reg tmp = ra_scratch(as, rset_clear(allow, right)); - emit_tai(as, PPCI_LWZ, dest, RID_SP, SPOFS_TMPLO); - emit_fai(as, PPCI_STFD, tmp, RID_SP, SPOFS_TMP); - emit_fab(as, PPCI_FADD, tmp, left, right); -} - -static void asm_conv(ASMState *as, IRIns *ir) -{ - IRType st = (IRType)(ir->op2 & IRCONV_SRCMASK); - int stfp = (st == IRT_NUM || st == IRT_FLOAT); - IRRef lref = ir->op1; - lua_assert(irt_type(ir->t) != st); - lua_assert(!(irt_isint64(ir->t) || - (st == IRT_I64 || st == IRT_U64))); /* Handled by SPLIT. */ - if (irt_isfp(ir->t)) { - Reg dest = ra_dest(as, ir, RSET_FPR); - if (stfp) { /* FP to FP conversion. */ - if (st == IRT_NUM) /* double -> float conversion. */ - emit_fb(as, PPCI_FRSP, dest, ra_alloc1(as, lref, RSET_FPR)); - else /* float -> double conversion is a no-op on PPC. */ - ra_leftov(as, dest, lref); /* Do nothing, but may need to move regs. */ - } else { /* Integer to FP conversion. */ - /* IRT_INT: Flip hibit, bias with 2^52, subtract 2^52+2^31. */ - /* IRT_U32: Bias with 2^52, subtract 2^52. */ - RegSet allow = RSET_GPR; - Reg left = ra_alloc1(as, lref, allow); - Reg hibias = ra_allock(as, 0x43300000, rset_clear(allow, left)); - Reg fbias = ra_scratch(as, rset_exclude(RSET_FPR, dest)); - const float *kbias; - if (irt_isfloat(ir->t)) emit_fb(as, PPCI_FRSP, dest, dest); - emit_fab(as, PPCI_FSUB, dest, dest, fbias); - emit_fai(as, PPCI_LFD, dest, RID_SP, SPOFS_TMP); - kbias = (const float *)lj_ir_k64_find(as->J, U64x(59800004,59800000)); - if (st == IRT_U32) kbias++; - emit_lsptr(as, PPCI_LFS, (fbias & 31), (void *)kbias, - rset_clear(allow, hibias)); - emit_tai(as, PPCI_STW, st == IRT_U32 ? left : RID_TMP, - RID_SP, SPOFS_TMPLO); - emit_tai(as, PPCI_STW, hibias, RID_SP, SPOFS_TMPHI); - if (st != IRT_U32) emit_asi(as, PPCI_XORIS, RID_TMP, left, 0x8000); - } - } else if (stfp) { /* FP to integer conversion. */ - if (irt_isguard(ir->t)) { - /* Checked conversions are only supported from number to int. */ - lua_assert(irt_isint(ir->t) && st == IRT_NUM); - asm_tointg(as, ir, ra_alloc1(as, lref, RSET_FPR)); - } else { - Reg dest = ra_dest(as, ir, RSET_GPR); - Reg left = ra_alloc1(as, lref, RSET_FPR); - Reg tmp = ra_scratch(as, rset_exclude(RSET_FPR, left)); - if (irt_isu32(ir->t)) { - /* Convert both x and x-2^31 to int and merge results. */ - Reg tmpi = ra_scratch(as, rset_exclude(RSET_GPR, dest)); - emit_asb(as, PPCI_OR, dest, dest, tmpi); /* Select with mask idiom. */ - emit_asb(as, PPCI_AND, tmpi, tmpi, RID_TMP); - emit_asb(as, PPCI_ANDC, dest, dest, RID_TMP); - emit_tai(as, PPCI_LWZ, tmpi, RID_SP, SPOFS_TMPLO); /* tmp = (int)(x) */ - emit_tai(as, PPCI_ADDIS, dest, dest, 0x8000); /* dest += 2^31 */ - emit_asb(as, PPCI_SRAWI, RID_TMP, dest, 31); /* mask = -(dest < 0) */ - emit_fai(as, PPCI_STFD, tmp, RID_SP, SPOFS_TMP); - emit_tai(as, PPCI_LWZ, dest, - RID_SP, SPOFS_TMPLO); /* dest = (int)(x-2^31) */ - emit_fb(as, PPCI_FCTIWZ, tmp, left); - emit_fai(as, PPCI_STFD, tmp, RID_SP, SPOFS_TMP); - emit_fb(as, PPCI_FCTIWZ, tmp, tmp); - emit_fab(as, PPCI_FSUB, tmp, left, tmp); - emit_lsptr(as, PPCI_LFS, (tmp & 31), - (void *)lj_ir_k64_find(as->J, U64x(4f000000,00000000)), - RSET_GPR); - } else { - emit_tai(as, PPCI_LWZ, dest, RID_SP, SPOFS_TMPLO); - emit_fai(as, PPCI_STFD, tmp, RID_SP, SPOFS_TMP); - emit_fb(as, PPCI_FCTIWZ, tmp, left); - } - } - } else { - Reg dest = ra_dest(as, ir, RSET_GPR); - if (st >= IRT_I8 && st <= IRT_U16) { /* Extend to 32 bit integer. */ - Reg left = ra_alloc1(as, ir->op1, RSET_GPR); - lua_assert(irt_isint(ir->t) || irt_isu32(ir->t)); - if ((ir->op2 & IRCONV_SEXT)) - emit_as(as, st == IRT_I8 ? PPCI_EXTSB : PPCI_EXTSH, dest, left); - else - emit_rot(as, PPCI_RLWINM, dest, left, 0, st == IRT_U8 ? 24 : 16, 31); - } else { /* 32/64 bit integer conversions. */ - /* Only need to handle 32/32 bit no-op (cast) on 32 bit archs. */ - ra_leftov(as, dest, lref); /* Do nothing, but may need to move regs. */ - } - } -} - -#if LJ_HASFFI -static void asm_conv64(ASMState *as, IRIns *ir) -{ - IRType st = (IRType)((ir-1)->op2 & IRCONV_SRCMASK); - IRType dt = (((ir-1)->op2 & IRCONV_DSTMASK) >> IRCONV_DSH); - IRCallID id; - const CCallInfo *ci; - IRRef args[2]; - args[0] = ir->op1; - args[1] = (ir-1)->op1; - if (st == IRT_NUM || st == IRT_FLOAT) { - id = IRCALL_fp64_d2l + ((st == IRT_FLOAT) ? 2 : 0) + (dt - IRT_I64); - ir--; - } else { - id = IRCALL_fp64_l2d + ((dt == IRT_FLOAT) ? 2 : 0) + (st - IRT_I64); - } - ci = &lj_ir_callinfo[id]; - asm_setupresult(as, ir, ci); - asm_gencall(as, ci, args); -} -#endif - -static void asm_strto(ASMState *as, IRIns *ir) -{ - const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_strscan_num]; - IRRef args[2]; - int32_t ofs; - RegSet drop = RSET_SCRATCH; - if (ra_hasreg(ir->r)) rset_set(drop, ir->r); /* Spill dest reg (if any). */ - ra_evictset(as, drop); - asm_guardcc(as, CC_EQ); - emit_ai(as, PPCI_CMPWI, RID_RET, 0); /* Test return status. */ - args[0] = ir->op1; /* GCstr *str */ - args[1] = ASMREF_TMP1; /* TValue *n */ - asm_gencall(as, ci, args); - /* Store the result to the spill slot or temp slots. */ - ofs = ir->s ? sps_scale(ir->s) : SPOFS_TMP; - emit_tai(as, PPCI_ADDI, ra_releasetmp(as, ASMREF_TMP1), RID_SP, ofs); -} - -/* Get pointer to TValue. */ -static void asm_tvptr(ASMState *as, Reg dest, IRRef ref) -{ - IRIns *ir = IR(ref); - if (irt_isnum(ir->t)) { - if (irref_isk(ref)) /* Use the number constant itself as a TValue. */ - ra_allockreg(as, i32ptr(ir_knum(ir)), dest); - else /* Otherwise force a spill and use the spill slot. */ - emit_tai(as, PPCI_ADDI, dest, RID_SP, ra_spill(as, ir)); - } else { - /* Otherwise use g->tmptv to hold the TValue. */ - RegSet allow = rset_exclude(RSET_GPR, dest); - Reg type; - emit_tai(as, PPCI_ADDI, dest, RID_JGL, offsetof(global_State, tmptv)-32768); - if (!irt_ispri(ir->t)) { - Reg src = ra_alloc1(as, ref, allow); - emit_setgl(as, src, tmptv.gcr); - } - type = ra_allock(as, irt_toitype(ir->t), allow); - emit_setgl(as, type, tmptv.it); - } -} - -static void asm_tostr(ASMState *as, IRIns *ir) -{ - IRRef args[2]; - args[0] = ASMREF_L; - as->gcsteps++; - if (irt_isnum(IR(ir->op1)->t) || (ir+1)->o == IR_HIOP) { - const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_str_fromnum]; - args[1] = ASMREF_TMP1; /* const lua_Number * */ - asm_setupresult(as, ir, ci); /* GCstr * */ - asm_gencall(as, ci, args); - asm_tvptr(as, ra_releasetmp(as, ASMREF_TMP1), ir->op1); - } else { - const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_str_fromint]; - args[1] = ir->op1; /* int32_t k */ - asm_setupresult(as, ir, ci); /* GCstr * */ - asm_gencall(as, ci, args); - } -} - -/* -- Memory references --------------------------------------------------- */ - -static void asm_aref(ASMState *as, IRIns *ir) -{ - Reg dest = ra_dest(as, ir, RSET_GPR); - Reg idx, base; - if (irref_isk(ir->op2)) { - IRRef tab = IR(ir->op1)->op1; - int32_t ofs = asm_fuseabase(as, tab); - IRRef refa = ofs ? tab : ir->op1; - ofs += 8*IR(ir->op2)->i; - if (checki16(ofs)) { - base = ra_alloc1(as, refa, RSET_GPR); - emit_tai(as, PPCI_ADDI, dest, base, ofs); - return; - } - } - base = ra_alloc1(as, ir->op1, RSET_GPR); - idx = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, base)); - emit_tab(as, PPCI_ADD, dest, RID_TMP, base); - emit_slwi(as, RID_TMP, idx, 3); -} - -/* Inlined hash lookup. Specialized for key type and for const keys. -** The equivalent C code is: -** Node *n = hashkey(t, key); -** do { -** if (lj_obj_equal(&n->key, key)) return &n->val; -** } while ((n = nextnode(n))); -** return niltv(L); -*/ -static void asm_href(ASMState *as, IRIns *ir, IROp merge) -{ - RegSet allow = RSET_GPR; - int destused = ra_used(ir); - Reg dest = ra_dest(as, ir, allow); - Reg tab = ra_alloc1(as, ir->op1, rset_clear(allow, dest)); - Reg key = RID_NONE, tmp1 = RID_TMP, tmp2; - Reg tisnum = RID_NONE, tmpnum = RID_NONE; - IRRef refkey = ir->op2; - IRIns *irkey = IR(refkey); - IRType1 kt = irkey->t; - uint32_t khash; - MCLabel l_end, l_loop, l_next; - - rset_clear(allow, tab); - if (irt_isnum(kt)) { - key = ra_alloc1(as, refkey, RSET_FPR); - tmpnum = ra_scratch(as, rset_exclude(RSET_FPR, key)); - tisnum = ra_allock(as, (int32_t)LJ_TISNUM, allow); - rset_clear(allow, tisnum); - } else if (!irt_ispri(kt)) { - key = ra_alloc1(as, refkey, allow); - rset_clear(allow, key); - } - tmp2 = ra_scratch(as, allow); - rset_clear(allow, tmp2); - - /* Key not found in chain: jump to exit (if merged) or load niltv. */ - l_end = emit_label(as); - as->invmcp = NULL; - if (merge == IR_NE) - asm_guardcc(as, CC_EQ); - else if (destused) - emit_loada(as, dest, niltvg(J2G(as->J))); - - /* Follow hash chain until the end. */ - l_loop = --as->mcp; - emit_ai(as, PPCI_CMPWI, dest, 0); - emit_tai(as, PPCI_LWZ, dest, dest, (int32_t)offsetof(Node, next)); - l_next = emit_label(as); - - /* Type and value comparison. */ - if (merge == IR_EQ) - asm_guardcc(as, CC_EQ); - else - emit_condbranch(as, PPCI_BC|PPCF_Y, CC_EQ, l_end); - if (irt_isnum(kt)) { - emit_fab(as, PPCI_FCMPU, 0, tmpnum, key); - emit_condbranch(as, PPCI_BC, CC_GE, l_next); - emit_ab(as, PPCI_CMPLW, tmp1, tisnum); - emit_fai(as, PPCI_LFD, tmpnum, dest, (int32_t)offsetof(Node, key.n)); - } else { - if (!irt_ispri(kt)) { - emit_ab(as, PPCI_CMPW, tmp2, key); - emit_condbranch(as, PPCI_BC, CC_NE, l_next); - } - emit_ai(as, PPCI_CMPWI, tmp1, irt_toitype(irkey->t)); - if (!irt_ispri(kt)) - emit_tai(as, PPCI_LWZ, tmp2, dest, (int32_t)offsetof(Node, key.gcr)); - } - emit_tai(as, PPCI_LWZ, tmp1, dest, (int32_t)offsetof(Node, key.it)); - *l_loop = PPCI_BC | PPCF_Y | PPCF_CC(CC_NE) | - (((char *)as->mcp-(char *)l_loop) & 0xffffu); - - /* Load main position relative to tab->node into dest. */ - khash = irref_isk(refkey) ? ir_khash(irkey) : 1; - if (khash == 0) { - emit_tai(as, PPCI_LWZ, dest, tab, (int32_t)offsetof(GCtab, node)); - } else { - Reg tmphash = tmp1; - if (irref_isk(refkey)) - tmphash = ra_allock(as, khash, allow); - emit_tab(as, PPCI_ADD, dest, dest, tmp1); - emit_tai(as, PPCI_MULLI, tmp1, tmp1, sizeof(Node)); - emit_asb(as, PPCI_AND, tmp1, tmp2, tmphash); - emit_tai(as, PPCI_LWZ, dest, tab, (int32_t)offsetof(GCtab, node)); - emit_tai(as, PPCI_LWZ, tmp2, tab, (int32_t)offsetof(GCtab, hmask)); - if (irref_isk(refkey)) { - /* Nothing to do. */ - } else if (irt_isstr(kt)) { - emit_tai(as, PPCI_LWZ, tmp1, key, (int32_t)offsetof(GCstr, hash)); - } else { /* Must match with hash*() in lj_tab.c. */ - emit_tab(as, PPCI_SUBF, tmp1, tmp2, tmp1); - emit_rotlwi(as, tmp2, tmp2, HASH_ROT3); - emit_asb(as, PPCI_XOR, tmp1, tmp1, tmp2); - emit_rotlwi(as, tmp1, tmp1, (HASH_ROT2+HASH_ROT1)&31); - emit_tab(as, PPCI_SUBF, tmp2, dest, tmp2); - if (irt_isnum(kt)) { - int32_t ofs = ra_spill(as, irkey); - emit_asb(as, PPCI_XOR, tmp2, tmp2, tmp1); - emit_rotlwi(as, dest, tmp1, HASH_ROT1); - emit_tab(as, PPCI_ADD, tmp1, tmp1, tmp1); - emit_tai(as, PPCI_LWZ, tmp2, RID_SP, ofs+4); - emit_tai(as, PPCI_LWZ, tmp1, RID_SP, ofs); - } else { - emit_asb(as, PPCI_XOR, tmp2, key, tmp1); - emit_rotlwi(as, dest, tmp1, HASH_ROT1); - emit_tai(as, PPCI_ADDI, tmp1, tmp2, HASH_BIAS); - emit_tai(as, PPCI_ADDIS, tmp2, key, (HASH_BIAS + 32768)>>16); - } - } - } -} - -static void asm_hrefk(ASMState *as, IRIns *ir) -{ - IRIns *kslot = IR(ir->op2); - IRIns *irkey = IR(kslot->op1); - int32_t ofs = (int32_t)(kslot->op2 * sizeof(Node)); - int32_t kofs = ofs + (int32_t)offsetof(Node, key); - Reg dest = (ra_used(ir)||ofs > 32736) ? ra_dest(as, ir, RSET_GPR) : RID_NONE; - Reg node = ra_alloc1(as, ir->op1, RSET_GPR); - Reg key = RID_NONE, type = RID_TMP, idx = node; - RegSet allow = rset_exclude(RSET_GPR, node); - lua_assert(ofs % sizeof(Node) == 0); - if (ofs > 32736) { - idx = dest; - rset_clear(allow, dest); - kofs = (int32_t)offsetof(Node, key); - } else if (ra_hasreg(dest)) { - emit_tai(as, PPCI_ADDI, dest, node, ofs); - } - asm_guardcc(as, CC_NE); - if (!irt_ispri(irkey->t)) { - key = ra_scratch(as, allow); - rset_clear(allow, key); - } - rset_clear(allow, type); - if (irt_isnum(irkey->t)) { - emit_cmpi(as, key, (int32_t)ir_knum(irkey)->u32.lo); - asm_guardcc(as, CC_NE); - emit_cmpi(as, type, (int32_t)ir_knum(irkey)->u32.hi); - } else { - if (ra_hasreg(key)) { - emit_cmpi(as, key, irkey->i); /* May use RID_TMP, i.e. type. */ - asm_guardcc(as, CC_NE); - } - emit_ai(as, PPCI_CMPWI, type, irt_toitype(irkey->t)); - } - if (ra_hasreg(key)) emit_tai(as, PPCI_LWZ, key, idx, kofs+4); - emit_tai(as, PPCI_LWZ, type, idx, kofs); - if (ofs > 32736) { - emit_tai(as, PPCI_ADDIS, dest, dest, (ofs + 32768) >> 16); - emit_tai(as, PPCI_ADDI, dest, node, ofs); - } -} - -static void asm_newref(ASMState *as, IRIns *ir) -{ - const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_tab_newkey]; - IRRef args[3]; - if (ir->r == RID_SINK) - return; - args[0] = ASMREF_L; /* lua_State *L */ - args[1] = ir->op1; /* GCtab *t */ - args[2] = ASMREF_TMP1; /* cTValue *key */ - asm_setupresult(as, ir, ci); /* TValue * */ - asm_gencall(as, ci, args); - asm_tvptr(as, ra_releasetmp(as, ASMREF_TMP1), ir->op2); -} - -static void asm_uref(ASMState *as, IRIns *ir) -{ - /* NYI: Check that UREFO is still open and not aliasing a slot. */ - Reg dest = ra_dest(as, ir, RSET_GPR); - if (irref_isk(ir->op1)) { - GCfunc *fn = ir_kfunc(IR(ir->op1)); - MRef *v = &gcref(fn->l.uvptr[(ir->op2 >> 8)])->uv.v; - emit_lsptr(as, PPCI_LWZ, dest, v, RSET_GPR); - } else { - Reg uv = ra_scratch(as, RSET_GPR); - Reg func = ra_alloc1(as, ir->op1, RSET_GPR); - if (ir->o == IR_UREFC) { - asm_guardcc(as, CC_NE); - emit_ai(as, PPCI_CMPWI, RID_TMP, 1); - emit_tai(as, PPCI_ADDI, dest, uv, (int32_t)offsetof(GCupval, tv)); - emit_tai(as, PPCI_LBZ, RID_TMP, uv, (int32_t)offsetof(GCupval, closed)); - } else { - emit_tai(as, PPCI_LWZ, dest, uv, (int32_t)offsetof(GCupval, v)); - } - emit_tai(as, PPCI_LWZ, uv, func, - (int32_t)offsetof(GCfuncL, uvptr) + 4*(int32_t)(ir->op2 >> 8)); - } -} - -static void asm_fref(ASMState *as, IRIns *ir) -{ - UNUSED(as); UNUSED(ir); - lua_assert(!ra_used(ir)); -} - -static void asm_strref(ASMState *as, IRIns *ir) -{ - Reg dest = ra_dest(as, ir, RSET_GPR); - IRRef ref = ir->op2, refk = ir->op1; - int32_t ofs = (int32_t)sizeof(GCstr); - Reg r; - if (irref_isk(ref)) { - IRRef tmp = refk; refk = ref; ref = tmp; - } else if (!irref_isk(refk)) { - Reg right, left = ra_alloc1(as, ir->op1, RSET_GPR); - IRIns *irr = IR(ir->op2); - if (ra_hasreg(irr->r)) { - ra_noweak(as, irr->r); - right = irr->r; - } else if (mayfuse(as, irr->op2) && - irr->o == IR_ADD && irref_isk(irr->op2) && - checki16(ofs + IR(irr->op2)->i)) { - ofs += IR(irr->op2)->i; - right = ra_alloc1(as, irr->op1, rset_exclude(RSET_GPR, left)); - } else { - right = ra_allocref(as, ir->op2, rset_exclude(RSET_GPR, left)); - } - emit_tai(as, PPCI_ADDI, dest, dest, ofs); - emit_tab(as, PPCI_ADD, dest, left, right); - return; - } - r = ra_alloc1(as, ref, RSET_GPR); - ofs += IR(refk)->i; - if (checki16(ofs)) - emit_tai(as, PPCI_ADDI, dest, r, ofs); - else - emit_tab(as, PPCI_ADD, dest, r, - ra_allock(as, ofs, rset_exclude(RSET_GPR, r))); -} - -/* -- Loads and stores ---------------------------------------------------- */ - -static PPCIns asm_fxloadins(IRIns *ir) -{ - switch (irt_type(ir->t)) { - case IRT_I8: return PPCI_LBZ; /* Needs sign-extension. */ - case IRT_U8: return PPCI_LBZ; - case IRT_I16: return PPCI_LHA; - case IRT_U16: return PPCI_LHZ; - case IRT_NUM: return PPCI_LFD; - case IRT_FLOAT: return PPCI_LFS; - default: return PPCI_LWZ; - } -} - -static PPCIns asm_fxstoreins(IRIns *ir) -{ - switch (irt_type(ir->t)) { - case IRT_I8: case IRT_U8: return PPCI_STB; - case IRT_I16: case IRT_U16: return PPCI_STH; - case IRT_NUM: return PPCI_STFD; - case IRT_FLOAT: return PPCI_STFS; - default: return PPCI_STW; - } -} - -static void asm_fload(ASMState *as, IRIns *ir) -{ - Reg dest = ra_dest(as, ir, RSET_GPR); - Reg idx = ra_alloc1(as, ir->op1, RSET_GPR); - PPCIns pi = asm_fxloadins(ir); - int32_t ofs; - if (ir->op2 == IRFL_TAB_ARRAY) { - ofs = asm_fuseabase(as, ir->op1); - if (ofs) { /* Turn the t->array load into an add for colocated arrays. */ - emit_tai(as, PPCI_ADDI, dest, idx, ofs); - return; - } - } - ofs = field_ofs[ir->op2]; - lua_assert(!irt_isi8(ir->t)); - emit_tai(as, pi, dest, idx, ofs); -} - -static void asm_fstore(ASMState *as, IRIns *ir) -{ - if (ir->r != RID_SINK) { - Reg src = ra_alloc1(as, ir->op2, RSET_GPR); - IRIns *irf = IR(ir->op1); - Reg idx = ra_alloc1(as, irf->op1, rset_exclude(RSET_GPR, src)); - int32_t ofs = field_ofs[irf->op2]; - PPCIns pi = asm_fxstoreins(ir); - emit_tai(as, pi, src, idx, ofs); - } -} - -static void asm_xload(ASMState *as, IRIns *ir) -{ - Reg dest = ra_dest(as, ir, irt_isfp(ir->t) ? RSET_FPR : RSET_GPR); - lua_assert(!(ir->op2 & IRXLOAD_UNALIGNED)); - if (irt_isi8(ir->t)) - emit_as(as, PPCI_EXTSB, dest, dest); - asm_fusexref(as, asm_fxloadins(ir), dest, ir->op1, RSET_GPR, 0); -} - -static void asm_xstore(ASMState *as, IRIns *ir, int32_t ofs) -{ - IRIns *irb; - if (ir->r == RID_SINK) - return; - if (ofs == 0 && mayfuse(as, ir->op2) && (irb = IR(ir->op2))->o == IR_BSWAP && - ra_noreg(irb->r) && (irt_isint(ir->t) || irt_isu32(ir->t))) { - /* Fuse BSWAP with XSTORE to stwbrx. */ - Reg src = ra_alloc1(as, irb->op1, RSET_GPR); - asm_fusexrefx(as, PPCI_STWBRX, src, ir->op1, rset_exclude(RSET_GPR, src)); - } else { - Reg src = ra_alloc1(as, ir->op2, irt_isfp(ir->t) ? RSET_FPR : RSET_GPR); - asm_fusexref(as, asm_fxstoreins(ir), src, ir->op1, - rset_exclude(RSET_GPR, src), ofs); - } -} - -static void asm_ahuvload(ASMState *as, IRIns *ir) -{ - IRType1 t = ir->t; - Reg dest = RID_NONE, type = RID_TMP, tmp = RID_TMP, idx; - RegSet allow = RSET_GPR; - int32_t ofs = AHUREF_LSX; - if (ra_used(ir)) { - lua_assert(irt_isnum(t) || irt_isint(t) || irt_isaddr(t)); - if (!irt_isnum(t)) ofs = 0; - dest = ra_dest(as, ir, irt_isnum(t) ? RSET_FPR : RSET_GPR); - rset_clear(allow, dest); - } - idx = asm_fuseahuref(as, ir->op1, &ofs, allow); - if (irt_isnum(t)) { - Reg tisnum = ra_allock(as, (int32_t)LJ_TISNUM, rset_exclude(allow, idx)); - asm_guardcc(as, CC_GE); - emit_ab(as, PPCI_CMPLW, type, tisnum); - if (ra_hasreg(dest)) { - if (ofs == AHUREF_LSX) { - tmp = ra_scratch(as, rset_exclude(rset_exclude(RSET_GPR, - (idx&255)), (idx>>8))); - emit_fab(as, PPCI_LFDX, dest, (idx&255), tmp); - } else { - emit_fai(as, PPCI_LFD, dest, idx, ofs); - } - } - } else { - asm_guardcc(as, CC_NE); - emit_ai(as, PPCI_CMPWI, type, irt_toitype(t)); - if (ra_hasreg(dest)) emit_tai(as, PPCI_LWZ, dest, idx, ofs+4); - } - if (ofs == AHUREF_LSX) { - emit_tab(as, PPCI_LWZX, type, (idx&255), tmp); - emit_slwi(as, tmp, (idx>>8), 3); - } else { - emit_tai(as, PPCI_LWZ, type, idx, ofs); - } -} - -static void asm_ahustore(ASMState *as, IRIns *ir) -{ - RegSet allow = RSET_GPR; - Reg idx, src = RID_NONE, type = RID_NONE; - int32_t ofs = AHUREF_LSX; - if (ir->r == RID_SINK) - return; - if (irt_isnum(ir->t)) { - src = ra_alloc1(as, ir->op2, RSET_FPR); - } else { - if (!irt_ispri(ir->t)) { - src = ra_alloc1(as, ir->op2, allow); - rset_clear(allow, src); - ofs = 0; - } - type = ra_allock(as, (int32_t)irt_toitype(ir->t), allow); - rset_clear(allow, type); - } - idx = asm_fuseahuref(as, ir->op1, &ofs, allow); - if (irt_isnum(ir->t)) { - if (ofs == AHUREF_LSX) { - emit_fab(as, PPCI_STFDX, src, (idx&255), RID_TMP); - emit_slwi(as, RID_TMP, (idx>>8), 3); - } else { - emit_fai(as, PPCI_STFD, src, idx, ofs); - } - } else { - if (ra_hasreg(src)) - emit_tai(as, PPCI_STW, src, idx, ofs+4); - if (ofs == AHUREF_LSX) { - emit_tab(as, PPCI_STWX, type, (idx&255), RID_TMP); - emit_slwi(as, RID_TMP, (idx>>8), 3); - } else { - emit_tai(as, PPCI_STW, type, idx, ofs); - } - } -} - -static void asm_sload(ASMState *as, IRIns *ir) -{ - int32_t ofs = 8*((int32_t)ir->op1-1) + ((ir->op2 & IRSLOAD_FRAME) ? 0 : 4); - IRType1 t = ir->t; - Reg dest = RID_NONE, type = RID_NONE, base; - RegSet allow = RSET_GPR; - lua_assert(!(ir->op2 & IRSLOAD_PARENT)); /* Handled by asm_head_side(). */ - lua_assert(irt_isguard(t) || !(ir->op2 & IRSLOAD_TYPECHECK)); - lua_assert(LJ_DUALNUM || - !irt_isint(t) || (ir->op2 & (IRSLOAD_CONVERT|IRSLOAD_FRAME))); - if ((ir->op2 & IRSLOAD_CONVERT) && irt_isguard(t) && irt_isint(t)) { - dest = ra_scratch(as, RSET_FPR); - asm_tointg(as, ir, dest); - t.irt = IRT_NUM; /* Continue with a regular number type check. */ - } else if (ra_used(ir)) { - lua_assert(irt_isnum(t) || irt_isint(t) || irt_isaddr(t)); - dest = ra_dest(as, ir, irt_isnum(t) ? RSET_FPR : RSET_GPR); - rset_clear(allow, dest); - base = ra_alloc1(as, REF_BASE, allow); - rset_clear(allow, base); - if ((ir->op2 & IRSLOAD_CONVERT)) { - if (irt_isint(t)) { - emit_tai(as, PPCI_LWZ, dest, RID_SP, SPOFS_TMPLO); - dest = ra_scratch(as, RSET_FPR); - emit_fai(as, PPCI_STFD, dest, RID_SP, SPOFS_TMP); - emit_fb(as, PPCI_FCTIWZ, dest, dest); - t.irt = IRT_NUM; /* Check for original type. */ - } else { - Reg tmp = ra_scratch(as, allow); - Reg hibias = ra_allock(as, 0x43300000, rset_clear(allow, tmp)); - Reg fbias = ra_scratch(as, rset_exclude(RSET_FPR, dest)); - emit_fab(as, PPCI_FSUB, dest, dest, fbias); - emit_fai(as, PPCI_LFD, dest, RID_SP, SPOFS_TMP); - emit_lsptr(as, PPCI_LFS, (fbias & 31), - (void *)lj_ir_k64_find(as->J, U64x(59800004,59800000)), - rset_clear(allow, hibias)); - emit_tai(as, PPCI_STW, tmp, RID_SP, SPOFS_TMPLO); - emit_tai(as, PPCI_STW, hibias, RID_SP, SPOFS_TMPHI); - emit_asi(as, PPCI_XORIS, tmp, tmp, 0x8000); - dest = tmp; - t.irt = IRT_INT; /* Check for original type. */ - } - } - goto dotypecheck; - } - base = ra_alloc1(as, REF_BASE, allow); - rset_clear(allow, base); -dotypecheck: - if (irt_isnum(t)) { - if ((ir->op2 & IRSLOAD_TYPECHECK)) { - Reg tisnum = ra_allock(as, (int32_t)LJ_TISNUM, allow); - asm_guardcc(as, CC_GE); - emit_ab(as, PPCI_CMPLW, RID_TMP, tisnum); - type = RID_TMP; - } - if (ra_hasreg(dest)) emit_fai(as, PPCI_LFD, dest, base, ofs-4); - } else { - if ((ir->op2 & IRSLOAD_TYPECHECK)) { - asm_guardcc(as, CC_NE); - emit_ai(as, PPCI_CMPWI, RID_TMP, irt_toitype(t)); - type = RID_TMP; - } - if (ra_hasreg(dest)) emit_tai(as, PPCI_LWZ, dest, base, ofs); - } - if (ra_hasreg(type)) emit_tai(as, PPCI_LWZ, type, base, ofs-4); -} - -/* -- Allocations --------------------------------------------------------- */ - -#if LJ_HASFFI -static void asm_cnew(ASMState *as, IRIns *ir) -{ - CTState *cts = ctype_ctsG(J2G(as->J)); - CTypeID ctypeid = (CTypeID)IR(ir->op1)->i; - CTSize sz = (ir->o == IR_CNEWI || ir->op2 == REF_NIL) ? - lj_ctype_size(cts, ctypeid) : (CTSize)IR(ir->op2)->i; - const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_mem_newgco]; - IRRef args[2]; - RegSet allow = (RSET_GPR & ~RSET_SCRATCH); - RegSet drop = RSET_SCRATCH; - lua_assert(sz != CTSIZE_INVALID); - - args[0] = ASMREF_L; /* lua_State *L */ - args[1] = ASMREF_TMP1; /* MSize size */ - as->gcsteps++; - - if (ra_hasreg(ir->r)) - rset_clear(drop, ir->r); /* Dest reg handled below. */ - ra_evictset(as, drop); - if (ra_used(ir)) - ra_destreg(as, ir, RID_RET); /* GCcdata * */ - - /* Initialize immutable cdata object. */ - if (ir->o == IR_CNEWI) { - int32_t ofs = sizeof(GCcdata); - lua_assert(sz == 4 || sz == 8); - if (sz == 8) { - ofs += 4; - lua_assert((ir+1)->o == IR_HIOP); - } - for (;;) { - Reg r = ra_alloc1(as, ir->op2, allow); - emit_tai(as, PPCI_STW, r, RID_RET, ofs); - rset_clear(allow, r); - if (ofs == sizeof(GCcdata)) break; - ofs -= 4; ir++; - } - } - /* Initialize gct and ctypeid. lj_mem_newgco() already sets marked. */ - emit_tai(as, PPCI_STB, RID_RET+1, RID_RET, offsetof(GCcdata, gct)); - emit_tai(as, PPCI_STH, RID_TMP, RID_RET, offsetof(GCcdata, ctypeid)); - emit_ti(as, PPCI_LI, RID_RET+1, ~LJ_TCDATA); - emit_ti(as, PPCI_LI, RID_TMP, ctypeid); /* Lower 16 bit used. Sign-ext ok. */ - asm_gencall(as, ci, args); - ra_allockreg(as, (int32_t)(sz+sizeof(GCcdata)), - ra_releasetmp(as, ASMREF_TMP1)); -} -#else -#define asm_cnew(as, ir) ((void)0) -#endif - -/* -- Write barriers ------------------------------------------------------ */ - -static void asm_tbar(ASMState *as, IRIns *ir) -{ - Reg tab = ra_alloc1(as, ir->op1, RSET_GPR); - Reg mark = ra_scratch(as, rset_exclude(RSET_GPR, tab)); - Reg link = RID_TMP; - MCLabel l_end = emit_label(as); - emit_tai(as, PPCI_STW, link, tab, (int32_t)offsetof(GCtab, gclist)); - emit_tai(as, PPCI_STB, mark, tab, (int32_t)offsetof(GCtab, marked)); - emit_setgl(as, tab, gc.grayagain); - lua_assert(LJ_GC_BLACK == 0x04); - emit_rot(as, PPCI_RLWINM, mark, mark, 0, 30, 28); /* Clear black bit. */ - emit_getgl(as, link, gc.grayagain); - emit_condbranch(as, PPCI_BC|PPCF_Y, CC_EQ, l_end); - emit_asi(as, PPCI_ANDIDOT, RID_TMP, mark, LJ_GC_BLACK); - emit_tai(as, PPCI_LBZ, mark, tab, (int32_t)offsetof(GCtab, marked)); -} - -static void asm_obar(ASMState *as, IRIns *ir) -{ - const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_gc_barrieruv]; - IRRef args[2]; - MCLabel l_end; - Reg obj, val, tmp; - /* No need for other object barriers (yet). */ - lua_assert(IR(ir->op1)->o == IR_UREFC); - ra_evictset(as, RSET_SCRATCH); - l_end = emit_label(as); - args[0] = ASMREF_TMP1; /* global_State *g */ - args[1] = ir->op1; /* TValue *tv */ - asm_gencall(as, ci, args); - emit_tai(as, PPCI_ADDI, ra_releasetmp(as, ASMREF_TMP1), RID_JGL, -32768); - obj = IR(ir->op1)->r; - tmp = ra_scratch(as, rset_exclude(RSET_GPR, obj)); - emit_condbranch(as, PPCI_BC|PPCF_Y, CC_EQ, l_end); - emit_asi(as, PPCI_ANDIDOT, tmp, tmp, LJ_GC_BLACK); - emit_condbranch(as, PPCI_BC, CC_EQ, l_end); - emit_asi(as, PPCI_ANDIDOT, RID_TMP, RID_TMP, LJ_GC_WHITES); - val = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, obj)); - emit_tai(as, PPCI_LBZ, tmp, obj, - (int32_t)offsetof(GCupval, marked)-(int32_t)offsetof(GCupval, tv)); - emit_tai(as, PPCI_LBZ, RID_TMP, val, (int32_t)offsetof(GChead, marked)); -} - -/* -- Arithmetic and logic operations ------------------------------------- */ - -static void asm_fparith(ASMState *as, IRIns *ir, PPCIns pi) -{ - Reg dest = ra_dest(as, ir, RSET_FPR); - Reg right, left = ra_alloc2(as, ir, RSET_FPR); - right = (left >> 8); left &= 255; - if (pi == PPCI_FMUL) - emit_fac(as, pi, dest, left, right); - else - emit_fab(as, pi, dest, left, right); -} - -static void asm_fpunary(ASMState *as, IRIns *ir, PPCIns pi) -{ - Reg dest = ra_dest(as, ir, RSET_FPR); - Reg left = ra_hintalloc(as, ir->op1, dest, RSET_FPR); - emit_fb(as, pi, dest, left); -} - -static int asm_fpjoin_pow(ASMState *as, IRIns *ir) -{ - IRIns *irp = IR(ir->op1); - if (irp == ir-1 && irp->o == IR_MUL && !ra_used(irp)) { - IRIns *irpp = IR(irp->op1); - if (irpp == ir-2 && irpp->o == IR_FPMATH && - irpp->op2 == IRFPM_LOG2 && !ra_used(irpp)) { - const CCallInfo *ci = &lj_ir_callinfo[IRCALL_pow]; - IRRef args[2]; - args[0] = irpp->op1; - args[1] = irp->op2; - asm_setupresult(as, ir, ci); - asm_gencall(as, ci, args); - return 1; - } - } - return 0; -} - -static void asm_add(ASMState *as, IRIns *ir) -{ - if (irt_isnum(ir->t)) { - if (!asm_fusemadd(as, ir, PPCI_FMADD, PPCI_FMADD)) - asm_fparith(as, ir, PPCI_FADD); - } else { - Reg dest = ra_dest(as, ir, RSET_GPR); - Reg right, left = ra_hintalloc(as, ir->op1, dest, RSET_GPR); - PPCIns pi; - if (irref_isk(ir->op2)) { - int32_t k = IR(ir->op2)->i; - if (checki16(k)) { - pi = PPCI_ADDI; - /* May fail due to spills/restores above, but simplifies the logic. */ - if (as->flagmcp == as->mcp) { - as->flagmcp = NULL; - as->mcp++; - pi = PPCI_ADDICDOT; - } - emit_tai(as, pi, dest, left, k); - return; - } else if ((k & 0xffff) == 0) { - emit_tai(as, PPCI_ADDIS, dest, left, (k >> 16)); - return; - } else if (!as->sectref) { - emit_tai(as, PPCI_ADDIS, dest, dest, (k + 32768) >> 16); - emit_tai(as, PPCI_ADDI, dest, left, k); - return; - } - } - pi = PPCI_ADD; - /* May fail due to spills/restores above, but simplifies the logic. */ - if (as->flagmcp == as->mcp) { - as->flagmcp = NULL; - as->mcp++; - pi |= PPCF_DOT; - } - right = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, left)); - emit_tab(as, pi, dest, left, right); - } -} - -static void asm_sub(ASMState *as, IRIns *ir) -{ - if (irt_isnum(ir->t)) { - if (!asm_fusemadd(as, ir, PPCI_FMSUB, PPCI_FNMSUB)) - asm_fparith(as, ir, PPCI_FSUB); - } else { - PPCIns pi = PPCI_SUBF; - Reg dest = ra_dest(as, ir, RSET_GPR); - Reg left, right; - if (irref_isk(ir->op1)) { - int32_t k = IR(ir->op1)->i; - if (checki16(k)) { - right = ra_alloc1(as, ir->op2, RSET_GPR); - emit_tai(as, PPCI_SUBFIC, dest, right, k); - return; - } - } - /* May fail due to spills/restores above, but simplifies the logic. */ - if (as->flagmcp == as->mcp) { - as->flagmcp = NULL; - as->mcp++; - pi |= PPCF_DOT; - } - left = ra_hintalloc(as, ir->op1, dest, RSET_GPR); - right = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, left)); - emit_tab(as, pi, dest, right, left); /* Subtract right _from_ left. */ - } -} - -static void asm_mul(ASMState *as, IRIns *ir) -{ - if (irt_isnum(ir->t)) { - asm_fparith(as, ir, PPCI_FMUL); - } else { - PPCIns pi = PPCI_MULLW; - Reg dest = ra_dest(as, ir, RSET_GPR); - Reg right, left = ra_hintalloc(as, ir->op1, dest, RSET_GPR); - if (irref_isk(ir->op2)) { - int32_t k = IR(ir->op2)->i; - if (checki16(k)) { - emit_tai(as, PPCI_MULLI, dest, left, k); - return; - } - } - /* May fail due to spills/restores above, but simplifies the logic. */ - if (as->flagmcp == as->mcp) { - as->flagmcp = NULL; - as->mcp++; - pi |= PPCF_DOT; - } - right = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, left)); - emit_tab(as, pi, dest, left, right); - } -} - -static void asm_neg(ASMState *as, IRIns *ir) -{ - if (irt_isnum(ir->t)) { - asm_fpunary(as, ir, PPCI_FNEG); - } else { - Reg dest, left; - PPCIns pi = PPCI_NEG; - if (as->flagmcp == as->mcp) { - as->flagmcp = NULL; - as->mcp++; - pi |= PPCF_DOT; - } - dest = ra_dest(as, ir, RSET_GPR); - left = ra_hintalloc(as, ir->op1, dest, RSET_GPR); - emit_tab(as, pi, dest, left, 0); - } -} - -static void asm_arithov(ASMState *as, IRIns *ir, PPCIns pi) -{ - Reg dest, left, right; - if (as->flagmcp == as->mcp) { - as->flagmcp = NULL; - as->mcp++; - } - asm_guardcc(as, CC_SO); - dest = ra_dest(as, ir, RSET_GPR); - left = ra_alloc2(as, ir, RSET_GPR); - right = (left >> 8); left &= 255; - if (pi == PPCI_SUBFO) { Reg tmp = left; left = right; right = tmp; } - emit_tab(as, pi|PPCF_DOT, dest, left, right); -} - -#if LJ_HASFFI -static void asm_add64(ASMState *as, IRIns *ir) -{ - Reg dest = ra_dest(as, ir, RSET_GPR); - Reg right, left = ra_alloc1(as, ir->op1, RSET_GPR); - PPCIns pi = PPCI_ADDE; - if (irref_isk(ir->op2)) { - int32_t k = IR(ir->op2)->i; - if (k == 0) - pi = PPCI_ADDZE; - else if (k == -1) - pi = PPCI_ADDME; - else - goto needright; - right = 0; - } else { - needright: - right = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, left)); - } - emit_tab(as, pi, dest, left, right); - ir--; - dest = ra_dest(as, ir, RSET_GPR); - left = ra_alloc1(as, ir->op1, RSET_GPR); - if (irref_isk(ir->op2)) { - int32_t k = IR(ir->op2)->i; - if (checki16(k)) { - emit_tai(as, PPCI_ADDIC, dest, left, k); - return; - } - } - right = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, left)); - emit_tab(as, PPCI_ADDC, dest, left, right); -} - -static void asm_sub64(ASMState *as, IRIns *ir) -{ - Reg dest = ra_dest(as, ir, RSET_GPR); - Reg left, right = ra_alloc1(as, ir->op2, RSET_GPR); - PPCIns pi = PPCI_SUBFE; - if (irref_isk(ir->op1)) { - int32_t k = IR(ir->op1)->i; - if (k == 0) - pi = PPCI_SUBFZE; - else if (k == -1) - pi = PPCI_SUBFME; - else - goto needleft; - left = 0; - } else { - needleft: - left = ra_alloc1(as, ir->op1, rset_exclude(RSET_GPR, right)); - } - emit_tab(as, pi, dest, right, left); /* Subtract right _from_ left. */ - ir--; - dest = ra_dest(as, ir, RSET_GPR); - right = ra_alloc1(as, ir->op2, RSET_GPR); - if (irref_isk(ir->op1)) { - int32_t k = IR(ir->op1)->i; - if (checki16(k)) { - emit_tai(as, PPCI_SUBFIC, dest, right, k); - return; - } - } - left = ra_alloc1(as, ir->op1, rset_exclude(RSET_GPR, right)); - emit_tab(as, PPCI_SUBFC, dest, right, left); -} - -static void asm_neg64(ASMState *as, IRIns *ir) -{ - Reg dest = ra_dest(as, ir, RSET_GPR); - Reg left = ra_alloc1(as, ir->op1, RSET_GPR); - emit_tab(as, PPCI_SUBFZE, dest, left, 0); - ir--; - dest = ra_dest(as, ir, RSET_GPR); - left = ra_alloc1(as, ir->op1, RSET_GPR); - emit_tai(as, PPCI_SUBFIC, dest, left, 0); -} -#endif - -static void asm_bitnot(ASMState *as, IRIns *ir) -{ - Reg dest, left, right; - PPCIns pi = PPCI_NOR; - if (as->flagmcp == as->mcp) { - as->flagmcp = NULL; - as->mcp++; - pi |= PPCF_DOT; - } - dest = ra_dest(as, ir, RSET_GPR); - if (mayfuse(as, ir->op1)) { - IRIns *irl = IR(ir->op1); - if (irl->o == IR_BAND) - pi ^= (PPCI_NOR ^ PPCI_NAND); - else if (irl->o == IR_BXOR) - pi ^= (PPCI_NOR ^ PPCI_EQV); - else if (irl->o != IR_BOR) - goto nofuse; - left = ra_hintalloc(as, irl->op1, dest, RSET_GPR); - right = ra_alloc1(as, irl->op2, rset_exclude(RSET_GPR, left)); - } else { -nofuse: - left = right = ra_hintalloc(as, ir->op1, dest, RSET_GPR); - } - emit_asb(as, pi, dest, left, right); -} - -static void asm_bitswap(ASMState *as, IRIns *ir) -{ - Reg dest = ra_dest(as, ir, RSET_GPR); - IRIns *irx; - if (mayfuse(as, ir->op1) && (irx = IR(ir->op1))->o == IR_XLOAD && - ra_noreg(irx->r) && (irt_isint(irx->t) || irt_isu32(irx->t))) { - /* Fuse BSWAP with XLOAD to lwbrx. */ - asm_fusexrefx(as, PPCI_LWBRX, dest, irx->op1, RSET_GPR); - } else { - Reg left = ra_alloc1(as, ir->op1, RSET_GPR); - Reg tmp = dest; - if (tmp == left) { - tmp = RID_TMP; - emit_mr(as, dest, RID_TMP); - } - emit_rot(as, PPCI_RLWIMI, tmp, left, 24, 16, 23); - emit_rot(as, PPCI_RLWIMI, tmp, left, 24, 0, 7); - emit_rotlwi(as, tmp, left, 8); - } -} - -static void asm_bitop(ASMState *as, IRIns *ir, PPCIns pi, PPCIns pik) -{ - Reg dest = ra_dest(as, ir, RSET_GPR); - Reg right, left = ra_hintalloc(as, ir->op1, dest, RSET_GPR); - if (irref_isk(ir->op2)) { - int32_t k = IR(ir->op2)->i; - Reg tmp = left; - if ((checku16(k) || (k & 0xffff) == 0) || (tmp = dest, !as->sectref)) { - if (!checku16(k)) { - emit_asi(as, pik ^ (PPCI_ORI ^ PPCI_ORIS), dest, tmp, (k >> 16)); - if ((k & 0xffff) == 0) return; - } - emit_asi(as, pik, dest, left, k); - return; - } - } - /* May fail due to spills/restores above, but simplifies the logic. */ - if (as->flagmcp == as->mcp) { - as->flagmcp = NULL; - as->mcp++; - pi |= PPCF_DOT; - } - right = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, left)); - emit_asb(as, pi, dest, left, right); -} - -/* Fuse BAND with contiguous bitmask and a shift to rlwinm. */ -static void asm_fuseandsh(ASMState *as, PPCIns pi, int32_t mask, IRRef ref) -{ - IRIns *ir; - Reg left; - if (mayfuse(as, ref) && (ir = IR(ref), ra_noreg(ir->r)) && - irref_isk(ir->op2) && ir->o >= IR_BSHL && ir->o <= IR_BROR) { - int32_t sh = (IR(ir->op2)->i & 31); - switch (ir->o) { - case IR_BSHL: - if ((mask & ((1u<>sh))) goto nofuse; - sh = ((32-sh)&31); - break; - case IR_BROL: - break; - default: - goto nofuse; - } - left = ra_alloc1(as, ir->op1, RSET_GPR); - *--as->mcp = pi | PPCF_T(left) | PPCF_B(sh); - return; - } -nofuse: - left = ra_alloc1(as, ref, RSET_GPR); - *--as->mcp = pi | PPCF_T(left); -} - -static void asm_bitand(ASMState *as, IRIns *ir) -{ - Reg dest, left, right; - IRRef lref = ir->op1; - PPCIns dot = 0; - IRRef op2; - if (as->flagmcp == as->mcp) { - as->flagmcp = NULL; - as->mcp++; - dot = PPCF_DOT; - } - dest = ra_dest(as, ir, RSET_GPR); - if (irref_isk(ir->op2)) { - int32_t k = IR(ir->op2)->i; - if (k) { - /* First check for a contiguous bitmask as used by rlwinm. */ - uint32_t s1 = lj_ffs((uint32_t)k); - uint32_t k1 = ((uint32_t)k >> s1); - if ((k1 & (k1+1)) == 0) { - asm_fuseandsh(as, PPCI_RLWINM|dot | PPCF_A(dest) | - PPCF_MB(31-lj_fls((uint32_t)k)) | PPCF_ME(31-s1), - k, lref); - return; - } - if (~(uint32_t)k) { - uint32_t s2 = lj_ffs(~(uint32_t)k); - uint32_t k2 = (~(uint32_t)k >> s2); - if ((k2 & (k2+1)) == 0) { - asm_fuseandsh(as, PPCI_RLWINM|dot | PPCF_A(dest) | - PPCF_MB(32-s2) | PPCF_ME(30-lj_fls(~(uint32_t)k)), - k, lref); - return; - } - } - } - if (checku16(k)) { - left = ra_alloc1(as, lref, RSET_GPR); - emit_asi(as, PPCI_ANDIDOT, dest, left, k); - return; - } else if ((k & 0xffff) == 0) { - left = ra_alloc1(as, lref, RSET_GPR); - emit_asi(as, PPCI_ANDISDOT, dest, left, (k >> 16)); - return; - } - } - op2 = ir->op2; - if (mayfuse(as, op2) && IR(op2)->o == IR_BNOT && ra_noreg(IR(op2)->r)) { - dot ^= (PPCI_AND ^ PPCI_ANDC); - op2 = IR(op2)->op1; - } - left = ra_hintalloc(as, lref, dest, RSET_GPR); - right = ra_alloc1(as, op2, rset_exclude(RSET_GPR, left)); - emit_asb(as, PPCI_AND ^ dot, dest, left, right); -} - -static void asm_bitshift(ASMState *as, IRIns *ir, PPCIns pi, PPCIns pik) -{ - Reg dest, left; - Reg dot = 0; - if (as->flagmcp == as->mcp) { - as->flagmcp = NULL; - as->mcp++; - dot = PPCF_DOT; - } - dest = ra_dest(as, ir, RSET_GPR); - left = ra_alloc1(as, ir->op1, RSET_GPR); - if (irref_isk(ir->op2)) { /* Constant shifts. */ - int32_t shift = (IR(ir->op2)->i & 31); - if (pik == 0) /* SLWI */ - emit_rot(as, PPCI_RLWINM|dot, dest, left, shift, 0, 31-shift); - else if (pik == 1) /* SRWI */ - emit_rot(as, PPCI_RLWINM|dot, dest, left, (32-shift)&31, shift, 31); - else - emit_asb(as, pik|dot, dest, left, shift); - } else { - Reg right = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, left)); - emit_asb(as, pi|dot, dest, left, right); - } -} - -static void asm_min_max(ASMState *as, IRIns *ir, int ismax) -{ - if (irt_isnum(ir->t)) { - Reg dest = ra_dest(as, ir, RSET_FPR); - Reg tmp = dest; - Reg right, left = ra_alloc2(as, ir, RSET_FPR); - right = (left >> 8); left &= 255; - if (tmp == left || tmp == right) - tmp = ra_scratch(as, rset_exclude(rset_exclude(rset_exclude(RSET_FPR, - dest), left), right)); - emit_facb(as, PPCI_FSEL, dest, tmp, - ismax ? left : right, ismax ? right : left); - emit_fab(as, PPCI_FSUB, tmp, left, right); - } else { - Reg dest = ra_dest(as, ir, RSET_GPR); - Reg tmp1 = RID_TMP, tmp2 = dest; - Reg right, left = ra_alloc2(as, ir, RSET_GPR); - right = (left >> 8); left &= 255; - if (tmp2 == left || tmp2 == right) - tmp2 = ra_scratch(as, rset_exclude(rset_exclude(rset_exclude(RSET_GPR, - dest), left), right)); - emit_tab(as, PPCI_ADD, dest, tmp2, right); - emit_asb(as, ismax ? PPCI_ANDC : PPCI_AND, tmp2, tmp2, tmp1); - emit_tab(as, PPCI_SUBFE, tmp1, tmp1, tmp1); - emit_tab(as, PPCI_SUBFC, tmp2, tmp2, tmp1); - emit_asi(as, PPCI_XORIS, tmp2, right, 0x8000); - emit_asi(as, PPCI_XORIS, tmp1, left, 0x8000); - } -} - -/* -- Comparisons --------------------------------------------------------- */ - -#define CC_UNSIGNED 0x08 /* Unsigned integer comparison. */ -#define CC_TWO 0x80 /* Check two flags for FP comparison. */ - -/* Map of comparisons to flags. ORDER IR. */ -static const uint8_t asm_compmap[IR_ABC+1] = { - /* op int cc FP cc */ - /* LT */ CC_GE + (CC_GE<<4), - /* GE */ CC_LT + (CC_LE<<4) + CC_TWO, - /* LE */ CC_GT + (CC_GE<<4) + CC_TWO, - /* GT */ CC_LE + (CC_LE<<4), - /* ULT */ CC_GE + CC_UNSIGNED + (CC_GT<<4) + CC_TWO, - /* UGE */ CC_LT + CC_UNSIGNED + (CC_LT<<4), - /* ULE */ CC_GT + CC_UNSIGNED + (CC_GT<<4), - /* UGT */ CC_LE + CC_UNSIGNED + (CC_LT<<4) + CC_TWO, - /* EQ */ CC_NE + (CC_NE<<4), - /* NE */ CC_EQ + (CC_EQ<<4), - /* ABC */ CC_LE + CC_UNSIGNED + (CC_LT<<4) + CC_TWO /* Same as UGT. */ -}; - -static void asm_intcomp_(ASMState *as, IRRef lref, IRRef rref, Reg cr, PPCCC cc) -{ - Reg right, left = ra_alloc1(as, lref, RSET_GPR); - if (irref_isk(rref)) { - int32_t k = IR(rref)->i; - if ((cc & CC_UNSIGNED) == 0) { /* Signed comparison with constant. */ - if (checki16(k)) { - emit_tai(as, PPCI_CMPWI, cr, left, k); - /* Signed comparison with zero and referencing previous ins? */ - if (k == 0 && lref == as->curins-1) - as->flagmcp = as->mcp; /* Allow elimination of the compare. */ - return; - } else if ((cc & 3) == (CC_EQ & 3)) { /* Use CMPLWI for EQ or NE. */ - if (checku16(k)) { - emit_tai(as, PPCI_CMPLWI, cr, left, k); - return; - } else if (!as->sectref && ra_noreg(IR(rref)->r)) { - emit_tai(as, PPCI_CMPLWI, cr, RID_TMP, k); - emit_asi(as, PPCI_XORIS, RID_TMP, left, (k >> 16)); - return; - } - } - } else { /* Unsigned comparison with constant. */ - if (checku16(k)) { - emit_tai(as, PPCI_CMPLWI, cr, left, k); - return; - } - } - } - right = ra_alloc1(as, rref, rset_exclude(RSET_GPR, left)); - emit_tab(as, (cc & CC_UNSIGNED) ? PPCI_CMPLW : PPCI_CMPW, cr, left, right); -} - -static void asm_comp(ASMState *as, IRIns *ir) -{ - PPCCC cc = asm_compmap[ir->o]; - if (irt_isnum(ir->t)) { - Reg right, left = ra_alloc2(as, ir, RSET_FPR); - right = (left >> 8); left &= 255; - asm_guardcc(as, (cc >> 4)); - if ((cc & CC_TWO)) - emit_tab(as, PPCI_CROR, ((cc>>4)&3), ((cc>>4)&3), (CC_EQ&3)); - emit_fab(as, PPCI_FCMPU, 0, left, right); - } else { - IRRef lref = ir->op1, rref = ir->op2; - if (irref_isk(lref) && !irref_isk(rref)) { - /* Swap constants to the right (only for ABC). */ - IRRef tmp = lref; lref = rref; rref = tmp; - if ((cc & 2) == 0) cc ^= 1; /* LT <-> GT, LE <-> GE */ - } - asm_guardcc(as, cc); - asm_intcomp_(as, lref, rref, 0, cc); - } -} - -#if LJ_HASFFI -/* 64 bit integer comparisons. */ -static void asm_comp64(ASMState *as, IRIns *ir) -{ - PPCCC cc = asm_compmap[(ir-1)->o]; - if ((cc&3) == (CC_EQ&3)) { - asm_guardcc(as, cc); - emit_tab(as, (cc&4) ? PPCI_CRAND : PPCI_CROR, - (CC_EQ&3), (CC_EQ&3), 4+(CC_EQ&3)); - } else { - asm_guardcc(as, CC_EQ); - emit_tab(as, PPCI_CROR, (CC_EQ&3), (CC_EQ&3), ((cc^~(cc>>2))&1)); - emit_tab(as, (cc&4) ? PPCI_CRAND : PPCI_CRANDC, - (CC_EQ&3), (CC_EQ&3), 4+(cc&3)); - } - /* Loword comparison sets cr1 and is unsigned, except for equality. */ - asm_intcomp_(as, (ir-1)->op1, (ir-1)->op2, 4, - cc | ((cc&3) == (CC_EQ&3) ? 0 : CC_UNSIGNED)); - /* Hiword comparison sets cr0. */ - asm_intcomp_(as, ir->op1, ir->op2, 0, cc); - as->flagmcp = NULL; /* Doesn't work here. */ -} -#endif - -/* -- Support for 64 bit ops in 32 bit mode ------------------------------- */ - -/* Hiword op of a split 64 bit op. Previous op must be the loword op. */ -static void asm_hiop(ASMState *as, IRIns *ir) -{ -#if LJ_HASFFI - /* HIOP is marked as a store because it needs its own DCE logic. */ - int uselo = ra_used(ir-1), usehi = ra_used(ir); /* Loword/hiword used? */ - if (LJ_UNLIKELY(!(as->flags & JIT_F_OPT_DCE))) uselo = usehi = 1; - if ((ir-1)->o == IR_CONV) { /* Conversions to/from 64 bit. */ - as->curins--; /* Always skip the CONV. */ - if (usehi || uselo) - asm_conv64(as, ir); - return; - } else if ((ir-1)->o <= IR_NE) { /* 64 bit integer comparisons. ORDER IR. */ - as->curins--; /* Always skip the loword comparison. */ - asm_comp64(as, ir); - return; - } else if ((ir-1)->o == IR_XSTORE) { - as->curins--; /* Handle both stores here. */ - if ((ir-1)->r != RID_SINK) { - asm_xstore(as, ir, 0); - asm_xstore(as, ir-1, 4); - } - return; - } - if (!usehi) return; /* Skip unused hiword op for all remaining ops. */ - switch ((ir-1)->o) { - case IR_ADD: as->curins--; asm_add64(as, ir); break; - case IR_SUB: as->curins--; asm_sub64(as, ir); break; - case IR_NEG: as->curins--; asm_neg64(as, ir); break; - case IR_CALLN: - case IR_CALLXS: - if (!uselo) - ra_allocref(as, ir->op1, RID2RSET(RID_RETLO)); /* Mark lo op as used. */ - break; - case IR_CNEWI: - /* Nothing to do here. Handled by lo op itself. */ - break; - default: lua_assert(0); break; - } -#else - UNUSED(as); UNUSED(ir); lua_assert(0); /* Unused without FFI. */ -#endif -} - -/* -- Stack handling ------------------------------------------------------ */ - -/* Check Lua stack size for overflow. Use exit handler as fallback. */ -static void asm_stack_check(ASMState *as, BCReg topslot, - IRIns *irp, RegSet allow, ExitNo exitno) -{ - /* Try to get an unused temp. register, otherwise spill/restore RID_RET*. */ - Reg tmp, pbase = irp ? (ra_hasreg(irp->r) ? irp->r : RID_TMP) : RID_BASE; - rset_clear(allow, pbase); - tmp = allow ? rset_pickbot(allow) : - (pbase == RID_RETHI ? RID_RETLO : RID_RETHI); - emit_condbranch(as, PPCI_BC, CC_LT, asm_exitstub_addr(as, exitno)); - if (allow == RSET_EMPTY) /* Restore temp. register. */ - emit_tai(as, PPCI_LWZ, tmp, RID_SP, SPOFS_TMPW); - else - ra_modified(as, tmp); - emit_ai(as, PPCI_CMPLWI, RID_TMP, (int32_t)(8*topslot)); - emit_tab(as, PPCI_SUBF, RID_TMP, pbase, tmp); - emit_tai(as, PPCI_LWZ, tmp, tmp, offsetof(lua_State, maxstack)); - if (pbase == RID_TMP) - emit_getgl(as, RID_TMP, jit_base); - emit_getgl(as, tmp, jit_L); - if (allow == RSET_EMPTY) /* Spill temp. register. */ - emit_tai(as, PPCI_STW, tmp, RID_SP, SPOFS_TMPW); -} - -/* Restore Lua stack from on-trace state. */ -static void asm_stack_restore(ASMState *as, SnapShot *snap) -{ - SnapEntry *map = &as->T->snapmap[snap->mapofs]; - SnapEntry *flinks = &as->T->snapmap[snap_nextofs(as->T, snap)-1]; - MSize n, nent = snap->nent; - /* Store the value of all modified slots to the Lua stack. */ - for (n = 0; n < nent; n++) { - SnapEntry sn = map[n]; - BCReg s = snap_slot(sn); - int32_t ofs = 8*((int32_t)s-1); - IRRef ref = snap_ref(sn); - IRIns *ir = IR(ref); - if ((sn & SNAP_NORESTORE)) - continue; - if (irt_isnum(ir->t)) { - Reg src = ra_alloc1(as, ref, RSET_FPR); - emit_fai(as, PPCI_STFD, src, RID_BASE, ofs); - } else { - Reg type; - RegSet allow = rset_exclude(RSET_GPR, RID_BASE); - lua_assert(irt_ispri(ir->t) || irt_isaddr(ir->t) || irt_isinteger(ir->t)); - if (!irt_ispri(ir->t)) { - Reg src = ra_alloc1(as, ref, allow); - rset_clear(allow, src); - emit_tai(as, PPCI_STW, src, RID_BASE, ofs+4); - } - if ((sn & (SNAP_CONT|SNAP_FRAME))) { - if (s == 0) continue; /* Do not overwrite link to previous frame. */ - type = ra_allock(as, (int32_t)(*flinks--), allow); - } else { - type = ra_allock(as, (int32_t)irt_toitype(ir->t), allow); - } - emit_tai(as, PPCI_STW, type, RID_BASE, ofs); - } - checkmclim(as); - } - lua_assert(map + nent == flinks); -} - -/* -- GC handling --------------------------------------------------------- */ - -/* Check GC threshold and do one or more GC steps. */ -static void asm_gc_check(ASMState *as) -{ - const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_gc_step_jit]; - IRRef args[2]; - MCLabel l_end; - Reg tmp; - ra_evictset(as, RSET_SCRATCH); - l_end = emit_label(as); - /* Exit trace if in GCSatomic or GCSfinalize. Avoids syncing GC objects. */ - asm_guardcc(as, CC_NE); /* Assumes asm_snap_prep() already done. */ - emit_ai(as, PPCI_CMPWI, RID_RET, 0); - args[0] = ASMREF_TMP1; /* global_State *g */ - args[1] = ASMREF_TMP2; /* MSize steps */ - asm_gencall(as, ci, args); - emit_tai(as, PPCI_ADDI, ra_releasetmp(as, ASMREF_TMP1), RID_JGL, -32768); - tmp = ra_releasetmp(as, ASMREF_TMP2); - emit_loadi(as, tmp, as->gcsteps); - /* Jump around GC step if GC total < GC threshold. */ - emit_condbranch(as, PPCI_BC|PPCF_Y, CC_LT, l_end); - emit_ab(as, PPCI_CMPLW, RID_TMP, tmp); - emit_getgl(as, tmp, gc.threshold); - emit_getgl(as, RID_TMP, gc.total); - as->gcsteps = 0; - checkmclim(as); -} - -/* -- Loop handling ------------------------------------------------------- */ - -/* Fixup the loop branch. */ -static void asm_loop_fixup(ASMState *as) -{ - MCode *p = as->mctop; - MCode *target = as->mcp; - if (as->loopinv) { /* Inverted loop branch? */ - /* asm_guardcc already inverted the cond branch and patched the final b. */ - p[-2] = (p[-2] & (0xffff0000u & ~PPCF_Y)) | (((target-p+2) & 0x3fffu) << 2); - } else { - p[-1] = PPCI_B|(((target-p+1)&0x00ffffffu)<<2); - } -} - -/* -- Head of trace ------------------------------------------------------- */ - -/* Coalesce BASE register for a root trace. */ -static void asm_head_root_base(ASMState *as) -{ - IRIns *ir = IR(REF_BASE); - Reg r = ir->r; - if (ra_hasreg(r)) { - ra_free(as, r); - if (rset_test(as->modset, r) || irt_ismarked(ir->t)) - ir->r = RID_INIT; /* No inheritance for modified BASE register. */ - if (r != RID_BASE) - emit_mr(as, r, RID_BASE); - } -} - -/* Coalesce BASE register for a side trace. */ -static RegSet asm_head_side_base(ASMState *as, IRIns *irp, RegSet allow) -{ - IRIns *ir = IR(REF_BASE); - Reg r = ir->r; - if (ra_hasreg(r)) { - ra_free(as, r); - if (rset_test(as->modset, r) || irt_ismarked(ir->t)) - ir->r = RID_INIT; /* No inheritance for modified BASE register. */ - if (irp->r == r) { - rset_clear(allow, r); /* Mark same BASE register as coalesced. */ - } else if (ra_hasreg(irp->r) && rset_test(as->freeset, irp->r)) { - rset_clear(allow, irp->r); - emit_mr(as, r, irp->r); /* Move from coalesced parent reg. */ - } else { - emit_getgl(as, r, jit_base); /* Otherwise reload BASE. */ - } - } - return allow; -} - -/* -- Tail of trace ------------------------------------------------------- */ - -/* Fixup the tail code. */ -static void asm_tail_fixup(ASMState *as, TraceNo lnk) -{ - MCode *p = as->mctop; - MCode *target; - int32_t spadj = as->T->spadjust; - if (spadj == 0) { - *--p = PPCI_NOP; - *--p = PPCI_NOP; - as->mctop = p; - } else { - /* Patch stack adjustment. */ - lua_assert(checki16(CFRAME_SIZE+spadj)); - p[-3] = PPCI_ADDI | PPCF_T(RID_TMP) | PPCF_A(RID_SP) | (CFRAME_SIZE+spadj); - p[-2] = PPCI_STWU | PPCF_T(RID_TMP) | PPCF_A(RID_SP) | spadj; - } - /* Patch exit branch. */ - target = lnk ? traceref(as->J, lnk)->mcode : (MCode *)lj_vm_exit_interp; - p[-1] = PPCI_B|(((target-p+1)&0x00ffffffu)<<2); -} - -/* Prepare tail of code. */ -static void asm_tail_prep(ASMState *as) -{ - MCode *p = as->mctop - 1; /* Leave room for exit branch. */ - if (as->loopref) { - as->invmcp = as->mcp = p; - } else { - as->mcp = p-2; /* Leave room for stack pointer adjustment. */ - as->invmcp = NULL; - } -} - -/* -- Instruction dispatch ------------------------------------------------ */ - -/* Assemble a single instruction. */ -static void asm_ir(ASMState *as, IRIns *ir) -{ - switch ((IROp)ir->o) { - /* Miscellaneous ops. */ - case IR_LOOP: asm_loop(as); break; - case IR_NOP: case IR_XBAR: lua_assert(!ra_used(ir)); break; - case IR_USE: - ra_alloc1(as, ir->op1, irt_isfp(ir->t) ? RSET_FPR : RSET_GPR); break; - case IR_PHI: asm_phi(as, ir); break; - case IR_HIOP: asm_hiop(as, ir); break; - case IR_GCSTEP: asm_gcstep(as, ir); break; - - /* Guarded assertions. */ - case IR_EQ: case IR_NE: - if ((ir-1)->o == IR_HREF && ir->op1 == as->curins-1) { - as->curins--; - asm_href(as, ir-1, (IROp)ir->o); - break; - } - /* fallthrough */ - case IR_LT: case IR_GE: case IR_LE: case IR_GT: - case IR_ULT: case IR_UGE: case IR_ULE: case IR_UGT: - case IR_ABC: - asm_comp(as, ir); - break; - - case IR_RETF: asm_retf(as, ir); break; - - /* Bit ops. */ - case IR_BNOT: asm_bitnot(as, ir); break; - case IR_BSWAP: asm_bitswap(as, ir); break; - - case IR_BAND: asm_bitand(as, ir); break; - case IR_BOR: asm_bitop(as, ir, PPCI_OR, PPCI_ORI); break; - case IR_BXOR: asm_bitop(as, ir, PPCI_XOR, PPCI_XORI); break; - - case IR_BSHL: asm_bitshift(as, ir, PPCI_SLW, 0); break; - case IR_BSHR: asm_bitshift(as, ir, PPCI_SRW, 1); break; - case IR_BSAR: asm_bitshift(as, ir, PPCI_SRAW, PPCI_SRAWI); break; - case IR_BROL: asm_bitshift(as, ir, PPCI_RLWNM|PPCF_MB(0)|PPCF_ME(31), - PPCI_RLWINM|PPCF_MB(0)|PPCF_ME(31)); break; - case IR_BROR: lua_assert(0); break; - - /* Arithmetic ops. */ - case IR_ADD: asm_add(as, ir); break; - case IR_SUB: asm_sub(as, ir); break; - case IR_MUL: asm_mul(as, ir); break; - case IR_DIV: asm_fparith(as, ir, PPCI_FDIV); break; - case IR_MOD: asm_callid(as, ir, IRCALL_lj_vm_modi); break; - case IR_POW: asm_callid(as, ir, IRCALL_lj_vm_powi); break; - case IR_NEG: asm_neg(as, ir); break; - - case IR_ABS: asm_fpunary(as, ir, PPCI_FABS); break; - case IR_ATAN2: asm_callid(as, ir, IRCALL_atan2); break; - case IR_LDEXP: asm_callid(as, ir, IRCALL_ldexp); break; - case IR_MIN: asm_min_max(as, ir, 0); break; - case IR_MAX: asm_min_max(as, ir, 1); break; - case IR_FPMATH: - if (ir->op2 == IRFPM_EXP2 && asm_fpjoin_pow(as, ir)) - break; - if (ir->op2 == IRFPM_SQRT && (as->flags & JIT_F_SQRT)) - asm_fpunary(as, ir, PPCI_FSQRT); - else - asm_callid(as, ir, IRCALL_lj_vm_floor + ir->op2); - break; - - /* Overflow-checking arithmetic ops. */ - case IR_ADDOV: asm_arithov(as, ir, PPCI_ADDO); break; - case IR_SUBOV: asm_arithov(as, ir, PPCI_SUBFO); break; - case IR_MULOV: asm_arithov(as, ir, PPCI_MULLWO); break; - - /* Memory references. */ - case IR_AREF: asm_aref(as, ir); break; - case IR_HREF: asm_href(as, ir, 0); break; - case IR_HREFK: asm_hrefk(as, ir); break; - case IR_NEWREF: asm_newref(as, ir); break; - case IR_UREFO: case IR_UREFC: asm_uref(as, ir); break; - case IR_FREF: asm_fref(as, ir); break; - case IR_STRREF: asm_strref(as, ir); break; - - /* Loads and stores. */ - case IR_ALOAD: case IR_HLOAD: case IR_ULOAD: case IR_VLOAD: - asm_ahuvload(as, ir); - break; - case IR_FLOAD: asm_fload(as, ir); break; - case IR_XLOAD: asm_xload(as, ir); break; - case IR_SLOAD: asm_sload(as, ir); break; - - case IR_ASTORE: case IR_HSTORE: case IR_USTORE: asm_ahustore(as, ir); break; - case IR_FSTORE: asm_fstore(as, ir); break; - case IR_XSTORE: asm_xstore(as, ir, 0); break; - - /* Allocations. */ - case IR_SNEW: case IR_XSNEW: asm_snew(as, ir); break; - case IR_TNEW: asm_tnew(as, ir); break; - case IR_TDUP: asm_tdup(as, ir); break; - case IR_CNEW: case IR_CNEWI: asm_cnew(as, ir); break; - - /* Write barriers. */ - case IR_TBAR: asm_tbar(as, ir); break; - case IR_OBAR: asm_obar(as, ir); break; - - /* Type conversions. */ - case IR_CONV: asm_conv(as, ir); break; - case IR_TOBIT: asm_tobit(as, ir); break; - case IR_TOSTR: asm_tostr(as, ir); break; - case IR_STRTO: asm_strto(as, ir); break; - - /* Calls. */ - case IR_CALLN: case IR_CALLL: case IR_CALLS: asm_call(as, ir); break; - case IR_CALLXS: asm_callx(as, ir); break; - case IR_CARG: break; - - default: - setintV(&as->J->errinfo, ir->o); - lj_trace_err_info(as->J, LJ_TRERR_NYIIR); - break; - } -} - -/* -- Trace setup --------------------------------------------------------- */ - -/* Ensure there are enough stack slots for call arguments. */ -static Reg asm_setup_call_slots(ASMState *as, IRIns *ir, const CCallInfo *ci) -{ - IRRef args[CCI_NARGS_MAX*2]; - uint32_t i, nargs = (int)CCI_NARGS(ci); - int nslots = 2, ngpr = REGARG_NUMGPR, nfpr = REGARG_NUMFPR; - asm_collectargs(as, ir, ci, args); - for (i = 0; i < nargs; i++) - if (args[i] && irt_isfp(IR(args[i])->t)) { - if (nfpr > 0) nfpr--; else nslots = (nslots+3) & ~1; - } else { - if (ngpr > 0) ngpr--; else nslots++; - } - if (nslots > as->evenspill) /* Leave room for args in stack slots. */ - as->evenspill = nslots; - return irt_isfp(ir->t) ? REGSP_HINT(RID_FPRET) : REGSP_HINT(RID_RET); -} - -static void asm_setup_target(ASMState *as) -{ - asm_exitstub_setup(as, as->T->nsnap + (as->parent ? 1 : 0)); -} - -/* -- Trace patching ------------------------------------------------------ */ - -/* Patch exit jumps of existing machine code to a new target. */ -void lj_asm_patchexit(jit_State *J, GCtrace *T, ExitNo exitno, MCode *target) -{ - MCode *p = T->mcode; - MCode *pe = (MCode *)((char *)p + T->szmcode); - MCode *px = exitstub_trace_addr(T, exitno); - MCode *cstart = NULL; - MCode *mcarea = lj_mcode_patch(J, p, 0); - int clearso = 0; - for (; p < pe; p++) { - /* Look for exitstub branch, try to replace with branch to target. */ - uint32_t ins = *p; - if ((ins & 0xfc000000u) == 0x40000000u && - ((ins ^ ((char *)px-(char *)p)) & 0xffffu) == 0) { - ptrdiff_t delta = (char *)target - (char *)p; - if (((ins >> 16) & 3) == (CC_SO&3)) { - clearso = sizeof(MCode); - delta -= sizeof(MCode); - } - /* Many, but not all short-range branches can be patched directly. */ - if (((delta + 0x8000) >> 16) == 0) { - *p = (ins & 0xffdf0000u) | ((uint32_t)delta & 0xffffu) | - ((delta & 0x8000) * (PPCF_Y/0x8000)); - if (!cstart) cstart = p; - } - } else if ((ins & 0xfc000000u) == PPCI_B && - ((ins ^ ((char *)px-(char *)p)) & 0x03ffffffu) == 0) { - ptrdiff_t delta = (char *)target - (char *)p; - lua_assert(((delta + 0x02000000) >> 26) == 0); - *p = PPCI_B | ((uint32_t)delta & 0x03ffffffu); - if (!cstart) cstart = p; - } - } - { /* Always patch long-range branch in exit stub itself. */ - ptrdiff_t delta = (char *)target - (char *)px - clearso; - lua_assert(((delta + 0x02000000) >> 26) == 0); - *px = PPCI_B | ((uint32_t)delta & 0x03ffffffu); - } - if (!cstart) cstart = px; - lj_mcode_sync(cstart, px+1); - if (clearso) { /* Extend the current trace. Ugly workaround. */ - MCode *pp = J->cur.mcode; - J->cur.szmcode += sizeof(MCode); - *--pp = PPCI_MCRXR; /* Clear SO flag. */ - J->cur.mcode = pp; - lj_mcode_sync(pp, pp+1); - } - lj_mcode_patch(J, mcarea, 1); -} - diff --git a/deps/luajit/src/lj_asm_x86.h b/deps/luajit/src/lj_asm_x86.h deleted file mode 100644 index 0b6b2d4a..00000000 --- a/deps/luajit/src/lj_asm_x86.h +++ /dev/null @@ -1,2806 +0,0 @@ -/* -** x86/x64 IR assembler (SSA IR -> machine code). -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -/* -- Guard handling ------------------------------------------------------ */ - -/* Generate an exit stub group at the bottom of the reserved MCode memory. */ -static MCode *asm_exitstub_gen(ASMState *as, ExitNo group) -{ - ExitNo i, groupofs = (group*EXITSTUBS_PER_GROUP) & 0xff; - MCode *mxp = as->mcbot; - MCode *mxpstart = mxp; - if (mxp + (2+2)*EXITSTUBS_PER_GROUP+8+5 >= as->mctop) - asm_mclimit(as); - /* Push low byte of exitno for each exit stub. */ - *mxp++ = XI_PUSHi8; *mxp++ = (MCode)groupofs; - for (i = 1; i < EXITSTUBS_PER_GROUP; i++) { - *mxp++ = XI_JMPs; *mxp++ = (MCode)((2+2)*(EXITSTUBS_PER_GROUP - i) - 2); - *mxp++ = XI_PUSHi8; *mxp++ = (MCode)(groupofs + i); - } - /* Push the high byte of the exitno for each exit stub group. */ - *mxp++ = XI_PUSHi8; *mxp++ = (MCode)((group*EXITSTUBS_PER_GROUP)>>8); - /* Store DISPATCH at original stack slot 0. Account for the two push ops. */ - *mxp++ = XI_MOVmi; - *mxp++ = MODRM(XM_OFS8, 0, RID_ESP); - *mxp++ = MODRM(XM_SCALE1, RID_ESP, RID_ESP); - *mxp++ = 2*sizeof(void *); - *(int32_t *)mxp = ptr2addr(J2GG(as->J)->dispatch); mxp += 4; - /* Jump to exit handler which fills in the ExitState. */ - *mxp++ = XI_JMP; mxp += 4; - *((int32_t *)(mxp-4)) = jmprel(mxp, (MCode *)(void *)lj_vm_exit_handler); - /* Commit the code for this group (even if assembly fails later on). */ - lj_mcode_commitbot(as->J, mxp); - as->mcbot = mxp; - as->mclim = as->mcbot + MCLIM_REDZONE; - return mxpstart; -} - -/* Setup all needed exit stubs. */ -static void asm_exitstub_setup(ASMState *as, ExitNo nexits) -{ - ExitNo i; - if (nexits >= EXITSTUBS_PER_GROUP*LJ_MAX_EXITSTUBGR) - lj_trace_err(as->J, LJ_TRERR_SNAPOV); - for (i = 0; i < (nexits+EXITSTUBS_PER_GROUP-1)/EXITSTUBS_PER_GROUP; i++) - if (as->J->exitstubgroup[i] == NULL) - as->J->exitstubgroup[i] = asm_exitstub_gen(as, i); -} - -/* Emit conditional branch to exit for guard. -** It's important to emit this *after* all registers have been allocated, -** because rematerializations may invalidate the flags. -*/ -static void asm_guardcc(ASMState *as, int cc) -{ - MCode *target = exitstub_addr(as->J, as->snapno); - MCode *p = as->mcp; - if (LJ_UNLIKELY(p == as->invmcp)) { - as->loopinv = 1; - *(int32_t *)(p+1) = jmprel(p+5, target); - target = p; - cc ^= 1; - if (as->realign) { - emit_sjcc(as, cc, target); - return; - } - } - emit_jcc(as, cc, target); -} - -/* -- Memory operand fusion ----------------------------------------------- */ - -/* Limit linear search to this distance. Avoids O(n^2) behavior. */ -#define CONFLICT_SEARCH_LIM 31 - -/* Check if a reference is a signed 32 bit constant. */ -static int asm_isk32(ASMState *as, IRRef ref, int32_t *k) -{ - if (irref_isk(ref)) { - IRIns *ir = IR(ref); - if (ir->o != IR_KINT64) { - *k = ir->i; - return 1; - } else if (checki32((int64_t)ir_kint64(ir)->u64)) { - *k = (int32_t)ir_kint64(ir)->u64; - return 1; - } - } - return 0; -} - -/* Check if there's no conflicting instruction between curins and ref. -** Also avoid fusing loads if there are multiple references. -*/ -static int noconflict(ASMState *as, IRRef ref, IROp conflict, int noload) -{ - IRIns *ir = as->ir; - IRRef i = as->curins; - if (i > ref + CONFLICT_SEARCH_LIM) - return 0; /* Give up, ref is too far away. */ - while (--i > ref) { - if (ir[i].o == conflict) - return 0; /* Conflict found. */ - else if (!noload && (ir[i].op1 == ref || ir[i].op2 == ref)) - return 0; - } - return 1; /* Ok, no conflict. */ -} - -/* Fuse array base into memory operand. */ -static IRRef asm_fuseabase(ASMState *as, IRRef ref) -{ - IRIns *irb = IR(ref); - as->mrm.ofs = 0; - if (irb->o == IR_FLOAD) { - IRIns *ira = IR(irb->op1); - lua_assert(irb->op2 == IRFL_TAB_ARRAY); - /* We can avoid the FLOAD of t->array for colocated arrays. */ - if (ira->o == IR_TNEW && ira->op1 <= LJ_MAX_COLOSIZE && - !neverfuse(as) && noconflict(as, irb->op1, IR_NEWREF, 1)) { - as->mrm.ofs = (int32_t)sizeof(GCtab); /* Ofs to colocated array. */ - return irb->op1; /* Table obj. */ - } - } else if (irb->o == IR_ADD && irref_isk(irb->op2)) { - /* Fuse base offset (vararg load). */ - as->mrm.ofs = IR(irb->op2)->i; - return irb->op1; - } - return ref; /* Otherwise use the given array base. */ -} - -/* Fuse array reference into memory operand. */ -static void asm_fusearef(ASMState *as, IRIns *ir, RegSet allow) -{ - IRIns *irx; - lua_assert(ir->o == IR_AREF); - as->mrm.base = (uint8_t)ra_alloc1(as, asm_fuseabase(as, ir->op1), allow); - irx = IR(ir->op2); - if (irref_isk(ir->op2)) { - as->mrm.ofs += 8*irx->i; - as->mrm.idx = RID_NONE; - } else { - rset_clear(allow, as->mrm.base); - as->mrm.scale = XM_SCALE8; - /* Fuse a constant ADD (e.g. t[i+1]) into the offset. - ** Doesn't help much without ABCelim, but reduces register pressure. - */ - if (!LJ_64 && /* Has bad effects with negative index on x64. */ - mayfuse(as, ir->op2) && ra_noreg(irx->r) && - irx->o == IR_ADD && irref_isk(irx->op2)) { - as->mrm.ofs += 8*IR(irx->op2)->i; - as->mrm.idx = (uint8_t)ra_alloc1(as, irx->op1, allow); - } else { - as->mrm.idx = (uint8_t)ra_alloc1(as, ir->op2, allow); - } - } -} - -/* Fuse array/hash/upvalue reference into memory operand. -** Caveat: this may allocate GPRs for the base/idx registers. Be sure to -** pass the final allow mask, excluding any GPRs used for other inputs. -** In particular: 2-operand GPR instructions need to call ra_dest() first! -*/ -static void asm_fuseahuref(ASMState *as, IRRef ref, RegSet allow) -{ - IRIns *ir = IR(ref); - if (ra_noreg(ir->r)) { - switch ((IROp)ir->o) { - case IR_AREF: - if (mayfuse(as, ref)) { - asm_fusearef(as, ir, allow); - return; - } - break; - case IR_HREFK: - if (mayfuse(as, ref)) { - as->mrm.base = (uint8_t)ra_alloc1(as, ir->op1, allow); - as->mrm.ofs = (int32_t)(IR(ir->op2)->op2 * sizeof(Node)); - as->mrm.idx = RID_NONE; - return; - } - break; - case IR_UREFC: - if (irref_isk(ir->op1)) { - GCfunc *fn = ir_kfunc(IR(ir->op1)); - GCupval *uv = &gcref(fn->l.uvptr[(ir->op2 >> 8)])->uv; - as->mrm.ofs = ptr2addr(&uv->tv); - as->mrm.base = as->mrm.idx = RID_NONE; - return; - } - break; - default: - lua_assert(ir->o == IR_HREF || ir->o == IR_NEWREF || ir->o == IR_UREFO || - ir->o == IR_KKPTR); - break; - } - } - as->mrm.base = (uint8_t)ra_alloc1(as, ref, allow); - as->mrm.ofs = 0; - as->mrm.idx = RID_NONE; -} - -/* Fuse FLOAD/FREF reference into memory operand. */ -static void asm_fusefref(ASMState *as, IRIns *ir, RegSet allow) -{ - lua_assert(ir->o == IR_FLOAD || ir->o == IR_FREF); - as->mrm.ofs = field_ofs[ir->op2]; - as->mrm.idx = RID_NONE; - if (irref_isk(ir->op1)) { - as->mrm.ofs += IR(ir->op1)->i; - as->mrm.base = RID_NONE; - } else { - as->mrm.base = (uint8_t)ra_alloc1(as, ir->op1, allow); - } -} - -/* Fuse string reference into memory operand. */ -static void asm_fusestrref(ASMState *as, IRIns *ir, RegSet allow) -{ - IRIns *irr; - lua_assert(ir->o == IR_STRREF); - as->mrm.base = as->mrm.idx = RID_NONE; - as->mrm.scale = XM_SCALE1; - as->mrm.ofs = sizeof(GCstr); - if (irref_isk(ir->op1)) { - as->mrm.ofs += IR(ir->op1)->i; - } else { - Reg r = ra_alloc1(as, ir->op1, allow); - rset_clear(allow, r); - as->mrm.base = (uint8_t)r; - } - irr = IR(ir->op2); - if (irref_isk(ir->op2)) { - as->mrm.ofs += irr->i; - } else { - Reg r; - /* Fuse a constant add into the offset, e.g. string.sub(s, i+10). */ - if (!LJ_64 && /* Has bad effects with negative index on x64. */ - mayfuse(as, ir->op2) && irr->o == IR_ADD && irref_isk(irr->op2)) { - as->mrm.ofs += IR(irr->op2)->i; - r = ra_alloc1(as, irr->op1, allow); - } else { - r = ra_alloc1(as, ir->op2, allow); - } - if (as->mrm.base == RID_NONE) - as->mrm.base = (uint8_t)r; - else - as->mrm.idx = (uint8_t)r; - } -} - -static void asm_fusexref(ASMState *as, IRRef ref, RegSet allow) -{ - IRIns *ir = IR(ref); - as->mrm.idx = RID_NONE; - if (ir->o == IR_KPTR || ir->o == IR_KKPTR) { - as->mrm.ofs = ir->i; - as->mrm.base = RID_NONE; - } else if (ir->o == IR_STRREF) { - asm_fusestrref(as, ir, allow); - } else { - as->mrm.ofs = 0; - if (canfuse(as, ir) && ir->o == IR_ADD && ra_noreg(ir->r)) { - /* Gather (base+idx*sz)+ofs as emitted by cdata ptr/array indexing. */ - IRIns *irx; - IRRef idx; - Reg r; - if (asm_isk32(as, ir->op2, &as->mrm.ofs)) { /* Recognize x+ofs. */ - ref = ir->op1; - ir = IR(ref); - if (!(ir->o == IR_ADD && canfuse(as, ir) && ra_noreg(ir->r))) - goto noadd; - } - as->mrm.scale = XM_SCALE1; - idx = ir->op1; - ref = ir->op2; - irx = IR(idx); - if (!(irx->o == IR_BSHL || irx->o == IR_ADD)) { /* Try other operand. */ - idx = ir->op2; - ref = ir->op1; - irx = IR(idx); - } - if (canfuse(as, irx) && ra_noreg(irx->r)) { - if (irx->o == IR_BSHL && irref_isk(irx->op2) && IR(irx->op2)->i <= 3) { - /* Recognize idx<op1; - as->mrm.scale = (uint8_t)(IR(irx->op2)->i << 6); - } else if (irx->o == IR_ADD && irx->op1 == irx->op2) { - /* FOLD does idx*2 ==> idx<<1 ==> idx+idx. */ - idx = irx->op1; - as->mrm.scale = XM_SCALE2; - } - } - r = ra_alloc1(as, idx, allow); - rset_clear(allow, r); - as->mrm.idx = (uint8_t)r; - } - noadd: - as->mrm.base = (uint8_t)ra_alloc1(as, ref, allow); - } -} - -/* Fuse load into memory operand. */ -static Reg asm_fuseload(ASMState *as, IRRef ref, RegSet allow) -{ - IRIns *ir = IR(ref); - if (ra_hasreg(ir->r)) { - if (allow != RSET_EMPTY) { /* Fast path. */ - ra_noweak(as, ir->r); - return ir->r; - } - fusespill: - /* Force a spill if only memory operands are allowed (asm_x87load). */ - as->mrm.base = RID_ESP; - as->mrm.ofs = ra_spill(as, ir); - as->mrm.idx = RID_NONE; - return RID_MRM; - } - if (ir->o == IR_KNUM) { - RegSet avail = as->freeset & ~as->modset & RSET_FPR; - lua_assert(allow != RSET_EMPTY); - if (!(avail & (avail-1))) { /* Fuse if less than two regs available. */ - as->mrm.ofs = ptr2addr(ir_knum(ir)); - as->mrm.base = as->mrm.idx = RID_NONE; - return RID_MRM; - } - } else if (ir->o == IR_KINT64) { - RegSet avail = as->freeset & ~as->modset & RSET_GPR; - lua_assert(allow != RSET_EMPTY); - if (!(avail & (avail-1))) { /* Fuse if less than two regs available. */ - as->mrm.ofs = ptr2addr(ir_kint64(ir)); - as->mrm.base = as->mrm.idx = RID_NONE; - return RID_MRM; - } - } else if (mayfuse(as, ref)) { - RegSet xallow = (allow & RSET_GPR) ? allow : RSET_GPR; - if (ir->o == IR_SLOAD) { - if (!(ir->op2 & (IRSLOAD_PARENT|IRSLOAD_CONVERT)) && - noconflict(as, ref, IR_RETF, 0)) { - as->mrm.base = (uint8_t)ra_alloc1(as, REF_BASE, xallow); - as->mrm.ofs = 8*((int32_t)ir->op1-1) + ((ir->op2&IRSLOAD_FRAME)?4:0); - as->mrm.idx = RID_NONE; - return RID_MRM; - } - } else if (ir->o == IR_FLOAD) { - /* Generic fusion is only ok for 32 bit operand (but see asm_comp). */ - if ((irt_isint(ir->t) || irt_isu32(ir->t) || irt_isaddr(ir->t)) && - noconflict(as, ref, IR_FSTORE, 0)) { - asm_fusefref(as, ir, xallow); - return RID_MRM; - } - } else if (ir->o == IR_ALOAD || ir->o == IR_HLOAD || ir->o == IR_ULOAD) { - if (noconflict(as, ref, ir->o + IRDELTA_L2S, 0)) { - asm_fuseahuref(as, ir->op1, xallow); - return RID_MRM; - } - } else if (ir->o == IR_XLOAD) { - /* Generic fusion is not ok for 8/16 bit operands (but see asm_comp). - ** Fusing unaligned memory operands is ok on x86 (except for SIMD types). - */ - if ((!irt_typerange(ir->t, IRT_I8, IRT_U16)) && - noconflict(as, ref, IR_XSTORE, 0)) { - asm_fusexref(as, ir->op1, xallow); - return RID_MRM; - } - } else if (ir->o == IR_VLOAD) { - asm_fuseahuref(as, ir->op1, xallow); - return RID_MRM; - } - } - if (!(as->freeset & allow) && !irref_isk(ref) && - (allow == RSET_EMPTY || ra_hasspill(ir->s) || iscrossref(as, ref))) - goto fusespill; - return ra_allocref(as, ref, allow); -} - -#if LJ_64 -/* Don't fuse a 32 bit load into a 64 bit operation. */ -static Reg asm_fuseloadm(ASMState *as, IRRef ref, RegSet allow, int is64) -{ - if (is64 && !irt_is64(IR(ref)->t)) - return ra_alloc1(as, ref, allow); - return asm_fuseload(as, ref, allow); -} -#else -#define asm_fuseloadm(as, ref, allow, is64) asm_fuseload(as, (ref), (allow)) -#endif - -/* -- Calls --------------------------------------------------------------- */ - -/* Count the required number of stack slots for a call. */ -static int asm_count_call_slots(ASMState *as, const CCallInfo *ci, IRRef *args) -{ - uint32_t i, nargs = CCI_NARGS(ci); - int nslots = 0; -#if LJ_64 - if (LJ_ABI_WIN) { - nslots = (int)(nargs*2); /* Only matters for more than four args. */ - } else { - int ngpr = REGARG_NUMGPR, nfpr = REGARG_NUMFPR; - for (i = 0; i < nargs; i++) - if (args[i] && irt_isfp(IR(args[i])->t)) { - if (nfpr > 0) nfpr--; else nslots += 2; - } else { - if (ngpr > 0) ngpr--; else nslots += 2; - } - } -#else - int ngpr = 0; - if ((ci->flags & CCI_CC_MASK) == CCI_CC_FASTCALL) - ngpr = 2; - else if ((ci->flags & CCI_CC_MASK) == CCI_CC_THISCALL) - ngpr = 1; - for (i = 0; i < nargs; i++) - if (args[i] && irt_isfp(IR(args[i])->t)) { - nslots += irt_isnum(IR(args[i])->t) ? 2 : 1; - } else { - if (ngpr > 0) ngpr--; else nslots++; - } -#endif - return nslots; -} - -/* Generate a call to a C function. */ -static void asm_gencall(ASMState *as, const CCallInfo *ci, IRRef *args) -{ - uint32_t n, nargs = CCI_NARGS(ci); - int32_t ofs = STACKARG_OFS; -#if LJ_64 - uint32_t gprs = REGARG_GPRS; - Reg fpr = REGARG_FIRSTFPR; -#if !LJ_ABI_WIN - MCode *patchnfpr = NULL; -#endif -#else - uint32_t gprs = 0; - if ((ci->flags & CCI_CC_MASK) != CCI_CC_CDECL) { - if ((ci->flags & CCI_CC_MASK) == CCI_CC_THISCALL) - gprs = (REGARG_GPRS & 31); - else if ((ci->flags & CCI_CC_MASK) == CCI_CC_FASTCALL) - gprs = REGARG_GPRS; - } -#endif - if ((void *)ci->func) - emit_call(as, ci->func); -#if LJ_64 - if ((ci->flags & CCI_VARARG)) { /* Special handling for vararg calls. */ -#if LJ_ABI_WIN - for (n = 0; n < 4 && n < nargs; n++) { - IRIns *ir = IR(args[n]); - if (irt_isfp(ir->t)) /* Duplicate FPRs in GPRs. */ - emit_rr(as, XO_MOVDto, (irt_isnum(ir->t) ? REX_64 : 0) | (fpr+n), - ((gprs >> (n*5)) & 31)); /* Either MOVD or MOVQ. */ - } -#else - patchnfpr = --as->mcp; /* Indicate number of used FPRs in register al. */ - *--as->mcp = XI_MOVrib | RID_EAX; -#endif - } -#endif - for (n = 0; n < nargs; n++) { /* Setup args. */ - IRRef ref = args[n]; - IRIns *ir = IR(ref); - Reg r; -#if LJ_64 && LJ_ABI_WIN - /* Windows/x64 argument registers are strictly positional. */ - r = irt_isfp(ir->t) ? (fpr <= REGARG_LASTFPR ? fpr : 0) : (gprs & 31); - fpr++; gprs >>= 5; -#elif LJ_64 - /* POSIX/x64 argument registers are used in order of appearance. */ - if (irt_isfp(ir->t)) { - r = fpr <= REGARG_LASTFPR ? fpr++ : 0; - } else { - r = gprs & 31; gprs >>= 5; - } -#else - if (ref && irt_isfp(ir->t)) { - r = 0; - } else { - r = gprs & 31; gprs >>= 5; - if (!ref) continue; - } -#endif - if (r) { /* Argument is in a register. */ - if (r < RID_MAX_GPR && ref < ASMREF_TMP1) { -#if LJ_64 - if (ir->o == IR_KINT64) - emit_loadu64(as, r, ir_kint64(ir)->u64); - else -#endif - emit_loadi(as, r, ir->i); - } else { - lua_assert(rset_test(as->freeset, r)); /* Must have been evicted. */ - if (ra_hasreg(ir->r)) { - ra_noweak(as, ir->r); - emit_movrr(as, ir, r, ir->r); - } else { - ra_allocref(as, ref, RID2RSET(r)); - } - } - } else if (irt_isfp(ir->t)) { /* FP argument is on stack. */ - lua_assert(!(irt_isfloat(ir->t) && irref_isk(ref))); /* No float k. */ - if (LJ_32 && (ofs & 4) && irref_isk(ref)) { - /* Split stores for unaligned FP consts. */ - emit_movmroi(as, RID_ESP, ofs, (int32_t)ir_knum(ir)->u32.lo); - emit_movmroi(as, RID_ESP, ofs+4, (int32_t)ir_knum(ir)->u32.hi); - } else { - r = ra_alloc1(as, ref, RSET_FPR); - emit_rmro(as, irt_isnum(ir->t) ? XO_MOVSDto : XO_MOVSSto, - r, RID_ESP, ofs); - } - ofs += (LJ_32 && irt_isfloat(ir->t)) ? 4 : 8; - } else { /* Non-FP argument is on stack. */ - if (LJ_32 && ref < ASMREF_TMP1) { - emit_movmroi(as, RID_ESP, ofs, ir->i); - } else { - r = ra_alloc1(as, ref, RSET_GPR); - emit_movtomro(as, REX_64 + r, RID_ESP, ofs); - } - ofs += sizeof(intptr_t); - } - checkmclim(as); - } -#if LJ_64 && !LJ_ABI_WIN - if (patchnfpr) *patchnfpr = fpr - REGARG_FIRSTFPR; -#endif -} - -/* Setup result reg/sp for call. Evict scratch regs. */ -static void asm_setupresult(ASMState *as, IRIns *ir, const CCallInfo *ci) -{ - RegSet drop = RSET_SCRATCH; - int hiop = (LJ_32 && (ir+1)->o == IR_HIOP); - if ((ci->flags & CCI_NOFPRCLOBBER)) - drop &= ~RSET_FPR; - if (ra_hasreg(ir->r)) - rset_clear(drop, ir->r); /* Dest reg handled below. */ - if (hiop && ra_hasreg((ir+1)->r)) - rset_clear(drop, (ir+1)->r); /* Dest reg handled below. */ - ra_evictset(as, drop); /* Evictions must be performed first. */ - if (ra_used(ir)) { - if (irt_isfp(ir->t)) { - int32_t ofs = sps_scale(ir->s); /* Use spill slot or temp slots. */ -#if LJ_64 - if ((ci->flags & CCI_CASTU64)) { - Reg dest = ir->r; - if (ra_hasreg(dest)) { - ra_free(as, dest); - ra_modified(as, dest); - emit_rr(as, XO_MOVD, dest|REX_64, RID_RET); /* Really MOVQ. */ - } - if (ofs) emit_movtomro(as, RID_RET|REX_64, RID_ESP, ofs); - } else { - ra_destreg(as, ir, RID_FPRET); - } -#else - /* Number result is in x87 st0 for x86 calling convention. */ - Reg dest = ir->r; - if (ra_hasreg(dest)) { - ra_free(as, dest); - ra_modified(as, dest); - emit_rmro(as, irt_isnum(ir->t) ? XMM_MOVRM(as) : XO_MOVSS, - dest, RID_ESP, ofs); - } - if ((ci->flags & CCI_CASTU64)) { - emit_movtomro(as, RID_RETLO, RID_ESP, ofs); - emit_movtomro(as, RID_RETHI, RID_ESP, ofs+4); - } else { - emit_rmro(as, irt_isnum(ir->t) ? XO_FSTPq : XO_FSTPd, - irt_isnum(ir->t) ? XOg_FSTPq : XOg_FSTPd, RID_ESP, ofs); - } -#endif -#if LJ_32 - } else if (hiop) { - ra_destpair(as, ir); -#endif - } else { - lua_assert(!irt_ispri(ir->t)); - ra_destreg(as, ir, RID_RET); - } - } else if (LJ_32 && irt_isfp(ir->t) && !(ci->flags & CCI_CASTU64)) { - emit_x87op(as, XI_FPOP); /* Pop unused result from x87 st0. */ - } -} - -static void asm_call(ASMState *as, IRIns *ir) -{ - IRRef args[CCI_NARGS_MAX]; - const CCallInfo *ci = &lj_ir_callinfo[ir->op2]; - asm_collectargs(as, ir, ci, args); - asm_setupresult(as, ir, ci); - asm_gencall(as, ci, args); -} - -/* Return a constant function pointer or NULL for indirect calls. */ -static void *asm_callx_func(ASMState *as, IRIns *irf, IRRef func) -{ -#if LJ_32 - UNUSED(as); - if (irref_isk(func)) - return (void *)irf->i; -#else - if (irref_isk(func)) { - MCode *p; - if (irf->o == IR_KINT64) - p = (MCode *)(void *)ir_k64(irf)->u64; - else - p = (MCode *)(void *)(uintptr_t)(uint32_t)irf->i; - if (p - as->mcp == (int32_t)(p - as->mcp)) - return p; /* Call target is still in +-2GB range. */ - /* Avoid the indirect case of emit_call(). Try to hoist func addr. */ - } -#endif - return NULL; -} - -static void asm_callx(ASMState *as, IRIns *ir) -{ - IRRef args[CCI_NARGS_MAX*2]; - CCallInfo ci; - IRRef func; - IRIns *irf; - int32_t spadj = 0; - ci.flags = asm_callx_flags(as, ir); - asm_collectargs(as, ir, &ci, args); - asm_setupresult(as, ir, &ci); -#if LJ_32 - /* Have to readjust stack after non-cdecl calls due to callee cleanup. */ - if ((ci.flags & CCI_CC_MASK) != CCI_CC_CDECL) - spadj = 4 * asm_count_call_slots(as, &ci, args); -#endif - func = ir->op2; irf = IR(func); - if (irf->o == IR_CARG) { func = irf->op1; irf = IR(func); } - ci.func = (ASMFunction)asm_callx_func(as, irf, func); - if (!(void *)ci.func) { - /* Use a (hoistable) non-scratch register for indirect calls. */ - RegSet allow = (RSET_GPR & ~RSET_SCRATCH); - Reg r = ra_alloc1(as, func, allow); - if (LJ_32) emit_spsub(as, spadj); /* Above code may cause restores! */ - emit_rr(as, XO_GROUP5, XOg_CALL, r); - } else if (LJ_32) { - emit_spsub(as, spadj); - } - asm_gencall(as, &ci, args); -} - -/* -- Returns ------------------------------------------------------------- */ - -/* Return to lower frame. Guard that it goes to the right spot. */ -static void asm_retf(ASMState *as, IRIns *ir) -{ - Reg base = ra_alloc1(as, REF_BASE, RSET_GPR); - void *pc = ir_kptr(IR(ir->op2)); - int32_t delta = 1+bc_a(*((const BCIns *)pc - 1)); - as->topslot -= (BCReg)delta; - if ((int32_t)as->topslot < 0) as->topslot = 0; - irt_setmark(IR(REF_BASE)->t); /* Children must not coalesce with BASE reg. */ - emit_setgl(as, base, jit_base); - emit_addptr(as, base, -8*delta); - asm_guardcc(as, CC_NE); - emit_gmroi(as, XG_ARITHi(XOg_CMP), base, -4, ptr2addr(pc)); -} - -/* -- Type conversions ---------------------------------------------------- */ - -static void asm_tointg(ASMState *as, IRIns *ir, Reg left) -{ - Reg tmp = ra_scratch(as, rset_exclude(RSET_FPR, left)); - Reg dest = ra_dest(as, ir, RSET_GPR); - asm_guardcc(as, CC_P); - asm_guardcc(as, CC_NE); - emit_rr(as, XO_UCOMISD, left, tmp); - emit_rr(as, XO_CVTSI2SD, tmp, dest); - if (!(as->flags & JIT_F_SPLIT_XMM)) - emit_rr(as, XO_XORPS, tmp, tmp); /* Avoid partial register stall. */ - emit_rr(as, XO_CVTTSD2SI, dest, left); - /* Can't fuse since left is needed twice. */ -} - -static void asm_tobit(ASMState *as, IRIns *ir) -{ - Reg dest = ra_dest(as, ir, RSET_GPR); - Reg tmp = ra_noreg(IR(ir->op1)->r) ? - ra_alloc1(as, ir->op1, RSET_FPR) : - ra_scratch(as, RSET_FPR); - Reg right = asm_fuseload(as, ir->op2, rset_exclude(RSET_FPR, tmp)); - emit_rr(as, XO_MOVDto, tmp, dest); - emit_mrm(as, XO_ADDSD, tmp, right); - ra_left(as, tmp, ir->op1); -} - -static void asm_conv(ASMState *as, IRIns *ir) -{ - IRType st = (IRType)(ir->op2 & IRCONV_SRCMASK); - int st64 = (st == IRT_I64 || st == IRT_U64 || (LJ_64 && st == IRT_P64)); - int stfp = (st == IRT_NUM || st == IRT_FLOAT); - IRRef lref = ir->op1; - lua_assert(irt_type(ir->t) != st); - lua_assert(!(LJ_32 && (irt_isint64(ir->t) || st64))); /* Handled by SPLIT. */ - if (irt_isfp(ir->t)) { - Reg dest = ra_dest(as, ir, RSET_FPR); - if (stfp) { /* FP to FP conversion. */ - Reg left = asm_fuseload(as, lref, RSET_FPR); - emit_mrm(as, st == IRT_NUM ? XO_CVTSD2SS : XO_CVTSS2SD, dest, left); - if (left == dest) return; /* Avoid the XO_XORPS. */ - } else if (LJ_32 && st == IRT_U32) { /* U32 to FP conversion on x86. */ - /* number = (2^52+2^51 .. u32) - (2^52+2^51) */ - cTValue *k = lj_ir_k64_find(as->J, U64x(43380000,00000000)); - Reg bias = ra_scratch(as, rset_exclude(RSET_FPR, dest)); - if (irt_isfloat(ir->t)) - emit_rr(as, XO_CVTSD2SS, dest, dest); - emit_rr(as, XO_SUBSD, dest, bias); /* Subtract 2^52+2^51 bias. */ - emit_rr(as, XO_XORPS, dest, bias); /* Merge bias and integer. */ - emit_loadn(as, bias, k); - emit_mrm(as, XO_MOVD, dest, asm_fuseload(as, lref, RSET_GPR)); - return; - } else { /* Integer to FP conversion. */ - Reg left = (LJ_64 && (st == IRT_U32 || st == IRT_U64)) ? - ra_alloc1(as, lref, RSET_GPR) : - asm_fuseloadm(as, lref, RSET_GPR, st64); - if (LJ_64 && st == IRT_U64) { - MCLabel l_end = emit_label(as); - const void *k = lj_ir_k64_find(as->J, U64x(43f00000,00000000)); - emit_rma(as, XO_ADDSD, dest, k); /* Add 2^64 to compensate. */ - emit_sjcc(as, CC_NS, l_end); - emit_rr(as, XO_TEST, left|REX_64, left); /* Check if u64 >= 2^63. */ - } - emit_mrm(as, irt_isnum(ir->t) ? XO_CVTSI2SD : XO_CVTSI2SS, - dest|((LJ_64 && (st64 || st == IRT_U32)) ? REX_64 : 0), left); - } - if (!(as->flags & JIT_F_SPLIT_XMM)) - emit_rr(as, XO_XORPS, dest, dest); /* Avoid partial register stall. */ - } else if (stfp) { /* FP to integer conversion. */ - if (irt_isguard(ir->t)) { - /* Checked conversions are only supported from number to int. */ - lua_assert(irt_isint(ir->t) && st == IRT_NUM); - asm_tointg(as, ir, ra_alloc1(as, lref, RSET_FPR)); - } else { - Reg dest = ra_dest(as, ir, RSET_GPR); - x86Op op = st == IRT_NUM ? - ((ir->op2 & IRCONV_TRUNC) ? XO_CVTTSD2SI : XO_CVTSD2SI) : - ((ir->op2 & IRCONV_TRUNC) ? XO_CVTTSS2SI : XO_CVTSS2SI); - if (LJ_64 ? irt_isu64(ir->t) : irt_isu32(ir->t)) { - /* LJ_64: For inputs >= 2^63 add -2^64, convert again. */ - /* LJ_32: For inputs >= 2^31 add -2^31, convert again and add 2^31. */ - Reg tmp = ra_noreg(IR(lref)->r) ? ra_alloc1(as, lref, RSET_FPR) : - ra_scratch(as, RSET_FPR); - MCLabel l_end = emit_label(as); - if (LJ_32) - emit_gri(as, XG_ARITHi(XOg_ADD), dest, (int32_t)0x80000000); - emit_rr(as, op, dest|REX_64, tmp); - if (st == IRT_NUM) - emit_rma(as, XO_ADDSD, tmp, lj_ir_k64_find(as->J, - LJ_64 ? U64x(c3f00000,00000000) : U64x(c1e00000,00000000))); - else - emit_rma(as, XO_ADDSS, tmp, lj_ir_k64_find(as->J, - LJ_64 ? U64x(00000000,df800000) : U64x(00000000,cf000000))); - emit_sjcc(as, CC_NS, l_end); - emit_rr(as, XO_TEST, dest|REX_64, dest); /* Check if dest negative. */ - emit_rr(as, op, dest|REX_64, tmp); - ra_left(as, tmp, lref); - } else { - Reg left = asm_fuseload(as, lref, RSET_FPR); - if (LJ_64 && irt_isu32(ir->t)) - emit_rr(as, XO_MOV, dest, dest); /* Zero hiword. */ - emit_mrm(as, op, - dest|((LJ_64 && - (irt_is64(ir->t) || irt_isu32(ir->t))) ? REX_64 : 0), - left); - } - } - } else if (st >= IRT_I8 && st <= IRT_U16) { /* Extend to 32 bit integer. */ - Reg left, dest = ra_dest(as, ir, RSET_GPR); - RegSet allow = RSET_GPR; - x86Op op; - lua_assert(irt_isint(ir->t) || irt_isu32(ir->t)); - if (st == IRT_I8) { - op = XO_MOVSXb; allow = RSET_GPR8; dest |= FORCE_REX; - } else if (st == IRT_U8) { - op = XO_MOVZXb; allow = RSET_GPR8; dest |= FORCE_REX; - } else if (st == IRT_I16) { - op = XO_MOVSXw; - } else { - op = XO_MOVZXw; - } - left = asm_fuseload(as, lref, allow); - /* Add extra MOV if source is already in wrong register. */ - if (!LJ_64 && left != RID_MRM && !rset_test(allow, left)) { - Reg tmp = ra_scratch(as, allow); - emit_rr(as, op, dest, tmp); - emit_rr(as, XO_MOV, tmp, left); - } else { - emit_mrm(as, op, dest, left); - } - } else { /* 32/64 bit integer conversions. */ - if (LJ_32) { /* Only need to handle 32/32 bit no-op (cast) on x86. */ - Reg dest = ra_dest(as, ir, RSET_GPR); - ra_left(as, dest, lref); /* Do nothing, but may need to move regs. */ - } else if (irt_is64(ir->t)) { - Reg dest = ra_dest(as, ir, RSET_GPR); - if (st64 || !(ir->op2 & IRCONV_SEXT)) { - /* 64/64 bit no-op (cast) or 32 to 64 bit zero extension. */ - ra_left(as, dest, lref); /* Do nothing, but may need to move regs. */ - } else { /* 32 to 64 bit sign extension. */ - Reg left = asm_fuseload(as, lref, RSET_GPR); - emit_mrm(as, XO_MOVSXd, dest|REX_64, left); - } - } else { - Reg dest = ra_dest(as, ir, RSET_GPR); - if (st64) { - Reg left = asm_fuseload(as, lref, RSET_GPR); - /* This is either a 32 bit reg/reg mov which zeroes the hiword - ** or a load of the loword from a 64 bit address. - */ - emit_mrm(as, XO_MOV, dest, left); - } else { /* 32/32 bit no-op (cast). */ - ra_left(as, dest, lref); /* Do nothing, but may need to move regs. */ - } - } - } -} - -#if LJ_32 && LJ_HASFFI -/* No SSE conversions to/from 64 bit on x86, so resort to ugly x87 code. */ - -/* 64 bit integer to FP conversion in 32 bit mode. */ -static void asm_conv_fp_int64(ASMState *as, IRIns *ir) -{ - Reg hi = ra_alloc1(as, ir->op1, RSET_GPR); - Reg lo = ra_alloc1(as, (ir-1)->op1, rset_exclude(RSET_GPR, hi)); - int32_t ofs = sps_scale(ir->s); /* Use spill slot or temp slots. */ - Reg dest = ir->r; - if (ra_hasreg(dest)) { - ra_free(as, dest); - ra_modified(as, dest); - emit_rmro(as, irt_isnum(ir->t) ? XMM_MOVRM(as) : XO_MOVSS, - dest, RID_ESP, ofs); - } - emit_rmro(as, irt_isnum(ir->t) ? XO_FSTPq : XO_FSTPd, - irt_isnum(ir->t) ? XOg_FSTPq : XOg_FSTPd, RID_ESP, ofs); - if (((ir-1)->op2 & IRCONV_SRCMASK) == IRT_U64) { - /* For inputs in [2^63,2^64-1] add 2^64 to compensate. */ - MCLabel l_end = emit_label(as); - emit_rma(as, XO_FADDq, XOg_FADDq, - lj_ir_k64_find(as->J, U64x(43f00000,00000000))); - emit_sjcc(as, CC_NS, l_end); - emit_rr(as, XO_TEST, hi, hi); /* Check if u64 >= 2^63. */ - } else { - lua_assert(((ir-1)->op2 & IRCONV_SRCMASK) == IRT_I64); - } - emit_rmro(as, XO_FILDq, XOg_FILDq, RID_ESP, 0); - /* NYI: Avoid narrow-to-wide store-to-load forwarding stall. */ - emit_rmro(as, XO_MOVto, hi, RID_ESP, 4); - emit_rmro(as, XO_MOVto, lo, RID_ESP, 0); -} - -/* FP to 64 bit integer conversion in 32 bit mode. */ -static void asm_conv_int64_fp(ASMState *as, IRIns *ir) -{ - IRType st = (IRType)((ir-1)->op2 & IRCONV_SRCMASK); - IRType dt = (((ir-1)->op2 & IRCONV_DSTMASK) >> IRCONV_DSH); - Reg lo, hi; - lua_assert(st == IRT_NUM || st == IRT_FLOAT); - lua_assert(dt == IRT_I64 || dt == IRT_U64); - lua_assert(((ir-1)->op2 & IRCONV_TRUNC)); - hi = ra_dest(as, ir, RSET_GPR); - lo = ra_dest(as, ir-1, rset_exclude(RSET_GPR, hi)); - if (ra_used(ir-1)) emit_rmro(as, XO_MOV, lo, RID_ESP, 0); - /* NYI: Avoid wide-to-narrow store-to-load forwarding stall. */ - if (!(as->flags & JIT_F_SSE3)) { /* Set FPU rounding mode to default. */ - emit_rmro(as, XO_FLDCW, XOg_FLDCW, RID_ESP, 4); - emit_rmro(as, XO_MOVto, lo, RID_ESP, 4); - emit_gri(as, XG_ARITHi(XOg_AND), lo, 0xf3ff); - } - if (dt == IRT_U64) { - /* For inputs in [2^63,2^64-1] add -2^64 and convert again. */ - MCLabel l_pop, l_end = emit_label(as); - emit_x87op(as, XI_FPOP); - l_pop = emit_label(as); - emit_sjmp(as, l_end); - emit_rmro(as, XO_MOV, hi, RID_ESP, 4); - if ((as->flags & JIT_F_SSE3)) - emit_rmro(as, XO_FISTTPq, XOg_FISTTPq, RID_ESP, 0); - else - emit_rmro(as, XO_FISTPq, XOg_FISTPq, RID_ESP, 0); - emit_rma(as, XO_FADDq, XOg_FADDq, - lj_ir_k64_find(as->J, U64x(c3f00000,00000000))); - emit_sjcc(as, CC_NS, l_pop); - emit_rr(as, XO_TEST, hi, hi); /* Check if out-of-range (2^63). */ - } - emit_rmro(as, XO_MOV, hi, RID_ESP, 4); - if ((as->flags & JIT_F_SSE3)) { /* Truncation is easy with SSE3. */ - emit_rmro(as, XO_FISTTPq, XOg_FISTTPq, RID_ESP, 0); - } else { /* Otherwise set FPU rounding mode to truncate before the store. */ - emit_rmro(as, XO_FISTPq, XOg_FISTPq, RID_ESP, 0); - emit_rmro(as, XO_FLDCW, XOg_FLDCW, RID_ESP, 0); - emit_rmro(as, XO_MOVtow, lo, RID_ESP, 0); - emit_rmro(as, XO_ARITHw(XOg_OR), lo, RID_ESP, 0); - emit_loadi(as, lo, 0xc00); - emit_rmro(as, XO_FNSTCW, XOg_FNSTCW, RID_ESP, 0); - } - if (dt == IRT_U64) - emit_x87op(as, XI_FDUP); - emit_mrm(as, st == IRT_NUM ? XO_FLDq : XO_FLDd, - st == IRT_NUM ? XOg_FLDq: XOg_FLDd, - asm_fuseload(as, ir->op1, RSET_EMPTY)); -} -#endif - -static void asm_strto(ASMState *as, IRIns *ir) -{ - /* Force a spill slot for the destination register (if any). */ - const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_strscan_num]; - IRRef args[2]; - RegSet drop = RSET_SCRATCH; - if ((drop & RSET_FPR) != RSET_FPR && ra_hasreg(ir->r)) - rset_set(drop, ir->r); /* WIN64 doesn't spill all FPRs. */ - ra_evictset(as, drop); - asm_guardcc(as, CC_E); - emit_rr(as, XO_TEST, RID_RET, RID_RET); /* Test return status. */ - args[0] = ir->op1; /* GCstr *str */ - args[1] = ASMREF_TMP1; /* TValue *n */ - asm_gencall(as, ci, args); - /* Store the result to the spill slot or temp slots. */ - emit_rmro(as, XO_LEA, ra_releasetmp(as, ASMREF_TMP1)|REX_64, - RID_ESP, sps_scale(ir->s)); -} - -static void asm_tostr(ASMState *as, IRIns *ir) -{ - IRIns *irl = IR(ir->op1); - IRRef args[2]; - args[0] = ASMREF_L; - as->gcsteps++; - if (irt_isnum(irl->t)) { - const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_str_fromnum]; - args[1] = ASMREF_TMP1; /* const lua_Number * */ - asm_setupresult(as, ir, ci); /* GCstr * */ - asm_gencall(as, ci, args); - emit_rmro(as, XO_LEA, ra_releasetmp(as, ASMREF_TMP1)|REX_64, - RID_ESP, ra_spill(as, irl)); - } else { - const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_str_fromint]; - args[1] = ir->op1; /* int32_t k */ - asm_setupresult(as, ir, ci); /* GCstr * */ - asm_gencall(as, ci, args); - } -} - -/* -- Memory references --------------------------------------------------- */ - -static void asm_aref(ASMState *as, IRIns *ir) -{ - Reg dest = ra_dest(as, ir, RSET_GPR); - asm_fusearef(as, ir, RSET_GPR); - if (!(as->mrm.idx == RID_NONE && as->mrm.ofs == 0)) - emit_mrm(as, XO_LEA, dest, RID_MRM); - else if (as->mrm.base != dest) - emit_rr(as, XO_MOV, dest, as->mrm.base); -} - -/* Merge NE(HREF, niltv) check. */ -static MCode *merge_href_niltv(ASMState *as, IRIns *ir) -{ - /* Assumes nothing else generates NE of HREF. */ - if ((ir[1].o == IR_NE || ir[1].o == IR_EQ) && ir[1].op1 == as->curins && - ra_hasreg(ir->r)) { - MCode *p = as->mcp; - p += (LJ_64 && *p != XI_ARITHi) ? 7+6 : 6+6; - /* Ensure no loop branch inversion happened. */ - if (p[-6] == 0x0f && p[-5] == XI_JCCn+(CC_NE^(ir[1].o & 1))) { - as->mcp = p; /* Kill cmp reg, imm32 + jz exit. */ - return p + *(int32_t *)(p-4); /* Return exit address. */ - } - } - return NULL; -} - -/* Inlined hash lookup. Specialized for key type and for const keys. -** The equivalent C code is: -** Node *n = hashkey(t, key); -** do { -** if (lj_obj_equal(&n->key, key)) return &n->val; -** } while ((n = nextnode(n))); -** return niltv(L); -*/ -static void asm_href(ASMState *as, IRIns *ir) -{ - MCode *nilexit = merge_href_niltv(as, ir); /* Do this before any restores. */ - RegSet allow = RSET_GPR; - Reg dest = ra_dest(as, ir, allow); - Reg tab = ra_alloc1(as, ir->op1, rset_clear(allow, dest)); - Reg key = RID_NONE, tmp = RID_NONE; - IRIns *irkey = IR(ir->op2); - int isk = irref_isk(ir->op2); - IRType1 kt = irkey->t; - uint32_t khash; - MCLabel l_end, l_loop, l_next; - - if (!isk) { - rset_clear(allow, tab); - key = ra_alloc1(as, ir->op2, irt_isnum(kt) ? RSET_FPR : allow); - if (!irt_isstr(kt)) - tmp = ra_scratch(as, rset_exclude(allow, key)); - } - - /* Key not found in chain: jump to exit (if merged with NE) or load niltv. */ - l_end = emit_label(as); - if (nilexit && ir[1].o == IR_NE) { - emit_jcc(as, CC_E, nilexit); /* XI_JMP is not found by lj_asm_patchexit. */ - nilexit = NULL; - } else { - emit_loada(as, dest, niltvg(J2G(as->J))); - } - - /* Follow hash chain until the end. */ - l_loop = emit_sjcc_label(as, CC_NZ); - emit_rr(as, XO_TEST, dest, dest); - emit_rmro(as, XO_MOV, dest, dest, offsetof(Node, next)); - l_next = emit_label(as); - - /* Type and value comparison. */ - if (nilexit) - emit_jcc(as, CC_E, nilexit); - else - emit_sjcc(as, CC_E, l_end); - if (irt_isnum(kt)) { - if (isk) { - /* Assumes -0.0 is already canonicalized to +0.0. */ - emit_gmroi(as, XG_ARITHi(XOg_CMP), dest, offsetof(Node, key.u32.lo), - (int32_t)ir_knum(irkey)->u32.lo); - emit_sjcc(as, CC_NE, l_next); - emit_gmroi(as, XG_ARITHi(XOg_CMP), dest, offsetof(Node, key.u32.hi), - (int32_t)ir_knum(irkey)->u32.hi); - } else { - emit_sjcc(as, CC_P, l_next); - emit_rmro(as, XO_UCOMISD, key, dest, offsetof(Node, key.n)); - emit_sjcc(as, CC_AE, l_next); - /* The type check avoids NaN penalties and complaints from Valgrind. */ -#if LJ_64 - emit_u32(as, LJ_TISNUM); - emit_rmro(as, XO_ARITHi, XOg_CMP, dest, offsetof(Node, key.it)); -#else - emit_i8(as, LJ_TISNUM); - emit_rmro(as, XO_ARITHi8, XOg_CMP, dest, offsetof(Node, key.it)); -#endif - } -#if LJ_64 - } else if (irt_islightud(kt)) { - emit_rmro(as, XO_CMP, key|REX_64, dest, offsetof(Node, key.u64)); -#endif - } else { - if (!irt_ispri(kt)) { - lua_assert(irt_isaddr(kt)); - if (isk) - emit_gmroi(as, XG_ARITHi(XOg_CMP), dest, offsetof(Node, key.gcr), - ptr2addr(ir_kgc(irkey))); - else - emit_rmro(as, XO_CMP, key, dest, offsetof(Node, key.gcr)); - emit_sjcc(as, CC_NE, l_next); - } - lua_assert(!irt_isnil(kt)); - emit_i8(as, irt_toitype(kt)); - emit_rmro(as, XO_ARITHi8, XOg_CMP, dest, offsetof(Node, key.it)); - } - emit_sfixup(as, l_loop); - checkmclim(as); - - /* Load main position relative to tab->node into dest. */ - khash = isk ? ir_khash(irkey) : 1; - if (khash == 0) { - emit_rmro(as, XO_MOV, dest, tab, offsetof(GCtab, node)); - } else { - emit_rmro(as, XO_ARITH(XOg_ADD), dest, tab, offsetof(GCtab, node)); - if ((as->flags & JIT_F_PREFER_IMUL)) { - emit_i8(as, sizeof(Node)); - emit_rr(as, XO_IMULi8, dest, dest); - } else { - emit_shifti(as, XOg_SHL, dest, 3); - emit_rmrxo(as, XO_LEA, dest, dest, dest, XM_SCALE2, 0); - } - if (isk) { - emit_gri(as, XG_ARITHi(XOg_AND), dest, (int32_t)khash); - emit_rmro(as, XO_MOV, dest, tab, offsetof(GCtab, hmask)); - } else if (irt_isstr(kt)) { - emit_rmro(as, XO_ARITH(XOg_AND), dest, key, offsetof(GCstr, hash)); - emit_rmro(as, XO_MOV, dest, tab, offsetof(GCtab, hmask)); - } else { /* Must match with hashrot() in lj_tab.c. */ - emit_rmro(as, XO_ARITH(XOg_AND), dest, tab, offsetof(GCtab, hmask)); - emit_rr(as, XO_ARITH(XOg_SUB), dest, tmp); - emit_shifti(as, XOg_ROL, tmp, HASH_ROT3); - emit_rr(as, XO_ARITH(XOg_XOR), dest, tmp); - emit_shifti(as, XOg_ROL, dest, HASH_ROT2); - emit_rr(as, XO_ARITH(XOg_SUB), tmp, dest); - emit_shifti(as, XOg_ROL, dest, HASH_ROT1); - emit_rr(as, XO_ARITH(XOg_XOR), tmp, dest); - if (irt_isnum(kt)) { - emit_rr(as, XO_ARITH(XOg_ADD), dest, dest); -#if LJ_64 - emit_shifti(as, XOg_SHR|REX_64, dest, 32); - emit_rr(as, XO_MOV, tmp, dest); - emit_rr(as, XO_MOVDto, key|REX_64, dest); -#else - emit_rmro(as, XO_MOV, dest, RID_ESP, ra_spill(as, irkey)+4); - emit_rr(as, XO_MOVDto, key, tmp); -#endif - } else { - emit_rr(as, XO_MOV, tmp, key); - emit_rmro(as, XO_LEA, dest, key, HASH_BIAS); - } - } - } -} - -static void asm_hrefk(ASMState *as, IRIns *ir) -{ - IRIns *kslot = IR(ir->op2); - IRIns *irkey = IR(kslot->op1); - int32_t ofs = (int32_t)(kslot->op2 * sizeof(Node)); - Reg dest = ra_used(ir) ? ra_dest(as, ir, RSET_GPR) : RID_NONE; - Reg node = ra_alloc1(as, ir->op1, RSET_GPR); -#if !LJ_64 - MCLabel l_exit; -#endif - lua_assert(ofs % sizeof(Node) == 0); - if (ra_hasreg(dest)) { - if (ofs != 0) { - if (dest == node && !(as->flags & JIT_F_LEA_AGU)) - emit_gri(as, XG_ARITHi(XOg_ADD), dest, ofs); - else - emit_rmro(as, XO_LEA, dest, node, ofs); - } else if (dest != node) { - emit_rr(as, XO_MOV, dest, node); - } - } - asm_guardcc(as, CC_NE); -#if LJ_64 - if (!irt_ispri(irkey->t)) { - Reg key = ra_scratch(as, rset_exclude(RSET_GPR, node)); - emit_rmro(as, XO_CMP, key|REX_64, node, - ofs + (int32_t)offsetof(Node, key.u64)); - lua_assert(irt_isnum(irkey->t) || irt_isgcv(irkey->t)); - /* Assumes -0.0 is already canonicalized to +0.0. */ - emit_loadu64(as, key, irt_isnum(irkey->t) ? ir_knum(irkey)->u64 : - ((uint64_t)irt_toitype(irkey->t) << 32) | - (uint64_t)(uint32_t)ptr2addr(ir_kgc(irkey))); - } else { - lua_assert(!irt_isnil(irkey->t)); - emit_i8(as, irt_toitype(irkey->t)); - emit_rmro(as, XO_ARITHi8, XOg_CMP, node, - ofs + (int32_t)offsetof(Node, key.it)); - } -#else - l_exit = emit_label(as); - if (irt_isnum(irkey->t)) { - /* Assumes -0.0 is already canonicalized to +0.0. */ - emit_gmroi(as, XG_ARITHi(XOg_CMP), node, - ofs + (int32_t)offsetof(Node, key.u32.lo), - (int32_t)ir_knum(irkey)->u32.lo); - emit_sjcc(as, CC_NE, l_exit); - emit_gmroi(as, XG_ARITHi(XOg_CMP), node, - ofs + (int32_t)offsetof(Node, key.u32.hi), - (int32_t)ir_knum(irkey)->u32.hi); - } else { - if (!irt_ispri(irkey->t)) { - lua_assert(irt_isgcv(irkey->t)); - emit_gmroi(as, XG_ARITHi(XOg_CMP), node, - ofs + (int32_t)offsetof(Node, key.gcr), - ptr2addr(ir_kgc(irkey))); - emit_sjcc(as, CC_NE, l_exit); - } - lua_assert(!irt_isnil(irkey->t)); - emit_i8(as, irt_toitype(irkey->t)); - emit_rmro(as, XO_ARITHi8, XOg_CMP, node, - ofs + (int32_t)offsetof(Node, key.it)); - } -#endif -} - -static void asm_newref(ASMState *as, IRIns *ir) -{ - const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_tab_newkey]; - IRRef args[3]; - IRIns *irkey; - Reg tmp; - if (ir->r == RID_SINK) - return; - args[0] = ASMREF_L; /* lua_State *L */ - args[1] = ir->op1; /* GCtab *t */ - args[2] = ASMREF_TMP1; /* cTValue *key */ - asm_setupresult(as, ir, ci); /* TValue * */ - asm_gencall(as, ci, args); - tmp = ra_releasetmp(as, ASMREF_TMP1); - irkey = IR(ir->op2); - if (irt_isnum(irkey->t)) { - /* For numbers use the constant itself or a spill slot as a TValue. */ - if (irref_isk(ir->op2)) - emit_loada(as, tmp, ir_knum(irkey)); - else - emit_rmro(as, XO_LEA, tmp|REX_64, RID_ESP, ra_spill(as, irkey)); - } else { - /* Otherwise use g->tmptv to hold the TValue. */ - if (!irref_isk(ir->op2)) { - Reg src = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, tmp)); - emit_movtomro(as, REX_64IR(irkey, src), tmp, 0); - } else if (!irt_ispri(irkey->t)) { - emit_movmroi(as, tmp, 0, irkey->i); - } - if (!(LJ_64 && irt_islightud(irkey->t))) - emit_movmroi(as, tmp, 4, irt_toitype(irkey->t)); - emit_loada(as, tmp, &J2G(as->J)->tmptv); - } -} - -static void asm_uref(ASMState *as, IRIns *ir) -{ - /* NYI: Check that UREFO is still open and not aliasing a slot. */ - Reg dest = ra_dest(as, ir, RSET_GPR); - if (irref_isk(ir->op1)) { - GCfunc *fn = ir_kfunc(IR(ir->op1)); - MRef *v = &gcref(fn->l.uvptr[(ir->op2 >> 8)])->uv.v; - emit_rma(as, XO_MOV, dest, v); - } else { - Reg uv = ra_scratch(as, RSET_GPR); - Reg func = ra_alloc1(as, ir->op1, RSET_GPR); - if (ir->o == IR_UREFC) { - emit_rmro(as, XO_LEA, dest, uv, offsetof(GCupval, tv)); - asm_guardcc(as, CC_NE); - emit_i8(as, 1); - emit_rmro(as, XO_ARITHib, XOg_CMP, uv, offsetof(GCupval, closed)); - } else { - emit_rmro(as, XO_MOV, dest, uv, offsetof(GCupval, v)); - } - emit_rmro(as, XO_MOV, uv, func, - (int32_t)offsetof(GCfuncL, uvptr) + 4*(int32_t)(ir->op2 >> 8)); - } -} - -static void asm_fref(ASMState *as, IRIns *ir) -{ - Reg dest = ra_dest(as, ir, RSET_GPR); - asm_fusefref(as, ir, RSET_GPR); - emit_mrm(as, XO_LEA, dest, RID_MRM); -} - -static void asm_strref(ASMState *as, IRIns *ir) -{ - Reg dest = ra_dest(as, ir, RSET_GPR); - asm_fusestrref(as, ir, RSET_GPR); - if (as->mrm.base == RID_NONE) - emit_loadi(as, dest, as->mrm.ofs); - else if (as->mrm.base == dest && as->mrm.idx == RID_NONE) - emit_gri(as, XG_ARITHi(XOg_ADD), dest, as->mrm.ofs); - else - emit_mrm(as, XO_LEA, dest, RID_MRM); -} - -/* -- Loads and stores ---------------------------------------------------- */ - -static void asm_fxload(ASMState *as, IRIns *ir) -{ - Reg dest = ra_dest(as, ir, irt_isfp(ir->t) ? RSET_FPR : RSET_GPR); - x86Op xo; - if (ir->o == IR_FLOAD) - asm_fusefref(as, ir, RSET_GPR); - else - asm_fusexref(as, ir->op1, RSET_GPR); - /* ir->op2 is ignored -- unaligned loads are ok on x86. */ - switch (irt_type(ir->t)) { - case IRT_I8: xo = XO_MOVSXb; break; - case IRT_U8: xo = XO_MOVZXb; break; - case IRT_I16: xo = XO_MOVSXw; break; - case IRT_U16: xo = XO_MOVZXw; break; - case IRT_NUM: xo = XMM_MOVRM(as); break; - case IRT_FLOAT: xo = XO_MOVSS; break; - default: - if (LJ_64 && irt_is64(ir->t)) - dest |= REX_64; - else - lua_assert(irt_isint(ir->t) || irt_isu32(ir->t) || irt_isaddr(ir->t)); - xo = XO_MOV; - break; - } - emit_mrm(as, xo, dest, RID_MRM); -} - -static void asm_fxstore(ASMState *as, IRIns *ir) -{ - RegSet allow = RSET_GPR; - Reg src = RID_NONE, osrc = RID_NONE; - int32_t k = 0; - if (ir->r == RID_SINK) - return; - /* The IRT_I16/IRT_U16 stores should never be simplified for constant - ** values since mov word [mem], imm16 has a length-changing prefix. - */ - if (irt_isi16(ir->t) || irt_isu16(ir->t) || irt_isfp(ir->t) || - !asm_isk32(as, ir->op2, &k)) { - RegSet allow8 = irt_isfp(ir->t) ? RSET_FPR : - (irt_isi8(ir->t) || irt_isu8(ir->t)) ? RSET_GPR8 : RSET_GPR; - src = osrc = ra_alloc1(as, ir->op2, allow8); - if (!LJ_64 && !rset_test(allow8, src)) { /* Already in wrong register. */ - rset_clear(allow, osrc); - src = ra_scratch(as, allow8); - } - rset_clear(allow, src); - } - if (ir->o == IR_FSTORE) { - asm_fusefref(as, IR(ir->op1), allow); - } else { - asm_fusexref(as, ir->op1, allow); - if (LJ_32 && ir->o == IR_HIOP) as->mrm.ofs += 4; - } - if (ra_hasreg(src)) { - x86Op xo; - switch (irt_type(ir->t)) { - case IRT_I8: case IRT_U8: xo = XO_MOVtob; src |= FORCE_REX; break; - case IRT_I16: case IRT_U16: xo = XO_MOVtow; break; - case IRT_NUM: xo = XO_MOVSDto; break; - case IRT_FLOAT: xo = XO_MOVSSto; break; -#if LJ_64 - case IRT_LIGHTUD: lua_assert(0); /* NYI: mask 64 bit lightuserdata. */ -#endif - default: - if (LJ_64 && irt_is64(ir->t)) - src |= REX_64; - else - lua_assert(irt_isint(ir->t) || irt_isu32(ir->t) || irt_isaddr(ir->t)); - xo = XO_MOVto; - break; - } - emit_mrm(as, xo, src, RID_MRM); - if (!LJ_64 && src != osrc) { - ra_noweak(as, osrc); - emit_rr(as, XO_MOV, src, osrc); - } - } else { - if (irt_isi8(ir->t) || irt_isu8(ir->t)) { - emit_i8(as, k); - emit_mrm(as, XO_MOVmib, 0, RID_MRM); - } else { - lua_assert(irt_is64(ir->t) || irt_isint(ir->t) || irt_isu32(ir->t) || - irt_isaddr(ir->t)); - emit_i32(as, k); - emit_mrm(as, XO_MOVmi, REX_64IR(ir, 0), RID_MRM); - } - } -} - -#if LJ_64 -static Reg asm_load_lightud64(ASMState *as, IRIns *ir, int typecheck) -{ - if (ra_used(ir) || typecheck) { - Reg dest = ra_dest(as, ir, RSET_GPR); - if (typecheck) { - Reg tmp = ra_scratch(as, rset_exclude(RSET_GPR, dest)); - asm_guardcc(as, CC_NE); - emit_i8(as, -2); - emit_rr(as, XO_ARITHi8, XOg_CMP, tmp); - emit_shifti(as, XOg_SAR|REX_64, tmp, 47); - emit_rr(as, XO_MOV, tmp|REX_64, dest); - } - return dest; - } else { - return RID_NONE; - } -} -#endif - -static void asm_ahuvload(ASMState *as, IRIns *ir) -{ - lua_assert(irt_isnum(ir->t) || irt_ispri(ir->t) || irt_isaddr(ir->t) || - (LJ_DUALNUM && irt_isint(ir->t))); -#if LJ_64 - if (irt_islightud(ir->t)) { - Reg dest = asm_load_lightud64(as, ir, 1); - if (ra_hasreg(dest)) { - asm_fuseahuref(as, ir->op1, RSET_GPR); - emit_mrm(as, XO_MOV, dest|REX_64, RID_MRM); - } - return; - } else -#endif - if (ra_used(ir)) { - RegSet allow = irt_isnum(ir->t) ? RSET_FPR : RSET_GPR; - Reg dest = ra_dest(as, ir, allow); - asm_fuseahuref(as, ir->op1, RSET_GPR); - emit_mrm(as, dest < RID_MAX_GPR ? XO_MOV : XMM_MOVRM(as), dest, RID_MRM); - } else { - asm_fuseahuref(as, ir->op1, RSET_GPR); - } - /* Always do the type check, even if the load result is unused. */ - as->mrm.ofs += 4; - asm_guardcc(as, irt_isnum(ir->t) ? CC_AE : CC_NE); - if (LJ_64 && irt_type(ir->t) >= IRT_NUM) { - lua_assert(irt_isinteger(ir->t) || irt_isnum(ir->t)); - emit_u32(as, LJ_TISNUM); - emit_mrm(as, XO_ARITHi, XOg_CMP, RID_MRM); - } else { - emit_i8(as, irt_toitype(ir->t)); - emit_mrm(as, XO_ARITHi8, XOg_CMP, RID_MRM); - } -} - -static void asm_ahustore(ASMState *as, IRIns *ir) -{ - if (ir->r == RID_SINK) - return; - if (irt_isnum(ir->t)) { - Reg src = ra_alloc1(as, ir->op2, RSET_FPR); - asm_fuseahuref(as, ir->op1, RSET_GPR); - emit_mrm(as, XO_MOVSDto, src, RID_MRM); -#if LJ_64 - } else if (irt_islightud(ir->t)) { - Reg src = ra_alloc1(as, ir->op2, RSET_GPR); - asm_fuseahuref(as, ir->op1, rset_exclude(RSET_GPR, src)); - emit_mrm(as, XO_MOVto, src|REX_64, RID_MRM); -#endif - } else { - IRIns *irr = IR(ir->op2); - RegSet allow = RSET_GPR; - Reg src = RID_NONE; - if (!irref_isk(ir->op2)) { - src = ra_alloc1(as, ir->op2, allow); - rset_clear(allow, src); - } - asm_fuseahuref(as, ir->op1, allow); - if (ra_hasreg(src)) { - emit_mrm(as, XO_MOVto, src, RID_MRM); - } else if (!irt_ispri(irr->t)) { - lua_assert(irt_isaddr(ir->t) || (LJ_DUALNUM && irt_isinteger(ir->t))); - emit_i32(as, irr->i); - emit_mrm(as, XO_MOVmi, 0, RID_MRM); - } - as->mrm.ofs += 4; - emit_i32(as, (int32_t)irt_toitype(ir->t)); - emit_mrm(as, XO_MOVmi, 0, RID_MRM); - } -} - -static void asm_sload(ASMState *as, IRIns *ir) -{ - int32_t ofs = 8*((int32_t)ir->op1-1) + ((ir->op2 & IRSLOAD_FRAME) ? 4 : 0); - IRType1 t = ir->t; - Reg base; - lua_assert(!(ir->op2 & IRSLOAD_PARENT)); /* Handled by asm_head_side(). */ - lua_assert(irt_isguard(t) || !(ir->op2 & IRSLOAD_TYPECHECK)); - lua_assert(LJ_DUALNUM || - !irt_isint(t) || (ir->op2 & (IRSLOAD_CONVERT|IRSLOAD_FRAME))); - if ((ir->op2 & IRSLOAD_CONVERT) && irt_isguard(t) && irt_isint(t)) { - Reg left = ra_scratch(as, RSET_FPR); - asm_tointg(as, ir, left); /* Frees dest reg. Do this before base alloc. */ - base = ra_alloc1(as, REF_BASE, RSET_GPR); - emit_rmro(as, XMM_MOVRM(as), left, base, ofs); - t.irt = IRT_NUM; /* Continue with a regular number type check. */ -#if LJ_64 - } else if (irt_islightud(t)) { - Reg dest = asm_load_lightud64(as, ir, (ir->op2 & IRSLOAD_TYPECHECK)); - if (ra_hasreg(dest)) { - base = ra_alloc1(as, REF_BASE, RSET_GPR); - emit_rmro(as, XO_MOV, dest|REX_64, base, ofs); - } - return; -#endif - } else if (ra_used(ir)) { - RegSet allow = irt_isnum(t) ? RSET_FPR : RSET_GPR; - Reg dest = ra_dest(as, ir, allow); - base = ra_alloc1(as, REF_BASE, RSET_GPR); - lua_assert(irt_isnum(t) || irt_isint(t) || irt_isaddr(t)); - if ((ir->op2 & IRSLOAD_CONVERT)) { - t.irt = irt_isint(t) ? IRT_NUM : IRT_INT; /* Check for original type. */ - emit_rmro(as, irt_isint(t) ? XO_CVTSI2SD : XO_CVTSD2SI, dest, base, ofs); - } else if (irt_isnum(t)) { - emit_rmro(as, XMM_MOVRM(as), dest, base, ofs); - } else { - emit_rmro(as, XO_MOV, dest, base, ofs); - } - } else { - if (!(ir->op2 & IRSLOAD_TYPECHECK)) - return; /* No type check: avoid base alloc. */ - base = ra_alloc1(as, REF_BASE, RSET_GPR); - } - if ((ir->op2 & IRSLOAD_TYPECHECK)) { - /* Need type check, even if the load result is unused. */ - asm_guardcc(as, irt_isnum(t) ? CC_AE : CC_NE); - if (LJ_64 && irt_type(t) >= IRT_NUM) { - lua_assert(irt_isinteger(t) || irt_isnum(t)); - emit_u32(as, LJ_TISNUM); - emit_rmro(as, XO_ARITHi, XOg_CMP, base, ofs+4); - } else { - emit_i8(as, irt_toitype(t)); - emit_rmro(as, XO_ARITHi8, XOg_CMP, base, ofs+4); - } - } -} - -/* -- Allocations --------------------------------------------------------- */ - -#if LJ_HASFFI -static void asm_cnew(ASMState *as, IRIns *ir) -{ - CTState *cts = ctype_ctsG(J2G(as->J)); - CTypeID ctypeid = (CTypeID)IR(ir->op1)->i; - CTSize sz = (ir->o == IR_CNEWI || ir->op2 == REF_NIL) ? - lj_ctype_size(cts, ctypeid) : (CTSize)IR(ir->op2)->i; - const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_mem_newgco]; - IRRef args[2]; - lua_assert(sz != CTSIZE_INVALID); - - args[0] = ASMREF_L; /* lua_State *L */ - args[1] = ASMREF_TMP1; /* MSize size */ - as->gcsteps++; - asm_setupresult(as, ir, ci); /* GCcdata * */ - - /* Initialize immutable cdata object. */ - if (ir->o == IR_CNEWI) { - RegSet allow = (RSET_GPR & ~RSET_SCRATCH); -#if LJ_64 - Reg r64 = sz == 8 ? REX_64 : 0; - if (irref_isk(ir->op2)) { - IRIns *irk = IR(ir->op2); - uint64_t k = irk->o == IR_KINT64 ? ir_k64(irk)->u64 : - (uint64_t)(uint32_t)irk->i; - if (sz == 4 || checki32((int64_t)k)) { - emit_i32(as, (int32_t)k); - emit_rmro(as, XO_MOVmi, r64, RID_RET, sizeof(GCcdata)); - } else { - emit_movtomro(as, RID_ECX + r64, RID_RET, sizeof(GCcdata)); - emit_loadu64(as, RID_ECX, k); - } - } else { - Reg r = ra_alloc1(as, ir->op2, allow); - emit_movtomro(as, r + r64, RID_RET, sizeof(GCcdata)); - } -#else - int32_t ofs = sizeof(GCcdata); - if (sz == 8) { - ofs += 4; ir++; - lua_assert(ir->o == IR_HIOP); - } - do { - if (irref_isk(ir->op2)) { - emit_movmroi(as, RID_RET, ofs, IR(ir->op2)->i); - } else { - Reg r = ra_alloc1(as, ir->op2, allow); - emit_movtomro(as, r, RID_RET, ofs); - rset_clear(allow, r); - } - if (ofs == sizeof(GCcdata)) break; - ofs -= 4; ir--; - } while (1); -#endif - lua_assert(sz == 4 || sz == 8); - } - - /* Combine initialization of marked, gct and ctypeid. */ - emit_movtomro(as, RID_ECX, RID_RET, offsetof(GCcdata, marked)); - emit_gri(as, XG_ARITHi(XOg_OR), RID_ECX, - (int32_t)((~LJ_TCDATA<<8)+(ctypeid<<16))); - emit_gri(as, XG_ARITHi(XOg_AND), RID_ECX, LJ_GC_WHITES); - emit_opgl(as, XO_MOVZXb, RID_ECX, gc.currentwhite); - - asm_gencall(as, ci, args); - emit_loadi(as, ra_releasetmp(as, ASMREF_TMP1), (int32_t)(sz+sizeof(GCcdata))); -} -#else -#define asm_cnew(as, ir) ((void)0) -#endif - -/* -- Write barriers ------------------------------------------------------ */ - -static void asm_tbar(ASMState *as, IRIns *ir) -{ - Reg tab = ra_alloc1(as, ir->op1, RSET_GPR); - Reg tmp = ra_scratch(as, rset_exclude(RSET_GPR, tab)); - MCLabel l_end = emit_label(as); - emit_movtomro(as, tmp, tab, offsetof(GCtab, gclist)); - emit_setgl(as, tab, gc.grayagain); - emit_getgl(as, tmp, gc.grayagain); - emit_i8(as, ~LJ_GC_BLACK); - emit_rmro(as, XO_ARITHib, XOg_AND, tab, offsetof(GCtab, marked)); - emit_sjcc(as, CC_Z, l_end); - emit_i8(as, LJ_GC_BLACK); - emit_rmro(as, XO_GROUP3b, XOg_TEST, tab, offsetof(GCtab, marked)); -} - -static void asm_obar(ASMState *as, IRIns *ir) -{ - const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_gc_barrieruv]; - IRRef args[2]; - MCLabel l_end; - Reg obj; - /* No need for other object barriers (yet). */ - lua_assert(IR(ir->op1)->o == IR_UREFC); - ra_evictset(as, RSET_SCRATCH); - l_end = emit_label(as); - args[0] = ASMREF_TMP1; /* global_State *g */ - args[1] = ir->op1; /* TValue *tv */ - asm_gencall(as, ci, args); - emit_loada(as, ra_releasetmp(as, ASMREF_TMP1), J2G(as->J)); - obj = IR(ir->op1)->r; - emit_sjcc(as, CC_Z, l_end); - emit_i8(as, LJ_GC_WHITES); - if (irref_isk(ir->op2)) { - GCobj *vp = ir_kgc(IR(ir->op2)); - emit_rma(as, XO_GROUP3b, XOg_TEST, &vp->gch.marked); - } else { - Reg val = ra_alloc1(as, ir->op2, rset_exclude(RSET_SCRATCH&RSET_GPR, obj)); - emit_rmro(as, XO_GROUP3b, XOg_TEST, val, (int32_t)offsetof(GChead, marked)); - } - emit_sjcc(as, CC_Z, l_end); - emit_i8(as, LJ_GC_BLACK); - emit_rmro(as, XO_GROUP3b, XOg_TEST, obj, - (int32_t)offsetof(GCupval, marked)-(int32_t)offsetof(GCupval, tv)); -} - -/* -- FP/int arithmetic and logic operations ------------------------------ */ - -/* Load reference onto x87 stack. Force a spill to memory if needed. */ -static void asm_x87load(ASMState *as, IRRef ref) -{ - IRIns *ir = IR(ref); - if (ir->o == IR_KNUM) { - cTValue *tv = ir_knum(ir); - if (tvispzero(tv)) /* Use fldz only for +0. */ - emit_x87op(as, XI_FLDZ); - else if (tvispone(tv)) - emit_x87op(as, XI_FLD1); - else - emit_rma(as, XO_FLDq, XOg_FLDq, tv); - } else if (ir->o == IR_CONV && ir->op2 == IRCONV_NUM_INT && !ra_used(ir) && - !irref_isk(ir->op1) && mayfuse(as, ir->op1)) { - IRIns *iri = IR(ir->op1); - emit_rmro(as, XO_FILDd, XOg_FILDd, RID_ESP, ra_spill(as, iri)); - } else { - emit_mrm(as, XO_FLDq, XOg_FLDq, asm_fuseload(as, ref, RSET_EMPTY)); - } -} - -/* Try to rejoin pow from EXP2, MUL and LOG2 (if still unsplit). */ -static int fpmjoin_pow(ASMState *as, IRIns *ir) -{ - IRIns *irp = IR(ir->op1); - if (irp == ir-1 && irp->o == IR_MUL && !ra_used(irp)) { - IRIns *irpp = IR(irp->op1); - if (irpp == ir-2 && irpp->o == IR_FPMATH && - irpp->op2 == IRFPM_LOG2 && !ra_used(irpp)) { - /* The modified regs must match with the *.dasc implementation. */ - RegSet drop = RSET_RANGE(RID_XMM0, RID_XMM2+1)|RID2RSET(RID_EAX); - IRIns *irx; - if (ra_hasreg(ir->r)) - rset_clear(drop, ir->r); /* Dest reg handled below. */ - ra_evictset(as, drop); - ra_destreg(as, ir, RID_XMM0); - emit_call(as, lj_vm_pow_sse); - irx = IR(irpp->op1); - if (ra_noreg(irx->r) && ra_gethint(irx->r) == RID_XMM1) - irx->r = RID_INIT; /* Avoid allocating xmm1 for x. */ - ra_left(as, RID_XMM0, irpp->op1); - ra_left(as, RID_XMM1, irp->op2); - return 1; - } - } - return 0; -} - -static void asm_fpmath(ASMState *as, IRIns *ir) -{ - IRFPMathOp fpm = ir->o == IR_FPMATH ? (IRFPMathOp)ir->op2 : IRFPM_OTHER; - if (fpm == IRFPM_SQRT) { - Reg dest = ra_dest(as, ir, RSET_FPR); - Reg left = asm_fuseload(as, ir->op1, RSET_FPR); - emit_mrm(as, XO_SQRTSD, dest, left); - } else if (fpm <= IRFPM_TRUNC) { - if (as->flags & JIT_F_SSE4_1) { /* SSE4.1 has a rounding instruction. */ - Reg dest = ra_dest(as, ir, RSET_FPR); - Reg left = asm_fuseload(as, ir->op1, RSET_FPR); - /* ROUNDSD has a 4-byte opcode which doesn't fit in x86Op. - ** Let's pretend it's a 3-byte opcode, and compensate afterwards. - ** This is atrocious, but the alternatives are much worse. - */ - /* Round down/up/trunc == 1001/1010/1011. */ - emit_i8(as, 0x09 + fpm); - emit_mrm(as, XO_ROUNDSD, dest, left); - if (LJ_64 && as->mcp[1] != (MCode)(XO_ROUNDSD >> 16)) { - as->mcp[0] = as->mcp[1]; as->mcp[1] = 0x0f; /* Swap 0F and REX. */ - } - *--as->mcp = 0x66; /* 1st byte of ROUNDSD opcode. */ - } else { /* Call helper functions for SSE2 variant. */ - /* The modified regs must match with the *.dasc implementation. */ - RegSet drop = RSET_RANGE(RID_XMM0, RID_XMM3+1)|RID2RSET(RID_EAX); - if (ra_hasreg(ir->r)) - rset_clear(drop, ir->r); /* Dest reg handled below. */ - ra_evictset(as, drop); - ra_destreg(as, ir, RID_XMM0); - emit_call(as, fpm == IRFPM_FLOOR ? lj_vm_floor_sse : - fpm == IRFPM_CEIL ? lj_vm_ceil_sse : lj_vm_trunc_sse); - ra_left(as, RID_XMM0, ir->op1); - } - } else if (fpm == IRFPM_EXP2 && fpmjoin_pow(as, ir)) { - /* Rejoined to pow(). */ - } else { /* Handle x87 ops. */ - int32_t ofs = sps_scale(ir->s); /* Use spill slot or temp slots. */ - Reg dest = ir->r; - if (ra_hasreg(dest)) { - ra_free(as, dest); - ra_modified(as, dest); - emit_rmro(as, XMM_MOVRM(as), dest, RID_ESP, ofs); - } - emit_rmro(as, XO_FSTPq, XOg_FSTPq, RID_ESP, ofs); - switch (fpm) { /* st0 = lj_vm_*(st0) */ - case IRFPM_EXP: emit_call(as, lj_vm_exp_x87); break; - case IRFPM_EXP2: emit_call(as, lj_vm_exp2_x87); break; - case IRFPM_SIN: emit_x87op(as, XI_FSIN); break; - case IRFPM_COS: emit_x87op(as, XI_FCOS); break; - case IRFPM_TAN: emit_x87op(as, XI_FPOP); emit_x87op(as, XI_FPTAN); break; - case IRFPM_LOG: case IRFPM_LOG2: case IRFPM_LOG10: - /* Note: the use of fyl2xp1 would be pointless here. When computing - ** log(1.0+eps) the precision is already lost after 1.0 is added. - ** Subtracting 1.0 won't recover it. OTOH math.log1p would make sense. - */ - emit_x87op(as, XI_FYL2X); break; - case IRFPM_OTHER: - switch (ir->o) { - case IR_ATAN2: - emit_x87op(as, XI_FPATAN); asm_x87load(as, ir->op2); break; - case IR_LDEXP: - emit_x87op(as, XI_FPOP1); emit_x87op(as, XI_FSCALE); break; - default: lua_assert(0); break; - } - break; - default: lua_assert(0); break; - } - asm_x87load(as, ir->op1); - switch (fpm) { - case IRFPM_LOG: emit_x87op(as, XI_FLDLN2); break; - case IRFPM_LOG2: emit_x87op(as, XI_FLD1); break; - case IRFPM_LOG10: emit_x87op(as, XI_FLDLG2); break; - case IRFPM_OTHER: - if (ir->o == IR_LDEXP) asm_x87load(as, ir->op2); - break; - default: break; - } - } -} - -static void asm_fppowi(ASMState *as, IRIns *ir) -{ - /* The modified regs must match with the *.dasc implementation. */ - RegSet drop = RSET_RANGE(RID_XMM0, RID_XMM1+1)|RID2RSET(RID_EAX); - if (ra_hasreg(ir->r)) - rset_clear(drop, ir->r); /* Dest reg handled below. */ - ra_evictset(as, drop); - ra_destreg(as, ir, RID_XMM0); - emit_call(as, lj_vm_powi_sse); - ra_left(as, RID_XMM0, ir->op1); - ra_left(as, RID_EAX, ir->op2); -} - -#if LJ_64 && LJ_HASFFI -static void asm_arith64(ASMState *as, IRIns *ir, IRCallID id) -{ - const CCallInfo *ci = &lj_ir_callinfo[id]; - IRRef args[2]; - args[0] = ir->op1; - args[1] = ir->op2; - asm_setupresult(as, ir, ci); - asm_gencall(as, ci, args); -} -#endif - -static void asm_intmod(ASMState *as, IRIns *ir) -{ - const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_vm_modi]; - IRRef args[2]; - args[0] = ir->op1; - args[1] = ir->op2; - asm_setupresult(as, ir, ci); - asm_gencall(as, ci, args); -} - -static int asm_swapops(ASMState *as, IRIns *ir) -{ - IRIns *irl = IR(ir->op1); - IRIns *irr = IR(ir->op2); - lua_assert(ra_noreg(irr->r)); - if (!irm_iscomm(lj_ir_mode[ir->o])) - return 0; /* Can't swap non-commutative operations. */ - if (irref_isk(ir->op2)) - return 0; /* Don't swap constants to the left. */ - if (ra_hasreg(irl->r)) - return 1; /* Swap if left already has a register. */ - if (ra_samehint(ir->r, irr->r)) - return 1; /* Swap if dest and right have matching hints. */ - if (as->curins > as->loopref) { /* In variant part? */ - if (ir->op2 < as->loopref && !irt_isphi(irr->t)) - return 0; /* Keep invariants on the right. */ - if (ir->op1 < as->loopref && !irt_isphi(irl->t)) - return 1; /* Swap invariants to the right. */ - } - if (opisfusableload(irl->o)) - return 1; /* Swap fusable loads to the right. */ - return 0; /* Otherwise don't swap. */ -} - -static void asm_fparith(ASMState *as, IRIns *ir, x86Op xo) -{ - IRRef lref = ir->op1; - IRRef rref = ir->op2; - RegSet allow = RSET_FPR; - Reg dest; - Reg right = IR(rref)->r; - if (ra_hasreg(right)) { - rset_clear(allow, right); - ra_noweak(as, right); - } - dest = ra_dest(as, ir, allow); - if (lref == rref) { - right = dest; - } else if (ra_noreg(right)) { - if (asm_swapops(as, ir)) { - IRRef tmp = lref; lref = rref; rref = tmp; - } - right = asm_fuseload(as, rref, rset_clear(allow, dest)); - } - emit_mrm(as, xo, dest, right); - ra_left(as, dest, lref); -} - -static void asm_intarith(ASMState *as, IRIns *ir, x86Arith xa) -{ - IRRef lref = ir->op1; - IRRef rref = ir->op2; - RegSet allow = RSET_GPR; - Reg dest, right; - int32_t k = 0; - if (as->flagmcp == as->mcp) { /* Drop test r,r instruction. */ - MCode *p = as->mcp + ((LJ_64 && *as->mcp < XI_TESTb) ? 3 : 2); - if ((p[1] & 15) < 14) { - if ((p[1] & 15) >= 12) p[1] -= 4; /* L <->S, NL <-> NS */ - as->flagmcp = NULL; - as->mcp = p; - } /* else: cannot transform LE/NLE to cc without use of OF. */ - } - right = IR(rref)->r; - if (ra_hasreg(right)) { - rset_clear(allow, right); - ra_noweak(as, right); - } - dest = ra_dest(as, ir, allow); - if (lref == rref) { - right = dest; - } else if (ra_noreg(right) && !asm_isk32(as, rref, &k)) { - if (asm_swapops(as, ir)) { - IRRef tmp = lref; lref = rref; rref = tmp; - } - right = asm_fuseloadm(as, rref, rset_clear(allow, dest), irt_is64(ir->t)); - } - if (irt_isguard(ir->t)) /* For IR_ADDOV etc. */ - asm_guardcc(as, CC_O); - if (xa != XOg_X_IMUL) { - if (ra_hasreg(right)) - emit_mrm(as, XO_ARITH(xa), REX_64IR(ir, dest), right); - else - emit_gri(as, XG_ARITHi(xa), REX_64IR(ir, dest), k); - } else if (ra_hasreg(right)) { /* IMUL r, mrm. */ - emit_mrm(as, XO_IMUL, REX_64IR(ir, dest), right); - } else { /* IMUL r, r, k. */ - /* NYI: use lea/shl/add/sub (FOLD only does 2^k) depending on CPU. */ - Reg left = asm_fuseloadm(as, lref, RSET_GPR, irt_is64(ir->t)); - x86Op xo; - if (checki8(k)) { emit_i8(as, k); xo = XO_IMULi8; - } else { emit_i32(as, k); xo = XO_IMULi; } - emit_mrm(as, xo, REX_64IR(ir, dest), left); - return; - } - ra_left(as, dest, lref); -} - -/* LEA is really a 4-operand ADD with an independent destination register, -** up to two source registers and an immediate. One register can be scaled -** by 1, 2, 4 or 8. This can be used to avoid moves or to fuse several -** instructions. -** -** Currently only a few common cases are supported: -** - 3-operand ADD: y = a+b; y = a+k with a and b already allocated -** - Left ADD fusion: y = (a+b)+k; y = (a+k)+b -** - Right ADD fusion: y = a+(b+k) -** The ommited variants have already been reduced by FOLD. -** -** There are more fusion opportunities, like gathering shifts or joining -** common references. But these are probably not worth the trouble, since -** array indexing is not decomposed and already makes use of all fields -** of the ModRM operand. -*/ -static int asm_lea(ASMState *as, IRIns *ir) -{ - IRIns *irl = IR(ir->op1); - IRIns *irr = IR(ir->op2); - RegSet allow = RSET_GPR; - Reg dest; - as->mrm.base = as->mrm.idx = RID_NONE; - as->mrm.scale = XM_SCALE1; - as->mrm.ofs = 0; - if (ra_hasreg(irl->r)) { - rset_clear(allow, irl->r); - ra_noweak(as, irl->r); - as->mrm.base = irl->r; - if (irref_isk(ir->op2) || ra_hasreg(irr->r)) { - /* The PHI renaming logic does a better job in some cases. */ - if (ra_hasreg(ir->r) && - ((irt_isphi(irl->t) && as->phireg[ir->r] == ir->op1) || - (irt_isphi(irr->t) && as->phireg[ir->r] == ir->op2))) - return 0; - if (irref_isk(ir->op2)) { - as->mrm.ofs = irr->i; - } else { - rset_clear(allow, irr->r); - ra_noweak(as, irr->r); - as->mrm.idx = irr->r; - } - } else if (irr->o == IR_ADD && mayfuse(as, ir->op2) && - irref_isk(irr->op2)) { - Reg idx = ra_alloc1(as, irr->op1, allow); - rset_clear(allow, idx); - as->mrm.idx = (uint8_t)idx; - as->mrm.ofs = IR(irr->op2)->i; - } else { - return 0; - } - } else if (ir->op1 != ir->op2 && irl->o == IR_ADD && mayfuse(as, ir->op1) && - (irref_isk(ir->op2) || irref_isk(irl->op2))) { - Reg idx, base = ra_alloc1(as, irl->op1, allow); - rset_clear(allow, base); - as->mrm.base = (uint8_t)base; - if (irref_isk(ir->op2)) { - as->mrm.ofs = irr->i; - idx = ra_alloc1(as, irl->op2, allow); - } else { - as->mrm.ofs = IR(irl->op2)->i; - idx = ra_alloc1(as, ir->op2, allow); - } - rset_clear(allow, idx); - as->mrm.idx = (uint8_t)idx; - } else { - return 0; - } - dest = ra_dest(as, ir, allow); - emit_mrm(as, XO_LEA, dest, RID_MRM); - return 1; /* Success. */ -} - -static void asm_add(ASMState *as, IRIns *ir) -{ - if (irt_isnum(ir->t)) - asm_fparith(as, ir, XO_ADDSD); - else if ((as->flags & JIT_F_LEA_AGU) || as->flagmcp == as->mcp || - irt_is64(ir->t) || !asm_lea(as, ir)) - asm_intarith(as, ir, XOg_ADD); -} - -static void asm_neg_not(ASMState *as, IRIns *ir, x86Group3 xg) -{ - Reg dest = ra_dest(as, ir, RSET_GPR); - emit_rr(as, XO_GROUP3, REX_64IR(ir, xg), dest); - ra_left(as, dest, ir->op1); -} - -static void asm_min_max(ASMState *as, IRIns *ir, int cc) -{ - Reg right, dest = ra_dest(as, ir, RSET_GPR); - IRRef lref = ir->op1, rref = ir->op2; - if (irref_isk(rref)) { lref = rref; rref = ir->op1; } - right = ra_alloc1(as, rref, rset_exclude(RSET_GPR, dest)); - emit_rr(as, XO_CMOV + (cc<<24), REX_64IR(ir, dest), right); - emit_rr(as, XO_CMP, REX_64IR(ir, dest), right); - ra_left(as, dest, lref); -} - -static void asm_bitswap(ASMState *as, IRIns *ir) -{ - Reg dest = ra_dest(as, ir, RSET_GPR); - as->mcp = emit_op(XO_BSWAP + ((dest&7) << 24), - REX_64IR(ir, 0), dest, 0, as->mcp, 1); - ra_left(as, dest, ir->op1); -} - -static void asm_bitshift(ASMState *as, IRIns *ir, x86Shift xs) -{ - IRRef rref = ir->op2; - IRIns *irr = IR(rref); - Reg dest; - if (irref_isk(rref)) { /* Constant shifts. */ - int shift; - dest = ra_dest(as, ir, RSET_GPR); - shift = irr->i & (irt_is64(ir->t) ? 63 : 31); - switch (shift) { - case 0: break; - case 1: emit_rr(as, XO_SHIFT1, REX_64IR(ir, xs), dest); break; - default: emit_shifti(as, REX_64IR(ir, xs), dest, shift); break; - } - } else { /* Variable shifts implicitly use register cl (i.e. ecx). */ - Reg right; - dest = ra_dest(as, ir, rset_exclude(RSET_GPR, RID_ECX)); - if (dest == RID_ECX) { - dest = ra_scratch(as, rset_exclude(RSET_GPR, RID_ECX)); - emit_rr(as, XO_MOV, RID_ECX, dest); - } - right = irr->r; - if (ra_noreg(right)) - right = ra_allocref(as, rref, RID2RSET(RID_ECX)); - else if (right != RID_ECX) - ra_scratch(as, RID2RSET(RID_ECX)); - emit_rr(as, XO_SHIFTcl, REX_64IR(ir, xs), dest); - ra_noweak(as, right); - if (right != RID_ECX) - emit_rr(as, XO_MOV, RID_ECX, right); - } - ra_left(as, dest, ir->op1); - /* - ** Note: avoid using the flags resulting from a shift or rotate! - ** All of them cause a partial flag stall, except for r,1 shifts - ** (but not rotates). And a shift count of 0 leaves the flags unmodified. - */ -} - -/* -- Comparisons --------------------------------------------------------- */ - -/* Virtual flags for unordered FP comparisons. */ -#define VCC_U 0x1000 /* Unordered. */ -#define VCC_P 0x2000 /* Needs extra CC_P branch. */ -#define VCC_S 0x4000 /* Swap avoids CC_P branch. */ -#define VCC_PS (VCC_P|VCC_S) - -/* Map of comparisons to flags. ORDER IR. */ -#define COMPFLAGS(ci, cin, cu, cf) ((ci)+((cu)<<4)+((cin)<<8)+(cf)) -static const uint16_t asm_compmap[IR_ABC+1] = { - /* signed non-eq unsigned flags */ - /* LT */ COMPFLAGS(CC_GE, CC_G, CC_AE, VCC_PS), - /* GE */ COMPFLAGS(CC_L, CC_L, CC_B, 0), - /* LE */ COMPFLAGS(CC_G, CC_G, CC_A, VCC_PS), - /* GT */ COMPFLAGS(CC_LE, CC_L, CC_BE, 0), - /* ULT */ COMPFLAGS(CC_AE, CC_A, CC_AE, VCC_U), - /* UGE */ COMPFLAGS(CC_B, CC_B, CC_B, VCC_U|VCC_PS), - /* ULE */ COMPFLAGS(CC_A, CC_A, CC_A, VCC_U), - /* UGT */ COMPFLAGS(CC_BE, CC_B, CC_BE, VCC_U|VCC_PS), - /* EQ */ COMPFLAGS(CC_NE, CC_NE, CC_NE, VCC_P), - /* NE */ COMPFLAGS(CC_E, CC_E, CC_E, VCC_U|VCC_P), - /* ABC */ COMPFLAGS(CC_BE, CC_B, CC_BE, VCC_U|VCC_PS) /* Same as UGT. */ -}; - -/* FP and integer comparisons. */ -static void asm_comp(ASMState *as, IRIns *ir, uint32_t cc) -{ - if (irt_isnum(ir->t)) { - IRRef lref = ir->op1; - IRRef rref = ir->op2; - Reg left, right; - MCLabel l_around; - /* - ** An extra CC_P branch is required to preserve ordered/unordered - ** semantics for FP comparisons. This can be avoided by swapping - ** the operands and inverting the condition (except for EQ and UNE). - ** So always try to swap if possible. - ** - ** Another option would be to swap operands to achieve better memory - ** operand fusion. But it's unlikely that this outweighs the cost - ** of the extra branches. - */ - if (cc & VCC_S) { /* Swap? */ - IRRef tmp = lref; lref = rref; rref = tmp; - cc ^= (VCC_PS|(5<<4)); /* A <-> B, AE <-> BE, PS <-> none */ - } - left = ra_alloc1(as, lref, RSET_FPR); - right = asm_fuseload(as, rref, rset_exclude(RSET_FPR, left)); - l_around = emit_label(as); - asm_guardcc(as, cc >> 4); - if (cc & VCC_P) { /* Extra CC_P branch required? */ - if (!(cc & VCC_U)) { - asm_guardcc(as, CC_P); /* Branch to exit for ordered comparisons. */ - } else if (l_around != as->invmcp) { - emit_sjcc(as, CC_P, l_around); /* Branch around for unordered. */ - } else { - /* Patched to mcloop by asm_loop_fixup. */ - as->loopinv = 2; - if (as->realign) - emit_sjcc(as, CC_P, as->mcp); - else - emit_jcc(as, CC_P, as->mcp); - } - } - emit_mrm(as, XO_UCOMISD, left, right); - } else { - IRRef lref = ir->op1, rref = ir->op2; - IROp leftop = (IROp)(IR(lref)->o); - Reg r64 = REX_64IR(ir, 0); - int32_t imm = 0; - lua_assert(irt_is64(ir->t) || irt_isint(ir->t) || - irt_isu32(ir->t) || irt_isaddr(ir->t) || irt_isu8(ir->t)); - /* Swap constants (only for ABC) and fusable loads to the right. */ - if (irref_isk(lref) || (!irref_isk(rref) && opisfusableload(leftop))) { - if ((cc & 0xc) == 0xc) cc ^= 0x53; /* L <-> G, LE <-> GE */ - else if ((cc & 0xa) == 0x2) cc ^= 0x55; /* A <-> B, AE <-> BE */ - lref = ir->op2; rref = ir->op1; - } - if (asm_isk32(as, rref, &imm)) { - IRIns *irl = IR(lref); - /* Check wether we can use test ins. Not for unsigned, since CF=0. */ - int usetest = (imm == 0 && (cc & 0xa) != 0x2); - if (usetest && irl->o == IR_BAND && irl+1 == ir && !ra_used(irl)) { - /* Combine comp(BAND(ref, r/imm), 0) into test mrm, r/imm. */ - Reg right, left = RID_NONE; - RegSet allow = RSET_GPR; - if (!asm_isk32(as, irl->op2, &imm)) { - left = ra_alloc1(as, irl->op2, allow); - rset_clear(allow, left); - } else { /* Try to Fuse IRT_I8/IRT_U8 loads, too. See below. */ - IRIns *irll = IR(irl->op1); - if (opisfusableload((IROp)irll->o) && - (irt_isi8(irll->t) || irt_isu8(irll->t))) { - IRType1 origt = irll->t; /* Temporarily flip types. */ - irll->t.irt = (irll->t.irt & ~IRT_TYPE) | IRT_INT; - as->curins--; /* Skip to BAND to avoid failing in noconflict(). */ - right = asm_fuseload(as, irl->op1, RSET_GPR); - as->curins++; - irll->t = origt; - if (right != RID_MRM) goto test_nofuse; - /* Fusion succeeded, emit test byte mrm, imm8. */ - asm_guardcc(as, cc); - emit_i8(as, (imm & 0xff)); - emit_mrm(as, XO_GROUP3b, XOg_TEST, RID_MRM); - return; - } - } - as->curins--; /* Skip to BAND to avoid failing in noconflict(). */ - right = asm_fuseloadm(as, irl->op1, allow, r64); - as->curins++; /* Undo the above. */ - test_nofuse: - asm_guardcc(as, cc); - if (ra_noreg(left)) { - emit_i32(as, imm); - emit_mrm(as, XO_GROUP3, r64 + XOg_TEST, right); - } else { - emit_mrm(as, XO_TEST, r64 + left, right); - } - } else { - Reg left; - if (opisfusableload((IROp)irl->o) && - ((irt_isu8(irl->t) && checku8(imm)) || - ((irt_isi8(irl->t) || irt_isi16(irl->t)) && checki8(imm)) || - (irt_isu16(irl->t) && checku16(imm) && checki8((int16_t)imm)))) { - /* Only the IRT_INT case is fused by asm_fuseload. - ** The IRT_I8/IRT_U8 loads and some IRT_I16/IRT_U16 loads - ** are handled here. - ** Note that cmp word [mem], imm16 should not be generated, - ** since it has a length-changing prefix. Compares of a word - ** against a sign-extended imm8 are ok, however. - */ - IRType1 origt = irl->t; /* Temporarily flip types. */ - irl->t.irt = (irl->t.irt & ~IRT_TYPE) | IRT_INT; - left = asm_fuseload(as, lref, RSET_GPR); - irl->t = origt; - if (left == RID_MRM) { /* Fusion succeeded? */ - if (irt_isu8(irl->t) || irt_isu16(irl->t)) - cc >>= 4; /* Need unsigned compare. */ - asm_guardcc(as, cc); - emit_i8(as, imm); - emit_mrm(as, (irt_isi8(origt) || irt_isu8(origt)) ? - XO_ARITHib : XO_ARITHiw8, r64 + XOg_CMP, RID_MRM); - return; - } /* Otherwise handle register case as usual. */ - } else { - left = asm_fuseloadm(as, lref, - irt_isu8(ir->t) ? RSET_GPR8 : RSET_GPR, r64); - } - asm_guardcc(as, cc); - if (usetest && left != RID_MRM) { - /* Use test r,r instead of cmp r,0. */ - x86Op xo = XO_TEST; - if (irt_isu8(ir->t)) { - lua_assert(ir->o == IR_EQ || ir->o == IR_NE); - xo = XO_TESTb; - if (!rset_test(RSET_RANGE(RID_EAX, RID_EBX+1), left)) { - if (LJ_64) { - left |= FORCE_REX; - } else { - emit_i32(as, 0xff); - emit_mrm(as, XO_GROUP3, XOg_TEST, left); - return; - } - } - } - emit_rr(as, xo, r64 + left, left); - if (irl+1 == ir) /* Referencing previous ins? */ - as->flagmcp = as->mcp; /* Set flag to drop test r,r if possible. */ - } else { - emit_gmrmi(as, XG_ARITHi(XOg_CMP), r64 + left, imm); - } - } - } else { - Reg left = ra_alloc1(as, lref, RSET_GPR); - Reg right = asm_fuseloadm(as, rref, rset_exclude(RSET_GPR, left), r64); - asm_guardcc(as, cc); - emit_mrm(as, XO_CMP, r64 + left, right); - } - } -} - -#if LJ_32 && LJ_HASFFI -/* 64 bit integer comparisons in 32 bit mode. */ -static void asm_comp_int64(ASMState *as, IRIns *ir) -{ - uint32_t cc = asm_compmap[(ir-1)->o]; - RegSet allow = RSET_GPR; - Reg lefthi = RID_NONE, leftlo = RID_NONE; - Reg righthi = RID_NONE, rightlo = RID_NONE; - MCLabel l_around; - x86ModRM mrm; - - as->curins--; /* Skip loword ins. Avoids failing in noconflict(), too. */ - - /* Allocate/fuse hiword operands. */ - if (irref_isk(ir->op2)) { - lefthi = asm_fuseload(as, ir->op1, allow); - } else { - lefthi = ra_alloc1(as, ir->op1, allow); - rset_clear(allow, lefthi); - righthi = asm_fuseload(as, ir->op2, allow); - if (righthi == RID_MRM) { - if (as->mrm.base != RID_NONE) rset_clear(allow, as->mrm.base); - if (as->mrm.idx != RID_NONE) rset_clear(allow, as->mrm.idx); - } else { - rset_clear(allow, righthi); - } - } - mrm = as->mrm; /* Save state for hiword instruction. */ - - /* Allocate/fuse loword operands. */ - if (irref_isk((ir-1)->op2)) { - leftlo = asm_fuseload(as, (ir-1)->op1, allow); - } else { - leftlo = ra_alloc1(as, (ir-1)->op1, allow); - rset_clear(allow, leftlo); - rightlo = asm_fuseload(as, (ir-1)->op2, allow); - } - - /* All register allocations must be performed _before_ this point. */ - l_around = emit_label(as); - as->invmcp = as->flagmcp = NULL; /* Cannot use these optimizations. */ - - /* Loword comparison and branch. */ - asm_guardcc(as, cc >> 4); /* Always use unsigned compare for loword. */ - if (ra_noreg(rightlo)) { - int32_t imm = IR((ir-1)->op2)->i; - if (imm == 0 && ((cc >> 4) & 0xa) != 0x2 && leftlo != RID_MRM) - emit_rr(as, XO_TEST, leftlo, leftlo); - else - emit_gmrmi(as, XG_ARITHi(XOg_CMP), leftlo, imm); - } else { - emit_mrm(as, XO_CMP, leftlo, rightlo); - } - - /* Hiword comparison and branches. */ - if ((cc & 15) != CC_NE) - emit_sjcc(as, CC_NE, l_around); /* Hiword unequal: skip loword compare. */ - if ((cc & 15) != CC_E) - asm_guardcc(as, cc >> 8); /* Hiword compare without equality check. */ - as->mrm = mrm; /* Restore state. */ - if (ra_noreg(righthi)) { - int32_t imm = IR(ir->op2)->i; - if (imm == 0 && (cc & 0xa) != 0x2 && lefthi != RID_MRM) - emit_rr(as, XO_TEST, lefthi, lefthi); - else - emit_gmrmi(as, XG_ARITHi(XOg_CMP), lefthi, imm); - } else { - emit_mrm(as, XO_CMP, lefthi, righthi); - } -} -#endif - -/* -- Support for 64 bit ops in 32 bit mode ------------------------------- */ - -/* Hiword op of a split 64 bit op. Previous op must be the loword op. */ -static void asm_hiop(ASMState *as, IRIns *ir) -{ -#if LJ_32 && LJ_HASFFI - /* HIOP is marked as a store because it needs its own DCE logic. */ - int uselo = ra_used(ir-1), usehi = ra_used(ir); /* Loword/hiword used? */ - if (LJ_UNLIKELY(!(as->flags & JIT_F_OPT_DCE))) uselo = usehi = 1; - if ((ir-1)->o == IR_CONV) { /* Conversions to/from 64 bit. */ - if (usehi || uselo) { - if (irt_isfp(ir->t)) - asm_conv_fp_int64(as, ir); - else - asm_conv_int64_fp(as, ir); - } - as->curins--; /* Always skip the CONV. */ - return; - } else if ((ir-1)->o <= IR_NE) { /* 64 bit integer comparisons. ORDER IR. */ - asm_comp_int64(as, ir); - return; - } else if ((ir-1)->o == IR_XSTORE) { - if ((ir-1)->r != RID_SINK) - asm_fxstore(as, ir); - return; - } - if (!usehi) return; /* Skip unused hiword op for all remaining ops. */ - switch ((ir-1)->o) { - case IR_ADD: - as->flagmcp = NULL; - as->curins--; - asm_intarith(as, ir, XOg_ADC); - asm_intarith(as, ir-1, XOg_ADD); - break; - case IR_SUB: - as->flagmcp = NULL; - as->curins--; - asm_intarith(as, ir, XOg_SBB); - asm_intarith(as, ir-1, XOg_SUB); - break; - case IR_NEG: { - Reg dest = ra_dest(as, ir, RSET_GPR); - emit_rr(as, XO_GROUP3, XOg_NEG, dest); - emit_i8(as, 0); - emit_rr(as, XO_ARITHi8, XOg_ADC, dest); - ra_left(as, dest, ir->op1); - as->curins--; - asm_neg_not(as, ir-1, XOg_NEG); - break; - } - case IR_CALLN: - case IR_CALLXS: - if (!uselo) - ra_allocref(as, ir->op1, RID2RSET(RID_RETLO)); /* Mark lo op as used. */ - break; - case IR_CNEWI: - /* Nothing to do here. Handled by CNEWI itself. */ - break; - default: lua_assert(0); break; - } -#else - UNUSED(as); UNUSED(ir); lua_assert(0); /* Unused on x64 or without FFI. */ -#endif -} - -/* -- Stack handling ------------------------------------------------------ */ - -/* Check Lua stack size for overflow. Use exit handler as fallback. */ -static void asm_stack_check(ASMState *as, BCReg topslot, - IRIns *irp, RegSet allow, ExitNo exitno) -{ - /* Try to get an unused temp. register, otherwise spill/restore eax. */ - Reg pbase = irp ? irp->r : RID_BASE; - Reg r = allow ? rset_pickbot(allow) : RID_EAX; - emit_jcc(as, CC_B, exitstub_addr(as->J, exitno)); - if (allow == RSET_EMPTY) /* Restore temp. register. */ - emit_rmro(as, XO_MOV, r|REX_64, RID_ESP, 0); - else - ra_modified(as, r); - emit_gri(as, XG_ARITHi(XOg_CMP), r, (int32_t)(8*topslot)); - if (ra_hasreg(pbase) && pbase != r) - emit_rr(as, XO_ARITH(XOg_SUB), r, pbase); - else - emit_rmro(as, XO_ARITH(XOg_SUB), r, RID_NONE, - ptr2addr(&J2G(as->J)->jit_base)); - emit_rmro(as, XO_MOV, r, r, offsetof(lua_State, maxstack)); - emit_getgl(as, r, jit_L); - if (allow == RSET_EMPTY) /* Spill temp. register. */ - emit_rmro(as, XO_MOVto, r|REX_64, RID_ESP, 0); -} - -/* Restore Lua stack from on-trace state. */ -static void asm_stack_restore(ASMState *as, SnapShot *snap) -{ - SnapEntry *map = &as->T->snapmap[snap->mapofs]; - SnapEntry *flinks = &as->T->snapmap[snap_nextofs(as->T, snap)-1]; - MSize n, nent = snap->nent; - /* Store the value of all modified slots to the Lua stack. */ - for (n = 0; n < nent; n++) { - SnapEntry sn = map[n]; - BCReg s = snap_slot(sn); - int32_t ofs = 8*((int32_t)s-1); - IRRef ref = snap_ref(sn); - IRIns *ir = IR(ref); - if ((sn & SNAP_NORESTORE)) - continue; - if (irt_isnum(ir->t)) { - Reg src = ra_alloc1(as, ref, RSET_FPR); - emit_rmro(as, XO_MOVSDto, src, RID_BASE, ofs); - } else { - lua_assert(irt_ispri(ir->t) || irt_isaddr(ir->t) || - (LJ_DUALNUM && irt_isinteger(ir->t))); - if (!irref_isk(ref)) { - Reg src = ra_alloc1(as, ref, rset_exclude(RSET_GPR, RID_BASE)); - emit_movtomro(as, REX_64IR(ir, src), RID_BASE, ofs); - } else if (!irt_ispri(ir->t)) { - emit_movmroi(as, RID_BASE, ofs, ir->i); - } - if ((sn & (SNAP_CONT|SNAP_FRAME))) { - if (s != 0) /* Do not overwrite link to previous frame. */ - emit_movmroi(as, RID_BASE, ofs+4, (int32_t)(*flinks--)); - } else { - if (!(LJ_64 && irt_islightud(ir->t))) - emit_movmroi(as, RID_BASE, ofs+4, irt_toitype(ir->t)); - } - } - checkmclim(as); - } - lua_assert(map + nent == flinks); -} - -/* -- GC handling --------------------------------------------------------- */ - -/* Check GC threshold and do one or more GC steps. */ -static void asm_gc_check(ASMState *as) -{ - const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_gc_step_jit]; - IRRef args[2]; - MCLabel l_end; - Reg tmp; - ra_evictset(as, RSET_SCRATCH); - l_end = emit_label(as); - /* Exit trace if in GCSatomic or GCSfinalize. Avoids syncing GC objects. */ - asm_guardcc(as, CC_NE); /* Assumes asm_snap_prep() already done. */ - emit_rr(as, XO_TEST, RID_RET, RID_RET); - args[0] = ASMREF_TMP1; /* global_State *g */ - args[1] = ASMREF_TMP2; /* MSize steps */ - asm_gencall(as, ci, args); - tmp = ra_releasetmp(as, ASMREF_TMP1); - emit_loada(as, tmp, J2G(as->J)); - emit_loadi(as, ra_releasetmp(as, ASMREF_TMP2), as->gcsteps); - /* Jump around GC step if GC total < GC threshold. */ - emit_sjcc(as, CC_B, l_end); - emit_opgl(as, XO_ARITH(XOg_CMP), tmp, gc.threshold); - emit_getgl(as, tmp, gc.total); - as->gcsteps = 0; - checkmclim(as); -} - -/* -- Loop handling ------------------------------------------------------- */ - -/* Fixup the loop branch. */ -static void asm_loop_fixup(ASMState *as) -{ - MCode *p = as->mctop; - MCode *target = as->mcp; - if (as->realign) { /* Realigned loops use short jumps. */ - as->realign = NULL; /* Stop another retry. */ - lua_assert(((intptr_t)target & 15) == 0); - if (as->loopinv) { /* Inverted loop branch? */ - p -= 5; - p[0] = XI_JMP; - lua_assert(target - p >= -128); - p[-1] = (MCode)(target - p); /* Patch sjcc. */ - if (as->loopinv == 2) - p[-3] = (MCode)(target - p + 2); /* Patch opt. short jp. */ - } else { - lua_assert(target - p >= -128); - p[-1] = (MCode)(int8_t)(target - p); /* Patch short jmp. */ - p[-2] = XI_JMPs; - } - } else { - MCode *newloop; - p[-5] = XI_JMP; - if (as->loopinv) { /* Inverted loop branch? */ - /* asm_guardcc already inverted the jcc and patched the jmp. */ - p -= 5; - newloop = target+4; - *(int32_t *)(p-4) = (int32_t)(target - p); /* Patch jcc. */ - if (as->loopinv == 2) { - *(int32_t *)(p-10) = (int32_t)(target - p + 6); /* Patch opt. jp. */ - newloop = target+8; - } - } else { /* Otherwise just patch jmp. */ - *(int32_t *)(p-4) = (int32_t)(target - p); - newloop = target+3; - } - /* Realign small loops and shorten the loop branch. */ - if (newloop >= p - 128) { - as->realign = newloop; /* Force a retry and remember alignment. */ - as->curins = as->stopins; /* Abort asm_trace now. */ - as->T->nins = as->orignins; /* Remove any added renames. */ - } - } -} - -/* -- Head of trace ------------------------------------------------------- */ - -/* Coalesce BASE register for a root trace. */ -static void asm_head_root_base(ASMState *as) -{ - IRIns *ir = IR(REF_BASE); - Reg r = ir->r; - if (ra_hasreg(r)) { - ra_free(as, r); - if (rset_test(as->modset, r) || irt_ismarked(ir->t)) - ir->r = RID_INIT; /* No inheritance for modified BASE register. */ - if (r != RID_BASE) - emit_rr(as, XO_MOV, r, RID_BASE); - } -} - -/* Coalesce or reload BASE register for a side trace. */ -static RegSet asm_head_side_base(ASMState *as, IRIns *irp, RegSet allow) -{ - IRIns *ir = IR(REF_BASE); - Reg r = ir->r; - if (ra_hasreg(r)) { - ra_free(as, r); - if (rset_test(as->modset, r) || irt_ismarked(ir->t)) - ir->r = RID_INIT; /* No inheritance for modified BASE register. */ - if (irp->r == r) { - rset_clear(allow, r); /* Mark same BASE register as coalesced. */ - } else if (ra_hasreg(irp->r) && rset_test(as->freeset, irp->r)) { - rset_clear(allow, irp->r); - emit_rr(as, XO_MOV, r, irp->r); /* Move from coalesced parent reg. */ - } else { - emit_getgl(as, r, jit_base); /* Otherwise reload BASE. */ - } - } - return allow; -} - -/* -- Tail of trace ------------------------------------------------------- */ - -/* Fixup the tail code. */ -static void asm_tail_fixup(ASMState *as, TraceNo lnk) -{ - /* Note: don't use as->mcp swap + emit_*: emit_op overwrites more bytes. */ - MCode *p = as->mctop; - MCode *target, *q; - int32_t spadj = as->T->spadjust; - if (spadj == 0) { - p -= ((as->flags & JIT_F_LEA_AGU) ? 7 : 6) + (LJ_64 ? 1 : 0); - } else { - MCode *p1; - /* Patch stack adjustment. */ - if (checki8(spadj)) { - p -= 3; - p1 = p-6; - *p1 = (MCode)spadj; - } else { - p1 = p-9; - *(int32_t *)p1 = spadj; - } - if ((as->flags & JIT_F_LEA_AGU)) { -#if LJ_64 - p1[-4] = 0x48; -#endif - p1[-3] = (MCode)XI_LEA; - p1[-2] = MODRM(checki8(spadj) ? XM_OFS8 : XM_OFS32, RID_ESP, RID_ESP); - p1[-1] = MODRM(XM_SCALE1, RID_ESP, RID_ESP); - } else { -#if LJ_64 - p1[-3] = 0x48; -#endif - p1[-2] = (MCode)(checki8(spadj) ? XI_ARITHi8 : XI_ARITHi); - p1[-1] = MODRM(XM_REG, XOg_ADD, RID_ESP); - } - } - /* Patch exit branch. */ - target = lnk ? traceref(as->J, lnk)->mcode : (MCode *)lj_vm_exit_interp; - *(int32_t *)(p-4) = jmprel(p, target); - p[-5] = XI_JMP; - /* Drop unused mcode tail. Fill with NOPs to make the prefetcher happy. */ - for (q = as->mctop-1; q >= p; q--) - *q = XI_NOP; - as->mctop = p; -} - -/* Prepare tail of code. */ -static void asm_tail_prep(ASMState *as) -{ - MCode *p = as->mctop; - /* Realign and leave room for backwards loop branch or exit branch. */ - if (as->realign) { - int i = ((int)(intptr_t)as->realign) & 15; - /* Fill unused mcode tail with NOPs to make the prefetcher happy. */ - while (i-- > 0) - *--p = XI_NOP; - as->mctop = p; - p -= (as->loopinv ? 5 : 2); /* Space for short/near jmp. */ - } else { - p -= 5; /* Space for exit branch (near jmp). */ - } - if (as->loopref) { - as->invmcp = as->mcp = p; - } else { - /* Leave room for ESP adjustment: add esp, imm or lea esp, [esp+imm] */ - as->mcp = p - (((as->flags & JIT_F_LEA_AGU) ? 7 : 6) + (LJ_64 ? 1 : 0)); - as->invmcp = NULL; - } -} - -/* -- Instruction dispatch ------------------------------------------------ */ - -/* Assemble a single instruction. */ -static void asm_ir(ASMState *as, IRIns *ir) -{ - switch ((IROp)ir->o) { - /* Miscellaneous ops. */ - case IR_LOOP: asm_loop(as); break; - case IR_NOP: case IR_XBAR: lua_assert(!ra_used(ir)); break; - case IR_USE: - ra_alloc1(as, ir->op1, irt_isfp(ir->t) ? RSET_FPR : RSET_GPR); break; - case IR_PHI: asm_phi(as, ir); break; - case IR_HIOP: asm_hiop(as, ir); break; - case IR_GCSTEP: asm_gcstep(as, ir); break; - - /* Guarded assertions. */ - case IR_LT: case IR_GE: case IR_LE: case IR_GT: - case IR_ULT: case IR_UGE: case IR_ULE: case IR_UGT: - case IR_EQ: case IR_NE: case IR_ABC: - asm_comp(as, ir, asm_compmap[ir->o]); - break; - - case IR_RETF: asm_retf(as, ir); break; - - /* Bit ops. */ - case IR_BNOT: asm_neg_not(as, ir, XOg_NOT); break; - case IR_BSWAP: asm_bitswap(as, ir); break; - - case IR_BAND: asm_intarith(as, ir, XOg_AND); break; - case IR_BOR: asm_intarith(as, ir, XOg_OR); break; - case IR_BXOR: asm_intarith(as, ir, XOg_XOR); break; - - case IR_BSHL: asm_bitshift(as, ir, XOg_SHL); break; - case IR_BSHR: asm_bitshift(as, ir, XOg_SHR); break; - case IR_BSAR: asm_bitshift(as, ir, XOg_SAR); break; - case IR_BROL: asm_bitshift(as, ir, XOg_ROL); break; - case IR_BROR: asm_bitshift(as, ir, XOg_ROR); break; - - /* Arithmetic ops. */ - case IR_ADD: asm_add(as, ir); break; - case IR_SUB: - if (irt_isnum(ir->t)) - asm_fparith(as, ir, XO_SUBSD); - else /* Note: no need for LEA trick here. i-k is encoded as i+(-k). */ - asm_intarith(as, ir, XOg_SUB); - break; - case IR_MUL: - if (irt_isnum(ir->t)) - asm_fparith(as, ir, XO_MULSD); - else - asm_intarith(as, ir, XOg_X_IMUL); - break; - case IR_DIV: -#if LJ_64 && LJ_HASFFI - if (!irt_isnum(ir->t)) - asm_arith64(as, ir, irt_isi64(ir->t) ? IRCALL_lj_carith_divi64 : - IRCALL_lj_carith_divu64); - else -#endif - asm_fparith(as, ir, XO_DIVSD); - break; - case IR_MOD: -#if LJ_64 && LJ_HASFFI - if (!irt_isint(ir->t)) - asm_arith64(as, ir, irt_isi64(ir->t) ? IRCALL_lj_carith_modi64 : - IRCALL_lj_carith_modu64); - else -#endif - asm_intmod(as, ir); - break; - - case IR_NEG: - if (irt_isnum(ir->t)) - asm_fparith(as, ir, XO_XORPS); - else - asm_neg_not(as, ir, XOg_NEG); - break; - case IR_ABS: asm_fparith(as, ir, XO_ANDPS); break; - - case IR_MIN: - if (irt_isnum(ir->t)) - asm_fparith(as, ir, XO_MINSD); - else - asm_min_max(as, ir, CC_G); - break; - case IR_MAX: - if (irt_isnum(ir->t)) - asm_fparith(as, ir, XO_MAXSD); - else - asm_min_max(as, ir, CC_L); - break; - - case IR_FPMATH: case IR_ATAN2: case IR_LDEXP: - asm_fpmath(as, ir); - break; - case IR_POW: -#if LJ_64 && LJ_HASFFI - if (!irt_isnum(ir->t)) - asm_arith64(as, ir, irt_isi64(ir->t) ? IRCALL_lj_carith_powi64 : - IRCALL_lj_carith_powu64); - else -#endif - asm_fppowi(as, ir); - break; - - /* Overflow-checking arithmetic ops. Note: don't use LEA here! */ - case IR_ADDOV: asm_intarith(as, ir, XOg_ADD); break; - case IR_SUBOV: asm_intarith(as, ir, XOg_SUB); break; - case IR_MULOV: asm_intarith(as, ir, XOg_X_IMUL); break; - - /* Memory references. */ - case IR_AREF: asm_aref(as, ir); break; - case IR_HREF: asm_href(as, ir); break; - case IR_HREFK: asm_hrefk(as, ir); break; - case IR_NEWREF: asm_newref(as, ir); break; - case IR_UREFO: case IR_UREFC: asm_uref(as, ir); break; - case IR_FREF: asm_fref(as, ir); break; - case IR_STRREF: asm_strref(as, ir); break; - - /* Loads and stores. */ - case IR_ALOAD: case IR_HLOAD: case IR_ULOAD: case IR_VLOAD: - asm_ahuvload(as, ir); - break; - case IR_FLOAD: case IR_XLOAD: asm_fxload(as, ir); break; - case IR_SLOAD: asm_sload(as, ir); break; - - case IR_ASTORE: case IR_HSTORE: case IR_USTORE: asm_ahustore(as, ir); break; - case IR_FSTORE: case IR_XSTORE: asm_fxstore(as, ir); break; - - /* Allocations. */ - case IR_SNEW: case IR_XSNEW: asm_snew(as, ir); break; - case IR_TNEW: asm_tnew(as, ir); break; - case IR_TDUP: asm_tdup(as, ir); break; - case IR_CNEW: case IR_CNEWI: asm_cnew(as, ir); break; - - /* Write barriers. */ - case IR_TBAR: asm_tbar(as, ir); break; - case IR_OBAR: asm_obar(as, ir); break; - - /* Type conversions. */ - case IR_TOBIT: asm_tobit(as, ir); break; - case IR_CONV: asm_conv(as, ir); break; - case IR_TOSTR: asm_tostr(as, ir); break; - case IR_STRTO: asm_strto(as, ir); break; - - /* Calls. */ - case IR_CALLN: case IR_CALLL: case IR_CALLS: asm_call(as, ir); break; - case IR_CALLXS: asm_callx(as, ir); break; - case IR_CARG: break; - - default: - setintV(&as->J->errinfo, ir->o); - lj_trace_err_info(as->J, LJ_TRERR_NYIIR); - break; - } -} - -/* -- Trace setup --------------------------------------------------------- */ - -/* Ensure there are enough stack slots for call arguments. */ -static Reg asm_setup_call_slots(ASMState *as, IRIns *ir, const CCallInfo *ci) -{ - IRRef args[CCI_NARGS_MAX*2]; - int nslots; - asm_collectargs(as, ir, ci, args); - nslots = asm_count_call_slots(as, ci, args); - if (nslots > as->evenspill) /* Leave room for args in stack slots. */ - as->evenspill = nslots; -#if LJ_64 - return irt_isfp(ir->t) ? REGSP_HINT(RID_FPRET) : REGSP_HINT(RID_RET); -#else - return irt_isfp(ir->t) ? REGSP_INIT : REGSP_HINT(RID_RET); -#endif -} - -/* Target-specific setup. */ -static void asm_setup_target(ASMState *as) -{ - asm_exitstub_setup(as, as->T->nsnap); -} - -/* -- Trace patching ------------------------------------------------------ */ - -/* Patch exit jumps of existing machine code to a new target. */ -void lj_asm_patchexit(jit_State *J, GCtrace *T, ExitNo exitno, MCode *target) -{ - MCode *p = T->mcode; - MCode *mcarea = lj_mcode_patch(J, p, 0); - MSize len = T->szmcode; - MCode *px = exitstub_addr(J, exitno) - 6; - MCode *pe = p+len-6; - uint32_t stateaddr = u32ptr(&J2G(J)->vmstate); - if (len > 5 && p[len-5] == XI_JMP && p+len-6 + *(int32_t *)(p+len-4) == px) - *(int32_t *)(p+len-4) = jmprel(p+len, target); - /* Do not patch parent exit for a stack check. Skip beyond vmstate update. */ - for (; p < pe; p++) - if (*(uint32_t *)(p+(LJ_64 ? 3 : 2)) == stateaddr && p[0] == XI_MOVmi) { - p += LJ_64 ? 11 : 10; - break; - } - lua_assert(p < pe); - for (; p < pe; p++) { - if ((*(uint16_t *)p & 0xf0ff) == 0x800f && p + *(int32_t *)(p+2) == px) { - *(int32_t *)(p+2) = jmprel(p+6, target); - p += 5; - } - } - lj_mcode_sync(T->mcode, T->mcode + T->szmcode); - lj_mcode_patch(J, mcarea, 1); -} - diff --git a/deps/luajit/src/lj_bc.c b/deps/luajit/src/lj_bc.c deleted file mode 100644 index a8f444c2..00000000 --- a/deps/luajit/src/lj_bc.c +++ /dev/null @@ -1,14 +0,0 @@ -/* -** Bytecode instruction modes. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#define lj_bc_c -#define LUA_CORE - -#include "lj_obj.h" -#include "lj_bc.h" - -/* Bytecode offsets and bytecode instruction modes. */ -#include "lj_bcdef.h" - diff --git a/deps/luajit/src/lj_bc.h b/deps/luajit/src/lj_bc.h deleted file mode 100644 index 7436fabf..00000000 --- a/deps/luajit/src/lj_bc.h +++ /dev/null @@ -1,261 +0,0 @@ -/* -** Bytecode instruction format. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#ifndef _LJ_BC_H -#define _LJ_BC_H - -#include "lj_def.h" -#include "lj_arch.h" - -/* Bytecode instruction format, 32 bit wide, fields of 8 or 16 bit: -** -** +----+----+----+----+ -** | B | C | A | OP | Format ABC -** +----+----+----+----+ -** | D | A | OP | Format AD -** +-------------------- -** MSB LSB -** -** In-memory instructions are always stored in host byte order. -*/ - -/* Operand ranges and related constants. */ -#define BCMAX_A 0xff -#define BCMAX_B 0xff -#define BCMAX_C 0xff -#define BCMAX_D 0xffff -#define BCBIAS_J 0x8000 -#define NO_REG BCMAX_A -#define NO_JMP (~(BCPos)0) - -/* Macros to get instruction fields. */ -#define bc_op(i) ((BCOp)((i)&0xff)) -#define bc_a(i) ((BCReg)(((i)>>8)&0xff)) -#define bc_b(i) ((BCReg)((i)>>24)) -#define bc_c(i) ((BCReg)(((i)>>16)&0xff)) -#define bc_d(i) ((BCReg)((i)>>16)) -#define bc_j(i) ((ptrdiff_t)bc_d(i)-BCBIAS_J) - -/* Macros to set instruction fields. */ -#define setbc_byte(p, x, ofs) \ - ((uint8_t *)(p))[LJ_ENDIAN_SELECT(ofs, 3-ofs)] = (uint8_t)(x) -#define setbc_op(p, x) setbc_byte(p, (x), 0) -#define setbc_a(p, x) setbc_byte(p, (x), 1) -#define setbc_b(p, x) setbc_byte(p, (x), 3) -#define setbc_c(p, x) setbc_byte(p, (x), 2) -#define setbc_d(p, x) \ - ((uint16_t *)(p))[LJ_ENDIAN_SELECT(1, 0)] = (uint16_t)(x) -#define setbc_j(p, x) setbc_d(p, (BCPos)((int32_t)(x)+BCBIAS_J)) - -/* Macros to compose instructions. */ -#define BCINS_ABC(o, a, b, c) \ - (((BCIns)(o))|((BCIns)(a)<<8)|((BCIns)(b)<<24)|((BCIns)(c)<<16)) -#define BCINS_AD(o, a, d) \ - (((BCIns)(o))|((BCIns)(a)<<8)|((BCIns)(d)<<16)) -#define BCINS_AJ(o, a, j) BCINS_AD(o, a, (BCPos)((int32_t)(j)+BCBIAS_J)) - -/* Bytecode instruction definition. Order matters, see below. -** -** (name, filler, Amode, Bmode, Cmode or Dmode, metamethod) -** -** The opcode name suffixes specify the type for RB/RC or RD: -** V = variable slot -** S = string const -** N = number const -** P = primitive type (~itype) -** B = unsigned byte literal -** M = multiple args/results -*/ -#define BCDEF(_) \ - /* Comparison ops. ORDER OPR. */ \ - _(ISLT, var, ___, var, lt) \ - _(ISGE, var, ___, var, lt) \ - _(ISLE, var, ___, var, le) \ - _(ISGT, var, ___, var, le) \ - \ - _(ISEQV, var, ___, var, eq) \ - _(ISNEV, var, ___, var, eq) \ - _(ISEQS, var, ___, str, eq) \ - _(ISNES, var, ___, str, eq) \ - _(ISEQN, var, ___, num, eq) \ - _(ISNEN, var, ___, num, eq) \ - _(ISEQP, var, ___, pri, eq) \ - _(ISNEP, var, ___, pri, eq) \ - \ - /* Unary test and copy ops. */ \ - _(ISTC, dst, ___, var, ___) \ - _(ISFC, dst, ___, var, ___) \ - _(IST, ___, ___, var, ___) \ - _(ISF, ___, ___, var, ___) \ - \ - /* Unary ops. */ \ - _(MOV, dst, ___, var, ___) \ - _(NOT, dst, ___, var, ___) \ - _(UNM, dst, ___, var, unm) \ - _(LEN, dst, ___, var, len) \ - \ - /* Binary ops. ORDER OPR. VV last, POW must be next. */ \ - _(ADDVN, dst, var, num, add) \ - _(SUBVN, dst, var, num, sub) \ - _(MULVN, dst, var, num, mul) \ - _(DIVVN, dst, var, num, div) \ - _(MODVN, dst, var, num, mod) \ - \ - _(ADDNV, dst, var, num, add) \ - _(SUBNV, dst, var, num, sub) \ - _(MULNV, dst, var, num, mul) \ - _(DIVNV, dst, var, num, div) \ - _(MODNV, dst, var, num, mod) \ - \ - _(ADDVV, dst, var, var, add) \ - _(SUBVV, dst, var, var, sub) \ - _(MULVV, dst, var, var, mul) \ - _(DIVVV, dst, var, var, div) \ - _(MODVV, dst, var, var, mod) \ - \ - _(POW, dst, var, var, pow) \ - _(CAT, dst, rbase, rbase, concat) \ - \ - /* Constant ops. */ \ - _(KSTR, dst, ___, str, ___) \ - _(KCDATA, dst, ___, cdata, ___) \ - _(KSHORT, dst, ___, lits, ___) \ - _(KNUM, dst, ___, num, ___) \ - _(KPRI, dst, ___, pri, ___) \ - _(KNIL, base, ___, base, ___) \ - \ - /* Upvalue and function ops. */ \ - _(UGET, dst, ___, uv, ___) \ - _(USETV, uv, ___, var, ___) \ - _(USETS, uv, ___, str, ___) \ - _(USETN, uv, ___, num, ___) \ - _(USETP, uv, ___, pri, ___) \ - _(UCLO, rbase, ___, jump, ___) \ - _(FNEW, dst, ___, func, gc) \ - \ - /* Table ops. */ \ - _(TNEW, dst, ___, lit, gc) \ - _(TDUP, dst, ___, tab, gc) \ - _(GGET, dst, ___, str, index) \ - _(GSET, var, ___, str, newindex) \ - _(TGETV, dst, var, var, index) \ - _(TGETS, dst, var, str, index) \ - _(TGETB, dst, var, lit, index) \ - _(TSETV, var, var, var, newindex) \ - _(TSETS, var, var, str, newindex) \ - _(TSETB, var, var, lit, newindex) \ - _(TSETM, base, ___, num, newindex) \ - \ - /* Calls and vararg handling. T = tail call. */ \ - _(CALLM, base, lit, lit, call) \ - _(CALL, base, lit, lit, call) \ - _(CALLMT, base, ___, lit, call) \ - _(CALLT, base, ___, lit, call) \ - _(ITERC, base, lit, lit, call) \ - _(ITERN, base, lit, lit, call) \ - _(VARG, base, lit, lit, ___) \ - _(ISNEXT, base, ___, jump, ___) \ - \ - /* Returns. */ \ - _(RETM, base, ___, lit, ___) \ - _(RET, rbase, ___, lit, ___) \ - _(RET0, rbase, ___, lit, ___) \ - _(RET1, rbase, ___, lit, ___) \ - \ - /* Loops and branches. I/J = interp/JIT, I/C/L = init/call/loop. */ \ - _(FORI, base, ___, jump, ___) \ - _(JFORI, base, ___, jump, ___) \ - \ - _(FORL, base, ___, jump, ___) \ - _(IFORL, base, ___, jump, ___) \ - _(JFORL, base, ___, lit, ___) \ - \ - _(ITERL, base, ___, jump, ___) \ - _(IITERL, base, ___, jump, ___) \ - _(JITERL, base, ___, lit, ___) \ - \ - _(LOOP, rbase, ___, jump, ___) \ - _(ILOOP, rbase, ___, jump, ___) \ - _(JLOOP, rbase, ___, lit, ___) \ - \ - _(JMP, rbase, ___, jump, ___) \ - \ - /* Function headers. I/J = interp/JIT, F/V/C = fixarg/vararg/C func. */ \ - _(FUNCF, rbase, ___, ___, ___) \ - _(IFUNCF, rbase, ___, ___, ___) \ - _(JFUNCF, rbase, ___, lit, ___) \ - _(FUNCV, rbase, ___, ___, ___) \ - _(IFUNCV, rbase, ___, ___, ___) \ - _(JFUNCV, rbase, ___, lit, ___) \ - _(FUNCC, rbase, ___, ___, ___) \ - _(FUNCCW, rbase, ___, ___, ___) - -/* Bytecode opcode numbers. */ -typedef enum { -#define BCENUM(name, ma, mb, mc, mt) BC_##name, -BCDEF(BCENUM) -#undef BCENUM - BC__MAX -} BCOp; - -LJ_STATIC_ASSERT((int)BC_ISEQV+1 == (int)BC_ISNEV); -LJ_STATIC_ASSERT(((int)BC_ISEQV^1) == (int)BC_ISNEV); -LJ_STATIC_ASSERT(((int)BC_ISEQS^1) == (int)BC_ISNES); -LJ_STATIC_ASSERT(((int)BC_ISEQN^1) == (int)BC_ISNEN); -LJ_STATIC_ASSERT(((int)BC_ISEQP^1) == (int)BC_ISNEP); -LJ_STATIC_ASSERT(((int)BC_ISLT^1) == (int)BC_ISGE); -LJ_STATIC_ASSERT(((int)BC_ISLE^1) == (int)BC_ISGT); -LJ_STATIC_ASSERT(((int)BC_ISLT^3) == (int)BC_ISGT); -LJ_STATIC_ASSERT((int)BC_IST-(int)BC_ISTC == (int)BC_ISF-(int)BC_ISFC); -LJ_STATIC_ASSERT((int)BC_CALLT-(int)BC_CALL == (int)BC_CALLMT-(int)BC_CALLM); -LJ_STATIC_ASSERT((int)BC_CALLMT + 1 == (int)BC_CALLT); -LJ_STATIC_ASSERT((int)BC_RETM + 1 == (int)BC_RET); -LJ_STATIC_ASSERT((int)BC_FORL + 1 == (int)BC_IFORL); -LJ_STATIC_ASSERT((int)BC_FORL + 2 == (int)BC_JFORL); -LJ_STATIC_ASSERT((int)BC_ITERL + 1 == (int)BC_IITERL); -LJ_STATIC_ASSERT((int)BC_ITERL + 2 == (int)BC_JITERL); -LJ_STATIC_ASSERT((int)BC_LOOP + 1 == (int)BC_ILOOP); -LJ_STATIC_ASSERT((int)BC_LOOP + 2 == (int)BC_JLOOP); -LJ_STATIC_ASSERT((int)BC_FUNCF + 1 == (int)BC_IFUNCF); -LJ_STATIC_ASSERT((int)BC_FUNCF + 2 == (int)BC_JFUNCF); -LJ_STATIC_ASSERT((int)BC_FUNCV + 1 == (int)BC_IFUNCV); -LJ_STATIC_ASSERT((int)BC_FUNCV + 2 == (int)BC_JFUNCV); - -/* This solves a circular dependency problem, change as needed. */ -#define FF_next_N 4 - -/* Stack slots used by FORI/FORL, relative to operand A. */ -enum { - FORL_IDX, FORL_STOP, FORL_STEP, FORL_EXT -}; - -/* Bytecode operand modes. ORDER BCMode */ -typedef enum { - BCMnone, BCMdst, BCMbase, BCMvar, BCMrbase, BCMuv, /* Mode A must be <= 7 */ - BCMlit, BCMlits, BCMpri, BCMnum, BCMstr, BCMtab, BCMfunc, BCMjump, BCMcdata, - BCM_max -} BCMode; -#define BCM___ BCMnone - -#define bcmode_a(op) ((BCMode)(lj_bc_mode[op] & 7)) -#define bcmode_b(op) ((BCMode)((lj_bc_mode[op]>>3) & 15)) -#define bcmode_c(op) ((BCMode)((lj_bc_mode[op]>>7) & 15)) -#define bcmode_d(op) bcmode_c(op) -#define bcmode_hasd(op) ((lj_bc_mode[op] & (15<<3)) == (BCMnone<<3)) -#define bcmode_mm(op) ((MMS)(lj_bc_mode[op]>>11)) - -#define BCMODE(name, ma, mb, mc, mm) \ - (BCM##ma|(BCM##mb<<3)|(BCM##mc<<7)|(MM_##mm<<11)), -#define BCMODE_FF 0 - -static LJ_AINLINE int bc_isret(BCOp op) -{ - return (op == BC_RETM || op == BC_RET || op == BC_RET0 || op == BC_RET1); -} - -LJ_DATA const uint16_t lj_bc_mode[]; -LJ_DATA const uint16_t lj_bc_ofs[]; - -#endif diff --git a/deps/luajit/src/lj_bcdump.h b/deps/luajit/src/lj_bcdump.h deleted file mode 100644 index 812d0e15..00000000 --- a/deps/luajit/src/lj_bcdump.h +++ /dev/null @@ -1,66 +0,0 @@ -/* -** Bytecode dump definitions. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#ifndef _LJ_BCDUMP_H -#define _LJ_BCDUMP_H - -#include "lj_obj.h" -#include "lj_lex.h" - -/* -- Bytecode dump format ------------------------------------------------ */ - -/* -** dump = header proto+ 0U -** header = ESC 'L' 'J' versionB flagsU [namelenU nameB*] -** proto = lengthU pdata -** pdata = phead bcinsW* uvdataH* kgc* knum* [debugB*] -** phead = flagsB numparamsB framesizeB numuvB numkgcU numknU numbcU -** [debuglenU [firstlineU numlineU]] -** kgc = kgctypeU { ktab | (loU hiU) | (rloU rhiU iloU ihiU) | strB* } -** knum = intU0 | (loU1 hiU) -** ktab = narrayU nhashU karray* khash* -** karray = ktabk -** khash = ktabk ktabk -** ktabk = ktabtypeU { intU | (loU hiU) | strB* } -** -** B = 8 bit, H = 16 bit, W = 32 bit, U = ULEB128 of W, U0/U1 = ULEB128 of W+1 -*/ - -/* Bytecode dump header. */ -#define BCDUMP_HEAD1 0x1b -#define BCDUMP_HEAD2 0x4c -#define BCDUMP_HEAD3 0x4a - -/* If you perform *any* kind of private modifications to the bytecode itself -** or to the dump format, you *must* set BCDUMP_VERSION to 0x80 or higher. -*/ -#define BCDUMP_VERSION 1 - -/* Compatibility flags. */ -#define BCDUMP_F_BE 0x01 -#define BCDUMP_F_STRIP 0x02 -#define BCDUMP_F_FFI 0x04 - -#define BCDUMP_F_KNOWN (BCDUMP_F_FFI*2-1) - -/* Type codes for the GC constants of a prototype. Plus length for strings. */ -enum { - BCDUMP_KGC_CHILD, BCDUMP_KGC_TAB, BCDUMP_KGC_I64, BCDUMP_KGC_U64, - BCDUMP_KGC_COMPLEX, BCDUMP_KGC_STR -}; - -/* Type codes for the keys/values of a constant table. */ -enum { - BCDUMP_KTAB_NIL, BCDUMP_KTAB_FALSE, BCDUMP_KTAB_TRUE, - BCDUMP_KTAB_INT, BCDUMP_KTAB_NUM, BCDUMP_KTAB_STR -}; - -/* -- Bytecode reader/writer ---------------------------------------------- */ - -LJ_FUNC int lj_bcwrite(lua_State *L, GCproto *pt, lua_Writer writer, - void *data, int strip); -LJ_FUNC GCproto *lj_bcread(LexState *ls); - -#endif diff --git a/deps/luajit/src/lj_bcread.c b/deps/luajit/src/lj_bcread.c deleted file mode 100644 index 25859d2f..00000000 --- a/deps/luajit/src/lj_bcread.c +++ /dev/null @@ -1,476 +0,0 @@ -/* -** Bytecode reader. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#define lj_bcread_c -#define LUA_CORE - -#include "lj_obj.h" -#include "lj_gc.h" -#include "lj_err.h" -#include "lj_str.h" -#include "lj_tab.h" -#include "lj_bc.h" -#if LJ_HASFFI -#include "lj_ctype.h" -#include "lj_cdata.h" -#include "lualib.h" -#endif -#include "lj_lex.h" -#include "lj_bcdump.h" -#include "lj_state.h" - -/* Reuse some lexer fields for our own purposes. */ -#define bcread_flags(ls) ls->level -#define bcread_swap(ls) \ - ((bcread_flags(ls) & BCDUMP_F_BE) != LJ_BE*BCDUMP_F_BE) -#define bcread_oldtop(L, ls) restorestack(L, ls->lastline) -#define bcread_savetop(L, ls, top) \ - ls->lastline = (BCLine)savestack(L, (top)) - -/* -- Input buffer handling ----------------------------------------------- */ - -/* Throw reader error. */ -static LJ_NOINLINE void bcread_error(LexState *ls, ErrMsg em) -{ - lua_State *L = ls->L; - const char *name = ls->chunkarg; - if (*name == BCDUMP_HEAD1) name = "(binary)"; - else if (*name == '@' || *name == '=') name++; - lj_str_pushf(L, "%s: %s", name, err2msg(em)); - lj_err_throw(L, LUA_ERRSYNTAX); -} - -/* Resize input buffer. */ -static void bcread_resize(LexState *ls, MSize len) -{ - if (ls->sb.sz < len) { - MSize sz = ls->sb.sz * 2; - while (len > sz) sz = sz * 2; - lj_str_resizebuf(ls->L, &ls->sb, sz); - /* Caveat: this may change ls->sb.buf which may affect ls->p. */ - } -} - -/* Refill buffer if needed. */ -static LJ_NOINLINE void bcread_fill(LexState *ls, MSize len, int need) -{ - lua_assert(len != 0); - if (len > LJ_MAX_MEM || ls->current < 0) - bcread_error(ls, LJ_ERR_BCBAD); - do { - const char *buf; - size_t size; - if (ls->n) { /* Copy remainder to buffer. */ - if (ls->sb.n) { /* Move down in buffer. */ - lua_assert(ls->p + ls->n == ls->sb.buf + ls->sb.n); - if (ls->n != ls->sb.n) - memmove(ls->sb.buf, ls->p, ls->n); - } else { /* Copy from buffer provided by reader. */ - bcread_resize(ls, len); - memcpy(ls->sb.buf, ls->p, ls->n); - } - ls->p = ls->sb.buf; - } - ls->sb.n = ls->n; - buf = ls->rfunc(ls->L, ls->rdata, &size); /* Get more data from reader. */ - if (buf == NULL || size == 0) { /* EOF? */ - if (need) bcread_error(ls, LJ_ERR_BCBAD); - ls->current = -1; /* Only bad if we get called again. */ - break; - } - if (ls->sb.n) { /* Append to buffer. */ - MSize n = ls->sb.n + (MSize)size; - bcread_resize(ls, n < len ? len : n); - memcpy(ls->sb.buf + ls->sb.n, buf, size); - ls->n = ls->sb.n = n; - ls->p = ls->sb.buf; - } else { /* Return buffer provided by reader. */ - ls->n = (MSize)size; - ls->p = buf; - } - } while (ls->n < len); -} - -/* Need a certain number of bytes. */ -static LJ_AINLINE void bcread_need(LexState *ls, MSize len) -{ - if (LJ_UNLIKELY(ls->n < len)) - bcread_fill(ls, len, 1); -} - -/* Want to read up to a certain number of bytes, but may need less. */ -static LJ_AINLINE void bcread_want(LexState *ls, MSize len) -{ - if (LJ_UNLIKELY(ls->n < len)) - bcread_fill(ls, len, 0); -} - -#define bcread_dec(ls) check_exp(ls->n > 0, ls->n--) -#define bcread_consume(ls, len) check_exp(ls->n >= (len), ls->n -= (len)) - -/* Return memory block from buffer. */ -static uint8_t *bcread_mem(LexState *ls, MSize len) -{ - uint8_t *p = (uint8_t *)ls->p; - bcread_consume(ls, len); - ls->p = (char *)p + len; - return p; -} - -/* Copy memory block from buffer. */ -static void bcread_block(LexState *ls, void *q, MSize len) -{ - memcpy(q, bcread_mem(ls, len), len); -} - -/* Read byte from buffer. */ -static LJ_AINLINE uint32_t bcread_byte(LexState *ls) -{ - bcread_dec(ls); - return (uint32_t)(uint8_t)*ls->p++; -} - -/* Read ULEB128 value from buffer. */ -static uint32_t bcread_uleb128(LexState *ls) -{ - const uint8_t *p = (const uint8_t *)ls->p; - uint32_t v = *p++; - if (LJ_UNLIKELY(v >= 0x80)) { - int sh = 0; - v &= 0x7f; - do { - v |= ((*p & 0x7f) << (sh += 7)); - bcread_dec(ls); - } while (*p++ >= 0x80); - } - bcread_dec(ls); - ls->p = (char *)p; - return v; -} - -/* Read top 32 bits of 33 bit ULEB128 value from buffer. */ -static uint32_t bcread_uleb128_33(LexState *ls) -{ - const uint8_t *p = (const uint8_t *)ls->p; - uint32_t v = (*p++ >> 1); - if (LJ_UNLIKELY(v >= 0x40)) { - int sh = -1; - v &= 0x3f; - do { - v |= ((*p & 0x7f) << (sh += 7)); - bcread_dec(ls); - } while (*p++ >= 0x80); - } - bcread_dec(ls); - ls->p = (char *)p; - return v; -} - -/* -- Bytecode reader ----------------------------------------------------- */ - -/* Read debug info of a prototype. */ -static void bcread_dbg(LexState *ls, GCproto *pt, MSize sizedbg) -{ - void *lineinfo = (void *)proto_lineinfo(pt); - bcread_block(ls, lineinfo, sizedbg); - /* Swap lineinfo if the endianess differs. */ - if (bcread_swap(ls) && pt->numline >= 256) { - MSize i, n = pt->sizebc-1; - if (pt->numline < 65536) { - uint16_t *p = (uint16_t *)lineinfo; - for (i = 0; i < n; i++) p[i] = (uint16_t)((p[i] >> 8)|(p[i] << 8)); - } else { - uint32_t *p = (uint32_t *)lineinfo; - for (i = 0; i < n; i++) p[i] = lj_bswap(p[i]); - } - } -} - -/* Find pointer to varinfo. */ -static const void *bcread_varinfo(GCproto *pt) -{ - const uint8_t *p = proto_uvinfo(pt); - MSize n = pt->sizeuv; - if (n) while (*p++ || --n) ; - return p; -} - -/* Read a single constant key/value of a template table. */ -static void bcread_ktabk(LexState *ls, TValue *o) -{ - MSize tp = bcread_uleb128(ls); - if (tp >= BCDUMP_KTAB_STR) { - MSize len = tp - BCDUMP_KTAB_STR; - const char *p = (const char *)bcread_mem(ls, len); - setstrV(ls->L, o, lj_str_new(ls->L, p, len)); - } else if (tp == BCDUMP_KTAB_INT) { - setintV(o, (int32_t)bcread_uleb128(ls)); - } else if (tp == BCDUMP_KTAB_NUM) { - o->u32.lo = bcread_uleb128(ls); - o->u32.hi = bcread_uleb128(ls); - } else { - lua_assert(tp <= BCDUMP_KTAB_TRUE); - setitype(o, ~tp); - } -} - -/* Read a template table. */ -static GCtab *bcread_ktab(LexState *ls) -{ - MSize narray = bcread_uleb128(ls); - MSize nhash = bcread_uleb128(ls); - GCtab *t = lj_tab_new(ls->L, narray, hsize2hbits(nhash)); - if (narray) { /* Read array entries. */ - MSize i; - TValue *o = tvref(t->array); - for (i = 0; i < narray; i++, o++) - bcread_ktabk(ls, o); - } - if (nhash) { /* Read hash entries. */ - MSize i; - for (i = 0; i < nhash; i++) { - TValue key; - bcread_ktabk(ls, &key); - lua_assert(!tvisnil(&key)); - bcread_ktabk(ls, lj_tab_set(ls->L, t, &key)); - } - } - return t; -} - -/* Read GC constants of a prototype. */ -static void bcread_kgc(LexState *ls, GCproto *pt, MSize sizekgc) -{ - MSize i; - GCRef *kr = mref(pt->k, GCRef) - (ptrdiff_t)sizekgc; - for (i = 0; i < sizekgc; i++, kr++) { - MSize tp = bcread_uleb128(ls); - if (tp >= BCDUMP_KGC_STR) { - MSize len = tp - BCDUMP_KGC_STR; - const char *p = (const char *)bcread_mem(ls, len); - setgcref(*kr, obj2gco(lj_str_new(ls->L, p, len))); - } else if (tp == BCDUMP_KGC_TAB) { - setgcref(*kr, obj2gco(bcread_ktab(ls))); -#if LJ_HASFFI - } else if (tp != BCDUMP_KGC_CHILD) { - CTypeID id = tp == BCDUMP_KGC_COMPLEX ? CTID_COMPLEX_DOUBLE : - tp == BCDUMP_KGC_I64 ? CTID_INT64 : CTID_UINT64; - CTSize sz = tp == BCDUMP_KGC_COMPLEX ? 16 : 8; - GCcdata *cd = lj_cdata_new_(ls->L, id, sz); - TValue *p = (TValue *)cdataptr(cd); - setgcref(*kr, obj2gco(cd)); - p[0].u32.lo = bcread_uleb128(ls); - p[0].u32.hi = bcread_uleb128(ls); - if (tp == BCDUMP_KGC_COMPLEX) { - p[1].u32.lo = bcread_uleb128(ls); - p[1].u32.hi = bcread_uleb128(ls); - } -#endif - } else { - lua_State *L = ls->L; - lua_assert(tp == BCDUMP_KGC_CHILD); - if (L->top <= bcread_oldtop(L, ls)) /* Stack underflow? */ - bcread_error(ls, LJ_ERR_BCBAD); - L->top--; - setgcref(*kr, obj2gco(protoV(L->top))); - } - } -} - -/* Read number constants of a prototype. */ -static void bcread_knum(LexState *ls, GCproto *pt, MSize sizekn) -{ - MSize i; - TValue *o = mref(pt->k, TValue); - for (i = 0; i < sizekn; i++, o++) { - int isnum = (ls->p[0] & 1); - uint32_t lo = bcread_uleb128_33(ls); - if (isnum) { - o->u32.lo = lo; - o->u32.hi = bcread_uleb128(ls); - } else { - setintV(o, lo); - } - } -} - -/* Read bytecode instructions. */ -static void bcread_bytecode(LexState *ls, GCproto *pt, MSize sizebc) -{ - BCIns *bc = proto_bc(pt); - bc[0] = BCINS_AD((pt->flags & PROTO_VARARG) ? BC_FUNCV : BC_FUNCF, - pt->framesize, 0); - bcread_block(ls, bc+1, (sizebc-1)*(MSize)sizeof(BCIns)); - /* Swap bytecode instructions if the endianess differs. */ - if (bcread_swap(ls)) { - MSize i; - for (i = 1; i < sizebc; i++) bc[i] = lj_bswap(bc[i]); - } -} - -/* Read upvalue refs. */ -static void bcread_uv(LexState *ls, GCproto *pt, MSize sizeuv) -{ - if (sizeuv) { - uint16_t *uv = proto_uv(pt); - bcread_block(ls, uv, sizeuv*2); - /* Swap upvalue refs if the endianess differs. */ - if (bcread_swap(ls)) { - MSize i; - for (i = 0; i < sizeuv; i++) - uv[i] = (uint16_t)((uv[i] >> 8)|(uv[i] << 8)); - } - } -} - -/* Read a prototype. */ -static GCproto *bcread_proto(LexState *ls) -{ - GCproto *pt; - MSize framesize, numparams, flags, sizeuv, sizekgc, sizekn, sizebc, sizept; - MSize ofsk, ofsuv, ofsdbg; - MSize sizedbg = 0; - BCLine firstline = 0, numline = 0; - MSize len, startn; - - /* Read length. */ - if (ls->n > 0 && ls->p[0] == 0) { /* Shortcut EOF. */ - ls->n--; ls->p++; - return NULL; - } - bcread_want(ls, 5); - len = bcread_uleb128(ls); - if (!len) return NULL; /* EOF */ - bcread_need(ls, len); - startn = ls->n; - - /* Read prototype header. */ - flags = bcread_byte(ls); - numparams = bcread_byte(ls); - framesize = bcread_byte(ls); - sizeuv = bcread_byte(ls); - sizekgc = bcread_uleb128(ls); - sizekn = bcread_uleb128(ls); - sizebc = bcread_uleb128(ls) + 1; - if (!(bcread_flags(ls) & BCDUMP_F_STRIP)) { - sizedbg = bcread_uleb128(ls); - if (sizedbg) { - firstline = bcread_uleb128(ls); - numline = bcread_uleb128(ls); - } - } - - /* Calculate total size of prototype including all colocated arrays. */ - sizept = (MSize)sizeof(GCproto) + - sizebc*(MSize)sizeof(BCIns) + - sizekgc*(MSize)sizeof(GCRef); - sizept = (sizept + (MSize)sizeof(TValue)-1) & ~((MSize)sizeof(TValue)-1); - ofsk = sizept; sizept += sizekn*(MSize)sizeof(TValue); - ofsuv = sizept; sizept += ((sizeuv+1)&~1)*2; - ofsdbg = sizept; sizept += sizedbg; - - /* Allocate prototype object and initialize its fields. */ - pt = (GCproto *)lj_mem_newgco(ls->L, (MSize)sizept); - pt->gct = ~LJ_TPROTO; - pt->numparams = (uint8_t)numparams; - pt->framesize = (uint8_t)framesize; - pt->sizebc = sizebc; - setmref(pt->k, (char *)pt + ofsk); - setmref(pt->uv, (char *)pt + ofsuv); - pt->sizekgc = 0; /* Set to zero until fully initialized. */ - pt->sizekn = sizekn; - pt->sizept = sizept; - pt->sizeuv = (uint8_t)sizeuv; - pt->flags = (uint8_t)flags; - pt->trace = 0; - setgcref(pt->chunkname, obj2gco(ls->chunkname)); - - /* Close potentially uninitialized gap between bc and kgc. */ - *(uint32_t *)((char *)pt + ofsk - sizeof(GCRef)*(sizekgc+1)) = 0; - - /* Read bytecode instructions and upvalue refs. */ - bcread_bytecode(ls, pt, sizebc); - bcread_uv(ls, pt, sizeuv); - - /* Read constants. */ - bcread_kgc(ls, pt, sizekgc); - pt->sizekgc = sizekgc; - bcread_knum(ls, pt, sizekn); - - /* Read and initialize debug info. */ - pt->firstline = firstline; - pt->numline = numline; - if (sizedbg) { - MSize sizeli = (sizebc-1) << (numline < 256 ? 0 : numline < 65536 ? 1 : 2); - setmref(pt->lineinfo, (char *)pt + ofsdbg); - setmref(pt->uvinfo, (char *)pt + ofsdbg + sizeli); - bcread_dbg(ls, pt, sizedbg); - setmref(pt->varinfo, bcread_varinfo(pt)); - } else { - setmref(pt->lineinfo, NULL); - setmref(pt->uvinfo, NULL); - setmref(pt->varinfo, NULL); - } - - if (len != startn - ls->n) - bcread_error(ls, LJ_ERR_BCBAD); - return pt; -} - -/* Read and check header of bytecode dump. */ -static int bcread_header(LexState *ls) -{ - uint32_t flags; - bcread_want(ls, 3+5+5); - if (bcread_byte(ls) != BCDUMP_HEAD2 || - bcread_byte(ls) != BCDUMP_HEAD3 || - bcread_byte(ls) != BCDUMP_VERSION) return 0; - bcread_flags(ls) = flags = bcread_uleb128(ls); - if ((flags & ~(BCDUMP_F_KNOWN)) != 0) return 0; - if ((flags & BCDUMP_F_FFI)) { -#if LJ_HASFFI - lua_State *L = ls->L; - if (!ctype_ctsG(G(L))) { - ptrdiff_t oldtop = savestack(L, L->top); - luaopen_ffi(L); /* Load FFI library on-demand. */ - L->top = restorestack(L, oldtop); - } -#else - return 0; -#endif - } - if ((flags & BCDUMP_F_STRIP)) { - ls->chunkname = lj_str_newz(ls->L, ls->chunkarg); - } else { - MSize len = bcread_uleb128(ls); - bcread_need(ls, len); - ls->chunkname = lj_str_new(ls->L, (const char *)bcread_mem(ls, len), len); - } - return 1; /* Ok. */ -} - -/* Read a bytecode dump. */ -GCproto *lj_bcread(LexState *ls) -{ - lua_State *L = ls->L; - lua_assert(ls->current == BCDUMP_HEAD1); - bcread_savetop(L, ls, L->top); - lj_str_resetbuf(&ls->sb); - /* Check for a valid bytecode dump header. */ - if (!bcread_header(ls)) - bcread_error(ls, LJ_ERR_BCFMT); - for (;;) { /* Process all prototypes in the bytecode dump. */ - GCproto *pt = bcread_proto(ls); - if (!pt) break; - setprotoV(L, L->top, pt); - incr_top(L); - } - if ((int32_t)ls->n > 0 || L->top-1 != bcread_oldtop(L, ls)) - bcread_error(ls, LJ_ERR_BCBAD); - /* Pop off last prototype. */ - L->top--; - return protoV(L->top); -} - diff --git a/deps/luajit/src/lj_bcwrite.c b/deps/luajit/src/lj_bcwrite.c deleted file mode 100644 index ff97450b..00000000 --- a/deps/luajit/src/lj_bcwrite.c +++ /dev/null @@ -1,396 +0,0 @@ -/* -** Bytecode writer. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#define lj_bcwrite_c -#define LUA_CORE - -#include "lj_obj.h" -#include "lj_gc.h" -#include "lj_str.h" -#include "lj_bc.h" -#if LJ_HASFFI -#include "lj_ctype.h" -#endif -#if LJ_HASJIT -#include "lj_dispatch.h" -#include "lj_jit.h" -#endif -#include "lj_bcdump.h" -#include "lj_vm.h" - -/* Context for bytecode writer. */ -typedef struct BCWriteCtx { - SBuf sb; /* Output buffer. */ - lua_State *L; /* Lua state. */ - GCproto *pt; /* Root prototype. */ - lua_Writer wfunc; /* Writer callback. */ - void *wdata; /* Writer callback data. */ - int strip; /* Strip debug info. */ - int status; /* Status from writer callback. */ -} BCWriteCtx; - -/* -- Output buffer handling ---------------------------------------------- */ - -/* Resize buffer if needed. */ -static LJ_NOINLINE void bcwrite_resize(BCWriteCtx *ctx, MSize len) -{ - MSize sz = ctx->sb.sz * 2; - while (ctx->sb.n + len > sz) sz = sz * 2; - lj_str_resizebuf(ctx->L, &ctx->sb, sz); -} - -/* Need a certain amount of buffer space. */ -static LJ_AINLINE void bcwrite_need(BCWriteCtx *ctx, MSize len) -{ - if (LJ_UNLIKELY(ctx->sb.n + len > ctx->sb.sz)) - bcwrite_resize(ctx, len); -} - -/* Add memory block to buffer. */ -static void bcwrite_block(BCWriteCtx *ctx, const void *p, MSize len) -{ - uint8_t *q = (uint8_t *)(ctx->sb.buf + ctx->sb.n); - MSize i; - ctx->sb.n += len; - for (i = 0; i < len; i++) q[i] = ((uint8_t *)p)[i]; -} - -/* Add byte to buffer. */ -static LJ_AINLINE void bcwrite_byte(BCWriteCtx *ctx, uint8_t b) -{ - ctx->sb.buf[ctx->sb.n++] = b; -} - -/* Add ULEB128 value to buffer. */ -static void bcwrite_uleb128(BCWriteCtx *ctx, uint32_t v) -{ - MSize n = ctx->sb.n; - uint8_t *p = (uint8_t *)ctx->sb.buf; - for (; v >= 0x80; v >>= 7) - p[n++] = (uint8_t)((v & 0x7f) | 0x80); - p[n++] = (uint8_t)v; - ctx->sb.n = n; -} - -/* -- Bytecode writer ----------------------------------------------------- */ - -/* Write a single constant key/value of a template table. */ -static void bcwrite_ktabk(BCWriteCtx *ctx, cTValue *o, int narrow) -{ - bcwrite_need(ctx, 1+10); - if (tvisstr(o)) { - const GCstr *str = strV(o); - MSize len = str->len; - bcwrite_need(ctx, 5+len); - bcwrite_uleb128(ctx, BCDUMP_KTAB_STR+len); - bcwrite_block(ctx, strdata(str), len); - } else if (tvisint(o)) { - bcwrite_byte(ctx, BCDUMP_KTAB_INT); - bcwrite_uleb128(ctx, intV(o)); - } else if (tvisnum(o)) { - if (!LJ_DUALNUM && narrow) { /* Narrow number constants to integers. */ - lua_Number num = numV(o); - int32_t k = lj_num2int(num); - if (num == (lua_Number)k) { /* -0 is never a constant. */ - bcwrite_byte(ctx, BCDUMP_KTAB_INT); - bcwrite_uleb128(ctx, k); - return; - } - } - bcwrite_byte(ctx, BCDUMP_KTAB_NUM); - bcwrite_uleb128(ctx, o->u32.lo); - bcwrite_uleb128(ctx, o->u32.hi); - } else { - lua_assert(tvispri(o)); - bcwrite_byte(ctx, BCDUMP_KTAB_NIL+~itype(o)); - } -} - -/* Write a template table. */ -static void bcwrite_ktab(BCWriteCtx *ctx, const GCtab *t) -{ - MSize narray = 0, nhash = 0; - if (t->asize > 0) { /* Determine max. length of array part. */ - ptrdiff_t i; - TValue *array = tvref(t->array); - for (i = (ptrdiff_t)t->asize-1; i >= 0; i--) - if (!tvisnil(&array[i])) - break; - narray = (MSize)(i+1); - } - if (t->hmask > 0) { /* Count number of used hash slots. */ - MSize i, hmask = t->hmask; - Node *node = noderef(t->node); - for (i = 0; i <= hmask; i++) - nhash += !tvisnil(&node[i].val); - } - /* Write number of array slots and hash slots. */ - bcwrite_uleb128(ctx, narray); - bcwrite_uleb128(ctx, nhash); - if (narray) { /* Write array entries (may contain nil). */ - MSize i; - TValue *o = tvref(t->array); - for (i = 0; i < narray; i++, o++) - bcwrite_ktabk(ctx, o, 1); - } - if (nhash) { /* Write hash entries. */ - MSize i = nhash; - Node *node = noderef(t->node) + t->hmask; - for (;; node--) - if (!tvisnil(&node->val)) { - bcwrite_ktabk(ctx, &node->key, 0); - bcwrite_ktabk(ctx, &node->val, 1); - if (--i == 0) break; - } - } -} - -/* Write GC constants of a prototype. */ -static void bcwrite_kgc(BCWriteCtx *ctx, GCproto *pt) -{ - MSize i, sizekgc = pt->sizekgc; - GCRef *kr = mref(pt->k, GCRef) - (ptrdiff_t)sizekgc; - for (i = 0; i < sizekgc; i++, kr++) { - GCobj *o = gcref(*kr); - MSize tp, need = 1; - /* Determine constant type and needed size. */ - if (o->gch.gct == ~LJ_TSTR) { - tp = BCDUMP_KGC_STR + gco2str(o)->len; - need = 5+gco2str(o)->len; - } else if (o->gch.gct == ~LJ_TPROTO) { - lua_assert((pt->flags & PROTO_CHILD)); - tp = BCDUMP_KGC_CHILD; -#if LJ_HASFFI - } else if (o->gch.gct == ~LJ_TCDATA) { - CTypeID id = gco2cd(o)->ctypeid; - need = 1+4*5; - if (id == CTID_INT64) { - tp = BCDUMP_KGC_I64; - } else if (id == CTID_UINT64) { - tp = BCDUMP_KGC_U64; - } else { - lua_assert(id == CTID_COMPLEX_DOUBLE); - tp = BCDUMP_KGC_COMPLEX; - } -#endif - } else { - lua_assert(o->gch.gct == ~LJ_TTAB); - tp = BCDUMP_KGC_TAB; - need = 1+2*5; - } - /* Write constant type. */ - bcwrite_need(ctx, need); - bcwrite_uleb128(ctx, tp); - /* Write constant data (if any). */ - if (tp >= BCDUMP_KGC_STR) { - bcwrite_block(ctx, strdata(gco2str(o)), gco2str(o)->len); - } else if (tp == BCDUMP_KGC_TAB) { - bcwrite_ktab(ctx, gco2tab(o)); -#if LJ_HASFFI - } else if (tp != BCDUMP_KGC_CHILD) { - cTValue *p = (TValue *)cdataptr(gco2cd(o)); - bcwrite_uleb128(ctx, p[0].u32.lo); - bcwrite_uleb128(ctx, p[0].u32.hi); - if (tp == BCDUMP_KGC_COMPLEX) { - bcwrite_uleb128(ctx, p[1].u32.lo); - bcwrite_uleb128(ctx, p[1].u32.hi); - } -#endif - } - } -} - -/* Write number constants of a prototype. */ -static void bcwrite_knum(BCWriteCtx *ctx, GCproto *pt) -{ - MSize i, sizekn = pt->sizekn; - cTValue *o = mref(pt->k, TValue); - bcwrite_need(ctx, 10*sizekn); - for (i = 0; i < sizekn; i++, o++) { - int32_t k; - if (tvisint(o)) { - k = intV(o); - goto save_int; - } else { - /* Write a 33 bit ULEB128 for the int (lsb=0) or loword (lsb=1). */ - if (!LJ_DUALNUM) { /* Narrow number constants to integers. */ - lua_Number num = numV(o); - k = lj_num2int(num); - if (num == (lua_Number)k) { /* -0 is never a constant. */ - save_int: - bcwrite_uleb128(ctx, 2*(uint32_t)k | ((uint32_t)k & 0x80000000u)); - if (k < 0) { - char *p = &ctx->sb.buf[ctx->sb.n-1]; - *p = (*p & 7) | ((k>>27) & 0x18); - } - continue; - } - } - bcwrite_uleb128(ctx, 1+(2*o->u32.lo | (o->u32.lo & 0x80000000u))); - if (o->u32.lo >= 0x80000000u) { - char *p = &ctx->sb.buf[ctx->sb.n-1]; - *p = (*p & 7) | ((o->u32.lo>>27) & 0x18); - } - bcwrite_uleb128(ctx, o->u32.hi); - } - } -} - -/* Write bytecode instructions. */ -static void bcwrite_bytecode(BCWriteCtx *ctx, GCproto *pt) -{ - MSize nbc = pt->sizebc-1; /* Omit the [JI]FUNC* header. */ -#if LJ_HASJIT - uint8_t *p = (uint8_t *)&ctx->sb.buf[ctx->sb.n]; -#endif - bcwrite_block(ctx, proto_bc(pt)+1, nbc*(MSize)sizeof(BCIns)); -#if LJ_HASJIT - /* Unpatch modified bytecode containing ILOOP/JLOOP etc. */ - if ((pt->flags & PROTO_ILOOP) || pt->trace) { - jit_State *J = L2J(ctx->L); - MSize i; - for (i = 0; i < nbc; i++, p += sizeof(BCIns)) { - BCOp op = (BCOp)p[LJ_ENDIAN_SELECT(0, 3)]; - if (op == BC_IFORL || op == BC_IITERL || op == BC_ILOOP || - op == BC_JFORI) { - p[LJ_ENDIAN_SELECT(0, 3)] = (uint8_t)(op-BC_IFORL+BC_FORL); - } else if (op == BC_JFORL || op == BC_JITERL || op == BC_JLOOP) { - BCReg rd = p[LJ_ENDIAN_SELECT(2, 1)] + (p[LJ_ENDIAN_SELECT(3, 0)] << 8); - BCIns ins = traceref(J, rd)->startins; - p[LJ_ENDIAN_SELECT(0, 3)] = (uint8_t)(op-BC_JFORL+BC_FORL); - p[LJ_ENDIAN_SELECT(2, 1)] = bc_c(ins); - p[LJ_ENDIAN_SELECT(3, 0)] = bc_b(ins); - } - } - } -#endif -} - -/* Write prototype. */ -static void bcwrite_proto(BCWriteCtx *ctx, GCproto *pt) -{ - MSize sizedbg = 0; - - /* Recursively write children of prototype. */ - if ((pt->flags & PROTO_CHILD)) { - ptrdiff_t i, n = pt->sizekgc; - GCRef *kr = mref(pt->k, GCRef) - 1; - for (i = 0; i < n; i++, kr--) { - GCobj *o = gcref(*kr); - if (o->gch.gct == ~LJ_TPROTO) - bcwrite_proto(ctx, gco2pt(o)); - } - } - - /* Start writing the prototype info to a buffer. */ - lj_str_resetbuf(&ctx->sb); - ctx->sb.n = 5; /* Leave room for final size. */ - bcwrite_need(ctx, 4+6*5+(pt->sizebc-1)*(MSize)sizeof(BCIns)+pt->sizeuv*2); - - /* Write prototype header. */ - bcwrite_byte(ctx, (pt->flags & (PROTO_CHILD|PROTO_VARARG|PROTO_FFI))); - bcwrite_byte(ctx, pt->numparams); - bcwrite_byte(ctx, pt->framesize); - bcwrite_byte(ctx, pt->sizeuv); - bcwrite_uleb128(ctx, pt->sizekgc); - bcwrite_uleb128(ctx, pt->sizekn); - bcwrite_uleb128(ctx, pt->sizebc-1); - if (!ctx->strip) { - if (proto_lineinfo(pt)) - sizedbg = pt->sizept - (MSize)((char *)proto_lineinfo(pt) - (char *)pt); - bcwrite_uleb128(ctx, sizedbg); - if (sizedbg) { - bcwrite_uleb128(ctx, pt->firstline); - bcwrite_uleb128(ctx, pt->numline); - } - } - - /* Write bytecode instructions and upvalue refs. */ - bcwrite_bytecode(ctx, pt); - bcwrite_block(ctx, proto_uv(pt), pt->sizeuv*2); - - /* Write constants. */ - bcwrite_kgc(ctx, pt); - bcwrite_knum(ctx, pt); - - /* Write debug info, if not stripped. */ - if (sizedbg) { - bcwrite_need(ctx, sizedbg); - bcwrite_block(ctx, proto_lineinfo(pt), sizedbg); - } - - /* Pass buffer to writer function. */ - if (ctx->status == 0) { - MSize n = ctx->sb.n - 5; - MSize nn = (lj_fls(n)+8)*9 >> 6; - ctx->sb.n = 5 - nn; - bcwrite_uleb128(ctx, n); /* Fill in final size. */ - lua_assert(ctx->sb.n == 5); - ctx->status = ctx->wfunc(ctx->L, ctx->sb.buf+5-nn, nn+n, ctx->wdata); - } -} - -/* Write header of bytecode dump. */ -static void bcwrite_header(BCWriteCtx *ctx) -{ - GCstr *chunkname = proto_chunkname(ctx->pt); - const char *name = strdata(chunkname); - MSize len = chunkname->len; - lj_str_resetbuf(&ctx->sb); - bcwrite_need(ctx, 5+5+len); - bcwrite_byte(ctx, BCDUMP_HEAD1); - bcwrite_byte(ctx, BCDUMP_HEAD2); - bcwrite_byte(ctx, BCDUMP_HEAD3); - bcwrite_byte(ctx, BCDUMP_VERSION); - bcwrite_byte(ctx, (ctx->strip ? BCDUMP_F_STRIP : 0) + - (LJ_BE ? BCDUMP_F_BE : 0) + - ((ctx->pt->flags & PROTO_FFI) ? BCDUMP_F_FFI : 0)); - if (!ctx->strip) { - bcwrite_uleb128(ctx, len); - bcwrite_block(ctx, name, len); - } - ctx->status = ctx->wfunc(ctx->L, ctx->sb.buf, ctx->sb.n, ctx->wdata); -} - -/* Write footer of bytecode dump. */ -static void bcwrite_footer(BCWriteCtx *ctx) -{ - if (ctx->status == 0) { - uint8_t zero = 0; - ctx->status = ctx->wfunc(ctx->L, &zero, 1, ctx->wdata); - } -} - -/* Protected callback for bytecode writer. */ -static TValue *cpwriter(lua_State *L, lua_CFunction dummy, void *ud) -{ - BCWriteCtx *ctx = (BCWriteCtx *)ud; - UNUSED(dummy); - lj_str_resizebuf(L, &ctx->sb, 1024); /* Avoids resize for most prototypes. */ - bcwrite_header(ctx); - bcwrite_proto(ctx, ctx->pt); - bcwrite_footer(ctx); - return NULL; -} - -/* Write bytecode for a prototype. */ -int lj_bcwrite(lua_State *L, GCproto *pt, lua_Writer writer, void *data, - int strip) -{ - BCWriteCtx ctx; - int status; - ctx.L = L; - ctx.pt = pt; - ctx.wfunc = writer; - ctx.wdata = data; - ctx.strip = strip; - ctx.status = 0; - lj_str_initbuf(&ctx.sb); - status = lj_vm_cpcall(L, NULL, &ctx, cpwriter); - if (status == 0) status = ctx.status; - lj_str_freebuf(G(ctx.L), &ctx.sb); - return status; -} - diff --git a/deps/luajit/src/lj_carith.c b/deps/luajit/src/lj_carith.c deleted file mode 100644 index 2a358a9b..00000000 --- a/deps/luajit/src/lj_carith.c +++ /dev/null @@ -1,353 +0,0 @@ -/* -** C data arithmetic. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#include "lj_obj.h" - -#if LJ_HASFFI - -#include "lj_gc.h" -#include "lj_err.h" -#include "lj_tab.h" -#include "lj_meta.h" -#include "lj_ctype.h" -#include "lj_cconv.h" -#include "lj_cdata.h" -#include "lj_carith.h" - -/* -- C data arithmetic --------------------------------------------------- */ - -/* Binary operands of an operator converted to ctypes. */ -typedef struct CDArith { - uint8_t *p[2]; - CType *ct[2]; -} CDArith; - -/* Check arguments for arithmetic metamethods. */ -static int carith_checkarg(lua_State *L, CTState *cts, CDArith *ca) -{ - TValue *o = L->base; - int ok = 1; - MSize i; - if (o+1 >= L->top) - lj_err_argt(L, 1, LUA_TCDATA); - for (i = 0; i < 2; i++, o++) { - if (tviscdata(o)) { - GCcdata *cd = cdataV(o); - CTypeID id = (CTypeID)cd->ctypeid; - CType *ct = ctype_raw(cts, id); - uint8_t *p = (uint8_t *)cdataptr(cd); - if (ctype_isptr(ct->info)) { - p = (uint8_t *)cdata_getptr(p, ct->size); - if (ctype_isref(ct->info)) ct = ctype_rawchild(cts, ct); - } else if (ctype_isfunc(ct->info)) { - p = (uint8_t *)*(void **)p; - ct = ctype_get(cts, - lj_ctype_intern(cts, CTINFO(CT_PTR, CTALIGN_PTR|id), CTSIZE_PTR)); - } - if (ctype_isenum(ct->info)) ct = ctype_child(cts, ct); - ca->ct[i] = ct; - ca->p[i] = p; - } else if (tvisint(o)) { - ca->ct[i] = ctype_get(cts, CTID_INT32); - ca->p[i] = (uint8_t *)&o->i; - } else if (tvisnum(o)) { - ca->ct[i] = ctype_get(cts, CTID_DOUBLE); - ca->p[i] = (uint8_t *)&o->n; - } else if (tvisnil(o)) { - ca->ct[i] = ctype_get(cts, CTID_P_VOID); - ca->p[i] = (uint8_t *)0; - } else if (tvisstr(o)) { - TValue *o2 = i == 0 ? o+1 : o-1; - CType *ct = ctype_raw(cts, cdataV(o2)->ctypeid); - ca->ct[i] = NULL; - ca->p[i] = (uint8_t *)strVdata(o); - ok = 0; - if (ctype_isenum(ct->info)) { - CTSize ofs; - CType *cct = lj_ctype_getfield(cts, ct, strV(o), &ofs); - if (cct && ctype_isconstval(cct->info)) { - ca->ct[i] = ctype_child(cts, cct); - ca->p[i] = (uint8_t *)&cct->size; /* Assumes ct does not grow. */ - ok = 1; - } else { - ca->ct[1-i] = ct; /* Use enum to improve error message. */ - ca->p[1-i] = NULL; - break; - } - } - } else { - ca->ct[i] = NULL; - ca->p[i] = (void *)(intptr_t)1; /* To make it unequal. */ - ok = 0; - } - } - return ok; -} - -/* Pointer arithmetic. */ -static int carith_ptr(lua_State *L, CTState *cts, CDArith *ca, MMS mm) -{ - CType *ctp = ca->ct[0]; - uint8_t *pp = ca->p[0]; - ptrdiff_t idx; - CTSize sz; - CTypeID id; - GCcdata *cd; - if (ctype_isptr(ctp->info) || ctype_isrefarray(ctp->info)) { - if ((mm == MM_sub || mm == MM_eq || mm == MM_lt || mm == MM_le) && - (ctype_isptr(ca->ct[1]->info) || ctype_isrefarray(ca->ct[1]->info))) { - uint8_t *pp2 = ca->p[1]; - if (mm == MM_eq) { /* Pointer equality. Incompatible pointers are ok. */ - setboolV(L->top-1, (pp == pp2)); - return 1; - } - if (!lj_cconv_compatptr(cts, ctp, ca->ct[1], CCF_IGNQUAL)) - return 0; - if (mm == MM_sub) { /* Pointer difference. */ - intptr_t diff; - sz = lj_ctype_size(cts, ctype_cid(ctp->info)); /* Element size. */ - if (sz == 0 || sz == CTSIZE_INVALID) - return 0; - diff = ((intptr_t)pp - (intptr_t)pp2) / (int32_t)sz; - /* All valid pointer differences on x64 are in (-2^47, +2^47), - ** which fits into a double without loss of precision. - */ - setintptrV(L->top-1, (int32_t)diff); - return 1; - } else if (mm == MM_lt) { /* Pointer comparison (unsigned). */ - setboolV(L->top-1, ((uintptr_t)pp < (uintptr_t)pp2)); - return 1; - } else { - lua_assert(mm == MM_le); - setboolV(L->top-1, ((uintptr_t)pp <= (uintptr_t)pp2)); - return 1; - } - } - if (!((mm == MM_add || mm == MM_sub) && ctype_isnum(ca->ct[1]->info))) - return 0; - lj_cconv_ct_ct(cts, ctype_get(cts, CTID_INT_PSZ), ca->ct[1], - (uint8_t *)&idx, ca->p[1], 0); - if (mm == MM_sub) idx = -idx; - } else if (mm == MM_add && ctype_isnum(ctp->info) && - (ctype_isptr(ca->ct[1]->info) || ctype_isrefarray(ca->ct[1]->info))) { - /* Swap pointer and index. */ - ctp = ca->ct[1]; pp = ca->p[1]; - lj_cconv_ct_ct(cts, ctype_get(cts, CTID_INT_PSZ), ca->ct[0], - (uint8_t *)&idx, ca->p[0], 0); - } else { - return 0; - } - sz = lj_ctype_size(cts, ctype_cid(ctp->info)); /* Element size. */ - if (sz == CTSIZE_INVALID) - return 0; - pp += idx*(int32_t)sz; /* Compute pointer + index. */ - id = lj_ctype_intern(cts, CTINFO(CT_PTR, CTALIGN_PTR|ctype_cid(ctp->info)), - CTSIZE_PTR); - cd = lj_cdata_new(cts, id, CTSIZE_PTR); - *(uint8_t **)cdataptr(cd) = pp; - setcdataV(L, L->top-1, cd); - lj_gc_check(L); - return 1; -} - -/* 64 bit integer arithmetic. */ -static int carith_int64(lua_State *L, CTState *cts, CDArith *ca, MMS mm) -{ - if (ctype_isnum(ca->ct[0]->info) && ca->ct[0]->size <= 8 && - ctype_isnum(ca->ct[1]->info) && ca->ct[1]->size <= 8) { - CTypeID id = (((ca->ct[0]->info & CTF_UNSIGNED) && ca->ct[0]->size == 8) || - ((ca->ct[1]->info & CTF_UNSIGNED) && ca->ct[1]->size == 8)) ? - CTID_UINT64 : CTID_INT64; - CType *ct = ctype_get(cts, id); - GCcdata *cd; - uint64_t u0, u1, *up; - lj_cconv_ct_ct(cts, ct, ca->ct[0], (uint8_t *)&u0, ca->p[0], 0); - if (mm != MM_unm) - lj_cconv_ct_ct(cts, ct, ca->ct[1], (uint8_t *)&u1, ca->p[1], 0); - switch (mm) { - case MM_eq: - setboolV(L->top-1, (u0 == u1)); - return 1; - case MM_lt: - setboolV(L->top-1, - id == CTID_INT64 ? ((int64_t)u0 < (int64_t)u1) : (u0 < u1)); - return 1; - case MM_le: - setboolV(L->top-1, - id == CTID_INT64 ? ((int64_t)u0 <= (int64_t)u1) : (u0 <= u1)); - return 1; - default: break; - } - cd = lj_cdata_new(cts, id, 8); - up = (uint64_t *)cdataptr(cd); - setcdataV(L, L->top-1, cd); - switch (mm) { - case MM_add: *up = u0 + u1; break; - case MM_sub: *up = u0 - u1; break; - case MM_mul: *up = u0 * u1; break; - case MM_div: - if (id == CTID_INT64) - *up = (uint64_t)lj_carith_divi64((int64_t)u0, (int64_t)u1); - else - *up = lj_carith_divu64(u0, u1); - break; - case MM_mod: - if (id == CTID_INT64) - *up = (uint64_t)lj_carith_modi64((int64_t)u0, (int64_t)u1); - else - *up = lj_carith_modu64(u0, u1); - break; - case MM_pow: - if (id == CTID_INT64) - *up = (uint64_t)lj_carith_powi64((int64_t)u0, (int64_t)u1); - else - *up = lj_carith_powu64(u0, u1); - break; - case MM_unm: *up = (uint64_t)-(int64_t)u0; break; - default: lua_assert(0); break; - } - lj_gc_check(L); - return 1; - } - return 0; -} - -/* Handle ctype arithmetic metamethods. */ -static int lj_carith_meta(lua_State *L, CTState *cts, CDArith *ca, MMS mm) -{ - cTValue *tv = NULL; - if (tviscdata(L->base)) { - CTypeID id = cdataV(L->base)->ctypeid; - CType *ct = ctype_raw(cts, id); - if (ctype_isptr(ct->info)) id = ctype_cid(ct->info); - tv = lj_ctype_meta(cts, id, mm); - } - if (!tv && L->base+1 < L->top && tviscdata(L->base+1)) { - CTypeID id = cdataV(L->base+1)->ctypeid; - CType *ct = ctype_raw(cts, id); - if (ctype_isptr(ct->info)) id = ctype_cid(ct->info); - tv = lj_ctype_meta(cts, id, mm); - } - if (!tv) { - const char *repr[2]; - int i, isenum = -1, isstr = -1; - if (mm == MM_eq) { /* Equality checks never raise an error. */ - int eq = ca->p[0] == ca->p[1]; - setboolV(L->top-1, eq); - setboolV(&G(L)->tmptv2, eq); /* Remember for trace recorder. */ - return 1; - } - for (i = 0; i < 2; i++) { - if (ca->ct[i] && tviscdata(L->base+i)) { - if (ctype_isenum(ca->ct[i]->info)) isenum = i; - repr[i] = strdata(lj_ctype_repr(L, ctype_typeid(cts, ca->ct[i]), NULL)); - } else { - if (tvisstr(&L->base[i])) isstr = i; - repr[i] = lj_typename(&L->base[i]); - } - } - if ((isenum ^ isstr) == 1) - lj_err_callerv(L, LJ_ERR_FFI_BADCONV, repr[isstr], repr[isenum]); - lj_err_callerv(L, mm == MM_len ? LJ_ERR_FFI_BADLEN : - mm == MM_concat ? LJ_ERR_FFI_BADCONCAT : - mm < MM_add ? LJ_ERR_FFI_BADCOMP : LJ_ERR_FFI_BADARITH, - repr[0], repr[1]); - } - return lj_meta_tailcall(L, tv); -} - -/* Arithmetic operators for cdata. */ -int lj_carith_op(lua_State *L, MMS mm) -{ - CTState *cts = ctype_cts(L); - CDArith ca; - if (carith_checkarg(L, cts, &ca)) { - if (carith_int64(L, cts, &ca, mm) || carith_ptr(L, cts, &ca, mm)) { - copyTV(L, &G(L)->tmptv2, L->top-1); /* Remember for trace recorder. */ - return 1; - } - } - return lj_carith_meta(L, cts, &ca, mm); -} - -/* -- 64 bit integer arithmetic helpers ----------------------------------- */ - -#if LJ_32 && LJ_HASJIT -/* Signed/unsigned 64 bit multiplication. */ -int64_t lj_carith_mul64(int64_t a, int64_t b) -{ - return a * b; -} -#endif - -/* Unsigned 64 bit division. */ -uint64_t lj_carith_divu64(uint64_t a, uint64_t b) -{ - if (b == 0) return U64x(80000000,00000000); - return a / b; -} - -/* Signed 64 bit division. */ -int64_t lj_carith_divi64(int64_t a, int64_t b) -{ - if (b == 0 || (a == (int64_t)U64x(80000000,00000000) && b == -1)) - return U64x(80000000,00000000); - return a / b; -} - -/* Unsigned 64 bit modulo. */ -uint64_t lj_carith_modu64(uint64_t a, uint64_t b) -{ - if (b == 0) return U64x(80000000,00000000); - return a % b; -} - -/* Signed 64 bit modulo. */ -int64_t lj_carith_modi64(int64_t a, int64_t b) -{ - if (b == 0) return U64x(80000000,00000000); - if (a == (int64_t)U64x(80000000,00000000) && b == -1) return 0; - return a % b; -} - -/* Unsigned 64 bit x^k. */ -uint64_t lj_carith_powu64(uint64_t x, uint64_t k) -{ - uint64_t y; - if (k == 0) - return 1; - for (; (k & 1) == 0; k >>= 1) x *= x; - y = x; - if ((k >>= 1) != 0) { - for (;;) { - x *= x; - if (k == 1) break; - if (k & 1) y *= x; - k >>= 1; - } - y *= x; - } - return y; -} - -/* Signed 64 bit x^k. */ -int64_t lj_carith_powi64(int64_t x, int64_t k) -{ - if (k == 0) - return 1; - if (k < 0) { - if (x == 0) - return U64x(7fffffff,ffffffff); - else if (x == 1) - return 1; - else if (x == -1) - return (k & 1) ? -1 : 1; - else - return 0; - } - return (int64_t)lj_carith_powu64((uint64_t)x, (uint64_t)k); -} - -#endif diff --git a/deps/luajit/src/lj_carith.h b/deps/luajit/src/lj_carith.h deleted file mode 100644 index 8c4bdbbe..00000000 --- a/deps/luajit/src/lj_carith.h +++ /dev/null @@ -1,27 +0,0 @@ -/* -** C data arithmetic. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#ifndef _LJ_CARITH_H -#define _LJ_CARITH_H - -#include "lj_obj.h" - -#if LJ_HASFFI - -LJ_FUNC int lj_carith_op(lua_State *L, MMS mm); - -#if LJ_32 && LJ_HASJIT -LJ_FUNC int64_t lj_carith_mul64(int64_t x, int64_t k); -#endif -LJ_FUNC uint64_t lj_carith_divu64(uint64_t a, uint64_t b); -LJ_FUNC int64_t lj_carith_divi64(int64_t a, int64_t b); -LJ_FUNC uint64_t lj_carith_modu64(uint64_t a, uint64_t b); -LJ_FUNC int64_t lj_carith_modi64(int64_t a, int64_t b); -LJ_FUNC uint64_t lj_carith_powu64(uint64_t x, uint64_t k); -LJ_FUNC int64_t lj_carith_powi64(int64_t x, int64_t k); - -#endif - -#endif diff --git a/deps/luajit/src/lj_ccall.c b/deps/luajit/src/lj_ccall.c deleted file mode 100644 index 998417c1..00000000 --- a/deps/luajit/src/lj_ccall.c +++ /dev/null @@ -1,900 +0,0 @@ -/* -** FFI C call handling. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#include "lj_obj.h" - -#if LJ_HASFFI - -#include "lj_gc.h" -#include "lj_err.h" -#include "lj_str.h" -#include "lj_tab.h" -#include "lj_ctype.h" -#include "lj_cconv.h" -#include "lj_cdata.h" -#include "lj_ccall.h" -#include "lj_trace.h" - -/* Target-specific handling of register arguments. */ -#if LJ_TARGET_X86 -/* -- x86 calling conventions --------------------------------------------- */ - -#if LJ_ABI_WIN - -#define CCALL_HANDLE_STRUCTRET \ - /* Return structs bigger than 8 by reference (on stack only). */ \ - cc->retref = (sz > 8); \ - if (cc->retref) cc->stack[nsp++] = (GPRArg)dp; - -#define CCALL_HANDLE_COMPLEXRET CCALL_HANDLE_STRUCTRET - -#else - -#if LJ_TARGET_OSX - -#define CCALL_HANDLE_STRUCTRET \ - /* Return structs of size 1, 2, 4 or 8 in registers. */ \ - cc->retref = !(sz == 1 || sz == 2 || sz == 4 || sz == 8); \ - if (cc->retref) { \ - if (ngpr < maxgpr) \ - cc->gpr[ngpr++] = (GPRArg)dp; \ - else \ - cc->stack[nsp++] = (GPRArg)dp; \ - } else { /* Struct with single FP field ends up in FPR. */ \ - cc->resx87 = ccall_classify_struct(cts, ctr); \ - } - -#define CCALL_HANDLE_STRUCTRET2 \ - if (cc->resx87) sp = (uint8_t *)&cc->fpr[0]; \ - memcpy(dp, sp, ctr->size); - -#else - -#define CCALL_HANDLE_STRUCTRET \ - cc->retref = 1; /* Return all structs by reference (in reg or on stack). */ \ - if (ngpr < maxgpr) \ - cc->gpr[ngpr++] = (GPRArg)dp; \ - else \ - cc->stack[nsp++] = (GPRArg)dp; - -#endif - -#define CCALL_HANDLE_COMPLEXRET \ - /* Return complex float in GPRs and complex double by reference. */ \ - cc->retref = (sz > 8); \ - if (cc->retref) { \ - if (ngpr < maxgpr) \ - cc->gpr[ngpr++] = (GPRArg)dp; \ - else \ - cc->stack[nsp++] = (GPRArg)dp; \ - } - -#endif - -#define CCALL_HANDLE_COMPLEXRET2 \ - if (!cc->retref) \ - *(int64_t *)dp = *(int64_t *)sp; /* Copy complex float from GPRs. */ - -#define CCALL_HANDLE_STRUCTARG \ - ngpr = maxgpr; /* Pass all structs by value on the stack. */ - -#define CCALL_HANDLE_COMPLEXARG \ - isfp = 1; /* Pass complex by value on stack. */ - -#define CCALL_HANDLE_REGARG \ - if (!isfp) { /* Only non-FP values may be passed in registers. */ \ - if (n > 1) { /* Anything > 32 bit is passed on the stack. */ \ - if (!LJ_ABI_WIN) ngpr = maxgpr; /* Prevent reordering. */ \ - } else if (ngpr + 1 <= maxgpr) { \ - dp = &cc->gpr[ngpr]; \ - ngpr += n; \ - goto done; \ - } \ - } - -#elif LJ_TARGET_X64 && LJ_ABI_WIN -/* -- Windows/x64 calling conventions ------------------------------------- */ - -#define CCALL_HANDLE_STRUCTRET \ - /* Return structs of size 1, 2, 4 or 8 in a GPR. */ \ - cc->retref = !(sz == 1 || sz == 2 || sz == 4 || sz == 8); \ - if (cc->retref) cc->gpr[ngpr++] = (GPRArg)dp; - -#define CCALL_HANDLE_COMPLEXRET CCALL_HANDLE_STRUCTRET - -#define CCALL_HANDLE_COMPLEXRET2 \ - if (!cc->retref) \ - *(int64_t *)dp = *(int64_t *)sp; /* Copy complex float from GPRs. */ - -#define CCALL_HANDLE_STRUCTARG \ - /* Pass structs of size 1, 2, 4 or 8 in a GPR by value. */ \ - if (!(sz == 1 || sz == 2 || sz == 4 || sz == 8)) { \ - rp = cdataptr(lj_cdata_new(cts, did, sz)); \ - sz = CTSIZE_PTR; /* Pass all other structs by reference. */ \ - } - -#define CCALL_HANDLE_COMPLEXARG \ - /* Pass complex float in a GPR and complex double by reference. */ \ - if (sz != 2*sizeof(float)) { \ - rp = cdataptr(lj_cdata_new(cts, did, sz)); \ - sz = CTSIZE_PTR; \ - } - -/* Windows/x64 argument registers are strictly positional (use ngpr). */ -#define CCALL_HANDLE_REGARG \ - if (isfp) { \ - if (ngpr < maxgpr) { dp = &cc->fpr[ngpr++]; nfpr = ngpr; goto done; } \ - } else { \ - if (ngpr < maxgpr) { dp = &cc->gpr[ngpr++]; goto done; } \ - } - -#elif LJ_TARGET_X64 -/* -- POSIX/x64 calling conventions --------------------------------------- */ - -#define CCALL_HANDLE_STRUCTRET \ - int rcl[2]; rcl[0] = rcl[1] = 0; \ - if (ccall_classify_struct(cts, ctr, rcl, 0)) { \ - cc->retref = 1; /* Return struct by reference. */ \ - cc->gpr[ngpr++] = (GPRArg)dp; \ - } else { \ - cc->retref = 0; /* Return small structs in registers. */ \ - } - -#define CCALL_HANDLE_STRUCTRET2 \ - int rcl[2]; rcl[0] = rcl[1] = 0; \ - ccall_classify_struct(cts, ctr, rcl, 0); \ - ccall_struct_ret(cc, rcl, dp, ctr->size); - -#define CCALL_HANDLE_COMPLEXRET \ - /* Complex values are returned in one or two FPRs. */ \ - cc->retref = 0; - -#define CCALL_HANDLE_COMPLEXRET2 \ - if (ctr->size == 2*sizeof(float)) { /* Copy complex float from FPR. */ \ - *(int64_t *)dp = cc->fpr[0].l[0]; \ - } else { /* Copy non-contiguous complex double from FPRs. */ \ - ((int64_t *)dp)[0] = cc->fpr[0].l[0]; \ - ((int64_t *)dp)[1] = cc->fpr[1].l[0]; \ - } - -#define CCALL_HANDLE_STRUCTARG \ - int rcl[2]; rcl[0] = rcl[1] = 0; \ - if (!ccall_classify_struct(cts, d, rcl, 0)) { \ - cc->nsp = nsp; cc->ngpr = ngpr; cc->nfpr = nfpr; \ - if (ccall_struct_arg(cc, cts, d, rcl, o, narg)) goto err_nyi; \ - nsp = cc->nsp; ngpr = cc->ngpr; nfpr = cc->nfpr; \ - continue; \ - } /* Pass all other structs by value on stack. */ - -#define CCALL_HANDLE_COMPLEXARG \ - isfp = 2; /* Pass complex in FPRs or on stack. Needs postprocessing. */ - -#define CCALL_HANDLE_REGARG \ - if (isfp) { /* Try to pass argument in FPRs. */ \ - int n2 = ctype_isvector(d->info) ? 1 : n; \ - if (nfpr + n2 <= CCALL_NARG_FPR) { \ - dp = &cc->fpr[nfpr]; \ - nfpr += n2; \ - goto done; \ - } \ - } else { /* Try to pass argument in GPRs. */ \ - /* Note that reordering is explicitly allowed in the x64 ABI. */ \ - if (n <= 2 && ngpr + n <= maxgpr) { \ - dp = &cc->gpr[ngpr]; \ - ngpr += n; \ - goto done; \ - } \ - } - -#elif LJ_TARGET_ARM -/* -- ARM calling conventions --------------------------------------------- */ - -#if LJ_ABI_SOFTFP - -#define CCALL_HANDLE_STRUCTRET \ - /* Return structs of size <= 4 in a GPR. */ \ - cc->retref = !(sz <= 4); \ - if (cc->retref) cc->gpr[ngpr++] = (GPRArg)dp; - -#define CCALL_HANDLE_COMPLEXRET \ - cc->retref = 1; /* Return all complex values by reference. */ \ - cc->gpr[ngpr++] = (GPRArg)dp; - -#define CCALL_HANDLE_COMPLEXRET2 \ - UNUSED(dp); /* Nothing to do. */ - -#define CCALL_HANDLE_STRUCTARG \ - /* Pass all structs by value in registers and/or on the stack. */ - -#define CCALL_HANDLE_COMPLEXARG \ - /* Pass complex by value in 2 or 4 GPRs. */ - -#define CCALL_HANDLE_REGARG_FP1 -#define CCALL_HANDLE_REGARG_FP2 - -#else - -#define CCALL_HANDLE_STRUCTRET \ - cc->retref = !ccall_classify_struct(cts, ctr, ct); \ - if (cc->retref) cc->gpr[ngpr++] = (GPRArg)dp; - -#define CCALL_HANDLE_STRUCTRET2 \ - if (ccall_classify_struct(cts, ctr, ct) > 1) sp = (uint8_t *)&cc->fpr[0]; \ - memcpy(dp, sp, ctr->size); - -#define CCALL_HANDLE_COMPLEXRET \ - if (!(ct->info & CTF_VARARG)) cc->retref = 0; /* Return complex in FPRs. */ - -#define CCALL_HANDLE_COMPLEXRET2 \ - if (!(ct->info & CTF_VARARG)) memcpy(dp, &cc->fpr[0], ctr->size); - -#define CCALL_HANDLE_STRUCTARG \ - isfp = (ccall_classify_struct(cts, d, ct) > 1); - /* Pass all structs by value in registers and/or on the stack. */ - -#define CCALL_HANDLE_COMPLEXARG \ - isfp = 1; /* Pass complex by value in FPRs or on stack. */ - -#define CCALL_HANDLE_REGARG_FP1 \ - if (isfp && !(ct->info & CTF_VARARG)) { \ - if ((d->info & CTF_ALIGN) > CTALIGN_PTR) { \ - if (nfpr + (n >> 1) <= CCALL_NARG_FPR) { \ - dp = &cc->fpr[nfpr]; \ - nfpr += (n >> 1); \ - goto done; \ - } \ - } else { \ - if (sz > 1 && fprodd != nfpr) fprodd = 0; \ - if (fprodd) { \ - if (2*nfpr+n <= 2*CCALL_NARG_FPR+1) { \ - dp = (void *)&cc->fpr[fprodd-1].f[1]; \ - nfpr += (n >> 1); \ - if ((n & 1)) fprodd = 0; else fprodd = nfpr-1; \ - goto done; \ - } \ - } else { \ - if (2*nfpr+n <= 2*CCALL_NARG_FPR) { \ - dp = (void *)&cc->fpr[nfpr]; \ - nfpr += (n >> 1); \ - if ((n & 1)) fprodd = ++nfpr; else fprodd = 0; \ - goto done; \ - } \ - } \ - } \ - fprodd = 0; /* No reordering after the first FP value is on stack. */ \ - } else { - -#define CCALL_HANDLE_REGARG_FP2 } - -#endif - -#define CCALL_HANDLE_REGARG \ - CCALL_HANDLE_REGARG_FP1 \ - if ((d->info & CTF_ALIGN) > CTALIGN_PTR) { \ - if (ngpr < maxgpr) \ - ngpr = (ngpr + 1u) & ~1u; /* Align to regpair. */ \ - } \ - if (ngpr < maxgpr) { \ - dp = &cc->gpr[ngpr]; \ - if (ngpr + n > maxgpr) { \ - nsp += ngpr + n - maxgpr; /* Assumes contiguous gpr/stack fields. */ \ - if (nsp > CCALL_MAXSTACK) goto err_nyi; /* Too many arguments. */ \ - ngpr = maxgpr; \ - } else { \ - ngpr += n; \ - } \ - goto done; \ - } CCALL_HANDLE_REGARG_FP2 - -#define CCALL_HANDLE_RET \ - if ((ct->info & CTF_VARARG)) sp = (uint8_t *)&cc->gpr[0]; - -#elif LJ_TARGET_PPC -/* -- PPC calling conventions --------------------------------------------- */ - -#define CCALL_HANDLE_STRUCTRET \ - cc->retref = 1; /* Return all structs by reference. */ \ - cc->gpr[ngpr++] = (GPRArg)dp; - -#define CCALL_HANDLE_COMPLEXRET \ - /* Complex values are returned in 2 or 4 GPRs. */ \ - cc->retref = 0; - -#define CCALL_HANDLE_COMPLEXRET2 \ - memcpy(dp, sp, ctr->size); /* Copy complex from GPRs. */ - -#define CCALL_HANDLE_STRUCTARG \ - rp = cdataptr(lj_cdata_new(cts, did, sz)); \ - sz = CTSIZE_PTR; /* Pass all structs by reference. */ - -#define CCALL_HANDLE_COMPLEXARG \ - /* Pass complex by value in 2 or 4 GPRs. */ - -#define CCALL_HANDLE_REGARG \ - if (isfp) { /* Try to pass argument in FPRs. */ \ - if (nfpr + 1 <= CCALL_NARG_FPR) { \ - dp = &cc->fpr[nfpr]; \ - nfpr += 1; \ - d = ctype_get(cts, CTID_DOUBLE); /* FPRs always hold doubles. */ \ - goto done; \ - } \ - } else { /* Try to pass argument in GPRs. */ \ - if (n > 1) { \ - lua_assert(n == 2 || n == 4); /* int64_t or complex (float). */ \ - if (ctype_isinteger(d->info)) \ - ngpr = (ngpr + 1u) & ~1u; /* Align int64_t to regpair. */ \ - else if (ngpr + n > maxgpr) \ - ngpr = maxgpr; /* Prevent reordering. */ \ - } \ - if (ngpr + n <= maxgpr) { \ - dp = &cc->gpr[ngpr]; \ - ngpr += n; \ - goto done; \ - } \ - } - -#define CCALL_HANDLE_RET \ - if (ctype_isfp(ctr->info) && ctr->size == sizeof(float)) \ - ctr = ctype_get(cts, CTID_DOUBLE); /* FPRs always hold doubles. */ - -#elif LJ_TARGET_PPCSPE -/* -- PPC/SPE calling conventions ----------------------------------------- */ - -#define CCALL_HANDLE_STRUCTRET \ - cc->retref = 1; /* Return all structs by reference. */ \ - cc->gpr[ngpr++] = (GPRArg)dp; - -#define CCALL_HANDLE_COMPLEXRET \ - /* Complex values are returned in 2 or 4 GPRs. */ \ - cc->retref = 0; - -#define CCALL_HANDLE_COMPLEXRET2 \ - memcpy(dp, sp, ctr->size); /* Copy complex from GPRs. */ - -#define CCALL_HANDLE_STRUCTARG \ - rp = cdataptr(lj_cdata_new(cts, did, sz)); \ - sz = CTSIZE_PTR; /* Pass all structs by reference. */ - -#define CCALL_HANDLE_COMPLEXARG \ - /* Pass complex by value in 2 or 4 GPRs. */ - -/* PPC/SPE has a softfp ABI. */ -#define CCALL_HANDLE_REGARG \ - if (n > 1) { /* Doesn't fit in a single GPR? */ \ - lua_assert(n == 2 || n == 4); /* int64_t, double or complex (float). */ \ - if (n == 2) \ - ngpr = (ngpr + 1u) & ~1u; /* Only align 64 bit value to regpair. */ \ - else if (ngpr + n > maxgpr) \ - ngpr = maxgpr; /* Prevent reordering. */ \ - } \ - if (ngpr + n <= maxgpr) { \ - dp = &cc->gpr[ngpr]; \ - ngpr += n; \ - goto done; \ - } - -#elif LJ_TARGET_MIPS -/* -- MIPS calling conventions -------------------------------------------- */ - -#define CCALL_HANDLE_STRUCTRET \ - cc->retref = 1; /* Return all structs by reference. */ \ - cc->gpr[ngpr++] = (GPRArg)dp; - -#define CCALL_HANDLE_COMPLEXRET \ - /* Complex values are returned in 1 or 2 FPRs. */ \ - cc->retref = 0; - -#define CCALL_HANDLE_COMPLEXRET2 \ - if (ctr->size == 2*sizeof(float)) { /* Copy complex float from FPRs. */ \ - ((float *)dp)[0] = cc->fpr[0].f; \ - ((float *)dp)[1] = cc->fpr[1].f; \ - } else { /* Copy complex double from FPRs. */ \ - ((double *)dp)[0] = cc->fpr[0].d; \ - ((double *)dp)[1] = cc->fpr[1].d; \ - } - -#define CCALL_HANDLE_STRUCTARG \ - /* Pass all structs by value in registers and/or on the stack. */ - -#define CCALL_HANDLE_COMPLEXARG \ - /* Pass complex by value in 2 or 4 GPRs. */ - -#define CCALL_HANDLE_REGARG \ - if (isfp && nfpr < CCALL_NARG_FPR && !(ct->info & CTF_VARARG)) { \ - /* Try to pass argument in FPRs. */ \ - dp = n == 1 ? (void *)&cc->fpr[nfpr].f : (void *)&cc->fpr[nfpr].d; \ - nfpr++; ngpr += n; \ - goto done; \ - } else { /* Try to pass argument in GPRs. */ \ - nfpr = CCALL_NARG_FPR; \ - if ((d->info & CTF_ALIGN) > CTALIGN_PTR) \ - ngpr = (ngpr + 1u) & ~1u; /* Align to regpair. */ \ - if (ngpr < maxgpr) { \ - dp = &cc->gpr[ngpr]; \ - if (ngpr + n > maxgpr) { \ - nsp += ngpr + n - maxgpr; /* Assumes contiguous gpr/stack fields. */ \ - if (nsp > CCALL_MAXSTACK) goto err_nyi; /* Too many arguments. */ \ - ngpr = maxgpr; \ - } else { \ - ngpr += n; \ - } \ - goto done; \ - } \ - } - -#define CCALL_HANDLE_RET \ - if (ctype_isfp(ctr->info) && ctr->size == sizeof(float)) \ - sp = (uint8_t *)&cc->fpr[0].f; - -#else -#error "Missing calling convention definitions for this architecture" -#endif - -#ifndef CCALL_HANDLE_STRUCTRET2 -#define CCALL_HANDLE_STRUCTRET2 \ - memcpy(dp, sp, ctr->size); /* Copy struct return value from GPRs. */ -#endif - -/* -- x86 OSX ABI struct classification ----------------------------------- */ - -#if LJ_TARGET_X86 && LJ_TARGET_OSX - -/* Check for struct with single FP field. */ -static int ccall_classify_struct(CTState *cts, CType *ct) -{ - CTSize sz = ct->size; - if (!(sz == sizeof(float) || sz == sizeof(double))) return 0; - if ((ct->info & CTF_UNION)) return 0; - while (ct->sib) { - ct = ctype_get(cts, ct->sib); - if (ctype_isfield(ct->info)) { - CType *sct = ctype_rawchild(cts, ct); - if (ctype_isfp(sct->info)) { - if (sct->size == sz) - return (sz >> 2); /* Return 1 for float or 2 for double. */ - } else if (ctype_isstruct(sct->info)) { - if (sct->size) - return ccall_classify_struct(cts, sct); - } else { - break; - } - } else if (ctype_isbitfield(ct->info)) { - break; - } else if (ctype_isxattrib(ct->info, CTA_SUBTYPE)) { - CType *sct = ctype_rawchild(cts, ct); - if (sct->size) - return ccall_classify_struct(cts, sct); - } - } - return 0; -} - -#endif - -/* -- x64 struct classification ------------------------------------------- */ - -#if LJ_TARGET_X64 && !LJ_ABI_WIN - -/* Register classes for x64 struct classification. */ -#define CCALL_RCL_INT 1 -#define CCALL_RCL_SSE 2 -#define CCALL_RCL_MEM 4 -/* NYI: classify vectors. */ - -static int ccall_classify_struct(CTState *cts, CType *ct, int *rcl, CTSize ofs); - -/* Classify a C type. */ -static void ccall_classify_ct(CTState *cts, CType *ct, int *rcl, CTSize ofs) -{ - if (ctype_isarray(ct->info)) { - CType *cct = ctype_rawchild(cts, ct); - CTSize eofs, esz = cct->size, asz = ct->size; - for (eofs = 0; eofs < asz; eofs += esz) - ccall_classify_ct(cts, cct, rcl, ofs+eofs); - } else if (ctype_isstruct(ct->info)) { - ccall_classify_struct(cts, ct, rcl, ofs); - } else { - int cl = ctype_isfp(ct->info) ? CCALL_RCL_SSE : CCALL_RCL_INT; - lua_assert(ctype_hassize(ct->info)); - if ((ofs & (ct->size-1))) cl = CCALL_RCL_MEM; /* Unaligned. */ - rcl[(ofs >= 8)] |= cl; - } -} - -/* Recursively classify a struct based on its fields. */ -static int ccall_classify_struct(CTState *cts, CType *ct, int *rcl, CTSize ofs) -{ - if (ct->size > 16) return CCALL_RCL_MEM; /* Too big, gets memory class. */ - while (ct->sib) { - CTSize fofs; - ct = ctype_get(cts, ct->sib); - fofs = ofs+ct->size; - if (ctype_isfield(ct->info)) - ccall_classify_ct(cts, ctype_rawchild(cts, ct), rcl, fofs); - else if (ctype_isbitfield(ct->info)) - rcl[(fofs >= 8)] |= CCALL_RCL_INT; /* NYI: unaligned bitfields? */ - else if (ctype_isxattrib(ct->info, CTA_SUBTYPE)) - ccall_classify_struct(cts, ctype_rawchild(cts, ct), rcl, fofs); - } - return ((rcl[0]|rcl[1]) & CCALL_RCL_MEM); /* Memory class? */ -} - -/* Try to split up a small struct into registers. */ -static int ccall_struct_reg(CCallState *cc, GPRArg *dp, int *rcl) -{ - MSize ngpr = cc->ngpr, nfpr = cc->nfpr; - uint32_t i; - for (i = 0; i < 2; i++) { - lua_assert(!(rcl[i] & CCALL_RCL_MEM)); - if ((rcl[i] & CCALL_RCL_INT)) { /* Integer class takes precedence. */ - if (ngpr >= CCALL_NARG_GPR) return 1; /* Register overflow. */ - cc->gpr[ngpr++] = dp[i]; - } else if ((rcl[i] & CCALL_RCL_SSE)) { - if (nfpr >= CCALL_NARG_FPR) return 1; /* Register overflow. */ - cc->fpr[nfpr++].l[0] = dp[i]; - } - } - cc->ngpr = ngpr; cc->nfpr = nfpr; - return 0; /* Ok. */ -} - -/* Pass a small struct argument. */ -static int ccall_struct_arg(CCallState *cc, CTState *cts, CType *d, int *rcl, - TValue *o, int narg) -{ - GPRArg dp[2]; - dp[0] = dp[1] = 0; - /* Convert to temp. struct. */ - lj_cconv_ct_tv(cts, d, (uint8_t *)dp, o, CCF_ARG(narg)); - if (ccall_struct_reg(cc, dp, rcl)) { /* Register overflow? Pass on stack. */ - MSize nsp = cc->nsp, n = rcl[1] ? 2 : 1; - if (nsp + n > CCALL_MAXSTACK) return 1; /* Too many arguments. */ - cc->nsp = nsp + n; - memcpy(&cc->stack[nsp], dp, n*CTSIZE_PTR); - } - return 0; /* Ok. */ -} - -/* Combine returned small struct. */ -static void ccall_struct_ret(CCallState *cc, int *rcl, uint8_t *dp, CTSize sz) -{ - GPRArg sp[2]; - MSize ngpr = 0, nfpr = 0; - uint32_t i; - for (i = 0; i < 2; i++) { - if ((rcl[i] & CCALL_RCL_INT)) { /* Integer class takes precedence. */ - sp[i] = cc->gpr[ngpr++]; - } else if ((rcl[i] & CCALL_RCL_SSE)) { - sp[i] = cc->fpr[nfpr++].l[0]; - } - } - memcpy(dp, sp, sz); -} -#endif - -/* -- ARM hard-float ABI struct classification ---------------------------- */ - -#if LJ_TARGET_ARM && !LJ_ABI_SOFTFP - -/* Classify a struct based on its fields. */ -static unsigned int ccall_classify_struct(CTState *cts, CType *ct, CType *ctf) -{ - CTSize sz = ct->size; - unsigned int r = 0, n = 0, isu = (ct->info & CTF_UNION); - if ((ctf->info & CTF_VARARG)) goto noth; - while (ct->sib) { - CType *sct; - ct = ctype_get(cts, ct->sib); - if (ctype_isfield(ct->info)) { - sct = ctype_rawchild(cts, ct); - if (ctype_isfp(sct->info)) { - r |= sct->size; - if (!isu) n++; else if (n == 0) n = 1; - } else if (ctype_iscomplex(sct->info)) { - r |= (sct->size >> 1); - if (!isu) n += 2; else if (n < 2) n = 2; - } else if (ctype_isstruct(sct->info)) { - goto substruct; - } else { - goto noth; - } - } else if (ctype_isbitfield(ct->info)) { - goto noth; - } else if (ctype_isxattrib(ct->info, CTA_SUBTYPE)) { - sct = ctype_rawchild(cts, ct); - substruct: - if (sct->size > 0) { - unsigned int s = ccall_classify_struct(cts, sct, ctf); - if (s <= 1) goto noth; - r |= (s & 255); - if (!isu) n += (s >> 8); else if (n < (s >>8)) n = (s >> 8); - } - } - } - if ((r == 4 || r == 8) && n <= 4) - return r + (n << 8); -noth: /* Not a homogeneous float/double aggregate. */ - return (sz <= 4); /* Return structs of size <= 4 in a GPR. */ -} - -#endif - -/* -- Common C call handling ---------------------------------------------- */ - -/* Infer the destination CTypeID for a vararg argument. */ -CTypeID lj_ccall_ctid_vararg(CTState *cts, cTValue *o) -{ - if (tvisnumber(o)) { - return CTID_DOUBLE; - } else if (tviscdata(o)) { - CTypeID id = cdataV(o)->ctypeid; - CType *s = ctype_get(cts, id); - if (ctype_isrefarray(s->info)) { - return lj_ctype_intern(cts, - CTINFO(CT_PTR, CTALIGN_PTR|ctype_cid(s->info)), CTSIZE_PTR); - } else if (ctype_isstruct(s->info) || ctype_isfunc(s->info)) { - /* NYI: how to pass a struct by value in a vararg argument? */ - return lj_ctype_intern(cts, CTINFO(CT_PTR, CTALIGN_PTR|id), CTSIZE_PTR); - } else if (ctype_isfp(s->info) && s->size == sizeof(float)) { - return CTID_DOUBLE; - } else { - return id; - } - } else if (tvisstr(o)) { - return CTID_P_CCHAR; - } else if (tvisbool(o)) { - return CTID_BOOL; - } else { - return CTID_P_VOID; - } -} - -/* Setup arguments for C call. */ -static int ccall_set_args(lua_State *L, CTState *cts, CType *ct, - CCallState *cc) -{ - int gcsteps = 0; - TValue *o, *top = L->top; - CTypeID fid; - CType *ctr; - MSize maxgpr, ngpr = 0, nsp = 0, narg; -#if CCALL_NARG_FPR - MSize nfpr = 0; -#if LJ_TARGET_ARM - MSize fprodd = 0; -#endif -#endif - - /* Clear unused regs to get some determinism in case of misdeclaration. */ - memset(cc->gpr, 0, sizeof(cc->gpr)); -#if CCALL_NUM_FPR - memset(cc->fpr, 0, sizeof(cc->fpr)); -#endif - -#if LJ_TARGET_X86 - /* x86 has several different calling conventions. */ - cc->resx87 = 0; - switch (ctype_cconv(ct->info)) { - case CTCC_FASTCALL: maxgpr = 2; break; - case CTCC_THISCALL: maxgpr = 1; break; - default: maxgpr = 0; break; - } -#else - maxgpr = CCALL_NARG_GPR; -#endif - - /* Perform required setup for some result types. */ - ctr = ctype_rawchild(cts, ct); - if (ctype_isvector(ctr->info)) { - if (!(CCALL_VECTOR_REG && (ctr->size == 8 || ctr->size == 16))) - goto err_nyi; - } else if (ctype_iscomplex(ctr->info) || ctype_isstruct(ctr->info)) { - /* Preallocate cdata object and anchor it after arguments. */ - CTSize sz = ctr->size; - GCcdata *cd = lj_cdata_new(cts, ctype_cid(ct->info), sz); - void *dp = cdataptr(cd); - setcdataV(L, L->top++, cd); - if (ctype_isstruct(ctr->info)) { - CCALL_HANDLE_STRUCTRET - } else { - CCALL_HANDLE_COMPLEXRET - } -#if LJ_TARGET_X86 - } else if (ctype_isfp(ctr->info)) { - cc->resx87 = ctr->size == sizeof(float) ? 1 : 2; -#endif - } - - /* Skip initial attributes. */ - fid = ct->sib; - while (fid) { - CType *ctf = ctype_get(cts, fid); - if (!ctype_isattrib(ctf->info)) break; - fid = ctf->sib; - } - - /* Walk through all passed arguments. */ - for (o = L->base+1, narg = 1; o < top; o++, narg++) { - CTypeID did; - CType *d; - CTSize sz; - MSize n, isfp = 0, isva = 0; - void *dp, *rp = NULL; - - if (fid) { /* Get argument type from field. */ - CType *ctf = ctype_get(cts, fid); - fid = ctf->sib; - lua_assert(ctype_isfield(ctf->info)); - did = ctype_cid(ctf->info); - } else { - if (!(ct->info & CTF_VARARG)) - lj_err_caller(L, LJ_ERR_FFI_NUMARG); /* Too many arguments. */ - did = lj_ccall_ctid_vararg(cts, o); /* Infer vararg type. */ - isva = 1; - } - d = ctype_raw(cts, did); - sz = d->size; - - /* Find out how (by value/ref) and where (GPR/FPR) to pass an argument. */ - if (ctype_isnum(d->info)) { - if (sz > 8) goto err_nyi; - if ((d->info & CTF_FP)) - isfp = 1; - } else if (ctype_isvector(d->info)) { - if (CCALL_VECTOR_REG && (sz == 8 || sz == 16)) - isfp = 1; - else - goto err_nyi; - } else if (ctype_isstruct(d->info)) { - CCALL_HANDLE_STRUCTARG - } else if (ctype_iscomplex(d->info)) { - CCALL_HANDLE_COMPLEXARG - } else { - sz = CTSIZE_PTR; - } - sz = (sz + CTSIZE_PTR-1) & ~(CTSIZE_PTR-1); - n = sz / CTSIZE_PTR; /* Number of GPRs or stack slots needed. */ - - CCALL_HANDLE_REGARG /* Handle register arguments. */ - - /* Otherwise pass argument on stack. */ - if (CCALL_ALIGN_STACKARG && !rp && (d->info & CTF_ALIGN) > CTALIGN_PTR) { - MSize align = (1u << ctype_align(d->info-CTALIGN_PTR)) -1; - nsp = (nsp + align) & ~align; /* Align argument on stack. */ - } - if (nsp + n > CCALL_MAXSTACK) { /* Too many arguments. */ - err_nyi: - lj_err_caller(L, LJ_ERR_FFI_NYICALL); - } - dp = &cc->stack[nsp]; - nsp += n; - isva = 0; - - done: - if (rp) { /* Pass by reference. */ - gcsteps++; - *(void **)dp = rp; - dp = rp; - } - lj_cconv_ct_tv(cts, d, (uint8_t *)dp, o, CCF_ARG(narg)); - /* Extend passed integers to 32 bits at least. */ - if (ctype_isinteger_or_bool(d->info) && d->size < 4) { - if (d->info & CTF_UNSIGNED) - *(uint32_t *)dp = d->size == 1 ? (uint32_t)*(uint8_t *)dp : - (uint32_t)*(uint16_t *)dp; - else - *(int32_t *)dp = d->size == 1 ? (int32_t)*(int8_t *)dp : - (int32_t)*(int16_t *)dp; - } -#if LJ_TARGET_X64 && LJ_ABI_WIN - if (isva) { /* Windows/x64 mirrors varargs in both register sets. */ - if (nfpr == ngpr) - cc->gpr[ngpr-1] = cc->fpr[ngpr-1].l[0]; - else - cc->fpr[ngpr-1].l[0] = cc->gpr[ngpr-1]; - } -#else - UNUSED(isva); -#endif -#if LJ_TARGET_X64 && !LJ_ABI_WIN - if (isfp == 2 && n == 2 && (uint8_t *)dp == (uint8_t *)&cc->fpr[nfpr-2]) { - cc->fpr[nfpr-1].d[0] = cc->fpr[nfpr-2].d[1]; /* Split complex double. */ - cc->fpr[nfpr-2].d[1] = 0; - } -#else - UNUSED(isfp); -#endif - } - if (fid) lj_err_caller(L, LJ_ERR_FFI_NUMARG); /* Too few arguments. */ - -#if LJ_TARGET_X64 || LJ_TARGET_PPC - cc->nfpr = nfpr; /* Required for vararg functions. */ -#endif - cc->nsp = nsp; - cc->spadj = (CCALL_SPS_FREE + CCALL_SPS_EXTRA)*CTSIZE_PTR; - if (nsp > CCALL_SPS_FREE) - cc->spadj += (((nsp-CCALL_SPS_FREE)*CTSIZE_PTR + 15u) & ~15u); - return gcsteps; -} - -/* Get results from C call. */ -static int ccall_get_results(lua_State *L, CTState *cts, CType *ct, - CCallState *cc, int *ret) -{ - CType *ctr = ctype_rawchild(cts, ct); - uint8_t *sp = (uint8_t *)&cc->gpr[0]; - if (ctype_isvoid(ctr->info)) { - *ret = 0; /* Zero results. */ - return 0; /* No additional GC step. */ - } - *ret = 1; /* One result. */ - if (ctype_isstruct(ctr->info)) { - /* Return cdata object which is already on top of stack. */ - if (!cc->retref) { - void *dp = cdataptr(cdataV(L->top-1)); /* Use preallocated object. */ - CCALL_HANDLE_STRUCTRET2 - } - return 1; /* One GC step. */ - } - if (ctype_iscomplex(ctr->info)) { - /* Return cdata object which is already on top of stack. */ - void *dp = cdataptr(cdataV(L->top-1)); /* Use preallocated object. */ - CCALL_HANDLE_COMPLEXRET2 - return 1; /* One GC step. */ - } - if (LJ_BE && ctype_isinteger_or_bool(ctr->info) && ctr->size < CTSIZE_PTR) - sp += (CTSIZE_PTR - ctr->size); -#if CCALL_NUM_FPR - if (ctype_isfp(ctr->info) || ctype_isvector(ctr->info)) - sp = (uint8_t *)&cc->fpr[0]; -#endif -#ifdef CCALL_HANDLE_RET - CCALL_HANDLE_RET -#endif - /* No reference types end up here, so there's no need for the CTypeID. */ - lua_assert(!(ctype_isrefarray(ctr->info) || ctype_isstruct(ctr->info))); - return lj_cconv_tv_ct(cts, ctr, 0, L->top-1, sp); -} - -/* Call C function. */ -int lj_ccall_func(lua_State *L, GCcdata *cd) -{ - CTState *cts = ctype_cts(L); - CType *ct = ctype_raw(cts, cd->ctypeid); - CTSize sz = CTSIZE_PTR; - if (ctype_isptr(ct->info)) { - sz = ct->size; - ct = ctype_rawchild(cts, ct); - } - if (ctype_isfunc(ct->info)) { - CCallState cc; - int gcsteps, ret; - cc.func = (void (*)(void))cdata_getptr(cdataptr(cd), sz); - gcsteps = ccall_set_args(L, cts, ct, &cc); - ct = (CType *)((intptr_t)ct-(intptr_t)cts->tab); - cts->cb.slot = ~0u; - lj_vm_ffi_call(&cc); - if (cts->cb.slot != ~0u) { /* Blacklist function that called a callback. */ - TValue tv; - setlightudV(&tv, (void *)cc.func); - setboolV(lj_tab_set(L, cts->miscmap, &tv), 1); - } - ct = (CType *)((intptr_t)ct+(intptr_t)cts->tab); /* May be reallocated. */ - gcsteps += ccall_get_results(L, cts, ct, &cc, &ret); -#if LJ_TARGET_X86 && LJ_ABI_WIN - /* Automatically detect __stdcall and fix up C function declaration. */ - if (cc.spadj && ctype_cconv(ct->info) == CTCC_CDECL) { - CTF_INSERT(ct->info, CCONV, CTCC_STDCALL); - lj_trace_abort(G(L)); - } -#endif - while (gcsteps-- > 0) - lj_gc_check(L); - return ret; - } - return -1; /* Not a function. */ -} - -#endif diff --git a/deps/luajit/src/lj_ccall.h b/deps/luajit/src/lj_ccall.h deleted file mode 100644 index f5530109..00000000 --- a/deps/luajit/src/lj_ccall.h +++ /dev/null @@ -1,171 +0,0 @@ -/* -** FFI C call handling. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#ifndef _LJ_CCALL_H -#define _LJ_CCALL_H - -#include "lj_obj.h" -#include "lj_ctype.h" - -#if LJ_HASFFI - -/* -- C calling conventions ----------------------------------------------- */ - -#if LJ_TARGET_X86ORX64 - -#if LJ_TARGET_X86 -#define CCALL_NARG_GPR 2 /* For fastcall arguments. */ -#define CCALL_NARG_FPR 0 -#define CCALL_NRET_GPR 2 -#define CCALL_NRET_FPR 1 /* For FP results on x87 stack. */ -#define CCALL_ALIGN_STACKARG 0 /* Don't align argument on stack. */ -#elif LJ_ABI_WIN -#define CCALL_NARG_GPR 4 -#define CCALL_NARG_FPR 4 -#define CCALL_NRET_GPR 1 -#define CCALL_NRET_FPR 1 -#define CCALL_SPS_EXTRA 4 -#else -#define CCALL_NARG_GPR 6 -#define CCALL_NARG_FPR 8 -#define CCALL_NRET_GPR 2 -#define CCALL_NRET_FPR 2 -#define CCALL_VECTOR_REG 1 /* Pass vectors in registers. */ -#endif - -#define CCALL_SPS_FREE 1 -#define CCALL_ALIGN_CALLSTATE 16 - -typedef LJ_ALIGN(16) union FPRArg { - double d[2]; - float f[4]; - uint8_t b[16]; - uint16_t s[8]; - int i[4]; - int64_t l[2]; -} FPRArg; - -typedef intptr_t GPRArg; - -#elif LJ_TARGET_ARM - -#define CCALL_NARG_GPR 4 -#define CCALL_NRET_GPR 2 /* For softfp double. */ -#if LJ_ABI_SOFTFP -#define CCALL_NARG_FPR 0 -#define CCALL_NRET_FPR 0 -#else -#define CCALL_NARG_FPR 8 -#define CCALL_NRET_FPR 4 -#endif -#define CCALL_SPS_FREE 0 - -typedef intptr_t GPRArg; -typedef union FPRArg { - double d; - float f[2]; -} FPRArg; - -#elif LJ_TARGET_PPC - -#define CCALL_NARG_GPR 8 -#define CCALL_NARG_FPR 8 -#define CCALL_NRET_GPR 4 /* For complex double. */ -#define CCALL_NRET_FPR 1 -#define CCALL_SPS_EXTRA 4 -#define CCALL_SPS_FREE 0 - -typedef intptr_t GPRArg; -typedef double FPRArg; - -#elif LJ_TARGET_PPCSPE - -#define CCALL_NARG_GPR 8 -#define CCALL_NARG_FPR 0 -#define CCALL_NRET_GPR 4 /* For softfp complex double. */ -#define CCALL_NRET_FPR 0 -#define CCALL_SPS_FREE 0 /* NYI */ - -typedef intptr_t GPRArg; - -#elif LJ_TARGET_MIPS - -#define CCALL_NARG_GPR 4 -#define CCALL_NARG_FPR 2 -#define CCALL_NRET_GPR 2 -#define CCALL_NRET_FPR 2 -#define CCALL_SPS_EXTRA 7 -#define CCALL_SPS_FREE 1 - -typedef intptr_t GPRArg; -typedef union FPRArg { - double d; - struct { LJ_ENDIAN_LOHI(float f; , float g;) }; -} FPRArg; - -#else -#error "Missing calling convention definitions for this architecture" -#endif - -#ifndef CCALL_SPS_EXTRA -#define CCALL_SPS_EXTRA 0 -#endif -#ifndef CCALL_VECTOR_REG -#define CCALL_VECTOR_REG 0 -#endif -#ifndef CCALL_ALIGN_STACKARG -#define CCALL_ALIGN_STACKARG 1 -#endif -#ifndef CCALL_ALIGN_CALLSTATE -#define CCALL_ALIGN_CALLSTATE 8 -#endif - -#define CCALL_NUM_GPR \ - (CCALL_NARG_GPR > CCALL_NRET_GPR ? CCALL_NARG_GPR : CCALL_NRET_GPR) -#define CCALL_NUM_FPR \ - (CCALL_NARG_FPR > CCALL_NRET_FPR ? CCALL_NARG_FPR : CCALL_NRET_FPR) - -/* Check against constants in lj_ctype.h. */ -LJ_STATIC_ASSERT(CCALL_NUM_GPR <= CCALL_MAX_GPR); -LJ_STATIC_ASSERT(CCALL_NUM_FPR <= CCALL_MAX_FPR); - -#define CCALL_MAXSTACK 32 - -/* -- C call state -------------------------------------------------------- */ - -typedef LJ_ALIGN(CCALL_ALIGN_CALLSTATE) struct CCallState { - void (*func)(void); /* Pointer to called function. */ - uint32_t spadj; /* Stack pointer adjustment. */ - uint8_t nsp; /* Number of stack slots. */ - uint8_t retref; /* Return value by reference. */ -#if LJ_TARGET_X64 - uint8_t ngpr; /* Number of arguments in GPRs. */ - uint8_t nfpr; /* Number of arguments in FPRs. */ -#elif LJ_TARGET_X86 - uint8_t resx87; /* Result on x87 stack: 1:float, 2:double. */ -#elif LJ_TARGET_PPC - uint8_t nfpr; /* Number of arguments in FPRs. */ -#endif -#if LJ_32 - int32_t align1; -#endif -#if CCALL_NUM_FPR - FPRArg fpr[CCALL_NUM_FPR]; /* Arguments/results in FPRs. */ -#endif - GPRArg gpr[CCALL_NUM_GPR]; /* Arguments/results in GPRs. */ - GPRArg stack[CCALL_MAXSTACK]; /* Stack slots. */ -} CCallState; - -/* -- C call handling ----------------------------------------------------- */ - -/* Really belongs to lj_vm.h. */ -LJ_ASMF void LJ_FASTCALL lj_vm_ffi_call(CCallState *cc); - -LJ_FUNC CTypeID lj_ccall_ctid_vararg(CTState *cts, cTValue *o); -LJ_FUNC int lj_ccall_func(lua_State *L, GCcdata *cd); - -#endif - -#endif diff --git a/deps/luajit/src/lj_ccallback.c b/deps/luajit/src/lj_ccallback.c deleted file mode 100644 index b210641f..00000000 --- a/deps/luajit/src/lj_ccallback.c +++ /dev/null @@ -1,644 +0,0 @@ -/* -** FFI C callback handling. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#include "lj_obj.h" - -#if LJ_HASFFI - -#include "lj_gc.h" -#include "lj_err.h" -#include "lj_tab.h" -#include "lj_state.h" -#include "lj_frame.h" -#include "lj_ctype.h" -#include "lj_cconv.h" -#include "lj_ccall.h" -#include "lj_ccallback.h" -#include "lj_target.h" -#include "lj_mcode.h" -#include "lj_trace.h" -#include "lj_vm.h" - -/* -- Target-specific handling of callback slots -------------------------- */ - -#define CALLBACK_MCODE_SIZE (LJ_PAGESIZE * LJ_NUM_CBPAGE) - -#if LJ_OS_NOJIT - -/* Disabled callback support. */ -#define CALLBACK_SLOT2OFS(slot) (0*(slot)) -#define CALLBACK_OFS2SLOT(ofs) (0*(ofs)) -#define CALLBACK_MAX_SLOT 0 - -#elif LJ_TARGET_X86ORX64 - -#define CALLBACK_MCODE_HEAD (LJ_64 ? 8 : 0) -#define CALLBACK_MCODE_GROUP (-2+1+2+5+(LJ_64 ? 6 : 5)) - -#define CALLBACK_SLOT2OFS(slot) \ - (CALLBACK_MCODE_HEAD + CALLBACK_MCODE_GROUP*((slot)/32) + 4*(slot)) - -static MSize CALLBACK_OFS2SLOT(MSize ofs) -{ - MSize group; - ofs -= CALLBACK_MCODE_HEAD; - group = ofs / (32*4 + CALLBACK_MCODE_GROUP); - return (ofs % (32*4 + CALLBACK_MCODE_GROUP))/4 + group*32; -} - -#define CALLBACK_MAX_SLOT \ - (((CALLBACK_MCODE_SIZE-CALLBACK_MCODE_HEAD)/(CALLBACK_MCODE_GROUP+4*32))*32) - -#elif LJ_TARGET_ARM - -#define CALLBACK_MCODE_HEAD 32 -#define CALLBACK_SLOT2OFS(slot) (CALLBACK_MCODE_HEAD + 8*(slot)) -#define CALLBACK_OFS2SLOT(ofs) (((ofs)-CALLBACK_MCODE_HEAD)/8) -#define CALLBACK_MAX_SLOT (CALLBACK_OFS2SLOT(CALLBACK_MCODE_SIZE)) - -#elif LJ_TARGET_PPC - -#define CALLBACK_MCODE_HEAD 24 -#define CALLBACK_SLOT2OFS(slot) (CALLBACK_MCODE_HEAD + 8*(slot)) -#define CALLBACK_OFS2SLOT(ofs) (((ofs)-CALLBACK_MCODE_HEAD)/8) -#define CALLBACK_MAX_SLOT (CALLBACK_OFS2SLOT(CALLBACK_MCODE_SIZE)) - -#elif LJ_TARGET_MIPS - -#define CALLBACK_MCODE_HEAD 24 -#define CALLBACK_SLOT2OFS(slot) (CALLBACK_MCODE_HEAD + 8*(slot)) -#define CALLBACK_OFS2SLOT(ofs) (((ofs)-CALLBACK_MCODE_HEAD)/8) -#define CALLBACK_MAX_SLOT (CALLBACK_OFS2SLOT(CALLBACK_MCODE_SIZE)) - -#else - -/* Missing support for this architecture. */ -#define CALLBACK_SLOT2OFS(slot) (0*(slot)) -#define CALLBACK_OFS2SLOT(ofs) (0*(ofs)) -#define CALLBACK_MAX_SLOT 0 - -#endif - -/* Convert callback slot number to callback function pointer. */ -static void *callback_slot2ptr(CTState *cts, MSize slot) -{ - return (uint8_t *)cts->cb.mcode + CALLBACK_SLOT2OFS(slot); -} - -/* Convert callback function pointer to slot number. */ -MSize lj_ccallback_ptr2slot(CTState *cts, void *p) -{ - uintptr_t ofs = (uintptr_t)((uint8_t *)p -(uint8_t *)cts->cb.mcode); - if (ofs < CALLBACK_MCODE_SIZE) { - MSize slot = CALLBACK_OFS2SLOT((MSize)ofs); - if (CALLBACK_SLOT2OFS(slot) == (MSize)ofs) - return slot; - } - return ~0u; /* Not a known callback function pointer. */ -} - -/* Initialize machine code for callback function pointers. */ -#if LJ_OS_NOJIT -/* Disabled callback support. */ -#define callback_mcode_init(g, p) UNUSED(p) -#elif LJ_TARGET_X86ORX64 -static void callback_mcode_init(global_State *g, uint8_t *page) -{ - uint8_t *p = page; - uint8_t *target = (uint8_t *)(void *)lj_vm_ffi_callback; - MSize slot; -#if LJ_64 - *(void **)p = target; p += 8; -#endif - for (slot = 0; slot < CALLBACK_MAX_SLOT; slot++) { - /* mov al, slot; jmp group */ - *p++ = XI_MOVrib | RID_EAX; *p++ = (uint8_t)slot; - if ((slot & 31) == 31 || slot == CALLBACK_MAX_SLOT-1) { - /* push ebp/rbp; mov ah, slot>>8; mov ebp, &g. */ - *p++ = XI_PUSH + RID_EBP; - *p++ = XI_MOVrib | (RID_EAX+4); *p++ = (uint8_t)(slot >> 8); - *p++ = XI_MOVri | RID_EBP; - *(int32_t *)p = i32ptr(g); p += 4; -#if LJ_64 - /* jmp [rip-pageofs] where lj_vm_ffi_callback is stored. */ - *p++ = XI_GROUP5; *p++ = XM_OFS0 + (XOg_JMP<<3) + RID_EBP; - *(int32_t *)p = (int32_t)(page-(p+4)); p += 4; -#else - /* jmp lj_vm_ffi_callback. */ - *p++ = XI_JMP; *(int32_t *)p = target-(p+4); p += 4; -#endif - } else { - *p++ = XI_JMPs; *p++ = (uint8_t)((2+2)*(31-(slot&31)) - 2); - } - } - lua_assert(p - page <= CALLBACK_MCODE_SIZE); -} -#elif LJ_TARGET_ARM -static void callback_mcode_init(global_State *g, uint32_t *page) -{ - uint32_t *p = page; - void *target = (void *)lj_vm_ffi_callback; - MSize slot; - /* This must match with the saveregs macro in buildvm_arm.dasc. */ - *p++ = ARMI_SUB|ARMF_D(RID_R12)|ARMF_N(RID_R12)|ARMF_M(RID_PC); - *p++ = ARMI_PUSH|ARMF_N(RID_SP)|RSET_RANGE(RID_R4,RID_R11+1)|RID2RSET(RID_LR); - *p++ = ARMI_SUB|ARMI_K12|ARMF_D(RID_R12)|ARMF_N(RID_R12)|CALLBACK_MCODE_HEAD; - *p++ = ARMI_STR|ARMI_LS_P|ARMI_LS_W|ARMF_D(RID_R12)|ARMF_N(RID_SP)|(CFRAME_SIZE-4*9); - *p++ = ARMI_LDR|ARMI_LS_P|ARMI_LS_U|ARMF_D(RID_R12)|ARMF_N(RID_PC); - *p++ = ARMI_LDR|ARMI_LS_P|ARMI_LS_U|ARMF_D(RID_PC)|ARMF_N(RID_PC); - *p++ = u32ptr(g); - *p++ = u32ptr(target); - for (slot = 0; slot < CALLBACK_MAX_SLOT; slot++) { - *p++ = ARMI_MOV|ARMF_D(RID_R12)|ARMF_M(RID_PC); - *p = ARMI_B | ((page-p-2) & 0x00ffffffu); - p++; - } - lua_assert(p - page <= CALLBACK_MCODE_SIZE); -} -#elif LJ_TARGET_PPC -static void callback_mcode_init(global_State *g, uint32_t *page) -{ - uint32_t *p = page; - void *target = (void *)lj_vm_ffi_callback; - MSize slot; - *p++ = PPCI_LIS | PPCF_T(RID_TMP) | (u32ptr(target) >> 16); - *p++ = PPCI_LIS | PPCF_T(RID_R12) | (u32ptr(g) >> 16); - *p++ = PPCI_ORI | PPCF_A(RID_TMP)|PPCF_T(RID_TMP) | (u32ptr(target) & 0xffff); - *p++ = PPCI_ORI | PPCF_A(RID_R12)|PPCF_T(RID_R12) | (u32ptr(g) & 0xffff); - *p++ = PPCI_MTCTR | PPCF_T(RID_TMP); - *p++ = PPCI_BCTR; - for (slot = 0; slot < CALLBACK_MAX_SLOT; slot++) { - *p++ = PPCI_LI | PPCF_T(RID_R11) | slot; - *p = PPCI_B | (((page-p) & 0x00ffffffu) << 2); - p++; - } - lua_assert(p - page <= CALLBACK_MCODE_SIZE); -} -#elif LJ_TARGET_MIPS -static void callback_mcode_init(global_State *g, uint32_t *page) -{ - uint32_t *p = page; - void *target = (void *)lj_vm_ffi_callback; - MSize slot; - *p++ = MIPSI_SW | MIPSF_T(RID_R1)|MIPSF_S(RID_SP) | 0; - *p++ = MIPSI_LUI | MIPSF_T(RID_R3) | (u32ptr(target) >> 16); - *p++ = MIPSI_LUI | MIPSF_T(RID_R2) | (u32ptr(g) >> 16); - *p++ = MIPSI_ORI | MIPSF_T(RID_R3)|MIPSF_S(RID_R3) |(u32ptr(target)&0xffff); - *p++ = MIPSI_JR | MIPSF_S(RID_R3); - *p++ = MIPSI_ORI | MIPSF_T(RID_R2)|MIPSF_S(RID_R2) | (u32ptr(g)&0xffff); - for (slot = 0; slot < CALLBACK_MAX_SLOT; slot++) { - *p = MIPSI_B | ((page-p-1) & 0x0000ffffu); - p++; - *p++ = MIPSI_LI | MIPSF_T(RID_R1) | slot; - } - lua_assert(p - page <= CALLBACK_MCODE_SIZE); -} -#else -/* Missing support for this architecture. */ -#define callback_mcode_init(g, p) UNUSED(p) -#endif - -/* -- Machine code management --------------------------------------------- */ - -#if LJ_TARGET_WINDOWS - -#define WIN32_LEAN_AND_MEAN -#include - -#elif LJ_TARGET_POSIX - -#include -#ifndef MAP_ANONYMOUS -#define MAP_ANONYMOUS MAP_ANON -#endif - -#endif - -/* Allocate and initialize area for callback function pointers. */ -static void callback_mcode_new(CTState *cts) -{ - size_t sz = (size_t)CALLBACK_MCODE_SIZE; - void *p; - if (CALLBACK_MAX_SLOT == 0) - lj_err_caller(cts->L, LJ_ERR_FFI_CBACKOV); -#if LJ_TARGET_WINDOWS - p = VirtualAlloc(NULL, sz, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE); - if (!p) - lj_err_caller(cts->L, LJ_ERR_FFI_CBACKOV); -#elif LJ_TARGET_POSIX - p = mmap(NULL, sz, (PROT_READ|PROT_WRITE), MAP_PRIVATE|MAP_ANONYMOUS, - -1, 0); - if (p == MAP_FAILED) - lj_err_caller(cts->L, LJ_ERR_FFI_CBACKOV); -#else - /* Fallback allocator. Fails if memory is not executable by default. */ - p = lj_mem_new(cts->L, sz); -#endif - cts->cb.mcode = p; - callback_mcode_init(cts->g, p); - lj_mcode_sync(p, (char *)p + sz); -#if LJ_TARGET_WINDOWS - { - DWORD oprot; - VirtualProtect(p, sz, PAGE_EXECUTE_READ, &oprot); - } -#elif LJ_TARGET_POSIX - mprotect(p, sz, (PROT_READ|PROT_EXEC)); -#endif -} - -/* Free area for callback function pointers. */ -void lj_ccallback_mcode_free(CTState *cts) -{ - size_t sz = (size_t)CALLBACK_MCODE_SIZE; - void *p = cts->cb.mcode; - if (p == NULL) return; -#if LJ_TARGET_WINDOWS - VirtualFree(p, 0, MEM_RELEASE); - UNUSED(sz); -#elif LJ_TARGET_POSIX - munmap(p, sz); -#else - lj_mem_free(cts->g, p, sz); -#endif -} - -/* -- C callback entry ---------------------------------------------------- */ - -/* Target-specific handling of register arguments. Similar to lj_ccall.c. */ -#if LJ_TARGET_X86 - -#define CALLBACK_HANDLE_REGARG \ - if (!isfp) { /* Only non-FP values may be passed in registers. */ \ - if (n > 1) { /* Anything > 32 bit is passed on the stack. */ \ - if (!LJ_ABI_WIN) ngpr = maxgpr; /* Prevent reordering. */ \ - } else if (ngpr + 1 <= maxgpr) { \ - sp = &cts->cb.gpr[ngpr]; \ - ngpr += n; \ - goto done; \ - } \ - } - -#elif LJ_TARGET_X64 && LJ_ABI_WIN - -/* Windows/x64 argument registers are strictly positional (use ngpr). */ -#define CALLBACK_HANDLE_REGARG \ - if (isfp) { \ - if (ngpr < maxgpr) { sp = &cts->cb.fpr[ngpr++]; UNUSED(nfpr); goto done; } \ - } else { \ - if (ngpr < maxgpr) { sp = &cts->cb.gpr[ngpr++]; goto done; } \ - } - -#elif LJ_TARGET_X64 - -#define CALLBACK_HANDLE_REGARG \ - if (isfp) { \ - if (nfpr + n <= CCALL_NARG_FPR) { \ - sp = &cts->cb.fpr[nfpr]; \ - nfpr += n; \ - goto done; \ - } \ - } else { \ - if (ngpr + n <= maxgpr) { \ - sp = &cts->cb.gpr[ngpr]; \ - ngpr += n; \ - goto done; \ - } \ - } - -#elif LJ_TARGET_ARM - -#if LJ_ABI_SOFTFP - -#define CALLBACK_HANDLE_REGARG_FP1 UNUSED(isfp); -#define CALLBACK_HANDLE_REGARG_FP2 - -#else - -#define CALLBACK_HANDLE_REGARG_FP1 \ - if (isfp) { \ - if (n == 1) { \ - if (fprodd) { \ - sp = &cts->cb.fpr[fprodd-1]; \ - fprodd = 0; \ - goto done; \ - } else if (nfpr + 1 <= CCALL_NARG_FPR) { \ - sp = &cts->cb.fpr[nfpr++]; \ - fprodd = nfpr; \ - goto done; \ - } \ - } else { \ - if (nfpr + 1 <= CCALL_NARG_FPR) { \ - sp = &cts->cb.fpr[nfpr++]; \ - goto done; \ - } \ - } \ - fprodd = 0; /* No reordering after the first FP value is on stack. */ \ - } else { - -#define CALLBACK_HANDLE_REGARG_FP2 } - -#endif - -#define CALLBACK_HANDLE_REGARG \ - CALLBACK_HANDLE_REGARG_FP1 \ - if (n > 1) ngpr = (ngpr + 1u) & ~1u; /* Align to regpair. */ \ - if (ngpr + n <= maxgpr) { \ - sp = &cts->cb.gpr[ngpr]; \ - ngpr += n; \ - goto done; \ - } CALLBACK_HANDLE_REGARG_FP2 - -#elif LJ_TARGET_PPC - -#define CALLBACK_HANDLE_REGARG \ - if (isfp) { \ - if (nfpr + 1 <= CCALL_NARG_FPR) { \ - sp = &cts->cb.fpr[nfpr++]; \ - cta = ctype_get(cts, CTID_DOUBLE); /* FPRs always hold doubles. */ \ - goto done; \ - } \ - } else { /* Try to pass argument in GPRs. */ \ - if (n > 1) { \ - lua_assert(ctype_isinteger(cta->info) && n == 2); /* int64_t. */ \ - ngpr = (ngpr + 1u) & ~1u; /* Align int64_t to regpair. */ \ - } \ - if (ngpr + n <= maxgpr) { \ - sp = &cts->cb.gpr[ngpr]; \ - ngpr += n; \ - goto done; \ - } \ - } - -#define CALLBACK_HANDLE_RET \ - if (ctype_isfp(ctr->info) && ctr->size == sizeof(float)) \ - *(double *)dp = *(float *)dp; /* FPRs always hold doubles. */ - -#elif LJ_TARGET_MIPS - -#define CALLBACK_HANDLE_REGARG \ - if (isfp && nfpr < CCALL_NARG_FPR) { /* Try to pass argument in FPRs. */ \ - sp = (void *)((uint8_t *)&cts->cb.fpr[nfpr] + ((LJ_BE && n==1) ? 4 : 0)); \ - nfpr++; ngpr += n; \ - goto done; \ - } else { /* Try to pass argument in GPRs. */ \ - nfpr = CCALL_NARG_FPR; \ - if (n > 1) ngpr = (ngpr + 1u) & ~1u; /* Align to regpair. */ \ - if (ngpr + n <= maxgpr) { \ - sp = &cts->cb.gpr[ngpr]; \ - ngpr += n; \ - goto done; \ - } \ - } - -#define CALLBACK_HANDLE_RET \ - if (ctype_isfp(ctr->info) && ctr->size == sizeof(float)) \ - ((float *)dp)[1] = *(float *)dp; - -#else -#error "Missing calling convention definitions for this architecture" -#endif - -/* Convert and push callback arguments to Lua stack. */ -static void callback_conv_args(CTState *cts, lua_State *L) -{ - TValue *o = L->top; - intptr_t *stack = cts->cb.stack; - MSize slot = cts->cb.slot; - CTypeID id = 0, rid, fid; - int gcsteps = 0; - CType *ct; - GCfunc *fn; - MSize ngpr = 0, nsp = 0, maxgpr = CCALL_NARG_GPR; -#if CCALL_NARG_FPR - MSize nfpr = 0; -#if LJ_TARGET_ARM - MSize fprodd = 0; -#endif -#endif - - if (slot < cts->cb.sizeid && (id = cts->cb.cbid[slot]) != 0) { - ct = ctype_get(cts, id); - rid = ctype_cid(ct->info); - fn = funcV(lj_tab_getint(cts->miscmap, (int32_t)slot)); - } else { /* Must set up frame first, before throwing the error. */ - ct = NULL; - rid = 0; - fn = (GCfunc *)L; - } - o->u32.lo = LJ_CONT_FFI_CALLBACK; /* Continuation returns from callback. */ - o->u32.hi = rid; /* Return type. x86: +(spadj<<16). */ - o++; - setframe_gc(o, obj2gco(fn)); - setframe_ftsz(o, (int)((char *)(o+1) - (char *)L->base) + FRAME_CONT); - L->top = L->base = ++o; - if (!ct) - lj_err_caller(cts->L, LJ_ERR_FFI_BADCBACK); - if (isluafunc(fn)) - setcframe_pc(L->cframe, proto_bc(funcproto(fn))+1); - lj_state_checkstack(L, LUA_MINSTACK); /* May throw. */ - o = L->base; /* Might have been reallocated. */ - -#if LJ_TARGET_X86 - /* x86 has several different calling conventions. */ - switch (ctype_cconv(ct->info)) { - case CTCC_FASTCALL: maxgpr = 2; break; - case CTCC_THISCALL: maxgpr = 1; break; - default: maxgpr = 0; break; - } -#endif - - fid = ct->sib; - while (fid) { - CType *ctf = ctype_get(cts, fid); - if (!ctype_isattrib(ctf->info)) { - CType *cta; - void *sp; - CTSize sz; - int isfp; - MSize n; - lua_assert(ctype_isfield(ctf->info)); - cta = ctype_rawchild(cts, ctf); - isfp = ctype_isfp(cta->info); - sz = (cta->size + CTSIZE_PTR-1) & ~(CTSIZE_PTR-1); - n = sz / CTSIZE_PTR; /* Number of GPRs or stack slots needed. */ - - CALLBACK_HANDLE_REGARG /* Handle register arguments. */ - - /* Otherwise pass argument on stack. */ - if (CCALL_ALIGN_STACKARG && LJ_32 && sz == 8) - nsp = (nsp + 1) & ~1u; /* Align 64 bit argument on stack. */ - sp = &stack[nsp]; - nsp += n; - - done: - if (LJ_BE && cta->size < CTSIZE_PTR) - sp = (void *)((uint8_t *)sp + CTSIZE_PTR-cta->size); - gcsteps += lj_cconv_tv_ct(cts, cta, 0, o++, sp); - } - fid = ctf->sib; - } - L->top = o; -#if LJ_TARGET_X86 - /* Store stack adjustment for returns from non-cdecl callbacks. */ - if (ctype_cconv(ct->info) != CTCC_CDECL) - (L->base-2)->u32.hi |= (nsp << (16+2)); -#endif - while (gcsteps-- > 0) - lj_gc_check(L); -} - -/* Convert Lua object to callback result. */ -static void callback_conv_result(CTState *cts, lua_State *L, TValue *o) -{ - CType *ctr = ctype_raw(cts, (uint16_t)(L->base-2)->u32.hi); -#if LJ_TARGET_X86 - cts->cb.gpr[2] = 0; -#endif - if (!ctype_isvoid(ctr->info)) { - uint8_t *dp = (uint8_t *)&cts->cb.gpr[0]; -#if CCALL_NUM_FPR - if (ctype_isfp(ctr->info)) - dp = (uint8_t *)&cts->cb.fpr[0]; -#endif - lj_cconv_ct_tv(cts, ctr, dp, o, 0); -#ifdef CALLBACK_HANDLE_RET - CALLBACK_HANDLE_RET -#endif - /* Extend returned integers to (at least) 32 bits. */ - if (ctype_isinteger_or_bool(ctr->info) && ctr->size < 4) { - if (ctr->info & CTF_UNSIGNED) - *(uint32_t *)dp = ctr->size == 1 ? (uint32_t)*(uint8_t *)dp : - (uint32_t)*(uint16_t *)dp; - else - *(int32_t *)dp = ctr->size == 1 ? (int32_t)*(int8_t *)dp : - (int32_t)*(int16_t *)dp; - } -#if LJ_TARGET_X86 - if (ctype_isfp(ctr->info)) - cts->cb.gpr[2] = ctr->size == sizeof(float) ? 1 : 2; -#endif - } -} - -/* Enter callback. */ -lua_State * LJ_FASTCALL lj_ccallback_enter(CTState *cts, void *cf) -{ - lua_State *L = cts->L; - global_State *g = cts->g; - lua_assert(L != NULL); - if (gcref(g->jit_L)) { - setstrV(L, L->top++, lj_err_str(L, LJ_ERR_FFI_BADCBACK)); - if (g->panic) g->panic(L); - exit(EXIT_FAILURE); - } - lj_trace_abort(g); /* Never record across callback. */ - /* Setup C frame. */ - cframe_prev(cf) = L->cframe; - setcframe_L(cf, L); - cframe_errfunc(cf) = -1; - cframe_nres(cf) = 0; - L->cframe = cf; - callback_conv_args(cts, L); - return L; /* Now call the function on this stack. */ -} - -/* Leave callback. */ -void LJ_FASTCALL lj_ccallback_leave(CTState *cts, TValue *o) -{ - lua_State *L = cts->L; - GCfunc *fn; - TValue *obase = L->base; - L->base = L->top; /* Keep continuation frame for throwing errors. */ - if (o >= L->base) { - /* PC of RET* is lost. Point to last line for result conv. errors. */ - fn = curr_func(L); - if (isluafunc(fn)) { - GCproto *pt = funcproto(fn); - setcframe_pc(L->cframe, proto_bc(pt)+pt->sizebc+1); - } - } - callback_conv_result(cts, L, o); - /* Finally drop C frame and continuation frame. */ - L->cframe = cframe_prev(L->cframe); - L->top -= 2; - L->base = obase; - cts->cb.slot = 0; /* Blacklist C function that called the callback. */ -} - -/* -- C callback management ----------------------------------------------- */ - -/* Get an unused slot in the callback slot table. */ -static MSize callback_slot_new(CTState *cts, CType *ct) -{ - CTypeID id = ctype_typeid(cts, ct); - CTypeID1 *cbid = cts->cb.cbid; - MSize top; - for (top = cts->cb.topid; top < cts->cb.sizeid; top++) - if (LJ_LIKELY(cbid[top] == 0)) - goto found; -#if CALLBACK_MAX_SLOT - if (top >= CALLBACK_MAX_SLOT) -#endif - lj_err_caller(cts->L, LJ_ERR_FFI_CBACKOV); - if (!cts->cb.mcode) - callback_mcode_new(cts); - lj_mem_growvec(cts->L, cbid, cts->cb.sizeid, CALLBACK_MAX_SLOT, CTypeID1); - cts->cb.cbid = cbid; - memset(cbid+top, 0, (cts->cb.sizeid-top)*sizeof(CTypeID1)); -found: - cbid[top] = id; - cts->cb.topid = top+1; - return top; -} - -/* Check for function pointer and supported argument/result types. */ -static CType *callback_checkfunc(CTState *cts, CType *ct) -{ - int narg = 0; - if (!ctype_isptr(ct->info) || (LJ_64 && ct->size != CTSIZE_PTR)) - return NULL; - ct = ctype_rawchild(cts, ct); - if (ctype_isfunc(ct->info)) { - CType *ctr = ctype_rawchild(cts, ct); - CTypeID fid = ct->sib; - if (!(ctype_isvoid(ctr->info) || ctype_isenum(ctr->info) || - ctype_isptr(ctr->info) || (ctype_isnum(ctr->info) && ctr->size <= 8))) - return NULL; - if ((ct->info & CTF_VARARG)) - return NULL; - while (fid) { - CType *ctf = ctype_get(cts, fid); - if (!ctype_isattrib(ctf->info)) { - CType *cta; - lua_assert(ctype_isfield(ctf->info)); - cta = ctype_rawchild(cts, ctf); - if (!(ctype_isenum(cta->info) || ctype_isptr(cta->info) || - (ctype_isnum(cta->info) && cta->size <= 8)) || - ++narg >= LUA_MINSTACK-3) - return NULL; - } - fid = ctf->sib; - } - return ct; - } - return NULL; -} - -/* Create a new callback and return the callback function pointer. */ -void *lj_ccallback_new(CTState *cts, CType *ct, GCfunc *fn) -{ - ct = callback_checkfunc(cts, ct); - if (ct) { - MSize slot = callback_slot_new(cts, ct); - GCtab *t = cts->miscmap; - setfuncV(cts->L, lj_tab_setint(cts->L, t, (int32_t)slot), fn); - lj_gc_anybarriert(cts->L, t); - return callback_slot2ptr(cts, slot); - } - return NULL; /* Bad conversion. */ -} - -#endif diff --git a/deps/luajit/src/lj_ccallback.h b/deps/luajit/src/lj_ccallback.h deleted file mode 100644 index 83dbe048..00000000 --- a/deps/luajit/src/lj_ccallback.h +++ /dev/null @@ -1,25 +0,0 @@ -/* -** FFI C callback handling. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#ifndef _LJ_CCALLBACK_H -#define _LJ_CCALLBACK_H - -#include "lj_obj.h" -#include "lj_ctype.h" - -#if LJ_HASFFI - -/* Really belongs to lj_vm.h. */ -LJ_ASMF void lj_vm_ffi_callback(void); - -LJ_FUNC MSize lj_ccallback_ptr2slot(CTState *cts, void *p); -LJ_FUNCA lua_State * LJ_FASTCALL lj_ccallback_enter(CTState *cts, void *cf); -LJ_FUNCA void LJ_FASTCALL lj_ccallback_leave(CTState *cts, TValue *o); -LJ_FUNC void *lj_ccallback_new(CTState *cts, CType *ct, GCfunc *fn); -LJ_FUNC void lj_ccallback_mcode_free(CTState *cts); - -#endif - -#endif diff --git a/deps/luajit/src/lj_cconv.c b/deps/luajit/src/lj_cconv.c deleted file mode 100644 index 8a270766..00000000 --- a/deps/luajit/src/lj_cconv.c +++ /dev/null @@ -1,752 +0,0 @@ -/* -** C type conversions. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#include "lj_obj.h" - -#if LJ_HASFFI - -#include "lj_err.h" -#include "lj_tab.h" -#include "lj_ctype.h" -#include "lj_cdata.h" -#include "lj_cconv.h" -#include "lj_ccallback.h" - -/* -- Conversion errors --------------------------------------------------- */ - -/* Bad conversion. */ -LJ_NORET static void cconv_err_conv(CTState *cts, CType *d, CType *s, - CTInfo flags) -{ - const char *dst = strdata(lj_ctype_repr(cts->L, ctype_typeid(cts, d), NULL)); - const char *src; - if ((flags & CCF_FROMTV)) - src = lj_obj_typename[1+(ctype_isnum(s->info) ? LUA_TNUMBER : - ctype_isarray(s->info) ? LUA_TSTRING : LUA_TNIL)]; - else - src = strdata(lj_ctype_repr(cts->L, ctype_typeid(cts, s), NULL)); - if (CCF_GETARG(flags)) - lj_err_argv(cts->L, CCF_GETARG(flags), LJ_ERR_FFI_BADCONV, src, dst); - else - lj_err_callerv(cts->L, LJ_ERR_FFI_BADCONV, src, dst); -} - -/* Bad conversion from TValue. */ -LJ_NORET static void cconv_err_convtv(CTState *cts, CType *d, TValue *o, - CTInfo flags) -{ - const char *dst = strdata(lj_ctype_repr(cts->L, ctype_typeid(cts, d), NULL)); - const char *src = lj_typename(o); - if (CCF_GETARG(flags)) - lj_err_argv(cts->L, CCF_GETARG(flags), LJ_ERR_FFI_BADCONV, src, dst); - else - lj_err_callerv(cts->L, LJ_ERR_FFI_BADCONV, src, dst); -} - -/* Initializer overflow. */ -LJ_NORET static void cconv_err_initov(CTState *cts, CType *d) -{ - const char *dst = strdata(lj_ctype_repr(cts->L, ctype_typeid(cts, d), NULL)); - lj_err_callerv(cts->L, LJ_ERR_FFI_INITOV, dst); -} - -/* -- C type compatibility checks ----------------------------------------- */ - -/* Get raw type and qualifiers for a child type. Resolves enums, too. */ -static CType *cconv_childqual(CTState *cts, CType *ct, CTInfo *qual) -{ - ct = ctype_child(cts, ct); - for (;;) { - if (ctype_isattrib(ct->info)) { - if (ctype_attrib(ct->info) == CTA_QUAL) *qual |= ct->size; - } else if (!ctype_isenum(ct->info)) { - break; - } - ct = ctype_child(cts, ct); - } - *qual |= (ct->info & CTF_QUAL); - return ct; -} - -/* Check for compatible types when converting to a pointer. -** Note: these checks are more relaxed than what C99 mandates. -*/ -int lj_cconv_compatptr(CTState *cts, CType *d, CType *s, CTInfo flags) -{ - if (!((flags & CCF_CAST) || d == s)) { - CTInfo dqual = 0, squal = 0; - d = cconv_childqual(cts, d, &dqual); - if (!ctype_isstruct(s->info)) - s = cconv_childqual(cts, s, &squal); - if ((flags & CCF_SAME)) { - if (dqual != squal) - return 0; /* Different qualifiers. */ - } else if (!(flags & CCF_IGNQUAL)) { - if ((dqual & squal) != squal) - return 0; /* Discarded qualifiers. */ - if (ctype_isvoid(d->info) || ctype_isvoid(s->info)) - return 1; /* Converting to/from void * is always ok. */ - } - if (ctype_type(d->info) != ctype_type(s->info) || - d->size != s->size) - return 0; /* Different type or different size. */ - if (ctype_isnum(d->info)) { - if (((d->info ^ s->info) & (CTF_BOOL|CTF_FP))) - return 0; /* Different numeric types. */ - } else if (ctype_ispointer(d->info)) { - /* Check child types for compatibility. */ - return lj_cconv_compatptr(cts, d, s, flags|CCF_SAME); - } else if (ctype_isstruct(d->info)) { - if (d != s) - return 0; /* Must be exact same type for struct/union. */ - } else if (ctype_isfunc(d->info)) { - /* NYI: structural equality of functions. */ - } - } - return 1; /* Types are compatible. */ -} - -/* -- C type to C type conversion ----------------------------------------- */ - -/* Convert C type to C type. Caveat: expects to get the raw CType! -** -** Note: This is only used by the interpreter and not optimized at all. -** The JIT compiler will do a much better job specializing for each case. -*/ -void lj_cconv_ct_ct(CTState *cts, CType *d, CType *s, - uint8_t *dp, uint8_t *sp, CTInfo flags) -{ - CTSize dsize = d->size, ssize = s->size; - CTInfo dinfo = d->info, sinfo = s->info; - void *tmpptr; - - lua_assert(!ctype_isenum(dinfo) && !ctype_isenum(sinfo)); - lua_assert(!ctype_isattrib(dinfo) && !ctype_isattrib(sinfo)); - - if (ctype_type(dinfo) > CT_MAYCONVERT || ctype_type(sinfo) > CT_MAYCONVERT) - goto err_conv; - - /* Some basic sanity checks. */ - lua_assert(!ctype_isnum(dinfo) || dsize > 0); - lua_assert(!ctype_isnum(sinfo) || ssize > 0); - lua_assert(!ctype_isbool(dinfo) || dsize == 1 || dsize == 4); - lua_assert(!ctype_isbool(sinfo) || ssize == 1 || ssize == 4); - lua_assert(!ctype_isinteger(dinfo) || (1u< ssize) { /* Zero-extend or sign-extend LSB. */ -#if LJ_LE - uint8_t fill = (!(sinfo & CTF_UNSIGNED) && (sp[ssize-1]&0x80)) ? 0xff : 0; - memcpy(dp, sp, ssize); - memset(dp + ssize, fill, dsize-ssize); -#else - uint8_t fill = (!(sinfo & CTF_UNSIGNED) && (sp[0]&0x80)) ? 0xff : 0; - memset(dp, fill, dsize-ssize); - memcpy(dp + (dsize-ssize), sp, ssize); -#endif - } else { /* Copy LSB. */ -#if LJ_LE - memcpy(dp, sp, dsize); -#else - memcpy(dp, sp + (ssize-dsize), dsize); -#endif - } - break; - case CCX(I, F): { - double n; /* Always convert via double. */ - conv_I_F: - /* Convert source to double. */ - if (ssize == sizeof(double)) n = *(double *)sp; - else if (ssize == sizeof(float)) n = (double)*(float *)sp; - else goto err_conv; /* NYI: long double. */ - /* Then convert double to integer. */ - /* The conversion must exactly match the semantics of JIT-compiled code! */ - if (dsize < 4 || (dsize == 4 && !(dinfo & CTF_UNSIGNED))) { - int32_t i = (int32_t)n; - if (dsize == 4) *(int32_t *)dp = i; - else if (dsize == 2) *(int16_t *)dp = (int16_t)i; - else *(int8_t *)dp = (int8_t)i; - } else if (dsize == 4) { - *(uint32_t *)dp = (uint32_t)n; - } else if (dsize == 8) { - if (!(dinfo & CTF_UNSIGNED)) - *(int64_t *)dp = (int64_t)n; - else - *(uint64_t *)dp = lj_num2u64(n); - } else { - goto err_conv; /* NYI: conversion to >64 bit integers. */ - } - break; - } - case CCX(I, C): - s = ctype_child(cts, s); - sinfo = s->info; - ssize = s->size; - goto conv_I_F; /* Just convert re. */ - case CCX(I, P): - if (!(flags & CCF_CAST)) goto err_conv; - sinfo = CTINFO(CT_NUM, CTF_UNSIGNED); - goto conv_I_I; - case CCX(I, A): - if (!(flags & CCF_CAST)) goto err_conv; - sinfo = CTINFO(CT_NUM, CTF_UNSIGNED); - ssize = CTSIZE_PTR; - tmpptr = sp; - sp = (uint8_t *)&tmpptr; - goto conv_I_I; - - /* Destination is a floating-point number. */ - case CCX(F, B): - case CCX(F, I): { - double n; /* Always convert via double. */ - conv_F_I: - /* First convert source to double. */ - /* The conversion must exactly match the semantics of JIT-compiled code! */ - if (ssize < 4 || (ssize == 4 && !(sinfo & CTF_UNSIGNED))) { - int32_t i; - if (ssize == 4) { - i = *(int32_t *)sp; - } else if (!(sinfo & CTF_UNSIGNED)) { - if (ssize == 2) i = *(int16_t *)sp; - else i = *(int8_t *)sp; - } else { - if (ssize == 2) i = *(uint16_t *)sp; - else i = *(uint8_t *)sp; - } - n = (double)i; - } else if (ssize == 4) { - n = (double)*(uint32_t *)sp; - } else if (ssize == 8) { - if (!(sinfo & CTF_UNSIGNED)) n = (double)*(int64_t *)sp; - else n = (double)*(uint64_t *)sp; - } else { - goto err_conv; /* NYI: conversion from >64 bit integers. */ - } - /* Convert double to destination. */ - if (dsize == sizeof(double)) *(double *)dp = n; - else if (dsize == sizeof(float)) *(float *)dp = (float)n; - else goto err_conv; /* NYI: long double. */ - break; - } - case CCX(F, F): { - double n; /* Always convert via double. */ - conv_F_F: - if (ssize == dsize) goto copyval; - /* Convert source to double. */ - if (ssize == sizeof(double)) n = *(double *)sp; - else if (ssize == sizeof(float)) n = (double)*(float *)sp; - else goto err_conv; /* NYI: long double. */ - /* Convert double to destination. */ - if (dsize == sizeof(double)) *(double *)dp = n; - else if (dsize == sizeof(float)) *(float *)dp = (float)n; - else goto err_conv; /* NYI: long double. */ - break; - } - case CCX(F, C): - s = ctype_child(cts, s); - sinfo = s->info; - ssize = s->size; - goto conv_F_F; /* Ignore im, and convert from re. */ - - /* Destination is a complex number. */ - case CCX(C, I): - d = ctype_child(cts, d); - dinfo = d->info; - dsize = d->size; - memset(dp + dsize, 0, dsize); /* Clear im. */ - goto conv_F_I; /* Convert to re. */ - case CCX(C, F): - d = ctype_child(cts, d); - dinfo = d->info; - dsize = d->size; - memset(dp + dsize, 0, dsize); /* Clear im. */ - goto conv_F_F; /* Convert to re. */ - - case CCX(C, C): - if (dsize != ssize) { /* Different types: convert re/im separately. */ - CType *dc = ctype_child(cts, d); - CType *sc = ctype_child(cts, s); - lj_cconv_ct_ct(cts, dc, sc, dp, sp, flags); - lj_cconv_ct_ct(cts, dc, sc, dp + dc->size, sp + sc->size, flags); - return; - } - goto copyval; /* Otherwise this is easy. */ - - /* Destination is a vector. */ - case CCX(V, I): - case CCX(V, F): - case CCX(V, C): { - CType *dc = ctype_child(cts, d); - CTSize esize; - /* First convert the scalar to the first element. */ - lj_cconv_ct_ct(cts, dc, s, dp, sp, flags); - /* Then replicate it to the other elements (splat). */ - for (sp = dp, esize = dc->size; dsize > esize; dsize -= esize) { - dp += esize; - memcpy(dp, sp, esize); - } - break; - } - - case CCX(V, V): - /* Copy same-sized vectors, even for different lengths/element-types. */ - if (dsize != ssize) goto err_conv; - goto copyval; - - /* Destination is a pointer. */ - case CCX(P, I): - if (!(flags & CCF_CAST)) goto err_conv; - dinfo = CTINFO(CT_NUM, CTF_UNSIGNED); - goto conv_I_I; - - case CCX(P, F): - if (!(flags & CCF_CAST) || !(flags & CCF_FROMTV)) goto err_conv; - /* The signed conversion is cheaper. x64 really has 47 bit pointers. */ - dinfo = CTINFO(CT_NUM, (LJ_64 && dsize == 8) ? 0 : CTF_UNSIGNED); - goto conv_I_F; - - case CCX(P, P): - if (!lj_cconv_compatptr(cts, d, s, flags)) goto err_conv; - cdata_setptr(dp, dsize, cdata_getptr(sp, ssize)); - break; - - case CCX(P, A): - case CCX(P, S): - if (!lj_cconv_compatptr(cts, d, s, flags)) goto err_conv; - cdata_setptr(dp, dsize, sp); - break; - - /* Destination is an array. */ - case CCX(A, A): - if ((flags & CCF_CAST) || (d->info & CTF_VLA) || dsize != ssize || - d->size == CTSIZE_INVALID || !lj_cconv_compatptr(cts, d, s, flags)) - goto err_conv; - goto copyval; - - /* Destination is a struct/union. */ - case CCX(S, S): - if ((flags & CCF_CAST) || (d->info & CTF_VLA) || d != s) - goto err_conv; /* Must be exact same type. */ -copyval: /* Copy value. */ - lua_assert(dsize == ssize); - memcpy(dp, sp, dsize); - break; - - default: - err_conv: - cconv_err_conv(cts, d, s, flags); - } -} - -/* -- C type to TValue conversion ----------------------------------------- */ - -/* Convert C type to TValue. Caveat: expects to get the raw CType! */ -int lj_cconv_tv_ct(CTState *cts, CType *s, CTypeID sid, - TValue *o, uint8_t *sp) -{ - CTInfo sinfo = s->info; - if (ctype_isnum(sinfo)) { - if (!ctype_isbool(sinfo)) { - if (ctype_isinteger(sinfo) && s->size > 4) goto copyval; - if (LJ_DUALNUM && ctype_isinteger(sinfo)) { - int32_t i; - lj_cconv_ct_ct(cts, ctype_get(cts, CTID_INT32), s, - (uint8_t *)&i, sp, 0); - if ((sinfo & CTF_UNSIGNED) && i < 0) - setnumV(o, (lua_Number)(uint32_t)i); - else - setintV(o, i); - } else { - lj_cconv_ct_ct(cts, ctype_get(cts, CTID_DOUBLE), s, - (uint8_t *)&o->n, sp, 0); - /* Numbers are NOT canonicalized here! Beware of uninitialized data. */ - lua_assert(tvisnum(o)); - } - } else { - uint32_t b = s->size == 1 ? (*sp != 0) : (*(int *)sp != 0); - setboolV(o, b); - setboolV(&cts->g->tmptv2, b); /* Remember for trace recorder. */ - } - return 0; - } else if (ctype_isrefarray(sinfo) || ctype_isstruct(sinfo)) { - /* Create reference. */ - setcdataV(cts->L, o, lj_cdata_newref(cts, sp, sid)); - return 1; /* Need GC step. */ - } else { - GCcdata *cd; - CTSize sz; - copyval: /* Copy value. */ - sz = s->size; - lua_assert(sz != CTSIZE_INVALID); - /* Attributes are stripped, qualifiers are kept (but mostly ignored). */ - cd = lj_cdata_new(cts, ctype_typeid(cts, s), sz); - setcdataV(cts->L, o, cd); - memcpy(cdataptr(cd), sp, sz); - return 1; /* Need GC step. */ - } -} - -/* Convert bitfield to TValue. */ -int lj_cconv_tv_bf(CTState *cts, CType *s, TValue *o, uint8_t *sp) -{ - CTInfo info = s->info; - CTSize pos, bsz; - uint32_t val; - lua_assert(ctype_isbitfield(info)); - /* NYI: packed bitfields may cause misaligned reads. */ - switch (ctype_bitcsz(info)) { - case 4: val = *(uint32_t *)sp; break; - case 2: val = *(uint16_t *)sp; break; - case 1: val = *(uint8_t *)sp; break; - default: lua_assert(0); val = 0; break; - } - /* Check if a packed bitfield crosses a container boundary. */ - pos = ctype_bitpos(info); - bsz = ctype_bitbsz(info); - lua_assert(pos < 8*ctype_bitcsz(info)); - lua_assert(bsz > 0 && bsz <= 8*ctype_bitcsz(info)); - if (pos + bsz > 8*ctype_bitcsz(info)) - lj_err_caller(cts->L, LJ_ERR_FFI_NYIPACKBIT); - if (!(info & CTF_BOOL)) { - CTSize shift = 32 - bsz; - if (!(info & CTF_UNSIGNED)) { - setintV(o, (int32_t)(val << (shift-pos)) >> shift); - } else { - val = (val << (shift-pos)) >> shift; - if (!LJ_DUALNUM || (int32_t)val < 0) - setnumV(o, (lua_Number)(uint32_t)val); - else - setintV(o, (int32_t)val); - } - } else { - lua_assert(bsz == 1); - setboolV(o, (val >> pos) & 1); - } - return 0; /* No GC step needed. */ -} - -/* -- TValue to C type conversion ----------------------------------------- */ - -/* Convert table to array. */ -static void cconv_array_tab(CTState *cts, CType *d, - uint8_t *dp, GCtab *t, CTInfo flags) -{ - int32_t i; - CType *dc = ctype_rawchild(cts, d); /* Array element type. */ - CTSize size = d->size, esize = dc->size, ofs = 0; - for (i = 0; ; i++) { - TValue *tv = (TValue *)lj_tab_getint(t, i); - if (!tv || tvisnil(tv)) { - if (i == 0) continue; /* Try again for 1-based tables. */ - break; /* Stop at first nil. */ - } - if (ofs >= size) - cconv_err_initov(cts, d); - lj_cconv_ct_tv(cts, dc, dp + ofs, tv, flags); - ofs += esize; - } - if (size != CTSIZE_INVALID) { /* Only fill up arrays with known size. */ - if (ofs == esize) { /* Replicate a single element. */ - for (; ofs < size; ofs += esize) memcpy(dp + ofs, dp, esize); - } else { /* Otherwise fill the remainder with zero. */ - memset(dp + ofs, 0, size - ofs); - } - } -} - -/* Convert table to sub-struct/union. */ -static void cconv_substruct_tab(CTState *cts, CType *d, uint8_t *dp, - GCtab *t, int32_t *ip, CTInfo flags) -{ - CTypeID id = d->sib; - while (id) { - CType *df = ctype_get(cts, id); - id = df->sib; - if (ctype_isfield(df->info) || ctype_isbitfield(df->info)) { - TValue *tv; - int32_t i = *ip, iz = i; - if (!gcref(df->name)) continue; /* Ignore unnamed fields. */ - if (i >= 0) { - retry: - tv = (TValue *)lj_tab_getint(t, i); - if (!tv || tvisnil(tv)) { - if (i == 0) { i = 1; goto retry; } /* 1-based tables. */ - if (iz == 0) { *ip = i = -1; goto tryname; } /* Init named fields. */ - break; /* Stop at first nil. */ - } - *ip = i + 1; - } else { - tryname: - tv = (TValue *)lj_tab_getstr(t, gco2str(gcref(df->name))); - if (!tv || tvisnil(tv)) continue; - } - if (ctype_isfield(df->info)) - lj_cconv_ct_tv(cts, ctype_rawchild(cts, df), dp+df->size, tv, flags); - else - lj_cconv_bf_tv(cts, df, dp+df->size, tv); - if ((d->info & CTF_UNION)) break; - } else if (ctype_isxattrib(df->info, CTA_SUBTYPE)) { - cconv_substruct_tab(cts, ctype_rawchild(cts, df), - dp+df->size, t, ip, flags); - } /* Ignore all other entries in the chain. */ - } -} - -/* Convert table to struct/union. */ -static void cconv_struct_tab(CTState *cts, CType *d, - uint8_t *dp, GCtab *t, CTInfo flags) -{ - int32_t i = 0; - memset(dp, 0, d->size); /* Much simpler to clear the struct first. */ - cconv_substruct_tab(cts, d, dp, t, &i, flags); -} - -/* Convert TValue to C type. Caveat: expects to get the raw CType! */ -void lj_cconv_ct_tv(CTState *cts, CType *d, - uint8_t *dp, TValue *o, CTInfo flags) -{ - CTypeID sid = CTID_P_VOID; - CType *s; - void *tmpptr; - uint8_t tmpbool, *sp = (uint8_t *)&tmpptr; - if (LJ_LIKELY(tvisint(o))) { - sp = (uint8_t *)&o->i; - sid = CTID_INT32; - flags |= CCF_FROMTV; - } else if (LJ_LIKELY(tvisnum(o))) { - sp = (uint8_t *)&o->n; - sid = CTID_DOUBLE; - flags |= CCF_FROMTV; - } else if (tviscdata(o)) { - sp = cdataptr(cdataV(o)); - sid = cdataV(o)->ctypeid; - s = ctype_get(cts, sid); - if (ctype_isref(s->info)) { /* Resolve reference for value. */ - lua_assert(s->size == CTSIZE_PTR); - sp = *(void **)sp; - sid = ctype_cid(s->info); - } - s = ctype_raw(cts, sid); - if (ctype_isfunc(s->info)) { - sid = lj_ctype_intern(cts, CTINFO(CT_PTR, CTALIGN_PTR|sid), CTSIZE_PTR); - } else { - if (ctype_isenum(s->info)) s = ctype_child(cts, s); - goto doconv; - } - } else if (tvisstr(o)) { - GCstr *str = strV(o); - if (ctype_isenum(d->info)) { /* Match string against enum constant. */ - CTSize ofs; - CType *cct = lj_ctype_getfield(cts, d, str, &ofs); - if (!cct || !ctype_isconstval(cct->info)) - goto err_conv; - lua_assert(d->size == 4); - sp = (uint8_t *)&cct->size; - sid = ctype_cid(cct->info); - } else if (ctype_isrefarray(d->info)) { /* Copy string to array. */ - CType *dc = ctype_rawchild(cts, d); - CTSize sz = str->len+1; - if (!ctype_isinteger(dc->info) || dc->size != 1) - goto err_conv; - if (d->size != 0 && d->size < sz) - sz = d->size; - memcpy(dp, strdata(str), sz); - return; - } else { /* Otherwise pass it as a const char[]. */ - sp = (uint8_t *)strdata(str); - sid = CTID_A_CCHAR; - flags |= CCF_FROMTV; - } - } else if (tvistab(o)) { - if (ctype_isarray(d->info)) { - cconv_array_tab(cts, d, dp, tabV(o), flags); - return; - } else if (ctype_isstruct(d->info)) { - cconv_struct_tab(cts, d, dp, tabV(o), flags); - return; - } else { - goto err_conv; - } - } else if (tvisbool(o)) { - tmpbool = boolV(o); - sp = &tmpbool; - sid = CTID_BOOL; - } else if (tvisnil(o)) { - tmpptr = (void *)0; - flags |= CCF_FROMTV; - } else if (tvisudata(o)) { - GCudata *ud = udataV(o); - tmpptr = uddata(ud); - if (ud->udtype == UDTYPE_IO_FILE) - tmpptr = *(void **)tmpptr; - } else if (tvislightud(o)) { - tmpptr = lightudV(o); - } else if (tvisfunc(o)) { - void *p = lj_ccallback_new(cts, d, funcV(o)); - if (p) { - *(void **)dp = p; - return; - } - goto err_conv; - } else { - err_conv: - cconv_err_convtv(cts, d, o, flags); - } - s = ctype_get(cts, sid); -doconv: - if (ctype_isenum(d->info)) d = ctype_child(cts, d); - lj_cconv_ct_ct(cts, d, s, dp, sp, flags); -} - -/* Convert TValue to bitfield. */ -void lj_cconv_bf_tv(CTState *cts, CType *d, uint8_t *dp, TValue *o) -{ - CTInfo info = d->info; - CTSize pos, bsz; - uint32_t val, mask; - lua_assert(ctype_isbitfield(info)); - if ((info & CTF_BOOL)) { - uint8_t tmpbool; - lua_assert(ctype_bitbsz(info) == 1); - lj_cconv_ct_tv(cts, ctype_get(cts, CTID_BOOL), &tmpbool, o, 0); - val = tmpbool; - } else { - CTypeID did = (info & CTF_UNSIGNED) ? CTID_UINT32 : CTID_INT32; - lj_cconv_ct_tv(cts, ctype_get(cts, did), (uint8_t *)&val, o, 0); - } - pos = ctype_bitpos(info); - bsz = ctype_bitbsz(info); - lua_assert(pos < 8*ctype_bitcsz(info)); - lua_assert(bsz > 0 && bsz <= 8*ctype_bitcsz(info)); - /* Check if a packed bitfield crosses a container boundary. */ - if (pos + bsz > 8*ctype_bitcsz(info)) - lj_err_caller(cts->L, LJ_ERR_FFI_NYIPACKBIT); - mask = ((1u << bsz) - 1u) << pos; - val = (val << pos) & mask; - /* NYI: packed bitfields may cause misaligned reads/writes. */ - switch (ctype_bitcsz(info)) { - case 4: *(uint32_t *)dp = (*(uint32_t *)dp & ~mask) | (uint32_t)val; break; - case 2: *(uint16_t *)dp = (*(uint16_t *)dp & ~mask) | (uint16_t)val; break; - case 1: *(uint8_t *)dp = (*(uint8_t *)dp & ~mask) | (uint8_t)val; break; - default: lua_assert(0); break; - } -} - -/* -- Initialize C type with TValues -------------------------------------- */ - -/* Initialize an array with TValues. */ -static void cconv_array_init(CTState *cts, CType *d, CTSize sz, uint8_t *dp, - TValue *o, MSize len) -{ - CType *dc = ctype_rawchild(cts, d); /* Array element type. */ - CTSize ofs, esize = dc->size; - MSize i; - if (len*esize > sz) - cconv_err_initov(cts, d); - for (i = 0, ofs = 0; i < len; i++, ofs += esize) - lj_cconv_ct_tv(cts, dc, dp + ofs, o + i, 0); - if (ofs == esize) { /* Replicate a single element. */ - for (; ofs < sz; ofs += esize) memcpy(dp + ofs, dp, esize); - } else { /* Otherwise fill the remainder with zero. */ - memset(dp + ofs, 0, sz - ofs); - } -} - -/* Initialize a sub-struct/union with TValues. */ -static void cconv_substruct_init(CTState *cts, CType *d, uint8_t *dp, - TValue *o, MSize len, MSize *ip) -{ - CTypeID id = d->sib; - while (id) { - CType *df = ctype_get(cts, id); - id = df->sib; - if (ctype_isfield(df->info) || ctype_isbitfield(df->info)) { - MSize i = *ip; - if (!gcref(df->name)) continue; /* Ignore unnamed fields. */ - if (i >= len) break; - *ip = i + 1; - if (ctype_isfield(df->info)) - lj_cconv_ct_tv(cts, ctype_rawchild(cts, df), dp+df->size, o + i, 0); - else - lj_cconv_bf_tv(cts, df, dp+df->size, o + i); - if ((d->info & CTF_UNION)) break; - } else if (ctype_isxattrib(df->info, CTA_SUBTYPE)) { - cconv_substruct_init(cts, ctype_rawchild(cts, df), - dp+df->size, o, len, ip); - if ((d->info & CTF_UNION)) break; - } /* Ignore all other entries in the chain. */ - } -} - -/* Initialize a struct/union with TValues. */ -static void cconv_struct_init(CTState *cts, CType *d, CTSize sz, uint8_t *dp, - TValue *o, MSize len) -{ - MSize i = 0; - memset(dp, 0, sz); /* Much simpler to clear the struct first. */ - cconv_substruct_init(cts, d, dp, o, len, &i); - if (i < len) - cconv_err_initov(cts, d); -} - -/* Check whether to use a multi-value initializer. -** This is true if an aggregate is to be initialized with a value. -** Valarrays are treated as values here so ct_tv handles (V|C, I|F). -*/ -int lj_cconv_multi_init(CTState *cts, CType *d, TValue *o) -{ - if (!(ctype_isrefarray(d->info) || ctype_isstruct(d->info))) - return 0; /* Destination is not an aggregate. */ - if (tvistab(o) || (tvisstr(o) && !ctype_isstruct(d->info))) - return 0; /* Initializer is not a value. */ - if (tviscdata(o) && lj_ctype_rawref(cts, cdataV(o)->ctypeid) == d) - return 0; /* Source and destination are identical aggregates. */ - return 1; /* Otherwise the initializer is a value. */ -} - -/* Initialize C type with TValues. Caveat: expects to get the raw CType! */ -void lj_cconv_ct_init(CTState *cts, CType *d, CTSize sz, - uint8_t *dp, TValue *o, MSize len) -{ - if (len == 0) - memset(dp, 0, sz); - else if (len == 1 && !lj_cconv_multi_init(cts, d, o)) - lj_cconv_ct_tv(cts, d, dp, o, 0); - else if (ctype_isarray(d->info)) /* Also handles valarray init with len>1. */ - cconv_array_init(cts, d, sz, dp, o, len); - else if (ctype_isstruct(d->info)) - cconv_struct_init(cts, d, sz, dp, o, len); - else - cconv_err_initov(cts, d); -} - -#endif diff --git a/deps/luajit/src/lj_cconv.h b/deps/luajit/src/lj_cconv.h deleted file mode 100644 index 2bd50ff4..00000000 --- a/deps/luajit/src/lj_cconv.h +++ /dev/null @@ -1,70 +0,0 @@ -/* -** C type conversions. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#ifndef _LJ_CCONV_H -#define _LJ_CCONV_H - -#include "lj_obj.h" -#include "lj_ctype.h" - -#if LJ_HASFFI - -/* Compressed C type index. ORDER CCX. */ -enum { - CCX_B, /* Bool. */ - CCX_I, /* Integer. */ - CCX_F, /* Floating-point number. */ - CCX_C, /* Complex. */ - CCX_V, /* Vector. */ - CCX_P, /* Pointer. */ - CCX_A, /* Refarray. */ - CCX_S /* Struct/union. */ -}; - -/* Convert C type info to compressed C type index. ORDER CT. ORDER CCX. */ -static LJ_AINLINE uint32_t cconv_idx(CTInfo info) -{ - uint32_t idx = ((info >> 26) & 15u); /* Dispatch bits. */ - lua_assert(ctype_type(info) <= CT_MAYCONVERT); -#if LJ_64 - idx = ((uint32_t)(U64x(f436fff5,fff7f021) >> 4*idx) & 15u); -#else - idx = (((idx < 8 ? 0xfff7f021u : 0xf436fff5) >> 4*(idx & 7u)) & 15u); -#endif - lua_assert(idx < 8); - return idx; -} - -#define cconv_idx2(dinfo, sinfo) \ - ((cconv_idx((dinfo)) << 3) + cconv_idx((sinfo))) - -#define CCX(dst, src) ((CCX_##dst << 3) + CCX_##src) - -/* Conversion flags. */ -#define CCF_CAST 0x00000001u -#define CCF_FROMTV 0x00000002u -#define CCF_SAME 0x00000004u -#define CCF_IGNQUAL 0x00000008u - -#define CCF_ARG_SHIFT 8 -#define CCF_ARG(n) ((n) << CCF_ARG_SHIFT) -#define CCF_GETARG(f) ((f) >> CCF_ARG_SHIFT) - -LJ_FUNC int lj_cconv_compatptr(CTState *cts, CType *d, CType *s, CTInfo flags); -LJ_FUNC void lj_cconv_ct_ct(CTState *cts, CType *d, CType *s, - uint8_t *dp, uint8_t *sp, CTInfo flags); -LJ_FUNC int lj_cconv_tv_ct(CTState *cts, CType *s, CTypeID sid, - TValue *o, uint8_t *sp); -LJ_FUNC int lj_cconv_tv_bf(CTState *cts, CType *s, TValue *o, uint8_t *sp); -LJ_FUNC void lj_cconv_ct_tv(CTState *cts, CType *d, - uint8_t *dp, TValue *o, CTInfo flags); -LJ_FUNC void lj_cconv_bf_tv(CTState *cts, CType *d, uint8_t *dp, TValue *o); -LJ_FUNC int lj_cconv_multi_init(CTState *cts, CType *d, TValue *o); -LJ_FUNC void lj_cconv_ct_init(CTState *cts, CType *d, CTSize sz, - uint8_t *dp, TValue *o, MSize len); - -#endif - -#endif diff --git a/deps/luajit/src/lj_cdata.c b/deps/luajit/src/lj_cdata.c deleted file mode 100644 index 39fc13a9..00000000 --- a/deps/luajit/src/lj_cdata.c +++ /dev/null @@ -1,285 +0,0 @@ -/* -** C data management. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#include "lj_obj.h" - -#if LJ_HASFFI - -#include "lj_gc.h" -#include "lj_err.h" -#include "lj_str.h" -#include "lj_tab.h" -#include "lj_ctype.h" -#include "lj_cconv.h" -#include "lj_cdata.h" - -/* -- C data allocation --------------------------------------------------- */ - -/* Allocate a new C data object holding a reference to another object. */ -GCcdata *lj_cdata_newref(CTState *cts, const void *p, CTypeID id) -{ - CTypeID refid = lj_ctype_intern(cts, CTINFO_REF(id), CTSIZE_PTR); - GCcdata *cd = lj_cdata_new(cts, refid, CTSIZE_PTR); - *(const void **)cdataptr(cd) = p; - return cd; -} - -/* Allocate variable-sized or specially aligned C data object. */ -GCcdata *lj_cdata_newv(CTState *cts, CTypeID id, CTSize sz, CTSize align) -{ - global_State *g; - MSize extra = sizeof(GCcdataVar) + sizeof(GCcdata) + - (align > CT_MEMALIGN ? (1u<L, extra + sz, char); - uintptr_t adata = (uintptr_t)p + sizeof(GCcdataVar) + sizeof(GCcdata); - uintptr_t almask = (1u << align) - 1u; - GCcdata *cd = (GCcdata *)(((adata + almask) & ~almask) - sizeof(GCcdata)); - lua_assert((char *)cd - p < 65536); - cdatav(cd)->offset = (uint16_t)((char *)cd - p); - cdatav(cd)->extra = extra; - cdatav(cd)->len = sz; - g = cts->g; - setgcrefr(cd->nextgc, g->gc.root); - setgcref(g->gc.root, obj2gco(cd)); - newwhite(g, obj2gco(cd)); - cd->marked |= 0x80; - cd->gct = ~LJ_TCDATA; - cd->ctypeid = id; - return cd; -} - -/* Free a C data object. */ -void LJ_FASTCALL lj_cdata_free(global_State *g, GCcdata *cd) -{ - if (LJ_UNLIKELY(cd->marked & LJ_GC_CDATA_FIN)) { - GCobj *root; - makewhite(g, obj2gco(cd)); - markfinalized(obj2gco(cd)); - if ((root = gcref(g->gc.mmudata)) != NULL) { - setgcrefr(cd->nextgc, root->gch.nextgc); - setgcref(root->gch.nextgc, obj2gco(cd)); - setgcref(g->gc.mmudata, obj2gco(cd)); - } else { - setgcref(cd->nextgc, obj2gco(cd)); - setgcref(g->gc.mmudata, obj2gco(cd)); - } - } else if (LJ_LIKELY(!cdataisv(cd))) { - CType *ct = ctype_raw(ctype_ctsG(g), cd->ctypeid); - CTSize sz = ctype_hassize(ct->info) ? ct->size : CTSIZE_PTR; - lua_assert(ctype_hassize(ct->info) || ctype_isfunc(ct->info) || - ctype_isextern(ct->info)); - lj_mem_free(g, cd, sizeof(GCcdata) + sz); - } else { - lj_mem_free(g, memcdatav(cd), sizecdatav(cd)); - } -} - -TValue * LJ_FASTCALL lj_cdata_setfin(lua_State *L, GCcdata *cd) -{ - global_State *g = G(L); - GCtab *t = ctype_ctsG(g)->finalizer; - if (gcref(t->metatable)) { - /* Add cdata to finalizer table, if still enabled. */ - TValue *tv, tmp; - setcdataV(L, &tmp, cd); - lj_gc_anybarriert(L, t); - tv = lj_tab_set(L, t, &tmp); - cd->marked |= LJ_GC_CDATA_FIN; - return tv; - } else { - /* Otherwise return dummy TValue. */ - return &g->tmptv; - } -} - -/* -- C data indexing ----------------------------------------------------- */ - -/* Index C data by a TValue. Return CType and pointer. */ -CType *lj_cdata_index(CTState *cts, GCcdata *cd, cTValue *key, uint8_t **pp, - CTInfo *qual) -{ - uint8_t *p = (uint8_t *)cdataptr(cd); - CType *ct = ctype_get(cts, cd->ctypeid); - ptrdiff_t idx; - - /* Resolve reference for cdata object. */ - if (ctype_isref(ct->info)) { - lua_assert(ct->size == CTSIZE_PTR); - p = *(uint8_t **)p; - ct = ctype_child(cts, ct); - } - -collect_attrib: - /* Skip attributes and collect qualifiers. */ - while (ctype_isattrib(ct->info)) { - if (ctype_attrib(ct->info) == CTA_QUAL) *qual |= ct->size; - ct = ctype_child(cts, ct); - } - lua_assert(!ctype_isref(ct->info)); /* Interning rejects refs to refs. */ - - if (tvisint(key)) { - idx = (ptrdiff_t)intV(key); - goto integer_key; - } else if (tvisnum(key)) { /* Numeric key. */ - idx = LJ_64 ? (ptrdiff_t)numV(key) : (ptrdiff_t)lj_num2int(numV(key)); - integer_key: - if (ctype_ispointer(ct->info)) { - CTSize sz = lj_ctype_size(cts, ctype_cid(ct->info)); /* Element size. */ - if (sz == CTSIZE_INVALID) - lj_err_caller(cts->L, LJ_ERR_FFI_INVSIZE); - if (ctype_isptr(ct->info)) { - p = (uint8_t *)cdata_getptr(p, ct->size); - } else if ((ct->info & (CTF_VECTOR|CTF_COMPLEX))) { - if ((ct->info & CTF_COMPLEX)) idx &= 1; - *qual |= CTF_CONST; /* Valarray elements are constant. */ - } - *pp = p + idx*(int32_t)sz; - return ct; - } - } else if (tviscdata(key)) { /* Integer cdata key. */ - GCcdata *cdk = cdataV(key); - CType *ctk = ctype_raw(cts, cdk->ctypeid); - if (ctype_isenum(ctk->info)) ctk = ctype_child(cts, ctk); - if (ctype_isinteger(ctk->info)) { - lj_cconv_ct_ct(cts, ctype_get(cts, CTID_INT_PSZ), ctk, - (uint8_t *)&idx, cdataptr(cdk), 0); - goto integer_key; - } - } else if (tvisstr(key)) { /* String key. */ - GCstr *name = strV(key); - if (ctype_isstruct(ct->info)) { - CTSize ofs; - CType *fct = lj_ctype_getfieldq(cts, ct, name, &ofs, qual); - if (fct) { - *pp = p + ofs; - return fct; - } - } else if (ctype_iscomplex(ct->info)) { - if (name->len == 2) { - *qual |= CTF_CONST; /* Complex fields are constant. */ - if (strdata(name)[0] == 'r' && strdata(name)[1] == 'e') { - *pp = p; - return ct; - } else if (strdata(name)[0] == 'i' && strdata(name)[1] == 'm') { - *pp = p + (ct->size >> 1); - return ct; - } - } - } else if (cd->ctypeid == CTID_CTYPEID) { - /* Allow indexing a (pointer to) struct constructor to get constants. */ - CType *sct = ctype_raw(cts, *(CTypeID *)p); - if (ctype_isptr(sct->info)) - sct = ctype_rawchild(cts, sct); - if (ctype_isstruct(sct->info)) { - CTSize ofs; - CType *fct = lj_ctype_getfield(cts, sct, name, &ofs); - if (fct && ctype_isconstval(fct->info)) - return fct; - } - ct = sct; /* Allow resolving metamethods for constructors, too. */ - } - } - if (ctype_isptr(ct->info)) { /* Automatically perform '->'. */ - if (ctype_isstruct(ctype_rawchild(cts, ct)->info)) { - p = (uint8_t *)cdata_getptr(p, ct->size); - ct = ctype_child(cts, ct); - goto collect_attrib; - } - } - *qual |= 1; /* Lookup failed. */ - return ct; /* But return the resolved raw type. */ -} - -/* -- C data getters ------------------------------------------------------ */ - -/* Get constant value and convert to TValue. */ -static void cdata_getconst(CTState *cts, TValue *o, CType *ct) -{ - CType *ctt = ctype_child(cts, ct); - lua_assert(ctype_isinteger(ctt->info) && ctt->size <= 4); - /* Constants are already zero-extended/sign-extended to 32 bits. */ - if ((ctt->info & CTF_UNSIGNED) && (int32_t)ct->size < 0) - setnumV(o, (lua_Number)(uint32_t)ct->size); - else - setintV(o, (int32_t)ct->size); -} - -/* Get C data value and convert to TValue. */ -int lj_cdata_get(CTState *cts, CType *s, TValue *o, uint8_t *sp) -{ - CTypeID sid; - - if (ctype_isconstval(s->info)) { - cdata_getconst(cts, o, s); - return 0; /* No GC step needed. */ - } else if (ctype_isbitfield(s->info)) { - return lj_cconv_tv_bf(cts, s, o, sp); - } - - /* Get child type of pointer/array/field. */ - lua_assert(ctype_ispointer(s->info) || ctype_isfield(s->info)); - sid = ctype_cid(s->info); - s = ctype_get(cts, sid); - - /* Resolve reference for field. */ - if (ctype_isref(s->info)) { - lua_assert(s->size == CTSIZE_PTR); - sp = *(uint8_t **)sp; - sid = ctype_cid(s->info); - s = ctype_get(cts, sid); - } - - /* Skip attributes. */ - while (ctype_isattrib(s->info)) - s = ctype_child(cts, s); - - return lj_cconv_tv_ct(cts, s, sid, o, sp); -} - -/* -- C data setters ------------------------------------------------------ */ - -/* Convert TValue and set C data value. */ -void lj_cdata_set(CTState *cts, CType *d, uint8_t *dp, TValue *o, CTInfo qual) -{ - if (ctype_isconstval(d->info)) { - goto err_const; - } else if (ctype_isbitfield(d->info)) { - if (((d->info|qual) & CTF_CONST)) goto err_const; - lj_cconv_bf_tv(cts, d, dp, o); - return; - } - - /* Get child type of pointer/array/field. */ - lua_assert(ctype_ispointer(d->info) || ctype_isfield(d->info)); - d = ctype_child(cts, d); - - /* Resolve reference for field. */ - if (ctype_isref(d->info)) { - lua_assert(d->size == CTSIZE_PTR); - dp = *(uint8_t **)dp; - d = ctype_child(cts, d); - } - - /* Skip attributes and collect qualifiers. */ - for (;;) { - if (ctype_isattrib(d->info)) { - if (ctype_attrib(d->info) == CTA_QUAL) qual |= d->size; - } else { - break; - } - d = ctype_child(cts, d); - } - - lua_assert(ctype_hassize(d->info) && !ctype_isvoid(d->info)); - - if (((d->info|qual) & CTF_CONST)) { - err_const: - lj_err_caller(cts->L, LJ_ERR_FFI_WRCONST); - } - - lj_cconv_ct_tv(cts, d, dp, o, 0); -} - -#endif diff --git a/deps/luajit/src/lj_cdata.h b/deps/luajit/src/lj_cdata.h deleted file mode 100644 index 3a1275e6..00000000 --- a/deps/luajit/src/lj_cdata.h +++ /dev/null @@ -1,75 +0,0 @@ -/* -** C data management. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#ifndef _LJ_CDATA_H -#define _LJ_CDATA_H - -#include "lj_obj.h" -#include "lj_gc.h" -#include "lj_ctype.h" - -#if LJ_HASFFI - -/* Get C data pointer. */ -static LJ_AINLINE void *cdata_getptr(void *p, CTSize sz) -{ - if (LJ_64 && sz == 4) { /* Support 32 bit pointers on 64 bit targets. */ - return ((void *)(uintptr_t)*(uint32_t *)p); - } else { - lua_assert(sz == CTSIZE_PTR); - return *(void **)p; - } -} - -/* Set C data pointer. */ -static LJ_AINLINE void cdata_setptr(void *p, CTSize sz, const void *v) -{ - if (LJ_64 && sz == 4) { /* Support 32 bit pointers on 64 bit targets. */ - *(uint32_t *)p = (uint32_t)(uintptr_t)v; - } else { - lua_assert(sz == CTSIZE_PTR); - *(void **)p = (void *)v; - } -} - -/* Allocate fixed-size C data object. */ -static LJ_AINLINE GCcdata *lj_cdata_new(CTState *cts, CTypeID id, CTSize sz) -{ - GCcdata *cd; -#ifdef LUA_USE_ASSERT - CType *ct = ctype_raw(cts, id); - lua_assert((ctype_hassize(ct->info) ? ct->size : CTSIZE_PTR) == sz); -#endif - cd = (GCcdata *)lj_mem_newgco(cts->L, sizeof(GCcdata) + sz); - cd->gct = ~LJ_TCDATA; - cd->ctypeid = ctype_check(cts, id); - return cd; -} - -/* Variant which works without a valid CTState. */ -static LJ_AINLINE GCcdata *lj_cdata_new_(lua_State *L, CTypeID id, CTSize sz) -{ - GCcdata *cd = (GCcdata *)lj_mem_newgco(L, sizeof(GCcdata) + sz); - cd->gct = ~LJ_TCDATA; - cd->ctypeid = id; - return cd; -} - -LJ_FUNC GCcdata *lj_cdata_newref(CTState *cts, const void *pp, CTypeID id); -LJ_FUNC GCcdata *lj_cdata_newv(CTState *cts, CTypeID id, CTSize sz, - CTSize align); - -LJ_FUNC void LJ_FASTCALL lj_cdata_free(global_State *g, GCcdata *cd); -LJ_FUNCA TValue * LJ_FASTCALL lj_cdata_setfin(lua_State *L, GCcdata *cd); - -LJ_FUNC CType *lj_cdata_index(CTState *cts, GCcdata *cd, cTValue *key, - uint8_t **pp, CTInfo *qual); -LJ_FUNC int lj_cdata_get(CTState *cts, CType *s, TValue *o, uint8_t *sp); -LJ_FUNC void lj_cdata_set(CTState *cts, CType *d, uint8_t *dp, TValue *o, - CTInfo qual); - -#endif - -#endif diff --git a/deps/luajit/src/lj_char.c b/deps/luajit/src/lj_char.c deleted file mode 100644 index 11f23efe..00000000 --- a/deps/luajit/src/lj_char.c +++ /dev/null @@ -1,43 +0,0 @@ -/* -** Character types. -** Donated to the public domain. -** -** This is intended to replace the problematic libc single-byte NLS functions. -** These just don't make sense anymore with UTF-8 locales becoming the norm -** on POSIX systems. It never worked too well on Windows systems since hardly -** anyone bothered to call setlocale(). -** -** This table is hardcoded for ASCII. Identifiers include the characters -** 128-255, too. This allows for the use of all non-ASCII chars as identifiers -** in the lexer. This is a broad definition, but works well in practice -** for both UTF-8 locales and most single-byte locales (such as ISO-8859-*). -** -** If you really need proper character types for UTF-8 strings, please use -** an add-on library such as slnunicode: http://luaforge.net/projects/sln/ -*/ - -#define lj_char_c -#define LUA_CORE - -#include "lj_char.h" - -LJ_DATADEF const uint8_t lj_char_bits[257] = { - 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 152,152,152,152,152,152,152,152,152,152, 4, 4, 4, 4, 4, 4, - 4,176,176,176,176,176,176,160,160,160,160,160,160,160,160,160, - 160,160,160,160,160,160,160,160,160,160,160, 4, 4, 4, 4,132, - 4,208,208,208,208,208,208,192,192,192,192,192,192,192,192,192, - 192,192,192,192,192,192,192,192,192,192,192, 4, 4, 4, 4, 1, - 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, - 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, - 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, - 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, - 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, - 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, - 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, - 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128 -}; - diff --git a/deps/luajit/src/lj_char.h b/deps/luajit/src/lj_char.h deleted file mode 100644 index c3c86d34..00000000 --- a/deps/luajit/src/lj_char.h +++ /dev/null @@ -1,42 +0,0 @@ -/* -** Character types. -** Donated to the public domain. -*/ - -#ifndef _LJ_CHAR_H -#define _LJ_CHAR_H - -#include "lj_def.h" - -#define LJ_CHAR_CNTRL 0x01 -#define LJ_CHAR_SPACE 0x02 -#define LJ_CHAR_PUNCT 0x04 -#define LJ_CHAR_DIGIT 0x08 -#define LJ_CHAR_XDIGIT 0x10 -#define LJ_CHAR_UPPER 0x20 -#define LJ_CHAR_LOWER 0x40 -#define LJ_CHAR_IDENT 0x80 -#define LJ_CHAR_ALPHA (LJ_CHAR_LOWER|LJ_CHAR_UPPER) -#define LJ_CHAR_ALNUM (LJ_CHAR_ALPHA|LJ_CHAR_DIGIT) -#define LJ_CHAR_GRAPH (LJ_CHAR_ALNUM|LJ_CHAR_PUNCT) - -/* Only pass -1 or 0..255 to these macros. Never pass a signed char! */ -#define lj_char_isa(c, t) ((lj_char_bits+1)[(c)] & t) -#define lj_char_iscntrl(c) lj_char_isa((c), LJ_CHAR_CNTRL) -#define lj_char_isspace(c) lj_char_isa((c), LJ_CHAR_SPACE) -#define lj_char_ispunct(c) lj_char_isa((c), LJ_CHAR_PUNCT) -#define lj_char_isdigit(c) lj_char_isa((c), LJ_CHAR_DIGIT) -#define lj_char_isxdigit(c) lj_char_isa((c), LJ_CHAR_XDIGIT) -#define lj_char_isupper(c) lj_char_isa((c), LJ_CHAR_UPPER) -#define lj_char_islower(c) lj_char_isa((c), LJ_CHAR_LOWER) -#define lj_char_isident(c) lj_char_isa((c), LJ_CHAR_IDENT) -#define lj_char_isalpha(c) lj_char_isa((c), LJ_CHAR_ALPHA) -#define lj_char_isalnum(c) lj_char_isa((c), LJ_CHAR_ALNUM) -#define lj_char_isgraph(c) lj_char_isa((c), LJ_CHAR_GRAPH) - -#define lj_char_toupper(c) ((c) - (lj_char_islower(c) >> 1)) -#define lj_char_tolower(c) ((c) + lj_char_isupper(c)) - -LJ_DATA const uint8_t lj_char_bits[257]; - -#endif diff --git a/deps/luajit/src/lj_clib.c b/deps/luajit/src/lj_clib.c deleted file mode 100644 index d3526090..00000000 --- a/deps/luajit/src/lj_clib.c +++ /dev/null @@ -1,409 +0,0 @@ -/* -** FFI C library loader. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#include "lj_obj.h" - -#if LJ_HASFFI - -#include "lj_gc.h" -#include "lj_err.h" -#include "lj_tab.h" -#include "lj_str.h" -#include "lj_udata.h" -#include "lj_ctype.h" -#include "lj_cconv.h" -#include "lj_cdata.h" -#include "lj_clib.h" - -/* -- OS-specific functions ----------------------------------------------- */ - -#if LJ_TARGET_DLOPEN - -#include -#include - -#if defined(RTLD_DEFAULT) -#define CLIB_DEFHANDLE RTLD_DEFAULT -#elif LJ_TARGET_OSX || LJ_TARGET_BSD -#define CLIB_DEFHANDLE ((void *)(intptr_t)-2) -#else -#define CLIB_DEFHANDLE NULL -#endif - -LJ_NORET LJ_NOINLINE static void clib_error_(lua_State *L) -{ - lj_err_callermsg(L, dlerror()); -} - -#define clib_error(L, fmt, name) clib_error_(L) - -#if defined(__CYGWIN__) -#define CLIB_SOPREFIX "cyg" -#else -#define CLIB_SOPREFIX "lib" -#endif - -#if LJ_TARGET_OSX -#define CLIB_SOEXT "%s.dylib" -#elif defined(__CYGWIN__) -#define CLIB_SOEXT "%s.dll" -#else -#define CLIB_SOEXT "%s.so" -#endif - -static const char *clib_extname(lua_State *L, const char *name) -{ - if (!strchr(name, '/') -#ifdef __CYGWIN__ - && !strchr(name, '\\') -#endif - ) { - if (!strchr(name, '.')) { - name = lj_str_pushf(L, CLIB_SOEXT, name); - L->top--; -#ifdef __CYGWIN__ - } else { - return name; -#endif - } - if (!(name[0] == CLIB_SOPREFIX[0] && name[1] == CLIB_SOPREFIX[1] && - name[2] == CLIB_SOPREFIX[2])) { - name = lj_str_pushf(L, CLIB_SOPREFIX "%s", name); - L->top--; - } - } - return name; -} - -/* Check for a recognized ld script line. */ -static const char *clib_check_lds(lua_State *L, const char *buf) -{ - char *p, *e; - if ((!strncmp(buf, "GROUP", 5) || !strncmp(buf, "INPUT", 5)) && - (p = strchr(buf, '('))) { - while (*++p == ' ') ; - for (e = p; *e && *e != ' ' && *e != ')'; e++) ; - return strdata(lj_str_new(L, p, e-p)); - } - return NULL; -} - -/* Quick and dirty solution to resolve shared library name from ld script. */ -static const char *clib_resolve_lds(lua_State *L, const char *name) -{ - FILE *fp = fopen(name, "r"); - const char *p = NULL; - if (fp) { - char buf[256]; - if (fgets(buf, sizeof(buf), fp)) { - if (!strncmp(buf, "/* GNU ld script", 16)) { /* ld script magic? */ - while (fgets(buf, sizeof(buf), fp)) { /* Check all lines. */ - p = clib_check_lds(L, buf); - if (p) break; - } - } else { /* Otherwise check only the first line. */ - p = clib_check_lds(L, buf); - } - } - fclose(fp); - } - return p; -} - -static void *clib_loadlib(lua_State *L, const char *name, int global) -{ - void *h = dlopen(clib_extname(L, name), - RTLD_LAZY | (global?RTLD_GLOBAL:RTLD_LOCAL)); - if (!h) { - const char *e, *err = dlerror(); - if (*err == '/' && (e = strchr(err, ':')) && - (name = clib_resolve_lds(L, strdata(lj_str_new(L, err, e-err))))) { - h = dlopen(name, RTLD_LAZY | (global?RTLD_GLOBAL:RTLD_LOCAL)); - if (h) return h; - err = dlerror(); - } - lj_err_callermsg(L, err); - } - return h; -} - -static void clib_unloadlib(CLibrary *cl) -{ - if (cl->handle && cl->handle != CLIB_DEFHANDLE) - dlclose(cl->handle); -} - -static void *clib_getsym(CLibrary *cl, const char *name) -{ - void *p = dlsym(cl->handle, name); - return p; -} - -#elif LJ_TARGET_WINDOWS - -#define WIN32_LEAN_AND_MEAN -#include - -#ifndef GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS -#define GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS 4 -#define GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT 2 -BOOL WINAPI GetModuleHandleExA(DWORD, LPCSTR, HMODULE*); -#endif - -#define CLIB_DEFHANDLE ((void *)-1) - -/* Default libraries. */ -enum { - CLIB_HANDLE_EXE, - CLIB_HANDLE_DLL, - CLIB_HANDLE_CRT, - CLIB_HANDLE_KERNEL32, - CLIB_HANDLE_USER32, - CLIB_HANDLE_GDI32, - CLIB_HANDLE_MAX -}; - -static void *clib_def_handle[CLIB_HANDLE_MAX]; - -LJ_NORET LJ_NOINLINE static void clib_error(lua_State *L, const char *fmt, - const char *name) -{ - DWORD err = GetLastError(); - char buf[128]; - if (!FormatMessageA(FORMAT_MESSAGE_IGNORE_INSERTS|FORMAT_MESSAGE_FROM_SYSTEM, - NULL, err, 0, buf, sizeof(buf), NULL)) - buf[0] = '\0'; - lj_err_callermsg(L, lj_str_pushf(L, fmt, name, buf)); -} - -static int clib_needext(const char *s) -{ - while (*s) { - if (*s == '/' || *s == '\\' || *s == '.') return 0; - s++; - } - return 1; -} - -static const char *clib_extname(lua_State *L, const char *name) -{ - if (clib_needext(name)) { - name = lj_str_pushf(L, "%s.dll", name); - L->top--; - } - return name; -} - -static void *clib_loadlib(lua_State *L, const char *name, int global) -{ - DWORD oldwerr = GetLastError(); - void *h = (void *)LoadLibraryA(clib_extname(L, name)); - if (!h) clib_error(L, "cannot load module " LUA_QS ": %s", name); - SetLastError(oldwerr); - UNUSED(global); - return h; -} - -static void clib_unloadlib(CLibrary *cl) -{ - if (cl->handle == CLIB_DEFHANDLE) { - MSize i; - for (i = CLIB_HANDLE_KERNEL32; i < CLIB_HANDLE_MAX; i++) { - void *h = clib_def_handle[i]; - if (h) { - clib_def_handle[i] = NULL; - FreeLibrary((HINSTANCE)h); - } - } - } else if (cl->handle) { - FreeLibrary((HINSTANCE)cl->handle); - } -} - -static void *clib_getsym(CLibrary *cl, const char *name) -{ - void *p = NULL; - if (cl->handle == CLIB_DEFHANDLE) { /* Search default libraries. */ - MSize i; - for (i = 0; i < CLIB_HANDLE_MAX; i++) { - HINSTANCE h = (HINSTANCE)clib_def_handle[i]; - if (!(void *)h) { /* Resolve default library handles (once). */ - switch (i) { - case CLIB_HANDLE_EXE: GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, NULL, &h); break; - case CLIB_HANDLE_DLL: - GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS|GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, - (const char *)clib_def_handle, &h); - break; - case CLIB_HANDLE_CRT: - GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS|GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, - (const char *)&_fmode, &h); - break; - case CLIB_HANDLE_KERNEL32: h = LoadLibraryA("kernel32.dll"); break; - case CLIB_HANDLE_USER32: h = LoadLibraryA("user32.dll"); break; - case CLIB_HANDLE_GDI32: h = LoadLibraryA("gdi32.dll"); break; - } - if (!h) continue; - clib_def_handle[i] = (void *)h; - } - p = (void *)GetProcAddress(h, name); - if (p) break; - } - } else { - p = (void *)GetProcAddress((HINSTANCE)cl->handle, name); - } - return p; -} - -#else - -#define CLIB_DEFHANDLE NULL - -LJ_NORET LJ_NOINLINE static void clib_error(lua_State *L, const char *fmt, - const char *name) -{ - lj_err_callermsg(L, lj_str_pushf(L, fmt, name, "no support for this OS")); -} - -static void *clib_loadlib(lua_State *L, const char *name, int global) -{ - lj_err_callermsg(L, "no support for loading dynamic libraries for this OS"); - UNUSED(name); UNUSED(global); - return NULL; -} - -static void clib_unloadlib(CLibrary *cl) -{ - UNUSED(cl); -} - -static void *clib_getsym(CLibrary *cl, const char *name) -{ - UNUSED(cl); UNUSED(name); - return NULL; -} - -#endif - -/* -- C library indexing -------------------------------------------------- */ - -#if LJ_TARGET_X86 && LJ_ABI_WIN -/* Compute argument size for fastcall/stdcall functions. */ -static CTSize clib_func_argsize(CTState *cts, CType *ct) -{ - CTSize n = 0; - while (ct->sib) { - CType *d; - ct = ctype_get(cts, ct->sib); - if (ctype_isfield(ct->info)) { - d = ctype_rawchild(cts, ct); - n += ((d->size + 3) & ~3); - } - } - return n; -} -#endif - -/* Get redirected or mangled external symbol. */ -static const char *clib_extsym(CTState *cts, CType *ct, GCstr *name) -{ - if (ct->sib) { - CType *ctf = ctype_get(cts, ct->sib); - if (ctype_isxattrib(ctf->info, CTA_REDIR)) - return strdata(gco2str(gcref(ctf->name))); - } - return strdata(name); -} - -/* Index a C library by name. */ -TValue *lj_clib_index(lua_State *L, CLibrary *cl, GCstr *name) -{ - TValue *tv = lj_tab_setstr(L, cl->cache, name); - if (LJ_UNLIKELY(tvisnil(tv))) { - CTState *cts = ctype_cts(L); - CType *ct; - CTypeID id = lj_ctype_getname(cts, &ct, name, CLNS_INDEX); - if (!id) - lj_err_callerv(L, LJ_ERR_FFI_NODECL, strdata(name)); - if (ctype_isconstval(ct->info)) { - CType *ctt = ctype_child(cts, ct); - lua_assert(ctype_isinteger(ctt->info) && ctt->size <= 4); - if ((ctt->info & CTF_UNSIGNED) && (int32_t)ct->size < 0) - setnumV(tv, (lua_Number)(uint32_t)ct->size); - else - setintV(tv, (int32_t)ct->size); - } else { - const char *sym = clib_extsym(cts, ct, name); -#if LJ_TARGET_WINDOWS - DWORD oldwerr = GetLastError(); -#endif - void *p = clib_getsym(cl, sym); - GCcdata *cd; - lua_assert(ctype_isfunc(ct->info) || ctype_isextern(ct->info)); -#if LJ_TARGET_X86 && LJ_ABI_WIN - /* Retry with decorated name for fastcall/stdcall functions. */ - if (!p && ctype_isfunc(ct->info)) { - CTInfo cconv = ctype_cconv(ct->info); - if (cconv == CTCC_FASTCALL || cconv == CTCC_STDCALL) { - CTSize sz = clib_func_argsize(cts, ct); - const char *symd = lj_str_pushf(L, - cconv == CTCC_FASTCALL ? "@%s@%d" : "_%s@%d", - sym, sz); - L->top--; - p = clib_getsym(cl, symd); - } - } -#endif - if (!p) - clib_error(L, "cannot resolve symbol " LUA_QS ": %s", sym); -#if LJ_TARGET_WINDOWS - SetLastError(oldwerr); -#endif - cd = lj_cdata_new(cts, id, CTSIZE_PTR); - *(void **)cdataptr(cd) = p; - setcdataV(L, tv, cd); - } - } - return tv; -} - -/* -- C library management ------------------------------------------------ */ - -/* Create a new CLibrary object and push it on the stack. */ -static CLibrary *clib_new(lua_State *L, GCtab *mt) -{ - GCtab *t = lj_tab_new(L, 0, 0); - GCudata *ud = lj_udata_new(L, sizeof(CLibrary), t); - CLibrary *cl = (CLibrary *)uddata(ud); - cl->cache = t; - ud->udtype = UDTYPE_FFI_CLIB; - /* NOBARRIER: The GCudata is new (marked white). */ - setgcref(ud->metatable, obj2gco(mt)); - setudataV(L, L->top++, ud); - return cl; -} - -/* Load a C library. */ -void lj_clib_load(lua_State *L, GCtab *mt, GCstr *name, int global) -{ - void *handle = clib_loadlib(L, strdata(name), global); - CLibrary *cl = clib_new(L, mt); - cl->handle = handle; -} - -/* Unload a C library. */ -void lj_clib_unload(CLibrary *cl) -{ - clib_unloadlib(cl); - cl->handle = NULL; -} - -/* Create the default C library object. */ -void lj_clib_default(lua_State *L, GCtab *mt) -{ - CLibrary *cl = clib_new(L, mt); - cl->handle = CLIB_DEFHANDLE; -} - -#endif diff --git a/deps/luajit/src/lj_clib.h b/deps/luajit/src/lj_clib.h deleted file mode 100644 index e5dc98e1..00000000 --- a/deps/luajit/src/lj_clib.h +++ /dev/null @@ -1,29 +0,0 @@ -/* -** FFI C library loader. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#ifndef _LJ_CLIB_H -#define _LJ_CLIB_H - -#include "lj_obj.h" - -#if LJ_HASFFI - -/* Namespace for C library indexing. */ -#define CLNS_INDEX ((1u<env. */ -} CLibrary; - -LJ_FUNC TValue *lj_clib_index(lua_State *L, CLibrary *cl, GCstr *name); -LJ_FUNC void lj_clib_load(lua_State *L, GCtab *mt, GCstr *name, int global); -LJ_FUNC void lj_clib_unload(CLibrary *cl); -LJ_FUNC void lj_clib_default(lua_State *L, GCtab *mt); - -#endif - -#endif diff --git a/deps/luajit/src/lj_cparse.c b/deps/luajit/src/lj_cparse.c deleted file mode 100644 index b9df88d7..00000000 --- a/deps/luajit/src/lj_cparse.c +++ /dev/null @@ -1,1872 +0,0 @@ -/* -** C declaration parser. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#include "lj_obj.h" - -#if LJ_HASFFI - -#include "lj_gc.h" -#include "lj_err.h" -#include "lj_str.h" -#include "lj_ctype.h" -#include "lj_cparse.h" -#include "lj_frame.h" -#include "lj_vm.h" -#include "lj_char.h" -#include "lj_strscan.h" - -/* -** Important note: this is NOT a validating C parser! This is a minimal -** C declaration parser, solely for use by the LuaJIT FFI. -** -** It ought to return correct results for properly formed C declarations, -** but it may accept some invalid declarations, too (and return nonsense). -** Also, it shows rather generic error messages to avoid unnecessary bloat. -** If in doubt, please check the input against your favorite C compiler. -*/ - -/* -- C lexer ------------------------------------------------------------- */ - -/* C lexer token names. */ -static const char *const ctoknames[] = { -#define CTOKSTR(name, str) str, -CTOKDEF(CTOKSTR) -#undef CTOKSTR - NULL -}; - -/* Forward declaration. */ -LJ_NORET static void cp_err(CPState *cp, ErrMsg em); - -static const char *cp_tok2str(CPState *cp, CPToken tok) -{ - lua_assert(tok < CTOK_FIRSTDECL); - if (tok > CTOK_OFS) - return ctoknames[tok-CTOK_OFS-1]; - else if (!lj_char_iscntrl(tok)) - return lj_str_pushf(cp->L, "%c", tok); - else - return lj_str_pushf(cp->L, "char(%d)", tok); -} - -/* End-of-line? */ -static LJ_AINLINE int cp_iseol(CPChar c) -{ - return (c == '\n' || c == '\r'); -} - -/* Peek next raw character. */ -static LJ_AINLINE CPChar cp_rawpeek(CPState *cp) -{ - return (CPChar)(uint8_t)(*cp->p); -} - -static LJ_NOINLINE CPChar cp_get_bs(CPState *cp); - -/* Get next character. */ -static LJ_AINLINE CPChar cp_get(CPState *cp) -{ - cp->c = (CPChar)(uint8_t)(*cp->p++); - if (LJ_LIKELY(cp->c != '\\')) return cp->c; - return cp_get_bs(cp); -} - -/* Transparently skip backslash-escaped line breaks. */ -static LJ_NOINLINE CPChar cp_get_bs(CPState *cp) -{ - CPChar c2, c = cp_rawpeek(cp); - if (!cp_iseol(c)) return cp->c; - cp->p++; - c2 = cp_rawpeek(cp); - if (cp_iseol(c2) && c2 != c) cp->p++; - cp->linenumber++; - return cp_get(cp); -} - -/* Grow save buffer. */ -static LJ_NOINLINE void cp_save_grow(CPState *cp, CPChar c) -{ - MSize newsize; - if (cp->sb.sz >= CPARSE_MAX_BUF/2) - cp_err(cp, LJ_ERR_XELEM); - newsize = cp->sb.sz * 2; - lj_str_resizebuf(cp->L, &cp->sb, newsize); - cp->sb.buf[cp->sb.n++] = (char)c; -} - -/* Save character in buffer. */ -static LJ_AINLINE void cp_save(CPState *cp, CPChar c) -{ - if (LJ_UNLIKELY(cp->sb.n + 1 > cp->sb.sz)) - cp_save_grow(cp, c); - else - cp->sb.buf[cp->sb.n++] = (char)c; -} - -/* Skip line break. Handles "\n", "\r", "\r\n" or "\n\r". */ -static void cp_newline(CPState *cp) -{ - CPChar c = cp_rawpeek(cp); - if (cp_iseol(c) && c != cp->c) cp->p++; - cp->linenumber++; -} - -LJ_NORET static void cp_errmsg(CPState *cp, CPToken tok, ErrMsg em, ...) -{ - const char *msg, *tokstr; - lua_State *L; - va_list argp; - if (tok == 0) { - tokstr = NULL; - } else if (tok == CTOK_IDENT || tok == CTOK_INTEGER || tok == CTOK_STRING || - tok >= CTOK_FIRSTDECL) { - if (cp->sb.n == 0) cp_save(cp, '$'); - cp_save(cp, '\0'); - tokstr = cp->sb.buf; - } else { - tokstr = cp_tok2str(cp, tok); - } - L = cp->L; - va_start(argp, em); - msg = lj_str_pushvf(L, err2msg(em), argp); - va_end(argp); - if (tokstr) - msg = lj_str_pushf(L, err2msg(LJ_ERR_XNEAR), msg, tokstr); - if (cp->linenumber > 1) - msg = lj_str_pushf(L, "%s at line %d", msg, cp->linenumber); - lj_err_callermsg(L, msg); -} - -LJ_NORET LJ_NOINLINE static void cp_err_token(CPState *cp, CPToken tok) -{ - cp_errmsg(cp, cp->tok, LJ_ERR_XTOKEN, cp_tok2str(cp, tok)); -} - -LJ_NORET LJ_NOINLINE static void cp_err_badidx(CPState *cp, CType *ct) -{ - GCstr *s = lj_ctype_repr(cp->cts->L, ctype_typeid(cp->cts, ct), NULL); - cp_errmsg(cp, 0, LJ_ERR_FFI_BADIDX, strdata(s)); -} - -LJ_NORET LJ_NOINLINE static void cp_err(CPState *cp, ErrMsg em) -{ - cp_errmsg(cp, 0, em); -} - -/* -- Main lexical scanner ------------------------------------------------ */ - -/* Parse number literal. Only handles int32_t/uint32_t right now. */ -static CPToken cp_number(CPState *cp) -{ - StrScanFmt fmt; - TValue o; - do { cp_save(cp, cp->c); } while (lj_char_isident(cp_get(cp))); - cp_save(cp, '\0'); - fmt = lj_strscan_scan((const uint8_t *)cp->sb.buf, &o, STRSCAN_OPT_C); - if (fmt == STRSCAN_INT) cp->val.id = CTID_INT32; - else if (fmt == STRSCAN_U32) cp->val.id = CTID_UINT32; - else if (!(cp->mode & CPARSE_MODE_SKIP)) - cp_errmsg(cp, CTOK_INTEGER, LJ_ERR_XNUMBER); - cp->val.u32 = (uint32_t)o.i; - return CTOK_INTEGER; -} - -/* Parse identifier or keyword. */ -static CPToken cp_ident(CPState *cp) -{ - do { cp_save(cp, cp->c); } while (lj_char_isident(cp_get(cp))); - cp->str = lj_str_new(cp->L, cp->sb.buf, cp->sb.n); - cp->val.id = lj_ctype_getname(cp->cts, &cp->ct, cp->str, cp->tmask); - if (ctype_type(cp->ct->info) == CT_KW) - return ctype_cid(cp->ct->info); - return CTOK_IDENT; -} - -/* Parse parameter. */ -static CPToken cp_param(CPState *cp) -{ - CPChar c = cp_get(cp); - TValue *o = cp->param; - if (lj_char_isident(c) || c == '$') /* Reserve $xyz for future extensions. */ - cp_errmsg(cp, c, LJ_ERR_XSYNTAX); - if (!o || o >= cp->L->top) - cp_err(cp, LJ_ERR_FFI_NUMPARAM); - cp->param = o+1; - if (tvisstr(o)) { - cp->str = strV(o); - cp->val.id = 0; - cp->ct = &cp->cts->tab[0]; - return CTOK_IDENT; - } else if (tvisnumber(o)) { - cp->val.i32 = numberVint(o); - cp->val.id = CTID_INT32; - return CTOK_INTEGER; - } else { - GCcdata *cd; - if (!tviscdata(o)) - lj_err_argtype(cp->L, (int)(o-cp->L->base)+1, "type parameter"); - cd = cdataV(o); - if (cd->ctypeid == CTID_CTYPEID) - cp->val.id = *(CTypeID *)cdataptr(cd); - else - cp->val.id = cd->ctypeid; - return '$'; - } -} - -/* Parse string or character constant. */ -static CPToken cp_string(CPState *cp) -{ - CPChar delim = cp->c; - cp_get(cp); - while (cp->c != delim) { - CPChar c = cp->c; - if (c == '\0') cp_errmsg(cp, CTOK_EOF, LJ_ERR_XSTR); - if (c == '\\') { - c = cp_get(cp); - switch (c) { - case '\0': cp_errmsg(cp, CTOK_EOF, LJ_ERR_XSTR); break; - case 'a': c = '\a'; break; - case 'b': c = '\b'; break; - case 'f': c = '\f'; break; - case 'n': c = '\n'; break; - case 'r': c = '\r'; break; - case 't': c = '\t'; break; - case 'v': c = '\v'; break; - case 'e': c = 27; break; - case 'x': - c = 0; - while (lj_char_isxdigit(cp_get(cp))) - c = (c<<4) + (lj_char_isdigit(cp->c) ? cp->c-'0' : (cp->c&15)+9); - cp_save(cp, (c & 0xff)); - continue; - default: - if (lj_char_isdigit(c)) { - c -= '0'; - if (lj_char_isdigit(cp_get(cp))) { - c = c*8 + (cp->c - '0'); - if (lj_char_isdigit(cp_get(cp))) { - c = c*8 + (cp->c - '0'); - cp_get(cp); - } - } - cp_save(cp, (c & 0xff)); - continue; - } - break; - } - } - cp_save(cp, c); - cp_get(cp); - } - cp_get(cp); - if (delim == '"') { - cp->str = lj_str_new(cp->L, cp->sb.buf, cp->sb.n); - return CTOK_STRING; - } else { - if (cp->sb.n != 1) cp_err_token(cp, '\''); - cp->val.i32 = (int32_t)(char)cp->sb.buf[0]; - cp->val.id = CTID_INT32; - return CTOK_INTEGER; - } -} - -/* Skip C comment. */ -static void cp_comment_c(CPState *cp) -{ - do { - if (cp_get(cp) == '*') { - do { - if (cp_get(cp) == '/') { cp_get(cp); return; } - } while (cp->c == '*'); - } - if (cp_iseol(cp->c)) cp_newline(cp); - } while (cp->c != '\0'); -} - -/* Skip C++ comment. */ -static void cp_comment_cpp(CPState *cp) -{ - while (!cp_iseol(cp_get(cp)) && cp->c != '\0') - ; -} - -/* Lexical scanner for C. Only a minimal subset is implemented. */ -static CPToken cp_next_(CPState *cp) -{ - lj_str_resetbuf(&cp->sb); - for (;;) { - if (lj_char_isident(cp->c)) - return lj_char_isdigit(cp->c) ? cp_number(cp) : cp_ident(cp); - switch (cp->c) { - case '\n': case '\r': cp_newline(cp); /* fallthrough. */ - case ' ': case '\t': case '\v': case '\f': cp_get(cp); break; - case '"': case '\'': return cp_string(cp); - case '/': - if (cp_get(cp) == '*') cp_comment_c(cp); - else if (cp->c == '/') cp_comment_cpp(cp); - else return '/'; - break; - case '|': - if (cp_get(cp) != '|') return '|'; cp_get(cp); return CTOK_OROR; - case '&': - if (cp_get(cp) != '&') return '&'; cp_get(cp); return CTOK_ANDAND; - case '=': - if (cp_get(cp) != '=') return '='; cp_get(cp); return CTOK_EQ; - case '!': - if (cp_get(cp) != '=') return '!'; cp_get(cp); return CTOK_NE; - case '<': - if (cp_get(cp) == '=') { cp_get(cp); return CTOK_LE; } - else if (cp->c == '<') { cp_get(cp); return CTOK_SHL; } - return '<'; - case '>': - if (cp_get(cp) == '=') { cp_get(cp); return CTOK_GE; } - else if (cp->c == '>') { cp_get(cp); return CTOK_SHR; } - return '>'; - case '-': - if (cp_get(cp) != '>') return '-'; cp_get(cp); return CTOK_DEREF; - case '$': - return cp_param(cp); - case '\0': return CTOK_EOF; - default: { CPToken c = cp->c; cp_get(cp); return c; } - } - } -} - -static LJ_NOINLINE CPToken cp_next(CPState *cp) -{ - return (cp->tok = cp_next_(cp)); -} - -/* -- C parser ------------------------------------------------------------ */ - -/* Namespaces for resolving identifiers. */ -#define CPNS_DEFAULT \ - ((1u<linenumber = 1; - cp->depth = 0; - cp->curpack = 0; - cp->packstack[0] = 255; - lj_str_initbuf(&cp->sb); - lj_str_resizebuf(cp->L, &cp->sb, LJ_MIN_SBUF); - lua_assert(cp->p != NULL); - cp_get(cp); /* Read-ahead first char. */ - cp->tok = 0; - cp->tmask = CPNS_DEFAULT; - cp_next(cp); /* Read-ahead first token. */ -} - -/* Cleanup C parser state. */ -static void cp_cleanup(CPState *cp) -{ - global_State *g = G(cp->L); - lj_str_freebuf(g, &cp->sb); -} - -/* Check and consume optional token. */ -static int cp_opt(CPState *cp, CPToken tok) -{ - if (cp->tok == tok) { cp_next(cp); return 1; } - return 0; -} - -/* Check and consume token. */ -static void cp_check(CPState *cp, CPToken tok) -{ - if (cp->tok != tok) cp_err_token(cp, tok); - cp_next(cp); -} - -/* Check if the next token may start a type declaration. */ -static int cp_istypedecl(CPState *cp) -{ - if (cp->tok >= CTOK_FIRSTDECL && cp->tok <= CTOK_LASTDECL) return 1; - if (cp->tok == CTOK_IDENT && ctype_istypedef(cp->ct->info)) return 1; - if (cp->tok == '$') return 1; - return 0; -} - -/* -- Constant expression evaluator --------------------------------------- */ - -/* Forward declarations. */ -static void cp_expr_unary(CPState *cp, CPValue *k); -static void cp_expr_sub(CPState *cp, CPValue *k, int pri); - -/* Please note that type handling is very weak here. Most ops simply -** assume integer operands. Accessors are only needed to compute types and -** return synthetic values. The only purpose of the expression evaluator -** is to compute the values of constant expressions one would typically -** find in C header files. And again: this is NOT a validating C parser! -*/ - -/* Parse comma separated expression and return last result. */ -static void cp_expr_comma(CPState *cp, CPValue *k) -{ - do { cp_expr_sub(cp, k, 0); } while (cp_opt(cp, ',')); -} - -/* Parse sizeof/alignof operator. */ -static void cp_expr_sizeof(CPState *cp, CPValue *k, int wantsz) -{ - CTSize sz; - CTInfo info; - if (cp_opt(cp, '(')) { - if (cp_istypedecl(cp)) - k->id = cp_decl_abstract(cp); - else - cp_expr_comma(cp, k); - cp_check(cp, ')'); - } else { - cp_expr_unary(cp, k); - } - info = lj_ctype_info(cp->cts, k->id, &sz); - if (wantsz) { - if (sz != CTSIZE_INVALID) - k->u32 = sz; - else if (k->id != CTID_A_CCHAR) /* Special case for sizeof("string"). */ - cp_err(cp, LJ_ERR_FFI_INVSIZE); - } else { - k->u32 = 1u << ctype_align(info); - } - k->id = CTID_UINT32; /* Really size_t. */ -} - -/* Parse prefix operators. */ -static void cp_expr_prefix(CPState *cp, CPValue *k) -{ - if (cp->tok == CTOK_INTEGER) { - *k = cp->val; cp_next(cp); - } else if (cp_opt(cp, '+')) { - cp_expr_unary(cp, k); /* Nothing to do (well, integer promotion). */ - } else if (cp_opt(cp, '-')) { - cp_expr_unary(cp, k); k->i32 = -k->i32; - } else if (cp_opt(cp, '~')) { - cp_expr_unary(cp, k); k->i32 = ~k->i32; - } else if (cp_opt(cp, '!')) { - cp_expr_unary(cp, k); k->i32 = !k->i32; k->id = CTID_INT32; - } else if (cp_opt(cp, '(')) { - if (cp_istypedecl(cp)) { /* Cast operator. */ - CTypeID id = cp_decl_abstract(cp); - cp_check(cp, ')'); - cp_expr_unary(cp, k); - k->id = id; /* No conversion performed. */ - } else { /* Sub-expression. */ - cp_expr_comma(cp, k); - cp_check(cp, ')'); - } - } else if (cp_opt(cp, '*')) { /* Indirection. */ - CType *ct; - cp_expr_unary(cp, k); - ct = lj_ctype_rawref(cp->cts, k->id); - if (!ctype_ispointer(ct->info)) - cp_err_badidx(cp, ct); - k->u32 = 0; k->id = ctype_cid(ct->info); - } else if (cp_opt(cp, '&')) { /* Address operator. */ - cp_expr_unary(cp, k); - k->id = lj_ctype_intern(cp->cts, CTINFO(CT_PTR, CTALIGN_PTR+k->id), - CTSIZE_PTR); - } else if (cp_opt(cp, CTOK_SIZEOF)) { - cp_expr_sizeof(cp, k, 1); - } else if (cp_opt(cp, CTOK_ALIGNOF)) { - cp_expr_sizeof(cp, k, 0); - } else if (cp->tok == CTOK_IDENT) { - if (ctype_type(cp->ct->info) == CT_CONSTVAL) { - k->u32 = cp->ct->size; k->id = ctype_cid(cp->ct->info); - } else if (ctype_type(cp->ct->info) == CT_EXTERN) { - k->u32 = cp->val.id; k->id = ctype_cid(cp->ct->info); - } else if (ctype_type(cp->ct->info) == CT_FUNC) { - k->u32 = cp->val.id; k->id = cp->val.id; - } else { - goto err_expr; - } - cp_next(cp); - } else if (cp->tok == CTOK_STRING) { - CTSize sz = cp->str->len; - while (cp_next(cp) == CTOK_STRING) - sz += cp->str->len; - k->u32 = sz + 1; - k->id = CTID_A_CCHAR; - } else { - err_expr: - cp_errmsg(cp, cp->tok, LJ_ERR_XSYMBOL); - } -} - -/* Parse postfix operators. */ -static void cp_expr_postfix(CPState *cp, CPValue *k) -{ - for (;;) { - CType *ct; - if (cp_opt(cp, '[')) { /* Array/pointer index. */ - CPValue k2; - cp_expr_comma(cp, &k2); - ct = lj_ctype_rawref(cp->cts, k->id); - if (!ctype_ispointer(ct->info)) { - ct = lj_ctype_rawref(cp->cts, k2.id); - if (!ctype_ispointer(ct->info)) - cp_err_badidx(cp, ct); - } - cp_check(cp, ']'); - k->u32 = 0; - } else if (cp->tok == '.' || cp->tok == CTOK_DEREF) { /* Struct deref. */ - CTSize ofs; - CType *fct; - ct = lj_ctype_rawref(cp->cts, k->id); - if (cp->tok == CTOK_DEREF) { - if (!ctype_ispointer(ct->info)) - cp_err_badidx(cp, ct); - ct = lj_ctype_rawref(cp->cts, ctype_cid(ct->info)); - } - cp_next(cp); - if (cp->tok != CTOK_IDENT) cp_err_token(cp, CTOK_IDENT); - if (!ctype_isstruct(ct->info) || ct->size == CTSIZE_INVALID || - !(fct = lj_ctype_getfield(cp->cts, ct, cp->str, &ofs)) || - ctype_isbitfield(fct->info)) { - GCstr *s = lj_ctype_repr(cp->cts->L, ctype_typeid(cp->cts, ct), NULL); - cp_errmsg(cp, 0, LJ_ERR_FFI_BADMEMBER, strdata(s), strdata(cp->str)); - } - ct = fct; - k->u32 = ctype_isconstval(ct->info) ? ct->size : 0; - cp_next(cp); - } else { - return; - } - k->id = ctype_cid(ct->info); - } -} - -/* Parse infix operators. */ -static void cp_expr_infix(CPState *cp, CPValue *k, int pri) -{ - CPValue k2; - k2.u32 = 0; k2.id = 0; /* Silence the compiler. */ - for (;;) { - switch (pri) { - case 0: - if (cp_opt(cp, '?')) { - CPValue k3; - cp_expr_comma(cp, &k2); /* Right-associative. */ - cp_check(cp, ':'); - cp_expr_sub(cp, &k3, 0); - k->u32 = k->u32 ? k2.u32 : k3.u32; - k->id = k2.id > k3.id ? k2.id : k3.id; - continue; - } - case 1: - if (cp_opt(cp, CTOK_OROR)) { - cp_expr_sub(cp, &k2, 2); k->i32 = k->u32 || k2.u32; k->id = CTID_INT32; - continue; - } - case 2: - if (cp_opt(cp, CTOK_ANDAND)) { - cp_expr_sub(cp, &k2, 3); k->i32 = k->u32 && k2.u32; k->id = CTID_INT32; - continue; - } - case 3: - if (cp_opt(cp, '|')) { - cp_expr_sub(cp, &k2, 4); k->u32 = k->u32 | k2.u32; goto arith_result; - } - case 4: - if (cp_opt(cp, '^')) { - cp_expr_sub(cp, &k2, 5); k->u32 = k->u32 ^ k2.u32; goto arith_result; - } - case 5: - if (cp_opt(cp, '&')) { - cp_expr_sub(cp, &k2, 6); k->u32 = k->u32 & k2.u32; goto arith_result; - } - case 6: - if (cp_opt(cp, CTOK_EQ)) { - cp_expr_sub(cp, &k2, 7); k->i32 = k->u32 == k2.u32; k->id = CTID_INT32; - continue; - } else if (cp_opt(cp, CTOK_NE)) { - cp_expr_sub(cp, &k2, 7); k->i32 = k->u32 != k2.u32; k->id = CTID_INT32; - continue; - } - case 7: - if (cp_opt(cp, '<')) { - cp_expr_sub(cp, &k2, 8); - if (k->id == CTID_INT32 && k2.id == CTID_INT32) - k->i32 = k->i32 < k2.i32; - else - k->i32 = k->u32 < k2.u32; - k->id = CTID_INT32; - continue; - } else if (cp_opt(cp, '>')) { - cp_expr_sub(cp, &k2, 8); - if (k->id == CTID_INT32 && k2.id == CTID_INT32) - k->i32 = k->i32 > k2.i32; - else - k->i32 = k->u32 > k2.u32; - k->id = CTID_INT32; - continue; - } else if (cp_opt(cp, CTOK_LE)) { - cp_expr_sub(cp, &k2, 8); - if (k->id == CTID_INT32 && k2.id == CTID_INT32) - k->i32 = k->i32 <= k2.i32; - else - k->i32 = k->u32 <= k2.u32; - k->id = CTID_INT32; - continue; - } else if (cp_opt(cp, CTOK_GE)) { - cp_expr_sub(cp, &k2, 8); - if (k->id == CTID_INT32 && k2.id == CTID_INT32) - k->i32 = k->i32 >= k2.i32; - else - k->i32 = k->u32 >= k2.u32; - k->id = CTID_INT32; - continue; - } - case 8: - if (cp_opt(cp, CTOK_SHL)) { - cp_expr_sub(cp, &k2, 9); k->u32 = k->u32 << k2.u32; - continue; - } else if (cp_opt(cp, CTOK_SHR)) { - cp_expr_sub(cp, &k2, 9); - if (k->id == CTID_INT32) - k->i32 = k->i32 >> k2.i32; - else - k->u32 = k->u32 >> k2.u32; - continue; - } - case 9: - if (cp_opt(cp, '+')) { - cp_expr_sub(cp, &k2, 10); k->u32 = k->u32 + k2.u32; - arith_result: - if (k2.id > k->id) k->id = k2.id; /* Trivial promotion to unsigned. */ - continue; - } else if (cp_opt(cp, '-')) { - cp_expr_sub(cp, &k2, 10); k->u32 = k->u32 - k2.u32; goto arith_result; - } - case 10: - if (cp_opt(cp, '*')) { - cp_expr_unary(cp, &k2); k->u32 = k->u32 * k2.u32; goto arith_result; - } else if (cp_opt(cp, '/')) { - cp_expr_unary(cp, &k2); - if (k2.id > k->id) k->id = k2.id; /* Trivial promotion to unsigned. */ - if (k2.u32 == 0 || - (k->id == CTID_INT32 && k->u32 == 0x80000000u && k2.i32 == -1)) - cp_err(cp, LJ_ERR_BADVAL); - if (k->id == CTID_INT32) - k->i32 = k->i32 / k2.i32; - else - k->u32 = k->u32 / k2.u32; - continue; - } else if (cp_opt(cp, '%')) { - cp_expr_unary(cp, &k2); - if (k2.id > k->id) k->id = k2.id; /* Trivial promotion to unsigned. */ - if (k2.u32 == 0 || - (k->id == CTID_INT32 && k->u32 == 0x80000000u && k2.i32 == -1)) - cp_err(cp, LJ_ERR_BADVAL); - if (k->id == CTID_INT32) - k->i32 = k->i32 % k2.i32; - else - k->u32 = k->u32 % k2.u32; - continue; - } - default: - return; - } - } -} - -/* Parse and evaluate unary expression. */ -static void cp_expr_unary(CPState *cp, CPValue *k) -{ - if (++cp->depth > CPARSE_MAX_DECLDEPTH) cp_err(cp, LJ_ERR_XLEVELS); - cp_expr_prefix(cp, k); - cp_expr_postfix(cp, k); - cp->depth--; -} - -/* Parse and evaluate sub-expression. */ -static void cp_expr_sub(CPState *cp, CPValue *k, int pri) -{ - cp_expr_unary(cp, k); - cp_expr_infix(cp, k, pri); -} - -/* Parse constant integer expression. */ -static void cp_expr_kint(CPState *cp, CPValue *k) -{ - CType *ct; - cp_expr_sub(cp, k, 0); - ct = ctype_raw(cp->cts, k->id); - if (!ctype_isinteger(ct->info)) cp_err(cp, LJ_ERR_BADVAL); -} - -/* Parse (non-negative) size expression. */ -static CTSize cp_expr_ksize(CPState *cp) -{ - CPValue k; - cp_expr_kint(cp, &k); - if (k.u32 >= 0x80000000u) cp_err(cp, LJ_ERR_FFI_INVSIZE); - return k.u32; -} - -/* -- Type declaration stack management ----------------------------------- */ - -/* Add declaration element behind the insertion position. */ -static CPDeclIdx cp_add(CPDecl *decl, CTInfo info, CTSize size) -{ - CPDeclIdx top = decl->top; - if (top >= CPARSE_MAX_DECLSTACK) cp_err(decl->cp, LJ_ERR_XLEVELS); - decl->stack[top].info = info; - decl->stack[top].size = size; - decl->stack[top].sib = 0; - setgcrefnull(decl->stack[top].name); - decl->stack[top].next = decl->stack[decl->pos].next; - decl->stack[decl->pos].next = (CTypeID1)top; - decl->top = top+1; - return top; -} - -/* Push declaration element before the insertion position. */ -static CPDeclIdx cp_push(CPDecl *decl, CTInfo info, CTSize size) -{ - return (decl->pos = cp_add(decl, info, size)); -} - -/* Push or merge attributes. */ -static void cp_push_attributes(CPDecl *decl) -{ - CType *ct = &decl->stack[decl->pos]; - if (ctype_isfunc(ct->info)) { /* Ok to modify in-place. */ -#if LJ_TARGET_X86 - if ((decl->fattr & CTFP_CCONV)) - ct->info = (ct->info & (CTMASK_NUM|CTF_VARARG|CTMASK_CID)) + - (decl->fattr & ~CTMASK_CID); -#endif - } else { - if ((decl->attr & CTFP_ALIGNED) && !(decl->mode & CPARSE_MODE_FIELD)) - cp_push(decl, CTINFO(CT_ATTRIB, CTATTRIB(CTA_ALIGN)), - ctype_align(decl->attr)); - } -} - -/* Push unrolled type to declaration stack and merge qualifiers. */ -static void cp_push_type(CPDecl *decl, CTypeID id) -{ - CType *ct = ctype_get(decl->cp->cts, id); - CTInfo info = ct->info; - CTSize size = ct->size; - switch (ctype_type(info)) { - case CT_STRUCT: case CT_ENUM: - cp_push(decl, CTINFO(CT_TYPEDEF, id), 0); /* Don't copy unique types. */ - if ((decl->attr & CTF_QUAL)) { /* Push unmerged qualifiers. */ - cp_push(decl, CTINFO(CT_ATTRIB, CTATTRIB(CTA_QUAL)), - (decl->attr & CTF_QUAL)); - decl->attr &= ~CTF_QUAL; - } - break; - case CT_ATTRIB: - if (ctype_isxattrib(info, CTA_QUAL)) - decl->attr &= ~size; /* Remove redundant qualifiers. */ - cp_push_type(decl, ctype_cid(info)); /* Unroll. */ - cp_push(decl, info & ~CTMASK_CID, size); /* Copy type. */ - break; - case CT_ARRAY: - cp_push_type(decl, ctype_cid(info)); /* Unroll. */ - cp_push(decl, info & ~CTMASK_CID, size); /* Copy type. */ - decl->stack[decl->pos].sib = 1; /* Mark as already checked and sized. */ - /* Note: this is not copied to the ct->sib in the C type table. */ - break; - case CT_FUNC: - /* Copy type, link parameters (shared). */ - decl->stack[cp_push(decl, info, size)].sib = ct->sib; - break; - default: - /* Copy type, merge common qualifiers. */ - cp_push(decl, info|(decl->attr & CTF_QUAL), size); - decl->attr &= ~CTF_QUAL; - break; - } -} - -/* Consume the declaration element chain and intern the C type. */ -static CTypeID cp_decl_intern(CPState *cp, CPDecl *decl) -{ - CTypeID id = 0; - CPDeclIdx idx = 0; - CTSize csize = CTSIZE_INVALID; - CTSize cinfo = 0; - do { - CType *ct = &decl->stack[idx]; - CTInfo info = ct->info; - CTInfo size = ct->size; - /* The cid is already part of info for copies of pointers/functions. */ - idx = ct->next; - if (ctype_istypedef(info)) { - lua_assert(id == 0); - id = ctype_cid(info); - /* Always refetch info/size, since struct/enum may have been completed. */ - cinfo = ctype_get(cp->cts, id)->info; - csize = ctype_get(cp->cts, id)->size; - lua_assert(ctype_isstruct(cinfo) || ctype_isenum(cinfo)); - } else if (ctype_isfunc(info)) { /* Intern function. */ - CType *fct; - CTypeID fid; - CTypeID sib; - if (id) { - CType *refct = ctype_raw(cp->cts, id); - /* Reject function or refarray return types. */ - if (ctype_isfunc(refct->info) || ctype_isrefarray(refct->info)) - cp_err(cp, LJ_ERR_FFI_INVTYPE); - } - /* No intervening attributes allowed, skip forward. */ - while (idx) { - CType *ctn = &decl->stack[idx]; - if (!ctype_isattrib(ctn->info)) break; - idx = ctn->next; /* Skip attribute. */ - } - sib = ct->sib; /* Next line may reallocate the C type table. */ - fid = lj_ctype_new(cp->cts, &fct); - csize = CTSIZE_INVALID; - fct->info = cinfo = info + id; - fct->size = size; - fct->sib = sib; - id = fid; - } else if (ctype_isattrib(info)) { - if (ctype_isxattrib(info, CTA_QUAL)) - cinfo |= size; - else if (ctype_isxattrib(info, CTA_ALIGN)) - CTF_INSERT(cinfo, ALIGN, size); - id = lj_ctype_intern(cp->cts, info+id, size); - /* Inherit csize/cinfo from original type. */ - } else { - if (ctype_isnum(info)) { /* Handle mode/vector-size attributes. */ - lua_assert(id == 0); - if (!(info & CTF_BOOL)) { - CTSize msize = ctype_msizeP(decl->attr); - CTSize vsize = ctype_vsizeP(decl->attr); - if (msize && (!(info & CTF_FP) || (msize == 4 || msize == 8))) { - CTSize malign = lj_fls(msize); - if (malign > 4) malign = 4; /* Limit alignment. */ - CTF_INSERT(info, ALIGN, malign); - size = msize; /* Override size via mode. */ - } - if (vsize) { /* Vector size set? */ - CTSize esize = lj_fls(size); - if (vsize >= esize) { - /* Intern the element type first. */ - id = lj_ctype_intern(cp->cts, info, size); - /* Then create a vector (array) with vsize alignment. */ - size = (1u << vsize); - if (vsize > 4) vsize = 4; /* Limit alignment. */ - if (ctype_align(info) > vsize) vsize = ctype_align(info); - info = CTINFO(CT_ARRAY, (info & CTF_QUAL) + CTF_VECTOR + - CTALIGN(vsize)); - } - } - } - } else if (ctype_isptr(info)) { - /* Reject pointer/ref to ref. */ - if (id && ctype_isref(ctype_raw(cp->cts, id)->info)) - cp_err(cp, LJ_ERR_FFI_INVTYPE); - if (ctype_isref(info)) { - info &= ~CTF_VOLATILE; /* Refs are always const, never volatile. */ - /* No intervening attributes allowed, skip forward. */ - while (idx) { - CType *ctn = &decl->stack[idx]; - if (!ctype_isattrib(ctn->info)) break; - idx = ctn->next; /* Skip attribute. */ - } - } - } else if (ctype_isarray(info)) { /* Check for valid array size etc. */ - if (ct->sib == 0) { /* Only check/size arrays not copied by unroll. */ - if (ctype_isref(cinfo)) /* Reject arrays of refs. */ - cp_err(cp, LJ_ERR_FFI_INVTYPE); - /* Reject VLS or unknown-sized types. */ - if (ctype_isvltype(cinfo) || csize == CTSIZE_INVALID) - cp_err(cp, LJ_ERR_FFI_INVSIZE); - /* a[] and a[?] keep their invalid size. */ - if (size != CTSIZE_INVALID) { - uint64_t xsz = (uint64_t)size * csize; - if (xsz >= 0x80000000u) cp_err(cp, LJ_ERR_FFI_INVSIZE); - size = (CTSize)xsz; - } - } - if ((cinfo & CTF_ALIGN) > (info & CTF_ALIGN)) /* Find max. align. */ - info = (info & ~CTF_ALIGN) | (cinfo & CTF_ALIGN); - info |= (cinfo & CTF_QUAL); /* Inherit qual. */ - } else { - lua_assert(ctype_isvoid(info)); - } - csize = size; - cinfo = info+id; - id = lj_ctype_intern(cp->cts, info+id, size); - } - } while (idx); - return id; -} - -/* -- C declaration parser ------------------------------------------------ */ - -#define H_(le, be) LJ_ENDIAN_SELECT(0x##le, 0x##be) - -/* Reset declaration state to declaration specifier. */ -static void cp_decl_reset(CPDecl *decl) -{ - decl->pos = decl->specpos; - decl->top = decl->specpos+1; - decl->stack[decl->specpos].next = 0; - decl->attr = decl->specattr; - decl->fattr = decl->specfattr; - decl->name = NULL; - decl->redir = NULL; -} - -/* Parse constant initializer. */ -/* NYI: FP constants and strings as initializers. */ -static CTypeID cp_decl_constinit(CPState *cp, CType **ctp, CTypeID ctypeid) -{ - CType *ctt = ctype_get(cp->cts, ctypeid); - CTInfo info; - CTSize size; - CPValue k; - CTypeID constid; - while (ctype_isattrib(ctt->info)) { /* Skip attributes. */ - ctypeid = ctype_cid(ctt->info); /* Update ID, too. */ - ctt = ctype_get(cp->cts, ctypeid); - } - info = ctt->info; - size = ctt->size; - if (!ctype_isinteger(info) || !(info & CTF_CONST) || size > 4) - cp_err(cp, LJ_ERR_FFI_INVTYPE); - cp_check(cp, '='); - cp_expr_sub(cp, &k, 0); - constid = lj_ctype_new(cp->cts, ctp); - (*ctp)->info = CTINFO(CT_CONSTVAL, CTF_CONST|ctypeid); - k.u32 <<= 8*(4-size); - if ((info & CTF_UNSIGNED)) - k.u32 >>= 8*(4-size); - else - k.u32 = (uint32_t)((int32_t)k.u32 >> 8*(4-size)); - (*ctp)->size = k.u32; - return constid; -} - -/* Parse size in parentheses as part of attribute. */ -static CTSize cp_decl_sizeattr(CPState *cp) -{ - CTSize sz; - uint32_t oldtmask = cp->tmask; - cp->tmask = CPNS_DEFAULT; /* Required for expression evaluator. */ - cp_check(cp, '('); - sz = cp_expr_ksize(cp); - cp->tmask = oldtmask; - cp_check(cp, ')'); - return sz; -} - -/* Parse alignment attribute. */ -static void cp_decl_align(CPState *cp, CPDecl *decl) -{ - CTSize al = 4; /* Unspecified alignment is 16 bytes. */ - if (cp->tok == '(') { - al = cp_decl_sizeattr(cp); - al = al ? lj_fls(al) : 0; - } - CTF_INSERT(decl->attr, ALIGN, al); - decl->attr |= CTFP_ALIGNED; -} - -/* Parse GCC asm("name") redirect. */ -static void cp_decl_asm(CPState *cp, CPDecl *decl) -{ - UNUSED(decl); - cp_next(cp); - cp_check(cp, '('); - if (cp->tok == CTOK_STRING) { - GCstr *str = cp->str; - while (cp_next(cp) == CTOK_STRING) { - lj_str_pushf(cp->L, "%s%s", strdata(str), strdata(cp->str)); - cp->L->top--; - str = strV(cp->L->top); - } - decl->redir = str; - } - cp_check(cp, ')'); -} - -/* Parse GCC __attribute__((mode(...))). */ -static void cp_decl_mode(CPState *cp, CPDecl *decl) -{ - cp_check(cp, '('); - if (cp->tok == CTOK_IDENT) { - const char *s = strdata(cp->str); - CTSize sz = 0, vlen = 0; - if (s[0] == '_' && s[1] == '_') s += 2; - if (*s == 'V') { - s++; - vlen = *s++ - '0'; - if (*s >= '0' && *s <= '9') - vlen = vlen*10 + (*s++ - '0'); - } - switch (*s++) { - case 'Q': sz = 1; break; - case 'H': sz = 2; break; - case 'S': sz = 4; break; - case 'D': sz = 8; break; - case 'T': sz = 16; break; - case 'O': sz = 32; break; - default: goto bad_size; - } - if (*s == 'I' || *s == 'F') { - CTF_INSERT(decl->attr, MSIZEP, sz); - if (vlen) CTF_INSERT(decl->attr, VSIZEP, lj_fls(vlen*sz)); - } - bad_size: - cp_next(cp); - } - cp_check(cp, ')'); -} - -/* Parse GCC __attribute__((...)). */ -static void cp_decl_gccattribute(CPState *cp, CPDecl *decl) -{ - cp_next(cp); - cp_check(cp, '('); - cp_check(cp, '('); - while (cp->tok != ')') { - if (cp->tok == CTOK_IDENT) { - GCstr *attrstr = cp->str; - cp_next(cp); - switch (attrstr->hash) { - case H_(64a9208e,8ce14319): case H_(8e6331b2,95a282af): /* aligned */ - cp_decl_align(cp, decl); - break; - case H_(42eb47de,f0ede26c): case H_(29f48a09,cf383e0c): /* packed */ - decl->attr |= CTFP_PACKED; - break; - case H_(0a84eef6,8dfab04c): case H_(995cf92c,d5696591): /* mode */ - cp_decl_mode(cp, decl); - break; - case H_(0ab31997,2d5213fa): case H_(bf875611,200e9990): /* vector_size */ - { - CTSize vsize = cp_decl_sizeattr(cp); - if (vsize) CTF_INSERT(decl->attr, VSIZEP, lj_fls(vsize)); - } - break; -#if LJ_TARGET_X86 - case H_(5ad22db8,c689b848): case H_(439150fa,65ea78cb): /* regparm */ - CTF_INSERT(decl->fattr, REGPARM, cp_decl_sizeattr(cp)); - decl->fattr |= CTFP_CCONV; - break; - case H_(18fc0b98,7ff4c074): case H_(4e62abed,0a747424): /* cdecl */ - CTF_INSERT(decl->fattr, CCONV, CTCC_CDECL); - decl->fattr |= CTFP_CCONV; - break; - case H_(72b2e41b,494c5a44): case H_(f2356d59,f25fc9bd): /* thiscall */ - CTF_INSERT(decl->fattr, CCONV, CTCC_THISCALL); - decl->fattr |= CTFP_CCONV; - break; - case H_(0d0ffc42,ab746f88): case H_(21c54ba1,7f0ca7e3): /* fastcall */ - CTF_INSERT(decl->fattr, CCONV, CTCC_FASTCALL); - decl->fattr |= CTFP_CCONV; - break; - case H_(ef76b040,9412e06a): case H_(de56697b,c750e6e1): /* stdcall */ - CTF_INSERT(decl->fattr, CCONV, CTCC_STDCALL); - decl->fattr |= CTFP_CCONV; - break; - case H_(ea78b622,f234bd8e): case H_(252ffb06,8d50f34b): /* sseregparm */ - decl->fattr |= CTF_SSEREGPARM; - decl->fattr |= CTFP_CCONV; - break; -#endif - default: /* Skip all other attributes. */ - goto skip_attr; - } - } else if (cp->tok >= CTOK_FIRSTDECL) { /* For __attribute((const)) etc. */ - cp_next(cp); - skip_attr: - if (cp_opt(cp, '(')) { - while (cp->tok != ')' && cp->tok != CTOK_EOF) cp_next(cp); - cp_check(cp, ')'); - } - } else { - break; - } - if (!cp_opt(cp, ',')) break; - } - cp_check(cp, ')'); - cp_check(cp, ')'); -} - -/* Parse MSVC __declspec(...). */ -static void cp_decl_msvcattribute(CPState *cp, CPDecl *decl) -{ - cp_next(cp); - cp_check(cp, '('); - while (cp->tok == CTOK_IDENT) { - GCstr *attrstr = cp->str; - cp_next(cp); - switch (attrstr->hash) { - case H_(bc2395fa,98f267f8): /* align */ - cp_decl_align(cp, decl); - break; - default: /* Ignore all other attributes. */ - if (cp_opt(cp, '(')) { - while (cp->tok != ')' && cp->tok != CTOK_EOF) cp_next(cp); - cp_check(cp, ')'); - } - break; - } - } - cp_check(cp, ')'); -} - -/* Parse declaration attributes (and common qualifiers). */ -static void cp_decl_attributes(CPState *cp, CPDecl *decl) -{ - for (;;) { - switch (cp->tok) { - case CTOK_CONST: decl->attr |= CTF_CONST; break; - case CTOK_VOLATILE: decl->attr |= CTF_VOLATILE; break; - case CTOK_RESTRICT: break; /* Ignore. */ - case CTOK_EXTENSION: break; /* Ignore. */ - case CTOK_ATTRIBUTE: cp_decl_gccattribute(cp, decl); continue; - case CTOK_ASM: cp_decl_asm(cp, decl); continue; - case CTOK_DECLSPEC: cp_decl_msvcattribute(cp, decl); continue; - case CTOK_CCDECL: -#if LJ_TARGET_X86 - CTF_INSERT(decl->fattr, CCONV, cp->ct->size); - decl->fattr |= CTFP_CCONV; -#endif - break; - case CTOK_PTRSZ: -#if LJ_64 - CTF_INSERT(decl->attr, MSIZEP, cp->ct->size); -#endif - break; - default: return; - } - cp_next(cp); - } -} - -/* Parse struct/union/enum name. */ -static CTypeID cp_struct_name(CPState *cp, CPDecl *sdecl, CTInfo info) -{ - CTypeID sid; - CType *ct; - cp->tmask = CPNS_STRUCT; - cp_next(cp); - cp_decl_attributes(cp, sdecl); - cp->tmask = CPNS_DEFAULT; - if (cp->tok != '{') { - if (cp->tok != CTOK_IDENT) cp_err_token(cp, CTOK_IDENT); - if (cp->val.id) { /* Name of existing struct/union/enum. */ - sid = cp->val.id; - ct = cp->ct; - if ((ct->info ^ info) & (CTMASK_NUM|CTF_UNION)) /* Wrong type. */ - cp_errmsg(cp, 0, LJ_ERR_FFI_REDEF, strdata(gco2str(gcref(ct->name)))); - } else { /* Create named, incomplete struct/union/enum. */ - if ((cp->mode & CPARSE_MODE_NOIMPLICIT)) - cp_errmsg(cp, 0, LJ_ERR_FFI_BADTAG, strdata(cp->str)); - sid = lj_ctype_new(cp->cts, &ct); - ct->info = info; - ct->size = CTSIZE_INVALID; - ctype_setname(ct, cp->str); - lj_ctype_addname(cp->cts, ct, sid); - } - cp_next(cp); - } else { /* Create anonymous, incomplete struct/union/enum. */ - sid = lj_ctype_new(cp->cts, &ct); - ct->info = info; - ct->size = CTSIZE_INVALID; - } - if (cp->tok == '{') { - if (ct->size != CTSIZE_INVALID || ct->sib) - cp_errmsg(cp, 0, LJ_ERR_FFI_REDEF, strdata(gco2str(gcref(ct->name)))); - ct->sib = 1; /* Indicate the type is currently being defined. */ - } - return sid; -} - -/* Determine field alignment. */ -static CTSize cp_field_align(CPState *cp, CType *ct, CTInfo info) -{ - CTSize align = ctype_align(info); - UNUSED(cp); UNUSED(ct); -#if (LJ_TARGET_X86 && !LJ_ABI_WIN) || (LJ_TARGET_ARM && __APPLE__) - /* The SYSV i386 and iOS ABIs limit alignment of non-vector fields to 2^2. */ - if (align > 2 && !(info & CTFP_ALIGNED)) { - if (ctype_isarray(info) && !(info & CTF_VECTOR)) { - do { - ct = ctype_rawchild(cp->cts, ct); - info = ct->info; - } while (ctype_isarray(info) && !(info & CTF_VECTOR)); - } - if (ctype_isnum(info) || ctype_isenum(info)) - align = 2; - } -#endif - return align; -} - -/* Layout struct/union fields. */ -static void cp_struct_layout(CPState *cp, CTypeID sid, CTInfo sattr) -{ - CTSize bofs = 0, bmaxofs = 0; /* Bit offset and max. bit offset. */ - CTSize maxalign = ctype_align(sattr); - CType *sct = ctype_get(cp->cts, sid); - CTInfo sinfo = sct->info; - CTypeID fieldid = sct->sib; - while (fieldid) { - CType *ct = ctype_get(cp->cts, fieldid); - CTInfo attr = ct->size; /* Field declaration attributes (temp.). */ - - if (ctype_isfield(ct->info) || - (ctype_isxattrib(ct->info, CTA_SUBTYPE) && attr)) { - CTSize align, amask; /* Alignment (pow2) and alignment mask (bits). */ - CTSize sz; - CTInfo info = lj_ctype_info(cp->cts, ctype_cid(ct->info), &sz); - CTSize bsz, csz = 8*sz; /* Field size and container size (in bits). */ - sinfo |= (info & (CTF_QUAL|CTF_VLA)); /* Merge pseudo-qualifiers. */ - - /* Check for size overflow and determine alignment. */ - if (sz >= 0x20000000u || bofs + csz < bofs || (info & CTF_VLA)) { - if (!(sz == CTSIZE_INVALID && ctype_isarray(info) && - !(sinfo & CTF_UNION))) - cp_err(cp, LJ_ERR_FFI_INVSIZE); - csz = sz = 0; /* Treat a[] and a[?] as zero-sized. */ - } - align = cp_field_align(cp, ct, info); - if (((attr|sattr) & CTFP_PACKED) || - ((attr & CTFP_ALIGNED) && ctype_align(attr) > align)) - align = ctype_align(attr); - if (cp->packstack[cp->curpack] < align) - align = cp->packstack[cp->curpack]; - if (align > maxalign) maxalign = align; - amask = (8u << align) - 1; - - bsz = ctype_bitcsz(ct->info); /* Bitfield size (temp.). */ - if (bsz == CTBSZ_FIELD || !ctype_isfield(ct->info)) { - bsz = csz; /* Regular fields or subtypes always fill the container. */ - bofs = (bofs + amask) & ~amask; /* Start new aligned field. */ - ct->size = (bofs >> 3); /* Store field offset. */ - } else { /* Bitfield. */ - if (bsz == 0 || (attr & CTFP_ALIGNED) || - (!((attr|sattr) & CTFP_PACKED) && (bofs & amask) + bsz > csz)) - bofs = (bofs + amask) & ~amask; /* Start new aligned field. */ - - /* Prefer regular field over bitfield. */ - if (bsz == csz && (bofs & amask) == 0) { - ct->info = CTINFO(CT_FIELD, ctype_cid(ct->info)); - ct->size = (bofs >> 3); /* Store field offset. */ - } else { - ct->info = CTINFO(CT_BITFIELD, - (info & (CTF_QUAL|CTF_UNSIGNED|CTF_BOOL)) + - (csz << (CTSHIFT_BITCSZ-3)) + (bsz << CTSHIFT_BITBSZ)); -#if LJ_BE - ct->info += ((csz - (bofs & (csz-1)) - bsz) << CTSHIFT_BITPOS); -#else - ct->info += ((bofs & (csz-1)) << CTSHIFT_BITPOS); -#endif - ct->size = ((bofs & ~(csz-1)) >> 3); /* Store container offset. */ - } - } - - /* Determine next offset or max. offset. */ - if ((sinfo & CTF_UNION)) { - if (bsz > bmaxofs) bmaxofs = bsz; - } else { - bofs += bsz; - } - } /* All other fields in the chain are already set up. */ - - fieldid = ct->sib; - } - - /* Complete struct/union. */ - sct->info = sinfo + CTALIGN(maxalign); - bofs = (sinfo & CTF_UNION) ? bmaxofs : bofs; - maxalign = (8u << maxalign) - 1; - sct->size = (((bofs + maxalign) & ~maxalign) >> 3); -} - -/* Parse struct/union declaration. */ -static CTypeID cp_decl_struct(CPState *cp, CPDecl *sdecl, CTInfo sinfo) -{ - CTypeID sid = cp_struct_name(cp, sdecl, sinfo); - if (cp_opt(cp, '{')) { /* Struct/union definition. */ - CTypeID lastid = sid; - int lastdecl = 0; - while (cp->tok != '}') { - CPDecl decl; - CPscl scl = cp_decl_spec(cp, &decl, CDF_STATIC); - decl.mode = scl ? CPARSE_MODE_DIRECT : - CPARSE_MODE_DIRECT|CPARSE_MODE_ABSTRACT|CPARSE_MODE_FIELD; - - for (;;) { - CTypeID ctypeid; - - if (lastdecl) cp_err_token(cp, '}'); - - /* Parse field declarator. */ - decl.bits = CTSIZE_INVALID; - cp_declarator(cp, &decl); - ctypeid = cp_decl_intern(cp, &decl); - - if ((scl & CDF_STATIC)) { /* Static constant in struct namespace. */ - CType *ct; - CTypeID fieldid = cp_decl_constinit(cp, &ct, ctypeid); - ctype_get(cp->cts, lastid)->sib = fieldid; - lastid = fieldid; - ctype_setname(ct, decl.name); - } else { - CTSize bsz = CTBSZ_FIELD; /* Temp. for layout phase. */ - CType *ct; - CTypeID fieldid = lj_ctype_new(cp->cts, &ct); /* Do this first. */ - CType *tct = ctype_raw(cp->cts, ctypeid); - - if (decl.bits == CTSIZE_INVALID) { /* Regular field. */ - if (ctype_isarray(tct->info) && tct->size == CTSIZE_INVALID) - lastdecl = 1; /* a[] or a[?] must be the last declared field. */ - - /* Accept transparent struct/union/enum. */ - if (!decl.name) { - if (!((ctype_isstruct(tct->info) && !(tct->info & CTF_VLA)) || - ctype_isenum(tct->info))) - cp_err_token(cp, CTOK_IDENT); - ct->info = CTINFO(CT_ATTRIB, CTATTRIB(CTA_SUBTYPE) + ctypeid); - ct->size = ctype_isstruct(tct->info) ? - (decl.attr|0x80000000u) : 0; /* For layout phase. */ - goto add_field; - } - } else { /* Bitfield. */ - bsz = decl.bits; - if (!ctype_isinteger_or_bool(tct->info) || - (bsz == 0 && decl.name) || 8*tct->size > CTBSZ_MAX || - bsz > ((tct->info & CTF_BOOL) ? 1 : 8*tct->size)) - cp_errmsg(cp, ':', LJ_ERR_BADVAL); - } - - /* Create temporary field for layout phase. */ - ct->info = CTINFO(CT_FIELD, ctypeid + (bsz << CTSHIFT_BITCSZ)); - ct->size = decl.attr; - if (decl.name) ctype_setname(ct, decl.name); - - add_field: - ctype_get(cp->cts, lastid)->sib = fieldid; - lastid = fieldid; - } - if (!cp_opt(cp, ',')) break; - cp_decl_reset(&decl); - } - cp_check(cp, ';'); - } - cp_check(cp, '}'); - ctype_get(cp->cts, lastid)->sib = 0; /* Drop sib = 1 for empty structs. */ - cp_decl_attributes(cp, sdecl); /* Layout phase needs postfix attributes. */ - cp_struct_layout(cp, sid, sdecl->attr); - } - return sid; -} - -/* Parse enum declaration. */ -static CTypeID cp_decl_enum(CPState *cp, CPDecl *sdecl) -{ - CTypeID eid = cp_struct_name(cp, sdecl, CTINFO(CT_ENUM, CTID_VOID)); - CTInfo einfo = CTINFO(CT_ENUM, CTALIGN(2) + CTID_UINT32); - CTSize esize = 4; /* Only 32 bit enums are supported. */ - if (cp_opt(cp, '{')) { /* Enum definition. */ - CPValue k; - CTypeID lastid = eid; - k.u32 = 0; - k.id = CTID_INT32; - do { - GCstr *name = cp->str; - if (cp->tok != CTOK_IDENT) cp_err_token(cp, CTOK_IDENT); - if (cp->val.id) cp_errmsg(cp, 0, LJ_ERR_FFI_REDEF, strdata(name)); - cp_next(cp); - if (cp_opt(cp, '=')) { - cp_expr_kint(cp, &k); - if (k.id == CTID_UINT32) { - /* C99 says that enum constants are always (signed) integers. - ** But since unsigned constants like 0x80000000 are quite common, - ** those are left as uint32_t. - */ - if (k.i32 >= 0) k.id = CTID_INT32; - } else { - /* OTOH it's common practice and even mandated by some ABIs - ** that the enum type itself is unsigned, unless there are any - ** negative constants. - */ - k.id = CTID_INT32; - if (k.i32 < 0) einfo = CTINFO(CT_ENUM, CTALIGN(2) + CTID_INT32); - } - } - /* Add named enum constant. */ - { - CType *ct; - CTypeID constid = lj_ctype_new(cp->cts, &ct); - ctype_get(cp->cts, lastid)->sib = constid; - lastid = constid; - ctype_setname(ct, name); - ct->info = CTINFO(CT_CONSTVAL, CTF_CONST|k.id); - ct->size = k.u32++; - if (k.u32 == 0x80000000u) k.id = CTID_UINT32; - lj_ctype_addname(cp->cts, ct, constid); - } - if (!cp_opt(cp, ',')) break; - } while (cp->tok != '}'); /* Trailing ',' is ok. */ - cp_check(cp, '}'); - /* Complete enum. */ - ctype_get(cp->cts, eid)->info = einfo; - ctype_get(cp->cts, eid)->size = esize; - } - return eid; -} - -/* Parse declaration specifiers. */ -static CPscl cp_decl_spec(CPState *cp, CPDecl *decl, CPscl scl) -{ - uint32_t cds = 0, sz = 0; - CTypeID tdef = 0; - - decl->cp = cp; - decl->mode = cp->mode; - decl->name = NULL; - decl->redir = NULL; - decl->attr = 0; - decl->fattr = 0; - decl->pos = decl->top = 0; - decl->stack[0].next = 0; - - for (;;) { /* Parse basic types. */ - cp_decl_attributes(cp, decl); - if (cp->tok >= CTOK_FIRSTDECL && cp->tok <= CTOK_LASTDECLFLAG) { - uint32_t cbit; - if (cp->ct->size) { - if (sz) goto end_decl; - sz = cp->ct->size; - } - cbit = (1u << (cp->tok - CTOK_FIRSTDECL)); - cds = cds | cbit | ((cbit & cds & CDF_LONG) << 1); - if (cp->tok >= CTOK_FIRSTSCL) { - if (!(scl & cbit)) cp_errmsg(cp, cp->tok, LJ_ERR_FFI_BADSCL); - } else if (tdef) { - goto end_decl; - } - cp_next(cp); - continue; - } - if (sz || tdef || - (cds & (CDF_SHORT|CDF_LONG|CDF_SIGNED|CDF_UNSIGNED|CDF_COMPLEX))) - break; - switch (cp->tok) { - case CTOK_STRUCT: - tdef = cp_decl_struct(cp, decl, CTINFO(CT_STRUCT, 0)); - continue; - case CTOK_UNION: - tdef = cp_decl_struct(cp, decl, CTINFO(CT_STRUCT, CTF_UNION)); - continue; - case CTOK_ENUM: - tdef = cp_decl_enum(cp, decl); - continue; - case CTOK_IDENT: - if (ctype_istypedef(cp->ct->info)) { - tdef = ctype_cid(cp->ct->info); /* Get typedef. */ - cp_next(cp); - continue; - } - break; - case '$': - tdef = cp->val.id; - cp_next(cp); - continue; - default: - break; - } - break; - } -end_decl: - - if ((cds & CDF_COMPLEX)) /* Use predefined complex types. */ - tdef = sz == 4 ? CTID_COMPLEX_FLOAT : CTID_COMPLEX_DOUBLE; - - if (tdef) { - cp_push_type(decl, tdef); - } else if ((cds & CDF_VOID)) { - cp_push(decl, CTINFO(CT_VOID, (decl->attr & CTF_QUAL)), CTSIZE_INVALID); - decl->attr &= ~CTF_QUAL; - } else { - /* Determine type info and size. */ - CTInfo info = CTINFO(CT_NUM, (cds & CDF_UNSIGNED) ? CTF_UNSIGNED : 0); - if ((cds & CDF_BOOL)) { - if ((cds & ~(CDF_SCL|CDF_BOOL|CDF_INT|CDF_SIGNED|CDF_UNSIGNED))) - cp_errmsg(cp, 0, LJ_ERR_FFI_INVTYPE); - info |= CTF_BOOL; - if (!(cds & CDF_SIGNED)) info |= CTF_UNSIGNED; - if (!sz) { - sz = 1; - } - } else if ((cds & CDF_FP)) { - info = CTINFO(CT_NUM, CTF_FP); - if ((cds & CDF_LONG)) sz = sizeof(long double); - } else if ((cds & CDF_CHAR)) { - if ((cds & (CDF_CHAR|CDF_SIGNED|CDF_UNSIGNED)) == CDF_CHAR) - info |= CTF_UCHAR; /* Handle platforms where char is unsigned. */ - } else if ((cds & CDF_SHORT)) { - sz = sizeof(short); - } else if ((cds & CDF_LONGLONG)) { - sz = 8; - } else if ((cds & CDF_LONG)) { - info |= CTF_LONG; - sz = sizeof(long); - } else if (!sz) { - if (!(cds & (CDF_SIGNED|CDF_UNSIGNED))) - cp_errmsg(cp, cp->tok, LJ_ERR_FFI_DECLSPEC); - sz = sizeof(int); - } - lua_assert(sz != 0); - info += CTALIGN(lj_fls(sz)); /* Use natural alignment. */ - info += (decl->attr & CTF_QUAL); /* Merge qualifiers. */ - cp_push(decl, info, sz); - decl->attr &= ~CTF_QUAL; - } - decl->specpos = decl->pos; - decl->specattr = decl->attr; - decl->specfattr = decl->fattr; - return (cds & CDF_SCL); /* Return storage class. */ -} - -/* Parse array declaration. */ -static void cp_decl_array(CPState *cp, CPDecl *decl) -{ - CTInfo info = CTINFO(CT_ARRAY, 0); - CTSize nelem = CTSIZE_INVALID; /* Default size for a[] or a[?]. */ - cp_decl_attributes(cp, decl); - if (cp_opt(cp, '?')) - info |= CTF_VLA; /* Create variable-length array a[?]. */ - else if (cp->tok != ']') - nelem = cp_expr_ksize(cp); - cp_check(cp, ']'); - cp_add(decl, info, nelem); -} - -/* Parse function declaration. */ -static void cp_decl_func(CPState *cp, CPDecl *fdecl) -{ - CTSize nargs = 0; - CTInfo info = CTINFO(CT_FUNC, 0); - CTypeID lastid = 0, anchor = 0; - if (cp->tok != ')') { - do { - CPDecl decl; - CTypeID ctypeid, fieldid; - CType *ct; - if (cp_opt(cp, '.')) { /* Vararg function. */ - cp_check(cp, '.'); /* Workaround for the minimalistic lexer. */ - cp_check(cp, '.'); - info |= CTF_VARARG; - break; - } - cp_decl_spec(cp, &decl, CDF_REGISTER); - decl.mode = CPARSE_MODE_DIRECT|CPARSE_MODE_ABSTRACT; - cp_declarator(cp, &decl); - ctypeid = cp_decl_intern(cp, &decl); - ct = ctype_raw(cp->cts, ctypeid); - if (ctype_isvoid(ct->info)) - break; - else if (ctype_isrefarray(ct->info)) - ctypeid = lj_ctype_intern(cp->cts, - CTINFO(CT_PTR, CTALIGN_PTR|ctype_cid(ct->info)), CTSIZE_PTR); - else if (ctype_isfunc(ct->info)) - ctypeid = lj_ctype_intern(cp->cts, - CTINFO(CT_PTR, CTALIGN_PTR|ctypeid), CTSIZE_PTR); - /* Add new parameter. */ - fieldid = lj_ctype_new(cp->cts, &ct); - if (anchor) - ctype_get(cp->cts, lastid)->sib = fieldid; - else - anchor = fieldid; - lastid = fieldid; - if (decl.name) ctype_setname(ct, decl.name); - ct->info = CTINFO(CT_FIELD, ctypeid); - ct->size = nargs++; - } while (cp_opt(cp, ',')); - } - cp_check(cp, ')'); - if (cp_opt(cp, '{')) { /* Skip function definition. */ - int level = 1; - cp->mode |= CPARSE_MODE_SKIP; - for (;;) { - if (cp->tok == '{') level++; - else if (cp->tok == '}' && --level == 0) break; - else if (cp->tok == CTOK_EOF) cp_err_token(cp, '}'); - cp_next(cp); - } - cp->mode &= ~CPARSE_MODE_SKIP; - cp->tok = ';'; /* Ok for cp_decl_multi(), error in cp_decl_single(). */ - } - info |= (fdecl->fattr & ~CTMASK_CID); - fdecl->fattr = 0; - fdecl->stack[cp_add(fdecl, info, nargs)].sib = anchor; -} - -/* Parse declarator. */ -static void cp_declarator(CPState *cp, CPDecl *decl) -{ - if (++cp->depth > CPARSE_MAX_DECLDEPTH) cp_err(cp, LJ_ERR_XLEVELS); - - for (;;) { /* Head of declarator. */ - if (cp_opt(cp, '*')) { /* Pointer. */ - CTSize sz; - CTInfo info; - cp_decl_attributes(cp, decl); - sz = CTSIZE_PTR; - info = CTINFO(CT_PTR, CTALIGN_PTR); -#if LJ_64 - if (ctype_msizeP(decl->attr) == 4) { - sz = 4; - info = CTINFO(CT_PTR, CTALIGN(2)); - } -#endif - info += (decl->attr & (CTF_QUAL|CTF_REF)); - decl->attr &= ~(CTF_QUAL|(CTMASK_MSIZEP<attr &= ~(CTF_QUAL|(CTMASK_MSIZEP<mode & CPARSE_MODE_ABSTRACT) && - (cp->tok == ')' || cp_istypedecl(cp))) goto func_decl; - pos = decl->pos; - cp_declarator(cp, decl); - cp_check(cp, ')'); - decl->pos = pos; - } else if (cp->tok == CTOK_IDENT) { /* Direct declarator. */ - if (!(decl->mode & CPARSE_MODE_DIRECT)) cp_err_token(cp, CTOK_EOF); - decl->name = cp->str; - decl->nameid = cp->val.id; - cp_next(cp); - } else { /* Abstract declarator. */ - if (!(decl->mode & CPARSE_MODE_ABSTRACT)) cp_err_token(cp, CTOK_IDENT); - } - - for (;;) { /* Tail of declarator. */ - if (cp_opt(cp, '[')) { /* Array. */ - cp_decl_array(cp, decl); - } else if (cp_opt(cp, '(')) { /* Function. */ - func_decl: - cp_decl_func(cp, decl); - } else { - break; - } - } - - if ((decl->mode & CPARSE_MODE_FIELD) && cp_opt(cp, ':')) /* Field width. */ - decl->bits = cp_expr_ksize(cp); - - /* Process postfix attributes. */ - cp_decl_attributes(cp, decl); - cp_push_attributes(decl); - - cp->depth--; -} - -/* Parse an abstract type declaration and return it's C type ID. */ -static CTypeID cp_decl_abstract(CPState *cp) -{ - CPDecl decl; - cp_decl_spec(cp, &decl, 0); - decl.mode = CPARSE_MODE_ABSTRACT; - cp_declarator(cp, &decl); - return cp_decl_intern(cp, &decl); -} - -/* Handle pragmas. */ -static void cp_pragma(CPState *cp, BCLine pragmaline) -{ - cp_next(cp); - if (cp->tok == CTOK_IDENT && - cp->str->hash == H_(e79b999f,42ca3e85)) { /* pack */ - cp_next(cp); - cp_check(cp, '('); - if (cp->tok == CTOK_IDENT) { - if (cp->str->hash == H_(738e923c,a1b65954)) { /* push */ - if (cp->curpack < CPARSE_MAX_PACKSTACK) { - cp->packstack[cp->curpack+1] = cp->packstack[cp->curpack]; - cp->curpack++; - } - } else if (cp->str->hash == H_(6c71cf27,6c71cf27)) { /* pop */ - if (cp->curpack > 0) cp->curpack--; - } else { - cp_errmsg(cp, cp->tok, LJ_ERR_XSYMBOL); - } - cp_next(cp); - if (!cp_opt(cp, ',')) goto end_pack; - } - if (cp->tok == CTOK_INTEGER) { - cp->packstack[cp->curpack] = cp->val.u32 ? lj_fls(cp->val.u32) : 0; - cp_next(cp); - } else { - cp->packstack[cp->curpack] = 255; - } - end_pack: - cp_check(cp, ')'); - } else { /* Ignore all other pragmas. */ - while (cp->tok != CTOK_EOF && cp->linenumber == pragmaline) - cp_next(cp); - } -} - -/* Parse multiple C declarations of types or extern identifiers. */ -static void cp_decl_multi(CPState *cp) -{ - int first = 1; - while (cp->tok != CTOK_EOF) { - CPDecl decl; - CPscl scl; - if (cp_opt(cp, ';')) { /* Skip empty statements. */ - first = 0; - continue; - } - if (cp->tok == '#') { /* Workaround, since we have no preprocessor, yet. */ - BCLine pragmaline = cp->linenumber; - if (!(cp_next(cp) == CTOK_IDENT && - cp->str->hash == H_(f5e6b4f8,1d509107))) /* pragma */ - cp_errmsg(cp, cp->tok, LJ_ERR_XSYMBOL); - cp_pragma(cp, pragmaline); - continue; - } - scl = cp_decl_spec(cp, &decl, CDF_TYPEDEF|CDF_EXTERN|CDF_STATIC); - if ((cp->tok == ';' || cp->tok == CTOK_EOF) && - ctype_istypedef(decl.stack[0].info)) { - CTInfo info = ctype_rawchild(cp->cts, &decl.stack[0])->info; - if (ctype_isstruct(info) || ctype_isenum(info)) - goto decl_end; /* Accept empty declaration of struct/union/enum. */ - } - for (;;) { - CTypeID ctypeid; - cp_declarator(cp, &decl); - ctypeid = cp_decl_intern(cp, &decl); - if (decl.name && !decl.nameid) { /* NYI: redeclarations are ignored. */ - CType *ct; - CTypeID id; - if ((scl & CDF_TYPEDEF)) { /* Create new typedef. */ - id = lj_ctype_new(cp->cts, &ct); - ct->info = CTINFO(CT_TYPEDEF, ctypeid); - goto noredir; - } else if (ctype_isfunc(ctype_get(cp->cts, ctypeid)->info)) { - /* Treat both static and extern function declarations as extern. */ - ct = ctype_get(cp->cts, ctypeid); - /* We always get new anonymous functions (typedefs are copied). */ - lua_assert(gcref(ct->name) == NULL); - id = ctypeid; /* Just name it. */ - } else if ((scl & CDF_STATIC)) { /* Accept static constants. */ - id = cp_decl_constinit(cp, &ct, ctypeid); - goto noredir; - } else { /* External references have extern or no storage class. */ - id = lj_ctype_new(cp->cts, &ct); - ct->info = CTINFO(CT_EXTERN, ctypeid); - } - if (decl.redir) { /* Add attribute for redirected symbol name. */ - CType *cta; - CTypeID aid = lj_ctype_new(cp->cts, &cta); - ct = ctype_get(cp->cts, id); /* Table may have been reallocated. */ - cta->info = CTINFO(CT_ATTRIB, CTATTRIB(CTA_REDIR)); - cta->sib = ct->sib; - ct->sib = aid; - ctype_setname(cta, decl.redir); - } - noredir: - ctype_setname(ct, decl.name); - lj_ctype_addname(cp->cts, ct, id); - } - if (!cp_opt(cp, ',')) break; - cp_decl_reset(&decl); - } - decl_end: - if (cp->tok == CTOK_EOF && first) break; /* May omit ';' for 1 decl. */ - first = 0; - cp_check(cp, ';'); - } -} - -/* Parse a single C type declaration. */ -static void cp_decl_single(CPState *cp) -{ - CPDecl decl; - cp_decl_spec(cp, &decl, 0); - cp_declarator(cp, &decl); - cp->val.id = cp_decl_intern(cp, &decl); - if (cp->tok != CTOK_EOF) cp_err_token(cp, CTOK_EOF); -} - -#undef H_ - -/* ------------------------------------------------------------------------ */ - -/* Protected callback for C parser. */ -static TValue *cpcparser(lua_State *L, lua_CFunction dummy, void *ud) -{ - CPState *cp = (CPState *)ud; - UNUSED(dummy); - cframe_errfunc(L->cframe) = -1; /* Inherit error function. */ - cp_init(cp); - if ((cp->mode & CPARSE_MODE_MULTI)) - cp_decl_multi(cp); - else - cp_decl_single(cp); - if (cp->param && cp->param != cp->L->top) - cp_err(cp, LJ_ERR_FFI_NUMPARAM); - lua_assert(cp->depth == 0); - return NULL; -} - -/* C parser. */ -int lj_cparse(CPState *cp) -{ - LJ_CTYPE_SAVE(cp->cts); - int errcode = lj_vm_cpcall(cp->L, NULL, cp, cpcparser); - if (errcode) - LJ_CTYPE_RESTORE(cp->cts); - cp_cleanup(cp); - return errcode; -} - -#endif diff --git a/deps/luajit/src/lj_cparse.h b/deps/luajit/src/lj_cparse.h deleted file mode 100644 index 441580de..00000000 --- a/deps/luajit/src/lj_cparse.h +++ /dev/null @@ -1,65 +0,0 @@ -/* -** C declaration parser. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#ifndef _LJ_CPARSE_H -#define _LJ_CPARSE_H - -#include "lj_obj.h" -#include "lj_ctype.h" - -#if LJ_HASFFI - -/* C parser limits. */ -#define CPARSE_MAX_BUF 32768 /* Max. token buffer size. */ -#define CPARSE_MAX_DECLSTACK 100 /* Max. declaration stack depth. */ -#define CPARSE_MAX_DECLDEPTH 20 /* Max. recursive declaration depth. */ -#define CPARSE_MAX_PACKSTACK 7 /* Max. pack pragma stack depth. */ - -/* Flags for C parser mode. */ -#define CPARSE_MODE_MULTI 1 /* Process multiple declarations. */ -#define CPARSE_MODE_ABSTRACT 2 /* Accept abstract declarators. */ -#define CPARSE_MODE_DIRECT 4 /* Accept direct declarators. */ -#define CPARSE_MODE_FIELD 8 /* Accept field width in bits, too. */ -#define CPARSE_MODE_NOIMPLICIT 16 /* Reject implicit declarations. */ -#define CPARSE_MODE_SKIP 32 /* Skip definitions, ignore errors. */ - -typedef int CPChar; /* C parser character. Unsigned ext. from char. */ -typedef int CPToken; /* C parser token. */ - -/* C parser internal value representation. */ -typedef struct CPValue { - union { - int32_t i32; /* Value for CTID_INT32. */ - uint32_t u32; /* Value for CTID_UINT32. */ - }; - CTypeID id; /* C Type ID of the value. */ -} CPValue; - -/* C parser state. */ -typedef struct CPState { - CPChar c; /* Current character. */ - CPToken tok; /* Current token. */ - CPValue val; /* Token value. */ - GCstr *str; /* Interned string of identifier/keyword. */ - CType *ct; /* C type table entry. */ - const char *p; /* Current position in input buffer. */ - SBuf sb; /* String buffer for tokens. */ - lua_State *L; /* Lua state. */ - CTState *cts; /* C type state. */ - TValue *param; /* C type parameters. */ - const char *srcname; /* Current source name. */ - BCLine linenumber; /* Input line counter. */ - int depth; /* Recursive declaration depth. */ - uint32_t tmask; /* Type mask for next identifier. */ - uint32_t mode; /* C parser mode. */ - uint8_t packstack[CPARSE_MAX_PACKSTACK]; /* Stack for pack pragmas. */ - uint8_t curpack; /* Current position in pack pragma stack. */ -} CPState; - -LJ_FUNC int lj_cparse(CPState *cp); - -#endif - -#endif diff --git a/deps/luajit/src/lj_crecord.c b/deps/luajit/src/lj_crecord.c deleted file mode 100644 index a46665e9..00000000 --- a/deps/luajit/src/lj_crecord.c +++ /dev/null @@ -1,1671 +0,0 @@ -/* -** Trace recorder for C data operations. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#define lj_ffrecord_c -#define LUA_CORE - -#include "lj_obj.h" - -#if LJ_HASJIT && LJ_HASFFI - -#include "lj_err.h" -#include "lj_str.h" -#include "lj_tab.h" -#include "lj_frame.h" -#include "lj_ctype.h" -#include "lj_cdata.h" -#include "lj_cparse.h" -#include "lj_cconv.h" -#include "lj_clib.h" -#include "lj_ccall.h" -#include "lj_ff.h" -#include "lj_ir.h" -#include "lj_jit.h" -#include "lj_ircall.h" -#include "lj_iropt.h" -#include "lj_trace.h" -#include "lj_record.h" -#include "lj_ffrecord.h" -#include "lj_snap.h" -#include "lj_crecord.h" -#include "lj_dispatch.h" - -/* Some local macros to save typing. Undef'd at the end. */ -#define IR(ref) (&J->cur.ir[(ref)]) - -/* Pass IR on to next optimization in chain (FOLD). */ -#define emitir(ot, a, b) (lj_ir_set(J, (ot), (a), (b)), lj_opt_fold(J)) - -#define emitconv(a, dt, st, flags) \ - emitir(IRT(IR_CONV, (dt)), (a), (st)|((dt) << 5)|(flags)) - -/* -- C type checks ------------------------------------------------------- */ - -static GCcdata *argv2cdata(jit_State *J, TRef tr, cTValue *o) -{ - GCcdata *cd; - TRef trtypeid; - if (!tref_iscdata(tr)) - lj_trace_err(J, LJ_TRERR_BADTYPE); - cd = cdataV(o); - /* Specialize to the CTypeID. */ - trtypeid = emitir(IRT(IR_FLOAD, IRT_U16), tr, IRFL_CDATA_CTYPEID); - emitir(IRTG(IR_EQ, IRT_INT), trtypeid, lj_ir_kint(J, (int32_t)cd->ctypeid)); - return cd; -} - -/* Specialize to the CTypeID held by a cdata constructor. */ -static CTypeID crec_constructor(jit_State *J, GCcdata *cd, TRef tr) -{ - CTypeID id; - lua_assert(tref_iscdata(tr) && cd->ctypeid == CTID_CTYPEID); - id = *(CTypeID *)cdataptr(cd); - tr = emitir(IRT(IR_FLOAD, IRT_INT), tr, IRFL_CDATA_INT); - emitir(IRTG(IR_EQ, IRT_INT), tr, lj_ir_kint(J, (int32_t)id)); - return id; -} - -static CTypeID argv2ctype(jit_State *J, TRef tr, cTValue *o) -{ - if (tref_isstr(tr)) { - GCstr *s = strV(o); - CPState cp; - CTypeID oldtop; - /* Specialize to the string containing the C type declaration. */ - emitir(IRTG(IR_EQ, IRT_STR), tr, lj_ir_kstr(J, s)); - cp.L = J->L; - cp.cts = ctype_ctsG(J2G(J)); - oldtop = cp.cts->top; - cp.srcname = strdata(s); - cp.p = strdata(s); - cp.param = NULL; - cp.mode = CPARSE_MODE_ABSTRACT|CPARSE_MODE_NOIMPLICIT; - if (lj_cparse(&cp) || cp.cts->top > oldtop) /* Avoid new struct defs. */ - lj_trace_err(J, LJ_TRERR_BADTYPE); - return cp.val.id; - } else { - GCcdata *cd = argv2cdata(J, tr, o); - return cd->ctypeid == CTID_CTYPEID ? crec_constructor(J, cd, tr) : - cd->ctypeid; - } -} - -/* Convert CType to IRType (if possible). */ -static IRType crec_ct2irt(CTState *cts, CType *ct) -{ - if (ctype_isenum(ct->info)) ct = ctype_child(cts, ct); - if (LJ_LIKELY(ctype_isnum(ct->info))) { - if ((ct->info & CTF_FP)) { - if (ct->size == sizeof(double)) - return IRT_NUM; - else if (ct->size == sizeof(float)) - return IRT_FLOAT; - } else { - uint32_t b = lj_fls(ct->size); - if (b <= 3) - return IRT_I8 + 2*b + ((ct->info & CTF_UNSIGNED) ? 1 : 0); - } - } else if (ctype_isptr(ct->info)) { - return (LJ_64 && ct->size == 8) ? IRT_P64 : IRT_P32; - } else if (ctype_iscomplex(ct->info)) { - if (ct->size == 2*sizeof(double)) - return IRT_NUM; - else if (ct->size == 2*sizeof(float)) - return IRT_FLOAT; - } - return IRT_CDATA; -} - -/* -- Optimized memory fill and copy -------------------------------------- */ - -/* Maximum length and unroll of inlined copy/fill. */ -#define CREC_COPY_MAXUNROLL 16 -#define CREC_COPY_MAXLEN 128 - -#define CREC_FILL_MAXUNROLL 16 - -/* Number of windowed registers used for optimized memory copy. */ -#if LJ_TARGET_X86 -#define CREC_COPY_REGWIN 2 -#elif LJ_TARGET_PPC || LJ_TARGET_MIPS -#define CREC_COPY_REGWIN 8 -#else -#define CREC_COPY_REGWIN 4 -#endif - -/* List of memory offsets for copy/fill. */ -typedef struct CRecMemList { - CTSize ofs; /* Offset in bytes. */ - IRType tp; /* Type of load/store. */ - TRef trofs; /* TRef of interned offset. */ - TRef trval; /* TRef of load value. */ -} CRecMemList; - -/* Generate copy list for element-wise struct copy. */ -static MSize crec_copy_struct(CRecMemList *ml, CTState *cts, CType *ct) -{ - CTypeID fid = ct->sib; - MSize mlp = 0; - while (fid) { - CType *df = ctype_get(cts, fid); - fid = df->sib; - if (ctype_isfield(df->info)) { - CType *cct; - IRType tp; - if (!gcref(df->name)) continue; /* Ignore unnamed fields. */ - cct = ctype_rawchild(cts, df); /* Field type. */ - tp = crec_ct2irt(cts, cct); - if (tp == IRT_CDATA) return 0; /* NYI: aggregates. */ - if (mlp >= CREC_COPY_MAXUNROLL) return 0; - ml[mlp].ofs = df->size; - ml[mlp].tp = tp; - mlp++; - if (ctype_iscomplex(cct->info)) { - if (mlp >= CREC_COPY_MAXUNROLL) return 0; - ml[mlp].ofs = df->size + (cct->size >> 1); - ml[mlp].tp = tp; - mlp++; - } - } else if (!ctype_isconstval(df->info)) { - /* NYI: bitfields and sub-structures. */ - return 0; - } - } - return mlp; -} - -/* Generate unrolled copy list, from highest to lowest step size/alignment. */ -static MSize crec_copy_unroll(CRecMemList *ml, CTSize len, CTSize step, - IRType tp) -{ - CTSize ofs = 0; - MSize mlp = 0; - if (tp == IRT_CDATA) tp = IRT_U8 + 2*lj_fls(step); - do { - while (ofs + step <= len) { - if (mlp >= CREC_COPY_MAXUNROLL) return 0; - ml[mlp].ofs = ofs; - ml[mlp].tp = tp; - mlp++; - ofs += step; - } - step >>= 1; - tp -= 2; - } while (ofs < len); - return mlp; -} - -/* -** Emit copy list with windowed loads/stores. -** LJ_TARGET_UNALIGNED: may emit unaligned loads/stores (not marked as such). -*/ -static void crec_copy_emit(jit_State *J, CRecMemList *ml, MSize mlp, - TRef trdst, TRef trsrc) -{ - MSize i, j, rwin = 0; - for (i = 0, j = 0; i < mlp; ) { - TRef trofs = lj_ir_kintp(J, ml[i].ofs); - TRef trsptr = emitir(IRT(IR_ADD, IRT_PTR), trsrc, trofs); - ml[i].trval = emitir(IRT(IR_XLOAD, ml[i].tp), trsptr, 0); - ml[i].trofs = trofs; - i++; - rwin += (LJ_SOFTFP && ml[i].tp == IRT_NUM) ? 2 : 1; - if (rwin >= CREC_COPY_REGWIN || i >= mlp) { /* Flush buffered stores. */ - rwin = 0; - for ( ; j < i; j++) { - TRef trdptr = emitir(IRT(IR_ADD, IRT_PTR), trdst, ml[j].trofs); - emitir(IRT(IR_XSTORE, ml[j].tp), trdptr, ml[j].trval); - } - } - } -} - -/* Optimized memory copy. */ -static void crec_copy(jit_State *J, TRef trdst, TRef trsrc, TRef trlen, - CType *ct) -{ - if (tref_isk(trlen)) { /* Length must be constant. */ - CRecMemList ml[CREC_COPY_MAXUNROLL]; - MSize mlp = 0; - CTSize step = 1, len = (CTSize)IR(tref_ref(trlen))->i; - IRType tp = IRT_CDATA; - int needxbar = 0; - if (len == 0) return; /* Shortcut. */ - if (len > CREC_COPY_MAXLEN) goto fallback; - if (ct) { - CTState *cts = ctype_ctsG(J2G(J)); - lua_assert(ctype_isarray(ct->info) || ctype_isstruct(ct->info)); - if (ctype_isarray(ct->info)) { - CType *cct = ctype_rawchild(cts, ct); - tp = crec_ct2irt(cts, cct); - if (tp == IRT_CDATA) goto rawcopy; - step = lj_ir_type_size[tp]; - lua_assert((len & (step-1)) == 0); - } else if ((ct->info & CTF_UNION)) { - step = (1u << ctype_align(ct->info)); - goto rawcopy; - } else { - mlp = crec_copy_struct(ml, cts, ct); - goto emitcopy; - } - } else { - rawcopy: - needxbar = 1; - if (LJ_TARGET_UNALIGNED || step >= CTSIZE_PTR) - step = CTSIZE_PTR; - } - mlp = crec_copy_unroll(ml, len, step, tp); - emitcopy: - if (mlp) { - crec_copy_emit(J, ml, mlp, trdst, trsrc); - if (needxbar) - emitir(IRT(IR_XBAR, IRT_NIL), 0, 0); - return; - } - } -fallback: - /* Call memcpy. Always needs a barrier to disable alias analysis. */ - lj_ir_call(J, IRCALL_memcpy, trdst, trsrc, trlen); - emitir(IRT(IR_XBAR, IRT_NIL), 0, 0); -} - -/* Generate unrolled fill list, from highest to lowest step size/alignment. */ -static MSize crec_fill_unroll(CRecMemList *ml, CTSize len, CTSize step) -{ - CTSize ofs = 0; - MSize mlp = 0; - IRType tp = IRT_U8 + 2*lj_fls(step); - do { - while (ofs + step <= len) { - if (mlp >= CREC_COPY_MAXUNROLL) return 0; - ml[mlp].ofs = ofs; - ml[mlp].tp = tp; - mlp++; - ofs += step; - } - step >>= 1; - tp -= 2; - } while (ofs < len); - return mlp; -} - -/* -** Emit stores for fill list. -** LJ_TARGET_UNALIGNED: may emit unaligned stores (not marked as such). -*/ -static void crec_fill_emit(jit_State *J, CRecMemList *ml, MSize mlp, - TRef trdst, TRef trfill) -{ - MSize i; - for (i = 0; i < mlp; i++) { - TRef trofs = lj_ir_kintp(J, ml[i].ofs); - TRef trdptr = emitir(IRT(IR_ADD, IRT_PTR), trdst, trofs); - emitir(IRT(IR_XSTORE, ml[i].tp), trdptr, trfill); - } -} - -/* Optimized memory fill. */ -static void crec_fill(jit_State *J, TRef trdst, TRef trlen, TRef trfill, - CTSize step) -{ - if (tref_isk(trlen)) { /* Length must be constant. */ - CRecMemList ml[CREC_FILL_MAXUNROLL]; - MSize mlp; - CTSize len = (CTSize)IR(tref_ref(trlen))->i; - if (len == 0) return; /* Shortcut. */ - if (LJ_TARGET_UNALIGNED || step >= CTSIZE_PTR) - step = CTSIZE_PTR; - if (step * CREC_FILL_MAXUNROLL < len) goto fallback; - mlp = crec_fill_unroll(ml, len, step); - if (!mlp) goto fallback; - if (tref_isk(trfill) || ml[0].tp != IRT_U8) - trfill = emitconv(trfill, IRT_INT, IRT_U8, 0); - if (ml[0].tp != IRT_U8) { /* Scatter U8 to U16/U32/U64. */ - if (CTSIZE_PTR == 8 && ml[0].tp == IRT_U64) { - if (tref_isk(trfill)) /* Pointless on x64 with zero-extended regs. */ - trfill = emitconv(trfill, IRT_U64, IRT_U32, 0); - trfill = emitir(IRT(IR_MUL, IRT_U64), trfill, - lj_ir_kint64(J, U64x(01010101,01010101))); - } else { - trfill = emitir(IRTI(IR_MUL), trfill, - lj_ir_kint(J, ml[0].tp == IRT_U16 ? 0x0101 : 0x01010101)); - } - } - crec_fill_emit(J, ml, mlp, trdst, trfill); - } else { -fallback: - /* Call memset. Always needs a barrier to disable alias analysis. */ - lj_ir_call(J, IRCALL_memset, trdst, trfill, trlen); /* Note: arg order! */ - } - emitir(IRT(IR_XBAR, IRT_NIL), 0, 0); -} - -/* -- Convert C type to C type -------------------------------------------- */ - -/* -** This code mirrors the code in lj_cconv.c. It performs the same steps -** for the trace recorder that lj_cconv.c does for the interpreter. -** -** One major difference is that we can get away with much fewer checks -** here. E.g. checks for casts, constness or correct types can often be -** omitted, even if they might fail. The interpreter subsequently throws -** an error, which aborts the trace. -** -** All operations are specialized to their C types, so the on-trace -** outcome must be the same as the outcome in the interpreter. If the -** interpreter doesn't throw an error, then the trace is correct, too. -** Care must be taken not to generate invalid (temporary) IR or to -** trigger asserts. -*/ - -/* Determine whether a passed number or cdata number is non-zero. */ -static int crec_isnonzero(CType *s, void *p) -{ - if (p == (void *)0) - return 0; - if (p == (void *)1) - return 1; - if ((s->info & CTF_FP)) { - if (s->size == sizeof(float)) - return (*(float *)p != 0); - else - return (*(double *)p != 0); - } else { - if (s->size == 1) - return (*(uint8_t *)p != 0); - else if (s->size == 2) - return (*(uint16_t *)p != 0); - else if (s->size == 4) - return (*(uint32_t *)p != 0); - else - return (*(uint64_t *)p != 0); - } -} - -static TRef crec_ct_ct(jit_State *J, CType *d, CType *s, TRef dp, TRef sp, - void *svisnz) -{ - IRType dt = crec_ct2irt(ctype_ctsG(J2G(J)), d); - IRType st = crec_ct2irt(ctype_ctsG(J2G(J)), s); - CTSize dsize = d->size, ssize = s->size; - CTInfo dinfo = d->info, sinfo = s->info; - - if (ctype_type(dinfo) > CT_MAYCONVERT || ctype_type(sinfo) > CT_MAYCONVERT) - goto err_conv; - - /* - ** Note: Unlike lj_cconv_ct_ct(), sp holds the _value_ of pointers and - ** numbers up to 8 bytes. Otherwise sp holds a pointer. - */ - - switch (cconv_idx2(dinfo, sinfo)) { - /* Destination is a bool. */ - case CCX(B, B): - goto xstore; /* Source operand is already normalized. */ - case CCX(B, I): - case CCX(B, F): - if (st != IRT_CDATA) { - /* Specialize to the result of a comparison against 0. */ - TRef zero = (st == IRT_NUM || st == IRT_FLOAT) ? lj_ir_knum(J, 0) : - (st == IRT_I64 || st == IRT_U64) ? lj_ir_kint64(J, 0) : - lj_ir_kint(J, 0); - int isnz = crec_isnonzero(s, svisnz); - emitir(IRTG(isnz ? IR_NE : IR_EQ, st), sp, zero); - sp = lj_ir_kint(J, isnz); - goto xstore; - } - goto err_nyi; - - /* Destination is an integer. */ - case CCX(I, B): - case CCX(I, I): - conv_I_I: - if (dt == IRT_CDATA || st == IRT_CDATA) goto err_nyi; - /* Extend 32 to 64 bit integer. */ - if (dsize == 8 && ssize < 8 && !(LJ_64 && (sinfo & CTF_UNSIGNED))) - sp = emitconv(sp, dt, ssize < 4 ? IRT_INT : st, - (sinfo & CTF_UNSIGNED) ? 0 : IRCONV_SEXT); - else if (dsize < 8 && ssize == 8) /* Truncate from 64 bit integer. */ - sp = emitconv(sp, dsize < 4 ? IRT_INT : dt, st, 0); - else if (st == IRT_INT) - sp = lj_opt_narrow_toint(J, sp); - xstore: - if (dt == IRT_I64 || dt == IRT_U64) lj_needsplit(J); - if (dp == 0) return sp; - emitir(IRT(IR_XSTORE, dt), dp, sp); - break; - case CCX(I, C): - sp = emitir(IRT(IR_XLOAD, st), sp, 0); /* Load re. */ - /* fallthrough */ - case CCX(I, F): - if (dt == IRT_CDATA || st == IRT_CDATA) goto err_nyi; - sp = emitconv(sp, dsize < 4 ? IRT_INT : dt, st, IRCONV_TRUNC|IRCONV_ANY); - goto xstore; - case CCX(I, P): - case CCX(I, A): - sinfo = CTINFO(CT_NUM, CTF_UNSIGNED); - ssize = CTSIZE_PTR; - st = IRT_UINTP; - if (((dsize ^ ssize) & 8) == 0) { /* Must insert no-op type conversion. */ - sp = emitconv(sp, dsize < 4 ? IRT_INT : dt, IRT_PTR, 0); - goto xstore; - } - goto conv_I_I; - - /* Destination is a floating-point number. */ - case CCX(F, B): - case CCX(F, I): - conv_F_I: - if (dt == IRT_CDATA || st == IRT_CDATA) goto err_nyi; - sp = emitconv(sp, dt, ssize < 4 ? IRT_INT : st, 0); - goto xstore; - case CCX(F, C): - sp = emitir(IRT(IR_XLOAD, st), sp, 0); /* Load re. */ - /* fallthrough */ - case CCX(F, F): - conv_F_F: - if (dt == IRT_CDATA || st == IRT_CDATA) goto err_nyi; - if (dt != st) sp = emitconv(sp, dt, st, 0); - goto xstore; - - /* Destination is a complex number. */ - case CCX(C, I): - case CCX(C, F): - { /* Clear im. */ - TRef ptr = emitir(IRT(IR_ADD, IRT_PTR), dp, lj_ir_kintp(J, (dsize >> 1))); - emitir(IRT(IR_XSTORE, dt), ptr, lj_ir_knum(J, 0)); - } - /* Convert to re. */ - if ((sinfo & CTF_FP)) goto conv_F_F; else goto conv_F_I; - - case CCX(C, C): - if (dt == IRT_CDATA || st == IRT_CDATA) goto err_nyi; - { - TRef re, im, ptr; - re = emitir(IRT(IR_XLOAD, st), sp, 0); - ptr = emitir(IRT(IR_ADD, IRT_PTR), sp, lj_ir_kintp(J, (ssize >> 1))); - im = emitir(IRT(IR_XLOAD, st), ptr, 0); - if (dt != st) { - re = emitconv(re, dt, st, 0); - im = emitconv(im, dt, st, 0); - } - emitir(IRT(IR_XSTORE, dt), dp, re); - ptr = emitir(IRT(IR_ADD, IRT_PTR), dp, lj_ir_kintp(J, (dsize >> 1))); - emitir(IRT(IR_XSTORE, dt), ptr, im); - } - break; - - /* Destination is a vector. */ - case CCX(V, I): - case CCX(V, F): - case CCX(V, C): - case CCX(V, V): - goto err_nyi; - - /* Destination is a pointer. */ - case CCX(P, P): - case CCX(P, A): - case CCX(P, S): - /* There are only 32 bit pointers/addresses on 32 bit machines. - ** Also ok on x64, since all 32 bit ops clear the upper part of the reg. - */ - goto xstore; - case CCX(P, I): - if (st == IRT_CDATA) goto err_nyi; - if (!LJ_64 && ssize == 8) /* Truncate from 64 bit integer. */ - sp = emitconv(sp, IRT_U32, st, 0); - goto xstore; - case CCX(P, F): - if (st == IRT_CDATA) goto err_nyi; - /* The signed conversion is cheaper. x64 really has 47 bit pointers. */ - sp = emitconv(sp, (LJ_64 && dsize == 8) ? IRT_I64 : IRT_U32, - st, IRCONV_TRUNC|IRCONV_ANY); - goto xstore; - - /* Destination is an array. */ - case CCX(A, A): - /* Destination is a struct/union. */ - case CCX(S, S): - if (dp == 0) goto err_conv; - crec_copy(J, dp, sp, lj_ir_kint(J, dsize), d); - break; - - default: - err_conv: - err_nyi: - lj_trace_err(J, LJ_TRERR_NYICONV); - break; - } - return 0; -} - -/* -- Convert C type to TValue (load) ------------------------------------- */ - -static TRef crec_tv_ct(jit_State *J, CType *s, CTypeID sid, TRef sp) -{ - CTState *cts = ctype_ctsG(J2G(J)); - IRType t = crec_ct2irt(cts, s); - CTInfo sinfo = s->info; - if (ctype_isnum(sinfo)) { - TRef tr; - if (t == IRT_CDATA) - goto err_nyi; /* NYI: copyval of >64 bit integers. */ - tr = emitir(IRT(IR_XLOAD, t), sp, 0); - if (t == IRT_FLOAT || t == IRT_U32) { /* Keep uint32_t/float as numbers. */ - return emitconv(tr, IRT_NUM, t, 0); - } else if (t == IRT_I64 || t == IRT_U64) { /* Box 64 bit integer. */ - sp = tr; - lj_needsplit(J); - } else if ((sinfo & CTF_BOOL)) { - /* Assume not equal to zero. Fixup and emit pending guard later. */ - lj_ir_set(J, IRTGI(IR_NE), tr, lj_ir_kint(J, 0)); - J->postproc = LJ_POST_FIXGUARD; - return TREF_TRUE; - } else { - return tr; - } - } else if (ctype_isptr(sinfo) || ctype_isenum(sinfo)) { - sp = emitir(IRT(IR_XLOAD, t), sp, 0); /* Box pointers and enums. */ - } else if (ctype_isrefarray(sinfo) || ctype_isstruct(sinfo)) { - cts->L = J->L; - sid = lj_ctype_intern(cts, CTINFO_REF(sid), CTSIZE_PTR); /* Create ref. */ - } else if (ctype_iscomplex(sinfo)) { /* Unbox/box complex. */ - ptrdiff_t esz = (ptrdiff_t)(s->size >> 1); - TRef ptr, tr1, tr2, dp; - dp = emitir(IRTG(IR_CNEW, IRT_CDATA), lj_ir_kint(J, sid), TREF_NIL); - tr1 = emitir(IRT(IR_XLOAD, t), sp, 0); - ptr = emitir(IRT(IR_ADD, IRT_PTR), sp, lj_ir_kintp(J, esz)); - tr2 = emitir(IRT(IR_XLOAD, t), ptr, 0); - ptr = emitir(IRT(IR_ADD, IRT_PTR), dp, lj_ir_kintp(J, sizeof(GCcdata))); - emitir(IRT(IR_XSTORE, t), ptr, tr1); - ptr = emitir(IRT(IR_ADD, IRT_PTR), dp, lj_ir_kintp(J, sizeof(GCcdata)+esz)); - emitir(IRT(IR_XSTORE, t), ptr, tr2); - return dp; - } else { - /* NYI: copyval of vectors. */ - err_nyi: - lj_trace_err(J, LJ_TRERR_NYICONV); - } - /* Box pointer, ref, enum or 64 bit integer. */ - return emitir(IRTG(IR_CNEWI, IRT_CDATA), lj_ir_kint(J, sid), sp); -} - -/* -- Convert TValue to C type (store) ------------------------------------ */ - -static TRef crec_ct_tv(jit_State *J, CType *d, TRef dp, TRef sp, cTValue *sval) -{ - CTState *cts = ctype_ctsG(J2G(J)); - CTypeID sid = CTID_P_VOID; - void *svisnz = 0; - CType *s; - if (LJ_LIKELY(tref_isinteger(sp))) { - sid = CTID_INT32; - svisnz = (void *)(intptr_t)(tvisint(sval)?(intV(sval)!=0):!tviszero(sval)); - } else if (tref_isnum(sp)) { - sid = CTID_DOUBLE; - svisnz = (void *)(intptr_t)(tvisint(sval)?(intV(sval)!=0):!tviszero(sval)); - } else if (tref_isbool(sp)) { - sp = lj_ir_kint(J, tref_istrue(sp) ? 1 : 0); - sid = CTID_BOOL; - } else if (tref_isnil(sp)) { - sp = lj_ir_kptr(J, NULL); - } else if (tref_isudata(sp)) { - GCudata *ud = udataV(sval); - if (ud->udtype == UDTYPE_IO_FILE) { - TRef tr = emitir(IRT(IR_FLOAD, IRT_U8), sp, IRFL_UDATA_UDTYPE); - emitir(IRTGI(IR_EQ), tr, lj_ir_kint(J, UDTYPE_IO_FILE)); - sp = emitir(IRT(IR_FLOAD, IRT_PTR), sp, IRFL_UDATA_FILE); - } else { - sp = emitir(IRT(IR_ADD, IRT_PTR), sp, lj_ir_kintp(J, sizeof(GCudata))); - } - } else if (tref_isstr(sp)) { - if (ctype_isenum(d->info)) { /* Match string against enum constant. */ - GCstr *str = strV(sval); - CTSize ofs; - CType *cct = lj_ctype_getfield(cts, d, str, &ofs); - /* Specialize to the name of the enum constant. */ - emitir(IRTG(IR_EQ, IRT_STR), sp, lj_ir_kstr(J, str)); - if (cct && ctype_isconstval(cct->info)) { - lua_assert(ctype_child(cts, cct)->size == 4); - svisnz = (void *)(intptr_t)(ofs != 0); - sp = lj_ir_kint(J, (int32_t)ofs); - sid = ctype_cid(cct->info); - } /* else: interpreter will throw. */ - } else if (ctype_isrefarray(d->info)) { /* Copy string to array. */ - lj_trace_err(J, LJ_TRERR_BADTYPE); /* NYI */ - } else { /* Otherwise pass the string data as a const char[]. */ - /* Don't use STRREF. It folds with SNEW, which loses the trailing NUL. */ - sp = emitir(IRT(IR_ADD, IRT_PTR), sp, lj_ir_kintp(J, sizeof(GCstr))); - sid = CTID_A_CCHAR; - } - } else { /* NYI: tref_istab(sp), tref_islightud(sp). */ - IRType t; - sid = argv2cdata(J, sp, sval)->ctypeid; - s = ctype_raw(cts, sid); - svisnz = cdataptr(cdataV(sval)); - t = crec_ct2irt(cts, s); - if (ctype_isptr(s->info)) { - sp = emitir(IRT(IR_FLOAD, t), sp, IRFL_CDATA_PTR); - if (ctype_isref(s->info)) { - svisnz = *(void **)svisnz; - s = ctype_rawchild(cts, s); - if (ctype_isenum(s->info)) s = ctype_child(cts, s); - t = crec_ct2irt(cts, s); - } else { - goto doconv; - } - } else if (t == IRT_I64 || t == IRT_U64) { - sp = emitir(IRT(IR_FLOAD, t), sp, IRFL_CDATA_INT64); - lj_needsplit(J); - goto doconv; - } else if (t == IRT_INT || t == IRT_U32) { - if (ctype_isenum(s->info)) s = ctype_child(cts, s); - sp = emitir(IRT(IR_FLOAD, t), sp, IRFL_CDATA_INT); - goto doconv; - } else { - sp = emitir(IRT(IR_ADD, IRT_PTR), sp, lj_ir_kintp(J, sizeof(GCcdata))); - } - if (ctype_isnum(s->info) && t != IRT_CDATA) - sp = emitir(IRT(IR_XLOAD, t), sp, 0); /* Load number value. */ - goto doconv; - } - s = ctype_get(cts, sid); -doconv: - if (ctype_isenum(d->info)) d = ctype_child(cts, d); - return crec_ct_ct(J, d, s, dp, sp, svisnz); -} - -/* -- C data metamethods -------------------------------------------------- */ - -/* This would be rather difficult in FOLD, so do it here: -** (base+k)+(idx*sz)+ofs ==> (base+idx*sz)+(ofs+k) -** (base+(idx+k)*sz)+ofs ==> (base+idx*sz)+(ofs+k*sz) -*/ -static TRef crec_reassoc_ofs(jit_State *J, TRef tr, ptrdiff_t *ofsp, MSize sz) -{ - IRIns *ir = IR(tref_ref(tr)); - if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD) && irref_isk(ir->op2) && - (ir->o == IR_ADD || ir->o == IR_ADDOV || ir->o == IR_SUBOV)) { - IRIns *irk = IR(ir->op2); - ptrdiff_t k; - if (LJ_64 && irk->o == IR_KINT64) - k = (ptrdiff_t)ir_kint64(irk)->u64 * sz; - else - k = (ptrdiff_t)irk->i * sz; - if (ir->o == IR_SUBOV) *ofsp -= k; else *ofsp += k; - tr = ir->op1; /* Not a TRef, but the caller doesn't care. */ - } - return tr; -} - -/* Record ctype __index/__newindex metamethods. */ -static void crec_index_meta(jit_State *J, CTState *cts, CType *ct, - RecordFFData *rd) -{ - CTypeID id = ctype_typeid(cts, ct); - cTValue *tv = lj_ctype_meta(cts, id, rd->data ? MM_newindex : MM_index); - if (!tv) - lj_trace_err(J, LJ_TRERR_BADTYPE); - if (tvisfunc(tv)) { - J->base[-1] = lj_ir_kfunc(J, funcV(tv)) | TREF_FRAME; - rd->nres = -1; /* Pending tailcall. */ - } else if (rd->data == 0 && tvistab(tv) && tref_isstr(J->base[1])) { - /* Specialize to result of __index lookup. */ - cTValue *o = lj_tab_get(J->L, tabV(tv), &rd->argv[1]); - J->base[0] = lj_record_constify(J, o); - if (!J->base[0]) - lj_trace_err(J, LJ_TRERR_BADTYPE); - /* Always specialize to the key. */ - emitir(IRTG(IR_EQ, IRT_STR), J->base[1], lj_ir_kstr(J, strV(&rd->argv[1]))); - } else { - /* NYI: resolving of non-function metamethods. */ - /* NYI: non-string keys for __index table. */ - /* NYI: stores to __newindex table. */ - lj_trace_err(J, LJ_TRERR_BADTYPE); - } -} - -void LJ_FASTCALL recff_cdata_index(jit_State *J, RecordFFData *rd) -{ - TRef idx, ptr = J->base[0]; - ptrdiff_t ofs = sizeof(GCcdata); - GCcdata *cd = argv2cdata(J, ptr, &rd->argv[0]); - CTState *cts = ctype_ctsG(J2G(J)); - CType *ct = ctype_raw(cts, cd->ctypeid); - CTypeID sid = 0; - - /* Resolve pointer or reference for cdata object. */ - if (ctype_isptr(ct->info)) { - IRType t = (LJ_64 && ct->size == 8) ? IRT_P64 : IRT_P32; - if (ctype_isref(ct->info)) ct = ctype_rawchild(cts, ct); - ptr = emitir(IRT(IR_FLOAD, t), ptr, IRFL_CDATA_PTR); - ofs = 0; - ptr = crec_reassoc_ofs(J, ptr, &ofs, 1); - } - -again: - idx = J->base[1]; - if (tref_isnumber(idx)) { - idx = lj_opt_narrow_cindex(J, idx); - if (ctype_ispointer(ct->info)) { - CTSize sz; - integer_key: - if ((ct->info & CTF_COMPLEX)) - idx = emitir(IRT(IR_BAND, IRT_INTP), idx, lj_ir_kintp(J, 1)); - sz = lj_ctype_size(cts, (sid = ctype_cid(ct->info))); - idx = crec_reassoc_ofs(J, idx, &ofs, sz); -#if LJ_TARGET_ARM || LJ_TARGET_PPC - /* Hoist base add to allow fusion of index/shift into operands. */ - if (LJ_LIKELY(J->flags & JIT_F_OPT_LOOP) && ofs -#if LJ_TARGET_ARM - && (sz == 1 || sz == 4) -#endif - ) { - ptr = emitir(IRT(IR_ADD, IRT_PTR), ptr, lj_ir_kintp(J, ofs)); - ofs = 0; - } -#endif - idx = emitir(IRT(IR_MUL, IRT_INTP), idx, lj_ir_kintp(J, sz)); - ptr = emitir(IRT(IR_ADD, IRT_PTR), idx, ptr); - } - } else if (tref_iscdata(idx)) { - GCcdata *cdk = cdataV(&rd->argv[1]); - CType *ctk = ctype_raw(cts, cdk->ctypeid); - IRType t = crec_ct2irt(cts, ctk); - if (ctype_ispointer(ct->info) && t >= IRT_I8 && t <= IRT_U64) { - if (ctk->size == 8) { - idx = emitir(IRT(IR_FLOAD, t), idx, IRFL_CDATA_INT64); - } else if (ctk->size == 4) { - idx = emitir(IRT(IR_FLOAD, t), idx, IRFL_CDATA_INT); - } else { - idx = emitir(IRT(IR_ADD, IRT_PTR), idx, - lj_ir_kintp(J, sizeof(GCcdata))); - idx = emitir(IRT(IR_XLOAD, t), idx, 0); - } - if (LJ_64 && ctk->size < sizeof(intptr_t) && !(ctk->info & CTF_UNSIGNED)) - idx = emitconv(idx, IRT_INTP, IRT_INT, IRCONV_SEXT); - if (!LJ_64 && ctk->size > sizeof(intptr_t)) { - idx = emitconv(idx, IRT_INTP, t, 0); - lj_needsplit(J); - } - goto integer_key; - } - } else if (tref_isstr(idx)) { - GCstr *name = strV(&rd->argv[1]); - if (cd && cd->ctypeid == CTID_CTYPEID) - ct = ctype_raw(cts, crec_constructor(J, cd, ptr)); - if (ctype_isstruct(ct->info)) { - CTSize fofs; - CType *fct; - fct = lj_ctype_getfield(cts, ct, name, &fofs); - if (fct) { - /* Always specialize to the field name. */ - emitir(IRTG(IR_EQ, IRT_STR), idx, lj_ir_kstr(J, name)); - if (ctype_isconstval(fct->info)) { - if (fct->size >= 0x80000000u && - (ctype_child(cts, fct)->info & CTF_UNSIGNED)) { - J->base[0] = lj_ir_knum(J, (lua_Number)(uint32_t)fct->size); - return; - } - J->base[0] = lj_ir_kint(J, (int32_t)fct->size); - return; /* Interpreter will throw for newindex. */ - } else if (ctype_isbitfield(fct->info)) { - lj_trace_err(J, LJ_TRERR_NYICONV); - } else { - lua_assert(ctype_isfield(fct->info)); - sid = ctype_cid(fct->info); - } - ofs += (ptrdiff_t)fofs; - } - } else if (ctype_iscomplex(ct->info)) { - if (name->len == 2 && - ((strdata(name)[0] == 'r' && strdata(name)[1] == 'e') || - (strdata(name)[0] == 'i' && strdata(name)[1] == 'm'))) { - /* Always specialize to the field name. */ - emitir(IRTG(IR_EQ, IRT_STR), idx, lj_ir_kstr(J, name)); - if (strdata(name)[0] == 'i') ofs += (ct->size >> 1); - sid = ctype_cid(ct->info); - } - } - } - if (!sid) { - if (ctype_isptr(ct->info)) { /* Automatically perform '->'. */ - CType *cct = ctype_rawchild(cts, ct); - if (ctype_isstruct(cct->info)) { - ct = cct; - cd = NULL; - if (tref_isstr(idx)) goto again; - } - } - crec_index_meta(J, cts, ct, rd); - return; - } - - if (ofs) - ptr = emitir(IRT(IR_ADD, IRT_PTR), ptr, lj_ir_kintp(J, ofs)); - - /* Resolve reference for field. */ - ct = ctype_get(cts, sid); - if (ctype_isref(ct->info)) { - ptr = emitir(IRT(IR_XLOAD, IRT_PTR), ptr, 0); - sid = ctype_cid(ct->info); - ct = ctype_get(cts, sid); - } - - while (ctype_isattrib(ct->info)) - ct = ctype_child(cts, ct); /* Skip attributes. */ - - if (rd->data == 0) { /* __index metamethod. */ - J->base[0] = crec_tv_ct(J, ct, sid, ptr); - } else { /* __newindex metamethod. */ - rd->nres = 0; - J->needsnap = 1; - crec_ct_tv(J, ct, ptr, J->base[2], &rd->argv[2]); - } -} - -/* Record setting a finalizer. */ -static void crec_finalizer(jit_State *J, TRef trcd, cTValue *fin) -{ - TRef trlo = lj_ir_call(J, IRCALL_lj_cdata_setfin, trcd); - TRef trhi = emitir(IRT(IR_ADD, IRT_P32), trlo, lj_ir_kint(J, 4)); - if (LJ_BE) { TRef tmp = trlo; trlo = trhi; trhi = tmp; } - if (tvisfunc(fin)) { - emitir(IRT(IR_XSTORE, IRT_P32), trlo, lj_ir_kfunc(J, funcV(fin))); - emitir(IRTI(IR_XSTORE), trhi, lj_ir_kint(J, LJ_TFUNC)); - } else if (tviscdata(fin)) { - emitir(IRT(IR_XSTORE, IRT_P32), trlo, - lj_ir_kgc(J, obj2gco(cdataV(fin)), IRT_CDATA)); - emitir(IRTI(IR_XSTORE), trhi, lj_ir_kint(J, LJ_TCDATA)); - } else { - lj_trace_err(J, LJ_TRERR_BADTYPE); - } - J->needsnap = 1; -} - -/* Record cdata allocation. */ -static void crec_alloc(jit_State *J, RecordFFData *rd, CTypeID id) -{ - CTState *cts = ctype_ctsG(J2G(J)); - CTSize sz; - CTInfo info = lj_ctype_info(cts, id, &sz); - CType *d = ctype_raw(cts, id); - TRef trid; - if (!sz || sz > 128 || (info & CTF_VLA) || ctype_align(info) > CT_MEMALIGN) - lj_trace_err(J, LJ_TRERR_NYICONV); /* NYI: large/special allocations. */ - trid = lj_ir_kint(J, id); - /* Use special instruction to box pointer or 32/64 bit integer. */ - if (ctype_isptr(info) || (ctype_isinteger(info) && (sz == 4 || sz == 8))) { - TRef sp = J->base[1] ? crec_ct_tv(J, d, 0, J->base[1], &rd->argv[1]) : - ctype_isptr(info) ? lj_ir_kptr(J, NULL) : - sz == 4 ? lj_ir_kint(J, 0) : - (lj_needsplit(J), lj_ir_kint64(J, 0)); - J->base[0] = emitir(IRTG(IR_CNEWI, IRT_CDATA), trid, sp); - } else { - TRef trcd = emitir(IRTG(IR_CNEW, IRT_CDATA), trid, TREF_NIL); - cTValue *fin; - J->base[0] = trcd; - if (J->base[1] && !J->base[2] && - !lj_cconv_multi_init(cts, d, &rd->argv[1])) { - goto single_init; - } else if (ctype_isarray(d->info)) { - CType *dc = ctype_rawchild(cts, d); /* Array element type. */ - CTSize ofs, esize = dc->size; - TRef sp = 0; - TValue tv; - TValue *sval = &tv; - MSize i; - tv.u64 = 0; - if (!(ctype_isnum(dc->info) || ctype_isptr(dc->info))) - lj_trace_err(J, LJ_TRERR_NYICONV); /* NYI: init array of aggregates. */ - for (i = 1, ofs = 0; ofs < sz; ofs += esize) { - TRef dp = emitir(IRT(IR_ADD, IRT_PTR), trcd, - lj_ir_kintp(J, ofs + sizeof(GCcdata))); - if (J->base[i]) { - sp = J->base[i]; - sval = &rd->argv[i]; - i++; - } else if (i != 2) { - sp = ctype_isnum(dc->info) ? lj_ir_kint(J, 0) : TREF_NIL; - } - crec_ct_tv(J, dc, dp, sp, sval); - } - } else if (ctype_isstruct(d->info)) { - CTypeID fid = d->sib; - MSize i = 1; - while (fid) { - CType *df = ctype_get(cts, fid); - fid = df->sib; - if (ctype_isfield(df->info)) { - CType *dc; - TRef sp, dp; - TValue tv; - TValue *sval = &tv; - setintV(&tv, 0); - if (!gcref(df->name)) continue; /* Ignore unnamed fields. */ - dc = ctype_rawchild(cts, df); /* Field type. */ - if (!(ctype_isnum(dc->info) || ctype_isptr(dc->info) || - ctype_isenum(dc->info))) - lj_trace_err(J, LJ_TRERR_NYICONV); /* NYI: init aggregates. */ - if (J->base[i]) { - sp = J->base[i]; - sval = &rd->argv[i]; - i++; - } else { - sp = ctype_isptr(dc->info) ? TREF_NIL : lj_ir_kint(J, 0); - } - dp = emitir(IRT(IR_ADD, IRT_PTR), trcd, - lj_ir_kintp(J, df->size + sizeof(GCcdata))); - crec_ct_tv(J, dc, dp, sp, sval); - } else if (!ctype_isconstval(df->info)) { - /* NYI: init bitfields and sub-structures. */ - lj_trace_err(J, LJ_TRERR_NYICONV); - } - } - } else { - TRef dp; - single_init: - dp = emitir(IRT(IR_ADD, IRT_PTR), trcd, lj_ir_kintp(J, sizeof(GCcdata))); - if (J->base[1]) { - crec_ct_tv(J, d, dp, J->base[1], &rd->argv[1]); - } else { - TValue tv; - tv.u64 = 0; - crec_ct_tv(J, d, dp, lj_ir_kint(J, 0), &tv); - } - } - /* Handle __gc metamethod. */ - fin = lj_ctype_meta(cts, id, MM_gc); - if (fin) - crec_finalizer(J, trcd, fin); - } -} - -/* Record argument conversions. */ -static TRef crec_call_args(jit_State *J, RecordFFData *rd, - CTState *cts, CType *ct) -{ - TRef args[CCI_NARGS_MAX]; - CTypeID fid; - MSize i, n; - TRef tr, *base; - cTValue *o; -#if LJ_TARGET_X86 -#if LJ_ABI_WIN - TRef *arg0 = NULL, *arg1 = NULL; -#endif - int ngpr = 0; - if (ctype_cconv(ct->info) == CTCC_THISCALL) - ngpr = 1; - else if (ctype_cconv(ct->info) == CTCC_FASTCALL) - ngpr = 2; -#endif - - /* Skip initial attributes. */ - fid = ct->sib; - while (fid) { - CType *ctf = ctype_get(cts, fid); - if (!ctype_isattrib(ctf->info)) break; - fid = ctf->sib; - } - args[0] = TREF_NIL; - for (n = 0, base = J->base+1, o = rd->argv+1; *base; n++, base++, o++) { - CTypeID did; - CType *d; - - if (n >= CCI_NARGS_MAX) - lj_trace_err(J, LJ_TRERR_NYICALL); - - if (fid) { /* Get argument type from field. */ - CType *ctf = ctype_get(cts, fid); - fid = ctf->sib; - lua_assert(ctype_isfield(ctf->info)); - did = ctype_cid(ctf->info); - } else { - if (!(ct->info & CTF_VARARG)) - lj_trace_err(J, LJ_TRERR_NYICALL); /* Too many arguments. */ - did = lj_ccall_ctid_vararg(cts, o); /* Infer vararg type. */ - } - d = ctype_raw(cts, did); - if (!(ctype_isnum(d->info) || ctype_isptr(d->info) || - ctype_isenum(d->info))) - lj_trace_err(J, LJ_TRERR_NYICALL); - tr = crec_ct_tv(J, d, 0, *base, o); - if (ctype_isinteger_or_bool(d->info)) { - if (d->size < 4) { - if ((d->info & CTF_UNSIGNED)) - tr = emitconv(tr, IRT_INT, d->size==1 ? IRT_U8 : IRT_U16, 0); - else - tr = emitconv(tr, IRT_INT, d->size==1 ? IRT_I8 : IRT_I16,IRCONV_SEXT); - } - } else if (LJ_SOFTFP && ctype_isfp(d->info) && d->size > 4) { - lj_needsplit(J); - } -#if LJ_TARGET_X86 - /* 64 bit args must not end up in registers for fastcall/thiscall. */ -#if LJ_ABI_WIN - if (!ctype_isfp(d->info)) { - /* Sigh, the Windows/x86 ABI allows reordering across 64 bit args. */ - if (tref_typerange(tr, IRT_I64, IRT_U64)) { - if (ngpr) { - arg0 = &args[n]; args[n++] = TREF_NIL; ngpr--; - if (ngpr) { - arg1 = &args[n]; args[n++] = TREF_NIL; ngpr--; - } - } - } else { - if (arg0) { *arg0 = tr; arg0 = NULL; n--; continue; } - if (arg1) { *arg1 = tr; arg1 = NULL; n--; continue; } - if (ngpr) ngpr--; - } - } -#else - if (!ctype_isfp(d->info) && ngpr) { - if (tref_typerange(tr, IRT_I64, IRT_U64)) { - /* No reordering for other x86 ABIs. Simply add alignment args. */ - do { args[n++] = TREF_NIL; } while (--ngpr); - } else { - ngpr--; - } - } -#endif -#endif - args[n] = tr; - } - tr = args[0]; - for (i = 1; i < n; i++) - tr = emitir(IRT(IR_CARG, IRT_NIL), tr, args[i]); - return tr; -} - -/* Create a snapshot for the caller, simulating a 'false' return value. */ -static void crec_snap_caller(jit_State *J) -{ - lua_State *L = J->L; - TValue *base = L->base, *top = L->top; - const BCIns *pc = J->pc; - TRef ftr = J->base[-1]; - ptrdiff_t delta; - if (!frame_islua(base-1) || J->framedepth <= 0) - lj_trace_err(J, LJ_TRERR_NYICALL); - J->pc = frame_pc(base-1); delta = 1+bc_a(J->pc[-1]); - L->top = base; L->base = base - delta; - J->base[-1] = TREF_FALSE; - J->base -= delta; J->baseslot -= (BCReg)delta; - J->maxslot = (BCReg)delta; J->framedepth--; - lj_snap_add(J); - L->base = base; L->top = top; - J->framedepth++; J->maxslot = 1; - J->base += delta; J->baseslot += (BCReg)delta; - J->base[-1] = ftr; J->pc = pc; -} - -/* Record function call. */ -static int crec_call(jit_State *J, RecordFFData *rd, GCcdata *cd) -{ - CTState *cts = ctype_ctsG(J2G(J)); - CType *ct = ctype_raw(cts, cd->ctypeid); - IRType tp = IRT_PTR; - if (ctype_isptr(ct->info)) { - tp = (LJ_64 && ct->size == 8) ? IRT_P64 : IRT_P32; - ct = ctype_rawchild(cts, ct); - } - if (ctype_isfunc(ct->info)) { - TRef func = emitir(IRT(IR_FLOAD, tp), J->base[0], IRFL_CDATA_PTR); - CType *ctr = ctype_rawchild(cts, ct); - IRType t = crec_ct2irt(cts, ctr); - TRef tr; - TValue tv; - /* Check for blacklisted C functions that might call a callback. */ - setlightudV(&tv, - cdata_getptr(cdataptr(cd), (LJ_64 && tp == IRT_P64) ? 8 : 4)); - if (tvistrue(lj_tab_get(J->L, cts->miscmap, &tv))) - lj_trace_err(J, LJ_TRERR_BLACKL); - if (ctype_isvoid(ctr->info)) { - t = IRT_NIL; - rd->nres = 0; - } else if (!(ctype_isnum(ctr->info) || ctype_isptr(ctr->info) || - ctype_isenum(ctr->info)) || t == IRT_CDATA) { - lj_trace_err(J, LJ_TRERR_NYICALL); - } - if ((ct->info & CTF_VARARG) -#if LJ_TARGET_X86 - || ctype_cconv(ct->info) != CTCC_CDECL -#endif - ) - func = emitir(IRT(IR_CARG, IRT_NIL), func, - lj_ir_kint(J, ctype_typeid(cts, ct))); - tr = emitir(IRT(IR_CALLXS, t), crec_call_args(J, rd, cts, ct), func); - if (ctype_isbool(ctr->info)) { - if (frame_islua(J->L->base-1) && bc_b(frame_pc(J->L->base-1)[-1]) == 1) { - /* Don't check result if ignored. */ - tr = TREF_NIL; - } else { - crec_snap_caller(J); -#if LJ_TARGET_X86ORX64 - /* Note: only the x86/x64 backend supports U8 and only for EQ(tr, 0). */ - lj_ir_set(J, IRTG(IR_NE, IRT_U8), tr, lj_ir_kint(J, 0)); -#else - lj_ir_set(J, IRTGI(IR_NE), tr, lj_ir_kint(J, 0)); -#endif - J->postproc = LJ_POST_FIXGUARDSNAP; - tr = TREF_TRUE; - } - } else if (t == IRT_PTR || (LJ_64 && t == IRT_P32) || - t == IRT_I64 || t == IRT_U64 || ctype_isenum(ctr->info)) { - TRef trid = lj_ir_kint(J, ctype_cid(ct->info)); - tr = emitir(IRTG(IR_CNEWI, IRT_CDATA), trid, tr); - if (t == IRT_I64 || t == IRT_U64) lj_needsplit(J); - } else if (t == IRT_FLOAT || t == IRT_U32) { - tr = emitconv(tr, IRT_NUM, t, 0); - } else if (t == IRT_I8 || t == IRT_I16) { - tr = emitconv(tr, IRT_INT, t, IRCONV_SEXT); - } else if (t == IRT_U8 || t == IRT_U16) { - tr = emitconv(tr, IRT_INT, t, 0); - } - J->base[0] = tr; - J->needsnap = 1; - return 1; - } - return 0; -} - -void LJ_FASTCALL recff_cdata_call(jit_State *J, RecordFFData *rd) -{ - CTState *cts = ctype_ctsG(J2G(J)); - GCcdata *cd = argv2cdata(J, J->base[0], &rd->argv[0]); - CTypeID id = cd->ctypeid; - CType *ct; - cTValue *tv; - MMS mm = MM_call; - if (id == CTID_CTYPEID) { - id = crec_constructor(J, cd, J->base[0]); - mm = MM_new; - } else if (crec_call(J, rd, cd)) { - return; - } - /* Record ctype __call/__new metamethod. */ - ct = ctype_raw(cts, id); - tv = lj_ctype_meta(cts, ctype_isptr(ct->info) ? ctype_cid(ct->info) : id, mm); - if (tv) { - if (tvisfunc(tv)) { - J->base[-1] = lj_ir_kfunc(J, funcV(tv)) | TREF_FRAME; - rd->nres = -1; /* Pending tailcall. */ - return; - } - } else if (mm == MM_new) { - crec_alloc(J, rd, id); - return; - } - /* No metamethod or NYI: non-function metamethods. */ - lj_trace_err(J, LJ_TRERR_BADTYPE); -} - -static TRef crec_arith_int64(jit_State *J, TRef *sp, CType **s, MMS mm) -{ - if (ctype_isnum(s[0]->info) && ctype_isnum(s[1]->info)) { - IRType dt; - CTypeID id; - TRef tr; - MSize i; - IROp op; - lj_needsplit(J); - if (((s[0]->info & CTF_UNSIGNED) && s[0]->size == 8) || - ((s[1]->info & CTF_UNSIGNED) && s[1]->size == 8)) { - dt = IRT_U64; id = CTID_UINT64; - } else { - dt = IRT_I64; id = CTID_INT64; - if (mm < MM_add && - !((s[0]->info | s[1]->info) & CTF_FP) && - s[0]->size == 4 && s[1]->size == 4) { /* Try to narrow comparison. */ - if (!((s[0]->info ^ s[1]->info) & CTF_UNSIGNED) || - (tref_isk(sp[1]) && IR(tref_ref(sp[1]))->i >= 0)) { - dt = (s[0]->info & CTF_UNSIGNED) ? IRT_U32 : IRT_INT; - goto comp; - } else if (tref_isk(sp[0]) && IR(tref_ref(sp[0]))->i >= 0) { - dt = (s[1]->info & CTF_UNSIGNED) ? IRT_U32 : IRT_INT; - goto comp; - } - } - } - for (i = 0; i < 2; i++) { - IRType st = tref_type(sp[i]); - if (st == IRT_NUM || st == IRT_FLOAT) - sp[i] = emitconv(sp[i], dt, st, IRCONV_TRUNC|IRCONV_ANY); - else if (!(st == IRT_I64 || st == IRT_U64)) - sp[i] = emitconv(sp[i], dt, IRT_INT, - (s[i]->info & CTF_UNSIGNED) ? 0 : IRCONV_SEXT); - } - if (mm < MM_add) { - comp: - /* Assume true comparison. Fixup and emit pending guard later. */ - if (mm == MM_eq) { - op = IR_EQ; - } else { - op = mm == MM_lt ? IR_LT : IR_LE; - if (dt == IRT_U32 || dt == IRT_U64) - op += (IR_ULT-IR_LT); - } - lj_ir_set(J, IRTG(op, dt), sp[0], sp[1]); - J->postproc = LJ_POST_FIXGUARD; - return TREF_TRUE; - } else { - tr = emitir(IRT(mm+(int)IR_ADD-(int)MM_add, dt), sp[0], sp[1]); - } - return emitir(IRTG(IR_CNEWI, IRT_CDATA), lj_ir_kint(J, id), tr); - } - return 0; -} - -static TRef crec_arith_ptr(jit_State *J, TRef *sp, CType **s, MMS mm) -{ - CTState *cts = ctype_ctsG(J2G(J)); - CType *ctp = s[0]; - if (ctype_isptr(ctp->info) || ctype_isrefarray(ctp->info)) { - if ((mm == MM_sub || mm == MM_eq || mm == MM_lt || mm == MM_le) && - (ctype_isptr(s[1]->info) || ctype_isrefarray(s[1]->info))) { - if (mm == MM_sub) { /* Pointer difference. */ - TRef tr; - CTSize sz = lj_ctype_size(cts, ctype_cid(ctp->info)); - if (sz == 0 || (sz & (sz-1)) != 0) - return 0; /* NYI: integer division. */ - tr = emitir(IRT(IR_SUB, IRT_INTP), sp[0], sp[1]); - tr = emitir(IRT(IR_BSAR, IRT_INTP), tr, lj_ir_kint(J, lj_fls(sz))); -#if LJ_64 - tr = emitconv(tr, IRT_NUM, IRT_INTP, 0); -#endif - return tr; - } else { /* Pointer comparison (unsigned). */ - /* Assume true comparison. Fixup and emit pending guard later. */ - IROp op = mm == MM_eq ? IR_EQ : mm == MM_lt ? IR_ULT : IR_ULE; - lj_ir_set(J, IRTG(op, IRT_PTR), sp[0], sp[1]); - J->postproc = LJ_POST_FIXGUARD; - return TREF_TRUE; - } - } - if (!((mm == MM_add || mm == MM_sub) && ctype_isnum(s[1]->info))) - return 0; - } else if (mm == MM_add && ctype_isnum(ctp->info) && - (ctype_isptr(s[1]->info) || ctype_isrefarray(s[1]->info))) { - TRef tr = sp[0]; sp[0] = sp[1]; sp[1] = tr; /* Swap pointer and index. */ - ctp = s[1]; - } else { - return 0; - } - { - TRef tr = sp[1]; - IRType t = tref_type(tr); - CTSize sz = lj_ctype_size(cts, ctype_cid(ctp->info)); - CTypeID id; -#if LJ_64 - if (t == IRT_NUM || t == IRT_FLOAT) - tr = emitconv(tr, IRT_INTP, t, IRCONV_TRUNC|IRCONV_ANY); - else if (!(t == IRT_I64 || t == IRT_U64)) - tr = emitconv(tr, IRT_INTP, IRT_INT, - ((t - IRT_I8) & 1) ? 0 : IRCONV_SEXT); -#else - if (!tref_typerange(sp[1], IRT_I8, IRT_U32)) { - tr = emitconv(tr, IRT_INTP, t, - (t == IRT_NUM || t == IRT_FLOAT) ? - IRCONV_TRUNC|IRCONV_ANY : 0); - } -#endif - tr = emitir(IRT(IR_MUL, IRT_INTP), tr, lj_ir_kintp(J, sz)); - tr = emitir(IRT(mm+(int)IR_ADD-(int)MM_add, IRT_PTR), sp[0], tr); - id = lj_ctype_intern(cts, CTINFO(CT_PTR, CTALIGN_PTR|ctype_cid(ctp->info)), - CTSIZE_PTR); - return emitir(IRTG(IR_CNEWI, IRT_CDATA), lj_ir_kint(J, id), tr); - } -} - -/* Record ctype arithmetic metamethods. */ -static TRef crec_arith_meta(jit_State *J, TRef *sp, CType **s, CTState *cts, - RecordFFData *rd) -{ - cTValue *tv = NULL; - if (J->base[0]) { - if (tviscdata(&rd->argv[0])) { - CTypeID id = argv2cdata(J, J->base[0], &rd->argv[0])->ctypeid; - CType *ct = ctype_raw(cts, id); - if (ctype_isptr(ct->info)) id = ctype_cid(ct->info); - tv = lj_ctype_meta(cts, id, (MMS)rd->data); - } - if (!tv && J->base[1] && tviscdata(&rd->argv[1])) { - CTypeID id = argv2cdata(J, J->base[1], &rd->argv[1])->ctypeid; - CType *ct = ctype_raw(cts, id); - if (ctype_isptr(ct->info)) id = ctype_cid(ct->info); - tv = lj_ctype_meta(cts, id, (MMS)rd->data); - } - } - if (tv) { - if (tvisfunc(tv)) { - J->base[-1] = lj_ir_kfunc(J, funcV(tv)) | TREF_FRAME; - rd->nres = -1; /* Pending tailcall. */ - return 0; - } /* NYI: non-function metamethods. */ - } else if ((MMS)rd->data == MM_eq) { /* Fallback cdata pointer comparison. */ - if (sp[0] && sp[1] && ctype_isnum(s[0]->info) == ctype_isnum(s[1]->info)) { - /* Assume true comparison. Fixup and emit pending guard later. */ - lj_ir_set(J, IRTG(IR_EQ, IRT_PTR), sp[0], sp[1]); - J->postproc = LJ_POST_FIXGUARD; - return TREF_TRUE; - } else { - return TREF_FALSE; - } - } - lj_trace_err(J, LJ_TRERR_BADTYPE); - return 0; -} - -void LJ_FASTCALL recff_cdata_arith(jit_State *J, RecordFFData *rd) -{ - CTState *cts = ctype_ctsG(J2G(J)); - TRef sp[2]; - CType *s[2]; - MSize i; - for (i = 0; i < 2; i++) { - TRef tr = J->base[i]; - CType *ct = ctype_get(cts, CTID_DOUBLE); - if (!tr) { - lj_trace_err(J, LJ_TRERR_BADTYPE); - } else if (tref_iscdata(tr)) { - CTypeID id = argv2cdata(J, tr, &rd->argv[i])->ctypeid; - IRType t; - ct = ctype_raw(cts, id); - t = crec_ct2irt(cts, ct); - if (ctype_isptr(ct->info)) { /* Resolve pointer or reference. */ - tr = emitir(IRT(IR_FLOAD, t), tr, IRFL_CDATA_PTR); - if (ctype_isref(ct->info)) { - ct = ctype_rawchild(cts, ct); - t = crec_ct2irt(cts, ct); - } - } else if (t == IRT_I64 || t == IRT_U64) { - tr = emitir(IRT(IR_FLOAD, t), tr, IRFL_CDATA_INT64); - lj_needsplit(J); - goto ok; - } else if (t == IRT_INT || t == IRT_U32) { - tr = emitir(IRT(IR_FLOAD, t), tr, IRFL_CDATA_INT); - if (ctype_isenum(ct->info)) ct = ctype_child(cts, ct); - goto ok; - } else if (ctype_isfunc(ct->info)) { - tr = emitir(IRT(IR_FLOAD, IRT_PTR), tr, IRFL_CDATA_PTR); - ct = ctype_get(cts, - lj_ctype_intern(cts, CTINFO(CT_PTR, CTALIGN_PTR|id), CTSIZE_PTR)); - goto ok; - } else { - tr = emitir(IRT(IR_ADD, IRT_PTR), tr, lj_ir_kintp(J, sizeof(GCcdata))); - } - if (ctype_isenum(ct->info)) ct = ctype_child(cts, ct); - if (ctype_isnum(ct->info)) { - if (t == IRT_CDATA) { - tr = 0; - } else { - if (t == IRT_I64 || t == IRT_U64) lj_needsplit(J); - tr = emitir(IRT(IR_XLOAD, t), tr, 0); - } - } - } else if (tref_isnil(tr)) { - tr = lj_ir_kptr(J, NULL); - ct = ctype_get(cts, CTID_P_VOID); - } else if (tref_isinteger(tr)) { - ct = ctype_get(cts, CTID_INT32); - } else if (tref_isstr(tr)) { - TRef tr2 = J->base[1-i]; - CTypeID id = argv2cdata(J, tr2, &rd->argv[1-i])->ctypeid; - ct = ctype_raw(cts, id); - if (ctype_isenum(ct->info)) { /* Match string against enum constant. */ - GCstr *str = strV(&rd->argv[i]); - CTSize ofs; - CType *cct = lj_ctype_getfield(cts, ct, str, &ofs); - if (cct && ctype_isconstval(cct->info)) { - /* Specialize to the name of the enum constant. */ - emitir(IRTG(IR_EQ, IRT_STR), tr, lj_ir_kstr(J, str)); - ct = ctype_child(cts, cct); - tr = lj_ir_kint(J, (int32_t)ofs); - } else { /* Interpreter will throw or return false. */ - ct = ctype_get(cts, CTID_P_VOID); - } - } else if (ctype_isptr(ct->info)) { - tr = emitir(IRT(IR_ADD, IRT_PTR), tr, lj_ir_kintp(J, sizeof(GCstr))); - } else { - ct = ctype_get(cts, CTID_P_VOID); - } - } else if (!tref_isnum(tr)) { - tr = 0; - ct = ctype_get(cts, CTID_P_VOID); - } - ok: - s[i] = ct; - sp[i] = tr; - } - { - TRef tr; - if (!(tr = crec_arith_int64(J, sp, s, (MMS)rd->data)) && - !(tr = crec_arith_ptr(J, sp, s, (MMS)rd->data)) && - !(tr = crec_arith_meta(J, sp, s, cts, rd))) - return; - J->base[0] = tr; - /* Fixup cdata comparisons, too. Avoids some cdata escapes. */ - if (J->postproc == LJ_POST_FIXGUARD && frame_iscont(J->L->base-1) && - !irt_isguard(J->guardemit)) { - const BCIns *pc = frame_contpc(J->L->base-1) - 1; - if (bc_op(*pc) <= BC_ISNEP) { - setframe_pc(&J2G(J)->tmptv, pc); - J2G(J)->tmptv.u32.lo = ((tref_istrue(tr) ^ bc_op(*pc)) & 1); - J->postproc = LJ_POST_FIXCOMP; - } - } - } -} - -/* -- C library namespace metamethods ------------------------------------- */ - -void LJ_FASTCALL recff_clib_index(jit_State *J, RecordFFData *rd) -{ - CTState *cts = ctype_ctsG(J2G(J)); - if (tref_isudata(J->base[0]) && tref_isstr(J->base[1]) && - udataV(&rd->argv[0])->udtype == UDTYPE_FFI_CLIB) { - CLibrary *cl = (CLibrary *)uddata(udataV(&rd->argv[0])); - GCstr *name = strV(&rd->argv[1]); - CType *ct; - CTypeID id = lj_ctype_getname(cts, &ct, name, CLNS_INDEX); - cTValue *tv = lj_tab_getstr(cl->cache, name); - rd->nres = rd->data; - if (id && tv && !tvisnil(tv)) { - /* Specialize to the symbol name and make the result a constant. */ - emitir(IRTG(IR_EQ, IRT_STR), J->base[1], lj_ir_kstr(J, name)); - if (ctype_isconstval(ct->info)) { - if (ct->size >= 0x80000000u && - (ctype_child(cts, ct)->info & CTF_UNSIGNED)) - J->base[0] = lj_ir_knum(J, (lua_Number)(uint32_t)ct->size); - else - J->base[0] = lj_ir_kint(J, (int32_t)ct->size); - } else if (ctype_isextern(ct->info)) { - CTypeID sid = ctype_cid(ct->info); - void *sp = *(void **)cdataptr(cdataV(tv)); - TRef ptr; - ct = ctype_raw(cts, sid); - if (LJ_64 && !checkptr32(sp)) - ptr = lj_ir_kintp(J, (uintptr_t)sp); - else - ptr = lj_ir_kptr(J, sp); - if (rd->data) { - J->base[0] = crec_tv_ct(J, ct, sid, ptr); - } else { - J->needsnap = 1; - crec_ct_tv(J, ct, ptr, J->base[2], &rd->argv[2]); - } - } else { - J->base[0] = lj_ir_kgc(J, obj2gco(cdataV(tv)), IRT_CDATA); - } - } else { - lj_trace_err(J, LJ_TRERR_NOCACHE); - } - } /* else: interpreter will throw. */ -} - -/* -- FFI library functions ----------------------------------------------- */ - -static TRef crec_toint(jit_State *J, CTState *cts, TRef sp, TValue *sval) -{ - return crec_ct_tv(J, ctype_get(cts, CTID_INT32), 0, sp, sval); -} - -void LJ_FASTCALL recff_ffi_new(jit_State *J, RecordFFData *rd) -{ - crec_alloc(J, rd, argv2ctype(J, J->base[0], &rd->argv[0])); -} - -void LJ_FASTCALL recff_ffi_errno(jit_State *J, RecordFFData *rd) -{ - UNUSED(rd); - if (J->base[0]) - lj_trace_err(J, LJ_TRERR_NYICALL); - J->base[0] = lj_ir_call(J, IRCALL_lj_vm_errno); -} - -void LJ_FASTCALL recff_ffi_string(jit_State *J, RecordFFData *rd) -{ - CTState *cts = ctype_ctsG(J2G(J)); - TRef tr = J->base[0]; - if (tr) { - TRef trlen = J->base[1]; - if (!tref_isnil(trlen)) { - trlen = crec_toint(J, cts, trlen, &rd->argv[1]); - tr = crec_ct_tv(J, ctype_get(cts, CTID_P_CVOID), 0, tr, &rd->argv[0]); - } else { - tr = crec_ct_tv(J, ctype_get(cts, CTID_P_CCHAR), 0, tr, &rd->argv[0]); - trlen = lj_ir_call(J, IRCALL_strlen, tr); - } - J->base[0] = emitir(IRT(IR_XSNEW, IRT_STR), tr, trlen); - } /* else: interpreter will throw. */ -} - -void LJ_FASTCALL recff_ffi_copy(jit_State *J, RecordFFData *rd) -{ - CTState *cts = ctype_ctsG(J2G(J)); - TRef trdst = J->base[0], trsrc = J->base[1], trlen = J->base[2]; - if (trdst && trsrc && (trlen || tref_isstr(trsrc))) { - trdst = crec_ct_tv(J, ctype_get(cts, CTID_P_VOID), 0, trdst, &rd->argv[0]); - trsrc = crec_ct_tv(J, ctype_get(cts, CTID_P_CVOID), 0, trsrc, &rd->argv[1]); - if (trlen) { - trlen = crec_toint(J, cts, trlen, &rd->argv[2]); - } else { - trlen = emitir(IRTI(IR_FLOAD), J->base[1], IRFL_STR_LEN); - trlen = emitir(IRTI(IR_ADD), trlen, lj_ir_kint(J, 1)); - } - rd->nres = 0; - crec_copy(J, trdst, trsrc, trlen, NULL); - } /* else: interpreter will throw. */ -} - -void LJ_FASTCALL recff_ffi_fill(jit_State *J, RecordFFData *rd) -{ - CTState *cts = ctype_ctsG(J2G(J)); - TRef trdst = J->base[0], trlen = J->base[1], trfill = J->base[2]; - if (trdst && trlen) { - CTSize step = 1; - if (tviscdata(&rd->argv[0])) { /* Get alignment of original destination. */ - CTSize sz; - CType *ct = ctype_raw(cts, cdataV(&rd->argv[0])->ctypeid); - if (ctype_isptr(ct->info)) - ct = ctype_rawchild(cts, ct); - step = (1u<argv[0]); - trlen = crec_toint(J, cts, trlen, &rd->argv[1]); - if (trfill) - trfill = crec_toint(J, cts, trfill, &rd->argv[2]); - else - trfill = lj_ir_kint(J, 0); - rd->nres = 0; - crec_fill(J, trdst, trlen, trfill, step); - } /* else: interpreter will throw. */ -} - -void LJ_FASTCALL recff_ffi_typeof(jit_State *J, RecordFFData *rd) -{ - if (tref_iscdata(J->base[0])) { - TRef trid = lj_ir_kint(J, argv2ctype(J, J->base[0], &rd->argv[0])); - J->base[0] = emitir(IRTG(IR_CNEWI, IRT_CDATA), - lj_ir_kint(J, CTID_CTYPEID), trid); - } else { - setfuncV(J->L, &J->errinfo, J->fn); - lj_trace_err_info(J, LJ_TRERR_NYIFFU); - } -} - -void LJ_FASTCALL recff_ffi_istype(jit_State *J, RecordFFData *rd) -{ - argv2ctype(J, J->base[0], &rd->argv[0]); - if (tref_iscdata(J->base[1])) { - argv2ctype(J, J->base[1], &rd->argv[1]); - J->postproc = LJ_POST_FIXBOOL; - J->base[0] = TREF_TRUE; - } else { - J->base[0] = TREF_FALSE; - } -} - -void LJ_FASTCALL recff_ffi_abi(jit_State *J, RecordFFData *rd) -{ - if (tref_isstr(J->base[0])) { - /* Specialize to the ABI string to make the boolean result a constant. */ - emitir(IRTG(IR_EQ, IRT_STR), J->base[0], lj_ir_kstr(J, strV(&rd->argv[0]))); - J->postproc = LJ_POST_FIXBOOL; - J->base[0] = TREF_TRUE; - } else { - lj_trace_err(J, LJ_TRERR_BADTYPE); - } -} - -/* Record ffi.sizeof(), ffi.alignof(), ffi.offsetof(). */ -void LJ_FASTCALL recff_ffi_xof(jit_State *J, RecordFFData *rd) -{ - CTypeID id = argv2ctype(J, J->base[0], &rd->argv[0]); - if (rd->data == FF_ffi_sizeof) { - CType *ct = lj_ctype_rawref(ctype_ctsG(J2G(J)), id); - if (ctype_isvltype(ct->info)) - lj_trace_err(J, LJ_TRERR_BADTYPE); - } else if (rd->data == FF_ffi_offsetof) { /* Specialize to the field name. */ - if (!tref_isstr(J->base[1])) - lj_trace_err(J, LJ_TRERR_BADTYPE); - emitir(IRTG(IR_EQ, IRT_STR), J->base[1], lj_ir_kstr(J, strV(&rd->argv[1]))); - rd->nres = 3; /* Just in case. */ - } - J->postproc = LJ_POST_FIXCONST; - J->base[0] = J->base[1] = J->base[2] = TREF_NIL; -} - -void LJ_FASTCALL recff_ffi_gc(jit_State *J, RecordFFData *rd) -{ - argv2cdata(J, J->base[0], &rd->argv[0]); - crec_finalizer(J, J->base[0], &rd->argv[1]); -} - -/* -- Miscellaneous library functions ------------------------------------- */ - -void LJ_FASTCALL lj_crecord_tonumber(jit_State *J, RecordFFData *rd) -{ - CTState *cts = ctype_ctsG(J2G(J)); - CType *d, *ct = lj_ctype_rawref(cts, cdataV(&rd->argv[0])->ctypeid); - if (ctype_isenum(ct->info)) ct = ctype_child(cts, ct); - if (ctype_isnum(ct->info) || ctype_iscomplex(ct->info)) { - if (ctype_isinteger_or_bool(ct->info) && ct->size <= 4 && - !(ct->size == 4 && (ct->info & CTF_UNSIGNED))) - d = ctype_get(cts, CTID_INT32); - else - d = ctype_get(cts, CTID_DOUBLE); - J->base[0] = crec_ct_tv(J, d, 0, J->base[0], &rd->argv[0]); - } else { - J->base[0] = TREF_NIL; - } -} - -#undef IR -#undef emitir -#undef emitconv - -#endif diff --git a/deps/luajit/src/lj_crecord.h b/deps/luajit/src/lj_crecord.h deleted file mode 100644 index a4628cac..00000000 --- a/deps/luajit/src/lj_crecord.h +++ /dev/null @@ -1,31 +0,0 @@ -/* -** Trace recorder for C data operations. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#ifndef _LJ_CRECORD_H -#define _LJ_CRECORD_H - -#include "lj_obj.h" -#include "lj_jit.h" -#include "lj_ffrecord.h" - -#if LJ_HASJIT && LJ_HASFFI -LJ_FUNC void LJ_FASTCALL recff_cdata_index(jit_State *J, RecordFFData *rd); -LJ_FUNC void LJ_FASTCALL recff_cdata_call(jit_State *J, RecordFFData *rd); -LJ_FUNC void LJ_FASTCALL recff_cdata_arith(jit_State *J, RecordFFData *rd); -LJ_FUNC void LJ_FASTCALL recff_clib_index(jit_State *J, RecordFFData *rd); -LJ_FUNC void LJ_FASTCALL recff_ffi_new(jit_State *J, RecordFFData *rd); -LJ_FUNC void LJ_FASTCALL recff_ffi_errno(jit_State *J, RecordFFData *rd); -LJ_FUNC void LJ_FASTCALL recff_ffi_string(jit_State *J, RecordFFData *rd); -LJ_FUNC void LJ_FASTCALL recff_ffi_copy(jit_State *J, RecordFFData *rd); -LJ_FUNC void LJ_FASTCALL recff_ffi_fill(jit_State *J, RecordFFData *rd); -LJ_FUNC void LJ_FASTCALL recff_ffi_typeof(jit_State *J, RecordFFData *rd); -LJ_FUNC void LJ_FASTCALL recff_ffi_istype(jit_State *J, RecordFFData *rd); -LJ_FUNC void LJ_FASTCALL recff_ffi_abi(jit_State *J, RecordFFData *rd); -LJ_FUNC void LJ_FASTCALL recff_ffi_xof(jit_State *J, RecordFFData *rd); -LJ_FUNC void LJ_FASTCALL recff_ffi_gc(jit_State *J, RecordFFData *rd); -LJ_FUNC void LJ_FASTCALL lj_crecord_tonumber(jit_State *J, RecordFFData *rd); -#endif - -#endif diff --git a/deps/luajit/src/lj_ctype.c b/deps/luajit/src/lj_ctype.c deleted file mode 100644 index ac301749..00000000 --- a/deps/luajit/src/lj_ctype.c +++ /dev/null @@ -1,634 +0,0 @@ -/* -** C type management. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#include "lj_obj.h" - -#if LJ_HASFFI - -#include "lj_gc.h" -#include "lj_err.h" -#include "lj_str.h" -#include "lj_tab.h" -#include "lj_ctype.h" -#include "lj_ccallback.h" - -/* -- C type definitions -------------------------------------------------- */ - -/* Predefined typedefs. */ -#define CTTDDEF(_) \ - /* Vararg handling. */ \ - _("va_list", P_VOID) \ - _("__builtin_va_list", P_VOID) \ - _("__gnuc_va_list", P_VOID) \ - /* From stddef.h. */ \ - _("ptrdiff_t", INT_PSZ) \ - _("size_t", UINT_PSZ) \ - _("wchar_t", WCHAR) \ - /* Subset of stdint.h. */ \ - _("int8_t", INT8) \ - _("int16_t", INT16) \ - _("int32_t", INT32) \ - _("int64_t", INT64) \ - _("uint8_t", UINT8) \ - _("uint16_t", UINT16) \ - _("uint32_t", UINT32) \ - _("uint64_t", UINT64) \ - _("intptr_t", INT_PSZ) \ - _("uintptr_t", UINT_PSZ) \ - /* End of typedef list. */ - -/* Keywords (only the ones we actually care for). */ -#define CTKWDEF(_) \ - /* Type specifiers. */ \ - _("void", -1, CTOK_VOID) \ - _("_Bool", 0, CTOK_BOOL) \ - _("bool", 1, CTOK_BOOL) \ - _("char", 1, CTOK_CHAR) \ - _("int", 4, CTOK_INT) \ - _("__int8", 1, CTOK_INT) \ - _("__int16", 2, CTOK_INT) \ - _("__int32", 4, CTOK_INT) \ - _("__int64", 8, CTOK_INT) \ - _("float", 4, CTOK_FP) \ - _("double", 8, CTOK_FP) \ - _("long", 0, CTOK_LONG) \ - _("short", 0, CTOK_SHORT) \ - _("_Complex", 0, CTOK_COMPLEX) \ - _("complex", 0, CTOK_COMPLEX) \ - _("__complex", 0, CTOK_COMPLEX) \ - _("__complex__", 0, CTOK_COMPLEX) \ - _("signed", 0, CTOK_SIGNED) \ - _("__signed", 0, CTOK_SIGNED) \ - _("__signed__", 0, CTOK_SIGNED) \ - _("unsigned", 0, CTOK_UNSIGNED) \ - /* Type qualifiers. */ \ - _("const", 0, CTOK_CONST) \ - _("__const", 0, CTOK_CONST) \ - _("__const__", 0, CTOK_CONST) \ - _("volatile", 0, CTOK_VOLATILE) \ - _("__volatile", 0, CTOK_VOLATILE) \ - _("__volatile__", 0, CTOK_VOLATILE) \ - _("restrict", 0, CTOK_RESTRICT) \ - _("__restrict", 0, CTOK_RESTRICT) \ - _("__restrict__", 0, CTOK_RESTRICT) \ - _("inline", 0, CTOK_INLINE) \ - _("__inline", 0, CTOK_INLINE) \ - _("__inline__", 0, CTOK_INLINE) \ - /* Storage class specifiers. */ \ - _("typedef", 0, CTOK_TYPEDEF) \ - _("extern", 0, CTOK_EXTERN) \ - _("static", 0, CTOK_STATIC) \ - _("auto", 0, CTOK_AUTO) \ - _("register", 0, CTOK_REGISTER) \ - /* GCC Attributes. */ \ - _("__extension__", 0, CTOK_EXTENSION) \ - _("__attribute", 0, CTOK_ATTRIBUTE) \ - _("__attribute__", 0, CTOK_ATTRIBUTE) \ - _("asm", 0, CTOK_ASM) \ - _("__asm", 0, CTOK_ASM) \ - _("__asm__", 0, CTOK_ASM) \ - /* MSVC Attributes. */ \ - _("__declspec", 0, CTOK_DECLSPEC) \ - _("__cdecl", CTCC_CDECL, CTOK_CCDECL) \ - _("__thiscall", CTCC_THISCALL, CTOK_CCDECL) \ - _("__fastcall", CTCC_FASTCALL, CTOK_CCDECL) \ - _("__stdcall", CTCC_STDCALL, CTOK_CCDECL) \ - _("__ptr32", 4, CTOK_PTRSZ) \ - _("__ptr64", 8, CTOK_PTRSZ) \ - /* Other type specifiers. */ \ - _("struct", 0, CTOK_STRUCT) \ - _("union", 0, CTOK_UNION) \ - _("enum", 0, CTOK_ENUM) \ - /* Operators. */ \ - _("sizeof", 0, CTOK_SIZEOF) \ - _("__alignof", 0, CTOK_ALIGNOF) \ - _("__alignof__", 0, CTOK_ALIGNOF) \ - /* End of keyword list. */ - -/* Type info for predefined types. Size merged in. */ -static CTInfo lj_ctype_typeinfo[] = { -#define CTTYINFODEF(id, sz, ct, info) CTINFO((ct),(((sz)&0x3fu)<<10)+(info)), -#define CTTDINFODEF(name, id) CTINFO(CT_TYPEDEF, CTID_##id), -#define CTKWINFODEF(name, sz, kw) CTINFO(CT_KW,(((sz)&0x3fu)<<10)+(kw)), -CTTYDEF(CTTYINFODEF) -CTTDDEF(CTTDINFODEF) -CTKWDEF(CTKWINFODEF) -#undef CTTYINFODEF -#undef CTTDINFODEF -#undef CTKWINFODEF - 0 -}; - -/* Predefined type names collected in a single string. */ -static const char * const lj_ctype_typenames = -#define CTTDNAMEDEF(name, id) name "\0" -#define CTKWNAMEDEF(name, sz, cds) name "\0" -CTTDDEF(CTTDNAMEDEF) -CTKWDEF(CTKWNAMEDEF) -#undef CTTDNAMEDEF -#undef CTKWNAMEDEF -; - -#define CTTYPEINFO_NUM (sizeof(lj_ctype_typeinfo)/sizeof(CTInfo)-1) -#ifdef LUAJIT_CTYPE_CHECK_ANCHOR -#define CTTYPETAB_MIN CTTYPEINFO_NUM -#else -#define CTTYPETAB_MIN 128 -#endif - -/* -- C type interning ---------------------------------------------------- */ - -#define ct_hashtype(info, size) (hashrot(info, size) & CTHASH_MASK) -#define ct_hashname(name) \ - (hashrot(u32ptr(name), u32ptr(name) + HASH_BIAS) & CTHASH_MASK) - -/* Create new type element. */ -CTypeID lj_ctype_new(CTState *cts, CType **ctp) -{ - CTypeID id = cts->top; - CType *ct; - lua_assert(cts->L); - if (LJ_UNLIKELY(id >= cts->sizetab)) { - if (id >= CTID_MAX) lj_err_msg(cts->L, LJ_ERR_TABOV); -#ifdef LUAJIT_CTYPE_CHECK_ANCHOR - ct = lj_mem_newvec(cts->L, id+1, CType); - memcpy(ct, cts->tab, id*sizeof(CType)); - memset(cts->tab, 0, id*sizeof(CType)); - lj_mem_freevec(cts->g, cts->tab, cts->sizetab, CType); - cts->tab = ct; - cts->sizetab = id+1; -#else - lj_mem_growvec(cts->L, cts->tab, cts->sizetab, CTID_MAX, CType); -#endif - } - cts->top = id+1; - *ctp = ct = &cts->tab[id]; - ct->info = 0; - ct->size = 0; - ct->sib = 0; - ct->next = 0; - setgcrefnull(ct->name); - return id; -} - -/* Intern a type element. */ -CTypeID lj_ctype_intern(CTState *cts, CTInfo info, CTSize size) -{ - uint32_t h = ct_hashtype(info, size); - CTypeID id = cts->hash[h]; - lua_assert(cts->L); - while (id) { - CType *ct = ctype_get(cts, id); - if (ct->info == info && ct->size == size) - return id; - id = ct->next; - } - id = cts->top; - if (LJ_UNLIKELY(id >= cts->sizetab)) { - if (id >= CTID_MAX) lj_err_msg(cts->L, LJ_ERR_TABOV); - lj_mem_growvec(cts->L, cts->tab, cts->sizetab, CTID_MAX, CType); - } - cts->top = id+1; - cts->tab[id].info = info; - cts->tab[id].size = size; - cts->tab[id].sib = 0; - cts->tab[id].next = cts->hash[h]; - setgcrefnull(cts->tab[id].name); - cts->hash[h] = (CTypeID1)id; - return id; -} - -/* Add type element to hash table. */ -static void ctype_addtype(CTState *cts, CType *ct, CTypeID id) -{ - uint32_t h = ct_hashtype(ct->info, ct->size); - ct->next = cts->hash[h]; - cts->hash[h] = (CTypeID1)id; -} - -/* Add named element to hash table. */ -void lj_ctype_addname(CTState *cts, CType *ct, CTypeID id) -{ - uint32_t h = ct_hashname(gcref(ct->name)); - ct->next = cts->hash[h]; - cts->hash[h] = (CTypeID1)id; -} - -/* Get a C type by name, matching the type mask. */ -CTypeID lj_ctype_getname(CTState *cts, CType **ctp, GCstr *name, uint32_t tmask) -{ - CTypeID id = cts->hash[ct_hashname(name)]; - while (id) { - CType *ct = ctype_get(cts, id); - if (gcref(ct->name) == obj2gco(name) && - ((tmask >> ctype_type(ct->info)) & 1)) { - *ctp = ct; - return id; - } - id = ct->next; - } - *ctp = &cts->tab[0]; /* Simplify caller logic. ctype_get() would assert. */ - return 0; -} - -/* Get a struct/union/enum/function field by name. */ -CType *lj_ctype_getfieldq(CTState *cts, CType *ct, GCstr *name, CTSize *ofs, - CTInfo *qual) -{ - while (ct->sib) { - ct = ctype_get(cts, ct->sib); - if (gcref(ct->name) == obj2gco(name)) { - *ofs = ct->size; - return ct; - } - if (ctype_isxattrib(ct->info, CTA_SUBTYPE)) { - CType *fct, *cct = ctype_child(cts, ct); - CTInfo q = 0; - while (ctype_isattrib(cct->info)) { - if (ctype_attrib(cct->info) == CTA_QUAL) q |= cct->size; - cct = ctype_child(cts, cct); - } - fct = lj_ctype_getfieldq(cts, cct, name, ofs, qual); - if (fct) { - if (qual) *qual |= q; - *ofs += ct->size; - return fct; - } - } - } - return NULL; /* Not found. */ -} - -/* -- C type information -------------------------------------------------- */ - -/* Follow references and get raw type for a C type ID. */ -CType *lj_ctype_rawref(CTState *cts, CTypeID id) -{ - CType *ct = ctype_get(cts, id); - while (ctype_isattrib(ct->info) || ctype_isref(ct->info)) - ct = ctype_child(cts, ct); - return ct; -} - -/* Get size for a C type ID. Does NOT support VLA/VLS. */ -CTSize lj_ctype_size(CTState *cts, CTypeID id) -{ - CType *ct = ctype_raw(cts, id); - return ctype_hassize(ct->info) ? ct->size : CTSIZE_INVALID; -} - -/* Get size for a variable-length C type. Does NOT support other C types. */ -CTSize lj_ctype_vlsize(CTState *cts, CType *ct, CTSize nelem) -{ - uint64_t xsz = 0; - if (ctype_isstruct(ct->info)) { - CTypeID arrid = 0, fid = ct->sib; - xsz = ct->size; /* Add the struct size. */ - while (fid) { - CType *ctf = ctype_get(cts, fid); - if (ctype_type(ctf->info) == CT_FIELD) - arrid = ctype_cid(ctf->info); /* Remember last field of VLS. */ - fid = ctf->sib; - } - ct = ctype_raw(cts, arrid); - } - lua_assert(ctype_isvlarray(ct->info)); /* Must be a VLA. */ - ct = ctype_rawchild(cts, ct); /* Get array element. */ - lua_assert(ctype_hassize(ct->info)); - /* Calculate actual size of VLA and check for overflow. */ - xsz += (uint64_t)ct->size * nelem; - return xsz < 0x80000000u ? (CTSize)xsz : CTSIZE_INVALID; -} - -/* Get type, qualifiers, size and alignment for a C type ID. */ -CTInfo lj_ctype_info(CTState *cts, CTypeID id, CTSize *szp) -{ - CTInfo qual = 0; - CType *ct = ctype_get(cts, id); - for (;;) { - CTInfo info = ct->info; - if (ctype_isenum(info)) { - /* Follow child. Need to look at its attributes, too. */ - } else if (ctype_isattrib(info)) { - if (ctype_isxattrib(info, CTA_QUAL)) - qual |= ct->size; - else if (ctype_isxattrib(info, CTA_ALIGN) && !(qual & CTFP_ALIGNED)) - qual |= CTFP_ALIGNED + CTALIGN(ct->size); - } else { - if (!(qual & CTFP_ALIGNED)) qual |= (info & CTF_ALIGN); - qual |= (info & ~(CTF_ALIGN|CTMASK_CID)); - lua_assert(ctype_hassize(info) || ctype_isfunc(info)); - *szp = ctype_isfunc(info) ? CTSIZE_INVALID : ct->size; - break; - } - ct = ctype_get(cts, ctype_cid(info)); - } - return qual; -} - -/* Get ctype metamethod. */ -cTValue *lj_ctype_meta(CTState *cts, CTypeID id, MMS mm) -{ - CType *ct = ctype_get(cts, id); - cTValue *tv; - while (ctype_isattrib(ct->info) || ctype_isref(ct->info)) { - id = ctype_cid(ct->info); - ct = ctype_get(cts, id); - } - if (ctype_isptr(ct->info) && - ctype_isfunc(ctype_get(cts, ctype_cid(ct->info))->info)) - tv = lj_tab_getstr(cts->miscmap, &cts->g->strempty); - else - tv = lj_tab_getinth(cts->miscmap, -(int32_t)id); - if (tv && tvistab(tv) && - (tv = lj_tab_getstr(tabV(tv), mmname_str(cts->g, mm))) && !tvisnil(tv)) - return tv; - return NULL; -} - -/* -- C type representation ----------------------------------------------- */ - -/* Fixed max. length of a C type representation. */ -#define CTREPR_MAX 512 - -typedef struct CTRepr { - char *pb, *pe; - CTState *cts; - lua_State *L; - int needsp; - int ok; - char buf[CTREPR_MAX]; -} CTRepr; - -/* Prepend string. */ -static void ctype_prepstr(CTRepr *ctr, const char *str, MSize len) -{ - char *p = ctr->pb; - if (ctr->buf + len+1 > p) { ctr->ok = 0; return; } - if (ctr->needsp) *--p = ' '; - ctr->needsp = 1; - p -= len; - while (len-- > 0) p[len] = str[len]; - ctr->pb = p; -} - -#define ctype_preplit(ctr, str) ctype_prepstr((ctr), "" str, sizeof(str)-1) - -/* Prepend char. */ -static void ctype_prepc(CTRepr *ctr, int c) -{ - if (ctr->buf >= ctr->pb) { ctr->ok = 0; return; } - *--ctr->pb = c; -} - -/* Prepend number. */ -static void ctype_prepnum(CTRepr *ctr, uint32_t n) -{ - char *p = ctr->pb; - if (ctr->buf + 10+1 > p) { ctr->ok = 0; return; } - do { *--p = (char)('0' + n % 10); } while (n /= 10); - ctr->pb = p; - ctr->needsp = 0; -} - -/* Append char. */ -static void ctype_appc(CTRepr *ctr, int c) -{ - if (ctr->pe >= ctr->buf + CTREPR_MAX) { ctr->ok = 0; return; } - *ctr->pe++ = c; -} - -/* Append number. */ -static void ctype_appnum(CTRepr *ctr, uint32_t n) -{ - char buf[10]; - char *p = buf+sizeof(buf); - char *q = ctr->pe; - if (q > ctr->buf + CTREPR_MAX - 10) { ctr->ok = 0; return; } - do { *--p = (char)('0' + n % 10); } while (n /= 10); - do { *q++ = *p++; } while (p < buf+sizeof(buf)); - ctr->pe = q; -} - -/* Prepend qualifiers. */ -static void ctype_prepqual(CTRepr *ctr, CTInfo info) -{ - if ((info & CTF_VOLATILE)) ctype_preplit(ctr, "volatile"); - if ((info & CTF_CONST)) ctype_preplit(ctr, "const"); -} - -/* Prepend named type. */ -static void ctype_preptype(CTRepr *ctr, CType *ct, CTInfo qual, const char *t) -{ - if (gcref(ct->name)) { - GCstr *str = gco2str(gcref(ct->name)); - ctype_prepstr(ctr, strdata(str), str->len); - } else { - if (ctr->needsp) ctype_prepc(ctr, ' '); - ctype_prepnum(ctr, ctype_typeid(ctr->cts, ct)); - ctr->needsp = 1; - } - ctype_prepstr(ctr, t, (MSize)strlen(t)); - ctype_prepqual(ctr, qual); -} - -static void ctype_repr(CTRepr *ctr, CTypeID id) -{ - CType *ct = ctype_get(ctr->cts, id); - CTInfo qual = 0; - int ptrto = 0; - for (;;) { - CTInfo info = ct->info; - CTSize size = ct->size; - switch (ctype_type(info)) { - case CT_NUM: - if ((info & CTF_BOOL)) { - ctype_preplit(ctr, "bool"); - } else if ((info & CTF_FP)) { - if (size == sizeof(double)) ctype_preplit(ctr, "double"); - else if (size == sizeof(float)) ctype_preplit(ctr, "float"); - else ctype_preplit(ctr, "long double"); - } else if (size == 1) { - if (!((info ^ CTF_UCHAR) & CTF_UNSIGNED)) ctype_preplit(ctr, "char"); - else if (CTF_UCHAR) ctype_preplit(ctr, "signed char"); - else ctype_preplit(ctr, "unsigned char"); - } else if (size < 8) { - if (size == 4) ctype_preplit(ctr, "int"); - else ctype_preplit(ctr, "short"); - if ((info & CTF_UNSIGNED)) ctype_preplit(ctr, "unsigned"); - } else { - ctype_preplit(ctr, "_t"); - ctype_prepnum(ctr, size*8); - ctype_preplit(ctr, "int"); - if ((info & CTF_UNSIGNED)) ctype_prepc(ctr, 'u'); - } - ctype_prepqual(ctr, (qual|info)); - return; - case CT_VOID: - ctype_preplit(ctr, "void"); - ctype_prepqual(ctr, (qual|info)); - return; - case CT_STRUCT: - ctype_preptype(ctr, ct, qual, (info & CTF_UNION) ? "union" : "struct"); - return; - case CT_ENUM: - if (id == CTID_CTYPEID) { - ctype_preplit(ctr, "ctype"); - return; - } - ctype_preptype(ctr, ct, qual, "enum"); - return; - case CT_ATTRIB: - if (ctype_attrib(info) == CTA_QUAL) qual |= size; - break; - case CT_PTR: - if ((info & CTF_REF)) { - ctype_prepc(ctr, '&'); - } else { - ctype_prepqual(ctr, (qual|info)); - if (LJ_64 && size == 4) ctype_preplit(ctr, "__ptr32"); - ctype_prepc(ctr, '*'); - } - qual = 0; - ptrto = 1; - ctr->needsp = 1; - break; - case CT_ARRAY: - if (ctype_isrefarray(info)) { - ctr->needsp = 1; - if (ptrto) { ptrto = 0; ctype_prepc(ctr, '('); ctype_appc(ctr, ')'); } - ctype_appc(ctr, '['); - if (size != CTSIZE_INVALID) { - CTSize csize = ctype_child(ctr->cts, ct)->size; - ctype_appnum(ctr, csize ? size/csize : 0); - } else if ((info & CTF_VLA)) { - ctype_appc(ctr, '?'); - } - ctype_appc(ctr, ']'); - } else if ((info & CTF_COMPLEX)) { - if (size == 2*sizeof(float)) ctype_preplit(ctr, "float"); - ctype_preplit(ctr, "complex"); - return; - } else { - ctype_preplit(ctr, ")))"); - ctype_prepnum(ctr, size); - ctype_preplit(ctr, "__attribute__((vector_size("); - } - break; - case CT_FUNC: - ctr->needsp = 1; - if (ptrto) { ptrto = 0; ctype_prepc(ctr, '('); ctype_appc(ctr, ')'); } - ctype_appc(ctr, '('); - ctype_appc(ctr, ')'); - break; - default: - lua_assert(0); - break; - } - ct = ctype_get(ctr->cts, ctype_cid(info)); - } -} - -/* Return a printable representation of a C type. */ -GCstr *lj_ctype_repr(lua_State *L, CTypeID id, GCstr *name) -{ - global_State *g = G(L); - CTRepr ctr; - ctr.pb = ctr.pe = &ctr.buf[CTREPR_MAX/2]; - ctr.cts = ctype_ctsG(g); - ctr.L = L; - ctr.ok = 1; - ctr.needsp = 0; - if (name) ctype_prepstr(&ctr, strdata(name), name->len); - ctype_repr(&ctr, id); - if (LJ_UNLIKELY(!ctr.ok)) return lj_str_newlit(L, "?"); - return lj_str_new(L, ctr.pb, ctr.pe - ctr.pb); -} - -/* Convert int64_t/uint64_t to string with 'LL' or 'ULL' suffix. */ -GCstr *lj_ctype_repr_int64(lua_State *L, uint64_t n, int isunsigned) -{ - char buf[1+20+3]; - char *p = buf+sizeof(buf); - int sign = 0; - *--p = 'L'; *--p = 'L'; - if (isunsigned) { - *--p = 'U'; - } else if ((int64_t)n < 0) { - n = (uint64_t)-(int64_t)n; - sign = 1; - } - do { *--p = (char)('0' + n % 10); } while (n /= 10); - if (sign) *--p = '-'; - return lj_str_new(L, p, (size_t)(buf+sizeof(buf)-p)); -} - -/* Convert complex to string with 'i' or 'I' suffix. */ -GCstr *lj_ctype_repr_complex(lua_State *L, void *sp, CTSize size) -{ - char buf[2*LJ_STR_NUMBUF+2+1]; - TValue re, im; - size_t len; - if (size == 2*sizeof(double)) { - re.n = *(double *)sp; im.n = ((double *)sp)[1]; - } else { - re.n = (double)*(float *)sp; im.n = (double)((float *)sp)[1]; - } - len = lj_str_bufnum(buf, &re); - if (!(im.u32.hi & 0x80000000u) || im.n != im.n) buf[len++] = '+'; - len += lj_str_bufnum(buf+len, &im); - buf[len] = buf[len-1] >= 'a' ? 'I' : 'i'; - return lj_str_new(L, buf, len+1); -} - -/* -- C type state -------------------------------------------------------- */ - -/* Initialize C type table and state. */ -CTState *lj_ctype_init(lua_State *L) -{ - CTState *cts = lj_mem_newt(L, sizeof(CTState), CTState); - CType *ct = lj_mem_newvec(L, CTTYPETAB_MIN, CType); - const char *name = lj_ctype_typenames; - CTypeID id; - memset(cts, 0, sizeof(CTState)); - cts->tab = ct; - cts->sizetab = CTTYPETAB_MIN; - cts->top = CTTYPEINFO_NUM; - cts->L = NULL; - cts->g = G(L); - for (id = 0; id < CTTYPEINFO_NUM; id++, ct++) { - CTInfo info = lj_ctype_typeinfo[id]; - ct->size = (CTSize)((int32_t)(info << 16) >> 26); - ct->info = info & 0xffff03ffu; - ct->sib = 0; - if (ctype_type(info) == CT_KW || ctype_istypedef(info)) { - size_t len = strlen(name); - GCstr *str = lj_str_new(L, name, len); - ctype_setname(ct, str); - name += len+1; - lj_ctype_addname(cts, ct, id); - } else { - setgcrefnull(ct->name); - ct->next = 0; - if (!ctype_isenum(info)) ctype_addtype(cts, ct, id); - } - } - setmref(G(L)->ctype_state, cts); - return cts; -} - -/* Free C type table and state. */ -void lj_ctype_freestate(global_State *g) -{ - CTState *cts = ctype_ctsG(g); - if (cts) { - lj_ccallback_mcode_free(cts); - lj_mem_freevec(g, cts->tab, cts->sizetab, CType); - lj_mem_freevec(g, cts->cb.cbid, cts->cb.sizeid, CTypeID1); - lj_mem_freet(g, cts); - } -} - -#endif diff --git a/deps/luajit/src/lj_ctype.h b/deps/luajit/src/lj_ctype.h deleted file mode 100644 index 3df26f09..00000000 --- a/deps/luajit/src/lj_ctype.h +++ /dev/null @@ -1,461 +0,0 @@ -/* -** C type management. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#ifndef _LJ_CTYPE_H -#define _LJ_CTYPE_H - -#include "lj_obj.h" -#include "lj_gc.h" - -#if LJ_HASFFI - -/* -- C type definitions -------------------------------------------------- */ - -/* C type numbers. Highest 4 bits of C type info. ORDER CT. */ -enum { - /* Externally visible types. */ - CT_NUM, /* Integer or floating-point numbers. */ - CT_STRUCT, /* Struct or union. */ - CT_PTR, /* Pointer or reference. */ - CT_ARRAY, /* Array or complex type. */ - CT_MAYCONVERT = CT_ARRAY, - CT_VOID, /* Void type. */ - CT_ENUM, /* Enumeration. */ - CT_HASSIZE = CT_ENUM, /* Last type where ct->size holds the actual size. */ - CT_FUNC, /* Function. */ - CT_TYPEDEF, /* Typedef. */ - CT_ATTRIB, /* Miscellaneous attributes. */ - /* Internal element types. */ - CT_FIELD, /* Struct/union field or function parameter. */ - CT_BITFIELD, /* Struct/union bitfield. */ - CT_CONSTVAL, /* Constant value. */ - CT_EXTERN, /* External reference. */ - CT_KW /* Keyword. */ -}; - -LJ_STATIC_ASSERT(((int)CT_PTR & (int)CT_ARRAY) == CT_PTR); -LJ_STATIC_ASSERT(((int)CT_STRUCT & (int)CT_ARRAY) == CT_STRUCT); - -/* -** ---------- info ------------ -** |type flags... A cid | size | sib | next | name | -** +----------------------------+--------+-------+-------+-------+-- -** |NUM BFvcUL.. A | size | | type | | -** |STRUCT ..vcU..V A | size | field | name? | name? | -** |PTR ..vcR... A cid | size | | type | | -** |ARRAY VCvc...V A cid | size | | type | | -** |VOID ..vc.... A | size | | type | | -** |ENUM A cid | size | const | name? | name? | -** |FUNC ....VS.. cc cid | nargs | field | name? | name? | -** |TYPEDEF cid | | | name | name | -** |ATTRIB attrnum cid | attr | sib? | type? | | -** |FIELD cid | offset | field | | name? | -** |BITFIELD B.vcU csz bsz pos | offset | field | | name? | -** |CONSTVAL c cid | value | const | name | name | -** |EXTERN cid | | sib? | name | name | -** |KW tok | size | | name | name | -** +----------------------------+--------+-------+-------+-------+-- -** ^^ ^^--- bits used for C type conversion dispatch -*/ - -/* C type info flags. TFFArrrr */ -#define CTF_BOOL 0x08000000u /* Boolean: NUM, BITFIELD. */ -#define CTF_FP 0x04000000u /* Floating-point: NUM. */ -#define CTF_CONST 0x02000000u /* Const qualifier. */ -#define CTF_VOLATILE 0x01000000u /* Volatile qualifier. */ -#define CTF_UNSIGNED 0x00800000u /* Unsigned: NUM, BITFIELD. */ -#define CTF_LONG 0x00400000u /* Long: NUM. */ -#define CTF_VLA 0x00100000u /* Variable-length: ARRAY, STRUCT. */ -#define CTF_REF 0x00800000u /* Reference: PTR. */ -#define CTF_VECTOR 0x08000000u /* Vector: ARRAY. */ -#define CTF_COMPLEX 0x04000000u /* Complex: ARRAY. */ -#define CTF_UNION 0x00800000u /* Union: STRUCT. */ -#define CTF_VARARG 0x00800000u /* Vararg: FUNC. */ -#define CTF_SSEREGPARM 0x00400000u /* SSE register parameters: FUNC. */ - -#define CTF_QUAL (CTF_CONST|CTF_VOLATILE) -#define CTF_ALIGN (CTMASK_ALIGN< 0 ? CTF_UNSIGNED : 0) - -/* Flags used in parser. .F.Ammvf cp->attr */ -#define CTFP_ALIGNED 0x00000001u /* cp->attr + ALIGN */ -#define CTFP_PACKED 0x00000002u /* cp->attr */ -/* ...C...f cp->fattr */ -#define CTFP_CCONV 0x00000001u /* cp->fattr + CCONV/[SSE]REGPARM */ - -/* C type info bitfields. */ -#define CTMASK_CID 0x0000ffffu /* Max. 65536 type IDs. */ -#define CTMASK_NUM 0xf0000000u /* Max. 16 type numbers. */ -#define CTSHIFT_NUM 28 -#define CTMASK_ALIGN 15 /* Max. alignment is 2^15. */ -#define CTSHIFT_ALIGN 16 -#define CTMASK_ATTRIB 255 /* Max. 256 attributes. */ -#define CTSHIFT_ATTRIB 16 -#define CTMASK_CCONV 3 /* Max. 4 calling conventions. */ -#define CTSHIFT_CCONV 16 -#define CTMASK_REGPARM 3 /* Max. 0-3 regparms. */ -#define CTSHIFT_REGPARM 18 -/* Bitfields only used in parser. */ -#define CTMASK_VSIZEP 15 /* Max. vector size is 2^15. */ -#define CTSHIFT_VSIZEP 4 -#define CTMASK_MSIZEP 255 /* Max. type size (via mode) is 128. */ -#define CTSHIFT_MSIZEP 8 - -/* Info bits for BITFIELD. Max. size of bitfield is 64 bits. */ -#define CTBSZ_MAX 32 /* Max. size of bitfield is 32 bit. */ -#define CTBSZ_FIELD 127 /* Temp. marker for regular field. */ -#define CTMASK_BITPOS 127 -#define CTMASK_BITBSZ 127 -#define CTMASK_BITCSZ 127 -#define CTSHIFT_BITPOS 0 -#define CTSHIFT_BITBSZ 8 -#define CTSHIFT_BITCSZ 16 - -#define CTF_INSERT(info, field, val) \ - info = (info & ~(CTMASK_##field<> CTSHIFT_NUM) -#define ctype_cid(info) ((CTypeID)((info) & CTMASK_CID)) -#define ctype_align(info) (((info) >> CTSHIFT_ALIGN) & CTMASK_ALIGN) -#define ctype_attrib(info) (((info) >> CTSHIFT_ATTRIB) & CTMASK_ATTRIB) -#define ctype_bitpos(info) (((info) >> CTSHIFT_BITPOS) & CTMASK_BITPOS) -#define ctype_bitbsz(info) (((info) >> CTSHIFT_BITBSZ) & CTMASK_BITBSZ) -#define ctype_bitcsz(info) (((info) >> CTSHIFT_BITCSZ) & CTMASK_BITCSZ) -#define ctype_vsizeP(info) (((info) >> CTSHIFT_VSIZEP) & CTMASK_VSIZEP) -#define ctype_msizeP(info) (((info) >> CTSHIFT_MSIZEP) & CTMASK_MSIZEP) -#define ctype_cconv(info) (((info) >> CTSHIFT_CCONV) & CTMASK_CCONV) - -/* Simple type checks. */ -#define ctype_isnum(info) (ctype_type((info)) == CT_NUM) -#define ctype_isvoid(info) (ctype_type((info)) == CT_VOID) -#define ctype_isptr(info) (ctype_type((info)) == CT_PTR) -#define ctype_isarray(info) (ctype_type((info)) == CT_ARRAY) -#define ctype_isstruct(info) (ctype_type((info)) == CT_STRUCT) -#define ctype_isfunc(info) (ctype_type((info)) == CT_FUNC) -#define ctype_isenum(info) (ctype_type((info)) == CT_ENUM) -#define ctype_istypedef(info) (ctype_type((info)) == CT_TYPEDEF) -#define ctype_isattrib(info) (ctype_type((info)) == CT_ATTRIB) -#define ctype_isfield(info) (ctype_type((info)) == CT_FIELD) -#define ctype_isbitfield(info) (ctype_type((info)) == CT_BITFIELD) -#define ctype_isconstval(info) (ctype_type((info)) == CT_CONSTVAL) -#define ctype_isextern(info) (ctype_type((info)) == CT_EXTERN) -#define ctype_hassize(info) (ctype_type((info)) <= CT_HASSIZE) - -/* Combined type and flag checks. */ -#define ctype_isinteger(info) \ - (((info) & (CTMASK_NUM|CTF_BOOL|CTF_FP)) == CTINFO(CT_NUM, 0)) -#define ctype_isinteger_or_bool(info) \ - (((info) & (CTMASK_NUM|CTF_FP)) == CTINFO(CT_NUM, 0)) -#define ctype_isbool(info) \ - (((info) & (CTMASK_NUM|CTF_BOOL)) == CTINFO(CT_NUM, CTF_BOOL)) -#define ctype_isfp(info) \ - (((info) & (CTMASK_NUM|CTF_FP)) == CTINFO(CT_NUM, CTF_FP)) - -#define ctype_ispointer(info) \ - ((ctype_type(info) >> 1) == (CT_PTR >> 1)) /* Pointer or array. */ -#define ctype_isref(info) \ - (((info) & (CTMASK_NUM|CTF_REF)) == CTINFO(CT_PTR, CTF_REF)) - -#define ctype_isrefarray(info) \ - (((info) & (CTMASK_NUM|CTF_VECTOR|CTF_COMPLEX)) == CTINFO(CT_ARRAY, 0)) -#define ctype_isvector(info) \ - (((info) & (CTMASK_NUM|CTF_VECTOR)) == CTINFO(CT_ARRAY, CTF_VECTOR)) -#define ctype_iscomplex(info) \ - (((info) & (CTMASK_NUM|CTF_COMPLEX)) == CTINFO(CT_ARRAY, CTF_COMPLEX)) - -#define ctype_isvltype(info) \ - (((info) & ((CTMASK_NUM|CTF_VLA) - (2u<") _(STRING, "") \ - _(INTEGER, "") _(EOF, "") \ - _(OROR, "||") _(ANDAND, "&&") _(EQ, "==") _(NE, "!=") \ - _(LE, "<=") _(GE, ">=") _(SHL, "<<") _(SHR, ">>") _(DEREF, "->") - -/* Simple declaration specifiers. */ -#define CDSDEF(_) \ - _(VOID) _(BOOL) _(CHAR) _(INT) _(FP) \ - _(LONG) _(LONGLONG) _(SHORT) _(COMPLEX) _(SIGNED) _(UNSIGNED) \ - _(CONST) _(VOLATILE) _(RESTRICT) _(INLINE) \ - _(TYPEDEF) _(EXTERN) _(STATIC) _(AUTO) _(REGISTER) - -/* C keywords. */ -#define CKWDEF(_) \ - CDSDEF(_) _(EXTENSION) _(ASM) _(ATTRIBUTE) \ - _(DECLSPEC) _(CCDECL) _(PTRSZ) \ - _(STRUCT) _(UNION) _(ENUM) \ - _(SIZEOF) _(ALIGNOF) - -/* C token numbers. */ -enum { - CTOK_OFS = 255, -#define CTOKNUM(name, sym) CTOK_##name, -#define CKWNUM(name) CTOK_##name, -CTOKDEF(CTOKNUM) -CKWDEF(CKWNUM) -#undef CTOKNUM -#undef CKWNUM - CTOK_FIRSTDECL = CTOK_VOID, - CTOK_FIRSTSCL = CTOK_TYPEDEF, - CTOK_LASTDECLFLAG = CTOK_REGISTER, - CTOK_LASTDECL = CTOK_ENUM -}; - -/* Declaration specifier flags. */ -enum { -#define CDSFLAG(name) CDF_##name = (1u << (CTOK_##name - CTOK_FIRSTDECL)), -CDSDEF(CDSFLAG) -#undef CDSFLAG - CDF__END -}; - -#define CDF_SCL (CDF_TYPEDEF|CDF_EXTERN|CDF_STATIC|CDF_AUTO|CDF_REGISTER) - -/* -- C type management --------------------------------------------------- */ - -#define ctype_ctsG(g) (mref((g)->ctype_state, CTState)) - -/* Get C type state. */ -static LJ_AINLINE CTState *ctype_cts(lua_State *L) -{ - CTState *cts = ctype_ctsG(G(L)); - cts->L = L; /* Save L for errors and allocations. */ - return cts; -} - -/* Save and restore state of C type table. */ -#define LJ_CTYPE_SAVE(cts) CTState savects_ = *(cts) -#define LJ_CTYPE_RESTORE(cts) \ - ((cts)->top = savects_.top, \ - memcpy((cts)->hash, savects_.hash, sizeof(savects_.hash))) - -/* Check C type ID for validity when assertions are enabled. */ -static LJ_AINLINE CTypeID ctype_check(CTState *cts, CTypeID id) -{ - lua_assert(id > 0 && id < cts->top); UNUSED(cts); - return id; -} - -/* Get C type for C type ID. */ -static LJ_AINLINE CType *ctype_get(CTState *cts, CTypeID id) -{ - return &cts->tab[ctype_check(cts, id)]; -} - -/* Get C type ID for a C type. */ -#define ctype_typeid(cts, ct) ((CTypeID)((ct) - (cts)->tab)) - -/* Get child C type. */ -static LJ_AINLINE CType *ctype_child(CTState *cts, CType *ct) -{ - lua_assert(!(ctype_isvoid(ct->info) || ctype_isstruct(ct->info) || - ctype_isbitfield(ct->info))); /* These don't have children. */ - return ctype_get(cts, ctype_cid(ct->info)); -} - -/* Get raw type for a C type ID. */ -static LJ_AINLINE CType *ctype_raw(CTState *cts, CTypeID id) -{ - CType *ct = ctype_get(cts, id); - while (ctype_isattrib(ct->info)) ct = ctype_child(cts, ct); - return ct; -} - -/* Get raw type of the child of a C type. */ -static LJ_AINLINE CType *ctype_rawchild(CTState *cts, CType *ct) -{ - do { ct = ctype_child(cts, ct); } while (ctype_isattrib(ct->info)); - return ct; -} - -/* Set the name of a C type table element. */ -static LJ_AINLINE void ctype_setname(CType *ct, GCstr *s) -{ - /* NOBARRIER: mark string as fixed -- the C type table is never collected. */ - fixstring(s); - setgcref(ct->name, obj2gco(s)); -} - -LJ_FUNC CTypeID lj_ctype_new(CTState *cts, CType **ctp); -LJ_FUNC CTypeID lj_ctype_intern(CTState *cts, CTInfo info, CTSize size); -LJ_FUNC void lj_ctype_addname(CTState *cts, CType *ct, CTypeID id); -LJ_FUNC CTypeID lj_ctype_getname(CTState *cts, CType **ctp, GCstr *name, - uint32_t tmask); -LJ_FUNC CType *lj_ctype_getfieldq(CTState *cts, CType *ct, GCstr *name, - CTSize *ofs, CTInfo *qual); -#define lj_ctype_getfield(cts, ct, name, ofs) \ - lj_ctype_getfieldq((cts), (ct), (name), (ofs), NULL) -LJ_FUNC CType *lj_ctype_rawref(CTState *cts, CTypeID id); -LJ_FUNC CTSize lj_ctype_size(CTState *cts, CTypeID id); -LJ_FUNC CTSize lj_ctype_vlsize(CTState *cts, CType *ct, CTSize nelem); -LJ_FUNC CTInfo lj_ctype_info(CTState *cts, CTypeID id, CTSize *szp); -LJ_FUNC cTValue *lj_ctype_meta(CTState *cts, CTypeID id, MMS mm); -LJ_FUNC GCstr *lj_ctype_repr(lua_State *L, CTypeID id, GCstr *name); -LJ_FUNC GCstr *lj_ctype_repr_int64(lua_State *L, uint64_t n, int isunsigned); -LJ_FUNC GCstr *lj_ctype_repr_complex(lua_State *L, void *sp, CTSize size); -LJ_FUNC CTState *lj_ctype_init(lua_State *L); -LJ_FUNC void lj_ctype_freestate(global_State *g); - -#endif - -#endif diff --git a/deps/luajit/src/lj_debug.c b/deps/luajit/src/lj_debug.c deleted file mode 100644 index bd2fa1f5..00000000 --- a/deps/luajit/src/lj_debug.c +++ /dev/null @@ -1,605 +0,0 @@ -/* -** Debugging and introspection. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#define lj_debug_c -#define LUA_CORE - -#include "lj_obj.h" -#include "lj_err.h" -#include "lj_debug.h" -#include "lj_str.h" -#include "lj_tab.h" -#include "lj_state.h" -#include "lj_frame.h" -#include "lj_bc.h" -#include "lj_vm.h" -#if LJ_HASJIT -#include "lj_jit.h" -#endif - -/* -- Frames -------------------------------------------------------------- */ - -/* Get frame corresponding to a level. */ -cTValue *lj_debug_frame(lua_State *L, int level, int *size) -{ - cTValue *frame, *nextframe, *bot = tvref(L->stack); - /* Traverse frames backwards. */ - for (nextframe = frame = L->base-1; frame > bot; ) { - if (frame_gc(frame) == obj2gco(L)) - level++; /* Skip dummy frames. See lj_meta_call(). */ - if (level-- == 0) { - *size = (int)(nextframe - frame); - return frame; /* Level found. */ - } - nextframe = frame; - if (frame_islua(frame)) { - frame = frame_prevl(frame); - } else { - if (frame_isvarg(frame)) - level++; /* Skip vararg pseudo-frame. */ - frame = frame_prevd(frame); - } - } - *size = level; - return NULL; /* Level not found. */ -} - -/* Invalid bytecode position. */ -#define NO_BCPOS (~(BCPos)0) - -/* Return bytecode position for function/frame or NO_BCPOS. */ -static BCPos debug_framepc(lua_State *L, GCfunc *fn, cTValue *nextframe) -{ - const BCIns *ins; - GCproto *pt; - BCPos pos; - lua_assert(fn->c.gct == ~LJ_TFUNC || fn->c.gct == ~LJ_TTHREAD); - if (!isluafunc(fn)) { /* Cannot derive a PC for non-Lua functions. */ - return NO_BCPOS; - } else if (nextframe == NULL) { /* Lua function on top. */ - void *cf = cframe_raw(L->cframe); - if (cf == NULL || (char *)cframe_pc(cf) == (char *)cframe_L(cf)) - return NO_BCPOS; - ins = cframe_pc(cf); /* Only happens during error/hook handling. */ - } else { - if (frame_islua(nextframe)) { - ins = frame_pc(nextframe); - } else if (frame_iscont(nextframe)) { - ins = frame_contpc(nextframe); - } else { - /* Lua function below errfunc/gc/hook: find cframe to get the PC. */ - void *cf = cframe_raw(L->cframe); - TValue *f = L->base-1; - for (;;) { - if (cf == NULL) - return NO_BCPOS; - while (cframe_nres(cf) < 0) { - if (f >= restorestack(L, -cframe_nres(cf))) - break; - cf = cframe_raw(cframe_prev(cf)); - if (cf == NULL) - return NO_BCPOS; - } - if (f < nextframe) - break; - if (frame_islua(f)) { - f = frame_prevl(f); - } else { - if (frame_isc(f) || (LJ_HASFFI && frame_iscont(f) && - (f-1)->u32.lo == LJ_CONT_FFI_CALLBACK)) - cf = cframe_raw(cframe_prev(cf)); - f = frame_prevd(f); - } - } - ins = cframe_pc(cf); - } - } - pt = funcproto(fn); - pos = proto_bcpos(pt, ins) - 1; -#if LJ_HASJIT - if (pos > pt->sizebc) { /* Undo the effects of lj_trace_exit for JLOOP. */ - GCtrace *T = (GCtrace *)((char *)(ins-1) - offsetof(GCtrace, startins)); - lua_assert(bc_isret(bc_op(ins[-1]))); - pos = proto_bcpos(pt, mref(T->startpc, const BCIns)); - } -#endif - return pos; -} - -/* -- Line numbers -------------------------------------------------------- */ - -/* Get line number for a bytecode position. */ -BCLine LJ_FASTCALL lj_debug_line(GCproto *pt, BCPos pc) -{ - const void *lineinfo = proto_lineinfo(pt); - if (pc <= pt->sizebc && lineinfo) { - BCLine first = pt->firstline; - if (pc == pt->sizebc) return first + pt->numline; - if (pc-- == 0) return first; - if (pt->numline < 256) - return first + (BCLine)((const uint8_t *)lineinfo)[pc]; - else if (pt->numline < 65536) - return first + (BCLine)((const uint16_t *)lineinfo)[pc]; - else - return first + (BCLine)((const uint32_t *)lineinfo)[pc]; - } - return 0; -} - -/* Get line number for function/frame. */ -static BCLine debug_frameline(lua_State *L, GCfunc *fn, cTValue *nextframe) -{ - BCPos pc = debug_framepc(L, fn, nextframe); - if (pc != NO_BCPOS) { - GCproto *pt = funcproto(fn); - lua_assert(pc <= pt->sizebc); - return lj_debug_line(pt, pc); - } - return -1; -} - -/* -- Variable names ------------------------------------------------------ */ - -/* Read ULEB128 value. */ -static uint32_t debug_read_uleb128(const uint8_t **pp) -{ - const uint8_t *p = *pp; - uint32_t v = *p++; - if (LJ_UNLIKELY(v >= 0x80)) { - int sh = 0; - v &= 0x7f; - do { v |= ((*p & 0x7f) << (sh += 7)); } while (*p++ >= 0x80); - } - *pp = p; - return v; -} - -/* Get name of a local variable from slot number and PC. */ -static const char *debug_varname(const GCproto *pt, BCPos pc, BCReg slot) -{ - const uint8_t *p = proto_varinfo(pt); - if (p) { - BCPos lastpc = 0; - for (;;) { - const char *name = (const char *)p; - uint32_t vn = *p++; - BCPos startpc, endpc; - if (vn < VARNAME__MAX) { - if (vn == VARNAME_END) break; /* End of varinfo. */ - } else { - while (*p++) ; /* Skip over variable name string. */ - } - lastpc = startpc = lastpc + debug_read_uleb128(&p); - if (startpc > pc) break; - endpc = startpc + debug_read_uleb128(&p); - if (pc < endpc && slot-- == 0) { - if (vn < VARNAME__MAX) { -#define VARNAMESTR(name, str) str "\0" - name = VARNAMEDEF(VARNAMESTR); -#undef VARNAMESTR - if (--vn) while (*name++ || --vn) ; - } - return name; - } - } - } - return NULL; -} - -/* Get name of local variable from 1-based slot number and function/frame. */ -static TValue *debug_localname(lua_State *L, const lua_Debug *ar, - const char **name, BCReg slot1) -{ - uint32_t offset = (uint32_t)ar->i_ci & 0xffff; - uint32_t size = (uint32_t)ar->i_ci >> 16; - TValue *frame = tvref(L->stack) + offset; - TValue *nextframe = size ? frame + size : NULL; - GCfunc *fn = frame_func(frame); - BCPos pc = debug_framepc(L, fn, nextframe); - if (!nextframe) nextframe = L->top; - if ((int)slot1 < 0) { /* Negative slot number is for varargs. */ - if (pc != NO_BCPOS) { - GCproto *pt = funcproto(fn); - if ((pt->flags & PROTO_VARARG)) { - slot1 = pt->numparams + (BCReg)(-(int)slot1); - if (frame_isvarg(frame)) { /* Vararg frame has been set up? (pc!=0) */ - nextframe = frame; - frame = frame_prevd(frame); - } - if (frame + slot1 < nextframe) { - *name = "(*vararg)"; - return frame+slot1; - } - } - } - return NULL; - } - if (pc != NO_BCPOS && - (*name = debug_varname(funcproto(fn), pc, slot1-1)) != NULL) - ; - else if (slot1 > 0 && frame + slot1 < nextframe) - *name = "(*temporary)"; - return frame+slot1; -} - -/* Get name of upvalue. */ -const char *lj_debug_uvname(GCproto *pt, uint32_t idx) -{ - const uint8_t *p = proto_uvinfo(pt); - lua_assert(idx < pt->sizeuv); - if (!p) return ""; - if (idx) while (*p++ || --idx) ; - return (const char *)p; -} - -/* Get name and value of upvalue. */ -const char *lj_debug_uvnamev(cTValue *o, uint32_t idx, TValue **tvp) -{ - if (tvisfunc(o)) { - GCfunc *fn = funcV(o); - if (isluafunc(fn)) { - GCproto *pt = funcproto(fn); - if (idx < pt->sizeuv) { - *tvp = uvval(&gcref(fn->l.uvptr[idx])->uv); - return lj_debug_uvname(pt, idx); - } - } else { - if (idx < fn->c.nupvalues) { - *tvp = &fn->c.upvalue[idx]; - return ""; - } - } - } - return NULL; -} - -/* Deduce name of an object from slot number and PC. */ -const char *lj_debug_slotname(GCproto *pt, const BCIns *ip, BCReg slot, - const char **name) -{ - const char *lname; -restart: - lname = debug_varname(pt, proto_bcpos(pt, ip), slot); - if (lname != NULL) { *name = lname; return "local"; } - while (--ip > proto_bc(pt)) { - BCIns ins = *ip; - BCOp op = bc_op(ins); - BCReg ra = bc_a(ins); - if (bcmode_a(op) == BCMbase) { - if (slot >= ra && (op != BC_KNIL || slot <= bc_d(ins))) - return NULL; - } else if (bcmode_a(op) == BCMdst && ra == slot) { - switch (bc_op(ins)) { - case BC_MOV: - if (ra == slot) { slot = bc_d(ins); goto restart; } - break; - case BC_GGET: - *name = strdata(gco2str(proto_kgc(pt, ~(ptrdiff_t)bc_d(ins)))); - return "global"; - case BC_TGETS: - *name = strdata(gco2str(proto_kgc(pt, ~(ptrdiff_t)bc_c(ins)))); - if (ip > proto_bc(pt)) { - BCIns insp = ip[-1]; - if (bc_op(insp) == BC_MOV && bc_a(insp) == ra+1 && - bc_d(insp) == bc_b(ins)) - return "method"; - } - return "field"; - case BC_UGET: - *name = lj_debug_uvname(pt, bc_d(ins)); - return "upvalue"; - default: - return NULL; - } - } - } - return NULL; -} - -/* Deduce function name from caller of a frame. */ -const char *lj_debug_funcname(lua_State *L, TValue *frame, const char **name) -{ - TValue *pframe; - GCfunc *fn; - BCPos pc; - if (frame <= tvref(L->stack)) - return NULL; - if (frame_isvarg(frame)) - frame = frame_prevd(frame); - pframe = frame_prev(frame); - fn = frame_func(pframe); - pc = debug_framepc(L, fn, frame); - if (pc != NO_BCPOS) { - GCproto *pt = funcproto(fn); - const BCIns *ip = &proto_bc(pt)[check_exp(pc < pt->sizebc, pc)]; - MMS mm = bcmode_mm(bc_op(*ip)); - if (mm == MM_call) { - BCReg slot = bc_a(*ip); - if (bc_op(*ip) == BC_ITERC) slot -= 3; - return lj_debug_slotname(pt, ip, slot, name); - } else if (mm != MM__MAX) { - *name = strdata(mmname_str(G(L), mm)); - return "metamethod"; - } - } - return NULL; -} - -/* -- Source code locations ----------------------------------------------- */ - -/* Generate shortened source name. */ -void lj_debug_shortname(char *out, GCstr *str) -{ - const char *src = strdata(str); - if (*src == '=') { - strncpy(out, src+1, LUA_IDSIZE); /* Remove first char. */ - out[LUA_IDSIZE-1] = '\0'; /* Ensures null termination. */ - } else if (*src == '@') { /* Output "source", or "...source". */ - size_t len = str->len-1; - src++; /* Skip the `@' */ - if (len >= LUA_IDSIZE) { - src += len-(LUA_IDSIZE-4); /* Get last part of file name. */ - *out++ = '.'; *out++ = '.'; *out++ = '.'; - } - strcpy(out, src); - } else { /* Output [string "string"]. */ - size_t len; /* Length, up to first control char. */ - for (len = 0; len < LUA_IDSIZE-12; len++) - if (((const unsigned char *)src)[len] < ' ') break; - strcpy(out, "[string \""); out += 9; - if (src[len] != '\0') { /* Must truncate? */ - if (len > LUA_IDSIZE-15) len = LUA_IDSIZE-15; - strncpy(out, src, len); out += len; - strcpy(out, "..."); out += 3; - } else { - strcpy(out, src); out += len; - } - strcpy(out, "\"]"); - } -} - -/* Add current location of a frame to error message. */ -void lj_debug_addloc(lua_State *L, const char *msg, - cTValue *frame, cTValue *nextframe) -{ - if (frame) { - GCfunc *fn = frame_func(frame); - if (isluafunc(fn)) { - BCLine line = debug_frameline(L, fn, nextframe); - if (line >= 0) { - char buf[LUA_IDSIZE]; - lj_debug_shortname(buf, proto_chunkname(funcproto(fn))); - lj_str_pushf(L, "%s:%d: %s", buf, line, msg); - return; - } - } - } - lj_str_pushf(L, "%s", msg); -} - -/* Push location string for a bytecode position to Lua stack. */ -void lj_debug_pushloc(lua_State *L, GCproto *pt, BCPos pc) -{ - GCstr *name = proto_chunkname(pt); - const char *s = strdata(name); - MSize i, len = name->len; - BCLine line = lj_debug_line(pt, pc); - if (*s == '@') { - s++; len--; - for (i = len; i > 0; i--) - if (s[i] == '/' || s[i] == '\\') { - s += i+1; - break; - } - lj_str_pushf(L, "%s:%d", s, line); - } else if (len > 40) { - lj_str_pushf(L, "%p:%d", pt, line); - } else if (*s == '=') { - lj_str_pushf(L, "%s:%d", s+1, line); - } else { - lj_str_pushf(L, "\"%s\":%d", s, line); - } -} - -/* -- Public debug API ---------------------------------------------------- */ - -/* lua_getupvalue() and lua_setupvalue() are in lj_api.c. */ - -LUA_API const char *lua_getlocal(lua_State *L, const lua_Debug *ar, int n) -{ - const char *name = NULL; - if (ar) { - TValue *o = debug_localname(L, ar, &name, (BCReg)n); - if (name) { - copyTV(L, L->top, o); - incr_top(L); - } - } else if (tvisfunc(L->top-1) && isluafunc(funcV(L->top-1))) { - name = debug_varname(funcproto(funcV(L->top-1)), 0, (BCReg)n-1); - } - return name; -} - -LUA_API const char *lua_setlocal(lua_State *L, const lua_Debug *ar, int n) -{ - const char *name = NULL; - TValue *o = debug_localname(L, ar, &name, (BCReg)n); - if (name) - copyTV(L, o, L->top-1); - L->top--; - return name; -} - -int lj_debug_getinfo(lua_State *L, const char *what, lj_Debug *ar, int ext) -{ - int opt_f = 0, opt_L = 0; - TValue *frame = NULL; - TValue *nextframe = NULL; - GCfunc *fn; - if (*what == '>') { - TValue *func = L->top - 1; - api_check(L, tvisfunc(func)); - fn = funcV(func); - L->top--; - what++; - } else { - uint32_t offset = (uint32_t)ar->i_ci & 0xffff; - uint32_t size = (uint32_t)ar->i_ci >> 16; - lua_assert(offset != 0); - frame = tvref(L->stack) + offset; - if (size) nextframe = frame + size; - lua_assert(frame <= tvref(L->maxstack) && - (!nextframe || nextframe <= tvref(L->maxstack))); - fn = frame_func(frame); - lua_assert(fn->c.gct == ~LJ_TFUNC); - } - for (; *what; what++) { - if (*what == 'S') { - if (isluafunc(fn)) { - GCproto *pt = funcproto(fn); - BCLine firstline = pt->firstline; - GCstr *name = proto_chunkname(pt); - ar->source = strdata(name); - lj_debug_shortname(ar->short_src, name); - ar->linedefined = (int)firstline; - ar->lastlinedefined = (int)(firstline + pt->numline); - ar->what = (firstline || !pt->numline) ? "Lua" : "main"; - } else { - ar->source = "=[C]"; - ar->short_src[0] = '['; - ar->short_src[1] = 'C'; - ar->short_src[2] = ']'; - ar->short_src[3] = '\0'; - ar->linedefined = -1; - ar->lastlinedefined = -1; - ar->what = "C"; - } - } else if (*what == 'l') { - ar->currentline = frame ? debug_frameline(L, fn, nextframe) : -1; - } else if (*what == 'u') { - ar->nups = fn->c.nupvalues; - if (ext) { - if (isluafunc(fn)) { - GCproto *pt = funcproto(fn); - ar->nparams = pt->numparams; - ar->isvararg = !!(pt->flags & PROTO_VARARG); - } else { - ar->nparams = 0; - ar->isvararg = 1; - } - } - } else if (*what == 'n') { - ar->namewhat = frame ? lj_debug_funcname(L, frame, &ar->name) : NULL; - if (ar->namewhat == NULL) { - ar->namewhat = ""; - ar->name = NULL; - } - } else if (*what == 'f') { - opt_f = 1; - } else if (*what == 'L') { - opt_L = 1; - } else { - return 0; /* Bad option. */ - } - } - if (opt_f) { - setfuncV(L, L->top, fn); - incr_top(L); - } - if (opt_L) { - if (isluafunc(fn)) { - GCtab *t = lj_tab_new(L, 0, 0); - GCproto *pt = funcproto(fn); - const void *lineinfo = proto_lineinfo(pt); - if (lineinfo) { - BCLine first = pt->firstline; - int sz = pt->numline < 256 ? 1 : pt->numline < 65536 ? 2 : 4; - MSize i, szl = pt->sizebc-1; - for (i = 0; i < szl; i++) { - BCLine line = first + - (sz == 1 ? (BCLine)((const uint8_t *)lineinfo)[i] : - sz == 2 ? (BCLine)((const uint16_t *)lineinfo)[i] : - (BCLine)((const uint32_t *)lineinfo)[i]); - setboolV(lj_tab_setint(L, t, line), 1); - } - } - settabV(L, L->top, t); - } else { - setnilV(L->top); - } - incr_top(L); - } - return 1; /* Ok. */ -} - -LUA_API int lua_getinfo(lua_State *L, const char *what, lua_Debug *ar) -{ - return lj_debug_getinfo(L, what, (lj_Debug *)ar, 0); -} - -LUA_API int lua_getstack(lua_State *L, int level, lua_Debug *ar) -{ - int size; - cTValue *frame = lj_debug_frame(L, level, &size); - if (frame) { - ar->i_ci = (size << 16) + (int)(frame - tvref(L->stack)); - return 1; - } else { - ar->i_ci = level - size; - return 0; - } -} - -/* Number of frames for the leading and trailing part of a traceback. */ -#define TRACEBACK_LEVELS1 12 -#define TRACEBACK_LEVELS2 10 - -LUALIB_API void luaL_traceback (lua_State *L, lua_State *L1, const char *msg, - int level) -{ - int top = (int)(L->top - L->base); - int lim = TRACEBACK_LEVELS1; - lua_Debug ar; - if (msg) lua_pushfstring(L, "%s\n", msg); - lua_pushliteral(L, "stack traceback:"); - while (lua_getstack(L1, level++, &ar)) { - GCfunc *fn; - if (level > lim) { - if (!lua_getstack(L1, level + TRACEBACK_LEVELS2, &ar)) { - level--; - } else { - lua_pushliteral(L, "\n\t..."); - lua_getstack(L1, -10, &ar); - level = ar.i_ci - TRACEBACK_LEVELS2; - } - lim = 2147483647; - continue; - } - lua_getinfo(L1, "Snlf", &ar); - fn = funcV(L1->top-1); L1->top--; - if (isffunc(fn) && !*ar.namewhat) - lua_pushfstring(L, "\n\t[builtin#%d]:", fn->c.ffid); - else - lua_pushfstring(L, "\n\t%s:", ar.short_src); - if (ar.currentline > 0) - lua_pushfstring(L, "%d:", ar.currentline); - if (*ar.namewhat) { - lua_pushfstring(L, " in function " LUA_QS, ar.name); - } else { - if (*ar.what == 'm') { - lua_pushliteral(L, " in main chunk"); - } else if (*ar.what == 'C') { - lua_pushfstring(L, " at %p", fn->c.f); - } else { - lua_pushfstring(L, " in function <%s:%d>", - ar.short_src, ar.linedefined); - } - } - if ((int)(L->top - L->base) - top >= 15) - lua_concat(L, (int)(L->top - L->base) - top); - } - lua_concat(L, (int)(L->top - L->base) - top); -} - diff --git a/deps/luajit/src/lj_debug.h b/deps/luajit/src/lj_debug.h deleted file mode 100644 index fa8988c3..00000000 --- a/deps/luajit/src/lj_debug.h +++ /dev/null @@ -1,61 +0,0 @@ -/* -** Debugging and introspection. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#ifndef _LJ_DEBUG_H -#define _LJ_DEBUG_H - -#include "lj_obj.h" - -typedef struct lj_Debug { - /* Common fields. Must be in the same order as in lua.h. */ - int event; - const char *name; - const char *namewhat; - const char *what; - const char *source; - int currentline; - int nups; - int linedefined; - int lastlinedefined; - char short_src[LUA_IDSIZE]; - int i_ci; - /* Extended fields. Only valid if lj_debug_getinfo() is called with ext = 1.*/ - int nparams; - int isvararg; -} lj_Debug; - -LJ_FUNC cTValue *lj_debug_frame(lua_State *L, int level, int *size); -LJ_FUNC BCLine LJ_FASTCALL lj_debug_line(GCproto *pt, BCPos pc); -LJ_FUNC const char *lj_debug_uvname(GCproto *pt, uint32_t idx); -LJ_FUNC const char *lj_debug_uvnamev(cTValue *o, uint32_t idx, TValue **tvp); -LJ_FUNC const char *lj_debug_slotname(GCproto *pt, const BCIns *pc, - BCReg slot, const char **name); -LJ_FUNC const char *lj_debug_funcname(lua_State *L, TValue *frame, - const char **name); -LJ_FUNC void lj_debug_shortname(char *out, GCstr *str); -LJ_FUNC void lj_debug_addloc(lua_State *L, const char *msg, - cTValue *frame, cTValue *nextframe); -LJ_FUNC void lj_debug_pushloc(lua_State *L, GCproto *pt, BCPos pc); -LJ_FUNC int lj_debug_getinfo(lua_State *L, const char *what, lj_Debug *ar, - int ext); - -/* Fixed internal variable names. */ -#define VARNAMEDEF(_) \ - _(FOR_IDX, "(for index)") \ - _(FOR_STOP, "(for limit)") \ - _(FOR_STEP, "(for step)") \ - _(FOR_GEN, "(for generator)") \ - _(FOR_STATE, "(for state)") \ - _(FOR_CTL, "(for control)") - -enum { - VARNAME_END, -#define VARNAMEENUM(name, str) VARNAME_##name, - VARNAMEDEF(VARNAMEENUM) -#undef VARNAMEENUM - VARNAME__MAX -}; - -#endif diff --git a/deps/luajit/src/lj_def.h b/deps/luajit/src/lj_def.h deleted file mode 100644 index e666c9e3..00000000 --- a/deps/luajit/src/lj_def.h +++ /dev/null @@ -1,353 +0,0 @@ -/* -** LuaJIT common internal definitions. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#ifndef _LJ_DEF_H -#define _LJ_DEF_H - -#include "lua.h" - -#if defined(_MSC_VER) -/* MSVC is stuck in the last century and doesn't have C99's stdint.h. */ -typedef __int8 int8_t; -typedef __int16 int16_t; -typedef __int32 int32_t; -typedef __int64 int64_t; -typedef unsigned __int8 uint8_t; -typedef unsigned __int16 uint16_t; -typedef unsigned __int32 uint32_t; -typedef unsigned __int64 uint64_t; -#ifdef _WIN64 -typedef __int64 intptr_t; -typedef unsigned __int64 uintptr_t; -#else -typedef __int32 intptr_t; -typedef unsigned __int32 uintptr_t; -#endif -#elif defined(__symbian__) -/* Cough. */ -typedef signed char int8_t; -typedef short int int16_t; -typedef int int32_t; -typedef long long int64_t; -typedef unsigned char uint8_t; -typedef unsigned short int uint16_t; -typedef unsigned int uint32_t; -typedef unsigned long long uint64_t; -typedef int intptr_t; -typedef unsigned int uintptr_t; -#else -#include -#endif - -/* Needed everywhere. */ -#include -#include - -/* Various VM limits. */ -#define LJ_MAX_MEM 0x7fffff00 /* Max. total memory allocation. */ -#define LJ_MAX_ALLOC LJ_MAX_MEM /* Max. individual allocation length. */ -#define LJ_MAX_STR LJ_MAX_MEM /* Max. string length. */ -#define LJ_MAX_UDATA LJ_MAX_MEM /* Max. userdata length. */ - -#define LJ_MAX_STRTAB (1<<26) /* Max. string table size. */ -#define LJ_MAX_HBITS 26 /* Max. hash bits. */ -#define LJ_MAX_ABITS 28 /* Max. bits of array key. */ -#define LJ_MAX_ASIZE ((1<<(LJ_MAX_ABITS-1))+1) /* Max. array part size. */ -#define LJ_MAX_COLOSIZE 16 /* Max. elems for colocated array. */ - -#define LJ_MAX_LINE LJ_MAX_MEM /* Max. source code line number. */ -#define LJ_MAX_XLEVEL 200 /* Max. syntactic nesting level. */ -#define LJ_MAX_BCINS (1<<26) /* Max. # of bytecode instructions. */ -#define LJ_MAX_SLOTS 250 /* Max. # of slots in a Lua func. */ -#define LJ_MAX_LOCVAR 200 /* Max. # of local variables. */ -#define LJ_MAX_UPVAL 60 /* Max. # of upvalues. */ - -#define LJ_MAX_IDXCHAIN 100 /* __index/__newindex chain limit. */ -#define LJ_STACK_EXTRA 5 /* Extra stack space (metamethods). */ - -#define LJ_NUM_CBPAGE 1 /* Number of FFI callback pages. */ - -/* Minimum table/buffer sizes. */ -#define LJ_MIN_GLOBAL 6 /* Min. global table size (hbits). */ -#define LJ_MIN_REGISTRY 2 /* Min. registry size (hbits). */ -#define LJ_MIN_STRTAB 256 /* Min. string table size (pow2). */ -#define LJ_MIN_SBUF 32 /* Min. string buffer length. */ -#define LJ_MIN_VECSZ 8 /* Min. size for growable vectors. */ -#define LJ_MIN_IRSZ 32 /* Min. size for growable IR. */ -#define LJ_MIN_K64SZ 16 /* Min. size for chained K64Array. */ - -/* JIT compiler limits. */ -#define LJ_MAX_JSLOTS 250 /* Max. # of stack slots for a trace. */ -#define LJ_MAX_PHI 64 /* Max. # of PHIs for a loop. */ -#define LJ_MAX_EXITSTUBGR 16 /* Max. # of exit stub groups. */ - -/* Various macros. */ -#ifndef UNUSED -#define UNUSED(x) ((void)(x)) /* to avoid warnings */ -#endif - -#define U64x(hi, lo) (((uint64_t)0x##hi << 32) + (uint64_t)0x##lo) -#define i32ptr(p) ((int32_t)(intptr_t)(void *)(p)) -#define u32ptr(p) ((uint32_t)(intptr_t)(void *)(p)) - -#define checki8(x) ((x) == (int32_t)(int8_t)(x)) -#define checku8(x) ((x) == (int32_t)(uint8_t)(x)) -#define checki16(x) ((x) == (int32_t)(int16_t)(x)) -#define checku16(x) ((x) == (int32_t)(uint16_t)(x)) -#define checki32(x) ((x) == (int32_t)(x)) -#define checku32(x) ((x) == (uint32_t)(x)) -#define checkptr32(x) ((uintptr_t)(x) == (uint32_t)(uintptr_t)(x)) - -/* Every half-decent C compiler transforms this into a rotate instruction. */ -#define lj_rol(x, n) (((x)<<(n)) | ((x)>>(-(int)(n)&(8*sizeof(x)-1)))) -#define lj_ror(x, n) (((x)<<(-(int)(n)&(8*sizeof(x)-1))) | ((x)>>(n))) - -/* A really naive Bloom filter. But sufficient for our needs. */ -typedef uintptr_t BloomFilter; -#define BLOOM_MASK (8*sizeof(BloomFilter) - 1) -#define bloombit(x) ((uintptr_t)1 << ((x) & BLOOM_MASK)) -#define bloomset(b, x) ((b) |= bloombit((x))) -#define bloomtest(b, x) ((b) & bloombit((x))) - -#if defined(__GNUC__) || defined(__psp2__) - -#define LJ_NORET __attribute__((noreturn)) -#define LJ_ALIGN(n) __attribute__((aligned(n))) -#define LJ_INLINE inline -#define LJ_AINLINE inline __attribute__((always_inline)) -#define LJ_NOINLINE __attribute__((noinline)) - -#if defined(__ELF__) || defined(__MACH__) || defined(__psp2__) -#if !((defined(__sun__) && defined(__svr4__)) || defined(__CELLOS_LV2__)) -#define LJ_NOAPI extern __attribute__((visibility("hidden"))) -#endif -#endif - -/* Note: it's only beneficial to use fastcall on x86 and then only for up to -** two non-FP args. The amalgamated compile covers all LJ_FUNC cases. Only -** indirect calls and related tail-called C functions are marked as fastcall. -*/ -#if defined(__i386__) -#define LJ_FASTCALL __attribute__((fastcall)) -#endif - -#define LJ_LIKELY(x) __builtin_expect(!!(x), 1) -#define LJ_UNLIKELY(x) __builtin_expect(!!(x), 0) - -#define lj_ffs(x) ((uint32_t)__builtin_ctz(x)) -/* Don't ask ... */ -#if defined(__INTEL_COMPILER) && (defined(__i386__) || defined(__x86_64__)) -static LJ_AINLINE uint32_t lj_fls(uint32_t x) -{ - uint32_t r; __asm__("bsrl %1, %0" : "=r" (r) : "rm" (x) : "cc"); return r; -} -#else -#define lj_fls(x) ((uint32_t)(__builtin_clz(x)^31)) -#endif - -#if defined(__arm__) -static LJ_AINLINE uint32_t lj_bswap(uint32_t x) -{ -#if defined(__psp2__) - return __builtin_rev(x); -#else - uint32_t r; -#if __ARM_ARCH_6__ || __ARM_ARCH_6J__ || __ARM_ARCH_6T2__ || __ARM_ARCH_6Z__ ||\ - __ARM_ARCH_6ZK__ || __ARM_ARCH_7__ || __ARM_ARCH_7A__ || __ARM_ARCH_7R__ - __asm__("rev %0, %1" : "=r" (r) : "r" (x)); - return r; -#else -#ifdef __thumb__ - r = x ^ lj_ror(x, 16); -#else - __asm__("eor %0, %1, %1, ror #16" : "=r" (r) : "r" (x)); -#endif - return ((r & 0xff00ffffu) >> 8) ^ lj_ror(x, 8); -#endif -#endif -} - -static LJ_AINLINE uint64_t lj_bswap64(uint64_t x) -{ - return ((uint64_t)lj_bswap((uint32_t)x)<<32) | lj_bswap((uint32_t)(x>>32)); -} -#elif (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) -static LJ_AINLINE uint32_t lj_bswap(uint32_t x) -{ - return (uint32_t)__builtin_bswap32((int32_t)x); -} - -static LJ_AINLINE uint64_t lj_bswap64(uint64_t x) -{ - return (uint64_t)__builtin_bswap64((int64_t)x); -} -#elif defined(__i386__) || defined(__x86_64__) -static LJ_AINLINE uint32_t lj_bswap(uint32_t x) -{ - uint32_t r; __asm__("bswap %0" : "=r" (r) : "0" (x)); return r; -} - -#if defined(__i386__) -static LJ_AINLINE uint64_t lj_bswap64(uint64_t x) -{ - return ((uint64_t)lj_bswap((uint32_t)x)<<32) | lj_bswap((uint32_t)(x>>32)); -} -#else -static LJ_AINLINE uint64_t lj_bswap64(uint64_t x) -{ - uint64_t r; __asm__("bswap %0" : "=r" (r) : "0" (x)); return r; -} -#endif -#else -static LJ_AINLINE uint32_t lj_bswap(uint32_t x) -{ - return (x << 24) | ((x & 0xff00) << 8) | ((x >> 8) & 0xff00) | (x >> 24); -} - -static LJ_AINLINE uint64_t lj_bswap64(uint64_t x) -{ - return (uint64_t)lj_bswap((uint32_t)(x >> 32)) | - ((uint64_t)lj_bswap((uint32_t)x) << 32); -} -#endif - -typedef union __attribute__((packed)) Unaligned16 { - uint16_t u; - uint8_t b[2]; -} Unaligned16; - -typedef union __attribute__((packed)) Unaligned32 { - uint32_t u; - uint8_t b[4]; -} Unaligned32; - -/* Unaligned load of uint16_t. */ -static LJ_AINLINE uint16_t lj_getu16(const void *p) -{ - return ((const Unaligned16 *)p)->u; -} - -/* Unaligned load of uint32_t. */ -static LJ_AINLINE uint32_t lj_getu32(const void *p) -{ - return ((const Unaligned32 *)p)->u; -} - -#elif defined(_MSC_VER) - -#define LJ_NORET __declspec(noreturn) -#define LJ_ALIGN(n) __declspec(align(n)) -#define LJ_INLINE __inline -#define LJ_AINLINE __forceinline -#define LJ_NOINLINE __declspec(noinline) -#if defined(_M_IX86) -#define LJ_FASTCALL __fastcall -#endif - -#ifdef _M_PPC -unsigned int _CountLeadingZeros(long); -#pragma intrinsic(_CountLeadingZeros) -static LJ_AINLINE uint32_t lj_fls(uint32_t x) -{ - return _CountLeadingZeros(x) ^ 31; -} -#else -unsigned char _BitScanForward(uint32_t *, unsigned long); -unsigned char _BitScanReverse(uint32_t *, unsigned long); -#pragma intrinsic(_BitScanForward) -#pragma intrinsic(_BitScanReverse) - -static LJ_AINLINE uint32_t lj_ffs(uint32_t x) -{ - uint32_t r; _BitScanForward(&r, x); return r; -} - -static LJ_AINLINE uint32_t lj_fls(uint32_t x) -{ - uint32_t r; _BitScanReverse(&r, x); return r; -} -#endif - -unsigned long _byteswap_ulong(unsigned long); -uint64_t _byteswap_uint64(uint64_t); -#define lj_bswap(x) (_byteswap_ulong((x))) -#define lj_bswap64(x) (_byteswap_uint64((x))) - -#if defined(_M_PPC) && defined(LUAJIT_NO_UNALIGNED) -/* -** Replacement for unaligned loads on Xbox 360. Disabled by default since it's -** usually more costly than the occasional stall when crossing a cache-line. -*/ -static LJ_AINLINE uint16_t lj_getu16(const void *v) -{ - const uint8_t *p = (const uint8_t *)v; - return (uint16_t)((p[0]<<8) | p[1]); -} -static LJ_AINLINE uint32_t lj_getu32(const void *v) -{ - const uint8_t *p = (const uint8_t *)v; - return (uint32_t)((p[0]<<24) | (p[1]<<16) | (p[2]<<8) | p[3]); -} -#else -/* Unaligned loads are generally ok on x86/x64. */ -#define lj_getu16(p) (*(uint16_t *)(p)) -#define lj_getu32(p) (*(uint32_t *)(p)) -#endif - -#else -#error "missing defines for your compiler" -#endif - -/* Optional defines. */ -#ifndef LJ_FASTCALL -#define LJ_FASTCALL -#endif -#ifndef LJ_NORET -#define LJ_NORET -#endif -#ifndef LJ_NOAPI -#define LJ_NOAPI extern -#endif -#ifndef LJ_LIKELY -#define LJ_LIKELY(x) (x) -#define LJ_UNLIKELY(x) (x) -#endif - -/* Attributes for internal functions. */ -#define LJ_DATA LJ_NOAPI -#define LJ_DATADEF -#define LJ_ASMF LJ_NOAPI -#define LJ_FUNCA LJ_NOAPI -#if defined(ljamalg_c) -#define LJ_FUNC static -#else -#define LJ_FUNC LJ_NOAPI -#endif -#define LJ_FUNC_NORET LJ_FUNC LJ_NORET -#define LJ_FUNCA_NORET LJ_FUNCA LJ_NORET -#define LJ_ASMF_NORET LJ_ASMF LJ_NORET - -/* Runtime assertions. */ -#ifdef lua_assert -#define check_exp(c, e) (lua_assert(c), (e)) -#define api_check(l, e) lua_assert(e) -#else -#define lua_assert(c) ((void)0) -#define check_exp(c, e) (e) -#define api_check luai_apicheck -#endif - -/* Static assertions. */ -#define LJ_ASSERT_NAME2(name, line) name ## line -#define LJ_ASSERT_NAME(line) LJ_ASSERT_NAME2(lj_assert_, line) -#ifdef __COUNTER__ -#define LJ_STATIC_ASSERT(cond) \ - extern void LJ_ASSERT_NAME(__COUNTER__)(int STATIC_ASSERTION_FAILED[(cond)?1:-1]) -#else -#define LJ_STATIC_ASSERT(cond) \ - extern void LJ_ASSERT_NAME(__LINE__)(int STATIC_ASSERTION_FAILED[(cond)?1:-1]) -#endif - -#endif diff --git a/deps/luajit/src/lj_dispatch.c b/deps/luajit/src/lj_dispatch.c deleted file mode 100644 index 37256576..00000000 --- a/deps/luajit/src/lj_dispatch.c +++ /dev/null @@ -1,494 +0,0 @@ -/* -** Instruction dispatch handling. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#define lj_dispatch_c -#define LUA_CORE - -#include "lj_obj.h" -#include "lj_err.h" -#include "lj_func.h" -#include "lj_str.h" -#include "lj_tab.h" -#include "lj_meta.h" -#include "lj_debug.h" -#include "lj_state.h" -#include "lj_frame.h" -#include "lj_bc.h" -#include "lj_ff.h" -#if LJ_HASJIT -#include "lj_jit.h" -#endif -#if LJ_HASFFI -#include "lj_ccallback.h" -#endif -#include "lj_trace.h" -#include "lj_dispatch.h" -#include "lj_vm.h" -#include "luajit.h" - -/* Bump GG_NUM_ASMFF in lj_dispatch.h as needed. Ugly. */ -LJ_STATIC_ASSERT(GG_NUM_ASMFF == FF_NUM_ASMFUNC); - -/* -- Dispatch table management ------------------------------------------- */ - -#if LJ_TARGET_MIPS -#include -LJ_FUNCA_NORET void LJ_FASTCALL lj_ffh_coroutine_wrap_err(lua_State *L, - lua_State *co); - -#define GOTFUNC(name) (ASMFunction)name, -static const ASMFunction dispatch_got[] = { - GOTDEF(GOTFUNC) -}; -#undef GOTFUNC -#endif - -/* Initialize instruction dispatch table and hot counters. */ -void lj_dispatch_init(GG_State *GG) -{ - uint32_t i; - ASMFunction *disp = GG->dispatch; - for (i = 0; i < GG_LEN_SDISP; i++) - disp[GG_LEN_DDISP+i] = disp[i] = makeasmfunc(lj_bc_ofs[i]); - for (i = GG_LEN_SDISP; i < GG_LEN_DDISP; i++) - disp[i] = makeasmfunc(lj_bc_ofs[i]); - /* The JIT engine is off by default. luaopen_jit() turns it on. */ - disp[BC_FORL] = disp[BC_IFORL]; - disp[BC_ITERL] = disp[BC_IITERL]; - disp[BC_LOOP] = disp[BC_ILOOP]; - disp[BC_FUNCF] = disp[BC_IFUNCF]; - disp[BC_FUNCV] = disp[BC_IFUNCV]; - GG->g.bc_cfunc_ext = GG->g.bc_cfunc_int = BCINS_AD(BC_FUNCC, LUA_MINSTACK, 0); - for (i = 0; i < GG_NUM_ASMFF; i++) - GG->bcff[i] = BCINS_AD(BC__MAX+i, 0, 0); -#if LJ_TARGET_MIPS - memcpy(GG->got, dispatch_got, LJ_GOT__MAX*4); -#endif -} - -#if LJ_HASJIT -/* Initialize hotcount table. */ -void lj_dispatch_init_hotcount(global_State *g) -{ - int32_t hotloop = G2J(g)->param[JIT_P_hotloop]; - HotCount start = (HotCount)(hotloop*HOTCOUNT_LOOP - 1); - HotCount *hotcount = G2GG(g)->hotcount; - uint32_t i; - for (i = 0; i < HOTCOUNT_SIZE; i++) - hotcount[i] = start; -} -#endif - -/* Internal dispatch mode bits. */ -#define DISPMODE_JIT 0x01 /* JIT compiler on. */ -#define DISPMODE_REC 0x02 /* Recording active. */ -#define DISPMODE_INS 0x04 /* Override instruction dispatch. */ -#define DISPMODE_CALL 0x08 /* Override call dispatch. */ -#define DISPMODE_RET 0x10 /* Override return dispatch. */ - -/* Update dispatch table depending on various flags. */ -void lj_dispatch_update(global_State *g) -{ - uint8_t oldmode = g->dispatchmode; - uint8_t mode = 0; -#if LJ_HASJIT - mode |= (G2J(g)->flags & JIT_F_ON) ? DISPMODE_JIT : 0; - mode |= G2J(g)->state != LJ_TRACE_IDLE ? - (DISPMODE_REC|DISPMODE_INS|DISPMODE_CALL) : 0; -#endif - mode |= (g->hookmask & (LUA_MASKLINE|LUA_MASKCOUNT)) ? DISPMODE_INS : 0; - mode |= (g->hookmask & LUA_MASKCALL) ? DISPMODE_CALL : 0; - mode |= (g->hookmask & LUA_MASKRET) ? DISPMODE_RET : 0; - if (oldmode != mode) { /* Mode changed? */ - ASMFunction *disp = G2GG(g)->dispatch; - ASMFunction f_forl, f_iterl, f_loop, f_funcf, f_funcv; - g->dispatchmode = mode; - - /* Hotcount if JIT is on, but not while recording. */ - if ((mode & (DISPMODE_JIT|DISPMODE_REC)) == DISPMODE_JIT) { - f_forl = makeasmfunc(lj_bc_ofs[BC_FORL]); - f_iterl = makeasmfunc(lj_bc_ofs[BC_ITERL]); - f_loop = makeasmfunc(lj_bc_ofs[BC_LOOP]); - f_funcf = makeasmfunc(lj_bc_ofs[BC_FUNCF]); - f_funcv = makeasmfunc(lj_bc_ofs[BC_FUNCV]); - } else { /* Otherwise use the non-hotcounting instructions. */ - f_forl = disp[GG_LEN_DDISP+BC_IFORL]; - f_iterl = disp[GG_LEN_DDISP+BC_IITERL]; - f_loop = disp[GG_LEN_DDISP+BC_ILOOP]; - f_funcf = makeasmfunc(lj_bc_ofs[BC_IFUNCF]); - f_funcv = makeasmfunc(lj_bc_ofs[BC_IFUNCV]); - } - /* Init static counting instruction dispatch first (may be copied below). */ - disp[GG_LEN_DDISP+BC_FORL] = f_forl; - disp[GG_LEN_DDISP+BC_ITERL] = f_iterl; - disp[GG_LEN_DDISP+BC_LOOP] = f_loop; - - /* Set dynamic instruction dispatch. */ - if ((oldmode ^ mode) & (DISPMODE_REC|DISPMODE_INS)) { - /* Need to update the whole table. */ - if (!(mode & (DISPMODE_REC|DISPMODE_INS))) { /* No ins dispatch? */ - /* Copy static dispatch table to dynamic dispatch table. */ - memcpy(&disp[0], &disp[GG_LEN_DDISP], GG_LEN_SDISP*sizeof(ASMFunction)); - /* Overwrite with dynamic return dispatch. */ - if ((mode & DISPMODE_RET)) { - disp[BC_RETM] = lj_vm_rethook; - disp[BC_RET] = lj_vm_rethook; - disp[BC_RET0] = lj_vm_rethook; - disp[BC_RET1] = lj_vm_rethook; - } - } else { - /* The recording dispatch also checks for hooks. */ - ASMFunction f = (mode & DISPMODE_REC) ? lj_vm_record : lj_vm_inshook; - uint32_t i; - for (i = 0; i < GG_LEN_SDISP; i++) - disp[i] = f; - } - } else if (!(mode & (DISPMODE_REC|DISPMODE_INS))) { - /* Otherwise set dynamic counting ins. */ - disp[BC_FORL] = f_forl; - disp[BC_ITERL] = f_iterl; - disp[BC_LOOP] = f_loop; - /* Set dynamic return dispatch. */ - if ((mode & DISPMODE_RET)) { - disp[BC_RETM] = lj_vm_rethook; - disp[BC_RET] = lj_vm_rethook; - disp[BC_RET0] = lj_vm_rethook; - disp[BC_RET1] = lj_vm_rethook; - } else { - disp[BC_RETM] = disp[GG_LEN_DDISP+BC_RETM]; - disp[BC_RET] = disp[GG_LEN_DDISP+BC_RET]; - disp[BC_RET0] = disp[GG_LEN_DDISP+BC_RET0]; - disp[BC_RET1] = disp[GG_LEN_DDISP+BC_RET1]; - } - } - - /* Set dynamic call dispatch. */ - if ((oldmode ^ mode) & DISPMODE_CALL) { /* Update the whole table? */ - uint32_t i; - if ((mode & DISPMODE_CALL) == 0) { /* No call hooks? */ - for (i = GG_LEN_SDISP; i < GG_LEN_DDISP; i++) - disp[i] = makeasmfunc(lj_bc_ofs[i]); - } else { - for (i = GG_LEN_SDISP; i < GG_LEN_DDISP; i++) - disp[i] = lj_vm_callhook; - } - } - if (!(mode & DISPMODE_CALL)) { /* Overwrite dynamic counting ins. */ - disp[BC_FUNCF] = f_funcf; - disp[BC_FUNCV] = f_funcv; - } - -#if LJ_HASJIT - /* Reset hotcounts for JIT off to on transition. */ - if ((mode & DISPMODE_JIT) && !(oldmode & DISPMODE_JIT)) - lj_dispatch_init_hotcount(g); -#endif - } -} - -/* -- JIT mode setting ---------------------------------------------------- */ - -#if LJ_HASJIT -/* Set JIT mode for a single prototype. */ -static void setptmode(global_State *g, GCproto *pt, int mode) -{ - if ((mode & LUAJIT_MODE_ON)) { /* (Re-)enable JIT compilation. */ - pt->flags &= ~PROTO_NOJIT; - lj_trace_reenableproto(pt); /* Unpatch all ILOOP etc. bytecodes. */ - } else { /* Flush and/or disable JIT compilation. */ - if (!(mode & LUAJIT_MODE_FLUSH)) - pt->flags |= PROTO_NOJIT; - lj_trace_flushproto(g, pt); /* Flush all traces of prototype. */ - } -} - -/* Recursively set the JIT mode for all children of a prototype. */ -static void setptmode_all(global_State *g, GCproto *pt, int mode) -{ - ptrdiff_t i; - if (!(pt->flags & PROTO_CHILD)) return; - for (i = -(ptrdiff_t)pt->sizekgc; i < 0; i++) { - GCobj *o = proto_kgc(pt, i); - if (o->gch.gct == ~LJ_TPROTO) { - setptmode(g, gco2pt(o), mode); - setptmode_all(g, gco2pt(o), mode); - } - } -} -#endif - -/* Public API function: control the JIT engine. */ -int luaJIT_setmode(lua_State *L, int idx, int mode) -{ - global_State *g = G(L); - int mm = mode & LUAJIT_MODE_MASK; - lj_trace_abort(g); /* Abort recording on any state change. */ - /* Avoid pulling the rug from under our own feet. */ - if ((g->hookmask & HOOK_GC)) - lj_err_caller(L, LJ_ERR_NOGCMM); - switch (mm) { -#if LJ_HASJIT - case LUAJIT_MODE_ENGINE: - if ((mode & LUAJIT_MODE_FLUSH)) { - lj_trace_flushall(L); - } else { - if (!(mode & LUAJIT_MODE_ON)) - G2J(g)->flags &= ~(uint32_t)JIT_F_ON; -#if LJ_TARGET_X86ORX64 - else if ((G2J(g)->flags & JIT_F_SSE2)) - G2J(g)->flags |= (uint32_t)JIT_F_ON; - else - return 0; /* Don't turn on JIT compiler without SSE2 support. */ -#else - else - G2J(g)->flags |= (uint32_t)JIT_F_ON; -#endif - lj_dispatch_update(g); - } - break; - case LUAJIT_MODE_FUNC: - case LUAJIT_MODE_ALLFUNC: - case LUAJIT_MODE_ALLSUBFUNC: { - cTValue *tv = idx == 0 ? frame_prev(L->base-1) : - idx > 0 ? L->base + (idx-1) : L->top + idx; - GCproto *pt; - if ((idx == 0 || tvisfunc(tv)) && isluafunc(&gcval(tv)->fn)) - pt = funcproto(&gcval(tv)->fn); /* Cannot use funcV() for frame slot. */ - else if (tvisproto(tv)) - pt = protoV(tv); - else - return 0; /* Failed. */ - if (mm != LUAJIT_MODE_ALLSUBFUNC) - setptmode(g, pt, mode); - if (mm != LUAJIT_MODE_FUNC) - setptmode_all(g, pt, mode); - break; - } - case LUAJIT_MODE_TRACE: - if (!(mode & LUAJIT_MODE_FLUSH)) - return 0; /* Failed. */ - lj_trace_flush(G2J(g), idx); - break; -#else - case LUAJIT_MODE_ENGINE: - case LUAJIT_MODE_FUNC: - case LUAJIT_MODE_ALLFUNC: - case LUAJIT_MODE_ALLSUBFUNC: - UNUSED(idx); - if ((mode & LUAJIT_MODE_ON)) - return 0; /* Failed. */ - break; -#endif - case LUAJIT_MODE_WRAPCFUNC: - if ((mode & LUAJIT_MODE_ON)) { - if (idx != 0) { - cTValue *tv = idx > 0 ? L->base + (idx-1) : L->top + idx; - if (tvislightud(tv)) - g->wrapf = (lua_CFunction)lightudV(tv); - else - return 0; /* Failed. */ - } else { - return 0; /* Failed. */ - } - g->bc_cfunc_ext = BCINS_AD(BC_FUNCCW, 0, 0); - } else { - g->bc_cfunc_ext = BCINS_AD(BC_FUNCC, 0, 0); - } - break; - default: - return 0; /* Failed. */ - } - return 1; /* OK. */ -} - -/* Enforce (dynamic) linker error for version mismatches. See luajit.c. */ -LUA_API void LUAJIT_VERSION_SYM(void) -{ -} - -/* -- Hooks --------------------------------------------------------------- */ - -/* This function can be called asynchronously (e.g. during a signal). */ -LUA_API int lua_sethook(lua_State *L, lua_Hook func, int mask, int count) -{ - global_State *g = G(L); - mask &= HOOK_EVENTMASK; - if (func == NULL || mask == 0) { mask = 0; func = NULL; } /* Consistency. */ - g->hookf = func; - g->hookcount = g->hookcstart = (int32_t)count; - g->hookmask = (uint8_t)((g->hookmask & ~HOOK_EVENTMASK) | mask); - lj_trace_abort(g); /* Abort recording on any hook change. */ - lj_dispatch_update(g); - return 1; -} - -LUA_API lua_Hook lua_gethook(lua_State *L) -{ - return G(L)->hookf; -} - -LUA_API int lua_gethookmask(lua_State *L) -{ - return G(L)->hookmask & HOOK_EVENTMASK; -} - -LUA_API int lua_gethookcount(lua_State *L) -{ - return (int)G(L)->hookcstart; -} - -/* Call a hook. */ -static void callhook(lua_State *L, int event, BCLine line) -{ - global_State *g = G(L); - lua_Hook hookf = g->hookf; - if (hookf && !hook_active(g)) { - lua_Debug ar; - lj_trace_abort(g); /* Abort recording on any hook call. */ - ar.event = event; - ar.currentline = line; - /* Top frame, nextframe = NULL. */ - ar.i_ci = (int)((L->base-1) - tvref(L->stack)); - lj_state_checkstack(L, 1+LUA_MINSTACK); - hook_enter(g); - hookf(L, &ar); - lua_assert(hook_active(g)); - hook_leave(g); - } -} - -/* -- Dispatch callbacks -------------------------------------------------- */ - -/* Calculate number of used stack slots in the current frame. */ -static BCReg cur_topslot(GCproto *pt, const BCIns *pc, uint32_t nres) -{ - BCIns ins = pc[-1]; - if (bc_op(ins) == BC_UCLO) - ins = pc[bc_j(ins)]; - switch (bc_op(ins)) { - case BC_CALLM: case BC_CALLMT: return bc_a(ins) + bc_c(ins) + nres-1+1; - case BC_RETM: return bc_a(ins) + bc_d(ins) + nres-1; - case BC_TSETM: return bc_a(ins) + nres-1; - default: return pt->framesize; - } -} - -/* Instruction dispatch. Used by instr/line/return hooks or when recording. */ -void LJ_FASTCALL lj_dispatch_ins(lua_State *L, const BCIns *pc) -{ - ERRNO_SAVE - GCfunc *fn = curr_func(L); - GCproto *pt = funcproto(fn); - void *cf = cframe_raw(L->cframe); - const BCIns *oldpc = cframe_pc(cf); - global_State *g = G(L); - BCReg slots; - setcframe_pc(cf, pc); - slots = cur_topslot(pt, pc, cframe_multres_n(cf)); - L->top = L->base + slots; /* Fix top. */ -#if LJ_HASJIT - { - jit_State *J = G2J(g); - if (J->state != LJ_TRACE_IDLE) { -#ifdef LUA_USE_ASSERT - ptrdiff_t delta = L->top - L->base; -#endif - J->L = L; - lj_trace_ins(J, pc-1); /* The interpreter bytecode PC is offset by 1. */ - lua_assert(L->top - L->base == delta); - } - } -#endif - if ((g->hookmask & LUA_MASKCOUNT) && g->hookcount == 0) { - g->hookcount = g->hookcstart; - callhook(L, LUA_HOOKCOUNT, -1); - L->top = L->base + slots; /* Fix top again. */ - } - if ((g->hookmask & LUA_MASKLINE)) { - BCPos npc = proto_bcpos(pt, pc) - 1; - BCPos opc = proto_bcpos(pt, oldpc) - 1; - BCLine line = lj_debug_line(pt, npc); - if (pc <= oldpc || opc >= pt->sizebc || line != lj_debug_line(pt, opc)) { - callhook(L, LUA_HOOKLINE, line); - L->top = L->base + slots; /* Fix top again. */ - } - } - if ((g->hookmask & LUA_MASKRET) && bc_isret(bc_op(pc[-1]))) - callhook(L, LUA_HOOKRET, -1); - ERRNO_RESTORE -} - -/* Initialize call. Ensure stack space and return # of missing parameters. */ -static int call_init(lua_State *L, GCfunc *fn) -{ - if (isluafunc(fn)) { - GCproto *pt = funcproto(fn); - int numparams = pt->numparams; - int gotparams = (int)(L->top - L->base); - int need = pt->framesize; - if ((pt->flags & PROTO_VARARG)) need += 1+gotparams; - lj_state_checkstack(L, (MSize)need); - numparams -= gotparams; - return numparams >= 0 ? numparams : 0; - } else { - lj_state_checkstack(L, LUA_MINSTACK); - return 0; - } -} - -/* Call dispatch. Used by call hooks, hot calls or when recording. */ -ASMFunction LJ_FASTCALL lj_dispatch_call(lua_State *L, const BCIns *pc) -{ - ERRNO_SAVE - GCfunc *fn = curr_func(L); - BCOp op; - global_State *g = G(L); -#if LJ_HASJIT - jit_State *J = G2J(g); -#endif - int missing = call_init(L, fn); -#if LJ_HASJIT - J->L = L; - if ((uintptr_t)pc & 1) { /* Marker for hot call. */ -#ifdef LUA_USE_ASSERT - ptrdiff_t delta = L->top - L->base; -#endif - pc = (const BCIns *)((uintptr_t)pc & ~(uintptr_t)1); - lj_trace_hot(J, pc); - lua_assert(L->top - L->base == delta); - goto out; - } else if (J->state != LJ_TRACE_IDLE && - !(g->hookmask & (HOOK_GC|HOOK_VMEVENT))) { -#ifdef LUA_USE_ASSERT - ptrdiff_t delta = L->top - L->base; -#endif - /* Record the FUNC* bytecodes, too. */ - lj_trace_ins(J, pc-1); /* The interpreter bytecode PC is offset by 1. */ - lua_assert(L->top - L->base == delta); - } -#endif - if ((g->hookmask & LUA_MASKCALL)) { - int i; - for (i = 0; i < missing; i++) /* Add missing parameters. */ - setnilV(L->top++); - callhook(L, LUA_HOOKCALL, -1); - /* Preserve modifications of missing parameters by lua_setlocal(). */ - while (missing-- > 0 && tvisnil(L->top - 1)) - L->top--; - } -#if LJ_HASJIT -out: -#endif - op = bc_op(pc[-1]); /* Get FUNC* op. */ -#if LJ_HASJIT - /* Use the non-hotcounting variants if JIT is off or while recording. */ - if ((!(J->flags & JIT_F_ON) || J->state != LJ_TRACE_IDLE) && - (op == BC_FUNCF || op == BC_FUNCV)) - op = (BCOp)((int)op+(int)BC_IFUNCF-(int)BC_FUNCF); -#endif - ERRNO_RESTORE - return makeasmfunc(lj_bc_ofs[op]); /* Return static dispatch target. */ -} - diff --git a/deps/luajit/src/lj_dispatch.h b/deps/luajit/src/lj_dispatch.h deleted file mode 100644 index 778affc8..00000000 --- a/deps/luajit/src/lj_dispatch.h +++ /dev/null @@ -1,131 +0,0 @@ -/* -** Instruction dispatch handling. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#ifndef _LJ_DISPATCH_H -#define _LJ_DISPATCH_H - -#include "lj_obj.h" -#include "lj_bc.h" -#if LJ_HASJIT -#include "lj_jit.h" -#endif - -#if LJ_TARGET_MIPS -/* Need our own global offset table for the dreaded MIPS calling conventions. */ -#if LJ_HASJIT -#define JITGOTDEF(_) _(lj_trace_exit) _(lj_trace_hot) -#else -#define JITGOTDEF(_) -#endif -#if LJ_HASFFI -#define FFIGOTDEF(_) \ - _(lj_meta_equal_cd) _(lj_ccallback_enter) _(lj_ccallback_leave) -#else -#define FFIGOTDEF(_) -#endif -#define GOTDEF(_) \ - _(floor) _(ceil) _(trunc) _(log) _(log10) _(exp) _(sin) _(cos) _(tan) \ - _(asin) _(acos) _(atan) _(sinh) _(cosh) _(tanh) _(frexp) _(modf) _(atan2) \ - _(pow) _(fmod) _(ldexp) \ - _(lj_dispatch_call) _(lj_dispatch_ins) _(lj_err_throw) \ - _(lj_ffh_coroutine_wrap_err) _(lj_func_closeuv) _(lj_func_newL_gc) \ - _(lj_gc_barrieruv) _(lj_gc_step) _(lj_gc_step_fixtop) _(lj_meta_arith) \ - _(lj_meta_call) _(lj_meta_cat) _(lj_meta_comp) _(lj_meta_equal) \ - _(lj_meta_for) _(lj_meta_len) _(lj_meta_tget) _(lj_meta_tset) \ - _(lj_state_growstack) _(lj_str_fromnum) _(lj_str_fromnumber) _(lj_str_new) \ - _(lj_tab_dup) _(lj_tab_get) _(lj_tab_getinth) _(lj_tab_len) _(lj_tab_new) \ - _(lj_tab_newkey) _(lj_tab_next) _(lj_tab_reasize) \ - JITGOTDEF(_) FFIGOTDEF(_) - -enum { -#define GOTENUM(name) LJ_GOT_##name, -GOTDEF(GOTENUM) -#undef GOTENUM - LJ_GOT__MAX -}; -#endif - -/* Type of hot counter. Must match the code in the assembler VM. */ -/* 16 bits are sufficient. Only 0.0015% overhead with maximum slot penalty. */ -typedef uint16_t HotCount; - -/* Number of hot counter hash table entries (must be a power of two). */ -#define HOTCOUNT_SIZE 64 -#define HOTCOUNT_PCMASK ((HOTCOUNT_SIZE-1)*sizeof(HotCount)) - -/* Hotcount decrements. */ -#define HOTCOUNT_LOOP 2 -#define HOTCOUNT_CALL 1 - -/* This solves a circular dependency problem -- bump as needed. Sigh. */ -#define GG_NUM_ASMFF 62 - -#define GG_LEN_DDISP (BC__MAX + GG_NUM_ASMFF) -#define GG_LEN_SDISP BC_FUNCF -#define GG_LEN_DISP (GG_LEN_DDISP + GG_LEN_SDISP) - -/* Global state, main thread and extra fields are allocated together. */ -typedef struct GG_State { - lua_State L; /* Main thread. */ - global_State g; /* Global state. */ -#if LJ_TARGET_MIPS - ASMFunction got[LJ_GOT__MAX]; /* Global offset table. */ -#endif -#if LJ_HASJIT - jit_State J; /* JIT state. */ - HotCount hotcount[HOTCOUNT_SIZE]; /* Hot counters. */ -#endif - ASMFunction dispatch[GG_LEN_DISP]; /* Instruction dispatch tables. */ - BCIns bcff[GG_NUM_ASMFF]; /* Bytecode for ASM fast functions. */ -} GG_State; - -#define GG_OFS(field) ((int)offsetof(GG_State, field)) -#define G2GG(gl) ((GG_State *)((char *)(gl) - GG_OFS(g))) -#define J2GG(j) ((GG_State *)((char *)(j) - GG_OFS(J))) -#define L2GG(L) (G2GG(G(L))) -#define J2G(J) (&J2GG(J)->g) -#define G2J(gl) (&G2GG(gl)->J) -#define L2J(L) (&L2GG(L)->J) -#define GG_G2DISP (GG_OFS(dispatch) - GG_OFS(g)) -#define GG_DISP2G (GG_OFS(g) - GG_OFS(dispatch)) -#define GG_DISP2J (GG_OFS(J) - GG_OFS(dispatch)) -#define GG_DISP2HOT (GG_OFS(hotcount) - GG_OFS(dispatch)) -#define GG_DISP2STATIC (GG_LEN_DDISP*(int)sizeof(ASMFunction)) - -#define hotcount_get(gg, pc) \ - (gg)->hotcount[(u32ptr(pc)>>2) & (HOTCOUNT_SIZE-1)] -#define hotcount_set(gg, pc, val) \ - (hotcount_get((gg), (pc)) = (HotCount)(val)) - -/* Dispatch table management. */ -LJ_FUNC void lj_dispatch_init(GG_State *GG); -#if LJ_HASJIT -LJ_FUNC void lj_dispatch_init_hotcount(global_State *g); -#endif -LJ_FUNC void lj_dispatch_update(global_State *g); - -/* Instruction dispatch callback for hooks or when recording. */ -LJ_FUNCA void LJ_FASTCALL lj_dispatch_ins(lua_State *L, const BCIns *pc); -LJ_FUNCA ASMFunction LJ_FASTCALL lj_dispatch_call(lua_State *L, const BCIns*pc); -LJ_FUNCA void LJ_FASTCALL lj_dispatch_return(lua_State *L, const BCIns *pc); - -#if LJ_HASFFI && !defined(_BUILDVM_H) -/* Save/restore errno and GetLastError() around hooks, exits and recording. */ -#include -#if LJ_TARGET_WINDOWS -#define WIN32_LEAN_AND_MEAN -#include -#define ERRNO_SAVE int olderr = errno; DWORD oldwerr = GetLastError(); -#define ERRNO_RESTORE errno = olderr; SetLastError(oldwerr); -#else -#define ERRNO_SAVE int olderr = errno; -#define ERRNO_RESTORE errno = olderr; -#endif -#else -#define ERRNO_SAVE -#define ERRNO_RESTORE -#endif - -#endif diff --git a/deps/luajit/src/lj_emit_arm.h b/deps/luajit/src/lj_emit_arm.h deleted file mode 100644 index 8c5e5379..00000000 --- a/deps/luajit/src/lj_emit_arm.h +++ /dev/null @@ -1,356 +0,0 @@ -/* -** ARM instruction emitter. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -/* -- Constant encoding --------------------------------------------------- */ - -static uint8_t emit_invai[16] = { - /* AND */ (ARMI_AND^ARMI_BIC) >> 21, - /* EOR */ 0, - /* SUB */ (ARMI_SUB^ARMI_ADD) >> 21, - /* RSB */ 0, - /* ADD */ (ARMI_ADD^ARMI_SUB) >> 21, - /* ADC */ (ARMI_ADC^ARMI_SBC) >> 21, - /* SBC */ (ARMI_SBC^ARMI_ADC) >> 21, - /* RSC */ 0, - /* TST */ 0, - /* TEQ */ 0, - /* CMP */ (ARMI_CMP^ARMI_CMN) >> 21, - /* CMN */ (ARMI_CMN^ARMI_CMP) >> 21, - /* ORR */ 0, - /* MOV */ (ARMI_MOV^ARMI_MVN) >> 21, - /* BIC */ (ARMI_BIC^ARMI_AND) >> 21, - /* MVN */ (ARMI_MVN^ARMI_MOV) >> 21 -}; - -/* Encode constant in K12 format for data processing instructions. */ -static uint32_t emit_isk12(ARMIns ai, int32_t n) -{ - uint32_t invai, i, m = (uint32_t)n; - /* K12: unsigned 8 bit value, rotated in steps of two bits. */ - for (i = 0; i < 4096; i += 256, m = lj_rol(m, 2)) - if (m <= 255) return ARMI_K12|m|i; - /* Otherwise try negation/complement with the inverse instruction. */ - invai = emit_invai[((ai >> 21) & 15)]; - if (!invai) return 0; /* Failed. No inverse instruction. */ - m = ~(uint32_t)n; - if (invai == ((ARMI_SUB^ARMI_ADD) >> 21) || - invai == (ARMI_CMP^ARMI_CMN) >> 21) m++; - for (i = 0; i < 4096; i += 256, m = lj_rol(m, 2)) - if (m <= 255) return ARMI_K12|(invai<<21)|m|i; - return 0; /* Failed. */ -} - -/* -- Emit basic instructions --------------------------------------------- */ - -static void emit_dnm(ASMState *as, ARMIns ai, Reg rd, Reg rn, Reg rm) -{ - *--as->mcp = ai | ARMF_D(rd) | ARMF_N(rn) | ARMF_M(rm); -} - -static void emit_dm(ASMState *as, ARMIns ai, Reg rd, Reg rm) -{ - *--as->mcp = ai | ARMF_D(rd) | ARMF_M(rm); -} - -static void emit_dn(ASMState *as, ARMIns ai, Reg rd, Reg rn) -{ - *--as->mcp = ai | ARMF_D(rd) | ARMF_N(rn); -} - -static void emit_nm(ASMState *as, ARMIns ai, Reg rn, Reg rm) -{ - *--as->mcp = ai | ARMF_N(rn) | ARMF_M(rm); -} - -static void emit_d(ASMState *as, ARMIns ai, Reg rd) -{ - *--as->mcp = ai | ARMF_D(rd); -} - -static void emit_n(ASMState *as, ARMIns ai, Reg rn) -{ - *--as->mcp = ai | ARMF_N(rn); -} - -static void emit_m(ASMState *as, ARMIns ai, Reg rm) -{ - *--as->mcp = ai | ARMF_M(rm); -} - -static void emit_lsox(ASMState *as, ARMIns ai, Reg rd, Reg rn, int32_t ofs) -{ - lua_assert(ofs >= -255 && ofs <= 255); - if (ofs < 0) ofs = -ofs; else ai |= ARMI_LS_U; - *--as->mcp = ai | ARMI_LS_P | ARMI_LSX_I | ARMF_D(rd) | ARMF_N(rn) | - ((ofs & 0xf0) << 4) | (ofs & 0x0f); -} - -static void emit_lso(ASMState *as, ARMIns ai, Reg rd, Reg rn, int32_t ofs) -{ - lua_assert(ofs >= -4095 && ofs <= 4095); - /* Combine LDR/STR pairs to LDRD/STRD. */ - if (*as->mcp == (ai|ARMI_LS_P|ARMI_LS_U|ARMF_D(rd^1)|ARMF_N(rn)|(ofs^4)) && - (ai & ~(ARMI_LDR^ARMI_STR)) == ARMI_STR && rd != rn && - (uint32_t)ofs <= 252 && !(ofs & 3) && !((rd ^ (ofs >>2)) & 1) && - as->mcp != as->mcloop) { - as->mcp++; - emit_lsox(as, ai == ARMI_LDR ? ARMI_LDRD : ARMI_STRD, rd&~1, rn, ofs&~4); - return; - } - if (ofs < 0) ofs = -ofs; else ai |= ARMI_LS_U; - *--as->mcp = ai | ARMI_LS_P | ARMF_D(rd) | ARMF_N(rn) | ofs; -} - -#if !LJ_SOFTFP -static void emit_vlso(ASMState *as, ARMIns ai, Reg rd, Reg rn, int32_t ofs) -{ - lua_assert(ofs >= -1020 && ofs <= 1020 && (ofs&3) == 0); - if (ofs < 0) ofs = -ofs; else ai |= ARMI_LS_U; - *--as->mcp = ai | ARMI_LS_P | ARMF_D(rd & 15) | ARMF_N(rn) | (ofs >> 2); -} -#endif - -/* -- Emit loads/stores --------------------------------------------------- */ - -/* Prefer spills of BASE/L. */ -#define emit_canremat(ref) ((ref) < ASMREF_L) - -/* Try to find a one step delta relative to another constant. */ -static int emit_kdelta1(ASMState *as, Reg d, int32_t i) -{ - RegSet work = ~as->freeset & RSET_GPR; - while (work) { - Reg r = rset_picktop(work); - IRRef ref = regcost_ref(as->cost[r]); - lua_assert(r != d); - if (emit_canremat(ref)) { - int32_t delta = i - (ra_iskref(ref) ? ra_krefk(as, ref) : IR(ref)->i); - uint32_t k = emit_isk12(ARMI_ADD, delta); - if (k) { - if (k == ARMI_K12) - emit_dm(as, ARMI_MOV, d, r); - else - emit_dn(as, ARMI_ADD^k, d, r); - return 1; - } - } - rset_clear(work, r); - } - return 0; /* Failed. */ -} - -/* Try to find a two step delta relative to another constant. */ -static int emit_kdelta2(ASMState *as, Reg d, int32_t i) -{ - RegSet work = ~as->freeset & RSET_GPR; - while (work) { - Reg r = rset_picktop(work); - IRRef ref = regcost_ref(as->cost[r]); - lua_assert(r != d); - if (emit_canremat(ref)) { - int32_t other = ra_iskref(ref) ? ra_krefk(as, ref) : IR(ref)->i; - if (other) { - int32_t delta = i - other; - uint32_t sh, inv = 0, k2, k; - if (delta < 0) { delta = -delta; inv = ARMI_ADD^ARMI_SUB; } - sh = lj_ffs(delta) & ~1; - k2 = emit_isk12(0, delta & (255 << sh)); - k = emit_isk12(0, delta & ~(255 << sh)); - if (k) { - emit_dn(as, ARMI_ADD^k2^inv, d, d); - emit_dn(as, ARMI_ADD^k^inv, d, r); - return 1; - } - } - } - rset_clear(work, r); - } - return 0; /* Failed. */ -} - -/* Load a 32 bit constant into a GPR. */ -static void emit_loadi(ASMState *as, Reg r, int32_t i) -{ - uint32_t k = emit_isk12(ARMI_MOV, i); - lua_assert(rset_test(as->freeset, r) || r == RID_TMP); - if (k) { - /* Standard K12 constant. */ - emit_d(as, ARMI_MOV^k, r); - } else if ((as->flags & JIT_F_ARMV6T2) && (uint32_t)i < 0x00010000u) { - /* 16 bit loword constant for ARMv6T2. */ - emit_d(as, ARMI_MOVW|(i & 0x0fff)|((i & 0xf000)<<4), r); - } else if (emit_kdelta1(as, r, i)) { - /* One step delta relative to another constant. */ - } else if ((as->flags & JIT_F_ARMV6T2)) { - /* 32 bit hiword/loword constant for ARMv6T2. */ - emit_d(as, ARMI_MOVT|((i>>16) & 0x0fff)|(((i>>16) & 0xf000)<<4), r); - emit_d(as, ARMI_MOVW|(i & 0x0fff)|((i & 0xf000)<<4), r); - } else if (emit_kdelta2(as, r, i)) { - /* Two step delta relative to another constant. */ - } else { - /* Otherwise construct the constant with up to 4 instructions. */ - /* NYI: use mvn+bic, use pc-relative loads. */ - for (;;) { - uint32_t sh = lj_ffs(i) & ~1; - int32_t m = i & (255 << sh); - i &= ~(255 << sh); - if (i == 0) { - emit_d(as, ARMI_MOV ^ emit_isk12(0, m), r); - break; - } - emit_dn(as, ARMI_ORR ^ emit_isk12(0, m), r, r); - } - } -} - -#define emit_loada(as, r, addr) emit_loadi(as, (r), i32ptr((addr))) - -static Reg ra_allock(ASMState *as, int32_t k, RegSet allow); - -/* Get/set from constant pointer. */ -static void emit_lsptr(ASMState *as, ARMIns ai, Reg r, void *p) -{ - int32_t i = i32ptr(p); - emit_lso(as, ai, r, ra_allock(as, (i & ~4095), rset_exclude(RSET_GPR, r)), - (i & 4095)); -} - -#if !LJ_SOFTFP -/* Load a number constant into an FPR. */ -static void emit_loadn(ASMState *as, Reg r, cTValue *tv) -{ - int32_t i; - if ((as->flags & JIT_F_VFPV3) && !tv->u32.lo) { - uint32_t hi = tv->u32.hi; - uint32_t b = ((hi >> 22) & 0x1ff); - if (!(hi & 0xffff) && (b == 0x100 || b == 0x0ff)) { - *--as->mcp = ARMI_VMOVI_D | ARMF_D(r & 15) | - ((tv->u32.hi >> 12) & 0x00080000) | - ((tv->u32.hi >> 4) & 0x00070000) | - ((tv->u32.hi >> 16) & 0x0000000f); - return; - } - } - i = i32ptr(tv); - emit_vlso(as, ARMI_VLDR_D, r, - ra_allock(as, (i & ~1020), RSET_GPR), (i & 1020)); -} -#endif - -/* Get/set global_State fields. */ -#define emit_getgl(as, r, field) \ - emit_lsptr(as, ARMI_LDR, (r), (void *)&J2G(as->J)->field) -#define emit_setgl(as, r, field) \ - emit_lsptr(as, ARMI_STR, (r), (void *)&J2G(as->J)->field) - -/* Trace number is determined from pc of exit instruction. */ -#define emit_setvmstate(as, i) UNUSED(i) - -/* -- Emit control-flow instructions -------------------------------------- */ - -/* Label for internal jumps. */ -typedef MCode *MCLabel; - -/* Return label pointing to current PC. */ -#define emit_label(as) ((as)->mcp) - -static void emit_branch(ASMState *as, ARMIns ai, MCode *target) -{ - MCode *p = as->mcp; - ptrdiff_t delta = (target - p) - 1; - lua_assert(((delta + 0x00800000) >> 24) == 0); - *--p = ai | ((uint32_t)delta & 0x00ffffffu); - as->mcp = p; -} - -#define emit_jmp(as, target) emit_branch(as, ARMI_B, (target)) - -static void emit_call(ASMState *as, void *target) -{ - MCode *p = --as->mcp; - ptrdiff_t delta = ((char *)target - (char *)p) - 8; - if ((((delta>>2) + 0x00800000) >> 24) == 0) { - if ((delta & 1)) - *p = ARMI_BLX | ((uint32_t)(delta>>2) & 0x00ffffffu) | ((delta&2) << 27); - else - *p = ARMI_BL | ((uint32_t)(delta>>2) & 0x00ffffffu); - } else { /* Target out of range: need indirect call. But don't use R0-R3. */ - Reg r = ra_allock(as, i32ptr(target), RSET_RANGE(RID_R4, RID_R12+1)); - *p = ARMI_BLXr | ARMF_M(r); - } -} - -/* -- Emit generic operations --------------------------------------------- */ - -/* Generic move between two regs. */ -static void emit_movrr(ASMState *as, IRIns *ir, Reg dst, Reg src) -{ -#if LJ_SOFTFP - lua_assert(!irt_isnum(ir->t)); UNUSED(ir); -#else - if (dst >= RID_MAX_GPR) { - emit_dm(as, irt_isnum(ir->t) ? ARMI_VMOV_D : ARMI_VMOV_S, - (dst & 15), (src & 15)); - return; - } -#endif - if (as->mcp != as->mcloop) { /* Swap early registers for loads/stores. */ - MCode ins = *as->mcp, swp = (src^dst); - if ((ins & 0x0c000000) == 0x04000000 && (ins & 0x02000010) != 0x02000010) { - if (!((ins ^ (dst << 16)) & 0x000f0000)) - *as->mcp = ins ^ (swp << 16); /* Swap N in load/store. */ - if (!(ins & 0x00100000) && !((ins ^ (dst << 12)) & 0x0000f000)) - *as->mcp = ins ^ (swp << 12); /* Swap D in store. */ - } - } - emit_dm(as, ARMI_MOV, dst, src); -} - -/* Generic load of register from stack slot. */ -static void emit_spload(ASMState *as, IRIns *ir, Reg r, int32_t ofs) -{ -#if LJ_SOFTFP - lua_assert(!irt_isnum(ir->t)); UNUSED(ir); -#else - if (r >= RID_MAX_GPR) - emit_vlso(as, irt_isnum(ir->t) ? ARMI_VLDR_D : ARMI_VLDR_S, r, RID_SP, ofs); - else -#endif - emit_lso(as, ARMI_LDR, r, RID_SP, ofs); -} - -/* Generic store of register to stack slot. */ -static void emit_spstore(ASMState *as, IRIns *ir, Reg r, int32_t ofs) -{ -#if LJ_SOFTFP - lua_assert(!irt_isnum(ir->t)); UNUSED(ir); -#else - if (r >= RID_MAX_GPR) - emit_vlso(as, irt_isnum(ir->t) ? ARMI_VSTR_D : ARMI_VSTR_S, r, RID_SP, ofs); - else -#endif - emit_lso(as, ARMI_STR, r, RID_SP, ofs); -} - -/* Emit an arithmetic/logic operation with a constant operand. */ -static void emit_opk(ASMState *as, ARMIns ai, Reg dest, Reg src, - int32_t i, RegSet allow) -{ - uint32_t k = emit_isk12(ai, i); - if (k) - emit_dn(as, ai^k, dest, src); - else - emit_dnm(as, ai, dest, src, ra_allock(as, i, allow)); -} - -/* Add offset to pointer. */ -static void emit_addptr(ASMState *as, Reg r, int32_t ofs) -{ - if (ofs) - emit_opk(as, ARMI_ADD, r, r, ofs, rset_exclude(RSET_GPR, r)); -} - -#define emit_spsub(as, ofs) emit_addptr(as, RID_SP, -(ofs)) - diff --git a/deps/luajit/src/lj_emit_mips.h b/deps/luajit/src/lj_emit_mips.h deleted file mode 100644 index 0fc07d91..00000000 --- a/deps/luajit/src/lj_emit_mips.h +++ /dev/null @@ -1,211 +0,0 @@ -/* -** MIPS instruction emitter. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -/* -- Emit basic instructions --------------------------------------------- */ - -static void emit_dst(ASMState *as, MIPSIns mi, Reg rd, Reg rs, Reg rt) -{ - *--as->mcp = mi | MIPSF_D(rd) | MIPSF_S(rs) | MIPSF_T(rt); -} - -static void emit_dta(ASMState *as, MIPSIns mi, Reg rd, Reg rt, uint32_t a) -{ - *--as->mcp = mi | MIPSF_D(rd) | MIPSF_T(rt) | MIPSF_A(a); -} - -#define emit_ds(as, mi, rd, rs) emit_dst(as, (mi), (rd), (rs), 0) -#define emit_tg(as, mi, rt, rg) emit_dst(as, (mi), (rg)&31, 0, (rt)) - -static void emit_tsi(ASMState *as, MIPSIns mi, Reg rt, Reg rs, int32_t i) -{ - *--as->mcp = mi | MIPSF_T(rt) | MIPSF_S(rs) | (i & 0xffff); -} - -#define emit_ti(as, mi, rt, i) emit_tsi(as, (mi), (rt), 0, (i)) -#define emit_hsi(as, mi, rh, rs, i) emit_tsi(as, (mi), (rh) & 31, (rs), (i)) - -static void emit_fgh(ASMState *as, MIPSIns mi, Reg rf, Reg rg, Reg rh) -{ - *--as->mcp = mi | MIPSF_F(rf&31) | MIPSF_G(rg&31) | MIPSF_H(rh&31); -} - -#define emit_fg(as, mi, rf, rg) emit_fgh(as, (mi), (rf), (rg), 0) - -static void emit_rotr(ASMState *as, Reg dest, Reg src, Reg tmp, uint32_t shift) -{ - if ((as->flags & JIT_F_MIPS32R2)) { - emit_dta(as, MIPSI_ROTR, dest, src, shift); - } else { - emit_dst(as, MIPSI_OR, dest, dest, tmp); - emit_dta(as, MIPSI_SLL, dest, src, (-shift)&31); - emit_dta(as, MIPSI_SRL, tmp, src, shift); - } -} - -/* -- Emit loads/stores --------------------------------------------------- */ - -/* Prefer rematerialization of BASE/L from global_State over spills. */ -#define emit_canremat(ref) ((ref) <= REF_BASE) - -/* Try to find a one step delta relative to another constant. */ -static int emit_kdelta1(ASMState *as, Reg t, int32_t i) -{ - RegSet work = ~as->freeset & RSET_GPR; - while (work) { - Reg r = rset_picktop(work); - IRRef ref = regcost_ref(as->cost[r]); - lua_assert(r != t); - if (ref < ASMREF_L) { - int32_t delta = i - (ra_iskref(ref) ? ra_krefk(as, ref) : IR(ref)->i); - if (checki16(delta)) { - emit_tsi(as, MIPSI_ADDIU, t, r, delta); - return 1; - } - } - rset_clear(work, r); - } - return 0; /* Failed. */ -} - -/* Load a 32 bit constant into a GPR. */ -static void emit_loadi(ASMState *as, Reg r, int32_t i) -{ - if (checki16(i)) { - emit_ti(as, MIPSI_LI, r, i); - } else { - if ((i & 0xffff)) { - int32_t jgl = i32ptr(J2G(as->J)); - if ((uint32_t)(i-jgl) < 65536) { - emit_tsi(as, MIPSI_ADDIU, r, RID_JGL, i-jgl-32768); - return; - } else if (emit_kdelta1(as, r, i)) { - return; - } else if ((i >> 16) == 0) { - emit_tsi(as, MIPSI_ORI, r, RID_ZERO, i); - return; - } - emit_tsi(as, MIPSI_ORI, r, r, i); - } - emit_ti(as, MIPSI_LUI, r, (i >> 16)); - } -} - -#define emit_loada(as, r, addr) emit_loadi(as, (r), i32ptr((addr))) - -static Reg ra_allock(ASMState *as, int32_t k, RegSet allow); -static void ra_allockreg(ASMState *as, int32_t k, Reg r); - -/* Get/set from constant pointer. */ -static void emit_lsptr(ASMState *as, MIPSIns mi, Reg r, void *p, RegSet allow) -{ - int32_t jgl = i32ptr(J2G(as->J)); - int32_t i = i32ptr(p); - Reg base; - if ((uint32_t)(i-jgl) < 65536) { - i = i-jgl-32768; - base = RID_JGL; - } else { - base = ra_allock(as, i-(int16_t)i, allow); - } - emit_tsi(as, mi, r, base, i); -} - -#define emit_loadn(as, r, tv) \ - emit_lsptr(as, MIPSI_LDC1, ((r) & 31), (void *)(tv), RSET_GPR) - -/* Get/set global_State fields. */ -static void emit_lsglptr(ASMState *as, MIPSIns mi, Reg r, int32_t ofs) -{ - emit_tsi(as, mi, r, RID_JGL, ofs-32768); -} - -#define emit_getgl(as, r, field) \ - emit_lsglptr(as, MIPSI_LW, (r), (int32_t)offsetof(global_State, field)) -#define emit_setgl(as, r, field) \ - emit_lsglptr(as, MIPSI_SW, (r), (int32_t)offsetof(global_State, field)) - -/* Trace number is determined from per-trace exit stubs. */ -#define emit_setvmstate(as, i) UNUSED(i) - -/* -- Emit control-flow instructions -------------------------------------- */ - -/* Label for internal jumps. */ -typedef MCode *MCLabel; - -/* Return label pointing to current PC. */ -#define emit_label(as) ((as)->mcp) - -static void emit_branch(ASMState *as, MIPSIns mi, Reg rs, Reg rt, MCode *target) -{ - MCode *p = as->mcp; - ptrdiff_t delta = target - p; - lua_assert(((delta + 0x8000) >> 16) == 0); - *--p = mi | MIPSF_S(rs) | MIPSF_T(rt) | ((uint32_t)delta & 0xffffu); - as->mcp = p; -} - -static void emit_jmp(ASMState *as, MCode *target) -{ - *--as->mcp = MIPSI_NOP; - emit_branch(as, MIPSI_B, RID_ZERO, RID_ZERO, (target)); -} - -static void emit_call(ASMState *as, void *target) -{ - MCode *p = as->mcp; - *--p = MIPSI_NOP; - if ((((uintptr_t)target ^ (uintptr_t)p) >> 28) == 0) - *--p = MIPSI_JAL | (((uintptr_t)target >>2) & 0x03ffffffu); - else /* Target out of range: need indirect call. */ - *--p = MIPSI_JALR | MIPSF_S(RID_CFUNCADDR); - as->mcp = p; - ra_allockreg(as, i32ptr(target), RID_CFUNCADDR); -} - -/* -- Emit generic operations --------------------------------------------- */ - -#define emit_move(as, dst, src) \ - emit_ds(as, MIPSI_MOVE, (dst), (src)) - -/* Generic move between two regs. */ -static void emit_movrr(ASMState *as, IRIns *ir, Reg dst, Reg src) -{ - if (dst < RID_MAX_GPR) - emit_move(as, dst, src); - else - emit_fg(as, irt_isnum(ir->t) ? MIPSI_MOV_D : MIPSI_MOV_S, dst, src); -} - -/* Generic load of register from stack slot. */ -static void emit_spload(ASMState *as, IRIns *ir, Reg r, int32_t ofs) -{ - if (r < RID_MAX_GPR) - emit_tsi(as, MIPSI_LW, r, RID_SP, ofs); - else - emit_tsi(as, irt_isnum(ir->t) ? MIPSI_LDC1 : MIPSI_LWC1, - (r & 31), RID_SP, ofs); -} - -/* Generic store of register to stack slot. */ -static void emit_spstore(ASMState *as, IRIns *ir, Reg r, int32_t ofs) -{ - if (r < RID_MAX_GPR) - emit_tsi(as, MIPSI_SW, r, RID_SP, ofs); - else - emit_tsi(as, irt_isnum(ir->t) ? MIPSI_SDC1 : MIPSI_SWC1, - (r&31), RID_SP, ofs); -} - -/* Add offset to pointer. */ -static void emit_addptr(ASMState *as, Reg r, int32_t ofs) -{ - if (ofs) { - lua_assert(checki16(ofs)); - emit_tsi(as, MIPSI_ADDIU, r, r, ofs); - } -} - -#define emit_spsub(as, ofs) emit_addptr(as, RID_SP, -(ofs)) - diff --git a/deps/luajit/src/lj_emit_ppc.h b/deps/luajit/src/lj_emit_ppc.h deleted file mode 100644 index 14edf00f..00000000 --- a/deps/luajit/src/lj_emit_ppc.h +++ /dev/null @@ -1,238 +0,0 @@ -/* -** PPC instruction emitter. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -/* -- Emit basic instructions --------------------------------------------- */ - -static void emit_tab(ASMState *as, PPCIns pi, Reg rt, Reg ra, Reg rb) -{ - *--as->mcp = pi | PPCF_T(rt) | PPCF_A(ra) | PPCF_B(rb); -} - -#define emit_asb(as, pi, ra, rs, rb) emit_tab(as, (pi), (rs), (ra), (rb)) -#define emit_as(as, pi, ra, rs) emit_tab(as, (pi), (rs), (ra), 0) -#define emit_ab(as, pi, ra, rb) emit_tab(as, (pi), 0, (ra), (rb)) - -static void emit_tai(ASMState *as, PPCIns pi, Reg rt, Reg ra, int32_t i) -{ - *--as->mcp = pi | PPCF_T(rt) | PPCF_A(ra) | (i & 0xffff); -} - -#define emit_ti(as, pi, rt, i) emit_tai(as, (pi), (rt), 0, (i)) -#define emit_ai(as, pi, ra, i) emit_tai(as, (pi), 0, (ra), (i)) -#define emit_asi(as, pi, ra, rs, i) emit_tai(as, (pi), (rs), (ra), (i)) - -#define emit_fab(as, pi, rf, ra, rb) \ - emit_tab(as, (pi), (rf)&31, (ra)&31, (rb)&31) -#define emit_fb(as, pi, rf, rb) emit_tab(as, (pi), (rf)&31, 0, (rb)&31) -#define emit_fac(as, pi, rf, ra, rc) \ - emit_tab(as, (pi) | PPCF_C((rc) & 31), (rf)&31, (ra)&31, 0) -#define emit_facb(as, pi, rf, ra, rc, rb) \ - emit_tab(as, (pi) | PPCF_C((rc) & 31), (rf)&31, (ra)&31, (rb)&31) -#define emit_fai(as, pi, rf, ra, i) emit_tai(as, (pi), (rf)&31, (ra), (i)) - -static void emit_rot(ASMState *as, PPCIns pi, Reg ra, Reg rs, - int32_t n, int32_t b, int32_t e) -{ - *--as->mcp = pi | PPCF_T(rs) | PPCF_A(ra) | PPCF_B(n) | - PPCF_MB(b) | PPCF_ME(e); -} - -static void emit_slwi(ASMState *as, Reg ra, Reg rs, int32_t n) -{ - lua_assert(n >= 0 && n < 32); - emit_rot(as, PPCI_RLWINM, ra, rs, n, 0, 31-n); -} - -static void emit_rotlwi(ASMState *as, Reg ra, Reg rs, int32_t n) -{ - lua_assert(n >= 0 && n < 32); - emit_rot(as, PPCI_RLWINM, ra, rs, n, 0, 31); -} - -/* -- Emit loads/stores --------------------------------------------------- */ - -/* Prefer rematerialization of BASE/L from global_State over spills. */ -#define emit_canremat(ref) ((ref) <= REF_BASE) - -/* Try to find a one step delta relative to another constant. */ -static int emit_kdelta1(ASMState *as, Reg t, int32_t i) -{ - RegSet work = ~as->freeset & RSET_GPR; - while (work) { - Reg r = rset_picktop(work); - IRRef ref = regcost_ref(as->cost[r]); - lua_assert(r != t); - if (ref < ASMREF_L) { - int32_t delta = i - (ra_iskref(ref) ? ra_krefk(as, ref) : IR(ref)->i); - if (checki16(delta)) { - emit_tai(as, PPCI_ADDI, t, r, delta); - return 1; - } - } - rset_clear(work, r); - } - return 0; /* Failed. */ -} - -/* Load a 32 bit constant into a GPR. */ -static void emit_loadi(ASMState *as, Reg r, int32_t i) -{ - if (checki16(i)) { - emit_ti(as, PPCI_LI, r, i); - } else { - if ((i & 0xffff)) { - int32_t jgl = i32ptr(J2G(as->J)); - if ((uint32_t)(i-jgl) < 65536) { - emit_tai(as, PPCI_ADDI, r, RID_JGL, i-jgl-32768); - return; - } else if (emit_kdelta1(as, r, i)) { - return; - } - emit_asi(as, PPCI_ORI, r, r, i); - } - emit_ti(as, PPCI_LIS, r, (i >> 16)); - } -} - -#define emit_loada(as, r, addr) emit_loadi(as, (r), i32ptr((addr))) - -static Reg ra_allock(ASMState *as, int32_t k, RegSet allow); - -/* Get/set from constant pointer. */ -static void emit_lsptr(ASMState *as, PPCIns pi, Reg r, void *p, RegSet allow) -{ - int32_t jgl = i32ptr(J2G(as->J)); - int32_t i = i32ptr(p); - Reg base; - if ((uint32_t)(i-jgl) < 65536) { - i = i-jgl-32768; - base = RID_JGL; - } else { - base = ra_allock(as, i-(int16_t)i, allow); - } - emit_tai(as, pi, r, base, i); -} - -#define emit_loadn(as, r, tv) \ - emit_lsptr(as, PPCI_LFD, ((r) & 31), (void *)(tv), RSET_GPR) - -/* Get/set global_State fields. */ -static void emit_lsglptr(ASMState *as, PPCIns pi, Reg r, int32_t ofs) -{ - emit_tai(as, pi, r, RID_JGL, ofs-32768); -} - -#define emit_getgl(as, r, field) \ - emit_lsglptr(as, PPCI_LWZ, (r), (int32_t)offsetof(global_State, field)) -#define emit_setgl(as, r, field) \ - emit_lsglptr(as, PPCI_STW, (r), (int32_t)offsetof(global_State, field)) - -/* Trace number is determined from per-trace exit stubs. */ -#define emit_setvmstate(as, i) UNUSED(i) - -/* -- Emit control-flow instructions -------------------------------------- */ - -/* Label for internal jumps. */ -typedef MCode *MCLabel; - -/* Return label pointing to current PC. */ -#define emit_label(as) ((as)->mcp) - -static void emit_condbranch(ASMState *as, PPCIns pi, PPCCC cc, MCode *target) -{ - MCode *p = --as->mcp; - ptrdiff_t delta = (char *)target - (char *)p; - lua_assert(((delta + 0x8000) >> 16) == 0); - pi ^= (delta & 0x8000) * (PPCF_Y/0x8000); - *p = pi | PPCF_CC(cc) | ((uint32_t)delta & 0xffffu); -} - -static void emit_jmp(ASMState *as, MCode *target) -{ - MCode *p = --as->mcp; - ptrdiff_t delta = (char *)target - (char *)p; - *p = PPCI_B | (delta & 0x03fffffcu); -} - -static void emit_call(ASMState *as, void *target) -{ - MCode *p = --as->mcp; - ptrdiff_t delta = (char *)target - (char *)p; - if ((((delta>>2) + 0x00800000) >> 24) == 0) { - *p = PPCI_BL | (delta & 0x03fffffcu); - } else { /* Target out of range: need indirect call. Don't use arg reg. */ - RegSet allow = RSET_GPR & ~RSET_RANGE(RID_R0, REGARG_LASTGPR+1); - Reg r = ra_allock(as, i32ptr(target), allow); - *p = PPCI_BCTRL; - p[-1] = PPCI_MTCTR | PPCF_T(r); - as->mcp = p-1; - } -} - -/* -- Emit generic operations --------------------------------------------- */ - -#define emit_mr(as, dst, src) \ - emit_asb(as, PPCI_MR, (dst), (src), (src)) - -/* Generic move between two regs. */ -static void emit_movrr(ASMState *as, IRIns *ir, Reg dst, Reg src) -{ - UNUSED(ir); - if (dst < RID_MAX_GPR) - emit_mr(as, dst, src); - else - emit_fb(as, PPCI_FMR, dst, src); -} - -/* Generic load of register from stack slot. */ -static void emit_spload(ASMState *as, IRIns *ir, Reg r, int32_t ofs) -{ - if (r < RID_MAX_GPR) - emit_tai(as, PPCI_LWZ, r, RID_SP, ofs); - else - emit_fai(as, irt_isnum(ir->t) ? PPCI_LFD : PPCI_LFS, r, RID_SP, ofs); -} - -/* Generic store of register to stack slot. */ -static void emit_spstore(ASMState *as, IRIns *ir, Reg r, int32_t ofs) -{ - if (r < RID_MAX_GPR) - emit_tai(as, PPCI_STW, r, RID_SP, ofs); - else - emit_fai(as, irt_isnum(ir->t) ? PPCI_STFD : PPCI_STFS, r, RID_SP, ofs); -} - -/* Emit a compare (for equality) with a constant operand. */ -static void emit_cmpi(ASMState *as, Reg r, int32_t k) -{ - if (checki16(k)) { - emit_ai(as, PPCI_CMPWI, r, k); - } else if (checku16(k)) { - emit_ai(as, PPCI_CMPLWI, r, k); - } else { - emit_ai(as, PPCI_CMPLWI, RID_TMP, k); - emit_asi(as, PPCI_XORIS, RID_TMP, r, (k >> 16)); - } -} - -/* Add offset to pointer. */ -static void emit_addptr(ASMState *as, Reg r, int32_t ofs) -{ - if (ofs) { - emit_tai(as, PPCI_ADDI, r, r, ofs); - if (!checki16(ofs)) - emit_tai(as, PPCI_ADDIS, r, r, (ofs + 32768) >> 16); - } -} - -static void emit_spsub(ASMState *as, int32_t ofs) -{ - if (ofs) { - emit_tai(as, PPCI_STWU, RID_TMP, RID_SP, -ofs); - emit_tai(as, PPCI_ADDI, RID_TMP, RID_SP, - CFRAME_SIZE + (as->parent ? as->parent->spadjust : 0)); - } -} - diff --git a/deps/luajit/src/lj_emit_x86.h b/deps/luajit/src/lj_emit_x86.h deleted file mode 100644 index 3a2f6510..00000000 --- a/deps/luajit/src/lj_emit_x86.h +++ /dev/null @@ -1,466 +0,0 @@ -/* -** x86/x64 instruction emitter. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -/* -- Emit basic instructions --------------------------------------------- */ - -#define MODRM(mode, r1, r2) ((MCode)((mode)+(((r1)&7)<<3)+((r2)&7))) - -#if LJ_64 -#define REXRB(p, rr, rb) \ - { MCode rex = 0x40 + (((rr)>>1)&4) + (((rb)>>3)&1); \ - if (rex != 0x40) *--(p) = rex; } -#define FORCE_REX 0x200 -#define REX_64 (FORCE_REX|0x080000) -#else -#define REXRB(p, rr, rb) ((void)0) -#define FORCE_REX 0 -#define REX_64 0 -#endif - -#define emit_i8(as, i) (*--as->mcp = (MCode)(i)) -#define emit_i32(as, i) (*(int32_t *)(as->mcp-4) = (i), as->mcp -= 4) -#define emit_u32(as, u) (*(uint32_t *)(as->mcp-4) = (u), as->mcp -= 4) - -#define emit_x87op(as, xo) \ - (*(uint16_t *)(as->mcp-2) = (uint16_t)(xo), as->mcp -= 2) - -/* op */ -static LJ_AINLINE MCode *emit_op(x86Op xo, Reg rr, Reg rb, Reg rx, - MCode *p, int delta) -{ - int n = (int8_t)xo; -#if defined(__GNUC__) - if (__builtin_constant_p(xo) && n == -2) - p[delta-2] = (MCode)(xo >> 24); - else if (__builtin_constant_p(xo) && n == -3) - *(uint16_t *)(p+delta-3) = (uint16_t)(xo >> 16); - else -#endif - *(uint32_t *)(p+delta-5) = (uint32_t)xo; - p += n + delta; -#if LJ_64 - { - uint32_t rex = 0x40 + ((rr>>1)&(4+(FORCE_REX>>1)))+((rx>>2)&2)+((rb>>3)&1); - if (rex != 0x40) { - rex |= (rr >> 16); - if (n == -4) { *p = (MCode)rex; rex = (MCode)(xo >> 8); } - else if ((xo & 0xffffff) == 0x6600fd) { *p = (MCode)rex; rex = 0x66; } - *--p = (MCode)rex; - } - } -#else - UNUSED(rr); UNUSED(rb); UNUSED(rx); -#endif - return p; -} - -/* op + modrm */ -#define emit_opm(xo, mode, rr, rb, p, delta) \ - (p[(delta)-1] = MODRM((mode), (rr), (rb)), \ - emit_op((xo), (rr), (rb), 0, (p), (delta))) - -/* op + modrm + sib */ -#define emit_opmx(xo, mode, scale, rr, rb, rx, p) \ - (p[-1] = MODRM((scale), (rx), (rb)), \ - p[-2] = MODRM((mode), (rr), RID_ESP), \ - emit_op((xo), (rr), (rb), (rx), (p), -1)) - -/* op r1, r2 */ -static void emit_rr(ASMState *as, x86Op xo, Reg r1, Reg r2) -{ - MCode *p = as->mcp; - as->mcp = emit_opm(xo, XM_REG, r1, r2, p, 0); -} - -#if LJ_64 && defined(LUA_USE_ASSERT) -/* [addr] is sign-extended in x64 and must be in lower 2G (not 4G). */ -static int32_t ptr2addr(const void *p) -{ - lua_assert((uintptr_t)p < (uintptr_t)0x80000000); - return i32ptr(p); -} -#else -#define ptr2addr(p) (i32ptr((p))) -#endif - -/* op r, [addr] */ -static void emit_rma(ASMState *as, x86Op xo, Reg rr, const void *addr) -{ - MCode *p = as->mcp; - *(int32_t *)(p-4) = ptr2addr(addr); -#if LJ_64 - p[-5] = MODRM(XM_SCALE1, RID_ESP, RID_EBP); - as->mcp = emit_opm(xo, XM_OFS0, rr, RID_ESP, p, -5); -#else - as->mcp = emit_opm(xo, XM_OFS0, rr, RID_EBP, p, -4); -#endif -} - -/* op r, [base+ofs] */ -static void emit_rmro(ASMState *as, x86Op xo, Reg rr, Reg rb, int32_t ofs) -{ - MCode *p = as->mcp; - x86Mode mode; - if (ra_hasreg(rb)) { - if (ofs == 0 && (rb&7) != RID_EBP) { - mode = XM_OFS0; - } else if (checki8(ofs)) { - *--p = (MCode)ofs; - mode = XM_OFS8; - } else { - p -= 4; - *(int32_t *)p = ofs; - mode = XM_OFS32; - } - if ((rb&7) == RID_ESP) - *--p = MODRM(XM_SCALE1, RID_ESP, RID_ESP); - } else { - *(int32_t *)(p-4) = ofs; -#if LJ_64 - p[-5] = MODRM(XM_SCALE1, RID_ESP, RID_EBP); - p -= 5; - rb = RID_ESP; -#else - p -= 4; - rb = RID_EBP; -#endif - mode = XM_OFS0; - } - as->mcp = emit_opm(xo, mode, rr, rb, p, 0); -} - -/* op r, [base+idx*scale+ofs] */ -static void emit_rmrxo(ASMState *as, x86Op xo, Reg rr, Reg rb, Reg rx, - x86Mode scale, int32_t ofs) -{ - MCode *p = as->mcp; - x86Mode mode; - if (ofs == 0 && (rb&7) != RID_EBP) { - mode = XM_OFS0; - } else if (checki8(ofs)) { - mode = XM_OFS8; - *--p = (MCode)ofs; - } else { - mode = XM_OFS32; - p -= 4; - *(int32_t *)p = ofs; - } - as->mcp = emit_opmx(xo, mode, scale, rr, rb, rx, p); -} - -/* op r, i */ -static void emit_gri(ASMState *as, x86Group xg, Reg rb, int32_t i) -{ - MCode *p = as->mcp; - x86Op xo; - if (checki8(i)) { - *--p = (MCode)i; - xo = XG_TOXOi8(xg); - } else { - p -= 4; - *(int32_t *)p = i; - xo = XG_TOXOi(xg); - } - as->mcp = emit_opm(xo, XM_REG, (Reg)(xg & 7) | (rb & REX_64), rb, p, 0); -} - -/* op [base+ofs], i */ -static void emit_gmroi(ASMState *as, x86Group xg, Reg rb, int32_t ofs, - int32_t i) -{ - x86Op xo; - if (checki8(i)) { - emit_i8(as, i); - xo = XG_TOXOi8(xg); - } else { - emit_i32(as, i); - xo = XG_TOXOi(xg); - } - emit_rmro(as, xo, (Reg)(xg & 7), rb, ofs); -} - -#define emit_shifti(as, xg, r, i) \ - (emit_i8(as, (i)), emit_rr(as, XO_SHIFTi, (Reg)(xg), (r))) - -/* op r, rm/mrm */ -static void emit_mrm(ASMState *as, x86Op xo, Reg rr, Reg rb) -{ - MCode *p = as->mcp; - x86Mode mode = XM_REG; - if (rb == RID_MRM) { - rb = as->mrm.base; - if (rb == RID_NONE) { - rb = RID_EBP; - mode = XM_OFS0; - p -= 4; - *(int32_t *)p = as->mrm.ofs; - if (as->mrm.idx != RID_NONE) - goto mrmidx; -#if LJ_64 - *--p = MODRM(XM_SCALE1, RID_ESP, RID_EBP); - rb = RID_ESP; -#endif - } else { - if (as->mrm.ofs == 0 && (rb&7) != RID_EBP) { - mode = XM_OFS0; - } else if (checki8(as->mrm.ofs)) { - *--p = (MCode)as->mrm.ofs; - mode = XM_OFS8; - } else { - p -= 4; - *(int32_t *)p = as->mrm.ofs; - mode = XM_OFS32; - } - if (as->mrm.idx != RID_NONE) { - mrmidx: - as->mcp = emit_opmx(xo, mode, as->mrm.scale, rr, rb, as->mrm.idx, p); - return; - } - if ((rb&7) == RID_ESP) - *--p = MODRM(XM_SCALE1, RID_ESP, RID_ESP); - } - } - as->mcp = emit_opm(xo, mode, rr, rb, p, 0); -} - -/* op rm/mrm, i */ -static void emit_gmrmi(ASMState *as, x86Group xg, Reg rb, int32_t i) -{ - x86Op xo; - if (checki8(i)) { - emit_i8(as, i); - xo = XG_TOXOi8(xg); - } else { - emit_i32(as, i); - xo = XG_TOXOi(xg); - } - emit_mrm(as, xo, (Reg)(xg & 7) | (rb & REX_64), (rb & ~REX_64)); -} - -/* -- Emit loads/stores --------------------------------------------------- */ - -/* Instruction selection for XMM moves. */ -#define XMM_MOVRR(as) ((as->flags & JIT_F_SPLIT_XMM) ? XO_MOVSD : XO_MOVAPS) -#define XMM_MOVRM(as) ((as->flags & JIT_F_SPLIT_XMM) ? XO_MOVLPD : XO_MOVSD) - -/* mov [base+ofs], i */ -static void emit_movmroi(ASMState *as, Reg base, int32_t ofs, int32_t i) -{ - emit_i32(as, i); - emit_rmro(as, XO_MOVmi, 0, base, ofs); -} - -/* mov [base+ofs], r */ -#define emit_movtomro(as, r, base, ofs) \ - emit_rmro(as, XO_MOVto, (r), (base), (ofs)) - -/* Get/set global_State fields. */ -#define emit_opgl(as, xo, r, field) \ - emit_rma(as, (xo), (r), (void *)&J2G(as->J)->field) -#define emit_getgl(as, r, field) emit_opgl(as, XO_MOV, (r), field) -#define emit_setgl(as, r, field) emit_opgl(as, XO_MOVto, (r), field) - -#define emit_setvmstate(as, i) \ - (emit_i32(as, i), emit_opgl(as, XO_MOVmi, 0, vmstate)) - -/* mov r, i / xor r, r */ -static void emit_loadi(ASMState *as, Reg r, int32_t i) -{ - /* XOR r,r is shorter, but modifies the flags. This is bad for HIOP. */ - if (i == 0 && !(LJ_32 && (IR(as->curins)->o == IR_HIOP || - (as->curins+1 < as->T->nins && - IR(as->curins+1)->o == IR_HIOP)))) { - emit_rr(as, XO_ARITH(XOg_XOR), r, r); - } else { - MCode *p = as->mcp; - *(int32_t *)(p-4) = i; - p[-5] = (MCode)(XI_MOVri+(r&7)); - p -= 5; - REXRB(p, 0, r); - as->mcp = p; - } -} - -/* mov r, addr */ -#define emit_loada(as, r, addr) \ - emit_loadi(as, (r), ptr2addr((addr))) - -#if LJ_64 -/* mov r, imm64 or shorter 32 bit extended load. */ -static void emit_loadu64(ASMState *as, Reg r, uint64_t u64) -{ - if (checku32(u64)) { /* 32 bit load clears upper 32 bits. */ - emit_loadi(as, r, (int32_t)u64); - } else if (checki32((int64_t)u64)) { /* Sign-extended 32 bit load. */ - MCode *p = as->mcp; - *(int32_t *)(p-4) = (int32_t)u64; - as->mcp = emit_opm(XO_MOVmi, XM_REG, REX_64, r, p, -4); - } else { /* Full-size 64 bit load. */ - MCode *p = as->mcp; - *(uint64_t *)(p-8) = u64; - p[-9] = (MCode)(XI_MOVri+(r&7)); - p[-10] = 0x48 + ((r>>3)&1); - p -= 10; - as->mcp = p; - } -} -#endif - -/* movsd r, [&tv->n] / xorps r, r */ -static void emit_loadn(ASMState *as, Reg r, cTValue *tv) -{ - if (tvispzero(tv)) /* Use xor only for +0. */ - emit_rr(as, XO_XORPS, r, r); - else - emit_rma(as, XMM_MOVRM(as), r, &tv->n); -} - -/* -- Emit control-flow instructions -------------------------------------- */ - -/* Label for short jumps. */ -typedef MCode *MCLabel; - -#if LJ_32 && LJ_HASFFI -/* jmp short target */ -static void emit_sjmp(ASMState *as, MCLabel target) -{ - MCode *p = as->mcp; - ptrdiff_t delta = target - p; - lua_assert(delta == (int8_t)delta); - p[-1] = (MCode)(int8_t)delta; - p[-2] = XI_JMPs; - as->mcp = p - 2; -} -#endif - -/* jcc short target */ -static void emit_sjcc(ASMState *as, int cc, MCLabel target) -{ - MCode *p = as->mcp; - ptrdiff_t delta = target - p; - lua_assert(delta == (int8_t)delta); - p[-1] = (MCode)(int8_t)delta; - p[-2] = (MCode)(XI_JCCs+(cc&15)); - as->mcp = p - 2; -} - -/* jcc short (pending target) */ -static MCLabel emit_sjcc_label(ASMState *as, int cc) -{ - MCode *p = as->mcp; - p[-1] = 0; - p[-2] = (MCode)(XI_JCCs+(cc&15)); - as->mcp = p - 2; - return p; -} - -/* Fixup jcc short target. */ -static void emit_sfixup(ASMState *as, MCLabel source) -{ - source[-1] = (MCode)(as->mcp-source); -} - -/* Return label pointing to current PC. */ -#define emit_label(as) ((as)->mcp) - -/* Compute relative 32 bit offset for jump and call instructions. */ -static LJ_AINLINE int32_t jmprel(MCode *p, MCode *target) -{ - ptrdiff_t delta = target - p; - lua_assert(delta == (int32_t)delta); - return (int32_t)delta; -} - -/* jcc target */ -static void emit_jcc(ASMState *as, int cc, MCode *target) -{ - MCode *p = as->mcp; - *(int32_t *)(p-4) = jmprel(p, target); - p[-5] = (MCode)(XI_JCCn+(cc&15)); - p[-6] = 0x0f; - as->mcp = p - 6; -} - -/* jmp target */ -static void emit_jmp(ASMState *as, MCode *target) -{ - MCode *p = as->mcp; - *(int32_t *)(p-4) = jmprel(p, target); - p[-5] = XI_JMP; - as->mcp = p - 5; -} - -/* call target */ -static void emit_call_(ASMState *as, MCode *target) -{ - MCode *p = as->mcp; -#if LJ_64 - if (target-p != (int32_t)(target-p)) { - /* Assumes RID_RET is never an argument to calls and always clobbered. */ - emit_rr(as, XO_GROUP5, XOg_CALL, RID_RET); - emit_loadu64(as, RID_RET, (uint64_t)target); - return; - } -#endif - *(int32_t *)(p-4) = jmprel(p, target); - p[-5] = XI_CALL; - as->mcp = p - 5; -} - -#define emit_call(as, f) emit_call_(as, (MCode *)(void *)(f)) - -/* -- Emit generic operations --------------------------------------------- */ - -/* Use 64 bit operations to handle 64 bit IR types. */ -#if LJ_64 -#define REX_64IR(ir, r) ((r) + (irt_is64((ir)->t) ? REX_64 : 0)) -#else -#define REX_64IR(ir, r) (r) -#endif - -/* Generic move between two regs. */ -static void emit_movrr(ASMState *as, IRIns *ir, Reg dst, Reg src) -{ - UNUSED(ir); - if (dst < RID_MAX_GPR) - emit_rr(as, XO_MOV, REX_64IR(ir, dst), src); - else - emit_rr(as, XMM_MOVRR(as), dst, src); -} - -/* Generic load of register from stack slot. */ -static void emit_spload(ASMState *as, IRIns *ir, Reg r, int32_t ofs) -{ - if (r < RID_MAX_GPR) - emit_rmro(as, XO_MOV, REX_64IR(ir, r), RID_ESP, ofs); - else - emit_rmro(as, irt_isnum(ir->t) ? XMM_MOVRM(as) : XO_MOVSS, r, RID_ESP, ofs); -} - -/* Generic store of register to stack slot. */ -static void emit_spstore(ASMState *as, IRIns *ir, Reg r, int32_t ofs) -{ - if (r < RID_MAX_GPR) - emit_rmro(as, XO_MOVto, REX_64IR(ir, r), RID_ESP, ofs); - else - emit_rmro(as, irt_isnum(ir->t) ? XO_MOVSDto : XO_MOVSSto, r, RID_ESP, ofs); -} - -/* Add offset to pointer. */ -static void emit_addptr(ASMState *as, Reg r, int32_t ofs) -{ - if (ofs) { - if ((as->flags & JIT_F_LEA_AGU)) - emit_rmro(as, XO_LEA, r, r, ofs); - else - emit_gri(as, XG_ARITHi(XOg_ADD), r, ofs); - } -} - -#define emit_spsub(as, ofs) emit_addptr(as, RID_ESP|REX_64, -(ofs)) - -/* Prefer rematerialization of BASE/L from global_State over spills. */ -#define emit_canremat(ref) ((ref) <= REF_BASE) - diff --git a/deps/luajit/src/lj_err.c b/deps/luajit/src/lj_err.c deleted file mode 100644 index 081bfde4..00000000 --- a/deps/luajit/src/lj_err.c +++ /dev/null @@ -1,800 +0,0 @@ -/* -** Error handling. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#define lj_err_c -#define LUA_CORE - -#include "lj_obj.h" -#include "lj_err.h" -#include "lj_debug.h" -#include "lj_str.h" -#include "lj_func.h" -#include "lj_state.h" -#include "lj_frame.h" -#include "lj_ff.h" -#include "lj_trace.h" -#include "lj_vm.h" - -/* -** LuaJIT can either use internal or external frame unwinding: -** -** - Internal frame unwinding (INT) is free-standing and doesn't require -** any OS or library support. -** -** - External frame unwinding (EXT) uses the system-provided unwind handler. -** -** Pros and Cons: -** -** - EXT requires unwind tables for *all* functions on the C stack between -** the pcall/catch and the error/throw. This is the default on x64, -** but needs to be manually enabled on x86/PPC for non-C++ code. -** -** - INT is faster when actually throwing errors (but this happens rarely). -** Setting up error handlers is zero-cost in any case. -** -** - EXT provides full interoperability with C++ exceptions. You can throw -** Lua errors or C++ exceptions through a mix of Lua frames and C++ frames. -** C++ destructors are called as needed. C++ exceptions caught by pcall -** are converted to the string "C++ exception". Lua errors can be caught -** with catch (...) in C++. -** -** - INT has only limited support for automatically catching C++ exceptions -** on POSIX systems using DWARF2 stack unwinding. Other systems may use -** the wrapper function feature. Lua errors thrown through C++ frames -** cannot be caught by C++ code and C++ destructors are not run. -** -** EXT is the default on x64 systems, INT is the default on all other systems. -** -** EXT can be manually enabled on POSIX systems using GCC and DWARF2 stack -** unwinding with -DLUAJIT_UNWIND_EXTERNAL. *All* C code must be compiled -** with -funwind-tables (or -fexceptions). This includes LuaJIT itself (set -** TARGET_CFLAGS), all of your C/Lua binding code, all loadable C modules -** and all C libraries that have callbacks which may be used to call back -** into Lua. C++ code must *not* be compiled with -fno-exceptions. -** -** EXT cannot be enabled on WIN32 since system exceptions use code-driven SEH. -** EXT is mandatory on WIN64 since the calling convention has an abundance -** of callee-saved registers (rbx, rbp, rsi, rdi, r12-r15, xmm6-xmm15). -** EXT is mandatory on POSIX/x64 since the interpreter doesn't save r12/r13. -*/ - -#if defined(__GNUC__) && (LJ_TARGET_X64 || defined(LUAJIT_UNWIND_EXTERNAL)) -#define LJ_UNWIND_EXT 1 -#elif LJ_TARGET_X64 && LJ_TARGET_WINDOWS -#define LJ_UNWIND_EXT 1 -#endif - -/* -- Error messages ------------------------------------------------------ */ - -/* Error message strings. */ -LJ_DATADEF const char *lj_err_allmsg = -#define ERRDEF(name, msg) msg "\0" -#include "lj_errmsg.h" -; - -/* -- Internal frame unwinding -------------------------------------------- */ - -/* Unwind Lua stack and move error message to new top. */ -LJ_NOINLINE static void unwindstack(lua_State *L, TValue *top) -{ - lj_func_closeuv(L, top); - if (top < L->top-1) { - copyTV(L, top, L->top-1); - L->top = top+1; - } - lj_state_relimitstack(L); -} - -/* Unwind until stop frame. Optionally cleanup frames. */ -static void *err_unwind(lua_State *L, void *stopcf, int errcode) -{ - TValue *frame = L->base-1; - void *cf = L->cframe; - while (cf) { - int32_t nres = cframe_nres(cframe_raw(cf)); - if (nres < 0) { /* C frame without Lua frame? */ - TValue *top = restorestack(L, -nres); - if (frame < top) { /* Frame reached? */ - if (errcode) { - L->cframe = cframe_prev(cf); - L->base = frame+1; - unwindstack(L, top); - } - return cf; - } - } - if (frame <= tvref(L->stack)) - break; - switch (frame_typep(frame)) { - case FRAME_LUA: /* Lua frame. */ - case FRAME_LUAP: - frame = frame_prevl(frame); - break; - case FRAME_C: /* C frame. */ -#if LJ_HASFFI - unwind_c: -#endif -#if LJ_UNWIND_EXT - if (errcode) { - L->cframe = cframe_prev(cf); - L->base = frame_prevd(frame) + 1; - unwindstack(L, frame); - } else if (cf != stopcf) { - cf = cframe_prev(cf); - frame = frame_prevd(frame); - break; - } - return NULL; /* Continue unwinding. */ -#else - UNUSED(stopcf); - cf = cframe_prev(cf); - frame = frame_prevd(frame); - break; -#endif - case FRAME_CP: /* Protected C frame. */ - if (cframe_canyield(cf)) { /* Resume? */ - if (errcode) { - hook_leave(G(L)); /* Assumes nobody uses coroutines inside hooks. */ - L->cframe = NULL; - L->status = (uint8_t)errcode; - } - return cf; - } - if (errcode) { - L->cframe = cframe_prev(cf); - L->base = frame_prevd(frame) + 1; - unwindstack(L, frame); - } - return cf; - case FRAME_CONT: /* Continuation frame. */ -#if LJ_HASFFI - if ((frame-1)->u32.lo == LJ_CONT_FFI_CALLBACK) - goto unwind_c; -#endif - case FRAME_VARG: /* Vararg frame. */ - frame = frame_prevd(frame); - break; - case FRAME_PCALL: /* FF pcall() frame. */ - case FRAME_PCALLH: /* FF pcall() frame inside hook. */ - if (errcode) { - if (errcode == LUA_YIELD) { - frame = frame_prevd(frame); - break; - } - if (frame_typep(frame) == FRAME_PCALL) - hook_leave(G(L)); - L->cframe = cf; - L->base = frame_prevd(frame) + 1; - unwindstack(L, L->base); - } - return (void *)((intptr_t)cf | CFRAME_UNWIND_FF); - } - } - /* No C frame. */ - if (errcode) { - L->cframe = NULL; - L->base = tvref(L->stack)+1; - unwindstack(L, L->base); - if (G(L)->panic) - G(L)->panic(L); - exit(EXIT_FAILURE); - } - return L; /* Anything non-NULL will do. */ -} - -/* -- External frame unwinding -------------------------------------------- */ - -#if defined(__GNUC__) && !LJ_NO_UNWIND && !LJ_TARGET_WINDOWS - -/* -** We have to use our own definitions instead of the mandatory (!) unwind.h, -** since various OS, distros and compilers mess up the header installation. -*/ - -typedef struct _Unwind_Exception -{ - uint64_t exclass; - void (*excleanup)(int, struct _Unwind_Exception *); - uintptr_t p1, p2; -} __attribute__((__aligned__)) _Unwind_Exception; - -typedef struct _Unwind_Context _Unwind_Context; - -#define _URC_OK 0 -#define _URC_FATAL_PHASE1_ERROR 3 -#define _URC_HANDLER_FOUND 6 -#define _URC_INSTALL_CONTEXT 7 -#define _URC_CONTINUE_UNWIND 8 -#define _URC_FAILURE 9 - -#if !LJ_TARGET_ARM - -extern uintptr_t _Unwind_GetCFA(_Unwind_Context *); -extern void _Unwind_SetGR(_Unwind_Context *, int, uintptr_t); -extern void _Unwind_SetIP(_Unwind_Context *, uintptr_t); -extern void _Unwind_DeleteException(_Unwind_Exception *); -extern int _Unwind_RaiseException(_Unwind_Exception *); - -#define _UA_SEARCH_PHASE 1 -#define _UA_CLEANUP_PHASE 2 -#define _UA_HANDLER_FRAME 4 -#define _UA_FORCE_UNWIND 8 - -#define LJ_UEXCLASS 0x4c55414a49543200ULL /* LUAJIT2\0 */ -#define LJ_UEXCLASS_MAKE(c) (LJ_UEXCLASS | (uint64_t)(c)) -#define LJ_UEXCLASS_CHECK(cl) (((cl) ^ LJ_UEXCLASS) <= 0xff) -#define LJ_UEXCLASS_ERRCODE(cl) ((int)((cl) & 0xff)) - -/* DWARF2 personality handler referenced from interpreter .eh_frame. */ -LJ_FUNCA int lj_err_unwind_dwarf(int version, int actions, - uint64_t uexclass, _Unwind_Exception *uex, _Unwind_Context *ctx) -{ - void *cf; - lua_State *L; - if (version != 1) - return _URC_FATAL_PHASE1_ERROR; - UNUSED(uexclass); - cf = (void *)_Unwind_GetCFA(ctx); - L = cframe_L(cf); - if ((actions & _UA_SEARCH_PHASE)) { -#if LJ_UNWIND_EXT - if (err_unwind(L, cf, 0) == NULL) - return _URC_CONTINUE_UNWIND; -#endif - if (!LJ_UEXCLASS_CHECK(uexclass)) { - setstrV(L, L->top++, lj_err_str(L, LJ_ERR_ERRCPP)); - } - return _URC_HANDLER_FOUND; - } - if ((actions & _UA_CLEANUP_PHASE)) { - int errcode; - if (LJ_UEXCLASS_CHECK(uexclass)) { - errcode = LJ_UEXCLASS_ERRCODE(uexclass); - } else { - if ((actions & _UA_HANDLER_FRAME)) - _Unwind_DeleteException(uex); - errcode = LUA_ERRRUN; - } -#if LJ_UNWIND_EXT - cf = err_unwind(L, cf, errcode); - if ((actions & _UA_FORCE_UNWIND)) { - return _URC_CONTINUE_UNWIND; - } else if (cf) { - _Unwind_SetGR(ctx, LJ_TARGET_EHRETREG, errcode); - _Unwind_SetIP(ctx, (uintptr_t)(cframe_unwind_ff(cf) ? - lj_vm_unwind_ff_eh : - lj_vm_unwind_c_eh)); - return _URC_INSTALL_CONTEXT; - } -#if LJ_TARGET_X86ORX64 - else if ((actions & _UA_HANDLER_FRAME)) { - /* Workaround for ancient libgcc bug. Still present in RHEL 5.5. :-/ - ** Real fix: http://gcc.gnu.org/viewcvs/trunk/gcc/unwind-dw2.c?r1=121165&r2=124837&pathrev=153877&diff_format=h - */ - _Unwind_SetGR(ctx, LJ_TARGET_EHRETREG, errcode); - _Unwind_SetIP(ctx, (uintptr_t)lj_vm_unwind_rethrow); - return _URC_INSTALL_CONTEXT; - } -#endif -#else - /* This is not the proper way to escape from the unwinder. We get away with - ** it on non-x64 because the interpreter restores all callee-saved regs. - */ - lj_err_throw(L, errcode); -#endif - } - return _URC_CONTINUE_UNWIND; -} - -#if LJ_UNWIND_EXT -#if LJ_TARGET_OSX || defined(__OpenBSD__) -/* Sorry, no thread safety for OSX. Complain to Apple, not me. */ -static _Unwind_Exception static_uex; -#else -static __thread _Unwind_Exception static_uex; -#endif - -/* Raise DWARF2 exception. */ -static void err_raise_ext(int errcode) -{ - static_uex.exclass = LJ_UEXCLASS_MAKE(errcode); - static_uex.excleanup = NULL; - _Unwind_RaiseException(&static_uex); -} -#endif - -#else - -extern void _Unwind_DeleteException(void *); -extern int __gnu_unwind_frame (void *, _Unwind_Context *); -extern int _Unwind_VRS_Set(_Unwind_Context *, int, uint32_t, int, void *); -extern int _Unwind_VRS_Get(_Unwind_Context *, int, uint32_t, int, void *); - -static inline uint32_t _Unwind_GetGR(_Unwind_Context *ctx, int r) -{ - uint32_t v; - _Unwind_VRS_Get(ctx, 0, r, 0, &v); - return v; -} - -static inline void _Unwind_SetGR(_Unwind_Context *ctx, int r, uint32_t v) -{ - _Unwind_VRS_Set(ctx, 0, r, 0, &v); -} - -#define _US_VIRTUAL_UNWIND_FRAME 0 -#define _US_UNWIND_FRAME_STARTING 1 -#define _US_ACTION_MASK 3 -#define _US_FORCE_UNWIND 8 - -/* ARM unwinder personality handler referenced from interpreter .ARM.extab. */ -LJ_FUNCA int lj_err_unwind_arm(int state, void *ucb, _Unwind_Context *ctx) -{ - void *cf = (void *)_Unwind_GetGR(ctx, 13); - lua_State *L = cframe_L(cf); - if ((state & _US_ACTION_MASK) == _US_VIRTUAL_UNWIND_FRAME) { - setstrV(L, L->top++, lj_err_str(L, LJ_ERR_ERRCPP)); - return _URC_HANDLER_FOUND; - } - if ((state&(_US_ACTION_MASK|_US_FORCE_UNWIND)) == _US_UNWIND_FRAME_STARTING) { - _Unwind_DeleteException(ucb); - _Unwind_SetGR(ctx, 15, (uint32_t)(void *)lj_err_throw); - _Unwind_SetGR(ctx, 0, (uint32_t)L); - _Unwind_SetGR(ctx, 1, (uint32_t)LUA_ERRRUN); - return _URC_INSTALL_CONTEXT; - } - if (__gnu_unwind_frame(ucb, ctx) != _URC_OK) - return _URC_FAILURE; - return _URC_CONTINUE_UNWIND; -} - -#endif - -#elif LJ_TARGET_X64 && LJ_TARGET_WINDOWS - -/* -** Someone in Redmond owes me several days of my life. A lot of this is -** undocumented or just plain wrong on MSDN. Some of it can be gathered -** from 3rd party docs or must be found by trial-and-error. They really -** don't want you to write your own language-specific exception handler -** or to interact gracefully with MSVC. :-( -** -** Apparently MSVC doesn't call C++ destructors for foreign exceptions -** unless you compile your C++ code with /EHa. Unfortunately this means -** catch (...) also catches things like access violations. The use of -** _set_se_translator doesn't really help, because it requires /EHa, too. -*/ - -#define WIN32_LEAN_AND_MEAN -#include - -/* Taken from: http://www.nynaeve.net/?p=99 */ -typedef struct UndocumentedDispatcherContext { - ULONG64 ControlPc; - ULONG64 ImageBase; - PRUNTIME_FUNCTION FunctionEntry; - ULONG64 EstablisherFrame; - ULONG64 TargetIp; - PCONTEXT ContextRecord; - void (*LanguageHandler)(void); - PVOID HandlerData; - PUNWIND_HISTORY_TABLE HistoryTable; - ULONG ScopeIndex; - ULONG Fill0; -} UndocumentedDispatcherContext; - -/* Another wild guess. */ -extern void __DestructExceptionObject(EXCEPTION_RECORD *rec, int nothrow); - -#ifdef MINGW_SDK_INIT -/* Workaround for broken MinGW64 declaration. */ -VOID RtlUnwindEx_FIXED(PVOID,PVOID,PVOID,PVOID,PVOID,PVOID) asm("RtlUnwindEx"); -#define RtlUnwindEx RtlUnwindEx_FIXED -#endif - -#define LJ_MSVC_EXCODE ((DWORD)0xe06d7363) -#define LJ_GCC_EXCODE ((DWORD)0x20474343) - -#define LJ_EXCODE ((DWORD)0xe24c4a00) -#define LJ_EXCODE_MAKE(c) (LJ_EXCODE | (DWORD)(c)) -#define LJ_EXCODE_CHECK(cl) (((cl) ^ LJ_EXCODE) <= 0xff) -#define LJ_EXCODE_ERRCODE(cl) ((int)((cl) & 0xff)) - -/* Win64 exception handler for interpreter frame. */ -LJ_FUNCA EXCEPTION_DISPOSITION lj_err_unwind_win64(EXCEPTION_RECORD *rec, - void *cf, CONTEXT *ctx, UndocumentedDispatcherContext *dispatch) -{ - lua_State *L = cframe_L(cf); - int errcode = LJ_EXCODE_CHECK(rec->ExceptionCode) ? - LJ_EXCODE_ERRCODE(rec->ExceptionCode) : LUA_ERRRUN; - if ((rec->ExceptionFlags & 6)) { /* EH_UNWINDING|EH_EXIT_UNWIND */ - /* Unwind internal frames. */ - err_unwind(L, cf, errcode); - } else { - void *cf2 = err_unwind(L, cf, 0); - if (cf2) { /* We catch it, so start unwinding the upper frames. */ - if (rec->ExceptionCode == LJ_MSVC_EXCODE || - rec->ExceptionCode == LJ_GCC_EXCODE) { - __DestructExceptionObject(rec, 1); - setstrV(L, L->top++, lj_err_str(L, LJ_ERR_ERRCPP)); - } else if (!LJ_EXCODE_CHECK(rec->ExceptionCode)) { - /* Don't catch access violations etc. */ - return ExceptionContinueSearch; - } - /* Unwind the stack and call all handlers for all lower C frames - ** (including ourselves) again with EH_UNWINDING set. Then set - ** rsp = cf, rax = errcode and jump to the specified target. - */ - RtlUnwindEx(cf, (void *)((cframe_unwind_ff(cf2) && errcode != LUA_YIELD) ? - lj_vm_unwind_ff_eh : - lj_vm_unwind_c_eh), - rec, (void *)(uintptr_t)errcode, ctx, dispatch->HistoryTable); - /* RtlUnwindEx should never return. */ - } - } - return ExceptionContinueSearch; -} - -/* Raise Windows exception. */ -static void err_raise_ext(int errcode) -{ - RaiseException(LJ_EXCODE_MAKE(errcode), 1 /* EH_NONCONTINUABLE */, 0, NULL); -} - -#endif - -/* -- Error handling ------------------------------------------------------ */ - -/* Throw error. Find catch frame, unwind stack and continue. */ -LJ_NOINLINE void LJ_FASTCALL lj_err_throw(lua_State *L, int errcode) -{ - global_State *g = G(L); - lj_trace_abort(g); - setgcrefnull(g->jit_L); - L->status = 0; -#if LJ_UNWIND_EXT - err_raise_ext(errcode); - /* - ** A return from this function signals a corrupt C stack that cannot be - ** unwound. We have no choice but to call the panic function and exit. - ** - ** Usually this is caused by a C function without unwind information. - ** This should never happen on x64, but may happen if you've manually - ** enabled LUAJIT_UNWIND_EXTERNAL and forgot to recompile *every* - ** non-C++ file with -funwind-tables. - */ - if (G(L)->panic) - G(L)->panic(L); -#else - { - void *cf = err_unwind(L, NULL, errcode); - if (cframe_unwind_ff(cf)) - lj_vm_unwind_ff(cframe_raw(cf)); - else - lj_vm_unwind_c(cframe_raw(cf), errcode); - } -#endif - exit(EXIT_FAILURE); -} - -/* Return string object for error message. */ -LJ_NOINLINE GCstr *lj_err_str(lua_State *L, ErrMsg em) -{ - return lj_str_newz(L, err2msg(em)); -} - -/* Out-of-memory error. */ -LJ_NOINLINE void lj_err_mem(lua_State *L) -{ - if (L->status == LUA_ERRERR+1) /* Don't touch the stack during lua_open. */ - lj_vm_unwind_c(L->cframe, LUA_ERRMEM); - setstrV(L, L->top++, lj_err_str(L, LJ_ERR_ERRMEM)); - lj_err_throw(L, LUA_ERRMEM); -} - -/* Find error function for runtime errors. Requires an extra stack traversal. */ -static ptrdiff_t finderrfunc(lua_State *L) -{ - cTValue *frame = L->base-1, *bot = tvref(L->stack); - void *cf = L->cframe; - while (frame > bot && cf) { - while (cframe_nres(cframe_raw(cf)) < 0) { /* cframe without frame? */ - if (frame >= restorestack(L, -cframe_nres(cf))) - break; - if (cframe_errfunc(cf) >= 0) /* Error handler not inherited (-1)? */ - return cframe_errfunc(cf); - cf = cframe_prev(cf); /* Else unwind cframe and continue searching. */ - if (cf == NULL) - return 0; - } - switch (frame_typep(frame)) { - case FRAME_LUA: - case FRAME_LUAP: - frame = frame_prevl(frame); - break; - case FRAME_C: - cf = cframe_prev(cf); - /* fallthrough */ - case FRAME_VARG: - frame = frame_prevd(frame); - break; - case FRAME_CONT: -#if LJ_HASFFI - if ((frame-1)->u32.lo == LJ_CONT_FFI_CALLBACK) - cf = cframe_prev(cf); -#endif - frame = frame_prevd(frame); - break; - case FRAME_CP: - if (cframe_canyield(cf)) return 0; - if (cframe_errfunc(cf) >= 0) - return cframe_errfunc(cf); - frame = frame_prevd(frame); - break; - case FRAME_PCALL: - case FRAME_PCALLH: - if (frame_ftsz(frame) >= (ptrdiff_t)(2*sizeof(TValue))) /* xpcall? */ - return savestack(L, frame-1); /* Point to xpcall's errorfunc. */ - return 0; - default: - lua_assert(0); - return 0; - } - } - return 0; -} - -/* Runtime error. */ -LJ_NOINLINE void lj_err_run(lua_State *L) -{ - ptrdiff_t ef = finderrfunc(L); - if (ef) { - TValue *errfunc = restorestack(L, ef); - TValue *top = L->top; - lj_trace_abort(G(L)); - if (!tvisfunc(errfunc) || L->status == LUA_ERRERR) { - setstrV(L, top-1, lj_err_str(L, LJ_ERR_ERRERR)); - lj_err_throw(L, LUA_ERRERR); - } - L->status = LUA_ERRERR; - copyTV(L, top, top-1); - copyTV(L, top-1, errfunc); - L->top = top+1; - lj_vm_call(L, top, 1+1); /* Stack: |errfunc|msg| -> |msg| */ - } - lj_err_throw(L, LUA_ERRRUN); -} - -/* Formatted runtime error message. */ -LJ_NORET LJ_NOINLINE static void err_msgv(lua_State *L, ErrMsg em, ...) -{ - const char *msg; - va_list argp; - va_start(argp, em); - if (curr_funcisL(L)) L->top = curr_topL(L); - msg = lj_str_pushvf(L, err2msg(em), argp); - va_end(argp); - lj_debug_addloc(L, msg, L->base-1, NULL); - lj_err_run(L); -} - -/* Non-vararg variant for better calling conventions. */ -LJ_NOINLINE void lj_err_msg(lua_State *L, ErrMsg em) -{ - err_msgv(L, em); -} - -/* Lexer error. */ -LJ_NOINLINE void lj_err_lex(lua_State *L, GCstr *src, const char *tok, - BCLine line, ErrMsg em, va_list argp) -{ - char buff[LUA_IDSIZE]; - const char *msg; - lj_debug_shortname(buff, src); - msg = lj_str_pushvf(L, err2msg(em), argp); - msg = lj_str_pushf(L, "%s:%d: %s", buff, line, msg); - if (tok) - lj_str_pushf(L, err2msg(LJ_ERR_XNEAR), msg, tok); - lj_err_throw(L, LUA_ERRSYNTAX); -} - -/* Typecheck error for operands. */ -LJ_NOINLINE void lj_err_optype(lua_State *L, cTValue *o, ErrMsg opm) -{ - const char *tname = lj_typename(o); - const char *opname = err2msg(opm); - if (curr_funcisL(L)) { - GCproto *pt = curr_proto(L); - const BCIns *pc = cframe_Lpc(L) - 1; - const char *oname = NULL; - const char *kind = lj_debug_slotname(pt, pc, (BCReg)(o-L->base), &oname); - if (kind) - err_msgv(L, LJ_ERR_BADOPRT, opname, kind, oname, tname); - } - err_msgv(L, LJ_ERR_BADOPRV, opname, tname); -} - -/* Typecheck error for ordered comparisons. */ -LJ_NOINLINE void lj_err_comp(lua_State *L, cTValue *o1, cTValue *o2) -{ - const char *t1 = lj_typename(o1); - const char *t2 = lj_typename(o2); - err_msgv(L, t1 == t2 ? LJ_ERR_BADCMPV : LJ_ERR_BADCMPT, t1, t2); - /* This assumes the two "boolean" entries are commoned by the C compiler. */ -} - -/* Typecheck error for __call. */ -LJ_NOINLINE void lj_err_optype_call(lua_State *L, TValue *o) -{ - /* Gross hack if lua_[p]call or pcall/xpcall fail for a non-callable object: - ** L->base still points to the caller. So add a dummy frame with L instead - ** of a function. See lua_getstack(). - */ - const BCIns *pc = cframe_Lpc(L); - if (((ptrdiff_t)pc & FRAME_TYPE) != FRAME_LUA) { - const char *tname = lj_typename(o); - setframe_pc(o, pc); - setframe_gc(o, obj2gco(L)); - L->top = L->base = o+1; - err_msgv(L, LJ_ERR_BADCALL, tname); - } - lj_err_optype(L, o, LJ_ERR_OPCALL); -} - -/* Error in context of caller. */ -LJ_NOINLINE void lj_err_callermsg(lua_State *L, const char *msg) -{ - TValue *frame = L->base-1; - TValue *pframe = NULL; - if (frame_islua(frame)) { - pframe = frame_prevl(frame); - } else if (frame_iscont(frame)) { -#if LJ_HASFFI - if ((frame-1)->u32.lo == LJ_CONT_FFI_CALLBACK) { - pframe = frame; - frame = NULL; - } else -#endif - { - pframe = frame_prevd(frame); -#if LJ_HASFFI - /* Remove frame for FFI metamethods. */ - if (frame_func(frame)->c.ffid >= FF_ffi_meta___index && - frame_func(frame)->c.ffid <= FF_ffi_meta___tostring) { - L->base = pframe+1; - L->top = frame; - setcframe_pc(cframe_raw(L->cframe), frame_contpc(frame)); - } -#endif - } - } - lj_debug_addloc(L, msg, pframe, frame); - lj_err_run(L); -} - -/* Formatted error in context of caller. */ -LJ_NOINLINE void lj_err_callerv(lua_State *L, ErrMsg em, ...) -{ - const char *msg; - va_list argp; - va_start(argp, em); - msg = lj_str_pushvf(L, err2msg(em), argp); - va_end(argp); - lj_err_callermsg(L, msg); -} - -/* Error in context of caller. */ -LJ_NOINLINE void lj_err_caller(lua_State *L, ErrMsg em) -{ - lj_err_callermsg(L, err2msg(em)); -} - -/* Argument error message. */ -LJ_NORET LJ_NOINLINE static void err_argmsg(lua_State *L, int narg, - const char *msg) -{ - const char *fname = "?"; - const char *ftype = lj_debug_funcname(L, L->base - 1, &fname); - if (narg < 0 && narg > LUA_REGISTRYINDEX) - narg = (int)(L->top - L->base) + narg + 1; - if (ftype && ftype[3] == 'h' && --narg == 0) /* Check for "method". */ - msg = lj_str_pushf(L, err2msg(LJ_ERR_BADSELF), fname, msg); - else - msg = lj_str_pushf(L, err2msg(LJ_ERR_BADARG), narg, fname, msg); - lj_err_callermsg(L, msg); -} - -/* Formatted argument error. */ -LJ_NOINLINE void lj_err_argv(lua_State *L, int narg, ErrMsg em, ...) -{ - const char *msg; - va_list argp; - va_start(argp, em); - msg = lj_str_pushvf(L, err2msg(em), argp); - va_end(argp); - err_argmsg(L, narg, msg); -} - -/* Argument error. */ -LJ_NOINLINE void lj_err_arg(lua_State *L, int narg, ErrMsg em) -{ - err_argmsg(L, narg, err2msg(em)); -} - -/* Typecheck error for arguments. */ -LJ_NOINLINE void lj_err_argtype(lua_State *L, int narg, const char *xname) -{ - const char *tname, *msg; - if (narg <= LUA_REGISTRYINDEX) { - if (narg >= LUA_GLOBALSINDEX) { - tname = lj_obj_itypename[~LJ_TTAB]; - } else { - GCfunc *fn = curr_func(L); - int idx = LUA_GLOBALSINDEX - narg; - if (idx <= fn->c.nupvalues) - tname = lj_typename(&fn->c.upvalue[idx-1]); - else - tname = lj_obj_typename[0]; - } - } else { - TValue *o = narg < 0 ? L->top + narg : L->base + narg-1; - tname = o < L->top ? lj_typename(o) : lj_obj_typename[0]; - } - msg = lj_str_pushf(L, err2msg(LJ_ERR_BADTYPE), xname, tname); - err_argmsg(L, narg, msg); -} - -/* Typecheck error for arguments. */ -LJ_NOINLINE void lj_err_argt(lua_State *L, int narg, int tt) -{ - lj_err_argtype(L, narg, lj_obj_typename[tt+1]); -} - -/* -- Public error handling API ------------------------------------------- */ - -LUA_API lua_CFunction lua_atpanic(lua_State *L, lua_CFunction panicf) -{ - lua_CFunction old = G(L)->panic; - G(L)->panic = panicf; - return old; -} - -/* Forwarders for the public API (C calling convention and no LJ_NORET). */ -LUA_API int lua_error(lua_State *L) -{ - lj_err_run(L); - return 0; /* unreachable */ -} - -LUALIB_API int luaL_argerror(lua_State *L, int narg, const char *msg) -{ - err_argmsg(L, narg, msg); - return 0; /* unreachable */ -} - -LUALIB_API int luaL_typerror(lua_State *L, int narg, const char *xname) -{ - lj_err_argtype(L, narg, xname); - return 0; /* unreachable */ -} - -LUALIB_API void luaL_where(lua_State *L, int level) -{ - int size; - cTValue *frame = lj_debug_frame(L, level, &size); - lj_debug_addloc(L, "", frame, size ? frame+size : NULL); -} - -LUALIB_API int luaL_error(lua_State *L, const char *fmt, ...) -{ - const char *msg; - va_list argp; - va_start(argp, fmt); - msg = lj_str_pushvf(L, fmt, argp); - va_end(argp); - lj_err_callermsg(L, msg); - return 0; /* unreachable */ -} - diff --git a/deps/luajit/src/lj_err.h b/deps/luajit/src/lj_err.h deleted file mode 100644 index 03a56f03..00000000 --- a/deps/luajit/src/lj_err.h +++ /dev/null @@ -1,41 +0,0 @@ -/* -** Error handling. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#ifndef _LJ_ERR_H -#define _LJ_ERR_H - -#include - -#include "lj_obj.h" - -typedef enum { -#define ERRDEF(name, msg) \ - LJ_ERR_##name, LJ_ERR_##name##_ = LJ_ERR_##name + sizeof(msg)-1, -#include "lj_errmsg.h" - LJ_ERR__MAX -} ErrMsg; - -LJ_DATA const char *lj_err_allmsg; -#define err2msg(em) (lj_err_allmsg+(int)(em)) - -LJ_FUNC GCstr *lj_err_str(lua_State *L, ErrMsg em); -LJ_FUNCA_NORET void LJ_FASTCALL lj_err_throw(lua_State *L, int errcode); -LJ_FUNC_NORET void lj_err_mem(lua_State *L); -LJ_FUNC_NORET void lj_err_run(lua_State *L); -LJ_FUNC_NORET void lj_err_msg(lua_State *L, ErrMsg em); -LJ_FUNC_NORET void lj_err_lex(lua_State *L, GCstr *src, const char *tok, - BCLine line, ErrMsg em, va_list argp); -LJ_FUNC_NORET void lj_err_optype(lua_State *L, cTValue *o, ErrMsg opm); -LJ_FUNC_NORET void lj_err_comp(lua_State *L, cTValue *o1, cTValue *o2); -LJ_FUNC_NORET void lj_err_optype_call(lua_State *L, TValue *o); -LJ_FUNC_NORET void lj_err_callermsg(lua_State *L, const char *msg); -LJ_FUNC_NORET void lj_err_callerv(lua_State *L, ErrMsg em, ...); -LJ_FUNC_NORET void lj_err_caller(lua_State *L, ErrMsg em); -LJ_FUNC_NORET void lj_err_arg(lua_State *L, int narg, ErrMsg em); -LJ_FUNC_NORET void lj_err_argv(lua_State *L, int narg, ErrMsg em, ...); -LJ_FUNC_NORET void lj_err_argtype(lua_State *L, int narg, const char *xname); -LJ_FUNC_NORET void lj_err_argt(lua_State *L, int narg, int tt); - -#endif diff --git a/deps/luajit/src/lj_errmsg.h b/deps/luajit/src/lj_errmsg.h deleted file mode 100644 index 1c948760..00000000 --- a/deps/luajit/src/lj_errmsg.h +++ /dev/null @@ -1,193 +0,0 @@ -/* -** VM error messages. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -/* This file may be included multiple times with different ERRDEF macros. */ - -/* Basic error handling. */ -ERRDEF(ERRMEM, "not enough memory") -ERRDEF(ERRERR, "error in error handling") -ERRDEF(ERRCPP, "C++ exception") - -/* Allocations. */ -ERRDEF(STROV, "string length overflow") -ERRDEF(UDATAOV, "userdata length overflow") -ERRDEF(STKOV, "stack overflow") -ERRDEF(STKOVM, "stack overflow (%s)") -ERRDEF(TABOV, "table overflow") - -/* Table indexing. */ -ERRDEF(NANIDX, "table index is NaN") -ERRDEF(NILIDX, "table index is nil") -ERRDEF(NEXTIDX, "invalid key to " LUA_QL("next")) - -/* Metamethod resolving. */ -ERRDEF(BADCALL, "attempt to call a %s value") -ERRDEF(BADOPRT, "attempt to %s %s " LUA_QS " (a %s value)") -ERRDEF(BADOPRV, "attempt to %s a %s value") -ERRDEF(BADCMPT, "attempt to compare %s with %s") -ERRDEF(BADCMPV, "attempt to compare two %s values") -ERRDEF(GETLOOP, "loop in gettable") -ERRDEF(SETLOOP, "loop in settable") -ERRDEF(OPCALL, "call") -ERRDEF(OPINDEX, "index") -ERRDEF(OPARITH, "perform arithmetic on") -ERRDEF(OPCAT, "concatenate") -ERRDEF(OPLEN, "get length of") - -/* Type checks. */ -ERRDEF(BADSELF, "calling " LUA_QS " on bad self (%s)") -ERRDEF(BADARG, "bad argument #%d to " LUA_QS " (%s)") -ERRDEF(BADTYPE, "%s expected, got %s") -ERRDEF(BADVAL, "invalid value") -ERRDEF(NOVAL, "value expected") -ERRDEF(NOCORO, "coroutine expected") -ERRDEF(NOTABN, "nil or table expected") -ERRDEF(NOLFUNC, "Lua function expected") -ERRDEF(NOFUNCL, "function or level expected") -ERRDEF(NOSFT, "string/function/table expected") -ERRDEF(NOPROXY, "boolean or proxy expected") -ERRDEF(FORINIT, LUA_QL("for") " initial value must be a number") -ERRDEF(FORLIM, LUA_QL("for") " limit must be a number") -ERRDEF(FORSTEP, LUA_QL("for") " step must be a number") - -/* C API checks. */ -ERRDEF(NOENV, "no calling environment") -ERRDEF(CYIELD, "attempt to yield across C-call boundary") -ERRDEF(BADLU, "bad light userdata pointer") -ERRDEF(NOGCMM, "bad action while in __gc metamethod") -#if LJ_TARGET_WINDOWS -ERRDEF(BADFPU, "bad FPU precision (use D3DCREATE_FPU_PRESERVE with DirectX)") -#endif - -/* Standard library function errors. */ -ERRDEF(ASSERT, "assertion failed!") -ERRDEF(PROTMT, "cannot change a protected metatable") -ERRDEF(UNPACK, "too many results to unpack") -ERRDEF(RDRSTR, "reader function must return a string") -ERRDEF(PRTOSTR, LUA_QL("tostring") " must return a string to " LUA_QL("print")) -ERRDEF(IDXRNG, "index out of range") -ERRDEF(BASERNG, "base out of range") -ERRDEF(LVLRNG, "level out of range") -ERRDEF(INVLVL, "invalid level") -ERRDEF(INVOPT, "invalid option") -ERRDEF(INVOPTM, "invalid option " LUA_QS) -ERRDEF(INVFMT, "invalid format") -ERRDEF(SETFENV, LUA_QL("setfenv") " cannot change environment of given object") -ERRDEF(CORUN, "cannot resume running coroutine") -ERRDEF(CODEAD, "cannot resume dead coroutine") -ERRDEF(COSUSP, "cannot resume non-suspended coroutine") -ERRDEF(TABINS, "wrong number of arguments to " LUA_QL("insert")) -ERRDEF(TABCAT, "invalid value (%s) at index %d in table for " LUA_QL("concat")) -ERRDEF(TABSORT, "invalid order function for sorting") -ERRDEF(IOCLFL, "attempt to use a closed file") -ERRDEF(IOSTDCL, "standard file is closed") -ERRDEF(OSUNIQF, "unable to generate a unique filename") -ERRDEF(OSDATEF, "field " LUA_QS " missing in date table") -ERRDEF(STRDUMP, "unable to dump given function") -ERRDEF(STRSLC, "string slice too long") -ERRDEF(STRPATB, "missing " LUA_QL("[") " after " LUA_QL("%f") " in pattern") -ERRDEF(STRPATC, "invalid pattern capture") -ERRDEF(STRPATE, "malformed pattern (ends with " LUA_QL("%") ")") -ERRDEF(STRPATM, "malformed pattern (missing " LUA_QL("]") ")") -ERRDEF(STRPATU, "unbalanced pattern") -ERRDEF(STRPATX, "pattern too complex") -ERRDEF(STRCAPI, "invalid capture index") -ERRDEF(STRCAPN, "too many captures") -ERRDEF(STRCAPU, "unfinished capture") -ERRDEF(STRFMTO, "invalid option " LUA_QL("%%%c") " to " LUA_QL("format")) -ERRDEF(STRFMTR, "invalid format (repeated flags)") -ERRDEF(STRFMTW, "invalid format (width or precision too long)") -ERRDEF(STRGSRV, "invalid replacement value (a %s)") -ERRDEF(BADMODN, "name conflict for module " LUA_QS) -#if LJ_HASJIT -ERRDEF(JITPROT, "runtime code generation failed, restricted kernel?") -#if LJ_TARGET_X86ORX64 -ERRDEF(NOJIT, "JIT compiler disabled, CPU does not support SSE2") -#else -ERRDEF(NOJIT, "JIT compiler disabled") -#endif -#elif defined(LJ_ARCH_NOJIT) -ERRDEF(NOJIT, "no JIT compiler for this architecture (yet)") -#else -ERRDEF(NOJIT, "JIT compiler permanently disabled by build option") -#endif -ERRDEF(JITOPT, "unknown or malformed optimization flag " LUA_QS) - -/* Lexer/parser errors. */ -ERRDEF(XMODE, "attempt to load chunk with wrong mode") -ERRDEF(XNEAR, "%s near " LUA_QS) -ERRDEF(XELEM, "lexical element too long") -ERRDEF(XLINES, "chunk has too many lines") -ERRDEF(XLEVELS, "chunk has too many syntax levels") -ERRDEF(XNUMBER, "malformed number") -ERRDEF(XLSTR, "unfinished long string") -ERRDEF(XLCOM, "unfinished long comment") -ERRDEF(XSTR, "unfinished string") -ERRDEF(XESC, "invalid escape sequence") -ERRDEF(XLDELIM, "invalid long string delimiter") -ERRDEF(XTOKEN, LUA_QS " expected") -ERRDEF(XJUMP, "control structure too long") -ERRDEF(XSLOTS, "function or expression too complex") -ERRDEF(XLIMC, "chunk has more than %d local variables") -ERRDEF(XLIMM, "main function has more than %d %s") -ERRDEF(XLIMF, "function at line %d has more than %d %s") -ERRDEF(XMATCH, LUA_QS " expected (to close " LUA_QS " at line %d)") -ERRDEF(XFIXUP, "function too long for return fixup") -ERRDEF(XPARAM, " or " LUA_QL("...") " expected") -#if !LJ_52 -ERRDEF(XAMBIG, "ambiguous syntax (function call x new statement)") -#endif -ERRDEF(XFUNARG, "function arguments expected") -ERRDEF(XSYMBOL, "unexpected symbol") -ERRDEF(XDOTS, "cannot use " LUA_QL("...") " outside a vararg function") -ERRDEF(XSYNTAX, "syntax error") -ERRDEF(XFOR, LUA_QL("=") " or " LUA_QL("in") " expected") -ERRDEF(XBREAK, "no loop to break") -ERRDEF(XLUNDEF, "undefined label " LUA_QS) -ERRDEF(XLDUP, "duplicate label " LUA_QS) -ERRDEF(XGSCOPE, " jumps into the scope of local " LUA_QS) - -/* Bytecode reader errors. */ -ERRDEF(BCFMT, "cannot load incompatible bytecode") -ERRDEF(BCBAD, "cannot load malformed bytecode") - -#if LJ_HASFFI -/* FFI errors. */ -ERRDEF(FFI_INVTYPE, "invalid C type") -ERRDEF(FFI_INVSIZE, "size of C type is unknown or too large") -ERRDEF(FFI_BADSCL, "bad storage class") -ERRDEF(FFI_DECLSPEC, "declaration specifier expected") -ERRDEF(FFI_BADTAG, "undeclared or implicit tag " LUA_QS) -ERRDEF(FFI_REDEF, "attempt to redefine " LUA_QS) -ERRDEF(FFI_NUMPARAM, "wrong number of type parameters") -ERRDEF(FFI_INITOV, "too many initializers for " LUA_QS) -ERRDEF(FFI_BADCONV, "cannot convert " LUA_QS " to " LUA_QS) -ERRDEF(FFI_BADLEN, "attempt to get length of " LUA_QS) -ERRDEF(FFI_BADCONCAT, "attempt to concatenate " LUA_QS " and " LUA_QS) -ERRDEF(FFI_BADARITH, "attempt to perform arithmetic on " LUA_QS " and " LUA_QS) -ERRDEF(FFI_BADCOMP, "attempt to compare " LUA_QS " with " LUA_QS) -ERRDEF(FFI_BADCALL, LUA_QS " is not callable") -ERRDEF(FFI_NUMARG, "wrong number of arguments for function call") -ERRDEF(FFI_BADMEMBER, LUA_QS " has no member named " LUA_QS) -ERRDEF(FFI_BADIDX, LUA_QS " cannot be indexed") -ERRDEF(FFI_BADIDXW, LUA_QS " cannot be indexed with " LUA_QS) -ERRDEF(FFI_BADMM, LUA_QS " has no " LUA_QS " metamethod") -ERRDEF(FFI_WRCONST, "attempt to write to constant location") -ERRDEF(FFI_NODECL, "missing declaration for symbol " LUA_QS) -ERRDEF(FFI_BADCBACK, "bad callback") -#if LJ_OS_NOJIT -ERRDEF(FFI_CBACKOV, "no support for callbacks on this OS") -#else -ERRDEF(FFI_CBACKOV, "too many callbacks") -#endif -ERRDEF(FFI_NYIPACKBIT, "NYI: packed bit fields") -ERRDEF(FFI_NYICALL, "NYI: cannot call this C function (yet)") -#endif - -#undef ERRDEF - -/* Detecting unused error messages: - awk -F, '/^ERRDEF/ { gsub(/ERRDEF./, ""); printf "grep -q LJ_ERR_%s *.[ch] || echo %s\n", $1, $1}' lj_errmsg.h | sh -*/ diff --git a/deps/luajit/src/lj_ff.h b/deps/luajit/src/lj_ff.h deleted file mode 100644 index 73dad969..00000000 --- a/deps/luajit/src/lj_ff.h +++ /dev/null @@ -1,18 +0,0 @@ -/* -** Fast function IDs. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#ifndef _LJ_FF_H -#define _LJ_FF_H - -/* Fast function ID. */ -typedef enum { - FF_LUA_ = FF_LUA, /* Lua function (must be 0). */ - FF_C_ = FF_C, /* Regular C function (must be 1). */ -#define FFDEF(name) FF_##name, -#include "lj_ffdef.h" - FF__MAX -} FastFunc; - -#endif diff --git a/deps/luajit/src/lj_ffrecord.c b/deps/luajit/src/lj_ffrecord.c deleted file mode 100644 index 69f71ab2..00000000 --- a/deps/luajit/src/lj_ffrecord.c +++ /dev/null @@ -1,888 +0,0 @@ -/* -** Fast function call recorder. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#define lj_ffrecord_c -#define LUA_CORE - -#include "lj_obj.h" - -#if LJ_HASJIT - -#include "lj_err.h" -#include "lj_str.h" -#include "lj_tab.h" -#include "lj_frame.h" -#include "lj_bc.h" -#include "lj_ff.h" -#include "lj_ir.h" -#include "lj_jit.h" -#include "lj_ircall.h" -#include "lj_iropt.h" -#include "lj_trace.h" -#include "lj_record.h" -#include "lj_ffrecord.h" -#include "lj_crecord.h" -#include "lj_dispatch.h" -#include "lj_vm.h" -#include "lj_strscan.h" - -/* Some local macros to save typing. Undef'd at the end. */ -#define IR(ref) (&J->cur.ir[(ref)]) - -/* Pass IR on to next optimization in chain (FOLD). */ -#define emitir(ot, a, b) (lj_ir_set(J, (ot), (a), (b)), lj_opt_fold(J)) - -/* -- Fast function recording handlers ------------------------------------ */ - -/* Conventions for fast function call handlers: -** -** The argument slots start at J->base[0]. All of them are guaranteed to be -** valid and type-specialized references. J->base[J->maxslot] is set to 0 -** as a sentinel. The runtime argument values start at rd->argv[0]. -** -** In general fast functions should check for presence of all of their -** arguments and for the correct argument types. Some simplifications -** are allowed if the interpreter throws instead. But even if recording -** is aborted, the generated IR must be consistent (no zero-refs). -** -** The number of results in rd->nres is set to 1. Handlers that return -** a different number of results need to override it. A negative value -** prevents return processing (e.g. for pending calls). -** -** Results need to be stored starting at J->base[0]. Return processing -** moves them to the right slots later. -** -** The per-ffid auxiliary data is the value of the 2nd part of the -** LJLIB_REC() annotation. This allows handling similar functionality -** in a common handler. -*/ - -/* Type of handler to record a fast function. */ -typedef void (LJ_FASTCALL *RecordFunc)(jit_State *J, RecordFFData *rd); - -/* Get runtime value of int argument. */ -static int32_t argv2int(jit_State *J, TValue *o) -{ - if (!lj_strscan_numberobj(o)) - lj_trace_err(J, LJ_TRERR_BADTYPE); - return tvisint(o) ? intV(o) : lj_num2int(numV(o)); -} - -/* Get runtime value of string argument. */ -static GCstr *argv2str(jit_State *J, TValue *o) -{ - if (LJ_LIKELY(tvisstr(o))) { - return strV(o); - } else { - GCstr *s; - if (!tvisnumber(o)) - lj_trace_err(J, LJ_TRERR_BADTYPE); - if (tvisint(o)) - s = lj_str_fromint(J->L, intV(o)); - else - s = lj_str_fromnum(J->L, &o->n); - setstrV(J->L, o, s); - return s; - } -} - -/* Return number of results wanted by caller. */ -static ptrdiff_t results_wanted(jit_State *J) -{ - TValue *frame = J->L->base-1; - if (frame_islua(frame)) - return (ptrdiff_t)bc_b(frame_pc(frame)[-1]) - 1; - else - return -1; -} - -/* Throw error for unsupported variant of fast function. */ -LJ_NORET static void recff_nyiu(jit_State *J) -{ - setfuncV(J->L, &J->errinfo, J->fn); - lj_trace_err_info(J, LJ_TRERR_NYIFFU); -} - -/* Fallback handler for all fast functions that are not recorded (yet). */ -static void LJ_FASTCALL recff_nyi(jit_State *J, RecordFFData *rd) -{ - setfuncV(J->L, &J->errinfo, J->fn); - lj_trace_err_info(J, LJ_TRERR_NYIFF); - UNUSED(rd); -} - -/* C functions can have arbitrary side-effects and are not recorded (yet). */ -static void LJ_FASTCALL recff_c(jit_State *J, RecordFFData *rd) -{ - setfuncV(J->L, &J->errinfo, J->fn); - lj_trace_err_info(J, LJ_TRERR_NYICF); - UNUSED(rd); -} - -/* -- Base library fast functions ----------------------------------------- */ - -static void LJ_FASTCALL recff_assert(jit_State *J, RecordFFData *rd) -{ - /* Arguments already specialized. The interpreter throws for nil/false. */ - rd->nres = J->maxslot; /* Pass through all arguments. */ -} - -static void LJ_FASTCALL recff_type(jit_State *J, RecordFFData *rd) -{ - /* Arguments already specialized. Result is a constant string. Neat, huh? */ - uint32_t t; - if (tvisnumber(&rd->argv[0])) - t = ~LJ_TNUMX; - else if (LJ_64 && tvislightud(&rd->argv[0])) - t = ~LJ_TLIGHTUD; - else - t = ~itype(&rd->argv[0]); - J->base[0] = lj_ir_kstr(J, strV(&J->fn->c.upvalue[t])); - UNUSED(rd); -} - -static void LJ_FASTCALL recff_getmetatable(jit_State *J, RecordFFData *rd) -{ - TRef tr = J->base[0]; - if (tr) { - RecordIndex ix; - ix.tab = tr; - copyTV(J->L, &ix.tabv, &rd->argv[0]); - if (lj_record_mm_lookup(J, &ix, MM_metatable)) - J->base[0] = ix.mobj; - else - J->base[0] = ix.mt; - } /* else: Interpreter will throw. */ -} - -static void LJ_FASTCALL recff_setmetatable(jit_State *J, RecordFFData *rd) -{ - TRef tr = J->base[0]; - TRef mt = J->base[1]; - if (tref_istab(tr) && (tref_istab(mt) || (mt && tref_isnil(mt)))) { - TRef fref, mtref; - RecordIndex ix; - ix.tab = tr; - copyTV(J->L, &ix.tabv, &rd->argv[0]); - lj_record_mm_lookup(J, &ix, MM_metatable); /* Guard for no __metatable. */ - fref = emitir(IRT(IR_FREF, IRT_P32), tr, IRFL_TAB_META); - mtref = tref_isnil(mt) ? lj_ir_knull(J, IRT_TAB) : mt; - emitir(IRT(IR_FSTORE, IRT_TAB), fref, mtref); - if (!tref_isnil(mt)) - emitir(IRT(IR_TBAR, IRT_TAB), tr, 0); - J->base[0] = tr; - J->needsnap = 1; - } /* else: Interpreter will throw. */ -} - -static void LJ_FASTCALL recff_rawget(jit_State *J, RecordFFData *rd) -{ - RecordIndex ix; - ix.tab = J->base[0]; ix.key = J->base[1]; - if (tref_istab(ix.tab) && ix.key) { - ix.val = 0; ix.idxchain = 0; - settabV(J->L, &ix.tabv, tabV(&rd->argv[0])); - copyTV(J->L, &ix.keyv, &rd->argv[1]); - J->base[0] = lj_record_idx(J, &ix); - } /* else: Interpreter will throw. */ -} - -static void LJ_FASTCALL recff_rawset(jit_State *J, RecordFFData *rd) -{ - RecordIndex ix; - ix.tab = J->base[0]; ix.key = J->base[1]; ix.val = J->base[2]; - if (tref_istab(ix.tab) && ix.key && ix.val) { - ix.idxchain = 0; - settabV(J->L, &ix.tabv, tabV(&rd->argv[0])); - copyTV(J->L, &ix.keyv, &rd->argv[1]); - copyTV(J->L, &ix.valv, &rd->argv[2]); - lj_record_idx(J, &ix); - /* Pass through table at J->base[0] as result. */ - } /* else: Interpreter will throw. */ -} - -static void LJ_FASTCALL recff_rawequal(jit_State *J, RecordFFData *rd) -{ - TRef tra = J->base[0]; - TRef trb = J->base[1]; - if (tra && trb) { - int diff = lj_record_objcmp(J, tra, trb, &rd->argv[0], &rd->argv[1]); - J->base[0] = diff ? TREF_FALSE : TREF_TRUE; - } /* else: Interpreter will throw. */ -} - -#if LJ_52 -static void LJ_FASTCALL recff_rawlen(jit_State *J, RecordFFData *rd) -{ - TRef tr = J->base[0]; - if (tref_isstr(tr)) - J->base[0] = emitir(IRTI(IR_FLOAD), tr, IRFL_STR_LEN); - else if (tref_istab(tr)) - J->base[0] = lj_ir_call(J, IRCALL_lj_tab_len, tr); - /* else: Interpreter will throw. */ - UNUSED(rd); -} -#endif - -/* Determine mode of select() call. */ -int32_t lj_ffrecord_select_mode(jit_State *J, TRef tr, TValue *tv) -{ - if (tref_isstr(tr) && *strVdata(tv) == '#') { /* select('#', ...) */ - if (strV(tv)->len == 1) { - emitir(IRTG(IR_EQ, IRT_STR), tr, lj_ir_kstr(J, strV(tv))); - } else { - TRef trptr = emitir(IRT(IR_STRREF, IRT_P32), tr, lj_ir_kint(J, 0)); - TRef trchar = emitir(IRT(IR_XLOAD, IRT_U8), trptr, IRXLOAD_READONLY); - emitir(IRTG(IR_EQ, IRT_INT), trchar, lj_ir_kint(J, '#')); - } - return 0; - } else { /* select(n, ...) */ - int32_t start = argv2int(J, tv); - if (start == 0) lj_trace_err(J, LJ_TRERR_BADTYPE); /* A bit misleading. */ - return start; - } -} - -static void LJ_FASTCALL recff_select(jit_State *J, RecordFFData *rd) -{ - TRef tr = J->base[0]; - if (tr) { - ptrdiff_t start = lj_ffrecord_select_mode(J, tr, &rd->argv[0]); - if (start == 0) { /* select('#', ...) */ - J->base[0] = lj_ir_kint(J, J->maxslot - 1); - } else if (tref_isk(tr)) { /* select(k, ...) */ - ptrdiff_t n = (ptrdiff_t)J->maxslot; - if (start < 0) start += n; - else if (start > n) start = n; - rd->nres = n - start; - if (start >= 1) { - ptrdiff_t i; - for (i = 0; i < n - start; i++) - J->base[i] = J->base[start+i]; - } /* else: Interpreter will throw. */ - } else { - recff_nyiu(J); - } - } /* else: Interpreter will throw. */ -} - -static void LJ_FASTCALL recff_tonumber(jit_State *J, RecordFFData *rd) -{ - TRef tr = J->base[0]; - TRef base = J->base[1]; - if (tr && !tref_isnil(base)) { - base = lj_opt_narrow_toint(J, base); - if (!tref_isk(base) || IR(tref_ref(base))->i != 10) - recff_nyiu(J); - } - if (tref_isnumber_str(tr)) { - if (tref_isstr(tr)) { - TValue tmp; - if (!lj_strscan_num(strV(&rd->argv[0]), &tmp)) - recff_nyiu(J); /* Would need an inverted STRTO for this case. */ - tr = emitir(IRTG(IR_STRTO, IRT_NUM), tr, 0); - } -#if LJ_HASFFI - } else if (tref_iscdata(tr)) { - lj_crecord_tonumber(J, rd); - return; -#endif - } else { - tr = TREF_NIL; - } - J->base[0] = tr; - UNUSED(rd); -} - -static TValue *recff_metacall_cp(lua_State *L, lua_CFunction dummy, void *ud) -{ - jit_State *J = (jit_State *)ud; - lj_record_tailcall(J, 0, 1); - UNUSED(L); UNUSED(dummy); - return NULL; -} - -static int recff_metacall(jit_State *J, RecordFFData *rd, MMS mm) -{ - RecordIndex ix; - ix.tab = J->base[0]; - copyTV(J->L, &ix.tabv, &rd->argv[0]); - if (lj_record_mm_lookup(J, &ix, mm)) { /* Has metamethod? */ - int errcode; - TValue argv0; - /* Temporarily insert metamethod below object. */ - J->base[1] = J->base[0]; - J->base[0] = ix.mobj; - copyTV(J->L, &argv0, &rd->argv[0]); - copyTV(J->L, &rd->argv[1], &rd->argv[0]); - copyTV(J->L, &rd->argv[0], &ix.mobjv); - /* Need to protect lj_record_tailcall because it may throw. */ - errcode = lj_vm_cpcall(J->L, NULL, J, recff_metacall_cp); - /* Always undo Lua stack changes to avoid confusing the interpreter. */ - copyTV(J->L, &rd->argv[0], &argv0); - if (errcode) - lj_err_throw(J->L, errcode); /* Propagate errors. */ - rd->nres = -1; /* Pending call. */ - return 1; /* Tailcalled to metamethod. */ - } - return 0; -} - -static void LJ_FASTCALL recff_tostring(jit_State *J, RecordFFData *rd) -{ - TRef tr = J->base[0]; - if (tref_isstr(tr)) { - /* Ignore __tostring in the string base metatable. */ - /* Pass on result in J->base[0]. */ - } else if (!recff_metacall(J, rd, MM_tostring)) { - if (tref_isnumber(tr)) { - J->base[0] = emitir(IRT(IR_TOSTR, IRT_STR), tr, 0); - } else if (tref_ispri(tr)) { - J->base[0] = lj_ir_kstr(J, strV(&J->fn->c.upvalue[tref_type(tr)])); - } else { - recff_nyiu(J); - } - } -} - -static void LJ_FASTCALL recff_ipairs_aux(jit_State *J, RecordFFData *rd) -{ - RecordIndex ix; - ix.tab = J->base[0]; - if (tref_istab(ix.tab)) { - if (!tvisnumber(&rd->argv[1])) /* No support for string coercion. */ - lj_trace_err(J, LJ_TRERR_BADTYPE); - setintV(&ix.keyv, numberVint(&rd->argv[1])+1); - settabV(J->L, &ix.tabv, tabV(&rd->argv[0])); - ix.val = 0; ix.idxchain = 0; - ix.key = lj_opt_narrow_toint(J, J->base[1]); - J->base[0] = ix.key = emitir(IRTI(IR_ADD), ix.key, lj_ir_kint(J, 1)); - J->base[1] = lj_record_idx(J, &ix); - rd->nres = tref_isnil(J->base[1]) ? 0 : 2; - } /* else: Interpreter will throw. */ -} - -static void LJ_FASTCALL recff_ipairs(jit_State *J, RecordFFData *rd) -{ - if (!(LJ_52 && recff_metacall(J, rd, MM_ipairs))) { - TRef tab = J->base[0]; - if (tref_istab(tab)) { - J->base[0] = lj_ir_kfunc(J, funcV(&J->fn->c.upvalue[0])); - J->base[1] = tab; - J->base[2] = lj_ir_kint(J, 0); - rd->nres = 3; - } /* else: Interpreter will throw. */ - } -} - -static void LJ_FASTCALL recff_pcall(jit_State *J, RecordFFData *rd) -{ - if (J->maxslot >= 1) { - lj_record_call(J, 0, J->maxslot - 1); - rd->nres = -1; /* Pending call. */ - } /* else: Interpreter will throw. */ -} - -static TValue *recff_xpcall_cp(lua_State *L, lua_CFunction dummy, void *ud) -{ - jit_State *J = (jit_State *)ud; - lj_record_call(J, 1, J->maxslot - 2); - UNUSED(L); UNUSED(dummy); - return NULL; -} - -static void LJ_FASTCALL recff_xpcall(jit_State *J, RecordFFData *rd) -{ - if (J->maxslot >= 2) { - TValue argv0, argv1; - TRef tmp; - int errcode; - /* Swap function and traceback. */ - tmp = J->base[0]; J->base[0] = J->base[1]; J->base[1] = tmp; - copyTV(J->L, &argv0, &rd->argv[0]); - copyTV(J->L, &argv1, &rd->argv[1]); - copyTV(J->L, &rd->argv[0], &argv1); - copyTV(J->L, &rd->argv[1], &argv0); - /* Need to protect lj_record_call because it may throw. */ - errcode = lj_vm_cpcall(J->L, NULL, J, recff_xpcall_cp); - /* Always undo Lua stack swap to avoid confusing the interpreter. */ - copyTV(J->L, &rd->argv[0], &argv0); - copyTV(J->L, &rd->argv[1], &argv1); - if (errcode) - lj_err_throw(J->L, errcode); /* Propagate errors. */ - rd->nres = -1; /* Pending call. */ - } /* else: Interpreter will throw. */ -} - -/* -- Math library fast functions ----------------------------------------- */ - -static void LJ_FASTCALL recff_math_abs(jit_State *J, RecordFFData *rd) -{ - TRef tr = lj_ir_tonum(J, J->base[0]); - J->base[0] = emitir(IRTN(IR_ABS), tr, lj_ir_knum_abs(J)); - UNUSED(rd); -} - -/* Record rounding functions math.floor and math.ceil. */ -static void LJ_FASTCALL recff_math_round(jit_State *J, RecordFFData *rd) -{ - TRef tr = J->base[0]; - if (!tref_isinteger(tr)) { /* Pass through integers unmodified. */ - tr = emitir(IRTN(IR_FPMATH), lj_ir_tonum(J, tr), rd->data); - /* Result is integral (or NaN/Inf), but may not fit an int32_t. */ - if (LJ_DUALNUM) { /* Try to narrow using a guarded conversion to int. */ - lua_Number n = lj_vm_foldfpm(numberVnum(&rd->argv[0]), rd->data); - if (n == (lua_Number)lj_num2int(n)) - tr = emitir(IRTGI(IR_CONV), tr, IRCONV_INT_NUM|IRCONV_CHECK); - } - J->base[0] = tr; - } -} - -/* Record unary math.* functions, mapped to IR_FPMATH opcode. */ -static void LJ_FASTCALL recff_math_unary(jit_State *J, RecordFFData *rd) -{ - J->base[0] = emitir(IRTN(IR_FPMATH), lj_ir_tonum(J, J->base[0]), rd->data); -} - -/* Record math.log. */ -static void LJ_FASTCALL recff_math_log(jit_State *J, RecordFFData *rd) -{ - TRef tr = lj_ir_tonum(J, J->base[0]); - if (J->base[1]) { -#ifdef LUAJIT_NO_LOG2 - uint32_t fpm = IRFPM_LOG; -#else - uint32_t fpm = IRFPM_LOG2; -#endif - TRef trb = lj_ir_tonum(J, J->base[1]); - tr = emitir(IRTN(IR_FPMATH), tr, fpm); - trb = emitir(IRTN(IR_FPMATH), trb, fpm); - trb = emitir(IRTN(IR_DIV), lj_ir_knum_one(J), trb); - tr = emitir(IRTN(IR_MUL), tr, trb); - } else { - tr = emitir(IRTN(IR_FPMATH), tr, IRFPM_LOG); - } - J->base[0] = tr; - UNUSED(rd); -} - -/* Record math.atan2. */ -static void LJ_FASTCALL recff_math_atan2(jit_State *J, RecordFFData *rd) -{ - TRef tr = lj_ir_tonum(J, J->base[0]); - TRef tr2 = lj_ir_tonum(J, J->base[1]); - J->base[0] = emitir(IRTN(IR_ATAN2), tr, tr2); - UNUSED(rd); -} - -/* Record math.ldexp. */ -static void LJ_FASTCALL recff_math_ldexp(jit_State *J, RecordFFData *rd) -{ - TRef tr = lj_ir_tonum(J, J->base[0]); -#if LJ_TARGET_X86ORX64 - TRef tr2 = lj_ir_tonum(J, J->base[1]); -#else - TRef tr2 = lj_opt_narrow_toint(J, J->base[1]); -#endif - J->base[0] = emitir(IRTN(IR_LDEXP), tr, tr2); - UNUSED(rd); -} - -/* Record math.asin, math.acos, math.atan. */ -static void LJ_FASTCALL recff_math_atrig(jit_State *J, RecordFFData *rd) -{ - TRef y = lj_ir_tonum(J, J->base[0]); - TRef x = lj_ir_knum_one(J); - uint32_t ffid = rd->data; - if (ffid != FF_math_atan) { - TRef tmp = emitir(IRTN(IR_MUL), y, y); - tmp = emitir(IRTN(IR_SUB), x, tmp); - tmp = emitir(IRTN(IR_FPMATH), tmp, IRFPM_SQRT); - if (ffid == FF_math_asin) { x = tmp; } else { x = y; y = tmp; } - } - J->base[0] = emitir(IRTN(IR_ATAN2), y, x); -} - -static void LJ_FASTCALL recff_math_htrig(jit_State *J, RecordFFData *rd) -{ - TRef tr = lj_ir_tonum(J, J->base[0]); - J->base[0] = emitir(IRTN(IR_CALLN), tr, rd->data); -} - -static void LJ_FASTCALL recff_math_modf(jit_State *J, RecordFFData *rd) -{ - TRef tr = J->base[0]; - if (tref_isinteger(tr)) { - J->base[0] = tr; - J->base[1] = lj_ir_kint(J, 0); - } else { - TRef trt; - tr = lj_ir_tonum(J, tr); - trt = emitir(IRTN(IR_FPMATH), tr, IRFPM_TRUNC); - J->base[0] = trt; - J->base[1] = emitir(IRTN(IR_SUB), tr, trt); - } - rd->nres = 2; -} - -static void LJ_FASTCALL recff_math_degrad(jit_State *J, RecordFFData *rd) -{ - TRef tr = lj_ir_tonum(J, J->base[0]); - TRef trm = lj_ir_knum(J, numV(&J->fn->c.upvalue[0])); - J->base[0] = emitir(IRTN(IR_MUL), tr, trm); - UNUSED(rd); -} - -static void LJ_FASTCALL recff_math_pow(jit_State *J, RecordFFData *rd) -{ - TRef tr = lj_ir_tonum(J, J->base[0]); - if (!tref_isnumber_str(J->base[1])) - lj_trace_err(J, LJ_TRERR_BADTYPE); - J->base[0] = lj_opt_narrow_pow(J, tr, J->base[1], &rd->argv[1]); - UNUSED(rd); -} - -static void LJ_FASTCALL recff_math_minmax(jit_State *J, RecordFFData *rd) -{ - TRef tr = lj_ir_tonumber(J, J->base[0]); - uint32_t op = rd->data; - BCReg i; - for (i = 1; J->base[i] != 0; i++) { - TRef tr2 = lj_ir_tonumber(J, J->base[i]); - IRType t = IRT_INT; - if (!(tref_isinteger(tr) && tref_isinteger(tr2))) { - if (tref_isinteger(tr)) tr = emitir(IRTN(IR_CONV), tr, IRCONV_NUM_INT); - if (tref_isinteger(tr2)) tr2 = emitir(IRTN(IR_CONV), tr2, IRCONV_NUM_INT); - t = IRT_NUM; - } - tr = emitir(IRT(op, t), tr, tr2); - } - J->base[0] = tr; -} - -static void LJ_FASTCALL recff_math_random(jit_State *J, RecordFFData *rd) -{ - GCudata *ud = udataV(&J->fn->c.upvalue[0]); - TRef tr, one; - lj_ir_kgc(J, obj2gco(ud), IRT_UDATA); /* Prevent collection. */ - tr = lj_ir_call(J, IRCALL_lj_math_random_step, lj_ir_kptr(J, uddata(ud))); - one = lj_ir_knum_one(J); - tr = emitir(IRTN(IR_SUB), tr, one); - if (J->base[0]) { - TRef tr1 = lj_ir_tonum(J, J->base[0]); - if (J->base[1]) { /* d = floor(d*(r2-r1+1.0)) + r1 */ - TRef tr2 = lj_ir_tonum(J, J->base[1]); - tr2 = emitir(IRTN(IR_SUB), tr2, tr1); - tr2 = emitir(IRTN(IR_ADD), tr2, one); - tr = emitir(IRTN(IR_MUL), tr, tr2); - tr = emitir(IRTN(IR_FPMATH), tr, IRFPM_FLOOR); - tr = emitir(IRTN(IR_ADD), tr, tr1); - } else { /* d = floor(d*r1) + 1.0 */ - tr = emitir(IRTN(IR_MUL), tr, tr1); - tr = emitir(IRTN(IR_FPMATH), tr, IRFPM_FLOOR); - tr = emitir(IRTN(IR_ADD), tr, one); - } - } - J->base[0] = tr; - UNUSED(rd); -} - -/* -- Bit library fast functions ------------------------------------------ */ - -/* Record unary bit.tobit, bit.bnot, bit.bswap. */ -static void LJ_FASTCALL recff_bit_unary(jit_State *J, RecordFFData *rd) -{ - TRef tr = lj_opt_narrow_tobit(J, J->base[0]); - J->base[0] = (rd->data == IR_TOBIT) ? tr : emitir(IRTI(rd->data), tr, 0); -} - -/* Record N-ary bit.band, bit.bor, bit.bxor. */ -static void LJ_FASTCALL recff_bit_nary(jit_State *J, RecordFFData *rd) -{ - TRef tr = lj_opt_narrow_tobit(J, J->base[0]); - uint32_t op = rd->data; - BCReg i; - for (i = 1; J->base[i] != 0; i++) - tr = emitir(IRTI(op), tr, lj_opt_narrow_tobit(J, J->base[i])); - J->base[0] = tr; -} - -/* Record bit shifts. */ -static void LJ_FASTCALL recff_bit_shift(jit_State *J, RecordFFData *rd) -{ - TRef tr = lj_opt_narrow_tobit(J, J->base[0]); - TRef tsh = lj_opt_narrow_tobit(J, J->base[1]); - IROp op = (IROp)rd->data; - if (!(op < IR_BROL ? LJ_TARGET_MASKSHIFT : LJ_TARGET_MASKROT) && - !tref_isk(tsh)) - tsh = emitir(IRTI(IR_BAND), tsh, lj_ir_kint(J, 31)); -#ifdef LJ_TARGET_UNIFYROT - if (op == (LJ_TARGET_UNIFYROT == 1 ? IR_BROR : IR_BROL)) { - op = LJ_TARGET_UNIFYROT == 1 ? IR_BROL : IR_BROR; - tsh = emitir(IRTI(IR_NEG), tsh, tsh); - } -#endif - J->base[0] = emitir(IRTI(op), tr, tsh); -} - -/* -- String library fast functions --------------------------------------- */ - -static void LJ_FASTCALL recff_string_len(jit_State *J, RecordFFData *rd) -{ - J->base[0] = emitir(IRTI(IR_FLOAD), lj_ir_tostr(J, J->base[0]), IRFL_STR_LEN); - UNUSED(rd); -} - -/* Handle string.byte (rd->data = 0) and string.sub (rd->data = 1). */ -static void LJ_FASTCALL recff_string_range(jit_State *J, RecordFFData *rd) -{ - TRef trstr = lj_ir_tostr(J, J->base[0]); - TRef trlen = emitir(IRTI(IR_FLOAD), trstr, IRFL_STR_LEN); - TRef tr0 = lj_ir_kint(J, 0); - TRef trstart, trend; - GCstr *str = argv2str(J, &rd->argv[0]); - int32_t start, end; - if (rd->data) { /* string.sub(str, start [,end]) */ - start = argv2int(J, &rd->argv[1]); - trstart = lj_opt_narrow_toint(J, J->base[1]); - trend = J->base[2]; - if (tref_isnil(trend)) { - trend = lj_ir_kint(J, -1); - end = -1; - } else { - trend = lj_opt_narrow_toint(J, trend); - end = argv2int(J, &rd->argv[2]); - } - } else { /* string.byte(str, [,start [,end]]) */ - if (tref_isnil(J->base[1])) { - start = 1; - trstart = lj_ir_kint(J, 1); - } else { - start = argv2int(J, &rd->argv[1]); - trstart = lj_opt_narrow_toint(J, J->base[1]); - } - if (J->base[1] && !tref_isnil(J->base[2])) { - trend = lj_opt_narrow_toint(J, J->base[2]); - end = argv2int(J, &rd->argv[2]); - } else { - trend = trstart; - end = start; - } - } - if (end < 0) { - emitir(IRTGI(IR_LT), trend, tr0); - trend = emitir(IRTI(IR_ADD), emitir(IRTI(IR_ADD), trlen, trend), - lj_ir_kint(J, 1)); - end = end+(int32_t)str->len+1; - } else if ((MSize)end <= str->len) { - emitir(IRTGI(IR_ULE), trend, trlen); - } else { - emitir(IRTGI(IR_GT), trend, trlen); - end = (int32_t)str->len; - trend = trlen; - } - if (start < 0) { - emitir(IRTGI(IR_LT), trstart, tr0); - trstart = emitir(IRTI(IR_ADD), trlen, trstart); - start = start+(int32_t)str->len; - emitir(start < 0 ? IRTGI(IR_LT) : IRTGI(IR_GE), trstart, tr0); - if (start < 0) { - trstart = tr0; - start = 0; - } - } else { - if (start == 0) { - emitir(IRTGI(IR_EQ), trstart, tr0); - trstart = tr0; - } else { - trstart = emitir(IRTI(IR_ADD), trstart, lj_ir_kint(J, -1)); - emitir(IRTGI(IR_GE), trstart, tr0); - start--; - } - } - if (rd->data) { /* Return string.sub result. */ - if (end - start >= 0) { - /* Also handle empty range here, to avoid extra traces. */ - TRef trptr, trslen = emitir(IRTI(IR_SUB), trend, trstart); - emitir(IRTGI(IR_GE), trslen, tr0); - trptr = emitir(IRT(IR_STRREF, IRT_P32), trstr, trstart); - J->base[0] = emitir(IRT(IR_SNEW, IRT_STR), trptr, trslen); - } else { /* Range underflow: return empty string. */ - emitir(IRTGI(IR_LT), trend, trstart); - J->base[0] = lj_ir_kstr(J, lj_str_new(J->L, strdata(str), 0)); - } - } else { /* Return string.byte result(s). */ - ptrdiff_t i, len = end - start; - if (len > 0) { - TRef trslen = emitir(IRTI(IR_SUB), trend, trstart); - emitir(IRTGI(IR_EQ), trslen, lj_ir_kint(J, (int32_t)len)); - if (J->baseslot + len > LJ_MAX_JSLOTS) - lj_trace_err_info(J, LJ_TRERR_STACKOV); - rd->nres = len; - for (i = 0; i < len; i++) { - TRef tmp = emitir(IRTI(IR_ADD), trstart, lj_ir_kint(J, (int32_t)i)); - tmp = emitir(IRT(IR_STRREF, IRT_P32), trstr, tmp); - J->base[i] = emitir(IRT(IR_XLOAD, IRT_U8), tmp, IRXLOAD_READONLY); - } - } else { /* Empty range or range underflow: return no results. */ - emitir(IRTGI(IR_LE), trend, trstart); - rd->nres = 0; - } - } -} - -/* -- Table library fast functions ---------------------------------------- */ - -static void LJ_FASTCALL recff_table_getn(jit_State *J, RecordFFData *rd) -{ - if (tref_istab(J->base[0])) - J->base[0] = lj_ir_call(J, IRCALL_lj_tab_len, J->base[0]); - /* else: Interpreter will throw. */ - UNUSED(rd); -} - -static void LJ_FASTCALL recff_table_remove(jit_State *J, RecordFFData *rd) -{ - TRef tab = J->base[0]; - rd->nres = 0; - if (tref_istab(tab)) { - if (tref_isnil(J->base[1])) { /* Simple pop: t[#t] = nil */ - TRef trlen = lj_ir_call(J, IRCALL_lj_tab_len, tab); - GCtab *t = tabV(&rd->argv[0]); - MSize len = lj_tab_len(t); - emitir(IRTGI(len ? IR_NE : IR_EQ), trlen, lj_ir_kint(J, 0)); - if (len) { - RecordIndex ix; - ix.tab = tab; - ix.key = trlen; - settabV(J->L, &ix.tabv, t); - setintV(&ix.keyv, len); - ix.idxchain = 0; - if (results_wanted(J) != 0) { /* Specialize load only if needed. */ - ix.val = 0; - J->base[0] = lj_record_idx(J, &ix); /* Load previous value. */ - rd->nres = 1; - /* Assumes ix.key/ix.tab is not modified for raw lj_record_idx(). */ - } - ix.val = TREF_NIL; - lj_record_idx(J, &ix); /* Remove value. */ - } - } else { /* Complex case: remove in the middle. */ - recff_nyiu(J); - } - } /* else: Interpreter will throw. */ -} - -static void LJ_FASTCALL recff_table_insert(jit_State *J, RecordFFData *rd) -{ - RecordIndex ix; - ix.tab = J->base[0]; - ix.val = J->base[1]; - rd->nres = 0; - if (tref_istab(ix.tab) && ix.val) { - if (!J->base[2]) { /* Simple push: t[#t+1] = v */ - TRef trlen = lj_ir_call(J, IRCALL_lj_tab_len, ix.tab); - GCtab *t = tabV(&rd->argv[0]); - ix.key = emitir(IRTI(IR_ADD), trlen, lj_ir_kint(J, 1)); - settabV(J->L, &ix.tabv, t); - setintV(&ix.keyv, lj_tab_len(t) + 1); - ix.idxchain = 0; - lj_record_idx(J, &ix); /* Set new value. */ - } else { /* Complex case: insert in the middle. */ - recff_nyiu(J); - } - } /* else: Interpreter will throw. */ -} - -/* -- I/O library fast functions ------------------------------------------ */ - -/* Get FILE* for I/O function. Any I/O error aborts recording, so there's -** no need to encode the alternate cases for any of the guards. -*/ -static TRef recff_io_fp(jit_State *J, TRef *udp, int32_t id) -{ - TRef tr, ud, fp; - if (id) { /* io.func() */ - tr = lj_ir_kptr(J, &J2G(J)->gcroot[id]); - ud = emitir(IRT(IR_XLOAD, IRT_UDATA), tr, 0); - } else { /* fp:method() */ - ud = J->base[0]; - if (!tref_isudata(ud)) - lj_trace_err(J, LJ_TRERR_BADTYPE); - tr = emitir(IRT(IR_FLOAD, IRT_U8), ud, IRFL_UDATA_UDTYPE); - emitir(IRTGI(IR_EQ), tr, lj_ir_kint(J, UDTYPE_IO_FILE)); - } - *udp = ud; - fp = emitir(IRT(IR_FLOAD, IRT_PTR), ud, IRFL_UDATA_FILE); - emitir(IRTG(IR_NE, IRT_PTR), fp, lj_ir_knull(J, IRT_PTR)); - return fp; -} - -static void LJ_FASTCALL recff_io_write(jit_State *J, RecordFFData *rd) -{ - TRef ud, fp = recff_io_fp(J, &ud, rd->data); - TRef zero = lj_ir_kint(J, 0); - TRef one = lj_ir_kint(J, 1); - ptrdiff_t i = rd->data == 0 ? 1 : 0; - for (; J->base[i]; i++) { - TRef str = lj_ir_tostr(J, J->base[i]); - TRef buf = emitir(IRT(IR_STRREF, IRT_P32), str, zero); - TRef len = emitir(IRTI(IR_FLOAD), str, IRFL_STR_LEN); - if (tref_isk(len) && IR(tref_ref(len))->i == 1) { - TRef tr = emitir(IRT(IR_XLOAD, IRT_U8), buf, IRXLOAD_READONLY); - tr = lj_ir_call(J, IRCALL_fputc, tr, fp); - if (results_wanted(J) != 0) /* Check result only if not ignored. */ - emitir(IRTGI(IR_NE), tr, lj_ir_kint(J, -1)); - } else { - TRef tr = lj_ir_call(J, IRCALL_fwrite, buf, one, len, fp); - if (results_wanted(J) != 0) /* Check result only if not ignored. */ - emitir(IRTGI(IR_EQ), tr, len); - } - } - J->base[0] = LJ_52 ? ud : TREF_TRUE; -} - -static void LJ_FASTCALL recff_io_flush(jit_State *J, RecordFFData *rd) -{ - TRef ud, fp = recff_io_fp(J, &ud, rd->data); - TRef tr = lj_ir_call(J, IRCALL_fflush, fp); - if (results_wanted(J) != 0) /* Check result only if not ignored. */ - emitir(IRTGI(IR_EQ), tr, lj_ir_kint(J, 0)); - J->base[0] = TREF_TRUE; -} - -/* -- Record calls to fast functions -------------------------------------- */ - -#include "lj_recdef.h" - -static uint32_t recdef_lookup(GCfunc *fn) -{ - if (fn->c.ffid < sizeof(recff_idmap)/sizeof(recff_idmap[0])) - return recff_idmap[fn->c.ffid]; - else - return 0; -} - -/* Record entry to a fast function or C function. */ -void lj_ffrecord_func(jit_State *J) -{ - RecordFFData rd; - uint32_t m = recdef_lookup(J->fn); - rd.data = m & 0xff; - rd.nres = 1; /* Default is one result. */ - rd.argv = J->L->base; - J->base[J->maxslot] = 0; /* Mark end of arguments. */ - (recff_func[m >> 8])(J, &rd); /* Call recff_* handler. */ - if (rd.nres >= 0) { - if (J->postproc == LJ_POST_NONE) J->postproc = LJ_POST_FFRETRY; - lj_record_ret(J, 0, rd.nres); - } -} - -#undef IR -#undef emitir - -#endif diff --git a/deps/luajit/src/lj_ffrecord.h b/deps/luajit/src/lj_ffrecord.h deleted file mode 100644 index f858ca29..00000000 --- a/deps/luajit/src/lj_ffrecord.h +++ /dev/null @@ -1,24 +0,0 @@ -/* -** Fast function call recorder. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#ifndef _LJ_FFRECORD_H -#define _LJ_FFRECORD_H - -#include "lj_obj.h" -#include "lj_jit.h" - -#if LJ_HASJIT -/* Data used by handlers to record a fast function. */ -typedef struct RecordFFData { - TValue *argv; /* Runtime argument values. */ - ptrdiff_t nres; /* Number of returned results (defaults to 1). */ - uint32_t data; /* Per-ffid auxiliary data (opcode, literal etc.). */ -} RecordFFData; - -LJ_FUNC int32_t lj_ffrecord_select_mode(jit_State *J, TRef tr, TValue *tv); -LJ_FUNC void lj_ffrecord_func(jit_State *J); -#endif - -#endif diff --git a/deps/luajit/src/lj_frame.h b/deps/luajit/src/lj_frame.h deleted file mode 100644 index cd57be22..00000000 --- a/deps/luajit/src/lj_frame.h +++ /dev/null @@ -1,183 +0,0 @@ -/* -** Stack frames. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#ifndef _LJ_FRAME_H -#define _LJ_FRAME_H - -#include "lj_obj.h" -#include "lj_bc.h" - -/* -- Lua stack frame ----------------------------------------------------- */ - -/* Frame type markers in callee function slot (callee base-1). */ -enum { - FRAME_LUA, FRAME_C, FRAME_CONT, FRAME_VARG, - FRAME_LUAP, FRAME_CP, FRAME_PCALL, FRAME_PCALLH -}; -#define FRAME_TYPE 3 -#define FRAME_P 4 -#define FRAME_TYPEP (FRAME_TYPE|FRAME_P) - -/* Macros to access and modify Lua frames. */ -#define frame_gc(f) (gcref((f)->fr.func)) -#define frame_func(f) (&frame_gc(f)->fn) -#define frame_ftsz(f) ((f)->fr.tp.ftsz) - -#define frame_type(f) (frame_ftsz(f) & FRAME_TYPE) -#define frame_typep(f) (frame_ftsz(f) & FRAME_TYPEP) -#define frame_islua(f) (frame_type(f) == FRAME_LUA) -#define frame_isc(f) (frame_type(f) == FRAME_C) -#define frame_iscont(f) (frame_typep(f) == FRAME_CONT) -#define frame_isvarg(f) (frame_typep(f) == FRAME_VARG) -#define frame_ispcall(f) ((frame_ftsz(f) & 6) == FRAME_PCALL) - -#define frame_pc(f) (mref((f)->fr.tp.pcr, const BCIns)) -#define frame_contpc(f) (frame_pc((f)-1)) -#if LJ_64 -#define frame_contf(f) \ - ((ASMFunction)(void *)((intptr_t)lj_vm_asm_begin + \ - (intptr_t)(int32_t)((f)-1)->u32.lo)) -#else -#define frame_contf(f) ((ASMFunction)gcrefp(((f)-1)->gcr, void)) -#endif -#define frame_delta(f) (frame_ftsz(f) >> 3) -#define frame_sized(f) (frame_ftsz(f) & ~FRAME_TYPEP) - -#define frame_prevl(f) ((f) - (1+bc_a(frame_pc(f)[-1]))) -#define frame_prevd(f) ((TValue *)((char *)(f) - frame_sized(f))) -#define frame_prev(f) (frame_islua(f)?frame_prevl(f):frame_prevd(f)) -/* Note: this macro does not skip over FRAME_VARG. */ - -#define setframe_pc(f, pc) (setmref((f)->fr.tp.pcr, (pc))) -#define setframe_ftsz(f, sz) ((f)->fr.tp.ftsz = (sz)) -#define setframe_gc(f, p) (setgcref((f)->fr.func, (p))) - -/* -- C stack frame ------------------------------------------------------- */ - -/* Macros to access and modify the C stack frame chain. */ - -/* These definitions must match with the arch-specific *.dasc files. */ -#if LJ_TARGET_X86 -#define CFRAME_OFS_ERRF (15*4) -#define CFRAME_OFS_NRES (14*4) -#define CFRAME_OFS_PREV (13*4) -#define CFRAME_OFS_L (12*4) -#define CFRAME_OFS_PC (6*4) -#define CFRAME_OFS_MULTRES (5*4) -#define CFRAME_SIZE (12*4) -#define CFRAME_SHIFT_MULTRES 0 -#elif LJ_TARGET_X64 -#if LJ_ABI_WIN -#define CFRAME_OFS_PREV (13*8) -#define CFRAME_OFS_PC (25*4) -#define CFRAME_OFS_L (24*4) -#define CFRAME_OFS_ERRF (23*4) -#define CFRAME_OFS_NRES (22*4) -#define CFRAME_OFS_MULTRES (21*4) -#define CFRAME_SIZE (10*8) -#define CFRAME_SIZE_JIT (CFRAME_SIZE + 9*16 + 4*8) -#define CFRAME_SHIFT_MULTRES 0 -#else -#define CFRAME_OFS_PREV (4*8) -#define CFRAME_OFS_PC (7*4) -#define CFRAME_OFS_L (6*4) -#define CFRAME_OFS_ERRF (5*4) -#define CFRAME_OFS_NRES (4*4) -#define CFRAME_OFS_MULTRES (1*4) -#define CFRAME_SIZE (10*8) -#define CFRAME_SIZE_JIT (CFRAME_SIZE + 16) -#define CFRAME_SHIFT_MULTRES 0 -#endif -#elif LJ_TARGET_ARM -#define CFRAME_OFS_ERRF 24 -#define CFRAME_OFS_NRES 20 -#define CFRAME_OFS_PREV 16 -#define CFRAME_OFS_L 12 -#define CFRAME_OFS_PC 8 -#define CFRAME_OFS_MULTRES 4 -#if LJ_ARCH_HASFPU -#define CFRAME_SIZE 128 -#else -#define CFRAME_SIZE 64 -#endif -#define CFRAME_SHIFT_MULTRES 3 -#elif LJ_TARGET_PPC -#if LJ_TARGET_XBOX360 -#define CFRAME_OFS_ERRF 424 -#define CFRAME_OFS_NRES 420 -#define CFRAME_OFS_PREV 400 -#define CFRAME_OFS_L 416 -#define CFRAME_OFS_PC 412 -#define CFRAME_OFS_MULTRES 408 -#define CFRAME_SIZE 384 -#define CFRAME_SHIFT_MULTRES 3 -#elif LJ_ARCH_PPC64 -#define CFRAME_OFS_ERRF 472 -#define CFRAME_OFS_NRES 468 -#define CFRAME_OFS_PREV 448 -#define CFRAME_OFS_L 464 -#define CFRAME_OFS_PC 460 -#define CFRAME_OFS_MULTRES 456 -#define CFRAME_SIZE 400 -#define CFRAME_SHIFT_MULTRES 3 -#else -#define CFRAME_OFS_ERRF 48 -#define CFRAME_OFS_NRES 44 -#define CFRAME_OFS_PREV 40 -#define CFRAME_OFS_L 36 -#define CFRAME_OFS_PC 32 -#define CFRAME_OFS_MULTRES 28 -#define CFRAME_SIZE 272 -#define CFRAME_SHIFT_MULTRES 3 -#endif -#elif LJ_TARGET_PPCSPE -#define CFRAME_OFS_ERRF 28 -#define CFRAME_OFS_NRES 24 -#define CFRAME_OFS_PREV 20 -#define CFRAME_OFS_L 16 -#define CFRAME_OFS_PC 12 -#define CFRAME_OFS_MULTRES 8 -#define CFRAME_SIZE 184 -#define CFRAME_SHIFT_MULTRES 3 -#elif LJ_TARGET_MIPS -#define CFRAME_OFS_ERRF 124 -#define CFRAME_OFS_NRES 120 -#define CFRAME_OFS_PREV 116 -#define CFRAME_OFS_L 112 -#define CFRAME_OFS_PC 20 -#define CFRAME_OFS_MULTRES 16 -#define CFRAME_SIZE 112 -#define CFRAME_SHIFT_MULTRES 3 -#else -#error "Missing CFRAME_* definitions for this architecture" -#endif - -#ifndef CFRAME_SIZE_JIT -#define CFRAME_SIZE_JIT CFRAME_SIZE -#endif - -#define CFRAME_RESUME 1 -#define CFRAME_UNWIND_FF 2 /* Only used in unwinder. */ -#define CFRAME_RAWMASK (~(intptr_t)(CFRAME_RESUME|CFRAME_UNWIND_FF)) - -#define cframe_errfunc(cf) (*(int32_t *)(((char *)(cf))+CFRAME_OFS_ERRF)) -#define cframe_nres(cf) (*(int32_t *)(((char *)(cf))+CFRAME_OFS_NRES)) -#define cframe_prev(cf) (*(void **)(((char *)(cf))+CFRAME_OFS_PREV)) -#define cframe_multres(cf) (*(uint32_t *)(((char *)(cf))+CFRAME_OFS_MULTRES)) -#define cframe_multres_n(cf) (cframe_multres((cf)) >> CFRAME_SHIFT_MULTRES) -#define cframe_L(cf) \ - (&gcref(*(GCRef *)(((char *)(cf))+CFRAME_OFS_L))->th) -#define cframe_pc(cf) \ - (mref(*(MRef *)(((char *)(cf))+CFRAME_OFS_PC), const BCIns)) -#define setcframe_L(cf, L) \ - (setmref(*(MRef *)(((char *)(cf))+CFRAME_OFS_L), (L))) -#define setcframe_pc(cf, pc) \ - (setmref(*(MRef *)(((char *)(cf))+CFRAME_OFS_PC), (pc))) -#define cframe_canyield(cf) ((intptr_t)(cf) & CFRAME_RESUME) -#define cframe_unwind_ff(cf) ((intptr_t)(cf) & CFRAME_UNWIND_FF) -#define cframe_raw(cf) ((void *)((intptr_t)(cf) & CFRAME_RAWMASK)) -#define cframe_Lpc(L) cframe_pc(cframe_raw(L->cframe)) - -#endif diff --git a/deps/luajit/src/lj_func.c b/deps/luajit/src/lj_func.c deleted file mode 100644 index eb8a9dbb..00000000 --- a/deps/luajit/src/lj_func.c +++ /dev/null @@ -1,185 +0,0 @@ -/* -** Function handling (prototypes, functions and upvalues). -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -** -** Portions taken verbatim or adapted from the Lua interpreter. -** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h -*/ - -#define lj_func_c -#define LUA_CORE - -#include "lj_obj.h" -#include "lj_gc.h" -#include "lj_func.h" -#include "lj_trace.h" -#include "lj_vm.h" - -/* -- Prototypes ---------------------------------------------------------- */ - -void LJ_FASTCALL lj_func_freeproto(global_State *g, GCproto *pt) -{ - lj_mem_free(g, pt, pt->sizept); -} - -/* -- Upvalues ------------------------------------------------------------ */ - -static void unlinkuv(GCupval *uv) -{ - lua_assert(uvprev(uvnext(uv)) == uv && uvnext(uvprev(uv)) == uv); - setgcrefr(uvnext(uv)->prev, uv->prev); - setgcrefr(uvprev(uv)->next, uv->next); -} - -/* Find existing open upvalue for a stack slot or create a new one. */ -static GCupval *func_finduv(lua_State *L, TValue *slot) -{ - global_State *g = G(L); - GCRef *pp = &L->openupval; - GCupval *p; - GCupval *uv; - /* Search the sorted list of open upvalues. */ - while (gcref(*pp) != NULL && uvval((p = gco2uv(gcref(*pp)))) >= slot) { - lua_assert(!p->closed && uvval(p) != &p->tv); - if (uvval(p) == slot) { /* Found open upvalue pointing to same slot? */ - if (isdead(g, obj2gco(p))) /* Resurrect it, if it's dead. */ - flipwhite(obj2gco(p)); - return p; - } - pp = &p->nextgc; - } - /* No matching upvalue found. Create a new one. */ - uv = lj_mem_newt(L, sizeof(GCupval), GCupval); - newwhite(g, uv); - uv->gct = ~LJ_TUPVAL; - uv->closed = 0; /* Still open. */ - setmref(uv->v, slot); /* Pointing to the stack slot. */ - /* NOBARRIER: The GCupval is new (marked white) and open. */ - setgcrefr(uv->nextgc, *pp); /* Insert into sorted list of open upvalues. */ - setgcref(*pp, obj2gco(uv)); - setgcref(uv->prev, obj2gco(&g->uvhead)); /* Insert into GC list, too. */ - setgcrefr(uv->next, g->uvhead.next); - setgcref(uvnext(uv)->prev, obj2gco(uv)); - setgcref(g->uvhead.next, obj2gco(uv)); - lua_assert(uvprev(uvnext(uv)) == uv && uvnext(uvprev(uv)) == uv); - return uv; -} - -/* Create an empty and closed upvalue. */ -static GCupval *func_emptyuv(lua_State *L) -{ - GCupval *uv = (GCupval *)lj_mem_newgco(L, sizeof(GCupval)); - uv->gct = ~LJ_TUPVAL; - uv->closed = 1; - setnilV(&uv->tv); - setmref(uv->v, &uv->tv); - return uv; -} - -/* Close all open upvalues pointing to some stack level or above. */ -void LJ_FASTCALL lj_func_closeuv(lua_State *L, TValue *level) -{ - GCupval *uv; - global_State *g = G(L); - while (gcref(L->openupval) != NULL && - uvval((uv = gco2uv(gcref(L->openupval)))) >= level) { - GCobj *o = obj2gco(uv); - lua_assert(!isblack(o) && !uv->closed && uvval(uv) != &uv->tv); - setgcrefr(L->openupval, uv->nextgc); /* No longer in open list. */ - if (isdead(g, o)) { - lj_func_freeuv(g, uv); - } else { - unlinkuv(uv); - lj_gc_closeuv(g, uv); - } - } -} - -void LJ_FASTCALL lj_func_freeuv(global_State *g, GCupval *uv) -{ - if (!uv->closed) - unlinkuv(uv); - lj_mem_freet(g, uv); -} - -/* -- Functions (closures) ------------------------------------------------ */ - -GCfunc *lj_func_newC(lua_State *L, MSize nelems, GCtab *env) -{ - GCfunc *fn = (GCfunc *)lj_mem_newgco(L, sizeCfunc(nelems)); - fn->c.gct = ~LJ_TFUNC; - fn->c.ffid = FF_C; - fn->c.nupvalues = (uint8_t)nelems; - /* NOBARRIER: The GCfunc is new (marked white). */ - setmref(fn->c.pc, &G(L)->bc_cfunc_ext); - setgcref(fn->c.env, obj2gco(env)); - return fn; -} - -static GCfunc *func_newL(lua_State *L, GCproto *pt, GCtab *env) -{ - uint32_t count; - GCfunc *fn = (GCfunc *)lj_mem_newgco(L, sizeLfunc((MSize)pt->sizeuv)); - fn->l.gct = ~LJ_TFUNC; - fn->l.ffid = FF_LUA; - fn->l.nupvalues = 0; /* Set to zero until upvalues are initialized. */ - /* NOBARRIER: Really a setgcref. But the GCfunc is new (marked white). */ - setmref(fn->l.pc, proto_bc(pt)); - setgcref(fn->l.env, obj2gco(env)); - /* Saturating 3 bit counter (0..7) for created closures. */ - count = (uint32_t)pt->flags + PROTO_CLCOUNT; - pt->flags = (uint8_t)(count - ((count >> PROTO_CLC_BITS) & PROTO_CLCOUNT)); - return fn; -} - -/* Create a new Lua function with empty upvalues. */ -GCfunc *lj_func_newL_empty(lua_State *L, GCproto *pt, GCtab *env) -{ - GCfunc *fn = func_newL(L, pt, env); - MSize i, nuv = pt->sizeuv; - /* NOBARRIER: The GCfunc is new (marked white). */ - for (i = 0; i < nuv; i++) { - GCupval *uv = func_emptyuv(L); - uv->dhash = (uint32_t)(uintptr_t)pt ^ ((uint32_t)proto_uv(pt)[i] << 24); - setgcref(fn->l.uvptr[i], obj2gco(uv)); - } - fn->l.nupvalues = (uint8_t)nuv; - return fn; -} - -/* Do a GC check and create a new Lua function with inherited upvalues. */ -GCfunc *lj_func_newL_gc(lua_State *L, GCproto *pt, GCfuncL *parent) -{ - GCfunc *fn; - GCRef *puv; - MSize i, nuv; - TValue *base; - lj_gc_check_fixtop(L); - fn = func_newL(L, pt, tabref(parent->env)); - /* NOBARRIER: The GCfunc is new (marked white). */ - puv = parent->uvptr; - nuv = pt->sizeuv; - base = L->base; - for (i = 0; i < nuv; i++) { - uint32_t v = proto_uv(pt)[i]; - GCupval *uv; - if ((v & PROTO_UV_LOCAL)) { - uv = func_finduv(L, base + (v & 0xff)); - uv->immutable = ((v / PROTO_UV_IMMUTABLE) & 1); - uv->dhash = (uint32_t)(uintptr_t)mref(parent->pc, char) ^ (v << 24); - } else { - uv = &gcref(puv[v])->uv; - } - setgcref(fn->l.uvptr[i], obj2gco(uv)); - } - fn->l.nupvalues = (uint8_t)nuv; - return fn; -} - -void LJ_FASTCALL lj_func_free(global_State *g, GCfunc *fn) -{ - MSize size = isluafunc(fn) ? sizeLfunc((MSize)fn->l.nupvalues) : - sizeCfunc((MSize)fn->c.nupvalues); - lj_mem_free(g, fn, size); -} - diff --git a/deps/luajit/src/lj_func.h b/deps/luajit/src/lj_func.h deleted file mode 100644 index a6e534e7..00000000 --- a/deps/luajit/src/lj_func.h +++ /dev/null @@ -1,24 +0,0 @@ -/* -** Function handling (prototypes, functions and upvalues). -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#ifndef _LJ_FUNC_H -#define _LJ_FUNC_H - -#include "lj_obj.h" - -/* Prototypes. */ -LJ_FUNC void LJ_FASTCALL lj_func_freeproto(global_State *g, GCproto *pt); - -/* Upvalues. */ -LJ_FUNCA void LJ_FASTCALL lj_func_closeuv(lua_State *L, TValue *level); -LJ_FUNC void LJ_FASTCALL lj_func_freeuv(global_State *g, GCupval *uv); - -/* Functions (closures). */ -LJ_FUNC GCfunc *lj_func_newC(lua_State *L, MSize nelems, GCtab *env); -LJ_FUNC GCfunc *lj_func_newL_empty(lua_State *L, GCproto *pt, GCtab *env); -LJ_FUNCA GCfunc *lj_func_newL_gc(lua_State *L, GCproto *pt, GCfuncL *parent); -LJ_FUNC void LJ_FASTCALL lj_func_free(global_State *g, GCfunc *c); - -#endif diff --git a/deps/luajit/src/lj_gc.c b/deps/luajit/src/lj_gc.c deleted file mode 100644 index b498abaa..00000000 --- a/deps/luajit/src/lj_gc.c +++ /dev/null @@ -1,849 +0,0 @@ -/* -** Garbage collector. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -** -** Major portions taken verbatim or adapted from the Lua interpreter. -** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h -*/ - -#define lj_gc_c -#define LUA_CORE - -#include "lj_obj.h" -#include "lj_gc.h" -#include "lj_err.h" -#include "lj_str.h" -#include "lj_tab.h" -#include "lj_func.h" -#include "lj_udata.h" -#include "lj_meta.h" -#include "lj_state.h" -#include "lj_frame.h" -#if LJ_HASFFI -#include "lj_ctype.h" -#include "lj_cdata.h" -#endif -#include "lj_trace.h" -#include "lj_vm.h" - -#define GCSTEPSIZE 1024u -#define GCSWEEPMAX 40 -#define GCSWEEPCOST 10 -#define GCFINALIZECOST 100 - -/* Macros to set GCobj colors and flags. */ -#define white2gray(x) ((x)->gch.marked &= (uint8_t)~LJ_GC_WHITES) -#define gray2black(x) ((x)->gch.marked |= LJ_GC_BLACK) -#define isfinalized(u) ((u)->marked & LJ_GC_FINALIZED) - -/* -- Mark phase ---------------------------------------------------------- */ - -/* Mark a TValue (if needed). */ -#define gc_marktv(g, tv) \ - { lua_assert(!tvisgcv(tv) || (~itype(tv) == gcval(tv)->gch.gct)); \ - if (tviswhite(tv)) gc_mark(g, gcV(tv)); } - -/* Mark a GCobj (if needed). */ -#define gc_markobj(g, o) \ - { if (iswhite(obj2gco(o))) gc_mark(g, obj2gco(o)); } - -/* Mark a string object. */ -#define gc_mark_str(s) ((s)->marked &= (uint8_t)~LJ_GC_WHITES) - -/* Mark a white GCobj. */ -static void gc_mark(global_State *g, GCobj *o) -{ - int gct = o->gch.gct; - lua_assert(iswhite(o) && !isdead(g, o)); - white2gray(o); - if (LJ_UNLIKELY(gct == ~LJ_TUDATA)) { - GCtab *mt = tabref(gco2ud(o)->metatable); - gray2black(o); /* Userdata are never gray. */ - if (mt) gc_markobj(g, mt); - gc_markobj(g, tabref(gco2ud(o)->env)); - } else if (LJ_UNLIKELY(gct == ~LJ_TUPVAL)) { - GCupval *uv = gco2uv(o); - gc_marktv(g, uvval(uv)); - if (uv->closed) - gray2black(o); /* Closed upvalues are never gray. */ - } else if (gct != ~LJ_TSTR && gct != ~LJ_TCDATA) { - lua_assert(gct == ~LJ_TFUNC || gct == ~LJ_TTAB || - gct == ~LJ_TTHREAD || gct == ~LJ_TPROTO); - setgcrefr(o->gch.gclist, g->gc.gray); - setgcref(g->gc.gray, o); - } -} - -/* Mark GC roots. */ -static void gc_mark_gcroot(global_State *g) -{ - ptrdiff_t i; - for (i = 0; i < GCROOT_MAX; i++) - if (gcref(g->gcroot[i]) != NULL) - gc_markobj(g, gcref(g->gcroot[i])); -} - -/* Start a GC cycle and mark the root set. */ -static void gc_mark_start(global_State *g) -{ - setgcrefnull(g->gc.gray); - setgcrefnull(g->gc.grayagain); - setgcrefnull(g->gc.weak); - gc_markobj(g, mainthread(g)); - gc_markobj(g, tabref(mainthread(g)->env)); - gc_marktv(g, &g->registrytv); - gc_mark_gcroot(g); - g->gc.state = GCSpropagate; -} - -/* Mark open upvalues. */ -static void gc_mark_uv(global_State *g) -{ - GCupval *uv; - for (uv = uvnext(&g->uvhead); uv != &g->uvhead; uv = uvnext(uv)) { - lua_assert(uvprev(uvnext(uv)) == uv && uvnext(uvprev(uv)) == uv); - if (isgray(obj2gco(uv))) - gc_marktv(g, uvval(uv)); - } -} - -/* Mark userdata in mmudata list. */ -static void gc_mark_mmudata(global_State *g) -{ - GCobj *root = gcref(g->gc.mmudata); - GCobj *u = root; - if (u) { - do { - u = gcnext(u); - makewhite(g, u); /* Could be from previous GC. */ - gc_mark(g, u); - } while (u != root); - } -} - -/* Separate userdata objects to be finalized to mmudata list. */ -size_t lj_gc_separateudata(global_State *g, int all) -{ - size_t m = 0; - GCRef *p = &mainthread(g)->nextgc; - GCobj *o; - while ((o = gcref(*p)) != NULL) { - if (!(iswhite(o) || all) || isfinalized(gco2ud(o))) { - p = &o->gch.nextgc; /* Nothing to do. */ - } else if (!lj_meta_fastg(g, tabref(gco2ud(o)->metatable), MM_gc)) { - markfinalized(o); /* Done, as there's no __gc metamethod. */ - p = &o->gch.nextgc; - } else { /* Otherwise move userdata to be finalized to mmudata list. */ - m += sizeudata(gco2ud(o)); - markfinalized(o); - *p = o->gch.nextgc; - if (gcref(g->gc.mmudata)) { /* Link to end of mmudata list. */ - GCobj *root = gcref(g->gc.mmudata); - setgcrefr(o->gch.nextgc, root->gch.nextgc); - setgcref(root->gch.nextgc, o); - setgcref(g->gc.mmudata, o); - } else { /* Create circular list. */ - setgcref(o->gch.nextgc, o); - setgcref(g->gc.mmudata, o); - } - } - } - return m; -} - -/* -- Propagation phase --------------------------------------------------- */ - -/* Traverse a table. */ -static int gc_traverse_tab(global_State *g, GCtab *t) -{ - int weak = 0; - cTValue *mode; - GCtab *mt = tabref(t->metatable); - if (mt) - gc_markobj(g, mt); - mode = lj_meta_fastg(g, mt, MM_mode); - if (mode && tvisstr(mode)) { /* Valid __mode field? */ - const char *modestr = strVdata(mode); - int c; - while ((c = *modestr++)) { - if (c == 'k') weak |= LJ_GC_WEAKKEY; - else if (c == 'v') weak |= LJ_GC_WEAKVAL; - else if (c == 'K') weak = (int)(~0u & ~LJ_GC_WEAKVAL); - } - if (weak > 0) { /* Weak tables are cleared in the atomic phase. */ - t->marked = (uint8_t)((t->marked & ~LJ_GC_WEAK) | weak); - setgcrefr(t->gclist, g->gc.weak); - setgcref(g->gc.weak, obj2gco(t)); - } - } - if (weak == LJ_GC_WEAK) /* Nothing to mark if both keys/values are weak. */ - return 1; - if (!(weak & LJ_GC_WEAKVAL)) { /* Mark array part. */ - MSize i, asize = t->asize; - for (i = 0; i < asize; i++) - gc_marktv(g, arrayslot(t, i)); - } - if (t->hmask > 0) { /* Mark hash part. */ - Node *node = noderef(t->node); - MSize i, hmask = t->hmask; - for (i = 0; i <= hmask; i++) { - Node *n = &node[i]; - if (!tvisnil(&n->val)) { /* Mark non-empty slot. */ - lua_assert(!tvisnil(&n->key)); - if (!(weak & LJ_GC_WEAKKEY)) gc_marktv(g, &n->key); - if (!(weak & LJ_GC_WEAKVAL)) gc_marktv(g, &n->val); - } - } - } - return weak; -} - -/* Traverse a function. */ -static void gc_traverse_func(global_State *g, GCfunc *fn) -{ - gc_markobj(g, tabref(fn->c.env)); - if (isluafunc(fn)) { - uint32_t i; - lua_assert(fn->l.nupvalues <= funcproto(fn)->sizeuv); - gc_markobj(g, funcproto(fn)); - for (i = 0; i < fn->l.nupvalues; i++) /* Mark Lua function upvalues. */ - gc_markobj(g, &gcref(fn->l.uvptr[i])->uv); - } else { - uint32_t i; - for (i = 0; i < fn->c.nupvalues; i++) /* Mark C function upvalues. */ - gc_marktv(g, &fn->c.upvalue[i]); - } -} - -#if LJ_HASJIT -/* Mark a trace. */ -static void gc_marktrace(global_State *g, TraceNo traceno) -{ - GCobj *o = obj2gco(traceref(G2J(g), traceno)); - lua_assert(traceno != G2J(g)->cur.traceno); - if (iswhite(o)) { - white2gray(o); - setgcrefr(o->gch.gclist, g->gc.gray); - setgcref(g->gc.gray, o); - } -} - -/* Traverse a trace. */ -static void gc_traverse_trace(global_State *g, GCtrace *T) -{ - IRRef ref; - if (T->traceno == 0) return; - for (ref = T->nk; ref < REF_TRUE; ref++) { - IRIns *ir = &T->ir[ref]; - if (ir->o == IR_KGC) - gc_markobj(g, ir_kgc(ir)); - } - if (T->link) gc_marktrace(g, T->link); - if (T->nextroot) gc_marktrace(g, T->nextroot); - if (T->nextside) gc_marktrace(g, T->nextside); - gc_markobj(g, gcref(T->startpt)); -} - -/* The current trace is a GC root while not anchored in the prototype (yet). */ -#define gc_traverse_curtrace(g) gc_traverse_trace(g, &G2J(g)->cur) -#else -#define gc_traverse_curtrace(g) UNUSED(g) -#endif - -/* Traverse a prototype. */ -static void gc_traverse_proto(global_State *g, GCproto *pt) -{ - ptrdiff_t i; - gc_mark_str(proto_chunkname(pt)); - for (i = -(ptrdiff_t)pt->sizekgc; i < 0; i++) /* Mark collectable consts. */ - gc_markobj(g, proto_kgc(pt, i)); -#if LJ_HASJIT - if (pt->trace) gc_marktrace(g, pt->trace); -#endif -} - -/* Traverse the frame structure of a stack. */ -static MSize gc_traverse_frames(global_State *g, lua_State *th) -{ - TValue *frame, *top = th->top-1, *bot = tvref(th->stack); - /* Note: extra vararg frame not skipped, marks function twice (harmless). */ - for (frame = th->base-1; frame > bot; frame = frame_prev(frame)) { - GCfunc *fn = frame_func(frame); - TValue *ftop = frame; - if (isluafunc(fn)) ftop += funcproto(fn)->framesize; - if (ftop > top) top = ftop; - gc_markobj(g, fn); /* Need to mark hidden function (or L). */ - } - top++; /* Correct bias of -1 (frame == base-1). */ - if (top > tvref(th->maxstack)) top = tvref(th->maxstack); - return (MSize)(top - bot); /* Return minimum needed stack size. */ -} - -/* Traverse a thread object. */ -static void gc_traverse_thread(global_State *g, lua_State *th) -{ - TValue *o, *top = th->top; - for (o = tvref(th->stack)+1; o < top; o++) - gc_marktv(g, o); - if (g->gc.state == GCSatomic) { - top = tvref(th->stack) + th->stacksize; - for (; o < top; o++) /* Clear unmarked slots. */ - setnilV(o); - } - gc_markobj(g, tabref(th->env)); - lj_state_shrinkstack(th, gc_traverse_frames(g, th)); -} - -/* Propagate one gray object. Traverse it and turn it black. */ -static size_t propagatemark(global_State *g) -{ - GCobj *o = gcref(g->gc.gray); - int gct = o->gch.gct; - lua_assert(isgray(o)); - gray2black(o); - setgcrefr(g->gc.gray, o->gch.gclist); /* Remove from gray list. */ - if (LJ_LIKELY(gct == ~LJ_TTAB)) { - GCtab *t = gco2tab(o); - if (gc_traverse_tab(g, t) > 0) - black2gray(o); /* Keep weak tables gray. */ - return sizeof(GCtab) + sizeof(TValue) * t->asize + - sizeof(Node) * (t->hmask + 1); - } else if (LJ_LIKELY(gct == ~LJ_TFUNC)) { - GCfunc *fn = gco2func(o); - gc_traverse_func(g, fn); - return isluafunc(fn) ? sizeLfunc((MSize)fn->l.nupvalues) : - sizeCfunc((MSize)fn->c.nupvalues); - } else if (LJ_LIKELY(gct == ~LJ_TPROTO)) { - GCproto *pt = gco2pt(o); - gc_traverse_proto(g, pt); - return pt->sizept; - } else if (LJ_LIKELY(gct == ~LJ_TTHREAD)) { - lua_State *th = gco2th(o); - setgcrefr(th->gclist, g->gc.grayagain); - setgcref(g->gc.grayagain, o); - black2gray(o); /* Threads are never black. */ - gc_traverse_thread(g, th); - return sizeof(lua_State) + sizeof(TValue) * th->stacksize; - } else { -#if LJ_HASJIT - GCtrace *T = gco2trace(o); - gc_traverse_trace(g, T); - return ((sizeof(GCtrace)+7)&~7) + (T->nins-T->nk)*sizeof(IRIns) + - T->nsnap*sizeof(SnapShot) + T->nsnapmap*sizeof(SnapEntry); -#else - lua_assert(0); - return 0; -#endif - } -} - -/* Propagate all gray objects. */ -static size_t gc_propagate_gray(global_State *g) -{ - size_t m = 0; - while (gcref(g->gc.gray) != NULL) - m += propagatemark(g); - return m; -} - -/* -- Sweep phase --------------------------------------------------------- */ - -/* Try to shrink some common data structures. */ -static void gc_shrink(global_State *g, lua_State *L) -{ - if (g->strnum <= (g->strmask >> 2) && g->strmask > LJ_MIN_STRTAB*2-1) - lj_str_resize(L, g->strmask >> 1); /* Shrink string table. */ - if (g->tmpbuf.sz > LJ_MIN_SBUF*2) - lj_str_resizebuf(L, &g->tmpbuf, g->tmpbuf.sz >> 1); /* Shrink temp buf. */ -} - -/* Type of GC free functions. */ -typedef void (LJ_FASTCALL *GCFreeFunc)(global_State *g, GCobj *o); - -/* GC free functions for LJ_TSTR .. LJ_TUDATA. ORDER LJ_T */ -static const GCFreeFunc gc_freefunc[] = { - (GCFreeFunc)lj_str_free, - (GCFreeFunc)lj_func_freeuv, - (GCFreeFunc)lj_state_free, - (GCFreeFunc)lj_func_freeproto, - (GCFreeFunc)lj_func_free, -#if LJ_HASJIT - (GCFreeFunc)lj_trace_free, -#else - (GCFreeFunc)0, -#endif -#if LJ_HASFFI - (GCFreeFunc)lj_cdata_free, -#else - (GCFreeFunc)0, -#endif - (GCFreeFunc)lj_tab_free, - (GCFreeFunc)lj_udata_free -}; - -/* Full sweep of a GC list. */ -#define gc_fullsweep(g, p) gc_sweep(g, (p), LJ_MAX_MEM) - -/* Partial sweep of a GC list. */ -static GCRef *gc_sweep(global_State *g, GCRef *p, uint32_t lim) -{ - /* Mask with other white and LJ_GC_FIXED. Or LJ_GC_SFIXED on shutdown. */ - int ow = otherwhite(g); - GCobj *o; - while ((o = gcref(*p)) != NULL && lim-- > 0) { - if (o->gch.gct == ~LJ_TTHREAD) /* Need to sweep open upvalues, too. */ - gc_fullsweep(g, &gco2th(o)->openupval); - if (((o->gch.marked ^ LJ_GC_WHITES) & ow)) { /* Black or current white? */ - lua_assert(!isdead(g, o) || (o->gch.marked & LJ_GC_FIXED)); - makewhite(g, o); /* Value is alive, change to the current white. */ - p = &o->gch.nextgc; - } else { /* Otherwise value is dead, free it. */ - lua_assert(isdead(g, o) || ow == LJ_GC_SFIXED); - setgcrefr(*p, o->gch.nextgc); - if (o == gcref(g->gc.root)) - setgcrefr(g->gc.root, o->gch.nextgc); /* Adjust list anchor. */ - gc_freefunc[o->gch.gct - ~LJ_TSTR](g, o); - } - } - return p; -} - -/* Check whether we can clear a key or a value slot from a table. */ -static int gc_mayclear(cTValue *o, int val) -{ - if (tvisgcv(o)) { /* Only collectable objects can be weak references. */ - if (tvisstr(o)) { /* But strings cannot be used as weak references. */ - gc_mark_str(strV(o)); /* And need to be marked. */ - return 0; - } - if (iswhite(gcV(o))) - return 1; /* Object is about to be collected. */ - if (tvisudata(o) && val && isfinalized(udataV(o))) - return 1; /* Finalized userdata is dropped only from values. */ - } - return 0; /* Cannot clear. */ -} - -/* Clear collected entries from weak tables. */ -static void gc_clearweak(GCobj *o) -{ - while (o) { - GCtab *t = gco2tab(o); - lua_assert((t->marked & LJ_GC_WEAK)); - if ((t->marked & LJ_GC_WEAKVAL)) { - MSize i, asize = t->asize; - for (i = 0; i < asize; i++) { - /* Clear array slot when value is about to be collected. */ - TValue *tv = arrayslot(t, i); - if (gc_mayclear(tv, 1)) - setnilV(tv); - } - } - if (t->hmask > 0) { - Node *node = noderef(t->node); - MSize i, hmask = t->hmask; - for (i = 0; i <= hmask; i++) { - Node *n = &node[i]; - /* Clear hash slot when key or value is about to be collected. */ - if (!tvisnil(&n->val) && (gc_mayclear(&n->key, 0) || - gc_mayclear(&n->val, 1))) - setnilV(&n->val); - } - } - o = gcref(t->gclist); - } -} - -/* Call a userdata or cdata finalizer. */ -static void gc_call_finalizer(global_State *g, lua_State *L, - cTValue *mo, GCobj *o) -{ - /* Save and restore lots of state around the __gc callback. */ - uint8_t oldh = hook_save(g); - MSize oldt = g->gc.threshold; - int errcode; - TValue *top; - lj_trace_abort(g); - top = L->top; - L->top = top+2; - hook_entergc(g); /* Disable hooks and new traces during __gc. */ - g->gc.threshold = LJ_MAX_MEM; /* Prevent GC steps. */ - copyTV(L, top, mo); - setgcV(L, top+1, o, ~o->gch.gct); - errcode = lj_vm_pcall(L, top+1, 1+0, -1); /* Stack: |mo|o| -> | */ - hook_restore(g, oldh); - g->gc.threshold = oldt; /* Restore GC threshold. */ - if (errcode) - lj_err_throw(L, errcode); /* Propagate errors. */ -} - -/* Finalize one userdata or cdata object from the mmudata list. */ -static void gc_finalize(lua_State *L) -{ - global_State *g = G(L); - GCobj *o = gcnext(gcref(g->gc.mmudata)); - cTValue *mo; - lua_assert(gcref(g->jit_L) == NULL); /* Must not be called on trace. */ - /* Unchain from list of userdata to be finalized. */ - if (o == gcref(g->gc.mmudata)) - setgcrefnull(g->gc.mmudata); - else - setgcrefr(gcref(g->gc.mmudata)->gch.nextgc, o->gch.nextgc); -#if LJ_HASFFI - if (o->gch.gct == ~LJ_TCDATA) { - TValue tmp, *tv; - /* Add cdata back to the GC list and make it white. */ - setgcrefr(o->gch.nextgc, g->gc.root); - setgcref(g->gc.root, o); - makewhite(g, o); - o->gch.marked &= (uint8_t)~LJ_GC_CDATA_FIN; - /* Resolve finalizer. */ - setcdataV(L, &tmp, gco2cd(o)); - tv = lj_tab_set(L, ctype_ctsG(g)->finalizer, &tmp); - if (!tvisnil(tv)) { - g->gc.nocdatafin = 0; - copyTV(L, &tmp, tv); - setnilV(tv); /* Clear entry in finalizer table. */ - gc_call_finalizer(g, L, &tmp, o); - } - return; - } -#endif - /* Add userdata back to the main userdata list and make it white. */ - setgcrefr(o->gch.nextgc, mainthread(g)->nextgc); - setgcref(mainthread(g)->nextgc, o); - makewhite(g, o); - /* Resolve the __gc metamethod. */ - mo = lj_meta_fastg(g, tabref(gco2ud(o)->metatable), MM_gc); - if (mo) - gc_call_finalizer(g, L, mo, o); -} - -/* Finalize all userdata objects from mmudata list. */ -void lj_gc_finalize_udata(lua_State *L) -{ - while (gcref(G(L)->gc.mmudata) != NULL) - gc_finalize(L); -} - -#if LJ_HASFFI -/* Finalize all cdata objects from finalizer table. */ -void lj_gc_finalize_cdata(lua_State *L) -{ - global_State *g = G(L); - CTState *cts = ctype_ctsG(g); - if (cts) { - GCtab *t = cts->finalizer; - Node *node = noderef(t->node); - ptrdiff_t i; - setgcrefnull(t->metatable); /* Mark finalizer table as disabled. */ - for (i = (ptrdiff_t)t->hmask; i >= 0; i--) - if (!tvisnil(&node[i].val) && tviscdata(&node[i].key)) { - GCobj *o = gcV(&node[i].key); - TValue tmp; - makewhite(g, o); - o->gch.marked &= (uint8_t)~LJ_GC_CDATA_FIN; - copyTV(L, &tmp, &node[i].val); - setnilV(&node[i].val); - gc_call_finalizer(g, L, &tmp, o); - } - } -} -#endif - -/* Free all remaining GC objects. */ -void lj_gc_freeall(global_State *g) -{ - MSize i, strmask; - /* Free everything, except super-fixed objects (the main thread). */ - g->gc.currentwhite = LJ_GC_WHITES | LJ_GC_SFIXED; - gc_fullsweep(g, &g->gc.root); - strmask = g->strmask; - for (i = 0; i <= strmask; i++) /* Free all string hash chains. */ - gc_fullsweep(g, &g->strhash[i]); -} - -/* -- Collector ----------------------------------------------------------- */ - -/* Atomic part of the GC cycle, transitioning from mark to sweep phase. */ -static void atomic(global_State *g, lua_State *L) -{ - size_t udsize; - - gc_mark_uv(g); /* Need to remark open upvalues (the thread may be dead). */ - gc_propagate_gray(g); /* Propagate any left-overs. */ - - setgcrefr(g->gc.gray, g->gc.weak); /* Empty the list of weak tables. */ - setgcrefnull(g->gc.weak); - lua_assert(!iswhite(obj2gco(mainthread(g)))); - gc_markobj(g, L); /* Mark running thread. */ - gc_traverse_curtrace(g); /* Traverse current trace. */ - gc_mark_gcroot(g); /* Mark GC roots (again). */ - gc_propagate_gray(g); /* Propagate all of the above. */ - - setgcrefr(g->gc.gray, g->gc.grayagain); /* Empty the 2nd chance list. */ - setgcrefnull(g->gc.grayagain); - gc_propagate_gray(g); /* Propagate it. */ - - udsize = lj_gc_separateudata(g, 0); /* Separate userdata to be finalized. */ - gc_mark_mmudata(g); /* Mark them. */ - udsize += gc_propagate_gray(g); /* And propagate the marks. */ - - /* All marking done, clear weak tables. */ - gc_clearweak(gcref(g->gc.weak)); - - /* Prepare for sweep phase. */ - g->gc.currentwhite = (uint8_t)otherwhite(g); /* Flip current white. */ - g->strempty.marked = g->gc.currentwhite; - setmref(g->gc.sweep, &g->gc.root); - g->gc.estimate = g->gc.total - (MSize)udsize; /* Initial estimate. */ -} - -/* GC state machine. Returns a cost estimate for each step performed. */ -static size_t gc_onestep(lua_State *L) -{ - global_State *g = G(L); - switch (g->gc.state) { - case GCSpause: - gc_mark_start(g); /* Start a new GC cycle by marking all GC roots. */ - return 0; - case GCSpropagate: - if (gcref(g->gc.gray) != NULL) - return propagatemark(g); /* Propagate one gray object. */ - g->gc.state = GCSatomic; /* End of mark phase. */ - return 0; - case GCSatomic: - if (gcref(g->jit_L)) /* Don't run atomic phase on trace. */ - return LJ_MAX_MEM; - atomic(g, L); - g->gc.state = GCSsweepstring; /* Start of sweep phase. */ - g->gc.sweepstr = 0; - return 0; - case GCSsweepstring: { - MSize old = g->gc.total; - gc_fullsweep(g, &g->strhash[g->gc.sweepstr++]); /* Sweep one chain. */ - if (g->gc.sweepstr > g->strmask) - g->gc.state = GCSsweep; /* All string hash chains sweeped. */ - lua_assert(old >= g->gc.total); - g->gc.estimate -= old - g->gc.total; - return GCSWEEPCOST; - } - case GCSsweep: { - MSize old = g->gc.total; - setmref(g->gc.sweep, gc_sweep(g, mref(g->gc.sweep, GCRef), GCSWEEPMAX)); - lua_assert(old >= g->gc.total); - g->gc.estimate -= old - g->gc.total; - if (gcref(*mref(g->gc.sweep, GCRef)) == NULL) { - gc_shrink(g, L); - if (gcref(g->gc.mmudata)) { /* Need any finalizations? */ - g->gc.state = GCSfinalize; -#if LJ_HASFFI - g->gc.nocdatafin = 1; -#endif - } else { /* Otherwise skip this phase to help the JIT. */ - g->gc.state = GCSpause; /* End of GC cycle. */ - g->gc.debt = 0; - } - } - return GCSWEEPMAX*GCSWEEPCOST; - } - case GCSfinalize: - if (gcref(g->gc.mmudata) != NULL) { - if (gcref(g->jit_L)) /* Don't call finalizers on trace. */ - return LJ_MAX_MEM; - gc_finalize(L); /* Finalize one userdata object. */ - if (g->gc.estimate > GCFINALIZECOST) - g->gc.estimate -= GCFINALIZECOST; - return GCFINALIZECOST; - } -#if LJ_HASFFI - if (!g->gc.nocdatafin) lj_tab_rehash(L, ctype_ctsG(g)->finalizer); -#endif - g->gc.state = GCSpause; /* End of GC cycle. */ - g->gc.debt = 0; - return 0; - default: - lua_assert(0); - return 0; - } -} - -/* Perform a limited amount of incremental GC steps. */ -int LJ_FASTCALL lj_gc_step(lua_State *L) -{ - global_State *g = G(L); - MSize lim; - int32_t ostate = g->vmstate; - setvmstate(g, GC); - lim = (GCSTEPSIZE/100) * g->gc.stepmul; - if (lim == 0) - lim = LJ_MAX_MEM; - if (g->gc.total > g->gc.threshold) - g->gc.debt += g->gc.total - g->gc.threshold; - do { - lim -= (MSize)gc_onestep(L); - if (g->gc.state == GCSpause) { - g->gc.threshold = (g->gc.estimate/100) * g->gc.pause; - g->vmstate = ostate; - return 1; /* Finished a GC cycle. */ - } - } while ((int32_t)lim > 0); - if (g->gc.debt < GCSTEPSIZE) { - g->gc.threshold = g->gc.total + GCSTEPSIZE; - g->vmstate = ostate; - return -1; - } else { - g->gc.debt -= GCSTEPSIZE; - g->gc.threshold = g->gc.total; - g->vmstate = ostate; - return 0; - } -} - -/* Ditto, but fix the stack top first. */ -void LJ_FASTCALL lj_gc_step_fixtop(lua_State *L) -{ - if (curr_funcisL(L)) L->top = curr_topL(L); - lj_gc_step(L); -} - -#if LJ_HASJIT -/* Perform multiple GC steps. Called from JIT-compiled code. */ -int LJ_FASTCALL lj_gc_step_jit(global_State *g, MSize steps) -{ - lua_State *L = gco2th(gcref(g->jit_L)); - L->base = mref(G(L)->jit_base, TValue); - L->top = curr_topL(L); - while (steps-- > 0 && lj_gc_step(L) == 0) - ; - /* Return 1 to force a trace exit. */ - return (G(L)->gc.state == GCSatomic || G(L)->gc.state == GCSfinalize); -} -#endif - -/* Perform a full GC cycle. */ -void lj_gc_fullgc(lua_State *L) -{ - global_State *g = G(L); - int32_t ostate = g->vmstate; - setvmstate(g, GC); - if (g->gc.state <= GCSatomic) { /* Caught somewhere in the middle. */ - setmref(g->gc.sweep, &g->gc.root); /* Sweep everything (preserving it). */ - setgcrefnull(g->gc.gray); /* Reset lists from partial propagation. */ - setgcrefnull(g->gc.grayagain); - setgcrefnull(g->gc.weak); - g->gc.state = GCSsweepstring; /* Fast forward to the sweep phase. */ - g->gc.sweepstr = 0; - } - while (g->gc.state == GCSsweepstring || g->gc.state == GCSsweep) - gc_onestep(L); /* Finish sweep. */ - lua_assert(g->gc.state == GCSfinalize || g->gc.state == GCSpause); - /* Now perform a full GC. */ - g->gc.state = GCSpause; - do { gc_onestep(L); } while (g->gc.state != GCSpause); - g->gc.threshold = (g->gc.estimate/100) * g->gc.pause; - g->vmstate = ostate; -} - -/* -- Write barriers ------------------------------------------------------ */ - -/* Move the GC propagation frontier forward. */ -void lj_gc_barrierf(global_State *g, GCobj *o, GCobj *v) -{ - lua_assert(isblack(o) && iswhite(v) && !isdead(g, v) && !isdead(g, o)); - lua_assert(g->gc.state != GCSfinalize && g->gc.state != GCSpause); - lua_assert(o->gch.gct != ~LJ_TTAB); - /* Preserve invariant during propagation. Otherwise it doesn't matter. */ - if (g->gc.state == GCSpropagate || g->gc.state == GCSatomic) - gc_mark(g, v); /* Move frontier forward. */ - else - makewhite(g, o); /* Make it white to avoid the following barrier. */ -} - -/* Specialized barrier for closed upvalue. Pass &uv->tv. */ -void LJ_FASTCALL lj_gc_barrieruv(global_State *g, TValue *tv) -{ -#define TV2MARKED(x) \ - (*((uint8_t *)(x) - offsetof(GCupval, tv) + offsetof(GCupval, marked))) - if (g->gc.state == GCSpropagate || g->gc.state == GCSatomic) - gc_mark(g, gcV(tv)); - else - TV2MARKED(tv) = (TV2MARKED(tv) & (uint8_t)~LJ_GC_COLORS) | curwhite(g); -#undef TV2MARKED -} - -/* Close upvalue. Also needs a write barrier. */ -void lj_gc_closeuv(global_State *g, GCupval *uv) -{ - GCobj *o = obj2gco(uv); - /* Copy stack slot to upvalue itself and point to the copy. */ - copyTV(mainthread(g), &uv->tv, uvval(uv)); - setmref(uv->v, &uv->tv); - uv->closed = 1; - setgcrefr(o->gch.nextgc, g->gc.root); - setgcref(g->gc.root, o); - if (isgray(o)) { /* A closed upvalue is never gray, so fix this. */ - if (g->gc.state == GCSpropagate || g->gc.state == GCSatomic) { - gray2black(o); /* Make it black and preserve invariant. */ - if (tviswhite(&uv->tv)) - lj_gc_barrierf(g, o, gcV(&uv->tv)); - } else { - makewhite(g, o); /* Make it white, i.e. sweep the upvalue. */ - lua_assert(g->gc.state != GCSfinalize && g->gc.state != GCSpause); - } - } -} - -#if LJ_HASJIT -/* Mark a trace if it's saved during the propagation phase. */ -void lj_gc_barriertrace(global_State *g, uint32_t traceno) -{ - if (g->gc.state == GCSpropagate || g->gc.state == GCSatomic) - gc_marktrace(g, traceno); -} -#endif - -/* -- Allocator ----------------------------------------------------------- */ - -/* Call pluggable memory allocator to allocate or resize a fragment. */ -void *lj_mem_realloc(lua_State *L, void *p, MSize osz, MSize nsz) -{ - global_State *g = G(L); - lua_assert((osz == 0) == (p == NULL)); - p = g->allocf(g->allocd, p, osz, nsz); - if (p == NULL && nsz > 0) - lj_err_mem(L); - lua_assert((nsz == 0) == (p == NULL)); - lua_assert(checkptr32(p)); - g->gc.total = (g->gc.total - osz) + nsz; - return p; -} - -/* Allocate new GC object and link it to the root set. */ -void * LJ_FASTCALL lj_mem_newgco(lua_State *L, MSize size) -{ - global_State *g = G(L); - GCobj *o = (GCobj *)g->allocf(g->allocd, NULL, 0, size); - if (o == NULL) - lj_err_mem(L); - lua_assert(checkptr32(o)); - g->gc.total += size; - setgcrefr(o->gch.nextgc, g->gc.root); - setgcref(g->gc.root, o); - newwhite(g, o); - return o; -} - -/* Resize growable vector. */ -void *lj_mem_grow(lua_State *L, void *p, MSize *szp, MSize lim, MSize esz) -{ - MSize sz = (*szp) << 1; - if (sz < LJ_MIN_VECSZ) - sz = LJ_MIN_VECSZ; - if (sz > lim) - sz = lim; - p = lj_mem_realloc(L, p, (*szp)*esz, sz*esz); - *szp = sz; - return p; -} - diff --git a/deps/luajit/src/lj_gc.h b/deps/luajit/src/lj_gc.h deleted file mode 100644 index ba061bc5..00000000 --- a/deps/luajit/src/lj_gc.h +++ /dev/null @@ -1,134 +0,0 @@ -/* -** Garbage collector. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#ifndef _LJ_GC_H -#define _LJ_GC_H - -#include "lj_obj.h" - -/* Garbage collector states. Order matters. */ -enum { - GCSpause, GCSpropagate, GCSatomic, GCSsweepstring, GCSsweep, GCSfinalize -}; - -/* Bitmasks for marked field of GCobj. */ -#define LJ_GC_WHITE0 0x01 -#define LJ_GC_WHITE1 0x02 -#define LJ_GC_BLACK 0x04 -#define LJ_GC_FINALIZED 0x08 -#define LJ_GC_WEAKKEY 0x08 -#define LJ_GC_WEAKVAL 0x10 -#define LJ_GC_CDATA_FIN 0x10 -#define LJ_GC_FIXED 0x20 -#define LJ_GC_SFIXED 0x40 - -#define LJ_GC_WHITES (LJ_GC_WHITE0 | LJ_GC_WHITE1) -#define LJ_GC_COLORS (LJ_GC_WHITES | LJ_GC_BLACK) -#define LJ_GC_WEAK (LJ_GC_WEAKKEY | LJ_GC_WEAKVAL) - -/* Macros to test and set GCobj colors. */ -#define iswhite(x) ((x)->gch.marked & LJ_GC_WHITES) -#define isblack(x) ((x)->gch.marked & LJ_GC_BLACK) -#define isgray(x) (!((x)->gch.marked & (LJ_GC_BLACK|LJ_GC_WHITES))) -#define tviswhite(x) (tvisgcv(x) && iswhite(gcV(x))) -#define otherwhite(g) (g->gc.currentwhite ^ LJ_GC_WHITES) -#define isdead(g, v) ((v)->gch.marked & otherwhite(g) & LJ_GC_WHITES) - -#define curwhite(g) ((g)->gc.currentwhite & LJ_GC_WHITES) -#define newwhite(g, x) (obj2gco(x)->gch.marked = (uint8_t)curwhite(g)) -#define makewhite(g, x) \ - ((x)->gch.marked = ((x)->gch.marked & (uint8_t)~LJ_GC_COLORS) | curwhite(g)) -#define flipwhite(x) ((x)->gch.marked ^= LJ_GC_WHITES) -#define black2gray(x) ((x)->gch.marked &= (uint8_t)~LJ_GC_BLACK) -#define fixstring(s) ((s)->marked |= LJ_GC_FIXED) -#define markfinalized(x) ((x)->gch.marked |= LJ_GC_FINALIZED) - -/* Collector. */ -LJ_FUNC size_t lj_gc_separateudata(global_State *g, int all); -LJ_FUNC void lj_gc_finalize_udata(lua_State *L); -#if LJ_HASFFI -LJ_FUNC void lj_gc_finalize_cdata(lua_State *L); -#else -#define lj_gc_finalize_cdata(L) UNUSED(L) -#endif -LJ_FUNC void lj_gc_freeall(global_State *g); -LJ_FUNCA int LJ_FASTCALL lj_gc_step(lua_State *L); -LJ_FUNCA void LJ_FASTCALL lj_gc_step_fixtop(lua_State *L); -#if LJ_HASJIT -LJ_FUNC int LJ_FASTCALL lj_gc_step_jit(global_State *g, MSize steps); -#endif -LJ_FUNC void lj_gc_fullgc(lua_State *L); - -/* GC check: drive collector forward if the GC threshold has been reached. */ -#define lj_gc_check(L) \ - { if (LJ_UNLIKELY(G(L)->gc.total >= G(L)->gc.threshold)) \ - lj_gc_step(L); } -#define lj_gc_check_fixtop(L) \ - { if (LJ_UNLIKELY(G(L)->gc.total >= G(L)->gc.threshold)) \ - lj_gc_step_fixtop(L); } - -/* Write barriers. */ -LJ_FUNC void lj_gc_barrierf(global_State *g, GCobj *o, GCobj *v); -LJ_FUNCA void LJ_FASTCALL lj_gc_barrieruv(global_State *g, TValue *tv); -LJ_FUNC void lj_gc_closeuv(global_State *g, GCupval *uv); -#if LJ_HASJIT -LJ_FUNC void lj_gc_barriertrace(global_State *g, uint32_t traceno); -#endif - -/* Move the GC propagation frontier back for tables (make it gray again). */ -static LJ_AINLINE void lj_gc_barrierback(global_State *g, GCtab *t) -{ - GCobj *o = obj2gco(t); - lua_assert(isblack(o) && !isdead(g, o)); - lua_assert(g->gc.state != GCSfinalize && g->gc.state != GCSpause); - black2gray(o); - setgcrefr(t->gclist, g->gc.grayagain); - setgcref(g->gc.grayagain, o); -} - -/* Barrier for stores to table objects. TValue and GCobj variant. */ -#define lj_gc_anybarriert(L, t) \ - { if (LJ_UNLIKELY(isblack(obj2gco(t)))) lj_gc_barrierback(G(L), (t)); } -#define lj_gc_barriert(L, t, tv) \ - { if (tviswhite(tv) && isblack(obj2gco(t))) \ - lj_gc_barrierback(G(L), (t)); } -#define lj_gc_objbarriert(L, t, o) \ - { if (iswhite(obj2gco(o)) && isblack(obj2gco(t))) \ - lj_gc_barrierback(G(L), (t)); } - -/* Barrier for stores to any other object. TValue and GCobj variant. */ -#define lj_gc_barrier(L, p, tv) \ - { if (tviswhite(tv) && isblack(obj2gco(p))) \ - lj_gc_barrierf(G(L), obj2gco(p), gcV(tv)); } -#define lj_gc_objbarrier(L, p, o) \ - { if (iswhite(obj2gco(o)) && isblack(obj2gco(p))) \ - lj_gc_barrierf(G(L), obj2gco(p), obj2gco(o)); } - -/* Allocator. */ -LJ_FUNC void *lj_mem_realloc(lua_State *L, void *p, MSize osz, MSize nsz); -LJ_FUNC void * LJ_FASTCALL lj_mem_newgco(lua_State *L, MSize size); -LJ_FUNC void *lj_mem_grow(lua_State *L, void *p, - MSize *szp, MSize lim, MSize esz); - -#define lj_mem_new(L, s) lj_mem_realloc(L, NULL, 0, (s)) - -static LJ_AINLINE void lj_mem_free(global_State *g, void *p, size_t osize) -{ - g->gc.total -= (MSize)osize; - g->allocf(g->allocd, p, osize, 0); -} - -#define lj_mem_newvec(L, n, t) ((t *)lj_mem_new(L, (MSize)((n)*sizeof(t)))) -#define lj_mem_reallocvec(L, p, on, n, t) \ - ((p) = (t *)lj_mem_realloc(L, p, (on)*sizeof(t), (MSize)((n)*sizeof(t)))) -#define lj_mem_growvec(L, p, n, m, t) \ - ((p) = (t *)lj_mem_grow(L, (p), &(n), (m), (MSize)sizeof(t))) -#define lj_mem_freevec(g, p, n, t) lj_mem_free(g, (p), (n)*sizeof(t)) - -#define lj_mem_newobj(L, t) ((t *)lj_mem_newgco(L, sizeof(t))) -#define lj_mem_newt(L, s, t) ((t *)lj_mem_new(L, (s))) -#define lj_mem_freet(g, p) lj_mem_free(g, (p), sizeof(*(p))) - -#endif diff --git a/deps/luajit/src/lj_gdbjit.c b/deps/luajit/src/lj_gdbjit.c deleted file mode 100644 index d3f3e611..00000000 --- a/deps/luajit/src/lj_gdbjit.c +++ /dev/null @@ -1,795 +0,0 @@ -/* -** Client for the GDB JIT API. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#define lj_gdbjit_c -#define LUA_CORE - -#include "lj_obj.h" - -#if LJ_HASJIT - -#include "lj_gc.h" -#include "lj_err.h" -#include "lj_debug.h" -#include "lj_frame.h" -#include "lj_jit.h" -#include "lj_dispatch.h" - -/* This is not compiled in by default. -** Enable with -DLUAJIT_USE_GDBJIT in the Makefile and recompile everything. -*/ -#ifdef LUAJIT_USE_GDBJIT - -/* The GDB JIT API allows JIT compilers to pass debug information about -** JIT-compiled code back to GDB. You need at least GDB 7.0 or higher -** to see it in action. -** -** This is a passive API, so it works even when not running under GDB -** or when attaching to an already running process. Alas, this implies -** enabling it always has a non-negligible overhead -- do not use in -** release mode! -** -** The LuaJIT GDB JIT client is rather minimal at the moment. It gives -** each trace a symbol name and adds a source location and frame unwind -** information. Obviously LuaJIT itself and any embedding C application -** should be compiled with debug symbols, too (see the Makefile). -** -** Traces are named TRACE_1, TRACE_2, ... these correspond to the trace -** numbers from -jv or -jdump. Use "break TRACE_1" or "tbreak TRACE_1" etc. -** to set breakpoints on specific traces (even ahead of their creation). -** -** The source location for each trace allows listing the corresponding -** source lines with the GDB command "list" (but only if the Lua source -** has been loaded from a file). Currently this is always set to the -** location where the trace has been started. -** -** Frame unwind information can be inspected with the GDB command -** "info frame". This also allows proper backtraces across JIT-compiled -** code with the GDB command "bt". -** -** You probably want to add the following settings to a .gdbinit file -** (or add them to ~/.gdbinit): -** set disassembly-flavor intel -** set breakpoint pending on -** -** Here's a sample GDB session: -** ------------------------------------------------------------------------ - -$ cat >x.lua -for outer=1,100 do - for inner=1,100 do end -end -^D - -$ luajit -jv x.lua -[TRACE 1 x.lua:2] -[TRACE 2 (1/3) x.lua:1 -> 1] - -$ gdb --quiet --args luajit x.lua -(gdb) tbreak TRACE_1 -Function "TRACE_1" not defined. -Temporary breakpoint 1 (TRACE_1) pending. -(gdb) run -Starting program: luajit x.lua - -Temporary breakpoint 1, TRACE_1 () at x.lua:2 -2 for inner=1,100 do end -(gdb) list -1 for outer=1,100 do -2 for inner=1,100 do end -3 end -(gdb) bt -#0 TRACE_1 () at x.lua:2 -#1 0x08053690 in lua_pcall [...] -[...] -#7 0x0806ff90 in main [...] -(gdb) disass TRACE_1 -Dump of assembler code for function TRACE_1: -0xf7fd9fba : mov DWORD PTR ds:0xf7e0e2a0,0x1 -0xf7fd9fc4 : movsd xmm7,QWORD PTR [edx+0x20] -[...] -0xf7fd9ff8 : jmp 0xf7fd2014 -End of assembler dump. -(gdb) tbreak TRACE_2 -Function "TRACE_2" not defined. -Temporary breakpoint 2 (TRACE_2) pending. -(gdb) cont -Continuing. - -Temporary breakpoint 2, TRACE_2 () at x.lua:1 -1 for outer=1,100 do -(gdb) info frame -Stack level 0, frame at 0xffffd7c0: - eip = 0xf7fd9f60 in TRACE_2 (x.lua:1); saved eip 0x8053690 - called by frame at 0xffffd7e0 - source language unknown. - Arglist at 0xffffd78c, args: - Locals at 0xffffd78c, Previous frame's sp is 0xffffd7c0 - Saved registers: - ebx at 0xffffd7ac, ebp at 0xffffd7b8, esi at 0xffffd7b0, edi at 0xffffd7b4, - eip at 0xffffd7bc -(gdb) - -** ------------------------------------------------------------------------ -*/ - -/* -- GDB JIT API --------------------------------------------------------- */ - -/* GDB JIT actions. */ -enum { - GDBJIT_NOACTION = 0, - GDBJIT_REGISTER, - GDBJIT_UNREGISTER -}; - -/* GDB JIT entry. */ -typedef struct GDBJITentry { - struct GDBJITentry *next_entry; - struct GDBJITentry *prev_entry; - const char *symfile_addr; - uint64_t symfile_size; -} GDBJITentry; - -/* GDB JIT descriptor. */ -typedef struct GDBJITdesc { - uint32_t version; - uint32_t action_flag; - GDBJITentry *relevant_entry; - GDBJITentry *first_entry; -} GDBJITdesc; - -GDBJITdesc __jit_debug_descriptor = { - 1, GDBJIT_NOACTION, NULL, NULL -}; - -/* GDB sets a breakpoint at this function. */ -void LJ_NOINLINE __jit_debug_register_code() -{ - __asm__ __volatile__(""); -}; - -/* -- In-memory ELF object definitions ------------------------------------ */ - -/* ELF definitions. */ -typedef struct ELFheader { - uint8_t emagic[4]; - uint8_t eclass; - uint8_t eendian; - uint8_t eversion; - uint8_t eosabi; - uint8_t eabiversion; - uint8_t epad[7]; - uint16_t type; - uint16_t machine; - uint32_t version; - uintptr_t entry; - uintptr_t phofs; - uintptr_t shofs; - uint32_t flags; - uint16_t ehsize; - uint16_t phentsize; - uint16_t phnum; - uint16_t shentsize; - uint16_t shnum; - uint16_t shstridx; -} ELFheader; - -typedef struct ELFsectheader { - uint32_t name; - uint32_t type; - uintptr_t flags; - uintptr_t addr; - uintptr_t ofs; - uintptr_t size; - uint32_t link; - uint32_t info; - uintptr_t align; - uintptr_t entsize; -} ELFsectheader; - -#define ELFSECT_IDX_ABS 0xfff1 - -enum { - ELFSECT_TYPE_PROGBITS = 1, - ELFSECT_TYPE_SYMTAB = 2, - ELFSECT_TYPE_STRTAB = 3, - ELFSECT_TYPE_NOBITS = 8 -}; - -#define ELFSECT_FLAGS_WRITE 1 -#define ELFSECT_FLAGS_ALLOC 2 -#define ELFSECT_FLAGS_EXEC 4 - -typedef struct ELFsymbol { -#if LJ_64 - uint32_t name; - uint8_t info; - uint8_t other; - uint16_t sectidx; - uintptr_t value; - uint64_t size; -#else - uint32_t name; - uintptr_t value; - uint32_t size; - uint8_t info; - uint8_t other; - uint16_t sectidx; -#endif -} ELFsymbol; - -enum { - ELFSYM_TYPE_FUNC = 2, - ELFSYM_TYPE_FILE = 4, - ELFSYM_BIND_LOCAL = 0 << 4, - ELFSYM_BIND_GLOBAL = 1 << 4, -}; - -/* DWARF definitions. */ -#define DW_CIE_VERSION 1 - -enum { - DW_CFA_nop = 0x0, - DW_CFA_offset_extended = 0x5, - DW_CFA_def_cfa = 0xc, - DW_CFA_def_cfa_offset = 0xe, - DW_CFA_offset_extended_sf = 0x11, - DW_CFA_advance_loc = 0x40, - DW_CFA_offset = 0x80 -}; - -enum { - DW_EH_PE_udata4 = 3, - DW_EH_PE_textrel = 0x20 -}; - -enum { - DW_TAG_compile_unit = 0x11 -}; - -enum { - DW_children_no = 0, - DW_children_yes = 1 -}; - -enum { - DW_AT_name = 0x03, - DW_AT_stmt_list = 0x10, - DW_AT_low_pc = 0x11, - DW_AT_high_pc = 0x12 -}; - -enum { - DW_FORM_addr = 0x01, - DW_FORM_data4 = 0x06, - DW_FORM_string = 0x08 -}; - -enum { - DW_LNS_extended_op = 0, - DW_LNS_copy = 1, - DW_LNS_advance_pc = 2, - DW_LNS_advance_line = 3 -}; - -enum { - DW_LNE_end_sequence = 1, - DW_LNE_set_address = 2 -}; - -enum { -#if LJ_TARGET_X86 - DW_REG_AX, DW_REG_CX, DW_REG_DX, DW_REG_BX, - DW_REG_SP, DW_REG_BP, DW_REG_SI, DW_REG_DI, - DW_REG_RA, -#elif LJ_TARGET_X64 - /* Yes, the order is strange, but correct. */ - DW_REG_AX, DW_REG_DX, DW_REG_CX, DW_REG_BX, - DW_REG_SI, DW_REG_DI, DW_REG_BP, DW_REG_SP, - DW_REG_8, DW_REG_9, DW_REG_10, DW_REG_11, - DW_REG_12, DW_REG_13, DW_REG_14, DW_REG_15, - DW_REG_RA, -#elif LJ_TARGET_ARM - DW_REG_SP = 13, - DW_REG_RA = 14, -#elif LJ_TARGET_PPC - DW_REG_SP = 1, - DW_REG_RA = 65, - DW_REG_CR = 70, -#elif LJ_TARGET_MIPS - DW_REG_SP = 29, - DW_REG_RA = 31, -#else -#error "Unsupported target architecture" -#endif -}; - -/* Minimal list of sections for the in-memory ELF object. */ -enum { - GDBJIT_SECT_NULL, - GDBJIT_SECT_text, - GDBJIT_SECT_eh_frame, - GDBJIT_SECT_shstrtab, - GDBJIT_SECT_strtab, - GDBJIT_SECT_symtab, - GDBJIT_SECT_debug_info, - GDBJIT_SECT_debug_abbrev, - GDBJIT_SECT_debug_line, - GDBJIT_SECT__MAX -}; - -enum { - GDBJIT_SYM_UNDEF, - GDBJIT_SYM_FILE, - GDBJIT_SYM_FUNC, - GDBJIT_SYM__MAX -}; - -/* In-memory ELF object. */ -typedef struct GDBJITobj { - ELFheader hdr; /* ELF header. */ - ELFsectheader sect[GDBJIT_SECT__MAX]; /* ELF sections. */ - ELFsymbol sym[GDBJIT_SYM__MAX]; /* ELF symbol table. */ - uint8_t space[4096]; /* Space for various section data. */ -} GDBJITobj; - -/* Combined structure for GDB JIT entry and ELF object. */ -typedef struct GDBJITentryobj { - GDBJITentry entry; - size_t sz; - GDBJITobj obj; -} GDBJITentryobj; - -/* Template for in-memory ELF header. */ -static const ELFheader elfhdr_template = { - .emagic = { 0x7f, 'E', 'L', 'F' }, - .eclass = LJ_64 ? 2 : 1, - .eendian = LJ_ENDIAN_SELECT(1, 2), - .eversion = 1, -#if LJ_TARGET_LINUX - .eosabi = 0, /* Nope, it's not 3. */ -#elif defined(__FreeBSD__) - .eosabi = 9, -#elif defined(__NetBSD__) - .eosabi = 2, -#elif defined(__OpenBSD__) - .eosabi = 12, -#elif defined(__DragonFly__) - .eosabi = 0, -#elif (defined(__sun__) && defined(__svr4__)) - .eosabi = 6, -#else - .eosabi = 0, -#endif - .eabiversion = 0, - .epad = { 0, 0, 0, 0, 0, 0, 0 }, - .type = 1, -#if LJ_TARGET_X86 - .machine = 3, -#elif LJ_TARGET_X64 - .machine = 62, -#elif LJ_TARGET_ARM - .machine = 40, -#elif LJ_TARGET_PPC - .machine = 20, -#elif LJ_TARGET_MIPS - .machine = 8, -#else -#error "Unsupported target architecture" -#endif - .version = 1, - .entry = 0, - .phofs = 0, - .shofs = offsetof(GDBJITobj, sect), - .flags = 0, - .ehsize = sizeof(ELFheader), - .phentsize = 0, - .phnum = 0, - .shentsize = sizeof(ELFsectheader), - .shnum = GDBJIT_SECT__MAX, - .shstridx = GDBJIT_SECT_shstrtab -}; - -/* -- In-memory ELF object generation ------------------------------------- */ - -/* Context for generating the ELF object for the GDB JIT API. */ -typedef struct GDBJITctx { - uint8_t *p; /* Pointer to next address in obj.space. */ - uint8_t *startp; /* Pointer to start address in obj.space. */ - GCtrace *T; /* Generate symbols for this trace. */ - uintptr_t mcaddr; /* Machine code address. */ - MSize szmcode; /* Size of machine code. */ - MSize spadjp; /* Stack adjustment for parent trace or interpreter. */ - MSize spadj; /* Stack adjustment for trace itself. */ - BCLine lineno; /* Starting line number. */ - const char *filename; /* Starting file name. */ - size_t objsize; /* Final size of ELF object. */ - GDBJITobj obj; /* In-memory ELF object. */ -} GDBJITctx; - -/* Add a zero-terminated string. */ -static uint32_t gdbjit_strz(GDBJITctx *ctx, const char *str) -{ - uint8_t *p = ctx->p; - uint32_t ofs = (uint32_t)(p - ctx->startp); - do { - *p++ = (uint8_t)*str; - } while (*str++); - ctx->p = p; - return ofs; -} - -/* Append a decimal number. */ -static void gdbjit_catnum(GDBJITctx *ctx, uint32_t n) -{ - if (n >= 10) { uint32_t m = n / 10; n = n % 10; gdbjit_catnum(ctx, m); } - *ctx->p++ = '0' + n; -} - -/* Add a ULEB128 value. */ -static void gdbjit_uleb128(GDBJITctx *ctx, uint32_t v) -{ - uint8_t *p = ctx->p; - for (; v >= 0x80; v >>= 7) - *p++ = (uint8_t)((v & 0x7f) | 0x80); - *p++ = (uint8_t)v; - ctx->p = p; -} - -/* Add a SLEB128 value. */ -static void gdbjit_sleb128(GDBJITctx *ctx, int32_t v) -{ - uint8_t *p = ctx->p; - for (; (uint32_t)(v+0x40) >= 0x80; v >>= 7) - *p++ = (uint8_t)((v & 0x7f) | 0x80); - *p++ = (uint8_t)(v & 0x7f); - ctx->p = p; -} - -/* Shortcuts to generate DWARF structures. */ -#define DB(x) (*p++ = (x)) -#define DI8(x) (*(int8_t *)p = (x), p++) -#define DU16(x) (*(uint16_t *)p = (x), p += 2) -#define DU32(x) (*(uint32_t *)p = (x), p += 4) -#define DADDR(x) (*(uintptr_t *)p = (x), p += sizeof(uintptr_t)) -#define DUV(x) (ctx->p = p, gdbjit_uleb128(ctx, (x)), p = ctx->p) -#define DSV(x) (ctx->p = p, gdbjit_sleb128(ctx, (x)), p = ctx->p) -#define DSTR(str) (ctx->p = p, gdbjit_strz(ctx, (str)), p = ctx->p) -#define DALIGNNOP(s) while ((uintptr_t)p & ((s)-1)) *p++ = DW_CFA_nop -#define DSECT(name, stmt) \ - { uint32_t *szp_##name = (uint32_t *)p; p += 4; stmt \ - *szp_##name = (uint32_t)((p-(uint8_t *)szp_##name)-4); } \ - -/* Initialize ELF section headers. */ -static void LJ_FASTCALL gdbjit_secthdr(GDBJITctx *ctx) -{ - ELFsectheader *sect; - - *ctx->p++ = '\0'; /* Empty string at start of string table. */ - -#define SECTDEF(id, tp, al) \ - sect = &ctx->obj.sect[GDBJIT_SECT_##id]; \ - sect->name = gdbjit_strz(ctx, "." #id); \ - sect->type = ELFSECT_TYPE_##tp; \ - sect->align = (al) - - SECTDEF(text, NOBITS, 16); - sect->flags = ELFSECT_FLAGS_ALLOC|ELFSECT_FLAGS_EXEC; - sect->addr = ctx->mcaddr; - sect->ofs = 0; - sect->size = ctx->szmcode; - - SECTDEF(eh_frame, PROGBITS, sizeof(uintptr_t)); - sect->flags = ELFSECT_FLAGS_ALLOC; - - SECTDEF(shstrtab, STRTAB, 1); - SECTDEF(strtab, STRTAB, 1); - - SECTDEF(symtab, SYMTAB, sizeof(uintptr_t)); - sect->ofs = offsetof(GDBJITobj, sym); - sect->size = sizeof(ctx->obj.sym); - sect->link = GDBJIT_SECT_strtab; - sect->entsize = sizeof(ELFsymbol); - sect->info = GDBJIT_SYM_FUNC; - - SECTDEF(debug_info, PROGBITS, 1); - SECTDEF(debug_abbrev, PROGBITS, 1); - SECTDEF(debug_line, PROGBITS, 1); - -#undef SECTDEF -} - -/* Initialize symbol table. */ -static void LJ_FASTCALL gdbjit_symtab(GDBJITctx *ctx) -{ - ELFsymbol *sym; - - *ctx->p++ = '\0'; /* Empty string at start of string table. */ - - sym = &ctx->obj.sym[GDBJIT_SYM_FILE]; - sym->name = gdbjit_strz(ctx, "JIT mcode"); - sym->sectidx = ELFSECT_IDX_ABS; - sym->info = ELFSYM_TYPE_FILE|ELFSYM_BIND_LOCAL; - - sym = &ctx->obj.sym[GDBJIT_SYM_FUNC]; - sym->name = gdbjit_strz(ctx, "TRACE_"); ctx->p--; - gdbjit_catnum(ctx, ctx->T->traceno); *ctx->p++ = '\0'; - sym->sectidx = GDBJIT_SECT_text; - sym->value = 0; - sym->size = ctx->szmcode; - sym->info = ELFSYM_TYPE_FUNC|ELFSYM_BIND_GLOBAL; -} - -/* Initialize .eh_frame section. */ -static void LJ_FASTCALL gdbjit_ehframe(GDBJITctx *ctx) -{ - uint8_t *p = ctx->p; - uint8_t *framep = p; - - /* Emit DWARF EH CIE. */ - DSECT(CIE, - DU32(0); /* Offset to CIE itself. */ - DB(DW_CIE_VERSION); - DSTR("zR"); /* Augmentation. */ - DUV(1); /* Code alignment factor. */ - DSV(-(int32_t)sizeof(uintptr_t)); /* Data alignment factor. */ - DB(DW_REG_RA); /* Return address register. */ - DB(1); DB(DW_EH_PE_textrel|DW_EH_PE_udata4); /* Augmentation data. */ - DB(DW_CFA_def_cfa); DUV(DW_REG_SP); DUV(sizeof(uintptr_t)); -#if LJ_TARGET_PPC - DB(DW_CFA_offset_extended_sf); DB(DW_REG_RA); DSV(-1); -#else - DB(DW_CFA_offset|DW_REG_RA); DUV(1); -#endif - DALIGNNOP(sizeof(uintptr_t)); - ) - - /* Emit DWARF EH FDE. */ - DSECT(FDE, - DU32((uint32_t)(p-framep)); /* Offset to CIE. */ - DU32(0); /* Machine code offset relative to .text. */ - DU32(ctx->szmcode); /* Machine code length. */ - DB(0); /* Augmentation data. */ - /* Registers saved in CFRAME. */ -#if LJ_TARGET_X86 - DB(DW_CFA_offset|DW_REG_BP); DUV(2); - DB(DW_CFA_offset|DW_REG_DI); DUV(3); - DB(DW_CFA_offset|DW_REG_SI); DUV(4); - DB(DW_CFA_offset|DW_REG_BX); DUV(5); -#elif LJ_TARGET_X64 - DB(DW_CFA_offset|DW_REG_BP); DUV(2); - DB(DW_CFA_offset|DW_REG_BX); DUV(3); - DB(DW_CFA_offset|DW_REG_15); DUV(4); - DB(DW_CFA_offset|DW_REG_14); DUV(5); - /* Extra registers saved for JIT-compiled code. */ - DB(DW_CFA_offset|DW_REG_13); DUV(9); - DB(DW_CFA_offset|DW_REG_12); DUV(10); -#elif LJ_TARGET_ARM - { - int i; - for (i = 11; i >= 4; i--) { DB(DW_CFA_offset|i); DUV(2+(11-i)); } - } -#elif LJ_TARGET_PPC - { - int i; - DB(DW_CFA_offset_extended); DB(DW_REG_CR); DUV(55); - for (i = 14; i <= 31; i++) { - DB(DW_CFA_offset|i); DUV(37+(31-i)); - DB(DW_CFA_offset|32|i); DUV(2+2*(31-i)); - } - } -#elif LJ_TARGET_MIPS - { - int i; - DB(DW_CFA_offset|30); DUV(2); - for (i = 23; i >= 16; i--) { DB(DW_CFA_offset|i); DUV(26-i); } - for (i = 30; i >= 20; i -= 2) { DB(DW_CFA_offset|32|i); DUV(42-i); } - } -#else -#error "Unsupported target architecture" -#endif - if (ctx->spadjp != ctx->spadj) { /* Parent/interpreter stack frame size. */ - DB(DW_CFA_def_cfa_offset); DUV(ctx->spadjp); - DB(DW_CFA_advance_loc|1); /* Only an approximation. */ - } - DB(DW_CFA_def_cfa_offset); DUV(ctx->spadj); /* Trace stack frame size. */ - DALIGNNOP(sizeof(uintptr_t)); - ) - - ctx->p = p; -} - -/* Initialize .debug_info section. */ -static void LJ_FASTCALL gdbjit_debuginfo(GDBJITctx *ctx) -{ - uint8_t *p = ctx->p; - - DSECT(info, - DU16(2); /* DWARF version. */ - DU32(0); /* Abbrev offset. */ - DB(sizeof(uintptr_t)); /* Pointer size. */ - - DUV(1); /* Abbrev #1: DW_TAG_compile_unit. */ - DSTR(ctx->filename); /* DW_AT_name. */ - DADDR(ctx->mcaddr); /* DW_AT_low_pc. */ - DADDR(ctx->mcaddr + ctx->szmcode); /* DW_AT_high_pc. */ - DU32(0); /* DW_AT_stmt_list. */ - ) - - ctx->p = p; -} - -/* Initialize .debug_abbrev section. */ -static void LJ_FASTCALL gdbjit_debugabbrev(GDBJITctx *ctx) -{ - uint8_t *p = ctx->p; - - /* Abbrev #1: DW_TAG_compile_unit. */ - DUV(1); DUV(DW_TAG_compile_unit); - DB(DW_children_no); - DUV(DW_AT_name); DUV(DW_FORM_string); - DUV(DW_AT_low_pc); DUV(DW_FORM_addr); - DUV(DW_AT_high_pc); DUV(DW_FORM_addr); - DUV(DW_AT_stmt_list); DUV(DW_FORM_data4); - DB(0); DB(0); - - ctx->p = p; -} - -#define DLNE(op, s) (DB(DW_LNS_extended_op), DUV(1+(s)), DB((op))) - -/* Initialize .debug_line section. */ -static void LJ_FASTCALL gdbjit_debugline(GDBJITctx *ctx) -{ - uint8_t *p = ctx->p; - - DSECT(line, - DU16(2); /* DWARF version. */ - DSECT(header, - DB(1); /* Minimum instruction length. */ - DB(1); /* is_stmt. */ - DI8(0); /* Line base for special opcodes. */ - DB(2); /* Line range for special opcodes. */ - DB(3+1); /* Opcode base at DW_LNS_advance_line+1. */ - DB(0); DB(1); DB(1); /* Standard opcode lengths. */ - /* Directory table. */ - DB(0); - /* File name table. */ - DSTR(ctx->filename); DUV(0); DUV(0); DUV(0); - DB(0); - ) - - DLNE(DW_LNE_set_address, sizeof(uintptr_t)); DADDR(ctx->mcaddr); - if (ctx->lineno) { - DB(DW_LNS_advance_line); DSV(ctx->lineno-1); - } - DB(DW_LNS_copy); - DB(DW_LNS_advance_pc); DUV(ctx->szmcode); - DLNE(DW_LNE_end_sequence, 0); - ) - - ctx->p = p; -} - -#undef DLNE - -/* Undef shortcuts. */ -#undef DB -#undef DI8 -#undef DU16 -#undef DU32 -#undef DADDR -#undef DUV -#undef DSV -#undef DSTR -#undef DALIGNNOP -#undef DSECT - -/* Type of a section initializer callback. */ -typedef void (LJ_FASTCALL *GDBJITinitf)(GDBJITctx *ctx); - -/* Call section initializer and set the section offset and size. */ -static void gdbjit_initsect(GDBJITctx *ctx, int sect, GDBJITinitf initf) -{ - ctx->startp = ctx->p; - ctx->obj.sect[sect].ofs = (uintptr_t)((char *)ctx->p - (char *)&ctx->obj); - initf(ctx); - ctx->obj.sect[sect].size = (uintptr_t)(ctx->p - ctx->startp); -} - -#define SECTALIGN(p, a) \ - ((p) = (uint8_t *)(((uintptr_t)(p) + ((a)-1)) & ~(uintptr_t)((a)-1))) - -/* Build in-memory ELF object. */ -static void gdbjit_buildobj(GDBJITctx *ctx) -{ - GDBJITobj *obj = &ctx->obj; - /* Fill in ELF header and clear structures. */ - memcpy(&obj->hdr, &elfhdr_template, sizeof(ELFheader)); - memset(&obj->sect, 0, sizeof(ELFsectheader)*GDBJIT_SECT__MAX); - memset(&obj->sym, 0, sizeof(ELFsymbol)*GDBJIT_SYM__MAX); - /* Initialize sections. */ - ctx->p = obj->space; - gdbjit_initsect(ctx, GDBJIT_SECT_shstrtab, gdbjit_secthdr); - gdbjit_initsect(ctx, GDBJIT_SECT_strtab, gdbjit_symtab); - gdbjit_initsect(ctx, GDBJIT_SECT_debug_info, gdbjit_debuginfo); - gdbjit_initsect(ctx, GDBJIT_SECT_debug_abbrev, gdbjit_debugabbrev); - gdbjit_initsect(ctx, GDBJIT_SECT_debug_line, gdbjit_debugline); - SECTALIGN(ctx->p, sizeof(uintptr_t)); - gdbjit_initsect(ctx, GDBJIT_SECT_eh_frame, gdbjit_ehframe); - ctx->objsize = (size_t)((char *)ctx->p - (char *)obj); - lua_assert(ctx->objsize < sizeof(GDBJITobj)); -} - -#undef SECTALIGN - -/* -- Interface to GDB JIT API -------------------------------------------- */ - -/* Add new entry to GDB JIT symbol chain. */ -static void gdbjit_newentry(lua_State *L, GDBJITctx *ctx) -{ - /* Allocate memory for GDB JIT entry and ELF object. */ - MSize sz = (MSize)(sizeof(GDBJITentryobj) - sizeof(GDBJITobj) + ctx->objsize); - GDBJITentryobj *eo = lj_mem_newt(L, sz, GDBJITentryobj); - memcpy(&eo->obj, &ctx->obj, ctx->objsize); /* Copy ELF object. */ - eo->sz = sz; - ctx->T->gdbjit_entry = (void *)eo; - /* Link new entry to chain and register it. */ - eo->entry.prev_entry = NULL; - eo->entry.next_entry = __jit_debug_descriptor.first_entry; - if (eo->entry.next_entry) - eo->entry.next_entry->prev_entry = &eo->entry; - eo->entry.symfile_addr = (const char *)&eo->obj; - eo->entry.symfile_size = ctx->objsize; - __jit_debug_descriptor.first_entry = &eo->entry; - __jit_debug_descriptor.relevant_entry = &eo->entry; - __jit_debug_descriptor.action_flag = GDBJIT_REGISTER; - __jit_debug_register_code(); -} - -/* Add debug info for newly compiled trace and notify GDB. */ -void lj_gdbjit_addtrace(jit_State *J, GCtrace *T) -{ - GDBJITctx ctx; - GCproto *pt = &gcref(T->startpt)->pt; - TraceNo parent = T->ir[REF_BASE].op1; - const BCIns *startpc = mref(T->startpc, const BCIns); - ctx.T = T; - ctx.mcaddr = (uintptr_t)T->mcode; - ctx.szmcode = T->szmcode; - ctx.spadjp = CFRAME_SIZE_JIT + - (MSize)(parent ? traceref(J, parent)->spadjust : 0); - ctx.spadj = CFRAME_SIZE_JIT + T->spadjust; - lua_assert(startpc >= proto_bc(pt) && startpc < proto_bc(pt) + pt->sizebc); - ctx.lineno = lj_debug_line(pt, proto_bcpos(pt, startpc)); - ctx.filename = proto_chunknamestr(pt); - if (*ctx.filename == '@' || *ctx.filename == '=') - ctx.filename++; - else - ctx.filename = "(string)"; - gdbjit_buildobj(&ctx); - gdbjit_newentry(J->L, &ctx); -} - -/* Delete debug info for trace and notify GDB. */ -void lj_gdbjit_deltrace(jit_State *J, GCtrace *T) -{ - GDBJITentryobj *eo = (GDBJITentryobj *)T->gdbjit_entry; - if (eo) { - if (eo->entry.prev_entry) - eo->entry.prev_entry->next_entry = eo->entry.next_entry; - else - __jit_debug_descriptor.first_entry = eo->entry.next_entry; - if (eo->entry.next_entry) - eo->entry.next_entry->prev_entry = eo->entry.prev_entry; - __jit_debug_descriptor.relevant_entry = &eo->entry; - __jit_debug_descriptor.action_flag = GDBJIT_UNREGISTER; - __jit_debug_register_code(); - lj_mem_free(J2G(J), eo, eo->sz); - } -} - -#endif -#endif diff --git a/deps/luajit/src/lj_gdbjit.h b/deps/luajit/src/lj_gdbjit.h deleted file mode 100644 index 49c58630..00000000 --- a/deps/luajit/src/lj_gdbjit.h +++ /dev/null @@ -1,22 +0,0 @@ -/* -** Client for the GDB JIT API. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#ifndef _LJ_GDBJIT_H -#define _LJ_GDBJIT_H - -#include "lj_obj.h" -#include "lj_jit.h" - -#if LJ_HASJIT && defined(LUAJIT_USE_GDBJIT) - -LJ_FUNC void lj_gdbjit_addtrace(jit_State *J, GCtrace *T); -LJ_FUNC void lj_gdbjit_deltrace(jit_State *J, GCtrace *T); - -#else -#define lj_gdbjit_addtrace(J, T) UNUSED(T) -#define lj_gdbjit_deltrace(J, T) UNUSED(T) -#endif - -#endif diff --git a/deps/luajit/src/lj_ir.c b/deps/luajit/src/lj_ir.c deleted file mode 100644 index 439f3fc3..00000000 --- a/deps/luajit/src/lj_ir.c +++ /dev/null @@ -1,501 +0,0 @@ -/* -** SSA IR (Intermediate Representation) emitter. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#define lj_ir_c -#define LUA_CORE - -/* For pointers to libc/libm functions. */ -#include -#include - -#include "lj_obj.h" - -#if LJ_HASJIT - -#include "lj_gc.h" -#include "lj_str.h" -#include "lj_tab.h" -#include "lj_ir.h" -#include "lj_jit.h" -#include "lj_ircall.h" -#include "lj_iropt.h" -#include "lj_trace.h" -#if LJ_HASFFI -#include "lj_ctype.h" -#include "lj_cdata.h" -#include "lj_carith.h" -#endif -#include "lj_vm.h" -#include "lj_strscan.h" -#include "lj_lib.h" - -/* Some local macros to save typing. Undef'd at the end. */ -#define IR(ref) (&J->cur.ir[(ref)]) -#define fins (&J->fold.ins) - -/* Pass IR on to next optimization in chain (FOLD). */ -#define emitir(ot, a, b) (lj_ir_set(J, (ot), (a), (b)), lj_opt_fold(J)) - -/* -- IR tables ----------------------------------------------------------- */ - -/* IR instruction modes. */ -LJ_DATADEF const uint8_t lj_ir_mode[IR__MAX+1] = { -IRDEF(IRMODE) - 0 -}; - -/* IR type sizes. */ -LJ_DATADEF const uint8_t lj_ir_type_size[IRT__MAX+1] = { -#define IRTSIZE(name, size) size, -IRTDEF(IRTSIZE) -#undef IRTSIZE - 0 -}; - -/* C call info for CALL* instructions. */ -LJ_DATADEF const CCallInfo lj_ir_callinfo[] = { -#define IRCALLCI(cond, name, nargs, kind, type, flags) \ - { (ASMFunction)IRCALLCOND_##cond(name), \ - (nargs)|(CCI_CALL_##kind)|(IRT_##type<irbuf + J->irbotlim; - MSize szins = J->irtoplim - J->irbotlim; - if (szins) { - baseir = (IRIns *)lj_mem_realloc(J->L, baseir, szins*sizeof(IRIns), - 2*szins*sizeof(IRIns)); - J->irtoplim = J->irbotlim + 2*szins; - } else { - baseir = (IRIns *)lj_mem_realloc(J->L, NULL, 0, LJ_MIN_IRSZ*sizeof(IRIns)); - J->irbotlim = REF_BASE - LJ_MIN_IRSZ/4; - J->irtoplim = J->irbotlim + LJ_MIN_IRSZ; - } - J->cur.ir = J->irbuf = baseir - J->irbotlim; -} - -/* Grow IR buffer at the bottom or shift it up. */ -static void lj_ir_growbot(jit_State *J) -{ - IRIns *baseir = J->irbuf + J->irbotlim; - MSize szins = J->irtoplim - J->irbotlim; - lua_assert(szins != 0); - lua_assert(J->cur.nk == J->irbotlim); - if (J->cur.nins + (szins >> 1) < J->irtoplim) { - /* More than half of the buffer is free on top: shift up by a quarter. */ - MSize ofs = szins >> 2; - memmove(baseir + ofs, baseir, (J->cur.nins - J->irbotlim)*sizeof(IRIns)); - J->irbotlim -= ofs; - J->irtoplim -= ofs; - J->cur.ir = J->irbuf = baseir - J->irbotlim; - } else { - /* Double the buffer size, but split the growth amongst top/bottom. */ - IRIns *newbase = lj_mem_newt(J->L, 2*szins*sizeof(IRIns), IRIns); - MSize ofs = szins >= 256 ? 128 : (szins >> 1); /* Limit bottom growth. */ - memcpy(newbase + ofs, baseir, (J->cur.nins - J->irbotlim)*sizeof(IRIns)); - lj_mem_free(G(J->L), baseir, szins*sizeof(IRIns)); - J->irbotlim -= ofs; - J->irtoplim = J->irbotlim + 2*szins; - J->cur.ir = J->irbuf = newbase - J->irbotlim; - } -} - -/* Emit IR without any optimizations. */ -TRef LJ_FASTCALL lj_ir_emit(jit_State *J) -{ - IRRef ref = lj_ir_nextins(J); - IRIns *ir = IR(ref); - IROp op = fins->o; - ir->prev = J->chain[op]; - J->chain[op] = (IRRef1)ref; - ir->o = op; - ir->op1 = fins->op1; - ir->op2 = fins->op2; - J->guardemit.irt |= fins->t.irt; - return TREF(ref, irt_t((ir->t = fins->t))); -} - -/* Emit call to a C function. */ -TRef lj_ir_call(jit_State *J, IRCallID id, ...) -{ - const CCallInfo *ci = &lj_ir_callinfo[id]; - uint32_t n = CCI_NARGS(ci); - TRef tr = TREF_NIL; - va_list argp; - va_start(argp, id); - if ((ci->flags & CCI_L)) n--; - if (n > 0) - tr = va_arg(argp, IRRef); - while (n-- > 1) - tr = emitir(IRT(IR_CARG, IRT_NIL), tr, va_arg(argp, IRRef)); - va_end(argp); - if (CCI_OP(ci) == IR_CALLS) - J->needsnap = 1; /* Need snapshot after call with side effect. */ - return emitir(CCI_OPTYPE(ci), tr, id); -} - -/* -- Interning of constants ---------------------------------------------- */ - -/* -** IR instructions for constants are kept between J->cur.nk >= ref < REF_BIAS. -** They are chained like all other instructions, but grow downwards. -** The are interned (like strings in the VM) to facilitate reference -** comparisons. The same constant must get the same reference. -*/ - -/* Get ref of next IR constant and optionally grow IR. -** Note: this may invalidate all IRIns *! -*/ -static LJ_AINLINE IRRef ir_nextk(jit_State *J) -{ - IRRef ref = J->cur.nk; - if (LJ_UNLIKELY(ref <= J->irbotlim)) lj_ir_growbot(J); - J->cur.nk = --ref; - return ref; -} - -/* Intern int32_t constant. */ -TRef LJ_FASTCALL lj_ir_kint(jit_State *J, int32_t k) -{ - IRIns *ir, *cir = J->cur.ir; - IRRef ref; - for (ref = J->chain[IR_KINT]; ref; ref = cir[ref].prev) - if (cir[ref].i == k) - goto found; - ref = ir_nextk(J); - ir = IR(ref); - ir->i = k; - ir->t.irt = IRT_INT; - ir->o = IR_KINT; - ir->prev = J->chain[IR_KINT]; - J->chain[IR_KINT] = (IRRef1)ref; -found: - return TREF(ref, IRT_INT); -} - -/* The MRef inside the KNUM/KINT64 IR instructions holds the address of the -** 64 bit constant. The constants themselves are stored in a chained array -** and shared across traces. -** -** Rationale for choosing this data structure: -** - The address of the constants is embedded in the generated machine code -** and must never move. A resizable array or hash table wouldn't work. -** - Most apps need very few non-32 bit integer constants (less than a dozen). -** - Linear search is hard to beat in terms of speed and low complexity. -*/ -typedef struct K64Array { - MRef next; /* Pointer to next list. */ - MSize numk; /* Number of used elements in this array. */ - TValue k[LJ_MIN_K64SZ]; /* Array of constants. */ -} K64Array; - -/* Free all chained arrays. */ -void lj_ir_k64_freeall(jit_State *J) -{ - K64Array *k; - for (k = mref(J->k64, K64Array); k; ) { - K64Array *next = mref(k->next, K64Array); - lj_mem_free(J2G(J), k, sizeof(K64Array)); - k = next; - } -} - -/* Find 64 bit constant in chained array or add it. */ -cTValue *lj_ir_k64_find(jit_State *J, uint64_t u64) -{ - K64Array *k, *kp = NULL; - TValue *ntv; - MSize idx; - /* Search for the constant in the whole chain of arrays. */ - for (k = mref(J->k64, K64Array); k; k = mref(k->next, K64Array)) { - kp = k; /* Remember previous element in list. */ - for (idx = 0; idx < k->numk; idx++) { /* Search one array. */ - TValue *tv = &k->k[idx]; - if (tv->u64 == u64) /* Needed for +-0/NaN/absmask. */ - return tv; - } - } - /* Constant was not found, need to add it. */ - if (!(kp && kp->numk < LJ_MIN_K64SZ)) { /* Allocate a new array. */ - K64Array *kn = lj_mem_newt(J->L, sizeof(K64Array), K64Array); - setmref(kn->next, NULL); - kn->numk = 0; - if (kp) - setmref(kp->next, kn); /* Chain to the end of the list. */ - else - setmref(J->k64, kn); /* Link first array. */ - kp = kn; - } - ntv = &kp->k[kp->numk++]; /* Add to current array. */ - ntv->u64 = u64; - return ntv; -} - -/* Intern 64 bit constant, given by its address. */ -TRef lj_ir_k64(jit_State *J, IROp op, cTValue *tv) -{ - IRIns *ir, *cir = J->cur.ir; - IRRef ref; - IRType t = op == IR_KNUM ? IRT_NUM : IRT_I64; - for (ref = J->chain[op]; ref; ref = cir[ref].prev) - if (ir_k64(&cir[ref]) == tv) - goto found; - ref = ir_nextk(J); - ir = IR(ref); - lua_assert(checkptr32(tv)); - setmref(ir->ptr, tv); - ir->t.irt = t; - ir->o = op; - ir->prev = J->chain[op]; - J->chain[op] = (IRRef1)ref; -found: - return TREF(ref, t); -} - -/* Intern FP constant, given by its 64 bit pattern. */ -TRef lj_ir_knum_u64(jit_State *J, uint64_t u64) -{ - return lj_ir_k64(J, IR_KNUM, lj_ir_k64_find(J, u64)); -} - -/* Intern 64 bit integer constant. */ -TRef lj_ir_kint64(jit_State *J, uint64_t u64) -{ - return lj_ir_k64(J, IR_KINT64, lj_ir_k64_find(J, u64)); -} - -/* Check whether a number is int and return it. -0 is NOT considered an int. */ -static int numistrueint(lua_Number n, int32_t *kp) -{ - int32_t k = lj_num2int(n); - if (n == (lua_Number)k) { - if (kp) *kp = k; - if (k == 0) { /* Special check for -0. */ - TValue tv; - setnumV(&tv, n); - if (tv.u32.hi != 0) - return 0; - } - return 1; - } - return 0; -} - -/* Intern number as int32_t constant if possible, otherwise as FP constant. */ -TRef lj_ir_knumint(jit_State *J, lua_Number n) -{ - int32_t k; - if (numistrueint(n, &k)) - return lj_ir_kint(J, k); - else - return lj_ir_knum(J, n); -} - -/* Intern GC object "constant". */ -TRef lj_ir_kgc(jit_State *J, GCobj *o, IRType t) -{ - IRIns *ir, *cir = J->cur.ir; - IRRef ref; - lua_assert(!isdead(J2G(J), o)); - for (ref = J->chain[IR_KGC]; ref; ref = cir[ref].prev) - if (ir_kgc(&cir[ref]) == o) - goto found; - ref = ir_nextk(J); - ir = IR(ref); - /* NOBARRIER: Current trace is a GC root. */ - setgcref(ir->gcr, o); - ir->t.irt = (uint8_t)t; - ir->o = IR_KGC; - ir->prev = J->chain[IR_KGC]; - J->chain[IR_KGC] = (IRRef1)ref; -found: - return TREF(ref, t); -} - -/* Intern 32 bit pointer constant. */ -TRef lj_ir_kptr_(jit_State *J, IROp op, void *ptr) -{ - IRIns *ir, *cir = J->cur.ir; - IRRef ref; - lua_assert((void *)(intptr_t)i32ptr(ptr) == ptr); - for (ref = J->chain[op]; ref; ref = cir[ref].prev) - if (mref(cir[ref].ptr, void) == ptr) - goto found; - ref = ir_nextk(J); - ir = IR(ref); - setmref(ir->ptr, ptr); - ir->t.irt = IRT_P32; - ir->o = op; - ir->prev = J->chain[op]; - J->chain[op] = (IRRef1)ref; -found: - return TREF(ref, IRT_P32); -} - -/* Intern typed NULL constant. */ -TRef lj_ir_knull(jit_State *J, IRType t) -{ - IRIns *ir, *cir = J->cur.ir; - IRRef ref; - for (ref = J->chain[IR_KNULL]; ref; ref = cir[ref].prev) - if (irt_t(cir[ref].t) == t) - goto found; - ref = ir_nextk(J); - ir = IR(ref); - ir->i = 0; - ir->t.irt = (uint8_t)t; - ir->o = IR_KNULL; - ir->prev = J->chain[IR_KNULL]; - J->chain[IR_KNULL] = (IRRef1)ref; -found: - return TREF(ref, t); -} - -/* Intern key slot. */ -TRef lj_ir_kslot(jit_State *J, TRef key, IRRef slot) -{ - IRIns *ir, *cir = J->cur.ir; - IRRef2 op12 = IRREF2((IRRef1)key, (IRRef1)slot); - IRRef ref; - /* Const part is not touched by CSE/DCE, so 0-65535 is ok for IRMlit here. */ - lua_assert(tref_isk(key) && slot == (IRRef)(IRRef1)slot); - for (ref = J->chain[IR_KSLOT]; ref; ref = cir[ref].prev) - if (cir[ref].op12 == op12) - goto found; - ref = ir_nextk(J); - ir = IR(ref); - ir->op12 = op12; - ir->t.irt = IRT_P32; - ir->o = IR_KSLOT; - ir->prev = J->chain[IR_KSLOT]; - J->chain[IR_KSLOT] = (IRRef1)ref; -found: - return TREF(ref, IRT_P32); -} - -/* -- Access to IR constants ---------------------------------------------- */ - -/* Copy value of IR constant. */ -void lj_ir_kvalue(lua_State *L, TValue *tv, const IRIns *ir) -{ - UNUSED(L); - lua_assert(ir->o != IR_KSLOT); /* Common mistake. */ - switch (ir->o) { - case IR_KPRI: setitype(tv, irt_toitype(ir->t)); break; - case IR_KINT: setintV(tv, ir->i); break; - case IR_KGC: setgcV(L, tv, ir_kgc(ir), irt_toitype(ir->t)); break; - case IR_KPTR: case IR_KKPTR: case IR_KNULL: - setlightudV(tv, mref(ir->ptr, void)); - break; - case IR_KNUM: setnumV(tv, ir_knum(ir)->n); break; -#if LJ_HASFFI - case IR_KINT64: { - GCcdata *cd = lj_cdata_new_(L, CTID_INT64, 8); - *(uint64_t *)cdataptr(cd) = ir_kint64(ir)->u64; - setcdataV(L, tv, cd); - break; - } -#endif - default: lua_assert(0); break; - } -} - -/* -- Convert IR operand types -------------------------------------------- */ - -/* Convert from string to number. */ -TRef LJ_FASTCALL lj_ir_tonumber(jit_State *J, TRef tr) -{ - if (!tref_isnumber(tr)) { - if (tref_isstr(tr)) - tr = emitir(IRTG(IR_STRTO, IRT_NUM), tr, 0); - else - lj_trace_err(J, LJ_TRERR_BADTYPE); - } - return tr; -} - -/* Convert from integer or string to number. */ -TRef LJ_FASTCALL lj_ir_tonum(jit_State *J, TRef tr) -{ - if (!tref_isnum(tr)) { - if (tref_isinteger(tr)) - tr = emitir(IRTN(IR_CONV), tr, IRCONV_NUM_INT); - else if (tref_isstr(tr)) - tr = emitir(IRTG(IR_STRTO, IRT_NUM), tr, 0); - else - lj_trace_err(J, LJ_TRERR_BADTYPE); - } - return tr; -} - -/* Convert from integer or number to string. */ -TRef LJ_FASTCALL lj_ir_tostr(jit_State *J, TRef tr) -{ - if (!tref_isstr(tr)) { - if (!tref_isnumber(tr)) - lj_trace_err(J, LJ_TRERR_BADTYPE); - tr = emitir(IRT(IR_TOSTR, IRT_STR), tr, 0); - } - return tr; -} - -/* -- Miscellaneous IR ops ------------------------------------------------ */ - -/* Evaluate numeric comparison. */ -int lj_ir_numcmp(lua_Number a, lua_Number b, IROp op) -{ - switch (op) { - case IR_EQ: return (a == b); - case IR_NE: return (a != b); - case IR_LT: return (a < b); - case IR_GE: return (a >= b); - case IR_LE: return (a <= b); - case IR_GT: return (a > b); - case IR_ULT: return !(a >= b); - case IR_UGE: return !(a < b); - case IR_ULE: return !(a > b); - case IR_UGT: return !(a <= b); - default: lua_assert(0); return 0; - } -} - -/* Evaluate string comparison. */ -int lj_ir_strcmp(GCstr *a, GCstr *b, IROp op) -{ - int res = lj_str_cmp(a, b); - switch (op) { - case IR_LT: return (res < 0); - case IR_GE: return (res >= 0); - case IR_LE: return (res <= 0); - case IR_GT: return (res > 0); - default: lua_assert(0); return 0; - } -} - -/* Rollback IR to previous state. */ -void lj_ir_rollback(jit_State *J, IRRef ref) -{ - IRRef nins = J->cur.nins; - while (nins > ref) { - IRIns *ir; - nins--; - ir = IR(nins); - J->chain[ir->o] = ir->prev; - } - J->cur.nins = nins; -} - -#undef IR -#undef fins -#undef emitir - -#endif diff --git a/deps/luajit/src/lj_ir.h b/deps/luajit/src/lj_ir.h deleted file mode 100644 index 8126482e..00000000 --- a/deps/luajit/src/lj_ir.h +++ /dev/null @@ -1,551 +0,0 @@ -/* -** SSA IR (Intermediate Representation) format. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#ifndef _LJ_IR_H -#define _LJ_IR_H - -#include "lj_obj.h" - -/* -- IR instructions ----------------------------------------------------- */ - -/* IR instruction definition. Order matters, see below. ORDER IR */ -#define IRDEF(_) \ - /* Guarded assertions. */ \ - /* Must be properly aligned to flip opposites (^1) and (un)ordered (^4). */ \ - _(LT, N , ref, ref) \ - _(GE, N , ref, ref) \ - _(LE, N , ref, ref) \ - _(GT, N , ref, ref) \ - \ - _(ULT, N , ref, ref) \ - _(UGE, N , ref, ref) \ - _(ULE, N , ref, ref) \ - _(UGT, N , ref, ref) \ - \ - _(EQ, C , ref, ref) \ - _(NE, C , ref, ref) \ - \ - _(ABC, N , ref, ref) \ - _(RETF, S , ref, ref) \ - \ - /* Miscellaneous ops. */ \ - _(NOP, N , ___, ___) \ - _(BASE, N , lit, lit) \ - _(PVAL, N , lit, ___) \ - _(GCSTEP, S , ___, ___) \ - _(HIOP, S , ref, ref) \ - _(LOOP, S , ___, ___) \ - _(USE, S , ref, ___) \ - _(PHI, S , ref, ref) \ - _(RENAME, S , ref, lit) \ - \ - /* Constants. */ \ - _(KPRI, N , ___, ___) \ - _(KINT, N , cst, ___) \ - _(KGC, N , cst, ___) \ - _(KPTR, N , cst, ___) \ - _(KKPTR, N , cst, ___) \ - _(KNULL, N , cst, ___) \ - _(KNUM, N , cst, ___) \ - _(KINT64, N , cst, ___) \ - _(KSLOT, N , ref, lit) \ - \ - /* Bit ops. */ \ - _(BNOT, N , ref, ___) \ - _(BSWAP, N , ref, ___) \ - _(BAND, C , ref, ref) \ - _(BOR, C , ref, ref) \ - _(BXOR, C , ref, ref) \ - _(BSHL, N , ref, ref) \ - _(BSHR, N , ref, ref) \ - _(BSAR, N , ref, ref) \ - _(BROL, N , ref, ref) \ - _(BROR, N , ref, ref) \ - \ - /* Arithmetic ops. ORDER ARITH */ \ - _(ADD, C , ref, ref) \ - _(SUB, N , ref, ref) \ - _(MUL, C , ref, ref) \ - _(DIV, N , ref, ref) \ - _(MOD, N , ref, ref) \ - _(POW, N , ref, ref) \ - _(NEG, N , ref, ref) \ - \ - _(ABS, N , ref, ref) \ - _(ATAN2, N , ref, ref) \ - _(LDEXP, N , ref, ref) \ - _(MIN, C , ref, ref) \ - _(MAX, C , ref, ref) \ - _(FPMATH, N , ref, lit) \ - \ - /* Overflow-checking arithmetic ops. */ \ - _(ADDOV, CW, ref, ref) \ - _(SUBOV, NW, ref, ref) \ - _(MULOV, CW, ref, ref) \ - \ - /* Memory ops. A = array, H = hash, U = upvalue, F = field, S = stack. */ \ - \ - /* Memory references. */ \ - _(AREF, R , ref, ref) \ - _(HREFK, R , ref, ref) \ - _(HREF, L , ref, ref) \ - _(NEWREF, S , ref, ref) \ - _(UREFO, LW, ref, lit) \ - _(UREFC, LW, ref, lit) \ - _(FREF, R , ref, lit) \ - _(STRREF, N , ref, ref) \ - \ - /* Loads and Stores. These must be in the same order. */ \ - _(ALOAD, L , ref, ___) \ - _(HLOAD, L , ref, ___) \ - _(ULOAD, L , ref, ___) \ - _(FLOAD, L , ref, lit) \ - _(XLOAD, L , ref, lit) \ - _(SLOAD, L , lit, lit) \ - _(VLOAD, L , ref, ___) \ - \ - _(ASTORE, S , ref, ref) \ - _(HSTORE, S , ref, ref) \ - _(USTORE, S , ref, ref) \ - _(FSTORE, S , ref, ref) \ - _(XSTORE, S , ref, ref) \ - \ - /* Allocations. */ \ - _(SNEW, N , ref, ref) /* CSE is ok, not marked as A. */ \ - _(XSNEW, A , ref, ref) \ - _(TNEW, AW, lit, lit) \ - _(TDUP, AW, ref, ___) \ - _(CNEW, AW, ref, ref) \ - _(CNEWI, NW, ref, ref) /* CSE is ok, not marked as A. */ \ - \ - /* Barriers. */ \ - _(TBAR, S , ref, ___) \ - _(OBAR, S , ref, ref) \ - _(XBAR, S , ___, ___) \ - \ - /* Type conversions. */ \ - _(CONV, NW, ref, lit) \ - _(TOBIT, N , ref, ref) \ - _(TOSTR, N , ref, ___) \ - _(STRTO, N , ref, ___) \ - \ - /* Calls. */ \ - _(CALLN, N , ref, lit) \ - _(CALLL, L , ref, lit) \ - _(CALLS, S , ref, lit) \ - _(CALLXS, S , ref, ref) \ - _(CARG, N , ref, ref) \ - \ - /* End of list. */ - -/* IR opcodes (max. 256). */ -typedef enum { -#define IRENUM(name, m, m1, m2) IR_##name, -IRDEF(IRENUM) -#undef IRENUM - IR__MAX -} IROp; - -/* Stored opcode. */ -typedef uint8_t IROp1; - -LJ_STATIC_ASSERT(((int)IR_EQ^1) == (int)IR_NE); -LJ_STATIC_ASSERT(((int)IR_LT^1) == (int)IR_GE); -LJ_STATIC_ASSERT(((int)IR_LE^1) == (int)IR_GT); -LJ_STATIC_ASSERT(((int)IR_LT^3) == (int)IR_GT); -LJ_STATIC_ASSERT(((int)IR_LT^4) == (int)IR_ULT); - -/* Delta between xLOAD and xSTORE. */ -#define IRDELTA_L2S ((int)IR_ASTORE - (int)IR_ALOAD) - -LJ_STATIC_ASSERT((int)IR_HLOAD + IRDELTA_L2S == (int)IR_HSTORE); -LJ_STATIC_ASSERT((int)IR_ULOAD + IRDELTA_L2S == (int)IR_USTORE); -LJ_STATIC_ASSERT((int)IR_FLOAD + IRDELTA_L2S == (int)IR_FSTORE); -LJ_STATIC_ASSERT((int)IR_XLOAD + IRDELTA_L2S == (int)IR_XSTORE); - -/* -- Named IR literals --------------------------------------------------- */ - -/* FPMATH sub-functions. ORDER FPM. */ -#define IRFPMDEF(_) \ - _(FLOOR) _(CEIL) _(TRUNC) /* Must be first and in this order. */ \ - _(SQRT) _(EXP) _(EXP2) _(LOG) _(LOG2) _(LOG10) \ - _(SIN) _(COS) _(TAN) \ - _(OTHER) - -typedef enum { -#define FPMENUM(name) IRFPM_##name, -IRFPMDEF(FPMENUM) -#undef FPMENUM - IRFPM__MAX -} IRFPMathOp; - -/* FLOAD fields. */ -#define IRFLDEF(_) \ - _(STR_LEN, offsetof(GCstr, len)) \ - _(FUNC_ENV, offsetof(GCfunc, l.env)) \ - _(FUNC_PC, offsetof(GCfunc, l.pc)) \ - _(TAB_META, offsetof(GCtab, metatable)) \ - _(TAB_ARRAY, offsetof(GCtab, array)) \ - _(TAB_NODE, offsetof(GCtab, node)) \ - _(TAB_ASIZE, offsetof(GCtab, asize)) \ - _(TAB_HMASK, offsetof(GCtab, hmask)) \ - _(TAB_NOMM, offsetof(GCtab, nomm)) \ - _(UDATA_META, offsetof(GCudata, metatable)) \ - _(UDATA_UDTYPE, offsetof(GCudata, udtype)) \ - _(UDATA_FILE, sizeof(GCudata)) \ - _(CDATA_CTYPEID, offsetof(GCcdata, ctypeid)) \ - _(CDATA_PTR, sizeof(GCcdata)) \ - _(CDATA_INT, sizeof(GCcdata)) \ - _(CDATA_INT64, sizeof(GCcdata)) \ - _(CDATA_INT64_4, sizeof(GCcdata) + 4) - -typedef enum { -#define FLENUM(name, ofs) IRFL_##name, -IRFLDEF(FLENUM) -#undef FLENUM - IRFL__MAX -} IRFieldID; - -/* SLOAD mode bits, stored in op2. */ -#define IRSLOAD_PARENT 0x01 /* Coalesce with parent trace. */ -#define IRSLOAD_FRAME 0x02 /* Load hiword of frame. */ -#define IRSLOAD_TYPECHECK 0x04 /* Needs type check. */ -#define IRSLOAD_CONVERT 0x08 /* Number to integer conversion. */ -#define IRSLOAD_READONLY 0x10 /* Read-only, omit slot store. */ -#define IRSLOAD_INHERIT 0x20 /* Inherited by exits/side traces. */ - -/* XLOAD mode, stored in op2. */ -#define IRXLOAD_READONLY 1 /* Load from read-only data. */ -#define IRXLOAD_VOLATILE 2 /* Load from volatile data. */ -#define IRXLOAD_UNALIGNED 4 /* Unaligned load. */ - -/* CONV mode, stored in op2. */ -#define IRCONV_SRCMASK 0x001f /* Source IRType. */ -#define IRCONV_DSTMASK 0x03e0 /* Dest. IRType (also in ir->t). */ -#define IRCONV_DSH 5 -#define IRCONV_NUM_INT ((IRT_NUM<>2)&3)) -#define irm_iscomm(m) ((m) & IRM_C) -#define irm_kind(m) ((m) & IRM_S) - -#define IRMODE(name, m, m1, m2) (((IRM##m1)|((IRM##m2)<<2)|(IRM_##m))^IRM_W), - -LJ_DATA const uint8_t lj_ir_mode[IR__MAX+1]; - -/* -- IR instruction types ------------------------------------------------ */ - -/* Map of itypes to non-negative numbers. ORDER LJ_T. -** LJ_TUPVAL/LJ_TTRACE never appear in a TValue. Use these itypes for -** IRT_P32 and IRT_P64, which never escape the IR. -** The various integers are only used in the IR and can only escape to -** a TValue after implicit or explicit conversion. Their types must be -** contiguous and next to IRT_NUM (see the typerange macros below). -*/ -#define IRTDEF(_) \ - _(NIL, 4) _(FALSE, 4) _(TRUE, 4) _(LIGHTUD, LJ_64 ? 8 : 4) _(STR, 4) \ - _(P32, 4) _(THREAD, 4) _(PROTO, 4) _(FUNC, 4) _(P64, 8) _(CDATA, 4) \ - _(TAB, 4) _(UDATA, 4) \ - _(FLOAT, 4) _(NUM, 8) _(I8, 1) _(U8, 1) _(I16, 2) _(U16, 2) \ - _(INT, 4) _(U32, 4) _(I64, 8) _(U64, 8) \ - _(SOFTFP, 4) /* There is room for 9 more types. */ - -/* IR result type and flags (8 bit). */ -typedef enum { -#define IRTENUM(name, size) IRT_##name, -IRTDEF(IRTENUM) -#undef IRTENUM - IRT__MAX, - - /* Native pointer type and the corresponding integer type. */ - IRT_PTR = LJ_64 ? IRT_P64 : IRT_P32, - IRT_INTP = LJ_64 ? IRT_I64 : IRT_INT, - IRT_UINTP = LJ_64 ? IRT_U64 : IRT_U32, - - /* Additional flags. */ - IRT_MARK = 0x20, /* Marker for misc. purposes. */ - IRT_ISPHI = 0x40, /* Instruction is left or right PHI operand. */ - IRT_GUARD = 0x80, /* Instruction is a guard. */ - - /* Masks. */ - IRT_TYPE = 0x1f, - IRT_T = 0xff -} IRType; - -#define irtype_ispri(irt) ((uint32_t)(irt) <= IRT_TRUE) - -/* Stored IRType. */ -typedef struct IRType1 { uint8_t irt; } IRType1; - -#define IRT(o, t) ((uint32_t)(((o)<<8) | (t))) -#define IRTI(o) (IRT((o), IRT_INT)) -#define IRTN(o) (IRT((o), IRT_NUM)) -#define IRTG(o, t) (IRT((o), IRT_GUARD|(t))) -#define IRTGI(o) (IRT((o), IRT_GUARD|IRT_INT)) - -#define irt_t(t) ((IRType)(t).irt) -#define irt_type(t) ((IRType)((t).irt & IRT_TYPE)) -#define irt_sametype(t1, t2) ((((t1).irt ^ (t2).irt) & IRT_TYPE) == 0) -#define irt_typerange(t, first, last) \ - ((uint32_t)((t).irt & IRT_TYPE) - (uint32_t)(first) <= (uint32_t)(last-first)) - -#define irt_isnil(t) (irt_type(t) == IRT_NIL) -#define irt_ispri(t) ((uint32_t)irt_type(t) <= IRT_TRUE) -#define irt_islightud(t) (irt_type(t) == IRT_LIGHTUD) -#define irt_isstr(t) (irt_type(t) == IRT_STR) -#define irt_istab(t) (irt_type(t) == IRT_TAB) -#define irt_iscdata(t) (irt_type(t) == IRT_CDATA) -#define irt_isfloat(t) (irt_type(t) == IRT_FLOAT) -#define irt_isnum(t) (irt_type(t) == IRT_NUM) -#define irt_isint(t) (irt_type(t) == IRT_INT) -#define irt_isi8(t) (irt_type(t) == IRT_I8) -#define irt_isu8(t) (irt_type(t) == IRT_U8) -#define irt_isi16(t) (irt_type(t) == IRT_I16) -#define irt_isu16(t) (irt_type(t) == IRT_U16) -#define irt_isu32(t) (irt_type(t) == IRT_U32) -#define irt_isi64(t) (irt_type(t) == IRT_I64) -#define irt_isu64(t) (irt_type(t) == IRT_U64) - -#define irt_isfp(t) (irt_isnum(t) || irt_isfloat(t)) -#define irt_isinteger(t) (irt_typerange((t), IRT_I8, IRT_INT)) -#define irt_isgcv(t) (irt_typerange((t), IRT_STR, IRT_UDATA)) -#define irt_isaddr(t) (irt_typerange((t), IRT_LIGHTUD, IRT_UDATA)) -#define irt_isint64(t) (irt_typerange((t), IRT_I64, IRT_U64)) - -#if LJ_64 -#define IRT_IS64 \ - ((1u<> irt_type(t)) & 1) -#define irt_is64orfp(t) (((IRT_IS64|(1u<>irt_type(t)) & 1) - -#define irt_size(t) (lj_ir_type_size[irt_t((t))]) - -LJ_DATA const uint8_t lj_ir_type_size[]; - -static LJ_AINLINE IRType itype2irt(const TValue *tv) -{ - if (tvisint(tv)) - return IRT_INT; - else if (tvisnum(tv)) - return IRT_NUM; -#if LJ_64 - else if (tvislightud(tv)) - return IRT_LIGHTUD; -#endif - else - return (IRType)~itype(tv); -} - -static LJ_AINLINE uint32_t irt_toitype_(IRType t) -{ - lua_assert(!LJ_64 || t != IRT_LIGHTUD); - if (LJ_DUALNUM && t > IRT_NUM) { - return LJ_TISNUM; - } else { - lua_assert(t <= IRT_NUM); - return ~(uint32_t)t; - } -} - -#define irt_toitype(t) irt_toitype_(irt_type((t))) - -#define irt_isguard(t) ((t).irt & IRT_GUARD) -#define irt_ismarked(t) ((t).irt & IRT_MARK) -#define irt_setmark(t) ((t).irt |= IRT_MARK) -#define irt_clearmark(t) ((t).irt &= ~IRT_MARK) -#define irt_isphi(t) ((t).irt & IRT_ISPHI) -#define irt_setphi(t) ((t).irt |= IRT_ISPHI) -#define irt_clearphi(t) ((t).irt &= ~IRT_ISPHI) - -/* Stored combined IR opcode and type. */ -typedef uint16_t IROpT; - -/* -- IR references ------------------------------------------------------- */ - -/* IR references. */ -typedef uint16_t IRRef1; /* One stored reference. */ -typedef uint32_t IRRef2; /* Two stored references. */ -typedef uint32_t IRRef; /* Used to pass around references. */ - -/* Fixed references. */ -enum { - REF_BIAS = 0x8000, - REF_TRUE = REF_BIAS-3, - REF_FALSE = REF_BIAS-2, - REF_NIL = REF_BIAS-1, /* \--- Constants grow downwards. */ - REF_BASE = REF_BIAS, /* /--- IR grows upwards. */ - REF_FIRST = REF_BIAS+1, - REF_DROP = 0xffff -}; - -/* Note: IRMlit operands must be < REF_BIAS, too! -** This allows for fast and uniform manipulation of all operands -** without looking up the operand mode in lj_ir_mode: -** - CSE calculates the maximum reference of two operands. -** This must work with mixed reference/literal operands, too. -** - DCE marking only checks for operand >= REF_BIAS. -** - LOOP needs to substitute reference operands. -** Constant references and literals must not be modified. -*/ - -#define IRREF2(lo, hi) ((IRRef2)(lo) | ((IRRef2)(hi) << 16)) - -#define irref_isk(ref) ((ref) < REF_BIAS) - -/* Tagged IR references (32 bit). -** -** +-------+-------+---------------+ -** | irt | flags | ref | -** +-------+-------+---------------+ -** -** The tag holds a copy of the IRType and speeds up IR type checks. -*/ -typedef uint32_t TRef; - -#define TREF_REFMASK 0x0000ffff -#define TREF_FRAME 0x00010000 -#define TREF_CONT 0x00020000 - -#define TREF(ref, t) ((TRef)((ref) + ((t)<<24))) - -#define tref_ref(tr) ((IRRef1)(tr)) -#define tref_t(tr) ((IRType)((tr)>>24)) -#define tref_type(tr) ((IRType)(((tr)>>24) & IRT_TYPE)) -#define tref_typerange(tr, first, last) \ - ((((tr)>>24) & IRT_TYPE) - (TRef)(first) <= (TRef)(last-first)) - -#define tref_istype(tr, t) (((tr) & (IRT_TYPE<<24)) == ((t)<<24)) -#define tref_isnil(tr) (tref_istype((tr), IRT_NIL)) -#define tref_isfalse(tr) (tref_istype((tr), IRT_FALSE)) -#define tref_istrue(tr) (tref_istype((tr), IRT_TRUE)) -#define tref_isstr(tr) (tref_istype((tr), IRT_STR)) -#define tref_isfunc(tr) (tref_istype((tr), IRT_FUNC)) -#define tref_iscdata(tr) (tref_istype((tr), IRT_CDATA)) -#define tref_istab(tr) (tref_istype((tr), IRT_TAB)) -#define tref_isudata(tr) (tref_istype((tr), IRT_UDATA)) -#define tref_isnum(tr) (tref_istype((tr), IRT_NUM)) -#define tref_isint(tr) (tref_istype((tr), IRT_INT)) - -#define tref_isbool(tr) (tref_typerange((tr), IRT_FALSE, IRT_TRUE)) -#define tref_ispri(tr) (tref_typerange((tr), IRT_NIL, IRT_TRUE)) -#define tref_istruecond(tr) (!tref_typerange((tr), IRT_NIL, IRT_FALSE)) -#define tref_isinteger(tr) (tref_typerange((tr), IRT_I8, IRT_INT)) -#define tref_isnumber(tr) (tref_typerange((tr), IRT_NUM, IRT_INT)) -#define tref_isnumber_str(tr) (tref_isnumber((tr)) || tref_isstr((tr))) -#define tref_isgcv(tr) (tref_typerange((tr), IRT_STR, IRT_UDATA)) - -#define tref_isk(tr) (irref_isk(tref_ref((tr)))) -#define tref_isk2(tr1, tr2) (irref_isk(tref_ref((tr1) | (tr2)))) - -#define TREF_PRI(t) (TREF(REF_NIL-(t), (t))) -#define TREF_NIL (TREF_PRI(IRT_NIL)) -#define TREF_FALSE (TREF_PRI(IRT_FALSE)) -#define TREF_TRUE (TREF_PRI(IRT_TRUE)) - -/* -- IR format ----------------------------------------------------------- */ - -/* IR instruction format (64 bit). -** -** 16 16 8 8 8 8 -** +-------+-------+---+---+---+---+ -** | op1 | op2 | t | o | r | s | -** +-------+-------+---+---+---+---+ -** | op12/i/gco | ot | prev | (alternative fields in union) -** +---------------+-------+-------+ -** 32 16 16 -** -** prev is only valid prior to register allocation and then reused for r + s. -*/ - -typedef union IRIns { - struct { - LJ_ENDIAN_LOHI( - IRRef1 op1; /* IR operand 1. */ - , IRRef1 op2; /* IR operand 2. */ - ) - IROpT ot; /* IR opcode and type (overlaps t and o). */ - IRRef1 prev; /* Previous ins in same chain (overlaps r and s). */ - }; - struct { - IRRef2 op12; /* IR operand 1 and 2 (overlaps op1 and op2). */ - LJ_ENDIAN_LOHI( - IRType1 t; /* IR type. */ - , IROp1 o; /* IR opcode. */ - ) - LJ_ENDIAN_LOHI( - uint8_t r; /* Register allocation (overlaps prev). */ - , uint8_t s; /* Spill slot allocation (overlaps prev). */ - ) - }; - int32_t i; /* 32 bit signed integer literal (overlaps op12). */ - GCRef gcr; /* GCobj constant (overlaps op12). */ - MRef ptr; /* Pointer constant (overlaps op12). */ -} IRIns; - -#define ir_kgc(ir) check_exp((ir)->o == IR_KGC, gcref((ir)->gcr)) -#define ir_kstr(ir) (gco2str(ir_kgc((ir)))) -#define ir_ktab(ir) (gco2tab(ir_kgc((ir)))) -#define ir_kfunc(ir) (gco2func(ir_kgc((ir)))) -#define ir_kcdata(ir) (gco2cd(ir_kgc((ir)))) -#define ir_knum(ir) check_exp((ir)->o == IR_KNUM, mref((ir)->ptr, cTValue)) -#define ir_kint64(ir) check_exp((ir)->o == IR_KINT64, mref((ir)->ptr,cTValue)) -#define ir_k64(ir) \ - check_exp((ir)->o == IR_KNUM || (ir)->o == IR_KINT64, mref((ir)->ptr,cTValue)) -#define ir_kptr(ir) \ - check_exp((ir)->o == IR_KPTR || (ir)->o == IR_KKPTR, mref((ir)->ptr, void)) - -/* A store or any other op with a non-weak guard has a side-effect. */ -static LJ_AINLINE int ir_sideeff(IRIns *ir) -{ - return (((ir->t.irt | ~IRT_GUARD) & lj_ir_mode[ir->o]) >= IRM_S); -} - -LJ_STATIC_ASSERT((int)IRT_GUARD == (int)IRM_W); - -#endif diff --git a/deps/luajit/src/lj_ircall.h b/deps/luajit/src/lj_ircall.h deleted file mode 100644 index 893dac2f..00000000 --- a/deps/luajit/src/lj_ircall.h +++ /dev/null @@ -1,277 +0,0 @@ -/* -** IR CALL* instruction definitions. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#ifndef _LJ_IRCALL_H -#define _LJ_IRCALL_H - -#include "lj_obj.h" -#include "lj_ir.h" -#include "lj_jit.h" - -/* C call info for CALL* instructions. */ -typedef struct CCallInfo { - ASMFunction func; /* Function pointer. */ - uint32_t flags; /* Number of arguments and flags. */ -} CCallInfo; - -#define CCI_NARGS(ci) ((ci)->flags & 0xff) /* Extract # of args. */ -#define CCI_NARGS_MAX 32 /* Max. # of args. */ - -#define CCI_OTSHIFT 16 -#define CCI_OPTYPE(ci) ((ci)->flags >> CCI_OTSHIFT) /* Get op/type. */ -#define CCI_OPSHIFT 24 -#define CCI_OP(ci) ((ci)->flags >> CCI_OPSHIFT) /* Get op. */ - -#define CCI_CALL_N (IR_CALLN << CCI_OPSHIFT) -#define CCI_CALL_L (IR_CALLL << CCI_OPSHIFT) -#define CCI_CALL_S (IR_CALLS << CCI_OPSHIFT) -#define CCI_CALL_FN (CCI_CALL_N|CCI_CC_FASTCALL) -#define CCI_CALL_FL (CCI_CALL_L|CCI_CC_FASTCALL) -#define CCI_CALL_FS (CCI_CALL_S|CCI_CC_FASTCALL) - -/* C call info flags. */ -#define CCI_L 0x0100 /* Implicit L arg. */ -#define CCI_CASTU64 0x0200 /* Cast u64 result to number. */ -#define CCI_NOFPRCLOBBER 0x0400 /* Does not clobber any FPRs. */ -#define CCI_VARARG 0x0800 /* Vararg function. */ - -#define CCI_CC_MASK 0x3000 /* Calling convention mask. */ -#define CCI_CC_SHIFT 12 -/* ORDER CC */ -#define CCI_CC_CDECL 0x0000 /* Default cdecl calling convention. */ -#define CCI_CC_THISCALL 0x1000 /* Thiscall calling convention. */ -#define CCI_CC_FASTCALL 0x2000 /* Fastcall calling convention. */ -#define CCI_CC_STDCALL 0x3000 /* Stdcall calling convention. */ - -/* Helpers for conditional function definitions. */ -#define IRCALLCOND_ANY(x) x - -#if LJ_TARGET_X86ORX64 -#define IRCALLCOND_FPMATH(x) NULL -#else -#define IRCALLCOND_FPMATH(x) x -#endif - -#if LJ_SOFTFP -#define IRCALLCOND_SOFTFP(x) x -#if LJ_HASFFI -#define IRCALLCOND_SOFTFP_FFI(x) x -#else -#define IRCALLCOND_SOFTFP_FFI(x) NULL -#endif -#else -#define IRCALLCOND_SOFTFP(x) NULL -#define IRCALLCOND_SOFTFP_FFI(x) NULL -#endif - -#define LJ_NEED_FP64 (LJ_TARGET_ARM || LJ_TARGET_PPC || LJ_TARGET_MIPS) - -#if LJ_HASFFI && (LJ_SOFTFP || LJ_NEED_FP64) -#define IRCALLCOND_FP64_FFI(x) x -#else -#define IRCALLCOND_FP64_FFI(x) NULL -#endif - -#if LJ_HASFFI -#define IRCALLCOND_FFI(x) x -#if LJ_32 -#define IRCALLCOND_FFI32(x) x -#else -#define IRCALLCOND_FFI32(x) NULL -#endif -#else -#define IRCALLCOND_FFI(x) NULL -#define IRCALLCOND_FFI32(x) NULL -#endif - -#if LJ_TARGET_X86 -#define CCI_RANDFPR 0 /* Clang on OSX/x86 is overzealous. */ -#else -#define CCI_RANDFPR CCI_NOFPRCLOBBER -#endif - -#if LJ_SOFTFP -#define ARG1_FP 2 /* Treat as 2 32 bit arguments. */ -#else -#define ARG1_FP 1 -#endif - -#if LJ_32 -#define ARG2_64 4 /* Treat as 4 32 bit arguments. */ -#else -#define ARG2_64 2 -#endif - -/* Function definitions for CALL* instructions. */ -#define IRCALLDEF(_) \ - _(ANY, lj_str_cmp, 2, FN, INT, CCI_NOFPRCLOBBER) \ - _(ANY, lj_str_new, 3, S, STR, CCI_L) \ - _(ANY, lj_strscan_num, 2, FN, INT, 0) \ - _(ANY, lj_str_fromint, 2, FN, STR, CCI_L) \ - _(ANY, lj_str_fromnum, 2, FN, STR, CCI_L) \ - _(ANY, lj_tab_new1, 2, FS, TAB, CCI_L) \ - _(ANY, lj_tab_dup, 2, FS, TAB, CCI_L) \ - _(ANY, lj_tab_newkey, 3, S, P32, CCI_L) \ - _(ANY, lj_tab_len, 1, FL, INT, 0) \ - _(ANY, lj_gc_step_jit, 2, FS, NIL, CCI_L) \ - _(ANY, lj_gc_barrieruv, 2, FS, NIL, 0) \ - _(ANY, lj_mem_newgco, 2, FS, P32, CCI_L) \ - _(ANY, lj_math_random_step, 1, FS, NUM, CCI_CASTU64|CCI_RANDFPR)\ - _(ANY, lj_vm_modi, 2, FN, INT, 0) \ - _(ANY, sinh, ARG1_FP, N, NUM, 0) \ - _(ANY, cosh, ARG1_FP, N, NUM, 0) \ - _(ANY, tanh, ARG1_FP, N, NUM, 0) \ - _(ANY, fputc, 2, S, INT, 0) \ - _(ANY, fwrite, 4, S, INT, 0) \ - _(ANY, fflush, 1, S, INT, 0) \ - /* ORDER FPM */ \ - _(FPMATH, lj_vm_floor, ARG1_FP, N, NUM, 0) \ - _(FPMATH, lj_vm_ceil, ARG1_FP, N, NUM, 0) \ - _(FPMATH, lj_vm_trunc, ARG1_FP, N, NUM, 0) \ - _(FPMATH, sqrt, ARG1_FP, N, NUM, 0) \ - _(FPMATH, exp, ARG1_FP, N, NUM, 0) \ - _(FPMATH, lj_vm_exp2, ARG1_FP, N, NUM, 0) \ - _(FPMATH, log, ARG1_FP, N, NUM, 0) \ - _(FPMATH, lj_vm_log2, ARG1_FP, N, NUM, 0) \ - _(FPMATH, log10, ARG1_FP, N, NUM, 0) \ - _(FPMATH, sin, ARG1_FP, N, NUM, 0) \ - _(FPMATH, cos, ARG1_FP, N, NUM, 0) \ - _(FPMATH, tan, ARG1_FP, N, NUM, 0) \ - _(FPMATH, lj_vm_powi, ARG1_FP+1, N, NUM, 0) \ - _(FPMATH, pow, ARG1_FP*2, N, NUM, 0) \ - _(FPMATH, atan2, ARG1_FP*2, N, NUM, 0) \ - _(FPMATH, ldexp, ARG1_FP+1, N, NUM, 0) \ - _(SOFTFP, lj_vm_tobit, 2, N, INT, 0) \ - _(SOFTFP, softfp_add, 4, N, NUM, 0) \ - _(SOFTFP, softfp_sub, 4, N, NUM, 0) \ - _(SOFTFP, softfp_mul, 4, N, NUM, 0) \ - _(SOFTFP, softfp_div, 4, N, NUM, 0) \ - _(SOFTFP, softfp_cmp, 4, N, NIL, 0) \ - _(SOFTFP, softfp_i2d, 1, N, NUM, 0) \ - _(SOFTFP, softfp_d2i, 2, N, INT, 0) \ - _(SOFTFP_FFI, softfp_ui2d, 1, N, NUM, 0) \ - _(SOFTFP_FFI, softfp_f2d, 1, N, NUM, 0) \ - _(SOFTFP_FFI, softfp_d2ui, 2, N, INT, 0) \ - _(SOFTFP_FFI, softfp_d2f, 2, N, FLOAT, 0) \ - _(SOFTFP_FFI, softfp_i2f, 1, N, FLOAT, 0) \ - _(SOFTFP_FFI, softfp_ui2f, 1, N, FLOAT, 0) \ - _(SOFTFP_FFI, softfp_f2i, 1, N, INT, 0) \ - _(SOFTFP_FFI, softfp_f2ui, 1, N, INT, 0) \ - _(FP64_FFI, fp64_l2d, 2, N, NUM, 0) \ - _(FP64_FFI, fp64_ul2d, 2, N, NUM, 0) \ - _(FP64_FFI, fp64_l2f, 2, N, FLOAT, 0) \ - _(FP64_FFI, fp64_ul2f, 2, N, FLOAT, 0) \ - _(FP64_FFI, fp64_d2l, ARG1_FP, N, I64, 0) \ - _(FP64_FFI, fp64_d2ul, ARG1_FP, N, U64, 0) \ - _(FP64_FFI, fp64_f2l, 1, N, I64, 0) \ - _(FP64_FFI, fp64_f2ul, 1, N, U64, 0) \ - _(FFI, lj_carith_divi64, ARG2_64, N, I64, CCI_NOFPRCLOBBER) \ - _(FFI, lj_carith_divu64, ARG2_64, N, U64, CCI_NOFPRCLOBBER) \ - _(FFI, lj_carith_modi64, ARG2_64, N, I64, CCI_NOFPRCLOBBER) \ - _(FFI, lj_carith_modu64, ARG2_64, N, U64, CCI_NOFPRCLOBBER) \ - _(FFI, lj_carith_powi64, ARG2_64, N, I64, CCI_NOFPRCLOBBER) \ - _(FFI, lj_carith_powu64, ARG2_64, N, U64, CCI_NOFPRCLOBBER) \ - _(FFI, lj_cdata_setfin, 2, FN, P32, CCI_L) \ - _(FFI, strlen, 1, L, INTP, 0) \ - _(FFI, memcpy, 3, S, PTR, 0) \ - _(FFI, memset, 3, S, PTR, 0) \ - _(FFI, lj_vm_errno, 0, S, INT, CCI_NOFPRCLOBBER) \ - _(FFI32, lj_carith_mul64, ARG2_64, N, I64, CCI_NOFPRCLOBBER) - \ - /* End of list. */ - -typedef enum { -#define IRCALLENUM(cond, name, nargs, kind, type, flags) IRCALL_##name, -IRCALLDEF(IRCALLENUM) -#undef IRCALLENUM - IRCALL__MAX -} IRCallID; - -LJ_FUNC TRef lj_ir_call(jit_State *J, IRCallID id, ...); - -LJ_DATA const CCallInfo lj_ir_callinfo[IRCALL__MAX+1]; - -/* Soft-float declarations. */ -#if LJ_SOFTFP -#if LJ_TARGET_ARM -#define softfp_add __aeabi_dadd -#define softfp_sub __aeabi_dsub -#define softfp_mul __aeabi_dmul -#define softfp_div __aeabi_ddiv -#define softfp_cmp __aeabi_cdcmple -#define softfp_i2d __aeabi_i2d -#define softfp_d2i __aeabi_d2iz -#define softfp_ui2d __aeabi_ui2d -#define softfp_f2d __aeabi_f2d -#define softfp_d2ui __aeabi_d2uiz -#define softfp_d2f __aeabi_d2f -#define softfp_i2f __aeabi_i2f -#define softfp_ui2f __aeabi_ui2f -#define softfp_f2i __aeabi_f2iz -#define softfp_f2ui __aeabi_f2uiz -#define fp64_l2d __aeabi_l2d -#define fp64_ul2d __aeabi_ul2d -#define fp64_l2f __aeabi_l2f -#define fp64_ul2f __aeabi_ul2f -#if LJ_TARGET_IOS -#define fp64_d2l __fixdfdi -#define fp64_d2ul __fixunsdfdi -#define fp64_f2l __fixsfdi -#define fp64_f2ul __fixunssfdi -#else -#define fp64_d2l __aeabi_d2lz -#define fp64_d2ul __aeabi_d2ulz -#define fp64_f2l __aeabi_f2lz -#define fp64_f2ul __aeabi_f2ulz -#endif -#else -#error "Missing soft-float definitions for target architecture" -#endif -extern double softfp_add(double a, double b); -extern double softfp_sub(double a, double b); -extern double softfp_mul(double a, double b); -extern double softfp_div(double a, double b); -extern void softfp_cmp(double a, double b); -extern double softfp_i2d(int32_t a); -extern int32_t softfp_d2i(double a); -#if LJ_HASFFI -extern double softfp_ui2d(uint32_t a); -extern double softfp_f2d(float a); -extern uint32_t softfp_d2ui(double a); -extern float softfp_d2f(double a); -extern float softfp_i2f(int32_t a); -extern float softfp_ui2f(uint32_t a); -extern int32_t softfp_f2i(float a); -extern uint32_t softfp_f2ui(float a); -#endif -#endif - -#if LJ_HASFFI && LJ_NEED_FP64 && !(LJ_TARGET_ARM && LJ_SOFTFP) -#ifdef __GNUC__ -#define fp64_l2d __floatdidf -#define fp64_ul2d __floatundidf -#define fp64_l2f __floatdisf -#define fp64_ul2f __floatundisf -#define fp64_d2l __fixdfdi -#define fp64_d2ul __fixunsdfdi -#define fp64_f2l __fixsfdi -#define fp64_f2ul __fixunssfdi -#else -#error "Missing fp64 helper definitions for this compiler" -#endif -#endif - -#if LJ_HASFFI && (LJ_SOFTFP || LJ_NEED_FP64) -extern double fp64_l2d(int64_t a); -extern double fp64_ul2d(uint64_t a); -extern float fp64_l2f(int64_t a); -extern float fp64_ul2f(uint64_t a); -extern int64_t fp64_d2l(double a); -extern uint64_t fp64_d2ul(double a); -extern int64_t fp64_f2l(float a); -extern uint64_t fp64_f2ul(float a); -#endif - -#endif diff --git a/deps/luajit/src/lj_iropt.h b/deps/luajit/src/lj_iropt.h deleted file mode 100644 index 4e424e70..00000000 --- a/deps/luajit/src/lj_iropt.h +++ /dev/null @@ -1,161 +0,0 @@ -/* -** Common header for IR emitter and optimizations. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#ifndef _LJ_IROPT_H -#define _LJ_IROPT_H - -#include - -#include "lj_obj.h" -#include "lj_jit.h" - -#if LJ_HASJIT -/* IR emitter. */ -LJ_FUNC void LJ_FASTCALL lj_ir_growtop(jit_State *J); -LJ_FUNC TRef LJ_FASTCALL lj_ir_emit(jit_State *J); - -/* Save current IR in J->fold.ins, but do not emit it (yet). */ -static LJ_AINLINE void lj_ir_set_(jit_State *J, uint16_t ot, IRRef1 a, IRRef1 b) -{ - J->fold.ins.ot = ot; J->fold.ins.op1 = a; J->fold.ins.op2 = b; -} - -#define lj_ir_set(J, ot, a, b) \ - lj_ir_set_(J, (uint16_t)(ot), (IRRef1)(a), (IRRef1)(b)) - -/* Get ref of next IR instruction and optionally grow IR. -** Note: this may invalidate all IRIns*! -*/ -static LJ_AINLINE IRRef lj_ir_nextins(jit_State *J) -{ - IRRef ref = J->cur.nins; - if (LJ_UNLIKELY(ref >= J->irtoplim)) lj_ir_growtop(J); - J->cur.nins = ref + 1; - return ref; -} - -/* Interning of constants. */ -LJ_FUNC TRef LJ_FASTCALL lj_ir_kint(jit_State *J, int32_t k); -LJ_FUNC void lj_ir_k64_freeall(jit_State *J); -LJ_FUNC TRef lj_ir_k64(jit_State *J, IROp op, cTValue *tv); -LJ_FUNC cTValue *lj_ir_k64_find(jit_State *J, uint64_t u64); -LJ_FUNC TRef lj_ir_knum_u64(jit_State *J, uint64_t u64); -LJ_FUNC TRef lj_ir_knumint(jit_State *J, lua_Number n); -LJ_FUNC TRef lj_ir_kint64(jit_State *J, uint64_t u64); -LJ_FUNC TRef lj_ir_kgc(jit_State *J, GCobj *o, IRType t); -LJ_FUNC TRef lj_ir_kptr_(jit_State *J, IROp op, void *ptr); -LJ_FUNC TRef lj_ir_knull(jit_State *J, IRType t); -LJ_FUNC TRef lj_ir_kslot(jit_State *J, TRef key, IRRef slot); - -#if LJ_64 -#define lj_ir_kintp(J, k) lj_ir_kint64(J, (uint64_t)(k)) -#else -#define lj_ir_kintp(J, k) lj_ir_kint(J, (int32_t)(k)) -#endif - -static LJ_AINLINE TRef lj_ir_knum(jit_State *J, lua_Number n) -{ - TValue tv; - tv.n = n; - return lj_ir_knum_u64(J, tv.u64); -} - -#define lj_ir_kstr(J, str) lj_ir_kgc(J, obj2gco((str)), IRT_STR) -#define lj_ir_ktab(J, tab) lj_ir_kgc(J, obj2gco((tab)), IRT_TAB) -#define lj_ir_kfunc(J, func) lj_ir_kgc(J, obj2gco((func)), IRT_FUNC) -#define lj_ir_kptr(J, ptr) lj_ir_kptr_(J, IR_KPTR, (ptr)) -#define lj_ir_kkptr(J, ptr) lj_ir_kptr_(J, IR_KKPTR, (ptr)) - -/* Special FP constants. */ -#define lj_ir_knum_zero(J) lj_ir_knum_u64(J, U64x(00000000,00000000)) -#define lj_ir_knum_one(J) lj_ir_knum_u64(J, U64x(3ff00000,00000000)) -#define lj_ir_knum_tobit(J) lj_ir_knum_u64(J, U64x(43380000,00000000)) - -/* Special 128 bit SIMD constants. */ -#define lj_ir_knum_abs(J) lj_ir_k64(J, IR_KNUM, LJ_KSIMD(J, LJ_KSIMD_ABS)) -#define lj_ir_knum_neg(J) lj_ir_k64(J, IR_KNUM, LJ_KSIMD(J, LJ_KSIMD_NEG)) - -/* Access to constants. */ -LJ_FUNC void lj_ir_kvalue(lua_State *L, TValue *tv, const IRIns *ir); - -/* Convert IR operand types. */ -LJ_FUNC TRef LJ_FASTCALL lj_ir_tonumber(jit_State *J, TRef tr); -LJ_FUNC TRef LJ_FASTCALL lj_ir_tonum(jit_State *J, TRef tr); -LJ_FUNC TRef LJ_FASTCALL lj_ir_tostr(jit_State *J, TRef tr); - -/* Miscellaneous IR ops. */ -LJ_FUNC int lj_ir_numcmp(lua_Number a, lua_Number b, IROp op); -LJ_FUNC int lj_ir_strcmp(GCstr *a, GCstr *b, IROp op); -LJ_FUNC void lj_ir_rollback(jit_State *J, IRRef ref); - -/* Emit IR instructions with on-the-fly optimizations. */ -LJ_FUNC TRef LJ_FASTCALL lj_opt_fold(jit_State *J); -LJ_FUNC TRef LJ_FASTCALL lj_opt_cse(jit_State *J); -LJ_FUNC TRef LJ_FASTCALL lj_opt_cselim(jit_State *J, IRRef lim); - -/* Special return values for the fold functions. */ -enum { - NEXTFOLD, /* Couldn't fold, pass on. */ - RETRYFOLD, /* Retry fold with modified fins. */ - KINTFOLD, /* Return ref for int constant in fins->i. */ - FAILFOLD, /* Guard would always fail. */ - DROPFOLD, /* Guard eliminated. */ - MAX_FOLD -}; - -#define INTFOLD(k) ((J->fold.ins.i = (k)), (TRef)KINTFOLD) -#define INT64FOLD(k) (lj_ir_kint64(J, (k))) -#define CONDFOLD(cond) ((TRef)FAILFOLD + (TRef)(cond)) -#define LEFTFOLD (J->fold.ins.op1) -#define RIGHTFOLD (J->fold.ins.op2) -#define CSEFOLD (lj_opt_cse(J)) -#define EMITFOLD (lj_ir_emit(J)) - -/* Load/store forwarding. */ -LJ_FUNC TRef LJ_FASTCALL lj_opt_fwd_aload(jit_State *J); -LJ_FUNC TRef LJ_FASTCALL lj_opt_fwd_hload(jit_State *J); -LJ_FUNC TRef LJ_FASTCALL lj_opt_fwd_uload(jit_State *J); -LJ_FUNC TRef LJ_FASTCALL lj_opt_fwd_fload(jit_State *J); -LJ_FUNC TRef LJ_FASTCALL lj_opt_fwd_xload(jit_State *J); -LJ_FUNC TRef LJ_FASTCALL lj_opt_fwd_tab_len(jit_State *J); -LJ_FUNC TRef LJ_FASTCALL lj_opt_fwd_hrefk(jit_State *J); -LJ_FUNC int LJ_FASTCALL lj_opt_fwd_href_nokey(jit_State *J); -LJ_FUNC int LJ_FASTCALL lj_opt_fwd_tptr(jit_State *J, IRRef lim); -LJ_FUNC int lj_opt_fwd_wasnonnil(jit_State *J, IROpT loadop, IRRef xref); - -/* Dead-store elimination. */ -LJ_FUNC TRef LJ_FASTCALL lj_opt_dse_ahstore(jit_State *J); -LJ_FUNC TRef LJ_FASTCALL lj_opt_dse_ustore(jit_State *J); -LJ_FUNC TRef LJ_FASTCALL lj_opt_dse_fstore(jit_State *J); -LJ_FUNC TRef LJ_FASTCALL lj_opt_dse_xstore(jit_State *J); - -/* Narrowing. */ -LJ_FUNC TRef LJ_FASTCALL lj_opt_narrow_convert(jit_State *J); -LJ_FUNC TRef LJ_FASTCALL lj_opt_narrow_index(jit_State *J, TRef key); -LJ_FUNC TRef LJ_FASTCALL lj_opt_narrow_toint(jit_State *J, TRef tr); -LJ_FUNC TRef LJ_FASTCALL lj_opt_narrow_tobit(jit_State *J, TRef tr); -#if LJ_HASFFI -LJ_FUNC TRef LJ_FASTCALL lj_opt_narrow_cindex(jit_State *J, TRef key); -#endif -LJ_FUNC TRef lj_opt_narrow_arith(jit_State *J, TRef rb, TRef rc, - TValue *vb, TValue *vc, IROp op); -LJ_FUNC TRef lj_opt_narrow_unm(jit_State *J, TRef rc, TValue *vc); -LJ_FUNC TRef lj_opt_narrow_mod(jit_State *J, TRef rb, TRef rc, TValue *vc); -LJ_FUNC TRef lj_opt_narrow_pow(jit_State *J, TRef rb, TRef rc, TValue *vc); -LJ_FUNC IRType lj_opt_narrow_forl(jit_State *J, cTValue *forbase); - -/* Optimization passes. */ -LJ_FUNC void lj_opt_dce(jit_State *J); -LJ_FUNC int lj_opt_loop(jit_State *J); -#if LJ_SOFTFP || (LJ_32 && LJ_HASFFI) -LJ_FUNC void lj_opt_split(jit_State *J); -#else -#define lj_opt_split(J) UNUSED(J) -#endif -LJ_FUNC void lj_opt_sink(jit_State *J); - -#endif - -#endif diff --git a/deps/luajit/src/lj_jit.h b/deps/luajit/src/lj_jit.h deleted file mode 100644 index eb765477..00000000 --- a/deps/luajit/src/lj_jit.h +++ /dev/null @@ -1,417 +0,0 @@ -/* -** Common definitions for the JIT compiler. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#ifndef _LJ_JIT_H -#define _LJ_JIT_H - -#include "lj_obj.h" -#include "lj_ir.h" - -/* JIT engine flags. */ -#define JIT_F_ON 0x00000001 - -/* CPU-specific JIT engine flags. */ -#if LJ_TARGET_X86ORX64 -#define JIT_F_CMOV 0x00000010 -#define JIT_F_SSE2 0x00000020 -#define JIT_F_SSE3 0x00000040 -#define JIT_F_SSE4_1 0x00000080 -#define JIT_F_P4 0x00000100 -#define JIT_F_PREFER_IMUL 0x00000200 -#define JIT_F_SPLIT_XMM 0x00000400 -#define JIT_F_LEA_AGU 0x00000800 - -/* Names for the CPU-specific flags. Must match the order above. */ -#define JIT_F_CPU_FIRST JIT_F_CMOV -#define JIT_F_CPUSTRING "\4CMOV\4SSE2\4SSE3\6SSE4.1\2P4\3AMD\2K8\4ATOM" -#elif LJ_TARGET_ARM -#define JIT_F_ARMV6_ 0x00000010 -#define JIT_F_ARMV6T2_ 0x00000020 -#define JIT_F_ARMV7 0x00000040 -#define JIT_F_VFPV2 0x00000080 -#define JIT_F_VFPV3 0x00000100 - -#define JIT_F_ARMV6 (JIT_F_ARMV6_|JIT_F_ARMV6T2_|JIT_F_ARMV7) -#define JIT_F_ARMV6T2 (JIT_F_ARMV6T2_|JIT_F_ARMV7) -#define JIT_F_VFP (JIT_F_VFPV2|JIT_F_VFPV3) - -/* Names for the CPU-specific flags. Must match the order above. */ -#define JIT_F_CPU_FIRST JIT_F_ARMV6_ -#define JIT_F_CPUSTRING "\5ARMv6\7ARMv6T2\5ARMv7\5VFPv2\5VFPv3" -#elif LJ_TARGET_PPC -#define JIT_F_SQRT 0x00000010 -#define JIT_F_ROUND 0x00000020 - -/* Names for the CPU-specific flags. Must match the order above. */ -#define JIT_F_CPU_FIRST JIT_F_SQRT -#define JIT_F_CPUSTRING "\4SQRT\5ROUND" -#elif LJ_TARGET_MIPS -#define JIT_F_MIPS32R2 0x00000010 - -/* Names for the CPU-specific flags. Must match the order above. */ -#define JIT_F_CPU_FIRST JIT_F_MIPS32R2 -#define JIT_F_CPUSTRING "\010MIPS32R2" -#else -#define JIT_F_CPU_FIRST 0 -#define JIT_F_CPUSTRING "" -#endif - -/* Optimization flags. */ -#define JIT_F_OPT_MASK 0x0fff0000 - -#define JIT_F_OPT_FOLD 0x00010000 -#define JIT_F_OPT_CSE 0x00020000 -#define JIT_F_OPT_DCE 0x00040000 -#define JIT_F_OPT_FWD 0x00080000 -#define JIT_F_OPT_DSE 0x00100000 -#define JIT_F_OPT_NARROW 0x00200000 -#define JIT_F_OPT_LOOP 0x00400000 -#define JIT_F_OPT_ABC 0x00800000 -#define JIT_F_OPT_SINK 0x01000000 -#define JIT_F_OPT_FUSE 0x02000000 - -/* Optimizations names for -O. Must match the order above. */ -#define JIT_F_OPT_FIRST JIT_F_OPT_FOLD -#define JIT_F_OPTSTRING \ - "\4fold\3cse\3dce\3fwd\3dse\6narrow\4loop\3abc\4sink\4fuse" - -/* Optimization levels set a fixed combination of flags. */ -#define JIT_F_OPT_0 0 -#define JIT_F_OPT_1 (JIT_F_OPT_FOLD|JIT_F_OPT_CSE|JIT_F_OPT_DCE) -#define JIT_F_OPT_2 (JIT_F_OPT_1|JIT_F_OPT_NARROW|JIT_F_OPT_LOOP) -#define JIT_F_OPT_3 (JIT_F_OPT_2|\ - JIT_F_OPT_FWD|JIT_F_OPT_DSE|JIT_F_OPT_ABC|JIT_F_OPT_SINK|JIT_F_OPT_FUSE) -#define JIT_F_OPT_DEFAULT JIT_F_OPT_3 - -#if LJ_TARGET_WINDOWS || LJ_64 -/* See: http://blogs.msdn.com/oldnewthing/archive/2003/10/08/55239.aspx */ -#define JIT_P_sizemcode_DEFAULT 64 -#else -/* Could go as low as 4K, but the mmap() overhead would be rather high. */ -#define JIT_P_sizemcode_DEFAULT 32 -#endif - -/* Optimization parameters and their defaults. Length is a char in octal! */ -#define JIT_PARAMDEF(_) \ - _(\010, maxtrace, 1000) /* Max. # of traces in cache. */ \ - _(\011, maxrecord, 4000) /* Max. # of recorded IR instructions. */ \ - _(\012, maxirconst, 500) /* Max. # of IR constants of a trace. */ \ - _(\007, maxside, 100) /* Max. # of side traces of a root trace. */ \ - _(\007, maxsnap, 500) /* Max. # of snapshots for a trace. */ \ - \ - _(\007, hotloop, 56) /* # of iter. to detect a hot loop/call. */ \ - _(\007, hotexit, 10) /* # of taken exits to start a side trace. */ \ - _(\007, tryside, 4) /* # of attempts to compile a side trace. */ \ - \ - _(\012, instunroll, 4) /* Max. unroll for instable loops. */ \ - _(\012, loopunroll, 15) /* Max. unroll for loop ops in side traces. */ \ - _(\012, callunroll, 3) /* Max. unroll for recursive calls. */ \ - _(\011, recunroll, 2) /* Min. unroll for true recursion. */ \ - \ - /* Size of each machine code area (in KBytes). */ \ - _(\011, sizemcode, JIT_P_sizemcode_DEFAULT) \ - /* Max. total size of all machine code areas (in KBytes). */ \ - _(\010, maxmcode, 512) \ - /* End of list. */ - -enum { -#define JIT_PARAMENUM(len, name, value) JIT_P_##name, -JIT_PARAMDEF(JIT_PARAMENUM) -#undef JIT_PARAMENUM - JIT_P__MAX -}; - -#define JIT_PARAMSTR(len, name, value) #len #name -#define JIT_P_STRING JIT_PARAMDEF(JIT_PARAMSTR) - -/* Trace compiler state. */ -typedef enum { - LJ_TRACE_IDLE, /* Trace compiler idle. */ - LJ_TRACE_ACTIVE = 0x10, - LJ_TRACE_RECORD, /* Bytecode recording active. */ - LJ_TRACE_START, /* New trace started. */ - LJ_TRACE_END, /* End of trace. */ - LJ_TRACE_ASM, /* Assemble trace. */ - LJ_TRACE_ERR /* Trace aborted with error. */ -} TraceState; - -/* Post-processing action. */ -typedef enum { - LJ_POST_NONE, /* No action. */ - LJ_POST_FIXCOMP, /* Fixup comparison and emit pending guard. */ - LJ_POST_FIXGUARD, /* Fixup and emit pending guard. */ - LJ_POST_FIXGUARDSNAP, /* Fixup and emit pending guard and snapshot. */ - LJ_POST_FIXBOOL, /* Fixup boolean result. */ - LJ_POST_FIXCONST, /* Fixup constant results. */ - LJ_POST_FFRETRY /* Suppress recording of retried fast functions. */ -} PostProc; - -/* Machine code type. */ -#if LJ_TARGET_X86ORX64 -typedef uint8_t MCode; -#else -typedef uint32_t MCode; -#endif - -/* Stack snapshot header. */ -typedef struct SnapShot { - uint16_t mapofs; /* Offset into snapshot map. */ - IRRef1 ref; /* First IR ref for this snapshot. */ - uint8_t nslots; /* Number of valid slots. */ - uint8_t topslot; /* Maximum frame extent. */ - uint8_t nent; /* Number of compressed entries. */ - uint8_t count; /* Count of taken exits for this snapshot. */ -} SnapShot; - -#define SNAPCOUNT_DONE 255 /* Already compiled and linked a side trace. */ - -/* Compressed snapshot entry. */ -typedef uint32_t SnapEntry; - -#define SNAP_FRAME 0x010000 /* Frame slot. */ -#define SNAP_CONT 0x020000 /* Continuation slot. */ -#define SNAP_NORESTORE 0x040000 /* No need to restore slot. */ -#define SNAP_SOFTFPNUM 0x080000 /* Soft-float number. */ -LJ_STATIC_ASSERT(SNAP_FRAME == TREF_FRAME); -LJ_STATIC_ASSERT(SNAP_CONT == TREF_CONT); - -#define SNAP(slot, flags, ref) (((SnapEntry)(slot) << 24) + (flags) + (ref)) -#define SNAP_TR(slot, tr) \ - (((SnapEntry)(slot) << 24) + ((tr) & (TREF_CONT|TREF_FRAME|TREF_REFMASK))) -#define SNAP_MKPC(pc) ((SnapEntry)u32ptr(pc)) -#define SNAP_MKFTSZ(ftsz) ((SnapEntry)(ftsz)) -#define snap_ref(sn) ((sn) & 0xffff) -#define snap_slot(sn) ((BCReg)((sn) >> 24)) -#define snap_isframe(sn) ((sn) & SNAP_FRAME) -#define snap_pc(sn) ((const BCIns *)(uintptr_t)(sn)) -#define snap_setref(sn, ref) (((sn) & (0xffff0000&~SNAP_NORESTORE)) | (ref)) - -/* Snapshot and exit numbers. */ -typedef uint32_t SnapNo; -typedef uint32_t ExitNo; - -/* Trace number. */ -typedef uint32_t TraceNo; /* Used to pass around trace numbers. */ -typedef uint16_t TraceNo1; /* Stored trace number. */ - -/* Type of link. ORDER LJ_TRLINK */ -typedef enum { - LJ_TRLINK_NONE, /* Incomplete trace. No link, yet. */ - LJ_TRLINK_ROOT, /* Link to other root trace. */ - LJ_TRLINK_LOOP, /* Loop to same trace. */ - LJ_TRLINK_TAILREC, /* Tail-recursion. */ - LJ_TRLINK_UPREC, /* Up-recursion. */ - LJ_TRLINK_DOWNREC, /* Down-recursion. */ - LJ_TRLINK_INTERP, /* Fallback to interpreter. */ - LJ_TRLINK_RETURN /* Return to interpreter. */ -} TraceLink; - -/* Trace object. */ -typedef struct GCtrace { - GCHeader; - uint8_t topslot; /* Top stack slot already checked to be allocated. */ - uint8_t linktype; /* Type of link. */ - IRRef nins; /* Next IR instruction. Biased with REF_BIAS. */ - GCRef gclist; - IRIns *ir; /* IR instructions/constants. Biased with REF_BIAS. */ - IRRef nk; /* Lowest IR constant. Biased with REF_BIAS. */ - uint16_t nsnap; /* Number of snapshots. */ - uint16_t nsnapmap; /* Number of snapshot map elements. */ - SnapShot *snap; /* Snapshot array. */ - SnapEntry *snapmap; /* Snapshot map. */ - GCRef startpt; /* Starting prototype. */ - MRef startpc; /* Bytecode PC of starting instruction. */ - BCIns startins; /* Original bytecode of starting instruction. */ - MSize szmcode; /* Size of machine code. */ - MCode *mcode; /* Start of machine code. */ - MSize mcloop; /* Offset of loop start in machine code. */ - uint16_t nchild; /* Number of child traces (root trace only). */ - uint16_t spadjust; /* Stack pointer adjustment (offset in bytes). */ - TraceNo1 traceno; /* Trace number. */ - TraceNo1 link; /* Linked trace (or self for loops). */ - TraceNo1 root; /* Root trace of side trace (or 0 for root traces). */ - TraceNo1 nextroot; /* Next root trace for same prototype. */ - TraceNo1 nextside; /* Next side trace of same root trace. */ - uint8_t sinktags; /* Trace has SINK tags. */ - uint8_t unused1; -#ifdef LUAJIT_USE_GDBJIT - void *gdbjit_entry; /* GDB JIT entry. */ -#endif -} GCtrace; - -#define gco2trace(o) check_exp((o)->gch.gct == ~LJ_TTRACE, (GCtrace *)(o)) -#define traceref(J, n) \ - check_exp((n)>0 && (MSize)(n)sizetrace, (GCtrace *)gcref(J->trace[(n)])) - -LJ_STATIC_ASSERT(offsetof(GChead, gclist) == offsetof(GCtrace, gclist)); - -static LJ_AINLINE MSize snap_nextofs(GCtrace *T, SnapShot *snap) -{ - if (snap+1 == &T->snap[T->nsnap]) - return T->nsnapmap; - else - return (snap+1)->mapofs; -} - -/* Round-robin penalty cache for bytecodes leading to aborted traces. */ -typedef struct HotPenalty { - MRef pc; /* Starting bytecode PC. */ - uint16_t val; /* Penalty value, i.e. hotcount start. */ - uint16_t reason; /* Abort reason (really TraceErr). */ -} HotPenalty; - -#define PENALTY_SLOTS 64 /* Penalty cache slot. Must be a power of 2. */ -#define PENALTY_MIN (36*2) /* Minimum penalty value. */ -#define PENALTY_MAX 60000 /* Maximum penalty value. */ -#define PENALTY_RNDBITS 4 /* # of random bits to add to penalty value. */ - -/* Round-robin backpropagation cache for narrowing conversions. */ -typedef struct BPropEntry { - IRRef1 key; /* Key: original reference. */ - IRRef1 val; /* Value: reference after conversion. */ - IRRef mode; /* Mode for this entry (currently IRCONV_*). */ -} BPropEntry; - -/* Number of slots for the backpropagation cache. Must be a power of 2. */ -#define BPROP_SLOTS 16 - -/* Scalar evolution analysis cache. */ -typedef struct ScEvEntry { - MRef pc; /* Bytecode PC of FORI. */ - IRRef1 idx; /* Index reference. */ - IRRef1 start; /* Constant start reference. */ - IRRef1 stop; /* Constant stop reference. */ - IRRef1 step; /* Constant step reference. */ - IRType1 t; /* Scalar type. */ - uint8_t dir; /* Direction. 1: +, 0: -. */ -} ScEvEntry; - -/* 128 bit SIMD constants. */ -enum { - LJ_KSIMD_ABS, - LJ_KSIMD_NEG, - LJ_KSIMD__MAX -}; - -/* Get 16 byte aligned pointer to SIMD constant. */ -#define LJ_KSIMD(J, n) \ - ((TValue *)(((intptr_t)&J->ksimd[2*(n)] + 15) & ~(intptr_t)15)) - -/* Set/reset flag to activate the SPLIT pass for the current trace. */ -#if LJ_SOFTFP || (LJ_32 && LJ_HASFFI) -#define lj_needsplit(J) (J->needsplit = 1) -#define lj_resetsplit(J) (J->needsplit = 0) -#else -#define lj_needsplit(J) UNUSED(J) -#define lj_resetsplit(J) UNUSED(J) -#endif - -/* Fold state is used to fold instructions on-the-fly. */ -typedef struct FoldState { - IRIns ins; /* Currently emitted instruction. */ - IRIns left; /* Instruction referenced by left operand. */ - IRIns right; /* Instruction referenced by right operand. */ -} FoldState; - -/* JIT compiler state. */ -typedef struct jit_State { - GCtrace cur; /* Current trace. */ - - lua_State *L; /* Current Lua state. */ - const BCIns *pc; /* Current PC. */ - GCfunc *fn; /* Current function. */ - GCproto *pt; /* Current prototype. */ - TRef *base; /* Current frame base, points into J->slots. */ - - uint32_t flags; /* JIT engine flags. */ - BCReg maxslot; /* Relative to baseslot. */ - BCReg baseslot; /* Current frame base, offset into J->slots. */ - - uint8_t mergesnap; /* Allowed to merge with next snapshot. */ - uint8_t needsnap; /* Need snapshot before recording next bytecode. */ - IRType1 guardemit; /* Accumulated IRT_GUARD for emitted instructions. */ - uint8_t bcskip; /* Number of bytecode instructions to skip. */ - - FoldState fold; /* Fold state. */ - - const BCIns *bc_min; /* Start of allowed bytecode range for root trace. */ - MSize bc_extent; /* Extent of the range. */ - - TraceState state; /* Trace compiler state. */ - - int32_t instunroll; /* Unroll counter for instable loops. */ - int32_t loopunroll; /* Unroll counter for loop ops in side traces. */ - int32_t tailcalled; /* Number of successive tailcalls. */ - int32_t framedepth; /* Current frame depth. */ - int32_t retdepth; /* Return frame depth (count of RETF). */ - - MRef k64; /* Pointer to chained array of 64 bit constants. */ - TValue ksimd[LJ_KSIMD__MAX*2+1]; /* 16 byte aligned SIMD constants. */ - - IRIns *irbuf; /* Temp. IR instruction buffer. Biased with REF_BIAS. */ - IRRef irtoplim; /* Upper limit of instuction buffer (biased). */ - IRRef irbotlim; /* Lower limit of instuction buffer (biased). */ - IRRef loopref; /* Last loop reference or ref of final LOOP (or 0). */ - - MSize sizesnap; /* Size of temp. snapshot buffer. */ - SnapShot *snapbuf; /* Temp. snapshot buffer. */ - SnapEntry *snapmapbuf; /* Temp. snapshot map buffer. */ - MSize sizesnapmap; /* Size of temp. snapshot map buffer. */ - - PostProc postproc; /* Required post-processing after execution. */ -#if LJ_SOFTFP || (LJ_32 && LJ_HASFFI) - int needsplit; /* Need SPLIT pass. */ -#endif - - GCRef *trace; /* Array of traces. */ - TraceNo freetrace; /* Start of scan for next free trace. */ - MSize sizetrace; /* Size of trace array. */ - - IRRef1 chain[IR__MAX]; /* IR instruction skip-list chain anchors. */ - TRef slot[LJ_MAX_JSLOTS+LJ_STACK_EXTRA]; /* Stack slot map. */ - - int32_t param[JIT_P__MAX]; /* JIT engine parameters. */ - - MCode *exitstubgroup[LJ_MAX_EXITSTUBGR]; /* Exit stub group addresses. */ - - HotPenalty penalty[PENALTY_SLOTS]; /* Penalty slots. */ - uint32_t penaltyslot; /* Round-robin index into penalty slots. */ - uint32_t prngstate; /* PRNG state. */ - - BPropEntry bpropcache[BPROP_SLOTS]; /* Backpropagation cache slots. */ - uint32_t bpropslot; /* Round-robin index into bpropcache slots. */ - - ScEvEntry scev; /* Scalar evolution analysis cache slots. */ - - const BCIns *startpc; /* Bytecode PC of starting instruction. */ - TraceNo parent; /* Parent of current side trace (0 for root traces). */ - ExitNo exitno; /* Exit number in parent of current side trace. */ - - BCIns *patchpc; /* PC for pending re-patch. */ - BCIns patchins; /* Instruction for pending re-patch. */ - - int mcprot; /* Protection of current mcode area. */ - MCode *mcarea; /* Base of current mcode area. */ - MCode *mctop; /* Top of current mcode area. */ - MCode *mcbot; /* Bottom of current mcode area. */ - size_t szmcarea; /* Size of current mcode area. */ - size_t szallmcarea; /* Total size of all allocated mcode areas. */ - - TValue errinfo; /* Additional info element for trace errors. */ -} -#if LJ_TARGET_ARM -LJ_ALIGN(16) /* For DISPATCH-relative addresses in assembler part. */ -#endif -jit_State; - -/* Trivial PRNG e.g. used for penalty randomization. */ -static LJ_AINLINE uint32_t LJ_PRNG_BITS(jit_State *J, int bits) -{ - /* Yes, this LCG is very weak, but that doesn't matter for our use case. */ - J->prngstate = J->prngstate * 1103515245 + 12345; - return J->prngstate >> (32-bits); -} - -#endif diff --git a/deps/luajit/src/lj_lex.c b/deps/luajit/src/lj_lex.c deleted file mode 100644 index e1dc3cdf..00000000 --- a/deps/luajit/src/lj_lex.c +++ /dev/null @@ -1,482 +0,0 @@ -/* -** Lexical analyzer. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -** -** Major portions taken verbatim or adapted from the Lua interpreter. -** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h -*/ - -#define lj_lex_c -#define LUA_CORE - -#include "lj_obj.h" -#include "lj_gc.h" -#include "lj_err.h" -#include "lj_str.h" -#if LJ_HASFFI -#include "lj_tab.h" -#include "lj_ctype.h" -#include "lj_cdata.h" -#include "lualib.h" -#endif -#include "lj_state.h" -#include "lj_lex.h" -#include "lj_parse.h" -#include "lj_char.h" -#include "lj_strscan.h" - -/* Lua lexer token names. */ -static const char *const tokennames[] = { -#define TKSTR1(name) #name, -#define TKSTR2(name, sym) #sym, -TKDEF(TKSTR1, TKSTR2) -#undef TKSTR1 -#undef TKSTR2 - NULL -}; - -/* -- Buffer handling ----------------------------------------------------- */ - -#define char2int(c) ((int)(uint8_t)(c)) -#define next(ls) \ - (ls->current = (ls->n--) > 0 ? char2int(*ls->p++) : fillbuf(ls)) -#define save_and_next(ls) (save(ls, ls->current), next(ls)) -#define currIsNewline(ls) (ls->current == '\n' || ls->current == '\r') -#define END_OF_STREAM (-1) - -static int fillbuf(LexState *ls) -{ - size_t sz; - const char *buf = ls->rfunc(ls->L, ls->rdata, &sz); - if (buf == NULL || sz == 0) return END_OF_STREAM; - ls->n = (MSize)sz - 1; - ls->p = buf; - return char2int(*(ls->p++)); -} - -static LJ_NOINLINE void save_grow(LexState *ls, int c) -{ - MSize newsize; - if (ls->sb.sz >= LJ_MAX_STR/2) - lj_lex_error(ls, 0, LJ_ERR_XELEM); - newsize = ls->sb.sz * 2; - lj_str_resizebuf(ls->L, &ls->sb, newsize); - ls->sb.buf[ls->sb.n++] = (char)c; -} - -static LJ_AINLINE void save(LexState *ls, int c) -{ - if (LJ_UNLIKELY(ls->sb.n + 1 > ls->sb.sz)) - save_grow(ls, c); - else - ls->sb.buf[ls->sb.n++] = (char)c; -} - -static void inclinenumber(LexState *ls) -{ - int old = ls->current; - lua_assert(currIsNewline(ls)); - next(ls); /* skip `\n' or `\r' */ - if (currIsNewline(ls) && ls->current != old) - next(ls); /* skip `\n\r' or `\r\n' */ - if (++ls->linenumber >= LJ_MAX_LINE) - lj_lex_error(ls, ls->token, LJ_ERR_XLINES); -} - -/* -- Scanner for terminals ----------------------------------------------- */ - -/* Parse a number literal. */ -static void lex_number(LexState *ls, TValue *tv) -{ - StrScanFmt fmt; - int c, xp = 'e'; - lua_assert(lj_char_isdigit(ls->current)); - if ((c = ls->current) == '0') { - save_and_next(ls); - if ((ls->current | 0x20) == 'x') xp = 'p'; - } - while (lj_char_isident(ls->current) || ls->current == '.' || - ((ls->current == '-' || ls->current == '+') && (c | 0x20) == xp)) { - c = ls->current; - save_and_next(ls); - } - save(ls, '\0'); - fmt = lj_strscan_scan((const uint8_t *)ls->sb.buf, tv, - (LJ_DUALNUM ? STRSCAN_OPT_TOINT : STRSCAN_OPT_TONUM) | - (LJ_HASFFI ? (STRSCAN_OPT_LL|STRSCAN_OPT_IMAG) : 0)); - if (LJ_DUALNUM && fmt == STRSCAN_INT) { - setitype(tv, LJ_TISNUM); - } else if (fmt == STRSCAN_NUM) { - /* Already in correct format. */ -#if LJ_HASFFI - } else if (fmt != STRSCAN_ERROR) { - lua_State *L = ls->L; - GCcdata *cd; - lua_assert(fmt == STRSCAN_I64 || fmt == STRSCAN_U64 || fmt == STRSCAN_IMAG); - if (!ctype_ctsG(G(L))) { - ptrdiff_t oldtop = savestack(L, L->top); - luaopen_ffi(L); /* Load FFI library on-demand. */ - L->top = restorestack(L, oldtop); - } - if (fmt == STRSCAN_IMAG) { - cd = lj_cdata_new_(L, CTID_COMPLEX_DOUBLE, 2*sizeof(double)); - ((double *)cdataptr(cd))[0] = 0; - ((double *)cdataptr(cd))[1] = numV(tv); - } else { - cd = lj_cdata_new_(L, fmt==STRSCAN_I64 ? CTID_INT64 : CTID_UINT64, 8); - *(uint64_t *)cdataptr(cd) = tv->u64; - } - lj_parse_keepcdata(ls, tv, cd); -#endif - } else { - lua_assert(fmt == STRSCAN_ERROR); - lj_lex_error(ls, TK_number, LJ_ERR_XNUMBER); - } -} - -static int skip_sep(LexState *ls) -{ - int count = 0; - int s = ls->current; - lua_assert(s == '[' || s == ']'); - save_and_next(ls); - while (ls->current == '=') { - save_and_next(ls); - count++; - } - return (ls->current == s) ? count : (-count) - 1; -} - -static void read_long_string(LexState *ls, TValue *tv, int sep) -{ - save_and_next(ls); /* skip 2nd `[' */ - if (currIsNewline(ls)) /* string starts with a newline? */ - inclinenumber(ls); /* skip it */ - for (;;) { - switch (ls->current) { - case END_OF_STREAM: - lj_lex_error(ls, TK_eof, tv ? LJ_ERR_XLSTR : LJ_ERR_XLCOM); - break; - case ']': - if (skip_sep(ls) == sep) { - save_and_next(ls); /* skip 2nd `]' */ - goto endloop; - } - break; - case '\n': - case '\r': - save(ls, '\n'); - inclinenumber(ls); - if (!tv) lj_str_resetbuf(&ls->sb); /* avoid wasting space */ - break; - default: - if (tv) save_and_next(ls); - else next(ls); - break; - } - } endloop: - if (tv) { - GCstr *str = lj_parse_keepstr(ls, ls->sb.buf + (2 + (MSize)sep), - ls->sb.n - 2*(2 + (MSize)sep)); - setstrV(ls->L, tv, str); - } -} - -static void read_string(LexState *ls, int delim, TValue *tv) -{ - save_and_next(ls); - while (ls->current != delim) { - switch (ls->current) { - case END_OF_STREAM: - lj_lex_error(ls, TK_eof, LJ_ERR_XSTR); - continue; - case '\n': - case '\r': - lj_lex_error(ls, TK_string, LJ_ERR_XSTR); - continue; - case '\\': { - int c = next(ls); /* Skip the '\\'. */ - switch (c) { - case 'a': c = '\a'; break; - case 'b': c = '\b'; break; - case 'f': c = '\f'; break; - case 'n': c = '\n'; break; - case 'r': c = '\r'; break; - case 't': c = '\t'; break; - case 'v': c = '\v'; break; - case 'x': /* Hexadecimal escape '\xXX'. */ - c = (next(ls) & 15u) << 4; - if (!lj_char_isdigit(ls->current)) { - if (!lj_char_isxdigit(ls->current)) goto err_xesc; - c += 9 << 4; - } - c += (next(ls) & 15u); - if (!lj_char_isdigit(ls->current)) { - if (!lj_char_isxdigit(ls->current)) goto err_xesc; - c += 9; - } - break; - case 'z': /* Skip whitespace. */ - next(ls); - while (lj_char_isspace(ls->current)) - if (currIsNewline(ls)) inclinenumber(ls); else next(ls); - continue; - case '\n': case '\r': save(ls, '\n'); inclinenumber(ls); continue; - case '\\': case '\"': case '\'': break; - case END_OF_STREAM: continue; - default: - if (!lj_char_isdigit(c)) - goto err_xesc; - c -= '0'; /* Decimal escape '\ddd'. */ - if (lj_char_isdigit(next(ls))) { - c = c*10 + (ls->current - '0'); - if (lj_char_isdigit(next(ls))) { - c = c*10 + (ls->current - '0'); - if (c > 255) { - err_xesc: - lj_lex_error(ls, TK_string, LJ_ERR_XESC); - } - next(ls); - } - } - save(ls, c); - continue; - } - save(ls, c); - next(ls); - continue; - } - default: - save_and_next(ls); - break; - } - } - save_and_next(ls); /* skip delimiter */ - setstrV(ls->L, tv, lj_parse_keepstr(ls, ls->sb.buf + 1, ls->sb.n - 2)); -} - -/* -- Main lexical scanner ------------------------------------------------ */ - -static int llex(LexState *ls, TValue *tv) -{ - lj_str_resetbuf(&ls->sb); - for (;;) { - if (lj_char_isident(ls->current)) { - GCstr *s; - if (lj_char_isdigit(ls->current)) { /* Numeric literal. */ - lex_number(ls, tv); - return TK_number; - } - /* Identifier or reserved word. */ - do { - save_and_next(ls); - } while (lj_char_isident(ls->current)); - s = lj_parse_keepstr(ls, ls->sb.buf, ls->sb.n); - setstrV(ls->L, tv, s); - if (s->reserved > 0) /* Reserved word? */ - return TK_OFS + s->reserved; - return TK_name; - } - switch (ls->current) { - case '\n': - case '\r': - inclinenumber(ls); - continue; - case ' ': - case '\t': - case '\v': - case '\f': - next(ls); - continue; - case '-': - next(ls); - if (ls->current != '-') return '-'; - /* else is a comment */ - next(ls); - if (ls->current == '[') { - int sep = skip_sep(ls); - lj_str_resetbuf(&ls->sb); /* `skip_sep' may dirty the buffer */ - if (sep >= 0) { - read_long_string(ls, NULL, sep); /* long comment */ - lj_str_resetbuf(&ls->sb); - continue; - } - } - /* else short comment */ - while (!currIsNewline(ls) && ls->current != END_OF_STREAM) - next(ls); - continue; - case '[': { - int sep = skip_sep(ls); - if (sep >= 0) { - read_long_string(ls, tv, sep); - return TK_string; - } else if (sep == -1) { - return '['; - } else { - lj_lex_error(ls, TK_string, LJ_ERR_XLDELIM); - continue; - } - } - case '=': - next(ls); - if (ls->current != '=') return '='; else { next(ls); return TK_eq; } - case '<': - next(ls); - if (ls->current != '=') return '<'; else { next(ls); return TK_le; } - case '>': - next(ls); - if (ls->current != '=') return '>'; else { next(ls); return TK_ge; } - case '~': - next(ls); - if (ls->current != '=') return '~'; else { next(ls); return TK_ne; } - case ':': - next(ls); - if (ls->current != ':') return ':'; else { next(ls); return TK_label; } - case '"': - case '\'': - read_string(ls, ls->current, tv); - return TK_string; - case '.': - save_and_next(ls); - if (ls->current == '.') { - next(ls); - if (ls->current == '.') { - next(ls); - return TK_dots; /* ... */ - } - return TK_concat; /* .. */ - } else if (!lj_char_isdigit(ls->current)) { - return '.'; - } else { - lex_number(ls, tv); - return TK_number; - } - case END_OF_STREAM: - return TK_eof; - default: { - int c = ls->current; - next(ls); - return c; /* Single-char tokens (+ - / ...). */ - } - } - } -} - -/* -- Lexer API ----------------------------------------------------------- */ - -/* Setup lexer state. */ -int lj_lex_setup(lua_State *L, LexState *ls) -{ - int header = 0; - ls->L = L; - ls->fs = NULL; - ls->n = 0; - ls->p = NULL; - ls->vstack = NULL; - ls->sizevstack = 0; - ls->vtop = 0; - ls->bcstack = NULL; - ls->sizebcstack = 0; - ls->token = 0; - ls->lookahead = TK_eof; /* No look-ahead token. */ - ls->linenumber = 1; - ls->lastline = 1; - lj_str_resizebuf(ls->L, &ls->sb, LJ_MIN_SBUF); - next(ls); /* Read-ahead first char. */ - if (ls->current == 0xef && ls->n >= 2 && char2int(ls->p[0]) == 0xbb && - char2int(ls->p[1]) == 0xbf) { /* Skip UTF-8 BOM (if buffered). */ - ls->n -= 2; - ls->p += 2; - next(ls); - header = 1; - } - if (ls->current == '#') { /* Skip POSIX #! header line. */ - do { - next(ls); - if (ls->current == END_OF_STREAM) return 0; - } while (!currIsNewline(ls)); - inclinenumber(ls); - header = 1; - } - if (ls->current == LUA_SIGNATURE[0]) { /* Bytecode dump. */ - if (header) { - /* - ** Loading bytecode with an extra header is disabled for security - ** reasons. This may circumvent the usual check for bytecode vs. - ** Lua code by looking at the first char. Since this is a potential - ** security violation no attempt is made to echo the chunkname either. - */ - setstrV(L, L->top++, lj_err_str(L, LJ_ERR_BCBAD)); - lj_err_throw(L, LUA_ERRSYNTAX); - } - return 1; - } - return 0; -} - -/* Cleanup lexer state. */ -void lj_lex_cleanup(lua_State *L, LexState *ls) -{ - global_State *g = G(L); - lj_mem_freevec(g, ls->bcstack, ls->sizebcstack, BCInsLine); - lj_mem_freevec(g, ls->vstack, ls->sizevstack, VarInfo); - lj_str_freebuf(g, &ls->sb); -} - -void lj_lex_next(LexState *ls) -{ - ls->lastline = ls->linenumber; - if (LJ_LIKELY(ls->lookahead == TK_eof)) { /* No lookahead token? */ - ls->token = llex(ls, &ls->tokenval); /* Get next token. */ - } else { /* Otherwise return lookahead token. */ - ls->token = ls->lookahead; - ls->lookahead = TK_eof; - ls->tokenval = ls->lookaheadval; - } -} - -LexToken lj_lex_lookahead(LexState *ls) -{ - lua_assert(ls->lookahead == TK_eof); - ls->lookahead = llex(ls, &ls->lookaheadval); - return ls->lookahead; -} - -const char *lj_lex_token2str(LexState *ls, LexToken token) -{ - if (token > TK_OFS) - return tokennames[token-TK_OFS-1]; - else if (!lj_char_iscntrl(token)) - return lj_str_pushf(ls->L, "%c", token); - else - return lj_str_pushf(ls->L, "char(%d)", token); -} - -void lj_lex_error(LexState *ls, LexToken token, ErrMsg em, ...) -{ - const char *tok; - va_list argp; - if (token == 0) { - tok = NULL; - } else if (token == TK_name || token == TK_string || token == TK_number) { - save(ls, '\0'); - tok = ls->sb.buf; - } else { - tok = lj_lex_token2str(ls, token); - } - va_start(argp, em); - lj_err_lex(ls->L, ls->chunkname, tok, ls->linenumber, em, argp); - va_end(argp); -} - -void lj_lex_init(lua_State *L) -{ - uint32_t i; - for (i = 0; i < TK_RESERVED; i++) { - GCstr *s = lj_str_newz(L, tokennames[i]); - fixstring(s); /* Reserved words are never collected. */ - s->reserved = (uint8_t)(i+1); - } -} - diff --git a/deps/luajit/src/lj_lex.h b/deps/luajit/src/lj_lex.h deleted file mode 100644 index fe017686..00000000 --- a/deps/luajit/src/lj_lex.h +++ /dev/null @@ -1,85 +0,0 @@ -/* -** Lexical analyzer. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#ifndef _LJ_LEX_H -#define _LJ_LEX_H - -#include - -#include "lj_obj.h" -#include "lj_err.h" - -/* Lua lexer tokens. */ -#define TKDEF(_, __) \ - _(and) _(break) _(do) _(else) _(elseif) _(end) _(false) \ - _(for) _(function) _(goto) _(if) _(in) _(local) _(nil) _(not) _(or) \ - _(repeat) _(return) _(then) _(true) _(until) _(while) \ - __(concat, ..) __(dots, ...) __(eq, ==) __(ge, >=) __(le, <=) __(ne, ~=) \ - __(label, ::) __(number, ) __(name, ) __(string, ) \ - __(eof, ) - -enum { - TK_OFS = 256, -#define TKENUM1(name) TK_##name, -#define TKENUM2(name, sym) TK_##name, -TKDEF(TKENUM1, TKENUM2) -#undef TKENUM1 -#undef TKENUM2 - TK_RESERVED = TK_while - TK_OFS -}; - -typedef int LexToken; - -/* Combined bytecode ins/line. Only used during bytecode generation. */ -typedef struct BCInsLine { - BCIns ins; /* Bytecode instruction. */ - BCLine line; /* Line number for this bytecode. */ -} BCInsLine; - -/* Info for local variables. Only used during bytecode generation. */ -typedef struct VarInfo { - GCRef name; /* Local variable name or goto/label name. */ - BCPos startpc; /* First point where the local variable is active. */ - BCPos endpc; /* First point where the local variable is dead. */ - uint8_t slot; /* Variable slot. */ - uint8_t info; /* Variable/goto/label info. */ -} VarInfo; - -/* Lua lexer state. */ -typedef struct LexState { - struct FuncState *fs; /* Current FuncState. Defined in lj_parse.c. */ - struct lua_State *L; /* Lua state. */ - TValue tokenval; /* Current token value. */ - TValue lookaheadval; /* Lookahead token value. */ - int current; /* Current character (charint). */ - LexToken token; /* Current token. */ - LexToken lookahead; /* Lookahead token. */ - MSize n; /* Bytes left in input buffer. */ - const char *p; /* Current position in input buffer. */ - SBuf sb; /* String buffer for tokens. */ - lua_Reader rfunc; /* Reader callback. */ - void *rdata; /* Reader callback data. */ - BCLine linenumber; /* Input line counter. */ - BCLine lastline; /* Line of last token. */ - GCstr *chunkname; /* Current chunk name (interned string). */ - const char *chunkarg; /* Chunk name argument. */ - const char *mode; /* Allow loading bytecode (b) and/or source text (t). */ - VarInfo *vstack; /* Stack for names and extents of local variables. */ - MSize sizevstack; /* Size of variable stack. */ - MSize vtop; /* Top of variable stack. */ - BCInsLine *bcstack; /* Stack for bytecode instructions/line numbers. */ - MSize sizebcstack; /* Size of bytecode stack. */ - uint32_t level; /* Syntactical nesting level. */ -} LexState; - -LJ_FUNC int lj_lex_setup(lua_State *L, LexState *ls); -LJ_FUNC void lj_lex_cleanup(lua_State *L, LexState *ls); -LJ_FUNC void lj_lex_next(LexState *ls); -LJ_FUNC LexToken lj_lex_lookahead(LexState *ls); -LJ_FUNC const char *lj_lex_token2str(LexState *ls, LexToken token); -LJ_FUNC_NORET void lj_lex_error(LexState *ls, LexToken token, ErrMsg em, ...); -LJ_FUNC void lj_lex_init(lua_State *L); - -#endif diff --git a/deps/luajit/src/lj_lib.c b/deps/luajit/src/lj_lib.c deleted file mode 100644 index 856685ee..00000000 --- a/deps/luajit/src/lj_lib.c +++ /dev/null @@ -1,258 +0,0 @@ -/* -** Library function support. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#define lj_lib_c -#define LUA_CORE - -#include "lauxlib.h" - -#include "lj_obj.h" -#include "lj_gc.h" -#include "lj_err.h" -#include "lj_str.h" -#include "lj_tab.h" -#include "lj_func.h" -#include "lj_bc.h" -#include "lj_dispatch.h" -#include "lj_vm.h" -#include "lj_strscan.h" -#include "lj_lib.h" - -/* -- Library initialization ---------------------------------------------- */ - -static GCtab *lib_create_table(lua_State *L, const char *libname, int hsize) -{ - if (libname) { - luaL_findtable(L, LUA_REGISTRYINDEX, "_LOADED", 16); - lua_getfield(L, -1, libname); - if (!tvistab(L->top-1)) { - L->top--; - if (luaL_findtable(L, LUA_GLOBALSINDEX, libname, hsize) != NULL) - lj_err_callerv(L, LJ_ERR_BADMODN, libname); - settabV(L, L->top, tabV(L->top-1)); - L->top++; - lua_setfield(L, -3, libname); /* _LOADED[libname] = new table */ - } - L->top--; - settabV(L, L->top-1, tabV(L->top)); - } else { - lua_createtable(L, 0, hsize); - } - return tabV(L->top-1); -} - -void lj_lib_register(lua_State *L, const char *libname, - const uint8_t *p, const lua_CFunction *cf) -{ - GCtab *env = tabref(L->env); - GCfunc *ofn = NULL; - int ffid = *p++; - BCIns *bcff = &L2GG(L)->bcff[*p++]; - GCtab *tab = lib_create_table(L, libname, *p++); - ptrdiff_t tpos = L->top - L->base; - - /* Avoid barriers further down. */ - lj_gc_anybarriert(L, tab); - tab->nomm = 0; - - for (;;) { - uint32_t tag = *p++; - MSize len = tag & LIBINIT_LENMASK; - tag &= LIBINIT_TAGMASK; - if (tag != LIBINIT_STRING) { - const char *name; - MSize nuv = (MSize)(L->top - L->base - tpos); - GCfunc *fn = lj_func_newC(L, nuv, env); - if (nuv) { - L->top = L->base + tpos; - memcpy(fn->c.upvalue, L->top, sizeof(TValue)*nuv); - } - fn->c.ffid = (uint8_t)(ffid++); - name = (const char *)p; - p += len; - if (tag == LIBINIT_CF) - setmref(fn->c.pc, &G(L)->bc_cfunc_int); - else - setmref(fn->c.pc, bcff++); - if (tag == LIBINIT_ASM_) - fn->c.f = ofn->c.f; /* Copy handler from previous function. */ - else - fn->c.f = *cf++; /* Get cf or handler from C function table. */ - if (len) { - /* NOBARRIER: See above for common barrier. */ - setfuncV(L, lj_tab_setstr(L, tab, lj_str_new(L, name, len)), fn); - } - ofn = fn; - } else { - switch (tag | len) { - case LIBINIT_SET: - L->top -= 2; - if (tvisstr(L->top+1) && strV(L->top+1)->len == 0) - env = tabV(L->top); - else /* NOBARRIER: See above for common barrier. */ - copyTV(L, lj_tab_set(L, tab, L->top+1), L->top); - break; - case LIBINIT_NUMBER: - memcpy(&L->top->n, p, sizeof(double)); - L->top++; - p += sizeof(double); - break; - case LIBINIT_COPY: - copyTV(L, L->top, L->top - *p++); - L->top++; - break; - case LIBINIT_LASTCL: - setfuncV(L, L->top++, ofn); - break; - case LIBINIT_FFID: - ffid++; - break; - case LIBINIT_END: - return; - default: - setstrV(L, L->top++, lj_str_new(L, (const char *)p, len)); - p += len; - break; - } - } - } -} - -/* -- Type checks --------------------------------------------------------- */ - -TValue *lj_lib_checkany(lua_State *L, int narg) -{ - TValue *o = L->base + narg-1; - if (o >= L->top) - lj_err_arg(L, narg, LJ_ERR_NOVAL); - return o; -} - -GCstr *lj_lib_checkstr(lua_State *L, int narg) -{ - TValue *o = L->base + narg-1; - if (o < L->top) { - if (LJ_LIKELY(tvisstr(o))) { - return strV(o); - } else if (tvisnumber(o)) { - GCstr *s = lj_str_fromnumber(L, o); - setstrV(L, o, s); - return s; - } - } - lj_err_argt(L, narg, LUA_TSTRING); - return NULL; /* unreachable */ -} - -GCstr *lj_lib_optstr(lua_State *L, int narg) -{ - TValue *o = L->base + narg-1; - return (o < L->top && !tvisnil(o)) ? lj_lib_checkstr(L, narg) : NULL; -} - -#if LJ_DUALNUM -void lj_lib_checknumber(lua_State *L, int narg) -{ - TValue *o = L->base + narg-1; - if (!(o < L->top && lj_strscan_numberobj(o))) - lj_err_argt(L, narg, LUA_TNUMBER); -} -#endif - -lua_Number lj_lib_checknum(lua_State *L, int narg) -{ - TValue *o = L->base + narg-1; - if (!(o < L->top && - (tvisnumber(o) || (tvisstr(o) && lj_strscan_num(strV(o), o))))) - lj_err_argt(L, narg, LUA_TNUMBER); - if (LJ_UNLIKELY(tvisint(o))) { - lua_Number n = (lua_Number)intV(o); - setnumV(o, n); - return n; - } else { - return numV(o); - } -} - -int32_t lj_lib_checkint(lua_State *L, int narg) -{ - TValue *o = L->base + narg-1; - if (!(o < L->top && lj_strscan_numberobj(o))) - lj_err_argt(L, narg, LUA_TNUMBER); - if (LJ_LIKELY(tvisint(o))) { - return intV(o); - } else { - int32_t i = lj_num2int(numV(o)); - if (LJ_DUALNUM) setintV(o, i); - return i; - } -} - -int32_t lj_lib_optint(lua_State *L, int narg, int32_t def) -{ - TValue *o = L->base + narg-1; - return (o < L->top && !tvisnil(o)) ? lj_lib_checkint(L, narg) : def; -} - -int32_t lj_lib_checkbit(lua_State *L, int narg) -{ - TValue *o = L->base + narg-1; - if (!(o < L->top && lj_strscan_numberobj(o))) - lj_err_argt(L, narg, LUA_TNUMBER); - if (LJ_LIKELY(tvisint(o))) { - return intV(o); - } else { - int32_t i = lj_num2bit(numV(o)); - if (LJ_DUALNUM) setintV(o, i); - return i; - } -} - -GCfunc *lj_lib_checkfunc(lua_State *L, int narg) -{ - TValue *o = L->base + narg-1; - if (!(o < L->top && tvisfunc(o))) - lj_err_argt(L, narg, LUA_TFUNCTION); - return funcV(o); -} - -GCtab *lj_lib_checktab(lua_State *L, int narg) -{ - TValue *o = L->base + narg-1; - if (!(o < L->top && tvistab(o))) - lj_err_argt(L, narg, LUA_TTABLE); - return tabV(o); -} - -GCtab *lj_lib_checktabornil(lua_State *L, int narg) -{ - TValue *o = L->base + narg-1; - if (o < L->top) { - if (tvistab(o)) - return tabV(o); - else if (tvisnil(o)) - return NULL; - } - lj_err_arg(L, narg, LJ_ERR_NOTABN); - return NULL; /* unreachable */ -} - -int lj_lib_checkopt(lua_State *L, int narg, int def, const char *lst) -{ - GCstr *s = def >= 0 ? lj_lib_optstr(L, narg) : lj_lib_checkstr(L, narg); - if (s) { - const char *opt = strdata(s); - MSize len = s->len; - int i; - for (i = 0; *(const uint8_t *)lst; i++) { - if (*(const uint8_t *)lst == len && memcmp(opt, lst+1, len) == 0) - return i; - lst += 1+*(const uint8_t *)lst; - } - lj_err_argv(L, narg, LJ_ERR_INVOPTM, opt); - } - return def; -} - diff --git a/deps/luajit/src/lj_lib.h b/deps/luajit/src/lj_lib.h deleted file mode 100644 index 9320f34f..00000000 --- a/deps/luajit/src/lj_lib.h +++ /dev/null @@ -1,112 +0,0 @@ -/* -** Library function support. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#ifndef _LJ_LIB_H -#define _LJ_LIB_H - -#include "lj_obj.h" - -/* -** A fallback handler is called by the assembler VM if the fast path fails: -** -** - too few arguments: unrecoverable. -** - wrong argument type: recoverable, if coercion succeeds. -** - bad argument value: unrecoverable. -** - stack overflow: recoverable, if stack reallocation succeeds. -** - extra handling: recoverable. -** -** The unrecoverable cases throw an error with lj_err_arg(), lj_err_argtype(), -** lj_err_caller() or lj_err_callermsg(). -** The recoverable cases return 0 or the number of results + 1. -** The assembler VM retries the fast path only if 0 is returned. -** This time the fallback must not be called again or it gets stuck in a loop. -*/ - -/* Return values from fallback handler. */ -#define FFH_RETRY 0 -#define FFH_UNREACHABLE FFH_RETRY -#define FFH_RES(n) ((n)+1) -#define FFH_TAILCALL (-1) - -LJ_FUNC TValue *lj_lib_checkany(lua_State *L, int narg); -LJ_FUNC GCstr *lj_lib_checkstr(lua_State *L, int narg); -LJ_FUNC GCstr *lj_lib_optstr(lua_State *L, int narg); -#if LJ_DUALNUM -LJ_FUNC void lj_lib_checknumber(lua_State *L, int narg); -#else -#define lj_lib_checknumber(L, narg) lj_lib_checknum((L), (narg)) -#endif -LJ_FUNC lua_Number lj_lib_checknum(lua_State *L, int narg); -LJ_FUNC int32_t lj_lib_checkint(lua_State *L, int narg); -LJ_FUNC int32_t lj_lib_optint(lua_State *L, int narg, int32_t def); -LJ_FUNC int32_t lj_lib_checkbit(lua_State *L, int narg); -LJ_FUNC GCfunc *lj_lib_checkfunc(lua_State *L, int narg); -LJ_FUNC GCtab *lj_lib_checktab(lua_State *L, int narg); -LJ_FUNC GCtab *lj_lib_checktabornil(lua_State *L, int narg); -LJ_FUNC int lj_lib_checkopt(lua_State *L, int narg, int def, const char *lst); - -/* Avoid including lj_frame.h. */ -#define lj_lib_upvalue(L, n) \ - (&gcref((L->base-1)->fr.func)->fn.c.upvalue[(n)-1]) - -#if LJ_TARGET_WINDOWS -#define lj_lib_checkfpu(L) \ - do { setnumV(L->top++, (lua_Number)1437217655); \ - if (lua_tointeger(L, -1) != 1437217655) lj_err_caller(L, LJ_ERR_BADFPU); \ - L->top--; } while (0) -#else -#define lj_lib_checkfpu(L) UNUSED(L) -#endif - -/* Push internal function on the stack. */ -static LJ_AINLINE void lj_lib_pushcc(lua_State *L, lua_CFunction f, - int id, int n) -{ - GCfunc *fn; - lua_pushcclosure(L, f, n); - fn = funcV(L->top-1); - fn->c.ffid = (uint8_t)id; - setmref(fn->c.pc, &G(L)->bc_cfunc_int); -} - -#define lj_lib_pushcf(L, fn, id) (lj_lib_pushcc(L, (fn), (id), 0)) - -/* Library function declarations. Scanned by buildvm. */ -#define LJLIB_CF(name) static int lj_cf_##name(lua_State *L) -#define LJLIB_ASM(name) static int lj_ffh_##name(lua_State *L) -#define LJLIB_ASM_(name) -#define LJLIB_SET(name) -#define LJLIB_PUSH(arg) -#define LJLIB_REC(handler) -#define LJLIB_NOREGUV -#define LJLIB_NOREG - -#define LJ_LIB_REG(L, regname, name) \ - lj_lib_register(L, regname, lj_lib_init_##name, lj_lib_cf_##name) - -LJ_FUNC void lj_lib_register(lua_State *L, const char *libname, - const uint8_t *init, const lua_CFunction *cf); - -/* Library init data tags. */ -#define LIBINIT_LENMASK 0x3f -#define LIBINIT_TAGMASK 0xc0 -#define LIBINIT_CF 0x00 -#define LIBINIT_ASM 0x40 -#define LIBINIT_ASM_ 0x80 -#define LIBINIT_STRING 0xc0 -#define LIBINIT_MAXSTR 0x39 -#define LIBINIT_SET 0xfa -#define LIBINIT_NUMBER 0xfb -#define LIBINIT_COPY 0xfc -#define LIBINIT_LASTCL 0xfd -#define LIBINIT_FFID 0xfe -#define LIBINIT_END 0xff - -/* Exported library functions. */ - -typedef struct RandomState RandomState; -LJ_FUNC uint64_t LJ_FASTCALL lj_math_random_step(RandomState *rs); - -#endif diff --git a/deps/luajit/src/lj_load.c b/deps/luajit/src/lj_load.c deleted file mode 100644 index ff7b8511..00000000 --- a/deps/luajit/src/lj_load.c +++ /dev/null @@ -1,168 +0,0 @@ -/* -** Load and dump code. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#include -#include - -#define lj_load_c -#define LUA_CORE - -#include "lua.h" -#include "lauxlib.h" - -#include "lj_obj.h" -#include "lj_gc.h" -#include "lj_err.h" -#include "lj_str.h" -#include "lj_func.h" -#include "lj_frame.h" -#include "lj_vm.h" -#include "lj_lex.h" -#include "lj_bcdump.h" -#include "lj_parse.h" - -/* -- Load Lua source code and bytecode ----------------------------------- */ - -static TValue *cpparser(lua_State *L, lua_CFunction dummy, void *ud) -{ - LexState *ls = (LexState *)ud; - GCproto *pt; - GCfunc *fn; - int bc; - UNUSED(dummy); - cframe_errfunc(L->cframe) = -1; /* Inherit error function. */ - bc = lj_lex_setup(L, ls); - if (ls->mode && !strchr(ls->mode, bc ? 'b' : 't')) { - setstrV(L, L->top++, lj_err_str(L, LJ_ERR_XMODE)); - lj_err_throw(L, LUA_ERRSYNTAX); - } - pt = bc ? lj_bcread(ls) : lj_parse(ls); - fn = lj_func_newL_empty(L, pt, tabref(L->env)); - /* Don't combine above/below into one statement. */ - setfuncV(L, L->top++, fn); - return NULL; -} - -LUA_API int lua_loadx(lua_State *L, lua_Reader reader, void *data, - const char *chunkname, const char *mode) -{ - LexState ls; - int status; - ls.rfunc = reader; - ls.rdata = data; - ls.chunkarg = chunkname ? chunkname : "?"; - ls.mode = mode; - lj_str_initbuf(&ls.sb); - status = lj_vm_cpcall(L, NULL, &ls, cpparser); - lj_lex_cleanup(L, &ls); - lj_gc_check(L); - return status; -} - -LUA_API int lua_load(lua_State *L, lua_Reader reader, void *data, - const char *chunkname) -{ - return lua_loadx(L, reader, data, chunkname, NULL); -} - -typedef struct FileReaderCtx { - FILE *fp; - char buf[LUAL_BUFFERSIZE]; -} FileReaderCtx; - -static const char *reader_file(lua_State *L, void *ud, size_t *size) -{ - FileReaderCtx *ctx = (FileReaderCtx *)ud; - UNUSED(L); - if (feof(ctx->fp)) return NULL; - *size = fread(ctx->buf, 1, sizeof(ctx->buf), ctx->fp); - return *size > 0 ? ctx->buf : NULL; -} - -LUALIB_API int luaL_loadfilex(lua_State *L, const char *filename, - const char *mode) -{ - FileReaderCtx ctx; - int status; - const char *chunkname; - if (filename) { - ctx.fp = fopen(filename, "rb"); - if (ctx.fp == NULL) { - lua_pushfstring(L, "cannot open %s: %s", filename, strerror(errno)); - return LUA_ERRFILE; - } - chunkname = lua_pushfstring(L, "@%s", filename); - } else { - ctx.fp = stdin; - chunkname = "=stdin"; - } - status = lua_loadx(L, reader_file, &ctx, chunkname, mode); - if (ferror(ctx.fp)) { - L->top -= filename ? 2 : 1; - lua_pushfstring(L, "cannot read %s: %s", chunkname+1, strerror(errno)); - if (filename) - fclose(ctx.fp); - return LUA_ERRFILE; - } - if (filename) { - L->top--; - copyTV(L, L->top-1, L->top); - fclose(ctx.fp); - } - return status; -} - -LUALIB_API int luaL_loadfile(lua_State *L, const char *filename) -{ - return luaL_loadfilex(L, filename, NULL); -} - -typedef struct StringReaderCtx { - const char *str; - size_t size; -} StringReaderCtx; - -static const char *reader_string(lua_State *L, void *ud, size_t *size) -{ - StringReaderCtx *ctx = (StringReaderCtx *)ud; - UNUSED(L); - if (ctx->size == 0) return NULL; - *size = ctx->size; - ctx->size = 0; - return ctx->str; -} - -LUALIB_API int luaL_loadbufferx(lua_State *L, const char *buf, size_t size, - const char *name, const char *mode) -{ - StringReaderCtx ctx; - ctx.str = buf; - ctx.size = size; - return lua_loadx(L, reader_string, &ctx, name, mode); -} - -LUALIB_API int luaL_loadbuffer(lua_State *L, const char *buf, size_t size, - const char *name) -{ - return luaL_loadbufferx(L, buf, size, name, NULL); -} - -LUALIB_API int luaL_loadstring(lua_State *L, const char *s) -{ - return luaL_loadbuffer(L, s, strlen(s), s); -} - -/* -- Dump bytecode ------------------------------------------------------- */ - -LUA_API int lua_dump(lua_State *L, lua_Writer writer, void *data) -{ - cTValue *o = L->top-1; - api_check(L, L->top > L->base); - if (tvisfunc(o) && isluafunc(funcV(o))) - return lj_bcwrite(L, funcproto(funcV(o)), writer, data, 0); - else - return 1; -} - diff --git a/deps/luajit/src/lj_mcode.c b/deps/luajit/src/lj_mcode.c deleted file mode 100644 index d95ebeb1..00000000 --- a/deps/luajit/src/lj_mcode.c +++ /dev/null @@ -1,386 +0,0 @@ -/* -** Machine code management. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#define lj_mcode_c -#define LUA_CORE - -#include "lj_obj.h" -#if LJ_HASJIT -#include "lj_gc.h" -#include "lj_err.h" -#include "lj_jit.h" -#include "lj_mcode.h" -#include "lj_trace.h" -#include "lj_dispatch.h" -#endif -#if LJ_HASJIT || LJ_HASFFI -#include "lj_vm.h" -#endif - -/* -- OS-specific functions ----------------------------------------------- */ - -#if LJ_HASJIT || LJ_HASFFI - -/* Define this if you want to run LuaJIT with Valgrind. */ -#ifdef LUAJIT_USE_VALGRIND -#include -#endif - -#if LJ_TARGET_IOS -void sys_icache_invalidate(void *start, size_t len); -#endif - -/* Synchronize data/instruction cache. */ -void lj_mcode_sync(void *start, void *end) -{ -#ifdef LUAJIT_USE_VALGRIND - VALGRIND_DISCARD_TRANSLATIONS(start, (char *)end-(char *)start); -#endif -#if LJ_TARGET_X86ORX64 - UNUSED(start); UNUSED(end); -#elif LJ_TARGET_IOS - sys_icache_invalidate(start, (char *)end-(char *)start); -#elif LJ_TARGET_PPC - lj_vm_cachesync(start, end); -#elif defined(__GNUC__) - __clear_cache(start, end); -#else -#error "Missing builtin to flush instruction cache" -#endif -} - -#endif - -#if LJ_HASJIT - -#if LJ_TARGET_WINDOWS - -#define WIN32_LEAN_AND_MEAN -#include - -#define MCPROT_RW PAGE_READWRITE -#define MCPROT_RX PAGE_EXECUTE_READ -#define MCPROT_RWX PAGE_EXECUTE_READWRITE - -static void *mcode_alloc_at(jit_State *J, uintptr_t hint, size_t sz, DWORD prot) -{ - void *p = VirtualAlloc((void *)hint, sz, - MEM_RESERVE|MEM_COMMIT|MEM_TOP_DOWN, prot); - if (!p && !hint) - lj_trace_err(J, LJ_TRERR_MCODEAL); - return p; -} - -static void mcode_free(jit_State *J, void *p, size_t sz) -{ - UNUSED(J); UNUSED(sz); - VirtualFree(p, 0, MEM_RELEASE); -} - -static int mcode_setprot(void *p, size_t sz, DWORD prot) -{ - DWORD oprot; - return !VirtualProtect(p, sz, prot, &oprot); -} - -#elif LJ_TARGET_POSIX - -#include - -#ifndef MAP_ANONYMOUS -#define MAP_ANONYMOUS MAP_ANON -#endif - -#define MCPROT_RW (PROT_READ|PROT_WRITE) -#define MCPROT_RX (PROT_READ|PROT_EXEC) -#define MCPROT_RWX (PROT_READ|PROT_WRITE|PROT_EXEC) - -static void *mcode_alloc_at(jit_State *J, uintptr_t hint, size_t sz, int prot) -{ - void *p = mmap((void *)hint, sz, prot, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); - if (p == MAP_FAILED) { - if (!hint) lj_trace_err(J, LJ_TRERR_MCODEAL); - p = NULL; - } - return p; -} - -static void mcode_free(jit_State *J, void *p, size_t sz) -{ - UNUSED(J); - munmap(p, sz); -} - -static int mcode_setprot(void *p, size_t sz, int prot) -{ - return mprotect(p, sz, prot); -} - -#elif LJ_64 - -#error "Missing OS support for explicit placement of executable memory" - -#else - -/* Fallback allocator. This will fail if memory is not executable by default. */ -#define LUAJIT_UNPROTECT_MCODE -#define MCPROT_RW 0 -#define MCPROT_RX 0 -#define MCPROT_RWX 0 - -static void *mcode_alloc_at(jit_State *J, uintptr_t hint, size_t sz, int prot) -{ - UNUSED(hint); UNUSED(prot); - return lj_mem_new(J->L, sz); -} - -static void mcode_free(jit_State *J, void *p, size_t sz) -{ - lj_mem_free(J2G(J), p, sz); -} - -#endif - -/* -- MCode area protection ----------------------------------------------- */ - -/* Define this ONLY if page protection twiddling becomes a bottleneck. */ -#ifdef LUAJIT_UNPROTECT_MCODE - -/* It's generally considered to be a potential security risk to have -** pages with simultaneous write *and* execute access in a process. -** -** Do not even think about using this mode for server processes or -** apps handling untrusted external data (such as a browser). -** -** The security risk is not in LuaJIT itself -- but if an adversary finds -** any *other* flaw in your C application logic, then any RWX memory page -** simplifies writing an exploit considerably. -*/ -#define MCPROT_GEN MCPROT_RWX -#define MCPROT_RUN MCPROT_RWX - -static void mcode_protect(jit_State *J, int prot) -{ - UNUSED(J); UNUSED(prot); -} - -#else - -/* This is the default behaviour and much safer: -** -** Most of the time the memory pages holding machine code are executable, -** but NONE of them is writable. -** -** The current memory area is marked read-write (but NOT executable) only -** during the short time window while the assembler generates machine code. -*/ -#define MCPROT_GEN MCPROT_RW -#define MCPROT_RUN MCPROT_RX - -/* Protection twiddling failed. Probably due to kernel security. */ -static LJ_NOINLINE void mcode_protfail(jit_State *J) -{ - lua_CFunction panic = J2G(J)->panic; - if (panic) { - lua_State *L = J->L; - setstrV(L, L->top++, lj_err_str(L, LJ_ERR_JITPROT)); - panic(L); - } -} - -/* Change protection of MCode area. */ -static void mcode_protect(jit_State *J, int prot) -{ - if (J->mcprot != prot) { - if (LJ_UNLIKELY(mcode_setprot(J->mcarea, J->szmcarea, prot))) - mcode_protfail(J); - J->mcprot = prot; - } -} - -#endif - -/* -- MCode area allocation ----------------------------------------------- */ - -#if LJ_TARGET_X64 -#define mcode_validptr(p) ((p) && (uintptr_t)(p) < (uintptr_t)1<<47) -#else -#define mcode_validptr(p) ((p) && (uintptr_t)(p) < 0xffff0000) -#endif - -#ifdef LJ_TARGET_JUMPRANGE - -/* Get memory within relative jump distance of our code in 64 bit mode. */ -static void *mcode_alloc(jit_State *J, size_t sz) -{ - /* Target an address in the static assembler code (64K aligned). - ** Try addresses within a distance of target-range/2+1MB..target+range/2-1MB. - ** Use half the jump range so every address in the range can reach any other. - */ -#if LJ_TARGET_MIPS - /* Use the middle of the 256MB-aligned region. */ - uintptr_t target = ((uintptr_t)(void *)lj_vm_exit_handler & 0xf0000000u) + - 0x08000000u; -#else - uintptr_t target = (uintptr_t)(void *)lj_vm_exit_handler & ~(uintptr_t)0xffff; -#endif - const uintptr_t range = (1u << (LJ_TARGET_JUMPRANGE-1)) - (1u << 21); - /* First try a contiguous area below the last one. */ - uintptr_t hint = J->mcarea ? (uintptr_t)J->mcarea - sz : 0; - int i; - for (i = 0; i < 32; i++) { /* 32 attempts ought to be enough ... */ - if (mcode_validptr(hint)) { - void *p = mcode_alloc_at(J, hint, sz, MCPROT_GEN); - - if (mcode_validptr(p) && - ((uintptr_t)p + sz - target < range || target - (uintptr_t)p < range)) - return p; - if (p) mcode_free(J, p, sz); /* Free badly placed area. */ - } - /* Next try probing pseudo-random addresses. */ - do { - hint = (0x78fb ^ LJ_PRNG_BITS(J, 15)) << 16; /* 64K aligned. */ - } while (!(hint + sz < range)); - hint = target + hint - (range>>1); - } - lj_trace_err(J, LJ_TRERR_MCODEAL); /* Give up. OS probably ignores hints? */ - return NULL; -} - -#else - -/* All memory addresses are reachable by relative jumps. */ -static void *mcode_alloc(jit_State *J, size_t sz) -{ -#ifdef __OpenBSD__ - /* Allow better executable memory allocation for OpenBSD W^X mode. */ - void *p = mcode_alloc_at(J, 0, sz, MCPROT_RUN); - if (p && mcode_setprot(p, sz, MCPROT_GEN)) { - mcode_free(J, p, sz); - return NULL; - } - return p; -#else - return mcode_alloc_at(J, 0, sz, MCPROT_GEN); -#endif -} - -#endif - -/* -- MCode area management ----------------------------------------------- */ - -/* Linked list of MCode areas. */ -typedef struct MCLink { - MCode *next; /* Next area. */ - size_t size; /* Size of current area. */ -} MCLink; - -/* Allocate a new MCode area. */ -static void mcode_allocarea(jit_State *J) -{ - MCode *oldarea = J->mcarea; - size_t sz = (size_t)J->param[JIT_P_sizemcode] << 10; - sz = (sz + LJ_PAGESIZE-1) & ~(size_t)(LJ_PAGESIZE - 1); - J->mcarea = (MCode *)mcode_alloc(J, sz); - J->szmcarea = sz; - J->mcprot = MCPROT_GEN; - J->mctop = (MCode *)((char *)J->mcarea + J->szmcarea); - J->mcbot = (MCode *)((char *)J->mcarea + sizeof(MCLink)); - ((MCLink *)J->mcarea)->next = oldarea; - ((MCLink *)J->mcarea)->size = sz; - J->szallmcarea += sz; -} - -/* Free all MCode areas. */ -void lj_mcode_free(jit_State *J) -{ - MCode *mc = J->mcarea; - J->mcarea = NULL; - J->szallmcarea = 0; - while (mc) { - MCode *next = ((MCLink *)mc)->next; - mcode_free(J, mc, ((MCLink *)mc)->size); - mc = next; - } -} - -/* -- MCode transactions -------------------------------------------------- */ - -/* Reserve the remainder of the current MCode area. */ -MCode *lj_mcode_reserve(jit_State *J, MCode **lim) -{ - if (!J->mcarea) - mcode_allocarea(J); - else - mcode_protect(J, MCPROT_GEN); - *lim = J->mcbot; - return J->mctop; -} - -/* Commit the top part of the current MCode area. */ -void lj_mcode_commit(jit_State *J, MCode *top) -{ - J->mctop = top; - mcode_protect(J, MCPROT_RUN); -} - -/* Abort the reservation. */ -void lj_mcode_abort(jit_State *J) -{ - if (J->mcarea) - mcode_protect(J, MCPROT_RUN); -} - -/* Set/reset protection to allow patching of MCode areas. */ -MCode *lj_mcode_patch(jit_State *J, MCode *ptr, int finish) -{ -#ifdef LUAJIT_UNPROTECT_MCODE - UNUSED(J); UNUSED(ptr); UNUSED(finish); - return NULL; -#else - if (finish) { - if (J->mcarea == ptr) - mcode_protect(J, MCPROT_RUN); - else if (LJ_UNLIKELY(mcode_setprot(ptr, ((MCLink *)ptr)->size, MCPROT_RUN))) - mcode_protfail(J); - return NULL; - } else { - MCode *mc = J->mcarea; - /* Try current area first to use the protection cache. */ - if (ptr >= mc && ptr < (MCode *)((char *)mc + J->szmcarea)) { - mcode_protect(J, MCPROT_GEN); - return mc; - } - /* Otherwise search through the list of MCode areas. */ - for (;;) { - mc = ((MCLink *)mc)->next; - lua_assert(mc != NULL); - if (ptr >= mc && ptr < (MCode *)((char *)mc + ((MCLink *)mc)->size)) { - if (LJ_UNLIKELY(mcode_setprot(mc, ((MCLink *)mc)->size, MCPROT_GEN))) - mcode_protfail(J); - return mc; - } - } - } -#endif -} - -/* Limit of MCode reservation reached. */ -void lj_mcode_limiterr(jit_State *J, size_t need) -{ - size_t sizemcode, maxmcode; - lj_mcode_abort(J); - sizemcode = (size_t)J->param[JIT_P_sizemcode] << 10; - sizemcode = (sizemcode + LJ_PAGESIZE-1) & ~(size_t)(LJ_PAGESIZE - 1); - maxmcode = (size_t)J->param[JIT_P_maxmcode] << 10; - if ((size_t)need > sizemcode) - lj_trace_err(J, LJ_TRERR_MCODEOV); /* Too long for any area. */ - if (J->szallmcarea + sizemcode > maxmcode) - lj_trace_err(J, LJ_TRERR_MCODEAL); - mcode_allocarea(J); - lj_trace_err(J, LJ_TRERR_MCODELM); /* Retry with new area. */ -} - -#endif diff --git a/deps/luajit/src/lj_mcode.h b/deps/luajit/src/lj_mcode.h deleted file mode 100644 index ee604523..00000000 --- a/deps/luajit/src/lj_mcode.h +++ /dev/null @@ -1,30 +0,0 @@ -/* -** Machine code management. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#ifndef _LJ_MCODE_H -#define _LJ_MCODE_H - -#include "lj_obj.h" - -#if LJ_HASJIT || LJ_HASFFI -LJ_FUNC void lj_mcode_sync(void *start, void *end); -#endif - -#if LJ_HASJIT - -#include "lj_jit.h" - -LJ_FUNC void lj_mcode_free(jit_State *J); -LJ_FUNC MCode *lj_mcode_reserve(jit_State *J, MCode **lim); -LJ_FUNC void lj_mcode_commit(jit_State *J, MCode *m); -LJ_FUNC void lj_mcode_abort(jit_State *J); -LJ_FUNC MCode *lj_mcode_patch(jit_State *J, MCode *ptr, int finish); -LJ_FUNC_NORET void lj_mcode_limiterr(jit_State *J, size_t need); - -#define lj_mcode_commitbot(J, m) (J->mcbot = (m)) - -#endif - -#endif diff --git a/deps/luajit/src/lj_meta.c b/deps/luajit/src/lj_meta.c deleted file mode 100644 index faaaf702..00000000 --- a/deps/luajit/src/lj_meta.c +++ /dev/null @@ -1,466 +0,0 @@ -/* -** Metamethod handling. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -** -** Portions taken verbatim or adapted from the Lua interpreter. -** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h -*/ - -#define lj_meta_c -#define LUA_CORE - -#include "lj_obj.h" -#include "lj_gc.h" -#include "lj_err.h" -#include "lj_str.h" -#include "lj_tab.h" -#include "lj_meta.h" -#include "lj_frame.h" -#include "lj_bc.h" -#include "lj_vm.h" -#include "lj_strscan.h" - -/* -- Metamethod handling ------------------------------------------------- */ - -/* String interning of metamethod names for fast indexing. */ -void lj_meta_init(lua_State *L) -{ -#define MMNAME(name) "__" #name - const char *metanames = MMDEF(MMNAME); -#undef MMNAME - global_State *g = G(L); - const char *p, *q; - uint32_t mm; - for (mm = 0, p = metanames; *p; mm++, p = q) { - GCstr *s; - for (q = p+2; *q && *q != '_'; q++) ; - s = lj_str_new(L, p, (size_t)(q-p)); - /* NOBARRIER: g->gcroot[] is a GC root. */ - setgcref(g->gcroot[GCROOT_MMNAME+mm], obj2gco(s)); - } -} - -/* Negative caching of a few fast metamethods. See the lj_meta_fast() macro. */ -cTValue *lj_meta_cache(GCtab *mt, MMS mm, GCstr *name) -{ - cTValue *mo = lj_tab_getstr(mt, name); - lua_assert(mm <= MM_FAST); - if (!mo || tvisnil(mo)) { /* No metamethod? */ - mt->nomm |= (uint8_t)(1u<metatable); - else if (tvisudata(o)) - mt = tabref(udataV(o)->metatable); - else - mt = tabref(basemt_obj(G(L), o)); - if (mt) { - cTValue *mo = lj_tab_getstr(mt, mmname_str(G(L), mm)); - if (mo) - return mo; - } - return niltv(L); -} - -#if LJ_HASFFI -/* Tailcall from C function. */ -int lj_meta_tailcall(lua_State *L, cTValue *tv) -{ - TValue *base = L->base; - TValue *top = L->top; - const BCIns *pc = frame_pc(base-1); /* Preserve old PC from frame. */ - copyTV(L, base-1, tv); /* Replace frame with new object. */ - top->u32.lo = LJ_CONT_TAILCALL; - setframe_pc(top, pc); - setframe_gc(top+1, obj2gco(L)); /* Dummy frame object. */ - setframe_ftsz(top+1, (int)((char *)(top+2) - (char *)base) + FRAME_CONT); - L->base = L->top = top+2; - /* - ** before: [old_mo|PC] [... ...] - ** ^base ^top - ** after: [new_mo|itype] [... ...] [NULL|PC] [dummy|delta] - ** ^base/top - ** tailcall: [new_mo|PC] [... ...] - ** ^base ^top - */ - return 0; -} -#endif - -/* Setup call to metamethod to be run by Assembler VM. */ -static TValue *mmcall(lua_State *L, ASMFunction cont, cTValue *mo, - cTValue *a, cTValue *b) -{ - /* - ** |-- framesize -> top top+1 top+2 top+3 - ** before: [func slots ...] - ** mm setup: [func slots ...] [cont|?] [mo|tmtype] [a] [b] - ** in asm: [func slots ...] [cont|PC] [mo|delta] [a] [b] - ** ^-- func base ^-- mm base - ** after mm: [func slots ...] [result] - ** ^-- copy to base[PC_RA] --/ for lj_cont_ra - ** istruecond + branch for lj_cont_cond* - ** ignore for lj_cont_nop - ** next PC: [func slots ...] - */ - TValue *top = L->top; - if (curr_funcisL(L)) top = curr_topL(L); - setcont(top, cont); /* Assembler VM stores PC in upper word. */ - copyTV(L, top+1, mo); /* Store metamethod and two arguments. */ - copyTV(L, top+2, a); - copyTV(L, top+3, b); - return top+2; /* Return new base. */ -} - -/* -- C helpers for some instructions, called from assembler VM ----------- */ - -/* Helper for TGET*. __index chain and metamethod. */ -cTValue *lj_meta_tget(lua_State *L, cTValue *o, cTValue *k) -{ - int loop; - for (loop = 0; loop < LJ_MAX_IDXCHAIN; loop++) { - cTValue *mo; - if (LJ_LIKELY(tvistab(o))) { - GCtab *t = tabV(o); - cTValue *tv = lj_tab_get(L, t, k); - if (!tvisnil(tv) || - !(mo = lj_meta_fast(L, tabref(t->metatable), MM_index))) - return tv; - } else if (tvisnil(mo = lj_meta_lookup(L, o, MM_index))) { - lj_err_optype(L, o, LJ_ERR_OPINDEX); - return NULL; /* unreachable */ - } - if (tvisfunc(mo)) { - L->top = mmcall(L, lj_cont_ra, mo, o, k); - return NULL; /* Trigger metamethod call. */ - } - o = mo; - } - lj_err_msg(L, LJ_ERR_GETLOOP); - return NULL; /* unreachable */ -} - -/* Helper for TSET*. __newindex chain and metamethod. */ -TValue *lj_meta_tset(lua_State *L, cTValue *o, cTValue *k) -{ - TValue tmp; - int loop; - for (loop = 0; loop < LJ_MAX_IDXCHAIN; loop++) { - cTValue *mo; - if (LJ_LIKELY(tvistab(o))) { - GCtab *t = tabV(o); - cTValue *tv = lj_tab_get(L, t, k); - if (LJ_LIKELY(!tvisnil(tv))) { - t->nomm = 0; /* Invalidate negative metamethod cache. */ - lj_gc_anybarriert(L, t); - return (TValue *)tv; - } else if (!(mo = lj_meta_fast(L, tabref(t->metatable), MM_newindex))) { - t->nomm = 0; /* Invalidate negative metamethod cache. */ - lj_gc_anybarriert(L, t); - if (tv != niltv(L)) - return (TValue *)tv; - if (tvisnil(k)) lj_err_msg(L, LJ_ERR_NILIDX); - else if (tvisint(k)) { setnumV(&tmp, (lua_Number)intV(k)); k = &tmp; } - else if (tvisnum(k) && tvisnan(k)) lj_err_msg(L, LJ_ERR_NANIDX); - return lj_tab_newkey(L, t, k); - } - } else if (tvisnil(mo = lj_meta_lookup(L, o, MM_newindex))) { - lj_err_optype(L, o, LJ_ERR_OPINDEX); - return NULL; /* unreachable */ - } - if (tvisfunc(mo)) { - L->top = mmcall(L, lj_cont_nop, mo, o, k); - /* L->top+2 = v filled in by caller. */ - return NULL; /* Trigger metamethod call. */ - } - copyTV(L, &tmp, mo); - o = &tmp; - } - lj_err_msg(L, LJ_ERR_SETLOOP); - return NULL; /* unreachable */ -} - -static cTValue *str2num(cTValue *o, TValue *n) -{ - if (tvisnum(o)) - return o; - else if (tvisint(o)) - return (setnumV(n, (lua_Number)intV(o)), n); - else if (tvisstr(o) && lj_strscan_num(strV(o), n)) - return n; - else - return NULL; -} - -/* Helper for arithmetic instructions. Coercion, metamethod. */ -TValue *lj_meta_arith(lua_State *L, TValue *ra, cTValue *rb, cTValue *rc, - BCReg op) -{ - MMS mm = bcmode_mm(op); - TValue tempb, tempc; - cTValue *b, *c; - if ((b = str2num(rb, &tempb)) != NULL && - (c = str2num(rc, &tempc)) != NULL) { /* Try coercion first. */ - setnumV(ra, lj_vm_foldarith(numV(b), numV(c), (int)mm-MM_add)); - return NULL; - } else { - cTValue *mo = lj_meta_lookup(L, rb, mm); - if (tvisnil(mo)) { - mo = lj_meta_lookup(L, rc, mm); - if (tvisnil(mo)) { - if (str2num(rb, &tempb) == NULL) rc = rb; - lj_err_optype(L, rc, LJ_ERR_OPARITH); - return NULL; /* unreachable */ - } - } - return mmcall(L, lj_cont_ra, mo, rb, rc); - } -} - -/* In-place coercion of a number to a string. */ -static LJ_AINLINE int tostring(lua_State *L, TValue *o) -{ - if (tvisstr(o)) { - return 1; - } else if (tvisnumber(o)) { - setstrV(L, o, lj_str_fromnumber(L, o)); - return 1; - } else { - return 0; - } -} - -/* Helper for CAT. Coercion, iterative concat, __concat metamethod. */ -TValue *lj_meta_cat(lua_State *L, TValue *top, int left) -{ - int fromc = 0; - if (left < 0) { left = -left; fromc = 1; } - do { - int n = 1; - if (!(tvisstr(top-1) || tvisnumber(top-1)) || !tostring(L, top)) { - cTValue *mo = lj_meta_lookup(L, top-1, MM_concat); - if (tvisnil(mo)) { - mo = lj_meta_lookup(L, top, MM_concat); - if (tvisnil(mo)) { - if (tvisstr(top-1) || tvisnumber(top-1)) top++; - lj_err_optype(L, top-1, LJ_ERR_OPCAT); - return NULL; /* unreachable */ - } - } - /* One of the top two elements is not a string, call __cat metamethod: - ** - ** before: [...][CAT stack .........................] - ** top-1 top top+1 top+2 - ** pick two: [...][CAT stack ...] [o1] [o2] - ** setup mm: [...][CAT stack ...] [cont|?] [mo|tmtype] [o1] [o2] - ** in asm: [...][CAT stack ...] [cont|PC] [mo|delta] [o1] [o2] - ** ^-- func base ^-- mm base - ** after mm: [...][CAT stack ...] <--push-- [result] - ** next step: [...][CAT stack .............] - */ - copyTV(L, top+2, top); /* Careful with the order of stack copies! */ - copyTV(L, top+1, top-1); - copyTV(L, top, mo); - setcont(top-1, lj_cont_cat); - return top+1; /* Trigger metamethod call. */ - } else if (strV(top)->len == 0) { /* Shortcut. */ - (void)tostring(L, top-1); - } else { - /* Pick as many strings as possible from the top and concatenate them: - ** - ** before: [...][CAT stack ...........................] - ** pick str: [...][CAT stack ...] [...... strings ......] - ** concat: [...][CAT stack ...] [result] - ** next step: [...][CAT stack ............] - */ - MSize tlen = strV(top)->len; - char *buffer; - int i; - for (n = 1; n <= left && tostring(L, top-n); n++) { - MSize len = strV(top-n)->len; - if (len >= LJ_MAX_STR - tlen) - lj_err_msg(L, LJ_ERR_STROV); - tlen += len; - } - buffer = lj_str_needbuf(L, &G(L)->tmpbuf, tlen); - n--; - tlen = 0; - for (i = n; i >= 0; i--) { - MSize len = strV(top-i)->len; - memcpy(buffer + tlen, strVdata(top-i), len); - tlen += len; - } - setstrV(L, top-n, lj_str_new(L, buffer, tlen)); - } - left -= n; - top -= n; - } while (left >= 1); - if (LJ_UNLIKELY(G(L)->gc.total >= G(L)->gc.threshold)) { - if (!fromc) L->top = curr_topL(L); - lj_gc_step(L); - } - return NULL; -} - -/* Helper for LEN. __len metamethod. */ -TValue * LJ_FASTCALL lj_meta_len(lua_State *L, cTValue *o) -{ - cTValue *mo = lj_meta_lookup(L, o, MM_len); - if (tvisnil(mo)) { - if (LJ_52 && tvistab(o)) - tabref(tabV(o)->metatable)->nomm |= (uint8_t)(1u<gch.metatable), MM_eq); - if (mo) { - TValue *top; - uint32_t it; - if (tabref(o1->gch.metatable) != tabref(o2->gch.metatable)) { - cTValue *mo2 = lj_meta_fast(L, tabref(o2->gch.metatable), MM_eq); - if (mo2 == NULL || !lj_obj_equal(mo, mo2)) - return (TValue *)(intptr_t)ne; - } - top = curr_top(L); - setcont(top, ne ? lj_cont_condf : lj_cont_condt); - copyTV(L, top+1, mo); - it = ~(uint32_t)o1->gch.gct; - setgcV(L, top+2, o1, it); - setgcV(L, top+3, o2, it); - return top+2; /* Trigger metamethod call. */ - } - return (TValue *)(intptr_t)ne; -} - -#if LJ_HASFFI -TValue * LJ_FASTCALL lj_meta_equal_cd(lua_State *L, BCIns ins) -{ - ASMFunction cont = (bc_op(ins) & 1) ? lj_cont_condf : lj_cont_condt; - int op = (int)bc_op(ins) & ~1; - TValue tv; - cTValue *mo, *o2, *o1 = &L->base[bc_a(ins)]; - cTValue *o1mm = o1; - if (op == BC_ISEQV) { - o2 = &L->base[bc_d(ins)]; - if (!tviscdata(o1mm)) o1mm = o2; - } else if (op == BC_ISEQS) { - setstrV(L, &tv, gco2str(proto_kgc(curr_proto(L), ~(ptrdiff_t)bc_d(ins)))); - o2 = &tv; - } else if (op == BC_ISEQN) { - o2 = &mref(curr_proto(L)->k, cTValue)[bc_d(ins)]; - } else { - lua_assert(op == BC_ISEQP); - setitype(&tv, ~bc_d(ins)); - o2 = &tv; - } - mo = lj_meta_lookup(L, o1mm, MM_eq); - if (LJ_LIKELY(!tvisnil(mo))) - return mmcall(L, cont, mo, o1, o2); - else - return (TValue *)(intptr_t)(bc_op(ins) & 1); -} -#endif - -/* Helper for ordered comparisons. String compare, __lt/__le metamethods. */ -TValue *lj_meta_comp(lua_State *L, cTValue *o1, cTValue *o2, int op) -{ - if (LJ_HASFFI && (tviscdata(o1) || tviscdata(o2))) { - ASMFunction cont = (op & 1) ? lj_cont_condf : lj_cont_condt; - MMS mm = (op & 2) ? MM_le : MM_lt; - cTValue *mo = lj_meta_lookup(L, tviscdata(o1) ? o1 : o2, mm); - if (LJ_UNLIKELY(tvisnil(mo))) goto err; - return mmcall(L, cont, mo, o1, o2); - } else if (LJ_52 || itype(o1) == itype(o2)) { - /* Never called with two numbers. */ - if (tvisstr(o1) && tvisstr(o2)) { - int32_t res = lj_str_cmp(strV(o1), strV(o2)); - return (TValue *)(intptr_t)(((op&2) ? res <= 0 : res < 0) ^ (op&1)); - } else { - trymt: - while (1) { - ASMFunction cont = (op & 1) ? lj_cont_condf : lj_cont_condt; - MMS mm = (op & 2) ? MM_le : MM_lt; - cTValue *mo = lj_meta_lookup(L, o1, mm); -#if LJ_52 - if (tvisnil(mo) && tvisnil((mo = lj_meta_lookup(L, o2, mm)))) -#else - cTValue *mo2 = lj_meta_lookup(L, o2, mm); - if (tvisnil(mo) || !lj_obj_equal(mo, mo2)) -#endif - { - if (op & 2) { /* MM_le not found: retry with MM_lt. */ - cTValue *ot = o1; o1 = o2; o2 = ot; /* Swap operands. */ - op ^= 3; /* Use LT and flip condition. */ - continue; - } - goto err; - } - return mmcall(L, cont, mo, o1, o2); - } - } - } else if (tvisbool(o1) && tvisbool(o2)) { - goto trymt; - } else { - err: - lj_err_comp(L, o1, o2); - return NULL; - } -} - -/* Helper for calls. __call metamethod. */ -void lj_meta_call(lua_State *L, TValue *func, TValue *top) -{ - cTValue *mo = lj_meta_lookup(L, func, MM_call); - TValue *p; - if (!tvisfunc(mo)) - lj_err_optype_call(L, func); - for (p = top; p > func; p--) copyTV(L, p, p-1); - copyTV(L, func, mo); -} - -/* Helper for FORI. Coercion. */ -void LJ_FASTCALL lj_meta_for(lua_State *L, TValue *o) -{ - if (!lj_strscan_numberobj(o)) lj_err_msg(L, LJ_ERR_FORINIT); - if (!lj_strscan_numberobj(o+1)) lj_err_msg(L, LJ_ERR_FORLIM); - if (!lj_strscan_numberobj(o+2)) lj_err_msg(L, LJ_ERR_FORSTEP); - if (LJ_DUALNUM) { - /* Ensure all slots are integers or all slots are numbers. */ - int32_t k[3]; - int nint = 0; - ptrdiff_t i; - for (i = 0; i <= 2; i++) { - if (tvisint(o+i)) { - k[i] = intV(o+i); nint++; - } else { - k[i] = lj_num2int(numV(o+i)); nint += ((lua_Number)k[i] == numV(o+i)); - } - } - if (nint == 3) { /* Narrow to integers. */ - setintV(o, k[0]); - setintV(o+1, k[1]); - setintV(o+2, k[2]); - } else if (nint != 0) { /* Widen to numbers. */ - if (tvisint(o)) setnumV(o, (lua_Number)intV(o)); - if (tvisint(o+1)) setnumV(o+1, (lua_Number)intV(o+1)); - if (tvisint(o+2)) setnumV(o+2, (lua_Number)intV(o+2)); - } - } -} - diff --git a/deps/luajit/src/lj_meta.h b/deps/luajit/src/lj_meta.h deleted file mode 100644 index 2c1ad0dd..00000000 --- a/deps/luajit/src/lj_meta.h +++ /dev/null @@ -1,37 +0,0 @@ -/* -** Metamethod handling. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#ifndef _LJ_META_H -#define _LJ_META_H - -#include "lj_obj.h" - -/* Metamethod handling */ -LJ_FUNC void lj_meta_init(lua_State *L); -LJ_FUNC cTValue *lj_meta_cache(GCtab *mt, MMS mm, GCstr *name); -LJ_FUNC cTValue *lj_meta_lookup(lua_State *L, cTValue *o, MMS mm); -#if LJ_HASFFI -LJ_FUNC int lj_meta_tailcall(lua_State *L, cTValue *tv); -#endif - -#define lj_meta_fastg(g, mt, mm) \ - ((mt) == NULL ? NULL : ((mt)->nomm & (1u<<(mm))) ? NULL : \ - lj_meta_cache(mt, mm, mmname_str(g, mm))) -#define lj_meta_fast(L, mt, mm) lj_meta_fastg(G(L), mt, mm) - -/* C helpers for some instructions, called from assembler VM. */ -LJ_FUNCA cTValue *lj_meta_tget(lua_State *L, cTValue *o, cTValue *k); -LJ_FUNCA TValue *lj_meta_tset(lua_State *L, cTValue *o, cTValue *k); -LJ_FUNCA TValue *lj_meta_arith(lua_State *L, TValue *ra, cTValue *rb, - cTValue *rc, BCReg op); -LJ_FUNCA TValue *lj_meta_cat(lua_State *L, TValue *top, int left); -LJ_FUNCA TValue * LJ_FASTCALL lj_meta_len(lua_State *L, cTValue *o); -LJ_FUNCA TValue *lj_meta_equal(lua_State *L, GCobj *o1, GCobj *o2, int ne); -LJ_FUNCA TValue * LJ_FASTCALL lj_meta_equal_cd(lua_State *L, BCIns ins); -LJ_FUNCA TValue *lj_meta_comp(lua_State *L, cTValue *o1, cTValue *o2, int op); -LJ_FUNCA void lj_meta_call(lua_State *L, TValue *func, TValue *top); -LJ_FUNCA void LJ_FASTCALL lj_meta_for(lua_State *L, TValue *o); - -#endif diff --git a/deps/luajit/src/lj_obj.c b/deps/luajit/src/lj_obj.c deleted file mode 100644 index 7fab714e..00000000 --- a/deps/luajit/src/lj_obj.c +++ /dev/null @@ -1,35 +0,0 @@ -/* -** Miscellaneous object handling. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#define lj_obj_c -#define LUA_CORE - -#include "lj_obj.h" - -/* Object type names. */ -LJ_DATADEF const char *const lj_obj_typename[] = { /* ORDER LUA_T */ - "no value", "nil", "boolean", "userdata", "number", "string", - "table", "function", "userdata", "thread", "proto", "cdata" -}; - -LJ_DATADEF const char *const lj_obj_itypename[] = { /* ORDER LJ_T */ - "nil", "boolean", "boolean", "userdata", "string", "upval", "thread", - "proto", "function", "trace", "cdata", "table", "userdata", "number" -}; - -/* Compare two objects without calling metamethods. */ -int lj_obj_equal(cTValue *o1, cTValue *o2) -{ - if (itype(o1) == itype(o2)) { - if (tvispri(o1)) - return 1; - if (!tvisnum(o1)) - return gcrefeq(o1->gcr, o2->gcr); - } else if (!tvisnumber(o1) || !tvisnumber(o2)) { - return 0; - } - return numberVnum(o1) == numberVnum(o2); -} - diff --git a/deps/luajit/src/lj_obj.h b/deps/luajit/src/lj_obj.h deleted file mode 100644 index 6e8381cb..00000000 --- a/deps/luajit/src/lj_obj.h +++ /dev/null @@ -1,856 +0,0 @@ -/* -** LuaJIT VM tags, values and objects. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -** -** Portions taken verbatim or adapted from the Lua interpreter. -** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h -*/ - -#ifndef _LJ_OBJ_H -#define _LJ_OBJ_H - -#include "lua.h" -#include "lj_def.h" -#include "lj_arch.h" - -/* -- Memory references (32 bit address space) ---------------------------- */ - -/* Memory size. */ -typedef uint32_t MSize; - -/* Memory reference */ -typedef struct MRef { - uint32_t ptr32; /* Pseudo 32 bit pointer. */ -} MRef; - -#define mref(r, t) ((t *)(void *)(uintptr_t)(r).ptr32) - -#define setmref(r, p) ((r).ptr32 = (uint32_t)(uintptr_t)(void *)(p)) -#define setmrefr(r, v) ((r).ptr32 = (v).ptr32) - -/* -- GC object references (32 bit address space) ------------------------- */ - -/* GCobj reference */ -typedef struct GCRef { - uint32_t gcptr32; /* Pseudo 32 bit pointer. */ -} GCRef; - -/* Common GC header for all collectable objects. */ -#define GCHeader GCRef nextgc; uint8_t marked; uint8_t gct -/* This occupies 6 bytes, so use the next 2 bytes for non-32 bit fields. */ - -#define gcref(r) ((GCobj *)(uintptr_t)(r).gcptr32) -#define gcrefp(r, t) ((t *)(void *)(uintptr_t)(r).gcptr32) -#define gcrefu(r) ((r).gcptr32) -#define gcrefi(r) ((int32_t)(r).gcptr32) -#define gcrefeq(r1, r2) ((r1).gcptr32 == (r2).gcptr32) -#define gcnext(gc) (gcref((gc)->gch.nextgc)) - -#define setgcref(r, gc) ((r).gcptr32 = (uint32_t)(uintptr_t)&(gc)->gch) -#define setgcrefi(r, i) ((r).gcptr32 = (uint32_t)(i)) -#define setgcrefp(r, p) ((r).gcptr32 = (uint32_t)(uintptr_t)(p)) -#define setgcrefnull(r) ((r).gcptr32 = 0) -#define setgcrefr(r, v) ((r).gcptr32 = (v).gcptr32) - -/* IMPORTANT NOTE: -** -** All uses of the setgcref* macros MUST be accompanied with a write barrier. -** -** This is to ensure the integrity of the incremental GC. The invariant -** to preserve is that a black object never points to a white object. -** I.e. never store a white object into a field of a black object. -** -** It's ok to LEAVE OUT the write barrier ONLY in the following cases: -** - The source is not a GC object (NULL). -** - The target is a GC root. I.e. everything in global_State. -** - The target is a lua_State field (threads are never black). -** - The target is a stack slot, see setgcV et al. -** - The target is an open upvalue, i.e. pointing to a stack slot. -** - The target is a newly created object (i.e. marked white). But make -** sure nothing invokes the GC inbetween. -** - The target and the source are the same object (self-reference). -** - The target already contains the object (e.g. moving elements around). -** -** The most common case is a store to a stack slot. All other cases where -** a barrier has been omitted are annotated with a NOBARRIER comment. -** -** The same logic applies for stores to table slots (array part or hash -** part). ALL uses of lj_tab_set* require a barrier for the stored value -** *and* the stored key, based on the above rules. In practice this means -** a barrier is needed if *either* of the key or value are a GC object. -** -** It's ok to LEAVE OUT the write barrier in the following special cases: -** - The stored value is nil. The key doesn't matter because it's either -** not resurrected or lj_tab_newkey() will take care of the key barrier. -** - The key doesn't matter if the *previously* stored value is guaranteed -** to be non-nil (because the key is kept alive in the table). -** - The key doesn't matter if it's guaranteed not to be part of the table, -** since lj_tab_newkey() takes care of the key barrier. This applies -** trivially to new tables, but watch out for resurrected keys. Storing -** a nil value leaves the key in the table! -** -** In case of doubt use lj_gc_anybarriert() as it's rather cheap. It's used -** by the interpreter for all table stores. -** -** Note: In contrast to Lua's GC, LuaJIT's GC does *not* specially mark -** dead keys in tables. The reference is left in, but it's guaranteed to -** be never dereferenced as long as the value is nil. It's ok if the key is -** freed or if any object subsequently gets the same address. -** -** Not destroying dead keys helps to keep key hash slots stable. This avoids -** specialization back-off for HREFK when a value flips between nil and -** non-nil and the GC gets in the way. It also allows safely hoisting -** HREF/HREFK across GC steps. Dead keys are only removed if a table is -** resized (i.e. by NEWREF) and xREF must not be CSEd across a resize. -** -** The trade-off is that a write barrier for tables must take the key into -** account, too. Implicitly resurrecting the key by storing a non-nil value -** may invalidate the incremental GC invariant. -*/ - -/* -- Common type definitions --------------------------------------------- */ - -/* Types for handling bytecodes. Need this here, details in lj_bc.h. */ -typedef uint32_t BCIns; /* Bytecode instruction. */ -typedef uint32_t BCPos; /* Bytecode position. */ -typedef uint32_t BCReg; /* Bytecode register. */ -typedef int32_t BCLine; /* Bytecode line number. */ - -/* Internal assembler functions. Never call these directly from C. */ -typedef void (*ASMFunction)(void); - -/* Resizable string buffer. Need this here, details in lj_str.h. */ -typedef struct SBuf { - char *buf; /* String buffer base. */ - MSize n; /* String buffer length. */ - MSize sz; /* String buffer size. */ -} SBuf; - -/* -- Tags and values ----------------------------------------------------- */ - -/* Frame link. */ -typedef union { - int32_t ftsz; /* Frame type and size of previous frame. */ - MRef pcr; /* Overlaps PC for Lua frames. */ -} FrameLink; - -/* Tagged value. */ -typedef LJ_ALIGN(8) union TValue { - uint64_t u64; /* 64 bit pattern overlaps number. */ - lua_Number n; /* Number object overlaps split tag/value object. */ - struct { - LJ_ENDIAN_LOHI( - union { - GCRef gcr; /* GCobj reference (if any). */ - int32_t i; /* Integer value. */ - }; - , uint32_t it; /* Internal object tag. Must overlap MSW of number. */ - ) - }; - struct { - LJ_ENDIAN_LOHI( - GCRef func; /* Function for next frame (or dummy L). */ - , FrameLink tp; /* Link to previous frame. */ - ) - } fr; - struct { - LJ_ENDIAN_LOHI( - uint32_t lo; /* Lower 32 bits of number. */ - , uint32_t hi; /* Upper 32 bits of number. */ - ) - } u32; -} TValue; - -typedef const TValue cTValue; - -#define tvref(r) (mref(r, TValue)) - -/* More external and GCobj tags for internal objects. */ -#define LAST_TT LUA_TTHREAD -#define LUA_TPROTO (LAST_TT+1) -#define LUA_TCDATA (LAST_TT+2) - -/* Internal object tags. -** -** Internal tags overlap the MSW of a number object (must be a double). -** Interpreted as a double these are special NaNs. The FPU only generates -** one type of NaN (0xfff8_0000_0000_0000). So MSWs > 0xfff80000 are available -** for use as internal tags. Small negative numbers are used to shorten the -** encoding of type comparisons (reg/mem against sign-ext. 8 bit immediate). -** -** ---MSW---.---LSW--- -** primitive types | itype | | -** lightuserdata | itype | void * | (32 bit platforms) -** lightuserdata |ffff| void * | (64 bit platforms, 47 bit pointers) -** GC objects | itype | GCRef | -** int (LJ_DUALNUM)| itype | int | -** number -------double------ -** -** ORDER LJ_T -** Primitive types nil/false/true must be first, lightuserdata next. -** GC objects are at the end, table/userdata must be lowest. -** Also check lj_ir.h for similar ordering constraints. -*/ -#define LJ_TNIL (~0u) -#define LJ_TFALSE (~1u) -#define LJ_TTRUE (~2u) -#define LJ_TLIGHTUD (~3u) -#define LJ_TSTR (~4u) -#define LJ_TUPVAL (~5u) -#define LJ_TTHREAD (~6u) -#define LJ_TPROTO (~7u) -#define LJ_TFUNC (~8u) -#define LJ_TTRACE (~9u) -#define LJ_TCDATA (~10u) -#define LJ_TTAB (~11u) -#define LJ_TUDATA (~12u) -/* This is just the canonical number type used in some places. */ -#define LJ_TNUMX (~13u) - -/* Integers have itype == LJ_TISNUM doubles have itype < LJ_TISNUM */ -#if LJ_64 -#define LJ_TISNUM 0xfffeffffu -#else -#define LJ_TISNUM LJ_TNUMX -#endif -#define LJ_TISTRUECOND LJ_TFALSE -#define LJ_TISPRI LJ_TTRUE -#define LJ_TISGCV (LJ_TSTR+1) -#define LJ_TISTABUD LJ_TTAB - -/* -- String object ------------------------------------------------------- */ - -/* String object header. String payload follows. */ -typedef struct GCstr { - GCHeader; - uint8_t reserved; /* Used by lexer for fast lookup of reserved words. */ - uint8_t unused; - MSize hash; /* Hash of string. */ - MSize len; /* Size of string. */ -} GCstr; - -#define strref(r) (&gcref((r))->str) -#define strdata(s) ((const char *)((s)+1)) -#define strdatawr(s) ((char *)((s)+1)) -#define strVdata(o) strdata(strV(o)) -#define sizestring(s) (sizeof(struct GCstr)+(s)->len+1) - -/* -- Userdata object ----------------------------------------------------- */ - -/* Userdata object. Payload follows. */ -typedef struct GCudata { - GCHeader; - uint8_t udtype; /* Userdata type. */ - uint8_t unused2; - GCRef env; /* Should be at same offset in GCfunc. */ - MSize len; /* Size of payload. */ - GCRef metatable; /* Must be at same offset in GCtab. */ - uint32_t align1; /* To force 8 byte alignment of the payload. */ -} GCudata; - -/* Userdata types. */ -enum { - UDTYPE_USERDATA, /* Regular userdata. */ - UDTYPE_IO_FILE, /* I/O library FILE. */ - UDTYPE_FFI_CLIB, /* FFI C library namespace. */ - UDTYPE__MAX -}; - -#define uddata(u) ((void *)((u)+1)) -#define sizeudata(u) (sizeof(struct GCudata)+(u)->len) - -/* -- C data object ------------------------------------------------------- */ - -/* C data object. Payload follows. */ -typedef struct GCcdata { - GCHeader; - uint16_t ctypeid; /* C type ID. */ -} GCcdata; - -/* Prepended to variable-sized or realigned C data objects. */ -typedef struct GCcdataVar { - uint16_t offset; /* Offset to allocated memory (relative to GCcdata). */ - uint16_t extra; /* Extra space allocated (incl. GCcdata + GCcdatav). */ - MSize len; /* Size of payload. */ -} GCcdataVar; - -#define cdataptr(cd) ((void *)((cd)+1)) -#define cdataisv(cd) ((cd)->marked & 0x80) -#define cdatav(cd) ((GCcdataVar *)((char *)(cd) - sizeof(GCcdataVar))) -#define cdatavlen(cd) check_exp(cdataisv(cd), cdatav(cd)->len) -#define sizecdatav(cd) (cdatavlen(cd) + cdatav(cd)->extra) -#define memcdatav(cd) ((void *)((char *)(cd) - cdatav(cd)->offset)) - -/* -- Prototype object ---------------------------------------------------- */ - -#define SCALE_NUM_GCO ((int32_t)sizeof(lua_Number)/sizeof(GCRef)) -#define round_nkgc(n) (((n) + SCALE_NUM_GCO-1) & ~(SCALE_NUM_GCO-1)) - -typedef struct GCproto { - GCHeader; - uint8_t numparams; /* Number of parameters. */ - uint8_t framesize; /* Fixed frame size. */ - MSize sizebc; /* Number of bytecode instructions. */ - GCRef gclist; - MRef k; /* Split constant array (points to the middle). */ - MRef uv; /* Upvalue list. local slot|0x8000 or parent uv idx. */ - MSize sizekgc; /* Number of collectable constants. */ - MSize sizekn; /* Number of lua_Number constants. */ - MSize sizept; /* Total size including colocated arrays. */ - uint8_t sizeuv; /* Number of upvalues. */ - uint8_t flags; /* Miscellaneous flags (see below). */ - uint16_t trace; /* Anchor for chain of root traces. */ - /* ------ The following fields are for debugging/tracebacks only ------ */ - GCRef chunkname; /* Name of the chunk this function was defined in. */ - BCLine firstline; /* First line of the function definition. */ - BCLine numline; /* Number of lines for the function definition. */ - MRef lineinfo; /* Compressed map from bytecode ins. to source line. */ - MRef uvinfo; /* Upvalue names. */ - MRef varinfo; /* Names and compressed extents of local variables. */ -} GCproto; - -/* Flags for prototype. */ -#define PROTO_CHILD 0x01 /* Has child prototypes. */ -#define PROTO_VARARG 0x02 /* Vararg function. */ -#define PROTO_FFI 0x04 /* Uses BC_KCDATA for FFI datatypes. */ -#define PROTO_NOJIT 0x08 /* JIT disabled for this function. */ -#define PROTO_ILOOP 0x10 /* Patched bytecode with ILOOP etc. */ -/* Only used during parsing. */ -#define PROTO_HAS_RETURN 0x20 /* Already emitted a return. */ -#define PROTO_FIXUP_RETURN 0x40 /* Need to fixup emitted returns. */ -/* Top bits used for counting created closures. */ -#define PROTO_CLCOUNT 0x20 /* Base of saturating 3 bit counter. */ -#define PROTO_CLC_BITS 3 -#define PROTO_CLC_POLY (3*PROTO_CLCOUNT) /* Polymorphic threshold. */ - -#define PROTO_UV_LOCAL 0x8000 /* Upvalue for local slot. */ -#define PROTO_UV_IMMUTABLE 0x4000 /* Immutable upvalue. */ - -#define proto_kgc(pt, idx) \ - check_exp((uintptr_t)(intptr_t)(idx) >= (uintptr_t)-(intptr_t)(pt)->sizekgc, \ - gcref(mref((pt)->k, GCRef)[(idx)])) -#define proto_knumtv(pt, idx) \ - check_exp((uintptr_t)(idx) < (pt)->sizekn, &mref((pt)->k, TValue)[(idx)]) -#define proto_bc(pt) ((BCIns *)((char *)(pt) + sizeof(GCproto))) -#define proto_bcpos(pt, pc) ((BCPos)((pc) - proto_bc(pt))) -#define proto_uv(pt) (mref((pt)->uv, uint16_t)) - -#define proto_chunkname(pt) (strref((pt)->chunkname)) -#define proto_chunknamestr(pt) (strdata(proto_chunkname((pt)))) -#define proto_lineinfo(pt) (mref((pt)->lineinfo, const void)) -#define proto_uvinfo(pt) (mref((pt)->uvinfo, const uint8_t)) -#define proto_varinfo(pt) (mref((pt)->varinfo, const uint8_t)) - -/* -- Upvalue object ------------------------------------------------------ */ - -typedef struct GCupval { - GCHeader; - uint8_t closed; /* Set if closed (i.e. uv->v == &uv->u.value). */ - uint8_t immutable; /* Immutable value. */ - union { - TValue tv; /* If closed: the value itself. */ - struct { /* If open: double linked list, anchored at thread. */ - GCRef prev; - GCRef next; - }; - }; - MRef v; /* Points to stack slot (open) or above (closed). */ - uint32_t dhash; /* Disambiguation hash: dh1 != dh2 => cannot alias. */ -} GCupval; - -#define uvprev(uv_) (&gcref((uv_)->prev)->uv) -#define uvnext(uv_) (&gcref((uv_)->next)->uv) -#define uvval(uv_) (mref((uv_)->v, TValue)) - -/* -- Function object (closures) ------------------------------------------ */ - -/* Common header for functions. env should be at same offset in GCudata. */ -#define GCfuncHeader \ - GCHeader; uint8_t ffid; uint8_t nupvalues; \ - GCRef env; GCRef gclist; MRef pc - -typedef struct GCfuncC { - GCfuncHeader; - lua_CFunction f; /* C function to be called. */ - TValue upvalue[1]; /* Array of upvalues (TValue). */ -} GCfuncC; - -typedef struct GCfuncL { - GCfuncHeader; - GCRef uvptr[1]; /* Array of _pointers_ to upvalue objects (GCupval). */ -} GCfuncL; - -typedef union GCfunc { - GCfuncC c; - GCfuncL l; -} GCfunc; - -#define FF_LUA 0 -#define FF_C 1 -#define isluafunc(fn) ((fn)->c.ffid == FF_LUA) -#define iscfunc(fn) ((fn)->c.ffid == FF_C) -#define isffunc(fn) ((fn)->c.ffid > FF_C) -#define funcproto(fn) \ - check_exp(isluafunc(fn), (GCproto *)(mref((fn)->l.pc, char)-sizeof(GCproto))) -#define sizeCfunc(n) (sizeof(GCfuncC)-sizeof(TValue)+sizeof(TValue)*(n)) -#define sizeLfunc(n) (sizeof(GCfuncL)-sizeof(GCRef)+sizeof(GCRef)*(n)) - -/* -- Table object -------------------------------------------------------- */ - -/* Hash node. */ -typedef struct Node { - TValue val; /* Value object. Must be first field. */ - TValue key; /* Key object. */ - MRef next; /* Hash chain. */ - MRef freetop; /* Top of free elements (stored in t->node[0]). */ -} Node; - -LJ_STATIC_ASSERT(offsetof(Node, val) == 0); - -typedef struct GCtab { - GCHeader; - uint8_t nomm; /* Negative cache for fast metamethods. */ - int8_t colo; /* Array colocation. */ - MRef array; /* Array part. */ - GCRef gclist; - GCRef metatable; /* Must be at same offset in GCudata. */ - MRef node; /* Hash part. */ - uint32_t asize; /* Size of array part (keys [0, asize-1]). */ - uint32_t hmask; /* Hash part mask (size of hash part - 1). */ -} GCtab; - -#define sizetabcolo(n) ((n)*sizeof(TValue) + sizeof(GCtab)) -#define tabref(r) (&gcref((r))->tab) -#define noderef(r) (mref((r), Node)) -#define nextnode(n) (mref((n)->next, Node)) - -/* -- State objects ------------------------------------------------------- */ - -/* VM states. */ -enum { - LJ_VMST_INTERP, /* Interpreter. */ - LJ_VMST_C, /* C function. */ - LJ_VMST_GC, /* Garbage collector. */ - LJ_VMST_EXIT, /* Trace exit handler. */ - LJ_VMST_RECORD, /* Trace recorder. */ - LJ_VMST_OPT, /* Optimizer. */ - LJ_VMST_ASM, /* Assembler. */ - LJ_VMST__MAX -}; - -#define setvmstate(g, st) ((g)->vmstate = ~LJ_VMST_##st) - -/* Metamethods. ORDER MM */ -#ifdef LJ_HASFFI -#define MMDEF_FFI(_) _(new) -#else -#define MMDEF_FFI(_) -#endif - -#if LJ_52 || LJ_HASFFI -#define MMDEF_PAIRS(_) _(pairs) _(ipairs) -#else -#define MMDEF_PAIRS(_) -#define MM_pairs 255 -#define MM_ipairs 255 -#endif - -#define MMDEF(_) \ - _(index) _(newindex) _(gc) _(mode) _(eq) _(len) \ - /* Only the above (fast) metamethods are negative cached (max. 8). */ \ - _(lt) _(le) _(concat) _(call) \ - /* The following must be in ORDER ARITH. */ \ - _(add) _(sub) _(mul) _(div) _(mod) _(pow) _(unm) \ - /* The following are used in the standard libraries. */ \ - _(metatable) _(tostring) MMDEF_FFI(_) MMDEF_PAIRS(_) - -typedef enum { -#define MMENUM(name) MM_##name, -MMDEF(MMENUM) -#undef MMENUM - MM__MAX, - MM____ = MM__MAX, - MM_FAST = MM_len -} MMS; - -/* GC root IDs. */ -typedef enum { - GCROOT_MMNAME, /* Metamethod names. */ - GCROOT_MMNAME_LAST = GCROOT_MMNAME + MM__MAX-1, - GCROOT_BASEMT, /* Metatables for base types. */ - GCROOT_BASEMT_NUM = GCROOT_BASEMT + ~LJ_TNUMX, - GCROOT_IO_INPUT, /* Userdata for default I/O input file. */ - GCROOT_IO_OUTPUT, /* Userdata for default I/O output file. */ - GCROOT_MAX -} GCRootID; - -#define basemt_it(g, it) ((g)->gcroot[GCROOT_BASEMT+~(it)]) -#define basemt_obj(g, o) ((g)->gcroot[GCROOT_BASEMT+itypemap(o)]) -#define mmname_str(g, mm) (strref((g)->gcroot[GCROOT_MMNAME+(mm)])) - -typedef struct GCState { - MSize total; /* Memory currently allocated. */ - MSize threshold; /* Memory threshold. */ - uint8_t currentwhite; /* Current white color. */ - uint8_t state; /* GC state. */ - uint8_t nocdatafin; /* No cdata finalizer called. */ - uint8_t unused2; - MSize sweepstr; /* Sweep position in string table. */ - GCRef root; /* List of all collectable objects. */ - MRef sweep; /* Sweep position in root list. */ - GCRef gray; /* List of gray objects. */ - GCRef grayagain; /* List of objects for atomic traversal. */ - GCRef weak; /* List of weak tables (to be cleared). */ - GCRef mmudata; /* List of userdata (to be finalized). */ - MSize stepmul; /* Incremental GC step granularity. */ - MSize debt; /* Debt (how much GC is behind schedule). */ - MSize estimate; /* Estimate of memory actually in use. */ - MSize pause; /* Pause between successive GC cycles. */ -} GCState; - -/* Global state, shared by all threads of a Lua universe. */ -typedef struct global_State { - GCRef *strhash; /* String hash table (hash chain anchors). */ - MSize strmask; /* String hash mask (size of hash table - 1). */ - MSize strnum; /* Number of strings in hash table. */ - lua_Alloc allocf; /* Memory allocator. */ - void *allocd; /* Memory allocator data. */ - GCState gc; /* Garbage collector. */ - SBuf tmpbuf; /* Temporary buffer for string concatenation. */ - Node nilnode; /* Fallback 1-element hash part (nil key and value). */ - GCstr strempty; /* Empty string. */ - uint8_t stremptyz; /* Zero terminator of empty string. */ - uint8_t hookmask; /* Hook mask. */ - uint8_t dispatchmode; /* Dispatch mode. */ - uint8_t vmevmask; /* VM event mask. */ - GCRef mainthref; /* Link to main thread. */ - TValue registrytv; /* Anchor for registry. */ - TValue tmptv, tmptv2; /* Temporary TValues. */ - GCupval uvhead; /* Head of double-linked list of all open upvalues. */ - int32_t hookcount; /* Instruction hook countdown. */ - int32_t hookcstart; /* Start count for instruction hook counter. */ - lua_Hook hookf; /* Hook function. */ - lua_CFunction wrapf; /* Wrapper for C function calls. */ - lua_CFunction panic; /* Called as a last resort for errors. */ - volatile int32_t vmstate; /* VM state or current JIT code trace number. */ - BCIns bc_cfunc_int; /* Bytecode for internal C function calls. */ - BCIns bc_cfunc_ext; /* Bytecode for external C function calls. */ - GCRef jit_L; /* Current JIT code lua_State or NULL. */ - MRef jit_base; /* Current JIT code L->base. */ - MRef ctype_state; /* Pointer to C type state. */ - GCRef gcroot[GCROOT_MAX]; /* GC roots. */ -} global_State; - -#define mainthread(g) (&gcref(g->mainthref)->th) -#define niltv(L) \ - check_exp(tvisnil(&G(L)->nilnode.val), &G(L)->nilnode.val) -#define niltvg(g) \ - check_exp(tvisnil(&(g)->nilnode.val), &(g)->nilnode.val) - -/* Hook management. Hook event masks are defined in lua.h. */ -#define HOOK_EVENTMASK 0x0f -#define HOOK_ACTIVE 0x10 -#define HOOK_ACTIVE_SHIFT 4 -#define HOOK_VMEVENT 0x20 -#define HOOK_GC 0x40 -#define hook_active(g) ((g)->hookmask & HOOK_ACTIVE) -#define hook_enter(g) ((g)->hookmask |= HOOK_ACTIVE) -#define hook_entergc(g) ((g)->hookmask |= (HOOK_ACTIVE|HOOK_GC)) -#define hook_vmevent(g) ((g)->hookmask |= (HOOK_ACTIVE|HOOK_VMEVENT)) -#define hook_leave(g) ((g)->hookmask &= ~HOOK_ACTIVE) -#define hook_save(g) ((g)->hookmask & ~HOOK_EVENTMASK) -#define hook_restore(g, h) \ - ((g)->hookmask = ((g)->hookmask & HOOK_EVENTMASK) | (h)) - -/* Per-thread state object. */ -struct lua_State { - GCHeader; - uint8_t dummy_ffid; /* Fake FF_C for curr_funcisL() on dummy frames. */ - uint8_t status; /* Thread status. */ - MRef glref; /* Link to global state. */ - GCRef gclist; /* GC chain. */ - TValue *base; /* Base of currently executing function. */ - TValue *top; /* First free slot in the stack. */ - MRef maxstack; /* Last free slot in the stack. */ - MRef stack; /* Stack base. */ - GCRef openupval; /* List of open upvalues in the stack. */ - GCRef env; /* Thread environment (table of globals). */ - void *cframe; /* End of C stack frame chain. */ - MSize stacksize; /* True stack size (incl. LJ_STACK_EXTRA). */ -}; - -#define G(L) (mref(L->glref, global_State)) -#define registry(L) (&G(L)->registrytv) - -/* Macros to access the currently executing (Lua) function. */ -#define curr_func(L) (&gcref((L->base-1)->fr.func)->fn) -#define curr_funcisL(L) (isluafunc(curr_func(L))) -#define curr_proto(L) (funcproto(curr_func(L))) -#define curr_topL(L) (L->base + curr_proto(L)->framesize) -#define curr_top(L) (curr_funcisL(L) ? curr_topL(L) : L->top) - -/* -- GC object definition and conversions -------------------------------- */ - -/* GC header for generic access to common fields of GC objects. */ -typedef struct GChead { - GCHeader; - uint8_t unused1; - uint8_t unused2; - GCRef env; - GCRef gclist; - GCRef metatable; -} GChead; - -/* The env field SHOULD be at the same offset for all GC objects. */ -LJ_STATIC_ASSERT(offsetof(GChead, env) == offsetof(GCfuncL, env)); -LJ_STATIC_ASSERT(offsetof(GChead, env) == offsetof(GCudata, env)); - -/* The metatable field MUST be at the same offset for all GC objects. */ -LJ_STATIC_ASSERT(offsetof(GChead, metatable) == offsetof(GCtab, metatable)); -LJ_STATIC_ASSERT(offsetof(GChead, metatable) == offsetof(GCudata, metatable)); - -/* The gclist field MUST be at the same offset for all GC objects. */ -LJ_STATIC_ASSERT(offsetof(GChead, gclist) == offsetof(lua_State, gclist)); -LJ_STATIC_ASSERT(offsetof(GChead, gclist) == offsetof(GCproto, gclist)); -LJ_STATIC_ASSERT(offsetof(GChead, gclist) == offsetof(GCfuncL, gclist)); -LJ_STATIC_ASSERT(offsetof(GChead, gclist) == offsetof(GCtab, gclist)); - -typedef union GCobj { - GChead gch; - GCstr str; - GCupval uv; - lua_State th; - GCproto pt; - GCfunc fn; - GCcdata cd; - GCtab tab; - GCudata ud; -} GCobj; - -/* Macros to convert a GCobj pointer into a specific value. */ -#define gco2str(o) check_exp((o)->gch.gct == ~LJ_TSTR, &(o)->str) -#define gco2uv(o) check_exp((o)->gch.gct == ~LJ_TUPVAL, &(o)->uv) -#define gco2th(o) check_exp((o)->gch.gct == ~LJ_TTHREAD, &(o)->th) -#define gco2pt(o) check_exp((o)->gch.gct == ~LJ_TPROTO, &(o)->pt) -#define gco2func(o) check_exp((o)->gch.gct == ~LJ_TFUNC, &(o)->fn) -#define gco2cd(o) check_exp((o)->gch.gct == ~LJ_TCDATA, &(o)->cd) -#define gco2tab(o) check_exp((o)->gch.gct == ~LJ_TTAB, &(o)->tab) -#define gco2ud(o) check_exp((o)->gch.gct == ~LJ_TUDATA, &(o)->ud) - -/* Macro to convert any collectable object into a GCobj pointer. */ -#define obj2gco(v) ((GCobj *)(v)) - -/* -- TValue getters/setters ---------------------------------------------- */ - -#ifdef LUA_USE_ASSERT -#include "lj_gc.h" -#endif - -/* Macros to test types. */ -#define itype(o) ((o)->it) -#define tvisnil(o) (itype(o) == LJ_TNIL) -#define tvisfalse(o) (itype(o) == LJ_TFALSE) -#define tvistrue(o) (itype(o) == LJ_TTRUE) -#define tvisbool(o) (tvisfalse(o) || tvistrue(o)) -#if LJ_64 -#define tvislightud(o) (((int32_t)itype(o) >> 15) == -2) -#else -#define tvislightud(o) (itype(o) == LJ_TLIGHTUD) -#endif -#define tvisstr(o) (itype(o) == LJ_TSTR) -#define tvisfunc(o) (itype(o) == LJ_TFUNC) -#define tvisthread(o) (itype(o) == LJ_TTHREAD) -#define tvisproto(o) (itype(o) == LJ_TPROTO) -#define tviscdata(o) (itype(o) == LJ_TCDATA) -#define tvistab(o) (itype(o) == LJ_TTAB) -#define tvisudata(o) (itype(o) == LJ_TUDATA) -#define tvisnumber(o) (itype(o) <= LJ_TISNUM) -#define tvisint(o) (LJ_DUALNUM && itype(o) == LJ_TISNUM) -#define tvisnum(o) (itype(o) < LJ_TISNUM) - -#define tvistruecond(o) (itype(o) < LJ_TISTRUECOND) -#define tvispri(o) (itype(o) >= LJ_TISPRI) -#define tvistabud(o) (itype(o) <= LJ_TISTABUD) /* && !tvisnum() */ -#define tvisgcv(o) ((itype(o) - LJ_TISGCV) > (LJ_TNUMX - LJ_TISGCV)) - -/* Special macros to test numbers for NaN, +0, -0, +1 and raw equality. */ -#define tvisnan(o) ((o)->n != (o)->n) -#if LJ_64 -#define tviszero(o) (((o)->u64 << 1) == 0) -#else -#define tviszero(o) (((o)->u32.lo | ((o)->u32.hi << 1)) == 0) -#endif -#define tvispzero(o) ((o)->u64 == 0) -#define tvismzero(o) ((o)->u64 == U64x(80000000,00000000)) -#define tvispone(o) ((o)->u64 == U64x(3ff00000,00000000)) -#define rawnumequal(o1, o2) ((o1)->u64 == (o2)->u64) - -/* Macros to convert type ids. */ -#if LJ_64 -#define itypemap(o) \ - (tvisnumber(o) ? ~LJ_TNUMX : tvislightud(o) ? ~LJ_TLIGHTUD : ~itype(o)) -#else -#define itypemap(o) (tvisnumber(o) ? ~LJ_TNUMX : ~itype(o)) -#endif - -/* Macros to get tagged values. */ -#define gcval(o) (gcref((o)->gcr)) -#define boolV(o) check_exp(tvisbool(o), (LJ_TFALSE - (o)->it)) -#if LJ_64 -#define lightudV(o) \ - check_exp(tvislightud(o), (void *)((o)->u64 & U64x(00007fff,ffffffff))) -#else -#define lightudV(o) check_exp(tvislightud(o), gcrefp((o)->gcr, void)) -#endif -#define gcV(o) check_exp(tvisgcv(o), gcval(o)) -#define strV(o) check_exp(tvisstr(o), &gcval(o)->str) -#define funcV(o) check_exp(tvisfunc(o), &gcval(o)->fn) -#define threadV(o) check_exp(tvisthread(o), &gcval(o)->th) -#define protoV(o) check_exp(tvisproto(o), &gcval(o)->pt) -#define cdataV(o) check_exp(tviscdata(o), &gcval(o)->cd) -#define tabV(o) check_exp(tvistab(o), &gcval(o)->tab) -#define udataV(o) check_exp(tvisudata(o), &gcval(o)->ud) -#define numV(o) check_exp(tvisnum(o), (o)->n) -#define intV(o) check_exp(tvisint(o), (int32_t)(o)->i) - -/* Macros to set tagged values. */ -#define setitype(o, i) ((o)->it = (i)) -#define setnilV(o) ((o)->it = LJ_TNIL) -#define setboolV(o, x) ((o)->it = LJ_TFALSE-(uint32_t)(x)) - -static LJ_AINLINE void setlightudV(TValue *o, void *p) -{ -#if LJ_64 - o->u64 = (uint64_t)p | (((uint64_t)0xffff) << 48); -#else - setgcrefp(o->gcr, p); setitype(o, LJ_TLIGHTUD); -#endif -} - -#if LJ_64 -#define checklightudptr(L, p) \ - (((uint64_t)(p) >> 47) ? (lj_err_msg(L, LJ_ERR_BADLU), NULL) : (p)) -#define setcont(o, f) \ - ((o)->u64 = (uint64_t)(void *)(f) - (uint64_t)lj_vm_asm_begin) -#else -#define checklightudptr(L, p) (p) -#define setcont(o, f) setlightudV((o), (void *)(f)) -#endif - -#define tvchecklive(L, o) \ - UNUSED(L), lua_assert(!tvisgcv(o) || \ - ((~itype(o) == gcval(o)->gch.gct) && !isdead(G(L), gcval(o)))) - -static LJ_AINLINE void setgcV(lua_State *L, TValue *o, GCobj *v, uint32_t itype) -{ - setgcref(o->gcr, v); setitype(o, itype); tvchecklive(L, o); -} - -#define define_setV(name, type, tag) \ -static LJ_AINLINE void name(lua_State *L, TValue *o, type *v) \ -{ \ - setgcV(L, o, obj2gco(v), tag); \ -} -define_setV(setstrV, GCstr, LJ_TSTR) -define_setV(setthreadV, lua_State, LJ_TTHREAD) -define_setV(setprotoV, GCproto, LJ_TPROTO) -define_setV(setfuncV, GCfunc, LJ_TFUNC) -define_setV(setcdataV, GCcdata, LJ_TCDATA) -define_setV(settabV, GCtab, LJ_TTAB) -define_setV(setudataV, GCudata, LJ_TUDATA) - -#define setnumV(o, x) ((o)->n = (x)) -#define setnanV(o) ((o)->u64 = U64x(fff80000,00000000)) -#define setpinfV(o) ((o)->u64 = U64x(7ff00000,00000000)) -#define setminfV(o) ((o)->u64 = U64x(fff00000,00000000)) - -static LJ_AINLINE void setintV(TValue *o, int32_t i) -{ -#if LJ_DUALNUM - o->i = (uint32_t)i; setitype(o, LJ_TISNUM); -#else - o->n = (lua_Number)i; -#endif -} - -static LJ_AINLINE void setint64V(TValue *o, int64_t i) -{ - if (LJ_DUALNUM && LJ_LIKELY(i == (int64_t)(int32_t)i)) - setintV(o, (int32_t)i); - else - setnumV(o, (lua_Number)i); -} - -#if LJ_64 -#define setintptrV(o, i) setint64V((o), (i)) -#else -#define setintptrV(o, i) setintV((o), (i)) -#endif - -/* Copy tagged values. */ -static LJ_AINLINE void copyTV(lua_State *L, TValue *o1, const TValue *o2) -{ - *o1 = *o2; tvchecklive(L, o1); -} - -/* -- Number to integer conversion ---------------------------------------- */ - -#if LJ_SOFTFP -LJ_ASMF int32_t lj_vm_tobit(double x); -#endif - -static LJ_AINLINE int32_t lj_num2bit(lua_Number n) -{ -#if LJ_SOFTFP - return lj_vm_tobit(n); -#else - TValue o; - o.n = n + 6755399441055744.0; /* 2^52 + 2^51 */ - return (int32_t)o.u32.lo; -#endif -} - -#if LJ_TARGET_X86 && !defined(__SSE2__) -#define lj_num2int(n) lj_num2bit((n)) -#else -#define lj_num2int(n) ((int32_t)(n)) -#endif - -static LJ_AINLINE uint64_t lj_num2u64(lua_Number n) -{ -#ifdef _MSC_VER - if (n >= 9223372036854775808.0) /* They think it's a feature. */ - return (uint64_t)(int64_t)(n - 18446744073709551616.0); - else -#endif - return (uint64_t)n; -} - -static LJ_AINLINE int32_t numberVint(cTValue *o) -{ - if (LJ_LIKELY(tvisint(o))) - return intV(o); - else - return lj_num2int(numV(o)); -} - -static LJ_AINLINE lua_Number numberVnum(cTValue *o) -{ - if (LJ_UNLIKELY(tvisint(o))) - return (lua_Number)intV(o); - else - return numV(o); -} - -/* -- Miscellaneous object handling --------------------------------------- */ - -/* Names and maps for internal and external object tags. */ -LJ_DATA const char *const lj_obj_typename[1+LUA_TCDATA+1]; -LJ_DATA const char *const lj_obj_itypename[~LJ_TNUMX+1]; - -#define lj_typename(o) (lj_obj_itypename[itypemap(o)]) - -/* Compare two objects without calling metamethods. */ -LJ_FUNC int lj_obj_equal(cTValue *o1, cTValue *o2); - -#endif diff --git a/deps/luajit/src/lj_opt_dce.c b/deps/luajit/src/lj_opt_dce.c deleted file mode 100644 index 7f1faafe..00000000 --- a/deps/luajit/src/lj_opt_dce.c +++ /dev/null @@ -1,78 +0,0 @@ -/* -** DCE: Dead Code Elimination. Pre-LOOP only -- ASM already performs DCE. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#define lj_opt_dce_c -#define LUA_CORE - -#include "lj_obj.h" - -#if LJ_HASJIT - -#include "lj_ir.h" -#include "lj_jit.h" -#include "lj_iropt.h" - -/* Some local macros to save typing. Undef'd at the end. */ -#define IR(ref) (&J->cur.ir[(ref)]) - -/* Scan through all snapshots and mark all referenced instructions. */ -static void dce_marksnap(jit_State *J) -{ - SnapNo i, nsnap = J->cur.nsnap; - for (i = 0; i < nsnap; i++) { - SnapShot *snap = &J->cur.snap[i]; - SnapEntry *map = &J->cur.snapmap[snap->mapofs]; - MSize n, nent = snap->nent; - for (n = 0; n < nent; n++) { - IRRef ref = snap_ref(map[n]); - if (ref >= REF_FIRST) - irt_setmark(IR(ref)->t); - } - } -} - -/* Backwards propagate marks. Replace unused instructions with NOPs. */ -static void dce_propagate(jit_State *J) -{ - IRRef1 *pchain[IR__MAX]; - IRRef ins; - uint32_t i; - for (i = 0; i < IR__MAX; i++) pchain[i] = &J->chain[i]; - for (ins = J->cur.nins-1; ins >= REF_FIRST; ins--) { - IRIns *ir = IR(ins); - if (irt_ismarked(ir->t)) { - irt_clearmark(ir->t); - pchain[ir->o] = &ir->prev; - } else if (!ir_sideeff(ir)) { - *pchain[ir->o] = ir->prev; /* Reroute original instruction chain. */ - ir->t.irt = IRT_NIL; - ir->o = IR_NOP; /* Replace instruction with NOP. */ - ir->op1 = ir->op2 = 0; - ir->prev = 0; - continue; - } - if (ir->op1 >= REF_FIRST) irt_setmark(IR(ir->op1)->t); - if (ir->op2 >= REF_FIRST) irt_setmark(IR(ir->op2)->t); - } -} - -/* Dead Code Elimination. -** -** First backpropagate marks for all used instructions. Then replace -** the unused ones with a NOP. Note that compressing the IR to eliminate -** the NOPs does not pay off. -*/ -void lj_opt_dce(jit_State *J) -{ - if ((J->flags & JIT_F_OPT_DCE)) { - dce_marksnap(J); - dce_propagate(J); - memset(J->bpropcache, 0, sizeof(J->bpropcache)); /* Invalidate cache. */ - } -} - -#undef IR - -#endif diff --git a/deps/luajit/src/lj_opt_fold.c b/deps/luajit/src/lj_opt_fold.c deleted file mode 100644 index d00fdd56..00000000 --- a/deps/luajit/src/lj_opt_fold.c +++ /dev/null @@ -1,2304 +0,0 @@ -/* -** FOLD: Constant Folding, Algebraic Simplifications and Reassociation. -** ABCelim: Array Bounds Check Elimination. -** CSE: Common-Subexpression Elimination. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#define lj_opt_fold_c -#define LUA_CORE - -#include - -#include "lj_obj.h" - -#if LJ_HASJIT - -#include "lj_str.h" -#include "lj_tab.h" -#include "lj_ir.h" -#include "lj_jit.h" -#include "lj_iropt.h" -#include "lj_trace.h" -#if LJ_HASFFI -#include "lj_ctype.h" -#endif -#include "lj_carith.h" -#include "lj_vm.h" -#include "lj_strscan.h" - -/* Here's a short description how the FOLD engine processes instructions: -** -** The FOLD engine receives a single instruction stored in fins (J->fold.ins). -** The instruction and its operands are used to select matching fold rules. -** These are applied iteratively until a fixed point is reached. -** -** The 8 bit opcode of the instruction itself plus the opcodes of the -** two instructions referenced by its operands form a 24 bit key -** 'ins left right' (unused operands -> 0, literals -> lowest 8 bits). -** -** This key is used for partial matching against the fold rules. The -** left/right operand fields of the key are successively masked with -** the 'any' wildcard, from most specific to least specific: -** -** ins left right -** ins any right -** ins left any -** ins any any -** -** The masked key is used to lookup a matching fold rule in a semi-perfect -** hash table. If a matching rule is found, the related fold function is run. -** Multiple rules can share the same fold function. A fold rule may return -** one of several special values: -** -** - NEXTFOLD means no folding was applied, because an additional test -** inside the fold function failed. Matching continues against less -** specific fold rules. Finally the instruction is passed on to CSE. -** -** - RETRYFOLD means the instruction was modified in-place. Folding is -** retried as if this instruction had just been received. -** -** All other return values are terminal actions -- no further folding is -** applied: -** -** - INTFOLD(i) returns a reference to the integer constant i. -** -** - LEFTFOLD and RIGHTFOLD return the left/right operand reference -** without emitting an instruction. -** -** - CSEFOLD and EMITFOLD pass the instruction directly to CSE or emit -** it without passing through any further optimizations. -** -** - FAILFOLD, DROPFOLD and CONDFOLD only apply to instructions which have -** no result (e.g. guarded assertions): FAILFOLD means the guard would -** always fail, i.e. the current trace is pointless. DROPFOLD means -** the guard is always true and has been eliminated. CONDFOLD is a -** shortcut for FAILFOLD + cond (i.e. drop if true, otherwise fail). -** -** - Any other return value is interpreted as an IRRef or TRef. This -** can be a reference to an existing or a newly created instruction. -** Only the least-significant 16 bits (IRRef1) are used to form a TRef -** which is finally returned to the caller. -** -** The FOLD engine receives instructions both from the trace recorder and -** substituted instructions from LOOP unrolling. This means all types -** of instructions may end up here, even though the recorder bypasses -** FOLD in some cases. Thus all loads, stores and allocations must have -** an any/any rule to avoid being passed on to CSE. -** -** Carefully read the following requirements before adding or modifying -** any fold rules: -** -** Requirement #1: All fold rules must preserve their destination type. -** -** Consistently use INTFOLD() (KINT result) or lj_ir_knum() (KNUM result). -** Never use lj_ir_knumint() which can have either a KINT or KNUM result. -** -** Requirement #2: Fold rules should not create *new* instructions which -** reference operands *across* PHIs. -** -** E.g. a RETRYFOLD with 'fins->op1 = fleft->op1' is invalid if the -** left operand is a PHI. Then fleft->op1 would point across the PHI -** frontier to an invariant instruction. Adding a PHI for this instruction -** would be counterproductive. The solution is to add a barrier which -** prevents folding across PHIs, i.e. 'PHIBARRIER(fleft)' in this case. -** The only exception is for recurrences with high latencies like -** repeated int->num->int conversions. -** -** One could relax this condition a bit if the referenced instruction is -** a PHI, too. But this often leads to worse code due to excessive -** register shuffling. -** -** Note: returning *existing* instructions (e.g. LEFTFOLD) is ok, though. -** Even returning fleft->op1 would be ok, because a new PHI will added, -** if needed. But again, this leads to excessive register shuffling and -** should be avoided. -** -** Requirement #3: The set of all fold rules must be monotonic to guarantee -** termination. -** -** The goal is optimization, so one primarily wants to add strength-reducing -** rules. This means eliminating an instruction or replacing an instruction -** with one or more simpler instructions. Don't add fold rules which point -** into the other direction. -** -** Some rules (like commutativity) do not directly reduce the strength of -** an instruction, but enable other fold rules (e.g. by moving constants -** to the right operand). These rules must be made unidirectional to avoid -** cycles. -** -** Rule of thumb: the trace recorder expands the IR and FOLD shrinks it. -*/ - -/* Some local macros to save typing. Undef'd at the end. */ -#define IR(ref) (&J->cur.ir[(ref)]) -#define fins (&J->fold.ins) -#define fleft (&J->fold.left) -#define fright (&J->fold.right) -#define knumleft (ir_knum(fleft)->n) -#define knumright (ir_knum(fright)->n) - -/* Pass IR on to next optimization in chain (FOLD). */ -#define emitir(ot, a, b) (lj_ir_set(J, (ot), (a), (b)), lj_opt_fold(J)) - -/* Fold function type. Fastcall on x86 significantly reduces their size. */ -typedef IRRef (LJ_FASTCALL *FoldFunc)(jit_State *J); - -/* Macros for the fold specs, so buildvm can recognize them. */ -#define LJFOLD(x) -#define LJFOLDX(x) -#define LJFOLDF(name) static TRef LJ_FASTCALL fold_##name(jit_State *J) -/* Note: They must be at the start of a line or buildvm ignores them! */ - -/* Barrier to prevent using operands across PHIs. */ -#define PHIBARRIER(ir) if (irt_isphi((ir)->t)) return NEXTFOLD - -/* Barrier to prevent folding across a GC step. -** GC steps can only happen at the head of a trace and at LOOP. -** And the GC is only driven forward if there is at least one allocation. -*/ -#define gcstep_barrier(J, ref) \ - ((ref) < J->chain[IR_LOOP] && \ - (J->chain[IR_SNEW] || J->chain[IR_XSNEW] || \ - J->chain[IR_TNEW] || J->chain[IR_TDUP] || \ - J->chain[IR_CNEW] || J->chain[IR_CNEWI] || J->chain[IR_TOSTR])) - -/* -- Constant folding for FP numbers ------------------------------------- */ - -LJFOLD(ADD KNUM KNUM) -LJFOLD(SUB KNUM KNUM) -LJFOLD(MUL KNUM KNUM) -LJFOLD(DIV KNUM KNUM) -LJFOLD(NEG KNUM KNUM) -LJFOLD(ABS KNUM KNUM) -LJFOLD(ATAN2 KNUM KNUM) -LJFOLD(LDEXP KNUM KNUM) -LJFOLD(MIN KNUM KNUM) -LJFOLD(MAX KNUM KNUM) -LJFOLDF(kfold_numarith) -{ - lua_Number a = knumleft; - lua_Number b = knumright; - lua_Number y = lj_vm_foldarith(a, b, fins->o - IR_ADD); - return lj_ir_knum(J, y); -} - -LJFOLD(LDEXP KNUM KINT) -LJFOLDF(kfold_ldexp) -{ -#if LJ_TARGET_X86ORX64 - UNUSED(J); - return NEXTFOLD; -#else - return lj_ir_knum(J, ldexp(knumleft, fright->i)); -#endif -} - -LJFOLD(FPMATH KNUM any) -LJFOLDF(kfold_fpmath) -{ - lua_Number a = knumleft; - lua_Number y = lj_vm_foldfpm(a, fins->op2); - return lj_ir_knum(J, y); -} - -LJFOLD(POW KNUM KINT) -LJFOLDF(kfold_numpow) -{ - lua_Number a = knumleft; - lua_Number b = (lua_Number)fright->i; - lua_Number y = lj_vm_foldarith(a, b, IR_POW - IR_ADD); - return lj_ir_knum(J, y); -} - -/* Must not use kfold_kref for numbers (could be NaN). */ -LJFOLD(EQ KNUM KNUM) -LJFOLD(NE KNUM KNUM) -LJFOLD(LT KNUM KNUM) -LJFOLD(GE KNUM KNUM) -LJFOLD(LE KNUM KNUM) -LJFOLD(GT KNUM KNUM) -LJFOLD(ULT KNUM KNUM) -LJFOLD(UGE KNUM KNUM) -LJFOLD(ULE KNUM KNUM) -LJFOLD(UGT KNUM KNUM) -LJFOLDF(kfold_numcomp) -{ - return CONDFOLD(lj_ir_numcmp(knumleft, knumright, (IROp)fins->o)); -} - -/* -- Constant folding for 32 bit integers -------------------------------- */ - -static int32_t kfold_intop(int32_t k1, int32_t k2, IROp op) -{ - switch (op) { - case IR_ADD: k1 += k2; break; - case IR_SUB: k1 -= k2; break; - case IR_MUL: k1 *= k2; break; - case IR_MOD: k1 = lj_vm_modi(k1, k2); break; - case IR_NEG: k1 = -k1; break; - case IR_BAND: k1 &= k2; break; - case IR_BOR: k1 |= k2; break; - case IR_BXOR: k1 ^= k2; break; - case IR_BSHL: k1 <<= (k2 & 31); break; - case IR_BSHR: k1 = (int32_t)((uint32_t)k1 >> (k2 & 31)); break; - case IR_BSAR: k1 >>= (k2 & 31); break; - case IR_BROL: k1 = (int32_t)lj_rol((uint32_t)k1, (k2 & 31)); break; - case IR_BROR: k1 = (int32_t)lj_ror((uint32_t)k1, (k2 & 31)); break; - case IR_MIN: k1 = k1 < k2 ? k1 : k2; break; - case IR_MAX: k1 = k1 > k2 ? k1 : k2; break; - default: lua_assert(0); break; - } - return k1; -} - -LJFOLD(ADD KINT KINT) -LJFOLD(SUB KINT KINT) -LJFOLD(MUL KINT KINT) -LJFOLD(MOD KINT KINT) -LJFOLD(NEG KINT KINT) -LJFOLD(BAND KINT KINT) -LJFOLD(BOR KINT KINT) -LJFOLD(BXOR KINT KINT) -LJFOLD(BSHL KINT KINT) -LJFOLD(BSHR KINT KINT) -LJFOLD(BSAR KINT KINT) -LJFOLD(BROL KINT KINT) -LJFOLD(BROR KINT KINT) -LJFOLD(MIN KINT KINT) -LJFOLD(MAX KINT KINT) -LJFOLDF(kfold_intarith) -{ - return INTFOLD(kfold_intop(fleft->i, fright->i, (IROp)fins->o)); -} - -LJFOLD(ADDOV KINT KINT) -LJFOLD(SUBOV KINT KINT) -LJFOLD(MULOV KINT KINT) -LJFOLDF(kfold_intovarith) -{ - lua_Number n = lj_vm_foldarith((lua_Number)fleft->i, (lua_Number)fright->i, - fins->o - IR_ADDOV); - int32_t k = lj_num2int(n); - if (n != (lua_Number)k) - return FAILFOLD; - return INTFOLD(k); -} - -LJFOLD(BNOT KINT) -LJFOLDF(kfold_bnot) -{ - return INTFOLD(~fleft->i); -} - -LJFOLD(BSWAP KINT) -LJFOLDF(kfold_bswap) -{ - return INTFOLD((int32_t)lj_bswap((uint32_t)fleft->i)); -} - -LJFOLD(LT KINT KINT) -LJFOLD(GE KINT KINT) -LJFOLD(LE KINT KINT) -LJFOLD(GT KINT KINT) -LJFOLD(ULT KINT KINT) -LJFOLD(UGE KINT KINT) -LJFOLD(ULE KINT KINT) -LJFOLD(UGT KINT KINT) -LJFOLD(ABC KINT KINT) -LJFOLDF(kfold_intcomp) -{ - int32_t a = fleft->i, b = fright->i; - switch ((IROp)fins->o) { - case IR_LT: return CONDFOLD(a < b); - case IR_GE: return CONDFOLD(a >= b); - case IR_LE: return CONDFOLD(a <= b); - case IR_GT: return CONDFOLD(a > b); - case IR_ULT: return CONDFOLD((uint32_t)a < (uint32_t)b); - case IR_UGE: return CONDFOLD((uint32_t)a >= (uint32_t)b); - case IR_ULE: return CONDFOLD((uint32_t)a <= (uint32_t)b); - case IR_ABC: - case IR_UGT: return CONDFOLD((uint32_t)a > (uint32_t)b); - default: lua_assert(0); return FAILFOLD; - } -} - -LJFOLD(UGE any KINT) -LJFOLDF(kfold_intcomp0) -{ - if (fright->i == 0) - return DROPFOLD; - return NEXTFOLD; -} - -/* -- Constant folding for 64 bit integers -------------------------------- */ - -static uint64_t kfold_int64arith(uint64_t k1, uint64_t k2, IROp op) -{ - switch (op) { -#if LJ_64 || LJ_HASFFI - case IR_ADD: k1 += k2; break; - case IR_SUB: k1 -= k2; break; -#endif -#if LJ_HASFFI - case IR_MUL: k1 *= k2; break; - case IR_BAND: k1 &= k2; break; - case IR_BOR: k1 |= k2; break; - case IR_BXOR: k1 ^= k2; break; -#endif - default: UNUSED(k2); lua_assert(0); break; - } - return k1; -} - -LJFOLD(ADD KINT64 KINT64) -LJFOLD(SUB KINT64 KINT64) -LJFOLD(MUL KINT64 KINT64) -LJFOLD(BAND KINT64 KINT64) -LJFOLD(BOR KINT64 KINT64) -LJFOLD(BXOR KINT64 KINT64) -LJFOLDF(kfold_int64arith) -{ - return INT64FOLD(kfold_int64arith(ir_k64(fleft)->u64, - ir_k64(fright)->u64, (IROp)fins->o)); -} - -LJFOLD(DIV KINT64 KINT64) -LJFOLD(MOD KINT64 KINT64) -LJFOLD(POW KINT64 KINT64) -LJFOLDF(kfold_int64arith2) -{ -#if LJ_HASFFI - uint64_t k1 = ir_k64(fleft)->u64, k2 = ir_k64(fright)->u64; - if (irt_isi64(fins->t)) { - k1 = fins->o == IR_DIV ? lj_carith_divi64((int64_t)k1, (int64_t)k2) : - fins->o == IR_MOD ? lj_carith_modi64((int64_t)k1, (int64_t)k2) : - lj_carith_powi64((int64_t)k1, (int64_t)k2); - } else { - k1 = fins->o == IR_DIV ? lj_carith_divu64(k1, k2) : - fins->o == IR_MOD ? lj_carith_modu64(k1, k2) : - lj_carith_powu64(k1, k2); - } - return INT64FOLD(k1); -#else - UNUSED(J); lua_assert(0); return FAILFOLD; -#endif -} - -LJFOLD(BSHL KINT64 KINT) -LJFOLD(BSHR KINT64 KINT) -LJFOLD(BSAR KINT64 KINT) -LJFOLD(BROL KINT64 KINT) -LJFOLD(BROR KINT64 KINT) -LJFOLDF(kfold_int64shift) -{ -#if LJ_HASFFI || LJ_64 - uint64_t k = ir_k64(fleft)->u64; - int32_t sh = (fright->i & 63); - switch ((IROp)fins->o) { - case IR_BSHL: k <<= sh; break; -#if LJ_HASFFI - case IR_BSHR: k >>= sh; break; - case IR_BSAR: k = (uint64_t)((int64_t)k >> sh); break; - case IR_BROL: k = lj_rol(k, sh); break; - case IR_BROR: k = lj_ror(k, sh); break; -#endif - default: lua_assert(0); break; - } - return INT64FOLD(k); -#else - UNUSED(J); lua_assert(0); return FAILFOLD; -#endif -} - -LJFOLD(BNOT KINT64) -LJFOLDF(kfold_bnot64) -{ -#if LJ_HASFFI - return INT64FOLD(~ir_k64(fleft)->u64); -#else - UNUSED(J); lua_assert(0); return FAILFOLD; -#endif -} - -LJFOLD(BSWAP KINT64) -LJFOLDF(kfold_bswap64) -{ -#if LJ_HASFFI - return INT64FOLD(lj_bswap64(ir_k64(fleft)->u64)); -#else - UNUSED(J); lua_assert(0); return FAILFOLD; -#endif -} - -LJFOLD(LT KINT64 KINT64) -LJFOLD(GE KINT64 KINT64) -LJFOLD(LE KINT64 KINT64) -LJFOLD(GT KINT64 KINT64) -LJFOLD(ULT KINT64 KINT64) -LJFOLD(UGE KINT64 KINT64) -LJFOLD(ULE KINT64 KINT64) -LJFOLD(UGT KINT64 KINT64) -LJFOLDF(kfold_int64comp) -{ -#if LJ_HASFFI - uint64_t a = ir_k64(fleft)->u64, b = ir_k64(fright)->u64; - switch ((IROp)fins->o) { - case IR_LT: return CONDFOLD(a < b); - case IR_GE: return CONDFOLD(a >= b); - case IR_LE: return CONDFOLD(a <= b); - case IR_GT: return CONDFOLD(a > b); - case IR_ULT: return CONDFOLD((uint64_t)a < (uint64_t)b); - case IR_UGE: return CONDFOLD((uint64_t)a >= (uint64_t)b); - case IR_ULE: return CONDFOLD((uint64_t)a <= (uint64_t)b); - case IR_UGT: return CONDFOLD((uint64_t)a > (uint64_t)b); - default: lua_assert(0); return FAILFOLD; - } -#else - UNUSED(J); lua_assert(0); return FAILFOLD; -#endif -} - -LJFOLD(UGE any KINT64) -LJFOLDF(kfold_int64comp0) -{ -#if LJ_HASFFI - if (ir_k64(fright)->u64 == 0) - return DROPFOLD; - return NEXTFOLD; -#else - UNUSED(J); lua_assert(0); return FAILFOLD; -#endif -} - -/* -- Constant folding for strings ---------------------------------------- */ - -LJFOLD(SNEW KKPTR KINT) -LJFOLDF(kfold_snew_kptr) -{ - GCstr *s = lj_str_new(J->L, (const char *)ir_kptr(fleft), (size_t)fright->i); - return lj_ir_kstr(J, s); -} - -LJFOLD(SNEW any KINT) -LJFOLDF(kfold_snew_empty) -{ - if (fright->i == 0) - return lj_ir_kstr(J, &J2G(J)->strempty); - return NEXTFOLD; -} - -LJFOLD(STRREF KGC KINT) -LJFOLDF(kfold_strref) -{ - GCstr *str = ir_kstr(fleft); - lua_assert((MSize)fright->i <= str->len); - return lj_ir_kkptr(J, (char *)strdata(str) + fright->i); -} - -LJFOLD(STRREF SNEW any) -LJFOLDF(kfold_strref_snew) -{ - PHIBARRIER(fleft); - if (irref_isk(fins->op2) && fright->i == 0) { - return fleft->op1; /* strref(snew(ptr, len), 0) ==> ptr */ - } else { - /* Reassociate: strref(snew(strref(str, a), len), b) ==> strref(str, a+b) */ - IRIns *ir = IR(fleft->op1); - if (ir->o == IR_STRREF) { - IRRef1 str = ir->op1; /* IRIns * is not valid across emitir. */ - PHIBARRIER(ir); - fins->op2 = emitir(IRTI(IR_ADD), ir->op2, fins->op2); /* Clobbers fins! */ - fins->op1 = str; - fins->ot = IRT(IR_STRREF, IRT_P32); - return RETRYFOLD; - } - } - return NEXTFOLD; -} - -LJFOLD(CALLN CARG IRCALL_lj_str_cmp) -LJFOLDF(kfold_strcmp) -{ - if (irref_isk(fleft->op1) && irref_isk(fleft->op2)) { - GCstr *a = ir_kstr(IR(fleft->op1)); - GCstr *b = ir_kstr(IR(fleft->op2)); - return INTFOLD(lj_str_cmp(a, b)); - } - return NEXTFOLD; -} - -/* -- Constant folding of pointer arithmetic ------------------------------ */ - -LJFOLD(ADD KGC KINT) -LJFOLD(ADD KGC KINT64) -LJFOLDF(kfold_add_kgc) -{ - GCobj *o = ir_kgc(fleft); -#if LJ_64 - ptrdiff_t ofs = (ptrdiff_t)ir_kint64(fright)->u64; -#else - ptrdiff_t ofs = fright->i; -#endif -#if LJ_HASFFI - if (irt_iscdata(fleft->t)) { - CType *ct = ctype_raw(ctype_ctsG(J2G(J)), gco2cd(o)->ctypeid); - if (ctype_isnum(ct->info) || ctype_isenum(ct->info) || - ctype_isptr(ct->info) || ctype_isfunc(ct->info) || - ctype_iscomplex(ct->info) || ctype_isvector(ct->info)) - return lj_ir_kkptr(J, (char *)o + ofs); - } -#endif - return lj_ir_kptr(J, (char *)o + ofs); -} - -LJFOLD(ADD KPTR KINT) -LJFOLD(ADD KPTR KINT64) -LJFOLD(ADD KKPTR KINT) -LJFOLD(ADD KKPTR KINT64) -LJFOLDF(kfold_add_kptr) -{ - void *p = ir_kptr(fleft); -#if LJ_64 - ptrdiff_t ofs = (ptrdiff_t)ir_kint64(fright)->u64; -#else - ptrdiff_t ofs = fright->i; -#endif - return lj_ir_kptr_(J, fleft->o, (char *)p + ofs); -} - -LJFOLD(ADD any KGC) -LJFOLD(ADD any KPTR) -LJFOLD(ADD any KKPTR) -LJFOLDF(kfold_add_kright) -{ - if (fleft->o == IR_KINT || fleft->o == IR_KINT64) { - IRRef1 tmp = fins->op1; fins->op1 = fins->op2; fins->op2 = tmp; - return RETRYFOLD; - } - return NEXTFOLD; -} - -/* -- Constant folding of conversions ------------------------------------- */ - -LJFOLD(TOBIT KNUM KNUM) -LJFOLDF(kfold_tobit) -{ - return INTFOLD(lj_num2bit(knumleft)); -} - -LJFOLD(CONV KINT IRCONV_NUM_INT) -LJFOLDF(kfold_conv_kint_num) -{ - return lj_ir_knum(J, (lua_Number)fleft->i); -} - -LJFOLD(CONV KINT IRCONV_NUM_U32) -LJFOLDF(kfold_conv_kintu32_num) -{ - return lj_ir_knum(J, (lua_Number)(uint32_t)fleft->i); -} - -LJFOLD(CONV KINT IRCONV_INT_I8) -LJFOLD(CONV KINT IRCONV_INT_U8) -LJFOLD(CONV KINT IRCONV_INT_I16) -LJFOLD(CONV KINT IRCONV_INT_U16) -LJFOLDF(kfold_conv_kint_ext) -{ - int32_t k = fleft->i; - if ((fins->op2 & IRCONV_SRCMASK) == IRT_I8) k = (int8_t)k; - else if ((fins->op2 & IRCONV_SRCMASK) == IRT_U8) k = (uint8_t)k; - else if ((fins->op2 & IRCONV_SRCMASK) == IRT_I16) k = (int16_t)k; - else k = (uint16_t)k; - return INTFOLD(k); -} - -LJFOLD(CONV KINT IRCONV_I64_INT) -LJFOLD(CONV KINT IRCONV_U64_INT) -LJFOLD(CONV KINT IRCONV_I64_U32) -LJFOLD(CONV KINT IRCONV_U64_U32) -LJFOLDF(kfold_conv_kint_i64) -{ - if ((fins->op2 & IRCONV_SEXT)) - return INT64FOLD((uint64_t)(int64_t)fleft->i); - else - return INT64FOLD((uint64_t)(int64_t)(uint32_t)fleft->i); -} - -LJFOLD(CONV KINT64 IRCONV_NUM_I64) -LJFOLDF(kfold_conv_kint64_num_i64) -{ - return lj_ir_knum(J, (lua_Number)(int64_t)ir_kint64(fleft)->u64); -} - -LJFOLD(CONV KINT64 IRCONV_NUM_U64) -LJFOLDF(kfold_conv_kint64_num_u64) -{ - return lj_ir_knum(J, (lua_Number)ir_kint64(fleft)->u64); -} - -LJFOLD(CONV KINT64 IRCONV_INT_I64) -LJFOLD(CONV KINT64 IRCONV_U32_I64) -LJFOLDF(kfold_conv_kint64_int_i64) -{ - return INTFOLD((int32_t)ir_kint64(fleft)->u64); -} - -LJFOLD(CONV KNUM IRCONV_INT_NUM) -LJFOLDF(kfold_conv_knum_int_num) -{ - lua_Number n = knumleft; - if (!(fins->op2 & IRCONV_TRUNC)) { - int32_t k = lj_num2int(n); - if (irt_isguard(fins->t) && n != (lua_Number)k) { - /* We're about to create a guard which always fails, like CONV +1.5. - ** Some pathological loops cause this during LICM, e.g.: - ** local x,k,t = 0,1.5,{1,[1.5]=2} - ** for i=1,200 do x = x+ t[k]; k = k == 1 and 1.5 or 1 end - ** assert(x == 300) - */ - return FAILFOLD; - } - return INTFOLD(k); - } else { - return INTFOLD((int32_t)n); - } -} - -LJFOLD(CONV KNUM IRCONV_U32_NUM) -LJFOLDF(kfold_conv_knum_u32_num) -{ - lua_assert((fins->op2 & IRCONV_TRUNC)); -#ifdef _MSC_VER - { /* Workaround for MSVC bug. */ - volatile uint32_t u = (uint32_t)knumleft; - return INTFOLD((int32_t)u); - } -#else - return INTFOLD((int32_t)(uint32_t)knumleft); -#endif -} - -LJFOLD(CONV KNUM IRCONV_I64_NUM) -LJFOLDF(kfold_conv_knum_i64_num) -{ - lua_assert((fins->op2 & IRCONV_TRUNC)); - return INT64FOLD((uint64_t)(int64_t)knumleft); -} - -LJFOLD(CONV KNUM IRCONV_U64_NUM) -LJFOLDF(kfold_conv_knum_u64_num) -{ - lua_assert((fins->op2 & IRCONV_TRUNC)); - return INT64FOLD(lj_num2u64(knumleft)); -} - -LJFOLD(TOSTR KNUM) -LJFOLDF(kfold_tostr_knum) -{ - return lj_ir_kstr(J, lj_str_fromnum(J->L, &knumleft)); -} - -LJFOLD(TOSTR KINT) -LJFOLDF(kfold_tostr_kint) -{ - return lj_ir_kstr(J, lj_str_fromint(J->L, fleft->i)); -} - -LJFOLD(STRTO KGC) -LJFOLDF(kfold_strto) -{ - TValue n; - if (lj_strscan_num(ir_kstr(fleft), &n)) - return lj_ir_knum(J, numV(&n)); - return FAILFOLD; -} - -/* -- Constant folding of equality checks --------------------------------- */ - -/* Don't constant-fold away FLOAD checks against KNULL. */ -LJFOLD(EQ FLOAD KNULL) -LJFOLD(NE FLOAD KNULL) -LJFOLDX(lj_opt_cse) - -/* But fold all other KNULL compares, since only KNULL is equal to KNULL. */ -LJFOLD(EQ any KNULL) -LJFOLD(NE any KNULL) -LJFOLD(EQ KNULL any) -LJFOLD(NE KNULL any) -LJFOLD(EQ KINT KINT) /* Constants are unique, so same refs <==> same value. */ -LJFOLD(NE KINT KINT) -LJFOLD(EQ KINT64 KINT64) -LJFOLD(NE KINT64 KINT64) -LJFOLD(EQ KGC KGC) -LJFOLD(NE KGC KGC) -LJFOLDF(kfold_kref) -{ - return CONDFOLD((fins->op1 == fins->op2) ^ (fins->o == IR_NE)); -} - -/* -- Algebraic shortcuts ------------------------------------------------- */ - -LJFOLD(FPMATH FPMATH IRFPM_FLOOR) -LJFOLD(FPMATH FPMATH IRFPM_CEIL) -LJFOLD(FPMATH FPMATH IRFPM_TRUNC) -LJFOLDF(shortcut_round) -{ - IRFPMathOp op = (IRFPMathOp)fleft->op2; - if (op == IRFPM_FLOOR || op == IRFPM_CEIL || op == IRFPM_TRUNC) - return LEFTFOLD; /* round(round_left(x)) = round_left(x) */ - return NEXTFOLD; -} - -LJFOLD(ABS ABS KNUM) -LJFOLDF(shortcut_left) -{ - return LEFTFOLD; /* f(g(x)) ==> g(x) */ -} - -LJFOLD(ABS NEG KNUM) -LJFOLDF(shortcut_dropleft) -{ - PHIBARRIER(fleft); - fins->op1 = fleft->op1; /* abs(neg(x)) ==> abs(x) */ - return RETRYFOLD; -} - -/* Note: no safe shortcuts with STRTO and TOSTR ("1e2" ==> +100 ==> "100"). */ -LJFOLD(NEG NEG any) -LJFOLD(BNOT BNOT) -LJFOLD(BSWAP BSWAP) -LJFOLDF(shortcut_leftleft) -{ - PHIBARRIER(fleft); /* See above. Fold would be ok, but not beneficial. */ - return fleft->op1; /* f(g(x)) ==> x */ -} - -/* -- FP algebraic simplifications ---------------------------------------- */ - -/* FP arithmetic is tricky -- there's not much to simplify. -** Please note the following common pitfalls before sending "improvements": -** x+0 ==> x is INVALID for x=-0 -** 0-x ==> -x is INVALID for x=+0 -** x*0 ==> 0 is INVALID for x=-0, x=+-Inf or x=NaN -*/ - -LJFOLD(ADD NEG any) -LJFOLDF(simplify_numadd_negx) -{ - PHIBARRIER(fleft); - fins->o = IR_SUB; /* (-a) + b ==> b - a */ - fins->op1 = fins->op2; - fins->op2 = fleft->op1; - return RETRYFOLD; -} - -LJFOLD(ADD any NEG) -LJFOLDF(simplify_numadd_xneg) -{ - PHIBARRIER(fright); - fins->o = IR_SUB; /* a + (-b) ==> a - b */ - fins->op2 = fright->op1; - return RETRYFOLD; -} - -LJFOLD(SUB any KNUM) -LJFOLDF(simplify_numsub_k) -{ - lua_Number n = knumright; - if (n == 0.0) /* x - (+-0) ==> x */ - return LEFTFOLD; - return NEXTFOLD; -} - -LJFOLD(SUB NEG KNUM) -LJFOLDF(simplify_numsub_negk) -{ - PHIBARRIER(fleft); - fins->op2 = fleft->op1; /* (-x) - k ==> (-k) - x */ - fins->op1 = (IRRef1)lj_ir_knum(J, -knumright); - return RETRYFOLD; -} - -LJFOLD(SUB any NEG) -LJFOLDF(simplify_numsub_xneg) -{ - PHIBARRIER(fright); - fins->o = IR_ADD; /* a - (-b) ==> a + b */ - fins->op2 = fright->op1; - return RETRYFOLD; -} - -LJFOLD(MUL any KNUM) -LJFOLD(DIV any KNUM) -LJFOLDF(simplify_nummuldiv_k) -{ - lua_Number n = knumright; - if (n == 1.0) { /* x o 1 ==> x */ - return LEFTFOLD; - } else if (n == -1.0) { /* x o -1 ==> -x */ - fins->o = IR_NEG; - fins->op2 = (IRRef1)lj_ir_knum_neg(J); - return RETRYFOLD; - } else if (fins->o == IR_MUL && n == 2.0) { /* x * 2 ==> x + x */ - fins->o = IR_ADD; - fins->op2 = fins->op1; - return RETRYFOLD; - } else if (fins->o == IR_DIV) { /* x / 2^k ==> x * 2^-k */ - uint64_t u = ir_knum(fright)->u64; - uint32_t ex = ((uint32_t)(u >> 52) & 0x7ff); - if ((u & U64x(000fffff,ffffffff)) == 0 && ex - 1 < 0x7fd) { - u = (u & ((uint64_t)1 << 63)) | ((uint64_t)(0x7fe - ex) << 52); - fins->o = IR_MUL; /* Multiply by exact reciprocal. */ - fins->op2 = lj_ir_knum_u64(J, u); - return RETRYFOLD; - } - } - return NEXTFOLD; -} - -LJFOLD(MUL NEG KNUM) -LJFOLD(DIV NEG KNUM) -LJFOLDF(simplify_nummuldiv_negk) -{ - PHIBARRIER(fleft); - fins->op1 = fleft->op1; /* (-a) o k ==> a o (-k) */ - fins->op2 = (IRRef1)lj_ir_knum(J, -knumright); - return RETRYFOLD; -} - -LJFOLD(MUL NEG NEG) -LJFOLD(DIV NEG NEG) -LJFOLDF(simplify_nummuldiv_negneg) -{ - PHIBARRIER(fleft); - PHIBARRIER(fright); - fins->op1 = fleft->op1; /* (-a) o (-b) ==> a o b */ - fins->op2 = fright->op1; - return RETRYFOLD; -} - -LJFOLD(POW any KINT) -LJFOLDF(simplify_numpow_xk) -{ - int32_t k = fright->i; - TRef ref = fins->op1; - if (k == 0) /* x ^ 0 ==> 1 */ - return lj_ir_knum_one(J); /* Result must be a number, not an int. */ - if (k == 1) /* x ^ 1 ==> x */ - return LEFTFOLD; - if ((uint32_t)(k+65536) > 2*65536u) /* Limit code explosion. */ - return NEXTFOLD; - if (k < 0) { /* x ^ (-k) ==> (1/x) ^ k. */ - ref = emitir(IRTN(IR_DIV), lj_ir_knum_one(J), ref); - k = -k; - } - /* Unroll x^k for 1 <= k <= 65536. */ - for (; (k & 1) == 0; k >>= 1) /* Handle leading zeros. */ - ref = emitir(IRTN(IR_MUL), ref, ref); - if ((k >>= 1) != 0) { /* Handle trailing bits. */ - TRef tmp = emitir(IRTN(IR_MUL), ref, ref); - for (; k != 1; k >>= 1) { - if (k & 1) - ref = emitir(IRTN(IR_MUL), ref, tmp); - tmp = emitir(IRTN(IR_MUL), tmp, tmp); - } - ref = emitir(IRTN(IR_MUL), ref, tmp); - } - return ref; -} - -LJFOLD(POW KNUM any) -LJFOLDF(simplify_numpow_kx) -{ - lua_Number n = knumleft; - if (n == 2.0) { /* 2.0 ^ i ==> ldexp(1.0, tonum(i)) */ - fins->o = IR_CONV; -#if LJ_TARGET_X86ORX64 - fins->op1 = fins->op2; - fins->op2 = IRCONV_NUM_INT; - fins->op2 = (IRRef1)lj_opt_fold(J); -#endif - fins->op1 = (IRRef1)lj_ir_knum_one(J); - fins->o = IR_LDEXP; - return RETRYFOLD; - } - return NEXTFOLD; -} - -/* -- Simplify conversions ------------------------------------------------ */ - -LJFOLD(CONV CONV IRCONV_NUM_INT) /* _NUM */ -LJFOLDF(shortcut_conv_num_int) -{ - PHIBARRIER(fleft); - /* Only safe with a guarded conversion to int. */ - if ((fleft->op2 & IRCONV_SRCMASK) == IRT_NUM && irt_isguard(fleft->t)) - return fleft->op1; /* f(g(x)) ==> x */ - return NEXTFOLD; -} - -LJFOLD(CONV CONV IRCONV_INT_NUM) /* _INT */ -LJFOLD(CONV CONV IRCONV_U32_NUM) /* _U32*/ -LJFOLDF(simplify_conv_int_num) -{ - /* Fold even across PHI to avoid expensive num->int conversions in loop. */ - if ((fleft->op2 & IRCONV_SRCMASK) == - ((fins->op2 & IRCONV_DSTMASK) >> IRCONV_DSH)) - return fleft->op1; - return NEXTFOLD; -} - -LJFOLD(CONV CONV IRCONV_I64_NUM) /* _INT or _U32 */ -LJFOLD(CONV CONV IRCONV_U64_NUM) /* _INT or _U32 */ -LJFOLDF(simplify_conv_i64_num) -{ - PHIBARRIER(fleft); - if ((fleft->op2 & IRCONV_SRCMASK) == IRT_INT) { - /* Reduce to a sign-extension. */ - fins->op1 = fleft->op1; - fins->op2 = ((IRT_I64<<5)|IRT_INT|IRCONV_SEXT); - return RETRYFOLD; - } else if ((fleft->op2 & IRCONV_SRCMASK) == IRT_U32) { -#if LJ_TARGET_X64 - return fleft->op1; -#else - /* Reduce to a zero-extension. */ - fins->op1 = fleft->op1; - fins->op2 = (IRT_I64<<5)|IRT_U32; - return RETRYFOLD; -#endif - } - return NEXTFOLD; -} - -LJFOLD(CONV CONV IRCONV_INT_I64) /* _INT or _U32 */ -LJFOLD(CONV CONV IRCONV_INT_U64) /* _INT or _U32 */ -LJFOLD(CONV CONV IRCONV_U32_I64) /* _INT or _U32 */ -LJFOLD(CONV CONV IRCONV_U32_U64) /* _INT or _U32 */ -LJFOLDF(simplify_conv_int_i64) -{ - int src; - PHIBARRIER(fleft); - src = (fleft->op2 & IRCONV_SRCMASK); - if (src == IRT_INT || src == IRT_U32) { - if (src == ((fins->op2 & IRCONV_DSTMASK) >> IRCONV_DSH)) { - return fleft->op1; - } else { - fins->op2 = ((fins->op2 & IRCONV_DSTMASK) | src); - fins->op1 = fleft->op1; - return RETRYFOLD; - } - } - return NEXTFOLD; -} - -LJFOLD(CONV CONV IRCONV_FLOAT_NUM) /* _FLOAT */ -LJFOLDF(simplify_conv_flt_num) -{ - PHIBARRIER(fleft); - if ((fleft->op2 & IRCONV_SRCMASK) == IRT_FLOAT) - return fleft->op1; - return NEXTFOLD; -} - -/* Shortcut TOBIT + IRT_NUM <- IRT_INT/IRT_U32 conversion. */ -LJFOLD(TOBIT CONV KNUM) -LJFOLDF(simplify_tobit_conv) -{ - /* Fold even across PHI to avoid expensive num->int conversions in loop. */ - if ((fleft->op2 & IRCONV_SRCMASK) == IRT_INT) { - lua_assert(irt_isnum(fleft->t)); - return fleft->op1; - } else if ((fleft->op2 & IRCONV_SRCMASK) == IRT_U32) { - lua_assert(irt_isnum(fleft->t)); - fins->o = IR_CONV; - fins->op1 = fleft->op1; - fins->op2 = (IRT_INT<<5)|IRT_U32; - return RETRYFOLD; - } - return NEXTFOLD; -} - -/* Shortcut floor/ceil/round + IRT_NUM <- IRT_INT/IRT_U32 conversion. */ -LJFOLD(FPMATH CONV IRFPM_FLOOR) -LJFOLD(FPMATH CONV IRFPM_CEIL) -LJFOLD(FPMATH CONV IRFPM_TRUNC) -LJFOLDF(simplify_floor_conv) -{ - if ((fleft->op2 & IRCONV_SRCMASK) == IRT_INT || - (fleft->op2 & IRCONV_SRCMASK) == IRT_U32) - return LEFTFOLD; - return NEXTFOLD; -} - -/* Strength reduction of widening. */ -LJFOLD(CONV any IRCONV_I64_INT) -LJFOLD(CONV any IRCONV_U64_INT) -LJFOLDF(simplify_conv_sext) -{ - IRRef ref = fins->op1; - int64_t ofs = 0; - if (!(fins->op2 & IRCONV_SEXT)) - return NEXTFOLD; - PHIBARRIER(fleft); - if (fleft->o == IR_XLOAD && (irt_isu8(fleft->t) || irt_isu16(fleft->t))) - goto ok_reduce; - if (fleft->o == IR_ADD && irref_isk(fleft->op2)) { - ofs = (int64_t)IR(fleft->op2)->i; - ref = fleft->op1; - } - /* Use scalar evolution analysis results to strength-reduce sign-extension. */ - if (ref == J->scev.idx) { - IRRef lo = J->scev.dir ? J->scev.start : J->scev.stop; - lua_assert(irt_isint(J->scev.t)); - if (lo && IR(lo)->i + ofs >= 0) { - ok_reduce: -#if LJ_TARGET_X64 - /* Eliminate widening. All 32 bit ops do an implicit zero-extension. */ - return LEFTFOLD; -#else - /* Reduce to a (cheaper) zero-extension. */ - fins->op2 &= ~IRCONV_SEXT; - return RETRYFOLD; -#endif - } - } - return NEXTFOLD; -} - -/* Strength reduction of narrowing. */ -LJFOLD(CONV ADD IRCONV_INT_I64) -LJFOLD(CONV SUB IRCONV_INT_I64) -LJFOLD(CONV MUL IRCONV_INT_I64) -LJFOLD(CONV ADD IRCONV_INT_U64) -LJFOLD(CONV SUB IRCONV_INT_U64) -LJFOLD(CONV MUL IRCONV_INT_U64) -LJFOLD(CONV ADD IRCONV_U32_I64) -LJFOLD(CONV SUB IRCONV_U32_I64) -LJFOLD(CONV MUL IRCONV_U32_I64) -LJFOLD(CONV ADD IRCONV_U32_U64) -LJFOLD(CONV SUB IRCONV_U32_U64) -LJFOLD(CONV MUL IRCONV_U32_U64) -LJFOLDF(simplify_conv_narrow) -{ - IROp op = (IROp)fleft->o; - IRType t = irt_type(fins->t); - IRRef op1 = fleft->op1, op2 = fleft->op2, mode = fins->op2; - PHIBARRIER(fleft); - op1 = emitir(IRTI(IR_CONV), op1, mode); - op2 = emitir(IRTI(IR_CONV), op2, mode); - fins->ot = IRT(op, t); - fins->op1 = op1; - fins->op2 = op2; - return RETRYFOLD; -} - -/* Special CSE rule for CONV. */ -LJFOLD(CONV any any) -LJFOLDF(cse_conv) -{ - if (LJ_LIKELY(J->flags & JIT_F_OPT_CSE)) { - IRRef op1 = fins->op1, op2 = (fins->op2 & IRCONV_MODEMASK); - uint8_t guard = irt_isguard(fins->t); - IRRef ref = J->chain[IR_CONV]; - while (ref > op1) { - IRIns *ir = IR(ref); - /* Commoning with stronger checks is ok. */ - if (ir->op1 == op1 && (ir->op2 & IRCONV_MODEMASK) == op2 && - irt_isguard(ir->t) >= guard) - return ref; - ref = ir->prev; - } - } - return EMITFOLD; /* No fallthrough to regular CSE. */ -} - -/* FP conversion narrowing. */ -LJFOLD(TOBIT ADD KNUM) -LJFOLD(TOBIT SUB KNUM) -LJFOLD(CONV ADD IRCONV_INT_NUM) -LJFOLD(CONV SUB IRCONV_INT_NUM) -LJFOLD(CONV ADD IRCONV_I64_NUM) -LJFOLD(CONV SUB IRCONV_I64_NUM) -LJFOLDF(narrow_convert) -{ - PHIBARRIER(fleft); - /* Narrowing ignores PHIs and repeating it inside the loop is not useful. */ - if (J->chain[IR_LOOP]) - return NEXTFOLD; - lua_assert(fins->o != IR_CONV || (fins->op2&IRCONV_CONVMASK) != IRCONV_TOBIT); - return lj_opt_narrow_convert(J); -} - -/* -- Integer algebraic simplifications ----------------------------------- */ - -LJFOLD(ADD any KINT) -LJFOLD(ADDOV any KINT) -LJFOLD(SUBOV any KINT) -LJFOLDF(simplify_intadd_k) -{ - if (fright->i == 0) /* i o 0 ==> i */ - return LEFTFOLD; - return NEXTFOLD; -} - -LJFOLD(MULOV any KINT) -LJFOLDF(simplify_intmul_k) -{ - if (fright->i == 0) /* i * 0 ==> 0 */ - return RIGHTFOLD; - if (fright->i == 1) /* i * 1 ==> i */ - return LEFTFOLD; - if (fright->i == 2) { /* i * 2 ==> i + i */ - fins->o = IR_ADDOV; - fins->op2 = fins->op1; - return RETRYFOLD; - } - return NEXTFOLD; -} - -LJFOLD(SUB any KINT) -LJFOLDF(simplify_intsub_k) -{ - if (fright->i == 0) /* i - 0 ==> i */ - return LEFTFOLD; - fins->o = IR_ADD; /* i - k ==> i + (-k) */ - fins->op2 = (IRRef1)lj_ir_kint(J, -fright->i); /* Overflow for -2^31 ok. */ - return RETRYFOLD; -} - -LJFOLD(SUB KINT any) -LJFOLD(SUB KINT64 any) -LJFOLDF(simplify_intsub_kleft) -{ - if (fleft->o == IR_KINT ? (fleft->i == 0) : (ir_kint64(fleft)->u64 == 0)) { - fins->o = IR_NEG; /* 0 - i ==> -i */ - fins->op1 = fins->op2; - return RETRYFOLD; - } - return NEXTFOLD; -} - -LJFOLD(ADD any KINT64) -LJFOLDF(simplify_intadd_k64) -{ - if (ir_kint64(fright)->u64 == 0) /* i + 0 ==> i */ - return LEFTFOLD; - return NEXTFOLD; -} - -LJFOLD(SUB any KINT64) -LJFOLDF(simplify_intsub_k64) -{ - uint64_t k = ir_kint64(fright)->u64; - if (k == 0) /* i - 0 ==> i */ - return LEFTFOLD; - fins->o = IR_ADD; /* i - k ==> i + (-k) */ - fins->op2 = (IRRef1)lj_ir_kint64(J, (uint64_t)-(int64_t)k); - return RETRYFOLD; -} - -static TRef simplify_intmul_k(jit_State *J, int32_t k) -{ - /* Note: many more simplifications are possible, e.g. 2^k1 +- 2^k2. - ** But this is mainly intended for simple address arithmetic. - ** Also it's easier for the backend to optimize the original multiplies. - */ - if (k == 1) { /* i * 1 ==> i */ - return LEFTFOLD; - } else if ((k & (k-1)) == 0) { /* i * 2^k ==> i << k */ - fins->o = IR_BSHL; - fins->op2 = lj_ir_kint(J, lj_fls((uint32_t)k)); - return RETRYFOLD; - } - return NEXTFOLD; -} - -LJFOLD(MUL any KINT) -LJFOLDF(simplify_intmul_k32) -{ - if (fright->i == 0) /* i * 0 ==> 0 */ - return INTFOLD(0); - else if (fright->i > 0) - return simplify_intmul_k(J, fright->i); - return NEXTFOLD; -} - -LJFOLD(MUL any KINT64) -LJFOLDF(simplify_intmul_k64) -{ - if (ir_kint64(fright)->u64 == 0) /* i * 0 ==> 0 */ - return INT64FOLD(0); -#if LJ_64 - /* NYI: SPLIT for BSHL and 32 bit backend support. */ - else if (ir_kint64(fright)->u64 < 0x80000000u) - return simplify_intmul_k(J, (int32_t)ir_kint64(fright)->u64); -#endif - return NEXTFOLD; -} - -LJFOLD(MOD any KINT) -LJFOLDF(simplify_intmod_k) -{ - int32_t k = fright->i; - lua_assert(k != 0); - if (k > 0 && (k & (k-1)) == 0) { /* i % (2^k) ==> i & (2^k-1) */ - fins->o = IR_BAND; - fins->op2 = lj_ir_kint(J, k-1); - return RETRYFOLD; - } - return NEXTFOLD; -} - -LJFOLD(MOD KINT any) -LJFOLDF(simplify_intmod_kleft) -{ - if (fleft->i == 0) - return INTFOLD(0); - return NEXTFOLD; -} - -LJFOLD(SUB any any) -LJFOLD(SUBOV any any) -LJFOLDF(simplify_intsub) -{ - if (fins->op1 == fins->op2 && !irt_isnum(fins->t)) /* i - i ==> 0 */ - return irt_is64(fins->t) ? INT64FOLD(0) : INTFOLD(0); - return NEXTFOLD; -} - -LJFOLD(SUB ADD any) -LJFOLDF(simplify_intsubadd_leftcancel) -{ - if (!irt_isnum(fins->t)) { - PHIBARRIER(fleft); - if (fins->op2 == fleft->op1) /* (i + j) - i ==> j */ - return fleft->op2; - if (fins->op2 == fleft->op2) /* (i + j) - j ==> i */ - return fleft->op1; - } - return NEXTFOLD; -} - -LJFOLD(SUB SUB any) -LJFOLDF(simplify_intsubsub_leftcancel) -{ - if (!irt_isnum(fins->t)) { - PHIBARRIER(fleft); - if (fins->op2 == fleft->op1) { /* (i - j) - i ==> 0 - j */ - fins->op1 = (IRRef1)lj_ir_kint(J, 0); - fins->op2 = fleft->op2; - return RETRYFOLD; - } - } - return NEXTFOLD; -} - -LJFOLD(SUB any SUB) -LJFOLDF(simplify_intsubsub_rightcancel) -{ - if (!irt_isnum(fins->t)) { - PHIBARRIER(fright); - if (fins->op1 == fright->op1) /* i - (i - j) ==> j */ - return fright->op2; - } - return NEXTFOLD; -} - -LJFOLD(SUB any ADD) -LJFOLDF(simplify_intsubadd_rightcancel) -{ - if (!irt_isnum(fins->t)) { - PHIBARRIER(fright); - if (fins->op1 == fright->op1) { /* i - (i + j) ==> 0 - j */ - fins->op2 = fright->op2; - fins->op1 = (IRRef1)lj_ir_kint(J, 0); - return RETRYFOLD; - } - if (fins->op1 == fright->op2) { /* i - (j + i) ==> 0 - j */ - fins->op2 = fright->op1; - fins->op1 = (IRRef1)lj_ir_kint(J, 0); - return RETRYFOLD; - } - } - return NEXTFOLD; -} - -LJFOLD(SUB ADD ADD) -LJFOLDF(simplify_intsubaddadd_cancel) -{ - if (!irt_isnum(fins->t)) { - PHIBARRIER(fleft); - PHIBARRIER(fright); - if (fleft->op1 == fright->op1) { /* (i + j1) - (i + j2) ==> j1 - j2 */ - fins->op1 = fleft->op2; - fins->op2 = fright->op2; - return RETRYFOLD; - } - if (fleft->op1 == fright->op2) { /* (i + j1) - (j2 + i) ==> j1 - j2 */ - fins->op1 = fleft->op2; - fins->op2 = fright->op1; - return RETRYFOLD; - } - if (fleft->op2 == fright->op1) { /* (j1 + i) - (i + j2) ==> j1 - j2 */ - fins->op1 = fleft->op1; - fins->op2 = fright->op2; - return RETRYFOLD; - } - if (fleft->op2 == fright->op2) { /* (j1 + i) - (j2 + i) ==> j1 - j2 */ - fins->op1 = fleft->op1; - fins->op2 = fright->op1; - return RETRYFOLD; - } - } - return NEXTFOLD; -} - -LJFOLD(BAND any KINT) -LJFOLD(BAND any KINT64) -LJFOLDF(simplify_band_k) -{ - int64_t k = fright->o == IR_KINT ? (int64_t)fright->i : - (int64_t)ir_k64(fright)->u64; - if (k == 0) /* i & 0 ==> 0 */ - return RIGHTFOLD; - if (k == -1) /* i & -1 ==> i */ - return LEFTFOLD; - return NEXTFOLD; -} - -LJFOLD(BOR any KINT) -LJFOLD(BOR any KINT64) -LJFOLDF(simplify_bor_k) -{ - int64_t k = fright->o == IR_KINT ? (int64_t)fright->i : - (int64_t)ir_k64(fright)->u64; - if (k == 0) /* i | 0 ==> i */ - return LEFTFOLD; - if (k == -1) /* i | -1 ==> -1 */ - return RIGHTFOLD; - return NEXTFOLD; -} - -LJFOLD(BXOR any KINT) -LJFOLD(BXOR any KINT64) -LJFOLDF(simplify_bxor_k) -{ - int64_t k = fright->o == IR_KINT ? (int64_t)fright->i : - (int64_t)ir_k64(fright)->u64; - if (k == 0) /* i xor 0 ==> i */ - return LEFTFOLD; - if (k == -1) { /* i xor -1 ==> ~i */ - fins->o = IR_BNOT; - fins->op2 = 0; - return RETRYFOLD; - } - return NEXTFOLD; -} - -LJFOLD(BSHL any KINT) -LJFOLD(BSHR any KINT) -LJFOLD(BSAR any KINT) -LJFOLD(BROL any KINT) -LJFOLD(BROR any KINT) -LJFOLDF(simplify_shift_ik) -{ - int32_t mask = irt_is64(fins->t) ? 63 : 31; - int32_t k = (fright->i & mask); - if (k == 0) /* i o 0 ==> i */ - return LEFTFOLD; - if (k == 1 && fins->o == IR_BSHL) { /* i << 1 ==> i + i */ - fins->o = IR_ADD; - fins->op2 = fins->op1; - return RETRYFOLD; - } - if (k != fright->i) { /* i o k ==> i o (k & mask) */ - fins->op2 = (IRRef1)lj_ir_kint(J, k); - return RETRYFOLD; - } -#ifndef LJ_TARGET_UNIFYROT - if (fins->o == IR_BROR) { /* bror(i, k) ==> brol(i, (-k)&mask) */ - fins->o = IR_BROL; - fins->op2 = (IRRef1)lj_ir_kint(J, (-k)&mask); - return RETRYFOLD; - } -#endif - return NEXTFOLD; -} - -LJFOLD(BSHL any BAND) -LJFOLD(BSHR any BAND) -LJFOLD(BSAR any BAND) -LJFOLD(BROL any BAND) -LJFOLD(BROR any BAND) -LJFOLDF(simplify_shift_andk) -{ - IRIns *irk = IR(fright->op2); - PHIBARRIER(fright); - if ((fins->o < IR_BROL ? LJ_TARGET_MASKSHIFT : LJ_TARGET_MASKROT) && - irk->o == IR_KINT) { /* i o (j & mask) ==> i o j */ - int32_t mask = irt_is64(fins->t) ? 63 : 31; - int32_t k = irk->i & mask; - if (k == mask) { - fins->op2 = fright->op1; - return RETRYFOLD; - } - } - return NEXTFOLD; -} - -LJFOLD(BSHL KINT any) -LJFOLD(BSHR KINT any) -LJFOLD(BSHL KINT64 any) -LJFOLD(BSHR KINT64 any) -LJFOLDF(simplify_shift1_ki) -{ - int64_t k = fleft->o == IR_KINT ? (int64_t)fleft->i : - (int64_t)ir_k64(fleft)->u64; - if (k == 0) /* 0 o i ==> 0 */ - return LEFTFOLD; - return NEXTFOLD; -} - -LJFOLD(BSAR KINT any) -LJFOLD(BROL KINT any) -LJFOLD(BROR KINT any) -LJFOLD(BSAR KINT64 any) -LJFOLD(BROL KINT64 any) -LJFOLD(BROR KINT64 any) -LJFOLDF(simplify_shift2_ki) -{ - int64_t k = fleft->o == IR_KINT ? (int64_t)fleft->i : - (int64_t)ir_k64(fleft)->u64; - if (k == 0 || k == -1) /* 0 o i ==> 0; -1 o i ==> -1 */ - return LEFTFOLD; - return NEXTFOLD; -} - -LJFOLD(BSHL BAND KINT) -LJFOLD(BSHR BAND KINT) -LJFOLD(BROL BAND KINT) -LJFOLD(BROR BAND KINT) -LJFOLDF(simplify_shiftk_andk) -{ - IRIns *irk = IR(fleft->op2); - PHIBARRIER(fleft); - if (irk->o == IR_KINT) { /* (i & k1) o k2 ==> (i o k2) & (k1 o k2) */ - int32_t k = kfold_intop(irk->i, fright->i, (IROp)fins->o); - fins->op1 = fleft->op1; - fins->op1 = (IRRef1)lj_opt_fold(J); - fins->op2 = (IRRef1)lj_ir_kint(J, k); - fins->ot = IRTI(IR_BAND); - return RETRYFOLD; - } - return NEXTFOLD; -} - -LJFOLD(BAND BSHL KINT) -LJFOLD(BAND BSHR KINT) -LJFOLDF(simplify_andk_shiftk) -{ - IRIns *irk = IR(fleft->op2); - if (irk->o == IR_KINT && - kfold_intop(-1, irk->i, (IROp)fleft->o) == fright->i) - return LEFTFOLD; /* (i o k1) & k2 ==> i, if (-1 o k1) == k2 */ - return NEXTFOLD; -} - -/* -- Reassociation ------------------------------------------------------- */ - -LJFOLD(ADD ADD KINT) -LJFOLD(MUL MUL KINT) -LJFOLD(BAND BAND KINT) -LJFOLD(BOR BOR KINT) -LJFOLD(BXOR BXOR KINT) -LJFOLDF(reassoc_intarith_k) -{ - IRIns *irk = IR(fleft->op2); - if (irk->o == IR_KINT) { - int32_t k = kfold_intop(irk->i, fright->i, (IROp)fins->o); - if (k == irk->i) /* (i o k1) o k2 ==> i o k1, if (k1 o k2) == k1. */ - return LEFTFOLD; - PHIBARRIER(fleft); - fins->op1 = fleft->op1; - fins->op2 = (IRRef1)lj_ir_kint(J, k); - return RETRYFOLD; /* (i o k1) o k2 ==> i o (k1 o k2) */ - } - return NEXTFOLD; -} - -LJFOLD(ADD ADD KINT64) -LJFOLD(MUL MUL KINT64) -LJFOLD(BAND BAND KINT64) -LJFOLD(BOR BOR KINT64) -LJFOLD(BXOR BXOR KINT64) -LJFOLDF(reassoc_intarith_k64) -{ -#if LJ_HASFFI || LJ_64 - IRIns *irk = IR(fleft->op2); - if (irk->o == IR_KINT64) { - uint64_t k = kfold_int64arith(ir_k64(irk)->u64, - ir_k64(fright)->u64, (IROp)fins->o); - PHIBARRIER(fleft); - fins->op1 = fleft->op1; - fins->op2 = (IRRef1)lj_ir_kint64(J, k); - return RETRYFOLD; /* (i o k1) o k2 ==> i o (k1 o k2) */ - } - return NEXTFOLD; -#else - UNUSED(J); lua_assert(0); return FAILFOLD; -#endif -} - -LJFOLD(MIN MIN any) -LJFOLD(MAX MAX any) -LJFOLD(BAND BAND any) -LJFOLD(BOR BOR any) -LJFOLDF(reassoc_dup) -{ - if (fins->op2 == fleft->op1 || fins->op2 == fleft->op2) - return LEFTFOLD; /* (a o b) o a ==> a o b; (a o b) o b ==> a o b */ - return NEXTFOLD; -} - -LJFOLD(BXOR BXOR any) -LJFOLDF(reassoc_bxor) -{ - PHIBARRIER(fleft); - if (fins->op2 == fleft->op1) /* (a xor b) xor a ==> b */ - return fleft->op2; - if (fins->op2 == fleft->op2) /* (a xor b) xor b ==> a */ - return fleft->op1; - return NEXTFOLD; -} - -LJFOLD(BSHL BSHL KINT) -LJFOLD(BSHR BSHR KINT) -LJFOLD(BSAR BSAR KINT) -LJFOLD(BROL BROL KINT) -LJFOLD(BROR BROR KINT) -LJFOLDF(reassoc_shift) -{ - IRIns *irk = IR(fleft->op2); - PHIBARRIER(fleft); /* The (shift any KINT) rule covers k2 == 0 and more. */ - if (irk->o == IR_KINT) { /* (i o k1) o k2 ==> i o (k1 + k2) */ - int32_t mask = irt_is64(fins->t) ? 63 : 31; - int32_t k = (irk->i & mask) + (fright->i & mask); - if (k > mask) { /* Combined shift too wide? */ - if (fins->o == IR_BSHL || fins->o == IR_BSHR) - return mask == 31 ? INTFOLD(0) : INT64FOLD(0); - else if (fins->o == IR_BSAR) - k = mask; - else - k &= mask; - } - fins->op1 = fleft->op1; - fins->op2 = (IRRef1)lj_ir_kint(J, k); - return RETRYFOLD; - } - return NEXTFOLD; -} - -LJFOLD(MIN MIN KNUM) -LJFOLD(MAX MAX KNUM) -LJFOLD(MIN MIN KINT) -LJFOLD(MAX MAX KINT) -LJFOLDF(reassoc_minmax_k) -{ - IRIns *irk = IR(fleft->op2); - if (irk->o == IR_KNUM) { - lua_Number a = ir_knum(irk)->n; - lua_Number y = lj_vm_foldarith(a, knumright, fins->o - IR_ADD); - if (a == y) /* (x o k1) o k2 ==> x o k1, if (k1 o k2) == k1. */ - return LEFTFOLD; - PHIBARRIER(fleft); - fins->op1 = fleft->op1; - fins->op2 = (IRRef1)lj_ir_knum(J, y); - return RETRYFOLD; /* (x o k1) o k2 ==> x o (k1 o k2) */ - } else if (irk->o == IR_KINT) { - int32_t a = irk->i; - int32_t y = kfold_intop(a, fright->i, fins->o); - if (a == y) /* (x o k1) o k2 ==> x o k1, if (k1 o k2) == k1. */ - return LEFTFOLD; - PHIBARRIER(fleft); - fins->op1 = fleft->op1; - fins->op2 = (IRRef1)lj_ir_kint(J, y); - return RETRYFOLD; /* (x o k1) o k2 ==> x o (k1 o k2) */ - } - return NEXTFOLD; -} - -LJFOLD(MIN MAX any) -LJFOLD(MAX MIN any) -LJFOLDF(reassoc_minmax_left) -{ - if (fins->op2 == fleft->op1 || fins->op2 == fleft->op2) - return RIGHTFOLD; /* (b o1 a) o2 b ==> b; (a o1 b) o2 b ==> b */ - return NEXTFOLD; -} - -LJFOLD(MIN any MAX) -LJFOLD(MAX any MIN) -LJFOLDF(reassoc_minmax_right) -{ - if (fins->op1 == fright->op1 || fins->op1 == fright->op2) - return LEFTFOLD; /* a o2 (a o1 b) ==> a; a o2 (b o1 a) ==> a */ - return NEXTFOLD; -} - -/* -- Array bounds check elimination -------------------------------------- */ - -/* Eliminate ABC across PHIs to handle t[i-1] forwarding case. -** ABC(asize, (i+k)+(-k)) ==> ABC(asize, i), but only if it already exists. -** Could be generalized to (i+k1)+k2 ==> i+(k1+k2), but needs better disambig. -*/ -LJFOLD(ABC any ADD) -LJFOLDF(abc_fwd) -{ - if (LJ_LIKELY(J->flags & JIT_F_OPT_ABC)) { - if (irref_isk(fright->op2)) { - IRIns *add2 = IR(fright->op1); - if (add2->o == IR_ADD && irref_isk(add2->op2) && - IR(fright->op2)->i == -IR(add2->op2)->i) { - IRRef ref = J->chain[IR_ABC]; - IRRef lim = add2->op1; - if (fins->op1 > lim) lim = fins->op1; - while (ref > lim) { - IRIns *ir = IR(ref); - if (ir->op1 == fins->op1 && ir->op2 == add2->op1) - return DROPFOLD; - ref = ir->prev; - } - } - } - } - return NEXTFOLD; -} - -/* Eliminate ABC for constants. -** ABC(asize, k1), ABC(asize k2) ==> ABC(asize, max(k1, k2)) -** Drop second ABC if k2 is lower. Otherwise patch first ABC with k2. -*/ -LJFOLD(ABC any KINT) -LJFOLDF(abc_k) -{ - if (LJ_LIKELY(J->flags & JIT_F_OPT_ABC)) { - IRRef ref = J->chain[IR_ABC]; - IRRef asize = fins->op1; - while (ref > asize) { - IRIns *ir = IR(ref); - if (ir->op1 == asize && irref_isk(ir->op2)) { - int32_t k = IR(ir->op2)->i; - if (fright->i > k) - ir->op2 = fins->op2; - return DROPFOLD; - } - ref = ir->prev; - } - return EMITFOLD; /* Already performed CSE. */ - } - return NEXTFOLD; -} - -/* Eliminate invariant ABC inside loop. */ -LJFOLD(ABC any any) -LJFOLDF(abc_invar) -{ - /* Invariant ABC marked as PTR. Drop if op1 is invariant, too. */ - if (!irt_isint(fins->t) && fins->op1 < J->chain[IR_LOOP] && - !irt_isphi(IR(fins->op1)->t)) - return DROPFOLD; - return NEXTFOLD; -} - -/* -- Commutativity ------------------------------------------------------- */ - -/* The refs of commutative ops are canonicalized. Lower refs go to the right. -** Rationale behind this: -** - It (also) moves constants to the right. -** - It reduces the number of FOLD rules (e.g. (BOR any KINT) suffices). -** - It helps CSE to find more matches. -** - The assembler generates better code with constants at the right. -*/ - -LJFOLD(ADD any any) -LJFOLD(MUL any any) -LJFOLD(ADDOV any any) -LJFOLD(MULOV any any) -LJFOLDF(comm_swap) -{ - if (fins->op1 < fins->op2) { /* Move lower ref to the right. */ - IRRef1 tmp = fins->op1; - fins->op1 = fins->op2; - fins->op2 = tmp; - return RETRYFOLD; - } - return NEXTFOLD; -} - -LJFOLD(EQ any any) -LJFOLD(NE any any) -LJFOLDF(comm_equal) -{ - /* For non-numbers only: x == x ==> drop; x ~= x ==> fail */ - if (fins->op1 == fins->op2 && !irt_isnum(fins->t)) - return CONDFOLD(fins->o == IR_EQ); - return fold_comm_swap(J); -} - -LJFOLD(LT any any) -LJFOLD(GE any any) -LJFOLD(LE any any) -LJFOLD(GT any any) -LJFOLD(ULT any any) -LJFOLD(UGE any any) -LJFOLD(ULE any any) -LJFOLD(UGT any any) -LJFOLDF(comm_comp) -{ - /* For non-numbers only: x <=> x ==> drop; x <> x ==> fail */ - if (fins->op1 == fins->op2 && !irt_isnum(fins->t)) - return CONDFOLD((fins->o ^ (fins->o >> 1)) & 1); - if (fins->op1 < fins->op2) { /* Move lower ref to the right. */ - IRRef1 tmp = fins->op1; - fins->op1 = fins->op2; - fins->op2 = tmp; - fins->o ^= 3; /* GT <-> LT, GE <-> LE, does not affect U */ - return RETRYFOLD; - } - return NEXTFOLD; -} - -LJFOLD(BAND any any) -LJFOLD(BOR any any) -LJFOLD(MIN any any) -LJFOLD(MAX any any) -LJFOLDF(comm_dup) -{ - if (fins->op1 == fins->op2) /* x o x ==> x */ - return LEFTFOLD; - return fold_comm_swap(J); -} - -LJFOLD(BXOR any any) -LJFOLDF(comm_bxor) -{ - if (fins->op1 == fins->op2) /* i xor i ==> 0 */ - return irt_is64(fins->t) ? INT64FOLD(0) : INTFOLD(0); - return fold_comm_swap(J); -} - -/* -- Simplification of compound expressions ------------------------------ */ - -static TRef kfold_xload(jit_State *J, IRIns *ir, const void *p) -{ - int32_t k; - switch (irt_type(ir->t)) { - case IRT_NUM: return lj_ir_knum_u64(J, *(uint64_t *)p); - case IRT_I8: k = (int32_t)*(int8_t *)p; break; - case IRT_U8: k = (int32_t)*(uint8_t *)p; break; - case IRT_I16: k = (int32_t)(int16_t)lj_getu16(p); break; - case IRT_U16: k = (int32_t)(uint16_t)lj_getu16(p); break; - case IRT_INT: case IRT_U32: k = (int32_t)lj_getu32(p); break; - case IRT_I64: case IRT_U64: return lj_ir_kint64(J, *(uint64_t *)p); - default: return 0; - } - return lj_ir_kint(J, k); -} - -/* Turn: string.sub(str, a, b) == kstr -** into: string.byte(str, a) == string.byte(kstr, 1) etc. -** Note: this creates unaligned XLOADs on x86/x64. -*/ -LJFOLD(EQ SNEW KGC) -LJFOLD(NE SNEW KGC) -LJFOLDF(merge_eqne_snew_kgc) -{ - GCstr *kstr = ir_kstr(fright); - int32_t len = (int32_t)kstr->len; - lua_assert(irt_isstr(fins->t)); - -#if LJ_TARGET_UNALIGNED -#define FOLD_SNEW_MAX_LEN 4 /* Handle string lengths 0, 1, 2, 3, 4. */ -#define FOLD_SNEW_TYPE8 IRT_I8 /* Creates shorter immediates. */ -#else -#define FOLD_SNEW_MAX_LEN 1 /* Handle string lengths 0 or 1. */ -#define FOLD_SNEW_TYPE8 IRT_U8 /* Prefer unsigned loads. */ -#endif - - PHIBARRIER(fleft); - if (len <= FOLD_SNEW_MAX_LEN) { - IROp op = (IROp)fins->o; - IRRef strref = fleft->op1; - if (IR(strref)->o != IR_STRREF) - return NEXTFOLD; - if (op == IR_EQ) { - emitir(IRTGI(IR_EQ), fleft->op2, lj_ir_kint(J, len)); - /* Caveat: fins/fleft/fright is no longer valid after emitir. */ - } else { - /* NE is not expanded since this would need an OR of two conds. */ - if (!irref_isk(fleft->op2)) /* Only handle the constant length case. */ - return NEXTFOLD; - if (IR(fleft->op2)->i != len) - return DROPFOLD; - } - if (len > 0) { - /* A 4 byte load for length 3 is ok -- all strings have an extra NUL. */ - uint16_t ot = (uint16_t)(len == 1 ? IRT(IR_XLOAD, FOLD_SNEW_TYPE8) : - len == 2 ? IRT(IR_XLOAD, IRT_U16) : - IRTI(IR_XLOAD)); - TRef tmp = emitir(ot, strref, - IRXLOAD_READONLY | (len > 1 ? IRXLOAD_UNALIGNED : 0)); - TRef val = kfold_xload(J, IR(tref_ref(tmp)), strdata(kstr)); - if (len == 3) - tmp = emitir(IRTI(IR_BAND), tmp, - lj_ir_kint(J, LJ_ENDIAN_SELECT(0x00ffffff, 0xffffff00))); - fins->op1 = (IRRef1)tmp; - fins->op2 = (IRRef1)val; - fins->ot = (IROpT)IRTGI(op); - return RETRYFOLD; - } else { - return DROPFOLD; - } - } - return NEXTFOLD; -} - -/* -- Loads --------------------------------------------------------------- */ - -/* Loads cannot be folded or passed on to CSE in general. -** Alias analysis is needed to check for forwarding opportunities. -** -** Caveat: *all* loads must be listed here or they end up at CSE! -*/ - -LJFOLD(ALOAD any) -LJFOLDX(lj_opt_fwd_aload) - -/* From HREF fwd (see below). Must eliminate, not supported by fwd/backend. */ -LJFOLD(HLOAD KKPTR) -LJFOLDF(kfold_hload_kkptr) -{ - UNUSED(J); - lua_assert(ir_kptr(fleft) == niltvg(J2G(J))); - return TREF_NIL; -} - -LJFOLD(HLOAD any) -LJFOLDX(lj_opt_fwd_hload) - -LJFOLD(ULOAD any) -LJFOLDX(lj_opt_fwd_uload) - -LJFOLD(CALLL any IRCALL_lj_tab_len) -LJFOLDX(lj_opt_fwd_tab_len) - -/* Upvalue refs are really loads, but there are no corresponding stores. -** So CSE is ok for them, except for UREFO across a GC step (see below). -** If the referenced function is const, its upvalue addresses are const, too. -** This can be used to improve CSE by looking for the same address, -** even if the upvalues originate from a different function. -*/ -LJFOLD(UREFO KGC any) -LJFOLD(UREFC KGC any) -LJFOLDF(cse_uref) -{ - if (LJ_LIKELY(J->flags & JIT_F_OPT_CSE)) { - IRRef ref = J->chain[fins->o]; - GCfunc *fn = ir_kfunc(fleft); - GCupval *uv = gco2uv(gcref(fn->l.uvptr[(fins->op2 >> 8)])); - while (ref > 0) { - IRIns *ir = IR(ref); - if (irref_isk(ir->op1)) { - GCfunc *fn2 = ir_kfunc(IR(ir->op1)); - if (gco2uv(gcref(fn2->l.uvptr[(ir->op2 >> 8)])) == uv) { - if (fins->o == IR_UREFO && gcstep_barrier(J, ref)) - break; - return ref; - } - } - ref = ir->prev; - } - } - return EMITFOLD; -} - -LJFOLD(HREFK any any) -LJFOLDX(lj_opt_fwd_hrefk) - -LJFOLD(HREF TNEW any) -LJFOLDF(fwd_href_tnew) -{ - if (lj_opt_fwd_href_nokey(J)) - return lj_ir_kkptr(J, niltvg(J2G(J))); - return NEXTFOLD; -} - -LJFOLD(HREF TDUP KPRI) -LJFOLD(HREF TDUP KGC) -LJFOLD(HREF TDUP KNUM) -LJFOLDF(fwd_href_tdup) -{ - TValue keyv; - lj_ir_kvalue(J->L, &keyv, fright); - if (lj_tab_get(J->L, ir_ktab(IR(fleft->op1)), &keyv) == niltvg(J2G(J)) && - lj_opt_fwd_href_nokey(J)) - return lj_ir_kkptr(J, niltvg(J2G(J))); - return NEXTFOLD; -} - -/* We can safely FOLD/CSE array/hash refs and field loads, since there -** are no corresponding stores. But we need to check for any NEWREF with -** an aliased table, as it may invalidate all of the pointers and fields. -** Only HREF needs the NEWREF check -- AREF and HREFK already depend on -** FLOADs. And NEWREF itself is treated like a store (see below). -*/ -LJFOLD(FLOAD TNEW IRFL_TAB_ASIZE) -LJFOLDF(fload_tab_tnew_asize) -{ - if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD) && lj_opt_fwd_tptr(J, fins->op1)) - return INTFOLD(fleft->op1); - return NEXTFOLD; -} - -LJFOLD(FLOAD TNEW IRFL_TAB_HMASK) -LJFOLDF(fload_tab_tnew_hmask) -{ - if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD) && lj_opt_fwd_tptr(J, fins->op1)) - return INTFOLD((1 << fleft->op2)-1); - return NEXTFOLD; -} - -LJFOLD(FLOAD TDUP IRFL_TAB_ASIZE) -LJFOLDF(fload_tab_tdup_asize) -{ - if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD) && lj_opt_fwd_tptr(J, fins->op1)) - return INTFOLD((int32_t)ir_ktab(IR(fleft->op1))->asize); - return NEXTFOLD; -} - -LJFOLD(FLOAD TDUP IRFL_TAB_HMASK) -LJFOLDF(fload_tab_tdup_hmask) -{ - if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD) && lj_opt_fwd_tptr(J, fins->op1)) - return INTFOLD((int32_t)ir_ktab(IR(fleft->op1))->hmask); - return NEXTFOLD; -} - -LJFOLD(HREF any any) -LJFOLD(FLOAD any IRFL_TAB_ARRAY) -LJFOLD(FLOAD any IRFL_TAB_NODE) -LJFOLD(FLOAD any IRFL_TAB_ASIZE) -LJFOLD(FLOAD any IRFL_TAB_HMASK) -LJFOLDF(fload_tab_ah) -{ - TRef tr = lj_opt_cse(J); - return lj_opt_fwd_tptr(J, tref_ref(tr)) ? tr : EMITFOLD; -} - -/* Strings are immutable, so we can safely FOLD/CSE the related FLOAD. */ -LJFOLD(FLOAD KGC IRFL_STR_LEN) -LJFOLDF(fload_str_len_kgc) -{ - if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD)) - return INTFOLD((int32_t)ir_kstr(fleft)->len); - return NEXTFOLD; -} - -LJFOLD(FLOAD SNEW IRFL_STR_LEN) -LJFOLDF(fload_str_len_snew) -{ - if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD)) { - PHIBARRIER(fleft); - return fleft->op2; - } - return NEXTFOLD; -} - -/* The C type ID of cdata objects is immutable. */ -LJFOLD(FLOAD KGC IRFL_CDATA_CTYPEID) -LJFOLDF(fload_cdata_typeid_kgc) -{ - if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD)) - return INTFOLD((int32_t)ir_kcdata(fleft)->ctypeid); - return NEXTFOLD; -} - -/* Get the contents of immutable cdata objects. */ -LJFOLD(FLOAD KGC IRFL_CDATA_PTR) -LJFOLD(FLOAD KGC IRFL_CDATA_INT) -LJFOLD(FLOAD KGC IRFL_CDATA_INT64) -LJFOLDF(fload_cdata_int64_kgc) -{ - if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD)) { - void *p = cdataptr(ir_kcdata(fleft)); - if (irt_is64(fins->t)) - return INT64FOLD(*(uint64_t *)p); - else - return INTFOLD(*(int32_t *)p); - } - return NEXTFOLD; -} - -LJFOLD(FLOAD CNEW IRFL_CDATA_CTYPEID) -LJFOLD(FLOAD CNEWI IRFL_CDATA_CTYPEID) -LJFOLDF(fload_cdata_typeid_cnew) -{ - if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD)) - return fleft->op1; /* No PHI barrier needed. CNEW/CNEWI op1 is const. */ - return NEXTFOLD; -} - -/* Pointer, int and int64 cdata objects are immutable. */ -LJFOLD(FLOAD CNEWI IRFL_CDATA_PTR) -LJFOLD(FLOAD CNEWI IRFL_CDATA_INT) -LJFOLD(FLOAD CNEWI IRFL_CDATA_INT64) -LJFOLDF(fload_cdata_ptr_int64_cnew) -{ - if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD)) - return fleft->op2; /* Fold even across PHI to avoid allocations. */ - return NEXTFOLD; -} - -LJFOLD(FLOAD any IRFL_STR_LEN) -LJFOLD(FLOAD any IRFL_CDATA_CTYPEID) -LJFOLD(FLOAD any IRFL_CDATA_PTR) -LJFOLD(FLOAD any IRFL_CDATA_INT) -LJFOLD(FLOAD any IRFL_CDATA_INT64) -LJFOLD(VLOAD any any) /* Vararg loads have no corresponding stores. */ -LJFOLDX(lj_opt_cse) - -/* All other field loads need alias analysis. */ -LJFOLD(FLOAD any any) -LJFOLDX(lj_opt_fwd_fload) - -/* This is for LOOP only. Recording handles SLOADs internally. */ -LJFOLD(SLOAD any any) -LJFOLDF(fwd_sload) -{ - if ((fins->op2 & IRSLOAD_FRAME)) { - TRef tr = lj_opt_cse(J); - return tref_ref(tr) < J->chain[IR_RETF] ? EMITFOLD : tr; - } else { - lua_assert(J->slot[fins->op1] != 0); - return J->slot[fins->op1]; - } -} - -/* Only fold for KKPTR. The pointer _and_ the contents must be const. */ -LJFOLD(XLOAD KKPTR any) -LJFOLDF(xload_kptr) -{ - TRef tr = kfold_xload(J, fins, ir_kptr(fleft)); - return tr ? tr : NEXTFOLD; -} - -LJFOLD(XLOAD any any) -LJFOLDX(lj_opt_fwd_xload) - -/* -- Write barriers ------------------------------------------------------ */ - -/* Write barriers are amenable to CSE, but not across any incremental -** GC steps. -** -** The same logic applies to open upvalue references, because a stack -** may be resized during a GC step (not the current stack, but maybe that -** of a coroutine). -*/ -LJFOLD(TBAR any) -LJFOLD(OBAR any any) -LJFOLD(UREFO any any) -LJFOLDF(barrier_tab) -{ - TRef tr = lj_opt_cse(J); - if (gcstep_barrier(J, tref_ref(tr))) /* CSE across GC step? */ - return EMITFOLD; /* Raw emit. Assumes fins is left intact by CSE. */ - return tr; -} - -LJFOLD(TBAR TNEW) -LJFOLD(TBAR TDUP) -LJFOLDF(barrier_tnew_tdup) -{ - /* New tables are always white and never need a barrier. */ - if (fins->op1 < J->chain[IR_LOOP]) /* Except across a GC step. */ - return NEXTFOLD; - return DROPFOLD; -} - -/* -- Stores and allocations ---------------------------------------------- */ - -/* Stores and allocations cannot be folded or passed on to CSE in general. -** But some stores can be eliminated with dead-store elimination (DSE). -** -** Caveat: *all* stores and allocs must be listed here or they end up at CSE! -*/ - -LJFOLD(ASTORE any any) -LJFOLD(HSTORE any any) -LJFOLDX(lj_opt_dse_ahstore) - -LJFOLD(USTORE any any) -LJFOLDX(lj_opt_dse_ustore) - -LJFOLD(FSTORE any any) -LJFOLDX(lj_opt_dse_fstore) - -LJFOLD(XSTORE any any) -LJFOLDX(lj_opt_dse_xstore) - -LJFOLD(NEWREF any any) /* Treated like a store. */ -LJFOLD(CALLS any any) -LJFOLD(CALLL any any) /* Safeguard fallback. */ -LJFOLD(CALLXS any any) -LJFOLD(XBAR) -LJFOLD(RETF any any) /* Modifies BASE. */ -LJFOLD(TNEW any any) -LJFOLD(TDUP any) -LJFOLD(CNEW any any) -LJFOLD(XSNEW any any) -LJFOLDX(lj_ir_emit) - -/* ------------------------------------------------------------------------ */ - -/* Every entry in the generated hash table is a 32 bit pattern: -** -** xxxxxxxx iiiiiii lllllll rrrrrrrrrr -** -** xxxxxxxx = 8 bit index into fold function table -** iiiiiii = 7 bit folded instruction opcode -** lllllll = 7 bit left instruction opcode -** rrrrrrrrrr = 8 bit right instruction opcode or 10 bits from literal field -*/ - -#include "lj_folddef.h" - -/* ------------------------------------------------------------------------ */ - -/* Fold IR instruction. */ -TRef LJ_FASTCALL lj_opt_fold(jit_State *J) -{ - uint32_t key, any; - IRRef ref; - - if (LJ_UNLIKELY((J->flags & JIT_F_OPT_MASK) != JIT_F_OPT_DEFAULT)) { - lua_assert(((JIT_F_OPT_FOLD|JIT_F_OPT_FWD|JIT_F_OPT_CSE|JIT_F_OPT_DSE) | - JIT_F_OPT_DEFAULT) == JIT_F_OPT_DEFAULT); - /* Folding disabled? Chain to CSE, but not for loads/stores/allocs. */ - if (!(J->flags & JIT_F_OPT_FOLD) && irm_kind(lj_ir_mode[fins->o]) == IRM_N) - return lj_opt_cse(J); - - /* No FOLD, forwarding or CSE? Emit raw IR for loads, except for SLOAD. */ - if ((J->flags & (JIT_F_OPT_FOLD|JIT_F_OPT_FWD|JIT_F_OPT_CSE)) != - (JIT_F_OPT_FOLD|JIT_F_OPT_FWD|JIT_F_OPT_CSE) && - irm_kind(lj_ir_mode[fins->o]) == IRM_L && fins->o != IR_SLOAD) - return lj_ir_emit(J); - - /* No FOLD or DSE? Emit raw IR for stores. */ - if ((J->flags & (JIT_F_OPT_FOLD|JIT_F_OPT_DSE)) != - (JIT_F_OPT_FOLD|JIT_F_OPT_DSE) && - irm_kind(lj_ir_mode[fins->o]) == IRM_S) - return lj_ir_emit(J); - } - - /* Fold engine start/retry point. */ -retry: - /* Construct key from opcode and operand opcodes (unless literal/none). */ - key = ((uint32_t)fins->o << 17); - if (fins->op1 >= J->cur.nk) { - key += (uint32_t)IR(fins->op1)->o << 10; - *fleft = *IR(fins->op1); - } - if (fins->op2 >= J->cur.nk) { - key += (uint32_t)IR(fins->op2)->o; - *fright = *IR(fins->op2); - } else { - key += (fins->op2 & 0x3ffu); /* Literal mask. Must include IRCONV_*MASK. */ - } - - /* Check for a match in order from most specific to least specific. */ - any = 0; - for (;;) { - uint32_t k = key | (any & 0x1ffff); - uint32_t h = fold_hashkey(k); - uint32_t fh = fold_hash[h]; /* Lookup key in semi-perfect hash table. */ - if ((fh & 0xffffff) == k || (fh = fold_hash[h+1], (fh & 0xffffff) == k)) { - ref = (IRRef)tref_ref(fold_func[fh >> 24](J)); - if (ref != NEXTFOLD) - break; - } - if (any == 0xfffff) /* Exhausted folding. Pass on to CSE. */ - return lj_opt_cse(J); - any = (any | (any >> 10)) ^ 0xffc00; - } - - /* Return value processing, ordered by frequency. */ - if (LJ_LIKELY(ref >= MAX_FOLD)) - return TREF(ref, irt_t(IR(ref)->t)); - if (ref == RETRYFOLD) - goto retry; - if (ref == KINTFOLD) - return lj_ir_kint(J, fins->i); - if (ref == FAILFOLD) - lj_trace_err(J, LJ_TRERR_GFAIL); - lua_assert(ref == DROPFOLD); - return REF_DROP; -} - -/* -- Common-Subexpression Elimination ------------------------------------ */ - -/* CSE an IR instruction. This is very fast due to the skip-list chains. */ -TRef LJ_FASTCALL lj_opt_cse(jit_State *J) -{ - /* Avoid narrow to wide store-to-load forwarding stall */ - IRRef2 op12 = (IRRef2)fins->op1 + ((IRRef2)fins->op2 << 16); - IROp op = fins->o; - if (LJ_LIKELY(J->flags & JIT_F_OPT_CSE)) { - /* Limited search for same operands in per-opcode chain. */ - IRRef ref = J->chain[op]; - IRRef lim = fins->op1; - if (fins->op2 > lim) lim = fins->op2; /* Relies on lit < REF_BIAS. */ - while (ref > lim) { - if (IR(ref)->op12 == op12) - return TREF(ref, irt_t(IR(ref)->t)); /* Common subexpression found. */ - ref = IR(ref)->prev; - } - } - /* Otherwise emit IR (inlined for speed). */ - { - IRRef ref = lj_ir_nextins(J); - IRIns *ir = IR(ref); - ir->prev = J->chain[op]; - ir->op12 = op12; - J->chain[op] = (IRRef1)ref; - ir->o = fins->o; - J->guardemit.irt |= fins->t.irt; - return TREF(ref, irt_t((ir->t = fins->t))); - } -} - -/* CSE with explicit search limit. */ -TRef LJ_FASTCALL lj_opt_cselim(jit_State *J, IRRef lim) -{ - IRRef ref = J->chain[fins->o]; - IRRef2 op12 = (IRRef2)fins->op1 + ((IRRef2)fins->op2 << 16); - while (ref > lim) { - if (IR(ref)->op12 == op12) - return ref; - ref = IR(ref)->prev; - } - return lj_ir_emit(J); -} - -/* ------------------------------------------------------------------------ */ - -#undef IR -#undef fins -#undef fleft -#undef fright -#undef knumleft -#undef knumright -#undef emitir - -#endif diff --git a/deps/luajit/src/lj_opt_loop.c b/deps/luajit/src/lj_opt_loop.c deleted file mode 100644 index b7d1923e..00000000 --- a/deps/luajit/src/lj_opt_loop.c +++ /dev/null @@ -1,436 +0,0 @@ -/* -** LOOP: Loop Optimizations. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#define lj_opt_loop_c -#define LUA_CORE - -#include "lj_obj.h" - -#if LJ_HASJIT - -#include "lj_err.h" -#include "lj_str.h" -#include "lj_ir.h" -#include "lj_jit.h" -#include "lj_iropt.h" -#include "lj_trace.h" -#include "lj_snap.h" -#include "lj_vm.h" - -/* Loop optimization: -** -** Traditional Loop-Invariant Code Motion (LICM) splits the instructions -** of a loop into invariant and variant instructions. The invariant -** instructions are hoisted out of the loop and only the variant -** instructions remain inside the loop body. -** -** Unfortunately LICM is mostly useless for compiling dynamic languages. -** The IR has many guards and most of the subsequent instructions are -** control-dependent on them. The first non-hoistable guard would -** effectively prevent hoisting of all subsequent instructions. -** -** That's why we use a special form of unrolling using copy-substitution, -** combined with redundancy elimination: -** -** The recorded instruction stream is re-emitted to the compiler pipeline -** with substituted operands. The substitution table is filled with the -** refs returned by re-emitting each instruction. This can be done -** on-the-fly, because the IR is in strict SSA form, where every ref is -** defined before its use. -** -** This aproach generates two code sections, separated by the LOOP -** instruction: -** -** 1. The recorded instructions form a kind of pre-roll for the loop. It -** contains a mix of invariant and variant instructions and performs -** exactly one loop iteration (but not necessarily the 1st iteration). -** -** 2. The loop body contains only the variant instructions and performs -** all remaining loop iterations. -** -** On first sight that looks like a waste of space, because the variant -** instructions are present twice. But the key insight is that the -** pre-roll honors the control-dependencies for *both* the pre-roll itself -** *and* the loop body! -** -** It also means one doesn't have to explicitly model control-dependencies -** (which, BTW, wouldn't help LICM much). And it's much easier to -** integrate sparse snapshotting with this approach. -** -** One of the nicest aspects of this approach is that all of the -** optimizations of the compiler pipeline (FOLD, CSE, FWD, etc.) can be -** reused with only minor restrictions (e.g. one should not fold -** instructions across loop-carried dependencies). -** -** But in general all optimizations can be applied which only need to look -** backwards into the generated instruction stream. At any point in time -** during the copy-substitution process this contains both a static loop -** iteration (the pre-roll) and a dynamic one (from the to-be-copied -** instruction up to the end of the partial loop body). -** -** Since control-dependencies are implicitly kept, CSE also applies to all -** kinds of guards. The major advantage is that all invariant guards can -** be hoisted, too. -** -** Load/store forwarding works across loop iterations, too. This is -** important if loop-carried dependencies are kept in upvalues or tables. -** E.g. 'self.idx = self.idx + 1' deep down in some OO-style method may -** become a forwarded loop-recurrence after inlining. -** -** Since the IR is in SSA form, loop-carried dependencies have to be -** modeled with PHI instructions. The potential candidates for PHIs are -** collected on-the-fly during copy-substitution. After eliminating the -** redundant ones, PHI instructions are emitted *below* the loop body. -** -** Note that this departure from traditional SSA form doesn't change the -** semantics of the PHI instructions themselves. But it greatly simplifies -** on-the-fly generation of the IR and the machine code. -*/ - -/* Some local macros to save typing. Undef'd at the end. */ -#define IR(ref) (&J->cur.ir[(ref)]) - -/* Pass IR on to next optimization in chain (FOLD). */ -#define emitir(ot, a, b) (lj_ir_set(J, (ot), (a), (b)), lj_opt_fold(J)) - -/* Emit raw IR without passing through optimizations. */ -#define emitir_raw(ot, a, b) (lj_ir_set(J, (ot), (a), (b)), lj_ir_emit(J)) - -/* -- PHI elimination ----------------------------------------------------- */ - -/* Emit or eliminate collected PHIs. */ -static void loop_emit_phi(jit_State *J, IRRef1 *subst, IRRef1 *phi, IRRef nphi, - SnapNo onsnap) -{ - int passx = 0; - IRRef i, j, nslots; - IRRef invar = J->chain[IR_LOOP]; - /* Pass #1: mark redundant and potentially redundant PHIs. */ - for (i = 0, j = 0; i < nphi; i++) { - IRRef lref = phi[i]; - IRRef rref = subst[lref]; - if (lref == rref || rref == REF_DROP) { /* Invariants are redundant. */ - irt_clearphi(IR(lref)->t); - } else { - phi[j++] = (IRRef1)lref; - if (!(IR(rref)->op1 == lref || IR(rref)->op2 == lref)) { - /* Quick check for simple recurrences failed, need pass2. */ - irt_setmark(IR(lref)->t); - passx = 1; - } - } - } - nphi = j; - /* Pass #2: traverse variant part and clear marks of non-redundant PHIs. */ - if (passx) { - SnapNo s; - for (i = J->cur.nins-1; i > invar; i--) { - IRIns *ir = IR(i); - if (!irref_isk(ir->op2)) irt_clearmark(IR(ir->op2)->t); - if (!irref_isk(ir->op1)) { - irt_clearmark(IR(ir->op1)->t); - if (ir->op1 < invar && - ir->o >= IR_CALLN && ir->o <= IR_CARG) { /* ORDER IR */ - ir = IR(ir->op1); - while (ir->o == IR_CARG) { - if (!irref_isk(ir->op2)) irt_clearmark(IR(ir->op2)->t); - if (irref_isk(ir->op1)) break; - ir = IR(ir->op1); - irt_clearmark(ir->t); - } - } - } - } - for (s = J->cur.nsnap-1; s >= onsnap; s--) { - SnapShot *snap = &J->cur.snap[s]; - SnapEntry *map = &J->cur.snapmap[snap->mapofs]; - MSize n, nent = snap->nent; - for (n = 0; n < nent; n++) { - IRRef ref = snap_ref(map[n]); - if (!irref_isk(ref)) irt_clearmark(IR(ref)->t); - } - } - } - /* Pass #3: add PHIs for variant slots without a corresponding SLOAD. */ - nslots = J->baseslot+J->maxslot; - for (i = 1; i < nslots; i++) { - IRRef ref = tref_ref(J->slot[i]); - while (!irref_isk(ref) && ref != subst[ref]) { - IRIns *ir = IR(ref); - irt_clearmark(ir->t); /* Unmark potential uses, too. */ - if (irt_isphi(ir->t) || irt_ispri(ir->t)) - break; - irt_setphi(ir->t); - if (nphi >= LJ_MAX_PHI) - lj_trace_err(J, LJ_TRERR_PHIOV); - phi[nphi++] = (IRRef1)ref; - ref = subst[ref]; - if (ref > invar) - break; - } - } - /* Pass #4: propagate non-redundant PHIs. */ - while (passx) { - passx = 0; - for (i = 0; i < nphi; i++) { - IRRef lref = phi[i]; - IRIns *ir = IR(lref); - if (!irt_ismarked(ir->t)) { /* Propagate only from unmarked PHIs. */ - IRIns *irr = IR(subst[lref]); - if (irt_ismarked(irr->t)) { /* Right ref points to other PHI? */ - irt_clearmark(irr->t); /* Mark that PHI as non-redundant. */ - passx = 1; /* Retry. */ - } - } - } - } - /* Pass #5: emit PHI instructions or eliminate PHIs. */ - for (i = 0; i < nphi; i++) { - IRRef lref = phi[i]; - IRIns *ir = IR(lref); - if (!irt_ismarked(ir->t)) { /* Emit PHI if not marked. */ - IRRef rref = subst[lref]; - if (rref > invar) - irt_setphi(IR(rref)->t); - emitir_raw(IRT(IR_PHI, irt_type(ir->t)), lref, rref); - } else { /* Otherwise eliminate PHI. */ - irt_clearmark(ir->t); - irt_clearphi(ir->t); - } - } -} - -/* -- Loop unrolling using copy-substitution ------------------------------ */ - -/* Copy-substitute snapshot. */ -static void loop_subst_snap(jit_State *J, SnapShot *osnap, - SnapEntry *loopmap, IRRef1 *subst) -{ - SnapEntry *nmap, *omap = &J->cur.snapmap[osnap->mapofs]; - SnapEntry *nextmap = &J->cur.snapmap[snap_nextofs(&J->cur, osnap)]; - MSize nmapofs; - MSize on, ln, nn, onent = osnap->nent; - BCReg nslots = osnap->nslots; - SnapShot *snap = &J->cur.snap[J->cur.nsnap]; - if (irt_isguard(J->guardemit)) { /* Guard inbetween? */ - nmapofs = J->cur.nsnapmap; - J->cur.nsnap++; /* Add new snapshot. */ - } else { /* Otherwise overwrite previous snapshot. */ - snap--; - nmapofs = snap->mapofs; - } - J->guardemit.irt = 0; - /* Setup new snapshot. */ - snap->mapofs = (uint16_t)nmapofs; - snap->ref = (IRRef1)J->cur.nins; - snap->nslots = nslots; - snap->topslot = osnap->topslot; - snap->count = 0; - nmap = &J->cur.snapmap[nmapofs]; - /* Substitute snapshot slots. */ - on = ln = nn = 0; - while (on < onent) { - SnapEntry osn = omap[on], lsn = loopmap[ln]; - if (snap_slot(lsn) < snap_slot(osn)) { /* Copy slot from loop map. */ - nmap[nn++] = lsn; - ln++; - } else { /* Copy substituted slot from snapshot map. */ - if (snap_slot(lsn) == snap_slot(osn)) ln++; /* Shadowed loop slot. */ - if (!irref_isk(snap_ref(osn))) - osn = snap_setref(osn, subst[snap_ref(osn)]); - nmap[nn++] = osn; - on++; - } - } - while (snap_slot(loopmap[ln]) < nslots) /* Copy remaining loop slots. */ - nmap[nn++] = loopmap[ln++]; - snap->nent = (uint8_t)nn; - omap += onent; - nmap += nn; - while (omap < nextmap) /* Copy PC + frame links. */ - *nmap++ = *omap++; - J->cur.nsnapmap = (uint16_t)(nmap - J->cur.snapmap); -} - -/* Unroll loop. */ -static void loop_unroll(jit_State *J) -{ - IRRef1 phi[LJ_MAX_PHI]; - uint32_t nphi = 0; - IRRef1 *subst; - SnapNo onsnap; - SnapShot *osnap, *loopsnap; - SnapEntry *loopmap, *psentinel; - IRRef ins, invar; - - /* Use temp buffer for substitution table. - ** Only non-constant refs in [REF_BIAS,invar) are valid indexes. - ** Caveat: don't call into the VM or run the GC or the buffer may be gone. - */ - invar = J->cur.nins; - subst = (IRRef1 *)lj_str_needbuf(J->L, &G(J->L)->tmpbuf, - (invar-REF_BIAS)*sizeof(IRRef1)) - REF_BIAS; - subst[REF_BASE] = REF_BASE; - - /* LOOP separates the pre-roll from the loop body. */ - emitir_raw(IRTG(IR_LOOP, IRT_NIL), 0, 0); - - /* Grow snapshot buffer and map for copy-substituted snapshots. - ** Need up to twice the number of snapshots minus #0 and loop snapshot. - ** Need up to twice the number of entries plus fallback substitutions - ** from the loop snapshot entries for each new snapshot. - ** Caveat: both calls may reallocate J->cur.snap and J->cur.snapmap! - */ - onsnap = J->cur.nsnap; - lj_snap_grow_buf(J, 2*onsnap-2); - lj_snap_grow_map(J, J->cur.nsnapmap*2+(onsnap-2)*J->cur.snap[onsnap-1].nent); - - /* The loop snapshot is used for fallback substitutions. */ - loopsnap = &J->cur.snap[onsnap-1]; - loopmap = &J->cur.snapmap[loopsnap->mapofs]; - /* The PC of snapshot #0 and the loop snapshot must match. */ - psentinel = &loopmap[loopsnap->nent]; - lua_assert(*psentinel == J->cur.snapmap[J->cur.snap[0].nent]); - *psentinel = SNAP(255, 0, 0); /* Replace PC with temporary sentinel. */ - - /* Start substitution with snapshot #1 (#0 is empty for root traces). */ - osnap = &J->cur.snap[1]; - - /* Copy and substitute all recorded instructions and snapshots. */ - for (ins = REF_FIRST; ins < invar; ins++) { - IRIns *ir; - IRRef op1, op2; - - if (ins >= osnap->ref) /* Instruction belongs to next snapshot? */ - loop_subst_snap(J, osnap++, loopmap, subst); /* Copy-substitute it. */ - - /* Substitute instruction operands. */ - ir = IR(ins); - op1 = ir->op1; - if (!irref_isk(op1)) op1 = subst[op1]; - op2 = ir->op2; - if (!irref_isk(op2)) op2 = subst[op2]; - if (irm_kind(lj_ir_mode[ir->o]) == IRM_N && - op1 == ir->op1 && op2 == ir->op2) { /* Regular invariant ins? */ - subst[ins] = (IRRef1)ins; /* Shortcut. */ - } else { - /* Re-emit substituted instruction to the FOLD/CSE/etc. pipeline. */ - IRType1 t = ir->t; /* Get this first, since emitir may invalidate ir. */ - IRRef ref = tref_ref(emitir(ir->ot & ~IRT_ISPHI, op1, op2)); - subst[ins] = (IRRef1)ref; - if (ref != ins) { - IRIns *irr = IR(ref); - if (ref < invar) { /* Loop-carried dependency? */ - /* Potential PHI? */ - if (!irref_isk(ref) && !irt_isphi(irr->t) && !irt_ispri(irr->t)) { - irt_setphi(irr->t); - if (nphi >= LJ_MAX_PHI) - lj_trace_err(J, LJ_TRERR_PHIOV); - phi[nphi++] = (IRRef1)ref; - } - /* Check all loop-carried dependencies for type instability. */ - if (!irt_sametype(t, irr->t)) { - if (irt_isinteger(t) && irt_isinteger(irr->t)) - continue; - else if (irt_isnum(t) && irt_isinteger(irr->t)) /* Fix int->num. */ - ref = tref_ref(emitir(IRTN(IR_CONV), ref, IRCONV_NUM_INT)); - else if (irt_isnum(irr->t) && irt_isinteger(t)) /* Fix num->int. */ - ref = tref_ref(emitir(IRTGI(IR_CONV), ref, - IRCONV_INT_NUM|IRCONV_CHECK)); - else - lj_trace_err(J, LJ_TRERR_TYPEINS); - subst[ins] = (IRRef1)ref; - irr = IR(ref); - goto phiconv; - } - } else if (ref != REF_DROP && irr->o == IR_CONV && - ref > invar && irr->op1 < invar) { - /* May need an extra PHI for a CONV. */ - ref = irr->op1; - irr = IR(ref); - phiconv: - if (ref < invar && !irref_isk(ref) && !irt_isphi(irr->t)) { - irt_setphi(irr->t); - if (nphi >= LJ_MAX_PHI) - lj_trace_err(J, LJ_TRERR_PHIOV); - phi[nphi++] = (IRRef1)ref; - } - } - } - } - } - if (!irt_isguard(J->guardemit)) /* Drop redundant snapshot. */ - J->cur.nsnapmap = (uint16_t)J->cur.snap[--J->cur.nsnap].mapofs; - lua_assert(J->cur.nsnapmap <= J->sizesnapmap); - *psentinel = J->cur.snapmap[J->cur.snap[0].nent]; /* Restore PC. */ - - loop_emit_phi(J, subst, phi, nphi, onsnap); -} - -/* Undo any partial changes made by the loop optimization. */ -static void loop_undo(jit_State *J, IRRef ins, SnapNo nsnap, MSize nsnapmap) -{ - ptrdiff_t i; - SnapShot *snap = &J->cur.snap[nsnap-1]; - SnapEntry *map = J->cur.snapmap; - map[snap->mapofs + snap->nent] = map[J->cur.snap[0].nent]; /* Restore PC. */ - J->cur.nsnapmap = (uint16_t)nsnapmap; - J->cur.nsnap = nsnap; - J->guardemit.irt = 0; - lj_ir_rollback(J, ins); - for (i = 0; i < BPROP_SLOTS; i++) { /* Remove backprop. cache entries. */ - BPropEntry *bp = &J->bpropcache[i]; - if (bp->val >= ins) - bp->key = 0; - } - for (ins--; ins >= REF_FIRST; ins--) { /* Remove flags. */ - IRIns *ir = IR(ins); - irt_clearphi(ir->t); - irt_clearmark(ir->t); - } -} - -/* Protected callback for loop optimization. */ -static TValue *cploop_opt(lua_State *L, lua_CFunction dummy, void *ud) -{ - UNUSED(L); UNUSED(dummy); - loop_unroll((jit_State *)ud); - return NULL; -} - -/* Loop optimization. */ -int lj_opt_loop(jit_State *J) -{ - IRRef nins = J->cur.nins; - SnapNo nsnap = J->cur.nsnap; - MSize nsnapmap = J->cur.nsnapmap; - int errcode = lj_vm_cpcall(J->L, NULL, J, cploop_opt); - if (LJ_UNLIKELY(errcode)) { - lua_State *L = J->L; - if (errcode == LUA_ERRRUN && tvisnumber(L->top-1)) { /* Trace error? */ - int32_t e = numberVint(L->top-1); - switch ((TraceError)e) { - case LJ_TRERR_TYPEINS: /* Type instability. */ - case LJ_TRERR_GFAIL: /* Guard would always fail. */ - /* Unrolling via recording fixes many cases, e.g. a flipped boolean. */ - if (--J->instunroll < 0) /* But do not unroll forever. */ - break; - L->top--; /* Remove error object. */ - loop_undo(J, nins, nsnap, nsnapmap); - return 1; /* Loop optimization failed, continue recording. */ - default: - break; - } - } - lj_err_throw(L, errcode); /* Propagate all other errors. */ - } - return 0; /* Loop optimization is ok. */ -} - -#undef IR -#undef emitir -#undef emitir_raw - -#endif diff --git a/deps/luajit/src/lj_opt_mem.c b/deps/luajit/src/lj_opt_mem.c deleted file mode 100644 index a4d96fc0..00000000 --- a/deps/luajit/src/lj_opt_mem.c +++ /dev/null @@ -1,916 +0,0 @@ -/* -** Memory access optimizations. -** AA: Alias Analysis using high-level semantic disambiguation. -** FWD: Load Forwarding (L2L) + Store Forwarding (S2L). -** DSE: Dead-Store Elimination. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#define lj_opt_mem_c -#define LUA_CORE - -#include "lj_obj.h" - -#if LJ_HASJIT - -#include "lj_tab.h" -#include "lj_ir.h" -#include "lj_jit.h" -#include "lj_iropt.h" - -/* Some local macros to save typing. Undef'd at the end. */ -#define IR(ref) (&J->cur.ir[(ref)]) -#define fins (&J->fold.ins) -#define fleft (&J->fold.left) -#define fright (&J->fold.right) - -/* -** Caveat #1: return value is not always a TRef -- only use with tref_ref(). -** Caveat #2: FWD relies on active CSE for xREF operands -- see lj_opt_fold(). -*/ - -/* Return values from alias analysis. */ -typedef enum { - ALIAS_NO, /* The two refs CANNOT alias (exact). */ - ALIAS_MAY, /* The two refs MAY alias (inexact). */ - ALIAS_MUST /* The two refs MUST alias (exact). */ -} AliasRet; - -/* -- ALOAD/HLOAD forwarding and ASTORE/HSTORE elimination ---------------- */ - -/* Simplified escape analysis: check for intervening stores. */ -static AliasRet aa_escape(jit_State *J, IRIns *ir, IRIns *stop) -{ - IRRef ref = (IRRef)(ir - J->cur.ir); /* The ref that might be stored. */ - for (ir++; ir < stop; ir++) - if (ir->op2 == ref && - (ir->o == IR_ASTORE || ir->o == IR_HSTORE || - ir->o == IR_USTORE || ir->o == IR_FSTORE)) - return ALIAS_MAY; /* Reference was stored and might alias. */ - return ALIAS_NO; /* Reference was not stored. */ -} - -/* Alias analysis for two different table references. */ -static AliasRet aa_table(jit_State *J, IRRef ta, IRRef tb) -{ - IRIns *taba = IR(ta), *tabb = IR(tb); - int newa, newb; - lua_assert(ta != tb); - lua_assert(irt_istab(taba->t) && irt_istab(tabb->t)); - /* Disambiguate new allocations. */ - newa = (taba->o == IR_TNEW || taba->o == IR_TDUP); - newb = (tabb->o == IR_TNEW || tabb->o == IR_TDUP); - if (newa && newb) - return ALIAS_NO; /* Two different allocations never alias. */ - if (newb) { /* At least one allocation? */ - IRIns *tmp = taba; taba = tabb; tabb = tmp; - } else if (!newa) { - return ALIAS_MAY; /* Anything else: we just don't know. */ - } - return aa_escape(J, taba, tabb); -} - -/* Alias analysis for array and hash access using key-based disambiguation. */ -static AliasRet aa_ahref(jit_State *J, IRIns *refa, IRIns *refb) -{ - IRRef ka = refa->op2; - IRRef kb = refb->op2; - IRIns *keya, *keyb; - IRRef ta, tb; - if (refa == refb) - return ALIAS_MUST; /* Shortcut for same refs. */ - keya = IR(ka); - if (keya->o == IR_KSLOT) { ka = keya->op1; keya = IR(ka); } - keyb = IR(kb); - if (keyb->o == IR_KSLOT) { kb = keyb->op1; keyb = IR(kb); } - ta = (refa->o==IR_HREFK || refa->o==IR_AREF) ? IR(refa->op1)->op1 : refa->op1; - tb = (refb->o==IR_HREFK || refb->o==IR_AREF) ? IR(refb->op1)->op1 : refb->op1; - if (ka == kb) { - /* Same key. Check for same table with different ref (NEWREF vs. HREF). */ - if (ta == tb) - return ALIAS_MUST; /* Same key, same table. */ - else - return aa_table(J, ta, tb); /* Same key, possibly different table. */ - } - if (irref_isk(ka) && irref_isk(kb)) - return ALIAS_NO; /* Different constant keys. */ - if (refa->o == IR_AREF) { - /* Disambiguate array references based on index arithmetic. */ - int32_t ofsa = 0, ofsb = 0; - IRRef basea = ka, baseb = kb; - lua_assert(refb->o == IR_AREF); - /* Gather base and offset from t[base] or t[base+-ofs]. */ - if (keya->o == IR_ADD && irref_isk(keya->op2)) { - basea = keya->op1; - ofsa = IR(keya->op2)->i; - if (basea == kb && ofsa != 0) - return ALIAS_NO; /* t[base+-ofs] vs. t[base]. */ - } - if (keyb->o == IR_ADD && irref_isk(keyb->op2)) { - baseb = keyb->op1; - ofsb = IR(keyb->op2)->i; - if (ka == baseb && ofsb != 0) - return ALIAS_NO; /* t[base] vs. t[base+-ofs]. */ - } - if (basea == baseb && ofsa != ofsb) - return ALIAS_NO; /* t[base+-o1] vs. t[base+-o2] and o1 != o2. */ - } else { - /* Disambiguate hash references based on the type of their keys. */ - lua_assert((refa->o==IR_HREF || refa->o==IR_HREFK || refa->o==IR_NEWREF) && - (refb->o==IR_HREF || refb->o==IR_HREFK || refb->o==IR_NEWREF)); - if (!irt_sametype(keya->t, keyb->t)) - return ALIAS_NO; /* Different key types. */ - } - if (ta == tb) - return ALIAS_MAY; /* Same table, cannot disambiguate keys. */ - else - return aa_table(J, ta, tb); /* Try to disambiguate tables. */ -} - -/* Array and hash load forwarding. */ -static TRef fwd_ahload(jit_State *J, IRRef xref) -{ - IRIns *xr = IR(xref); - IRRef lim = xref; /* Search limit. */ - IRRef ref; - - /* Search for conflicting stores. */ - ref = J->chain[fins->o+IRDELTA_L2S]; - while (ref > xref) { - IRIns *store = IR(ref); - switch (aa_ahref(J, xr, IR(store->op1))) { - case ALIAS_NO: break; /* Continue searching. */ - case ALIAS_MAY: lim = ref; goto cselim; /* Limit search for load. */ - case ALIAS_MUST: return store->op2; /* Store forwarding. */ - } - ref = store->prev; - } - - /* No conflicting store (yet): const-fold loads from allocations. */ - { - IRIns *ir = (xr->o == IR_HREFK || xr->o == IR_AREF) ? IR(xr->op1) : xr; - IRRef tab = ir->op1; - ir = IR(tab); - if (ir->o == IR_TNEW || (ir->o == IR_TDUP && irref_isk(xr->op2))) { - /* A NEWREF with a number key may end up pointing to the array part. - ** But it's referenced from HSTORE and not found in the ASTORE chain. - ** For now simply consider this a conflict without forwarding anything. - */ - if (xr->o == IR_AREF) { - IRRef ref2 = J->chain[IR_NEWREF]; - while (ref2 > tab) { - IRIns *newref = IR(ref2); - if (irt_isnum(IR(newref->op2)->t)) - goto cselim; - ref2 = newref->prev; - } - } - /* NEWREF inhibits CSE for HREF, and dependent FLOADs from HREFK/AREF. - ** But the above search for conflicting stores was limited by xref. - ** So continue searching, limited by the TNEW/TDUP. Store forwarding - ** is ok, too. A conflict does NOT limit the search for a matching load. - */ - while (ref > tab) { - IRIns *store = IR(ref); - switch (aa_ahref(J, xr, IR(store->op1))) { - case ALIAS_NO: break; /* Continue searching. */ - case ALIAS_MAY: goto cselim; /* Conflicting store. */ - case ALIAS_MUST: return store->op2; /* Store forwarding. */ - } - ref = store->prev; - } - lua_assert(ir->o != IR_TNEW || irt_isnil(fins->t)); - if (irt_ispri(fins->t)) { - return TREF_PRI(irt_type(fins->t)); - } else if (irt_isnum(fins->t) || (LJ_DUALNUM && irt_isint(fins->t)) || - irt_isstr(fins->t)) { - TValue keyv; - cTValue *tv; - IRIns *key = IR(xr->op2); - if (key->o == IR_KSLOT) key = IR(key->op1); - lj_ir_kvalue(J->L, &keyv, key); - tv = lj_tab_get(J->L, ir_ktab(IR(ir->op1)), &keyv); - lua_assert(itype2irt(tv) == irt_type(fins->t)); - if (irt_isnum(fins->t)) - return lj_ir_knum_u64(J, tv->u64); - else if (LJ_DUALNUM && irt_isint(fins->t)) - return lj_ir_kint(J, intV(tv)); - else - return lj_ir_kstr(J, strV(tv)); - } - /* Othwerwise: don't intern as a constant. */ - } - } - -cselim: - /* Try to find a matching load. Below the conflicting store, if any. */ - ref = J->chain[fins->o]; - while (ref > lim) { - IRIns *load = IR(ref); - if (load->op1 == xref) - return ref; /* Load forwarding. */ - ref = load->prev; - } - return 0; /* Conflict or no match. */ -} - -/* Reassociate ALOAD across PHIs to handle t[i-1] forwarding case. */ -static TRef fwd_aload_reassoc(jit_State *J) -{ - IRIns *irx = IR(fins->op1); - IRIns *key = IR(irx->op2); - if (key->o == IR_ADD && irref_isk(key->op2)) { - IRIns *add2 = IR(key->op1); - if (add2->o == IR_ADD && irref_isk(add2->op2) && - IR(key->op2)->i == -IR(add2->op2)->i) { - IRRef ref = J->chain[IR_AREF]; - IRRef lim = add2->op1; - if (irx->op1 > lim) lim = irx->op1; - while (ref > lim) { - IRIns *ir = IR(ref); - if (ir->op1 == irx->op1 && ir->op2 == add2->op1) - return fwd_ahload(J, ref); - ref = ir->prev; - } - } - } - return 0; -} - -/* ALOAD forwarding. */ -TRef LJ_FASTCALL lj_opt_fwd_aload(jit_State *J) -{ - IRRef ref; - if ((ref = fwd_ahload(J, fins->op1)) || - (ref = fwd_aload_reassoc(J))) - return ref; - return EMITFOLD; -} - -/* HLOAD forwarding. */ -TRef LJ_FASTCALL lj_opt_fwd_hload(jit_State *J) -{ - IRRef ref = fwd_ahload(J, fins->op1); - if (ref) - return ref; - return EMITFOLD; -} - -/* HREFK forwarding. */ -TRef LJ_FASTCALL lj_opt_fwd_hrefk(jit_State *J) -{ - IRRef tab = fleft->op1; - IRRef ref = J->chain[IR_NEWREF]; - while (ref > tab) { - IRIns *newref = IR(ref); - if (tab == newref->op1) { - if (fright->op1 == newref->op2) - return ref; /* Forward from NEWREF. */ - else - goto docse; - } else if (aa_table(J, tab, newref->op1) != ALIAS_NO) { - goto docse; - } - ref = newref->prev; - } - /* No conflicting NEWREF: key location unchanged for HREFK of TDUP. */ - if (IR(tab)->o == IR_TDUP) - fins->t.irt &= ~IRT_GUARD; /* Drop HREFK guard. */ -docse: - return CSEFOLD; -} - -/* Check whether HREF of TNEW/TDUP can be folded to niltv. */ -int LJ_FASTCALL lj_opt_fwd_href_nokey(jit_State *J) -{ - IRRef lim = fins->op1; /* Search limit. */ - IRRef ref; - - /* The key for an ASTORE may end up in the hash part after a NEWREF. */ - if (irt_isnum(fright->t) && J->chain[IR_NEWREF] > lim) { - ref = J->chain[IR_ASTORE]; - while (ref > lim) { - if (ref < J->chain[IR_NEWREF]) - return 0; /* Conflict. */ - ref = IR(ref)->prev; - } - } - - /* Search for conflicting stores. */ - ref = J->chain[IR_HSTORE]; - while (ref > lim) { - IRIns *store = IR(ref); - if (aa_ahref(J, fins, IR(store->op1)) != ALIAS_NO) - return 0; /* Conflict. */ - ref = store->prev; - } - - return 1; /* No conflict. Can fold to niltv. */ -} - -/* Check whether there's no aliasing NEWREF for the left operand. */ -int LJ_FASTCALL lj_opt_fwd_tptr(jit_State *J, IRRef lim) -{ - IRRef ta = fins->op1; - IRRef ref = J->chain[IR_NEWREF]; - while (ref > lim) { - IRIns *newref = IR(ref); - if (ta == newref->op1 || aa_table(J, ta, newref->op1) != ALIAS_NO) - return 0; /* Conflict. */ - ref = newref->prev; - } - return 1; /* No conflict. Can safely FOLD/CSE. */ -} - -/* ASTORE/HSTORE elimination. */ -TRef LJ_FASTCALL lj_opt_dse_ahstore(jit_State *J) -{ - IRRef xref = fins->op1; /* xREF reference. */ - IRRef val = fins->op2; /* Stored value reference. */ - IRIns *xr = IR(xref); - IRRef1 *refp = &J->chain[fins->o]; - IRRef ref = *refp; - while (ref > xref) { /* Search for redundant or conflicting stores. */ - IRIns *store = IR(ref); - switch (aa_ahref(J, xr, IR(store->op1))) { - case ALIAS_NO: - break; /* Continue searching. */ - case ALIAS_MAY: /* Store to MAYBE the same location. */ - if (store->op2 != val) /* Conflict if the value is different. */ - goto doemit; - break; /* Otherwise continue searching. */ - case ALIAS_MUST: /* Store to the same location. */ - if (store->op2 == val) /* Same value: drop the new store. */ - return DROPFOLD; - /* Different value: try to eliminate the redundant store. */ - if (ref > J->chain[IR_LOOP]) { /* Quick check to avoid crossing LOOP. */ - IRIns *ir; - /* Check for any intervening guards (includes conflicting loads). */ - for (ir = IR(J->cur.nins-1); ir > store; ir--) - if (irt_isguard(ir->t) || ir->o == IR_CALLL) - goto doemit; /* No elimination possible. */ - /* Remove redundant store from chain and replace with NOP. */ - *refp = store->prev; - store->o = IR_NOP; - store->t.irt = IRT_NIL; - store->op1 = store->op2 = 0; - store->prev = 0; - /* Now emit the new store instead. */ - } - goto doemit; - } - ref = *(refp = &store->prev); - } -doemit: - return EMITFOLD; /* Otherwise we have a conflict or simply no match. */ -} - -/* -- ULOAD forwarding ---------------------------------------------------- */ - -/* The current alias analysis for upvalues is very simplistic. It only -** disambiguates between the unique upvalues of the same function. -** This is good enough for now, since most upvalues are read-only. -** -** A more precise analysis would be feasible with the help of the parser: -** generate a unique key for every upvalue, even across all prototypes. -** Lacking a realistic use-case, it's unclear whether this is beneficial. -*/ -static AliasRet aa_uref(IRIns *refa, IRIns *refb) -{ - if (refa->o != refb->o) - return ALIAS_NO; /* Different UREFx type. */ - if (refa->op1 == refb->op1) { /* Same function. */ - if (refa->op2 == refb->op2) - return ALIAS_MUST; /* Same function, same upvalue idx. */ - else - return ALIAS_NO; /* Same function, different upvalue idx. */ - } else { /* Different functions, check disambiguation hash values. */ - if (((refa->op2 ^ refb->op2) & 0xff)) - return ALIAS_NO; /* Upvalues with different hash values cannot alias. */ - else - return ALIAS_MAY; /* No conclusion can be drawn for same hash value. */ - } -} - -/* ULOAD forwarding. */ -TRef LJ_FASTCALL lj_opt_fwd_uload(jit_State *J) -{ - IRRef uref = fins->op1; - IRRef lim = REF_BASE; /* Search limit. */ - IRIns *xr = IR(uref); - IRRef ref; - - /* Search for conflicting stores. */ - ref = J->chain[IR_USTORE]; - while (ref > lim) { - IRIns *store = IR(ref); - switch (aa_uref(xr, IR(store->op1))) { - case ALIAS_NO: break; /* Continue searching. */ - case ALIAS_MAY: lim = ref; goto cselim; /* Limit search for load. */ - case ALIAS_MUST: return store->op2; /* Store forwarding. */ - } - ref = store->prev; - } - -cselim: - /* Try to find a matching load. Below the conflicting store, if any. */ - - ref = J->chain[IR_ULOAD]; - while (ref > lim) { - IRIns *ir = IR(ref); - if (ir->op1 == uref || - (IR(ir->op1)->op12 == IR(uref)->op12 && IR(ir->op1)->o == IR(uref)->o)) - return ref; /* Match for identical or equal UREFx (non-CSEable UREFO). */ - ref = ir->prev; - } - return lj_ir_emit(J); -} - -/* USTORE elimination. */ -TRef LJ_FASTCALL lj_opt_dse_ustore(jit_State *J) -{ - IRRef xref = fins->op1; /* xREF reference. */ - IRRef val = fins->op2; /* Stored value reference. */ - IRIns *xr = IR(xref); - IRRef1 *refp = &J->chain[IR_USTORE]; - IRRef ref = *refp; - while (ref > xref) { /* Search for redundant or conflicting stores. */ - IRIns *store = IR(ref); - switch (aa_uref(xr, IR(store->op1))) { - case ALIAS_NO: - break; /* Continue searching. */ - case ALIAS_MAY: /* Store to MAYBE the same location. */ - if (store->op2 != val) /* Conflict if the value is different. */ - goto doemit; - break; /* Otherwise continue searching. */ - case ALIAS_MUST: /* Store to the same location. */ - if (store->op2 == val) /* Same value: drop the new store. */ - return DROPFOLD; - /* Different value: try to eliminate the redundant store. */ - if (ref > J->chain[IR_LOOP]) { /* Quick check to avoid crossing LOOP. */ - IRIns *ir; - /* Check for any intervening guards (includes conflicting loads). */ - for (ir = IR(J->cur.nins-1); ir > store; ir--) - if (irt_isguard(ir->t)) - goto doemit; /* No elimination possible. */ - /* Remove redundant store from chain and replace with NOP. */ - *refp = store->prev; - store->o = IR_NOP; - store->t.irt = IRT_NIL; - store->op1 = store->op2 = 0; - store->prev = 0; - if (ref+1 < J->cur.nins && - store[1].o == IR_OBAR && store[1].op1 == xref) { - IRRef1 *bp = &J->chain[IR_OBAR]; - IRIns *obar; - for (obar = IR(*bp); *bp > ref+1; obar = IR(*bp)) - bp = &obar->prev; - /* Remove OBAR, too. */ - *bp = obar->prev; - obar->o = IR_NOP; - obar->t.irt = IRT_NIL; - obar->op1 = obar->op2 = 0; - obar->prev = 0; - } - /* Now emit the new store instead. */ - } - goto doemit; - } - ref = *(refp = &store->prev); - } -doemit: - return EMITFOLD; /* Otherwise we have a conflict or simply no match. */ -} - -/* -- FLOAD forwarding and FSTORE elimination ----------------------------- */ - -/* Alias analysis for field access. -** Field loads are cheap and field stores are rare. -** Simple disambiguation based on field types is good enough. -*/ -static AliasRet aa_fref(jit_State *J, IRIns *refa, IRIns *refb) -{ - if (refa->op2 != refb->op2) - return ALIAS_NO; /* Different fields. */ - if (refa->op1 == refb->op1) - return ALIAS_MUST; /* Same field, same object. */ - else if (refa->op2 >= IRFL_TAB_META && refa->op2 <= IRFL_TAB_NOMM) - return aa_table(J, refa->op1, refb->op1); /* Disambiguate tables. */ - else - return ALIAS_MAY; /* Same field, possibly different object. */ -} - -/* Only the loads for mutable fields end up here (see FOLD). */ -TRef LJ_FASTCALL lj_opt_fwd_fload(jit_State *J) -{ - IRRef oref = fins->op1; /* Object reference. */ - IRRef fid = fins->op2; /* Field ID. */ - IRRef lim = oref; /* Search limit. */ - IRRef ref; - - /* Search for conflicting stores. */ - ref = J->chain[IR_FSTORE]; - while (ref > oref) { - IRIns *store = IR(ref); - switch (aa_fref(J, fins, IR(store->op1))) { - case ALIAS_NO: break; /* Continue searching. */ - case ALIAS_MAY: lim = ref; goto cselim; /* Limit search for load. */ - case ALIAS_MUST: return store->op2; /* Store forwarding. */ - } - ref = store->prev; - } - - /* No conflicting store: const-fold field loads from allocations. */ - if (fid == IRFL_TAB_META) { - IRIns *ir = IR(oref); - if (ir->o == IR_TNEW || ir->o == IR_TDUP) - return lj_ir_knull(J, IRT_TAB); - } - -cselim: - /* Try to find a matching load. Below the conflicting store, if any. */ - return lj_opt_cselim(J, lim); -} - -/* FSTORE elimination. */ -TRef LJ_FASTCALL lj_opt_dse_fstore(jit_State *J) -{ - IRRef fref = fins->op1; /* FREF reference. */ - IRRef val = fins->op2; /* Stored value reference. */ - IRIns *xr = IR(fref); - IRRef1 *refp = &J->chain[IR_FSTORE]; - IRRef ref = *refp; - while (ref > fref) { /* Search for redundant or conflicting stores. */ - IRIns *store = IR(ref); - switch (aa_fref(J, xr, IR(store->op1))) { - case ALIAS_NO: - break; /* Continue searching. */ - case ALIAS_MAY: - if (store->op2 != val) /* Conflict if the value is different. */ - goto doemit; - break; /* Otherwise continue searching. */ - case ALIAS_MUST: - if (store->op2 == val) /* Same value: drop the new store. */ - return DROPFOLD; - /* Different value: try to eliminate the redundant store. */ - if (ref > J->chain[IR_LOOP]) { /* Quick check to avoid crossing LOOP. */ - IRIns *ir; - /* Check for any intervening guards or conflicting loads. */ - for (ir = IR(J->cur.nins-1); ir > store; ir--) - if (irt_isguard(ir->t) || (ir->o == IR_FLOAD && ir->op2 == xr->op2)) - goto doemit; /* No elimination possible. */ - /* Remove redundant store from chain and replace with NOP. */ - *refp = store->prev; - store->o = IR_NOP; - store->t.irt = IRT_NIL; - store->op1 = store->op2 = 0; - store->prev = 0; - /* Now emit the new store instead. */ - } - goto doemit; - } - ref = *(refp = &store->prev); - } -doemit: - return EMITFOLD; /* Otherwise we have a conflict or simply no match. */ -} - -/* -- XLOAD forwarding and XSTORE elimination ----------------------------- */ - -/* Find cdata allocation for a reference (if any). */ -static IRIns *aa_findcnew(jit_State *J, IRIns *ir) -{ - while (ir->o == IR_ADD) { - if (!irref_isk(ir->op1)) { - IRIns *ir1 = aa_findcnew(J, IR(ir->op1)); /* Left-recursion. */ - if (ir1) return ir1; - } - if (irref_isk(ir->op2)) return NULL; - ir = IR(ir->op2); /* Flatten right-recursion. */ - } - return ir->o == IR_CNEW ? ir : NULL; -} - -/* Alias analysis for two cdata allocations. */ -static AliasRet aa_cnew(jit_State *J, IRIns *refa, IRIns *refb) -{ - IRIns *cnewa = aa_findcnew(J, refa); - IRIns *cnewb = aa_findcnew(J, refb); - if (cnewa == cnewb) - return ALIAS_MAY; /* Same allocation or neither is an allocation. */ - if (cnewa && cnewb) - return ALIAS_NO; /* Two different allocations never alias. */ - if (cnewb) { cnewa = cnewb; refb = refa; } - return aa_escape(J, cnewa, refb); -} - -/* Alias analysis for XLOAD/XSTORE. */ -static AliasRet aa_xref(jit_State *J, IRIns *refa, IRIns *xa, IRIns *xb) -{ - ptrdiff_t ofsa = 0, ofsb = 0; - IRIns *refb = IR(xb->op1); - IRIns *basea = refa, *baseb = refb; - if (refa == refb && irt_sametype(xa->t, xb->t)) - return ALIAS_MUST; /* Shortcut for same refs with identical type. */ - /* Offset-based disambiguation. */ - if (refa->o == IR_ADD && irref_isk(refa->op2)) { - IRIns *irk = IR(refa->op2); - basea = IR(refa->op1); - ofsa = (LJ_64 && irk->o == IR_KINT64) ? (ptrdiff_t)ir_k64(irk)->u64 : - (ptrdiff_t)irk->i; - } - if (refb->o == IR_ADD && irref_isk(refb->op2)) { - IRIns *irk = IR(refb->op2); - baseb = IR(refb->op1); - ofsb = (LJ_64 && irk->o == IR_KINT64) ? (ptrdiff_t)ir_k64(irk)->u64 : - (ptrdiff_t)irk->i; - } - /* Treat constified pointers like base vs. base+offset. */ - if (basea->o == IR_KPTR && baseb->o == IR_KPTR) { - ofsb += (char *)ir_kptr(baseb) - (char *)ir_kptr(basea); - baseb = basea; - } - /* This implements (very) strict aliasing rules. - ** Different types do NOT alias, except for differences in signedness. - ** Type punning through unions is allowed (but forces a reload). - */ - if (basea == baseb) { - ptrdiff_t sza = irt_size(xa->t), szb = irt_size(xb->t); - if (ofsa == ofsb) { - if (sza == szb && irt_isfp(xa->t) == irt_isfp(xb->t)) - return ALIAS_MUST; /* Same-sized, same-kind. May need to convert. */ - } else if (ofsa + sza <= ofsb || ofsb + szb <= ofsa) { - return ALIAS_NO; /* Non-overlapping base+-o1 vs. base+-o2. */ - } - /* NYI: extract, extend or reinterpret bits (int <-> fp). */ - return ALIAS_MAY; /* Overlapping or type punning: force reload. */ - } - if (!irt_sametype(xa->t, xb->t) && - !(irt_typerange(xa->t, IRT_I8, IRT_U64) && - ((xa->t.irt - IRT_I8) ^ (xb->t.irt - IRT_I8)) == 1)) - return ALIAS_NO; - /* NYI: structural disambiguation. */ - return aa_cnew(J, basea, baseb); /* Try to disambiguate allocations. */ -} - -/* Return CSEd reference or 0. Caveat: swaps lower ref to the right! */ -static IRRef reassoc_trycse(jit_State *J, IROp op, IRRef op1, IRRef op2) -{ - IRRef ref = J->chain[op]; - IRRef lim = op1; - if (op2 > lim) { lim = op2; op2 = op1; op1 = lim; } - while (ref > lim) { - IRIns *ir = IR(ref); - if (ir->op1 == op1 && ir->op2 == op2) - return ref; - ref = ir->prev; - } - return 0; -} - -/* Reassociate index references. */ -static IRRef reassoc_xref(jit_State *J, IRIns *ir) -{ - ptrdiff_t ofs = 0; - if (ir->o == IR_ADD && irref_isk(ir->op2)) { /* Get constant offset. */ - IRIns *irk = IR(ir->op2); - ofs = (LJ_64 && irk->o == IR_KINT64) ? (ptrdiff_t)ir_k64(irk)->u64 : - (ptrdiff_t)irk->i; - ir = IR(ir->op1); - } - if (ir->o == IR_ADD) { /* Add of base + index. */ - /* Index ref > base ref for loop-carried dependences. Only check op1. */ - IRIns *ir2, *ir1 = IR(ir->op1); - int32_t shift = 0; - IRRef idxref; - /* Determine index shifts. Don't bother with IR_MUL here. */ - if (ir1->o == IR_BSHL && irref_isk(ir1->op2)) - shift = IR(ir1->op2)->i; - else if (ir1->o == IR_ADD && ir1->op1 == ir1->op2) - shift = 1; - else - ir1 = ir; - ir2 = IR(ir1->op1); - /* A non-reassociated add. Must be a loop-carried dependence. */ - if (ir2->o == IR_ADD && irt_isint(ir2->t) && irref_isk(ir2->op2)) - ofs += (ptrdiff_t)IR(ir2->op2)->i << shift; - else - return 0; - idxref = ir2->op1; - /* Try to CSE the reassociated chain. Give up if not found. */ - if (ir1 != ir && - !(idxref = reassoc_trycse(J, ir1->o, idxref, - ir1->o == IR_BSHL ? ir1->op2 : idxref))) - return 0; - if (!(idxref = reassoc_trycse(J, IR_ADD, idxref, ir->op2))) - return 0; - if (ofs != 0) { - IRRef refk = tref_ref(lj_ir_kintp(J, ofs)); - if (!(idxref = reassoc_trycse(J, IR_ADD, idxref, refk))) - return 0; - } - return idxref; /* Success, found a reassociated index reference. Phew. */ - } - return 0; /* Failure. */ -} - -/* XLOAD forwarding. */ -TRef LJ_FASTCALL lj_opt_fwd_xload(jit_State *J) -{ - IRRef xref = fins->op1; - IRIns *xr = IR(xref); - IRRef lim = xref; /* Search limit. */ - IRRef ref; - - if ((fins->op2 & IRXLOAD_READONLY)) - goto cselim; - if ((fins->op2 & IRXLOAD_VOLATILE)) - goto doemit; - - /* Search for conflicting stores. */ - ref = J->chain[IR_XSTORE]; -retry: - if (J->chain[IR_CALLXS] > lim) lim = J->chain[IR_CALLXS]; - if (J->chain[IR_XBAR] > lim) lim = J->chain[IR_XBAR]; - while (ref > lim) { - IRIns *store = IR(ref); - switch (aa_xref(J, xr, fins, store)) { - case ALIAS_NO: break; /* Continue searching. */ - case ALIAS_MAY: lim = ref; goto cselim; /* Limit search for load. */ - case ALIAS_MUST: - /* Emit conversion if the loaded type doesn't match the forwarded type. */ - if (!irt_sametype(fins->t, IR(store->op2)->t)) { - IRType dt = irt_type(fins->t), st = irt_type(IR(store->op2)->t); - if (dt == IRT_I8 || dt == IRT_I16) { /* Trunc + sign-extend. */ - st = dt | IRCONV_SEXT; - dt = IRT_INT; - } else if (dt == IRT_U8 || dt == IRT_U16) { /* Trunc + zero-extend. */ - st = dt; - dt = IRT_INT; - } - fins->ot = IRT(IR_CONV, dt); - fins->op1 = store->op2; - fins->op2 = (dt<<5)|st; - return RETRYFOLD; - } - return store->op2; /* Store forwarding. */ - } - ref = store->prev; - } - -cselim: - /* Try to find a matching load. Below the conflicting store, if any. */ - ref = J->chain[IR_XLOAD]; - while (ref > lim) { - /* CSE for XLOAD depends on the type, but not on the IRXLOAD_* flags. */ - if (IR(ref)->op1 == xref && irt_sametype(IR(ref)->t, fins->t)) - return ref; - ref = IR(ref)->prev; - } - - /* Reassociate XLOAD across PHIs to handle a[i-1] forwarding case. */ - if (!(fins->op2 & IRXLOAD_READONLY) && J->chain[IR_LOOP] && - xref == fins->op1 && (xref = reassoc_xref(J, xr)) != 0) { - ref = J->chain[IR_XSTORE]; - while (ref > lim) /* Skip stores that have already been checked. */ - ref = IR(ref)->prev; - lim = xref; - xr = IR(xref); - goto retry; /* Retry with the reassociated reference. */ - } -doemit: - return EMITFOLD; -} - -/* XSTORE elimination. */ -TRef LJ_FASTCALL lj_opt_dse_xstore(jit_State *J) -{ - IRRef xref = fins->op1; - IRIns *xr = IR(xref); - IRRef lim = xref; /* Search limit. */ - IRRef val = fins->op2; /* Stored value reference. */ - IRRef1 *refp = &J->chain[IR_XSTORE]; - IRRef ref = *refp; - if (J->chain[IR_CALLXS] > lim) lim = J->chain[IR_CALLXS]; - if (J->chain[IR_XBAR] > lim) lim = J->chain[IR_XBAR]; - if (J->chain[IR_XSNEW] > lim) lim = J->chain[IR_XSNEW]; - while (ref > lim) { /* Search for redundant or conflicting stores. */ - IRIns *store = IR(ref); - switch (aa_xref(J, xr, fins, store)) { - case ALIAS_NO: - break; /* Continue searching. */ - case ALIAS_MAY: - if (store->op2 != val) /* Conflict if the value is different. */ - goto doemit; - break; /* Otherwise continue searching. */ - case ALIAS_MUST: - if (store->op2 == val) /* Same value: drop the new store. */ - return DROPFOLD; - /* Different value: try to eliminate the redundant store. */ - if (ref > J->chain[IR_LOOP]) { /* Quick check to avoid crossing LOOP. */ - IRIns *ir; - /* Check for any intervening guards or any XLOADs (no AA performed). */ - for (ir = IR(J->cur.nins-1); ir > store; ir--) - if (irt_isguard(ir->t) || ir->o == IR_XLOAD) - goto doemit; /* No elimination possible. */ - /* Remove redundant store from chain and replace with NOP. */ - *refp = store->prev; - store->o = IR_NOP; - store->t.irt = IRT_NIL; - store->op1 = store->op2 = 0; - store->prev = 0; - /* Now emit the new store instead. */ - } - goto doemit; - } - ref = *(refp = &store->prev); - } -doemit: - return EMITFOLD; /* Otherwise we have a conflict or simply no match. */ -} - -/* -- Forwarding of lj_tab_len -------------------------------------------- */ - -/* This is rather simplistic right now, but better than nothing. */ -TRef LJ_FASTCALL lj_opt_fwd_tab_len(jit_State *J) -{ - IRRef tab = fins->op1; /* Table reference. */ - IRRef lim = tab; /* Search limit. */ - IRRef ref; - - /* Any ASTORE is a conflict and limits the search. */ - if (J->chain[IR_ASTORE] > lim) lim = J->chain[IR_ASTORE]; - - /* Search for conflicting HSTORE with numeric key. */ - ref = J->chain[IR_HSTORE]; - while (ref > lim) { - IRIns *store = IR(ref); - IRIns *href = IR(store->op1); - IRIns *key = IR(href->op2); - if (irt_isnum(key->o == IR_KSLOT ? IR(key->op1)->t : key->t)) { - lim = ref; /* Conflicting store found, limits search for TLEN. */ - break; - } - ref = store->prev; - } - - /* Try to find a matching load. Below the conflicting store, if any. */ - return lj_opt_cselim(J, lim); -} - -/* -- ASTORE/HSTORE previous type analysis -------------------------------- */ - -/* Check whether the previous value for a table store is non-nil. -** This can be derived either from a previous store or from a previous -** load (because all loads from tables perform a type check). -** -** The result of the analysis can be used to avoid the metatable check -** and the guard against HREF returning niltv. Both of these are cheap, -** so let's not spend too much effort on the analysis. -** -** A result of 1 is exact: previous value CANNOT be nil. -** A result of 0 is inexact: previous value MAY be nil. -*/ -int lj_opt_fwd_wasnonnil(jit_State *J, IROpT loadop, IRRef xref) -{ - /* First check stores. */ - IRRef ref = J->chain[loadop+IRDELTA_L2S]; - while (ref > xref) { - IRIns *store = IR(ref); - if (store->op1 == xref) { /* Same xREF. */ - /* A nil store MAY alias, but a non-nil store MUST alias. */ - return !irt_isnil(store->t); - } else if (irt_isnil(store->t)) { /* Must check any nil store. */ - IRRef skref = IR(store->op1)->op2; - IRRef xkref = IR(xref)->op2; - /* Same key type MAY alias. Need ALOAD check due to multiple int types. */ - if (loadop == IR_ALOAD || irt_sametype(IR(skref)->t, IR(xkref)->t)) { - if (skref == xkref || !irref_isk(skref) || !irref_isk(xkref)) - return 0; /* A nil store with same const key or var key MAY alias. */ - /* Different const keys CANNOT alias. */ - } /* Different key types CANNOT alias. */ - } /* Other non-nil stores MAY alias. */ - ref = store->prev; - } - - /* Check loads since nothing could be derived from stores. */ - ref = J->chain[loadop]; - while (ref > xref) { - IRIns *load = IR(ref); - if (load->op1 == xref) { /* Same xREF. */ - /* A nil load MAY alias, but a non-nil load MUST alias. */ - return !irt_isnil(load->t); - } /* Other non-nil loads MAY alias. */ - ref = load->prev; - } - return 0; /* Nothing derived at all, previous value MAY be nil. */ -} - -/* ------------------------------------------------------------------------ */ - -#undef IR -#undef fins -#undef fleft -#undef fright - -#endif diff --git a/deps/luajit/src/lj_opt_narrow.c b/deps/luajit/src/lj_opt_narrow.c deleted file mode 100644 index 58b3763d..00000000 --- a/deps/luajit/src/lj_opt_narrow.c +++ /dev/null @@ -1,656 +0,0 @@ -/* -** NARROW: Narrowing of numbers to integers (double to int32_t). -** STRIPOV: Stripping of overflow checks. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#define lj_opt_narrow_c -#define LUA_CORE - -#include "lj_obj.h" - -#if LJ_HASJIT - -#include "lj_bc.h" -#include "lj_ir.h" -#include "lj_jit.h" -#include "lj_iropt.h" -#include "lj_trace.h" -#include "lj_vm.h" -#include "lj_strscan.h" - -/* Rationale for narrowing optimizations: -** -** Lua has only a single number type and this is a FP double by default. -** Narrowing doubles to integers does not pay off for the interpreter on a -** current-generation x86/x64 machine. Most FP operations need the same -** amount of execution resources as their integer counterparts, except -** with slightly longer latencies. Longer latencies are a non-issue for -** the interpreter, since they are usually hidden by other overhead. -** -** The total CPU execution bandwidth is the sum of the bandwidth of the FP -** and the integer units, because they execute in parallel. The FP units -** have an equal or higher bandwidth than the integer units. Not using -** them means losing execution bandwidth. Moving work away from them to -** the already quite busy integer units is a losing proposition. -** -** The situation for JIT-compiled code is a bit different: the higher code -** density makes the extra latencies much more visible. Tight loops expose -** the latencies for updating the induction variables. Array indexing -** requires narrowing conversions with high latencies and additional -** guards (to check that the index is really an integer). And many common -** optimizations only work on integers. -** -** One solution would be speculative, eager narrowing of all number loads. -** This causes many problems, like losing -0 or the need to resolve type -** mismatches between traces. It also effectively forces the integer type -** to have overflow-checking semantics. This impedes many basic -** optimizations and requires adding overflow checks to all integer -** arithmetic operations (whereas FP arithmetics can do without). -** -** Always replacing an FP op with an integer op plus an overflow check is -** counter-productive on a current-generation super-scalar CPU. Although -** the overflow check branches are highly predictable, they will clog the -** execution port for the branch unit and tie up reorder buffers. This is -** turning a pure data-flow dependency into a different data-flow -** dependency (with slightly lower latency) *plus* a control dependency. -** In general, you don't want to do this since latencies due to data-flow -** dependencies can be well hidden by out-of-order execution. -** -** A better solution is to keep all numbers as FP values and only narrow -** when it's beneficial to do so. LuaJIT uses predictive narrowing for -** induction variables and demand-driven narrowing for index expressions, -** integer arguments and bit operations. Additionally it can eliminate or -** hoist most of the resulting overflow checks. Regular arithmetic -** computations are never narrowed to integers. -** -** The integer type in the IR has convenient wrap-around semantics and -** ignores overflow. Extra operations have been added for -** overflow-checking arithmetic (ADDOV/SUBOV) instead of an extra type. -** Apart from reducing overall complexity of the compiler, this also -** nicely solves the problem where you want to apply algebraic -** simplifications to ADD, but not to ADDOV. And the x86/x64 assembler can -** use lea instead of an add for integer ADD, but not for ADDOV (lea does -** not affect the flags, but it helps to avoid register moves). -** -** -** All of the above has to be reconsidered for architectures with slow FP -** operations or without a hardware FPU. The dual-number mode of LuaJIT -** addresses this issue. Arithmetic operations are performed on integers -** as far as possible and overflow checks are added as needed. -** -** This implies that narrowing for integer arguments and bit operations -** should also strip overflow checks, e.g. replace ADDOV with ADD. The -** original overflow guards are weak and can be eliminated by DCE, if -** there's no other use. -** -** A slight twist is that it's usually beneficial to use overflow-checked -** integer arithmetics if all inputs are already integers. This is the only -** change that affects the single-number mode, too. -*/ - -/* Some local macros to save typing. Undef'd at the end. */ -#define IR(ref) (&J->cur.ir[(ref)]) -#define fins (&J->fold.ins) - -/* Pass IR on to next optimization in chain (FOLD). */ -#define emitir(ot, a, b) (lj_ir_set(J, (ot), (a), (b)), lj_opt_fold(J)) - -#define emitir_raw(ot, a, b) (lj_ir_set(J, (ot), (a), (b)), lj_ir_emit(J)) - -/* -- Elimination of narrowing type conversions --------------------------- */ - -/* Narrowing of index expressions and bit operations is demand-driven. The -** trace recorder emits a narrowing type conversion (CONV.int.num or TOBIT) -** in all of these cases (e.g. array indexing or string indexing). FOLD -** already takes care of eliminating simple redundant conversions like -** CONV.int.num(CONV.num.int(x)) ==> x. -** -** But the surrounding code is FP-heavy and arithmetic operations are -** performed on FP numbers (for the single-number mode). Consider a common -** example such as 'x=t[i+1]', with 'i' already an integer (due to induction -** variable narrowing). The index expression would be recorded as -** CONV.int.num(ADD(CONV.num.int(i), 1)) -** which is clearly suboptimal. -** -** One can do better by recursively backpropagating the narrowing type -** conversion across FP arithmetic operations. This turns FP ops into -** their corresponding integer counterparts. Depending on the semantics of -** the conversion they also need to check for overflow. Currently only ADD -** and SUB are supported. -** -** The above example can be rewritten as -** ADDOV(CONV.int.num(CONV.num.int(i)), 1) -** and then into ADDOV(i, 1) after folding of the conversions. The original -** FP ops remain in the IR and are eliminated by DCE since all references to -** them are gone. -** -** [In dual-number mode the trace recorder already emits ADDOV etc., but -** this can be further reduced. See below.] -** -** Special care has to be taken to avoid narrowing across an operation -** which is potentially operating on non-integral operands. One obvious -** case is when an expression contains a non-integral constant, but ends -** up as an integer index at runtime (like t[x+1.5] with x=0.5). -** -** Operations with two non-constant operands illustrate a similar problem -** (like t[a+b] with a=1.5 and b=2.5). Backpropagation has to stop there, -** unless it can be proven that either operand is integral (e.g. by CSEing -** a previous conversion). As a not-so-obvious corollary this logic also -** applies for a whole expression tree (e.g. t[(a+1)+(b+1)]). -** -** Correctness of the transformation is guaranteed by avoiding to expand -** the tree by adding more conversions than the one we would need to emit -** if not backpropagating. TOBIT employs a more optimistic rule, because -** the conversion has special semantics, designed to make the life of the -** compiler writer easier. ;-) -** -** Using on-the-fly backpropagation of an expression tree doesn't work -** because it's unknown whether the transform is correct until the end. -** This either requires IR rollback and cache invalidation for every -** subtree or a two-pass algorithm. The former didn't work out too well, -** so the code now combines a recursive collector with a stack-based -** emitter. -** -** [A recursive backpropagation algorithm with backtracking, employing -** skip-list lookup and round-robin caching, emitting stack operations -** on-the-fly for a stack-based interpreter -- and all of that in a meager -** kilobyte? Yep, compilers are a great treasure chest. Throw away your -** textbooks and read the codebase of a compiler today!] -** -** There's another optimization opportunity for array indexing: it's -** always accompanied by an array bounds-check. The outermost overflow -** check may be delegated to the ABC operation. This works because ABC is -** an unsigned comparison and wrap-around due to overflow creates negative -** numbers. -** -** But this optimization is only valid for constants that cannot overflow -** an int32_t into the range of valid array indexes [0..2^27+1). A check -** for +-2^30 is safe since -2^31 - 2^30 wraps to 2^30 and 2^31-1 + 2^30 -** wraps to -2^30-1. -** -** It's also good enough in practice, since e.g. t[i+1] or t[i-10] are -** quite common. So the above example finally ends up as ADD(i, 1)! -** -** Later on, the assembler is able to fuse the whole array reference and -** the ADD into the memory operands of loads and other instructions. This -** is why LuaJIT is able to generate very pretty (and fast) machine code -** for array indexing. And that, my dear, concludes another story about -** one of the hidden secrets of LuaJIT ... -*/ - -/* Maximum backpropagation depth and maximum stack size. */ -#define NARROW_MAX_BACKPROP 100 -#define NARROW_MAX_STACK 256 - -/* The stack machine has a 32 bit instruction format: [IROpT | IRRef1] -** The lower 16 bits hold a reference (or 0). The upper 16 bits hold -** the IR opcode + type or one of the following special opcodes: -*/ -enum { - NARROW_REF, /* Push ref. */ - NARROW_CONV, /* Push conversion of ref. */ - NARROW_SEXT, /* Push sign-extension of ref. */ - NARROW_INT /* Push KINT ref. The next code holds an int32_t. */ -}; - -typedef uint32_t NarrowIns; - -#define NARROWINS(op, ref) (((op) << 16) + (ref)) -#define narrow_op(ins) ((IROpT)((ins) >> 16)) -#define narrow_ref(ins) ((IRRef1)(ins)) - -/* Context used for narrowing of type conversions. */ -typedef struct NarrowConv { - jit_State *J; /* JIT compiler state. */ - NarrowIns *sp; /* Current stack pointer. */ - NarrowIns *maxsp; /* Maximum stack pointer minus redzone. */ - int lim; /* Limit on the number of emitted conversions. */ - IRRef mode; /* Conversion mode (IRCONV_*). */ - IRType t; /* Destination type: IRT_INT or IRT_I64. */ - NarrowIns stack[NARROW_MAX_STACK]; /* Stack holding stack-machine code. */ -} NarrowConv; - -/* Lookup a reference in the backpropagation cache. */ -static BPropEntry *narrow_bpc_get(jit_State *J, IRRef1 key, IRRef mode) -{ - ptrdiff_t i; - for (i = 0; i < BPROP_SLOTS; i++) { - BPropEntry *bp = &J->bpropcache[i]; - /* Stronger checks are ok, too. */ - if (bp->key == key && bp->mode >= mode && - ((bp->mode ^ mode) & IRCONV_MODEMASK) == 0) - return bp; - } - return NULL; -} - -/* Add an entry to the backpropagation cache. */ -static void narrow_bpc_set(jit_State *J, IRRef1 key, IRRef1 val, IRRef mode) -{ - uint32_t slot = J->bpropslot; - BPropEntry *bp = &J->bpropcache[slot]; - J->bpropslot = (slot + 1) & (BPROP_SLOTS-1); - bp->key = key; - bp->val = val; - bp->mode = mode; -} - -/* Backpropagate overflow stripping. */ -static void narrow_stripov_backprop(NarrowConv *nc, IRRef ref, int depth) -{ - jit_State *J = nc->J; - IRIns *ir = IR(ref); - if (ir->o == IR_ADDOV || ir->o == IR_SUBOV || - (ir->o == IR_MULOV && (nc->mode & IRCONV_CONVMASK) == IRCONV_ANY)) { - BPropEntry *bp = narrow_bpc_get(nc->J, ref, IRCONV_TOBIT); - if (bp) { - ref = bp->val; - } else if (++depth < NARROW_MAX_BACKPROP && nc->sp < nc->maxsp) { - NarrowIns *savesp = nc->sp; - narrow_stripov_backprop(nc, ir->op1, depth); - if (nc->sp < nc->maxsp) { - narrow_stripov_backprop(nc, ir->op2, depth); - if (nc->sp < nc->maxsp) { - *nc->sp++ = NARROWINS(IRT(ir->o - IR_ADDOV + IR_ADD, IRT_INT), ref); - return; - } - } - nc->sp = savesp; /* Path too deep, need to backtrack. */ - } - } - *nc->sp++ = NARROWINS(NARROW_REF, ref); -} - -/* Backpropagate narrowing conversion. Return number of needed conversions. */ -static int narrow_conv_backprop(NarrowConv *nc, IRRef ref, int depth) -{ - jit_State *J = nc->J; - IRIns *ir = IR(ref); - IRRef cref; - - if (nc->sp >= nc->maxsp) return 10; /* Path too deep. */ - - /* Check the easy cases first. */ - if (ir->o == IR_CONV && (ir->op2 & IRCONV_SRCMASK) == IRT_INT) { - if ((nc->mode & IRCONV_CONVMASK) <= IRCONV_ANY) - narrow_stripov_backprop(nc, ir->op1, depth+1); - else - *nc->sp++ = NARROWINS(NARROW_REF, ir->op1); /* Undo conversion. */ - if (nc->t == IRT_I64) - *nc->sp++ = NARROWINS(NARROW_SEXT, 0); /* Sign-extend integer. */ - return 0; - } else if (ir->o == IR_KNUM) { /* Narrow FP constant. */ - lua_Number n = ir_knum(ir)->n; - if ((nc->mode & IRCONV_CONVMASK) == IRCONV_TOBIT) { - /* Allows a wider range of constants. */ - int64_t k64 = (int64_t)n; - if (n == (lua_Number)k64) { /* Only if const doesn't lose precision. */ - *nc->sp++ = NARROWINS(NARROW_INT, 0); - *nc->sp++ = (NarrowIns)k64; /* But always truncate to 32 bits. */ - return 0; - } - } else { - int32_t k = lj_num2int(n); - /* Only if constant is a small integer. */ - if (checki16(k) && n == (lua_Number)k) { - *nc->sp++ = NARROWINS(NARROW_INT, 0); - *nc->sp++ = (NarrowIns)k; - return 0; - } - } - return 10; /* Never narrow other FP constants (this is rare). */ - } - - /* Try to CSE the conversion. Stronger checks are ok, too. */ - cref = J->chain[fins->o]; - while (cref > ref) { - IRIns *cr = IR(cref); - if (cr->op1 == ref && - (fins->o == IR_TOBIT || - ((cr->op2 & IRCONV_MODEMASK) == (nc->mode & IRCONV_MODEMASK) && - irt_isguard(cr->t) >= irt_isguard(fins->t)))) { - *nc->sp++ = NARROWINS(NARROW_REF, cref); - return 0; /* Already there, no additional conversion needed. */ - } - cref = cr->prev; - } - - /* Backpropagate across ADD/SUB. */ - if (ir->o == IR_ADD || ir->o == IR_SUB) { - /* Try cache lookup first. */ - IRRef mode = nc->mode; - BPropEntry *bp; - /* Inner conversions need a stronger check. */ - if ((mode & IRCONV_CONVMASK) == IRCONV_INDEX && depth > 0) - mode += IRCONV_CHECK-IRCONV_INDEX; - bp = narrow_bpc_get(nc->J, (IRRef1)ref, mode); - if (bp) { - *nc->sp++ = NARROWINS(NARROW_REF, bp->val); - return 0; - } else if (nc->t == IRT_I64) { - /* Try sign-extending from an existing (checked) conversion to int. */ - mode = (IRT_INT<<5)|IRT_NUM|IRCONV_INDEX; - bp = narrow_bpc_get(nc->J, (IRRef1)ref, mode); - if (bp) { - *nc->sp++ = NARROWINS(NARROW_REF, bp->val); - *nc->sp++ = NARROWINS(NARROW_SEXT, 0); - return 0; - } - } - if (++depth < NARROW_MAX_BACKPROP && nc->sp < nc->maxsp) { - NarrowIns *savesp = nc->sp; - int count = narrow_conv_backprop(nc, ir->op1, depth); - count += narrow_conv_backprop(nc, ir->op2, depth); - if (count <= nc->lim) { /* Limit total number of conversions. */ - *nc->sp++ = NARROWINS(IRT(ir->o, nc->t), ref); - return count; - } - nc->sp = savesp; /* Too many conversions, need to backtrack. */ - } - } - - /* Otherwise add a conversion. */ - *nc->sp++ = NARROWINS(NARROW_CONV, ref); - return 1; -} - -/* Emit the conversions collected during backpropagation. */ -static IRRef narrow_conv_emit(jit_State *J, NarrowConv *nc) -{ - /* The fins fields must be saved now -- emitir() overwrites them. */ - IROpT guardot = irt_isguard(fins->t) ? IRTG(IR_ADDOV-IR_ADD, 0) : 0; - IROpT convot = fins->ot; - IRRef1 convop2 = fins->op2; - NarrowIns *next = nc->stack; /* List of instructions from backpropagation. */ - NarrowIns *last = nc->sp; - NarrowIns *sp = nc->stack; /* Recycle the stack to store operands. */ - while (next < last) { /* Simple stack machine to process the ins. list. */ - NarrowIns ref = *next++; - IROpT op = narrow_op(ref); - if (op == NARROW_REF) { - *sp++ = ref; - } else if (op == NARROW_CONV) { - *sp++ = emitir_raw(convot, ref, convop2); /* Raw emit avoids a loop. */ - } else if (op == NARROW_SEXT) { - lua_assert(sp >= nc->stack+1); - sp[-1] = emitir(IRT(IR_CONV, IRT_I64), sp[-1], - (IRT_I64<<5)|IRT_INT|IRCONV_SEXT); - } else if (op == NARROW_INT) { - lua_assert(next < last); - *sp++ = nc->t == IRT_I64 ? - lj_ir_kint64(J, (int64_t)(int32_t)*next++) : - lj_ir_kint(J, *next++); - } else { /* Regular IROpT. Pops two operands and pushes one result. */ - IRRef mode = nc->mode; - lua_assert(sp >= nc->stack+2); - sp--; - /* Omit some overflow checks for array indexing. See comments above. */ - if ((mode & IRCONV_CONVMASK) == IRCONV_INDEX) { - if (next == last && irref_isk(narrow_ref(sp[0])) && - (uint32_t)IR(narrow_ref(sp[0]))->i + 0x40000000u < 0x80000000u) - guardot = 0; - else /* Otherwise cache a stronger check. */ - mode += IRCONV_CHECK-IRCONV_INDEX; - } - sp[-1] = emitir(op+guardot, sp[-1], sp[0]); - /* Add to cache. */ - if (narrow_ref(ref)) - narrow_bpc_set(J, narrow_ref(ref), narrow_ref(sp[-1]), mode); - } - } - lua_assert(sp == nc->stack+1); - return nc->stack[0]; -} - -/* Narrow a type conversion of an arithmetic operation. */ -TRef LJ_FASTCALL lj_opt_narrow_convert(jit_State *J) -{ - if ((J->flags & JIT_F_OPT_NARROW)) { - NarrowConv nc; - nc.J = J; - nc.sp = nc.stack; - nc.maxsp = &nc.stack[NARROW_MAX_STACK-4]; - nc.t = irt_type(fins->t); - if (fins->o == IR_TOBIT) { - nc.mode = IRCONV_TOBIT; /* Used only in the backpropagation cache. */ - nc.lim = 2; /* TOBIT can use a more optimistic rule. */ - } else { - nc.mode = fins->op2; - nc.lim = 1; - } - if (narrow_conv_backprop(&nc, fins->op1, 0) <= nc.lim) - return narrow_conv_emit(J, &nc); - } - return NEXTFOLD; -} - -/* -- Narrowing of implicit conversions ----------------------------------- */ - -/* Recursively strip overflow checks. */ -static TRef narrow_stripov(jit_State *J, TRef tr, int lastop, IRRef mode) -{ - IRRef ref = tref_ref(tr); - IRIns *ir = IR(ref); - int op = ir->o; - if (op >= IR_ADDOV && op <= lastop) { - BPropEntry *bp = narrow_bpc_get(J, ref, mode); - if (bp) { - return TREF(bp->val, irt_t(IR(bp->val)->t)); - } else { - IRRef op1 = ir->op1, op2 = ir->op2; /* The IR may be reallocated. */ - op1 = narrow_stripov(J, op1, lastop, mode); - op2 = narrow_stripov(J, op2, lastop, mode); - tr = emitir(IRT(op - IR_ADDOV + IR_ADD, - ((mode & IRCONV_DSTMASK) >> IRCONV_DSH)), op1, op2); - narrow_bpc_set(J, ref, tref_ref(tr), mode); - } - } else if (LJ_64 && (mode & IRCONV_SEXT) && !irt_is64(ir->t)) { - tr = emitir(IRT(IR_CONV, IRT_INTP), tr, mode); - } - return tr; -} - -/* Narrow array index. */ -TRef LJ_FASTCALL lj_opt_narrow_index(jit_State *J, TRef tr) -{ - IRIns *ir; - lua_assert(tref_isnumber(tr)); - if (tref_isnum(tr)) /* Conversion may be narrowed, too. See above. */ - return emitir(IRTGI(IR_CONV), tr, IRCONV_INT_NUM|IRCONV_INDEX); - /* Omit some overflow checks for array indexing. See comments above. */ - ir = IR(tref_ref(tr)); - if ((ir->o == IR_ADDOV || ir->o == IR_SUBOV) && irref_isk(ir->op2) && - (uint32_t)IR(ir->op2)->i + 0x40000000u < 0x80000000u) - return emitir(IRTI(ir->o - IR_ADDOV + IR_ADD), ir->op1, ir->op2); - return tr; -} - -/* Narrow conversion to integer operand (overflow undefined). */ -TRef LJ_FASTCALL lj_opt_narrow_toint(jit_State *J, TRef tr) -{ - if (tref_isstr(tr)) - tr = emitir(IRTG(IR_STRTO, IRT_NUM), tr, 0); - if (tref_isnum(tr)) /* Conversion may be narrowed, too. See above. */ - return emitir(IRTI(IR_CONV), tr, IRCONV_INT_NUM|IRCONV_ANY); - if (!tref_isinteger(tr)) - lj_trace_err(J, LJ_TRERR_BADTYPE); - /* - ** Undefined overflow semantics allow stripping of ADDOV, SUBOV and MULOV. - ** Use IRCONV_TOBIT for the cache entries, since the semantics are the same. - */ - return narrow_stripov(J, tr, IR_MULOV, (IRT_INT<<5)|IRT_INT|IRCONV_TOBIT); -} - -/* Narrow conversion to bitop operand (overflow wrapped). */ -TRef LJ_FASTCALL lj_opt_narrow_tobit(jit_State *J, TRef tr) -{ - if (tref_isstr(tr)) - tr = emitir(IRTG(IR_STRTO, IRT_NUM), tr, 0); - if (tref_isnum(tr)) /* Conversion may be narrowed, too. See above. */ - return emitir(IRTI(IR_TOBIT), tr, lj_ir_knum_tobit(J)); - if (!tref_isinteger(tr)) - lj_trace_err(J, LJ_TRERR_BADTYPE); - /* - ** Wrapped overflow semantics allow stripping of ADDOV and SUBOV. - ** MULOV cannot be stripped due to precision widening. - */ - return narrow_stripov(J, tr, IR_SUBOV, (IRT_INT<<5)|IRT_INT|IRCONV_TOBIT); -} - -#if LJ_HASFFI -/* Narrow C array index (overflow undefined). */ -TRef LJ_FASTCALL lj_opt_narrow_cindex(jit_State *J, TRef tr) -{ - lua_assert(tref_isnumber(tr)); - if (tref_isnum(tr)) - return emitir(IRT(IR_CONV, IRT_INTP), tr, - (IRT_INTP<<5)|IRT_NUM|IRCONV_TRUNC|IRCONV_ANY); - /* Undefined overflow semantics allow stripping of ADDOV, SUBOV and MULOV. */ - return narrow_stripov(J, tr, IR_MULOV, - LJ_64 ? ((IRT_INTP<<5)|IRT_INT|IRCONV_SEXT) : - ((IRT_INTP<<5)|IRT_INT|IRCONV_TOBIT)); -} -#endif - -/* -- Narrowing of arithmetic operators ----------------------------------- */ - -/* Check whether a number fits into an int32_t (-0 is ok, too). */ -static int numisint(lua_Number n) -{ - return (n == (lua_Number)lj_num2int(n)); -} - -/* Narrowing of arithmetic operations. */ -TRef lj_opt_narrow_arith(jit_State *J, TRef rb, TRef rc, - TValue *vb, TValue *vc, IROp op) -{ - if (tref_isstr(rb)) { - rb = emitir(IRTG(IR_STRTO, IRT_NUM), rb, 0); - lj_strscan_num(strV(vb), vb); - } - if (tref_isstr(rc)) { - rc = emitir(IRTG(IR_STRTO, IRT_NUM), rc, 0); - lj_strscan_num(strV(vc), vc); - } - /* Must not narrow MUL in non-DUALNUM variant, because it loses -0. */ - if ((op >= IR_ADD && op <= (LJ_DUALNUM ? IR_MUL : IR_SUB)) && - tref_isinteger(rb) && tref_isinteger(rc) && - numisint(lj_vm_foldarith(numberVnum(vb), numberVnum(vc), - (int)op - (int)IR_ADD))) - return emitir(IRTGI((int)op - (int)IR_ADD + (int)IR_ADDOV), rb, rc); - if (!tref_isnum(rb)) rb = emitir(IRTN(IR_CONV), rb, IRCONV_NUM_INT); - if (!tref_isnum(rc)) rc = emitir(IRTN(IR_CONV), rc, IRCONV_NUM_INT); - return emitir(IRTN(op), rb, rc); -} - -/* Narrowing of unary minus operator. */ -TRef lj_opt_narrow_unm(jit_State *J, TRef rc, TValue *vc) -{ - if (tref_isstr(rc)) { - rc = emitir(IRTG(IR_STRTO, IRT_NUM), rc, 0); - lj_strscan_num(strV(vc), vc); - } - if (tref_isinteger(rc)) { - if ((uint32_t)numberVint(vc) != 0x80000000u) - return emitir(IRTGI(IR_SUBOV), lj_ir_kint(J, 0), rc); - rc = emitir(IRTN(IR_CONV), rc, IRCONV_NUM_INT); - } - return emitir(IRTN(IR_NEG), rc, lj_ir_knum_neg(J)); -} - -/* Narrowing of modulo operator. */ -TRef lj_opt_narrow_mod(jit_State *J, TRef rb, TRef rc, TValue *vc) -{ - TRef tmp; - if (tvisstr(vc) && !lj_strscan_num(strV(vc), vc)) - lj_trace_err(J, LJ_TRERR_BADTYPE); - if ((LJ_DUALNUM || (J->flags & JIT_F_OPT_NARROW)) && - tref_isinteger(rb) && tref_isinteger(rc) && - (tvisint(vc) ? intV(vc) != 0 : !tviszero(vc))) { - emitir(IRTGI(IR_NE), rc, lj_ir_kint(J, 0)); - return emitir(IRTI(IR_MOD), rb, rc); - } - /* b % c ==> b - floor(b/c)*c */ - rb = lj_ir_tonum(J, rb); - rc = lj_ir_tonum(J, rc); - tmp = emitir(IRTN(IR_DIV), rb, rc); - tmp = emitir(IRTN(IR_FPMATH), tmp, IRFPM_FLOOR); - tmp = emitir(IRTN(IR_MUL), tmp, rc); - return emitir(IRTN(IR_SUB), rb, tmp); -} - -/* Narrowing of power operator or math.pow. */ -TRef lj_opt_narrow_pow(jit_State *J, TRef rb, TRef rc, TValue *vc) -{ - if (tvisstr(vc) && !lj_strscan_num(strV(vc), vc)) - lj_trace_err(J, LJ_TRERR_BADTYPE); - /* Narrowing must be unconditional to preserve (-x)^i semantics. */ - if (tvisint(vc) || numisint(numV(vc))) { - int checkrange = 0; - /* Split pow is faster for bigger exponents. But do this only for (+k)^i. */ - if (tref_isk(rb) && (int32_t)ir_knum(IR(tref_ref(rb)))->u32.hi >= 0) { - int32_t k = numberVint(vc); - if (!(k >= -65536 && k <= 65536)) goto split_pow; - checkrange = 1; - } - if (!tref_isinteger(rc)) { - if (tref_isstr(rc)) - rc = emitir(IRTG(IR_STRTO, IRT_NUM), rc, 0); - /* Guarded conversion to integer! */ - rc = emitir(IRTGI(IR_CONV), rc, IRCONV_INT_NUM|IRCONV_CHECK); - } - if (checkrange && !tref_isk(rc)) { /* Range guard: -65536 <= i <= 65536 */ - TRef tmp = emitir(IRTI(IR_ADD), rc, lj_ir_kint(J, 65536)); - emitir(IRTGI(IR_ULE), tmp, lj_ir_kint(J, 2*65536)); - } - return emitir(IRTN(IR_POW), rb, rc); - } -split_pow: - /* FOLD covers most cases, but some are easier to do here. */ - if (tref_isk(rb) && tvispone(ir_knum(IR(tref_ref(rb))))) - return rb; /* 1 ^ x ==> 1 */ - rc = lj_ir_tonum(J, rc); - if (tref_isk(rc) && ir_knum(IR(tref_ref(rc)))->n == 0.5) - return emitir(IRTN(IR_FPMATH), rb, IRFPM_SQRT); /* x ^ 0.5 ==> sqrt(x) */ - /* Split up b^c into exp2(c*log2(b)). Assembler may rejoin later. */ - rb = emitir(IRTN(IR_FPMATH), rb, IRFPM_LOG2); - rc = emitir(IRTN(IR_MUL), rb, rc); - return emitir(IRTN(IR_FPMATH), rc, IRFPM_EXP2); -} - -/* -- Predictive narrowing of induction variables ------------------------- */ - -/* Narrow a single runtime value. */ -static int narrow_forl(jit_State *J, cTValue *o) -{ - if (tvisint(o)) return 1; - if (LJ_DUALNUM || (J->flags & JIT_F_OPT_NARROW)) return numisint(numV(o)); - return 0; -} - -/* Narrow the FORL index type by looking at the runtime values. */ -IRType lj_opt_narrow_forl(jit_State *J, cTValue *tv) -{ - lua_assert(tvisnumber(&tv[FORL_IDX]) && - tvisnumber(&tv[FORL_STOP]) && - tvisnumber(&tv[FORL_STEP])); - /* Narrow only if the runtime values of start/stop/step are all integers. */ - if (narrow_forl(J, &tv[FORL_IDX]) && - narrow_forl(J, &tv[FORL_STOP]) && - narrow_forl(J, &tv[FORL_STEP])) { - /* And if the loop index can't possibly overflow. */ - lua_Number step = numberVnum(&tv[FORL_STEP]); - lua_Number sum = numberVnum(&tv[FORL_STOP]) + step; - if (0 <= step ? (sum <= 2147483647.0) : (sum >= -2147483648.0)) - return IRT_INT; - } - return IRT_NUM; -} - -#undef IR -#undef fins -#undef emitir -#undef emitir_raw - -#endif diff --git a/deps/luajit/src/lj_opt_sink.c b/deps/luajit/src/lj_opt_sink.c deleted file mode 100644 index a98e9dfe..00000000 --- a/deps/luajit/src/lj_opt_sink.c +++ /dev/null @@ -1,245 +0,0 @@ -/* -** SINK: Allocation Sinking and Store Sinking. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#define lj_opt_sink_c -#define LUA_CORE - -#include "lj_obj.h" - -#if LJ_HASJIT - -#include "lj_ir.h" -#include "lj_jit.h" -#include "lj_iropt.h" -#include "lj_target.h" - -/* Some local macros to save typing. Undef'd at the end. */ -#define IR(ref) (&J->cur.ir[(ref)]) - -/* Check whether the store ref points to an eligible allocation. */ -static IRIns *sink_checkalloc(jit_State *J, IRIns *irs) -{ - IRIns *ir = IR(irs->op1); - if (!irref_isk(ir->op2)) - return NULL; /* Non-constant key. */ - if (ir->o == IR_HREFK || ir->o == IR_AREF) - ir = IR(ir->op1); - else if (!(ir->o == IR_HREF || ir->o == IR_NEWREF || - ir->o == IR_FREF || ir->o == IR_ADD)) - return NULL; /* Unhandled reference type (for XSTORE). */ - ir = IR(ir->op1); - if (!(ir->o == IR_TNEW || ir->o == IR_TDUP || ir->o == IR_CNEW)) - return NULL; /* Not an allocation. */ - return ir; /* Return allocation. */ -} - -/* Recursively check whether a value depends on a PHI. */ -static int sink_phidep(jit_State *J, IRRef ref) -{ - IRIns *ir = IR(ref); - if (irt_isphi(ir->t)) return 1; - if (ir->op1 >= REF_FIRST && sink_phidep(J, ir->op1)) return 1; - if (ir->op2 >= REF_FIRST && sink_phidep(J, ir->op2)) return 1; - return 0; -} - -/* Check whether a value is a sinkable PHI or loop-invariant. */ -static int sink_checkphi(jit_State *J, IRIns *ira, IRRef ref) -{ - if (ref >= REF_FIRST) { - IRIns *ir = IR(ref); - if (irt_isphi(ir->t) || (ir->o == IR_CONV && ir->op2 == IRCONV_NUM_INT && - irt_isphi(IR(ir->op1)->t))) { - ira->prev++; - return 1; /* Sinkable PHI. */ - } - /* Otherwise the value must be loop-invariant. */ - return ref < J->loopref && !sink_phidep(J, ref); - } - return 1; /* Constant (non-PHI). */ -} - -/* Mark non-sinkable allocations using single-pass backward propagation. -** -** Roots for the marking process are: -** - Some PHIs or snapshots (see below). -** - Non-PHI, non-constant values stored to PHI allocations. -** - All guards. -** - Any remaining loads not eliminated by store-to-load forwarding. -** - Stores with non-constant keys. -** - All stored values. -*/ -static void sink_mark_ins(jit_State *J) -{ - IRIns *ir, *irlast = IR(J->cur.nins-1); - for (ir = irlast ; ; ir--) { - switch (ir->o) { - case IR_BASE: - return; /* Finished. */ - case IR_CALLL: /* IRCALL_lj_tab_len */ - case IR_ALOAD: case IR_HLOAD: case IR_XLOAD: case IR_TBAR: - irt_setmark(IR(ir->op1)->t); /* Mark ref for remaining loads. */ - break; - case IR_FLOAD: - if (irt_ismarked(ir->t) || ir->op2 == IRFL_TAB_META) - irt_setmark(IR(ir->op1)->t); /* Mark table for remaining loads. */ - break; - case IR_ASTORE: case IR_HSTORE: case IR_FSTORE: case IR_XSTORE: { - IRIns *ira = sink_checkalloc(J, ir); - if (!ira || (irt_isphi(ira->t) && !sink_checkphi(J, ira, ir->op2))) - irt_setmark(IR(ir->op1)->t); /* Mark ineligible ref. */ - irt_setmark(IR(ir->op2)->t); /* Mark stored value. */ - break; - } -#if LJ_HASFFI - case IR_CNEWI: - if (irt_isphi(ir->t) && - (!sink_checkphi(J, ir, ir->op2) || - (LJ_32 && ir+1 < irlast && (ir+1)->o == IR_HIOP && - !sink_checkphi(J, ir, (ir+1)->op2)))) - irt_setmark(ir->t); /* Mark ineligible allocation. */ - /* fallthrough */ -#endif - case IR_USTORE: - irt_setmark(IR(ir->op2)->t); /* Mark stored value. */ - break; -#if LJ_HASFFI - case IR_CALLXS: -#endif - case IR_CALLS: - irt_setmark(IR(ir->op1)->t); /* Mark (potentially) stored values. */ - break; - case IR_PHI: { - IRIns *irl = IR(ir->op1), *irr = IR(ir->op2); - irl->prev = irr->prev = 0; /* Clear PHI value counts. */ - if (irl->o == irr->o && - (irl->o == IR_TNEW || irl->o == IR_TDUP || - (LJ_HASFFI && (irl->o == IR_CNEW || irl->o == IR_CNEWI)))) - break; - irt_setmark(irl->t); - irt_setmark(irr->t); - break; - } - default: - if (irt_ismarked(ir->t) || irt_isguard(ir->t)) { /* Propagate mark. */ - if (ir->op1 >= REF_FIRST) irt_setmark(IR(ir->op1)->t); - if (ir->op2 >= REF_FIRST) irt_setmark(IR(ir->op2)->t); - } - break; - } - } -} - -/* Mark all instructions referenced by a snapshot. */ -static void sink_mark_snap(jit_State *J, SnapShot *snap) -{ - SnapEntry *map = &J->cur.snapmap[snap->mapofs]; - MSize n, nent = snap->nent; - for (n = 0; n < nent; n++) { - IRRef ref = snap_ref(map[n]); - if (!irref_isk(ref)) - irt_setmark(IR(ref)->t); - } -} - -/* Iteratively remark PHI refs with differing marks or PHI value counts. */ -static void sink_remark_phi(jit_State *J) -{ - IRIns *ir; - int remark; - do { - remark = 0; - for (ir = IR(J->cur.nins-1); ir->o == IR_PHI; ir--) { - IRIns *irl = IR(ir->op1), *irr = IR(ir->op2); - if (((irl->t.irt ^ irr->t.irt) & IRT_MARK)) - remark = 1; - else if (irl->prev == irr->prev) - continue; - irt_setmark(IR(ir->op1)->t); - irt_setmark(IR(ir->op2)->t); - } - } while (remark); -} - -/* Sweep instructions and tag sunken allocations and stores. */ -static void sink_sweep_ins(jit_State *J) -{ - IRIns *ir, *irfirst = IR(J->cur.nk); - for (ir = IR(J->cur.nins-1) ; ir >= irfirst; ir--) { - switch (ir->o) { - case IR_ASTORE: case IR_HSTORE: case IR_FSTORE: case IR_XSTORE: { - IRIns *ira = sink_checkalloc(J, ir); - if (ira && !irt_ismarked(ira->t)) { - int delta = (int)(ir - ira); - ir->prev = REGSP(RID_SINK, delta > 255 ? 255 : delta); - } else { - ir->prev = REGSP_INIT; - } - break; - } - case IR_NEWREF: - if (!irt_ismarked(IR(ir->op1)->t)) { - ir->prev = REGSP(RID_SINK, 0); - } else { - irt_clearmark(ir->t); - ir->prev = REGSP_INIT; - } - break; -#if LJ_HASFFI - case IR_CNEW: case IR_CNEWI: -#endif - case IR_TNEW: case IR_TDUP: - if (!irt_ismarked(ir->t)) { - ir->t.irt &= ~IRT_GUARD; - ir->prev = REGSP(RID_SINK, 0); - J->cur.sinktags = 1; /* Signal present SINK tags to assembler. */ - } else { - irt_clearmark(ir->t); - ir->prev = REGSP_INIT; - } - break; - case IR_PHI: { - IRIns *ira = IR(ir->op2); - if (!irt_ismarked(ira->t) && - (ira->o == IR_TNEW || ira->o == IR_TDUP || - (LJ_HASFFI && (ira->o == IR_CNEW || ira->o == IR_CNEWI)))) { - ir->prev = REGSP(RID_SINK, 0); - } else { - ir->prev = REGSP_INIT; - } - break; - } - default: - irt_clearmark(ir->t); - ir->prev = REGSP_INIT; - break; - } - } -} - -/* Allocation sinking and store sinking. -** -** 1. Mark all non-sinkable allocations. -** 2. Then sink all remaining allocations and the related stores. -*/ -void lj_opt_sink(jit_State *J) -{ - const uint32_t need = (JIT_F_OPT_SINK|JIT_F_OPT_FWD| - JIT_F_OPT_DCE|JIT_F_OPT_CSE|JIT_F_OPT_FOLD); - if ((J->flags & need) == need && - (J->chain[IR_TNEW] || J->chain[IR_TDUP] || - (LJ_HASFFI && (J->chain[IR_CNEW] || J->chain[IR_CNEWI])))) { - if (!J->loopref) - sink_mark_snap(J, &J->cur.snap[J->cur.nsnap-1]); - sink_mark_ins(J); - if (J->loopref) - sink_remark_phi(J); - sink_sweep_ins(J); - } -} - -#undef IR - -#endif diff --git a/deps/luajit/src/lj_opt_split.c b/deps/luajit/src/lj_opt_split.c deleted file mode 100644 index 1cee5093..00000000 --- a/deps/luajit/src/lj_opt_split.c +++ /dev/null @@ -1,731 +0,0 @@ -/* -** SPLIT: Split 64 bit IR instructions into 32 bit IR instructions. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#define lj_opt_split_c -#define LUA_CORE - -#include "lj_obj.h" - -#if LJ_HASJIT && (LJ_SOFTFP || (LJ_32 && LJ_HASFFI)) - -#include "lj_err.h" -#include "lj_str.h" -#include "lj_ir.h" -#include "lj_jit.h" -#include "lj_ircall.h" -#include "lj_iropt.h" -#include "lj_vm.h" - -/* SPLIT pass: -** -** This pass splits up 64 bit IR instructions into multiple 32 bit IR -** instructions. It's only active for soft-float targets or for 32 bit CPUs -** which lack native 64 bit integer operations (the FFI is currently the -** only emitter for 64 bit integer instructions). -** -** Splitting the IR in a separate pass keeps each 32 bit IR assembler -** backend simple. Only a small amount of extra functionality needs to be -** implemented. This is much easier than adding support for allocating -** register pairs to each backend (believe me, I tried). A few simple, but -** important optimizations can be performed by the SPLIT pass, which would -** be tedious to do in the backend. -** -** The basic idea is to replace each 64 bit IR instruction with its 32 bit -** equivalent plus an extra HIOP instruction. The splitted IR is not passed -** through FOLD or any other optimizations, so each HIOP is guaranteed to -** immediately follow it's counterpart. The actual functionality of HIOP is -** inferred from the previous instruction. -** -** The operands of HIOP hold the hiword input references. The output of HIOP -** is the hiword output reference, which is also used to hold the hiword -** register or spill slot information. The register allocator treats this -** instruction independently of any other instruction, which improves code -** quality compared to using fixed register pairs. -** -** It's easier to split up some instructions into two regular 32 bit -** instructions. E.g. XLOAD is split up into two XLOADs with two different -** addresses. Obviously 64 bit constants need to be split up into two 32 bit -** constants, too. Some hiword instructions can be entirely omitted, e.g. -** when zero-extending a 32 bit value to 64 bits. 64 bit arguments for calls -** are split up into two 32 bit arguments each. -** -** On soft-float targets, floating-point instructions are directly converted -** to soft-float calls by the SPLIT pass (except for comparisons and MIN/MAX). -** HIOP for number results has the type IRT_SOFTFP ("sfp" in -jdump). -** -** Here's the IR and x64 machine code for 'x.b = x.a + 1' for a struct with -** two int64_t fields: -** -** 0100 p32 ADD base +8 -** 0101 i64 XLOAD 0100 -** 0102 i64 ADD 0101 +1 -** 0103 p32 ADD base +16 -** 0104 i64 XSTORE 0103 0102 -** -** mov rax, [esi+0x8] -** add rax, +0x01 -** mov [esi+0x10], rax -** -** Here's the transformed IR and the x86 machine code after the SPLIT pass: -** -** 0100 p32 ADD base +8 -** 0101 int XLOAD 0100 -** 0102 p32 ADD base +12 -** 0103 int XLOAD 0102 -** 0104 int ADD 0101 +1 -** 0105 int HIOP 0103 +0 -** 0106 p32 ADD base +16 -** 0107 int XSTORE 0106 0104 -** 0108 int HIOP 0106 0105 -** -** mov eax, [esi+0x8] -** mov ecx, [esi+0xc] -** add eax, +0x01 -** adc ecx, +0x00 -** mov [esi+0x10], eax -** mov [esi+0x14], ecx -** -** You may notice the reassociated hiword address computation, which is -** later fused into the mov operands by the assembler. -*/ - -/* Some local macros to save typing. Undef'd at the end. */ -#define IR(ref) (&J->cur.ir[(ref)]) - -/* Directly emit the transformed IR without updating chains etc. */ -static IRRef split_emit(jit_State *J, uint16_t ot, IRRef1 op1, IRRef1 op2) -{ - IRRef nref = lj_ir_nextins(J); - IRIns *ir = IR(nref); - ir->ot = ot; - ir->op1 = op1; - ir->op2 = op2; - return nref; -} - -#if LJ_SOFTFP -/* Emit a (checked) number to integer conversion. */ -static IRRef split_num2int(jit_State *J, IRRef lo, IRRef hi, int check) -{ - IRRef tmp, res; -#if LJ_LE - tmp = split_emit(J, IRT(IR_CARG, IRT_NIL), lo, hi); -#else - tmp = split_emit(J, IRT(IR_CARG, IRT_NIL), hi, lo); -#endif - res = split_emit(J, IRTI(IR_CALLN), tmp, IRCALL_softfp_d2i); - if (check) { - tmp = split_emit(J, IRTI(IR_CALLN), res, IRCALL_softfp_i2d); - split_emit(J, IRT(IR_HIOP, IRT_SOFTFP), tmp, tmp); - split_emit(J, IRTGI(IR_EQ), tmp, lo); - split_emit(J, IRTG(IR_HIOP, IRT_SOFTFP), tmp+1, hi); - } - return res; -} - -/* Emit a CALLN with one split 64 bit argument. */ -static IRRef split_call_l(jit_State *J, IRRef1 *hisubst, IRIns *oir, - IRIns *ir, IRCallID id) -{ - IRRef tmp, op1 = ir->op1; - J->cur.nins--; -#if LJ_LE - tmp = split_emit(J, IRT(IR_CARG, IRT_NIL), oir[op1].prev, hisubst[op1]); -#else - tmp = split_emit(J, IRT(IR_CARG, IRT_NIL), hisubst[op1], oir[op1].prev); -#endif - ir->prev = tmp = split_emit(J, IRTI(IR_CALLN), tmp, id); - return split_emit(J, IRT(IR_HIOP, IRT_SOFTFP), tmp, tmp); -} - -/* Emit a CALLN with one split 64 bit argument and a 32 bit argument. */ -static IRRef split_call_li(jit_State *J, IRRef1 *hisubst, IRIns *oir, - IRIns *ir, IRCallID id) -{ - IRRef tmp, op1 = ir->op1, op2 = ir->op2; - J->cur.nins--; -#if LJ_LE - tmp = split_emit(J, IRT(IR_CARG, IRT_NIL), oir[op1].prev, hisubst[op1]); -#else - tmp = split_emit(J, IRT(IR_CARG, IRT_NIL), hisubst[op1], oir[op1].prev); -#endif - tmp = split_emit(J, IRT(IR_CARG, IRT_NIL), tmp, oir[op2].prev); - ir->prev = tmp = split_emit(J, IRTI(IR_CALLN), tmp, id); - return split_emit(J, IRT(IR_HIOP, IRT_SOFTFP), tmp, tmp); -} -#endif - -/* Emit a CALLN with two split 64 bit arguments. */ -static IRRef split_call_ll(jit_State *J, IRRef1 *hisubst, IRIns *oir, - IRIns *ir, IRCallID id) -{ - IRRef tmp, op1 = ir->op1, op2 = ir->op2; - J->cur.nins--; -#if LJ_LE - tmp = split_emit(J, IRT(IR_CARG, IRT_NIL), oir[op1].prev, hisubst[op1]); - tmp = split_emit(J, IRT(IR_CARG, IRT_NIL), tmp, oir[op2].prev); - tmp = split_emit(J, IRT(IR_CARG, IRT_NIL), tmp, hisubst[op2]); -#else - tmp = split_emit(J, IRT(IR_CARG, IRT_NIL), hisubst[op1], oir[op1].prev); - tmp = split_emit(J, IRT(IR_CARG, IRT_NIL), tmp, hisubst[op2]); - tmp = split_emit(J, IRT(IR_CARG, IRT_NIL), tmp, oir[op2].prev); -#endif - ir->prev = tmp = split_emit(J, IRTI(IR_CALLN), tmp, id); - return split_emit(J, - IRT(IR_HIOP, (LJ_SOFTFP && irt_isnum(ir->t)) ? IRT_SOFTFP : IRT_INT), - tmp, tmp); -} - -/* Get a pointer to the other 32 bit word (LE: hiword, BE: loword). */ -static IRRef split_ptr(jit_State *J, IRIns *oir, IRRef ref) -{ - IRRef nref = oir[ref].prev; - IRIns *ir = IR(nref); - int32_t ofs = 4; - if (ir->o == IR_KPTR) - return lj_ir_kptr(J, (char *)ir_kptr(ir) + ofs); - if (ir->o == IR_ADD && irref_isk(ir->op2) && !irt_isphi(oir[ref].t)) { - /* Reassociate address. */ - ofs += IR(ir->op2)->i; - nref = ir->op1; - if (ofs == 0) return nref; - } - return split_emit(J, IRTI(IR_ADD), nref, lj_ir_kint(J, ofs)); -} - -/* Substitute references of a snapshot. */ -static void split_subst_snap(jit_State *J, SnapShot *snap, IRIns *oir) -{ - SnapEntry *map = &J->cur.snapmap[snap->mapofs]; - MSize n, nent = snap->nent; - for (n = 0; n < nent; n++) { - SnapEntry sn = map[n]; - IRIns *ir = &oir[snap_ref(sn)]; - if (!(LJ_SOFTFP && (sn & SNAP_SOFTFPNUM) && irref_isk(snap_ref(sn)))) - map[n] = ((sn & 0xffff0000) | ir->prev); - } -} - -/* Transform the old IR to the new IR. */ -static void split_ir(jit_State *J) -{ - IRRef nins = J->cur.nins, nk = J->cur.nk; - MSize irlen = nins - nk; - MSize need = (irlen+1)*(sizeof(IRIns) + sizeof(IRRef1)); - IRIns *oir = (IRIns *)lj_str_needbuf(J->L, &G(J->L)->tmpbuf, need); - IRRef1 *hisubst; - IRRef ref, snref; - SnapShot *snap; - - /* Copy old IR to buffer. */ - memcpy(oir, IR(nk), irlen*sizeof(IRIns)); - /* Bias hiword substitution table and old IR. Loword kept in field prev. */ - hisubst = (IRRef1 *)&oir[irlen] - nk; - oir -= nk; - - /* Remove all IR instructions, but retain IR constants. */ - J->cur.nins = REF_FIRST; - J->loopref = 0; - - /* Process constants and fixed references. */ - for (ref = nk; ref <= REF_BASE; ref++) { - IRIns *ir = &oir[ref]; - if ((LJ_SOFTFP && ir->o == IR_KNUM) || ir->o == IR_KINT64) { - /* Split up 64 bit constant. */ - TValue tv = *ir_k64(ir); - ir->prev = lj_ir_kint(J, (int32_t)tv.u32.lo); - hisubst[ref] = lj_ir_kint(J, (int32_t)tv.u32.hi); - } else { - ir->prev = ref; /* Identity substitution for loword. */ - hisubst[ref] = 0; - } - } - - /* Process old IR instructions. */ - snap = J->cur.snap; - snref = snap->ref; - for (ref = REF_FIRST; ref < nins; ref++) { - IRIns *ir = &oir[ref]; - IRRef nref = lj_ir_nextins(J); - IRIns *nir = IR(nref); - IRRef hi = 0; - - if (ref >= snref) { - snap->ref = nref; - split_subst_snap(J, snap++, oir); - snref = snap < &J->cur.snap[J->cur.nsnap] ? snap->ref : ~(IRRef)0; - } - - /* Copy-substitute old instruction to new instruction. */ - nir->op1 = ir->op1 < nk ? ir->op1 : oir[ir->op1].prev; - nir->op2 = ir->op2 < nk ? ir->op2 : oir[ir->op2].prev; - ir->prev = nref; /* Loword substitution. */ - nir->o = ir->o; - nir->t.irt = ir->t.irt & ~(IRT_MARK|IRT_ISPHI); - hisubst[ref] = 0; - - /* Split 64 bit instructions. */ -#if LJ_SOFTFP - if (irt_isnum(ir->t)) { - nir->t.irt = IRT_INT | (nir->t.irt & IRT_GUARD); /* Turn into INT op. */ - /* Note: hi ref = lo ref + 1! Required for SNAP_SOFTFPNUM logic. */ - switch (ir->o) { - case IR_ADD: - hi = split_call_ll(J, hisubst, oir, ir, IRCALL_softfp_add); - break; - case IR_SUB: - hi = split_call_ll(J, hisubst, oir, ir, IRCALL_softfp_sub); - break; - case IR_MUL: - hi = split_call_ll(J, hisubst, oir, ir, IRCALL_softfp_mul); - break; - case IR_DIV: - hi = split_call_ll(J, hisubst, oir, ir, IRCALL_softfp_div); - break; - case IR_POW: - hi = split_call_li(J, hisubst, oir, ir, IRCALL_lj_vm_powi); - break; - case IR_FPMATH: - /* Try to rejoin pow from EXP2, MUL and LOG2. */ - if (nir->op2 == IRFPM_EXP2 && nir->op1 > J->loopref) { - IRIns *irp = IR(nir->op1); - if (irp->o == IR_CALLN && irp->op2 == IRCALL_softfp_mul) { - IRIns *irm4 = IR(irp->op1); - IRIns *irm3 = IR(irm4->op1); - IRIns *irm12 = IR(irm3->op1); - IRIns *irl1 = IR(irm12->op1); - if (irm12->op1 > J->loopref && irl1->o == IR_CALLN && - irl1->op2 == IRCALL_lj_vm_log2) { - IRRef tmp = irl1->op1; /* Recycle first two args from LOG2. */ - IRRef arg3 = irm3->op2, arg4 = irm4->op2; - J->cur.nins--; - tmp = split_emit(J, IRT(IR_CARG, IRT_NIL), tmp, arg3); - tmp = split_emit(J, IRT(IR_CARG, IRT_NIL), tmp, arg4); - ir->prev = tmp = split_emit(J, IRTI(IR_CALLN), tmp, IRCALL_pow); - hi = split_emit(J, IRT(IR_HIOP, IRT_SOFTFP), tmp, tmp); - break; - } - } - } - hi = split_call_l(J, hisubst, oir, ir, IRCALL_lj_vm_floor + ir->op2); - break; - case IR_ATAN2: - hi = split_call_ll(J, hisubst, oir, ir, IRCALL_atan2); - break; - case IR_LDEXP: - hi = split_call_li(J, hisubst, oir, ir, IRCALL_ldexp); - break; - case IR_NEG: case IR_ABS: - nir->o = IR_CONV; /* Pass through loword. */ - nir->op2 = (IRT_INT << 5) | IRT_INT; - hi = split_emit(J, IRT(ir->o == IR_NEG ? IR_BXOR : IR_BAND, IRT_SOFTFP), - hisubst[ir->op1], hisubst[ir->op2]); - break; - case IR_SLOAD: - if ((nir->op2 & IRSLOAD_CONVERT)) { /* Convert from int to number. */ - nir->op2 &= ~IRSLOAD_CONVERT; - ir->prev = nref = split_emit(J, IRTI(IR_CALLN), nref, - IRCALL_softfp_i2d); - hi = split_emit(J, IRT(IR_HIOP, IRT_SOFTFP), nref, nref); - break; - } - /* fallthrough */ - case IR_ALOAD: case IR_HLOAD: case IR_ULOAD: case IR_VLOAD: - case IR_STRTO: - hi = split_emit(J, IRT(IR_HIOP, IRT_SOFTFP), nref, nref); - break; - case IR_XLOAD: { - IRIns inslo = *nir; /* Save/undo the emit of the lo XLOAD. */ - J->cur.nins--; - hi = split_ptr(J, oir, ir->op1); /* Insert the hiref ADD. */ - nref = lj_ir_nextins(J); - nir = IR(nref); - *nir = inslo; /* Re-emit lo XLOAD immediately before hi XLOAD. */ - hi = split_emit(J, IRT(IR_XLOAD, IRT_SOFTFP), hi, ir->op2); -#if LJ_LE - ir->prev = nref; -#else - ir->prev = hi; hi = nref; -#endif - break; - } - case IR_ASTORE: case IR_HSTORE: case IR_USTORE: case IR_XSTORE: - split_emit(J, IRT(IR_HIOP, IRT_SOFTFP), nir->op1, hisubst[ir->op2]); - break; - case IR_CONV: { /* Conversion to number. Others handled below. */ - IRType st = (IRType)(ir->op2 & IRCONV_SRCMASK); - UNUSED(st); -#if LJ_32 && LJ_HASFFI - if (st == IRT_I64 || st == IRT_U64) { - hi = split_call_l(J, hisubst, oir, ir, - st == IRT_I64 ? IRCALL_fp64_l2d : IRCALL_fp64_ul2d); - break; - } -#endif - lua_assert(st == IRT_INT || - (LJ_32 && LJ_HASFFI && (st == IRT_U32 || st == IRT_FLOAT))); - nir->o = IR_CALLN; -#if LJ_32 && LJ_HASFFI - nir->op2 = st == IRT_INT ? IRCALL_softfp_i2d : - st == IRT_FLOAT ? IRCALL_softfp_f2d : - IRCALL_softfp_ui2d; -#else - nir->op2 = IRCALL_softfp_i2d; -#endif - hi = split_emit(J, IRT(IR_HIOP, IRT_SOFTFP), nref, nref); - break; - } - case IR_CALLN: - case IR_CALLL: - case IR_CALLS: - case IR_CALLXS: - goto split_call; - case IR_PHI: - if (nir->op1 == nir->op2) - J->cur.nins--; /* Drop useless PHIs. */ - if (hisubst[ir->op1] != hisubst[ir->op2]) - split_emit(J, IRT(IR_PHI, IRT_SOFTFP), - hisubst[ir->op1], hisubst[ir->op2]); - break; - case IR_HIOP: - J->cur.nins--; /* Drop joining HIOP. */ - ir->prev = nir->op1; - hi = nir->op2; - break; - default: - lua_assert(ir->o <= IR_NE || ir->o == IR_MIN || ir->o == IR_MAX); - hi = split_emit(J, IRTG(IR_HIOP, IRT_SOFTFP), - hisubst[ir->op1], hisubst[ir->op2]); - break; - } - } else -#endif -#if LJ_32 && LJ_HASFFI - if (irt_isint64(ir->t)) { - IRRef hiref = hisubst[ir->op1]; - nir->t.irt = IRT_INT | (nir->t.irt & IRT_GUARD); /* Turn into INT op. */ - switch (ir->o) { - case IR_ADD: - case IR_SUB: - /* Use plain op for hiword if loword cannot produce a carry/borrow. */ - if (irref_isk(nir->op2) && IR(nir->op2)->i == 0) { - ir->prev = nir->op1; /* Pass through loword. */ - nir->op1 = hiref; nir->op2 = hisubst[ir->op2]; - hi = nref; - break; - } - /* fallthrough */ - case IR_NEG: - hi = split_emit(J, IRTI(IR_HIOP), hiref, hisubst[ir->op2]); - break; - case IR_MUL: - hi = split_call_ll(J, hisubst, oir, ir, IRCALL_lj_carith_mul64); - break; - case IR_DIV: - hi = split_call_ll(J, hisubst, oir, ir, - irt_isi64(ir->t) ? IRCALL_lj_carith_divi64 : - IRCALL_lj_carith_divu64); - break; - case IR_MOD: - hi = split_call_ll(J, hisubst, oir, ir, - irt_isi64(ir->t) ? IRCALL_lj_carith_modi64 : - IRCALL_lj_carith_modu64); - break; - case IR_POW: - hi = split_call_ll(J, hisubst, oir, ir, - irt_isi64(ir->t) ? IRCALL_lj_carith_powi64 : - IRCALL_lj_carith_powu64); - break; - case IR_FLOAD: - lua_assert(ir->op2 == IRFL_CDATA_INT64); - hi = split_emit(J, IRTI(IR_FLOAD), nir->op1, IRFL_CDATA_INT64_4); -#if LJ_BE - ir->prev = hi; hi = nref; -#endif - break; - case IR_XLOAD: - hi = split_emit(J, IRTI(IR_XLOAD), split_ptr(J, oir, ir->op1), ir->op2); -#if LJ_BE - ir->prev = hi; hi = nref; -#endif - break; - case IR_XSTORE: - split_emit(J, IRTI(IR_HIOP), nir->op1, hisubst[ir->op2]); - break; - case IR_CONV: { /* Conversion to 64 bit integer. Others handled below. */ - IRType st = (IRType)(ir->op2 & IRCONV_SRCMASK); -#if LJ_SOFTFP - if (st == IRT_NUM) { /* NUM to 64 bit int conv. */ - hi = split_call_l(J, hisubst, oir, ir, - irt_isi64(ir->t) ? IRCALL_fp64_d2l : IRCALL_fp64_d2ul); - } else if (st == IRT_FLOAT) { /* FLOAT to 64 bit int conv. */ - nir->o = IR_CALLN; - nir->op2 = irt_isi64(ir->t) ? IRCALL_fp64_f2l : IRCALL_fp64_f2ul; - hi = split_emit(J, IRTI(IR_HIOP), nref, nref); - } -#else - if (st == IRT_NUM || st == IRT_FLOAT) { /* FP to 64 bit int conv. */ - hi = split_emit(J, IRTI(IR_HIOP), nir->op1, nref); - } -#endif - else if (st == IRT_I64 || st == IRT_U64) { /* 64/64 bit cast. */ - /* Drop cast, since assembler doesn't care. */ - goto fwdlo; - } else if ((ir->op2 & IRCONV_SEXT)) { /* Sign-extend to 64 bit. */ - IRRef k31 = lj_ir_kint(J, 31); - nir = IR(nref); /* May have been reallocated. */ - ir->prev = nir->op1; /* Pass through loword. */ - nir->o = IR_BSAR; /* hi = bsar(lo, 31). */ - nir->op2 = k31; - hi = nref; - } else { /* Zero-extend to 64 bit. */ - hi = lj_ir_kint(J, 0); - goto fwdlo; - } - break; - } - case IR_CALLXS: - goto split_call; - case IR_PHI: { - IRRef hiref2; - if ((irref_isk(nir->op1) && irref_isk(nir->op2)) || - nir->op1 == nir->op2) - J->cur.nins--; /* Drop useless PHIs. */ - hiref2 = hisubst[ir->op2]; - if (!((irref_isk(hiref) && irref_isk(hiref2)) || hiref == hiref2)) - split_emit(J, IRTI(IR_PHI), hiref, hiref2); - break; - } - case IR_HIOP: - J->cur.nins--; /* Drop joining HIOP. */ - ir->prev = nir->op1; - hi = nir->op2; - break; - default: - lua_assert(ir->o <= IR_NE); /* Comparisons. */ - split_emit(J, IRTGI(IR_HIOP), hiref, hisubst[ir->op2]); - break; - } - } else -#endif -#if LJ_SOFTFP - if (ir->o == IR_SLOAD) { - if ((nir->op2 & IRSLOAD_CONVERT)) { /* Convert from number to int. */ - nir->op2 &= ~IRSLOAD_CONVERT; - if (!(nir->op2 & IRSLOAD_TYPECHECK)) - nir->t.irt = IRT_INT; /* Drop guard. */ - split_emit(J, IRT(IR_HIOP, IRT_SOFTFP), nref, nref); - ir->prev = split_num2int(J, nref, nref+1, irt_isguard(ir->t)); - } - } else if (ir->o == IR_TOBIT) { - IRRef tmp, op1 = ir->op1; - J->cur.nins--; -#if LJ_LE - tmp = split_emit(J, IRT(IR_CARG, IRT_NIL), oir[op1].prev, hisubst[op1]); -#else - tmp = split_emit(J, IRT(IR_CARG, IRT_NIL), hisubst[op1], oir[op1].prev); -#endif - ir->prev = split_emit(J, IRTI(IR_CALLN), tmp, IRCALL_lj_vm_tobit); - } else if (ir->o == IR_TOSTR) { - if (hisubst[ir->op1]) { - if (irref_isk(ir->op1)) - nir->op1 = ir->op1; - else - split_emit(J, IRT(IR_HIOP, IRT_NIL), hisubst[ir->op1], nref); - } - } else if (ir->o == IR_HREF || ir->o == IR_NEWREF) { - if (irref_isk(ir->op2) && hisubst[ir->op2]) - nir->op2 = ir->op2; - } else -#endif - if (ir->o == IR_CONV) { /* See above, too. */ - IRType st = (IRType)(ir->op2 & IRCONV_SRCMASK); -#if LJ_32 && LJ_HASFFI - if (st == IRT_I64 || st == IRT_U64) { /* Conversion from 64 bit int. */ -#if LJ_SOFTFP - if (irt_isfloat(ir->t)) { - split_call_l(J, hisubst, oir, ir, - st == IRT_I64 ? IRCALL_fp64_l2f : IRCALL_fp64_ul2f); - J->cur.nins--; /* Drop unused HIOP. */ - } -#else - if (irt_isfp(ir->t)) { /* 64 bit integer to FP conversion. */ - ir->prev = split_emit(J, IRT(IR_HIOP, irt_type(ir->t)), - hisubst[ir->op1], nref); - } -#endif - else { /* Truncate to lower 32 bits. */ - fwdlo: - ir->prev = nir->op1; /* Forward loword. */ - /* Replace with NOP to avoid messing up the snapshot logic. */ - nir->ot = IRT(IR_NOP, IRT_NIL); - nir->op1 = nir->op2 = 0; - } - } -#endif -#if LJ_SOFTFP && LJ_32 && LJ_HASFFI - else if (irt_isfloat(ir->t)) { - if (st == IRT_NUM) { - split_call_l(J, hisubst, oir, ir, IRCALL_softfp_d2f); - J->cur.nins--; /* Drop unused HIOP. */ - } else { - nir->o = IR_CALLN; - nir->op2 = st == IRT_INT ? IRCALL_softfp_i2f : IRCALL_softfp_ui2f; - } - } else if (st == IRT_FLOAT) { - nir->o = IR_CALLN; - nir->op2 = irt_isint(ir->t) ? IRCALL_softfp_f2i : IRCALL_softfp_f2ui; - } else -#endif -#if LJ_SOFTFP - if (st == IRT_NUM || (LJ_32 && LJ_HASFFI && st == IRT_FLOAT)) { - if (irt_isguard(ir->t)) { - lua_assert(st == IRT_NUM && irt_isint(ir->t)); - J->cur.nins--; - ir->prev = split_num2int(J, nir->op1, hisubst[ir->op1], 1); - } else { - split_call_l(J, hisubst, oir, ir, -#if LJ_32 && LJ_HASFFI - st == IRT_NUM ? - (irt_isint(ir->t) ? IRCALL_softfp_d2i : IRCALL_softfp_d2ui) : - (irt_isint(ir->t) ? IRCALL_softfp_f2i : IRCALL_softfp_f2ui) -#else - IRCALL_softfp_d2i -#endif - ); - J->cur.nins--; /* Drop unused HIOP. */ - } - } -#endif - } else if (ir->o == IR_CALLXS) { - IRRef hiref; - split_call: - hiref = hisubst[ir->op1]; - if (hiref) { - IROpT ot = nir->ot; - IRRef op2 = nir->op2; - nir->ot = IRT(IR_CARG, IRT_NIL); -#if LJ_LE - nir->op2 = hiref; -#else - nir->op2 = nir->op1; nir->op1 = hiref; -#endif - ir->prev = nref = split_emit(J, ot, nref, op2); - } - if (LJ_SOFTFP ? irt_is64(ir->t) : irt_isint64(ir->t)) - hi = split_emit(J, - IRT(IR_HIOP, (LJ_SOFTFP && irt_isnum(ir->t)) ? IRT_SOFTFP : IRT_INT), - nref, nref); - } else if (ir->o == IR_CARG) { - IRRef hiref = hisubst[ir->op1]; - if (hiref) { - IRRef op2 = nir->op2; -#if LJ_LE - nir->op2 = hiref; -#else - nir->op2 = nir->op1; nir->op1 = hiref; -#endif - ir->prev = nref = split_emit(J, IRT(IR_CARG, IRT_NIL), nref, op2); - nir = IR(nref); - } - hiref = hisubst[ir->op2]; - if (hiref) { -#if !LJ_TARGET_X86 - int carg = 0; - IRIns *cir; - for (cir = IR(nir->op1); cir->o == IR_CARG; cir = IR(cir->op1)) - carg++; - if ((carg & 1) == 0) { /* Align 64 bit arguments. */ - IRRef op2 = nir->op2; - nir->op2 = REF_NIL; - nref = split_emit(J, IRT(IR_CARG, IRT_NIL), nref, op2); - nir = IR(nref); - } -#endif -#if LJ_BE - { IRRef tmp = nir->op2; nir->op2 = hiref; hiref = tmp; } -#endif - ir->prev = split_emit(J, IRT(IR_CARG, IRT_NIL), nref, hiref); - } - } else if (ir->o == IR_CNEWI) { - if (hisubst[ir->op2]) - split_emit(J, IRT(IR_HIOP, IRT_NIL), nref, hisubst[ir->op2]); - } else if (ir->o == IR_LOOP) { - J->loopref = nref; /* Needed by assembler. */ - } - hisubst[ref] = hi; /* Store hiword substitution. */ - } - if (snref == nins) { /* Substitution for last snapshot. */ - snap->ref = J->cur.nins; - split_subst_snap(J, snap, oir); - } - - /* Add PHI marks. */ - for (ref = J->cur.nins-1; ref >= REF_FIRST; ref--) { - IRIns *ir = IR(ref); - if (ir->o != IR_PHI) break; - if (!irref_isk(ir->op1)) irt_setphi(IR(ir->op1)->t); - if (ir->op2 > J->loopref) irt_setphi(IR(ir->op2)->t); - } -} - -/* Protected callback for split pass. */ -static TValue *cpsplit(lua_State *L, lua_CFunction dummy, void *ud) -{ - jit_State *J = (jit_State *)ud; - split_ir(J); - UNUSED(L); UNUSED(dummy); - return NULL; -} - -#if defined(LUA_USE_ASSERT) || LJ_SOFTFP -/* Slow, but sure way to check whether a SPLIT pass is needed. */ -static int split_needsplit(jit_State *J) -{ - IRIns *ir, *irend; - IRRef ref; - for (ir = IR(REF_FIRST), irend = IR(J->cur.nins); ir < irend; ir++) - if (LJ_SOFTFP ? irt_is64orfp(ir->t) : irt_isint64(ir->t)) - return 1; - if (LJ_SOFTFP) { - for (ref = J->chain[IR_SLOAD]; ref; ref = IR(ref)->prev) - if ((IR(ref)->op2 & IRSLOAD_CONVERT)) - return 1; - if (J->chain[IR_TOBIT]) - return 1; - } - for (ref = J->chain[IR_CONV]; ref; ref = IR(ref)->prev) { - IRType st = (IR(ref)->op2 & IRCONV_SRCMASK); - if ((LJ_SOFTFP && (st == IRT_NUM || st == IRT_FLOAT)) || - st == IRT_I64 || st == IRT_U64) - return 1; - } - return 0; /* Nope. */ -} -#endif - -/* SPLIT pass. */ -void lj_opt_split(jit_State *J) -{ -#if LJ_SOFTFP - if (!J->needsplit) - J->needsplit = split_needsplit(J); -#else - lua_assert(J->needsplit >= split_needsplit(J)); /* Verify flag. */ -#endif - if (J->needsplit) { - int errcode = lj_vm_cpcall(J->L, NULL, J, cpsplit); - if (errcode) { - /* Completely reset the trace to avoid inconsistent dump on abort. */ - J->cur.nins = J->cur.nk = REF_BASE; - J->cur.nsnap = 0; - lj_err_throw(J->L, errcode); /* Propagate errors. */ - } - } -} - -#undef IR - -#endif diff --git a/deps/luajit/src/lj_parse.c b/deps/luajit/src/lj_parse.c deleted file mode 100644 index abfac3c0..00000000 --- a/deps/luajit/src/lj_parse.c +++ /dev/null @@ -1,2754 +0,0 @@ -/* -** Lua parser (source code -> bytecode). -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -** -** Major portions taken verbatim or adapted from the Lua interpreter. -** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h -*/ - -#define lj_parse_c -#define LUA_CORE - -#include "lj_obj.h" -#include "lj_gc.h" -#include "lj_err.h" -#include "lj_debug.h" -#include "lj_str.h" -#include "lj_tab.h" -#include "lj_func.h" -#include "lj_state.h" -#include "lj_bc.h" -#if LJ_HASFFI -#include "lj_ctype.h" -#endif -#include "lj_lex.h" -#include "lj_parse.h" -#include "lj_vm.h" -#include "lj_vmevent.h" - -/* -- Parser structures and definitions ----------------------------------- */ - -/* Expression kinds. */ -typedef enum { - /* Constant expressions must be first and in this order: */ - VKNIL, - VKFALSE, - VKTRUE, - VKSTR, /* sval = string value */ - VKNUM, /* nval = number value */ - VKLAST = VKNUM, - VKCDATA, /* nval = cdata value, not treated as a constant expression */ - /* Non-constant expressions follow: */ - VLOCAL, /* info = local register, aux = vstack index */ - VUPVAL, /* info = upvalue index, aux = vstack index */ - VGLOBAL, /* sval = string value */ - VINDEXED, /* info = table register, aux = index reg/byte/string const */ - VJMP, /* info = instruction PC */ - VRELOCABLE, /* info = instruction PC */ - VNONRELOC, /* info = result register */ - VCALL, /* info = instruction PC, aux = base */ - VVOID -} ExpKind; - -/* Expression descriptor. */ -typedef struct ExpDesc { - union { - struct { - uint32_t info; /* Primary info. */ - uint32_t aux; /* Secondary info. */ - } s; - TValue nval; /* Number value. */ - GCstr *sval; /* String value. */ - } u; - ExpKind k; - BCPos t; /* True condition jump list. */ - BCPos f; /* False condition jump list. */ -} ExpDesc; - -/* Macros for expressions. */ -#define expr_hasjump(e) ((e)->t != (e)->f) - -#define expr_isk(e) ((e)->k <= VKLAST) -#define expr_isk_nojump(e) (expr_isk(e) && !expr_hasjump(e)) -#define expr_isnumk(e) ((e)->k == VKNUM) -#define expr_isnumk_nojump(e) (expr_isnumk(e) && !expr_hasjump(e)) -#define expr_isstrk(e) ((e)->k == VKSTR) - -#define expr_numtv(e) check_exp(expr_isnumk((e)), &(e)->u.nval) -#define expr_numberV(e) numberVnum(expr_numtv((e))) - -/* Initialize expression. */ -static LJ_AINLINE void expr_init(ExpDesc *e, ExpKind k, uint32_t info) -{ - e->k = k; - e->u.s.info = info; - e->f = e->t = NO_JMP; -} - -/* Check number constant for +-0. */ -static int expr_numiszero(ExpDesc *e) -{ - TValue *o = expr_numtv(e); - return tvisint(o) ? (intV(o) == 0) : tviszero(o); -} - -/* Per-function linked list of scope blocks. */ -typedef struct FuncScope { - struct FuncScope *prev; /* Link to outer scope. */ - MSize vstart; /* Start of block-local variables. */ - uint8_t nactvar; /* Number of active vars outside the scope. */ - uint8_t flags; /* Scope flags. */ -} FuncScope; - -#define FSCOPE_LOOP 0x01 /* Scope is a (breakable) loop. */ -#define FSCOPE_BREAK 0x02 /* Break used in scope. */ -#define FSCOPE_GOLA 0x04 /* Goto or label used in scope. */ -#define FSCOPE_UPVAL 0x08 /* Upvalue in scope. */ -#define FSCOPE_NOCLOSE 0x10 /* Do not close upvalues. */ - -#define NAME_BREAK ((GCstr *)(uintptr_t)1) - -/* Index into variable stack. */ -typedef uint16_t VarIndex; -#define LJ_MAX_VSTACK (65536 - LJ_MAX_UPVAL) - -/* Variable/goto/label info. */ -#define VSTACK_VAR_RW 0x01 /* R/W variable. */ -#define VSTACK_GOTO 0x02 /* Pending goto. */ -#define VSTACK_LABEL 0x04 /* Label. */ - -/* Per-function state. */ -typedef struct FuncState { - GCtab *kt; /* Hash table for constants. */ - LexState *ls; /* Lexer state. */ - lua_State *L; /* Lua state. */ - FuncScope *bl; /* Current scope. */ - struct FuncState *prev; /* Enclosing function. */ - BCPos pc; /* Next bytecode position. */ - BCPos lasttarget; /* Bytecode position of last jump target. */ - BCPos jpc; /* Pending jump list to next bytecode. */ - BCReg freereg; /* First free register. */ - BCReg nactvar; /* Number of active local variables. */ - BCReg nkn, nkgc; /* Number of lua_Number/GCobj constants */ - BCLine linedefined; /* First line of the function definition. */ - BCInsLine *bcbase; /* Base of bytecode stack. */ - BCPos bclim; /* Limit of bytecode stack. */ - MSize vbase; /* Base of variable stack for this function. */ - uint8_t flags; /* Prototype flags. */ - uint8_t numparams; /* Number of parameters. */ - uint8_t framesize; /* Fixed frame size. */ - uint8_t nuv; /* Number of upvalues */ - VarIndex varmap[LJ_MAX_LOCVAR]; /* Map from register to variable idx. */ - VarIndex uvmap[LJ_MAX_UPVAL]; /* Map from upvalue to variable idx. */ - VarIndex uvtmp[LJ_MAX_UPVAL]; /* Temporary upvalue map. */ -} FuncState; - -/* Binary and unary operators. ORDER OPR */ -typedef enum BinOpr { - OPR_ADD, OPR_SUB, OPR_MUL, OPR_DIV, OPR_MOD, OPR_POW, /* ORDER ARITH */ - OPR_CONCAT, - OPR_NE, OPR_EQ, - OPR_LT, OPR_GE, OPR_LE, OPR_GT, - OPR_AND, OPR_OR, - OPR_NOBINOPR -} BinOpr; - -LJ_STATIC_ASSERT((int)BC_ISGE-(int)BC_ISLT == (int)OPR_GE-(int)OPR_LT); -LJ_STATIC_ASSERT((int)BC_ISLE-(int)BC_ISLT == (int)OPR_LE-(int)OPR_LT); -LJ_STATIC_ASSERT((int)BC_ISGT-(int)BC_ISLT == (int)OPR_GT-(int)OPR_LT); -LJ_STATIC_ASSERT((int)BC_SUBVV-(int)BC_ADDVV == (int)OPR_SUB-(int)OPR_ADD); -LJ_STATIC_ASSERT((int)BC_MULVV-(int)BC_ADDVV == (int)OPR_MUL-(int)OPR_ADD); -LJ_STATIC_ASSERT((int)BC_DIVVV-(int)BC_ADDVV == (int)OPR_DIV-(int)OPR_ADD); -LJ_STATIC_ASSERT((int)BC_MODVV-(int)BC_ADDVV == (int)OPR_MOD-(int)OPR_ADD); - -/* -- Error handling ------------------------------------------------------ */ - -LJ_NORET LJ_NOINLINE static void err_syntax(LexState *ls, ErrMsg em) -{ - lj_lex_error(ls, ls->token, em); -} - -LJ_NORET LJ_NOINLINE static void err_token(LexState *ls, LexToken token) -{ - lj_lex_error(ls, ls->token, LJ_ERR_XTOKEN, lj_lex_token2str(ls, token)); -} - -LJ_NORET static void err_limit(FuncState *fs, uint32_t limit, const char *what) -{ - if (fs->linedefined == 0) - lj_lex_error(fs->ls, 0, LJ_ERR_XLIMM, limit, what); - else - lj_lex_error(fs->ls, 0, LJ_ERR_XLIMF, fs->linedefined, limit, what); -} - -#define checklimit(fs, v, l, m) if ((v) >= (l)) err_limit(fs, l, m) -#define checklimitgt(fs, v, l, m) if ((v) > (l)) err_limit(fs, l, m) -#define checkcond(ls, c, em) { if (!(c)) err_syntax(ls, em); } - -/* -- Management of constants --------------------------------------------- */ - -/* Return bytecode encoding for primitive constant. */ -#define const_pri(e) check_exp((e)->k <= VKTRUE, (e)->k) - -#define tvhaskslot(o) ((o)->u32.hi == 0) -#define tvkslot(o) ((o)->u32.lo) - -/* Add a number constant. */ -static BCReg const_num(FuncState *fs, ExpDesc *e) -{ - lua_State *L = fs->L; - TValue *o; - lua_assert(expr_isnumk(e)); - o = lj_tab_set(L, fs->kt, &e->u.nval); - if (tvhaskslot(o)) - return tvkslot(o); - o->u64 = fs->nkn; - return fs->nkn++; -} - -/* Add a GC object constant. */ -static BCReg const_gc(FuncState *fs, GCobj *gc, uint32_t itype) -{ - lua_State *L = fs->L; - TValue key, *o; - setgcV(L, &key, gc, itype); - /* NOBARRIER: the key is new or kept alive. */ - o = lj_tab_set(L, fs->kt, &key); - if (tvhaskslot(o)) - return tvkslot(o); - o->u64 = fs->nkgc; - return fs->nkgc++; -} - -/* Add a string constant. */ -static BCReg const_str(FuncState *fs, ExpDesc *e) -{ - lua_assert(expr_isstrk(e) || e->k == VGLOBAL); - return const_gc(fs, obj2gco(e->u.sval), LJ_TSTR); -} - -/* Anchor string constant to avoid GC. */ -GCstr *lj_parse_keepstr(LexState *ls, const char *str, size_t len) -{ - /* NOBARRIER: the key is new or kept alive. */ - lua_State *L = ls->L; - GCstr *s = lj_str_new(L, str, len); - TValue *tv = lj_tab_setstr(L, ls->fs->kt, s); - if (tvisnil(tv)) setboolV(tv, 1); - lj_gc_check(L); - return s; -} - -#if LJ_HASFFI -/* Anchor cdata to avoid GC. */ -void lj_parse_keepcdata(LexState *ls, TValue *tv, GCcdata *cd) -{ - /* NOBARRIER: the key is new or kept alive. */ - lua_State *L = ls->L; - setcdataV(L, tv, cd); - setboolV(lj_tab_set(L, ls->fs->kt, tv), 1); -} -#endif - -/* -- Jump list handling -------------------------------------------------- */ - -/* Get next element in jump list. */ -static BCPos jmp_next(FuncState *fs, BCPos pc) -{ - ptrdiff_t delta = bc_j(fs->bcbase[pc].ins); - if ((BCPos)delta == NO_JMP) - return NO_JMP; - else - return (BCPos)(((ptrdiff_t)pc+1)+delta); -} - -/* Check if any of the instructions on the jump list produce no value. */ -static int jmp_novalue(FuncState *fs, BCPos list) -{ - for (; list != NO_JMP; list = jmp_next(fs, list)) { - BCIns p = fs->bcbase[list >= 1 ? list-1 : list].ins; - if (!(bc_op(p) == BC_ISTC || bc_op(p) == BC_ISFC || bc_a(p) == NO_REG)) - return 1; - } - return 0; -} - -/* Patch register of test instructions. */ -static int jmp_patchtestreg(FuncState *fs, BCPos pc, BCReg reg) -{ - BCInsLine *ilp = &fs->bcbase[pc >= 1 ? pc-1 : pc]; - BCOp op = bc_op(ilp->ins); - if (op == BC_ISTC || op == BC_ISFC) { - if (reg != NO_REG && reg != bc_d(ilp->ins)) { - setbc_a(&ilp->ins, reg); - } else { /* Nothing to store or already in the right register. */ - setbc_op(&ilp->ins, op+(BC_IST-BC_ISTC)); - setbc_a(&ilp->ins, 0); - } - } else if (bc_a(ilp->ins) == NO_REG) { - if (reg == NO_REG) { - ilp->ins = BCINS_AJ(BC_JMP, bc_a(fs->bcbase[pc].ins), 0); - } else { - setbc_a(&ilp->ins, reg); - if (reg >= bc_a(ilp[1].ins)) - setbc_a(&ilp[1].ins, reg+1); - } - } else { - return 0; /* Cannot patch other instructions. */ - } - return 1; -} - -/* Drop values for all instructions on jump list. */ -static void jmp_dropval(FuncState *fs, BCPos list) -{ - for (; list != NO_JMP; list = jmp_next(fs, list)) - jmp_patchtestreg(fs, list, NO_REG); -} - -/* Patch jump instruction to target. */ -static void jmp_patchins(FuncState *fs, BCPos pc, BCPos dest) -{ - BCIns *jmp = &fs->bcbase[pc].ins; - BCPos offset = dest-(pc+1)+BCBIAS_J; - lua_assert(dest != NO_JMP); - if (offset > BCMAX_D) - err_syntax(fs->ls, LJ_ERR_XJUMP); - setbc_d(jmp, offset); -} - -/* Append to jump list. */ -static void jmp_append(FuncState *fs, BCPos *l1, BCPos l2) -{ - if (l2 == NO_JMP) { - return; - } else if (*l1 == NO_JMP) { - *l1 = l2; - } else { - BCPos list = *l1; - BCPos next; - while ((next = jmp_next(fs, list)) != NO_JMP) /* Find last element. */ - list = next; - jmp_patchins(fs, list, l2); - } -} - -/* Patch jump list and preserve produced values. */ -static void jmp_patchval(FuncState *fs, BCPos list, BCPos vtarget, - BCReg reg, BCPos dtarget) -{ - while (list != NO_JMP) { - BCPos next = jmp_next(fs, list); - if (jmp_patchtestreg(fs, list, reg)) - jmp_patchins(fs, list, vtarget); /* Jump to target with value. */ - else - jmp_patchins(fs, list, dtarget); /* Jump to default target. */ - list = next; - } -} - -/* Jump to following instruction. Append to list of pending jumps. */ -static void jmp_tohere(FuncState *fs, BCPos list) -{ - fs->lasttarget = fs->pc; - jmp_append(fs, &fs->jpc, list); -} - -/* Patch jump list to target. */ -static void jmp_patch(FuncState *fs, BCPos list, BCPos target) -{ - if (target == fs->pc) { - jmp_tohere(fs, list); - } else { - lua_assert(target < fs->pc); - jmp_patchval(fs, list, target, NO_REG, target); - } -} - -/* -- Bytecode register allocator ----------------------------------------- */ - -/* Bump frame size. */ -static void bcreg_bump(FuncState *fs, BCReg n) -{ - BCReg sz = fs->freereg + n; - if (sz > fs->framesize) { - if (sz >= LJ_MAX_SLOTS) - err_syntax(fs->ls, LJ_ERR_XSLOTS); - fs->framesize = (uint8_t)sz; - } -} - -/* Reserve registers. */ -static void bcreg_reserve(FuncState *fs, BCReg n) -{ - bcreg_bump(fs, n); - fs->freereg += n; -} - -/* Free register. */ -static void bcreg_free(FuncState *fs, BCReg reg) -{ - if (reg >= fs->nactvar) { - fs->freereg--; - lua_assert(reg == fs->freereg); - } -} - -/* Free register for expression. */ -static void expr_free(FuncState *fs, ExpDesc *e) -{ - if (e->k == VNONRELOC) - bcreg_free(fs, e->u.s.info); -} - -/* -- Bytecode emitter ---------------------------------------------------- */ - -/* Emit bytecode instruction. */ -static BCPos bcemit_INS(FuncState *fs, BCIns ins) -{ - BCPos pc = fs->pc; - LexState *ls = fs->ls; - jmp_patchval(fs, fs->jpc, pc, NO_REG, pc); - fs->jpc = NO_JMP; - if (LJ_UNLIKELY(pc >= fs->bclim)) { - ptrdiff_t base = fs->bcbase - ls->bcstack; - checklimit(fs, ls->sizebcstack, LJ_MAX_BCINS, "bytecode instructions"); - lj_mem_growvec(fs->L, ls->bcstack, ls->sizebcstack, LJ_MAX_BCINS,BCInsLine); - fs->bclim = (BCPos)(ls->sizebcstack - base); - fs->bcbase = ls->bcstack + base; - } - fs->bcbase[pc].ins = ins; - fs->bcbase[pc].line = ls->lastline; - fs->pc = pc+1; - return pc; -} - -#define bcemit_ABC(fs, o, a, b, c) bcemit_INS(fs, BCINS_ABC(o, a, b, c)) -#define bcemit_AD(fs, o, a, d) bcemit_INS(fs, BCINS_AD(o, a, d)) -#define bcemit_AJ(fs, o, a, j) bcemit_INS(fs, BCINS_AJ(o, a, j)) - -#define bcptr(fs, e) (&(fs)->bcbase[(e)->u.s.info].ins) - -/* -- Bytecode emitter for expressions ------------------------------------ */ - -/* Discharge non-constant expression to any register. */ -static void expr_discharge(FuncState *fs, ExpDesc *e) -{ - BCIns ins; - if (e->k == VUPVAL) { - ins = BCINS_AD(BC_UGET, 0, e->u.s.info); - } else if (e->k == VGLOBAL) { - ins = BCINS_AD(BC_GGET, 0, const_str(fs, e)); - } else if (e->k == VINDEXED) { - BCReg rc = e->u.s.aux; - if ((int32_t)rc < 0) { - ins = BCINS_ABC(BC_TGETS, 0, e->u.s.info, ~rc); - } else if (rc > BCMAX_C) { - ins = BCINS_ABC(BC_TGETB, 0, e->u.s.info, rc-(BCMAX_C+1)); - } else { - bcreg_free(fs, rc); - ins = BCINS_ABC(BC_TGETV, 0, e->u.s.info, rc); - } - bcreg_free(fs, e->u.s.info); - } else if (e->k == VCALL) { - e->u.s.info = e->u.s.aux; - e->k = VNONRELOC; - return; - } else if (e->k == VLOCAL) { - e->k = VNONRELOC; - return; - } else { - return; - } - e->u.s.info = bcemit_INS(fs, ins); - e->k = VRELOCABLE; -} - -/* Emit bytecode to set a range of registers to nil. */ -static void bcemit_nil(FuncState *fs, BCReg from, BCReg n) -{ - if (fs->pc > fs->lasttarget) { /* No jumps to current position? */ - BCIns *ip = &fs->bcbase[fs->pc-1].ins; - BCReg pto, pfrom = bc_a(*ip); - switch (bc_op(*ip)) { /* Try to merge with the previous instruction. */ - case BC_KPRI: - if (bc_d(*ip) != ~LJ_TNIL) break; - if (from == pfrom) { - if (n == 1) return; - } else if (from == pfrom+1) { - from = pfrom; - n++; - } else { - break; - } - *ip = BCINS_AD(BC_KNIL, from, from+n-1); /* Replace KPRI. */ - return; - case BC_KNIL: - pto = bc_d(*ip); - if (pfrom <= from && from <= pto+1) { /* Can we connect both ranges? */ - if (from+n-1 > pto) - setbc_d(ip, from+n-1); /* Patch previous instruction range. */ - return; - } - break; - default: - break; - } - } - /* Emit new instruction or replace old instruction. */ - bcemit_INS(fs, n == 1 ? BCINS_AD(BC_KPRI, from, VKNIL) : - BCINS_AD(BC_KNIL, from, from+n-1)); -} - -/* Discharge an expression to a specific register. Ignore branches. */ -static void expr_toreg_nobranch(FuncState *fs, ExpDesc *e, BCReg reg) -{ - BCIns ins; - expr_discharge(fs, e); - if (e->k == VKSTR) { - ins = BCINS_AD(BC_KSTR, reg, const_str(fs, e)); - } else if (e->k == VKNUM) { -#if LJ_DUALNUM - cTValue *tv = expr_numtv(e); - if (tvisint(tv) && checki16(intV(tv))) - ins = BCINS_AD(BC_KSHORT, reg, (BCReg)(uint16_t)intV(tv)); - else -#else - lua_Number n = expr_numberV(e); - int32_t k = lj_num2int(n); - if (checki16(k) && n == (lua_Number)k) - ins = BCINS_AD(BC_KSHORT, reg, (BCReg)(uint16_t)k); - else -#endif - ins = BCINS_AD(BC_KNUM, reg, const_num(fs, e)); -#if LJ_HASFFI - } else if (e->k == VKCDATA) { - fs->flags |= PROTO_FFI; - ins = BCINS_AD(BC_KCDATA, reg, - const_gc(fs, obj2gco(cdataV(&e->u.nval)), LJ_TCDATA)); -#endif - } else if (e->k == VRELOCABLE) { - setbc_a(bcptr(fs, e), reg); - goto noins; - } else if (e->k == VNONRELOC) { - if (reg == e->u.s.info) - goto noins; - ins = BCINS_AD(BC_MOV, reg, e->u.s.info); - } else if (e->k == VKNIL) { - bcemit_nil(fs, reg, 1); - goto noins; - } else if (e->k <= VKTRUE) { - ins = BCINS_AD(BC_KPRI, reg, const_pri(e)); - } else { - lua_assert(e->k == VVOID || e->k == VJMP); - return; - } - bcemit_INS(fs, ins); -noins: - e->u.s.info = reg; - e->k = VNONRELOC; -} - -/* Forward declaration. */ -static BCPos bcemit_jmp(FuncState *fs); - -/* Discharge an expression to a specific register. */ -static void expr_toreg(FuncState *fs, ExpDesc *e, BCReg reg) -{ - expr_toreg_nobranch(fs, e, reg); - if (e->k == VJMP) - jmp_append(fs, &e->t, e->u.s.info); /* Add it to the true jump list. */ - if (expr_hasjump(e)) { /* Discharge expression with branches. */ - BCPos jend, jfalse = NO_JMP, jtrue = NO_JMP; - if (jmp_novalue(fs, e->t) || jmp_novalue(fs, e->f)) { - BCPos jval = (e->k == VJMP) ? NO_JMP : bcemit_jmp(fs); - jfalse = bcemit_AD(fs, BC_KPRI, reg, VKFALSE); - bcemit_AJ(fs, BC_JMP, fs->freereg, 1); - jtrue = bcemit_AD(fs, BC_KPRI, reg, VKTRUE); - jmp_tohere(fs, jval); - } - jend = fs->pc; - fs->lasttarget = jend; - jmp_patchval(fs, e->f, jend, reg, jfalse); - jmp_patchval(fs, e->t, jend, reg, jtrue); - } - e->f = e->t = NO_JMP; - e->u.s.info = reg; - e->k = VNONRELOC; -} - -/* Discharge an expression to the next free register. */ -static void expr_tonextreg(FuncState *fs, ExpDesc *e) -{ - expr_discharge(fs, e); - expr_free(fs, e); - bcreg_reserve(fs, 1); - expr_toreg(fs, e, fs->freereg - 1); -} - -/* Discharge an expression to any register. */ -static BCReg expr_toanyreg(FuncState *fs, ExpDesc *e) -{ - expr_discharge(fs, e); - if (e->k == VNONRELOC) { - if (!expr_hasjump(e)) return e->u.s.info; /* Already in a register. */ - if (e->u.s.info >= fs->nactvar) { - expr_toreg(fs, e, e->u.s.info); /* Discharge to temp. register. */ - return e->u.s.info; - } - } - expr_tonextreg(fs, e); /* Discharge to next register. */ - return e->u.s.info; -} - -/* Partially discharge expression to a value. */ -static void expr_toval(FuncState *fs, ExpDesc *e) -{ - if (expr_hasjump(e)) - expr_toanyreg(fs, e); - else - expr_discharge(fs, e); -} - -/* Emit store for LHS expression. */ -static void bcemit_store(FuncState *fs, ExpDesc *var, ExpDesc *e) -{ - BCIns ins; - if (var->k == VLOCAL) { - fs->ls->vstack[var->u.s.aux].info |= VSTACK_VAR_RW; - expr_free(fs, e); - expr_toreg(fs, e, var->u.s.info); - return; - } else if (var->k == VUPVAL) { - fs->ls->vstack[var->u.s.aux].info |= VSTACK_VAR_RW; - expr_toval(fs, e); - if (e->k <= VKTRUE) - ins = BCINS_AD(BC_USETP, var->u.s.info, const_pri(e)); - else if (e->k == VKSTR) - ins = BCINS_AD(BC_USETS, var->u.s.info, const_str(fs, e)); - else if (e->k == VKNUM) - ins = BCINS_AD(BC_USETN, var->u.s.info, const_num(fs, e)); - else - ins = BCINS_AD(BC_USETV, var->u.s.info, expr_toanyreg(fs, e)); - } else if (var->k == VGLOBAL) { - BCReg ra = expr_toanyreg(fs, e); - ins = BCINS_AD(BC_GSET, ra, const_str(fs, var)); - } else { - BCReg ra, rc; - lua_assert(var->k == VINDEXED); - ra = expr_toanyreg(fs, e); - rc = var->u.s.aux; - if ((int32_t)rc < 0) { - ins = BCINS_ABC(BC_TSETS, ra, var->u.s.info, ~rc); - } else if (rc > BCMAX_C) { - ins = BCINS_ABC(BC_TSETB, ra, var->u.s.info, rc-(BCMAX_C+1)); - } else { - /* Free late alloced key reg to avoid assert on free of value reg. */ - /* This can only happen when called from expr_table(). */ - lua_assert(e->k != VNONRELOC || ra < fs->nactvar || - rc < ra || (bcreg_free(fs, rc),1)); - ins = BCINS_ABC(BC_TSETV, ra, var->u.s.info, rc); - } - } - bcemit_INS(fs, ins); - expr_free(fs, e); -} - -/* Emit method lookup expression. */ -static void bcemit_method(FuncState *fs, ExpDesc *e, ExpDesc *key) -{ - BCReg idx, func, obj = expr_toanyreg(fs, e); - expr_free(fs, e); - func = fs->freereg; - bcemit_AD(fs, BC_MOV, func+1, obj); /* Copy object to first argument. */ - lua_assert(expr_isstrk(key)); - idx = const_str(fs, key); - if (idx <= BCMAX_C) { - bcreg_reserve(fs, 2); - bcemit_ABC(fs, BC_TGETS, func, obj, idx); - } else { - bcreg_reserve(fs, 3); - bcemit_AD(fs, BC_KSTR, func+2, idx); - bcemit_ABC(fs, BC_TGETV, func, obj, func+2); - fs->freereg--; - } - e->u.s.info = func; - e->k = VNONRELOC; -} - -/* -- Bytecode emitter for branches --------------------------------------- */ - -/* Emit unconditional branch. */ -static BCPos bcemit_jmp(FuncState *fs) -{ - BCPos jpc = fs->jpc; - BCPos j = fs->pc - 1; - BCIns *ip = &fs->bcbase[j].ins; - fs->jpc = NO_JMP; - if ((int32_t)j >= (int32_t)fs->lasttarget && bc_op(*ip) == BC_UCLO) { - setbc_j(ip, NO_JMP); - fs->lasttarget = j+1; - } else { - j = bcemit_AJ(fs, BC_JMP, fs->freereg, NO_JMP); - } - jmp_append(fs, &j, jpc); - return j; -} - -/* Invert branch condition of bytecode instruction. */ -static void invertcond(FuncState *fs, ExpDesc *e) -{ - BCIns *ip = &fs->bcbase[e->u.s.info - 1].ins; - setbc_op(ip, bc_op(*ip)^1); -} - -/* Emit conditional branch. */ -static BCPos bcemit_branch(FuncState *fs, ExpDesc *e, int cond) -{ - BCPos pc; - if (e->k == VRELOCABLE) { - BCIns *ip = bcptr(fs, e); - if (bc_op(*ip) == BC_NOT) { - *ip = BCINS_AD(cond ? BC_ISF : BC_IST, 0, bc_d(*ip)); - return bcemit_jmp(fs); - } - } - if (e->k != VNONRELOC) { - bcreg_reserve(fs, 1); - expr_toreg_nobranch(fs, e, fs->freereg-1); - } - bcemit_AD(fs, cond ? BC_ISTC : BC_ISFC, NO_REG, e->u.s.info); - pc = bcemit_jmp(fs); - expr_free(fs, e); - return pc; -} - -/* Emit branch on true condition. */ -static void bcemit_branch_t(FuncState *fs, ExpDesc *e) -{ - BCPos pc; - expr_discharge(fs, e); - if (e->k == VKSTR || e->k == VKNUM || e->k == VKTRUE) - pc = NO_JMP; /* Never jump. */ - else if (e->k == VJMP) - invertcond(fs, e), pc = e->u.s.info; - else if (e->k == VKFALSE || e->k == VKNIL) - expr_toreg_nobranch(fs, e, NO_REG), pc = bcemit_jmp(fs); - else - pc = bcemit_branch(fs, e, 0); - jmp_append(fs, &e->f, pc); - jmp_tohere(fs, e->t); - e->t = NO_JMP; -} - -/* Emit branch on false condition. */ -static void bcemit_branch_f(FuncState *fs, ExpDesc *e) -{ - BCPos pc; - expr_discharge(fs, e); - if (e->k == VKNIL || e->k == VKFALSE) - pc = NO_JMP; /* Never jump. */ - else if (e->k == VJMP) - pc = e->u.s.info; - else if (e->k == VKSTR || e->k == VKNUM || e->k == VKTRUE) - expr_toreg_nobranch(fs, e, NO_REG), pc = bcemit_jmp(fs); - else - pc = bcemit_branch(fs, e, 1); - jmp_append(fs, &e->t, pc); - jmp_tohere(fs, e->f); - e->f = NO_JMP; -} - -/* -- Bytecode emitter for operators -------------------------------------- */ - -/* Try constant-folding of arithmetic operators. */ -static int foldarith(BinOpr opr, ExpDesc *e1, ExpDesc *e2) -{ - TValue o; - lua_Number n; - if (!expr_isnumk_nojump(e1) || !expr_isnumk_nojump(e2)) return 0; - n = lj_vm_foldarith(expr_numberV(e1), expr_numberV(e2), (int)opr-OPR_ADD); - setnumV(&o, n); - if (tvisnan(&o) || tvismzero(&o)) return 0; /* Avoid NaN and -0 as consts. */ - if (LJ_DUALNUM) { - int32_t k = lj_num2int(n); - if ((lua_Number)k == n) { - setintV(&e1->u.nval, k); - return 1; - } - } - setnumV(&e1->u.nval, n); - return 1; -} - -/* Emit arithmetic operator. */ -static void bcemit_arith(FuncState *fs, BinOpr opr, ExpDesc *e1, ExpDesc *e2) -{ - BCReg rb, rc, t; - uint32_t op; - if (foldarith(opr, e1, e2)) - return; - if (opr == OPR_POW) { - op = BC_POW; - rc = expr_toanyreg(fs, e2); - rb = expr_toanyreg(fs, e1); - } else { - op = opr-OPR_ADD+BC_ADDVV; - /* Must discharge 2nd operand first since VINDEXED might free regs. */ - expr_toval(fs, e2); - if (expr_isnumk(e2) && (rc = const_num(fs, e2)) <= BCMAX_C) - op -= BC_ADDVV-BC_ADDVN; - else - rc = expr_toanyreg(fs, e2); - /* 1st operand discharged by bcemit_binop_left, but need KNUM/KSHORT. */ - lua_assert(expr_isnumk(e1) || e1->k == VNONRELOC); - expr_toval(fs, e1); - /* Avoid two consts to satisfy bytecode constraints. */ - if (expr_isnumk(e1) && !expr_isnumk(e2) && - (t = const_num(fs, e1)) <= BCMAX_B) { - rb = rc; rc = t; op -= BC_ADDVV-BC_ADDNV; - } else { - rb = expr_toanyreg(fs, e1); - } - } - /* Using expr_free might cause asserts if the order is wrong. */ - if (e1->k == VNONRELOC && e1->u.s.info >= fs->nactvar) fs->freereg--; - if (e2->k == VNONRELOC && e2->u.s.info >= fs->nactvar) fs->freereg--; - e1->u.s.info = bcemit_ABC(fs, op, 0, rb, rc); - e1->k = VRELOCABLE; -} - -/* Emit comparison operator. */ -static void bcemit_comp(FuncState *fs, BinOpr opr, ExpDesc *e1, ExpDesc *e2) -{ - ExpDesc *eret = e1; - BCIns ins; - expr_toval(fs, e1); - if (opr == OPR_EQ || opr == OPR_NE) { - BCOp op = opr == OPR_EQ ? BC_ISEQV : BC_ISNEV; - BCReg ra; - if (expr_isk(e1)) { e1 = e2; e2 = eret; } /* Need constant in 2nd arg. */ - ra = expr_toanyreg(fs, e1); /* First arg must be in a reg. */ - expr_toval(fs, e2); - switch (e2->k) { - case VKNIL: case VKFALSE: case VKTRUE: - ins = BCINS_AD(op+(BC_ISEQP-BC_ISEQV), ra, const_pri(e2)); - break; - case VKSTR: - ins = BCINS_AD(op+(BC_ISEQS-BC_ISEQV), ra, const_str(fs, e2)); - break; - case VKNUM: - ins = BCINS_AD(op+(BC_ISEQN-BC_ISEQV), ra, const_num(fs, e2)); - break; - default: - ins = BCINS_AD(op, ra, expr_toanyreg(fs, e2)); - break; - } - } else { - uint32_t op = opr-OPR_LT+BC_ISLT; - BCReg ra, rd; - if ((op-BC_ISLT) & 1) { /* GT -> LT, GE -> LE */ - e1 = e2; e2 = eret; /* Swap operands. */ - op = ((op-BC_ISLT)^3)+BC_ISLT; - expr_toval(fs, e1); - } - rd = expr_toanyreg(fs, e2); - ra = expr_toanyreg(fs, e1); - ins = BCINS_AD(op, ra, rd); - } - /* Using expr_free might cause asserts if the order is wrong. */ - if (e1->k == VNONRELOC && e1->u.s.info >= fs->nactvar) fs->freereg--; - if (e2->k == VNONRELOC && e2->u.s.info >= fs->nactvar) fs->freereg--; - bcemit_INS(fs, ins); - eret->u.s.info = bcemit_jmp(fs); - eret->k = VJMP; -} - -/* Fixup left side of binary operator. */ -static void bcemit_binop_left(FuncState *fs, BinOpr op, ExpDesc *e) -{ - if (op == OPR_AND) { - bcemit_branch_t(fs, e); - } else if (op == OPR_OR) { - bcemit_branch_f(fs, e); - } else if (op == OPR_CONCAT) { - expr_tonextreg(fs, e); - } else if (op == OPR_EQ || op == OPR_NE) { - if (!expr_isk_nojump(e)) expr_toanyreg(fs, e); - } else { - if (!expr_isnumk_nojump(e)) expr_toanyreg(fs, e); - } -} - -/* Emit binary operator. */ -static void bcemit_binop(FuncState *fs, BinOpr op, ExpDesc *e1, ExpDesc *e2) -{ - if (op <= OPR_POW) { - bcemit_arith(fs, op, e1, e2); - } else if (op == OPR_AND) { - lua_assert(e1->t == NO_JMP); /* List must be closed. */ - expr_discharge(fs, e2); - jmp_append(fs, &e2->f, e1->f); - *e1 = *e2; - } else if (op == OPR_OR) { - lua_assert(e1->f == NO_JMP); /* List must be closed. */ - expr_discharge(fs, e2); - jmp_append(fs, &e2->t, e1->t); - *e1 = *e2; - } else if (op == OPR_CONCAT) { - expr_toval(fs, e2); - if (e2->k == VRELOCABLE && bc_op(*bcptr(fs, e2)) == BC_CAT) { - lua_assert(e1->u.s.info == bc_b(*bcptr(fs, e2))-1); - expr_free(fs, e1); - setbc_b(bcptr(fs, e2), e1->u.s.info); - e1->u.s.info = e2->u.s.info; - } else { - expr_tonextreg(fs, e2); - expr_free(fs, e2); - expr_free(fs, e1); - e1->u.s.info = bcemit_ABC(fs, BC_CAT, 0, e1->u.s.info, e2->u.s.info); - } - e1->k = VRELOCABLE; - } else { - lua_assert(op == OPR_NE || op == OPR_EQ || - op == OPR_LT || op == OPR_GE || op == OPR_LE || op == OPR_GT); - bcemit_comp(fs, op, e1, e2); - } -} - -/* Emit unary operator. */ -static void bcemit_unop(FuncState *fs, BCOp op, ExpDesc *e) -{ - if (op == BC_NOT) { - /* Swap true and false lists. */ - { BCPos temp = e->f; e->f = e->t; e->t = temp; } - jmp_dropval(fs, e->f); - jmp_dropval(fs, e->t); - expr_discharge(fs, e); - if (e->k == VKNIL || e->k == VKFALSE) { - e->k = VKTRUE; - return; - } else if (expr_isk(e) || (LJ_HASFFI && e->k == VKCDATA)) { - e->k = VKFALSE; - return; - } else if (e->k == VJMP) { - invertcond(fs, e); - return; - } else if (e->k == VRELOCABLE) { - bcreg_reserve(fs, 1); - setbc_a(bcptr(fs, e), fs->freereg-1); - e->u.s.info = fs->freereg-1; - e->k = VNONRELOC; - } else { - lua_assert(e->k == VNONRELOC); - } - } else { - lua_assert(op == BC_UNM || op == BC_LEN); - if (op == BC_UNM && !expr_hasjump(e)) { /* Constant-fold negations. */ -#if LJ_HASFFI - if (e->k == VKCDATA) { /* Fold in-place since cdata is not interned. */ - GCcdata *cd = cdataV(&e->u.nval); - int64_t *p = (int64_t *)cdataptr(cd); - if (cd->ctypeid == CTID_COMPLEX_DOUBLE) - p[1] ^= (int64_t)U64x(80000000,00000000); - else - *p = -*p; - return; - } else -#endif - if (expr_isnumk(e) && !expr_numiszero(e)) { /* Avoid folding to -0. */ - TValue *o = expr_numtv(e); - if (tvisint(o)) { - int32_t k = intV(o); - if (k == -k) - setnumV(o, -(lua_Number)k); - else - setintV(o, -k); - return; - } else { - o->u64 ^= U64x(80000000,00000000); - return; - } - } - } - expr_toanyreg(fs, e); - } - expr_free(fs, e); - e->u.s.info = bcemit_AD(fs, op, 0, e->u.s.info); - e->k = VRELOCABLE; -} - -/* -- Lexer support ------------------------------------------------------- */ - -/* Check and consume optional token. */ -static int lex_opt(LexState *ls, LexToken tok) -{ - if (ls->token == tok) { - lj_lex_next(ls); - return 1; - } - return 0; -} - -/* Check and consume token. */ -static void lex_check(LexState *ls, LexToken tok) -{ - if (ls->token != tok) - err_token(ls, tok); - lj_lex_next(ls); -} - -/* Check for matching token. */ -static void lex_match(LexState *ls, LexToken what, LexToken who, BCLine line) -{ - if (!lex_opt(ls, what)) { - if (line == ls->linenumber) { - err_token(ls, what); - } else { - const char *swhat = lj_lex_token2str(ls, what); - const char *swho = lj_lex_token2str(ls, who); - lj_lex_error(ls, ls->token, LJ_ERR_XMATCH, swhat, swho, line); - } - } -} - -/* Check for string token. */ -static GCstr *lex_str(LexState *ls) -{ - GCstr *s; - if (ls->token != TK_name && (LJ_52 || ls->token != TK_goto)) - err_token(ls, TK_name); - s = strV(&ls->tokenval); - lj_lex_next(ls); - return s; -} - -/* -- Variable handling --------------------------------------------------- */ - -#define var_get(ls, fs, i) ((ls)->vstack[(fs)->varmap[(i)]]) - -/* Define a new local variable. */ -static void var_new(LexState *ls, BCReg n, GCstr *name) -{ - FuncState *fs = ls->fs; - MSize vtop = ls->vtop; - checklimit(fs, fs->nactvar+n, LJ_MAX_LOCVAR, "local variables"); - if (LJ_UNLIKELY(vtop >= ls->sizevstack)) { - if (ls->sizevstack >= LJ_MAX_VSTACK) - lj_lex_error(ls, 0, LJ_ERR_XLIMC, LJ_MAX_VSTACK); - lj_mem_growvec(ls->L, ls->vstack, ls->sizevstack, LJ_MAX_VSTACK, VarInfo); - } - lua_assert((uintptr_t)name < VARNAME__MAX || - lj_tab_getstr(fs->kt, name) != NULL); - /* NOBARRIER: name is anchored in fs->kt and ls->vstack is not a GCobj. */ - setgcref(ls->vstack[vtop].name, obj2gco(name)); - fs->varmap[fs->nactvar+n] = (uint16_t)vtop; - ls->vtop = vtop+1; -} - -#define var_new_lit(ls, n, v) \ - var_new(ls, (n), lj_parse_keepstr(ls, "" v, sizeof(v)-1)) - -#define var_new_fixed(ls, n, vn) \ - var_new(ls, (n), (GCstr *)(uintptr_t)(vn)) - -/* Add local variables. */ -static void var_add(LexState *ls, BCReg nvars) -{ - FuncState *fs = ls->fs; - BCReg nactvar = fs->nactvar; - while (nvars--) { - VarInfo *v = &var_get(ls, fs, nactvar); - v->startpc = fs->pc; - v->slot = nactvar++; - v->info = 0; - } - fs->nactvar = nactvar; -} - -/* Remove local variables. */ -static void var_remove(LexState *ls, BCReg tolevel) -{ - FuncState *fs = ls->fs; - while (fs->nactvar > tolevel) - var_get(ls, fs, --fs->nactvar).endpc = fs->pc; -} - -/* Lookup local variable name. */ -static BCReg var_lookup_local(FuncState *fs, GCstr *n) -{ - int i; - for (i = fs->nactvar-1; i >= 0; i--) { - if (n == strref(var_get(fs->ls, fs, i).name)) - return (BCReg)i; - } - return (BCReg)-1; /* Not found. */ -} - -/* Lookup or add upvalue index. */ -static MSize var_lookup_uv(FuncState *fs, MSize vidx, ExpDesc *e) -{ - MSize i, n = fs->nuv; - for (i = 0; i < n; i++) - if (fs->uvmap[i] == vidx) - return i; /* Already exists. */ - /* Otherwise create a new one. */ - checklimit(fs, fs->nuv, LJ_MAX_UPVAL, "upvalues"); - lua_assert(e->k == VLOCAL || e->k == VUPVAL); - fs->uvmap[n] = (uint16_t)vidx; - fs->uvtmp[n] = (uint16_t)(e->k == VLOCAL ? vidx : LJ_MAX_VSTACK+e->u.s.info); - fs->nuv = n+1; - return n; -} - -/* Forward declaration. */ -static void fscope_uvmark(FuncState *fs, BCReg level); - -/* Recursively lookup variables in enclosing functions. */ -static MSize var_lookup_(FuncState *fs, GCstr *name, ExpDesc *e, int first) -{ - if (fs) { - BCReg reg = var_lookup_local(fs, name); - if ((int32_t)reg >= 0) { /* Local in this function? */ - expr_init(e, VLOCAL, reg); - if (!first) - fscope_uvmark(fs, reg); /* Scope now has an upvalue. */ - return (MSize)(e->u.s.aux = (uint32_t)fs->varmap[reg]); - } else { - MSize vidx = var_lookup_(fs->prev, name, e, 0); /* Var in outer func? */ - if ((int32_t)vidx >= 0) { /* Yes, make it an upvalue here. */ - e->u.s.info = (uint8_t)var_lookup_uv(fs, vidx, e); - e->k = VUPVAL; - return vidx; - } - } - } else { /* Not found in any function, must be a global. */ - expr_init(e, VGLOBAL, 0); - e->u.sval = name; - } - return (MSize)-1; /* Global. */ -} - -/* Lookup variable name. */ -#define var_lookup(ls, e) \ - var_lookup_((ls)->fs, lex_str(ls), (e), 1) - -/* -- Goto an label handling ---------------------------------------------- */ - -/* Add a new goto or label. */ -static MSize gola_new(LexState *ls, GCstr *name, uint8_t info, BCPos pc) -{ - FuncState *fs = ls->fs; - MSize vtop = ls->vtop; - if (LJ_UNLIKELY(vtop >= ls->sizevstack)) { - if (ls->sizevstack >= LJ_MAX_VSTACK) - lj_lex_error(ls, 0, LJ_ERR_XLIMC, LJ_MAX_VSTACK); - lj_mem_growvec(ls->L, ls->vstack, ls->sizevstack, LJ_MAX_VSTACK, VarInfo); - } - lua_assert(name == NAME_BREAK || lj_tab_getstr(fs->kt, name) != NULL); - /* NOBARRIER: name is anchored in fs->kt and ls->vstack is not a GCobj. */ - setgcref(ls->vstack[vtop].name, obj2gco(name)); - ls->vstack[vtop].startpc = pc; - ls->vstack[vtop].slot = (uint8_t)fs->nactvar; - ls->vstack[vtop].info = info; - ls->vtop = vtop+1; - return vtop; -} - -#define gola_isgoto(v) ((v)->info & VSTACK_GOTO) -#define gola_islabel(v) ((v)->info & VSTACK_LABEL) -#define gola_isgotolabel(v) ((v)->info & (VSTACK_GOTO|VSTACK_LABEL)) - -/* Patch goto to jump to label. */ -static void gola_patch(LexState *ls, VarInfo *vg, VarInfo *vl) -{ - FuncState *fs = ls->fs; - BCPos pc = vg->startpc; - setgcrefnull(vg->name); /* Invalidate pending goto. */ - setbc_a(&fs->bcbase[pc].ins, vl->slot); - jmp_patch(fs, pc, vl->startpc); -} - -/* Patch goto to close upvalues. */ -static void gola_close(LexState *ls, VarInfo *vg) -{ - FuncState *fs = ls->fs; - BCPos pc = vg->startpc; - BCIns *ip = &fs->bcbase[pc].ins; - lua_assert(gola_isgoto(vg)); - lua_assert(bc_op(*ip) == BC_JMP || bc_op(*ip) == BC_UCLO); - setbc_a(ip, vg->slot); - if (bc_op(*ip) == BC_JMP) { - BCPos next = jmp_next(fs, pc); - if (next != NO_JMP) jmp_patch(fs, next, pc); /* Jump to UCLO. */ - setbc_op(ip, BC_UCLO); /* Turn into UCLO. */ - setbc_j(ip, NO_JMP); - } -} - -/* Resolve pending forward gotos for label. */ -static void gola_resolve(LexState *ls, FuncScope *bl, MSize idx) -{ - VarInfo *vg = ls->vstack + bl->vstart; - VarInfo *vl = ls->vstack + idx; - for (; vg < vl; vg++) - if (gcrefeq(vg->name, vl->name) && gola_isgoto(vg)) { - if (vg->slot < vl->slot) { - GCstr *name = strref(var_get(ls, ls->fs, vg->slot).name); - lua_assert((uintptr_t)name >= VARNAME__MAX); - ls->linenumber = ls->fs->bcbase[vg->startpc].line; - lua_assert(strref(vg->name) != NAME_BREAK); - lj_lex_error(ls, 0, LJ_ERR_XGSCOPE, - strdata(strref(vg->name)), strdata(name)); - } - gola_patch(ls, vg, vl); - } -} - -/* Fixup remaining gotos and labels for scope. */ -static void gola_fixup(LexState *ls, FuncScope *bl) -{ - VarInfo *v = ls->vstack + bl->vstart; - VarInfo *ve = ls->vstack + ls->vtop; - for (; v < ve; v++) { - GCstr *name = strref(v->name); - if (name != NULL) { /* Only consider remaining valid gotos/labels. */ - if (gola_islabel(v)) { - VarInfo *vg; - setgcrefnull(v->name); /* Invalidate label that goes out of scope. */ - for (vg = v+1; vg < ve; vg++) /* Resolve pending backward gotos. */ - if (strref(vg->name) == name && gola_isgoto(vg)) { - if ((bl->flags&FSCOPE_UPVAL) && vg->slot > v->slot) - gola_close(ls, vg); - gola_patch(ls, vg, v); - } - } else if (gola_isgoto(v)) { - if (bl->prev) { /* Propagate goto or break to outer scope. */ - bl->prev->flags |= name == NAME_BREAK ? FSCOPE_BREAK : FSCOPE_GOLA; - v->slot = bl->nactvar; - if ((bl->flags & FSCOPE_UPVAL)) - gola_close(ls, v); - } else { /* No outer scope: undefined goto label or no loop. */ - ls->linenumber = ls->fs->bcbase[v->startpc].line; - if (name == NAME_BREAK) - lj_lex_error(ls, 0, LJ_ERR_XBREAK); - else - lj_lex_error(ls, 0, LJ_ERR_XLUNDEF, strdata(name)); - } - } - } - } -} - -/* Find existing label. */ -static VarInfo *gola_findlabel(LexState *ls, GCstr *name) -{ - VarInfo *v = ls->vstack + ls->fs->bl->vstart; - VarInfo *ve = ls->vstack + ls->vtop; - for (; v < ve; v++) - if (strref(v->name) == name && gola_islabel(v)) - return v; - return NULL; -} - -/* -- Scope handling ------------------------------------------------------ */ - -/* Begin a scope. */ -static void fscope_begin(FuncState *fs, FuncScope *bl, int flags) -{ - bl->nactvar = (uint8_t)fs->nactvar; - bl->flags = flags; - bl->vstart = fs->ls->vtop; - bl->prev = fs->bl; - fs->bl = bl; - lua_assert(fs->freereg == fs->nactvar); -} - -/* End a scope. */ -static void fscope_end(FuncState *fs) -{ - FuncScope *bl = fs->bl; - LexState *ls = fs->ls; - fs->bl = bl->prev; - var_remove(ls, bl->nactvar); - fs->freereg = fs->nactvar; - lua_assert(bl->nactvar == fs->nactvar); - if ((bl->flags & (FSCOPE_UPVAL|FSCOPE_NOCLOSE)) == FSCOPE_UPVAL) - bcemit_AJ(fs, BC_UCLO, bl->nactvar, 0); - if ((bl->flags & FSCOPE_BREAK)) { - if ((bl->flags & FSCOPE_LOOP)) { - MSize idx = gola_new(ls, NAME_BREAK, VSTACK_LABEL, fs->pc); - ls->vtop = idx; /* Drop break label immediately. */ - gola_resolve(ls, bl, idx); - return; - } /* else: need the fixup step to propagate the breaks. */ - } else if (!(bl->flags & FSCOPE_GOLA)) { - return; - } - gola_fixup(ls, bl); -} - -/* Mark scope as having an upvalue. */ -static void fscope_uvmark(FuncState *fs, BCReg level) -{ - FuncScope *bl; - for (bl = fs->bl; bl && bl->nactvar > level; bl = bl->prev) - ; - if (bl) - bl->flags |= FSCOPE_UPVAL; -} - -/* -- Function state management ------------------------------------------- */ - -/* Fixup bytecode for prototype. */ -static void fs_fixup_bc(FuncState *fs, GCproto *pt, BCIns *bc, MSize n) -{ - BCInsLine *base = fs->bcbase; - MSize i; - pt->sizebc = n; - bc[0] = BCINS_AD((fs->flags & PROTO_VARARG) ? BC_FUNCV : BC_FUNCF, - fs->framesize, 0); - for (i = 1; i < n; i++) - bc[i] = base[i].ins; -} - -/* Fixup upvalues for child prototype, step #2. */ -static void fs_fixup_uv2(FuncState *fs, GCproto *pt) -{ - VarInfo *vstack = fs->ls->vstack; - uint16_t *uv = proto_uv(pt); - MSize i, n = pt->sizeuv; - for (i = 0; i < n; i++) { - VarIndex vidx = uv[i]; - if (vidx >= LJ_MAX_VSTACK) - uv[i] = vidx - LJ_MAX_VSTACK; - else if ((vstack[vidx].info & VSTACK_VAR_RW)) - uv[i] = vstack[vidx].slot | PROTO_UV_LOCAL; - else - uv[i] = vstack[vidx].slot | PROTO_UV_LOCAL | PROTO_UV_IMMUTABLE; - } -} - -/* Fixup constants for prototype. */ -static void fs_fixup_k(FuncState *fs, GCproto *pt, void *kptr) -{ - GCtab *kt; - TValue *array; - Node *node; - MSize i, hmask; - checklimitgt(fs, fs->nkn, BCMAX_D+1, "constants"); - checklimitgt(fs, fs->nkgc, BCMAX_D+1, "constants"); - setmref(pt->k, kptr); - pt->sizekn = fs->nkn; - pt->sizekgc = fs->nkgc; - kt = fs->kt; - array = tvref(kt->array); - for (i = 0; i < kt->asize; i++) - if (tvhaskslot(&array[i])) { - TValue *tv = &((TValue *)kptr)[tvkslot(&array[i])]; - if (LJ_DUALNUM) - setintV(tv, (int32_t)i); - else - setnumV(tv, (lua_Number)i); - } - node = noderef(kt->node); - hmask = kt->hmask; - for (i = 0; i <= hmask; i++) { - Node *n = &node[i]; - if (tvhaskslot(&n->val)) { - ptrdiff_t kidx = (ptrdiff_t)tvkslot(&n->val); - lua_assert(!tvisint(&n->key)); - if (tvisnum(&n->key)) { - TValue *tv = &((TValue *)kptr)[kidx]; - if (LJ_DUALNUM) { - lua_Number nn = numV(&n->key); - int32_t k = lj_num2int(nn); - lua_assert(!tvismzero(&n->key)); - if ((lua_Number)k == nn) - setintV(tv, k); - else - *tv = n->key; - } else { - *tv = n->key; - } - } else { - GCobj *o = gcV(&n->key); - setgcref(((GCRef *)kptr)[~kidx], o); - lj_gc_objbarrier(fs->L, pt, o); - if (tvisproto(&n->key)) - fs_fixup_uv2(fs, gco2pt(o)); - } - } - } -} - -/* Fixup upvalues for prototype, step #1. */ -static void fs_fixup_uv1(FuncState *fs, GCproto *pt, uint16_t *uv) -{ - setmref(pt->uv, uv); - pt->sizeuv = fs->nuv; - memcpy(uv, fs->uvtmp, fs->nuv*sizeof(VarIndex)); -} - -#ifndef LUAJIT_DISABLE_DEBUGINFO -/* Prepare lineinfo for prototype. */ -static size_t fs_prep_line(FuncState *fs, BCLine numline) -{ - return (fs->pc-1) << (numline < 256 ? 0 : numline < 65536 ? 1 : 2); -} - -/* Fixup lineinfo for prototype. */ -static void fs_fixup_line(FuncState *fs, GCproto *pt, - void *lineinfo, BCLine numline) -{ - BCInsLine *base = fs->bcbase + 1; - BCLine first = fs->linedefined; - MSize i = 0, n = fs->pc-1; - pt->firstline = fs->linedefined; - pt->numline = numline; - setmref(pt->lineinfo, lineinfo); - if (LJ_LIKELY(numline < 256)) { - uint8_t *li = (uint8_t *)lineinfo; - do { - BCLine delta = base[i].line - first; - lua_assert(delta >= 0 && delta < 256); - li[i] = (uint8_t)delta; - } while (++i < n); - } else if (LJ_LIKELY(numline < 65536)) { - uint16_t *li = (uint16_t *)lineinfo; - do { - BCLine delta = base[i].line - first; - lua_assert(delta >= 0 && delta < 65536); - li[i] = (uint16_t)delta; - } while (++i < n); - } else { - uint32_t *li = (uint32_t *)lineinfo; - do { - BCLine delta = base[i].line - first; - lua_assert(delta >= 0); - li[i] = (uint32_t)delta; - } while (++i < n); - } -} - -/* Resize buffer if needed. */ -static LJ_NOINLINE void fs_buf_resize(LexState *ls, MSize len) -{ - MSize sz = ls->sb.sz * 2; - while (ls->sb.n + len > sz) sz = sz * 2; - lj_str_resizebuf(ls->L, &ls->sb, sz); -} - -static LJ_AINLINE void fs_buf_need(LexState *ls, MSize len) -{ - if (LJ_UNLIKELY(ls->sb.n + len > ls->sb.sz)) - fs_buf_resize(ls, len); -} - -/* Add string to buffer. */ -static void fs_buf_str(LexState *ls, const char *str, MSize len) -{ - char *p = ls->sb.buf + ls->sb.n; - MSize i; - ls->sb.n += len; - for (i = 0; i < len; i++) p[i] = str[i]; -} - -/* Add ULEB128 value to buffer. */ -static void fs_buf_uleb128(LexState *ls, uint32_t v) -{ - MSize n = ls->sb.n; - uint8_t *p = (uint8_t *)ls->sb.buf; - for (; v >= 0x80; v >>= 7) - p[n++] = (uint8_t)((v & 0x7f) | 0x80); - p[n++] = (uint8_t)v; - ls->sb.n = n; -} - -/* Prepare variable info for prototype. */ -static size_t fs_prep_var(LexState *ls, FuncState *fs, size_t *ofsvar) -{ - VarInfo *vs =ls->vstack, *ve; - MSize i, n; - BCPos lastpc; - lj_str_resetbuf(&ls->sb); /* Copy to temp. string buffer. */ - /* Store upvalue names. */ - for (i = 0, n = fs->nuv; i < n; i++) { - GCstr *s = strref(vs[fs->uvmap[i]].name); - MSize len = s->len+1; - fs_buf_need(ls, len); - fs_buf_str(ls, strdata(s), len); - } - *ofsvar = ls->sb.n; - lastpc = 0; - /* Store local variable names and compressed ranges. */ - for (ve = vs + ls->vtop, vs += fs->vbase; vs < ve; vs++) { - if (!gola_isgotolabel(vs)) { - GCstr *s = strref(vs->name); - BCPos startpc; - if ((uintptr_t)s < VARNAME__MAX) { - fs_buf_need(ls, 1 + 2*5); - ls->sb.buf[ls->sb.n++] = (uint8_t)(uintptr_t)s; - } else { - MSize len = s->len+1; - fs_buf_need(ls, len + 2*5); - fs_buf_str(ls, strdata(s), len); - } - startpc = vs->startpc; - fs_buf_uleb128(ls, startpc-lastpc); - fs_buf_uleb128(ls, vs->endpc-startpc); - lastpc = startpc; - } - } - fs_buf_need(ls, 1); - ls->sb.buf[ls->sb.n++] = '\0'; /* Terminator for varinfo. */ - return ls->sb.n; -} - -/* Fixup variable info for prototype. */ -static void fs_fixup_var(LexState *ls, GCproto *pt, uint8_t *p, size_t ofsvar) -{ - setmref(pt->uvinfo, p); - setmref(pt->varinfo, (char *)p + ofsvar); - memcpy(p, ls->sb.buf, ls->sb.n); /* Copy from temp. string buffer. */ -} -#else - -/* Initialize with empty debug info, if disabled. */ -#define fs_prep_line(fs, numline) (UNUSED(numline), 0) -#define fs_fixup_line(fs, pt, li, numline) \ - pt->firstline = pt->numline = 0, setmref((pt)->lineinfo, NULL) -#define fs_prep_var(ls, fs, ofsvar) (UNUSED(ofsvar), 0) -#define fs_fixup_var(ls, pt, p, ofsvar) \ - setmref((pt)->uvinfo, NULL), setmref((pt)->varinfo, NULL) - -#endif - -/* Check if bytecode op returns. */ -static int bcopisret(BCOp op) -{ - switch (op) { - case BC_CALLMT: case BC_CALLT: - case BC_RETM: case BC_RET: case BC_RET0: case BC_RET1: - return 1; - default: - return 0; - } -} - -/* Fixup return instruction for prototype. */ -static void fs_fixup_ret(FuncState *fs) -{ - BCPos lastpc = fs->pc; - if (lastpc <= fs->lasttarget || !bcopisret(bc_op(fs->bcbase[lastpc-1].ins))) { - if ((fs->bl->flags & FSCOPE_UPVAL)) - bcemit_AJ(fs, BC_UCLO, 0, 0); - bcemit_AD(fs, BC_RET0, 0, 1); /* Need final return. */ - } - fs->bl->flags |= FSCOPE_NOCLOSE; /* Handled above. */ - fscope_end(fs); - lua_assert(fs->bl == NULL); - /* May need to fixup returns encoded before first function was created. */ - if (fs->flags & PROTO_FIXUP_RETURN) { - BCPos pc; - for (pc = 1; pc < lastpc; pc++) { - BCIns ins = fs->bcbase[pc].ins; - BCPos offset; - switch (bc_op(ins)) { - case BC_CALLMT: case BC_CALLT: - case BC_RETM: case BC_RET: case BC_RET0: case BC_RET1: - offset = bcemit_INS(fs, ins); /* Copy original instruction. */ - fs->bcbase[offset].line = fs->bcbase[pc].line; - offset = offset-(pc+1)+BCBIAS_J; - if (offset > BCMAX_D) - err_syntax(fs->ls, LJ_ERR_XFIXUP); - /* Replace with UCLO plus branch. */ - fs->bcbase[pc].ins = BCINS_AD(BC_UCLO, 0, offset); - break; - case BC_UCLO: - return; /* We're done. */ - default: - break; - } - } - } -} - -/* Finish a FuncState and return the new prototype. */ -static GCproto *fs_finish(LexState *ls, BCLine line) -{ - lua_State *L = ls->L; - FuncState *fs = ls->fs; - BCLine numline = line - fs->linedefined; - size_t sizept, ofsk, ofsuv, ofsli, ofsdbg, ofsvar; - GCproto *pt; - - /* Apply final fixups. */ - fs_fixup_ret(fs); - - /* Calculate total size of prototype including all colocated arrays. */ - sizept = sizeof(GCproto) + fs->pc*sizeof(BCIns) + fs->nkgc*sizeof(GCRef); - sizept = (sizept + sizeof(TValue)-1) & ~(sizeof(TValue)-1); - ofsk = sizept; sizept += fs->nkn*sizeof(TValue); - ofsuv = sizept; sizept += ((fs->nuv+1)&~1)*2; - ofsli = sizept; sizept += fs_prep_line(fs, numline); - ofsdbg = sizept; sizept += fs_prep_var(ls, fs, &ofsvar); - - /* Allocate prototype and initialize its fields. */ - pt = (GCproto *)lj_mem_newgco(L, (MSize)sizept); - pt->gct = ~LJ_TPROTO; - pt->sizept = (MSize)sizept; - pt->trace = 0; - pt->flags = (uint8_t)(fs->flags & ~(PROTO_HAS_RETURN|PROTO_FIXUP_RETURN)); - pt->numparams = fs->numparams; - pt->framesize = fs->framesize; - setgcref(pt->chunkname, obj2gco(ls->chunkname)); - - /* Close potentially uninitialized gap between bc and kgc. */ - *(uint32_t *)((char *)pt + ofsk - sizeof(GCRef)*(fs->nkgc+1)) = 0; - fs_fixup_bc(fs, pt, (BCIns *)((char *)pt + sizeof(GCproto)), fs->pc); - fs_fixup_k(fs, pt, (void *)((char *)pt + ofsk)); - fs_fixup_uv1(fs, pt, (uint16_t *)((char *)pt + ofsuv)); - fs_fixup_line(fs, pt, (void *)((char *)pt + ofsli), numline); - fs_fixup_var(ls, pt, (uint8_t *)((char *)pt + ofsdbg), ofsvar); - - lj_vmevent_send(L, BC, - setprotoV(L, L->top++, pt); - ); - - L->top--; /* Pop table of constants. */ - ls->vtop = fs->vbase; /* Reset variable stack. */ - ls->fs = fs->prev; - lua_assert(ls->fs != NULL || ls->token == TK_eof); - return pt; -} - -/* Initialize a new FuncState. */ -static void fs_init(LexState *ls, FuncState *fs) -{ - lua_State *L = ls->L; - fs->prev = ls->fs; ls->fs = fs; /* Append to list. */ - fs->ls = ls; - fs->vbase = ls->vtop; - fs->L = L; - fs->pc = 0; - fs->lasttarget = 0; - fs->jpc = NO_JMP; - fs->freereg = 0; - fs->nkgc = 0; - fs->nkn = 0; - fs->nactvar = 0; - fs->nuv = 0; - fs->bl = NULL; - fs->flags = 0; - fs->framesize = 1; /* Minimum frame size. */ - fs->kt = lj_tab_new(L, 0, 0); - /* Anchor table of constants in stack to avoid being collected. */ - settabV(L, L->top, fs->kt); - incr_top(L); -} - -/* -- Expressions --------------------------------------------------------- */ - -/* Forward declaration. */ -static void expr(LexState *ls, ExpDesc *v); - -/* Return string expression. */ -static void expr_str(LexState *ls, ExpDesc *e) -{ - expr_init(e, VKSTR, 0); - e->u.sval = lex_str(ls); -} - -/* Return index expression. */ -static void expr_index(FuncState *fs, ExpDesc *t, ExpDesc *e) -{ - /* Already called: expr_toval(fs, e). */ - t->k = VINDEXED; - if (expr_isnumk(e)) { -#if LJ_DUALNUM - if (tvisint(expr_numtv(e))) { - int32_t k = intV(expr_numtv(e)); - if (checku8(k)) { - t->u.s.aux = BCMAX_C+1+(uint32_t)k; /* 256..511: const byte key */ - return; - } - } -#else - lua_Number n = expr_numberV(e); - int32_t k = lj_num2int(n); - if (checku8(k) && n == (lua_Number)k) { - t->u.s.aux = BCMAX_C+1+(uint32_t)k; /* 256..511: const byte key */ - return; - } -#endif - } else if (expr_isstrk(e)) { - BCReg idx = const_str(fs, e); - if (idx <= BCMAX_C) { - t->u.s.aux = ~idx; /* -256..-1: const string key */ - return; - } - } - t->u.s.aux = expr_toanyreg(fs, e); /* 0..255: register */ -} - -/* Parse index expression with named field. */ -static void expr_field(LexState *ls, ExpDesc *v) -{ - FuncState *fs = ls->fs; - ExpDesc key; - expr_toanyreg(fs, v); - lj_lex_next(ls); /* Skip dot or colon. */ - expr_str(ls, &key); - expr_index(fs, v, &key); -} - -/* Parse index expression with brackets. */ -static void expr_bracket(LexState *ls, ExpDesc *v) -{ - lj_lex_next(ls); /* Skip '['. */ - expr(ls, v); - expr_toval(ls->fs, v); - lex_check(ls, ']'); -} - -/* Get value of constant expression. */ -static void expr_kvalue(TValue *v, ExpDesc *e) -{ - if (e->k <= VKTRUE) { - setitype(v, ~(uint32_t)e->k); - } else if (e->k == VKSTR) { - setgcref(v->gcr, obj2gco(e->u.sval)); - setitype(v, LJ_TSTR); - } else { - lua_assert(tvisnumber(expr_numtv(e))); - *v = *expr_numtv(e); - } -} - -/* Parse table constructor expression. */ -static void expr_table(LexState *ls, ExpDesc *e) -{ - FuncState *fs = ls->fs; - BCLine line = ls->linenumber; - GCtab *t = NULL; - int vcall = 0, needarr = 0, fixt = 0; - uint32_t narr = 1; /* First array index. */ - uint32_t nhash = 0; /* Number of hash entries. */ - BCReg freg = fs->freereg; - BCPos pc = bcemit_AD(fs, BC_TNEW, freg, 0); - expr_init(e, VNONRELOC, freg); - bcreg_reserve(fs, 1); - freg++; - lex_check(ls, '{'); - while (ls->token != '}') { - ExpDesc key, val; - vcall = 0; - if (ls->token == '[') { - expr_bracket(ls, &key); /* Already calls expr_toval. */ - if (!expr_isk(&key)) expr_index(fs, e, &key); - if (expr_isnumk(&key) && expr_numiszero(&key)) needarr = 1; else nhash++; - lex_check(ls, '='); - } else if ((ls->token == TK_name || (!LJ_52 && ls->token == TK_goto)) && - lj_lex_lookahead(ls) == '=') { - expr_str(ls, &key); - lex_check(ls, '='); - nhash++; - } else { - expr_init(&key, VKNUM, 0); - setintV(&key.u.nval, (int)narr); - narr++; - needarr = vcall = 1; - } - expr(ls, &val); - if (expr_isk(&key) && key.k != VKNIL && - (key.k == VKSTR || expr_isk_nojump(&val))) { - TValue k, *v; - if (!t) { /* Create template table on demand. */ - BCReg kidx; - t = lj_tab_new(fs->L, needarr ? narr : 0, hsize2hbits(nhash)); - kidx = const_gc(fs, obj2gco(t), LJ_TTAB); - fs->bcbase[pc].ins = BCINS_AD(BC_TDUP, freg-1, kidx); - } - vcall = 0; - expr_kvalue(&k, &key); - v = lj_tab_set(fs->L, t, &k); - lj_gc_anybarriert(fs->L, t); - if (expr_isk_nojump(&val)) { /* Add const key/value to template table. */ - expr_kvalue(v, &val); - } else { /* Otherwise create dummy string key (avoids lj_tab_newkey). */ - settabV(fs->L, v, t); /* Preserve key with table itself as value. */ - fixt = 1; /* Fix this later, after all resizes. */ - goto nonconst; - } - } else { - nonconst: - if (val.k != VCALL) { expr_toanyreg(fs, &val); vcall = 0; } - if (expr_isk(&key)) expr_index(fs, e, &key); - bcemit_store(fs, e, &val); - } - fs->freereg = freg; - if (!lex_opt(ls, ',') && !lex_opt(ls, ';')) break; - } - lex_match(ls, '}', '{', line); - if (vcall) { - BCInsLine *ilp = &fs->bcbase[fs->pc-1]; - ExpDesc en; - lua_assert(bc_a(ilp->ins) == freg && - bc_op(ilp->ins) == (narr > 256 ? BC_TSETV : BC_TSETB)); - expr_init(&en, VKNUM, 0); - en.u.nval.u32.lo = narr-1; - en.u.nval.u32.hi = 0x43300000; /* Biased integer to avoid denormals. */ - if (narr > 256) { fs->pc--; ilp--; } - ilp->ins = BCINS_AD(BC_TSETM, freg, const_num(fs, &en)); - setbc_b(&ilp[-1].ins, 0); - } - if (pc == fs->pc-1) { /* Make expr relocable if possible. */ - e->u.s.info = pc; - fs->freereg--; - e->k = VRELOCABLE; - } else { - e->k = VNONRELOC; /* May have been changed by expr_index. */ - } - if (!t) { /* Construct TNEW RD: hhhhhaaaaaaaaaaa. */ - BCIns *ip = &fs->bcbase[pc].ins; - if (!needarr) narr = 0; - else if (narr < 3) narr = 3; - else if (narr > 0x7ff) narr = 0x7ff; - setbc_d(ip, narr|(hsize2hbits(nhash)<<11)); - } else { - if (needarr && t->asize < narr) - lj_tab_reasize(fs->L, t, narr-1); - if (fixt) { /* Fix value for dummy keys in template table. */ - Node *node = noderef(t->node); - uint32_t i, hmask = t->hmask; - for (i = 0; i <= hmask; i++) { - Node *n = &node[i]; - if (tvistab(&n->val)) { - lua_assert(tabV(&n->val) == t); - setnilV(&n->val); /* Turn value into nil. */ - } - } - } - lj_gc_check(fs->L); - } -} - -/* Parse function parameters. */ -static BCReg parse_params(LexState *ls, int needself) -{ - FuncState *fs = ls->fs; - BCReg nparams = 0; - lex_check(ls, '('); - if (needself) - var_new_lit(ls, nparams++, "self"); - if (ls->token != ')') { - do { - if (ls->token == TK_name || (!LJ_52 && ls->token == TK_goto)) { - var_new(ls, nparams++, lex_str(ls)); - } else if (ls->token == TK_dots) { - lj_lex_next(ls); - fs->flags |= PROTO_VARARG; - break; - } else { - err_syntax(ls, LJ_ERR_XPARAM); - } - } while (lex_opt(ls, ',')); - } - var_add(ls, nparams); - lua_assert(fs->nactvar == nparams); - bcreg_reserve(fs, nparams); - lex_check(ls, ')'); - return nparams; -} - -/* Forward declaration. */ -static void parse_chunk(LexState *ls); - -/* Parse body of a function. */ -static void parse_body(LexState *ls, ExpDesc *e, int needself, BCLine line) -{ - FuncState fs, *pfs = ls->fs; - FuncScope bl; - GCproto *pt; - ptrdiff_t oldbase = pfs->bcbase - ls->bcstack; - fs_init(ls, &fs); - fscope_begin(&fs, &bl, 0); - fs.linedefined = line; - fs.numparams = (uint8_t)parse_params(ls, needself); - fs.bcbase = pfs->bcbase + pfs->pc; - fs.bclim = pfs->bclim - pfs->pc; - bcemit_AD(&fs, BC_FUNCF, 0, 0); /* Placeholder. */ - parse_chunk(ls); - if (ls->token != TK_end) lex_match(ls, TK_end, TK_function, line); - pt = fs_finish(ls, (ls->lastline = ls->linenumber)); - pfs->bcbase = ls->bcstack + oldbase; /* May have been reallocated. */ - pfs->bclim = (BCPos)(ls->sizebcstack - oldbase); - /* Store new prototype in the constant array of the parent. */ - expr_init(e, VRELOCABLE, - bcemit_AD(pfs, BC_FNEW, 0, const_gc(pfs, obj2gco(pt), LJ_TPROTO))); -#if LJ_HASFFI - pfs->flags |= (fs.flags & PROTO_FFI); -#endif - if (!(pfs->flags & PROTO_CHILD)) { - if (pfs->flags & PROTO_HAS_RETURN) - pfs->flags |= PROTO_FIXUP_RETURN; - pfs->flags |= PROTO_CHILD; - } - lj_lex_next(ls); -} - -/* Parse expression list. Last expression is left open. */ -static BCReg expr_list(LexState *ls, ExpDesc *v) -{ - BCReg n = 1; - expr(ls, v); - while (lex_opt(ls, ',')) { - expr_tonextreg(ls->fs, v); - expr(ls, v); - n++; - } - return n; -} - -/* Parse function argument list. */ -static void parse_args(LexState *ls, ExpDesc *e) -{ - FuncState *fs = ls->fs; - ExpDesc args; - BCIns ins; - BCReg base; - BCLine line = ls->linenumber; - if (ls->token == '(') { -#if !LJ_52 - if (line != ls->lastline) - err_syntax(ls, LJ_ERR_XAMBIG); -#endif - lj_lex_next(ls); - if (ls->token == ')') { /* f(). */ - args.k = VVOID; - } else { - expr_list(ls, &args); - if (args.k == VCALL) /* f(a, b, g()) or f(a, b, ...). */ - setbc_b(bcptr(fs, &args), 0); /* Pass on multiple results. */ - } - lex_match(ls, ')', '(', line); - } else if (ls->token == '{') { - expr_table(ls, &args); - } else if (ls->token == TK_string) { - expr_init(&args, VKSTR, 0); - args.u.sval = strV(&ls->tokenval); - lj_lex_next(ls); - } else { - err_syntax(ls, LJ_ERR_XFUNARG); - return; /* Silence compiler. */ - } - lua_assert(e->k == VNONRELOC); - base = e->u.s.info; /* Base register for call. */ - if (args.k == VCALL) { - ins = BCINS_ABC(BC_CALLM, base, 2, args.u.s.aux - base - 1); - } else { - if (args.k != VVOID) - expr_tonextreg(fs, &args); - ins = BCINS_ABC(BC_CALL, base, 2, fs->freereg - base); - } - expr_init(e, VCALL, bcemit_INS(fs, ins)); - e->u.s.aux = base; - fs->bcbase[fs->pc - 1].line = line; - fs->freereg = base+1; /* Leave one result by default. */ -} - -/* Parse primary expression. */ -static void expr_primary(LexState *ls, ExpDesc *v) -{ - FuncState *fs = ls->fs; - /* Parse prefix expression. */ - if (ls->token == '(') { - BCLine line = ls->linenumber; - lj_lex_next(ls); - expr(ls, v); - lex_match(ls, ')', '(', line); - expr_discharge(ls->fs, v); - } else if (ls->token == TK_name || (!LJ_52 && ls->token == TK_goto)) { - var_lookup(ls, v); - } else { - err_syntax(ls, LJ_ERR_XSYMBOL); - } - for (;;) { /* Parse multiple expression suffixes. */ - if (ls->token == '.') { - expr_field(ls, v); - } else if (ls->token == '[') { - ExpDesc key; - expr_toanyreg(fs, v); - expr_bracket(ls, &key); - expr_index(fs, v, &key); - } else if (ls->token == ':') { - ExpDesc key; - lj_lex_next(ls); - expr_str(ls, &key); - bcemit_method(fs, v, &key); - parse_args(ls, v); - } else if (ls->token == '(' || ls->token == TK_string || ls->token == '{') { - expr_tonextreg(fs, v); - parse_args(ls, v); - } else { - break; - } - } -} - -/* Parse simple expression. */ -static void expr_simple(LexState *ls, ExpDesc *v) -{ - switch (ls->token) { - case TK_number: - expr_init(v, (LJ_HASFFI && tviscdata(&ls->tokenval)) ? VKCDATA : VKNUM, 0); - copyTV(ls->L, &v->u.nval, &ls->tokenval); - break; - case TK_string: - expr_init(v, VKSTR, 0); - v->u.sval = strV(&ls->tokenval); - break; - case TK_nil: - expr_init(v, VKNIL, 0); - break; - case TK_true: - expr_init(v, VKTRUE, 0); - break; - case TK_false: - expr_init(v, VKFALSE, 0); - break; - case TK_dots: { /* Vararg. */ - FuncState *fs = ls->fs; - BCReg base; - checkcond(ls, fs->flags & PROTO_VARARG, LJ_ERR_XDOTS); - bcreg_reserve(fs, 1); - base = fs->freereg-1; - expr_init(v, VCALL, bcemit_ABC(fs, BC_VARG, base, 2, fs->numparams)); - v->u.s.aux = base; - break; - } - case '{': /* Table constructor. */ - expr_table(ls, v); - return; - case TK_function: - lj_lex_next(ls); - parse_body(ls, v, 0, ls->linenumber); - return; - default: - expr_primary(ls, v); - return; - } - lj_lex_next(ls); -} - -/* Manage syntactic levels to avoid blowing up the stack. */ -static void synlevel_begin(LexState *ls) -{ - if (++ls->level >= LJ_MAX_XLEVEL) - lj_lex_error(ls, 0, LJ_ERR_XLEVELS); -} - -#define synlevel_end(ls) ((ls)->level--) - -/* Convert token to binary operator. */ -static BinOpr token2binop(LexToken tok) -{ - switch (tok) { - case '+': return OPR_ADD; - case '-': return OPR_SUB; - case '*': return OPR_MUL; - case '/': return OPR_DIV; - case '%': return OPR_MOD; - case '^': return OPR_POW; - case TK_concat: return OPR_CONCAT; - case TK_ne: return OPR_NE; - case TK_eq: return OPR_EQ; - case '<': return OPR_LT; - case TK_le: return OPR_LE; - case '>': return OPR_GT; - case TK_ge: return OPR_GE; - case TK_and: return OPR_AND; - case TK_or: return OPR_OR; - default: return OPR_NOBINOPR; - } -} - -/* Priorities for each binary operator. ORDER OPR. */ -static const struct { - uint8_t left; /* Left priority. */ - uint8_t right; /* Right priority. */ -} priority[] = { - {6,6}, {6,6}, {7,7}, {7,7}, {7,7}, /* ADD SUB MUL DIV MOD */ - {10,9}, {5,4}, /* POW CONCAT (right associative) */ - {3,3}, {3,3}, /* EQ NE */ - {3,3}, {3,3}, {3,3}, {3,3}, /* LT GE GT LE */ - {2,2}, {1,1} /* AND OR */ -}; - -#define UNARY_PRIORITY 8 /* Priority for unary operators. */ - -/* Forward declaration. */ -static BinOpr expr_binop(LexState *ls, ExpDesc *v, uint32_t limit); - -/* Parse unary expression. */ -static void expr_unop(LexState *ls, ExpDesc *v) -{ - BCOp op; - if (ls->token == TK_not) { - op = BC_NOT; - } else if (ls->token == '-') { - op = BC_UNM; - } else if (ls->token == '#') { - op = BC_LEN; - } else { - expr_simple(ls, v); - return; - } - lj_lex_next(ls); - expr_binop(ls, v, UNARY_PRIORITY); - bcemit_unop(ls->fs, op, v); -} - -/* Parse binary expressions with priority higher than the limit. */ -static BinOpr expr_binop(LexState *ls, ExpDesc *v, uint32_t limit) -{ - BinOpr op; - synlevel_begin(ls); - expr_unop(ls, v); - op = token2binop(ls->token); - while (op != OPR_NOBINOPR && priority[op].left > limit) { - ExpDesc v2; - BinOpr nextop; - lj_lex_next(ls); - bcemit_binop_left(ls->fs, op, v); - /* Parse binary expression with higher priority. */ - nextop = expr_binop(ls, &v2, priority[op].right); - bcemit_binop(ls->fs, op, v, &v2); - op = nextop; - } - synlevel_end(ls); - return op; /* Return unconsumed binary operator (if any). */ -} - -/* Parse expression. */ -static void expr(LexState *ls, ExpDesc *v) -{ - expr_binop(ls, v, 0); /* Priority 0: parse whole expression. */ -} - -/* Assign expression to the next register. */ -static void expr_next(LexState *ls) -{ - ExpDesc e; - expr(ls, &e); - expr_tonextreg(ls->fs, &e); -} - -/* Parse conditional expression. */ -static BCPos expr_cond(LexState *ls) -{ - ExpDesc v; - expr(ls, &v); - if (v.k == VKNIL) v.k = VKFALSE; - bcemit_branch_t(ls->fs, &v); - return v.f; -} - -/* -- Assignments --------------------------------------------------------- */ - -/* List of LHS variables. */ -typedef struct LHSVarList { - ExpDesc v; /* LHS variable. */ - struct LHSVarList *prev; /* Link to previous LHS variable. */ -} LHSVarList; - -/* Eliminate write-after-read hazards for local variable assignment. */ -static void assign_hazard(LexState *ls, LHSVarList *lh, const ExpDesc *v) -{ - FuncState *fs = ls->fs; - BCReg reg = v->u.s.info; /* Check against this variable. */ - BCReg tmp = fs->freereg; /* Rename to this temp. register (if needed). */ - int hazard = 0; - for (; lh; lh = lh->prev) { - if (lh->v.k == VINDEXED) { - if (lh->v.u.s.info == reg) { /* t[i], t = 1, 2 */ - hazard = 1; - lh->v.u.s.info = tmp; - } - if (lh->v.u.s.aux == reg) { /* t[i], i = 1, 2 */ - hazard = 1; - lh->v.u.s.aux = tmp; - } - } - } - if (hazard) { - bcemit_AD(fs, BC_MOV, tmp, reg); /* Rename conflicting variable. */ - bcreg_reserve(fs, 1); - } -} - -/* Adjust LHS/RHS of an assignment. */ -static void assign_adjust(LexState *ls, BCReg nvars, BCReg nexps, ExpDesc *e) -{ - FuncState *fs = ls->fs; - int32_t extra = (int32_t)nvars - (int32_t)nexps; - if (e->k == VCALL) { - extra++; /* Compensate for the VCALL itself. */ - if (extra < 0) extra = 0; - setbc_b(bcptr(fs, e), extra+1); /* Fixup call results. */ - if (extra > 1) bcreg_reserve(fs, (BCReg)extra-1); - } else { - if (e->k != VVOID) - expr_tonextreg(fs, e); /* Close last expression. */ - if (extra > 0) { /* Leftover LHS are set to nil. */ - BCReg reg = fs->freereg; - bcreg_reserve(fs, (BCReg)extra); - bcemit_nil(fs, reg, (BCReg)extra); - } - } -} - -/* Recursively parse assignment statement. */ -static void parse_assignment(LexState *ls, LHSVarList *lh, BCReg nvars) -{ - ExpDesc e; - checkcond(ls, VLOCAL <= lh->v.k && lh->v.k <= VINDEXED, LJ_ERR_XSYNTAX); - if (lex_opt(ls, ',')) { /* Collect LHS list and recurse upwards. */ - LHSVarList vl; - vl.prev = lh; - expr_primary(ls, &vl.v); - if (vl.v.k == VLOCAL) - assign_hazard(ls, lh, &vl.v); - checklimit(ls->fs, ls->level + nvars, LJ_MAX_XLEVEL, "variable names"); - parse_assignment(ls, &vl, nvars+1); - } else { /* Parse RHS. */ - BCReg nexps; - lex_check(ls, '='); - nexps = expr_list(ls, &e); - if (nexps == nvars) { - if (e.k == VCALL) { - if (bc_op(*bcptr(ls->fs, &e)) == BC_VARG) { /* Vararg assignment. */ - ls->fs->freereg--; - e.k = VRELOCABLE; - } else { /* Multiple call results. */ - e.u.s.info = e.u.s.aux; /* Base of call is not relocatable. */ - e.k = VNONRELOC; - } - } - bcemit_store(ls->fs, &lh->v, &e); - return; - } - assign_adjust(ls, nvars, nexps, &e); - if (nexps > nvars) - ls->fs->freereg -= nexps - nvars; /* Drop leftover regs. */ - } - /* Assign RHS to LHS and recurse downwards. */ - expr_init(&e, VNONRELOC, ls->fs->freereg-1); - bcemit_store(ls->fs, &lh->v, &e); -} - -/* Parse call statement or assignment. */ -static void parse_call_assign(LexState *ls) -{ - FuncState *fs = ls->fs; - LHSVarList vl; - expr_primary(ls, &vl.v); - if (vl.v.k == VCALL) { /* Function call statement. */ - setbc_b(bcptr(fs, &vl.v), 1); /* No results. */ - } else { /* Start of an assignment. */ - vl.prev = NULL; - parse_assignment(ls, &vl, 1); - } -} - -/* Parse 'local' statement. */ -static void parse_local(LexState *ls) -{ - if (lex_opt(ls, TK_function)) { /* Local function declaration. */ - ExpDesc v, b; - FuncState *fs = ls->fs; - var_new(ls, 0, lex_str(ls)); - expr_init(&v, VLOCAL, fs->freereg); - v.u.s.aux = fs->varmap[fs->freereg]; - bcreg_reserve(fs, 1); - var_add(ls, 1); - parse_body(ls, &b, 0, ls->linenumber); - /* bcemit_store(fs, &v, &b) without setting VSTACK_VAR_RW. */ - expr_free(fs, &b); - expr_toreg(fs, &b, v.u.s.info); - /* The upvalue is in scope, but the local is only valid after the store. */ - var_get(ls, fs, fs->nactvar - 1).startpc = fs->pc; - } else { /* Local variable declaration. */ - ExpDesc e; - BCReg nexps, nvars = 0; - do { /* Collect LHS. */ - var_new(ls, nvars++, lex_str(ls)); - } while (lex_opt(ls, ',')); - if (lex_opt(ls, '=')) { /* Optional RHS. */ - nexps = expr_list(ls, &e); - } else { /* Or implicitly set to nil. */ - e.k = VVOID; - nexps = 0; - } - assign_adjust(ls, nvars, nexps, &e); - var_add(ls, nvars); - } -} - -/* Parse 'function' statement. */ -static void parse_func(LexState *ls, BCLine line) -{ - FuncState *fs; - ExpDesc v, b; - int needself = 0; - lj_lex_next(ls); /* Skip 'function'. */ - /* Parse function name. */ - var_lookup(ls, &v); - while (ls->token == '.') /* Multiple dot-separated fields. */ - expr_field(ls, &v); - if (ls->token == ':') { /* Optional colon to signify method call. */ - needself = 1; - expr_field(ls, &v); - } - parse_body(ls, &b, needself, line); - fs = ls->fs; - bcemit_store(fs, &v, &b); - fs->bcbase[fs->pc - 1].line = line; /* Set line for the store. */ -} - -/* -- Control transfer statements ----------------------------------------- */ - -/* Check for end of block. */ -static int endofblock(LexToken token) -{ - switch (token) { - case TK_else: case TK_elseif: case TK_end: case TK_until: case TK_eof: - return 1; - default: - return 0; - } -} - -/* Parse 'return' statement. */ -static void parse_return(LexState *ls) -{ - BCIns ins; - FuncState *fs = ls->fs; - lj_lex_next(ls); /* Skip 'return'. */ - fs->flags |= PROTO_HAS_RETURN; - if (endofblock(ls->token) || ls->token == ';') { /* Bare return. */ - ins = BCINS_AD(BC_RET0, 0, 1); - } else { /* Return with one or more values. */ - ExpDesc e; /* Receives the _last_ expression in the list. */ - BCReg nret = expr_list(ls, &e); - if (nret == 1) { /* Return one result. */ - if (e.k == VCALL) { /* Check for tail call. */ - BCIns *ip = bcptr(fs, &e); - /* It doesn't pay off to add BC_VARGT just for 'return ...'. */ - if (bc_op(*ip) == BC_VARG) goto notailcall; - fs->pc--; - ins = BCINS_AD(bc_op(*ip)-BC_CALL+BC_CALLT, bc_a(*ip), bc_c(*ip)); - } else { /* Can return the result from any register. */ - ins = BCINS_AD(BC_RET1, expr_toanyreg(fs, &e), 2); - } - } else { - if (e.k == VCALL) { /* Append all results from a call. */ - notailcall: - setbc_b(bcptr(fs, &e), 0); - ins = BCINS_AD(BC_RETM, fs->nactvar, e.u.s.aux - fs->nactvar); - } else { - expr_tonextreg(fs, &e); /* Force contiguous registers. */ - ins = BCINS_AD(BC_RET, fs->nactvar, nret+1); - } - } - } - if (fs->flags & PROTO_CHILD) - bcemit_AJ(fs, BC_UCLO, 0, 0); /* May need to close upvalues first. */ - bcemit_INS(fs, ins); -} - -/* Parse 'break' statement. */ -static void parse_break(LexState *ls) -{ - ls->fs->bl->flags |= FSCOPE_BREAK; - gola_new(ls, NAME_BREAK, VSTACK_GOTO, bcemit_jmp(ls->fs)); -} - -/* Parse 'goto' statement. */ -static void parse_goto(LexState *ls) -{ - FuncState *fs = ls->fs; - GCstr *name = lex_str(ls); - VarInfo *vl = gola_findlabel(ls, name); - if (vl) /* Treat backwards goto within same scope like a loop. */ - bcemit_AJ(fs, BC_LOOP, vl->slot, -1); /* No BC range check. */ - fs->bl->flags |= FSCOPE_GOLA; - gola_new(ls, name, VSTACK_GOTO, bcemit_jmp(fs)); -} - -/* Parse label. */ -static void parse_label(LexState *ls) -{ - FuncState *fs = ls->fs; - GCstr *name; - MSize idx; - fs->lasttarget = fs->pc; - fs->bl->flags |= FSCOPE_GOLA; - lj_lex_next(ls); /* Skip '::'. */ - name = lex_str(ls); - if (gola_findlabel(ls, name)) - lj_lex_error(ls, 0, LJ_ERR_XLDUP, strdata(name)); - idx = gola_new(ls, name, VSTACK_LABEL, fs->pc); - lex_check(ls, TK_label); - /* Recursively parse trailing statements: labels and ';' (Lua 5.2 only). */ - for (;;) { - if (ls->token == TK_label) { - synlevel_begin(ls); - parse_label(ls); - synlevel_end(ls); - } else if (LJ_52 && ls->token == ';') { - lj_lex_next(ls); - } else { - break; - } - } - /* Trailing label is considered to be outside of scope. */ - if (endofblock(ls->token) && ls->token != TK_until) - ls->vstack[idx].slot = fs->bl->nactvar; - gola_resolve(ls, fs->bl, idx); -} - -/* -- Blocks, loops and conditional statements ---------------------------- */ - -/* Parse a block. */ -static void parse_block(LexState *ls) -{ - FuncState *fs = ls->fs; - FuncScope bl; - fscope_begin(fs, &bl, 0); - parse_chunk(ls); - fscope_end(fs); -} - -/* Parse 'while' statement. */ -static void parse_while(LexState *ls, BCLine line) -{ - FuncState *fs = ls->fs; - BCPos start, loop, condexit; - FuncScope bl; - lj_lex_next(ls); /* Skip 'while'. */ - start = fs->lasttarget = fs->pc; - condexit = expr_cond(ls); - fscope_begin(fs, &bl, FSCOPE_LOOP); - lex_check(ls, TK_do); - loop = bcemit_AD(fs, BC_LOOP, fs->nactvar, 0); - parse_block(ls); - jmp_patch(fs, bcemit_jmp(fs), start); - lex_match(ls, TK_end, TK_while, line); - fscope_end(fs); - jmp_tohere(fs, condexit); - jmp_patchins(fs, loop, fs->pc); -} - -/* Parse 'repeat' statement. */ -static void parse_repeat(LexState *ls, BCLine line) -{ - FuncState *fs = ls->fs; - BCPos loop = fs->lasttarget = fs->pc; - BCPos condexit; - FuncScope bl1, bl2; - fscope_begin(fs, &bl1, FSCOPE_LOOP); /* Breakable loop scope. */ - fscope_begin(fs, &bl2, 0); /* Inner scope. */ - lj_lex_next(ls); /* Skip 'repeat'. */ - bcemit_AD(fs, BC_LOOP, fs->nactvar, 0); - parse_chunk(ls); - lex_match(ls, TK_until, TK_repeat, line); - condexit = expr_cond(ls); /* Parse condition (still inside inner scope). */ - if (!(bl2.flags & FSCOPE_UPVAL)) { /* No upvalues? Just end inner scope. */ - fscope_end(fs); - } else { /* Otherwise generate: cond: UCLO+JMP out, !cond: UCLO+JMP loop. */ - parse_break(ls); /* Break from loop and close upvalues. */ - jmp_tohere(fs, condexit); - fscope_end(fs); /* End inner scope and close upvalues. */ - condexit = bcemit_jmp(fs); - } - jmp_patch(fs, condexit, loop); /* Jump backwards if !cond. */ - jmp_patchins(fs, loop, fs->pc); - fscope_end(fs); /* End loop scope. */ -} - -/* Parse numeric 'for'. */ -static void parse_for_num(LexState *ls, GCstr *varname, BCLine line) -{ - FuncState *fs = ls->fs; - BCReg base = fs->freereg; - FuncScope bl; - BCPos loop, loopend; - /* Hidden control variables. */ - var_new_fixed(ls, FORL_IDX, VARNAME_FOR_IDX); - var_new_fixed(ls, FORL_STOP, VARNAME_FOR_STOP); - var_new_fixed(ls, FORL_STEP, VARNAME_FOR_STEP); - /* Visible copy of index variable. */ - var_new(ls, FORL_EXT, varname); - lex_check(ls, '='); - expr_next(ls); - lex_check(ls, ','); - expr_next(ls); - if (lex_opt(ls, ',')) { - expr_next(ls); - } else { - bcemit_AD(fs, BC_KSHORT, fs->freereg, 1); /* Default step is 1. */ - bcreg_reserve(fs, 1); - } - var_add(ls, 3); /* Hidden control variables. */ - lex_check(ls, TK_do); - loop = bcemit_AJ(fs, BC_FORI, base, NO_JMP); - fscope_begin(fs, &bl, 0); /* Scope for visible variables. */ - var_add(ls, 1); - bcreg_reserve(fs, 1); - parse_block(ls); - fscope_end(fs); - /* Perform loop inversion. Loop control instructions are at the end. */ - loopend = bcemit_AJ(fs, BC_FORL, base, NO_JMP); - fs->bcbase[loopend].line = line; /* Fix line for control ins. */ - jmp_patchins(fs, loopend, loop+1); - jmp_patchins(fs, loop, fs->pc); -} - -/* Try to predict whether the iterator is next() and specialize the bytecode. -** Detecting next() and pairs() by name is simplistic, but quite effective. -** The interpreter backs off if the check for the closure fails at runtime. -*/ -static int predict_next(LexState *ls, FuncState *fs, BCPos pc) -{ - BCIns ins = fs->bcbase[pc].ins; - GCstr *name; - cTValue *o; - switch (bc_op(ins)) { - case BC_MOV: - name = gco2str(gcref(var_get(ls, fs, bc_d(ins)).name)); - break; - case BC_UGET: - name = gco2str(gcref(ls->vstack[fs->uvmap[bc_d(ins)]].name)); - break; - case BC_GGET: - /* There's no inverse index (yet), so lookup the strings. */ - o = lj_tab_getstr(fs->kt, lj_str_newlit(ls->L, "pairs")); - if (o && tvhaskslot(o) && tvkslot(o) == bc_d(ins)) - return 1; - o = lj_tab_getstr(fs->kt, lj_str_newlit(ls->L, "next")); - if (o && tvhaskslot(o) && tvkslot(o) == bc_d(ins)) - return 1; - return 0; - default: - return 0; - } - return (name->len == 5 && !strcmp(strdata(name), "pairs")) || - (name->len == 4 && !strcmp(strdata(name), "next")); -} - -/* Parse 'for' iterator. */ -static void parse_for_iter(LexState *ls, GCstr *indexname) -{ - FuncState *fs = ls->fs; - ExpDesc e; - BCReg nvars = 0; - BCLine line; - BCReg base = fs->freereg + 3; - BCPos loop, loopend, exprpc = fs->pc; - FuncScope bl; - int isnext; - /* Hidden control variables. */ - var_new_fixed(ls, nvars++, VARNAME_FOR_GEN); - var_new_fixed(ls, nvars++, VARNAME_FOR_STATE); - var_new_fixed(ls, nvars++, VARNAME_FOR_CTL); - /* Visible variables returned from iterator. */ - var_new(ls, nvars++, indexname); - while (lex_opt(ls, ',')) - var_new(ls, nvars++, lex_str(ls)); - lex_check(ls, TK_in); - line = ls->linenumber; - assign_adjust(ls, 3, expr_list(ls, &e), &e); - bcreg_bump(fs, 3); /* The iterator needs another 3 slots (func + 2 args). */ - isnext = (nvars <= 5 && predict_next(ls, fs, exprpc)); - var_add(ls, 3); /* Hidden control variables. */ - lex_check(ls, TK_do); - loop = bcemit_AJ(fs, isnext ? BC_ISNEXT : BC_JMP, base, NO_JMP); - fscope_begin(fs, &bl, 0); /* Scope for visible variables. */ - var_add(ls, nvars-3); - bcreg_reserve(fs, nvars-3); - parse_block(ls); - fscope_end(fs); - /* Perform loop inversion. Loop control instructions are at the end. */ - jmp_patchins(fs, loop, fs->pc); - bcemit_ABC(fs, isnext ? BC_ITERN : BC_ITERC, base, nvars-3+1, 2+1); - loopend = bcemit_AJ(fs, BC_ITERL, base, NO_JMP); - fs->bcbase[loopend-1].line = line; /* Fix line for control ins. */ - fs->bcbase[loopend].line = line; - jmp_patchins(fs, loopend, loop+1); -} - -/* Parse 'for' statement. */ -static void parse_for(LexState *ls, BCLine line) -{ - FuncState *fs = ls->fs; - GCstr *varname; - FuncScope bl; - fscope_begin(fs, &bl, FSCOPE_LOOP); - lj_lex_next(ls); /* Skip 'for'. */ - varname = lex_str(ls); /* Get first variable name. */ - if (ls->token == '=') - parse_for_num(ls, varname, line); - else if (ls->token == ',' || ls->token == TK_in) - parse_for_iter(ls, varname); - else - err_syntax(ls, LJ_ERR_XFOR); - lex_match(ls, TK_end, TK_for, line); - fscope_end(fs); /* Resolve break list. */ -} - -/* Parse condition and 'then' block. */ -static BCPos parse_then(LexState *ls) -{ - BCPos condexit; - lj_lex_next(ls); /* Skip 'if' or 'elseif'. */ - condexit = expr_cond(ls); - lex_check(ls, TK_then); - parse_block(ls); - return condexit; -} - -/* Parse 'if' statement. */ -static void parse_if(LexState *ls, BCLine line) -{ - FuncState *fs = ls->fs; - BCPos flist; - BCPos escapelist = NO_JMP; - flist = parse_then(ls); - while (ls->token == TK_elseif) { /* Parse multiple 'elseif' blocks. */ - jmp_append(fs, &escapelist, bcemit_jmp(fs)); - jmp_tohere(fs, flist); - flist = parse_then(ls); - } - if (ls->token == TK_else) { /* Parse optional 'else' block. */ - jmp_append(fs, &escapelist, bcemit_jmp(fs)); - jmp_tohere(fs, flist); - lj_lex_next(ls); /* Skip 'else'. */ - parse_block(ls); - } else { - jmp_append(fs, &escapelist, flist); - } - jmp_tohere(fs, escapelist); - lex_match(ls, TK_end, TK_if, line); -} - -/* -- Parse statements ---------------------------------------------------- */ - -/* Parse a statement. Returns 1 if it must be the last one in a chunk. */ -static int parse_stmt(LexState *ls) -{ - BCLine line = ls->linenumber; - switch (ls->token) { - case TK_if: - parse_if(ls, line); - break; - case TK_while: - parse_while(ls, line); - break; - case TK_do: - lj_lex_next(ls); - parse_block(ls); - lex_match(ls, TK_end, TK_do, line); - break; - case TK_for: - parse_for(ls, line); - break; - case TK_repeat: - parse_repeat(ls, line); - break; - case TK_function: - parse_func(ls, line); - break; - case TK_local: - lj_lex_next(ls); - parse_local(ls); - break; - case TK_return: - parse_return(ls); - return 1; /* Must be last. */ - case TK_break: - lj_lex_next(ls); - parse_break(ls); - return !LJ_52; /* Must be last in Lua 5.1. */ -#if LJ_52 - case ';': - lj_lex_next(ls); - break; -#endif - case TK_label: - parse_label(ls); - break; - case TK_goto: - if (LJ_52 || lj_lex_lookahead(ls) == TK_name) { - lj_lex_next(ls); - parse_goto(ls); - break; - } /* else: fallthrough */ - default: - parse_call_assign(ls); - break; - } - return 0; -} - -/* A chunk is a list of statements optionally separated by semicolons. */ -static void parse_chunk(LexState *ls) -{ - int islast = 0; - synlevel_begin(ls); - while (!islast && !endofblock(ls->token)) { - islast = parse_stmt(ls); - lex_opt(ls, ';'); - lua_assert(ls->fs->framesize >= ls->fs->freereg && - ls->fs->freereg >= ls->fs->nactvar); - ls->fs->freereg = ls->fs->nactvar; /* Free registers after each stmt. */ - } - synlevel_end(ls); -} - -/* Entry point of bytecode parser. */ -GCproto *lj_parse(LexState *ls) -{ - FuncState fs; - FuncScope bl; - GCproto *pt; - lua_State *L = ls->L; -#ifdef LUAJIT_DISABLE_DEBUGINFO - ls->chunkname = lj_str_newlit(L, "="); -#else - ls->chunkname = lj_str_newz(L, ls->chunkarg); -#endif - setstrV(L, L->top, ls->chunkname); /* Anchor chunkname string. */ - incr_top(L); - ls->level = 0; - fs_init(ls, &fs); - fs.linedefined = 0; - fs.numparams = 0; - fs.bcbase = NULL; - fs.bclim = 0; - fs.flags |= PROTO_VARARG; /* Main chunk is always a vararg func. */ - fscope_begin(&fs, &bl, 0); - bcemit_AD(&fs, BC_FUNCV, 0, 0); /* Placeholder. */ - lj_lex_next(ls); /* Read-ahead first token. */ - parse_chunk(ls); - if (ls->token != TK_eof) - err_token(ls, TK_eof); - pt = fs_finish(ls, ls->linenumber); - L->top--; /* Drop chunkname. */ - lua_assert(fs.prev == NULL); - lua_assert(ls->fs == NULL); - lua_assert(pt->sizeuv == 0); - return pt; -} - diff --git a/deps/luajit/src/lj_parse.h b/deps/luajit/src/lj_parse.h deleted file mode 100644 index dc4fd405..00000000 --- a/deps/luajit/src/lj_parse.h +++ /dev/null @@ -1,18 +0,0 @@ -/* -** Lua parser (source code -> bytecode). -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#ifndef _LJ_PARSE_H -#define _LJ_PARSE_H - -#include "lj_obj.h" -#include "lj_lex.h" - -LJ_FUNC GCproto *lj_parse(LexState *ls); -LJ_FUNC GCstr *lj_parse_keepstr(LexState *ls, const char *str, size_t l); -#if LJ_HASFFI -LJ_FUNC void lj_parse_keepcdata(LexState *ls, TValue *tv, GCcdata *cd); -#endif - -#endif diff --git a/deps/luajit/src/lj_record.c b/deps/luajit/src/lj_record.c deleted file mode 100644 index 843108c8..00000000 --- a/deps/luajit/src/lj_record.c +++ /dev/null @@ -1,2252 +0,0 @@ -/* -** Trace recorder (bytecode -> SSA IR). -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#define lj_record_c -#define LUA_CORE - -#include "lj_obj.h" - -#if LJ_HASJIT - -#include "lj_err.h" -#include "lj_str.h" -#include "lj_tab.h" -#include "lj_meta.h" -#include "lj_frame.h" -#if LJ_HASFFI -#include "lj_ctype.h" -#endif -#include "lj_bc.h" -#include "lj_ff.h" -#include "lj_ir.h" -#include "lj_jit.h" -#include "lj_ircall.h" -#include "lj_iropt.h" -#include "lj_trace.h" -#include "lj_record.h" -#include "lj_ffrecord.h" -#include "lj_snap.h" -#include "lj_dispatch.h" -#include "lj_vm.h" - -/* Some local macros to save typing. Undef'd at the end. */ -#define IR(ref) (&J->cur.ir[(ref)]) - -/* Pass IR on to next optimization in chain (FOLD). */ -#define emitir(ot, a, b) (lj_ir_set(J, (ot), (a), (b)), lj_opt_fold(J)) - -/* Emit raw IR without passing through optimizations. */ -#define emitir_raw(ot, a, b) (lj_ir_set(J, (ot), (a), (b)), lj_ir_emit(J)) - -/* -- Sanity checks ------------------------------------------------------- */ - -#ifdef LUA_USE_ASSERT -/* Sanity check the whole IR -- sloooow. */ -static void rec_check_ir(jit_State *J) -{ - IRRef i, nins = J->cur.nins, nk = J->cur.nk; - lua_assert(nk <= REF_BIAS && nins >= REF_BIAS && nins < 65536); - for (i = nins-1; i >= nk; i--) { - IRIns *ir = IR(i); - uint32_t mode = lj_ir_mode[ir->o]; - IRRef op1 = ir->op1; - IRRef op2 = ir->op2; - switch (irm_op1(mode)) { - case IRMnone: lua_assert(op1 == 0); break; - case IRMref: lua_assert(op1 >= nk); - lua_assert(i >= REF_BIAS ? op1 < i : op1 > i); break; - case IRMlit: break; - case IRMcst: lua_assert(i < REF_BIAS); continue; - } - switch (irm_op2(mode)) { - case IRMnone: lua_assert(op2 == 0); break; - case IRMref: lua_assert(op2 >= nk); - lua_assert(i >= REF_BIAS ? op2 < i : op2 > i); break; - case IRMlit: break; - case IRMcst: lua_assert(0); break; - } - if (ir->prev) { - lua_assert(ir->prev >= nk); - lua_assert(i >= REF_BIAS ? ir->prev < i : ir->prev > i); - lua_assert(ir->o == IR_NOP || IR(ir->prev)->o == ir->o); - } - } -} - -/* Compare stack slots and frames of the recorder and the VM. */ -static void rec_check_slots(jit_State *J) -{ - BCReg s, nslots = J->baseslot + J->maxslot; - int32_t depth = 0; - cTValue *base = J->L->base - J->baseslot; - lua_assert(J->baseslot >= 1 && J->baseslot < LJ_MAX_JSLOTS); - lua_assert(J->baseslot == 1 || (J->slot[J->baseslot-1] & TREF_FRAME)); - lua_assert(nslots < LJ_MAX_JSLOTS); - for (s = 0; s < nslots; s++) { - TRef tr = J->slot[s]; - if (tr) { - cTValue *tv = &base[s]; - IRRef ref = tref_ref(tr); - IRIns *ir; - lua_assert(ref >= J->cur.nk && ref < J->cur.nins); - ir = IR(ref); - lua_assert(irt_t(ir->t) == tref_t(tr)); - if (s == 0) { - lua_assert(tref_isfunc(tr)); - } else if ((tr & TREF_FRAME)) { - GCfunc *fn = gco2func(frame_gc(tv)); - BCReg delta = (BCReg)(tv - frame_prev(tv)); - lua_assert(tref_isfunc(tr)); - if (tref_isk(tr)) lua_assert(fn == ir_kfunc(ir)); - lua_assert(s > delta ? (J->slot[s-delta] & TREF_FRAME) : (s == delta)); - depth++; - } else if ((tr & TREF_CONT)) { - lua_assert(ir_kptr(ir) == gcrefp(tv->gcr, void)); - lua_assert((J->slot[s+1] & TREF_FRAME)); - depth++; - } else { - if (tvisnumber(tv)) - lua_assert(tref_isnumber(tr)); /* Could be IRT_INT etc., too. */ - else - lua_assert(itype2irt(tv) == tref_type(tr)); - if (tref_isk(tr)) { /* Compare constants. */ - TValue tvk; - lj_ir_kvalue(J->L, &tvk, ir); - if (!(tvisnum(&tvk) && tvisnan(&tvk))) - lua_assert(lj_obj_equal(tv, &tvk)); - else - lua_assert(tvisnum(tv) && tvisnan(tv)); - } - } - } - } - lua_assert(J->framedepth == depth); -} -#endif - -/* -- Type handling and specialization ------------------------------------ */ - -/* Note: these functions return tagged references (TRef). */ - -/* Specialize a slot to a specific type. Note: slot can be negative! */ -static TRef sloadt(jit_State *J, int32_t slot, IRType t, int mode) -{ - /* Caller may set IRT_GUARD in t. */ - TRef ref = emitir_raw(IRT(IR_SLOAD, t), (int32_t)J->baseslot+slot, mode); - J->base[slot] = ref; - return ref; -} - -/* Specialize a slot to the runtime type. Note: slot can be negative! */ -static TRef sload(jit_State *J, int32_t slot) -{ - IRType t = itype2irt(&J->L->base[slot]); - TRef ref = emitir_raw(IRTG(IR_SLOAD, t), (int32_t)J->baseslot+slot, - IRSLOAD_TYPECHECK); - if (irtype_ispri(t)) ref = TREF_PRI(t); /* Canonicalize primitive refs. */ - J->base[slot] = ref; - return ref; -} - -/* Get TRef from slot. Load slot and specialize if not done already. */ -#define getslot(J, s) (J->base[(s)] ? J->base[(s)] : sload(J, (int32_t)(s))) - -/* Get TRef for current function. */ -static TRef getcurrf(jit_State *J) -{ - if (J->base[-1]) - return J->base[-1]; - lua_assert(J->baseslot == 1); - return sloadt(J, -1, IRT_FUNC, IRSLOAD_READONLY); -} - -/* Compare for raw object equality. -** Returns 0 if the objects are the same. -** Returns 1 if they are different, but the same type. -** Returns 2 for two different types. -** Comparisons between primitives always return 1 -- no caller cares about it. -*/ -int lj_record_objcmp(jit_State *J, TRef a, TRef b, cTValue *av, cTValue *bv) -{ - int diff = !lj_obj_equal(av, bv); - if (!tref_isk2(a, b)) { /* Shortcut, also handles primitives. */ - IRType ta = tref_isinteger(a) ? IRT_INT : tref_type(a); - IRType tb = tref_isinteger(b) ? IRT_INT : tref_type(b); - if (ta != tb) { - /* Widen mixed number/int comparisons to number/number comparison. */ - if (ta == IRT_INT && tb == IRT_NUM) { - a = emitir(IRTN(IR_CONV), a, IRCONV_NUM_INT); - ta = IRT_NUM; - } else if (ta == IRT_NUM && tb == IRT_INT) { - b = emitir(IRTN(IR_CONV), b, IRCONV_NUM_INT); - } else { - return 2; /* Two different types are never equal. */ - } - } - emitir(IRTG(diff ? IR_NE : IR_EQ, ta), a, b); - } - return diff; -} - -/* Constify a value. Returns 0 for non-representable object types. */ -TRef lj_record_constify(jit_State *J, cTValue *o) -{ - if (tvisgcv(o)) - return lj_ir_kgc(J, gcV(o), itype2irt(o)); - else if (tvisint(o)) - return lj_ir_kint(J, intV(o)); - else if (tvisnum(o)) - return lj_ir_knumint(J, numV(o)); - else if (tvisbool(o)) - return TREF_PRI(itype2irt(o)); - else - return 0; /* Can't represent lightuserdata (pointless). */ -} - -/* -- Record loop ops ----------------------------------------------------- */ - -/* Loop event. */ -typedef enum { - LOOPEV_LEAVE, /* Loop is left or not entered. */ - LOOPEV_ENTERLO, /* Loop is entered with a low iteration count left. */ - LOOPEV_ENTER /* Loop is entered. */ -} LoopEvent; - -/* Canonicalize slots: convert integers to numbers. */ -static void canonicalize_slots(jit_State *J) -{ - BCReg s; - if (LJ_DUALNUM) return; - for (s = J->baseslot+J->maxslot-1; s >= 1; s--) { - TRef tr = J->slot[s]; - if (tref_isinteger(tr)) { - IRIns *ir = IR(tref_ref(tr)); - if (!(ir->o == IR_SLOAD && (ir->op2 & IRSLOAD_READONLY))) - J->slot[s] = emitir(IRTN(IR_CONV), tr, IRCONV_NUM_INT); - } - } -} - -/* Stop recording. */ -static void rec_stop(jit_State *J, TraceLink linktype, TraceNo lnk) -{ - lj_trace_end(J); - J->cur.linktype = (uint8_t)linktype; - J->cur.link = (uint16_t)lnk; - /* Looping back at the same stack level? */ - if (lnk == J->cur.traceno && J->framedepth + J->retdepth == 0) { - if ((J->flags & JIT_F_OPT_LOOP)) /* Shall we try to create a loop? */ - goto nocanon; /* Do not canonicalize or we lose the narrowing. */ - if (J->cur.root) /* Otherwise ensure we always link to the root trace. */ - J->cur.link = J->cur.root; - } - canonicalize_slots(J); -nocanon: - /* Note: all loop ops must set J->pc to the following instruction! */ - lj_snap_add(J); /* Add loop snapshot. */ - J->needsnap = 0; - J->mergesnap = 1; /* In case recording continues. */ -} - -/* Search bytecode backwards for a int/num constant slot initializer. */ -static TRef find_kinit(jit_State *J, const BCIns *endpc, BCReg slot, IRType t) -{ - /* This algorithm is rather simplistic and assumes quite a bit about - ** how the bytecode is generated. It works fine for FORI initializers, - ** but it won't necessarily work in other cases (e.g. iterator arguments). - ** It doesn't do anything fancy, either (like backpropagating MOVs). - */ - const BCIns *pc, *startpc = proto_bc(J->pt); - for (pc = endpc-1; pc > startpc; pc--) { - BCIns ins = *pc; - BCOp op = bc_op(ins); - /* First try to find the last instruction that stores to this slot. */ - if (bcmode_a(op) == BCMbase && bc_a(ins) <= slot) { - return 0; /* Multiple results, e.g. from a CALL or KNIL. */ - } else if (bcmode_a(op) == BCMdst && bc_a(ins) == slot) { - if (op == BC_KSHORT || op == BC_KNUM) { /* Found const. initializer. */ - /* Now try to verify there's no forward jump across it. */ - const BCIns *kpc = pc; - for (; pc > startpc; pc--) - if (bc_op(*pc) == BC_JMP) { - const BCIns *target = pc+bc_j(*pc)+1; - if (target > kpc && target <= endpc) - return 0; /* Conditional assignment. */ - } - if (op == BC_KSHORT) { - int32_t k = (int32_t)(int16_t)bc_d(ins); - return t == IRT_INT ? lj_ir_kint(J, k) : lj_ir_knum(J, (lua_Number)k); - } else { - cTValue *tv = proto_knumtv(J->pt, bc_d(ins)); - if (t == IRT_INT) { - int32_t k = numberVint(tv); - if (tvisint(tv) || numV(tv) == (lua_Number)k) /* -0 is ok here. */ - return lj_ir_kint(J, k); - return 0; /* Type mismatch. */ - } else { - return lj_ir_knum(J, numberVnum(tv)); - } - } - } - return 0; /* Non-constant initializer. */ - } - } - return 0; /* No assignment to this slot found? */ -} - -/* Load and optionally convert a FORI argument from a slot. */ -static TRef fori_load(jit_State *J, BCReg slot, IRType t, int mode) -{ - int conv = (tvisint(&J->L->base[slot]) != (t==IRT_INT)) ? IRSLOAD_CONVERT : 0; - return sloadt(J, (int32_t)slot, - t + (((mode & IRSLOAD_TYPECHECK) || - (conv && t == IRT_INT && !(mode >> 16))) ? - IRT_GUARD : 0), - mode + conv); -} - -/* Peek before FORI to find a const initializer. Otherwise load from slot. */ -static TRef fori_arg(jit_State *J, const BCIns *fori, BCReg slot, - IRType t, int mode) -{ - TRef tr = J->base[slot]; - if (!tr) { - tr = find_kinit(J, fori, slot, t); - if (!tr) - tr = fori_load(J, slot, t, mode); - } - return tr; -} - -/* Return the direction of the FOR loop iterator. -** It's important to exactly reproduce the semantics of the interpreter. -*/ -static int rec_for_direction(cTValue *o) -{ - return (tvisint(o) ? intV(o) : (int32_t)o->u32.hi) >= 0; -} - -/* Simulate the runtime behavior of the FOR loop iterator. */ -static LoopEvent rec_for_iter(IROp *op, cTValue *o, int isforl) -{ - lua_Number stopv = numberVnum(&o[FORL_STOP]); - lua_Number idxv = numberVnum(&o[FORL_IDX]); - lua_Number stepv = numberVnum(&o[FORL_STEP]); - if (isforl) - idxv += stepv; - if (rec_for_direction(&o[FORL_STEP])) { - if (idxv <= stopv) { - *op = IR_LE; - return idxv + 2*stepv > stopv ? LOOPEV_ENTERLO : LOOPEV_ENTER; - } - *op = IR_GT; return LOOPEV_LEAVE; - } else { - if (stopv <= idxv) { - *op = IR_GE; - return idxv + 2*stepv < stopv ? LOOPEV_ENTERLO : LOOPEV_ENTER; - } - *op = IR_LT; return LOOPEV_LEAVE; - } -} - -/* Record checks for FOR loop overflow and step direction. */ -static void rec_for_check(jit_State *J, IRType t, int dir, - TRef stop, TRef step, int init) -{ - if (!tref_isk(step)) { - /* Non-constant step: need a guard for the direction. */ - TRef zero = (t == IRT_INT) ? lj_ir_kint(J, 0) : lj_ir_knum_zero(J); - emitir(IRTG(dir ? IR_GE : IR_LT, t), step, zero); - /* Add hoistable overflow checks for a narrowed FORL index. */ - if (init && t == IRT_INT) { - if (tref_isk(stop)) { - /* Constant stop: optimize check away or to a range check for step. */ - int32_t k = IR(tref_ref(stop))->i; - if (dir) { - if (k > 0) - emitir(IRTGI(IR_LE), step, lj_ir_kint(J, (int32_t)0x7fffffff-k)); - } else { - if (k < 0) - emitir(IRTGI(IR_GE), step, lj_ir_kint(J, (int32_t)0x80000000-k)); - } - } else { - /* Stop+step variable: need full overflow check. */ - TRef tr = emitir(IRTGI(IR_ADDOV), step, stop); - emitir(IRTI(IR_USE), tr, 0); /* ADDOV is weak. Avoid dead result. */ - } - } - } else if (init && t == IRT_INT && !tref_isk(stop)) { - /* Constant step: optimize overflow check to a range check for stop. */ - int32_t k = IR(tref_ref(step))->i; - k = (int32_t)(dir ? 0x7fffffff : 0x80000000) - k; - emitir(IRTGI(dir ? IR_LE : IR_GE), stop, lj_ir_kint(J, k)); - } -} - -/* Record a FORL instruction. */ -static void rec_for_loop(jit_State *J, const BCIns *fori, ScEvEntry *scev, - int init) -{ - BCReg ra = bc_a(*fori); - cTValue *tv = &J->L->base[ra]; - TRef idx = J->base[ra+FORL_IDX]; - IRType t = idx ? tref_type(idx) : - (init || LJ_DUALNUM) ? lj_opt_narrow_forl(J, tv) : IRT_NUM; - int mode = IRSLOAD_INHERIT + - ((!LJ_DUALNUM || tvisint(tv) == (t == IRT_INT)) ? IRSLOAD_READONLY : 0); - TRef stop = fori_arg(J, fori, ra+FORL_STOP, t, mode); - TRef step = fori_arg(J, fori, ra+FORL_STEP, t, mode); - int tc, dir = rec_for_direction(&tv[FORL_STEP]); - lua_assert(bc_op(*fori) == BC_FORI || bc_op(*fori) == BC_JFORI); - scev->t.irt = t; - scev->dir = dir; - scev->stop = tref_ref(stop); - scev->step = tref_ref(step); - rec_for_check(J, t, dir, stop, step, init); - scev->start = tref_ref(find_kinit(J, fori, ra+FORL_IDX, IRT_INT)); - tc = (LJ_DUALNUM && - !(scev->start && irref_isk(scev->stop) && irref_isk(scev->step) && - tvisint(&tv[FORL_IDX]) == (t == IRT_INT))) ? - IRSLOAD_TYPECHECK : 0; - if (tc) { - J->base[ra+FORL_STOP] = stop; - J->base[ra+FORL_STEP] = step; - } - if (!idx) - idx = fori_load(J, ra+FORL_IDX, t, - IRSLOAD_INHERIT + tc + (J->scev.start << 16)); - if (!init) - J->base[ra+FORL_IDX] = idx = emitir(IRT(IR_ADD, t), idx, step); - J->base[ra+FORL_EXT] = idx; - scev->idx = tref_ref(idx); - setmref(scev->pc, fori); - J->maxslot = ra+FORL_EXT+1; -} - -/* Record FORL/JFORL or FORI/JFORI. */ -static LoopEvent rec_for(jit_State *J, const BCIns *fori, int isforl) -{ - BCReg ra = bc_a(*fori); - TValue *tv = &J->L->base[ra]; - TRef *tr = &J->base[ra]; - IROp op; - LoopEvent ev; - TRef stop; - IRType t; - if (isforl) { /* Handle FORL/JFORL opcodes. */ - TRef idx = tr[FORL_IDX]; - if (mref(J->scev.pc, const BCIns) == fori && tref_ref(idx) == J->scev.idx) { - t = J->scev.t.irt; - stop = J->scev.stop; - idx = emitir(IRT(IR_ADD, t), idx, J->scev.step); - tr[FORL_EXT] = tr[FORL_IDX] = idx; - } else { - ScEvEntry scev; - rec_for_loop(J, fori, &scev, 0); - t = scev.t.irt; - stop = scev.stop; - } - } else { /* Handle FORI/JFORI opcodes. */ - BCReg i; - lj_meta_for(J->L, tv); - t = (LJ_DUALNUM || tref_isint(tr[FORL_IDX])) ? lj_opt_narrow_forl(J, tv) : - IRT_NUM; - for (i = FORL_IDX; i <= FORL_STEP; i++) { - if (!tr[i]) sload(J, ra+i); - lua_assert(tref_isnumber_str(tr[i])); - if (tref_isstr(tr[i])) - tr[i] = emitir(IRTG(IR_STRTO, IRT_NUM), tr[i], 0); - if (t == IRT_INT) { - if (!tref_isinteger(tr[i])) - tr[i] = emitir(IRTGI(IR_CONV), tr[i], IRCONV_INT_NUM|IRCONV_CHECK); - } else { - if (!tref_isnum(tr[i])) - tr[i] = emitir(IRTN(IR_CONV), tr[i], IRCONV_NUM_INT); - } - } - tr[FORL_EXT] = tr[FORL_IDX]; - stop = tr[FORL_STOP]; - rec_for_check(J, t, rec_for_direction(&tv[FORL_STEP]), - stop, tr[FORL_STEP], 1); - } - - ev = rec_for_iter(&op, tv, isforl); - if (ev == LOOPEV_LEAVE) { - J->maxslot = ra+FORL_EXT+1; - J->pc = fori+1; - } else { - J->maxslot = ra; - J->pc = fori+bc_j(*fori)+1; - } - lj_snap_add(J); - - emitir(IRTG(op, t), tr[FORL_IDX], stop); - - if (ev == LOOPEV_LEAVE) { - J->maxslot = ra; - J->pc = fori+bc_j(*fori)+1; - } else { - J->maxslot = ra+FORL_EXT+1; - J->pc = fori+1; - } - J->needsnap = 1; - return ev; -} - -/* Record ITERL/JITERL. */ -static LoopEvent rec_iterl(jit_State *J, const BCIns iterins) -{ - BCReg ra = bc_a(iterins); - lua_assert(J->base[ra] != 0); - if (!tref_isnil(J->base[ra])) { /* Looping back? */ - J->base[ra-1] = J->base[ra]; /* Copy result of ITERC to control var. */ - J->maxslot = ra-1+bc_b(J->pc[-1]); - J->pc += bc_j(iterins)+1; - return LOOPEV_ENTER; - } else { - J->maxslot = ra-3; - J->pc++; - return LOOPEV_LEAVE; - } -} - -/* Record LOOP/JLOOP. Now, that was easy. */ -static LoopEvent rec_loop(jit_State *J, BCReg ra) -{ - if (ra < J->maxslot) J->maxslot = ra; - J->pc++; - return LOOPEV_ENTER; -} - -/* Check if a loop repeatedly failed to trace because it didn't loop back. */ -static int innerloopleft(jit_State *J, const BCIns *pc) -{ - ptrdiff_t i; - for (i = 0; i < PENALTY_SLOTS; i++) - if (mref(J->penalty[i].pc, const BCIns) == pc) { - if ((J->penalty[i].reason == LJ_TRERR_LLEAVE || - J->penalty[i].reason == LJ_TRERR_LINNER) && - J->penalty[i].val >= 2*PENALTY_MIN) - return 1; - break; - } - return 0; -} - -/* Handle the case when an interpreted loop op is hit. */ -static void rec_loop_interp(jit_State *J, const BCIns *pc, LoopEvent ev) -{ - if (J->parent == 0) { - if (pc == J->startpc && J->framedepth + J->retdepth == 0) { - /* Same loop? */ - if (ev == LOOPEV_LEAVE) /* Must loop back to form a root trace. */ - lj_trace_err(J, LJ_TRERR_LLEAVE); - rec_stop(J, LJ_TRLINK_LOOP, J->cur.traceno); /* Looping root trace. */ - } else if (ev != LOOPEV_LEAVE) { /* Entering inner loop? */ - /* It's usually better to abort here and wait until the inner loop - ** is traced. But if the inner loop repeatedly didn't loop back, - ** this indicates a low trip count. In this case try unrolling - ** an inner loop even in a root trace. But it's better to be a bit - ** more conservative here and only do it for very short loops. - */ - if (bc_j(*pc) != -1 && !innerloopleft(J, pc)) - lj_trace_err(J, LJ_TRERR_LINNER); /* Root trace hit an inner loop. */ - if ((ev != LOOPEV_ENTERLO && - J->loopref && J->cur.nins - J->loopref > 24) || --J->loopunroll < 0) - lj_trace_err(J, LJ_TRERR_LUNROLL); /* Limit loop unrolling. */ - J->loopref = J->cur.nins; - } - } else if (ev != LOOPEV_LEAVE) { /* Side trace enters an inner loop. */ - J->loopref = J->cur.nins; - if (--J->loopunroll < 0) - lj_trace_err(J, LJ_TRERR_LUNROLL); /* Limit loop unrolling. */ - } /* Side trace continues across a loop that's left or not entered. */ -} - -/* Handle the case when an already compiled loop op is hit. */ -static void rec_loop_jit(jit_State *J, TraceNo lnk, LoopEvent ev) -{ - if (J->parent == 0) { /* Root trace hit an inner loop. */ - /* Better let the inner loop spawn a side trace back here. */ - lj_trace_err(J, LJ_TRERR_LINNER); - } else if (ev != LOOPEV_LEAVE) { /* Side trace enters a compiled loop. */ - J->instunroll = 0; /* Cannot continue across a compiled loop op. */ - if (J->pc == J->startpc && J->framedepth + J->retdepth == 0) - rec_stop(J, LJ_TRLINK_LOOP, J->cur.traceno); /* Form an extra loop. */ - else - rec_stop(J, LJ_TRLINK_ROOT, lnk); /* Link to the loop. */ - } /* Side trace continues across a loop that's left or not entered. */ -} - -/* -- Record calls and returns -------------------------------------------- */ - -/* Specialize to the runtime value of the called function or its prototype. */ -static TRef rec_call_specialize(jit_State *J, GCfunc *fn, TRef tr) -{ - TRef kfunc; - if (isluafunc(fn)) { - GCproto *pt = funcproto(fn); - /* Too many closures created? Probably not a monomorphic function. */ - if (pt->flags >= PROTO_CLC_POLY) { /* Specialize to prototype instead. */ - TRef trpt = emitir(IRT(IR_FLOAD, IRT_P32), tr, IRFL_FUNC_PC); - emitir(IRTG(IR_EQ, IRT_P32), trpt, lj_ir_kptr(J, proto_bc(pt))); - (void)lj_ir_kgc(J, obj2gco(pt), IRT_PROTO); /* Prevent GC of proto. */ - return tr; - } - } - /* Otherwise specialize to the function (closure) value itself. */ - kfunc = lj_ir_kfunc(J, fn); - emitir(IRTG(IR_EQ, IRT_FUNC), tr, kfunc); - return kfunc; -} - -/* Record call setup. */ -static void rec_call_setup(jit_State *J, BCReg func, ptrdiff_t nargs) -{ - RecordIndex ix; - TValue *functv = &J->L->base[func]; - TRef *fbase = &J->base[func]; - ptrdiff_t i; - for (i = 0; i <= nargs; i++) - (void)getslot(J, func+i); /* Ensure func and all args have a reference. */ - if (!tref_isfunc(fbase[0])) { /* Resolve __call metamethod. */ - ix.tab = fbase[0]; - copyTV(J->L, &ix.tabv, functv); - if (!lj_record_mm_lookup(J, &ix, MM_call) || !tref_isfunc(ix.mobj)) - lj_trace_err(J, LJ_TRERR_NOMM); - for (i = ++nargs; i > 0; i--) /* Shift arguments up. */ - fbase[i] = fbase[i-1]; - fbase[0] = ix.mobj; /* Replace function. */ - functv = &ix.mobjv; - } - fbase[0] = TREF_FRAME | rec_call_specialize(J, funcV(functv), fbase[0]); - J->maxslot = (BCReg)nargs; -} - -/* Record call. */ -void lj_record_call(jit_State *J, BCReg func, ptrdiff_t nargs) -{ - rec_call_setup(J, func, nargs); - /* Bump frame. */ - J->framedepth++; - J->base += func+1; - J->baseslot += func+1; -} - -/* Record tail call. */ -void lj_record_tailcall(jit_State *J, BCReg func, ptrdiff_t nargs) -{ - rec_call_setup(J, func, nargs); - if (frame_isvarg(J->L->base - 1)) { - BCReg cbase = (BCReg)frame_delta(J->L->base - 1); - if (--J->framedepth < 0) - lj_trace_err(J, LJ_TRERR_NYIRETL); - J->baseslot -= (BCReg)cbase; - J->base -= cbase; - func += cbase; - } - /* Move func + args down. */ - memmove(&J->base[-1], &J->base[func], sizeof(TRef)*(J->maxslot+1)); - /* Note: the new TREF_FRAME is now at J->base[-1] (even for slot #0). */ - /* Tailcalls can form a loop, so count towards the loop unroll limit. */ - if (++J->tailcalled > J->loopunroll) - lj_trace_err(J, LJ_TRERR_LUNROLL); -} - -/* Check unroll limits for down-recursion. */ -static int check_downrec_unroll(jit_State *J, GCproto *pt) -{ - IRRef ptref; - for (ptref = J->chain[IR_KGC]; ptref; ptref = IR(ptref)->prev) - if (ir_kgc(IR(ptref)) == obj2gco(pt)) { - int count = 0; - IRRef ref; - for (ref = J->chain[IR_RETF]; ref; ref = IR(ref)->prev) - if (IR(ref)->op1 == ptref) - count++; - if (count) { - if (J->pc == J->startpc) { - if (count + J->tailcalled > J->param[JIT_P_recunroll]) - return 1; - } else { - lj_trace_err(J, LJ_TRERR_DOWNREC); - } - } - } - return 0; -} - -/* Record return. */ -void lj_record_ret(jit_State *J, BCReg rbase, ptrdiff_t gotresults) -{ - TValue *frame = J->L->base - 1; - ptrdiff_t i; - for (i = 0; i < gotresults; i++) - (void)getslot(J, rbase+i); /* Ensure all results have a reference. */ - while (frame_ispcall(frame)) { /* Immediately resolve pcall() returns. */ - BCReg cbase = (BCReg)frame_delta(frame); - if (--J->framedepth < 0) - lj_trace_err(J, LJ_TRERR_NYIRETL); - lua_assert(J->baseslot > 1); - gotresults++; - rbase += cbase; - J->baseslot -= (BCReg)cbase; - J->base -= cbase; - J->base[--rbase] = TREF_TRUE; /* Prepend true to results. */ - frame = frame_prevd(frame); - } - /* Return to lower frame via interpreter for unhandled cases. */ - if (J->framedepth == 0 && J->pt && bc_isret(bc_op(*J->pc)) && - (!frame_islua(frame) || - (J->parent == 0 && !bc_isret(bc_op(J->cur.startins))))) { - /* NYI: specialize to frame type and return directly, not via RET*. */ - for (i = 0; i < (ptrdiff_t)rbase; i++) - J->base[i] = 0; /* Purge dead slots. */ - J->maxslot = rbase + (BCReg)gotresults; - rec_stop(J, LJ_TRLINK_RETURN, 0); /* Return to interpreter. */ - return; - } - if (frame_isvarg(frame)) { - BCReg cbase = (BCReg)frame_delta(frame); - if (--J->framedepth < 0) /* NYI: return of vararg func to lower frame. */ - lj_trace_err(J, LJ_TRERR_NYIRETL); - lua_assert(J->baseslot > 1); - rbase += cbase; - J->baseslot -= (BCReg)cbase; - J->base -= cbase; - frame = frame_prevd(frame); - } - if (frame_islua(frame)) { /* Return to Lua frame. */ - BCIns callins = *(frame_pc(frame)-1); - ptrdiff_t nresults = bc_b(callins) ? (ptrdiff_t)bc_b(callins)-1 :gotresults; - BCReg cbase = bc_a(callins); - GCproto *pt = funcproto(frame_func(frame - (cbase+1))); - if ((pt->flags & PROTO_NOJIT)) - lj_trace_err(J, LJ_TRERR_CJITOFF); - if (J->framedepth == 0 && J->pt && frame == J->L->base - 1) { - if (check_downrec_unroll(J, pt)) { - J->maxslot = (BCReg)(rbase + gotresults); - lj_snap_purge(J); - rec_stop(J, LJ_TRLINK_DOWNREC, J->cur.traceno); /* Down-recursion. */ - return; - } - lj_snap_add(J); - } - for (i = 0; i < nresults; i++) /* Adjust results. */ - J->base[i-1] = i < gotresults ? J->base[rbase+i] : TREF_NIL; - J->maxslot = cbase+(BCReg)nresults; - if (J->framedepth > 0) { /* Return to a frame that is part of the trace. */ - J->framedepth--; - lua_assert(J->baseslot > cbase+1); - J->baseslot -= cbase+1; - J->base -= cbase+1; - } else if (J->parent == 0 && !bc_isret(bc_op(J->cur.startins))) { - /* Return to lower frame would leave the loop in a root trace. */ - lj_trace_err(J, LJ_TRERR_LLEAVE); - } else if (J->needsnap) { /* Tailcalled to ff with side-effects. */ - lj_trace_err(J, LJ_TRERR_NYIRETL); /* No way to insert snapshot here. */ - } else { /* Return to lower frame. Guard for the target we return to. */ - TRef trpt = lj_ir_kgc(J, obj2gco(pt), IRT_PROTO); - TRef trpc = lj_ir_kptr(J, (void *)frame_pc(frame)); - emitir(IRTG(IR_RETF, IRT_P32), trpt, trpc); - J->retdepth++; - J->needsnap = 1; - lua_assert(J->baseslot == 1); - /* Shift result slots up and clear the slots of the new frame below. */ - memmove(J->base + cbase, J->base-1, sizeof(TRef)*nresults); - memset(J->base-1, 0, sizeof(TRef)*(cbase+1)); - } - } else if (frame_iscont(frame)) { /* Return to continuation frame. */ - ASMFunction cont = frame_contf(frame); - BCReg cbase = (BCReg)frame_delta(frame); - if ((J->framedepth -= 2) < 0) - lj_trace_err(J, LJ_TRERR_NYIRETL); - J->baseslot -= (BCReg)cbase; - J->base -= cbase; - J->maxslot = cbase-2; - if (cont == lj_cont_ra) { - /* Copy result to destination slot. */ - BCReg dst = bc_a(*(frame_contpc(frame)-1)); - J->base[dst] = gotresults ? J->base[cbase+rbase] : TREF_NIL; - if (dst >= J->maxslot) J->maxslot = dst+1; - } else if (cont == lj_cont_nop) { - /* Nothing to do here. */ - } else if (cont == lj_cont_cat) { - lua_assert(0); - } else { - /* Result type already specialized. */ - lua_assert(cont == lj_cont_condf || cont == lj_cont_condt); - } - } else { - lj_trace_err(J, LJ_TRERR_NYIRETL); /* NYI: handle return to C frame. */ - } - lua_assert(J->baseslot >= 1); -} - -/* -- Metamethod handling ------------------------------------------------- */ - -/* Prepare to record call to metamethod. */ -static BCReg rec_mm_prep(jit_State *J, ASMFunction cont) -{ - BCReg s, top = curr_proto(J->L)->framesize; - TRef trcont; - setcont(&J->L->base[top], cont); -#if LJ_64 - trcont = lj_ir_kptr(J, (void *)((int64_t)cont - (int64_t)lj_vm_asm_begin)); -#else - trcont = lj_ir_kptr(J, (void *)cont); -#endif - J->base[top] = trcont | TREF_CONT; - J->framedepth++; - for (s = J->maxslot; s < top; s++) - J->base[s] = 0; /* Clear frame gap to avoid resurrecting previous refs. */ - return top+1; -} - -/* Record metamethod lookup. */ -int lj_record_mm_lookup(jit_State *J, RecordIndex *ix, MMS mm) -{ - RecordIndex mix; - GCtab *mt; - if (tref_istab(ix->tab)) { - mt = tabref(tabV(&ix->tabv)->metatable); - mix.tab = emitir(IRT(IR_FLOAD, IRT_TAB), ix->tab, IRFL_TAB_META); - } else if (tref_isudata(ix->tab)) { - int udtype = udataV(&ix->tabv)->udtype; - mt = tabref(udataV(&ix->tabv)->metatable); - /* The metatables of special userdata objects are treated as immutable. */ - if (udtype != UDTYPE_USERDATA) { - cTValue *mo; - if (LJ_HASFFI && udtype == UDTYPE_FFI_CLIB) { - /* Specialize to the C library namespace object. */ - emitir(IRTG(IR_EQ, IRT_P32), ix->tab, lj_ir_kptr(J, udataV(&ix->tabv))); - } else { - /* Specialize to the type of userdata. */ - TRef tr = emitir(IRT(IR_FLOAD, IRT_U8), ix->tab, IRFL_UDATA_UDTYPE); - emitir(IRTGI(IR_EQ), tr, lj_ir_kint(J, udtype)); - } - immutable_mt: - mo = lj_tab_getstr(mt, mmname_str(J2G(J), mm)); - if (!mo || tvisnil(mo)) - return 0; /* No metamethod. */ - /* Treat metamethod or index table as immutable, too. */ - if (!(tvisfunc(mo) || tvistab(mo))) - lj_trace_err(J, LJ_TRERR_BADTYPE); - copyTV(J->L, &ix->mobjv, mo); - ix->mobj = lj_ir_kgc(J, gcV(mo), tvisfunc(mo) ? IRT_FUNC : IRT_TAB); - ix->mtv = mt; - ix->mt = TREF_NIL; /* Dummy value for comparison semantics. */ - return 1; /* Got metamethod or index table. */ - } - mix.tab = emitir(IRT(IR_FLOAD, IRT_TAB), ix->tab, IRFL_UDATA_META); - } else { - /* Specialize to base metatable. Must flush mcode in lua_setmetatable(). */ - mt = tabref(basemt_obj(J2G(J), &ix->tabv)); - if (mt == NULL) { - ix->mt = TREF_NIL; - return 0; /* No metamethod. */ - } - /* The cdata metatable is treated as immutable. */ - if (LJ_HASFFI && tref_iscdata(ix->tab)) goto immutable_mt; - ix->mt = mix.tab = lj_ir_ktab(J, mt); - goto nocheck; - } - ix->mt = mt ? mix.tab : TREF_NIL; - emitir(IRTG(mt ? IR_NE : IR_EQ, IRT_TAB), mix.tab, lj_ir_knull(J, IRT_TAB)); -nocheck: - if (mt) { - GCstr *mmstr = mmname_str(J2G(J), mm); - cTValue *mo = lj_tab_getstr(mt, mmstr); - if (mo && !tvisnil(mo)) - copyTV(J->L, &ix->mobjv, mo); - ix->mtv = mt; - settabV(J->L, &mix.tabv, mt); - setstrV(J->L, &mix.keyv, mmstr); - mix.key = lj_ir_kstr(J, mmstr); - mix.val = 0; - mix.idxchain = 0; - ix->mobj = lj_record_idx(J, &mix); - return !tref_isnil(ix->mobj); /* 1 if metamethod found, 0 if not. */ - } - return 0; /* No metamethod. */ -} - -/* Record call to arithmetic metamethod. */ -static TRef rec_mm_arith(jit_State *J, RecordIndex *ix, MMS mm) -{ - /* Set up metamethod call first to save ix->tab and ix->tabv. */ - BCReg func = rec_mm_prep(J, lj_cont_ra); - TRef *base = J->base + func; - TValue *basev = J->L->base + func; - base[1] = ix->tab; base[2] = ix->key; - copyTV(J->L, basev+1, &ix->tabv); - copyTV(J->L, basev+2, &ix->keyv); - if (!lj_record_mm_lookup(J, ix, mm)) { /* Lookup mm on 1st operand. */ - if (mm != MM_unm) { - ix->tab = ix->key; - copyTV(J->L, &ix->tabv, &ix->keyv); - if (lj_record_mm_lookup(J, ix, mm)) /* Lookup mm on 2nd operand. */ - goto ok; - } - lj_trace_err(J, LJ_TRERR_NOMM); - } -ok: - base[0] = ix->mobj; - copyTV(J->L, basev+0, &ix->mobjv); - lj_record_call(J, func, 2); - return 0; /* No result yet. */ -} - -/* Record call to __len metamethod. */ -static TRef rec_mm_len(jit_State *J, TRef tr, TValue *tv) -{ - RecordIndex ix; - ix.tab = tr; - copyTV(J->L, &ix.tabv, tv); - if (lj_record_mm_lookup(J, &ix, MM_len)) { - BCReg func = rec_mm_prep(J, lj_cont_ra); - TRef *base = J->base + func; - TValue *basev = J->L->base + func; - base[0] = ix.mobj; copyTV(J->L, basev+0, &ix.mobjv); - base[1] = tr; copyTV(J->L, basev+1, tv); -#if LJ_52 - base[2] = tr; copyTV(J->L, basev+2, tv); -#else - base[2] = TREF_NIL; setnilV(basev+2); -#endif - lj_record_call(J, func, 2); - } else { - if (LJ_52 && tref_istab(tr)) - return lj_ir_call(J, IRCALL_lj_tab_len, tr); - lj_trace_err(J, LJ_TRERR_NOMM); - } - return 0; /* No result yet. */ -} - -/* Call a comparison metamethod. */ -static void rec_mm_callcomp(jit_State *J, RecordIndex *ix, int op) -{ - BCReg func = rec_mm_prep(J, (op&1) ? lj_cont_condf : lj_cont_condt); - TRef *base = J->base + func; - TValue *tv = J->L->base + func; - base[0] = ix->mobj; base[1] = ix->val; base[2] = ix->key; - copyTV(J->L, tv+0, &ix->mobjv); - copyTV(J->L, tv+1, &ix->valv); - copyTV(J->L, tv+2, &ix->keyv); - lj_record_call(J, func, 2); -} - -/* Record call to equality comparison metamethod (for tab and udata only). */ -static void rec_mm_equal(jit_State *J, RecordIndex *ix, int op) -{ - ix->tab = ix->val; - copyTV(J->L, &ix->tabv, &ix->valv); - if (lj_record_mm_lookup(J, ix, MM_eq)) { /* Lookup mm on 1st operand. */ - cTValue *bv; - TRef mo1 = ix->mobj; - TValue mo1v; - copyTV(J->L, &mo1v, &ix->mobjv); - /* Avoid the 2nd lookup and the objcmp if the metatables are equal. */ - bv = &ix->keyv; - if (tvistab(bv) && tabref(tabV(bv)->metatable) == ix->mtv) { - TRef mt2 = emitir(IRT(IR_FLOAD, IRT_TAB), ix->key, IRFL_TAB_META); - emitir(IRTG(IR_EQ, IRT_TAB), mt2, ix->mt); - } else if (tvisudata(bv) && tabref(udataV(bv)->metatable) == ix->mtv) { - TRef mt2 = emitir(IRT(IR_FLOAD, IRT_TAB), ix->key, IRFL_UDATA_META); - emitir(IRTG(IR_EQ, IRT_TAB), mt2, ix->mt); - } else { /* Lookup metamethod on 2nd operand and compare both. */ - ix->tab = ix->key; - copyTV(J->L, &ix->tabv, bv); - if (!lj_record_mm_lookup(J, ix, MM_eq) || - lj_record_objcmp(J, mo1, ix->mobj, &mo1v, &ix->mobjv)) - return; - } - rec_mm_callcomp(J, ix, op); - } -} - -/* Record call to ordered comparison metamethods (for arbitrary objects). */ -static void rec_mm_comp(jit_State *J, RecordIndex *ix, int op) -{ - ix->tab = ix->val; - copyTV(J->L, &ix->tabv, &ix->valv); - while (1) { - MMS mm = (op & 2) ? MM_le : MM_lt; /* Try __le + __lt or only __lt. */ -#if LJ_52 - if (!lj_record_mm_lookup(J, ix, mm)) { /* Lookup mm on 1st operand. */ - ix->tab = ix->key; - copyTV(J->L, &ix->tabv, &ix->keyv); - if (!lj_record_mm_lookup(J, ix, mm)) /* Lookup mm on 2nd operand. */ - goto nomatch; - } - rec_mm_callcomp(J, ix, op); - return; -#else - if (lj_record_mm_lookup(J, ix, mm)) { /* Lookup mm on 1st operand. */ - cTValue *bv; - TRef mo1 = ix->mobj; - TValue mo1v; - copyTV(J->L, &mo1v, &ix->mobjv); - /* Avoid the 2nd lookup and the objcmp if the metatables are equal. */ - bv = &ix->keyv; - if (tvistab(bv) && tabref(tabV(bv)->metatable) == ix->mtv) { - TRef mt2 = emitir(IRT(IR_FLOAD, IRT_TAB), ix->key, IRFL_TAB_META); - emitir(IRTG(IR_EQ, IRT_TAB), mt2, ix->mt); - } else if (tvisudata(bv) && tabref(udataV(bv)->metatable) == ix->mtv) { - TRef mt2 = emitir(IRT(IR_FLOAD, IRT_TAB), ix->key, IRFL_UDATA_META); - emitir(IRTG(IR_EQ, IRT_TAB), mt2, ix->mt); - } else { /* Lookup metamethod on 2nd operand and compare both. */ - ix->tab = ix->key; - copyTV(J->L, &ix->tabv, bv); - if (!lj_record_mm_lookup(J, ix, mm) || - lj_record_objcmp(J, mo1, ix->mobj, &mo1v, &ix->mobjv)) - goto nomatch; - } - rec_mm_callcomp(J, ix, op); - return; - } -#endif - nomatch: - /* Lookup failed. Retry with __lt and swapped operands. */ - if (!(op & 2)) break; /* Already at __lt. Interpreter will throw. */ - ix->tab = ix->key; ix->key = ix->val; ix->val = ix->tab; - copyTV(J->L, &ix->tabv, &ix->keyv); - copyTV(J->L, &ix->keyv, &ix->valv); - copyTV(J->L, &ix->valv, &ix->tabv); - op ^= 3; - } -} - -#if LJ_HASFFI -/* Setup call to cdata comparison metamethod. */ -static void rec_mm_comp_cdata(jit_State *J, RecordIndex *ix, int op, MMS mm) -{ - lj_snap_add(J); - if (tref_iscdata(ix->val)) { - ix->tab = ix->val; - copyTV(J->L, &ix->tabv, &ix->valv); - } else { - lua_assert(tref_iscdata(ix->key)); - ix->tab = ix->key; - copyTV(J->L, &ix->tabv, &ix->keyv); - } - lj_record_mm_lookup(J, ix, mm); - rec_mm_callcomp(J, ix, op); -} -#endif - -/* -- Indexed access ------------------------------------------------------ */ - -/* Record bounds-check. */ -static void rec_idx_abc(jit_State *J, TRef asizeref, TRef ikey, uint32_t asize) -{ - /* Try to emit invariant bounds checks. */ - if ((J->flags & (JIT_F_OPT_LOOP|JIT_F_OPT_ABC)) == - (JIT_F_OPT_LOOP|JIT_F_OPT_ABC)) { - IRRef ref = tref_ref(ikey); - IRIns *ir = IR(ref); - int32_t ofs = 0; - IRRef ofsref = 0; - /* Handle constant offsets. */ - if (ir->o == IR_ADD && irref_isk(ir->op2)) { - ofsref = ir->op2; - ofs = IR(ofsref)->i; - ref = ir->op1; - ir = IR(ref); - } - /* Got scalar evolution analysis results for this reference? */ - if (ref == J->scev.idx) { - int32_t stop; - lua_assert(irt_isint(J->scev.t) && ir->o == IR_SLOAD); - stop = numberVint(&(J->L->base - J->baseslot)[ir->op1 + FORL_STOP]); - /* Runtime value for stop of loop is within bounds? */ - if ((uint64_t)stop + ofs < (uint64_t)asize) { - /* Emit invariant bounds check for stop. */ - emitir(IRTG(IR_ABC, IRT_P32), asizeref, ofs == 0 ? J->scev.stop : - emitir(IRTI(IR_ADD), J->scev.stop, ofsref)); - /* Emit invariant bounds check for start, if not const or negative. */ - if (!(J->scev.dir && J->scev.start && - (int64_t)IR(J->scev.start)->i + ofs >= 0)) - emitir(IRTG(IR_ABC, IRT_P32), asizeref, ikey); - return; - } - } - } - emitir(IRTGI(IR_ABC), asizeref, ikey); /* Emit regular bounds check. */ -} - -/* Record indexed key lookup. */ -static TRef rec_idx_key(jit_State *J, RecordIndex *ix) -{ - TRef key; - GCtab *t = tabV(&ix->tabv); - ix->oldv = lj_tab_get(J->L, t, &ix->keyv); /* Lookup previous value. */ - - /* Integer keys are looked up in the array part first. */ - key = ix->key; - if (tref_isnumber(key)) { - int32_t k = numberVint(&ix->keyv); - if (!tvisint(&ix->keyv) && numV(&ix->keyv) != (lua_Number)k) - k = LJ_MAX_ASIZE; - if ((MSize)k < LJ_MAX_ASIZE) { /* Potential array key? */ - TRef ikey = lj_opt_narrow_index(J, key); - TRef asizeref = emitir(IRTI(IR_FLOAD), ix->tab, IRFL_TAB_ASIZE); - if ((MSize)k < t->asize) { /* Currently an array key? */ - TRef arrayref; - rec_idx_abc(J, asizeref, ikey, t->asize); - arrayref = emitir(IRT(IR_FLOAD, IRT_P32), ix->tab, IRFL_TAB_ARRAY); - return emitir(IRT(IR_AREF, IRT_P32), arrayref, ikey); - } else { /* Currently not in array (may be an array extension)? */ - emitir(IRTGI(IR_ULE), asizeref, ikey); /* Inv. bounds check. */ - if (k == 0 && tref_isk(key)) - key = lj_ir_knum_zero(J); /* Canonicalize 0 or +-0.0 to +0.0. */ - /* And continue with the hash lookup. */ - } - } else if (!tref_isk(key)) { - /* We can rule out const numbers which failed the integerness test - ** above. But all other numbers are potential array keys. - */ - if (t->asize == 0) { /* True sparse tables have an empty array part. */ - /* Guard that the array part stays empty. */ - TRef tmp = emitir(IRTI(IR_FLOAD), ix->tab, IRFL_TAB_ASIZE); - emitir(IRTGI(IR_EQ), tmp, lj_ir_kint(J, 0)); - } else { - lj_trace_err(J, LJ_TRERR_NYITMIX); - } - } - } - - /* Otherwise the key is located in the hash part. */ - if (t->hmask == 0) { /* Shortcut for empty hash part. */ - /* Guard that the hash part stays empty. */ - TRef tmp = emitir(IRTI(IR_FLOAD), ix->tab, IRFL_TAB_HMASK); - emitir(IRTGI(IR_EQ), tmp, lj_ir_kint(J, 0)); - return lj_ir_kkptr(J, niltvg(J2G(J))); - } - if (tref_isinteger(key)) /* Hash keys are based on numbers, not ints. */ - key = emitir(IRTN(IR_CONV), key, IRCONV_NUM_INT); - if (tref_isk(key)) { - /* Optimize lookup of constant hash keys. */ - MSize hslot = (MSize)((char *)ix->oldv - (char *)&noderef(t->node)[0].val); - if (t->hmask > 0 && hslot <= t->hmask*(MSize)sizeof(Node) && - hslot <= 65535*(MSize)sizeof(Node)) { - TRef node, kslot; - TRef hm = emitir(IRTI(IR_FLOAD), ix->tab, IRFL_TAB_HMASK); - emitir(IRTGI(IR_EQ), hm, lj_ir_kint(J, (int32_t)t->hmask)); - node = emitir(IRT(IR_FLOAD, IRT_P32), ix->tab, IRFL_TAB_NODE); - kslot = lj_ir_kslot(J, key, hslot / sizeof(Node)); - return emitir(IRTG(IR_HREFK, IRT_P32), node, kslot); - } - } - /* Fall back to a regular hash lookup. */ - return emitir(IRT(IR_HREF, IRT_P32), ix->tab, key); -} - -/* Determine whether a key is NOT one of the fast metamethod names. */ -static int nommstr(jit_State *J, TRef key) -{ - if (tref_isstr(key)) { - if (tref_isk(key)) { - GCstr *str = ir_kstr(IR(tref_ref(key))); - uint32_t mm; - for (mm = 0; mm <= MM_FAST; mm++) - if (mmname_str(J2G(J), mm) == str) - return 0; /* MUST be one the fast metamethod names. */ - } else { - return 0; /* Variable string key MAY be a metamethod name. */ - } - } - return 1; /* CANNOT be a metamethod name. */ -} - -/* Record indexed load/store. */ -TRef lj_record_idx(jit_State *J, RecordIndex *ix) -{ - TRef xref; - IROp xrefop, loadop; - cTValue *oldv; - - while (!tref_istab(ix->tab)) { /* Handle non-table lookup. */ - /* Never call raw lj_record_idx() on non-table. */ - lua_assert(ix->idxchain != 0); - if (!lj_record_mm_lookup(J, ix, ix->val ? MM_newindex : MM_index)) - lj_trace_err(J, LJ_TRERR_NOMM); - handlemm: - if (tref_isfunc(ix->mobj)) { /* Handle metamethod call. */ - BCReg func = rec_mm_prep(J, ix->val ? lj_cont_nop : lj_cont_ra); - TRef *base = J->base + func; - TValue *tv = J->L->base + func; - base[0] = ix->mobj; base[1] = ix->tab; base[2] = ix->key; - setfuncV(J->L, tv+0, funcV(&ix->mobjv)); - copyTV(J->L, tv+1, &ix->tabv); - copyTV(J->L, tv+2, &ix->keyv); - if (ix->val) { - base[3] = ix->val; - copyTV(J->L, tv+3, &ix->valv); - lj_record_call(J, func, 3); /* mobj(tab, key, val) */ - return 0; - } else { - lj_record_call(J, func, 2); /* res = mobj(tab, key) */ - return 0; /* No result yet. */ - } - } - /* Otherwise retry lookup with metaobject. */ - ix->tab = ix->mobj; - copyTV(J->L, &ix->tabv, &ix->mobjv); - if (--ix->idxchain == 0) - lj_trace_err(J, LJ_TRERR_IDXLOOP); - } - - /* First catch nil and NaN keys for tables. */ - if (tvisnil(&ix->keyv) || (tvisnum(&ix->keyv) && tvisnan(&ix->keyv))) { - if (ix->val) /* Better fail early. */ - lj_trace_err(J, LJ_TRERR_STORENN); - if (tref_isk(ix->key)) { - if (ix->idxchain && lj_record_mm_lookup(J, ix, MM_index)) - goto handlemm; - return TREF_NIL; - } - } - - /* Record the key lookup. */ - xref = rec_idx_key(J, ix); - xrefop = IR(tref_ref(xref))->o; - loadop = xrefop == IR_AREF ? IR_ALOAD : IR_HLOAD; - /* The lj_meta_tset() inconsistency is gone, but better play safe. */ - oldv = xrefop == IR_KKPTR ? (cTValue *)ir_kptr(IR(tref_ref(xref))) : ix->oldv; - - if (ix->val == 0) { /* Indexed load */ - IRType t = itype2irt(oldv); - TRef res; - if (oldv == niltvg(J2G(J))) { - emitir(IRTG(IR_EQ, IRT_P32), xref, lj_ir_kkptr(J, niltvg(J2G(J)))); - res = TREF_NIL; - } else { - res = emitir(IRTG(loadop, t), xref, 0); - } - if (t == IRT_NIL && ix->idxchain && lj_record_mm_lookup(J, ix, MM_index)) - goto handlemm; - if (irtype_ispri(t)) res = TREF_PRI(t); /* Canonicalize primitives. */ - return res; - } else { /* Indexed store. */ - GCtab *mt = tabref(tabV(&ix->tabv)->metatable); - int keybarrier = tref_isgcv(ix->key) && !tref_isnil(ix->val); - if (tvisnil(oldv)) { /* Previous value was nil? */ - /* Need to duplicate the hasmm check for the early guards. */ - int hasmm = 0; - if (ix->idxchain && mt) { - cTValue *mo = lj_tab_getstr(mt, mmname_str(J2G(J), MM_newindex)); - hasmm = mo && !tvisnil(mo); - } - if (hasmm) - emitir(IRTG(loadop, IRT_NIL), xref, 0); /* Guard for nil value. */ - else if (xrefop == IR_HREF) - emitir(IRTG(oldv == niltvg(J2G(J)) ? IR_EQ : IR_NE, IRT_P32), - xref, lj_ir_kkptr(J, niltvg(J2G(J)))); - if (ix->idxchain && lj_record_mm_lookup(J, ix, MM_newindex)) { - lua_assert(hasmm); - goto handlemm; - } - lua_assert(!hasmm); - if (oldv == niltvg(J2G(J))) { /* Need to insert a new key. */ - TRef key = ix->key; - if (tref_isinteger(key)) /* NEWREF needs a TValue as a key. */ - key = emitir(IRTN(IR_CONV), key, IRCONV_NUM_INT); - xref = emitir(IRT(IR_NEWREF, IRT_P32), ix->tab, key); - keybarrier = 0; /* NEWREF already takes care of the key barrier. */ - } - } else if (!lj_opt_fwd_wasnonnil(J, loadop, tref_ref(xref))) { - /* Cannot derive that the previous value was non-nil, must do checks. */ - if (xrefop == IR_HREF) /* Guard against store to niltv. */ - emitir(IRTG(IR_NE, IRT_P32), xref, lj_ir_kkptr(J, niltvg(J2G(J)))); - if (ix->idxchain) { /* Metamethod lookup required? */ - /* A check for NULL metatable is cheaper (hoistable) than a load. */ - if (!mt) { - TRef mtref = emitir(IRT(IR_FLOAD, IRT_TAB), ix->tab, IRFL_TAB_META); - emitir(IRTG(IR_EQ, IRT_TAB), mtref, lj_ir_knull(J, IRT_TAB)); - } else { - IRType t = itype2irt(oldv); - emitir(IRTG(loadop, t), xref, 0); /* Guard for non-nil value. */ - } - } - } else { - keybarrier = 0; /* Previous non-nil value kept the key alive. */ - } - /* Convert int to number before storing. */ - if (!LJ_DUALNUM && tref_isinteger(ix->val)) - ix->val = emitir(IRTN(IR_CONV), ix->val, IRCONV_NUM_INT); - emitir(IRT(loadop+IRDELTA_L2S, tref_type(ix->val)), xref, ix->val); - if (keybarrier || tref_isgcv(ix->val)) - emitir(IRT(IR_TBAR, IRT_NIL), ix->tab, 0); - /* Invalidate neg. metamethod cache for stores with certain string keys. */ - if (!nommstr(J, ix->key)) { - TRef fref = emitir(IRT(IR_FREF, IRT_P32), ix->tab, IRFL_TAB_NOMM); - emitir(IRT(IR_FSTORE, IRT_U8), fref, lj_ir_kint(J, 0)); - } - J->needsnap = 1; - return 0; - } -} - -/* -- Upvalue access ------------------------------------------------------ */ - -/* Check whether upvalue is immutable and ok to constify. */ -static int rec_upvalue_constify(jit_State *J, GCupval *uvp) -{ - if (uvp->immutable) { - cTValue *o = uvval(uvp); - /* Don't constify objects that may retain large amounts of memory. */ -#if LJ_HASFFI - if (tviscdata(o)) { - GCcdata *cd = cdataV(o); - if (!cdataisv(cd) && !(cd->marked & LJ_GC_CDATA_FIN)) { - CType *ct = ctype_raw(ctype_ctsG(J2G(J)), cd->ctypeid); - if (!ctype_hassize(ct->info) || ct->size <= 16) - return 1; - } - return 0; - } -#else - UNUSED(J); -#endif - if (!(tvistab(o) || tvisudata(o) || tvisthread(o))) - return 1; - } - return 0; -} - -/* Record upvalue load/store. */ -static TRef rec_upvalue(jit_State *J, uint32_t uv, TRef val) -{ - GCupval *uvp = &gcref(J->fn->l.uvptr[uv])->uv; - TRef fn = getcurrf(J); - IRRef uref; - int needbarrier = 0; - if (rec_upvalue_constify(J, uvp)) { /* Try to constify immutable upvalue. */ - TRef tr, kfunc; - lua_assert(val == 0); - if (!tref_isk(fn)) { /* Late specialization of current function. */ - if (J->pt->flags >= PROTO_CLC_POLY) - goto noconstify; - kfunc = lj_ir_kfunc(J, J->fn); - emitir(IRTG(IR_EQ, IRT_FUNC), fn, kfunc); - J->base[-1] = TREF_FRAME | kfunc; - fn = kfunc; - } - tr = lj_record_constify(J, uvval(uvp)); - if (tr) - return tr; - } -noconstify: - /* Note: this effectively limits LJ_MAX_UPVAL to 127. */ - uv = (uv << 8) | (hashrot(uvp->dhash, uvp->dhash + HASH_BIAS) & 0xff); - if (!uvp->closed) { - /* In current stack? */ - if (uvval(uvp) >= tvref(J->L->stack) && - uvval(uvp) < tvref(J->L->maxstack)) { - int32_t slot = (int32_t)(uvval(uvp) - (J->L->base - J->baseslot)); - if (slot >= 0) { /* Aliases an SSA slot? */ - slot -= (int32_t)J->baseslot; /* Note: slot number may be negative! */ - /* NYI: add IR to guard that it's still aliasing the same slot. */ - if (val == 0) { - return getslot(J, slot); - } else { - J->base[slot] = val; - if (slot >= (int32_t)J->maxslot) J->maxslot = (BCReg)(slot+1); - return 0; - } - } - } - uref = tref_ref(emitir(IRTG(IR_UREFO, IRT_P32), fn, uv)); - } else { - needbarrier = 1; - uref = tref_ref(emitir(IRTG(IR_UREFC, IRT_P32), fn, uv)); - } - if (val == 0) { /* Upvalue load */ - IRType t = itype2irt(uvval(uvp)); - TRef res = emitir(IRTG(IR_ULOAD, t), uref, 0); - if (irtype_ispri(t)) res = TREF_PRI(t); /* Canonicalize primitive refs. */ - return res; - } else { /* Upvalue store. */ - /* Convert int to number before storing. */ - if (!LJ_DUALNUM && tref_isinteger(val)) - val = emitir(IRTN(IR_CONV), val, IRCONV_NUM_INT); - emitir(IRT(IR_USTORE, tref_type(val)), uref, val); - if (needbarrier && tref_isgcv(val)) - emitir(IRT(IR_OBAR, IRT_NIL), uref, val); - J->needsnap = 1; - return 0; - } -} - -/* -- Record calls to Lua functions --------------------------------------- */ - -/* Check unroll limits for calls. */ -static void check_call_unroll(jit_State *J, TraceNo lnk) -{ - cTValue *frame = J->L->base - 1; - void *pc = mref(frame_func(frame)->l.pc, void); - int32_t depth = J->framedepth; - int32_t count = 0; - if ((J->pt->flags & PROTO_VARARG)) depth--; /* Vararg frame still missing. */ - for (; depth > 0; depth--) { /* Count frames with same prototype. */ - if (frame_iscont(frame)) depth--; - frame = frame_prev(frame); - if (mref(frame_func(frame)->l.pc, void) == pc) - count++; - } - if (J->pc == J->startpc) { - if (count + J->tailcalled > J->param[JIT_P_recunroll]) { - J->pc++; - if (J->framedepth + J->retdepth == 0) - rec_stop(J, LJ_TRLINK_TAILREC, J->cur.traceno); /* Tail-recursion. */ - else - rec_stop(J, LJ_TRLINK_UPREC, J->cur.traceno); /* Up-recursion. */ - } - } else { - if (count > J->param[JIT_P_callunroll]) { - if (lnk) { /* Possible tail- or up-recursion. */ - lj_trace_flush(J, lnk); /* Flush trace that only returns. */ - /* Set a small, pseudo-random hotcount for a quick retry of JFUNC*. */ - hotcount_set(J2GG(J), J->pc+1, LJ_PRNG_BITS(J, 4)); - } - lj_trace_err(J, LJ_TRERR_CUNROLL); - } - } -} - -/* Record Lua function setup. */ -static void rec_func_setup(jit_State *J) -{ - GCproto *pt = J->pt; - BCReg s, numparams = pt->numparams; - if ((pt->flags & PROTO_NOJIT)) - lj_trace_err(J, LJ_TRERR_CJITOFF); - if (J->baseslot + pt->framesize >= LJ_MAX_JSLOTS) - lj_trace_err(J, LJ_TRERR_STACKOV); - /* Fill up missing parameters with nil. */ - for (s = J->maxslot; s < numparams; s++) - J->base[s] = TREF_NIL; - /* The remaining slots should never be read before they are written. */ - J->maxslot = numparams; -} - -/* Record Lua vararg function setup. */ -static void rec_func_vararg(jit_State *J) -{ - GCproto *pt = J->pt; - BCReg s, fixargs, vframe = J->maxslot+1; - lua_assert((pt->flags & PROTO_VARARG)); - if (J->baseslot + vframe + pt->framesize >= LJ_MAX_JSLOTS) - lj_trace_err(J, LJ_TRERR_STACKOV); - J->base[vframe-1] = J->base[-1]; /* Copy function up. */ - /* Copy fixarg slots up and set their original slots to nil. */ - fixargs = pt->numparams < J->maxslot ? pt->numparams : J->maxslot; - for (s = 0; s < fixargs; s++) { - J->base[vframe+s] = J->base[s]; - J->base[s] = TREF_NIL; - } - J->maxslot = fixargs; - J->framedepth++; - J->base += vframe; - J->baseslot += vframe; -} - -/* Record entry to a Lua function. */ -static void rec_func_lua(jit_State *J) -{ - rec_func_setup(J); - check_call_unroll(J, 0); -} - -/* Record entry to an already compiled function. */ -static void rec_func_jit(jit_State *J, TraceNo lnk) -{ - GCtrace *T; - rec_func_setup(J); - T = traceref(J, lnk); - if (T->linktype == LJ_TRLINK_RETURN) { /* Trace returns to interpreter? */ - check_call_unroll(J, lnk); - /* Temporarily unpatch JFUNC* to continue recording across function. */ - J->patchins = *J->pc; - J->patchpc = (BCIns *)J->pc; - *J->patchpc = T->startins; - return; - } - J->instunroll = 0; /* Cannot continue across a compiled function. */ - if (J->pc == J->startpc && J->framedepth + J->retdepth == 0) - rec_stop(J, LJ_TRLINK_TAILREC, J->cur.traceno); /* Extra tail-recursion. */ - else - rec_stop(J, LJ_TRLINK_ROOT, lnk); /* Link to the function. */ -} - -/* -- Vararg handling ----------------------------------------------------- */ - -/* Detect y = select(x, ...) idiom. */ -static int select_detect(jit_State *J) -{ - BCIns ins = J->pc[1]; - if (bc_op(ins) == BC_CALLM && bc_b(ins) == 2 && bc_c(ins) == 1) { - cTValue *func = &J->L->base[bc_a(ins)]; - if (tvisfunc(func) && funcV(func)->c.ffid == FF_select) - return 1; - } - return 0; -} - -/* Record vararg instruction. */ -static void rec_varg(jit_State *J, BCReg dst, ptrdiff_t nresults) -{ - int32_t numparams = J->pt->numparams; - ptrdiff_t nvararg = frame_delta(J->L->base-1) - numparams - 1; - lua_assert(frame_isvarg(J->L->base-1)); - if (J->framedepth > 0) { /* Simple case: varargs defined on-trace. */ - ptrdiff_t i; - if (nvararg < 0) nvararg = 0; - if (nresults == -1) { - nresults = nvararg; - J->maxslot = dst + (BCReg)nvararg; - } else if (dst + nresults > J->maxslot) { - J->maxslot = dst + (BCReg)nresults; - } - for (i = 0; i < nresults; i++) - J->base[dst+i] = i < nvararg ? getslot(J, i - nvararg - 1) : TREF_NIL; - } else { /* Unknown number of varargs passed to trace. */ - TRef fr = emitir(IRTI(IR_SLOAD), 0, IRSLOAD_READONLY|IRSLOAD_FRAME); - int32_t frofs = 8*(1+numparams)+FRAME_VARG; - if (nresults >= 0) { /* Known fixed number of results. */ - ptrdiff_t i; - if (nvararg > 0) { - ptrdiff_t nload = nvararg >= nresults ? nresults : nvararg; - TRef vbase; - if (nvararg >= nresults) - emitir(IRTGI(IR_GE), fr, lj_ir_kint(J, frofs+8*(int32_t)nresults)); - else - emitir(IRTGI(IR_EQ), fr, lj_ir_kint(J, frame_ftsz(J->L->base-1))); - vbase = emitir(IRTI(IR_SUB), REF_BASE, fr); - vbase = emitir(IRT(IR_ADD, IRT_P32), vbase, lj_ir_kint(J, frofs-8)); - for (i = 0; i < nload; i++) { - IRType t = itype2irt(&J->L->base[i-1-nvararg]); - TRef aref = emitir(IRT(IR_AREF, IRT_P32), - vbase, lj_ir_kint(J, (int32_t)i)); - TRef tr = emitir(IRTG(IR_VLOAD, t), aref, 0); - if (irtype_ispri(t)) tr = TREF_PRI(t); /* Canonicalize primitives. */ - J->base[dst+i] = tr; - } - } else { - emitir(IRTGI(IR_LE), fr, lj_ir_kint(J, frofs)); - nvararg = 0; - } - for (i = nvararg; i < nresults; i++) - J->base[dst+i] = TREF_NIL; - if (dst + (BCReg)nresults > J->maxslot) - J->maxslot = dst + (BCReg)nresults; - } else if (select_detect(J)) { /* y = select(x, ...) */ - TRef tridx = J->base[dst-1]; - TRef tr = TREF_NIL; - ptrdiff_t idx = lj_ffrecord_select_mode(J, tridx, &J->L->base[dst-1]); - if (idx < 0) goto nyivarg; - if (idx != 0 && !tref_isinteger(tridx)) - tridx = emitir(IRTGI(IR_CONV), tridx, IRCONV_INT_NUM|IRCONV_INDEX); - if (idx != 0 && tref_isk(tridx)) { - emitir(IRTGI(idx <= nvararg ? IR_GE : IR_LT), - fr, lj_ir_kint(J, frofs+8*(int32_t)idx)); - frofs -= 8; /* Bias for 1-based index. */ - } else if (idx <= nvararg) { /* Compute size. */ - TRef tmp = emitir(IRTI(IR_ADD), fr, lj_ir_kint(J, -frofs)); - if (numparams) - emitir(IRTGI(IR_GE), tmp, lj_ir_kint(J, 0)); - tr = emitir(IRTI(IR_BSHR), tmp, lj_ir_kint(J, 3)); - if (idx != 0) { - tridx = emitir(IRTI(IR_ADD), tridx, lj_ir_kint(J, -1)); - rec_idx_abc(J, tr, tridx, (uint32_t)nvararg); - } - } else { - TRef tmp = lj_ir_kint(J, frofs); - if (idx != 0) { - TRef tmp2 = emitir(IRTI(IR_BSHL), tridx, lj_ir_kint(J, 3)); - tmp = emitir(IRTI(IR_ADD), tmp2, tmp); - } else { - tr = lj_ir_kint(J, 0); - } - emitir(IRTGI(IR_LT), fr, tmp); - } - if (idx != 0 && idx <= nvararg) { - IRType t; - TRef aref, vbase = emitir(IRTI(IR_SUB), REF_BASE, fr); - vbase = emitir(IRT(IR_ADD, IRT_P32), vbase, lj_ir_kint(J, frofs-8)); - t = itype2irt(&J->L->base[idx-2-nvararg]); - aref = emitir(IRT(IR_AREF, IRT_P32), vbase, tridx); - tr = emitir(IRTG(IR_VLOAD, t), aref, 0); - if (irtype_ispri(t)) tr = TREF_PRI(t); /* Canonicalize primitives. */ - } - J->base[dst-2] = tr; - J->maxslot = dst-1; - J->bcskip = 2; /* Skip CALLM + select. */ - } else { - nyivarg: - setintV(&J->errinfo, BC_VARG); - lj_trace_err_info(J, LJ_TRERR_NYIBC); - } - } -} - -/* -- Record allocations -------------------------------------------------- */ - -static TRef rec_tnew(jit_State *J, uint32_t ah) -{ - uint32_t asize = ah & 0x7ff; - uint32_t hbits = ah >> 11; - if (asize == 0x7ff) asize = 0x801; - return emitir(IRTG(IR_TNEW, IRT_TAB), asize, hbits); -} - -/* -- Record bytecode ops ------------------------------------------------- */ - -/* Prepare for comparison. */ -static void rec_comp_prep(jit_State *J) -{ - /* Prevent merging with snapshot #0 (GC exit) since we fixup the PC. */ - if (J->cur.nsnap == 1 && J->cur.snap[0].ref == J->cur.nins) - emitir_raw(IRT(IR_NOP, IRT_NIL), 0, 0); - lj_snap_add(J); -} - -/* Fixup comparison. */ -static void rec_comp_fixup(jit_State *J, const BCIns *pc, int cond) -{ - BCIns jmpins = pc[1]; - const BCIns *npc = pc + 2 + (cond ? bc_j(jmpins) : 0); - SnapShot *snap = &J->cur.snap[J->cur.nsnap-1]; - /* Set PC to opposite target to avoid re-recording the comp. in side trace. */ - J->cur.snapmap[snap->mapofs + snap->nent] = SNAP_MKPC(npc); - J->needsnap = 1; - if (bc_a(jmpins) < J->maxslot) J->maxslot = bc_a(jmpins); - lj_snap_shrink(J); /* Shrink last snapshot if possible. */ -} - -/* Record the next bytecode instruction (_before_ it's executed). */ -void lj_record_ins(jit_State *J) -{ - cTValue *lbase; - RecordIndex ix; - const BCIns *pc; - BCIns ins; - BCOp op; - TRef ra, rb, rc; - - /* Perform post-processing action before recording the next instruction. */ - if (LJ_UNLIKELY(J->postproc != LJ_POST_NONE)) { - switch (J->postproc) { - case LJ_POST_FIXCOMP: /* Fixup comparison. */ - pc = frame_pc(&J2G(J)->tmptv); - rec_comp_fixup(J, pc, (!tvistruecond(&J2G(J)->tmptv2) ^ (bc_op(*pc)&1))); - /* fallthrough */ - case LJ_POST_FIXGUARD: /* Fixup and emit pending guard. */ - case LJ_POST_FIXGUARDSNAP: /* Fixup and emit pending guard and snapshot. */ - if (!tvistruecond(&J2G(J)->tmptv2)) { - J->fold.ins.o ^= 1; /* Flip guard to opposite. */ - if (J->postproc == LJ_POST_FIXGUARDSNAP) { - SnapShot *snap = &J->cur.snap[J->cur.nsnap-1]; - J->cur.snapmap[snap->mapofs+snap->nent-1]--; /* False -> true. */ - } - } - lj_opt_fold(J); /* Emit pending guard. */ - /* fallthrough */ - case LJ_POST_FIXBOOL: - if (!tvistruecond(&J2G(J)->tmptv2)) { - BCReg s; - TValue *tv = J->L->base; - for (s = 0; s < J->maxslot; s++) /* Fixup stack slot (if any). */ - if (J->base[s] == TREF_TRUE && tvisfalse(&tv[s])) { - J->base[s] = TREF_FALSE; - break; - } - } - break; - case LJ_POST_FIXCONST: - { - BCReg s; - TValue *tv = J->L->base; - for (s = 0; s < J->maxslot; s++) /* Constify stack slots (if any). */ - if (J->base[s] == TREF_NIL && !tvisnil(&tv[s])) - J->base[s] = lj_record_constify(J, &tv[s]); - } - break; - case LJ_POST_FFRETRY: /* Suppress recording of retried fast function. */ - if (bc_op(*J->pc) >= BC__MAX) - return; - break; - default: lua_assert(0); break; - } - J->postproc = LJ_POST_NONE; - } - - /* Need snapshot before recording next bytecode (e.g. after a store). */ - if (J->needsnap) { - J->needsnap = 0; - lj_snap_purge(J); - lj_snap_add(J); - J->mergesnap = 1; - } - - /* Skip some bytecodes. */ - if (LJ_UNLIKELY(J->bcskip > 0)) { - J->bcskip--; - return; - } - - /* Record only closed loops for root traces. */ - pc = J->pc; - if (J->framedepth == 0 && - (MSize)((char *)pc - (char *)J->bc_min) >= J->bc_extent) - lj_trace_err(J, LJ_TRERR_LLEAVE); - -#ifdef LUA_USE_ASSERT - rec_check_slots(J); - rec_check_ir(J); -#endif - - /* Keep a copy of the runtime values of var/num/str operands. */ -#define rav (&ix.valv) -#define rbv (&ix.tabv) -#define rcv (&ix.keyv) - - lbase = J->L->base; - ins = *pc; - op = bc_op(ins); - ra = bc_a(ins); - ix.val = 0; - switch (bcmode_a(op)) { - case BCMvar: - copyTV(J->L, rav, &lbase[ra]); ix.val = ra = getslot(J, ra); break; - default: break; /* Handled later. */ - } - rb = bc_b(ins); - rc = bc_c(ins); - switch (bcmode_b(op)) { - case BCMnone: rb = 0; rc = bc_d(ins); break; /* Upgrade rc to 'rd'. */ - case BCMvar: - copyTV(J->L, rbv, &lbase[rb]); ix.tab = rb = getslot(J, rb); break; - default: break; /* Handled later. */ - } - switch (bcmode_c(op)) { - case BCMvar: - copyTV(J->L, rcv, &lbase[rc]); ix.key = rc = getslot(J, rc); break; - case BCMpri: setitype(rcv, ~rc); ix.key = rc = TREF_PRI(IRT_NIL+rc); break; - case BCMnum: { cTValue *tv = proto_knumtv(J->pt, rc); - copyTV(J->L, rcv, tv); ix.key = rc = tvisint(tv) ? lj_ir_kint(J, intV(tv)) : - lj_ir_knumint(J, numV(tv)); } break; - case BCMstr: { GCstr *s = gco2str(proto_kgc(J->pt, ~(ptrdiff_t)rc)); - setstrV(J->L, rcv, s); ix.key = rc = lj_ir_kstr(J, s); } break; - default: break; /* Handled later. */ - } - - switch (op) { - - /* -- Comparison ops ---------------------------------------------------- */ - - case BC_ISLT: case BC_ISGE: case BC_ISLE: case BC_ISGT: -#if LJ_HASFFI - if (tref_iscdata(ra) || tref_iscdata(rc)) { - rec_mm_comp_cdata(J, &ix, op, ((int)op & 2) ? MM_le : MM_lt); - break; - } -#endif - /* Emit nothing for two numeric or string consts. */ - if (!(tref_isk2(ra,rc) && tref_isnumber_str(ra) && tref_isnumber_str(rc))) { - IRType ta = tref_isinteger(ra) ? IRT_INT : tref_type(ra); - IRType tc = tref_isinteger(rc) ? IRT_INT : tref_type(rc); - int irop; - if (ta != tc) { - /* Widen mixed number/int comparisons to number/number comparison. */ - if (ta == IRT_INT && tc == IRT_NUM) { - ra = emitir(IRTN(IR_CONV), ra, IRCONV_NUM_INT); - ta = IRT_NUM; - } else if (ta == IRT_NUM && tc == IRT_INT) { - rc = emitir(IRTN(IR_CONV), rc, IRCONV_NUM_INT); - } else if (LJ_52) { - ta = IRT_NIL; /* Force metamethod for different types. */ - } else if (!((ta == IRT_FALSE || ta == IRT_TRUE) && - (tc == IRT_FALSE || tc == IRT_TRUE))) { - break; /* Interpreter will throw for two different types. */ - } - } - rec_comp_prep(J); - irop = (int)op - (int)BC_ISLT + (int)IR_LT; - if (ta == IRT_NUM) { - if ((irop & 1)) irop ^= 4; /* ISGE/ISGT are unordered. */ - if (!lj_ir_numcmp(numberVnum(rav), numberVnum(rcv), (IROp)irop)) - irop ^= 5; - } else if (ta == IRT_INT) { - if (!lj_ir_numcmp(numberVnum(rav), numberVnum(rcv), (IROp)irop)) - irop ^= 1; - } else if (ta == IRT_STR) { - if (!lj_ir_strcmp(strV(rav), strV(rcv), (IROp)irop)) irop ^= 1; - ra = lj_ir_call(J, IRCALL_lj_str_cmp, ra, rc); - rc = lj_ir_kint(J, 0); - ta = IRT_INT; - } else { - rec_mm_comp(J, &ix, (int)op); - break; - } - emitir(IRTG(irop, ta), ra, rc); - rec_comp_fixup(J, J->pc, ((int)op ^ irop) & 1); - } - break; - - case BC_ISEQV: case BC_ISNEV: - case BC_ISEQS: case BC_ISNES: - case BC_ISEQN: case BC_ISNEN: - case BC_ISEQP: case BC_ISNEP: -#if LJ_HASFFI - if (tref_iscdata(ra) || tref_iscdata(rc)) { - rec_mm_comp_cdata(J, &ix, op, MM_eq); - break; - } -#endif - /* Emit nothing for two non-table, non-udata consts. */ - if (!(tref_isk2(ra, rc) && !(tref_istab(ra) || tref_isudata(ra)))) { - int diff; - rec_comp_prep(J); - diff = lj_record_objcmp(J, ra, rc, rav, rcv); - if (diff == 2 || !(tref_istab(ra) || tref_isudata(ra))) - rec_comp_fixup(J, J->pc, ((int)op & 1) == !diff); - else if (diff == 1) /* Only check __eq if different, but same type. */ - rec_mm_equal(J, &ix, (int)op); - } - break; - - /* -- Unary test and copy ops ------------------------------------------- */ - - case BC_ISTC: case BC_ISFC: - if ((op & 1) == tref_istruecond(rc)) - rc = 0; /* Don't store if condition is not true. */ - /* fallthrough */ - case BC_IST: case BC_ISF: /* Type specialization suffices. */ - if (bc_a(pc[1]) < J->maxslot) - J->maxslot = bc_a(pc[1]); /* Shrink used slots. */ - break; - - /* -- Unary ops --------------------------------------------------------- */ - - case BC_NOT: - /* Type specialization already forces const result. */ - rc = tref_istruecond(rc) ? TREF_FALSE : TREF_TRUE; - break; - - case BC_LEN: - if (tref_isstr(rc)) - rc = emitir(IRTI(IR_FLOAD), rc, IRFL_STR_LEN); - else if (!LJ_52 && tref_istab(rc)) - rc = lj_ir_call(J, IRCALL_lj_tab_len, rc); - else - rc = rec_mm_len(J, rc, rcv); - break; - - /* -- Arithmetic ops ---------------------------------------------------- */ - - case BC_UNM: - if (tref_isnumber_str(rc)) { - rc = lj_opt_narrow_unm(J, rc, rcv); - } else { - ix.tab = rc; - copyTV(J->L, &ix.tabv, rcv); - rc = rec_mm_arith(J, &ix, MM_unm); - } - break; - - case BC_ADDNV: case BC_SUBNV: case BC_MULNV: case BC_DIVNV: case BC_MODNV: - /* Swap rb/rc and rbv/rcv. rav is temp. */ - ix.tab = rc; ix.key = rc = rb; rb = ix.tab; - copyTV(J->L, rav, rbv); - copyTV(J->L, rbv, rcv); - copyTV(J->L, rcv, rav); - if (op == BC_MODNV) - goto recmod; - /* fallthrough */ - case BC_ADDVN: case BC_SUBVN: case BC_MULVN: case BC_DIVVN: - case BC_ADDVV: case BC_SUBVV: case BC_MULVV: case BC_DIVVV: { - MMS mm = bcmode_mm(op); - if (tref_isnumber_str(rb) && tref_isnumber_str(rc)) - rc = lj_opt_narrow_arith(J, rb, rc, rbv, rcv, - (int)mm - (int)MM_add + (int)IR_ADD); - else - rc = rec_mm_arith(J, &ix, mm); - break; - } - - case BC_MODVN: case BC_MODVV: - recmod: - if (tref_isnumber_str(rb) && tref_isnumber_str(rc)) - rc = lj_opt_narrow_mod(J, rb, rc, rcv); - else - rc = rec_mm_arith(J, &ix, MM_mod); - break; - - case BC_POW: - if (tref_isnumber_str(rb) && tref_isnumber_str(rc)) - rc = lj_opt_narrow_pow(J, lj_ir_tonum(J, rb), rc, rcv); - else - rc = rec_mm_arith(J, &ix, MM_pow); - break; - - /* -- Constant and move ops --------------------------------------------- */ - - case BC_MOV: - /* Clear gap of method call to avoid resurrecting previous refs. */ - if (ra > J->maxslot) J->base[ra-1] = 0; - break; - case BC_KSTR: case BC_KNUM: case BC_KPRI: - break; - case BC_KSHORT: - rc = lj_ir_kint(J, (int32_t)(int16_t)rc); - break; - case BC_KNIL: - while (ra <= rc) - J->base[ra++] = TREF_NIL; - if (rc >= J->maxslot) J->maxslot = rc+1; - break; -#if LJ_HASFFI - case BC_KCDATA: - rc = lj_ir_kgc(J, proto_kgc(J->pt, ~(ptrdiff_t)rc), IRT_CDATA); - break; -#endif - - /* -- Upvalue and function ops ------------------------------------------ */ - - case BC_UGET: - rc = rec_upvalue(J, rc, 0); - break; - case BC_USETV: case BC_USETS: case BC_USETN: case BC_USETP: - rec_upvalue(J, ra, rc); - break; - - /* -- Table ops --------------------------------------------------------- */ - - case BC_GGET: case BC_GSET: - settabV(J->L, &ix.tabv, tabref(J->fn->l.env)); - ix.tab = emitir(IRT(IR_FLOAD, IRT_TAB), getcurrf(J), IRFL_FUNC_ENV); - ix.idxchain = LJ_MAX_IDXCHAIN; - rc = lj_record_idx(J, &ix); - break; - - case BC_TGETB: case BC_TSETB: - setintV(&ix.keyv, (int32_t)rc); - ix.key = lj_ir_kint(J, (int32_t)rc); - /* fallthrough */ - case BC_TGETV: case BC_TGETS: case BC_TSETV: case BC_TSETS: - ix.idxchain = LJ_MAX_IDXCHAIN; - rc = lj_record_idx(J, &ix); - break; - - case BC_TNEW: - rc = rec_tnew(J, rc); - break; - case BC_TDUP: - rc = emitir(IRTG(IR_TDUP, IRT_TAB), - lj_ir_ktab(J, gco2tab(proto_kgc(J->pt, ~(ptrdiff_t)rc))), 0); - break; - - /* -- Calls and vararg handling ----------------------------------------- */ - - case BC_ITERC: - J->base[ra] = getslot(J, ra-3); - J->base[ra+1] = getslot(J, ra-2); - J->base[ra+2] = getslot(J, ra-1); - { /* Do the actual copy now because lj_record_call needs the values. */ - TValue *b = &J->L->base[ra]; - copyTV(J->L, b, b-3); - copyTV(J->L, b+1, b-2); - copyTV(J->L, b+2, b-1); - } - lj_record_call(J, ra, (ptrdiff_t)rc-1); - break; - - /* L->top is set to L->base+ra+rc+NARGS-1+1. See lj_dispatch_ins(). */ - case BC_CALLM: - rc = (BCReg)(J->L->top - J->L->base) - ra; - /* fallthrough */ - case BC_CALL: - lj_record_call(J, ra, (ptrdiff_t)rc-1); - break; - - case BC_CALLMT: - rc = (BCReg)(J->L->top - J->L->base) - ra; - /* fallthrough */ - case BC_CALLT: - lj_record_tailcall(J, ra, (ptrdiff_t)rc-1); - break; - - case BC_VARG: - rec_varg(J, ra, (ptrdiff_t)rb-1); - break; - - /* -- Returns ----------------------------------------------------------- */ - - case BC_RETM: - /* L->top is set to L->base+ra+rc+NRESULTS-1, see lj_dispatch_ins(). */ - rc = (BCReg)(J->L->top - J->L->base) - ra + 1; - /* fallthrough */ - case BC_RET: case BC_RET0: case BC_RET1: - lj_record_ret(J, ra, (ptrdiff_t)rc-1); - break; - - /* -- Loops and branches ------------------------------------------------ */ - - case BC_FORI: - if (rec_for(J, pc, 0) != LOOPEV_LEAVE) - J->loopref = J->cur.nins; - break; - case BC_JFORI: - lua_assert(bc_op(pc[(ptrdiff_t)rc-BCBIAS_J]) == BC_JFORL); - if (rec_for(J, pc, 0) != LOOPEV_LEAVE) /* Link to existing loop. */ - rec_stop(J, LJ_TRLINK_ROOT, bc_d(pc[(ptrdiff_t)rc-BCBIAS_J])); - /* Continue tracing if the loop is not entered. */ - break; - - case BC_FORL: - rec_loop_interp(J, pc, rec_for(J, pc+((ptrdiff_t)rc-BCBIAS_J), 1)); - break; - case BC_ITERL: - rec_loop_interp(J, pc, rec_iterl(J, *pc)); - break; - case BC_LOOP: - rec_loop_interp(J, pc, rec_loop(J, ra)); - break; - - case BC_JFORL: - rec_loop_jit(J, rc, rec_for(J, pc+bc_j(traceref(J, rc)->startins), 1)); - break; - case BC_JITERL: - rec_loop_jit(J, rc, rec_iterl(J, traceref(J, rc)->startins)); - break; - case BC_JLOOP: - rec_loop_jit(J, rc, rec_loop(J, ra)); - break; - - case BC_IFORL: - case BC_IITERL: - case BC_ILOOP: - case BC_IFUNCF: - case BC_IFUNCV: - lj_trace_err(J, LJ_TRERR_BLACKL); - break; - - case BC_JMP: - if (ra < J->maxslot) - J->maxslot = ra; /* Shrink used slots. */ - break; - - /* -- Function headers -------------------------------------------------- */ - - case BC_FUNCF: - rec_func_lua(J); - break; - case BC_JFUNCF: - rec_func_jit(J, rc); - break; - - case BC_FUNCV: - rec_func_vararg(J); - rec_func_lua(J); - break; - case BC_JFUNCV: - lua_assert(0); /* Cannot happen. No hotcall counting for varag funcs. */ - break; - - case BC_FUNCC: - case BC_FUNCCW: - lj_ffrecord_func(J); - break; - - default: - if (op >= BC__MAX) { - lj_ffrecord_func(J); - break; - } - /* fallthrough */ - case BC_ITERN: - case BC_ISNEXT: - case BC_CAT: - case BC_UCLO: - case BC_FNEW: - case BC_TSETM: - setintV(&J->errinfo, (int32_t)op); - lj_trace_err_info(J, LJ_TRERR_NYIBC); - break; - } - - /* rc == 0 if we have no result yet, e.g. pending __index metamethod call. */ - if (bcmode_a(op) == BCMdst && rc) { - J->base[ra] = rc; - if (ra >= J->maxslot) J->maxslot = ra+1; - } - -#undef rav -#undef rbv -#undef rcv - - /* Limit the number of recorded IR instructions. */ - if (J->cur.nins > REF_FIRST+(IRRef)J->param[JIT_P_maxrecord]) - lj_trace_err(J, LJ_TRERR_TRACEOV); -} - -/* -- Recording setup ----------------------------------------------------- */ - -/* Setup recording for a root trace started by a hot loop. */ -static const BCIns *rec_setup_root(jit_State *J) -{ - /* Determine the next PC and the bytecode range for the loop. */ - const BCIns *pcj, *pc = J->pc; - BCIns ins = *pc; - BCReg ra = bc_a(ins); - switch (bc_op(ins)) { - case BC_FORL: - J->bc_extent = (MSize)(-bc_j(ins))*sizeof(BCIns); - pc += 1+bc_j(ins); - J->bc_min = pc; - break; - case BC_ITERL: - lua_assert(bc_op(pc[-1]) == BC_ITERC); - J->maxslot = ra + bc_b(pc[-1]) - 1; - J->bc_extent = (MSize)(-bc_j(ins))*sizeof(BCIns); - pc += 1+bc_j(ins); - lua_assert(bc_op(pc[-1]) == BC_JMP); - J->bc_min = pc; - break; - case BC_LOOP: - /* Only check BC range for real loops, but not for "repeat until true". */ - pcj = pc + bc_j(ins); - ins = *pcj; - if (bc_op(ins) == BC_JMP && bc_j(ins) < 0) { - J->bc_min = pcj+1 + bc_j(ins); - J->bc_extent = (MSize)(-bc_j(ins))*sizeof(BCIns); - } - J->maxslot = ra; - pc++; - break; - case BC_RET: - case BC_RET0: - case BC_RET1: - /* No bytecode range check for down-recursive root traces. */ - J->maxslot = ra + bc_d(ins) - 1; - break; - case BC_FUNCF: - /* No bytecode range check for root traces started by a hot call. */ - J->maxslot = J->pt->numparams; - pc++; - break; - default: - lua_assert(0); - break; - } - return pc; -} - -/* Setup for recording a new trace. */ -void lj_record_setup(jit_State *J) -{ - uint32_t i; - - /* Initialize state related to current trace. */ - memset(J->slot, 0, sizeof(J->slot)); - memset(J->chain, 0, sizeof(J->chain)); - memset(J->bpropcache, 0, sizeof(J->bpropcache)); - J->scev.idx = REF_NIL; - setmref(J->scev.pc, NULL); - - J->baseslot = 1; /* Invoking function is at base[-1]. */ - J->base = J->slot + J->baseslot; - J->maxslot = 0; - J->framedepth = 0; - J->retdepth = 0; - - J->instunroll = J->param[JIT_P_instunroll]; - J->loopunroll = J->param[JIT_P_loopunroll]; - J->tailcalled = 0; - J->loopref = 0; - - J->bc_min = NULL; /* Means no limit. */ - J->bc_extent = ~(MSize)0; - - /* Emit instructions for fixed references. Also triggers initial IR alloc. */ - emitir_raw(IRT(IR_BASE, IRT_P32), J->parent, J->exitno); - for (i = 0; i <= 2; i++) { - IRIns *ir = IR(REF_NIL-i); - ir->i = 0; - ir->t.irt = (uint8_t)(IRT_NIL+i); - ir->o = IR_KPRI; - ir->prev = 0; - } - J->cur.nk = REF_TRUE; - - J->startpc = J->pc; - setmref(J->cur.startpc, J->pc); - if (J->parent) { /* Side trace. */ - GCtrace *T = traceref(J, J->parent); - TraceNo root = T->root ? T->root : J->parent; - J->cur.root = (uint16_t)root; - J->cur.startins = BCINS_AD(BC_JMP, 0, 0); - /* Check whether we could at least potentially form an extra loop. */ - if (J->exitno == 0 && T->snap[0].nent == 0) { - /* We can narrow a FORL for some side traces, too. */ - if (J->pc > proto_bc(J->pt) && bc_op(J->pc[-1]) == BC_JFORI && - bc_d(J->pc[bc_j(J->pc[-1])-1]) == root) { - lj_snap_add(J); - rec_for_loop(J, J->pc-1, &J->scev, 1); - goto sidecheck; - } - } else { - J->startpc = NULL; /* Prevent forming an extra loop. */ - } - lj_snap_replay(J, T); - sidecheck: - if (traceref(J, J->cur.root)->nchild >= J->param[JIT_P_maxside] || - T->snap[J->exitno].count >= J->param[JIT_P_hotexit] + - J->param[JIT_P_tryside]) { - rec_stop(J, LJ_TRLINK_INTERP, 0); - } - } else { /* Root trace. */ - J->cur.root = 0; - J->cur.startins = *J->pc; - J->pc = rec_setup_root(J); - /* Note: the loop instruction itself is recorded at the end and not - ** at the start! So snapshot #0 needs to point to the *next* instruction. - */ - lj_snap_add(J); - if (bc_op(J->cur.startins) == BC_FORL) - rec_for_loop(J, J->pc-1, &J->scev, 1); - if (1 + J->pt->framesize >= LJ_MAX_JSLOTS) - lj_trace_err(J, LJ_TRERR_STACKOV); - } -#ifdef LUAJIT_ENABLE_CHECKHOOK - /* Regularly check for instruction/line hooks from compiled code and - ** exit to the interpreter if the hooks are set. - ** - ** This is a compile-time option and disabled by default, since the - ** hook checks may be quite expensive in tight loops. - ** - ** Note this is only useful if hooks are *not* set most of the time. - ** Use this only if you want to *asynchronously* interrupt the execution. - ** - ** You can set the instruction hook via lua_sethook() with a count of 1 - ** from a signal handler or another native thread. Please have a look - ** at the first few functions in luajit.c for an example (Ctrl-C handler). - */ - { - TRef tr = emitir(IRT(IR_XLOAD, IRT_U8), - lj_ir_kptr(J, &J2G(J)->hookmask), IRXLOAD_VOLATILE); - tr = emitir(IRTI(IR_BAND), tr, lj_ir_kint(J, (LUA_MASKLINE|LUA_MASKCOUNT))); - emitir(IRTGI(IR_EQ), tr, lj_ir_kint(J, 0)); - } -#endif -} - -#undef IR -#undef emitir_raw -#undef emitir - -#endif diff --git a/deps/luajit/src/lj_record.h b/deps/luajit/src/lj_record.h deleted file mode 100644 index c9f4882a..00000000 --- a/deps/luajit/src/lj_record.h +++ /dev/null @@ -1,44 +0,0 @@ -/* -** Trace recorder (bytecode -> SSA IR). -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#ifndef _LJ_RECORD_H -#define _LJ_RECORD_H - -#include "lj_obj.h" -#include "lj_jit.h" - -#if LJ_HASJIT -/* Context for recording an indexed load/store. */ -typedef struct RecordIndex { - TValue tabv; /* Runtime value of table (or indexed object). */ - TValue keyv; /* Runtime value of key. */ - TValue valv; /* Runtime value of stored value. */ - TValue mobjv; /* Runtime value of metamethod object. */ - GCtab *mtv; /* Runtime value of metatable object. */ - cTValue *oldv; /* Runtime value of previously stored value. */ - TRef tab; /* Table (or indexed object) reference. */ - TRef key; /* Key reference. */ - TRef val; /* Value reference for a store or 0 for a load. */ - TRef mt; /* Metatable reference. */ - TRef mobj; /* Metamethod object reference. */ - int idxchain; /* Index indirections left or 0 for raw lookup. */ -} RecordIndex; - -LJ_FUNC int lj_record_objcmp(jit_State *J, TRef a, TRef b, - cTValue *av, cTValue *bv); -LJ_FUNC TRef lj_record_constify(jit_State *J, cTValue *o); - -LJ_FUNC void lj_record_call(jit_State *J, BCReg func, ptrdiff_t nargs); -LJ_FUNC void lj_record_tailcall(jit_State *J, BCReg func, ptrdiff_t nargs); -LJ_FUNC void lj_record_ret(jit_State *J, BCReg rbase, ptrdiff_t gotresults); - -LJ_FUNC int lj_record_mm_lookup(jit_State *J, RecordIndex *ix, MMS mm); -LJ_FUNC TRef lj_record_idx(jit_State *J, RecordIndex *ix); - -LJ_FUNC void lj_record_ins(jit_State *J); -LJ_FUNC void lj_record_setup(jit_State *J); -#endif - -#endif diff --git a/deps/luajit/src/lj_snap.c b/deps/luajit/src/lj_snap.c deleted file mode 100644 index 5c870baf..00000000 --- a/deps/luajit/src/lj_snap.c +++ /dev/null @@ -1,866 +0,0 @@ -/* -** Snapshot handling. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#define lj_snap_c -#define LUA_CORE - -#include "lj_obj.h" - -#if LJ_HASJIT - -#include "lj_gc.h" -#include "lj_tab.h" -#include "lj_state.h" -#include "lj_frame.h" -#include "lj_bc.h" -#include "lj_ir.h" -#include "lj_jit.h" -#include "lj_iropt.h" -#include "lj_trace.h" -#include "lj_snap.h" -#include "lj_target.h" -#if LJ_HASFFI -#include "lj_ctype.h" -#include "lj_cdata.h" -#endif - -/* Some local macros to save typing. Undef'd at the end. */ -#define IR(ref) (&J->cur.ir[(ref)]) - -/* Pass IR on to next optimization in chain (FOLD). */ -#define emitir(ot, a, b) (lj_ir_set(J, (ot), (a), (b)), lj_opt_fold(J)) - -/* Emit raw IR without passing through optimizations. */ -#define emitir_raw(ot, a, b) (lj_ir_set(J, (ot), (a), (b)), lj_ir_emit(J)) - -/* -- Snapshot buffer allocation ------------------------------------------ */ - -/* Grow snapshot buffer. */ -void lj_snap_grow_buf_(jit_State *J, MSize need) -{ - MSize maxsnap = (MSize)J->param[JIT_P_maxsnap]; - if (need > maxsnap) - lj_trace_err(J, LJ_TRERR_SNAPOV); - lj_mem_growvec(J->L, J->snapbuf, J->sizesnap, maxsnap, SnapShot); - J->cur.snap = J->snapbuf; -} - -/* Grow snapshot map buffer. */ -void lj_snap_grow_map_(jit_State *J, MSize need) -{ - if (need < 2*J->sizesnapmap) - need = 2*J->sizesnapmap; - else if (need < 64) - need = 64; - J->snapmapbuf = (SnapEntry *)lj_mem_realloc(J->L, J->snapmapbuf, - J->sizesnapmap*sizeof(SnapEntry), need*sizeof(SnapEntry)); - J->cur.snapmap = J->snapmapbuf; - J->sizesnapmap = need; -} - -/* -- Snapshot generation ------------------------------------------------- */ - -/* Add all modified slots to the snapshot. */ -static MSize snapshot_slots(jit_State *J, SnapEntry *map, BCReg nslots) -{ - IRRef retf = J->chain[IR_RETF]; /* Limits SLOAD restore elimination. */ - BCReg s; - MSize n = 0; - for (s = 0; s < nslots; s++) { - TRef tr = J->slot[s]; - IRRef ref = tref_ref(tr); - if (ref) { - SnapEntry sn = SNAP_TR(s, tr); - IRIns *ir = IR(ref); - if (!(sn & (SNAP_CONT|SNAP_FRAME)) && - ir->o == IR_SLOAD && ir->op1 == s && ref > retf) { - /* No need to snapshot unmodified non-inherited slots. */ - if (!(ir->op2 & IRSLOAD_INHERIT)) - continue; - /* No need to restore readonly slots and unmodified non-parent slots. */ - if (!(LJ_DUALNUM && (ir->op2 & IRSLOAD_CONVERT)) && - (ir->op2 & (IRSLOAD_READONLY|IRSLOAD_PARENT)) != IRSLOAD_PARENT) - sn |= SNAP_NORESTORE; - } - if (LJ_SOFTFP && irt_isnum(ir->t)) - sn |= SNAP_SOFTFPNUM; - map[n++] = sn; - } - } - return n; -} - -/* Add frame links at the end of the snapshot. */ -static BCReg snapshot_framelinks(jit_State *J, SnapEntry *map) -{ - cTValue *frame = J->L->base - 1; - cTValue *lim = J->L->base - J->baseslot; - cTValue *ftop = frame + funcproto(frame_func(frame))->framesize; - MSize f = 0; - map[f++] = SNAP_MKPC(J->pc); /* The current PC is always the first entry. */ - while (frame > lim) { /* Backwards traversal of all frames above base. */ - if (frame_islua(frame)) { - map[f++] = SNAP_MKPC(frame_pc(frame)); - frame = frame_prevl(frame); - } else if (frame_iscont(frame)) { - map[f++] = SNAP_MKFTSZ(frame_ftsz(frame)); - map[f++] = SNAP_MKPC(frame_contpc(frame)); - frame = frame_prevd(frame); - } else { - lua_assert(!frame_isc(frame)); - map[f++] = SNAP_MKFTSZ(frame_ftsz(frame)); - frame = frame_prevd(frame); - continue; - } - if (frame + funcproto(frame_func(frame))->framesize > ftop) - ftop = frame + funcproto(frame_func(frame))->framesize; - } - lua_assert(f == (MSize)(1 + J->framedepth)); - return (BCReg)(ftop - lim); -} - -/* Take a snapshot of the current stack. */ -static void snapshot_stack(jit_State *J, SnapShot *snap, MSize nsnapmap) -{ - BCReg nslots = J->baseslot + J->maxslot; - MSize nent; - SnapEntry *p; - /* Conservative estimate. */ - lj_snap_grow_map(J, nsnapmap + nslots + (MSize)J->framedepth+1); - p = &J->cur.snapmap[nsnapmap]; - nent = snapshot_slots(J, p, nslots); - snap->topslot = (uint8_t)snapshot_framelinks(J, p + nent); - snap->mapofs = (uint16_t)nsnapmap; - snap->ref = (IRRef1)J->cur.nins; - snap->nent = (uint8_t)nent; - snap->nslots = (uint8_t)nslots; - snap->count = 0; - J->cur.nsnapmap = (uint16_t)(nsnapmap + nent + 1 + J->framedepth); -} - -/* Add or merge a snapshot. */ -void lj_snap_add(jit_State *J) -{ - MSize nsnap = J->cur.nsnap; - MSize nsnapmap = J->cur.nsnapmap; - /* Merge if no ins. inbetween or if requested and no guard inbetween. */ - if (J->mergesnap ? !irt_isguard(J->guardemit) : - (nsnap > 0 && J->cur.snap[nsnap-1].ref == J->cur.nins)) { - if (nsnap == 1) { /* But preserve snap #0 PC. */ - emitir_raw(IRT(IR_NOP, IRT_NIL), 0, 0); - goto nomerge; - } - nsnapmap = J->cur.snap[--nsnap].mapofs; - } else { - nomerge: - lj_snap_grow_buf(J, nsnap+1); - J->cur.nsnap = (uint16_t)(nsnap+1); - } - J->mergesnap = 0; - J->guardemit.irt = 0; - snapshot_stack(J, &J->cur.snap[nsnap], nsnapmap); -} - -/* -- Snapshot modification ----------------------------------------------- */ - -#define SNAP_USEDEF_SLOTS (LJ_MAX_JSLOTS+LJ_STACK_EXTRA) - -/* Find unused slots with reaching-definitions bytecode data-flow analysis. */ -static BCReg snap_usedef(jit_State *J, uint8_t *udf, - const BCIns *pc, BCReg maxslot) -{ - BCReg s; - GCobj *o; - - if (maxslot == 0) return 0; -#ifdef LUAJIT_USE_VALGRIND - /* Avoid errors for harmless reads beyond maxslot. */ - memset(udf, 1, SNAP_USEDEF_SLOTS); -#else - memset(udf, 1, maxslot); -#endif - - /* Treat open upvalues as used. */ - o = gcref(J->L->openupval); - while (o) { - if (uvval(gco2uv(o)) < J->L->base) break; - udf[uvval(gco2uv(o)) - J->L->base] = 0; - o = gcref(o->gch.nextgc); - } - -#define USE_SLOT(s) udf[(s)] &= ~1 -#define DEF_SLOT(s) udf[(s)] *= 3 - - /* Scan through following bytecode and check for uses/defs. */ - lua_assert(pc >= proto_bc(J->pt) && pc < proto_bc(J->pt) + J->pt->sizebc); - for (;;) { - BCIns ins = *pc++; - BCOp op = bc_op(ins); - switch (bcmode_b(op)) { - case BCMvar: USE_SLOT(bc_b(ins)); break; - default: break; - } - switch (bcmode_c(op)) { - case BCMvar: USE_SLOT(bc_c(ins)); break; - case BCMrbase: - lua_assert(op == BC_CAT); - for (s = bc_b(ins); s <= bc_c(ins); s++) USE_SLOT(s); - for (; s < maxslot; s++) DEF_SLOT(s); - break; - case BCMjump: - handle_jump: { - BCReg minslot = bc_a(ins); - if (op >= BC_FORI && op <= BC_JFORL) minslot += FORL_EXT; - else if (op >= BC_ITERL && op <= BC_JITERL) minslot += bc_b(pc[-2])-1; - else if (op == BC_UCLO) { pc += bc_j(ins); break; } - for (s = minslot; s < maxslot; s++) DEF_SLOT(s); - return minslot < maxslot ? minslot : maxslot; - } - case BCMlit: - if (op == BC_JFORL || op == BC_JITERL || op == BC_JLOOP) { - goto handle_jump; - } else if (bc_isret(op)) { - BCReg top = op == BC_RETM ? maxslot : (bc_a(ins) + bc_d(ins)-1); - for (s = 0; s < bc_a(ins); s++) DEF_SLOT(s); - for (; s < top; s++) USE_SLOT(s); - for (; s < maxslot; s++) DEF_SLOT(s); - return 0; - } - break; - case BCMfunc: return maxslot; /* NYI: will abort, anyway. */ - default: break; - } - switch (bcmode_a(op)) { - case BCMvar: USE_SLOT(bc_a(ins)); break; - case BCMdst: - if (!(op == BC_ISTC || op == BC_ISFC)) DEF_SLOT(bc_a(ins)); - break; - case BCMbase: - if (op >= BC_CALLM && op <= BC_VARG) { - BCReg top = (op == BC_CALLM || op == BC_CALLMT || bc_c(ins) == 0) ? - maxslot : (bc_a(ins) + bc_c(ins)); - s = bc_a(ins) - ((op == BC_ITERC || op == BC_ITERN) ? 3 : 0); - for (; s < top; s++) USE_SLOT(s); - for (; s < maxslot; s++) DEF_SLOT(s); - if (op == BC_CALLT || op == BC_CALLMT) { - for (s = 0; s < bc_a(ins); s++) DEF_SLOT(s); - return 0; - } - } else if (op == BC_KNIL) { - for (s = bc_a(ins); s <= bc_d(ins); s++) DEF_SLOT(s); - } else if (op == BC_TSETM) { - for (s = bc_a(ins)-1; s < maxslot; s++) USE_SLOT(s); - } - break; - default: break; - } - lua_assert(pc >= proto_bc(J->pt) && pc < proto_bc(J->pt) + J->pt->sizebc); - } - -#undef USE_SLOT -#undef DEF_SLOT - - return 0; /* unreachable */ -} - -/* Purge dead slots before the next snapshot. */ -void lj_snap_purge(jit_State *J) -{ - uint8_t udf[SNAP_USEDEF_SLOTS]; - BCReg maxslot = J->maxslot; - BCReg s = snap_usedef(J, udf, J->pc, maxslot); - for (; s < maxslot; s++) - if (udf[s] != 0) - J->base[s] = 0; /* Purge dead slots. */ -} - -/* Shrink last snapshot. */ -void lj_snap_shrink(jit_State *J) -{ - SnapShot *snap = &J->cur.snap[J->cur.nsnap-1]; - SnapEntry *map = &J->cur.snapmap[snap->mapofs]; - MSize n, m, nlim, nent = snap->nent; - uint8_t udf[SNAP_USEDEF_SLOTS]; - BCReg maxslot = J->maxslot; - BCReg minslot = snap_usedef(J, udf, snap_pc(map[nent]), maxslot); - BCReg baseslot = J->baseslot; - maxslot += baseslot; - minslot += baseslot; - snap->nslots = (uint8_t)maxslot; - for (n = m = 0; n < nent; n++) { /* Remove unused slots from snapshot. */ - BCReg s = snap_slot(map[n]); - if (s < minslot || (s < maxslot && udf[s-baseslot] == 0)) - map[m++] = map[n]; /* Only copy used slots. */ - } - snap->nent = (uint8_t)m; - nlim = J->cur.nsnapmap - snap->mapofs - 1; - while (n <= nlim) map[m++] = map[n++]; /* Move PC + frame links down. */ - J->cur.nsnapmap = (uint16_t)(snap->mapofs + m); /* Free up space in map. */ -} - -/* -- Snapshot access ----------------------------------------------------- */ - -/* Initialize a Bloom Filter with all renamed refs. -** There are very few renames (often none), so the filter has -** very few bits set. This makes it suitable for negative filtering. -*/ -static BloomFilter snap_renamefilter(GCtrace *T, SnapNo lim) -{ - BloomFilter rfilt = 0; - IRIns *ir; - for (ir = &T->ir[T->nins-1]; ir->o == IR_RENAME; ir--) - if (ir->op2 <= lim) - bloomset(rfilt, ir->op1); - return rfilt; -} - -/* Process matching renames to find the original RegSP. */ -static RegSP snap_renameref(GCtrace *T, SnapNo lim, IRRef ref, RegSP rs) -{ - IRIns *ir; - for (ir = &T->ir[T->nins-1]; ir->o == IR_RENAME; ir--) - if (ir->op1 == ref && ir->op2 <= lim) - rs = ir->prev; - return rs; -} - -/* Copy RegSP from parent snapshot to the parent links of the IR. */ -IRIns *lj_snap_regspmap(GCtrace *T, SnapNo snapno, IRIns *ir) -{ - SnapShot *snap = &T->snap[snapno]; - SnapEntry *map = &T->snapmap[snap->mapofs]; - BloomFilter rfilt = snap_renamefilter(T, snapno); - MSize n = 0; - IRRef ref = 0; - for ( ; ; ir++) { - uint32_t rs; - if (ir->o == IR_SLOAD) { - if (!(ir->op2 & IRSLOAD_PARENT)) break; - for ( ; ; n++) { - lua_assert(n < snap->nent); - if (snap_slot(map[n]) == ir->op1) { - ref = snap_ref(map[n++]); - break; - } - } - } else if (LJ_SOFTFP && ir->o == IR_HIOP) { - ref++; - } else if (ir->o == IR_PVAL) { - ref = ir->op1 + REF_BIAS; - } else { - break; - } - rs = T->ir[ref].prev; - if (bloomtest(rfilt, ref)) - rs = snap_renameref(T, snapno, ref, rs); - ir->prev = (uint16_t)rs; - lua_assert(regsp_used(rs)); - } - return ir; -} - -/* -- Snapshot replay ----------------------------------------------------- */ - -/* Replay constant from parent trace. */ -static TRef snap_replay_const(jit_State *J, IRIns *ir) -{ - /* Only have to deal with constants that can occur in stack slots. */ - switch ((IROp)ir->o) { - case IR_KPRI: return TREF_PRI(irt_type(ir->t)); - case IR_KINT: return lj_ir_kint(J, ir->i); - case IR_KGC: return lj_ir_kgc(J, ir_kgc(ir), irt_t(ir->t)); - case IR_KNUM: return lj_ir_k64(J, IR_KNUM, ir_knum(ir)); - case IR_KINT64: return lj_ir_k64(J, IR_KINT64, ir_kint64(ir)); - case IR_KPTR: return lj_ir_kptr(J, ir_kptr(ir)); /* Continuation. */ - default: lua_assert(0); return TREF_NIL; break; - } -} - -/* De-duplicate parent reference. */ -static TRef snap_dedup(jit_State *J, SnapEntry *map, MSize nmax, IRRef ref) -{ - MSize j; - for (j = 0; j < nmax; j++) - if (snap_ref(map[j]) == ref) - return J->slot[snap_slot(map[j])] & ~(SNAP_CONT|SNAP_FRAME); - return 0; -} - -/* Emit parent reference with de-duplication. */ -static TRef snap_pref(jit_State *J, GCtrace *T, SnapEntry *map, MSize nmax, - BloomFilter seen, IRRef ref) -{ - IRIns *ir = &T->ir[ref]; - TRef tr; - if (irref_isk(ref)) - tr = snap_replay_const(J, ir); - else if (!regsp_used(ir->prev)) - tr = 0; - else if (!bloomtest(seen, ref) || (tr = snap_dedup(J, map, nmax, ref)) == 0) - tr = emitir(IRT(IR_PVAL, irt_type(ir->t)), ref - REF_BIAS, 0); - return tr; -} - -/* Check whether a sunk store corresponds to an allocation. Slow path. */ -static int snap_sunk_store2(jit_State *J, IRIns *ira, IRIns *irs) -{ - if (irs->o == IR_ASTORE || irs->o == IR_HSTORE || - irs->o == IR_FSTORE || irs->o == IR_XSTORE) { - IRIns *irk = IR(irs->op1); - if (irk->o == IR_AREF || irk->o == IR_HREFK) - irk = IR(irk->op1); - return (IR(irk->op1) == ira); - } - return 0; -} - -/* Check whether a sunk store corresponds to an allocation. Fast path. */ -static LJ_AINLINE int snap_sunk_store(jit_State *J, IRIns *ira, IRIns *irs) -{ - if (irs->s != 255) - return (ira + irs->s == irs); /* Fast check. */ - return snap_sunk_store2(J, ira, irs); -} - -/* Replay snapshot state to setup side trace. */ -void lj_snap_replay(jit_State *J, GCtrace *T) -{ - SnapShot *snap = &T->snap[J->exitno]; - SnapEntry *map = &T->snapmap[snap->mapofs]; - MSize n, nent = snap->nent; - BloomFilter seen = 0; - int pass23 = 0; - J->framedepth = 0; - /* Emit IR for slots inherited from parent snapshot. */ - for (n = 0; n < nent; n++) { - SnapEntry sn = map[n]; - BCReg s = snap_slot(sn); - IRRef ref = snap_ref(sn); - IRIns *ir = &T->ir[ref]; - TRef tr; - /* The bloom filter avoids O(nent^2) overhead for de-duping slots. */ - if (bloomtest(seen, ref) && (tr = snap_dedup(J, map, n, ref)) != 0) - goto setslot; - bloomset(seen, ref); - if (irref_isk(ref)) { - tr = snap_replay_const(J, ir); - } else if (!regsp_used(ir->prev)) { - pass23 = 1; - lua_assert(s != 0); - tr = s; - } else { - IRType t = irt_type(ir->t); - uint32_t mode = IRSLOAD_INHERIT|IRSLOAD_PARENT; - if (LJ_SOFTFP && (sn & SNAP_SOFTFPNUM)) t = IRT_NUM; - if (ir->o == IR_SLOAD) mode |= (ir->op2 & IRSLOAD_READONLY); - tr = emitir_raw(IRT(IR_SLOAD, t), s, mode); - } - setslot: - J->slot[s] = tr | (sn&(SNAP_CONT|SNAP_FRAME)); /* Same as TREF_* flags. */ - J->framedepth += ((sn & (SNAP_CONT|SNAP_FRAME)) && s); - if ((sn & SNAP_FRAME)) - J->baseslot = s+1; - } - if (pass23) { - IRIns *irlast = &T->ir[snap->ref]; - pass23 = 0; - /* Emit dependent PVALs. */ - for (n = 0; n < nent; n++) { - SnapEntry sn = map[n]; - IRRef refp = snap_ref(sn); - IRIns *ir = &T->ir[refp]; - if (regsp_reg(ir->r) == RID_SUNK) { - if (J->slot[snap_slot(sn)] != snap_slot(sn)) continue; - pass23 = 1; - lua_assert(ir->o == IR_TNEW || ir->o == IR_TDUP || - ir->o == IR_CNEW || ir->o == IR_CNEWI); - if (ir->op1 >= T->nk) snap_pref(J, T, map, nent, seen, ir->op1); - if (ir->op2 >= T->nk) snap_pref(J, T, map, nent, seen, ir->op2); - if (LJ_HASFFI && ir->o == IR_CNEWI) { - if (LJ_32 && refp+1 < T->nins && (ir+1)->o == IR_HIOP) - snap_pref(J, T, map, nent, seen, (ir+1)->op2); - } else { - IRIns *irs; - for (irs = ir+1; irs < irlast; irs++) - if (irs->r == RID_SINK && snap_sunk_store(J, ir, irs)) { - if (snap_pref(J, T, map, nent, seen, irs->op2) == 0) - snap_pref(J, T, map, nent, seen, T->ir[irs->op2].op1); - else if ((LJ_SOFTFP || (LJ_32 && LJ_HASFFI)) && - irs+1 < irlast && (irs+1)->o == IR_HIOP) - snap_pref(J, T, map, nent, seen, (irs+1)->op2); - } - } - } else if (!irref_isk(refp) && !regsp_used(ir->prev)) { - lua_assert(ir->o == IR_CONV && ir->op2 == IRCONV_NUM_INT); - J->slot[snap_slot(sn)] = snap_pref(J, T, map, nent, seen, ir->op1); - } - } - /* Replay sunk instructions. */ - for (n = 0; pass23 && n < nent; n++) { - SnapEntry sn = map[n]; - IRRef refp = snap_ref(sn); - IRIns *ir = &T->ir[refp]; - if (regsp_reg(ir->r) == RID_SUNK) { - TRef op1, op2; - if (J->slot[snap_slot(sn)] != snap_slot(sn)) { /* De-dup allocs. */ - J->slot[snap_slot(sn)] = J->slot[J->slot[snap_slot(sn)]]; - continue; - } - op1 = ir->op1; - if (op1 >= T->nk) op1 = snap_pref(J, T, map, nent, seen, op1); - op2 = ir->op2; - if (op2 >= T->nk) op2 = snap_pref(J, T, map, nent, seen, op2); - if (LJ_HASFFI && ir->o == IR_CNEWI) { - if (LJ_32 && refp+1 < T->nins && (ir+1)->o == IR_HIOP) { - lj_needsplit(J); /* Emit joining HIOP. */ - op2 = emitir_raw(IRT(IR_HIOP, IRT_I64), op2, - snap_pref(J, T, map, nent, seen, (ir+1)->op2)); - } - J->slot[snap_slot(sn)] = emitir(ir->ot, op1, op2); - } else { - IRIns *irs; - TRef tr = emitir(ir->ot, op1, op2); - J->slot[snap_slot(sn)] = tr; - for (irs = ir+1; irs < irlast; irs++) - if (irs->r == RID_SINK && snap_sunk_store(J, ir, irs)) { - IRIns *irr = &T->ir[irs->op1]; - TRef val, key = irr->op2, tmp = tr; - if (irr->o != IR_FREF) { - IRIns *irk = &T->ir[key]; - if (irr->o == IR_HREFK) - key = lj_ir_kslot(J, snap_replay_const(J, &T->ir[irk->op1]), - irk->op2); - else - key = snap_replay_const(J, irk); - if (irr->o == IR_HREFK || irr->o == IR_AREF) { - IRIns *irf = &T->ir[irr->op1]; - tmp = emitir(irf->ot, tmp, irf->op2); - } - } - tmp = emitir(irr->ot, tmp, key); - val = snap_pref(J, T, map, nent, seen, irs->op2); - if (val == 0) { - IRIns *irc = &T->ir[irs->op2]; - lua_assert(irc->o == IR_CONV && irc->op2 == IRCONV_NUM_INT); - val = snap_pref(J, T, map, nent, seen, irc->op1); - val = emitir(IRTN(IR_CONV), val, IRCONV_NUM_INT); - } else if ((LJ_SOFTFP || (LJ_32 && LJ_HASFFI)) && - irs+1 < irlast && (irs+1)->o == IR_HIOP) { - IRType t = IRT_I64; - if (LJ_SOFTFP && irt_type((irs+1)->t) == IRT_SOFTFP) - t = IRT_NUM; - lj_needsplit(J); - if (irref_isk(irs->op2) && irref_isk((irs+1)->op2)) { - uint64_t k = (uint32_t)T->ir[irs->op2].i + - ((uint64_t)T->ir[(irs+1)->op2].i << 32); - val = lj_ir_k64(J, t == IRT_I64 ? IR_KINT64 : IR_KNUM, - lj_ir_k64_find(J, k)); - } else { - val = emitir_raw(IRT(IR_HIOP, t), val, - snap_pref(J, T, map, nent, seen, (irs+1)->op2)); - } - tmp = emitir(IRT(irs->o, t), tmp, val); - continue; - } - tmp = emitir(irs->ot, tmp, val); - } else if (LJ_HASFFI && irs->o == IR_XBAR && ir->o == IR_CNEW) { - emitir(IRT(IR_XBAR, IRT_NIL), 0, 0); - } - } - } - } - } - J->base = J->slot + J->baseslot; - J->maxslot = snap->nslots - J->baseslot; - lj_snap_add(J); - if (pass23) /* Need explicit GC step _after_ initial snapshot. */ - emitir_raw(IRTG(IR_GCSTEP, IRT_NIL), 0, 0); -} - -/* -- Snapshot restore ---------------------------------------------------- */ - -static void snap_unsink(jit_State *J, GCtrace *T, ExitState *ex, - SnapNo snapno, BloomFilter rfilt, - IRIns *ir, TValue *o); - -/* Restore a value from the trace exit state. */ -static void snap_restoreval(jit_State *J, GCtrace *T, ExitState *ex, - SnapNo snapno, BloomFilter rfilt, - IRRef ref, TValue *o) -{ - IRIns *ir = &T->ir[ref]; - IRType1 t = ir->t; - RegSP rs = ir->prev; - if (irref_isk(ref)) { /* Restore constant slot. */ - lj_ir_kvalue(J->L, o, ir); - return; - } - if (LJ_UNLIKELY(bloomtest(rfilt, ref))) - rs = snap_renameref(T, snapno, ref, rs); - if (ra_hasspill(regsp_spill(rs))) { /* Restore from spill slot. */ - int32_t *sps = &ex->spill[regsp_spill(rs)]; - if (irt_isinteger(t)) { - setintV(o, *sps); -#if !LJ_SOFTFP - } else if (irt_isnum(t)) { - o->u64 = *(uint64_t *)sps; -#endif - } else if (LJ_64 && irt_islightud(t)) { - /* 64 bit lightuserdata which may escape already has the tag bits. */ - o->u64 = *(uint64_t *)sps; - } else { - lua_assert(!irt_ispri(t)); /* PRI refs never have a spill slot. */ - setgcrefi(o->gcr, *sps); - setitype(o, irt_toitype(t)); - } - } else { /* Restore from register. */ - Reg r = regsp_reg(rs); - if (ra_noreg(r)) { - lua_assert(ir->o == IR_CONV && ir->op2 == IRCONV_NUM_INT); - snap_restoreval(J, T, ex, snapno, rfilt, ir->op1, o); - if (LJ_DUALNUM) setnumV(o, (lua_Number)intV(o)); - return; - } else if (irt_isinteger(t)) { - setintV(o, (int32_t)ex->gpr[r-RID_MIN_GPR]); -#if !LJ_SOFTFP - } else if (irt_isnum(t)) { - setnumV(o, ex->fpr[r-RID_MIN_FPR]); -#endif - } else if (LJ_64 && irt_islightud(t)) { - /* 64 bit lightuserdata which may escape already has the tag bits. */ - o->u64 = ex->gpr[r-RID_MIN_GPR]; - } else { - if (!irt_ispri(t)) - setgcrefi(o->gcr, ex->gpr[r-RID_MIN_GPR]); - setitype(o, irt_toitype(t)); - } - } -} - -#if LJ_HASFFI -/* Restore raw data from the trace exit state. */ -static void snap_restoredata(GCtrace *T, ExitState *ex, - SnapNo snapno, BloomFilter rfilt, - IRRef ref, void *dst, CTSize sz) -{ - IRIns *ir = &T->ir[ref]; - RegSP rs = ir->prev; - int32_t *src; - uint64_t tmp; - if (irref_isk(ref)) { - if (ir->o == IR_KNUM || ir->o == IR_KINT64) { - src = mref(ir->ptr, int32_t); - } else if (sz == 8) { - tmp = (uint64_t)(uint32_t)ir->i; - src = (int32_t *)&tmp; - } else { - src = &ir->i; - } - } else { - if (LJ_UNLIKELY(bloomtest(rfilt, ref))) - rs = snap_renameref(T, snapno, ref, rs); - if (ra_hasspill(regsp_spill(rs))) { - src = &ex->spill[regsp_spill(rs)]; - if (sz == 8 && !irt_is64(ir->t)) { - tmp = (uint64_t)(uint32_t)*src; - src = (int32_t *)&tmp; - } - } else { - Reg r = regsp_reg(rs); - if (ra_noreg(r)) { - /* Note: this assumes CNEWI is never used for SOFTFP split numbers. */ - lua_assert(sz == 8 && ir->o == IR_CONV && ir->op2 == IRCONV_NUM_INT); - snap_restoredata(T, ex, snapno, rfilt, ir->op1, dst, 4); - *(lua_Number *)dst = (lua_Number)*(int32_t *)dst; - return; - } - src = (int32_t *)&ex->gpr[r-RID_MIN_GPR]; -#if !LJ_SOFTFP - if (r >= RID_MAX_GPR) { - src = (int32_t *)&ex->fpr[r-RID_MIN_FPR]; -#if LJ_TARGET_PPC - if (sz == 4) { /* PPC FPRs are always doubles. */ - *(float *)dst = (float)*(double *)src; - return; - } -#else - if (LJ_BE && sz == 4) src++; -#endif - } -#endif - } - } - lua_assert(sz == 1 || sz == 2 || sz == 4 || sz == 8); - if (sz == 4) *(int32_t *)dst = *src; - else if (sz == 8) *(int64_t *)dst = *(int64_t *)src; - else if (sz == 1) *(int8_t *)dst = (int8_t)*src; - else *(int16_t *)dst = (int16_t)*src; -} -#endif - -/* Unsink allocation from the trace exit state. Unsink sunk stores. */ -static void snap_unsink(jit_State *J, GCtrace *T, ExitState *ex, - SnapNo snapno, BloomFilter rfilt, - IRIns *ir, TValue *o) -{ - lua_assert(ir->o == IR_TNEW || ir->o == IR_TDUP || - ir->o == IR_CNEW || ir->o == IR_CNEWI); -#if LJ_HASFFI - if (ir->o == IR_CNEW || ir->o == IR_CNEWI) { - CTState *cts = ctype_cts(J->L); - CTypeID id = (CTypeID)T->ir[ir->op1].i; - CTSize sz = lj_ctype_size(cts, id); - GCcdata *cd = lj_cdata_new(cts, id, sz); - setcdataV(J->L, o, cd); - if (ir->o == IR_CNEWI) { - uint8_t *p = (uint8_t *)cdataptr(cd); - lua_assert(sz == 4 || sz == 8); - if (LJ_32 && sz == 8 && ir+1 < T->ir + T->nins && (ir+1)->o == IR_HIOP) { - snap_restoredata(T, ex, snapno, rfilt, (ir+1)->op2, LJ_LE?p+4:p, 4); - if (LJ_BE) p += 4; - sz = 4; - } - snap_restoredata(T, ex, snapno, rfilt, ir->op2, p, sz); - } else { - IRIns *irs, *irlast = &T->ir[T->snap[snapno].ref]; - for (irs = ir+1; irs < irlast; irs++) - if (irs->r == RID_SINK && snap_sunk_store(J, ir, irs)) { - IRIns *iro = &T->ir[T->ir[irs->op1].op2]; - uint8_t *p = (uint8_t *)cd; - CTSize szs; - lua_assert(irs->o == IR_XSTORE && T->ir[irs->op1].o == IR_ADD); - lua_assert(iro->o == IR_KINT || iro->o == IR_KINT64); - if (irt_is64(irs->t)) szs = 8; - else if (irt_isi8(irs->t) || irt_isu8(irs->t)) szs = 1; - else if (irt_isi16(irs->t) || irt_isu16(irs->t)) szs = 2; - else szs = 4; - if (LJ_64 && iro->o == IR_KINT64) - p += (int64_t)ir_k64(iro)->u64; - else - p += iro->i; - lua_assert(p >= (uint8_t *)cdataptr(cd) && - p + szs <= (uint8_t *)cdataptr(cd) + sz); - if (LJ_32 && irs+1 < T->ir + T->nins && (irs+1)->o == IR_HIOP) { - lua_assert(szs == 4); - snap_restoredata(T, ex, snapno, rfilt, (irs+1)->op2, LJ_LE?p+4:p,4); - if (LJ_BE) p += 4; - } - snap_restoredata(T, ex, snapno, rfilt, irs->op2, p, szs); - } - } - } else -#endif - { - IRIns *irs, *irlast; - GCtab *t = ir->o == IR_TNEW ? lj_tab_new(J->L, ir->op1, ir->op2) : - lj_tab_dup(J->L, ir_ktab(&T->ir[ir->op1])); - settabV(J->L, o, t); - irlast = &T->ir[T->snap[snapno].ref]; - for (irs = ir+1; irs < irlast; irs++) - if (irs->r == RID_SINK && snap_sunk_store(J, ir, irs)) { - IRIns *irk = &T->ir[irs->op1]; - TValue tmp, *val; - lua_assert(irs->o == IR_ASTORE || irs->o == IR_HSTORE || - irs->o == IR_FSTORE); - if (irk->o == IR_FREF) { - lua_assert(irk->op2 == IRFL_TAB_META); - snap_restoreval(J, T, ex, snapno, rfilt, irs->op2, &tmp); - /* NOBARRIER: The table is new (marked white). */ - setgcref(t->metatable, obj2gco(tabV(&tmp))); - } else { - irk = &T->ir[irk->op2]; - if (irk->o == IR_KSLOT) irk = &T->ir[irk->op1]; - lj_ir_kvalue(J->L, &tmp, irk); - val = lj_tab_set(J->L, t, &tmp); - /* NOBARRIER: The table is new (marked white). */ - snap_restoreval(J, T, ex, snapno, rfilt, irs->op2, val); - if (LJ_SOFTFP && irs+1 < T->ir + T->nins && (irs+1)->o == IR_HIOP) { - snap_restoreval(J, T, ex, snapno, rfilt, (irs+1)->op2, &tmp); - val->u32.hi = tmp.u32.lo; - } - } - } - } -} - -/* Restore interpreter state from exit state with the help of a snapshot. */ -const BCIns *lj_snap_restore(jit_State *J, void *exptr) -{ - ExitState *ex = (ExitState *)exptr; - SnapNo snapno = J->exitno; /* For now, snapno == exitno. */ - GCtrace *T = traceref(J, J->parent); - SnapShot *snap = &T->snap[snapno]; - MSize n, nent = snap->nent; - SnapEntry *map = &T->snapmap[snap->mapofs]; - SnapEntry *flinks = &T->snapmap[snap_nextofs(T, snap)-1]; - int32_t ftsz0; - TValue *frame; - BloomFilter rfilt = snap_renamefilter(T, snapno); - const BCIns *pc = snap_pc(map[nent]); - lua_State *L = J->L; - - /* Set interpreter PC to the next PC to get correct error messages. */ - setcframe_pc(cframe_raw(L->cframe), pc+1); - - /* Make sure the stack is big enough for the slots from the snapshot. */ - if (LJ_UNLIKELY(L->base + snap->topslot >= tvref(L->maxstack))) { - L->top = curr_topL(L); - lj_state_growstack(L, snap->topslot - curr_proto(L)->framesize); - } - - /* Fill stack slots with data from the registers and spill slots. */ - frame = L->base-1; - ftsz0 = frame_ftsz(frame); /* Preserve link to previous frame in slot #0. */ - for (n = 0; n < nent; n++) { - SnapEntry sn = map[n]; - if (!(sn & SNAP_NORESTORE)) { - TValue *o = &frame[snap_slot(sn)]; - IRRef ref = snap_ref(sn); - IRIns *ir = &T->ir[ref]; - if (ir->r == RID_SUNK) { - MSize j; - for (j = 0; j < n; j++) - if (snap_ref(map[j]) == ref) { /* De-duplicate sunk allocations. */ - copyTV(L, o, &frame[snap_slot(map[j])]); - goto dupslot; - } - snap_unsink(J, T, ex, snapno, rfilt, ir, o); - dupslot: - continue; - } - snap_restoreval(J, T, ex, snapno, rfilt, ref, o); - if (LJ_SOFTFP && (sn & SNAP_SOFTFPNUM) && tvisint(o)) { - TValue tmp; - snap_restoreval(J, T, ex, snapno, rfilt, ref+1, &tmp); - o->u32.hi = tmp.u32.lo; - } else if ((sn & (SNAP_CONT|SNAP_FRAME))) { - /* Overwrite tag with frame link. */ - o->fr.tp.ftsz = snap_slot(sn) != 0 ? (int32_t)*flinks-- : ftsz0; - L->base = o+1; - } - } - } - lua_assert(map + nent == flinks); - - /* Compute current stack top. */ - switch (bc_op(*pc)) { - default: - if (bc_op(*pc) < BC_FUNCF) { - L->top = curr_topL(L); - break; - } - /* fallthrough */ - case BC_CALLM: case BC_CALLMT: case BC_RETM: case BC_TSETM: - L->top = frame + snap->nslots; - break; - } - return pc; -} - -#undef IR -#undef emitir_raw -#undef emitir - -#endif diff --git a/deps/luajit/src/lj_snap.h b/deps/luajit/src/lj_snap.h deleted file mode 100644 index 9a125be7..00000000 --- a/deps/luajit/src/lj_snap.h +++ /dev/null @@ -1,34 +0,0 @@ -/* -** Snapshot handling. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#ifndef _LJ_SNAP_H -#define _LJ_SNAP_H - -#include "lj_obj.h" -#include "lj_jit.h" - -#if LJ_HASJIT -LJ_FUNC void lj_snap_add(jit_State *J); -LJ_FUNC void lj_snap_purge(jit_State *J); -LJ_FUNC void lj_snap_shrink(jit_State *J); -LJ_FUNC IRIns *lj_snap_regspmap(GCtrace *T, SnapNo snapno, IRIns *ir); -LJ_FUNC void lj_snap_replay(jit_State *J, GCtrace *T); -LJ_FUNC const BCIns *lj_snap_restore(jit_State *J, void *exptr); -LJ_FUNC void lj_snap_grow_buf_(jit_State *J, MSize need); -LJ_FUNC void lj_snap_grow_map_(jit_State *J, MSize need); - -static LJ_AINLINE void lj_snap_grow_buf(jit_State *J, MSize need) -{ - if (LJ_UNLIKELY(need > J->sizesnap)) lj_snap_grow_buf_(J, need); -} - -static LJ_AINLINE void lj_snap_grow_map(jit_State *J, MSize need) -{ - if (LJ_UNLIKELY(need > J->sizesnapmap)) lj_snap_grow_map_(J, need); -} - -#endif - -#endif diff --git a/deps/luajit/src/lj_state.c b/deps/luajit/src/lj_state.c deleted file mode 100644 index e654afae..00000000 --- a/deps/luajit/src/lj_state.c +++ /dev/null @@ -1,287 +0,0 @@ -/* -** State and stack handling. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -** -** Portions taken verbatim or adapted from the Lua interpreter. -** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h -*/ - -#define lj_state_c -#define LUA_CORE - -#include "lj_obj.h" -#include "lj_gc.h" -#include "lj_err.h" -#include "lj_str.h" -#include "lj_tab.h" -#include "lj_func.h" -#include "lj_meta.h" -#include "lj_state.h" -#include "lj_frame.h" -#if LJ_HASFFI -#include "lj_ctype.h" -#endif -#include "lj_trace.h" -#include "lj_dispatch.h" -#include "lj_vm.h" -#include "lj_lex.h" -#include "lj_alloc.h" - -/* -- Stack handling ------------------------------------------------------ */ - -/* Stack sizes. */ -#define LJ_STACK_MIN LUA_MINSTACK /* Min. stack size. */ -#define LJ_STACK_MAX LUAI_MAXSTACK /* Max. stack size. */ -#define LJ_STACK_START (2*LJ_STACK_MIN) /* Starting stack size. */ -#define LJ_STACK_MAXEX (LJ_STACK_MAX + 1 + LJ_STACK_EXTRA) - -/* Explanation of LJ_STACK_EXTRA: -** -** Calls to metamethods store their arguments beyond the current top -** without checking for the stack limit. This avoids stack resizes which -** would invalidate passed TValue pointers. The stack check is performed -** later by the function header. This can safely resize the stack or raise -** an error. Thus we need some extra slots beyond the current stack limit. -** -** Most metamethods need 4 slots above top (cont, mobj, arg1, arg2) plus -** one extra slot if mobj is not a function. Only lj_meta_tset needs 5 -** slots above top, but then mobj is always a function. So we can get by -** with 5 extra slots. -*/ - -/* Resize stack slots and adjust pointers in state. */ -static void resizestack(lua_State *L, MSize n) -{ - TValue *st, *oldst = tvref(L->stack); - ptrdiff_t delta; - MSize oldsize = L->stacksize; - MSize realsize = n + 1 + LJ_STACK_EXTRA; - GCobj *up; - lua_assert((MSize)(tvref(L->maxstack)-oldst)==L->stacksize-LJ_STACK_EXTRA-1); - st = (TValue *)lj_mem_realloc(L, tvref(L->stack), - (MSize)(L->stacksize*sizeof(TValue)), - (MSize)(realsize*sizeof(TValue))); - setmref(L->stack, st); - delta = (char *)st - (char *)oldst; - setmref(L->maxstack, st + n); - while (oldsize < realsize) /* Clear new slots. */ - setnilV(st + oldsize++); - L->stacksize = realsize; - L->base = (TValue *)((char *)L->base + delta); - L->top = (TValue *)((char *)L->top + delta); - for (up = gcref(L->openupval); up != NULL; up = gcnext(up)) - setmref(gco2uv(up)->v, (TValue *)((char *)uvval(gco2uv(up)) + delta)); - if (obj2gco(L) == gcref(G(L)->jit_L)) - setmref(G(L)->jit_base, mref(G(L)->jit_base, char) + delta); -} - -/* Relimit stack after error, in case the limit was overdrawn. */ -void lj_state_relimitstack(lua_State *L) -{ - if (L->stacksize > LJ_STACK_MAXEX && L->top-tvref(L->stack) < LJ_STACK_MAX-1) - resizestack(L, LJ_STACK_MAX); -} - -/* Try to shrink the stack (called from GC). */ -void lj_state_shrinkstack(lua_State *L, MSize used) -{ - if (L->stacksize > LJ_STACK_MAXEX) - return; /* Avoid stack shrinking while handling stack overflow. */ - if (4*used < L->stacksize && - 2*(LJ_STACK_START+LJ_STACK_EXTRA) < L->stacksize && - obj2gco(L) != gcref(G(L)->jit_L)) /* Don't shrink stack of live trace. */ - resizestack(L, L->stacksize >> 1); -} - -/* Try to grow stack. */ -void LJ_FASTCALL lj_state_growstack(lua_State *L, MSize need) -{ - MSize n; - if (L->stacksize > LJ_STACK_MAXEX) /* Overflow while handling overflow? */ - lj_err_throw(L, LUA_ERRERR); - n = L->stacksize + need; - if (n > LJ_STACK_MAX) { - n += 2*LUA_MINSTACK; - } else if (n < 2*L->stacksize) { - n = 2*L->stacksize; - if (n >= LJ_STACK_MAX) - n = LJ_STACK_MAX; - } - resizestack(L, n); - if (L->stacksize > LJ_STACK_MAXEX) - lj_err_msg(L, LJ_ERR_STKOV); -} - -void LJ_FASTCALL lj_state_growstack1(lua_State *L) -{ - lj_state_growstack(L, 1); -} - -/* Allocate basic stack for new state. */ -static void stack_init(lua_State *L1, lua_State *L) -{ - TValue *stend, *st = lj_mem_newvec(L, LJ_STACK_START+LJ_STACK_EXTRA, TValue); - setmref(L1->stack, st); - L1->stacksize = LJ_STACK_START + LJ_STACK_EXTRA; - stend = st + L1->stacksize; - setmref(L1->maxstack, stend - LJ_STACK_EXTRA - 1); - L1->base = L1->top = st+1; - setthreadV(L1, st, L1); /* Needed for curr_funcisL() on empty stack. */ - while (st < stend) /* Clear new slots. */ - setnilV(st++); -} - -/* -- State handling ------------------------------------------------------ */ - -/* Open parts that may cause memory-allocation errors. */ -static TValue *cpluaopen(lua_State *L, lua_CFunction dummy, void *ud) -{ - global_State *g = G(L); - UNUSED(dummy); - UNUSED(ud); - stack_init(L, L); - /* NOBARRIER: State initialization, all objects are white. */ - setgcref(L->env, obj2gco(lj_tab_new(L, 0, LJ_MIN_GLOBAL))); - settabV(L, registry(L), lj_tab_new(L, 0, LJ_MIN_REGISTRY)); - lj_str_resize(L, LJ_MIN_STRTAB-1); - lj_meta_init(L); - lj_lex_init(L); - fixstring(lj_err_str(L, LJ_ERR_ERRMEM)); /* Preallocate memory error msg. */ - g->gc.threshold = 4*g->gc.total; - lj_trace_initstate(g); - return NULL; -} - -static void close_state(lua_State *L) -{ - global_State *g = G(L); - lj_func_closeuv(L, tvref(L->stack)); - lj_gc_freeall(g); - lua_assert(gcref(g->gc.root) == obj2gco(L)); - lua_assert(g->strnum == 0); - lj_trace_freestate(g); -#if LJ_HASFFI - lj_ctype_freestate(g); -#endif - lj_mem_freevec(g, g->strhash, g->strmask+1, GCRef); - lj_str_freebuf(g, &g->tmpbuf); - lj_mem_freevec(g, tvref(L->stack), L->stacksize, TValue); - lua_assert(g->gc.total == sizeof(GG_State)); -#ifndef LUAJIT_USE_SYSMALLOC - if (g->allocf == lj_alloc_f) - lj_alloc_destroy(g->allocd); - else -#endif - g->allocf(g->allocd, G2GG(g), sizeof(GG_State), 0); -} - -#if LJ_64 && !(defined(LUAJIT_USE_VALGRIND) && defined(LUAJIT_USE_SYSMALLOC)) -lua_State *lj_state_newstate(lua_Alloc f, void *ud) -#else -LUA_API lua_State *lua_newstate(lua_Alloc f, void *ud) -#endif -{ - GG_State *GG = (GG_State *)f(ud, NULL, 0, sizeof(GG_State)); - lua_State *L = &GG->L; - global_State *g = &GG->g; - if (GG == NULL || !checkptr32(GG)) return NULL; - memset(GG, 0, sizeof(GG_State)); - L->gct = ~LJ_TTHREAD; - L->marked = LJ_GC_WHITE0 | LJ_GC_FIXED | LJ_GC_SFIXED; /* Prevent free. */ - L->dummy_ffid = FF_C; - setmref(L->glref, g); - g->gc.currentwhite = LJ_GC_WHITE0 | LJ_GC_FIXED; - g->strempty.marked = LJ_GC_WHITE0; - g->strempty.gct = ~LJ_TSTR; - g->allocf = f; - g->allocd = ud; - setgcref(g->mainthref, obj2gco(L)); - setgcref(g->uvhead.prev, obj2gco(&g->uvhead)); - setgcref(g->uvhead.next, obj2gco(&g->uvhead)); - g->strmask = ~(MSize)0; - setnilV(registry(L)); - setnilV(&g->nilnode.val); - setnilV(&g->nilnode.key); - setmref(g->nilnode.freetop, &g->nilnode); - lj_str_initbuf(&g->tmpbuf); - g->gc.state = GCSpause; - setgcref(g->gc.root, obj2gco(L)); - setmref(g->gc.sweep, &g->gc.root); - g->gc.total = sizeof(GG_State); - g->gc.pause = LUAI_GCPAUSE; - g->gc.stepmul = LUAI_GCMUL; - lj_dispatch_init((GG_State *)L); - L->status = LUA_ERRERR+1; /* Avoid touching the stack upon memory error. */ - if (lj_vm_cpcall(L, NULL, NULL, cpluaopen) != 0) { - /* Memory allocation error: free partial state. */ - close_state(L); - return NULL; - } - L->status = 0; - return L; -} - -static TValue *cpfinalize(lua_State *L, lua_CFunction dummy, void *ud) -{ - UNUSED(dummy); - UNUSED(ud); - lj_gc_finalize_cdata(L); - lj_gc_finalize_udata(L); - /* Frame pop omitted. */ - return NULL; -} - -LUA_API void lua_close(lua_State *L) -{ - global_State *g = G(L); - int i; - L = mainthread(g); /* Only the main thread can be closed. */ - lj_func_closeuv(L, tvref(L->stack)); - lj_gc_separateudata(g, 1); /* Separate udata which have GC metamethods. */ -#if LJ_HASJIT - G2J(g)->flags &= ~JIT_F_ON; - G2J(g)->state = LJ_TRACE_IDLE; - lj_dispatch_update(g); -#endif - for (i = 0;;) { - hook_enter(g); - L->status = 0; - L->cframe = NULL; - L->base = L->top = tvref(L->stack) + 1; - if (lj_vm_cpcall(L, NULL, NULL, cpfinalize) == 0) { - if (++i >= 10) break; - lj_gc_separateudata(g, 1); /* Separate udata again. */ - if (gcref(g->gc.mmudata) == NULL) /* Until nothing is left to do. */ - break; - } - } - close_state(L); -} - -lua_State *lj_state_new(lua_State *L) -{ - lua_State *L1 = lj_mem_newobj(L, lua_State); - L1->gct = ~LJ_TTHREAD; - L1->dummy_ffid = FF_C; - L1->status = 0; - L1->stacksize = 0; - setmref(L1->stack, NULL); - L1->cframe = NULL; - /* NOBARRIER: The lua_State is new (marked white). */ - setgcrefnull(L1->openupval); - setmrefr(L1->glref, L->glref); - setgcrefr(L1->env, L->env); - stack_init(L1, L); /* init stack */ - lua_assert(iswhite(obj2gco(L1))); - return L1; -} - -void LJ_FASTCALL lj_state_free(global_State *g, lua_State *L) -{ - lua_assert(L != mainthread(g)); - lj_func_closeuv(L, tvref(L->stack)); - lua_assert(gcref(L->openupval) == NULL); - lj_mem_freevec(g, tvref(L->stack), L->stacksize, TValue); - lj_mem_freet(g, L); -} - diff --git a/deps/luajit/src/lj_state.h b/deps/luajit/src/lj_state.h deleted file mode 100644 index 687889a2..00000000 --- a/deps/luajit/src/lj_state.h +++ /dev/null @@ -1,35 +0,0 @@ -/* -** State and stack handling. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#ifndef _LJ_STATE_H -#define _LJ_STATE_H - -#include "lj_obj.h" - -#define incr_top(L) \ - (++L->top >= tvref(L->maxstack) && (lj_state_growstack1(L), 0)) - -#define savestack(L, p) ((char *)(p) - mref(L->stack, char)) -#define restorestack(L, n) ((TValue *)(mref(L->stack, char) + (n))) - -LJ_FUNC void lj_state_relimitstack(lua_State *L); -LJ_FUNC void lj_state_shrinkstack(lua_State *L, MSize used); -LJ_FUNCA void LJ_FASTCALL lj_state_growstack(lua_State *L, MSize need); -LJ_FUNC void LJ_FASTCALL lj_state_growstack1(lua_State *L); - -static LJ_AINLINE void lj_state_checkstack(lua_State *L, MSize need) -{ - if ((mref(L->maxstack, char) - (char *)L->top) <= - (ptrdiff_t)need*(ptrdiff_t)sizeof(TValue)) - lj_state_growstack(L, need); -} - -LJ_FUNC lua_State *lj_state_new(lua_State *L); -LJ_FUNC void LJ_FASTCALL lj_state_free(global_State *g, lua_State *L); -#if LJ_64 -LJ_FUNC lua_State *lj_state_newstate(lua_Alloc f, void *ud); -#endif - -#endif diff --git a/deps/luajit/src/lj_str.c b/deps/luajit/src/lj_str.c deleted file mode 100644 index ca60bccb..00000000 --- a/deps/luajit/src/lj_str.c +++ /dev/null @@ -1,339 +0,0 @@ -/* -** String handling. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -** -** Portions taken verbatim or adapted from the Lua interpreter. -** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h -*/ - -#include - -#define lj_str_c -#define LUA_CORE - -#include "lj_obj.h" -#include "lj_gc.h" -#include "lj_err.h" -#include "lj_str.h" -#include "lj_state.h" -#include "lj_char.h" - -/* -- String interning ---------------------------------------------------- */ - -/* Ordered compare of strings. Assumes string data is 4-byte aligned. */ -int32_t LJ_FASTCALL lj_str_cmp(GCstr *a, GCstr *b) -{ - MSize i, n = a->len > b->len ? b->len : a->len; - for (i = 0; i < n; i += 4) { - /* Note: innocuous access up to end of string + 3. */ - uint32_t va = *(const uint32_t *)(strdata(a)+i); - uint32_t vb = *(const uint32_t *)(strdata(b)+i); - if (va != vb) { -#if LJ_LE - va = lj_bswap(va); vb = lj_bswap(vb); -#endif - i -= n; - if ((int32_t)i >= -3) { - va >>= 32+(i<<3); vb >>= 32+(i<<3); - if (va == vb) break; - } - return va < vb ? -1 : 1; - } - } - return (int32_t)(a->len - b->len); -} - -/* Fast string data comparison. Caveat: unaligned access to 1st string! */ -static LJ_AINLINE int str_fastcmp(const char *a, const char *b, MSize len) -{ - MSize i = 0; - lua_assert(len > 0); - lua_assert((((uintptr_t)a+len-1) & (LJ_PAGESIZE-1)) <= LJ_PAGESIZE-4); - do { /* Note: innocuous access up to end of string + 3. */ - uint32_t v = lj_getu32(a+i) ^ *(const uint32_t *)(b+i); - if (v) { - i -= len; -#if LJ_LE - return (int32_t)i >= -3 ? (v << (32+(i<<3))) : 1; -#else - return (int32_t)i >= -3 ? (v >> (32+(i<<3))) : 1; -#endif - } - i += 4; - } while (i < len); - return 0; -} - -/* Resize the string hash table (grow and shrink). */ -void lj_str_resize(lua_State *L, MSize newmask) -{ - global_State *g = G(L); - GCRef *newhash; - MSize i; - if (g->gc.state == GCSsweepstring || newmask >= LJ_MAX_STRTAB-1) - return; /* No resizing during GC traversal or if already too big. */ - newhash = lj_mem_newvec(L, newmask+1, GCRef); - memset(newhash, 0, (newmask+1)*sizeof(GCRef)); - for (i = g->strmask; i != ~(MSize)0; i--) { /* Rehash old table. */ - GCobj *p = gcref(g->strhash[i]); - while (p) { /* Follow each hash chain and reinsert all strings. */ - MSize h = gco2str(p)->hash & newmask; - GCobj *next = gcnext(p); - /* NOBARRIER: The string table is a GC root. */ - setgcrefr(p->gch.nextgc, newhash[h]); - setgcref(newhash[h], p); - p = next; - } - } - lj_mem_freevec(g, g->strhash, g->strmask+1, GCRef); - g->strmask = newmask; - g->strhash = newhash; -} - -/* Intern a string and return string object. */ -GCstr *lj_str_new(lua_State *L, const char *str, size_t lenx) -{ - global_State *g; - GCstr *s; - GCobj *o; - MSize len = (MSize)lenx; - MSize a, b, h = len; - if (lenx >= LJ_MAX_STR) - lj_err_msg(L, LJ_ERR_STROV); - g = G(L); - /* Compute string hash. Constants taken from lookup3 hash by Bob Jenkins. */ - if (len >= 4) { /* Caveat: unaligned access! */ - a = lj_getu32(str); - h ^= lj_getu32(str+len-4); - b = lj_getu32(str+(len>>1)-2); - h ^= b; h -= lj_rol(b, 14); - b += lj_getu32(str+(len>>2)-1); - } else if (len > 0) { - a = *(const uint8_t *)str; - h ^= *(const uint8_t *)(str+len-1); - b = *(const uint8_t *)(str+(len>>1)); - h ^= b; h -= lj_rol(b, 14); - } else { - return &g->strempty; - } - a ^= h; a -= lj_rol(h, 11); - b ^= a; b -= lj_rol(a, 25); - h ^= b; h -= lj_rol(b, 16); - /* Check if the string has already been interned. */ - o = gcref(g->strhash[h & g->strmask]); - if (LJ_LIKELY((((uintptr_t)str+len-1) & (LJ_PAGESIZE-1)) <= LJ_PAGESIZE-4)) { - while (o != NULL) { - GCstr *sx = gco2str(o); - if (sx->len == len && str_fastcmp(str, strdata(sx), len) == 0) { - /* Resurrect if dead. Can only happen with fixstring() (keywords). */ - if (isdead(g, o)) flipwhite(o); - return sx; /* Return existing string. */ - } - o = gcnext(o); - } - } else { /* Slow path: end of string is too close to a page boundary. */ - while (o != NULL) { - GCstr *sx = gco2str(o); - if (sx->len == len && memcmp(str, strdata(sx), len) == 0) { - /* Resurrect if dead. Can only happen with fixstring() (keywords). */ - if (isdead(g, o)) flipwhite(o); - return sx; /* Return existing string. */ - } - o = gcnext(o); - } - } - /* Nope, create a new string. */ - s = lj_mem_newt(L, sizeof(GCstr)+len+1, GCstr); - newwhite(g, s); - s->gct = ~LJ_TSTR; - s->len = len; - s->hash = h; - s->reserved = 0; - memcpy(strdatawr(s), str, len); - strdatawr(s)[len] = '\0'; /* Zero-terminate string. */ - /* Add it to string hash table. */ - h &= g->strmask; - s->nextgc = g->strhash[h]; - /* NOBARRIER: The string table is a GC root. */ - setgcref(g->strhash[h], obj2gco(s)); - if (g->strnum++ > g->strmask) /* Allow a 100% load factor. */ - lj_str_resize(L, (g->strmask<<1)+1); /* Grow string table. */ - return s; /* Return newly interned string. */ -} - -void LJ_FASTCALL lj_str_free(global_State *g, GCstr *s) -{ - g->strnum--; - lj_mem_free(g, s, sizestring(s)); -} - -/* -- Type conversions ---------------------------------------------------- */ - -/* Print number to buffer. Canonicalizes non-finite values. */ -size_t LJ_FASTCALL lj_str_bufnum(char *s, cTValue *o) -{ - if (LJ_LIKELY((o->u32.hi << 1) < 0xffe00000)) { /* Finite? */ - lua_Number n = o->n; -#if __BIONIC__ - if (tvismzero(o)) { s[0] = '-'; s[1] = '0'; return 2; } -#endif - return (size_t)lua_number2str(s, n); - } else if (((o->u32.hi & 0x000fffff) | o->u32.lo) != 0) { - s[0] = 'n'; s[1] = 'a'; s[2] = 'n'; return 3; - } else if ((o->u32.hi & 0x80000000) == 0) { - s[0] = 'i'; s[1] = 'n'; s[2] = 'f'; return 3; - } else { - s[0] = '-'; s[1] = 'i'; s[2] = 'n'; s[3] = 'f'; return 4; - } -} - -/* Print integer to buffer. Returns pointer to start. */ -char * LJ_FASTCALL lj_str_bufint(char *p, int32_t k) -{ - uint32_t u = (uint32_t)(k < 0 ? -k : k); - p += 1+10; - do { *--p = (char)('0' + u % 10); } while (u /= 10); - if (k < 0) *--p = '-'; - return p; -} - -/* Convert number to string. */ -GCstr * LJ_FASTCALL lj_str_fromnum(lua_State *L, const lua_Number *np) -{ - char buf[LJ_STR_NUMBUF]; - size_t len = lj_str_bufnum(buf, (TValue *)np); - return lj_str_new(L, buf, len); -} - -/* Convert integer to string. */ -GCstr * LJ_FASTCALL lj_str_fromint(lua_State *L, int32_t k) -{ - char s[1+10]; - char *p = lj_str_bufint(s, k); - return lj_str_new(L, p, (size_t)(s+sizeof(s)-p)); -} - -GCstr * LJ_FASTCALL lj_str_fromnumber(lua_State *L, cTValue *o) -{ - return tvisint(o) ? lj_str_fromint(L, intV(o)) : lj_str_fromnum(L, &o->n); -} - -/* -- String formatting --------------------------------------------------- */ - -static void addstr(lua_State *L, SBuf *sb, const char *str, MSize len) -{ - char *p; - MSize i; - if (sb->n + len > sb->sz) { - MSize sz = sb->sz * 2; - while (sb->n + len > sz) sz = sz * 2; - lj_str_resizebuf(L, sb, sz); - } - p = sb->buf + sb->n; - sb->n += len; - for (i = 0; i < len; i++) p[i] = str[i]; -} - -static void addchar(lua_State *L, SBuf *sb, int c) -{ - if (sb->n + 1 > sb->sz) { - MSize sz = sb->sz * 2; - lj_str_resizebuf(L, sb, sz); - } - sb->buf[sb->n++] = (char)c; -} - -/* Push formatted message as a string object to Lua stack. va_list variant. */ -const char *lj_str_pushvf(lua_State *L, const char *fmt, va_list argp) -{ - SBuf *sb = &G(L)->tmpbuf; - lj_str_needbuf(L, sb, (MSize)strlen(fmt)); - lj_str_resetbuf(sb); - for (;;) { - const char *e = strchr(fmt, '%'); - if (e == NULL) break; - addstr(L, sb, fmt, (MSize)(e-fmt)); - /* This function only handles %s, %c, %d, %f and %p formats. */ - switch (e[1]) { - case 's': { - const char *s = va_arg(argp, char *); - if (s == NULL) s = "(null)"; - addstr(L, sb, s, (MSize)strlen(s)); - break; - } - case 'c': - addchar(L, sb, va_arg(argp, int)); - break; - case 'd': { - char buf[LJ_STR_INTBUF]; - char *p = lj_str_bufint(buf, va_arg(argp, int32_t)); - addstr(L, sb, p, (MSize)(buf+LJ_STR_INTBUF-p)); - break; - } - case 'f': { - char buf[LJ_STR_NUMBUF]; - TValue tv; - MSize len; - tv.n = (lua_Number)(va_arg(argp, LUAI_UACNUMBER)); - len = (MSize)lj_str_bufnum(buf, &tv); - addstr(L, sb, buf, len); - break; - } - case 'p': { -#define FMTP_CHARS (2*sizeof(ptrdiff_t)) - char buf[2+FMTP_CHARS]; - ptrdiff_t p = (ptrdiff_t)(va_arg(argp, void *)); - ptrdiff_t i, lasti = 2+FMTP_CHARS; - if (p == 0) { - addstr(L, sb, "NULL", 4); - break; - } -#if LJ_64 - /* Shorten output for 64 bit pointers. */ - lasti = 2+2*4+((p >> 32) ? 2+2*(lj_fls((uint32_t)(p >> 32))>>3) : 0); -#endif - buf[0] = '0'; - buf[1] = 'x'; - for (i = lasti-1; i >= 2; i--, p >>= 4) - buf[i] = "0123456789abcdef"[(p & 15)]; - addstr(L, sb, buf, (MSize)lasti); - break; - } - case '%': - addchar(L, sb, '%'); - break; - default: - addchar(L, sb, '%'); - addchar(L, sb, e[1]); - break; - } - fmt = e+2; - } - addstr(L, sb, fmt, (MSize)strlen(fmt)); - setstrV(L, L->top, lj_str_new(L, sb->buf, sb->n)); - incr_top(L); - return strVdata(L->top - 1); -} - -/* Push formatted message as a string object to Lua stack. Vararg variant. */ -const char *lj_str_pushf(lua_State *L, const char *fmt, ...) -{ - const char *msg; - va_list argp; - va_start(argp, fmt); - msg = lj_str_pushvf(L, fmt, argp); - va_end(argp); - return msg; -} - -/* -- Buffer handling ----------------------------------------------------- */ - -char *lj_str_needbuf(lua_State *L, SBuf *sb, MSize sz) -{ - if (sz > sb->sz) { - if (sz < LJ_MIN_SBUF) sz = LJ_MIN_SBUF; - lj_str_resizebuf(L, sb, sz); - } - return sb->buf; -} - diff --git a/deps/luajit/src/lj_str.h b/deps/luajit/src/lj_str.h deleted file mode 100644 index 99697051..00000000 --- a/deps/luajit/src/lj_str.h +++ /dev/null @@ -1,50 +0,0 @@ -/* -** String handling. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#ifndef _LJ_STR_H -#define _LJ_STR_H - -#include - -#include "lj_obj.h" - -/* String interning. */ -LJ_FUNC int32_t LJ_FASTCALL lj_str_cmp(GCstr *a, GCstr *b); -LJ_FUNC void lj_str_resize(lua_State *L, MSize newmask); -LJ_FUNCA GCstr *lj_str_new(lua_State *L, const char *str, size_t len); -LJ_FUNC void LJ_FASTCALL lj_str_free(global_State *g, GCstr *s); - -#define lj_str_newz(L, s) (lj_str_new(L, s, strlen(s))) -#define lj_str_newlit(L, s) (lj_str_new(L, "" s, sizeof(s)-1)) - -/* Type conversions. */ -LJ_FUNC size_t LJ_FASTCALL lj_str_bufnum(char *s, cTValue *o); -LJ_FUNC char * LJ_FASTCALL lj_str_bufint(char *p, int32_t k); -LJ_FUNCA GCstr * LJ_FASTCALL lj_str_fromnum(lua_State *L, const lua_Number *np); -LJ_FUNC GCstr * LJ_FASTCALL lj_str_fromint(lua_State *L, int32_t k); -LJ_FUNCA GCstr * LJ_FASTCALL lj_str_fromnumber(lua_State *L, cTValue *o); - -#define LJ_STR_INTBUF (1+10) -#define LJ_STR_NUMBUF LUAI_MAXNUMBER2STR - -/* String formatting. */ -LJ_FUNC const char *lj_str_pushvf(lua_State *L, const char *fmt, va_list argp); -LJ_FUNC const char *lj_str_pushf(lua_State *L, const char *fmt, ...) -#if defined(__GNUC__) - __attribute__ ((format (printf, 2, 3))) -#endif - ; - -/* Resizable string buffers. Struct definition in lj_obj.h. */ -LJ_FUNC char *lj_str_needbuf(lua_State *L, SBuf *sb, MSize sz); - -#define lj_str_initbuf(sb) ((sb)->buf = NULL, (sb)->sz = 0) -#define lj_str_resetbuf(sb) ((sb)->n = 0) -#define lj_str_resizebuf(L, sb, size) \ - ((sb)->buf = (char *)lj_mem_realloc(L, (sb)->buf, (sb)->sz, (size)), \ - (sb)->sz = (size)) -#define lj_str_freebuf(g, sb) lj_mem_free(g, (void *)(sb)->buf, (sb)->sz) - -#endif diff --git a/deps/luajit/src/lj_strscan.c b/deps/luajit/src/lj_strscan.c deleted file mode 100644 index 568f647d..00000000 --- a/deps/luajit/src/lj_strscan.c +++ /dev/null @@ -1,498 +0,0 @@ -/* -** String scanning. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#include - -#define lj_strscan_c -#define LUA_CORE - -#include "lj_obj.h" -#include "lj_char.h" -#include "lj_strscan.h" - -/* -- Scanning numbers ---------------------------------------------------- */ - -/* -** Rationale for the builtin string to number conversion library: -** -** It removes a dependency on libc's strtod(), which is a true portability -** nightmare. Mainly due to the plethora of supported OS and toolchain -** combinations. Sadly, the various implementations -** a) are often buggy, incomplete (no hex floats) and/or imprecise, -** b) sometimes crash or hang on certain inputs, -** c) return non-standard NaNs that need to be filtered out, and -** d) fail if the locale-specific decimal separator is not a dot, -** which can only be fixed with atrocious workarounds. -** -** Also, most of the strtod() implementations are hopelessly bloated, -** which is not just an I-cache hog, but a problem for static linkage -** on embedded systems, too. -** -** OTOH the builtin conversion function is very compact. Even though it -** does a lot more, like parsing long longs, octal or imaginary numbers -** and returning the result in different formats: -** a) It needs less than 3 KB (!) of machine code (on x64 with -Os), -** b) it doesn't perform any dynamic allocation and, -** c) it needs only around 600 bytes of stack space. -** -** The builtin function is faster than strtod() for typical inputs, e.g. -** "123", "1.5" or "1e6". Arguably, it's slower for very large exponents, -** which are not very common (this could be fixed, if needed). -** -** And most importantly, the builtin function is equally precise on all -** platforms. It correctly converts and rounds any input to a double. -** If this is not the case, please send a bug report -- but PLEASE verify -** that the implementation you're comparing to is not the culprit! -** -** The implementation quickly pre-scans the entire string first and -** handles simple integers on-the-fly. Otherwise, it dispatches to the -** base-specific parser. Hex and octal is straightforward. -** -** Decimal to binary conversion uses a fixed-length circular buffer in -** base 100. Some simple cases are handled directly. For other cases, the -** number in the buffer is up-scaled or down-scaled until the integer part -** is in the proper range. Then the integer part is rounded and converted -** to a double which is finally rescaled to the result. Denormals need -** special treatment to prevent incorrect 'double rounding'. -*/ - -/* Definitions for circular decimal digit buffer (base 100 = 2 digits/byte). */ -#define STRSCAN_DIG 1024 -#define STRSCAN_MAXDIG 800 /* 772 + extra are sufficient. */ -#define STRSCAN_DDIG (STRSCAN_DIG/2) -#define STRSCAN_DMASK (STRSCAN_DDIG-1) - -/* Helpers for circular buffer. */ -#define DNEXT(a) (((a)+1) & STRSCAN_DMASK) -#define DPREV(a) (((a)-1) & STRSCAN_DMASK) -#define DLEN(lo, hi) ((int32_t)(((lo)-(hi)) & STRSCAN_DMASK)) - -#define casecmp(c, k) (((c) | 0x20) == k) - -/* Final conversion to double. */ -static void strscan_double(uint64_t x, TValue *o, int32_t ex2, int32_t neg) -{ - double n; - - /* Avoid double rounding for denormals. */ - if (LJ_UNLIKELY(ex2 <= -1075 && x != 0)) { - /* NYI: all of this generates way too much code on 32 bit CPUs. */ -#if defined(__GNUC__) && LJ_64 - int32_t b = (int32_t)(__builtin_clzll(x)^63); -#else - int32_t b = (x>>32) ? 32+(int32_t)lj_fls((uint32_t)(x>>32)) : - (int32_t)lj_fls((uint32_t)x); -#endif - if ((int32_t)b + ex2 <= -1023 && (int32_t)b + ex2 >= -1075) { - uint64_t rb = (uint64_t)1 << (-1075-ex2); - if ((x & rb) && ((x & (rb+rb+rb-1)))) x += rb+rb; - x = (x & ~(rb+rb-1)); - } - } - - /* Convert to double using a signed int64_t conversion, then rescale. */ - lua_assert((int64_t)x >= 0); - n = (double)(int64_t)x; - if (neg) n = -n; - if (ex2) n = ldexp(n, ex2); - o->n = n; -} - -/* Parse hexadecimal number. */ -static StrScanFmt strscan_hex(const uint8_t *p, TValue *o, - StrScanFmt fmt, uint32_t opt, - int32_t ex2, int32_t neg, uint32_t dig) -{ - uint64_t x = 0; - uint32_t i; - - /* Scan hex digits. */ - for (i = dig > 16 ? 16 : dig ; i; i--, p++) { - uint32_t d = (*p != '.' ? *p : *++p); if (d > '9') d += 9; - x = (x << 4) + (d & 15); - } - - /* Summarize rounding-effect of excess digits. */ - for (i = 16; i < dig; i++, p++) - x |= ((*p != '.' ? *p : *++p) != '0'), ex2 += 4; - - /* Format-specific handling. */ - switch (fmt) { - case STRSCAN_INT: - if (!(opt & STRSCAN_OPT_TONUM) && x < 0x80000000u+neg) { - o->i = neg ? -(int32_t)x : (int32_t)x; - return STRSCAN_INT; /* Fast path for 32 bit integers. */ - } - if (!(opt & STRSCAN_OPT_C)) { fmt = STRSCAN_NUM; break; } - /* fallthrough */ - case STRSCAN_U32: - if (dig > 8) return STRSCAN_ERROR; - o->i = neg ? -(int32_t)x : (int32_t)x; - return STRSCAN_U32; - case STRSCAN_I64: - case STRSCAN_U64: - if (dig > 16) return STRSCAN_ERROR; - o->u64 = neg ? (uint64_t)-(int64_t)x : x; - return fmt; - default: - break; - } - - /* Reduce range then convert to double. */ - if ((x & U64x(c0000000,0000000))) { x = (x >> 2) | (x & 3); ex2 += 2; } - strscan_double(x, o, ex2, neg); - return fmt; -} - -/* Parse octal number. */ -static StrScanFmt strscan_oct(const uint8_t *p, TValue *o, - StrScanFmt fmt, int32_t neg, uint32_t dig) -{ - uint64_t x = 0; - - /* Scan octal digits. */ - if (dig > 22 || (dig == 22 && *p > '1')) return STRSCAN_ERROR; - while (dig-- > 0) { - if (!(*p >= '0' && *p <= '7')) return STRSCAN_ERROR; - x = (x << 3) + (*p++ & 7); - } - - /* Format-specific handling. */ - switch (fmt) { - case STRSCAN_INT: - if (x >= 0x80000000u+neg) fmt = STRSCAN_U32; - /* fallthrough */ - case STRSCAN_U32: - if ((x >> 32)) return STRSCAN_ERROR; - o->i = neg ? -(int32_t)x : (int32_t)x; - break; - default: - case STRSCAN_I64: - case STRSCAN_U64: - o->u64 = neg ? (uint64_t)-(int64_t)x : x; - break; - } - return fmt; -} - -/* Parse decimal number. */ -static StrScanFmt strscan_dec(const uint8_t *p, TValue *o, - StrScanFmt fmt, uint32_t opt, - int32_t ex10, int32_t neg, uint32_t dig) -{ - uint8_t xi[STRSCAN_DDIG], *xip = xi; - - if (dig) { - uint32_t i = dig; - if (i > STRSCAN_MAXDIG) { - ex10 += (int32_t)(i - STRSCAN_MAXDIG); - i = STRSCAN_MAXDIG; - } - /* Scan unaligned leading digit. */ - if (((ex10^i) & 1)) - *xip++ = ((*p != '.' ? *p : *++p) & 15), i--, p++; - /* Scan aligned double-digits. */ - for ( ; i > 1; i -= 2) { - uint32_t d = 10 * ((*p != '.' ? *p : *++p) & 15); p++; - *xip++ = d + ((*p != '.' ? *p : *++p) & 15); p++; - } - /* Scan and realign trailing digit. */ - if (i) *xip++ = 10 * ((*p != '.' ? *p : *++p) & 15), ex10--, dig++, p++; - - /* Summarize rounding-effect of excess digits. */ - if (dig > STRSCAN_MAXDIG) { - do { - if ((*p != '.' ? *p : *++p) != '0') { xip[-1] |= 1; break; } - p++; - } while (--dig > STRSCAN_MAXDIG); - dig = STRSCAN_MAXDIG; - } else { /* Simplify exponent. */ - while (ex10 > 0 && dig <= 18) *xip++ = 0, ex10 -= 2, dig += 2; - } - } else { /* Only got zeros. */ - ex10 = 0; - xi[0] = 0; - } - - /* Fast path for numbers in integer format (but handles e.g. 1e6, too). */ - if (dig <= 20 && ex10 == 0) { - uint8_t *xis; - uint64_t x = xi[0]; - double n; - for (xis = xi+1; xis < xip; xis++) x = x * 100 + *xis; - if (!(dig == 20 && (xi[0] > 18 || (int64_t)x >= 0))) { /* No overflow? */ - /* Format-specific handling. */ - switch (fmt) { - case STRSCAN_INT: - if (!(opt & STRSCAN_OPT_TONUM) && x < 0x80000000u+neg) { - o->i = neg ? -(int32_t)x : (int32_t)x; - return STRSCAN_INT; /* Fast path for 32 bit integers. */ - } - if (!(opt & STRSCAN_OPT_C)) { fmt = STRSCAN_NUM; goto plainnumber; } - /* fallthrough */ - case STRSCAN_U32: - if ((x >> 32) != 0) return STRSCAN_ERROR; - o->i = neg ? -(int32_t)x : (int32_t)x; - return STRSCAN_U32; - case STRSCAN_I64: - case STRSCAN_U64: - o->u64 = neg ? (uint64_t)-(int64_t)x : x; - return fmt; - default: - plainnumber: /* Fast path for plain numbers < 2^63. */ - if ((int64_t)x < 0) break; - n = (double)(int64_t)x; - if (neg) n = -n; - o->n = n; - return fmt; - } - } - } - - /* Slow non-integer path. */ - if (fmt == STRSCAN_INT) { - if ((opt & STRSCAN_OPT_C)) return STRSCAN_ERROR; - fmt = STRSCAN_NUM; - } else if (fmt > STRSCAN_INT) { - return STRSCAN_ERROR; - } - { - uint32_t hi = 0, lo = (uint32_t)(xip-xi); - int32_t ex2 = 0, idig = (int32_t)lo + (ex10 >> 1); - - lua_assert(lo > 0 && (ex10 & 1) == 0); - - /* Handle simple overflow/underflow. */ - if (idig > 310/2) { if (neg) setminfV(o); else setpinfV(o); return fmt; } - else if (idig < -326/2) { o->n = neg ? -0.0 : 0.0; return fmt; } - - /* Scale up until we have at least 17 or 18 integer part digits. */ - while (idig < 9 && idig < DLEN(lo, hi)) { - uint32_t i, cy = 0; - ex2 -= 6; - for (i = DPREV(lo); ; i = DPREV(i)) { - uint32_t d = (xi[i] << 6) + cy; - cy = (((d >> 2) * 5243) >> 17); d = d - cy * 100; /* Div/mod 100. */ - xi[i] = (uint8_t)d; - if (i == hi) break; - if (d == 0 && i == DPREV(lo)) lo = i; - } - if (cy) { - hi = DPREV(hi); - if (xi[DPREV(lo)] == 0) lo = DPREV(lo); - else if (hi == lo) { lo = DPREV(lo); xi[DPREV(lo)] |= xi[lo]; } - xi[hi] = (uint8_t)cy; idig++; - } - } - - /* Scale down until no more than 17 or 18 integer part digits remain. */ - while (idig > 9) { - uint32_t i = hi, cy = 0; - ex2 += 6; - do { - cy += xi[i]; - xi[i] = (cy >> 6); - cy = 100 * (cy & 0x3f); - if (xi[i] == 0 && i == hi) hi = DNEXT(hi), idig--; - i = DNEXT(i); - } while (i != lo); - while (cy) { - if (hi == lo) { xi[DPREV(lo)] |= 1; break; } - xi[lo] = (cy >> 6); lo = DNEXT(lo); - cy = 100 * (cy & 0x3f); - } - } - - /* Collect integer part digits and convert to rescaled double. */ - { - uint64_t x = xi[hi]; - uint32_t i; - for (i = DNEXT(hi); --idig > 0 && i != lo; i = DNEXT(i)) - x = x * 100 + xi[i]; - if (i == lo) { - while (--idig >= 0) x = x * 100; - } else { /* Gather round bit from remaining digits. */ - x <<= 1; ex2--; - do { - if (xi[i]) { x |= 1; break; } - i = DNEXT(i); - } while (i != lo); - } - strscan_double(x, o, ex2, neg); - } - } - return fmt; -} - -/* Scan string containing a number. Returns format. Returns value in o. */ -StrScanFmt lj_strscan_scan(const uint8_t *p, TValue *o, uint32_t opt) -{ - int32_t neg = 0; - - /* Remove leading space, parse sign and non-numbers. */ - if (LJ_UNLIKELY(!lj_char_isdigit(*p))) { - while (lj_char_isspace(*p)) p++; - if (*p == '+' || *p == '-') neg = (*p++ == '-'); - if (LJ_UNLIKELY(*p >= 'A')) { /* Parse "inf", "infinity" or "nan". */ - TValue tmp; - setnanV(&tmp); - if (casecmp(p[0],'i') && casecmp(p[1],'n') && casecmp(p[2],'f')) { - if (neg) setminfV(&tmp); else setpinfV(&tmp); - p += 3; - if (casecmp(p[0],'i') && casecmp(p[1],'n') && casecmp(p[2],'i') && - casecmp(p[3],'t') && casecmp(p[4],'y')) p += 5; - } else if (casecmp(p[0],'n') && casecmp(p[1],'a') && casecmp(p[2],'n')) { - p += 3; - } - while (lj_char_isspace(*p)) p++; - if (*p) return STRSCAN_ERROR; - o->u64 = tmp.u64; - return STRSCAN_NUM; - } - } - - /* Parse regular number. */ - { - StrScanFmt fmt = STRSCAN_INT; - int cmask = LJ_CHAR_DIGIT; - int base = (opt & STRSCAN_OPT_C) && *p == '0' ? 0 : 10; - const uint8_t *sp, *dp = NULL; - uint32_t dig = 0, hasdig = 0, x = 0; - int32_t ex = 0; - - /* Determine base and skip leading zeros. */ - if (LJ_UNLIKELY(*p <= '0')) { - if (*p == '0' && casecmp(p[1], 'x')) - base = 16, cmask = LJ_CHAR_XDIGIT, p += 2; - for ( ; ; p++) { - if (*p == '0') { - hasdig = 1; - } else if (*p == '.') { - if (dp) return STRSCAN_ERROR; - dp = p; - } else { - break; - } - } - } - - /* Preliminary digit and decimal point scan. */ - for (sp = p; ; p++) { - if (LJ_LIKELY(lj_char_isa(*p, cmask))) { - x = x * 10 + (*p & 15); /* For fast path below. */ - dig++; - } else if (*p == '.') { - if (dp) return STRSCAN_ERROR; - dp = p; - } else { - break; - } - } - if (!(hasdig | dig)) return STRSCAN_ERROR; - - /* Handle decimal point. */ - if (dp) { - fmt = STRSCAN_NUM; - if (dig) { - ex = (int32_t)(dp-(p-1)); dp = p-1; - while (ex < 0 && *dp-- == '0') ex++, dig--; /* Skip trailing zeros. */ - if (base == 16) ex *= 4; - } - } - - /* Parse exponent. */ - if (casecmp(*p, (uint32_t)(base == 16 ? 'p' : 'e'))) { - uint32_t xx; - int negx = 0; - fmt = STRSCAN_NUM; p++; - if (*p == '+' || *p == '-') negx = (*p++ == '-'); - if (!lj_char_isdigit(*p)) return STRSCAN_ERROR; - xx = (*p++ & 15); - while (lj_char_isdigit(*p)) { - if (xx < 65536) xx = xx * 10 + (*p & 15); - p++; - } - ex += negx ? -(int32_t)xx : (int32_t)xx; - } - - /* Parse suffix. */ - if (*p) { - /* I (IMAG), U (U32), LL (I64), ULL/LLU (U64), L (long), UL/LU (ulong). */ - /* NYI: f (float). Not needed until cp_number() handles non-integers. */ - if (casecmp(*p, 'i')) { - if (!(opt & STRSCAN_OPT_IMAG)) return STRSCAN_ERROR; - p++; fmt = STRSCAN_IMAG; - } else if (fmt == STRSCAN_INT) { - if (casecmp(*p, 'u')) p++, fmt = STRSCAN_U32; - if (casecmp(*p, 'l')) { - p++; - if (casecmp(*p, 'l')) p++, fmt += STRSCAN_I64 - STRSCAN_INT; - else if (!(opt & STRSCAN_OPT_C)) return STRSCAN_ERROR; - else if (sizeof(long) == 8) fmt += STRSCAN_I64 - STRSCAN_INT; - } - if (casecmp(*p, 'u') && (fmt == STRSCAN_INT || fmt == STRSCAN_I64)) - p++, fmt += STRSCAN_U32 - STRSCAN_INT; - if ((fmt == STRSCAN_U32 && !(opt & STRSCAN_OPT_C)) || - (fmt >= STRSCAN_I64 && !(opt & STRSCAN_OPT_LL))) - return STRSCAN_ERROR; - } - while (lj_char_isspace(*p)) p++; - if (*p) return STRSCAN_ERROR; - } - - /* Fast path for decimal 32 bit integers. */ - if (fmt == STRSCAN_INT && base == 10 && - (dig < 10 || (dig == 10 && *sp <= '2' && x < 0x80000000u+neg))) { - int32_t y = neg ? -(int32_t)x : (int32_t)x; - if ((opt & STRSCAN_OPT_TONUM)) { - o->n = (double)y; - return STRSCAN_NUM; - } else { - o->i = y; - return STRSCAN_INT; - } - } - - /* Dispatch to base-specific parser. */ - if (base == 0 && !(fmt == STRSCAN_NUM || fmt == STRSCAN_IMAG)) - return strscan_oct(sp, o, fmt, neg, dig); - if (base == 16) - fmt = strscan_hex(sp, o, fmt, opt, ex, neg, dig); - else - fmt = strscan_dec(sp, o, fmt, opt, ex, neg, dig); - - /* Try to convert number to integer, if requested. */ - if (fmt == STRSCAN_NUM && (opt & STRSCAN_OPT_TOINT)) { - double n = o->n; - int32_t i = lj_num2int(n); - if (n == (lua_Number)i) { o->i = i; return STRSCAN_INT; } - } - return fmt; - } -} - -int LJ_FASTCALL lj_strscan_num(GCstr *str, TValue *o) -{ - StrScanFmt fmt = lj_strscan_scan((const uint8_t *)strdata(str), o, - STRSCAN_OPT_TONUM); - lua_assert(fmt == STRSCAN_ERROR || fmt == STRSCAN_NUM); - return (fmt != STRSCAN_ERROR); -} - -#if LJ_DUALNUM -int LJ_FASTCALL lj_strscan_number(GCstr *str, TValue *o) -{ - StrScanFmt fmt = lj_strscan_scan((const uint8_t *)strdata(str), o, - STRSCAN_OPT_TOINT); - lua_assert(fmt == STRSCAN_ERROR || fmt == STRSCAN_NUM || fmt == STRSCAN_INT); - if (fmt == STRSCAN_INT) setitype(o, LJ_TISNUM); - return (fmt != STRSCAN_ERROR); -} -#endif - -#undef DNEXT -#undef DPREV -#undef DLEN - diff --git a/deps/luajit/src/lj_strscan.h b/deps/luajit/src/lj_strscan.h deleted file mode 100644 index 77606893..00000000 --- a/deps/luajit/src/lj_strscan.h +++ /dev/null @@ -1,39 +0,0 @@ -/* -** String scanning. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#ifndef _LJ_STRSCAN_H -#define _LJ_STRSCAN_H - -#include "lj_obj.h" - -/* Options for accepted/returned formats. */ -#define STRSCAN_OPT_TOINT 0x01 /* Convert to int32_t, if possible. */ -#define STRSCAN_OPT_TONUM 0x02 /* Always convert to double. */ -#define STRSCAN_OPT_IMAG 0x04 -#define STRSCAN_OPT_LL 0x08 -#define STRSCAN_OPT_C 0x10 - -/* Returned format. */ -typedef enum { - STRSCAN_ERROR, - STRSCAN_NUM, STRSCAN_IMAG, - STRSCAN_INT, STRSCAN_U32, STRSCAN_I64, STRSCAN_U64, -} StrScanFmt; - -LJ_FUNC StrScanFmt lj_strscan_scan(const uint8_t *p, TValue *o, uint32_t opt); -LJ_FUNC int LJ_FASTCALL lj_strscan_num(GCstr *str, TValue *o); -#if LJ_DUALNUM -LJ_FUNC int LJ_FASTCALL lj_strscan_number(GCstr *str, TValue *o); -#else -#define lj_strscan_number(s, o) lj_strscan_num((s), (o)) -#endif - -/* Check for number or convert string to number/int in-place (!). */ -static LJ_AINLINE int lj_strscan_numberobj(TValue *o) -{ - return tvisnumber(o) || (tvisstr(o) && lj_strscan_number(strV(o), o)); -} - -#endif diff --git a/deps/luajit/src/lj_tab.c b/deps/luajit/src/lj_tab.c deleted file mode 100644 index a8062db7..00000000 --- a/deps/luajit/src/lj_tab.c +++ /dev/null @@ -1,631 +0,0 @@ -/* -** Table handling. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -** -** Major portions taken verbatim or adapted from the Lua interpreter. -** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h -*/ - -#define lj_tab_c -#define LUA_CORE - -#include "lj_obj.h" -#include "lj_gc.h" -#include "lj_err.h" -#include "lj_tab.h" - -/* -- Object hashing ------------------------------------------------------ */ - -/* Hash values are masked with the table hash mask and used as an index. */ -static LJ_AINLINE Node *hashmask(const GCtab *t, uint32_t hash) -{ - Node *n = noderef(t->node); - return &n[hash & t->hmask]; -} - -/* String hashes are precomputed when they are interned. */ -#define hashstr(t, s) hashmask(t, (s)->hash) - -#define hashlohi(t, lo, hi) hashmask((t), hashrot((lo), (hi))) -#define hashnum(t, o) hashlohi((t), (o)->u32.lo, ((o)->u32.hi << 1)) -#define hashptr(t, p) hashlohi((t), u32ptr(p), u32ptr(p) + HASH_BIAS) -#define hashgcref(t, r) hashlohi((t), gcrefu(r), gcrefu(r) + HASH_BIAS) - -/* Hash an arbitrary key and return its anchor position in the hash table. */ -static Node *hashkey(const GCtab *t, cTValue *key) -{ - lua_assert(!tvisint(key)); - if (tvisstr(key)) - return hashstr(t, strV(key)); - else if (tvisnum(key)) - return hashnum(t, key); - else if (tvisbool(key)) - return hashmask(t, boolV(key)); - else - return hashgcref(t, key->gcr); - /* Only hash 32 bits of lightuserdata on a 64 bit CPU. Good enough? */ -} - -/* -- Table creation and destruction -------------------------------------- */ - -/* Create new hash part for table. */ -static LJ_AINLINE void newhpart(lua_State *L, GCtab *t, uint32_t hbits) -{ - uint32_t hsize; - Node *node; - lua_assert(hbits != 0); - if (hbits > LJ_MAX_HBITS) - lj_err_msg(L, LJ_ERR_TABOV); - hsize = 1u << hbits; - node = lj_mem_newvec(L, hsize, Node); - setmref(node->freetop, &node[hsize]); - setmref(t->node, node); - t->hmask = hsize-1; -} - -/* -** Q: Why all of these copies of t->hmask, t->node etc. to local variables? -** A: Because alias analysis for C is _really_ tough. -** Even state-of-the-art C compilers won't produce good code without this. -*/ - -/* Clear hash part of table. */ -static LJ_AINLINE void clearhpart(GCtab *t) -{ - uint32_t i, hmask = t->hmask; - Node *node = noderef(t->node); - lua_assert(t->hmask != 0); - for (i = 0; i <= hmask; i++) { - Node *n = &node[i]; - setmref(n->next, NULL); - setnilV(&n->key); - setnilV(&n->val); - } -} - -/* Clear array part of table. */ -static LJ_AINLINE void clearapart(GCtab *t) -{ - uint32_t i, asize = t->asize; - TValue *array = tvref(t->array); - for (i = 0; i < asize; i++) - setnilV(&array[i]); -} - -/* Create a new table. Note: the slots are not initialized (yet). */ -static GCtab *newtab(lua_State *L, uint32_t asize, uint32_t hbits) -{ - GCtab *t; - /* First try to colocate the array part. */ - if (LJ_MAX_COLOSIZE != 0 && asize > 0 && asize <= LJ_MAX_COLOSIZE) { - lua_assert((sizeof(GCtab) & 7) == 0); - t = (GCtab *)lj_mem_newgco(L, sizetabcolo(asize)); - t->gct = ~LJ_TTAB; - t->nomm = (uint8_t)~0; - t->colo = (int8_t)asize; - setmref(t->array, (TValue *)((char *)t + sizeof(GCtab))); - setgcrefnull(t->metatable); - t->asize = asize; - t->hmask = 0; - setmref(t->node, &G(L)->nilnode); - } else { /* Otherwise separately allocate the array part. */ - t = lj_mem_newobj(L, GCtab); - t->gct = ~LJ_TTAB; - t->nomm = (uint8_t)~0; - t->colo = 0; - setmref(t->array, NULL); - setgcrefnull(t->metatable); - t->asize = 0; /* In case the array allocation fails. */ - t->hmask = 0; - setmref(t->node, &G(L)->nilnode); - if (asize > 0) { - if (asize > LJ_MAX_ASIZE) - lj_err_msg(L, LJ_ERR_TABOV); - setmref(t->array, lj_mem_newvec(L, asize, TValue)); - t->asize = asize; - } - } - if (hbits) - newhpart(L, t, hbits); - return t; -} - -/* Create a new table. -** -** IMPORTANT NOTE: The API differs from lua_createtable()! -** -** The array size is non-inclusive. E.g. asize=128 creates array slots -** for 0..127, but not for 128. If you need slots 1..128, pass asize=129 -** (slot 0 is wasted in this case). -** -** The hash size is given in hash bits. hbits=0 means no hash part. -** hbits=1 creates 2 hash slots, hbits=2 creates 4 hash slots and so on. -*/ -GCtab *lj_tab_new(lua_State *L, uint32_t asize, uint32_t hbits) -{ - GCtab *t = newtab(L, asize, hbits); - clearapart(t); - if (t->hmask > 0) clearhpart(t); - return t; -} - -#if LJ_HASJIT -GCtab * LJ_FASTCALL lj_tab_new1(lua_State *L, uint32_t ahsize) -{ - GCtab *t = newtab(L, ahsize & 0xffffff, ahsize >> 24); - clearapart(t); - if (t->hmask > 0) clearhpart(t); - return t; -} -#endif - -/* Duplicate a table. */ -GCtab * LJ_FASTCALL lj_tab_dup(lua_State *L, const GCtab *kt) -{ - GCtab *t; - uint32_t asize, hmask; - t = newtab(L, kt->asize, kt->hmask > 0 ? lj_fls(kt->hmask)+1 : 0); - lua_assert(kt->asize == t->asize && kt->hmask == t->hmask); - t->nomm = 0; /* Keys with metamethod names may be present. */ - asize = kt->asize; - if (asize > 0) { - TValue *array = tvref(t->array); - TValue *karray = tvref(kt->array); - if (asize < 64) { /* An inlined loop beats memcpy for < 512 bytes. */ - uint32_t i; - for (i = 0; i < asize; i++) - copyTV(L, &array[i], &karray[i]); - } else { - memcpy(array, karray, asize*sizeof(TValue)); - } - } - hmask = kt->hmask; - if (hmask > 0) { - uint32_t i; - Node *node = noderef(t->node); - Node *knode = noderef(kt->node); - ptrdiff_t d = (char *)node - (char *)knode; - setmref(node->freetop, (Node *)((char *)noderef(knode->freetop) + d)); - for (i = 0; i <= hmask; i++) { - Node *kn = &knode[i]; - Node *n = &node[i]; - Node *next = nextnode(kn); - /* Don't use copyTV here, since it asserts on a copy of a dead key. */ - n->val = kn->val; n->key = kn->key; - setmref(n->next, next == NULL? next : (Node *)((char *)next + d)); - } - } - return t; -} - -/* Free a table. */ -void LJ_FASTCALL lj_tab_free(global_State *g, GCtab *t) -{ - if (t->hmask > 0) - lj_mem_freevec(g, noderef(t->node), t->hmask+1, Node); - if (t->asize > 0 && LJ_MAX_COLOSIZE != 0 && t->colo <= 0) - lj_mem_freevec(g, tvref(t->array), t->asize, TValue); - if (LJ_MAX_COLOSIZE != 0 && t->colo) - lj_mem_free(g, t, sizetabcolo((uint32_t)t->colo & 0x7f)); - else - lj_mem_freet(g, t); -} - -/* -- Table resizing ------------------------------------------------------ */ - -/* Resize a table to fit the new array/hash part sizes. */ -static void resizetab(lua_State *L, GCtab *t, uint32_t asize, uint32_t hbits) -{ - Node *oldnode = noderef(t->node); - uint32_t oldasize = t->asize; - uint32_t oldhmask = t->hmask; - if (asize > oldasize) { /* Array part grows? */ - TValue *array; - uint32_t i; - if (asize > LJ_MAX_ASIZE) - lj_err_msg(L, LJ_ERR_TABOV); - if (LJ_MAX_COLOSIZE != 0 && t->colo > 0) { - /* A colocated array must be separated and copied. */ - TValue *oarray = tvref(t->array); - array = lj_mem_newvec(L, asize, TValue); - t->colo = (int8_t)(t->colo | 0x80); /* Mark as separated (colo < 0). */ - for (i = 0; i < oldasize; i++) - copyTV(L, &array[i], &oarray[i]); - } else { - array = (TValue *)lj_mem_realloc(L, tvref(t->array), - oldasize*sizeof(TValue), asize*sizeof(TValue)); - } - setmref(t->array, array); - t->asize = asize; - for (i = oldasize; i < asize; i++) /* Clear newly allocated slots. */ - setnilV(&array[i]); - } - /* Create new (empty) hash part. */ - if (hbits) { - newhpart(L, t, hbits); - clearhpart(t); - } else { - global_State *g = G(L); - setmref(t->node, &g->nilnode); - t->hmask = 0; - } - if (asize < oldasize) { /* Array part shrinks? */ - TValue *array = tvref(t->array); - uint32_t i; - t->asize = asize; /* Note: This 'shrinks' even colocated arrays. */ - for (i = asize; i < oldasize; i++) /* Reinsert old array values. */ - if (!tvisnil(&array[i])) - copyTV(L, lj_tab_setinth(L, t, (int32_t)i), &array[i]); - /* Physically shrink only separated arrays. */ - if (LJ_MAX_COLOSIZE != 0 && t->colo <= 0) - setmref(t->array, lj_mem_realloc(L, array, - oldasize*sizeof(TValue), asize*sizeof(TValue))); - } - if (oldhmask > 0) { /* Reinsert pairs from old hash part. */ - global_State *g; - uint32_t i; - for (i = 0; i <= oldhmask; i++) { - Node *n = &oldnode[i]; - if (!tvisnil(&n->val)) - copyTV(L, lj_tab_set(L, t, &n->key), &n->val); - } - g = G(L); - lj_mem_freevec(g, oldnode, oldhmask+1, Node); - } -} - -static uint32_t countint(cTValue *key, uint32_t *bins) -{ - lua_assert(!tvisint(key)); - if (tvisnum(key)) { - lua_Number nk = numV(key); - int32_t k = lj_num2int(nk); - if ((uint32_t)k < LJ_MAX_ASIZE && nk == (lua_Number)k) { - bins[(k > 2 ? lj_fls((uint32_t)(k-1)) : 0)]++; - return 1; - } - } - return 0; -} - -static uint32_t countarray(const GCtab *t, uint32_t *bins) -{ - uint32_t na, b, i; - if (t->asize == 0) return 0; - for (na = i = b = 0; b < LJ_MAX_ABITS; b++) { - uint32_t n, top = 2u << b; - TValue *array; - if (top >= t->asize) { - top = t->asize-1; - if (i > top) - break; - } - array = tvref(t->array); - for (n = 0; i <= top; i++) - if (!tvisnil(&array[i])) - n++; - bins[b] += n; - na += n; - } - return na; -} - -static uint32_t counthash(const GCtab *t, uint32_t *bins, uint32_t *narray) -{ - uint32_t total, na, i, hmask = t->hmask; - Node *node = noderef(t->node); - for (total = na = 0, i = 0; i <= hmask; i++) { - Node *n = &node[i]; - if (!tvisnil(&n->val)) { - na += countint(&n->key, bins); - total++; - } - } - *narray += na; - return total; -} - -static uint32_t bestasize(uint32_t bins[], uint32_t *narray) -{ - uint32_t b, sum, na = 0, sz = 0, nn = *narray; - for (b = 0, sum = 0; 2*nn > (1u< 0 && 2*(sum += bins[b]) > (1u<hmask > 0 ? lj_fls(t->hmask)+1 : 0); -} - -/* -- Table getters ------------------------------------------------------- */ - -cTValue * LJ_FASTCALL lj_tab_getinth(GCtab *t, int32_t key) -{ - TValue k; - Node *n; - k.n = (lua_Number)key; - n = hashnum(t, &k); - do { - if (tvisnum(&n->key) && n->key.n == k.n) - return &n->val; - } while ((n = nextnode(n))); - return NULL; -} - -cTValue *lj_tab_getstr(GCtab *t, GCstr *key) -{ - Node *n = hashstr(t, key); - do { - if (tvisstr(&n->key) && strV(&n->key) == key) - return &n->val; - } while ((n = nextnode(n))); - return NULL; -} - -cTValue *lj_tab_get(lua_State *L, GCtab *t, cTValue *key) -{ - if (tvisstr(key)) { - cTValue *tv = lj_tab_getstr(t, strV(key)); - if (tv) - return tv; - } else if (tvisint(key)) { - cTValue *tv = lj_tab_getint(t, intV(key)); - if (tv) - return tv; - } else if (tvisnum(key)) { - lua_Number nk = numV(key); - int32_t k = lj_num2int(nk); - if (nk == (lua_Number)k) { - cTValue *tv = lj_tab_getint(t, k); - if (tv) - return tv; - } else { - goto genlookup; /* Else use the generic lookup. */ - } - } else if (!tvisnil(key)) { - Node *n; - genlookup: - n = hashkey(t, key); - do { - if (lj_obj_equal(&n->key, key)) - return &n->val; - } while ((n = nextnode(n))); - } - return niltv(L); -} - -/* -- Table setters ------------------------------------------------------- */ - -/* Insert new key. Use Brent's variation to optimize the chain length. */ -TValue *lj_tab_newkey(lua_State *L, GCtab *t, cTValue *key) -{ - Node *n = hashkey(t, key); - if (!tvisnil(&n->val) || t->hmask == 0) { - Node *nodebase = noderef(t->node); - Node *collide, *freenode = noderef(nodebase->freetop); - lua_assert(freenode >= nodebase && freenode <= nodebase+t->hmask+1); - do { - if (freenode == nodebase) { /* No free node found? */ - rehashtab(L, t, key); /* Rehash table. */ - return lj_tab_set(L, t, key); /* Retry key insertion. */ - } - } while (!tvisnil(&(--freenode)->key)); - setmref(nodebase->freetop, freenode); - lua_assert(freenode != &G(L)->nilnode); - collide = hashkey(t, &n->key); - if (collide != n) { /* Colliding node not the main node? */ - while (noderef(collide->next) != n) /* Find predecessor. */ - collide = nextnode(collide); - setmref(collide->next, freenode); /* Relink chain. */ - /* Copy colliding node into free node and free main node. */ - freenode->val = n->val; - freenode->key = n->key; - freenode->next = n->next; - setmref(n->next, NULL); - setnilV(&n->val); - /* Rechain pseudo-resurrected string keys with colliding hashes. */ - while (nextnode(freenode)) { - Node *nn = nextnode(freenode); - if (tvisstr(&nn->key) && !tvisnil(&nn->val) && - hashstr(t, strV(&nn->key)) == n) { - freenode->next = nn->next; - nn->next = n->next; - setmref(n->next, nn); - } else { - freenode = nn; - } - } - } else { /* Otherwise use free node. */ - setmrefr(freenode->next, n->next); /* Insert into chain. */ - setmref(n->next, freenode); - n = freenode; - } - } - n->key.u64 = key->u64; - if (LJ_UNLIKELY(tvismzero(&n->key))) - n->key.u64 = 0; - lj_gc_anybarriert(L, t); - lua_assert(tvisnil(&n->val)); - return &n->val; -} - -TValue *lj_tab_setinth(lua_State *L, GCtab *t, int32_t key) -{ - TValue k; - Node *n; - k.n = (lua_Number)key; - n = hashnum(t, &k); - do { - if (tvisnum(&n->key) && n->key.n == k.n) - return &n->val; - } while ((n = nextnode(n))); - return lj_tab_newkey(L, t, &k); -} - -TValue *lj_tab_setstr(lua_State *L, GCtab *t, GCstr *key) -{ - TValue k; - Node *n = hashstr(t, key); - do { - if (tvisstr(&n->key) && strV(&n->key) == key) - return &n->val; - } while ((n = nextnode(n))); - setstrV(L, &k, key); - return lj_tab_newkey(L, t, &k); -} - -TValue *lj_tab_set(lua_State *L, GCtab *t, cTValue *key) -{ - Node *n; - t->nomm = 0; /* Invalidate negative metamethod cache. */ - if (tvisstr(key)) { - return lj_tab_setstr(L, t, strV(key)); - } else if (tvisint(key)) { - return lj_tab_setint(L, t, intV(key)); - } else if (tvisnum(key)) { - lua_Number nk = numV(key); - int32_t k = lj_num2int(nk); - if (nk == (lua_Number)k) - return lj_tab_setint(L, t, k); - if (tvisnan(key)) - lj_err_msg(L, LJ_ERR_NANIDX); - /* Else use the generic lookup. */ - } else if (tvisnil(key)) { - lj_err_msg(L, LJ_ERR_NILIDX); - } - n = hashkey(t, key); - do { - if (lj_obj_equal(&n->key, key)) - return &n->val; - } while ((n = nextnode(n))); - return lj_tab_newkey(L, t, key); -} - -/* -- Table traversal ----------------------------------------------------- */ - -/* Get the traversal index of a key. */ -static uint32_t keyindex(lua_State *L, GCtab *t, cTValue *key) -{ - TValue tmp; - if (tvisint(key)) { - int32_t k = intV(key); - if ((uint32_t)k < t->asize) - return (uint32_t)k; /* Array key indexes: [0..t->asize-1] */ - setnumV(&tmp, (lua_Number)k); - key = &tmp; - } else if (tvisnum(key)) { - lua_Number nk = numV(key); - int32_t k = lj_num2int(nk); - if ((uint32_t)k < t->asize && nk == (lua_Number)k) - return (uint32_t)k; /* Array key indexes: [0..t->asize-1] */ - } - if (!tvisnil(key)) { - Node *n = hashkey(t, key); - do { - if (lj_obj_equal(&n->key, key)) - return t->asize + (uint32_t)(n - noderef(t->node)); - /* Hash key indexes: [t->asize..t->asize+t->nmask] */ - } while ((n = nextnode(n))); - if (key->u32.hi == 0xfffe7fff) /* ITERN was despecialized while running. */ - return key->u32.lo - 1; - lj_err_msg(L, LJ_ERR_NEXTIDX); - return 0; /* unreachable */ - } - return ~0u; /* A nil key starts the traversal. */ -} - -/* Advance to the next step in a table traversal. */ -int lj_tab_next(lua_State *L, GCtab *t, TValue *key) -{ - uint32_t i = keyindex(L, t, key); /* Find predecessor key index. */ - for (i++; i < t->asize; i++) /* First traverse the array keys. */ - if (!tvisnil(arrayslot(t, i))) { - setintV(key, i); - copyTV(L, key+1, arrayslot(t, i)); - return 1; - } - for (i -= t->asize; i <= t->hmask; i++) { /* Then traverse the hash keys. */ - Node *n = &noderef(t->node)[i]; - if (!tvisnil(&n->val)) { - copyTV(L, key, &n->key); - copyTV(L, key+1, &n->val); - return 1; - } - } - return 0; /* End of traversal. */ -} - -/* -- Table length calculation -------------------------------------------- */ - -static MSize unbound_search(GCtab *t, MSize j) -{ - cTValue *tv; - MSize i = j; /* i is zero or a present index */ - j++; - /* find `i' and `j' such that i is present and j is not */ - while ((tv = lj_tab_getint(t, (int32_t)j)) && !tvisnil(tv)) { - i = j; - j *= 2; - if (j > (MSize)(INT_MAX-2)) { /* overflow? */ - /* table was built with bad purposes: resort to linear search */ - i = 1; - while ((tv = lj_tab_getint(t, (int32_t)i)) && !tvisnil(tv)) i++; - return i - 1; - } - } - /* now do a binary search between them */ - while (j - i > 1) { - MSize m = (i+j)/2; - cTValue *tvb = lj_tab_getint(t, (int32_t)m); - if (tvb && !tvisnil(tvb)) i = m; else j = m; - } - return i; -} - -/* -** Try to find a boundary in table `t'. A `boundary' is an integer index -** such that t[i] is non-nil and t[i+1] is nil (and 0 if t[1] is nil). -*/ -MSize LJ_FASTCALL lj_tab_len(GCtab *t) -{ - MSize j = (MSize)t->asize; - if (j > 1 && tvisnil(arrayslot(t, j-1))) { - MSize i = 1; - while (j - i > 1) { - MSize m = (i+j)/2; - if (tvisnil(arrayslot(t, m-1))) j = m; else i = m; - } - return i-1; - } - if (j) j--; - if (t->hmask <= 0) - return j; - return unbound_search(t, j); -} - diff --git a/deps/luajit/src/lj_tab.h b/deps/luajit/src/lj_tab.h deleted file mode 100644 index f0d228eb..00000000 --- a/deps/luajit/src/lj_tab.h +++ /dev/null @@ -1,70 +0,0 @@ -/* -** Table handling. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#ifndef _LJ_TAB_H -#define _LJ_TAB_H - -#include "lj_obj.h" - -/* Hash constants. Tuned using a brute force search. */ -#define HASH_BIAS (-0x04c11db7) -#define HASH_ROT1 14 -#define HASH_ROT2 5 -#define HASH_ROT3 13 - -/* Scramble the bits of numbers and pointers. */ -static LJ_AINLINE uint32_t hashrot(uint32_t lo, uint32_t hi) -{ -#if LJ_TARGET_X86ORX64 - /* Prefer variant that compiles well for a 2-operand CPU. */ - lo ^= hi; hi = lj_rol(hi, HASH_ROT1); - lo -= hi; hi = lj_rol(hi, HASH_ROT2); - hi ^= lo; hi -= lj_rol(lo, HASH_ROT3); -#else - lo ^= hi; - lo = lo - lj_rol(hi, HASH_ROT1); - hi = lo ^ lj_rol(hi, HASH_ROT1 + HASH_ROT2); - hi = hi - lj_rol(lo, HASH_ROT3); -#endif - return hi; -} - -#define hsize2hbits(s) ((s) ? ((s)==1 ? 1 : 1+lj_fls((uint32_t)((s)-1))) : 0) - -LJ_FUNCA GCtab *lj_tab_new(lua_State *L, uint32_t asize, uint32_t hbits); -#if LJ_HASJIT -LJ_FUNC GCtab * LJ_FASTCALL lj_tab_new1(lua_State *L, uint32_t ahsize); -#endif -LJ_FUNCA GCtab * LJ_FASTCALL lj_tab_dup(lua_State *L, const GCtab *kt); -LJ_FUNC void LJ_FASTCALL lj_tab_free(global_State *g, GCtab *t); -#if LJ_HASFFI -LJ_FUNC void lj_tab_rehash(lua_State *L, GCtab *t); -#endif -LJ_FUNCA void lj_tab_reasize(lua_State *L, GCtab *t, uint32_t nasize); - -/* Caveat: all getters except lj_tab_get() can return NULL! */ - -LJ_FUNCA cTValue * LJ_FASTCALL lj_tab_getinth(GCtab *t, int32_t key); -LJ_FUNC cTValue *lj_tab_getstr(GCtab *t, GCstr *key); -LJ_FUNCA cTValue *lj_tab_get(lua_State *L, GCtab *t, cTValue *key); - -/* Caveat: all setters require a write barrier for the stored value. */ - -LJ_FUNCA TValue *lj_tab_newkey(lua_State *L, GCtab *t, cTValue *key); -LJ_FUNC TValue *lj_tab_setinth(lua_State *L, GCtab *t, int32_t key); -LJ_FUNC TValue *lj_tab_setstr(lua_State *L, GCtab *t, GCstr *key); -LJ_FUNC TValue *lj_tab_set(lua_State *L, GCtab *t, cTValue *key); - -#define inarray(t, key) ((MSize)(key) < (MSize)(t)->asize) -#define arrayslot(t, i) (&tvref((t)->array)[(i)]) -#define lj_tab_getint(t, key) \ - (inarray((t), (key)) ? arrayslot((t), (key)) : lj_tab_getinth((t), (key))) -#define lj_tab_setint(L, t, key) \ - (inarray((t), (key)) ? arrayslot((t), (key)) : lj_tab_setinth(L, (t), (key))) - -LJ_FUNCA int lj_tab_next(lua_State *L, GCtab *t, TValue *key); -LJ_FUNCA MSize LJ_FASTCALL lj_tab_len(GCtab *t); - -#endif diff --git a/deps/luajit/src/lj_target.h b/deps/luajit/src/lj_target.h deleted file mode 100644 index 1a242325..00000000 --- a/deps/luajit/src/lj_target.h +++ /dev/null @@ -1,162 +0,0 @@ -/* -** Definitions for target CPU. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#ifndef _LJ_TARGET_H -#define _LJ_TARGET_H - -#include "lj_def.h" -#include "lj_arch.h" - -/* -- Registers and spill slots ------------------------------------------- */ - -/* Register type (uint8_t in ir->r). */ -typedef uint32_t Reg; - -/* The hi-bit is NOT set for an allocated register. This means the value -** can be directly used without masking. The hi-bit is set for a register -** allocation hint or for RID_INIT, RID_SINK or RID_SUNK. -*/ -#define RID_NONE 0x80 -#define RID_MASK 0x7f -#define RID_INIT (RID_NONE|RID_MASK) -#define RID_SINK (RID_INIT-1) -#define RID_SUNK (RID_INIT-2) - -#define ra_noreg(r) ((r) & RID_NONE) -#define ra_hasreg(r) (!((r) & RID_NONE)) - -/* The ra_hashint() macro assumes a previous test for ra_noreg(). */ -#define ra_hashint(r) ((r) < RID_SUNK) -#define ra_gethint(r) ((Reg)((r) & RID_MASK)) -#define ra_sethint(rr, r) rr = (uint8_t)((r)|RID_NONE) -#define ra_samehint(r1, r2) (ra_gethint((r1)^(r2)) == 0) - -/* Spill slot 0 means no spill slot has been allocated. */ -#define SPS_NONE 0 - -#define ra_hasspill(s) ((s) != SPS_NONE) - -/* Combined register and spill slot (uint16_t in ir->prev). */ -typedef uint32_t RegSP; - -#define REGSP(r, s) ((r) + ((s) << 8)) -#define REGSP_HINT(r) ((r)|RID_NONE) -#define REGSP_INIT REGSP(RID_INIT, 0) - -#define regsp_reg(rs) ((rs) & 255) -#define regsp_spill(rs) ((rs) >> 8) -#define regsp_used(rs) \ - (((rs) & ~REGSP(RID_MASK, 0)) != REGSP(RID_NONE, 0)) - -/* -- Register sets ------------------------------------------------------- */ - -/* Bitset for registers. 32 registers suffice for most architectures. -** Note that one set holds bits for both GPRs and FPRs. -*/ -#if LJ_TARGET_PPC || LJ_TARGET_MIPS -typedef uint64_t RegSet; -#else -typedef uint32_t RegSet; -#endif - -#define RID2RSET(r) (((RegSet)1) << (r)) -#define RSET_EMPTY ((RegSet)0) -#define RSET_RANGE(lo, hi) ((RID2RSET((hi)-(lo))-1) << (lo)) - -#define rset_test(rs, r) ((int)((rs) >> (r)) & 1) -#define rset_set(rs, r) (rs |= RID2RSET(r)) -#define rset_clear(rs, r) (rs &= ~RID2RSET(r)) -#define rset_exclude(rs, r) (rs & ~RID2RSET(r)) -#if LJ_TARGET_PPC || LJ_TARGET_MIPS -#define rset_picktop(rs) ((Reg)(__builtin_clzll(rs)^63)) -#define rset_pickbot(rs) ((Reg)__builtin_ctzll(rs)) -#else -#define rset_picktop(rs) ((Reg)lj_fls(rs)) -#define rset_pickbot(rs) ((Reg)lj_ffs(rs)) -#endif - -/* -- Register allocation cost -------------------------------------------- */ - -/* The register allocation heuristic keeps track of the cost for allocating -** a specific register: -** -** A free register (obviously) has a cost of 0 and a 1-bit in the free mask. -** -** An already allocated register has the (non-zero) IR reference in the lowest -** bits and the result of a blended cost-model in the higher bits. -** -** The allocator first checks the free mask for a hit. Otherwise an (unrolled) -** linear search for the minimum cost is used. The search doesn't need to -** keep track of the position of the minimum, which makes it very fast. -** The lowest bits of the minimum cost show the desired IR reference whose -** register is the one to evict. -** -** Without the cost-model this degenerates to the standard heuristics for -** (reverse) linear-scan register allocation. Since code generation is done -** in reverse, a live interval extends from the last use to the first def. -** For an SSA IR the IR reference is the first (and only) def and thus -** trivially marks the end of the interval. The LSRA heuristics says to pick -** the register whose live interval has the furthest extent, i.e. the lowest -** IR reference in our case. -** -** A cost-model should take into account other factors, like spill-cost and -** restore- or rematerialization-cost, which depend on the kind of instruction. -** E.g. constants have zero spill costs, variant instructions have higher -** costs than invariants and PHIs should preferably never be spilled. -** -** Here's a first cut at simple, but effective blended cost-model for R-LSRA: -** - Due to careful design of the IR, constants already have lower IR -** references than invariants and invariants have lower IR references -** than variants. -** - The cost in the upper 16 bits is the sum of the IR reference and a -** weighted score. The score currently only takes into account whether -** the IRT_ISPHI bit is set in the instruction type. -** - The PHI weight is the minimum distance (in IR instructions) a PHI -** reference has to be further apart from a non-PHI reference to be spilled. -** - It should be a power of two (for speed) and must be between 2 and 32768. -** Good values for the PHI weight seem to be between 40 and 150. -** - Further study is required. -*/ -#define REGCOST_PHI_WEIGHT 64 - -/* Cost for allocating a specific register. */ -typedef uint32_t RegCost; - -/* Note: assumes 16 bit IRRef1. */ -#define REGCOST(cost, ref) ((RegCost)(ref) + ((RegCost)(cost) << 16)) -#define regcost_ref(rc) ((IRRef1)(rc)) - -#define REGCOST_T(t) \ - ((RegCost)((t)&IRT_ISPHI) * (((RegCost)(REGCOST_PHI_WEIGHT)<<16)/IRT_ISPHI)) -#define REGCOST_REF_T(ref, t) (REGCOST((ref), (ref)) + REGCOST_T((t))) - -/* -- Target-specific definitions ----------------------------------------- */ - -#if LJ_TARGET_X86ORX64 -#include "lj_target_x86.h" -#elif LJ_TARGET_ARM -#include "lj_target_arm.h" -#elif LJ_TARGET_PPC -#include "lj_target_ppc.h" -#elif LJ_TARGET_MIPS -#include "lj_target_mips.h" -#else -#error "Missing include for target CPU" -#endif - -#ifdef EXITSTUBS_PER_GROUP -/* Return the address of an exit stub. */ -static LJ_AINLINE char *exitstub_addr_(char **group, uint32_t exitno) -{ - lua_assert(group[exitno / EXITSTUBS_PER_GROUP] != NULL); - return (char *)group[exitno / EXITSTUBS_PER_GROUP] + - EXITSTUB_SPACING*(exitno % EXITSTUBS_PER_GROUP); -} -/* Avoid dependence on lj_jit.h if only including lj_target.h. */ -#define exitstub_addr(J, exitno) \ - ((MCode *)exitstub_addr_((char **)((J)->exitstubgroup), (exitno))) -#endif - -#endif diff --git a/deps/luajit/src/lj_target_arm.h b/deps/luajit/src/lj_target_arm.h deleted file mode 100644 index 6d4d0aed..00000000 --- a/deps/luajit/src/lj_target_arm.h +++ /dev/null @@ -1,274 +0,0 @@ -/* -** Definitions for ARM CPUs. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#ifndef _LJ_TARGET_ARM_H -#define _LJ_TARGET_ARM_H - -/* -- Registers IDs ------------------------------------------------------- */ - -#define GPRDEF(_) \ - _(R0) _(R1) _(R2) _(R3) _(R4) _(R5) _(R6) _(R7) \ - _(R8) _(R9) _(R10) _(R11) _(R12) _(SP) _(LR) _(PC) -#if LJ_SOFTFP -#define FPRDEF(_) -#else -#define FPRDEF(_) \ - _(D0) _(D1) _(D2) _(D3) _(D4) _(D5) _(D6) _(D7) \ - _(D8) _(D9) _(D10) _(D11) _(D12) _(D13) _(D14) _(D15) -#endif -#define VRIDDEF(_) - -#define RIDENUM(name) RID_##name, - -enum { - GPRDEF(RIDENUM) /* General-purpose registers (GPRs). */ - FPRDEF(RIDENUM) /* Floating-point registers (FPRs). */ - RID_MAX, - RID_TMP = RID_LR, - - /* Calling conventions. */ - RID_RET = RID_R0, - RID_RETLO = RID_R0, - RID_RETHI = RID_R1, -#if LJ_SOFTFP - RID_FPRET = RID_R0, -#else - RID_FPRET = RID_D0, -#endif - - /* These definitions must match with the *.dasc file(s): */ - RID_BASE = RID_R9, /* Interpreter BASE. */ - RID_LPC = RID_R6, /* Interpreter PC. */ - RID_DISPATCH = RID_R7, /* Interpreter DISPATCH table. */ - RID_LREG = RID_R8, /* Interpreter L. */ - - /* Register ranges [min, max) and number of registers. */ - RID_MIN_GPR = RID_R0, - RID_MAX_GPR = RID_PC+1, - RID_MIN_FPR = RID_MAX_GPR, -#if LJ_SOFTFP - RID_MAX_FPR = RID_MIN_FPR, -#else - RID_MAX_FPR = RID_D15+1, -#endif - RID_NUM_GPR = RID_MAX_GPR - RID_MIN_GPR, - RID_NUM_FPR = RID_MAX_FPR - RID_MIN_FPR -}; - -#define RID_NUM_KREF RID_NUM_GPR -#define RID_MIN_KREF RID_R0 - -/* -- Register sets ------------------------------------------------------- */ - -/* Make use of all registers, except sp, lr and pc. */ -#define RSET_GPR (RSET_RANGE(RID_MIN_GPR, RID_R12+1)) -#define RSET_GPREVEN \ - (RID2RSET(RID_R0)|RID2RSET(RID_R2)|RID2RSET(RID_R4)|RID2RSET(RID_R6)| \ - RID2RSET(RID_R8)|RID2RSET(RID_R10)) -#define RSET_GPRODD \ - (RID2RSET(RID_R1)|RID2RSET(RID_R3)|RID2RSET(RID_R5)|RID2RSET(RID_R7)| \ - RID2RSET(RID_R9)|RID2RSET(RID_R11)) -#if LJ_SOFTFP -#define RSET_FPR 0 -#else -#define RSET_FPR (RSET_RANGE(RID_MIN_FPR, RID_MAX_FPR)) -#endif -#define RSET_ALL (RSET_GPR|RSET_FPR) -#define RSET_INIT RSET_ALL - -/* ABI-specific register sets. lr is an implicit scratch register. */ -#define RSET_SCRATCH_GPR_ (RSET_RANGE(RID_R0, RID_R3+1)|RID2RSET(RID_R12)) -#ifdef __APPLE__ -#define RSET_SCRATCH_GPR (RSET_SCRATCH_GPR_|RID2RSET(RID_R9)) -#else -#define RSET_SCRATCH_GPR RSET_SCRATCH_GPR_ -#endif -#if LJ_SOFTFP -#define RSET_SCRATCH_FPR 0 -#else -#define RSET_SCRATCH_FPR (RSET_RANGE(RID_D0, RID_D7+1)) -#endif -#define RSET_SCRATCH (RSET_SCRATCH_GPR|RSET_SCRATCH_FPR) -#define REGARG_FIRSTGPR RID_R0 -#define REGARG_LASTGPR RID_R3 -#define REGARG_NUMGPR 4 -#if LJ_ABI_SOFTFP -#define REGARG_FIRSTFPR 0 -#define REGARG_LASTFPR 0 -#define REGARG_NUMFPR 0 -#else -#define REGARG_FIRSTFPR RID_D0 -#define REGARG_LASTFPR RID_D7 -#define REGARG_NUMFPR 8 -#endif - -/* -- Spill slots --------------------------------------------------------- */ - -/* Spill slots are 32 bit wide. An even/odd pair is used for FPRs. -** -** SPS_FIXED: Available fixed spill slots in interpreter frame. -** This definition must match with the *.dasc file(s). -** -** SPS_FIRST: First spill slot for general use. Reserve min. two 32 bit slots. -*/ -#define SPS_FIXED 2 -#define SPS_FIRST 2 - -#define SPOFS_TMP 0 - -#define sps_scale(slot) (4 * (int32_t)(slot)) -#define sps_align(slot) (((slot) - SPS_FIXED + 1) & ~1) - -/* -- Exit state ---------------------------------------------------------- */ - -/* This definition must match with the *.dasc file(s). */ -typedef struct { -#if !LJ_SOFTFP - lua_Number fpr[RID_NUM_FPR]; /* Floating-point registers. */ -#endif - int32_t gpr[RID_NUM_GPR]; /* General-purpose registers. */ - int32_t spill[256]; /* Spill slots. */ -} ExitState; - -/* PC after instruction that caused an exit. Used to find the trace number. */ -#define EXITSTATE_PCREG RID_PC -/* Highest exit + 1 indicates stack check. */ -#define EXITSTATE_CHECKEXIT 1 - -#define EXITSTUB_SPACING 4 -#define EXITSTUBS_PER_GROUP 32 - -/* -- Instructions -------------------------------------------------------- */ - -/* Instruction fields. */ -#define ARMF_CC(ai, cc) (((ai) ^ ARMI_CCAL) | ((cc) << 28)) -#define ARMF_N(r) ((r) << 16) -#define ARMF_D(r) ((r) << 12) -#define ARMF_S(r) ((r) << 8) -#define ARMF_M(r) (r) -#define ARMF_SH(sh, n) (((sh) << 5) | ((n) << 7)) -#define ARMF_RSH(sh, r) (0x10 | ((sh) << 5) | ARMF_S(r)) - -typedef enum ARMIns { - ARMI_CCAL = 0xe0000000, - ARMI_S = 0x000100000, - ARMI_K12 = 0x02000000, - ARMI_KNEG = 0x00200000, - ARMI_LS_W = 0x00200000, - ARMI_LS_U = 0x00800000, - ARMI_LS_P = 0x01000000, - ARMI_LS_R = 0x02000000, - ARMI_LSX_I = 0x00400000, - - ARMI_AND = 0xe0000000, - ARMI_EOR = 0xe0200000, - ARMI_SUB = 0xe0400000, - ARMI_RSB = 0xe0600000, - ARMI_ADD = 0xe0800000, - ARMI_ADC = 0xe0a00000, - ARMI_SBC = 0xe0c00000, - ARMI_RSC = 0xe0e00000, - ARMI_TST = 0xe1100000, - ARMI_TEQ = 0xe1300000, - ARMI_CMP = 0xe1500000, - ARMI_CMN = 0xe1700000, - ARMI_ORR = 0xe1800000, - ARMI_MOV = 0xe1a00000, - ARMI_BIC = 0xe1c00000, - ARMI_MVN = 0xe1e00000, - - ARMI_NOP = 0xe1a00000, - - ARMI_MUL = 0xe0000090, - ARMI_SMULL = 0xe0c00090, - - ARMI_LDR = 0xe4100000, - ARMI_LDRB = 0xe4500000, - ARMI_LDRH = 0xe01000b0, - ARMI_LDRSB = 0xe01000d0, - ARMI_LDRSH = 0xe01000f0, - ARMI_LDRD = 0xe00000d0, - ARMI_STR = 0xe4000000, - ARMI_STRB = 0xe4400000, - ARMI_STRH = 0xe00000b0, - ARMI_STRD = 0xe00000f0, - ARMI_PUSH = 0xe92d0000, - - ARMI_B = 0xea000000, - ARMI_BL = 0xeb000000, - ARMI_BLX = 0xfa000000, - ARMI_BLXr = 0xe12fff30, - - /* ARMv6 */ - ARMI_REV = 0xe6bf0f30, - ARMI_SXTB = 0xe6af0070, - ARMI_SXTH = 0xe6bf0070, - ARMI_UXTB = 0xe6ef0070, - ARMI_UXTH = 0xe6ff0070, - - /* ARMv6T2 */ - ARMI_MOVW = 0xe3000000, - ARMI_MOVT = 0xe3400000, - - /* VFP */ - ARMI_VMOV_D = 0xeeb00b40, - ARMI_VMOV_S = 0xeeb00a40, - ARMI_VMOVI_D = 0xeeb00b00, - - ARMI_VMOV_R_S = 0xee100a10, - ARMI_VMOV_S_R = 0xee000a10, - ARMI_VMOV_RR_D = 0xec500b10, - ARMI_VMOV_D_RR = 0xec400b10, - - ARMI_VADD_D = 0xee300b00, - ARMI_VSUB_D = 0xee300b40, - ARMI_VMUL_D = 0xee200b00, - ARMI_VMLA_D = 0xee000b00, - ARMI_VMLS_D = 0xee000b40, - ARMI_VNMLS_D = 0xee100b00, - ARMI_VDIV_D = 0xee800b00, - - ARMI_VABS_D = 0xeeb00bc0, - ARMI_VNEG_D = 0xeeb10b40, - ARMI_VSQRT_D = 0xeeb10bc0, - - ARMI_VCMP_D = 0xeeb40b40, - ARMI_VCMPZ_D = 0xeeb50b40, - - ARMI_VMRS = 0xeef1fa10, - - ARMI_VCVT_S32_F32 = 0xeebd0ac0, - ARMI_VCVT_S32_F64 = 0xeebd0bc0, - ARMI_VCVT_U32_F32 = 0xeebc0ac0, - ARMI_VCVT_U32_F64 = 0xeebc0bc0, - ARMI_VCVTR_S32_F32 = 0xeebd0a40, - ARMI_VCVTR_S32_F64 = 0xeebd0b40, - ARMI_VCVTR_U32_F32 = 0xeebc0a40, - ARMI_VCVTR_U32_F64 = 0xeebc0b40, - ARMI_VCVT_F32_S32 = 0xeeb80ac0, - ARMI_VCVT_F64_S32 = 0xeeb80bc0, - ARMI_VCVT_F32_U32 = 0xeeb80a40, - ARMI_VCVT_F64_U32 = 0xeeb80b40, - ARMI_VCVT_F32_F64 = 0xeeb70bc0, - ARMI_VCVT_F64_F32 = 0xeeb70ac0, - - ARMI_VLDR_S = 0xed100a00, - ARMI_VLDR_D = 0xed100b00, - ARMI_VSTR_S = 0xed000a00, - ARMI_VSTR_D = 0xed000b00, -} ARMIns; - -typedef enum ARMShift { - ARMSH_LSL, ARMSH_LSR, ARMSH_ASR, ARMSH_ROR -} ARMShift; - -/* ARM condition codes. */ -typedef enum ARMCC { - CC_EQ, CC_NE, CC_CS, CC_CC, CC_MI, CC_PL, CC_VS, CC_VC, - CC_HI, CC_LS, CC_GE, CC_LT, CC_GT, CC_LE, CC_AL, - CC_HS = CC_CS, CC_LO = CC_CC -} ARMCC; - -#endif diff --git a/deps/luajit/src/lj_target_mips.h b/deps/luajit/src/lj_target_mips.h deleted file mode 100644 index 0ab140bf..00000000 --- a/deps/luajit/src/lj_target_mips.h +++ /dev/null @@ -1,257 +0,0 @@ -/* -** Definitions for MIPS CPUs. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#ifndef _LJ_TARGET_MIPS_H -#define _LJ_TARGET_MIPS_H - -/* -- Registers IDs ------------------------------------------------------- */ - -#define GPRDEF(_) \ - _(R0) _(R1) _(R2) _(R3) _(R4) _(R5) _(R6) _(R7) \ - _(R8) _(R9) _(R10) _(R11) _(R12) _(R13) _(R14) _(R15) \ - _(R16) _(R17) _(R18) _(R19) _(R20) _(R21) _(R22) _(R23) \ - _(R24) _(R25) _(SYS1) _(SYS2) _(R28) _(SP) _(R30) _(RA) -#define FPRDEF(_) \ - _(F0) _(F1) _(F2) _(F3) _(F4) _(F5) _(F6) _(F7) \ - _(F8) _(F9) _(F10) _(F11) _(F12) _(F13) _(F14) _(F15) \ - _(F16) _(F17) _(F18) _(F19) _(F20) _(F21) _(F22) _(F23) \ - _(F24) _(F25) _(F26) _(F27) _(F28) _(F29) _(F30) _(F31) -#define VRIDDEF(_) - -#define RIDENUM(name) RID_##name, - -enum { - GPRDEF(RIDENUM) /* General-purpose registers (GPRs). */ - FPRDEF(RIDENUM) /* Floating-point registers (FPRs). */ - RID_MAX, - RID_ZERO = RID_R0, - RID_TMP = RID_RA, - - /* Calling conventions. */ - RID_RET = RID_R2, -#if LJ_LE - RID_RETHI = RID_R3, - RID_RETLO = RID_R2, -#else - RID_RETHI = RID_R2, - RID_RETLO = RID_R3, -#endif - RID_FPRET = RID_F0, - RID_CFUNCADDR = RID_R25, - - /* These definitions must match with the *.dasc file(s): */ - RID_BASE = RID_R16, /* Interpreter BASE. */ - RID_LPC = RID_R18, /* Interpreter PC. */ - RID_DISPATCH = RID_R19, /* Interpreter DISPATCH table. */ - RID_LREG = RID_R20, /* Interpreter L. */ - RID_JGL = RID_R30, /* On-trace: global_State + 32768. */ - - /* Register ranges [min, max) and number of registers. */ - RID_MIN_GPR = RID_R0, - RID_MAX_GPR = RID_RA+1, - RID_MIN_FPR = RID_F0, - RID_MAX_FPR = RID_F31+1, - RID_NUM_GPR = RID_MAX_GPR - RID_MIN_GPR, - RID_NUM_FPR = RID_MAX_FPR - RID_MIN_FPR /* Only even regs are used. */ -}; - -#define RID_NUM_KREF RID_NUM_GPR -#define RID_MIN_KREF RID_R0 - -/* -- Register sets ------------------------------------------------------- */ - -/* Make use of all registers, except ZERO, TMP, SP, SYS1, SYS2 and JGL. */ -#define RSET_FIXED \ - (RID2RSET(RID_ZERO)|RID2RSET(RID_TMP)|RID2RSET(RID_SP)|\ - RID2RSET(RID_SYS1)|RID2RSET(RID_SYS2)|RID2RSET(RID_JGL)) -#define RSET_GPR (RSET_RANGE(RID_MIN_GPR, RID_MAX_GPR) - RSET_FIXED) -#define RSET_FPR \ - (RID2RSET(RID_F0)|RID2RSET(RID_F2)|RID2RSET(RID_F4)|RID2RSET(RID_F6)|\ - RID2RSET(RID_F8)|RID2RSET(RID_F10)|RID2RSET(RID_F12)|RID2RSET(RID_F14)|\ - RID2RSET(RID_F16)|RID2RSET(RID_F18)|RID2RSET(RID_F20)|RID2RSET(RID_F22)|\ - RID2RSET(RID_F24)|RID2RSET(RID_F26)|RID2RSET(RID_F28)|RID2RSET(RID_F30)) -#define RSET_ALL (RSET_GPR|RSET_FPR) -#define RSET_INIT RSET_ALL - -#define RSET_SCRATCH_GPR \ - (RSET_RANGE(RID_R1, RID_R15+1)|\ - RID2RSET(RID_R24)|RID2RSET(RID_R25)|RID2RSET(RID_R28)) -#define RSET_SCRATCH_FPR \ - (RID2RSET(RID_F0)|RID2RSET(RID_F2)|RID2RSET(RID_F4)|RID2RSET(RID_F6)|\ - RID2RSET(RID_F8)|RID2RSET(RID_F10)|RID2RSET(RID_F12)|RID2RSET(RID_F14)|\ - RID2RSET(RID_F16)|RID2RSET(RID_F18)) -#define RSET_SCRATCH (RSET_SCRATCH_GPR|RSET_SCRATCH_FPR) -#define REGARG_FIRSTGPR RID_R4 -#define REGARG_LASTGPR RID_R7 -#define REGARG_NUMGPR 4 -#define REGARG_FIRSTFPR RID_F12 -#define REGARG_LASTFPR RID_F14 -#define REGARG_NUMFPR 2 - -/* -- Spill slots --------------------------------------------------------- */ - -/* Spill slots are 32 bit wide. An even/odd pair is used for FPRs. -** -** SPS_FIXED: Available fixed spill slots in interpreter frame. -** This definition must match with the *.dasc file(s). -** -** SPS_FIRST: First spill slot for general use. -*/ -#define SPS_FIXED 5 -#define SPS_FIRST 4 - -#define SPOFS_TMP 0 - -#define sps_scale(slot) (4 * (int32_t)(slot)) -#define sps_align(slot) (((slot) - SPS_FIXED + 1) & ~1) - -/* -- Exit state ---------------------------------------------------------- */ - -/* This definition must match with the *.dasc file(s). */ -typedef struct { - lua_Number fpr[RID_NUM_FPR]; /* Floating-point registers. */ - int32_t gpr[RID_NUM_GPR]; /* General-purpose registers. */ - int32_t spill[256]; /* Spill slots. */ -} ExitState; - -/* Highest exit + 1 indicates stack check. */ -#define EXITSTATE_CHECKEXIT 1 - -/* Return the address of a per-trace exit stub. */ -static LJ_AINLINE uint32_t *exitstub_trace_addr_(uint32_t *p) -{ - while (*p == 0x00000000) p++; /* Skip MIPSI_NOP. */ - return p; -} -/* Avoid dependence on lj_jit.h if only including lj_target.h. */ -#define exitstub_trace_addr(T, exitno) \ - exitstub_trace_addr_((MCode *)((char *)(T)->mcode + (T)->szmcode)) - -/* -- Instructions -------------------------------------------------------- */ - -/* Instruction fields. */ -#define MIPSF_S(r) ((r) << 21) -#define MIPSF_T(r) ((r) << 16) -#define MIPSF_D(r) ((r) << 11) -#define MIPSF_R(r) ((r) << 21) -#define MIPSF_H(r) ((r) << 16) -#define MIPSF_G(r) ((r) << 11) -#define MIPSF_F(r) ((r) << 6) -#define MIPSF_A(n) ((n) << 6) -#define MIPSF_M(n) ((n) << 11) - -typedef enum MIPSIns { - /* Integer instructions. */ - MIPSI_MOVE = 0x00000021, - MIPSI_NOP = 0x00000000, - - MIPSI_LI = 0x24000000, - MIPSI_LU = 0x34000000, - MIPSI_LUI = 0x3c000000, - - MIPSI_ADDIU = 0x24000000, - MIPSI_ANDI = 0x30000000, - MIPSI_ORI = 0x34000000, - MIPSI_XORI = 0x38000000, - MIPSI_SLTI = 0x28000000, - MIPSI_SLTIU = 0x2c000000, - - MIPSI_ADDU = 0x00000021, - MIPSI_SUBU = 0x00000023, - MIPSI_MUL = 0x70000002, - MIPSI_AND = 0x00000024, - MIPSI_OR = 0x00000025, - MIPSI_XOR = 0x00000026, - MIPSI_NOR = 0x00000027, - MIPSI_SLT = 0x0000002a, - MIPSI_SLTU = 0x0000002b, - MIPSI_MOVZ = 0x0000000a, - MIPSI_MOVN = 0x0000000b, - - MIPSI_SLL = 0x00000000, - MIPSI_SRL = 0x00000002, - MIPSI_SRA = 0x00000003, - MIPSI_ROTR = 0x00200002, /* MIPS32R2 */ - MIPSI_SLLV = 0x00000004, - MIPSI_SRLV = 0x00000006, - MIPSI_SRAV = 0x00000007, - MIPSI_ROTRV = 0x00000046, /* MIPS32R2 */ - - MIPSI_SEB = 0x7c000420, /* MIPS32R2 */ - MIPSI_SEH = 0x7c000620, /* MIPS32R2 */ - MIPSI_WSBH = 0x7c0000a0, /* MIPS32R2 */ - - MIPSI_B = 0x10000000, - MIPSI_J = 0x08000000, - MIPSI_JAL = 0x0c000000, - MIPSI_JR = 0x00000008, - MIPSI_JALR = 0x0000f809, - - MIPSI_BEQ = 0x10000000, - MIPSI_BNE = 0x14000000, - MIPSI_BLEZ = 0x18000000, - MIPSI_BGTZ = 0x1c000000, - MIPSI_BLTZ = 0x04000000, - MIPSI_BGEZ = 0x04010000, - - /* Load/store instructions. */ - MIPSI_LW = 0x8c000000, - MIPSI_SW = 0xac000000, - MIPSI_LB = 0x80000000, - MIPSI_SB = 0xa0000000, - MIPSI_LH = 0x84000000, - MIPSI_SH = 0xa4000000, - MIPSI_LBU = 0x90000000, - MIPSI_LHU = 0x94000000, - MIPSI_LWC1 = 0xc4000000, - MIPSI_SWC1 = 0xe4000000, - MIPSI_LDC1 = 0xd4000000, - MIPSI_SDC1 = 0xf4000000, - - /* FP instructions. */ - MIPSI_MOV_S = 0x46000006, - MIPSI_MOV_D = 0x46200006, - MIPSI_MOVT_D = 0x46210011, - MIPSI_MOVF_D = 0x46200011, - - MIPSI_ABS_D = 0x46200005, - MIPSI_NEG_D = 0x46200007, - - MIPSI_ADD_D = 0x46200000, - MIPSI_SUB_D = 0x46200001, - MIPSI_MUL_D = 0x46200002, - MIPSI_DIV_D = 0x46200003, - MIPSI_SQRT_D = 0x46200004, - - MIPSI_ADD_S = 0x46000000, - MIPSI_SUB_S = 0x46000001, - - MIPSI_CVT_D_S = 0x46000021, - MIPSI_CVT_W_S = 0x46000024, - MIPSI_CVT_S_D = 0x46200020, - MIPSI_CVT_W_D = 0x46200024, - MIPSI_CVT_S_W = 0x46800020, - MIPSI_CVT_D_W = 0x46800021, - - MIPSI_TRUNC_W_S = 0x4600000d, - MIPSI_TRUNC_W_D = 0x4620000d, - MIPSI_FLOOR_W_S = 0x4600000f, - MIPSI_FLOOR_W_D = 0x4620000f, - - MIPSI_MFC1 = 0x44000000, - MIPSI_MTC1 = 0x44800000, - - MIPSI_BC1F = 0x45000000, - MIPSI_BC1T = 0x45010000, - - MIPSI_C_EQ_D = 0x46200032, - MIPSI_C_OLT_D = 0x46200034, - MIPSI_C_ULT_D = 0x46200035, - MIPSI_C_OLE_D = 0x46200036, - MIPSI_C_ULE_D = 0x46200037, - -} MIPSIns; - -#endif diff --git a/deps/luajit/src/lj_target_ppc.h b/deps/luajit/src/lj_target_ppc.h deleted file mode 100644 index 2caeeb04..00000000 --- a/deps/luajit/src/lj_target_ppc.h +++ /dev/null @@ -1,280 +0,0 @@ -/* -** Definitions for PPC CPUs. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#ifndef _LJ_TARGET_PPC_H -#define _LJ_TARGET_PPC_H - -/* -- Registers IDs ------------------------------------------------------- */ - -#define GPRDEF(_) \ - _(R0) _(SP) _(SYS1) _(R3) _(R4) _(R5) _(R6) _(R7) \ - _(R8) _(R9) _(R10) _(R11) _(R12) _(SYS2) _(R14) _(R15) \ - _(R16) _(R17) _(R18) _(R19) _(R20) _(R21) _(R22) _(R23) \ - _(R24) _(R25) _(R26) _(R27) _(R28) _(R29) _(R30) _(R31) -#define FPRDEF(_) \ - _(F0) _(F1) _(F2) _(F3) _(F4) _(F5) _(F6) _(F7) \ - _(F8) _(F9) _(F10) _(F11) _(F12) _(F13) _(F14) _(F15) \ - _(F16) _(F17) _(F18) _(F19) _(F20) _(F21) _(F22) _(F23) \ - _(F24) _(F25) _(F26) _(F27) _(F28) _(F29) _(F30) _(F31) -#define VRIDDEF(_) - -#define RIDENUM(name) RID_##name, - -enum { - GPRDEF(RIDENUM) /* General-purpose registers (GPRs). */ - FPRDEF(RIDENUM) /* Floating-point registers (FPRs). */ - RID_MAX, - RID_TMP = RID_R0, - - /* Calling conventions. */ - RID_RET = RID_R3, - RID_RETHI = RID_R3, - RID_RETLO = RID_R4, - RID_FPRET = RID_F1, - - /* These definitions must match with the *.dasc file(s): */ - RID_BASE = RID_R14, /* Interpreter BASE. */ - RID_LPC = RID_R16, /* Interpreter PC. */ - RID_DISPATCH = RID_R17, /* Interpreter DISPATCH table. */ - RID_LREG = RID_R18, /* Interpreter L. */ - RID_JGL = RID_R31, /* On-trace: global_State + 32768. */ - - /* Register ranges [min, max) and number of registers. */ - RID_MIN_GPR = RID_R0, - RID_MAX_GPR = RID_R31+1, - RID_MIN_FPR = RID_F0, - RID_MAX_FPR = RID_F31+1, - RID_NUM_GPR = RID_MAX_GPR - RID_MIN_GPR, - RID_NUM_FPR = RID_MAX_FPR - RID_MIN_FPR -}; - -#define RID_NUM_KREF RID_NUM_GPR -#define RID_MIN_KREF RID_R0 - -/* -- Register sets ------------------------------------------------------- */ - -/* Make use of all registers, except TMP, SP, SYS1, SYS2 and JGL. */ -#define RSET_FIXED \ - (RID2RSET(RID_TMP)|RID2RSET(RID_SP)|RID2RSET(RID_SYS1)|\ - RID2RSET(RID_SYS2)|RID2RSET(RID_JGL)) -#define RSET_GPR (RSET_RANGE(RID_MIN_GPR, RID_MAX_GPR) - RSET_FIXED) -#define RSET_FPR RSET_RANGE(RID_MIN_FPR, RID_MAX_FPR) -#define RSET_ALL (RSET_GPR|RSET_FPR) -#define RSET_INIT RSET_ALL - -#define RSET_SCRATCH_GPR (RSET_RANGE(RID_R3, RID_R12+1)) -#define RSET_SCRATCH_FPR (RSET_RANGE(RID_F0, RID_F13+1)) -#define RSET_SCRATCH (RSET_SCRATCH_GPR|RSET_SCRATCH_FPR) -#define REGARG_FIRSTGPR RID_R3 -#define REGARG_LASTGPR RID_R10 -#define REGARG_NUMGPR 8 -#define REGARG_FIRSTFPR RID_F1 -#define REGARG_LASTFPR RID_F8 -#define REGARG_NUMFPR 8 - -/* -- Spill slots --------------------------------------------------------- */ - -/* Spill slots are 32 bit wide. An even/odd pair is used for FPRs. -** -** SPS_FIXED: Available fixed spill slots in interpreter frame. -** This definition must match with the *.dasc file(s). -** -** SPS_FIRST: First spill slot for general use. -** [sp+12] tmplo word \ -** [sp+ 8] tmphi word / tmp dword, parameter area for callee -** [sp+ 4] tmpw, LR of callee -** [sp+ 0] stack chain -*/ -#define SPS_FIXED 7 -#define SPS_FIRST 4 - -/* Stack offsets for temporary slots. Used for FP<->int conversions etc. */ -#define SPOFS_TMPW 4 -#define SPOFS_TMP 8 -#define SPOFS_TMPHI 8 -#define SPOFS_TMPLO 12 - -#define sps_scale(slot) (4 * (int32_t)(slot)) -#define sps_align(slot) (((slot) - SPS_FIXED + 3) & ~3) - -/* -- Exit state ---------------------------------------------------------- */ - -/* This definition must match with the *.dasc file(s). */ -typedef struct { - lua_Number fpr[RID_NUM_FPR]; /* Floating-point registers. */ - int32_t gpr[RID_NUM_GPR]; /* General-purpose registers. */ - int32_t spill[256]; /* Spill slots. */ -} ExitState; - -/* Highest exit + 1 indicates stack check. */ -#define EXITSTATE_CHECKEXIT 1 - -/* Return the address of a per-trace exit stub. */ -static LJ_AINLINE uint32_t *exitstub_trace_addr_(uint32_t *p, uint32_t exitno) -{ - while (*p == 0x60000000) p++; /* Skip PPCI_NOP. */ - return p + 3 + exitno; -} -/* Avoid dependence on lj_jit.h if only including lj_target.h. */ -#define exitstub_trace_addr(T, exitno) \ - exitstub_trace_addr_((MCode *)((char *)(T)->mcode + (T)->szmcode), (exitno)) - -/* -- Instructions -------------------------------------------------------- */ - -/* Instruction fields. */ -#define PPCF_CC(cc) ((((cc) & 3) << 16) | (((cc) & 4) << 22)) -#define PPCF_T(r) ((r) << 21) -#define PPCF_A(r) ((r) << 16) -#define PPCF_B(r) ((r) << 11) -#define PPCF_C(r) ((r) << 6) -#define PPCF_MB(n) ((n) << 6) -#define PPCF_ME(n) ((n) << 1) -#define PPCF_Y 0x00200000 -#define PPCF_DOT 0x00000001 - -typedef enum PPCIns { - /* Integer instructions. */ - PPCI_MR = 0x7c000378, - PPCI_NOP = 0x60000000, - - PPCI_LI = 0x38000000, - PPCI_LIS = 0x3c000000, - - PPCI_ADD = 0x7c000214, - PPCI_ADDC = 0x7c000014, - PPCI_ADDO = 0x7c000614, - PPCI_ADDE = 0x7c000114, - PPCI_ADDZE = 0x7c000194, - PPCI_ADDME = 0x7c0001d4, - PPCI_ADDI = 0x38000000, - PPCI_ADDIS = 0x3c000000, - PPCI_ADDIC = 0x30000000, - PPCI_ADDICDOT = 0x34000000, - - PPCI_SUBF = 0x7c000050, - PPCI_SUBFC = 0x7c000010, - PPCI_SUBFO = 0x7c000450, - PPCI_SUBFE = 0x7c000110, - PPCI_SUBFZE = 0x7c000190, - PPCI_SUBFME = 0x7c0001d0, - PPCI_SUBFIC = 0x20000000, - - PPCI_NEG = 0x7c0000d0, - - PPCI_AND = 0x7c000038, - PPCI_ANDC = 0x7c000078, - PPCI_NAND = 0x7c0003b8, - PPCI_ANDIDOT = 0x70000000, - PPCI_ANDISDOT = 0x74000000, - - PPCI_OR = 0x7c000378, - PPCI_NOR = 0x7c0000f8, - PPCI_ORI = 0x60000000, - PPCI_ORIS = 0x64000000, - - PPCI_XOR = 0x7c000278, - PPCI_EQV = 0x7c000238, - PPCI_XORI = 0x68000000, - PPCI_XORIS = 0x6c000000, - - PPCI_CMPW = 0x7c000000, - PPCI_CMPLW = 0x7c000040, - PPCI_CMPWI = 0x2c000000, - PPCI_CMPLWI = 0x28000000, - - PPCI_MULLW = 0x7c0001d6, - PPCI_MULLI = 0x1c000000, - PPCI_MULLWO = 0x7c0005d6, - - PPCI_EXTSB = 0x7c000774, - PPCI_EXTSH = 0x7c000734, - - PPCI_SLW = 0x7c000030, - PPCI_SRW = 0x7c000430, - PPCI_SRAW = 0x7c000630, - PPCI_SRAWI = 0x7c000670, - - PPCI_RLWNM = 0x5c000000, - PPCI_RLWINM = 0x54000000, - PPCI_RLWIMI = 0x50000000, - - PPCI_B = 0x48000000, - PPCI_BL = 0x48000001, - PPCI_BC = 0x40800000, - PPCI_BCL = 0x40800001, - PPCI_BCTR = 0x4e800420, - PPCI_BCTRL = 0x4e800421, - - PPCI_CRANDC = 0x4c000102, - PPCI_CRXOR = 0x4c000182, - PPCI_CRAND = 0x4c000202, - PPCI_CREQV = 0x4c000242, - PPCI_CRORC = 0x4c000342, - PPCI_CROR = 0x4c000382, - - PPCI_MFLR = 0x7c0802a6, - PPCI_MTCTR = 0x7c0903a6, - - PPCI_MCRXR = 0x7c000400, - - /* Load/store instructions. */ - PPCI_LWZ = 0x80000000, - PPCI_LBZ = 0x88000000, - PPCI_STW = 0x90000000, - PPCI_STB = 0x98000000, - PPCI_LHZ = 0xa0000000, - PPCI_LHA = 0xa8000000, - PPCI_STH = 0xb0000000, - - PPCI_STWU = 0x94000000, - - PPCI_LFS = 0xc0000000, - PPCI_LFD = 0xc8000000, - PPCI_STFS = 0xd0000000, - PPCI_STFD = 0xd8000000, - - PPCI_LWZX = 0x7c00002e, - PPCI_LBZX = 0x7c0000ae, - PPCI_STWX = 0x7c00012e, - PPCI_STBX = 0x7c0001ae, - PPCI_LHZX = 0x7c00022e, - PPCI_LHAX = 0x7c0002ae, - PPCI_STHX = 0x7c00032e, - - PPCI_LWBRX = 0x7c00042c, - PPCI_STWBRX = 0x7c00052c, - - PPCI_LFSX = 0x7c00042e, - PPCI_LFDX = 0x7c0004ae, - PPCI_STFSX = 0x7c00052e, - PPCI_STFDX = 0x7c0005ae, - - /* FP instructions. */ - PPCI_FMR = 0xfc000090, - PPCI_FNEG = 0xfc000050, - PPCI_FABS = 0xfc000210, - - PPCI_FRSP = 0xfc000018, - PPCI_FCTIWZ = 0xfc00001e, - - PPCI_FADD = 0xfc00002a, - PPCI_FSUB = 0xfc000028, - PPCI_FMUL = 0xfc000032, - PPCI_FDIV = 0xfc000024, - PPCI_FSQRT = 0xfc00002c, - - PPCI_FMADD = 0xfc00003a, - PPCI_FMSUB = 0xfc000038, - PPCI_FNMSUB = 0xfc00003c, - - PPCI_FCMPU = 0xfc000000, - PPCI_FSEL = 0xfc00002e, -} PPCIns; - -typedef enum PPCCC { - CC_GE, CC_LE, CC_NE, CC_NS, CC_LT, CC_GT, CC_EQ, CC_SO -} PPCCC; - -#endif diff --git a/deps/luajit/src/lj_target_x86.h b/deps/luajit/src/lj_target_x86.h deleted file mode 100644 index d12a1b87..00000000 --- a/deps/luajit/src/lj_target_x86.h +++ /dev/null @@ -1,342 +0,0 @@ -/* -** Definitions for x86 and x64 CPUs. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#ifndef _LJ_TARGET_X86_H -#define _LJ_TARGET_X86_H - -/* -- Registers IDs ------------------------------------------------------- */ - -#if LJ_64 -#define GPRDEF(_) \ - _(EAX) _(ECX) _(EDX) _(EBX) _(ESP) _(EBP) _(ESI) _(EDI) \ - _(R8D) _(R9D) _(R10D) _(R11D) _(R12D) _(R13D) _(R14D) _(R15D) -#define FPRDEF(_) \ - _(XMM0) _(XMM1) _(XMM2) _(XMM3) _(XMM4) _(XMM5) _(XMM6) _(XMM7) \ - _(XMM8) _(XMM9) _(XMM10) _(XMM11) _(XMM12) _(XMM13) _(XMM14) _(XMM15) -#else -#define GPRDEF(_) \ - _(EAX) _(ECX) _(EDX) _(EBX) _(ESP) _(EBP) _(ESI) _(EDI) -#define FPRDEF(_) \ - _(XMM0) _(XMM1) _(XMM2) _(XMM3) _(XMM4) _(XMM5) _(XMM6) _(XMM7) -#endif -#define VRIDDEF(_) \ - _(MRM) - -#define RIDENUM(name) RID_##name, - -enum { - GPRDEF(RIDENUM) /* General-purpose registers (GPRs). */ - FPRDEF(RIDENUM) /* Floating-point registers (FPRs). */ - RID_MAX, - RID_MRM = RID_MAX, /* Pseudo-id for ModRM operand. */ - - /* Calling conventions. */ - RID_RET = RID_EAX, -#if LJ_64 - RID_FPRET = RID_XMM0, -#else - RID_RETLO = RID_EAX, - RID_RETHI = RID_EDX, -#endif - - /* These definitions must match with the *.dasc file(s): */ - RID_BASE = RID_EDX, /* Interpreter BASE. */ -#if LJ_64 && !LJ_ABI_WIN - RID_LPC = RID_EBX, /* Interpreter PC. */ - RID_DISPATCH = RID_R14D, /* Interpreter DISPATCH table. */ -#else - RID_LPC = RID_ESI, /* Interpreter PC. */ - RID_DISPATCH = RID_EBX, /* Interpreter DISPATCH table. */ -#endif - - /* Register ranges [min, max) and number of registers. */ - RID_MIN_GPR = RID_EAX, - RID_MIN_FPR = RID_XMM0, - RID_MAX_GPR = RID_MIN_FPR, - RID_MAX_FPR = RID_MAX, - RID_NUM_GPR = RID_MAX_GPR - RID_MIN_GPR, - RID_NUM_FPR = RID_MAX_FPR - RID_MIN_FPR, -}; - -/* -- Register sets ------------------------------------------------------- */ - -/* Make use of all registers, except the stack pointer. */ -#define RSET_GPR (RSET_RANGE(RID_MIN_GPR, RID_MAX_GPR)-RID2RSET(RID_ESP)) -#define RSET_FPR (RSET_RANGE(RID_MIN_FPR, RID_MAX_FPR)) -#define RSET_ALL (RSET_GPR|RSET_FPR) -#define RSET_INIT RSET_ALL - -#if LJ_64 -/* Note: this requires the use of FORCE_REX! */ -#define RSET_GPR8 RSET_GPR -#else -#define RSET_GPR8 (RSET_RANGE(RID_EAX, RID_EBX+1)) -#endif - -/* ABI-specific register sets. */ -#define RSET_ACD (RID2RSET(RID_EAX)|RID2RSET(RID_ECX)|RID2RSET(RID_EDX)) -#if LJ_64 -#if LJ_ABI_WIN -/* Windows x64 ABI. */ -#define RSET_SCRATCH \ - (RSET_ACD|RSET_RANGE(RID_R8D, RID_R11D+1)|RSET_RANGE(RID_XMM0, RID_XMM5+1)) -#define REGARG_GPRS \ - (RID_ECX|((RID_EDX|((RID_R8D|(RID_R9D<<5))<<5))<<5)) -#define REGARG_NUMGPR 4 -#define REGARG_NUMFPR 4 -#define REGARG_FIRSTFPR RID_XMM0 -#define REGARG_LASTFPR RID_XMM3 -#define STACKARG_OFS (4*8) -#else -/* The rest of the civilized x64 world has a common ABI. */ -#define RSET_SCRATCH \ - (RSET_ACD|RSET_RANGE(RID_ESI, RID_R11D+1)|RSET_FPR) -#define REGARG_GPRS \ - (RID_EDI|((RID_ESI|((RID_EDX|((RID_ECX|((RID_R8D|(RID_R9D \ - <<5))<<5))<<5))<<5))<<5)) -#define REGARG_NUMGPR 6 -#define REGARG_NUMFPR 8 -#define REGARG_FIRSTFPR RID_XMM0 -#define REGARG_LASTFPR RID_XMM7 -#define STACKARG_OFS 0 -#endif -#else -/* Common x86 ABI. */ -#define RSET_SCRATCH (RSET_ACD|RSET_FPR) -#define REGARG_GPRS (RID_ECX|(RID_EDX<<5)) /* Fastcall only. */ -#define REGARG_NUMGPR 2 /* Fastcall only. */ -#define REGARG_NUMFPR 0 -#define STACKARG_OFS 0 -#endif - -#if LJ_64 -/* Prefer the low 8 regs of each type to reduce REX prefixes. */ -#undef rset_picktop -#define rset_picktop(rs) (lj_fls(lj_bswap(rs)) ^ 0x18) -#endif - -/* -- Spill slots --------------------------------------------------------- */ - -/* Spill slots are 32 bit wide. An even/odd pair is used for FPRs. -** -** SPS_FIXED: Available fixed spill slots in interpreter frame. -** This definition must match with the *.dasc file(s). -** -** SPS_FIRST: First spill slot for general use. Reserve min. two 32 bit slots. -*/ -#if LJ_64 -#if LJ_ABI_WIN -#define SPS_FIXED (4*2) -#define SPS_FIRST (4*2) /* Don't use callee register save area. */ -#else -#define SPS_FIXED 4 -#define SPS_FIRST 2 -#endif -#else -#define SPS_FIXED 6 -#define SPS_FIRST 2 -#endif - -#define SPOFS_TMP 0 - -#define sps_scale(slot) (4 * (int32_t)(slot)) -#define sps_align(slot) (((slot) - SPS_FIXED + 3) & ~3) - -/* -- Exit state ---------------------------------------------------------- */ - -/* This definition must match with the *.dasc file(s). */ -typedef struct { - lua_Number fpr[RID_NUM_FPR]; /* Floating-point registers. */ - intptr_t gpr[RID_NUM_GPR]; /* General-purpose registers. */ - int32_t spill[256]; /* Spill slots. */ -} ExitState; - -/* Limited by the range of a short fwd jump (127): (2+2)*(32-1)-2 = 122. */ -#define EXITSTUB_SPACING (2+2) -#define EXITSTUBS_PER_GROUP 32 - -/* -- x86 ModRM operand encoding ------------------------------------------ */ - -typedef enum { - XM_OFS0 = 0x00, XM_OFS8 = 0x40, XM_OFS32 = 0x80, XM_REG = 0xc0, - XM_SCALE1 = 0x00, XM_SCALE2 = 0x40, XM_SCALE4 = 0x80, XM_SCALE8 = 0xc0, - XM_MASK = 0xc0 -} x86Mode; - -/* Structure to hold variable ModRM operand. */ -typedef struct { - int32_t ofs; /* Offset. */ - uint8_t base; /* Base register or RID_NONE. */ - uint8_t idx; /* Index register or RID_NONE. */ - uint8_t scale; /* Index scale (XM_SCALE1 .. XM_SCALE8). */ -} x86ModRM; - -/* -- Opcodes ------------------------------------------------------------- */ - -/* Macros to construct variable-length x86 opcodes. -(len+1) is in LSB. */ -#define XO_(o) ((uint32_t)(0x0000fe + (0x##o<<24))) -#define XO_FPU(a,b) ((uint32_t)(0x00fd + (0x##a<<16)+(0x##b<<24))) -#define XO_0f(o) ((uint32_t)(0x0f00fd + (0x##o<<24))) -#define XO_66(o) ((uint32_t)(0x6600fd + (0x##o<<24))) -#define XO_660f(o) ((uint32_t)(0x0f66fc + (0x##o<<24))) -#define XO_f20f(o) ((uint32_t)(0x0ff2fc + (0x##o<<24))) -#define XO_f30f(o) ((uint32_t)(0x0ff3fc + (0x##o<<24))) - -/* This list of x86 opcodes is not intended to be complete. Opcodes are only -** included when needed. Take a look at DynASM or jit.dis_x86 to see the -** whole mess. -*/ -typedef enum { - /* Fixed length opcodes. XI_* prefix. */ - XI_NOP = 0x90, - XI_XCHGa = 0x90, - XI_CALL = 0xe8, - XI_JMP = 0xe9, - XI_JMPs = 0xeb, - XI_PUSH = 0x50, /* Really 50+r. */ - XI_JCCs = 0x70, /* Really 7x. */ - XI_JCCn = 0x80, /* Really 0f8x. */ - XI_LEA = 0x8d, - XI_MOVrib = 0xb0, /* Really b0+r. */ - XI_MOVri = 0xb8, /* Really b8+r. */ - XI_ARITHib = 0x80, - XI_ARITHi = 0x81, - XI_ARITHi8 = 0x83, - XI_PUSHi8 = 0x6a, - XI_TESTb = 0x84, - XI_TEST = 0x85, - XI_MOVmi = 0xc7, - XI_GROUP5 = 0xff, - - /* Note: little-endian byte-order! */ - XI_FLDZ = 0xeed9, - XI_FLD1 = 0xe8d9, - XI_FLDLG2 = 0xecd9, - XI_FLDLN2 = 0xedd9, - XI_FDUP = 0xc0d9, /* Really fld st0. */ - XI_FPOP = 0xd8dd, /* Really fstp st0. */ - XI_FPOP1 = 0xd9dd, /* Really fstp st1. */ - XI_FRNDINT = 0xfcd9, - XI_FSIN = 0xfed9, - XI_FCOS = 0xffd9, - XI_FPTAN = 0xf2d9, - XI_FPATAN = 0xf3d9, - XI_FSCALE = 0xfdd9, - XI_FYL2X = 0xf1d9, - - /* Variable-length opcodes. XO_* prefix. */ - XO_MOV = XO_(8b), - XO_MOVto = XO_(89), - XO_MOVtow = XO_66(89), - XO_MOVtob = XO_(88), - XO_MOVmi = XO_(c7), - XO_MOVmib = XO_(c6), - XO_LEA = XO_(8d), - XO_ARITHib = XO_(80), - XO_ARITHi = XO_(81), - XO_ARITHi8 = XO_(83), - XO_ARITHiw8 = XO_66(83), - XO_SHIFTi = XO_(c1), - XO_SHIFT1 = XO_(d1), - XO_SHIFTcl = XO_(d3), - XO_IMUL = XO_0f(af), - XO_IMULi = XO_(69), - XO_IMULi8 = XO_(6b), - XO_CMP = XO_(3b), - XO_TESTb = XO_(84), - XO_TEST = XO_(85), - XO_GROUP3b = XO_(f6), - XO_GROUP3 = XO_(f7), - XO_GROUP5b = XO_(fe), - XO_GROUP5 = XO_(ff), - XO_MOVZXb = XO_0f(b6), - XO_MOVZXw = XO_0f(b7), - XO_MOVSXb = XO_0f(be), - XO_MOVSXw = XO_0f(bf), - XO_MOVSXd = XO_(63), - XO_BSWAP = XO_0f(c8), - XO_CMOV = XO_0f(40), - - XO_MOVSD = XO_f20f(10), - XO_MOVSDto = XO_f20f(11), - XO_MOVSS = XO_f30f(10), - XO_MOVSSto = XO_f30f(11), - XO_MOVLPD = XO_660f(12), - XO_MOVAPS = XO_0f(28), - XO_XORPS = XO_0f(57), - XO_ANDPS = XO_0f(54), - XO_ADDSD = XO_f20f(58), - XO_SUBSD = XO_f20f(5c), - XO_MULSD = XO_f20f(59), - XO_DIVSD = XO_f20f(5e), - XO_SQRTSD = XO_f20f(51), - XO_MINSD = XO_f20f(5d), - XO_MAXSD = XO_f20f(5f), - XO_ROUNDSD = 0x0b3a0ffc, /* Really 66 0f 3a 0b. See asm_fpmath. */ - XO_UCOMISD = XO_660f(2e), - XO_CVTSI2SD = XO_f20f(2a), - XO_CVTSD2SI = XO_f20f(2d), - XO_CVTTSD2SI= XO_f20f(2c), - XO_CVTSI2SS = XO_f30f(2a), - XO_CVTSS2SI = XO_f30f(2d), - XO_CVTTSS2SI= XO_f30f(2c), - XO_CVTSS2SD = XO_f30f(5a), - XO_CVTSD2SS = XO_f20f(5a), - XO_ADDSS = XO_f30f(58), - XO_MOVD = XO_660f(6e), - XO_MOVDto = XO_660f(7e), - - XO_FLDd = XO_(d9), XOg_FLDd = 0, - XO_FLDq = XO_(dd), XOg_FLDq = 0, - XO_FILDd = XO_(db), XOg_FILDd = 0, - XO_FILDq = XO_(df), XOg_FILDq = 5, - XO_FSTPd = XO_(d9), XOg_FSTPd = 3, - XO_FSTPq = XO_(dd), XOg_FSTPq = 3, - XO_FISTPq = XO_(df), XOg_FISTPq = 7, - XO_FISTTPq = XO_(dd), XOg_FISTTPq = 1, - XO_FADDq = XO_(dc), XOg_FADDq = 0, - XO_FLDCW = XO_(d9), XOg_FLDCW = 5, - XO_FNSTCW = XO_(d9), XOg_FNSTCW = 7 -} x86Op; - -/* x86 opcode groups. */ -typedef uint32_t x86Group; - -#define XG_(i8, i, g) ((x86Group)(((i8) << 16) + ((i) << 8) + (g))) -#define XG_ARITHi(g) XG_(XI_ARITHi8, XI_ARITHi, g) -#define XG_TOXOi(xg) ((x86Op)(0x000000fe + (((xg)<<16) & 0xff000000))) -#define XG_TOXOi8(xg) ((x86Op)(0x000000fe + (((xg)<<8) & 0xff000000))) - -#define XO_ARITH(a) ((x86Op)(0x030000fe + ((a)<<27))) -#define XO_ARITHw(a) ((x86Op)(0x036600fd + ((a)<<27))) - -typedef enum { - XOg_ADD, XOg_OR, XOg_ADC, XOg_SBB, XOg_AND, XOg_SUB, XOg_XOR, XOg_CMP, - XOg_X_IMUL -} x86Arith; - -typedef enum { - XOg_ROL, XOg_ROR, XOg_RCL, XOg_RCR, XOg_SHL, XOg_SHR, XOg_SAL, XOg_SAR -} x86Shift; - -typedef enum { - XOg_TEST, XOg_TEST_, XOg_NOT, XOg_NEG, XOg_MUL, XOg_IMUL, XOg_DIV, XOg_IDIV -} x86Group3; - -typedef enum { - XOg_INC, XOg_DEC, XOg_CALL, XOg_CALLfar, XOg_JMP, XOg_JMPfar, XOg_PUSH -} x86Group5; - -/* x86 condition codes. */ -typedef enum { - CC_O, CC_NO, CC_B, CC_NB, CC_E, CC_NE, CC_BE, CC_NBE, - CC_S, CC_NS, CC_P, CC_NP, CC_L, CC_NL, CC_LE, CC_NLE, - CC_C = CC_B, CC_NAE = CC_C, CC_NC = CC_NB, CC_AE = CC_NB, - CC_Z = CC_E, CC_NZ = CC_NE, CC_NA = CC_BE, CC_A = CC_NBE, - CC_PE = CC_P, CC_PO = CC_NP, CC_NGE = CC_L, CC_GE = CC_NL, - CC_NG = CC_LE, CC_G = CC_NLE -} x86CC; - -#endif diff --git a/deps/luajit/src/lj_trace.c b/deps/luajit/src/lj_trace.c deleted file mode 100644 index e51ec546..00000000 --- a/deps/luajit/src/lj_trace.c +++ /dev/null @@ -1,816 +0,0 @@ -/* -** Trace management. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#define lj_trace_c -#define LUA_CORE - -#include "lj_obj.h" - -#if LJ_HASJIT - -#include "lj_gc.h" -#include "lj_err.h" -#include "lj_debug.h" -#include "lj_str.h" -#include "lj_frame.h" -#include "lj_state.h" -#include "lj_bc.h" -#include "lj_ir.h" -#include "lj_jit.h" -#include "lj_iropt.h" -#include "lj_mcode.h" -#include "lj_trace.h" -#include "lj_snap.h" -#include "lj_gdbjit.h" -#include "lj_record.h" -#include "lj_asm.h" -#include "lj_dispatch.h" -#include "lj_vm.h" -#include "lj_vmevent.h" -#include "lj_target.h" - -/* -- Error handling ------------------------------------------------------ */ - -/* Synchronous abort with error message. */ -void lj_trace_err(jit_State *J, TraceError e) -{ - setnilV(&J->errinfo); /* No error info. */ - setintV(J->L->top++, (int32_t)e); - lj_err_throw(J->L, LUA_ERRRUN); -} - -/* Synchronous abort with error message and error info. */ -void lj_trace_err_info(jit_State *J, TraceError e) -{ - setintV(J->L->top++, (int32_t)e); - lj_err_throw(J->L, LUA_ERRRUN); -} - -/* -- Trace management ---------------------------------------------------- */ - -/* The current trace is first assembled in J->cur. The variable length -** arrays point to shared, growable buffers (J->irbuf etc.). When trace -** recording ends successfully, the current trace and its data structures -** are copied to a new (compact) GCtrace object. -*/ - -/* Find a free trace number. */ -static TraceNo trace_findfree(jit_State *J) -{ - MSize osz, lim; - if (J->freetrace == 0) - J->freetrace = 1; - for (; J->freetrace < J->sizetrace; J->freetrace++) - if (traceref(J, J->freetrace) == NULL) - return J->freetrace++; - /* Need to grow trace array. */ - lim = (MSize)J->param[JIT_P_maxtrace] + 1; - if (lim < 2) lim = 2; else if (lim > 65535) lim = 65535; - osz = J->sizetrace; - if (osz >= lim) - return 0; /* Too many traces. */ - lj_mem_growvec(J->L, J->trace, J->sizetrace, lim, GCRef); - for (; osz < J->sizetrace; osz++) - setgcrefnull(J->trace[osz]); - return J->freetrace; -} - -#define TRACE_APPENDVEC(field, szfield, tp) \ - T->field = (tp *)p; \ - memcpy(p, J->cur.field, J->cur.szfield*sizeof(tp)); \ - p += J->cur.szfield*sizeof(tp); - -#ifdef LUAJIT_USE_PERFTOOLS -/* -** Create symbol table of JIT-compiled code. For use with Linux perf tools. -** Example usage: -** perf record -f -e cycles luajit test.lua -** perf report -s symbol -** rm perf.data /tmp/perf-*.map -*/ -#include -#include - -static void perftools_addtrace(GCtrace *T) -{ - static FILE *fp; - GCproto *pt = &gcref(T->startpt)->pt; - const BCIns *startpc = mref(T->startpc, const BCIns); - const char *name = proto_chunknamestr(pt); - BCLine lineno; - if (name[0] == '@' || name[0] == '=') - name++; - else - name = "(string)"; - lua_assert(startpc >= proto_bc(pt) && startpc < proto_bc(pt) + pt->sizebc); - lineno = lj_debug_line(pt, proto_bcpos(pt, startpc)); - if (!fp) { - char fname[40]; - sprintf(fname, "/tmp/perf-%d.map", getpid()); - if (!(fp = fopen(fname, "w"))) return; - setlinebuf(fp); - } - fprintf(fp, "%lx %x TRACE_%d::%s:%u\n", - (long)T->mcode, T->szmcode, T->traceno, name, lineno); -} -#endif - -/* Save current trace by copying and compacting it. */ -static void trace_save(jit_State *J) -{ - size_t sztr = ((sizeof(GCtrace)+7)&~7); - size_t szins = (J->cur.nins-J->cur.nk)*sizeof(IRIns); - size_t sz = sztr + szins + - J->cur.nsnap*sizeof(SnapShot) + - J->cur.nsnapmap*sizeof(SnapEntry); - GCtrace *T = lj_mem_newt(J->L, (MSize)sz, GCtrace); - char *p = (char *)T + sztr; - memcpy(T, &J->cur, sizeof(GCtrace)); - setgcrefr(T->nextgc, J2G(J)->gc.root); - setgcrefp(J2G(J)->gc.root, T); - newwhite(J2G(J), T); - T->gct = ~LJ_TTRACE; - T->ir = (IRIns *)p - J->cur.nk; - memcpy(p, J->cur.ir+J->cur.nk, szins); - p += szins; - TRACE_APPENDVEC(snap, nsnap, SnapShot) - TRACE_APPENDVEC(snapmap, nsnapmap, SnapEntry) - J->cur.traceno = 0; - setgcrefp(J->trace[T->traceno], T); - lj_gc_barriertrace(J2G(J), T->traceno); - lj_gdbjit_addtrace(J, T); -#ifdef LUAJIT_USE_PERFTOOLS - perftools_addtrace(T); -#endif -} - -void LJ_FASTCALL lj_trace_free(global_State *g, GCtrace *T) -{ - jit_State *J = G2J(g); - if (T->traceno) { - lj_gdbjit_deltrace(J, T); - if (T->traceno < J->freetrace) - J->freetrace = T->traceno; - setgcrefnull(J->trace[T->traceno]); - } - lj_mem_free(g, T, - ((sizeof(GCtrace)+7)&~7) + (T->nins-T->nk)*sizeof(IRIns) + - T->nsnap*sizeof(SnapShot) + T->nsnapmap*sizeof(SnapEntry)); -} - -/* Re-enable compiling a prototype by unpatching any modified bytecode. */ -void lj_trace_reenableproto(GCproto *pt) -{ - if ((pt->flags & PROTO_ILOOP)) { - BCIns *bc = proto_bc(pt); - BCPos i, sizebc = pt->sizebc;; - pt->flags &= ~PROTO_ILOOP; - if (bc_op(bc[0]) == BC_IFUNCF) - setbc_op(&bc[0], BC_FUNCF); - for (i = 1; i < sizebc; i++) { - BCOp op = bc_op(bc[i]); - if (op == BC_IFORL || op == BC_IITERL || op == BC_ILOOP) - setbc_op(&bc[i], (int)op+(int)BC_LOOP-(int)BC_ILOOP); - } - } -} - -/* Unpatch the bytecode modified by a root trace. */ -static void trace_unpatch(jit_State *J, GCtrace *T) -{ - BCOp op = bc_op(T->startins); - BCIns *pc = mref(T->startpc, BCIns); - UNUSED(J); - if (op == BC_JMP) - return; /* No need to unpatch branches in parent traces (yet). */ - switch (bc_op(*pc)) { - case BC_JFORL: - lua_assert(traceref(J, bc_d(*pc)) == T); - *pc = T->startins; - pc += bc_j(T->startins); - lua_assert(bc_op(*pc) == BC_JFORI); - setbc_op(pc, BC_FORI); - break; - case BC_JITERL: - case BC_JLOOP: - lua_assert(op == BC_ITERL || op == BC_LOOP || bc_isret(op)); - *pc = T->startins; - break; - case BC_JMP: - lua_assert(op == BC_ITERL); - pc += bc_j(*pc)+2; - if (bc_op(*pc) == BC_JITERL) { - lua_assert(traceref(J, bc_d(*pc)) == T); - *pc = T->startins; - } - break; - case BC_JFUNCF: - lua_assert(op == BC_FUNCF); - *pc = T->startins; - break; - default: /* Already unpatched. */ - break; - } -} - -/* Flush a root trace. */ -static void trace_flushroot(jit_State *J, GCtrace *T) -{ - GCproto *pt = &gcref(T->startpt)->pt; - lua_assert(T->root == 0 && pt != NULL); - /* First unpatch any modified bytecode. */ - trace_unpatch(J, T); - /* Unlink root trace from chain anchored in prototype. */ - if (pt->trace == T->traceno) { /* Trace is first in chain. Easy. */ - pt->trace = T->nextroot; - } else if (pt->trace) { /* Otherwise search in chain of root traces. */ - GCtrace *T2 = traceref(J, pt->trace); - if (T2) { - for (; T2->nextroot; T2 = traceref(J, T2->nextroot)) - if (T2->nextroot == T->traceno) { - T2->nextroot = T->nextroot; /* Unlink from chain. */ - break; - } - } - } -} - -/* Flush a trace. Only root traces are considered. */ -void lj_trace_flush(jit_State *J, TraceNo traceno) -{ - if (traceno > 0 && traceno < J->sizetrace) { - GCtrace *T = traceref(J, traceno); - if (T && T->root == 0) - trace_flushroot(J, T); - } -} - -/* Flush all traces associated with a prototype. */ -void lj_trace_flushproto(global_State *g, GCproto *pt) -{ - while (pt->trace != 0) - trace_flushroot(G2J(g), traceref(G2J(g), pt->trace)); -} - -/* Flush all traces. */ -int lj_trace_flushall(lua_State *L) -{ - jit_State *J = L2J(L); - ptrdiff_t i; - if ((J2G(J)->hookmask & HOOK_GC)) - return 1; - for (i = (ptrdiff_t)J->sizetrace-1; i > 0; i--) { - GCtrace *T = traceref(J, i); - if (T) { - if (T->root == 0) - trace_flushroot(J, T); - lj_gdbjit_deltrace(J, T); - T->traceno = 0; - setgcrefnull(J->trace[i]); - } - } - J->cur.traceno = 0; - J->freetrace = 0; - /* Clear penalty cache. */ - memset(J->penalty, 0, sizeof(J->penalty)); - /* Free the whole machine code and invalidate all exit stub groups. */ - lj_mcode_free(J); - memset(J->exitstubgroup, 0, sizeof(J->exitstubgroup)); - lj_vmevent_send(L, TRACE, - setstrV(L, L->top++, lj_str_newlit(L, "flush")); - ); - return 0; -} - -/* Initialize JIT compiler state. */ -void lj_trace_initstate(global_State *g) -{ - jit_State *J = G2J(g); - TValue *tv; - /* Initialize SIMD constants. */ - tv = LJ_KSIMD(J, LJ_KSIMD_ABS); - tv[0].u64 = U64x(7fffffff,ffffffff); - tv[1].u64 = U64x(7fffffff,ffffffff); - tv = LJ_KSIMD(J, LJ_KSIMD_NEG); - tv[0].u64 = U64x(80000000,00000000); - tv[1].u64 = U64x(80000000,00000000); -} - -/* Free everything associated with the JIT compiler state. */ -void lj_trace_freestate(global_State *g) -{ - jit_State *J = G2J(g); -#ifdef LUA_USE_ASSERT - { /* This assumes all traces have already been freed. */ - ptrdiff_t i; - for (i = 1; i < (ptrdiff_t)J->sizetrace; i++) - lua_assert(i == (ptrdiff_t)J->cur.traceno || traceref(J, i) == NULL); - } -#endif - lj_mcode_free(J); - lj_ir_k64_freeall(J); - lj_mem_freevec(g, J->snapmapbuf, J->sizesnapmap, SnapEntry); - lj_mem_freevec(g, J->snapbuf, J->sizesnap, SnapShot); - lj_mem_freevec(g, J->irbuf + J->irbotlim, J->irtoplim - J->irbotlim, IRIns); - lj_mem_freevec(g, J->trace, J->sizetrace, GCRef); -} - -/* -- Penalties and blacklisting ------------------------------------------ */ - -/* Blacklist a bytecode instruction. */ -static void blacklist_pc(GCproto *pt, BCIns *pc) -{ - setbc_op(pc, (int)bc_op(*pc)+(int)BC_ILOOP-(int)BC_LOOP); - pt->flags |= PROTO_ILOOP; -} - -/* Penalize a bytecode instruction. */ -static void penalty_pc(jit_State *J, GCproto *pt, BCIns *pc, TraceError e) -{ - uint32_t i, val = PENALTY_MIN; - for (i = 0; i < PENALTY_SLOTS; i++) - if (mref(J->penalty[i].pc, const BCIns) == pc) { /* Cache slot found? */ - /* First try to bump its hotcount several times. */ - val = ((uint32_t)J->penalty[i].val << 1) + - LJ_PRNG_BITS(J, PENALTY_RNDBITS); - if (val > PENALTY_MAX) { - blacklist_pc(pt, pc); /* Blacklist it, if that didn't help. */ - return; - } - goto setpenalty; - } - /* Assign a new penalty cache slot. */ - i = J->penaltyslot; - J->penaltyslot = (J->penaltyslot + 1) & (PENALTY_SLOTS-1); - setmref(J->penalty[i].pc, pc); -setpenalty: - J->penalty[i].val = (uint16_t)val; - J->penalty[i].reason = e; - hotcount_set(J2GG(J), pc+1, val); -} - -/* -- Trace compiler state machine ---------------------------------------- */ - -/* Start tracing. */ -static void trace_start(jit_State *J) -{ - lua_State *L; - TraceNo traceno; - - if ((J->pt->flags & PROTO_NOJIT)) { /* JIT disabled for this proto? */ - if (J->parent == 0) { - /* Lazy bytecode patching to disable hotcount events. */ - lua_assert(bc_op(*J->pc) == BC_FORL || bc_op(*J->pc) == BC_ITERL || - bc_op(*J->pc) == BC_LOOP || bc_op(*J->pc) == BC_FUNCF); - setbc_op(J->pc, (int)bc_op(*J->pc)+(int)BC_ILOOP-(int)BC_LOOP); - J->pt->flags |= PROTO_ILOOP; - } - J->state = LJ_TRACE_IDLE; /* Silently ignored. */ - return; - } - - /* Get a new trace number. */ - traceno = trace_findfree(J); - if (LJ_UNLIKELY(traceno == 0)) { /* No free trace? */ - lua_assert((J2G(J)->hookmask & HOOK_GC) == 0); - lj_trace_flushall(J->L); - J->state = LJ_TRACE_IDLE; /* Silently ignored. */ - return; - } - setgcrefp(J->trace[traceno], &J->cur); - - /* Setup enough of the current trace to be able to send the vmevent. */ - memset(&J->cur, 0, sizeof(GCtrace)); - J->cur.traceno = traceno; - J->cur.nins = J->cur.nk = REF_BASE; - J->cur.ir = J->irbuf; - J->cur.snap = J->snapbuf; - J->cur.snapmap = J->snapmapbuf; - J->mergesnap = 0; - J->needsnap = 0; - J->bcskip = 0; - J->guardemit.irt = 0; - J->postproc = LJ_POST_NONE; - lj_resetsplit(J); - setgcref(J->cur.startpt, obj2gco(J->pt)); - - L = J->L; - lj_vmevent_send(L, TRACE, - setstrV(L, L->top++, lj_str_newlit(L, "start")); - setintV(L->top++, traceno); - setfuncV(L, L->top++, J->fn); - setintV(L->top++, proto_bcpos(J->pt, J->pc)); - if (J->parent) { - setintV(L->top++, J->parent); - setintV(L->top++, J->exitno); - } - ); - lj_record_setup(J); -} - -/* Stop tracing. */ -static void trace_stop(jit_State *J) -{ - BCIns *pc = mref(J->cur.startpc, BCIns); - BCOp op = bc_op(J->cur.startins); - GCproto *pt = &gcref(J->cur.startpt)->pt; - TraceNo traceno = J->cur.traceno; - lua_State *L; - - switch (op) { - case BC_FORL: - setbc_op(pc+bc_j(J->cur.startins), BC_JFORI); /* Patch FORI, too. */ - /* fallthrough */ - case BC_LOOP: - case BC_ITERL: - case BC_FUNCF: - /* Patch bytecode of starting instruction in root trace. */ - setbc_op(pc, (int)op+(int)BC_JLOOP-(int)BC_LOOP); - setbc_d(pc, traceno); - addroot: - /* Add to root trace chain in prototype. */ - J->cur.nextroot = pt->trace; - pt->trace = (TraceNo1)traceno; - break; - case BC_RET: - case BC_RET0: - case BC_RET1: - *pc = BCINS_AD(BC_JLOOP, J->cur.snap[0].nslots, traceno); - goto addroot; - case BC_JMP: - /* Patch exit branch in parent to side trace entry. */ - lua_assert(J->parent != 0 && J->cur.root != 0); - lj_asm_patchexit(J, traceref(J, J->parent), J->exitno, J->cur.mcode); - /* Avoid compiling a side trace twice (stack resizing uses parent exit). */ - traceref(J, J->parent)->snap[J->exitno].count = SNAPCOUNT_DONE; - /* Add to side trace chain in root trace. */ - { - GCtrace *root = traceref(J, J->cur.root); - root->nchild++; - J->cur.nextside = root->nextside; - root->nextside = (TraceNo1)traceno; - } - break; - default: - lua_assert(0); - break; - } - - /* Commit new mcode only after all patching is done. */ - lj_mcode_commit(J, J->cur.mcode); - J->postproc = LJ_POST_NONE; - trace_save(J); - - L = J->L; - lj_vmevent_send(L, TRACE, - setstrV(L, L->top++, lj_str_newlit(L, "stop")); - setintV(L->top++, traceno); - ); -} - -/* Start a new root trace for down-recursion. */ -static int trace_downrec(jit_State *J) -{ - /* Restart recording at the return instruction. */ - lua_assert(J->pt != NULL); - lua_assert(bc_isret(bc_op(*J->pc))); - if (bc_op(*J->pc) == BC_RETM) - return 0; /* NYI: down-recursion with RETM. */ - J->parent = 0; - J->exitno = 0; - J->state = LJ_TRACE_RECORD; - trace_start(J); - return 1; -} - -/* Abort tracing. */ -static int trace_abort(jit_State *J) -{ - lua_State *L = J->L; - TraceError e = LJ_TRERR_RECERR; - TraceNo traceno; - - J->postproc = LJ_POST_NONE; - lj_mcode_abort(J); - if (tvisnumber(L->top-1)) - e = (TraceError)numberVint(L->top-1); - if (e == LJ_TRERR_MCODELM) { - L->top--; /* Remove error object */ - J->state = LJ_TRACE_ASM; - return 1; /* Retry ASM with new MCode area. */ - } - /* Penalize or blacklist starting bytecode instruction. */ - if (J->parent == 0 && !bc_isret(bc_op(J->cur.startins))) - penalty_pc(J, &gcref(J->cur.startpt)->pt, mref(J->cur.startpc, BCIns), e); - - /* Is there anything to abort? */ - traceno = J->cur.traceno; - if (traceno) { - ptrdiff_t errobj = savestack(L, L->top-1); /* Stack may be resized. */ - J->cur.link = 0; - J->cur.linktype = LJ_TRLINK_NONE; - lj_vmevent_send(L, TRACE, - TValue *frame; - const BCIns *pc; - GCfunc *fn; - setstrV(L, L->top++, lj_str_newlit(L, "abort")); - setintV(L->top++, traceno); - /* Find original Lua function call to generate a better error message. */ - frame = J->L->base-1; - pc = J->pc; - while (!isluafunc(frame_func(frame))) { - pc = (frame_iscont(frame) ? frame_contpc(frame) : frame_pc(frame)) - 1; - frame = frame_prev(frame); - } - fn = frame_func(frame); - setfuncV(L, L->top++, fn); - setintV(L->top++, proto_bcpos(funcproto(fn), pc)); - copyTV(L, L->top++, restorestack(L, errobj)); - copyTV(L, L->top++, &J->errinfo); - ); - /* Drop aborted trace after the vmevent (which may still access it). */ - setgcrefnull(J->trace[traceno]); - if (traceno < J->freetrace) - J->freetrace = traceno; - J->cur.traceno = 0; - } - L->top--; /* Remove error object */ - if (e == LJ_TRERR_DOWNREC) - return trace_downrec(J); - else if (e == LJ_TRERR_MCODEAL) - lj_trace_flushall(L); - return 0; -} - -/* Perform pending re-patch of a bytecode instruction. */ -static LJ_AINLINE void trace_pendpatch(jit_State *J, int force) -{ - if (LJ_UNLIKELY(J->patchpc)) { - if (force || J->bcskip == 0) { - *J->patchpc = J->patchins; - J->patchpc = NULL; - } else { - J->bcskip = 0; - } - } -} - -/* State machine for the trace compiler. Protected callback. */ -static TValue *trace_state(lua_State *L, lua_CFunction dummy, void *ud) -{ - jit_State *J = (jit_State *)ud; - UNUSED(dummy); - do { - retry: - switch (J->state) { - case LJ_TRACE_START: - J->state = LJ_TRACE_RECORD; /* trace_start() may change state. */ - trace_start(J); - lj_dispatch_update(J2G(J)); - break; - - case LJ_TRACE_RECORD: - trace_pendpatch(J, 0); - setvmstate(J2G(J), RECORD); - lj_vmevent_send_(L, RECORD, - /* Save/restore tmptv state for trace recorder. */ - TValue savetv = J2G(J)->tmptv; - TValue savetv2 = J2G(J)->tmptv2; - setintV(L->top++, J->cur.traceno); - setfuncV(L, L->top++, J->fn); - setintV(L->top++, J->pt ? (int32_t)proto_bcpos(J->pt, J->pc) : -1); - setintV(L->top++, J->framedepth); - , - J2G(J)->tmptv = savetv; - J2G(J)->tmptv2 = savetv2; - ); - lj_record_ins(J); - break; - - case LJ_TRACE_END: - trace_pendpatch(J, 1); - J->loopref = 0; - if ((J->flags & JIT_F_OPT_LOOP) && - J->cur.link == J->cur.traceno && J->framedepth + J->retdepth == 0) { - setvmstate(J2G(J), OPT); - lj_opt_dce(J); - if (lj_opt_loop(J)) { /* Loop optimization failed? */ - J->cur.link = 0; - J->cur.linktype = LJ_TRLINK_NONE; - J->loopref = J->cur.nins; - J->state = LJ_TRACE_RECORD; /* Try to continue recording. */ - break; - } - J->loopref = J->chain[IR_LOOP]; /* Needed by assembler. */ - } - lj_opt_split(J); - lj_opt_sink(J); - if (!J->loopref) J->cur.snap[J->cur.nsnap-1].count = SNAPCOUNT_DONE; - J->state = LJ_TRACE_ASM; - break; - - case LJ_TRACE_ASM: - setvmstate(J2G(J), ASM); - lj_asm_trace(J, &J->cur); - trace_stop(J); - setvmstate(J2G(J), INTERP); - J->state = LJ_TRACE_IDLE; - lj_dispatch_update(J2G(J)); - return NULL; - - default: /* Trace aborted asynchronously. */ - setintV(L->top++, (int32_t)LJ_TRERR_RECERR); - /* fallthrough */ - case LJ_TRACE_ERR: - trace_pendpatch(J, 1); - if (trace_abort(J)) - goto retry; - setvmstate(J2G(J), INTERP); - J->state = LJ_TRACE_IDLE; - lj_dispatch_update(J2G(J)); - return NULL; - } - } while (J->state > LJ_TRACE_RECORD); - return NULL; -} - -/* -- Event handling ------------------------------------------------------ */ - -/* A bytecode instruction is about to be executed. Record it. */ -void lj_trace_ins(jit_State *J, const BCIns *pc) -{ - /* Note: J->L must already be set. pc is the true bytecode PC here. */ - J->pc = pc; - J->fn = curr_func(J->L); - J->pt = isluafunc(J->fn) ? funcproto(J->fn) : NULL; - while (lj_vm_cpcall(J->L, NULL, (void *)J, trace_state) != 0) - J->state = LJ_TRACE_ERR; -} - -/* A hotcount triggered. Start recording a root trace. */ -void LJ_FASTCALL lj_trace_hot(jit_State *J, const BCIns *pc) -{ - /* Note: pc is the interpreter bytecode PC here. It's offset by 1. */ - ERRNO_SAVE - /* Reset hotcount. */ - hotcount_set(J2GG(J), pc, J->param[JIT_P_hotloop]*HOTCOUNT_LOOP); - /* Only start a new trace if not recording or inside __gc call or vmevent. */ - if (J->state == LJ_TRACE_IDLE && - !(J2G(J)->hookmask & (HOOK_GC|HOOK_VMEVENT))) { - J->parent = 0; /* Root trace. */ - J->exitno = 0; - J->state = LJ_TRACE_START; - lj_trace_ins(J, pc-1); - } - ERRNO_RESTORE -} - -/* Check for a hot side exit. If yes, start recording a side trace. */ -static void trace_hotside(jit_State *J, const BCIns *pc) -{ - SnapShot *snap = &traceref(J, J->parent)->snap[J->exitno]; - if (!(J2G(J)->hookmask & (HOOK_GC|HOOK_VMEVENT)) && - snap->count != SNAPCOUNT_DONE && - ++snap->count >= J->param[JIT_P_hotexit]) { - lua_assert(J->state == LJ_TRACE_IDLE); - /* J->parent is non-zero for a side trace. */ - J->state = LJ_TRACE_START; - lj_trace_ins(J, pc); - } -} - -/* Tiny struct to pass data to protected call. */ -typedef struct ExitDataCP { - jit_State *J; - void *exptr; /* Pointer to exit state. */ - const BCIns *pc; /* Restart interpreter at this PC. */ -} ExitDataCP; - -/* Need to protect lj_snap_restore because it may throw. */ -static TValue *trace_exit_cp(lua_State *L, lua_CFunction dummy, void *ud) -{ - ExitDataCP *exd = (ExitDataCP *)ud; - cframe_errfunc(L->cframe) = -1; /* Inherit error function. */ - exd->pc = lj_snap_restore(exd->J, exd->exptr); - UNUSED(dummy); - return NULL; -} - -#ifndef LUAJIT_DISABLE_VMEVENT -/* Push all registers from exit state. */ -static void trace_exit_regs(lua_State *L, ExitState *ex) -{ - int32_t i; - setintV(L->top++, RID_NUM_GPR); - setintV(L->top++, RID_NUM_FPR); - for (i = 0; i < RID_NUM_GPR; i++) { - if (sizeof(ex->gpr[i]) == sizeof(int32_t)) - setintV(L->top++, (int32_t)ex->gpr[i]); - else - setnumV(L->top++, (lua_Number)ex->gpr[i]); - } -#if !LJ_SOFTFP - for (i = 0; i < RID_NUM_FPR; i++) { - setnumV(L->top, ex->fpr[i]); - if (LJ_UNLIKELY(tvisnan(L->top))) - setnanV(L->top); - L->top++; - } -#endif -} -#endif - -#ifdef EXITSTATE_PCREG -/* Determine trace number from pc of exit instruction. */ -static TraceNo trace_exit_find(jit_State *J, MCode *pc) -{ - TraceNo traceno; - for (traceno = 1; traceno < J->sizetrace; traceno++) { - GCtrace *T = traceref(J, traceno); - if (T && pc >= T->mcode && pc < (MCode *)((char *)T->mcode + T->szmcode)) - return traceno; - } - lua_assert(0); - return 0; -} -#endif - -/* A trace exited. Restore interpreter state. */ -int LJ_FASTCALL lj_trace_exit(jit_State *J, void *exptr) -{ - ERRNO_SAVE - lua_State *L = J->L; - ExitState *ex = (ExitState *)exptr; - ExitDataCP exd; - int errcode; - const BCIns *pc; - void *cf; - GCtrace *T; -#ifdef EXITSTATE_PCREG - J->parent = trace_exit_find(J, (MCode *)(intptr_t)ex->gpr[EXITSTATE_PCREG]); -#endif - T = traceref(J, J->parent); UNUSED(T); -#ifdef EXITSTATE_CHECKEXIT - if (J->exitno == T->nsnap) { /* Treat stack check like a parent exit. */ - lua_assert(T->root != 0); - J->exitno = T->ir[REF_BASE].op2; - J->parent = T->ir[REF_BASE].op1; - T = traceref(J, J->parent); - } -#endif - lua_assert(T != NULL && J->exitno < T->nsnap); - exd.J = J; - exd.exptr = exptr; - errcode = lj_vm_cpcall(L, NULL, &exd, trace_exit_cp); - if (errcode) - return -errcode; /* Return negated error code. */ - - lj_vmevent_send(L, TEXIT, - lj_state_checkstack(L, 4+RID_NUM_GPR+RID_NUM_FPR+LUA_MINSTACK); - setintV(L->top++, J->parent); - setintV(L->top++, J->exitno); - trace_exit_regs(L, ex); - ); - - pc = exd.pc; - cf = cframe_raw(L->cframe); - setcframe_pc(cf, pc); - if (G(L)->gc.state == GCSatomic || G(L)->gc.state == GCSfinalize) { - if (!(G(L)->hookmask & HOOK_GC)) - lj_gc_step(L); /* Exited because of GC: drive GC forward. */ - } else { - trace_hotside(J, pc); - } - if (bc_op(*pc) == BC_JLOOP) { - BCIns *retpc = &traceref(J, bc_d(*pc))->startins; - if (bc_isret(bc_op(*retpc))) { - if (J->state == LJ_TRACE_RECORD) { - J->patchins = *pc; - J->patchpc = (BCIns *)pc; - *J->patchpc = *retpc; - J->bcskip = 1; - } else { - pc = retpc; - setcframe_pc(cf, pc); - } - } - } - /* Return MULTRES or 0. */ - ERRNO_RESTORE - switch (bc_op(*pc)) { - case BC_CALLM: case BC_CALLMT: - return (int)((BCReg)(L->top - L->base) - bc_a(*pc) - bc_c(*pc)); - case BC_RETM: - return (int)((BCReg)(L->top - L->base) + 1 - bc_a(*pc) - bc_d(*pc)); - case BC_TSETM: - return (int)((BCReg)(L->top - L->base) + 1 - bc_a(*pc)); - default: - if (bc_op(*pc) >= BC_FUNCF) - return (int)((BCReg)(L->top - L->base) + 1); - return 0; - } -} - -#endif diff --git a/deps/luajit/src/lj_trace.h b/deps/luajit/src/lj_trace.h deleted file mode 100644 index 4fbe5cf2..00000000 --- a/deps/luajit/src/lj_trace.h +++ /dev/null @@ -1,53 +0,0 @@ -/* -** Trace management. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#ifndef _LJ_TRACE_H -#define _LJ_TRACE_H - -#include "lj_obj.h" - -#if LJ_HASJIT -#include "lj_jit.h" -#include "lj_dispatch.h" - -/* Trace errors. */ -typedef enum { -#define TREDEF(name, msg) LJ_TRERR_##name, -#include "lj_traceerr.h" - LJ_TRERR__MAX -} TraceError; - -LJ_FUNC_NORET void lj_trace_err(jit_State *J, TraceError e); -LJ_FUNC_NORET void lj_trace_err_info(jit_State *J, TraceError e); - -/* Trace management. */ -LJ_FUNC void LJ_FASTCALL lj_trace_free(global_State *g, GCtrace *T); -LJ_FUNC void lj_trace_reenableproto(GCproto *pt); -LJ_FUNC void lj_trace_flushproto(global_State *g, GCproto *pt); -LJ_FUNC void lj_trace_flush(jit_State *J, TraceNo traceno); -LJ_FUNC int lj_trace_flushall(lua_State *L); -LJ_FUNC void lj_trace_initstate(global_State *g); -LJ_FUNC void lj_trace_freestate(global_State *g); - -/* Event handling. */ -LJ_FUNC void lj_trace_ins(jit_State *J, const BCIns *pc); -LJ_FUNCA void LJ_FASTCALL lj_trace_hot(jit_State *J, const BCIns *pc); -LJ_FUNCA int LJ_FASTCALL lj_trace_exit(jit_State *J, void *exptr); - -/* Signal asynchronous abort of trace or end of trace. */ -#define lj_trace_abort(g) (G2J(g)->state &= ~LJ_TRACE_ACTIVE) -#define lj_trace_end(J) (J->state = LJ_TRACE_END) - -#else - -#define lj_trace_flushall(L) (UNUSED(L), 0) -#define lj_trace_initstate(g) UNUSED(g) -#define lj_trace_freestate(g) UNUSED(g) -#define lj_trace_abort(g) UNUSED(g) -#define lj_trace_end(J) UNUSED(J) - -#endif - -#endif diff --git a/deps/luajit/src/lj_traceerr.h b/deps/luajit/src/lj_traceerr.h deleted file mode 100644 index 9bef117a..00000000 --- a/deps/luajit/src/lj_traceerr.h +++ /dev/null @@ -1,61 +0,0 @@ -/* -** Trace compiler error messages. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -/* This file may be included multiple times with different TREDEF macros. */ - -/* Recording. */ -TREDEF(RECERR, "error thrown or hook called during recording") -TREDEF(TRACEOV, "trace too long") -TREDEF(STACKOV, "trace too deep") -TREDEF(SNAPOV, "too many snapshots") -TREDEF(BLACKL, "blacklisted") -TREDEF(NYIBC, "NYI: bytecode %d") - -/* Recording loop ops. */ -TREDEF(LLEAVE, "leaving loop in root trace") -TREDEF(LINNER, "inner loop in root trace") -TREDEF(LUNROLL, "loop unroll limit reached") - -/* Recording calls/returns. */ -TREDEF(BADTYPE, "bad argument type") -TREDEF(CJITOFF, "JIT compilation disabled for function") -TREDEF(CUNROLL, "call unroll limit reached") -TREDEF(DOWNREC, "down-recursion, restarting") -TREDEF(NYICF, "NYI: C function %p") -TREDEF(NYIFF, "NYI: FastFunc %s") -TREDEF(NYIFFU, "NYI: unsupported variant of FastFunc %s") -TREDEF(NYIRETL, "NYI: return to lower frame") - -/* Recording indexed load/store. */ -TREDEF(STORENN, "store with nil or NaN key") -TREDEF(NOMM, "missing metamethod") -TREDEF(IDXLOOP, "looping index lookup") -TREDEF(NYITMIX, "NYI: mixed sparse/dense table") - -/* Recording C data operations. */ -TREDEF(NOCACHE, "symbol not in cache") -TREDEF(NYICONV, "NYI: unsupported C type conversion") -TREDEF(NYICALL, "NYI: unsupported C function type") - -/* Optimizations. */ -TREDEF(GFAIL, "guard would always fail") -TREDEF(PHIOV, "too many PHIs") -TREDEF(TYPEINS, "persistent type instability") - -/* Assembler. */ -TREDEF(MCODEAL, "failed to allocate mcode memory") -TREDEF(MCODEOV, "machine code too long") -TREDEF(MCODELM, "hit mcode limit (retrying)") -TREDEF(SPILLOV, "too many spill slots") -TREDEF(BADRA, "inconsistent register allocation") -TREDEF(NYIIR, "NYI: cannot assemble IR instruction %d") -TREDEF(NYIPHI, "NYI: PHI shuffling too complex") -TREDEF(NYICOAL, "NYI: register coalescing too complex") - -#undef TREDEF - -/* Detecting unused error messages: - awk -F, '/^TREDEF/ { gsub(/TREDEF./, ""); printf "grep -q LJ_TRERR_%s *.[ch] || echo %s\n", $1, $1}' lj_traceerr.h | sh -*/ diff --git a/deps/luajit/src/lj_udata.c b/deps/luajit/src/lj_udata.c deleted file mode 100644 index d401a3d8..00000000 --- a/deps/luajit/src/lj_udata.c +++ /dev/null @@ -1,34 +0,0 @@ -/* -** Userdata handling. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#define lj_udata_c -#define LUA_CORE - -#include "lj_obj.h" -#include "lj_gc.h" -#include "lj_udata.h" - -GCudata *lj_udata_new(lua_State *L, MSize sz, GCtab *env) -{ - GCudata *ud = lj_mem_newt(L, sizeof(GCudata) + sz, GCudata); - global_State *g = G(L); - newwhite(g, ud); /* Not finalized. */ - ud->gct = ~LJ_TUDATA; - ud->udtype = UDTYPE_USERDATA; - ud->len = sz; - /* NOBARRIER: The GCudata is new (marked white). */ - setgcrefnull(ud->metatable); - setgcref(ud->env, obj2gco(env)); - /* Chain to userdata list (after main thread). */ - setgcrefr(ud->nextgc, mainthread(g)->nextgc); - setgcref(mainthread(g)->nextgc, obj2gco(ud)); - return ud; -} - -void LJ_FASTCALL lj_udata_free(global_State *g, GCudata *ud) -{ - lj_mem_free(g, ud, sizeudata(ud)); -} - diff --git a/deps/luajit/src/lj_udata.h b/deps/luajit/src/lj_udata.h deleted file mode 100644 index 676e970f..00000000 --- a/deps/luajit/src/lj_udata.h +++ /dev/null @@ -1,14 +0,0 @@ -/* -** Userdata handling. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#ifndef _LJ_UDATA_H -#define _LJ_UDATA_H - -#include "lj_obj.h" - -LJ_FUNC GCudata *lj_udata_new(lua_State *L, MSize sz, GCtab *env); -LJ_FUNC void LJ_FASTCALL lj_udata_free(global_State *g, GCudata *ud); - -#endif diff --git a/deps/luajit/src/lj_vm.h b/deps/luajit/src/lj_vm.h deleted file mode 100644 index 036cabc5..00000000 --- a/deps/luajit/src/lj_vm.h +++ /dev/null @@ -1,116 +0,0 @@ -/* -** Assembler VM interface definitions. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#ifndef _LJ_VM_H -#define _LJ_VM_H - -#include "lj_obj.h" - -/* Entry points for ASM parts of VM. */ -LJ_ASMF void lj_vm_call(lua_State *L, TValue *base, int nres1); -LJ_ASMF int lj_vm_pcall(lua_State *L, TValue *base, int nres1, ptrdiff_t ef); -typedef TValue *(*lua_CPFunction)(lua_State *L, lua_CFunction func, void *ud); -LJ_ASMF int lj_vm_cpcall(lua_State *L, lua_CFunction func, void *ud, - lua_CPFunction cp); -LJ_ASMF int lj_vm_resume(lua_State *L, TValue *base, int nres1, ptrdiff_t ef); -LJ_ASMF_NORET void LJ_FASTCALL lj_vm_unwind_c(void *cframe, int errcode); -LJ_ASMF_NORET void LJ_FASTCALL lj_vm_unwind_ff(void *cframe); -LJ_ASMF void lj_vm_unwind_c_eh(void); -LJ_ASMF void lj_vm_unwind_ff_eh(void); -#if LJ_TARGET_X86ORX64 -LJ_ASMF void lj_vm_unwind_rethrow(void); -#endif - -/* Miscellaneous functions. */ -#if LJ_TARGET_X86ORX64 -LJ_ASMF int lj_vm_cpuid(uint32_t f, uint32_t res[4]); -#endif -#if LJ_TARGET_PPC -void lj_vm_cachesync(void *start, void *end); -#endif -LJ_ASMF double lj_vm_foldarith(double x, double y, int op); -#if LJ_HASJIT -LJ_ASMF double lj_vm_foldfpm(double x, int op); -#endif -#if !LJ_ARCH_HASFPU -/* Declared in lj_obj.h: LJ_ASMF int32_t lj_vm_tobit(double x); */ -#endif - -/* Dispatch targets for recording and hooks. */ -LJ_ASMF void lj_vm_record(void); -LJ_ASMF void lj_vm_inshook(void); -LJ_ASMF void lj_vm_rethook(void); -LJ_ASMF void lj_vm_callhook(void); - -/* Trace exit handling. */ -LJ_ASMF void lj_vm_exit_handler(void); -LJ_ASMF void lj_vm_exit_interp(void); - -/* Internal math helper functions. */ -#if LJ_TARGET_X86ORX64 || LJ_TARGET_PPC -#define lj_vm_floor floor -#define lj_vm_ceil ceil -#else -LJ_ASMF double lj_vm_floor(double); -LJ_ASMF double lj_vm_ceil(double); -#if LJ_TARGET_ARM -LJ_ASMF double lj_vm_floor_sf(double); -LJ_ASMF double lj_vm_ceil_sf(double); -#endif -#endif -#if defined(LUAJIT_NO_LOG2) || LJ_TARGET_X86ORX64 -LJ_ASMF double lj_vm_log2(double); -#else -#define lj_vm_log2 log2 -#endif - -#if LJ_HASJIT -#if LJ_TARGET_X86ORX64 -LJ_ASMF void lj_vm_floor_sse(void); -LJ_ASMF void lj_vm_ceil_sse(void); -LJ_ASMF void lj_vm_trunc_sse(void); -LJ_ASMF void lj_vm_exp_x87(void); -LJ_ASMF void lj_vm_exp2_x87(void); -LJ_ASMF void lj_vm_pow_sse(void); -LJ_ASMF void lj_vm_powi_sse(void); -#else -#if LJ_TARGET_PPC -#define lj_vm_trunc trunc -#else -LJ_ASMF double lj_vm_trunc(double); -#if LJ_TARGET_ARM -LJ_ASMF double lj_vm_trunc_sf(double); -#endif -#endif -LJ_ASMF double lj_vm_powi(double, int32_t); -#ifdef LUAJIT_NO_EXP2 -LJ_ASMF double lj_vm_exp2(double); -#else -#define lj_vm_exp2 exp2 -#endif -#endif -LJ_ASMF int32_t LJ_FASTCALL lj_vm_modi(int32_t, int32_t); -#if LJ_HASFFI -LJ_ASMF int lj_vm_errno(void); -#endif -#endif - -/* Continuations for metamethods. */ -LJ_ASMF void lj_cont_cat(void); /* Continue with concatenation. */ -LJ_ASMF void lj_cont_ra(void); /* Store result in RA from instruction. */ -LJ_ASMF void lj_cont_nop(void); /* Do nothing, just continue execution. */ -LJ_ASMF void lj_cont_condt(void); /* Branch if result is true. */ -LJ_ASMF void lj_cont_condf(void); /* Branch if result is false. */ -LJ_ASMF void lj_cont_hook(void); /* Continue from hook yield. */ - -enum { LJ_CONT_TAILCALL, LJ_CONT_FFI_CALLBACK }; /* Special continuations. */ - -/* Start of the ASM code. */ -LJ_ASMF char lj_vm_asm_begin[]; - -/* Bytecode offsets are relative to lj_vm_asm_begin. */ -#define makeasmfunc(ofs) ((ASMFunction)(lj_vm_asm_begin + (ofs))) - -#endif diff --git a/deps/luajit/src/lj_vmevent.c b/deps/luajit/src/lj_vmevent.c deleted file mode 100644 index 81fe47d4..00000000 --- a/deps/luajit/src/lj_vmevent.c +++ /dev/null @@ -1,57 +0,0 @@ -/* -** VM event handling. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#include - -#define lj_vmevent_c -#define LUA_CORE - -#include "lj_obj.h" -#include "lj_str.h" -#include "lj_tab.h" -#include "lj_state.h" -#include "lj_dispatch.h" -#include "lj_vm.h" -#include "lj_vmevent.h" - -ptrdiff_t lj_vmevent_prepare(lua_State *L, VMEvent ev) -{ - global_State *g = G(L); - GCstr *s = lj_str_newlit(L, LJ_VMEVENTS_REGKEY); - cTValue *tv = lj_tab_getstr(tabV(registry(L)), s); - if (tvistab(tv)) { - int hash = VMEVENT_HASH(ev); - tv = lj_tab_getint(tabV(tv), hash); - if (tv && tvisfunc(tv)) { - lj_state_checkstack(L, LUA_MINSTACK); - setfuncV(L, L->top++, funcV(tv)); - return savestack(L, L->top); - } - } - g->vmevmask &= ~VMEVENT_MASK(ev); /* No handler: cache this fact. */ - return 0; -} - -void lj_vmevent_call(lua_State *L, ptrdiff_t argbase) -{ - global_State *g = G(L); - uint8_t oldmask = g->vmevmask; - uint8_t oldh = hook_save(g); - int status; - g->vmevmask = 0; /* Disable all events. */ - hook_vmevent(g); - status = lj_vm_pcall(L, restorestack(L, argbase), 0+1, 0); - if (LJ_UNLIKELY(status)) { - /* Really shouldn't use stderr here, but where else to complain? */ - L->top--; - fputs("VM handler failed: ", stderr); - fputs(tvisstr(L->top) ? strVdata(L->top) : "?", stderr); - fputc('\n', stderr); - } - hook_restore(g, oldh); - if (g->vmevmask != VMEVENT_NOCACHE) - g->vmevmask = oldmask; /* Restore event mask, but not if not modified. */ -} - diff --git a/deps/luajit/src/lj_vmevent.h b/deps/luajit/src/lj_vmevent.h deleted file mode 100644 index 231e00ec..00000000 --- a/deps/luajit/src/lj_vmevent.h +++ /dev/null @@ -1,59 +0,0 @@ -/* -** VM event handling. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#ifndef _LJ_VMEVENT_H -#define _LJ_VMEVENT_H - -#include "lj_obj.h" - -/* Registry key for VM event handler table. */ -#define LJ_VMEVENTS_REGKEY "_VMEVENTS" -#define LJ_VMEVENTS_HSIZE 4 - -#define VMEVENT_MASK(ev) ((uint8_t)1 << ((int)(ev) & 7)) -#define VMEVENT_HASH(ev) ((int)(ev) & ~7) -#define VMEVENT_HASHIDX(h) ((int)(h) << 3) -#define VMEVENT_NOCACHE 255 - -#define VMEVENT_DEF(name, hash) \ - LJ_VMEVENT_##name##_, \ - LJ_VMEVENT_##name = ((LJ_VMEVENT_##name##_) & 7)|((hash) << 3) - -/* VM event IDs. */ -typedef enum { - VMEVENT_DEF(BC, 0x00003883), - VMEVENT_DEF(TRACE, 0xb2d91467), - VMEVENT_DEF(RECORD, 0x9284bf4f), - VMEVENT_DEF(TEXIT, 0xb29df2b0), - LJ_VMEVENT__MAX -} VMEvent; - -#ifdef LUAJIT_DISABLE_VMEVENT -#define lj_vmevent_send(L, ev, args) UNUSED(L) -#define lj_vmevent_send_(L, ev, args, post) UNUSED(L) -#else -#define lj_vmevent_send(L, ev, args) \ - if (G(L)->vmevmask & VMEVENT_MASK(LJ_VMEVENT_##ev)) { \ - ptrdiff_t argbase = lj_vmevent_prepare(L, LJ_VMEVENT_##ev); \ - if (argbase) { \ - args \ - lj_vmevent_call(L, argbase); \ - } \ - } -#define lj_vmevent_send_(L, ev, args, post) \ - if (G(L)->vmevmask & VMEVENT_MASK(LJ_VMEVENT_##ev)) { \ - ptrdiff_t argbase = lj_vmevent_prepare(L, LJ_VMEVENT_##ev); \ - if (argbase) { \ - args \ - lj_vmevent_call(L, argbase); \ - post \ - } \ - } - -LJ_FUNC ptrdiff_t lj_vmevent_prepare(lua_State *L, VMEvent ev); -LJ_FUNC void lj_vmevent_call(lua_State *L, ptrdiff_t argbase); -#endif - -#endif diff --git a/deps/luajit/src/lj_vmmath.c b/deps/luajit/src/lj_vmmath.c deleted file mode 100644 index 31c6029f..00000000 --- a/deps/luajit/src/lj_vmmath.c +++ /dev/null @@ -1,140 +0,0 @@ -/* -** Math helper functions for assembler VM. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#define lj_vmmath_c -#define LUA_CORE - -#include -#include - -#include "lj_obj.h" -#include "lj_ir.h" -#include "lj_vm.h" - -/* -- Helper functions for generated machine code ------------------------- */ - -#if LJ_TARGET_X86ORX64 -/* Wrapper functions to avoid linker issues on OSX. */ -LJ_FUNCA double lj_vm_sinh(double x) { return sinh(x); } -LJ_FUNCA double lj_vm_cosh(double x) { return cosh(x); } -LJ_FUNCA double lj_vm_tanh(double x) { return tanh(x); } -#endif - -#if !LJ_TARGET_X86ORX64 -double lj_vm_foldarith(double x, double y, int op) -{ - switch (op) { - case IR_ADD - IR_ADD: return x+y; break; - case IR_SUB - IR_ADD: return x-y; break; - case IR_MUL - IR_ADD: return x*y; break; - case IR_DIV - IR_ADD: return x/y; break; - case IR_MOD - IR_ADD: return x-lj_vm_floor(x/y)*y; break; - case IR_POW - IR_ADD: return pow(x, y); break; - case IR_NEG - IR_ADD: return -x; break; - case IR_ABS - IR_ADD: return fabs(x); break; -#if LJ_HASJIT - case IR_ATAN2 - IR_ADD: return atan2(x, y); break; - case IR_LDEXP - IR_ADD: return ldexp(x, (int)y); break; - case IR_MIN - IR_ADD: return x > y ? y : x; break; - case IR_MAX - IR_ADD: return x < y ? y : x; break; -#endif - default: return x; - } -} -#endif - -#if LJ_HASJIT - -#ifdef LUAJIT_NO_LOG2 -double lj_vm_log2(double a) -{ - return log(a) * 1.4426950408889634074; -} -#endif - -#ifdef LUAJIT_NO_EXP2 -double lj_vm_exp2(double a) -{ - return exp(a * 0.6931471805599453); -} -#endif - -#if !(LJ_TARGET_ARM || LJ_TARGET_PPC) -int32_t LJ_FASTCALL lj_vm_modi(int32_t a, int32_t b) -{ - uint32_t y, ua, ub; - lua_assert(b != 0); /* This must be checked before using this function. */ - ua = a < 0 ? (uint32_t)-a : (uint32_t)a; - ub = b < 0 ? (uint32_t)-b : (uint32_t)b; - y = ua % ub; - if (y != 0 && (a^b) < 0) y = y - ub; - if (((int32_t)y^b) < 0) y = (uint32_t)-(int32_t)y; - return (int32_t)y; -} -#endif - -#if !LJ_TARGET_X86ORX64 -/* Unsigned x^k. */ -static double lj_vm_powui(double x, uint32_t k) -{ - double y; - lua_assert(k != 0); - for (; (k & 1) == 0; k >>= 1) x *= x; - y = x; - if ((k >>= 1) != 0) { - for (;;) { - x *= x; - if (k == 1) break; - if (k & 1) y *= x; - k >>= 1; - } - y *= x; - } - return y; -} - -/* Signed x^k. */ -double lj_vm_powi(double x, int32_t k) -{ - if (k > 1) - return lj_vm_powui(x, (uint32_t)k); - else if (k == 1) - return x; - else if (k == 0) - return 1.0; - else - return 1.0 / lj_vm_powui(x, (uint32_t)-k); -} - -/* Computes fpm(x) for extended math functions. */ -double lj_vm_foldfpm(double x, int fpm) -{ - switch (fpm) { - case IRFPM_FLOOR: return lj_vm_floor(x); - case IRFPM_CEIL: return lj_vm_ceil(x); - case IRFPM_TRUNC: return lj_vm_trunc(x); - case IRFPM_SQRT: return sqrt(x); - case IRFPM_EXP: return exp(x); - case IRFPM_EXP2: return lj_vm_exp2(x); - case IRFPM_LOG: return log(x); - case IRFPM_LOG2: return lj_vm_log2(x); - case IRFPM_LOG10: return log10(x); - case IRFPM_SIN: return sin(x); - case IRFPM_COS: return cos(x); - case IRFPM_TAN: return tan(x); - default: lua_assert(0); - } - return 0; -} -#endif - -#if LJ_HASFFI -int lj_vm_errno(void) -{ - return errno; -} -#endif - -#endif diff --git a/deps/luajit/src/ljamalg.c b/deps/luajit/src/ljamalg.c deleted file mode 100644 index 9b237b7e..00000000 --- a/deps/luajit/src/ljamalg.c +++ /dev/null @@ -1,93 +0,0 @@ -/* -** LuaJIT core and libraries amalgamation. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -/* -+--------------------------------------------------------------------------+ -| WARNING: Compiling the amalgamation needs a lot of virtual memory | -| (around 300 MB with GCC 4.x)! If you don't have enough physical memory | -| your machine will start swapping to disk and the compile will not finish | -| within a reasonable amount of time. | -| So either compile on a bigger machine or use the non-amalgamated build. | -+--------------------------------------------------------------------------+ -*/ - -#define ljamalg_c -#define LUA_CORE - -/* To get the mremap prototype. Must be defined before any system includes. */ -#if defined(__linux__) && !defined(_GNU_SOURCE) -#define _GNU_SOURCE -#endif - -#ifndef WINVER -#define WINVER 0x0501 -#endif - -#include "lua.h" -#include "lauxlib.h" - -#include "lj_gc.c" -#include "lj_err.c" -#include "lj_char.c" -#include "lj_bc.c" -#include "lj_obj.c" -#include "lj_str.c" -#include "lj_tab.c" -#include "lj_func.c" -#include "lj_udata.c" -#include "lj_meta.c" -#include "lj_debug.c" -#include "lj_state.c" -#include "lj_dispatch.c" -#include "lj_vmevent.c" -#include "lj_vmmath.c" -#include "lj_strscan.c" -#include "lj_api.c" -#include "lj_lex.c" -#include "lj_parse.c" -#include "lj_bcread.c" -#include "lj_bcwrite.c" -#include "lj_load.c" -#include "lj_ctype.c" -#include "lj_cdata.c" -#include "lj_cconv.c" -#include "lj_ccall.c" -#include "lj_ccallback.c" -#include "lj_carith.c" -#include "lj_clib.c" -#include "lj_cparse.c" -#include "lj_lib.c" -#include "lj_ir.c" -#include "lj_opt_mem.c" -#include "lj_opt_fold.c" -#include "lj_opt_narrow.c" -#include "lj_opt_dce.c" -#include "lj_opt_loop.c" -#include "lj_opt_split.c" -#include "lj_opt_sink.c" -#include "lj_mcode.c" -#include "lj_snap.c" -#include "lj_record.c" -#include "lj_crecord.c" -#include "lj_ffrecord.c" -#include "lj_asm.c" -#include "lj_trace.c" -#include "lj_gdbjit.c" -#include "lj_alloc.c" - -#include "lib_aux.c" -#include "lib_base.c" -#include "lib_math.c" -#include "lib_string.c" -#include "lib_table.c" -#include "lib_io.c" -#include "lib_os.c" -#include "lib_package.c" -#include "lib_debug.c" -#include "lib_bit.c" -#include "lib_jit.c" -#include "lib_ffi.c" -#include "lib_init.c" - diff --git a/deps/luajit/src/lua.h b/deps/luajit/src/lua.h deleted file mode 100644 index c83fd3bb..00000000 --- a/deps/luajit/src/lua.h +++ /dev/null @@ -1,393 +0,0 @@ -/* -** $Id: lua.h,v 1.218.1.5 2008/08/06 13:30:12 roberto Exp $ -** Lua - An Extensible Extension Language -** Lua.org, PUC-Rio, Brazil (http://www.lua.org) -** See Copyright Notice at the end of this file -*/ - - -#ifndef lua_h -#define lua_h - -#include -#include - - -#include "luaconf.h" - - -#define LUA_VERSION "Lua 5.1" -#define LUA_RELEASE "Lua 5.1.4" -#define LUA_VERSION_NUM 501 -#define LUA_COPYRIGHT "Copyright (C) 1994-2008 Lua.org, PUC-Rio" -#define LUA_AUTHORS "R. Ierusalimschy, L. H. de Figueiredo & W. Celes" - - -/* mark for precompiled code (`Lua') */ -#define LUA_SIGNATURE "\033Lua" - -/* option for multiple returns in `lua_pcall' and `lua_call' */ -#define LUA_MULTRET (-1) - - -/* -** pseudo-indices -*/ -#define LUA_REGISTRYINDEX (-10000) -#define LUA_ENVIRONINDEX (-10001) -#define LUA_GLOBALSINDEX (-10002) -#define lua_upvalueindex(i) (LUA_GLOBALSINDEX-(i)) - - -/* thread status; 0 is OK */ -#define LUA_YIELD 1 -#define LUA_ERRRUN 2 -#define LUA_ERRSYNTAX 3 -#define LUA_ERRMEM 4 -#define LUA_ERRERR 5 - - -typedef struct lua_State lua_State; - -typedef int (*lua_CFunction) (lua_State *L); - - -/* -** functions that read/write blocks when loading/dumping Lua chunks -*/ -typedef const char * (*lua_Reader) (lua_State *L, void *ud, size_t *sz); - -typedef int (*lua_Writer) (lua_State *L, const void* p, size_t sz, void* ud); - - -/* -** prototype for memory-allocation functions -*/ -typedef void * (*lua_Alloc) (void *ud, void *ptr, size_t osize, size_t nsize); - - -/* -** basic types -*/ -#define LUA_TNONE (-1) - -#define LUA_TNIL 0 -#define LUA_TBOOLEAN 1 -#define LUA_TLIGHTUSERDATA 2 -#define LUA_TNUMBER 3 -#define LUA_TSTRING 4 -#define LUA_TTABLE 5 -#define LUA_TFUNCTION 6 -#define LUA_TUSERDATA 7 -#define LUA_TTHREAD 8 - - - -/* minimum Lua stack available to a C function */ -#define LUA_MINSTACK 20 - - -/* -** generic extra include file -*/ -#if defined(LUA_USER_H) -#include LUA_USER_H -#endif - - -/* type of numbers in Lua */ -typedef LUA_NUMBER lua_Number; - - -/* type for integer functions */ -typedef LUA_INTEGER lua_Integer; - - - -/* -** state manipulation -*/ -LUA_API lua_State *(lua_newstate) (lua_Alloc f, void *ud); -LUA_API void (lua_close) (lua_State *L); -LUA_API lua_State *(lua_newthread) (lua_State *L); - -LUA_API lua_CFunction (lua_atpanic) (lua_State *L, lua_CFunction panicf); - - -/* -** basic stack manipulation -*/ -LUA_API int (lua_gettop) (lua_State *L); -LUA_API void (lua_settop) (lua_State *L, int idx); -LUA_API void (lua_pushvalue) (lua_State *L, int idx); -LUA_API void (lua_remove) (lua_State *L, int idx); -LUA_API void (lua_insert) (lua_State *L, int idx); -LUA_API void (lua_replace) (lua_State *L, int idx); -LUA_API int (lua_checkstack) (lua_State *L, int sz); - -LUA_API void (lua_xmove) (lua_State *from, lua_State *to, int n); - - -/* -** access functions (stack -> C) -*/ - -LUA_API int (lua_isnumber) (lua_State *L, int idx); -LUA_API int (lua_isstring) (lua_State *L, int idx); -LUA_API int (lua_iscfunction) (lua_State *L, int idx); -LUA_API int (lua_isuserdata) (lua_State *L, int idx); -LUA_API int (lua_type) (lua_State *L, int idx); -LUA_API const char *(lua_typename) (lua_State *L, int tp); - -LUA_API int (lua_equal) (lua_State *L, int idx1, int idx2); -LUA_API int (lua_rawequal) (lua_State *L, int idx1, int idx2); -LUA_API int (lua_lessthan) (lua_State *L, int idx1, int idx2); - -LUA_API lua_Number (lua_tonumber) (lua_State *L, int idx); -LUA_API lua_Integer (lua_tointeger) (lua_State *L, int idx); -LUA_API int (lua_toboolean) (lua_State *L, int idx); -LUA_API const char *(lua_tolstring) (lua_State *L, int idx, size_t *len); -LUA_API size_t (lua_objlen) (lua_State *L, int idx); -LUA_API lua_CFunction (lua_tocfunction) (lua_State *L, int idx); -LUA_API void *(lua_touserdata) (lua_State *L, int idx); -LUA_API lua_State *(lua_tothread) (lua_State *L, int idx); -LUA_API const void *(lua_topointer) (lua_State *L, int idx); - - -/* -** push functions (C -> stack) -*/ -LUA_API void (lua_pushnil) (lua_State *L); -LUA_API void (lua_pushnumber) (lua_State *L, lua_Number n); -LUA_API void (lua_pushinteger) (lua_State *L, lua_Integer n); -LUA_API void (lua_pushlstring) (lua_State *L, const char *s, size_t l); -LUA_API void (lua_pushstring) (lua_State *L, const char *s); -LUA_API const char *(lua_pushvfstring) (lua_State *L, const char *fmt, - va_list argp); -LUA_API const char *(lua_pushfstring) (lua_State *L, const char *fmt, ...); -LUA_API void (lua_pushcclosure) (lua_State *L, lua_CFunction fn, int n); -LUA_API void (lua_pushboolean) (lua_State *L, int b); -LUA_API void (lua_pushlightuserdata) (lua_State *L, void *p); -LUA_API int (lua_pushthread) (lua_State *L); - - -/* -** get functions (Lua -> stack) -*/ -LUA_API void (lua_gettable) (lua_State *L, int idx); -LUA_API void (lua_getfield) (lua_State *L, int idx, const char *k); -LUA_API void (lua_rawget) (lua_State *L, int idx); -LUA_API void (lua_rawgeti) (lua_State *L, int idx, int n); -LUA_API void (lua_createtable) (lua_State *L, int narr, int nrec); -LUA_API void *(lua_newuserdata) (lua_State *L, size_t sz); -LUA_API int (lua_getmetatable) (lua_State *L, int objindex); -LUA_API void (lua_getfenv) (lua_State *L, int idx); - - -/* -** set functions (stack -> Lua) -*/ -LUA_API void (lua_settable) (lua_State *L, int idx); -LUA_API void (lua_setfield) (lua_State *L, int idx, const char *k); -LUA_API void (lua_rawset) (lua_State *L, int idx); -LUA_API void (lua_rawseti) (lua_State *L, int idx, int n); -LUA_API int (lua_setmetatable) (lua_State *L, int objindex); -LUA_API int (lua_setfenv) (lua_State *L, int idx); - - -/* -** `load' and `call' functions (load and run Lua code) -*/ -LUA_API void (lua_call) (lua_State *L, int nargs, int nresults); -LUA_API int (lua_pcall) (lua_State *L, int nargs, int nresults, int errfunc); -LUA_API int (lua_cpcall) (lua_State *L, lua_CFunction func, void *ud); -LUA_API int (lua_load) (lua_State *L, lua_Reader reader, void *dt, - const char *chunkname); - -LUA_API int (lua_dump) (lua_State *L, lua_Writer writer, void *data); - - -/* -** coroutine functions -*/ -LUA_API int (lua_yield) (lua_State *L, int nresults); -LUA_API int (lua_resume) (lua_State *L, int narg); -LUA_API int (lua_status) (lua_State *L); - -/* -** garbage-collection function and options -*/ - -#define LUA_GCSTOP 0 -#define LUA_GCRESTART 1 -#define LUA_GCCOLLECT 2 -#define LUA_GCCOUNT 3 -#define LUA_GCCOUNTB 4 -#define LUA_GCSTEP 5 -#define LUA_GCSETPAUSE 6 -#define LUA_GCSETSTEPMUL 7 - -LUA_API int (lua_gc) (lua_State *L, int what, int data); - - -/* -** miscellaneous functions -*/ - -LUA_API int (lua_error) (lua_State *L); - -LUA_API int (lua_next) (lua_State *L, int idx); - -LUA_API void (lua_concat) (lua_State *L, int n); - -LUA_API lua_Alloc (lua_getallocf) (lua_State *L, void **ud); -LUA_API void lua_setallocf (lua_State *L, lua_Alloc f, void *ud); - - - -/* -** =============================================================== -** some useful macros -** =============================================================== -*/ - -#define lua_pop(L,n) lua_settop(L, -(n)-1) - -#define lua_newtable(L) lua_createtable(L, 0, 0) - -#define lua_register(L,n,f) (lua_pushcfunction(L, (f)), lua_setglobal(L, (n))) - -#define lua_pushcfunction(L,f) lua_pushcclosure(L, (f), 0) - -#define lua_strlen(L,i) lua_objlen(L, (i)) - -#define lua_isfunction(L,n) (lua_type(L, (n)) == LUA_TFUNCTION) -#define lua_istable(L,n) (lua_type(L, (n)) == LUA_TTABLE) -#define lua_islightuserdata(L,n) (lua_type(L, (n)) == LUA_TLIGHTUSERDATA) -#define lua_isnil(L,n) (lua_type(L, (n)) == LUA_TNIL) -#define lua_isboolean(L,n) (lua_type(L, (n)) == LUA_TBOOLEAN) -#define lua_isthread(L,n) (lua_type(L, (n)) == LUA_TTHREAD) -#define lua_isnone(L,n) (lua_type(L, (n)) == LUA_TNONE) -#define lua_isnoneornil(L, n) (lua_type(L, (n)) <= 0) - -#define lua_pushliteral(L, s) \ - lua_pushlstring(L, "" s, (sizeof(s)/sizeof(char))-1) - -#define lua_setglobal(L,s) lua_setfield(L, LUA_GLOBALSINDEX, (s)) -#define lua_getglobal(L,s) lua_getfield(L, LUA_GLOBALSINDEX, (s)) - -#define lua_tostring(L,i) lua_tolstring(L, (i), NULL) - - - -/* -** compatibility macros and functions -*/ - -#define lua_open() luaL_newstate() - -#define lua_getregistry(L) lua_pushvalue(L, LUA_REGISTRYINDEX) - -#define lua_getgccount(L) lua_gc(L, LUA_GCCOUNT, 0) - -#define lua_Chunkreader lua_Reader -#define lua_Chunkwriter lua_Writer - - -/* hack */ -LUA_API void lua_setlevel (lua_State *from, lua_State *to); - - -/* -** {====================================================================== -** Debug API -** ======================================================================= -*/ - - -/* -** Event codes -*/ -#define LUA_HOOKCALL 0 -#define LUA_HOOKRET 1 -#define LUA_HOOKLINE 2 -#define LUA_HOOKCOUNT 3 -#define LUA_HOOKTAILRET 4 - - -/* -** Event masks -*/ -#define LUA_MASKCALL (1 << LUA_HOOKCALL) -#define LUA_MASKRET (1 << LUA_HOOKRET) -#define LUA_MASKLINE (1 << LUA_HOOKLINE) -#define LUA_MASKCOUNT (1 << LUA_HOOKCOUNT) - -typedef struct lua_Debug lua_Debug; /* activation record */ - - -/* Functions to be called by the debuger in specific events */ -typedef void (*lua_Hook) (lua_State *L, lua_Debug *ar); - - -LUA_API int lua_getstack (lua_State *L, int level, lua_Debug *ar); -LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar); -LUA_API const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int n); -LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n); -LUA_API const char *lua_getupvalue (lua_State *L, int funcindex, int n); -LUA_API const char *lua_setupvalue (lua_State *L, int funcindex, int n); -LUA_API int lua_sethook (lua_State *L, lua_Hook func, int mask, int count); -LUA_API lua_Hook lua_gethook (lua_State *L); -LUA_API int lua_gethookmask (lua_State *L); -LUA_API int lua_gethookcount (lua_State *L); - -/* From Lua 5.2. */ -LUA_API void *lua_upvalueid (lua_State *L, int idx, int n); -LUA_API void lua_upvaluejoin (lua_State *L, int idx1, int n1, int idx2, int n2); -LUA_API int lua_loadx (lua_State *L, lua_Reader reader, void *dt, - const char *chunkname, const char *mode); - - -struct lua_Debug { - int event; - const char *name; /* (n) */ - const char *namewhat; /* (n) `global', `local', `field', `method' */ - const char *what; /* (S) `Lua', `C', `main', `tail' */ - const char *source; /* (S) */ - int currentline; /* (l) */ - int nups; /* (u) number of upvalues */ - int linedefined; /* (S) */ - int lastlinedefined; /* (S) */ - char short_src[LUA_IDSIZE]; /* (S) */ - /* private part */ - int i_ci; /* active function */ -}; - -/* }====================================================================== */ - - -/****************************************************************************** -* Copyright (C) 1994-2008 Lua.org, PUC-Rio. 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. -******************************************************************************/ - - -#endif diff --git a/deps/luajit/src/lua.hpp b/deps/luajit/src/lua.hpp deleted file mode 100644 index 07e9002d..00000000 --- a/deps/luajit/src/lua.hpp +++ /dev/null @@ -1,9 +0,0 @@ -// C++ wrapper for LuaJIT header files. - -extern "C" { -#include "lua.h" -#include "lauxlib.h" -#include "lualib.h" -#include "luajit.h" -} - diff --git a/deps/luajit/src/luaconf.h b/deps/luajit/src/luaconf.h deleted file mode 100644 index 84fa6418..00000000 --- a/deps/luajit/src/luaconf.h +++ /dev/null @@ -1,156 +0,0 @@ -/* -** Configuration header. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#ifndef luaconf_h -#define luaconf_h - -#ifndef WINVER -#define WINVER 0x0501 -#endif -#include -#include - -/* Default path for loading Lua and C modules with require(). */ -#if defined(_WIN32) -/* -** In Windows, any exclamation mark ('!') in the path is replaced by the -** path of the directory of the executable file of the current process. -*/ -#define LUA_LDIR "!\\lua\\" -#define LUA_CDIR "!\\" -#define LUA_PATH_DEFAULT \ - ".\\?.lua;" LUA_LDIR"?.lua;" LUA_LDIR"?\\init.lua;" -#define LUA_CPATH_DEFAULT \ - ".\\?.dll;" LUA_CDIR"?.dll;" LUA_CDIR"loadall.dll" -#else -/* -** Note to distribution maintainers: do NOT patch the following lines! -** Please read ../doc/install.html#distro and pass PREFIX=/usr instead. -*/ -#ifndef LUA_MULTILIB -#define LUA_MULTILIB "lib" -#endif -#ifndef LUA_LMULTILIB -#define LUA_LMULTILIB "lib" -#endif -#define LUA_LROOT "/usr/local" -#define LUA_LUADIR "/lua/5.1/" -#define LUA_LJDIR "/luajit-2.0.4/" - -#ifdef LUA_ROOT -#define LUA_JROOT LUA_ROOT -#define LUA_RLDIR LUA_ROOT "/share" LUA_LUADIR -#define LUA_RCDIR LUA_ROOT "/" LUA_MULTILIB LUA_LUADIR -#define LUA_RLPATH ";" LUA_RLDIR "?.lua;" LUA_RLDIR "?/init.lua" -#define LUA_RCPATH ";" LUA_RCDIR "?.so" -#else -#define LUA_JROOT LUA_LROOT -#define LUA_RLPATH -#define LUA_RCPATH -#endif - -#define LUA_JPATH ";" LUA_JROOT "/share" LUA_LJDIR "?.lua" -#define LUA_LLDIR LUA_LROOT "/share" LUA_LUADIR -#define LUA_LCDIR LUA_LROOT "/" LUA_LMULTILIB LUA_LUADIR -#define LUA_LLPATH ";" LUA_LLDIR "?.lua;" LUA_LLDIR "?/init.lua" -#define LUA_LCPATH1 ";" LUA_LCDIR "?.so" -#define LUA_LCPATH2 ";" LUA_LCDIR "loadall.so" - -#define LUA_PATH_DEFAULT "./?.lua" LUA_JPATH LUA_LLPATH LUA_RLPATH -#define LUA_CPATH_DEFAULT "./?.so" LUA_LCPATH1 LUA_RCPATH LUA_LCPATH2 -#endif - -/* Environment variable names for path overrides and initialization code. */ -#define LUA_PATH "LUA_PATH" -#define LUA_CPATH "LUA_CPATH" -#define LUA_INIT "LUA_INIT" - -/* Special file system characters. */ -#if defined(_WIN32) -#define LUA_DIRSEP "\\" -#else -#define LUA_DIRSEP "/" -#endif -#define LUA_PATHSEP ";" -#define LUA_PATH_MARK "?" -#define LUA_EXECDIR "!" -#define LUA_IGMARK "-" -#define LUA_PATH_CONFIG \ - LUA_DIRSEP "\n" LUA_PATHSEP "\n" LUA_PATH_MARK "\n" \ - LUA_EXECDIR "\n" LUA_IGMARK - -/* Quoting in error messages. */ -#define LUA_QL(x) "'" x "'" -#define LUA_QS LUA_QL("%s") - -/* Various tunables. */ -#define LUAI_MAXSTACK 65500 /* Max. # of stack slots for a thread (<64K). */ -#define LUAI_MAXCSTACK 8000 /* Max. # of stack slots for a C func (<10K). */ -#define LUAI_GCPAUSE 200 /* Pause GC until memory is at 200%. */ -#define LUAI_GCMUL 200 /* Run GC at 200% of allocation speed. */ -#define LUA_MAXCAPTURES 32 /* Max. pattern captures. */ - -/* Compatibility with older library function names. */ -#define LUA_COMPAT_MOD /* OLD: math.mod, NEW: math.fmod */ -#define LUA_COMPAT_GFIND /* OLD: string.gfind, NEW: string.gmatch */ - -/* Configuration for the frontend (the luajit executable). */ -#if defined(luajit_c) -#define LUA_PROGNAME "luajit" /* Fallback frontend name. */ -#define LUA_PROMPT "> " /* Interactive prompt. */ -#define LUA_PROMPT2 ">> " /* Continuation prompt. */ -#define LUA_MAXINPUT 512 /* Max. input line length. */ -#endif - -/* Note: changing the following defines breaks the Lua 5.1 ABI. */ -#define LUA_INTEGER ptrdiff_t -#define LUA_IDSIZE 60 /* Size of lua_Debug.short_src. */ -/* -** Size of lauxlib and io.* on-stack buffers. Weird workaround to avoid using -** unreasonable amounts of stack space, but still retain ABI compatibility. -** Blame Lua for depending on BUFSIZ in the ABI, blame **** for wrecking it. -*/ -#define LUAL_BUFFERSIZE (BUFSIZ > 16384 ? 8192 : BUFSIZ) - -/* The following defines are here only for compatibility with luaconf.h -** from the standard Lua distribution. They must not be changed for LuaJIT. -*/ -#define LUA_NUMBER_DOUBLE -#define LUA_NUMBER double -#define LUAI_UACNUMBER double -#define LUA_NUMBER_SCAN "%lf" -#define LUA_NUMBER_FMT "%.14g" -#define lua_number2str(s, n) sprintf((s), LUA_NUMBER_FMT, (n)) -#define LUAI_MAXNUMBER2STR 32 -#define LUA_INTFRMLEN "l" -#define LUA_INTFRM_T long - -/* Linkage of public API functions. */ -#if defined(LUA_BUILD_AS_DLL) -#if defined(LUA_CORE) || defined(LUA_LIB) -#define LUA_API __declspec(dllexport) -#else -#define LUA_API __declspec(dllimport) -#endif -#else -#define LUA_API extern -#endif - -#define LUALIB_API LUA_API - -/* Support for internal assertions. */ -#if defined(LUA_USE_ASSERT) || defined(LUA_USE_APICHECK) -#include -#endif -#ifdef LUA_USE_ASSERT -#define lua_assert(x) assert(x) -#endif -#ifdef LUA_USE_APICHECK -#define luai_apicheck(L, o) { (void)L; assert(o); } -#else -#define luai_apicheck(L, o) { (void)L; } -#endif - -#endif diff --git a/deps/luajit/src/luajit.c b/deps/luajit/src/luajit.c deleted file mode 100644 index 85d713fb..00000000 --- a/deps/luajit/src/luajit.c +++ /dev/null @@ -1,571 +0,0 @@ -/* -** LuaJIT frontend. Runs commands, scripts, read-eval-print (REPL) etc. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -** -** Major portions taken verbatim or adapted from the Lua interpreter. -** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h -*/ - -#include -#include -#include - -#define luajit_c - -#include "lua.h" -#include "lauxlib.h" -#include "lualib.h" -#include "luajit.h" - -#include "lj_arch.h" - -#if LJ_TARGET_POSIX -#include -#define lua_stdin_is_tty() isatty(0) -#elif LJ_TARGET_WINDOWS -#include -#ifdef __BORLANDC__ -#define lua_stdin_is_tty() isatty(_fileno(stdin)) -#else -#define lua_stdin_is_tty() _isatty(_fileno(stdin)) -#endif -#else -#define lua_stdin_is_tty() 1 -#endif - -#if !LJ_TARGET_CONSOLE -#include -#endif - -static lua_State *globalL = NULL; -static const char *progname = LUA_PROGNAME; - -#if !LJ_TARGET_CONSOLE -static void lstop(lua_State *L, lua_Debug *ar) -{ - (void)ar; /* unused arg. */ - lua_sethook(L, NULL, 0, 0); - /* Avoid luaL_error -- a C hook doesn't add an extra frame. */ - luaL_where(L, 0); - lua_pushfstring(L, "%sinterrupted!", lua_tostring(L, -1)); - lua_error(L); -} - -static void laction(int i) -{ - signal(i, SIG_DFL); /* if another SIGINT happens before lstop, - terminate process (default action) */ - lua_sethook(globalL, lstop, LUA_MASKCALL | LUA_MASKRET | LUA_MASKCOUNT, 1); -} -#endif - -static void print_usage(void) -{ - fprintf(stderr, - "usage: %s [options]... [script [args]...].\n" - "Available options are:\n" - " -e chunk Execute string " LUA_QL("chunk") ".\n" - " -l name Require library " LUA_QL("name") ".\n" - " -b ... Save or list bytecode.\n" - " -j cmd Perform LuaJIT control command.\n" - " -O[opt] Control LuaJIT optimizations.\n" - " -i Enter interactive mode after executing " LUA_QL("script") ".\n" - " -v Show version information.\n" - " -E Ignore environment variables.\n" - " -- Stop handling options.\n" - " - Execute stdin and stop handling options.\n" - , - progname); - fflush(stderr); -} - -static void l_message(const char *pname, const char *msg) -{ - if (pname) fprintf(stderr, "%s: ", pname); - fprintf(stderr, "%s\n", msg); - fflush(stderr); -} - -static int report(lua_State *L, int status) -{ - if (status && !lua_isnil(L, -1)) { - const char *msg = lua_tostring(L, -1); - if (msg == NULL) msg = "(error object is not a string)"; - l_message(progname, msg); - lua_pop(L, 1); - } - return status; -} - -static int traceback(lua_State *L) -{ - if (!lua_isstring(L, 1)) { /* Non-string error object? Try metamethod. */ - if (lua_isnoneornil(L, 1) || - !luaL_callmeta(L, 1, "__tostring") || - !lua_isstring(L, -1)) - return 1; /* Return non-string error object. */ - lua_remove(L, 1); /* Replace object by result of __tostring metamethod. */ - } - luaL_traceback(L, L, lua_tostring(L, 1), 1); - return 1; -} - -static int docall(lua_State *L, int narg, int clear) -{ - int status; - int base = lua_gettop(L) - narg; /* function index */ - lua_pushcfunction(L, traceback); /* push traceback function */ - lua_insert(L, base); /* put it under chunk and args */ -#if !LJ_TARGET_CONSOLE - signal(SIGINT, laction); -#endif - status = lua_pcall(L, narg, (clear ? 0 : LUA_MULTRET), base); -#if !LJ_TARGET_CONSOLE - signal(SIGINT, SIG_DFL); -#endif - lua_remove(L, base); /* remove traceback function */ - /* force a complete garbage collection in case of errors */ - if (status != 0) lua_gc(L, LUA_GCCOLLECT, 0); - return status; -} - -static void print_version(void) -{ - fputs(LUAJIT_VERSION " -- " LUAJIT_COPYRIGHT ". " LUAJIT_URL "\n", stdout); -} - -static void print_jit_status(lua_State *L) -{ - int n; - const char *s; - lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED"); - lua_getfield(L, -1, "jit"); /* Get jit.* module table. */ - lua_remove(L, -2); - lua_getfield(L, -1, "status"); - lua_remove(L, -2); - n = lua_gettop(L); - lua_call(L, 0, LUA_MULTRET); - fputs(lua_toboolean(L, n) ? "JIT: ON" : "JIT: OFF", stdout); - for (n++; (s = lua_tostring(L, n)); n++) { - putc(' ', stdout); - fputs(s, stdout); - } - putc('\n', stdout); -} - -static int getargs(lua_State *L, char **argv, int n) -{ - int narg; - int i; - int argc = 0; - while (argv[argc]) argc++; /* count total number of arguments */ - narg = argc - (n + 1); /* number of arguments to the script */ - luaL_checkstack(L, narg + 3, "too many arguments to script"); - for (i = n+1; i < argc; i++) - lua_pushstring(L, argv[i]); - lua_createtable(L, narg, n + 1); - for (i = 0; i < argc; i++) { - lua_pushstring(L, argv[i]); - lua_rawseti(L, -2, i - n); - } - return narg; -} - -static int dofile(lua_State *L, const char *name) -{ - int status = luaL_loadfile(L, name) || docall(L, 0, 1); - return report(L, status); -} - -static int dostring(lua_State *L, const char *s, const char *name) -{ - int status = luaL_loadbuffer(L, s, strlen(s), name) || docall(L, 0, 1); - return report(L, status); -} - -static int dolibrary(lua_State *L, const char *name) -{ - lua_getglobal(L, "require"); - lua_pushstring(L, name); - return report(L, docall(L, 1, 1)); -} - -static void write_prompt(lua_State *L, int firstline) -{ - const char *p; - lua_getfield(L, LUA_GLOBALSINDEX, firstline ? "_PROMPT" : "_PROMPT2"); - p = lua_tostring(L, -1); - if (p == NULL) p = firstline ? LUA_PROMPT : LUA_PROMPT2; - fputs(p, stdout); - fflush(stdout); - lua_pop(L, 1); /* remove global */ -} - -static int incomplete(lua_State *L, int status) -{ - if (status == LUA_ERRSYNTAX) { - size_t lmsg; - const char *msg = lua_tolstring(L, -1, &lmsg); - const char *tp = msg + lmsg - (sizeof(LUA_QL("")) - 1); - if (strstr(msg, LUA_QL("")) == tp) { - lua_pop(L, 1); - return 1; - } - } - return 0; /* else... */ -} - -static int pushline(lua_State *L, int firstline) -{ - char buf[LUA_MAXINPUT]; - write_prompt(L, firstline); - if (fgets(buf, LUA_MAXINPUT, stdin)) { - size_t len = strlen(buf); - if (len > 0 && buf[len-1] == '\n') - buf[len-1] = '\0'; - if (firstline && buf[0] == '=') - lua_pushfstring(L, "return %s", buf+1); - else - lua_pushstring(L, buf); - return 1; - } - return 0; -} - -static int loadline(lua_State *L) -{ - int status; - lua_settop(L, 0); - if (!pushline(L, 1)) - return -1; /* no input */ - for (;;) { /* repeat until gets a complete line */ - status = luaL_loadbuffer(L, lua_tostring(L, 1), lua_strlen(L, 1), "=stdin"); - if (!incomplete(L, status)) break; /* cannot try to add lines? */ - if (!pushline(L, 0)) /* no more input? */ - return -1; - lua_pushliteral(L, "\n"); /* add a new line... */ - lua_insert(L, -2); /* ...between the two lines */ - lua_concat(L, 3); /* join them */ - } - lua_remove(L, 1); /* remove line */ - return status; -} - -static void dotty(lua_State *L) -{ - int status; - const char *oldprogname = progname; - progname = NULL; - while ((status = loadline(L)) != -1) { - if (status == 0) status = docall(L, 0, 0); - report(L, status); - if (status == 0 && lua_gettop(L) > 0) { /* any result to print? */ - lua_getglobal(L, "print"); - lua_insert(L, 1); - if (lua_pcall(L, lua_gettop(L)-1, 0, 0) != 0) - l_message(progname, - lua_pushfstring(L, "error calling " LUA_QL("print") " (%s)", - lua_tostring(L, -1))); - } - } - lua_settop(L, 0); /* clear stack */ - fputs("\n", stdout); - fflush(stdout); - progname = oldprogname; -} - -static int handle_script(lua_State *L, char **argv, int n) -{ - int status; - const char *fname; - int narg = getargs(L, argv, n); /* collect arguments */ - lua_setglobal(L, "arg"); - fname = argv[n]; - if (strcmp(fname, "-") == 0 && strcmp(argv[n-1], "--") != 0) - fname = NULL; /* stdin */ - status = luaL_loadfile(L, fname); - lua_insert(L, -(narg+1)); - if (status == 0) - status = docall(L, narg, 0); - else - lua_pop(L, narg); - return report(L, status); -} - -/* Load add-on module. */ -static int loadjitmodule(lua_State *L) -{ - lua_getglobal(L, "require"); - lua_pushliteral(L, "jit."); - lua_pushvalue(L, -3); - lua_concat(L, 2); - if (lua_pcall(L, 1, 1, 0)) { - const char *msg = lua_tostring(L, -1); - if (msg && !strncmp(msg, "module ", 7)) - goto nomodule; - return report(L, 1); - } - lua_getfield(L, -1, "start"); - if (lua_isnil(L, -1)) { - nomodule: - l_message(progname, - "unknown luaJIT command or jit.* modules not installed"); - return 1; - } - lua_remove(L, -2); /* Drop module table. */ - return 0; -} - -/* Run command with options. */ -static int runcmdopt(lua_State *L, const char *opt) -{ - int narg = 0; - if (opt && *opt) { - for (;;) { /* Split arguments. */ - const char *p = strchr(opt, ','); - narg++; - if (!p) break; - if (p == opt) - lua_pushnil(L); - else - lua_pushlstring(L, opt, (size_t)(p - opt)); - opt = p + 1; - } - if (*opt) - lua_pushstring(L, opt); - else - lua_pushnil(L); - } - return report(L, lua_pcall(L, narg, 0, 0)); -} - -/* JIT engine control command: try jit library first or load add-on module. */ -static int dojitcmd(lua_State *L, const char *cmd) -{ - const char *opt = strchr(cmd, '='); - lua_pushlstring(L, cmd, opt ? (size_t)(opt - cmd) : strlen(cmd)); - lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED"); - lua_getfield(L, -1, "jit"); /* Get jit.* module table. */ - lua_remove(L, -2); - lua_pushvalue(L, -2); - lua_gettable(L, -2); /* Lookup library function. */ - if (!lua_isfunction(L, -1)) { - lua_pop(L, 2); /* Drop non-function and jit.* table, keep module name. */ - if (loadjitmodule(L)) - return 1; - } else { - lua_remove(L, -2); /* Drop jit.* table. */ - } - lua_remove(L, -2); /* Drop module name. */ - return runcmdopt(L, opt ? opt+1 : opt); -} - -/* Optimization flags. */ -static int dojitopt(lua_State *L, const char *opt) -{ - lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED"); - lua_getfield(L, -1, "jit.opt"); /* Get jit.opt.* module table. */ - lua_remove(L, -2); - lua_getfield(L, -1, "start"); - lua_remove(L, -2); - return runcmdopt(L, opt); -} - -/* Save or list bytecode. */ -static int dobytecode(lua_State *L, char **argv) -{ - int narg = 0; - lua_pushliteral(L, "bcsave"); - if (loadjitmodule(L)) - return 1; - if (argv[0][2]) { - narg++; - argv[0][1] = '-'; - lua_pushstring(L, argv[0]+1); - } - for (argv++; *argv != NULL; narg++, argv++) - lua_pushstring(L, *argv); - return report(L, lua_pcall(L, narg, 0, 0)); -} - -/* check that argument has no extra characters at the end */ -#define notail(x) {if ((x)[2] != '\0') return -1;} - -#define FLAGS_INTERACTIVE 1 -#define FLAGS_VERSION 2 -#define FLAGS_EXEC 4 -#define FLAGS_OPTION 8 -#define FLAGS_NOENV 16 - -static int collectargs(char **argv, int *flags) -{ - int i; - for (i = 1; argv[i] != NULL; i++) { - if (argv[i][0] != '-') /* Not an option? */ - return i; - switch (argv[i][1]) { /* Check option. */ - case '-': - notail(argv[i]); - return (argv[i+1] != NULL ? i+1 : 0); - case '\0': - return i; - case 'i': - notail(argv[i]); - *flags |= FLAGS_INTERACTIVE; - /* fallthrough */ - case 'v': - notail(argv[i]); - *flags |= FLAGS_VERSION; - break; - case 'e': - *flags |= FLAGS_EXEC; - case 'j': /* LuaJIT extension */ - case 'l': - *flags |= FLAGS_OPTION; - if (argv[i][2] == '\0') { - i++; - if (argv[i] == NULL) return -1; - } - break; - case 'O': break; /* LuaJIT extension */ - case 'b': /* LuaJIT extension */ - if (*flags) return -1; - *flags |= FLAGS_EXEC; - return 0; - case 'E': - *flags |= FLAGS_NOENV; - break; - default: return -1; /* invalid option */ - } - } - return 0; -} - -static int runargs(lua_State *L, char **argv, int n) -{ - int i; - for (i = 1; i < n; i++) { - if (argv[i] == NULL) continue; - lua_assert(argv[i][0] == '-'); - switch (argv[i][1]) { /* option */ - case 'e': { - const char *chunk = argv[i] + 2; - if (*chunk == '\0') chunk = argv[++i]; - lua_assert(chunk != NULL); - if (dostring(L, chunk, "=(command line)") != 0) - return 1; - break; - } - case 'l': { - const char *filename = argv[i] + 2; - if (*filename == '\0') filename = argv[++i]; - lua_assert(filename != NULL); - if (dolibrary(L, filename)) - return 1; /* stop if file fails */ - break; - } - case 'j': { /* LuaJIT extension */ - const char *cmd = argv[i] + 2; - if (*cmd == '\0') cmd = argv[++i]; - lua_assert(cmd != NULL); - if (dojitcmd(L, cmd)) - return 1; - break; - } - case 'O': /* LuaJIT extension */ - if (dojitopt(L, argv[i] + 2)) - return 1; - break; - case 'b': /* LuaJIT extension */ - return dobytecode(L, argv+i); - default: break; - } - } - return 0; -} - -static int handle_luainit(lua_State *L) -{ -#if LJ_TARGET_CONSOLE - const char *init = NULL; -#else - const char *init = getenv(LUA_INIT); -#endif - if (init == NULL) - return 0; /* status OK */ - else if (init[0] == '@') - return dofile(L, init+1); - else - return dostring(L, init, "=" LUA_INIT); -} - -static struct Smain { - char **argv; - int argc; - int status; -} smain; - -static int pmain(lua_State *L) -{ - struct Smain *s = &smain; - char **argv = s->argv; - int script; - int flags = 0; - globalL = L; - if (argv[0] && argv[0][0]) progname = argv[0]; - LUAJIT_VERSION_SYM(); /* linker-enforced version check */ - script = collectargs(argv, &flags); - if (script < 0) { /* invalid args? */ - print_usage(); - s->status = 1; - return 0; - } - if ((flags & FLAGS_NOENV)) { - lua_pushboolean(L, 1); - lua_setfield(L, LUA_REGISTRYINDEX, "LUA_NOENV"); - } - lua_gc(L, LUA_GCSTOP, 0); /* stop collector during initialization */ - luaL_openlibs(L); /* open libraries */ - lua_gc(L, LUA_GCRESTART, -1); - if (!(flags & FLAGS_NOENV)) { - s->status = handle_luainit(L); - if (s->status != 0) return 0; - } - if ((flags & FLAGS_VERSION)) print_version(); - s->status = runargs(L, argv, (script > 0) ? script : s->argc); - if (s->status != 0) return 0; - if (script) { - s->status = handle_script(L, argv, script); - if (s->status != 0) return 0; - } - if ((flags & FLAGS_INTERACTIVE)) { - print_jit_status(L); - dotty(L); - } else if (script == 0 && !(flags & (FLAGS_EXEC|FLAGS_VERSION))) { - if (lua_stdin_is_tty()) { - print_version(); - print_jit_status(L); - dotty(L); - } else { - dofile(L, NULL); /* executes stdin as a file */ - } - } - return 0; -} - -int main(int argc, char **argv) -{ - int status; - lua_State *L = lua_open(); /* create state */ - if (L == NULL) { - l_message(argv[0], "cannot create state: not enough memory"); - return EXIT_FAILURE; - } - smain.argc = argc; - smain.argv = argv; - status = lua_cpcall(L, pmain, NULL); - report(L, status); - lua_close(L); - return (status || smain.status) ? EXIT_FAILURE : EXIT_SUCCESS; -} - diff --git a/deps/luajit/src/luajit.h b/deps/luajit/src/luajit.h deleted file mode 100644 index 9ced18eb..00000000 --- a/deps/luajit/src/luajit.h +++ /dev/null @@ -1,70 +0,0 @@ -/* -** LuaJIT -- a Just-In-Time Compiler for Lua. http://luajit.org/ -** -** Copyright (C) 2005-2015 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 ] -*/ - -#ifndef _LUAJIT_H -#define _LUAJIT_H - -#include "lua.h" - -#define LUAJIT_VERSION "LuaJIT 2.0.4" -#define LUAJIT_VERSION_NUM 20004 /* Version 2.0.4 = 02.00.04. */ -#define LUAJIT_VERSION_SYM luaJIT_version_2_0_4 -#define LUAJIT_COPYRIGHT "Copyright (C) 2005-2015 Mike Pall" -#define LUAJIT_URL "http://luajit.org/" - -/* Modes for luaJIT_setmode. */ -#define LUAJIT_MODE_MASK 0x00ff - -enum { - LUAJIT_MODE_ENGINE, /* Set mode for whole JIT engine. */ - LUAJIT_MODE_DEBUG, /* Set debug mode (idx = level). */ - - LUAJIT_MODE_FUNC, /* Change mode for a function. */ - LUAJIT_MODE_ALLFUNC, /* Recurse into subroutine protos. */ - LUAJIT_MODE_ALLSUBFUNC, /* Change only the subroutines. */ - - LUAJIT_MODE_TRACE, /* Flush a compiled trace. */ - - LUAJIT_MODE_WRAPCFUNC = 0x10, /* Set wrapper mode for C function calls. */ - - LUAJIT_MODE_MAX -}; - -/* Flags or'ed in to the mode. */ -#define LUAJIT_MODE_OFF 0x0000 /* Turn feature off. */ -#define LUAJIT_MODE_ON 0x0100 /* Turn feature on. */ -#define LUAJIT_MODE_FLUSH 0x0200 /* Flush JIT-compiled code. */ - -/* LuaJIT public C API. */ - -/* Control the JIT engine. */ -LUA_API int luaJIT_setmode(lua_State *L, int idx, int mode); - -/* Enforce (dynamic) linker error for version mismatches. Call from main. */ -LUA_API void LUAJIT_VERSION_SYM(void); - -#endif diff --git a/deps/luajit/src/lualib.h b/deps/luajit/src/lualib.h deleted file mode 100644 index 96530e79..00000000 --- a/deps/luajit/src/lualib.h +++ /dev/null @@ -1,43 +0,0 @@ -/* -** Standard library header. -** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -*/ - -#ifndef _LUALIB_H -#define _LUALIB_H - -#include "lua.h" - -#define LUA_FILEHANDLE "FILE*" - -#define LUA_COLIBNAME "coroutine" -#define LUA_MATHLIBNAME "math" -#define LUA_STRLIBNAME "string" -#define LUA_TABLIBNAME "table" -#define LUA_IOLIBNAME "io" -#define LUA_OSLIBNAME "os" -#define LUA_LOADLIBNAME "package" -#define LUA_DBLIBNAME "debug" -#define LUA_BITLIBNAME "bit" -#define LUA_JITLIBNAME "jit" -#define LUA_FFILIBNAME "ffi" - -LUALIB_API int luaopen_base(lua_State *L); -LUALIB_API int luaopen_math(lua_State *L); -LUALIB_API int luaopen_string(lua_State *L); -LUALIB_API int luaopen_table(lua_State *L); -LUALIB_API int luaopen_io(lua_State *L); -LUALIB_API int luaopen_os(lua_State *L); -LUALIB_API int luaopen_package(lua_State *L); -LUALIB_API int luaopen_debug(lua_State *L); -LUALIB_API int luaopen_bit(lua_State *L); -LUALIB_API int luaopen_jit(lua_State *L); -LUALIB_API int luaopen_ffi(lua_State *L); - -LUALIB_API void luaL_openlibs(lua_State *L); - -#ifndef lua_assert -#define lua_assert(x) ((void)0) -#endif - -#endif diff --git a/deps/luajit/src/msvcbuild.bat b/deps/luajit/src/msvcbuild.bat deleted file mode 100644 index 4b501855..00000000 --- a/deps/luajit/src/msvcbuild.bat +++ /dev/null @@ -1,113 +0,0 @@ -@rem Script to build LuaJIT with MSVC. -@rem Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -@rem -@rem Either open a "Visual Studio .NET Command Prompt" -@rem (Note that the Express Edition does not contain an x64 compiler) -@rem -or- -@rem Open a "Windows SDK Command Shell" and set the compiler environment: -@rem setenv /release /x86 -@rem -or- -@rem setenv /release /x64 -@rem -@rem Then cd to this directory and run this script. - -@if not defined INCLUDE goto :FAIL - -@setlocal -@set LJCOMPILE=cl /nologo /c /O2 /W3 /D_CRT_SECURE_NO_DEPRECATE -@set LJLINK=link /nologo -@set LJMT=mt /nologo -@set LJLIB=lib /nologo /nodefaultlib -@set DASMDIR=..\dynasm -@set DASM=%DASMDIR%\dynasm.lua -@set LJDLLNAME=lua51.dll -@set LJLIBNAME=lua51.lib -@set ALL_LIB=lib_base.c lib_math.c lib_bit.c lib_string.c lib_table.c lib_io.c lib_os.c lib_package.c lib_debug.c lib_jit.c lib_ffi.c - -%LJCOMPILE% host\minilua.c -@if errorlevel 1 goto :BAD -%LJLINK% /out:minilua.exe minilua.obj -@if errorlevel 1 goto :BAD -if exist minilua.exe.manifest^ - %LJMT% -manifest minilua.exe.manifest -outputresource:minilua.exe - -@set DASMFLAGS=-D WIN -D JIT -D FFI -D P64 -@set LJARCH=x64 -@minilua -@if errorlevel 8 goto :X64 -@set DASMFLAGS=-D WIN -D JIT -D FFI -@set LJARCH=x86 -:X64 -minilua %DASM% -LN %DASMFLAGS% -o host\buildvm_arch.h vm_x86.dasc -@if errorlevel 1 goto :BAD - -%LJCOMPILE% /I "." /I %DASMDIR% host\buildvm*.c -@if errorlevel 1 goto :BAD -%LJLINK% /out:buildvm.exe buildvm*.obj -@if errorlevel 1 goto :BAD -if exist buildvm.exe.manifest^ - %LJMT% -manifest buildvm.exe.manifest -outputresource:buildvm.exe - -buildvm -m peobj -o lj_vm.obj -@if errorlevel 1 goto :BAD -buildvm -m bcdef -o lj_bcdef.h %ALL_LIB% -@if errorlevel 1 goto :BAD -buildvm -m ffdef -o lj_ffdef.h %ALL_LIB% -@if errorlevel 1 goto :BAD -buildvm -m libdef -o lj_libdef.h %ALL_LIB% -@if errorlevel 1 goto :BAD -buildvm -m recdef -o lj_recdef.h %ALL_LIB% -@if errorlevel 1 goto :BAD -buildvm -m vmdef -o jit\vmdef.lua %ALL_LIB% -@if errorlevel 1 goto :BAD -buildvm -m folddef -o lj_folddef.h lj_opt_fold.c -@if errorlevel 1 goto :BAD - -@if "%1" neq "debug" goto :NODEBUG -@shift -@set LJCOMPILE=%LJCOMPILE% /Zi -@set LJLINK=%LJLINK% /debug -:NODEBUG -@if "%1"=="amalg" goto :AMALGDLL -@if "%1"=="static" goto :STATIC -%LJCOMPILE% /MD /DLUA_BUILD_AS_DLL lj_*.c lib_*.c -@if errorlevel 1 goto :BAD -%LJLINK% /DLL /out:%LJDLLNAME% lj_*.obj lib_*.obj -@if errorlevel 1 goto :BAD -@goto :MTDLL -:STATIC -%LJCOMPILE% lj_*.c lib_*.c -@if errorlevel 1 goto :BAD -%LJLIB% /OUT:%LJLIBNAME% lj_*.obj lib_*.obj -@if errorlevel 1 goto :BAD -@goto :MTDLL -:AMALGDLL -%LJCOMPILE% /MD /DLUA_BUILD_AS_DLL ljamalg.c -@if errorlevel 1 goto :BAD -%LJLINK% /DLL /out:%LJDLLNAME% ljamalg.obj lj_vm.obj -@if errorlevel 1 goto :BAD -:MTDLL -if exist %LJDLLNAME%.manifest^ - %LJMT% -manifest %LJDLLNAME%.manifest -outputresource:%LJDLLNAME%;2 - -%LJCOMPILE% luajit.c -@if errorlevel 1 goto :BAD -%LJLINK% /out:luajit.exe luajit.obj %LJLIBNAME% -@if errorlevel 1 goto :BAD -if exist luajit.exe.manifest^ - %LJMT% -manifest luajit.exe.manifest -outputresource:luajit.exe - -@del *.obj *.manifest minilua.exe buildvm.exe -@echo. -@echo === Successfully built LuaJIT for Windows/%LJARCH% === - -@goto :END -:BAD -@echo. -@echo ******************************************************* -@echo *** Build FAILED -- Please check the error messages *** -@echo ******************************************************* -@goto :END -:FAIL -@echo You must open a "Visual Studio .NET Command Prompt" to run this script -:END diff --git a/deps/luajit/src/ps4build.bat b/deps/luajit/src/ps4build.bat deleted file mode 100644 index 42fc9a64..00000000 --- a/deps/luajit/src/ps4build.bat +++ /dev/null @@ -1,103 +0,0 @@ -@rem Script to build LuaJIT with the PS4 SDK. -@rem Donated to the public domain. -@rem -@rem Open a "Visual Studio .NET Command Prompt" (64 bit host compiler) -@rem Then cd to this directory and run this script. - -@if not defined INCLUDE goto :FAIL -@if not defined SCE_ORBIS_SDK_DIR goto :FAIL - -@setlocal -@rem ---- Host compiler ---- -@set LJCOMPILE=cl /nologo /c /MD /O2 /W3 /D_CRT_SECURE_NO_DEPRECATE -@set LJLINK=link /nologo -@set LJMT=mt /nologo -@set DASMDIR=..\dynasm -@set DASM=%DASMDIR%\dynasm.lua -@set ALL_LIB=lib_base.c lib_math.c lib_bit.c lib_string.c lib_table.c lib_io.c lib_os.c lib_package.c lib_debug.c lib_jit.c lib_ffi.c - -%LJCOMPILE% host\minilua.c -@if errorlevel 1 goto :BAD -%LJLINK% /out:minilua.exe minilua.obj -@if errorlevel 1 goto :BAD -if exist minilua.exe.manifest^ - %LJMT% -manifest minilua.exe.manifest -outputresource:minilua.exe - -@rem Check for 64 bit host compiler. -@minilua -@if not errorlevel 8 goto :FAIL - -@set DASMFLAGS=-D P64 -minilua %DASM% -LN %DASMFLAGS% -o host\buildvm_arch.h vm_x86.dasc -@if errorlevel 1 goto :BAD - -%LJCOMPILE% /I "." /I %DASMDIR% -DLUAJIT_TARGET=LUAJIT_ARCH_X64 -DLUAJIT_OS=LUAJIT_OS_OTHER -DLUAJIT_DISABLE_JIT -DLUAJIT_DISABLE_FFI host\buildvm*.c -@if errorlevel 1 goto :BAD -%LJLINK% /out:buildvm.exe buildvm*.obj -@if errorlevel 1 goto :BAD -if exist buildvm.exe.manifest^ - %LJMT% -manifest buildvm.exe.manifest -outputresource:buildvm.exe - -buildvm -m elfasm -o lj_vm.s -@if errorlevel 1 goto :BAD -buildvm -m bcdef -o lj_bcdef.h %ALL_LIB% -@if errorlevel 1 goto :BAD -buildvm -m ffdef -o lj_ffdef.h %ALL_LIB% -@if errorlevel 1 goto :BAD -buildvm -m libdef -o lj_libdef.h %ALL_LIB% -@if errorlevel 1 goto :BAD -buildvm -m recdef -o lj_recdef.h %ALL_LIB% -@if errorlevel 1 goto :BAD -buildvm -m vmdef -o jit\vmdef.lua %ALL_LIB% -@if errorlevel 1 goto :BAD -buildvm -m folddef -o lj_folddef.h lj_opt_fold.c -@if errorlevel 1 goto :BAD - -@rem ---- Cross compiler ---- -@set LJCOMPILE="%SCE_ORBIS_SDK_DIR%\host_tools\bin\orbis-clang" -c -Wall -DLUAJIT_DISABLE_FFI -@set LJLIB="%SCE_ORBIS_SDK_DIR%\host_tools\bin\orbis-ar" rcus -@set INCLUDE="" - -orbis-as -o lj_vm.o lj_vm.s - -@if "%1" neq "debug" goto :NODEBUG -@shift -@set LJCOMPILE=%LJCOMPILE% -g -O0 -@set TARGETLIB=libluajitD.a -goto :BUILD -:NODEBUG -@set LJCOMPILE=%LJCOMPILE% -O2 -@set TARGETLIB=libluajit.a -:BUILD -del %TARGETLIB% -@if "%1"=="amalg" goto :AMALG -for %%f in (lj_*.c lib_*.c) do ( - %LJCOMPILE% %%f - @if errorlevel 1 goto :BAD -) - -%LJLIB% %TARGETLIB% lj_*.o lib_*.o -@if errorlevel 1 goto :BAD -@goto :NOAMALG -:AMALG -%LJCOMPILE% ljamalg.c -@if errorlevel 1 goto :BAD -%LJLIB% %TARGETLIB% ljamalg.o lj_vm.o -@if errorlevel 1 goto :BAD -:NOAMALG - -@del *.o *.obj *.manifest minilua.exe buildvm.exe -@echo. -@echo === Successfully built LuaJIT for PS4 === - -@goto :END -:BAD -@echo. -@echo ******************************************************* -@echo *** Build FAILED -- Please check the error messages *** -@echo ******************************************************* -@goto :END -:FAIL -@echo To run this script you must open a "Visual Studio .NET Command Prompt" -@echo (64 bit host compiler). The PS4 Orbis SDK must be installed, too. -:END diff --git a/deps/luajit/src/psvitabuild.bat b/deps/luajit/src/psvitabuild.bat deleted file mode 100644 index 3991dc65..00000000 --- a/deps/luajit/src/psvitabuild.bat +++ /dev/null @@ -1,93 +0,0 @@ -@rem Script to build LuaJIT with the PS Vita SDK. -@rem Donated to the public domain. -@rem -@rem Open a "Visual Studio .NET Command Prompt" (32 bit host compiler) -@rem Then cd to this directory and run this script. - -@if not defined INCLUDE goto :FAIL -@if not defined SCE_PSP2_SDK_DIR goto :FAIL - -@setlocal -@rem ---- Host compiler ---- -@set LJCOMPILE=cl /nologo /c /MD /O2 /W3 /D_CRT_SECURE_NO_DEPRECATE -@set LJLINK=link /nologo -@set LJMT=mt /nologo -@set DASMDIR=..\dynasm -@set DASM=%DASMDIR%\dynasm.lua -@set ALL_LIB=lib_base.c lib_math.c lib_bit.c lib_string.c lib_table.c lib_io.c lib_os.c lib_package.c lib_debug.c lib_jit.c lib_ffi.c - -%LJCOMPILE% host\minilua.c -@if errorlevel 1 goto :BAD -%LJLINK% /out:minilua.exe minilua.obj -@if errorlevel 1 goto :BAD -if exist minilua.exe.manifest^ - %LJMT% -manifest minilua.exe.manifest -outputresource:minilua.exe - -@rem Check for 32 bit host compiler. -@minilua -@if errorlevel 8 goto :FAIL - -@set DASMFLAGS=-D FPU -D HFABI -minilua %DASM% -LN %DASMFLAGS% -o host\buildvm_arch.h vm_arm.dasc -@if errorlevel 1 goto :BAD - -%LJCOMPILE% /I "." /I %DASMDIR% -DLUAJIT_TARGET=LUAJIT_ARCH_ARM -DLUAJIT_OS=LUAJIT_OS_OTHER -DLUAJIT_DISABLE_JIT -DLUAJIT_DISABLE_FFI -DLJ_TARGET_PSVITA=1 host\buildvm*.c -@if errorlevel 1 goto :BAD -%LJLINK% /out:buildvm.exe buildvm*.obj -@if errorlevel 1 goto :BAD -if exist buildvm.exe.manifest^ - %LJMT% -manifest buildvm.exe.manifest -outputresource:buildvm.exe - -buildvm -m elfasm -o lj_vm.s -@if errorlevel 1 goto :BAD -buildvm -m bcdef -o lj_bcdef.h %ALL_LIB% -@if errorlevel 1 goto :BAD -buildvm -m ffdef -o lj_ffdef.h %ALL_LIB% -@if errorlevel 1 goto :BAD -buildvm -m libdef -o lj_libdef.h %ALL_LIB% -@if errorlevel 1 goto :BAD -buildvm -m recdef -o lj_recdef.h %ALL_LIB% -@if errorlevel 1 goto :BAD -buildvm -m vmdef -o jit\vmdef.lua %ALL_LIB% -@if errorlevel 1 goto :BAD -buildvm -m folddef -o lj_folddef.h lj_opt_fold.c -@if errorlevel 1 goto :BAD - -@rem ---- Cross compiler ---- -@set LJCOMPILE="%SCE_PSP2_SDK_DIR%\host_tools\build\bin\psp2snc" -c -w -DLUAJIT_DISABLE_FFI -DLUAJIT_USE_SYSMALLOC -@set LJLIB="%SCE_PSP2_SDK_DIR%\host_tools\build\bin\psp2ld32" -r --output= -@set INCLUDE="" - -"%SCE_PSP2_SDK_DIR%\host_tools\build\bin\psp2as" -o lj_vm.o lj_vm.s - -@if "%1" neq "debug" goto :NODEBUG -@shift -@set LJCOMPILE=%LJCOMPILE% -g -O0 -@set TARGETLIB=libluajitD.a -goto :BUILD -:NODEBUG -@set LJCOMPILE=%LJCOMPILE% -O2 -@set TARGETLIB=libluajit.a -:BUILD -del %TARGETLIB% - -%LJCOMPILE% ljamalg.c -@if errorlevel 1 goto :BAD -%LJLIB%%TARGETLIB% ljamalg.o lj_vm.o -@if errorlevel 1 goto :BAD - -@del *.o *.obj *.manifest minilua.exe buildvm.exe -@echo. -@echo === Successfully built LuaJIT for PS Vita === - -@goto :END -:BAD -@echo. -@echo ******************************************************* -@echo *** Build FAILED -- Please check the error messages *** -@echo ******************************************************* -@goto :END -:FAIL -@echo To run this script you must open a "Visual Studio .NET Command Prompt" -@echo (32 bit host compiler). The PS Vita SDK must be installed, too. -:END diff --git a/deps/luajit/src/vm_arm.dasc b/deps/luajit/src/vm_arm.dasc deleted file mode 100644 index 457efa63..00000000 --- a/deps/luajit/src/vm_arm.dasc +++ /dev/null @@ -1,4486 +0,0 @@ -|// Low-level VM code for ARM CPUs. -|// Bytecode interpreter, fast functions and helper functions. -|// Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -| -|.arch arm -|.section code_op, code_sub -| -|.actionlist build_actionlist -|.globals GLOB_ -|.globalnames globnames -|.externnames extnames -| -|// Note: The ragged indentation of the instructions is intentional. -|// The starting columns indicate data dependencies. -| -|//----------------------------------------------------------------------- -| -|// Fixed register assignments for the interpreter. -| -|// The following must be C callee-save. -|.define MASKR8, r4 // 255*8 constant for fast bytecode decoding. -|.define KBASE, r5 // Constants of current Lua function. -|.define PC, r6 // Next PC. -|.define DISPATCH, r7 // Opcode dispatch table. -|.define LREG, r8 // Register holding lua_State (also in SAVE_L). -| -|// C callee-save in EABI, but often refetched. Temporary in iOS 3.0+. -|.define BASE, r9 // Base of current Lua stack frame. -| -|// The following temporaries are not saved across C calls, except for RA/RC. -|.define RA, r10 // Callee-save. -|.define RC, r11 // Callee-save. -|.define RB, r12 -|.define OP, r12 // Overlaps RB, must not be lr. -|.define INS, lr -| -|// Calling conventions. Also used as temporaries. -|.define CARG1, r0 -|.define CARG2, r1 -|.define CARG3, r2 -|.define CARG4, r3 -|.define CARG12, r0 // For 1st soft-fp double. -|.define CARG34, r2 // For 2nd soft-fp double. -| -|.define CRET1, r0 -|.define CRET2, r1 -| -|// Stack layout while in interpreter. Must match with lj_frame.h. -|.define SAVE_R4, [sp, #28] -|.define CFRAME_SPACE, #28 -|.define SAVE_ERRF, [sp, #24] -|.define SAVE_NRES, [sp, #20] -|.define SAVE_CFRAME, [sp, #16] -|.define SAVE_L, [sp, #12] -|.define SAVE_PC, [sp, #8] -|.define SAVE_MULTRES, [sp, #4] -|.define ARG5, [sp] -| -|.define TMPDhi, [sp, #4] -|.define TMPDlo, [sp] -|.define TMPD, [sp] -|.define TMPDp, sp -| -|.if FPU -|.macro saveregs -| push {r5, r6, r7, r8, r9, r10, r11, lr} -| vpush {d8-d15} -| sub sp, sp, CFRAME_SPACE+4 -| str r4, SAVE_R4 -|.endmacro -|.macro restoreregs_ret -| ldr r4, SAVE_R4 -| add sp, sp, CFRAME_SPACE+4 -| vpop {d8-d15} -| pop {r5, r6, r7, r8, r9, r10, r11, pc} -|.endmacro -|.else -|.macro saveregs -| push {r4, r5, r6, r7, r8, r9, r10, r11, lr} -| sub sp, sp, CFRAME_SPACE -|.endmacro -|.macro restoreregs_ret -| add sp, sp, CFRAME_SPACE -| pop {r4, r5, r6, r7, r8, r9, r10, r11, pc} -|.endmacro -|.endif -| -|// Type definitions. Some of these are only used for documentation. -|.type L, lua_State, LREG -|.type GL, global_State -|.type TVALUE, TValue -|.type GCOBJ, GCobj -|.type STR, GCstr -|.type TAB, GCtab -|.type LFUNC, GCfuncL -|.type CFUNC, GCfuncC -|.type PROTO, GCproto -|.type UPVAL, GCupval -|.type NODE, Node -|.type NARGS8, int -|.type TRACE, GCtrace -| -|//----------------------------------------------------------------------- -| -|// Trap for not-yet-implemented parts. -|.macro NYI; ud; .endmacro -| -|//----------------------------------------------------------------------- -| -|// Access to frame relative to BASE. -|.define FRAME_FUNC, #-8 -|.define FRAME_PC, #-4 -| -|.macro decode_RA8, dst, ins; and dst, MASKR8, ins, lsr #5; .endmacro -|.macro decode_RB8, dst, ins; and dst, MASKR8, ins, lsr #21; .endmacro -|.macro decode_RC8, dst, ins; and dst, MASKR8, ins, lsr #13; .endmacro -|.macro decode_RD, dst, ins; lsr dst, ins, #16; .endmacro -|.macro decode_OP, dst, ins; and dst, ins, #255; .endmacro -| -|// Instruction fetch. -|.macro ins_NEXT1 -| ldrb OP, [PC] -|.endmacro -|.macro ins_NEXT2 -| ldr INS, [PC], #4 -|.endmacro -|// Instruction decode+dispatch. -|.macro ins_NEXT3 -| ldr OP, [DISPATCH, OP, lsl #2] -| decode_RA8 RA, INS -| decode_RD RC, INS -| bx OP -|.endmacro -|.macro ins_NEXT -| ins_NEXT1 -| ins_NEXT2 -| ins_NEXT3 -|.endmacro -| -|// Instruction footer. -|.if 1 -| // Replicated dispatch. Less unpredictable branches, but higher I-Cache use. -| .define ins_next, ins_NEXT -| .define ins_next_, ins_NEXT -| .define ins_next1, ins_NEXT1 -| .define ins_next2, ins_NEXT2 -| .define ins_next3, ins_NEXT3 -|.else -| // Common dispatch. Lower I-Cache use, only one (very) unpredictable branch. -| // Affects only certain kinds of benchmarks (and only with -j off). -| .macro ins_next -| b ->ins_next -| .endmacro -| .macro ins_next1 -| .endmacro -| .macro ins_next2 -| .endmacro -| .macro ins_next3 -| b ->ins_next -| .endmacro -| .macro ins_next_ -| ->ins_next: -| ins_NEXT -| .endmacro -|.endif -| -|// Avoid register name substitution for field name. -#define field_pc pc -| -|// Call decode and dispatch. -|.macro ins_callt -| // BASE = new base, CARG3 = LFUNC/CFUNC, RC = nargs*8, FRAME_PC(BASE) = PC -| ldr PC, LFUNC:CARG3->field_pc -| ldrb OP, [PC] // STALL: load PC. early PC. -| ldr INS, [PC], #4 -| ldr OP, [DISPATCH, OP, lsl #2] // STALL: load OP. early OP. -| decode_RA8 RA, INS -| add RA, RA, BASE -| bx OP -|.endmacro -| -|.macro ins_call -| // BASE = new base, CARG3 = LFUNC/CFUNC, RC = nargs*8, PC = caller PC -| str PC, [BASE, FRAME_PC] -| ins_callt // STALL: locked PC. -|.endmacro -| -|//----------------------------------------------------------------------- -| -|// Macros to test operand types. -|.macro checktp, reg, tp; cmn reg, #-tp; .endmacro -|.macro checktpeq, reg, tp; cmneq reg, #-tp; .endmacro -|.macro checktpne, reg, tp; cmnne reg, #-tp; .endmacro -|.macro checkstr, reg, target; checktp reg, LJ_TSTR; bne target; .endmacro -|.macro checktab, reg, target; checktp reg, LJ_TTAB; bne target; .endmacro -|.macro checkfunc, reg, target; checktp reg, LJ_TFUNC; bne target; .endmacro -| -|// Assumes DISPATCH is relative to GL. -#define DISPATCH_GL(field) (GG_DISP2G + (int)offsetof(global_State, field)) -#define DISPATCH_J(field) (GG_DISP2J + (int)offsetof(jit_State, field)) -| -#define PC2PROTO(field) ((int)offsetof(GCproto, field)-(int)sizeof(GCproto)) -| -|.macro hotcheck, delta -| lsr CARG1, PC, #1 -| and CARG1, CARG1, #126 -| sub CARG1, CARG1, #-GG_DISP2HOT -| ldrh CARG2, [DISPATCH, CARG1] -| subs CARG2, CARG2, #delta -| strh CARG2, [DISPATCH, CARG1] -|.endmacro -| -|.macro hotloop -| hotcheck HOTCOUNT_LOOP -| blo ->vm_hotloop -|.endmacro -| -|.macro hotcall -| hotcheck HOTCOUNT_CALL -| blo ->vm_hotcall -|.endmacro -| -|// Set current VM state. -|.macro mv_vmstate, reg, st; mvn reg, #LJ_VMST_..st; .endmacro -|.macro st_vmstate, reg; str reg, [DISPATCH, #DISPATCH_GL(vmstate)]; .endmacro -| -|// Move table write barrier back. Overwrites mark and tmp. -|.macro barrierback, tab, mark, tmp -| ldr tmp, [DISPATCH, #DISPATCH_GL(gc.grayagain)] -| bic mark, mark, #LJ_GC_BLACK // black2gray(tab) -| str tab, [DISPATCH, #DISPATCH_GL(gc.grayagain)] -| strb mark, tab->marked -| str tmp, tab->gclist -|.endmacro -| -|.macro .IOS, a, b -|.if IOS -| a, b -|.endif -|.endmacro -| -|//----------------------------------------------------------------------- - -#if !LJ_DUALNUM -#error "Only dual-number mode supported for ARM target" -#endif - -/* Generate subroutines used by opcodes and other parts of the VM. */ -/* The .code_sub section should be last to help static branch prediction. */ -static void build_subroutines(BuildCtx *ctx) -{ - |.code_sub - | - |//----------------------------------------------------------------------- - |//-- Return handling ---------------------------------------------------- - |//----------------------------------------------------------------------- - | - |->vm_returnp: - | // See vm_return. Also: RB = previous base. - | tst PC, #FRAME_P - | beq ->cont_dispatch - | - | // Return from pcall or xpcall fast func. - | ldr PC, [RB, FRAME_PC] // Fetch PC of previous frame. - | mvn CARG2, #~LJ_TTRUE - | mov BASE, RB - | // Prepending may overwrite the pcall frame, so do it at the end. - | str CARG2, [RA, FRAME_PC] // Prepend true to results. - | sub RA, RA, #8 - | - |->vm_returnc: - | adds RC, RC, #8 // RC = (nresults+1)*8. - | mov CRET1, #LUA_YIELD - | beq ->vm_unwind_c_eh - | str RC, SAVE_MULTRES - | ands CARG1, PC, #FRAME_TYPE - | beq ->BC_RET_Z // Handle regular return to Lua. - | - |->vm_return: - | // BASE = base, RA = resultptr, RC/MULTRES = (nresults+1)*8, PC = return - | // CARG1 = PC & FRAME_TYPE - | bic RB, PC, #FRAME_TYPEP - | cmp CARG1, #FRAME_C - | sub RB, BASE, RB // RB = previous base. - | bne ->vm_returnp - | - | str RB, L->base - | ldr KBASE, SAVE_NRES - | mv_vmstate CARG4, C - | sub BASE, BASE, #8 - | subs CARG3, RC, #8 - | lsl KBASE, KBASE, #3 // KBASE = (nresults_wanted+1)*8 - | st_vmstate CARG4 - | beq >2 - |1: - | subs CARG3, CARG3, #8 - | ldrd CARG12, [RA], #8 - | strd CARG12, [BASE], #8 - | bne <1 - |2: - | cmp KBASE, RC // More/less results wanted? - | bne >6 - |3: - | str BASE, L->top // Store new top. - | - |->vm_leave_cp: - | ldr RC, SAVE_CFRAME // Restore previous C frame. - | mov CRET1, #0 // Ok return status for vm_pcall. - | str RC, L->cframe - | - |->vm_leave_unw: - | restoreregs_ret - | - |6: - | blt >7 // Less results wanted? - | // More results wanted. Check stack size and fill up results with nil. - | ldr CARG3, L->maxstack - | mvn CARG2, #~LJ_TNIL - | cmp BASE, CARG3 - | bhs >8 - | str CARG2, [BASE, #4] - | add RC, RC, #8 - | add BASE, BASE, #8 - | b <2 - | - |7: // Less results wanted. - | sub CARG1, RC, KBASE - | cmp KBASE, #0 // LUA_MULTRET+1 case? - | subne BASE, BASE, CARG1 // Either keep top or shrink it. - | b <3 - | - |8: // Corner case: need to grow stack for filling up results. - | // This can happen if: - | // - A C function grows the stack (a lot). - | // - The GC shrinks the stack in between. - | // - A return back from a lua_call() with (high) nresults adjustment. - | str BASE, L->top // Save current top held in BASE (yes). - | lsr CARG2, KBASE, #3 - | mov CARG1, L - | bl extern lj_state_growstack // (lua_State *L, int n) - | ldr BASE, L->top // Need the (realloced) L->top in BASE. - | b <2 - | - |->vm_unwind_c: // Unwind C stack, return from vm_pcall. - | // (void *cframe, int errcode) - | mov sp, CARG1 - | mov CRET1, CARG2 - |->vm_unwind_c_eh: // Landing pad for external unwinder. - | ldr L, SAVE_L - | mv_vmstate CARG4, C - | ldr GL:CARG3, L->glref - | str CARG4, GL:CARG3->vmstate - | b ->vm_leave_unw - | - |->vm_unwind_ff: // Unwind C stack, return from ff pcall. - | // (void *cframe) - | bic CARG1, CARG1, #~CFRAME_RAWMASK // Use two steps: bic sp is deprecated. - | mov sp, CARG1 - |->vm_unwind_ff_eh: // Landing pad for external unwinder. - | ldr L, SAVE_L - | mov MASKR8, #255 - | mov RC, #16 // 2 results: false + error message. - | lsl MASKR8, MASKR8, #3 // MASKR8 = 255*8. - | ldr BASE, L->base - | ldr DISPATCH, L->glref // Setup pointer to dispatch table. - | mvn CARG1, #~LJ_TFALSE - | sub RA, BASE, #8 // Results start at BASE-8. - | ldr PC, [BASE, FRAME_PC] // Fetch PC of previous frame. - | add DISPATCH, DISPATCH, #GG_G2DISP - | mv_vmstate CARG2, INTERP - | str CARG1, [BASE, #-4] // Prepend false to error message. - | st_vmstate CARG2 - | b ->vm_returnc - | - |//----------------------------------------------------------------------- - |//-- Grow stack for calls ----------------------------------------------- - |//----------------------------------------------------------------------- - | - |->vm_growstack_c: // Grow stack for C function. - | // CARG1 = L - | mov CARG2, #LUA_MINSTACK - | b >2 - | - |->vm_growstack_l: // Grow stack for Lua function. - | // BASE = new base, RA = BASE+framesize*8, RC = nargs*8, PC = first PC - | add RC, BASE, RC - | sub RA, RA, BASE - | mov CARG1, L - | str BASE, L->base - | add PC, PC, #4 // Must point after first instruction. - | str RC, L->top - | lsr CARG2, RA, #3 - |2: - | // L->base = new base, L->top = top - | str PC, SAVE_PC - | bl extern lj_state_growstack // (lua_State *L, int n) - | ldr BASE, L->base - | ldr RC, L->top - | ldr LFUNC:CARG3, [BASE, FRAME_FUNC] - | sub NARGS8:RC, RC, BASE - | // BASE = new base, RB = LFUNC/CFUNC, RC = nargs*8, FRAME_PC(BASE) = PC - | ins_callt // Just retry the call. - | - |//----------------------------------------------------------------------- - |//-- Entry points into the assembler VM --------------------------------- - |//----------------------------------------------------------------------- - | - |->vm_resume: // Setup C frame and resume thread. - | // (lua_State *L, TValue *base, int nres1 = 0, ptrdiff_t ef = 0) - | saveregs - | mov L, CARG1 - | ldr DISPATCH, L:CARG1->glref // Setup pointer to dispatch table. - | mov BASE, CARG2 - | add DISPATCH, DISPATCH, #GG_G2DISP - | str L, SAVE_L - | mov PC, #FRAME_CP - | str CARG3, SAVE_NRES - | add CARG2, sp, #CFRAME_RESUME - | ldrb CARG1, L->status - | str CARG3, SAVE_ERRF - | str CARG2, L->cframe - | str CARG3, SAVE_CFRAME - | cmp CARG1, #0 - | str L, SAVE_PC // Any value outside of bytecode is ok. - | beq >3 - | - | // Resume after yield (like a return). - | mov RA, BASE - | ldr BASE, L->base - | ldr CARG1, L->top - | mov MASKR8, #255 - | strb CARG3, L->status - | sub RC, CARG1, BASE - | ldr PC, [BASE, FRAME_PC] - | lsl MASKR8, MASKR8, #3 // MASKR8 = 255*8. - | mv_vmstate CARG2, INTERP - | add RC, RC, #8 - | ands CARG1, PC, #FRAME_TYPE - | st_vmstate CARG2 - | str RC, SAVE_MULTRES - | beq ->BC_RET_Z - | b ->vm_return - | - |->vm_pcall: // Setup protected C frame and enter VM. - | // (lua_State *L, TValue *base, int nres1, ptrdiff_t ef) - | saveregs - | mov PC, #FRAME_CP - | str CARG4, SAVE_ERRF - | b >1 - | - |->vm_call: // Setup C frame and enter VM. - | // (lua_State *L, TValue *base, int nres1) - | saveregs - | mov PC, #FRAME_C - | - |1: // Entry point for vm_pcall above (PC = ftype). - | ldr RC, L:CARG1->cframe - | str CARG3, SAVE_NRES - | mov L, CARG1 - | str CARG1, SAVE_L - | mov BASE, CARG2 - | str sp, L->cframe // Add our C frame to cframe chain. - | ldr DISPATCH, L->glref // Setup pointer to dispatch table. - | str CARG1, SAVE_PC // Any value outside of bytecode is ok. - | str RC, SAVE_CFRAME - | add DISPATCH, DISPATCH, #GG_G2DISP - | - |3: // Entry point for vm_cpcall/vm_resume (BASE = base, PC = ftype). - | ldr RB, L->base // RB = old base (for vmeta_call). - | ldr CARG1, L->top - | mov MASKR8, #255 - | add PC, PC, BASE - | lsl MASKR8, MASKR8, #3 // MASKR8 = 255*8. - | sub PC, PC, RB // PC = frame delta + frame type - | mv_vmstate CARG2, INTERP - | sub NARGS8:RC, CARG1, BASE - | st_vmstate CARG2 - | - |->vm_call_dispatch: - | // RB = old base, BASE = new base, RC = nargs*8, PC = caller PC - | ldrd CARG34, [BASE, FRAME_FUNC] - | checkfunc CARG4, ->vmeta_call - | - |->vm_call_dispatch_f: - | ins_call - | // BASE = new base, CARG3 = func, RC = nargs*8, PC = caller PC - | - |->vm_cpcall: // Setup protected C frame, call C. - | // (lua_State *L, lua_CFunction func, void *ud, lua_CPFunction cp) - | saveregs - | mov L, CARG1 - | ldr RA, L:CARG1->stack - | str CARG1, SAVE_L - | ldr RB, L->top - | str CARG1, SAVE_PC // Any value outside of bytecode is ok. - | ldr RC, L->cframe - | sub RA, RA, RB // Compute -savestack(L, L->top). - | str sp, L->cframe // Add our C frame to cframe chain. - | mov RB, #0 - | str RA, SAVE_NRES // Neg. delta means cframe w/o frame. - | str RB, SAVE_ERRF // No error function. - | str RC, SAVE_CFRAME - | blx CARG4 // (lua_State *L, lua_CFunction func, void *ud) - | ldr DISPATCH, L->glref // Setup pointer to dispatch table. - | movs BASE, CRET1 - | mov PC, #FRAME_CP - | add DISPATCH, DISPATCH, #GG_G2DISP - | bne <3 // Else continue with the call. - | b ->vm_leave_cp // No base? Just remove C frame. - | - |//----------------------------------------------------------------------- - |//-- Metamethod handling ------------------------------------------------ - |//----------------------------------------------------------------------- - | - |//-- Continuation dispatch ---------------------------------------------- - | - |->cont_dispatch: - | // BASE = meta base, RA = resultptr, RC = (nresults+1)*8 - | ldr LFUNC:CARG3, [RB, FRAME_FUNC] - | ldr CARG1, [BASE, #-16] // Get continuation. - | mov CARG4, BASE - | mov BASE, RB // Restore caller BASE. - |.if FFI - | cmp CARG1, #1 - |.endif - | ldr PC, [CARG4, #-12] // Restore PC from [cont|PC]. - | ldr CARG3, LFUNC:CARG3->field_pc - | mvn INS, #~LJ_TNIL - | add CARG2, RA, RC - | str INS, [CARG2, #-4] // Ensure one valid arg. - |.if FFI - | bls >1 - |.endif - | ldr KBASE, [CARG3, #PC2PROTO(k)] - | // BASE = base, RA = resultptr, CARG4 = meta base - | bx CARG1 - | - |.if FFI - |1: - | beq ->cont_ffi_callback // cont = 1: return from FFI callback. - | // cont = 0: tailcall from C function. - | sub CARG4, CARG4, #16 - | sub RC, CARG4, BASE - | b ->vm_call_tail - |.endif - | - |->cont_cat: // RA = resultptr, CARG4 = meta base - | ldr INS, [PC, #-4] - | sub CARG2, CARG4, #16 - | ldrd CARG34, [RA] - | str BASE, L->base - | decode_RB8 RC, INS - | decode_RA8 RA, INS - | add CARG1, BASE, RC - | subs CARG1, CARG2, CARG1 - | strdne CARG34, [CARG2] - | movne CARG3, CARG1 - | bne ->BC_CAT_Z - | strd CARG34, [BASE, RA] - | b ->cont_nop - | - |//-- Table indexing metamethods ----------------------------------------- - | - |->vmeta_tgets1: - | add CARG2, BASE, RB - | b >2 - | - |->vmeta_tgets: - | sub CARG2, DISPATCH, #-DISPATCH_GL(tmptv) - | mvn CARG4, #~LJ_TTAB - | str TAB:RB, [CARG2] - | str CARG4, [CARG2, #4] - |2: - | mvn CARG4, #~LJ_TSTR - | str STR:RC, TMPDlo - | str CARG4, TMPDhi - | mov CARG3, TMPDp - | b >1 - | - |->vmeta_tgetb: // RC = index - | decode_RB8 RB, INS - | str RC, TMPDlo - | mvn CARG4, #~LJ_TISNUM - | add CARG2, BASE, RB - | str CARG4, TMPDhi - | mov CARG3, TMPDp - | b >1 - | - |->vmeta_tgetv: - | add CARG2, BASE, RB - | add CARG3, BASE, RC - |1: - | str BASE, L->base - | mov CARG1, L - | str PC, SAVE_PC - | bl extern lj_meta_tget // (lua_State *L, TValue *o, TValue *k) - | // Returns TValue * (finished) or NULL (metamethod). - | .IOS ldr BASE, L->base - | cmp CRET1, #0 - | beq >3 - | ldrd CARG34, [CRET1] - | ins_next1 - | ins_next2 - | strd CARG34, [BASE, RA] - | ins_next3 - | - |3: // Call __index metamethod. - | // BASE = base, L->top = new base, stack = cont/func/t/k - | rsb CARG1, BASE, #FRAME_CONT - | ldr BASE, L->top - | mov NARGS8:RC, #16 // 2 args for func(t, k). - | str PC, [BASE, #-12] // [cont|PC] - | add PC, CARG1, BASE - | ldr LFUNC:CARG3, [BASE, FRAME_FUNC] // Guaranteed to be a function here. - | b ->vm_call_dispatch_f - | - |//----------------------------------------------------------------------- - | - |->vmeta_tsets1: - | add CARG2, BASE, RB - | b >2 - | - |->vmeta_tsets: - | sub CARG2, DISPATCH, #-DISPATCH_GL(tmptv) - | mvn CARG4, #~LJ_TTAB - | str TAB:RB, [CARG2] - | str CARG4, [CARG2, #4] - |2: - | mvn CARG4, #~LJ_TSTR - | str STR:RC, TMPDlo - | str CARG4, TMPDhi - | mov CARG3, TMPDp - | b >1 - | - |->vmeta_tsetb: // RC = index - | decode_RB8 RB, INS - | str RC, TMPDlo - | mvn CARG4, #~LJ_TISNUM - | add CARG2, BASE, RB - | str CARG4, TMPDhi - | mov CARG3, TMPDp - | b >1 - | - |->vmeta_tsetv: - | add CARG2, BASE, RB - | add CARG3, BASE, RC - |1: - | str BASE, L->base - | mov CARG1, L - | str PC, SAVE_PC - | bl extern lj_meta_tset // (lua_State *L, TValue *o, TValue *k) - | // Returns TValue * (finished) or NULL (metamethod). - | .IOS ldr BASE, L->base - | cmp CRET1, #0 - | ldrd CARG34, [BASE, RA] - | beq >3 - | ins_next1 - | // NOBARRIER: lj_meta_tset ensures the table is not black. - | strd CARG34, [CRET1] - | ins_next2 - | ins_next3 - | - |3: // Call __newindex metamethod. - | // BASE = base, L->top = new base, stack = cont/func/t/k/(v) - | rsb CARG1, BASE, #FRAME_CONT - | ldr BASE, L->top - | mov NARGS8:RC, #24 // 3 args for func(t, k, v). - | strd CARG34, [BASE, #16] // Copy value to third argument. - | str PC, [BASE, #-12] // [cont|PC] - | add PC, CARG1, BASE - | ldr LFUNC:CARG3, [BASE, FRAME_FUNC] // Guaranteed to be a function here. - | b ->vm_call_dispatch_f - | - |//-- Comparison metamethods --------------------------------------------- - | - |->vmeta_comp: - | mov CARG1, L - | sub PC, PC, #4 - | mov CARG2, RA - | str BASE, L->base - | mov CARG3, RC - | str PC, SAVE_PC - | decode_OP CARG4, INS - | bl extern lj_meta_comp // (lua_State *L, TValue *o1, *o2, int op) - | // Returns 0/1 or TValue * (metamethod). - |3: - | .IOS ldr BASE, L->base - | cmp CRET1, #1 - | bhi ->vmeta_binop - |4: - | ldrh RB, [PC, #2] - | add PC, PC, #4 - | add RB, PC, RB, lsl #2 - | subhs PC, RB, #0x20000 - |->cont_nop: - | ins_next - | - |->cont_ra: // RA = resultptr - | ldr INS, [PC, #-4] - | ldrd CARG12, [RA] - | decode_RA8 CARG3, INS - | strd CARG12, [BASE, CARG3] - | b ->cont_nop - | - |->cont_condt: // RA = resultptr - | ldr CARG2, [RA, #4] - | mvn CARG1, #~LJ_TTRUE - | cmp CARG1, CARG2 // Branch if result is true. - | b <4 - | - |->cont_condf: // RA = resultptr - | ldr CARG2, [RA, #4] - | checktp CARG2, LJ_TFALSE // Branch if result is false. - | b <4 - | - |->vmeta_equal: - | // CARG2, CARG3, CARG4 are already set by BC_ISEQV/BC_ISNEV. - | sub PC, PC, #4 - | str BASE, L->base - | mov CARG1, L - | str PC, SAVE_PC - | bl extern lj_meta_equal // (lua_State *L, GCobj *o1, *o2, int ne) - | // Returns 0/1 or TValue * (metamethod). - | b <3 - | - |->vmeta_equal_cd: - |.if FFI - | sub PC, PC, #4 - | str BASE, L->base - | mov CARG1, L - | mov CARG2, INS - | str PC, SAVE_PC - | bl extern lj_meta_equal_cd // (lua_State *L, BCIns op) - | // Returns 0/1 or TValue * (metamethod). - | b <3 - |.endif - | - |//-- Arithmetic metamethods --------------------------------------------- - | - |->vmeta_arith_vn: - | decode_RB8 RB, INS - | decode_RC8 RC, INS - | add CARG3, BASE, RB - | add CARG4, KBASE, RC - | b >1 - | - |->vmeta_arith_nv: - | decode_RB8 RB, INS - | decode_RC8 RC, INS - | add CARG4, BASE, RB - | add CARG3, KBASE, RC - | b >1 - | - |->vmeta_unm: - | ldr INS, [PC, #-8] - | sub PC, PC, #4 - | add CARG3, BASE, RC - | add CARG4, BASE, RC - | b >1 - | - |->vmeta_arith_vv: - | decode_RB8 RB, INS - | decode_RC8 RC, INS - | add CARG3, BASE, RB - | add CARG4, BASE, RC - |1: - | decode_OP OP, INS - | add CARG2, BASE, RA - | str BASE, L->base - | mov CARG1, L - | str PC, SAVE_PC - | str OP, ARG5 - | bl extern lj_meta_arith // (lua_State *L, TValue *ra,*rb,*rc, BCReg op) - | // Returns NULL (finished) or TValue * (metamethod). - | .IOS ldr BASE, L->base - | cmp CRET1, #0 - | beq ->cont_nop - | - | // Call metamethod for binary op. - |->vmeta_binop: - | // BASE = old base, CRET1 = new base, stack = cont/func/o1/o2 - | sub CARG2, CRET1, BASE - | str PC, [CRET1, #-12] // [cont|PC] - | add PC, CARG2, #FRAME_CONT - | mov BASE, CRET1 - | mov NARGS8:RC, #16 // 2 args for func(o1, o2). - | b ->vm_call_dispatch - | - |->vmeta_len: - | add CARG2, BASE, RC - | str BASE, L->base - | mov CARG1, L - | str PC, SAVE_PC - | bl extern lj_meta_len // (lua_State *L, TValue *o) - | // Returns NULL (retry) or TValue * (metamethod base). - | .IOS ldr BASE, L->base -#if LJ_52 - | cmp CRET1, #0 - | bne ->vmeta_binop // Binop call for compatibility. - | ldr TAB:CARG1, [BASE, RC] - | b ->BC_LEN_Z -#else - | b ->vmeta_binop // Binop call for compatibility. -#endif - | - |//-- Call metamethod ---------------------------------------------------- - | - |->vmeta_call: // Resolve and call __call metamethod. - | // RB = old base, BASE = new base, RC = nargs*8 - | mov CARG1, L - | str RB, L->base // This is the callers base! - | sub CARG2, BASE, #8 - | str PC, SAVE_PC - | add CARG3, BASE, NARGS8:RC - | .IOS mov RA, BASE - | bl extern lj_meta_call // (lua_State *L, TValue *func, TValue *top) - | .IOS mov BASE, RA - | ldr LFUNC:CARG3, [BASE, FRAME_FUNC] // Guaranteed to be a function here. - | add NARGS8:RC, NARGS8:RC, #8 // Got one more argument now. - | ins_call - | - |->vmeta_callt: // Resolve __call for BC_CALLT. - | // BASE = old base, RA = new base, RC = nargs*8 - | mov CARG1, L - | str BASE, L->base - | sub CARG2, RA, #8 - | str PC, SAVE_PC - | add CARG3, RA, NARGS8:RC - | bl extern lj_meta_call // (lua_State *L, TValue *func, TValue *top) - | .IOS ldr BASE, L->base - | ldr LFUNC:CARG3, [RA, FRAME_FUNC] // Guaranteed to be a function here. - | ldr PC, [BASE, FRAME_PC] - | add NARGS8:RC, NARGS8:RC, #8 // Got one more argument now. - | b ->BC_CALLT2_Z - | - |//-- Argument coercion for 'for' statement ------------------------------ - | - |->vmeta_for: - | mov CARG1, L - | str BASE, L->base - | mov CARG2, RA - | str PC, SAVE_PC - | bl extern lj_meta_for // (lua_State *L, TValue *base) - | .IOS ldr BASE, L->base - |.if JIT - | ldrb OP, [PC, #-4] - |.endif - | ldr INS, [PC, #-4] - |.if JIT - | cmp OP, #BC_JFORI - |.endif - | decode_RA8 RA, INS - | decode_RD RC, INS - |.if JIT - | beq =>BC_JFORI - |.endif - | b =>BC_FORI - | - |//----------------------------------------------------------------------- - |//-- Fast functions ----------------------------------------------------- - |//----------------------------------------------------------------------- - | - |.macro .ffunc, name - |->ff_ .. name: - |.endmacro - | - |.macro .ffunc_1, name - |->ff_ .. name: - | ldrd CARG12, [BASE] - | cmp NARGS8:RC, #8 - | blo ->fff_fallback - |.endmacro - | - |.macro .ffunc_2, name - |->ff_ .. name: - | ldrd CARG12, [BASE] - | ldrd CARG34, [BASE, #8] - | cmp NARGS8:RC, #16 - | blo ->fff_fallback - |.endmacro - | - |.macro .ffunc_n, name - | .ffunc_1 name - | checktp CARG2, LJ_TISNUM - | bhs ->fff_fallback - |.endmacro - | - |.macro .ffunc_nn, name - | .ffunc_2 name - | checktp CARG2, LJ_TISNUM - | cmnlo CARG4, #-LJ_TISNUM - | bhs ->fff_fallback - |.endmacro - | - |.macro .ffunc_d, name - | .ffunc name - | ldr CARG2, [BASE, #4] - | cmp NARGS8:RC, #8 - | vldr d0, [BASE] - | blo ->fff_fallback - | checktp CARG2, LJ_TISNUM - | bhs ->fff_fallback - |.endmacro - | - |.macro .ffunc_dd, name - | .ffunc name - | ldr CARG2, [BASE, #4] - | ldr CARG4, [BASE, #12] - | cmp NARGS8:RC, #16 - | vldr d0, [BASE] - | vldr d1, [BASE, #8] - | blo ->fff_fallback - | checktp CARG2, LJ_TISNUM - | cmnlo CARG4, #-LJ_TISNUM - | bhs ->fff_fallback - |.endmacro - | - |// Inlined GC threshold check. Caveat: uses CARG1 and CARG2. - |.macro ffgccheck - | ldr CARG1, [DISPATCH, #DISPATCH_GL(gc.total)] - | ldr CARG2, [DISPATCH, #DISPATCH_GL(gc.threshold)] - | cmp CARG1, CARG2 - | blge ->fff_gcstep - |.endmacro - | - |//-- Base library: checks ----------------------------------------------- - | - |.ffunc_1 assert - | checktp CARG2, LJ_TTRUE - | bhi ->fff_fallback - | ldr PC, [BASE, FRAME_PC] - | strd CARG12, [BASE, #-8] - | mov RB, BASE - | subs RA, NARGS8:RC, #8 - | add RC, NARGS8:RC, #8 // Compute (nresults+1)*8. - | beq ->fff_res // Done if exactly 1 argument. - |1: - | ldrd CARG12, [RB, #8] - | subs RA, RA, #8 - | strd CARG12, [RB], #8 - | bne <1 - | b ->fff_res - | - |.ffunc type - | ldr CARG2, [BASE, #4] - | cmp NARGS8:RC, #8 - | blo ->fff_fallback - | checktp CARG2, LJ_TISNUM - | mvnlo CARG2, #~LJ_TISNUM - | rsb CARG4, CARG2, #(int)(offsetof(GCfuncC, upvalue)>>3)-1 - | lsl CARG4, CARG4, #3 - | ldrd CARG12, [CFUNC:CARG3, CARG4] - | b ->fff_restv - | - |//-- Base library: getters and setters --------------------------------- - | - |.ffunc_1 getmetatable - | checktp CARG2, LJ_TTAB - | cmnne CARG2, #-LJ_TUDATA - | bne >6 - |1: // Field metatable must be at same offset for GCtab and GCudata! - | ldr TAB:RB, TAB:CARG1->metatable - |2: - | mvn CARG2, #~LJ_TNIL - | ldr STR:RC, [DISPATCH, #DISPATCH_GL(gcroot[GCROOT_MMNAME+MM_metatable])] - | cmp TAB:RB, #0 - | beq ->fff_restv - | ldr CARG3, TAB:RB->hmask - | ldr CARG4, STR:RC->hash - | ldr NODE:INS, TAB:RB->node - | and CARG3, CARG3, CARG4 // idx = str->hash & tab->hmask - | add CARG3, CARG3, CARG3, lsl #1 - | add NODE:INS, NODE:INS, CARG3, lsl #3 // node = tab->node + idx*3*8 - |3: // Rearranged logic, because we expect _not_ to find the key. - | ldrd CARG34, NODE:INS->key // STALL: early NODE:INS. - | ldrd CARG12, NODE:INS->val - | ldr NODE:INS, NODE:INS->next - | checktp CARG4, LJ_TSTR - | cmpeq CARG3, STR:RC - | beq >5 - | cmp NODE:INS, #0 - | bne <3 - |4: - | mov CARG1, RB // Use metatable as default result. - | mvn CARG2, #~LJ_TTAB - | b ->fff_restv - |5: - | checktp CARG2, LJ_TNIL - | bne ->fff_restv - | b <4 - | - |6: - | checktp CARG2, LJ_TISNUM - | mvnhs CARG2, CARG2 - | movlo CARG2, #~LJ_TISNUM - | add CARG4, DISPATCH, CARG2, lsl #2 - | ldr TAB:RB, [CARG4, #DISPATCH_GL(gcroot[GCROOT_BASEMT])] - | b <2 - | - |.ffunc_2 setmetatable - | // Fast path: no mt for table yet and not clearing the mt. - | checktp CARG2, LJ_TTAB - | ldreq TAB:RB, TAB:CARG1->metatable - | checktpeq CARG4, LJ_TTAB - | ldrbeq CARG4, TAB:CARG1->marked - | cmpeq TAB:RB, #0 - | bne ->fff_fallback - | tst CARG4, #LJ_GC_BLACK // isblack(table) - | str TAB:CARG3, TAB:CARG1->metatable - | beq ->fff_restv - | barrierback TAB:CARG1, CARG4, CARG3 - | b ->fff_restv - | - |.ffunc rawget - | ldrd CARG34, [BASE] - | cmp NARGS8:RC, #16 - | blo ->fff_fallback - | mov CARG2, CARG3 - | checktab CARG4, ->fff_fallback - | mov CARG1, L - | add CARG3, BASE, #8 - | .IOS mov RA, BASE - | bl extern lj_tab_get // (lua_State *L, GCtab *t, cTValue *key) - | // Returns cTValue *. - | .IOS mov BASE, RA - | ldrd CARG12, [CRET1] - | b ->fff_restv - | - |//-- Base library: conversions ------------------------------------------ - | - |.ffunc tonumber - | // Only handles the number case inline (without a base argument). - | ldrd CARG12, [BASE] - | cmp NARGS8:RC, #8 - | bne ->fff_fallback - | checktp CARG2, LJ_TISNUM - | bls ->fff_restv - | b ->fff_fallback - | - |.ffunc_1 tostring - | // Only handles the string or number case inline. - | checktp CARG2, LJ_TSTR - | // A __tostring method in the string base metatable is ignored. - | beq ->fff_restv - | // Handle numbers inline, unless a number base metatable is present. - | ldr CARG4, [DISPATCH, #DISPATCH_GL(gcroot[GCROOT_BASEMT_NUM])] - | str BASE, L->base - | checktp CARG2, LJ_TISNUM - | cmpls CARG4, #0 - | str PC, SAVE_PC // Redundant (but a defined value). - | bhi ->fff_fallback - | ffgccheck - | mov CARG1, L - | mov CARG2, BASE - | bl extern lj_str_fromnumber // (lua_State *L, cTValue *o) - | // Returns GCstr *. - | ldr BASE, L->base - | mvn CARG2, #~LJ_TSTR - | b ->fff_restv - | - |//-- Base library: iterators ------------------------------------------- - | - |.ffunc_1 next - | mvn CARG4, #~LJ_TNIL - | checktab CARG2, ->fff_fallback - | strd CARG34, [BASE, NARGS8:RC] // Set missing 2nd arg to nil. - | ldr PC, [BASE, FRAME_PC] - | mov CARG2, CARG1 - | str BASE, L->base // Add frame since C call can throw. - | mov CARG1, L - | str BASE, L->top // Dummy frame length is ok. - | add CARG3, BASE, #8 - | str PC, SAVE_PC - | bl extern lj_tab_next // (lua_State *L, GCtab *t, TValue *key) - | // Returns 0 at end of traversal. - | .IOS ldr BASE, L->base - | cmp CRET1, #0 - | mvneq CRET2, #~LJ_TNIL - | beq ->fff_restv // End of traversal: return nil. - | ldrd CARG12, [BASE, #8] // Copy key and value to results. - | ldrd CARG34, [BASE, #16] - | mov RC, #(2+1)*8 - | strd CARG12, [BASE, #-8] - | strd CARG34, [BASE] - | b ->fff_res - | - |.ffunc_1 pairs - | checktab CARG2, ->fff_fallback -#if LJ_52 - | ldr TAB:RB, TAB:CARG1->metatable -#endif - | ldrd CFUNC:CARG34, CFUNC:CARG3->upvalue[0] - | ldr PC, [BASE, FRAME_PC] -#if LJ_52 - | cmp TAB:RB, #0 - | bne ->fff_fallback -#endif - | mvn CARG2, #~LJ_TNIL - | mov RC, #(3+1)*8 - | strd CFUNC:CARG34, [BASE, #-8] - | str CARG2, [BASE, #12] - | b ->fff_res - | - |.ffunc_2 ipairs_aux - | checktp CARG2, LJ_TTAB - | checktpeq CARG4, LJ_TISNUM - | bne ->fff_fallback - | ldr RB, TAB:CARG1->asize - | ldr RC, TAB:CARG1->array - | add CARG3, CARG3, #1 - | ldr PC, [BASE, FRAME_PC] - | cmp CARG3, RB - | add RC, RC, CARG3, lsl #3 - | strd CARG34, [BASE, #-8] - | ldrdlo CARG12, [RC] - | mov RC, #(0+1)*8 - | bhs >2 // Not in array part? - |1: - | checktp CARG2, LJ_TNIL - | movne RC, #(2+1)*8 - | strdne CARG12, [BASE] - | b ->fff_res - |2: // Check for empty hash part first. Otherwise call C function. - | ldr RB, TAB:CARG1->hmask - | mov CARG2, CARG3 - | cmp RB, #0 - | beq ->fff_res - | .IOS mov RA, BASE - | bl extern lj_tab_getinth // (GCtab *t, int32_t key) - | // Returns cTValue * or NULL. - | .IOS mov BASE, RA - | cmp CRET1, #0 - | beq ->fff_res - | ldrd CARG12, [CRET1] - | b <1 - | - |.ffunc_1 ipairs - | checktab CARG2, ->fff_fallback -#if LJ_52 - | ldr TAB:RB, TAB:CARG1->metatable -#endif - | ldrd CFUNC:CARG34, CFUNC:CARG3->upvalue[0] - | ldr PC, [BASE, FRAME_PC] -#if LJ_52 - | cmp TAB:RB, #0 - | bne ->fff_fallback -#endif - | mov CARG1, #0 - | mvn CARG2, #~LJ_TISNUM - | mov RC, #(3+1)*8 - | strd CFUNC:CARG34, [BASE, #-8] - | strd CARG12, [BASE, #8] - | b ->fff_res - | - |//-- Base library: catch errors ---------------------------------------- - | - |.ffunc pcall - | ldrb RA, [DISPATCH, #DISPATCH_GL(hookmask)] - | cmp NARGS8:RC, #8 - | blo ->fff_fallback - | tst RA, #HOOK_ACTIVE // Remember active hook before pcall. - | mov RB, BASE - | add BASE, BASE, #8 - | moveq PC, #8+FRAME_PCALL - | movne PC, #8+FRAME_PCALLH - | sub NARGS8:RC, NARGS8:RC, #8 - | b ->vm_call_dispatch - | - |.ffunc_2 xpcall - | ldrb RA, [DISPATCH, #DISPATCH_GL(hookmask)] - | checkfunc CARG4, ->fff_fallback // Traceback must be a function. - | mov RB, BASE - | strd CARG12, [BASE, #8] // Swap function and traceback. - | strd CARG34, [BASE] - | tst RA, #HOOK_ACTIVE // Remember active hook before pcall. - | add BASE, BASE, #16 - | moveq PC, #16+FRAME_PCALL - | movne PC, #16+FRAME_PCALLH - | sub NARGS8:RC, NARGS8:RC, #16 - | b ->vm_call_dispatch - | - |//-- Coroutine library -------------------------------------------------- - | - |.macro coroutine_resume_wrap, resume - |.if resume - |.ffunc_1 coroutine_resume - | checktp CARG2, LJ_TTHREAD - | bne ->fff_fallback - |.else - |.ffunc coroutine_wrap_aux - | ldr L:CARG1, CFUNC:CARG3->upvalue[0].gcr - |.endif - | ldr PC, [BASE, FRAME_PC] - | str BASE, L->base - | ldr CARG2, L:CARG1->top - | ldrb RA, L:CARG1->status - | ldr RB, L:CARG1->base - | add CARG3, CARG2, NARGS8:RC - | add CARG4, CARG2, RA - | str PC, SAVE_PC - | cmp CARG4, RB - | beq ->fff_fallback - | ldr CARG4, L:CARG1->maxstack - | ldr RB, L:CARG1->cframe - | cmp RA, #LUA_YIELD - | cmpls CARG3, CARG4 - | cmpls RB, #0 - | bhi ->fff_fallback - |1: - |.if resume - | sub CARG3, CARG3, #8 // Keep resumed thread in stack for GC. - | add BASE, BASE, #8 - | sub NARGS8:RC, NARGS8:RC, #8 - |.endif - | str CARG3, L:CARG1->top - | str BASE, L->top - |2: // Move args to coroutine. - | ldrd CARG34, [BASE, RB] - | cmp RB, NARGS8:RC - | strdne CARG34, [CARG2, RB] - | add RB, RB, #8 - | bne <2 - | - | mov CARG3, #0 - | mov L:RA, L:CARG1 - | mov CARG4, #0 - | bl ->vm_resume // (lua_State *L, TValue *base, 0, 0) - | // Returns thread status. - |4: - | ldr CARG3, L:RA->base - | mv_vmstate CARG2, INTERP - | ldr CARG4, L:RA->top - | st_vmstate CARG2 - | cmp CRET1, #LUA_YIELD - | ldr BASE, L->base - | bhi >8 - | subs RC, CARG4, CARG3 - | ldr CARG1, L->maxstack - | add CARG2, BASE, RC - | beq >6 // No results? - | cmp CARG2, CARG1 - | mov RB, #0 - | bhi >9 // Need to grow stack? - | - | sub CARG4, RC, #8 - | str CARG3, L:RA->top // Clear coroutine stack. - |5: // Move results from coroutine. - | ldrd CARG12, [CARG3, RB] - | cmp RB, CARG4 - | strd CARG12, [BASE, RB] - | add RB, RB, #8 - | bne <5 - |6: - |.if resume - | mvn CARG3, #~LJ_TTRUE - | add RC, RC, #16 - |7: - | str CARG3, [BASE, #-4] // Prepend true/false to results. - | sub RA, BASE, #8 - |.else - | mov RA, BASE - | add RC, RC, #8 - |.endif - | ands CARG1, PC, #FRAME_TYPE - | str PC, SAVE_PC - | str RC, SAVE_MULTRES - | beq ->BC_RET_Z - | b ->vm_return - | - |8: // Coroutine returned with error (at co->top-1). - |.if resume - | ldrd CARG12, [CARG4, #-8]! - | mvn CARG3, #~LJ_TFALSE - | mov RC, #(2+1)*8 - | str CARG4, L:RA->top // Remove error from coroutine stack. - | strd CARG12, [BASE] // Copy error message. - | b <7 - |.else - | mov CARG1, L - | mov CARG2, L:RA - | bl extern lj_ffh_coroutine_wrap_err // (lua_State *L, lua_State *co) - | // Never returns. - |.endif - | - |9: // Handle stack expansion on return from yield. - | mov CARG1, L - | lsr CARG2, RC, #3 - | bl extern lj_state_growstack // (lua_State *L, int n) - | mov CRET1, #0 - | b <4 - |.endmacro - | - | coroutine_resume_wrap 1 // coroutine.resume - | coroutine_resume_wrap 0 // coroutine.wrap - | - |.ffunc coroutine_yield - | ldr CARG1, L->cframe - | add CARG2, BASE, NARGS8:RC - | str BASE, L->base - | tst CARG1, #CFRAME_RESUME - | str CARG2, L->top - | mov CRET1, #LUA_YIELD - | mov CARG3, #0 - | beq ->fff_fallback - | str CARG3, L->cframe - | strb CRET1, L->status - | b ->vm_leave_unw - | - |//-- Math library ------------------------------------------------------- - | - |.macro math_round, func - | .ffunc_1 math_ .. func - | checktp CARG2, LJ_TISNUM - | beq ->fff_restv - | bhi ->fff_fallback - | // Round FP value and normalize result. - | lsl CARG3, CARG2, #1 - | adds RB, CARG3, #0x00200000 - | bpl >2 // |x| < 1? - | mvn CARG4, #0x3e0 - | subs RB, CARG4, RB, asr #21 - | lsl CARG4, CARG2, #11 - | lsl CARG3, CARG1, #11 - | orr CARG4, CARG4, #0x80000000 - | rsb INS, RB, #32 - | orr CARG4, CARG4, CARG1, lsr #21 - | bls >3 // |x| >= 2^31? - | orr CARG3, CARG3, CARG4, lsl INS - | lsr CARG1, CARG4, RB - |.if "func" == "floor" - | tst CARG3, CARG2, asr #31 - | addne CARG1, CARG1, #1 - |.else - | bics CARG3, CARG3, CARG2, asr #31 - | addsne CARG1, CARG1, #1 - | ldrdvs CARG12, >9 - | bvs ->fff_restv - |.endif - | cmp CARG2, #0 - | rsblt CARG1, CARG1, #0 - |1: - | mvn CARG2, #~LJ_TISNUM - | b ->fff_restv - | - |2: // |x| < 1 - | bcs ->fff_restv // |x| is not finite. - | orr CARG3, CARG3, CARG1 // ztest = abs(hi) | lo - |.if "func" == "floor" - | tst CARG3, CARG2, asr #31 // return (ztest & sign) == 0 ? 0 : -1 - | moveq CARG1, #0 - | mvnne CARG1, #0 - |.else - | bics CARG3, CARG3, CARG2, asr #31 // return (ztest & ~sign) == 0 ? 0 : 1 - | moveq CARG1, #0 - | movne CARG1, #1 - |.endif - | mvn CARG2, #~LJ_TISNUM - | b ->fff_restv - | - |3: // |x| >= 2^31. Check for x == -(2^31). - | cmpeq CARG4, #0x80000000 - |.if "func" == "floor" - | cmpeq CARG3, #0 - |.endif - | bne >4 - | cmp CARG2, #0 - | movmi CARG1, #0x80000000 - | bmi <1 - |4: - | bl ->vm_..func.._sf - | b ->fff_restv - |.endmacro - | - | math_round floor - | math_round ceil - | - |.align 8 - |9: - | .long 0x00000000, 0x41e00000 // 2^31. - | - |.ffunc_1 math_abs - | checktp CARG2, LJ_TISNUM - | bhi ->fff_fallback - | bicne CARG2, CARG2, #0x80000000 - | bne ->fff_restv - | cmp CARG1, #0 - | rsbslt CARG1, CARG1, #0 - | ldrdvs CARG12, <9 - | // Fallthrough. - | - |->fff_restv: - | // CARG12 = TValue result. - | ldr PC, [BASE, FRAME_PC] - | strd CARG12, [BASE, #-8] - |->fff_res1: - | // PC = return. - | mov RC, #(1+1)*8 - |->fff_res: - | // RC = (nresults+1)*8, PC = return. - | ands CARG1, PC, #FRAME_TYPE - | ldreq INS, [PC, #-4] - | str RC, SAVE_MULTRES - | sub RA, BASE, #8 - | bne ->vm_return - | decode_RB8 RB, INS - |5: - | cmp RB, RC // More results expected? - | bhi >6 - | decode_RA8 CARG1, INS - | ins_next1 - | ins_next2 - | // Adjust BASE. KBASE is assumed to be set for the calling frame. - | sub BASE, RA, CARG1 - | ins_next3 - | - |6: // Fill up results with nil. - | add CARG2, RA, RC - | mvn CARG1, #~LJ_TNIL - | add RC, RC, #8 - | str CARG1, [CARG2, #-4] - | b <5 - | - |.macro math_extern, func - |.if HFABI - | .ffunc_d math_ .. func - |.else - | .ffunc_n math_ .. func - |.endif - | .IOS mov RA, BASE - | bl extern func - | .IOS mov BASE, RA - |.if HFABI - | b ->fff_resd - |.else - | b ->fff_restv - |.endif - |.endmacro - | - |.macro math_extern2, func - |.if HFABI - | .ffunc_dd math_ .. func - |.else - | .ffunc_nn math_ .. func - |.endif - | .IOS mov RA, BASE - | bl extern func - | .IOS mov BASE, RA - |.if HFABI - | b ->fff_resd - |.else - | b ->fff_restv - |.endif - |.endmacro - | - |.if FPU - | .ffunc_d math_sqrt - | vsqrt.f64 d0, d0 - |->fff_resd: - | ldr PC, [BASE, FRAME_PC] - | vstr d0, [BASE, #-8] - | b ->fff_res1 - |.else - | math_extern sqrt - |.endif - | - |.ffunc math_log - |.if HFABI - | ldr CARG2, [BASE, #4] - | cmp NARGS8:RC, #8 // Need exactly 1 argument. - | vldr d0, [BASE] - | bne ->fff_fallback - |.else - | ldrd CARG12, [BASE] - | cmp NARGS8:RC, #8 // Need exactly 1 argument. - | bne ->fff_fallback - |.endif - | checktp CARG2, LJ_TISNUM - | bhs ->fff_fallback - | .IOS mov RA, BASE - | bl extern log - | .IOS mov BASE, RA - |.if HFABI - | b ->fff_resd - |.else - | b ->fff_restv - |.endif - | - | math_extern log10 - | math_extern exp - | math_extern sin - | math_extern cos - | math_extern tan - | math_extern asin - | math_extern acos - | math_extern atan - | math_extern sinh - | math_extern cosh - | math_extern tanh - | math_extern2 pow - | math_extern2 atan2 - | math_extern2 fmod - | - |->ff_math_deg: - |.if FPU - | .ffunc_d math_rad - | vldr d1, CFUNC:CARG3->upvalue[0] - | vmul.f64 d0, d0, d1 - | b ->fff_resd - |.else - | .ffunc_n math_rad - | ldrd CARG34, CFUNC:CARG3->upvalue[0] - | bl extern __aeabi_dmul - | b ->fff_restv - |.endif - | - |.if HFABI - | .ffunc math_ldexp - | ldr CARG4, [BASE, #4] - | ldrd CARG12, [BASE, #8] - | cmp NARGS8:RC, #16 - | blo ->fff_fallback - | vldr d0, [BASE] - | checktp CARG4, LJ_TISNUM - | bhs ->fff_fallback - | checktp CARG2, LJ_TISNUM - | bne ->fff_fallback - | .IOS mov RA, BASE - | bl extern ldexp // (double x, int exp) - | .IOS mov BASE, RA - | b ->fff_resd - |.else - |.ffunc_2 math_ldexp - | checktp CARG2, LJ_TISNUM - | bhs ->fff_fallback - | checktp CARG4, LJ_TISNUM - | bne ->fff_fallback - | .IOS mov RA, BASE - | bl extern ldexp // (double x, int exp) - | .IOS mov BASE, RA - | b ->fff_restv - |.endif - | - |.if HFABI - |.ffunc_d math_frexp - | mov CARG1, sp - | .IOS mov RA, BASE - | bl extern frexp - | .IOS mov BASE, RA - | ldr CARG3, [sp] - | mvn CARG4, #~LJ_TISNUM - | ldr PC, [BASE, FRAME_PC] - | vstr d0, [BASE, #-8] - | mov RC, #(2+1)*8 - | strd CARG34, [BASE] - | b ->fff_res - |.else - |.ffunc_n math_frexp - | mov CARG3, sp - | .IOS mov RA, BASE - | bl extern frexp - | .IOS mov BASE, RA - | ldr CARG3, [sp] - | mvn CARG4, #~LJ_TISNUM - | ldr PC, [BASE, FRAME_PC] - | strd CARG12, [BASE, #-8] - | mov RC, #(2+1)*8 - | strd CARG34, [BASE] - | b ->fff_res - |.endif - | - |.if HFABI - |.ffunc_d math_modf - | sub CARG1, BASE, #8 - | ldr PC, [BASE, FRAME_PC] - | .IOS mov RA, BASE - | bl extern modf - | .IOS mov BASE, RA - | mov RC, #(2+1)*8 - | vstr d0, [BASE] - | b ->fff_res - |.else - |.ffunc_n math_modf - | sub CARG3, BASE, #8 - | ldr PC, [BASE, FRAME_PC] - | .IOS mov RA, BASE - | bl extern modf - | .IOS mov BASE, RA - | mov RC, #(2+1)*8 - | strd CARG12, [BASE] - | b ->fff_res - |.endif - | - |.macro math_minmax, name, cond, fcond - |.if FPU - | .ffunc_1 name - | add RB, BASE, RC - | checktp CARG2, LJ_TISNUM - | add RA, BASE, #8 - | bne >4 - |1: // Handle integers. - | ldrd CARG34, [RA] - | cmp RA, RB - | bhs ->fff_restv - | checktp CARG4, LJ_TISNUM - | bne >3 - | cmp CARG1, CARG3 - | add RA, RA, #8 - | mov..cond CARG1, CARG3 - | b <1 - |3: // Convert intermediate result to number and continue below. - | vmov s4, CARG1 - | bhi ->fff_fallback - | vldr d1, [RA] - | vcvt.f64.s32 d0, s4 - | b >6 - | - |4: - | vldr d0, [BASE] - | bhi ->fff_fallback - |5: // Handle numbers. - | ldrd CARG34, [RA] - | vldr d1, [RA] - | cmp RA, RB - | bhs ->fff_resd - | checktp CARG4, LJ_TISNUM - | bhs >7 - |6: - | vcmp.f64 d0, d1 - | vmrs - | add RA, RA, #8 - | vmov..fcond.f64 d0, d1 - | b <5 - |7: // Convert integer to number and continue above. - | vmov s4, CARG3 - | bhi ->fff_fallback - | vcvt.f64.s32 d1, s4 - | b <6 - | - |.else - | - | .ffunc_1 name - | checktp CARG2, LJ_TISNUM - | mov RA, #8 - | bne >4 - |1: // Handle integers. - | ldrd CARG34, [BASE, RA] - | cmp RA, RC - | bhs ->fff_restv - | checktp CARG4, LJ_TISNUM - | bne >3 - | cmp CARG1, CARG3 - | add RA, RA, #8 - | mov..cond CARG1, CARG3 - | b <1 - |3: // Convert intermediate result to number and continue below. - | bhi ->fff_fallback - | bl extern __aeabi_i2d - | ldrd CARG34, [BASE, RA] - | b >6 - | - |4: - | bhi ->fff_fallback - |5: // Handle numbers. - | ldrd CARG34, [BASE, RA] - | cmp RA, RC - | bhs ->fff_restv - | checktp CARG4, LJ_TISNUM - | bhs >7 - |6: - | bl extern __aeabi_cdcmple - | add RA, RA, #8 - | mov..fcond CARG1, CARG3 - | mov..fcond CARG2, CARG4 - | b <5 - |7: // Convert integer to number and continue above. - | bhi ->fff_fallback - | strd CARG12, TMPD - | mov CARG1, CARG3 - | bl extern __aeabi_i2d - | ldrd CARG34, TMPD - | b <6 - |.endif - |.endmacro - | - | math_minmax math_min, gt, hi - | math_minmax math_max, lt, lo - | - |//-- String library ----------------------------------------------------- - | - |.ffunc_1 string_len - | checkstr CARG2, ->fff_fallback - | ldr CARG1, STR:CARG1->len - | mvn CARG2, #~LJ_TISNUM - | b ->fff_restv - | - |.ffunc string_byte // Only handle the 1-arg case here. - | ldrd CARG12, [BASE] - | ldr PC, [BASE, FRAME_PC] - | cmp NARGS8:RC, #8 - | checktpeq CARG2, LJ_TSTR // Need exactly 1 argument. - | bne ->fff_fallback - | ldr CARG3, STR:CARG1->len - | ldrb CARG1, STR:CARG1[1] // Access is always ok (NUL at end). - | mvn CARG2, #~LJ_TISNUM - | cmp CARG3, #0 - | moveq RC, #(0+1)*8 - | movne RC, #(1+1)*8 - | strd CARG12, [BASE, #-8] - | b ->fff_res - | - |.ffunc string_char // Only handle the 1-arg case here. - | ffgccheck - | ldrd CARG12, [BASE] - | ldr PC, [BASE, FRAME_PC] - | cmp NARGS8:RC, #8 // Need exactly 1 argument. - | checktpeq CARG2, LJ_TISNUM - | bicseq CARG4, CARG1, #255 - | mov CARG3, #1 - | bne ->fff_fallback - | str CARG1, TMPD - | mov CARG2, TMPDp // Points to stack. Little-endian. - |->fff_newstr: - | // CARG2 = str, CARG3 = len. - | str BASE, L->base - | mov CARG1, L - | str PC, SAVE_PC - | bl extern lj_str_new // (lua_State *L, char *str, size_t l) - | // Returns GCstr *. - | ldr BASE, L->base - | mvn CARG2, #~LJ_TSTR - | b ->fff_restv - | - |.ffunc string_sub - | ffgccheck - | ldrd CARG12, [BASE] - | ldrd CARG34, [BASE, #16] - | cmp NARGS8:RC, #16 - | mvn RB, #0 - | beq >1 - | blo ->fff_fallback - | checktp CARG4, LJ_TISNUM - | mov RB, CARG3 - | bne ->fff_fallback - |1: - | ldrd CARG34, [BASE, #8] - | checktp CARG2, LJ_TSTR - | ldreq CARG2, STR:CARG1->len - | checktpeq CARG4, LJ_TISNUM - | bne ->fff_fallback - | // CARG1 = str, CARG2 = str->len, CARG3 = start, RB = end - | add CARG4, CARG2, #1 - | cmp CARG3, #0 // if (start < 0) start += len+1 - | addlt CARG3, CARG3, CARG4 - | cmp CARG3, #1 // if (start < 1) start = 1 - | movlt CARG3, #1 - | cmp RB, #0 // if (end < 0) end += len+1 - | addlt RB, RB, CARG4 - | bic RB, RB, RB, asr #31 // if (end < 0) end = 0 - | cmp RB, CARG2 // if (end > len) end = len - | add CARG1, STR:CARG1, #sizeof(GCstr)-1 - | movgt RB, CARG2 - | add CARG2, CARG1, CARG3 - | subs CARG3, RB, CARG3 // len = end - start - | add CARG3, CARG3, #1 // len += 1 - | bge ->fff_newstr - |->fff_emptystr: - | sub STR:CARG1, DISPATCH, #-DISPATCH_GL(strempty) - | mvn CARG2, #~LJ_TSTR - | b ->fff_restv - | - |.ffunc string_rep // Only handle the 1-char case inline. - | ffgccheck - | ldrd CARG12, [BASE] - | ldrd CARG34, [BASE, #8] - | cmp NARGS8:RC, #16 - | bne ->fff_fallback // Exactly 2 arguments - | checktp CARG2, LJ_TSTR - | checktpeq CARG4, LJ_TISNUM - | bne ->fff_fallback - | subs CARG4, CARG3, #1 - | ldr CARG2, STR:CARG1->len - | blt ->fff_emptystr // Count <= 0? - | cmp CARG2, #1 - | blo ->fff_emptystr // Zero-length string? - | bne ->fff_fallback // Fallback for > 1-char strings. - | ldr RB, [DISPATCH, #DISPATCH_GL(tmpbuf.sz)] - | ldr CARG2, [DISPATCH, #DISPATCH_GL(tmpbuf.buf)] - | ldr CARG1, STR:CARG1[1] - | cmp RB, CARG3 - | blo ->fff_fallback - |1: // Fill buffer with char. - | strb CARG1, [CARG2, CARG4] - | subs CARG4, CARG4, #1 - | bge <1 - | b ->fff_newstr - | - |.ffunc string_reverse - | ffgccheck - | ldrd CARG12, [BASE] - | cmp NARGS8:RC, #8 - | blo ->fff_fallback - | checkstr CARG2, ->fff_fallback - | ldr CARG3, STR:CARG1->len - | ldr RB, [DISPATCH, #DISPATCH_GL(tmpbuf.sz)] - | ldr CARG2, [DISPATCH, #DISPATCH_GL(tmpbuf.buf)] - | mov CARG4, CARG3 - | add CARG1, STR:CARG1, #sizeof(GCstr) - | cmp RB, CARG3 - | blo ->fff_fallback - |1: // Reverse string copy. - | ldrb RB, [CARG1], #1 - | subs CARG4, CARG4, #1 - | blt ->fff_newstr - | strb RB, [CARG2, CARG4] - | b <1 - | - |.macro ffstring_case, name, lo - | .ffunc name - | ffgccheck - | ldrd CARG12, [BASE] - | cmp NARGS8:RC, #8 - | blo ->fff_fallback - | checkstr CARG2, ->fff_fallback - | ldr CARG3, STR:CARG1->len - | ldr RB, [DISPATCH, #DISPATCH_GL(tmpbuf.sz)] - | ldr CARG2, [DISPATCH, #DISPATCH_GL(tmpbuf.buf)] - | mov CARG4, #0 - | add CARG1, STR:CARG1, #sizeof(GCstr) - | cmp RB, CARG3 - | blo ->fff_fallback - |1: // ASCII case conversion. - | ldrb RB, [CARG1, CARG4] - | cmp CARG4, CARG3 - | bhs ->fff_newstr - | sub RC, RB, #lo - | cmp RC, #26 - | eorlo RB, RB, #0x20 - | strb RB, [CARG2, CARG4] - | add CARG4, CARG4, #1 - | b <1 - |.endmacro - | - |ffstring_case string_lower, 65 - |ffstring_case string_upper, 97 - | - |//-- Table library ------------------------------------------------------ - | - |.ffunc_1 table_getn - | checktab CARG2, ->fff_fallback - | .IOS mov RA, BASE - | bl extern lj_tab_len // (GCtab *t) - | // Returns uint32_t (but less than 2^31). - | .IOS mov BASE, RA - | mvn CARG2, #~LJ_TISNUM - | b ->fff_restv - | - |//-- Bit library -------------------------------------------------------- - | - |// FP number to bit conversion for soft-float. Clobbers r0-r3. - |->vm_tobit_fb: - | bhi ->fff_fallback - |->vm_tobit: - | lsl RB, CARG2, #1 - | adds RB, RB, #0x00200000 - | movpl CARG1, #0 // |x| < 1? - | bxpl lr - | mvn CARG4, #0x3e0 - | subs RB, CARG4, RB, asr #21 - | bmi >1 // |x| >= 2^32? - | lsl CARG4, CARG2, #11 - | orr CARG4, CARG4, #0x80000000 - | orr CARG4, CARG4, CARG1, lsr #21 - | cmp CARG2, #0 - | lsr CARG1, CARG4, RB - | rsblt CARG1, CARG1, #0 - | bx lr - |1: - | add RB, RB, #21 - | lsr CARG4, CARG1, RB - | rsb RB, RB, #20 - | lsl CARG1, CARG2, #12 - | cmp CARG2, #0 - | orr CARG1, CARG4, CARG1, lsl RB - | rsblt CARG1, CARG1, #0 - | bx lr - | - |.macro .ffunc_bit, name - | .ffunc_1 bit_..name - | checktp CARG2, LJ_TISNUM - | blne ->vm_tobit_fb - |.endmacro - | - |.ffunc_bit tobit - | mvn CARG2, #~LJ_TISNUM - | b ->fff_restv - | - |.macro .ffunc_bit_op, name, ins - | .ffunc_bit name - | mov CARG3, CARG1 - | mov RA, #8 - |1: - | ldrd CARG12, [BASE, RA] - | cmp RA, NARGS8:RC - | add RA, RA, #8 - | bge >2 - | checktp CARG2, LJ_TISNUM - | blne ->vm_tobit_fb - | ins CARG3, CARG3, CARG1 - | b <1 - |.endmacro - | - |.ffunc_bit_op band, and - |.ffunc_bit_op bor, orr - |.ffunc_bit_op bxor, eor - | - |2: - | mvn CARG4, #~LJ_TISNUM - | ldr PC, [BASE, FRAME_PC] - | strd CARG34, [BASE, #-8] - | b ->fff_res1 - | - |.ffunc_bit bswap - | eor CARG3, CARG1, CARG1, ror #16 - | bic CARG3, CARG3, #0x00ff0000 - | ror CARG1, CARG1, #8 - | mvn CARG2, #~LJ_TISNUM - | eor CARG1, CARG1, CARG3, lsr #8 - | b ->fff_restv - | - |.ffunc_bit bnot - | mvn CARG1, CARG1 - | mvn CARG2, #~LJ_TISNUM - | b ->fff_restv - | - |.macro .ffunc_bit_sh, name, ins, shmod - | .ffunc bit_..name - | ldrd CARG12, [BASE, #8] - | cmp NARGS8:RC, #16 - | blo ->fff_fallback - | checktp CARG2, LJ_TISNUM - | blne ->vm_tobit_fb - |.if shmod == 0 - | and RA, CARG1, #31 - |.else - | rsb RA, CARG1, #0 - |.endif - | ldrd CARG12, [BASE] - | checktp CARG2, LJ_TISNUM - | blne ->vm_tobit_fb - | ins CARG1, CARG1, RA - | mvn CARG2, #~LJ_TISNUM - | b ->fff_restv - |.endmacro - | - |.ffunc_bit_sh lshift, lsl, 0 - |.ffunc_bit_sh rshift, lsr, 0 - |.ffunc_bit_sh arshift, asr, 0 - |.ffunc_bit_sh rol, ror, 1 - |.ffunc_bit_sh ror, ror, 0 - | - |//----------------------------------------------------------------------- - | - |->fff_fallback: // Call fast function fallback handler. - | // BASE = new base, RC = nargs*8 - | ldr CARG3, [BASE, FRAME_FUNC] - | ldr CARG2, L->maxstack - | add CARG1, BASE, NARGS8:RC - | ldr PC, [BASE, FRAME_PC] // Fallback may overwrite PC. - | str CARG1, L->top - | ldr CARG3, CFUNC:CARG3->f - | str BASE, L->base - | add CARG1, CARG1, #8*LUA_MINSTACK - | str PC, SAVE_PC // Redundant (but a defined value). - | cmp CARG1, CARG2 - | mov CARG1, L - | bhi >5 // Need to grow stack. - | blx CARG3 // (lua_State *L) - | // Either throws an error, or recovers and returns -1, 0 or nresults+1. - | ldr BASE, L->base - | cmp CRET1, #0 - | lsl RC, CRET1, #3 - | sub RA, BASE, #8 - | bgt ->fff_res // Returned nresults+1? - |1: // Returned 0 or -1: retry fast path. - | ldr CARG1, L->top - | ldr LFUNC:CARG3, [BASE, FRAME_FUNC] - | sub NARGS8:RC, CARG1, BASE - | bne ->vm_call_tail // Returned -1? - | ins_callt // Returned 0: retry fast path. - | - |// Reconstruct previous base for vmeta_call during tailcall. - |->vm_call_tail: - | ands CARG1, PC, #FRAME_TYPE - | bic CARG2, PC, #FRAME_TYPEP - | ldreq INS, [PC, #-4] - | andeq CARG2, MASKR8, INS, lsr #5 // Conditional decode_RA8. - | addeq CARG2, CARG2, #8 - | sub RB, BASE, CARG2 - | b ->vm_call_dispatch // Resolve again for tailcall. - | - |5: // Grow stack for fallback handler. - | mov CARG2, #LUA_MINSTACK - | bl extern lj_state_growstack // (lua_State *L, int n) - | ldr BASE, L->base - | cmp CARG1, CARG1 // Set zero-flag to force retry. - | b <1 - | - |->fff_gcstep: // Call GC step function. - | // BASE = new base, RC = nargs*8 - | mov RA, lr - | str BASE, L->base - | add CARG2, BASE, NARGS8:RC - | str PC, SAVE_PC // Redundant (but a defined value). - | str CARG2, L->top - | mov CARG1, L - | bl extern lj_gc_step // (lua_State *L) - | ldr BASE, L->base - | mov lr, RA // Help return address predictor. - | ldr CFUNC:CARG3, [BASE, FRAME_FUNC] - | bx lr - | - |//----------------------------------------------------------------------- - |//-- Special dispatch targets ------------------------------------------- - |//----------------------------------------------------------------------- - | - |->vm_record: // Dispatch target for recording phase. - |.if JIT - | ldrb CARG1, [DISPATCH, #DISPATCH_GL(hookmask)] - | tst CARG1, #HOOK_VMEVENT // No recording while in vmevent. - | bne >5 - | // Decrement the hookcount for consistency, but always do the call. - | ldr CARG2, [DISPATCH, #DISPATCH_GL(hookcount)] - | tst CARG1, #HOOK_ACTIVE - | bne >1 - | sub CARG2, CARG2, #1 - | tst CARG1, #LUA_MASKLINE|LUA_MASKCOUNT - | strne CARG2, [DISPATCH, #DISPATCH_GL(hookcount)] - | b >1 - |.endif - | - |->vm_rethook: // Dispatch target for return hooks. - | ldrb CARG1, [DISPATCH, #DISPATCH_GL(hookmask)] - | tst CARG1, #HOOK_ACTIVE // Hook already active? - | beq >1 - |5: // Re-dispatch to static ins. - | decode_OP OP, INS - | add OP, DISPATCH, OP, lsl #2 - | ldr pc, [OP, #GG_DISP2STATIC] - | - |->vm_inshook: // Dispatch target for instr/line hooks. - | ldrb CARG1, [DISPATCH, #DISPATCH_GL(hookmask)] - | ldr CARG2, [DISPATCH, #DISPATCH_GL(hookcount)] - | tst CARG1, #HOOK_ACTIVE // Hook already active? - | bne <5 - | tst CARG1, #LUA_MASKLINE|LUA_MASKCOUNT - | beq <5 - | subs CARG2, CARG2, #1 - | str CARG2, [DISPATCH, #DISPATCH_GL(hookcount)] - | beq >1 - | tst CARG1, #LUA_MASKLINE - | beq <5 - |1: - | mov CARG1, L - | str BASE, L->base - | mov CARG2, PC - | // SAVE_PC must hold the _previous_ PC. The callee updates it with PC. - | bl extern lj_dispatch_ins // (lua_State *L, const BCIns *pc) - |3: - | ldr BASE, L->base - |4: // Re-dispatch to static ins. - | ldrb OP, [PC, #-4] - | ldr INS, [PC, #-4] - | add OP, DISPATCH, OP, lsl #2 - | ldr OP, [OP, #GG_DISP2STATIC] - | decode_RA8 RA, INS - | decode_RD RC, INS - | bx OP - | - |->cont_hook: // Continue from hook yield. - | ldr CARG1, [CARG4, #-24] - | add PC, PC, #4 - | str CARG1, SAVE_MULTRES // Restore MULTRES for *M ins. - | b <4 - | - |->vm_hotloop: // Hot loop counter underflow. - |.if JIT - | ldr LFUNC:CARG3, [BASE, FRAME_FUNC] // Same as curr_topL(L). - | sub CARG1, DISPATCH, #-GG_DISP2J - | str PC, SAVE_PC - | ldr CARG3, LFUNC:CARG3->field_pc - | mov CARG2, PC - | str L, [DISPATCH, #DISPATCH_J(L)] - | ldrb CARG3, [CARG3, #PC2PROTO(framesize)] - | str BASE, L->base - | add CARG3, BASE, CARG3, lsl #3 - | str CARG3, L->top - | bl extern lj_trace_hot // (jit_State *J, const BCIns *pc) - | b <3 - |.endif - | - |->vm_callhook: // Dispatch target for call hooks. - | mov CARG2, PC - |.if JIT - | b >1 - |.endif - | - |->vm_hotcall: // Hot call counter underflow. - |.if JIT - | orr CARG2, PC, #1 - |1: - |.endif - | add CARG4, BASE, RC - | str PC, SAVE_PC - | mov CARG1, L - | str BASE, L->base - | sub RA, RA, BASE - | str CARG4, L->top - | bl extern lj_dispatch_call // (lua_State *L, const BCIns *pc) - | // Returns ASMFunction. - | ldr BASE, L->base - | ldr CARG4, L->top - | mov CARG2, #0 - | add RA, BASE, RA - | sub NARGS8:RC, CARG4, BASE - | str CARG2, SAVE_PC // Invalidate for subsequent line hook. - | ldr LFUNC:CARG3, [BASE, FRAME_FUNC] - | ldr INS, [PC, #-4] - | bx CRET1 - | - |//----------------------------------------------------------------------- - |//-- Trace exit handler ------------------------------------------------- - |//----------------------------------------------------------------------- - | - |->vm_exit_handler: - |.if JIT - | sub sp, sp, #12 - | push {r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12} - | ldr CARG1, [sp, #64] // Load original value of lr. - | ldr DISPATCH, [lr] // Load DISPATCH. - | add CARG3, sp, #64 // Recompute original value of sp. - | mv_vmstate CARG4, EXIT - | str CARG3, [sp, #52] // Store sp in RID_SP - | st_vmstate CARG4 - | ldr CARG2, [CARG1, #-4]! // Get exit instruction. - | str CARG1, [sp, #56] // Store exit pc in RID_LR and RID_PC. - | str CARG1, [sp, #60] - |.if FPU - | vpush {d0-d15} - |.endif - | lsl CARG2, CARG2, #8 - | add CARG1, CARG1, CARG2, asr #6 - | ldr CARG2, [lr, #4] // Load exit stub group offset. - | sub CARG1, CARG1, lr - | ldr L, [DISPATCH, #DISPATCH_GL(jit_L)] - | add CARG1, CARG2, CARG1, lsr #2 // Compute exit number. - | ldr BASE, [DISPATCH, #DISPATCH_GL(jit_base)] - | str CARG1, [DISPATCH, #DISPATCH_J(exitno)] - | mov CARG4, #0 - | str L, [DISPATCH, #DISPATCH_J(L)] - | str BASE, L->base - | str CARG4, [DISPATCH, #DISPATCH_GL(jit_L)] - | sub CARG1, DISPATCH, #-GG_DISP2J - | mov CARG2, sp - | bl extern lj_trace_exit // (jit_State *J, ExitState *ex) - | // Returns MULTRES (unscaled) or negated error code. - | ldr CARG2, L->cframe - | ldr BASE, L->base - | bic CARG2, CARG2, #~CFRAME_RAWMASK // Use two steps: bic sp is deprecated. - | mov sp, CARG2 - | ldr PC, SAVE_PC // Get SAVE_PC. - | str L, SAVE_L // Set SAVE_L (on-trace resume/yield). - | b >1 - |.endif - |->vm_exit_interp: - | // CARG1 = MULTRES or negated error code, BASE, PC and DISPATCH set. - |.if JIT - | ldr L, SAVE_L - |1: - | cmp CARG1, #0 - | blt >3 // Check for error from exit. - | lsl RC, CARG1, #3 - | ldr LFUNC:CARG2, [BASE, FRAME_FUNC] - | str RC, SAVE_MULTRES - | mov CARG3, #0 - | ldr CARG2, LFUNC:CARG2->field_pc - | str CARG3, [DISPATCH, #DISPATCH_GL(jit_L)] - | mv_vmstate CARG4, INTERP - | ldr KBASE, [CARG2, #PC2PROTO(k)] - | // Modified copy of ins_next which handles function header dispatch, too. - | ldrb OP, [PC] - | mov MASKR8, #255 - | ldr INS, [PC], #4 - | lsl MASKR8, MASKR8, #3 // MASKR8 = 255*8. - | st_vmstate CARG4 - | cmp OP, #BC_FUNCF // Function header? - | ldr OP, [DISPATCH, OP, lsl #2] - | decode_RA8 RA, INS - | lsrlo RC, INS, #16 // No: Decode operands A*8 and D. - | subhs RC, RC, #8 - | addhs RA, RA, BASE // Yes: RA = BASE+framesize*8, RC = nargs*8 - | bx OP - | - |3: // Rethrow error from the right C frame. - | rsb CARG2, CARG1, #0 - | mov CARG1, L - | bl extern lj_err_throw // (lua_State *L, int errcode) - |.endif - | - |//----------------------------------------------------------------------- - |//-- Math helper functions ---------------------------------------------- - |//----------------------------------------------------------------------- - | - |// FP value rounding. Called from JIT code. - |// - |// double lj_vm_floor/ceil/trunc(double x); - |.macro vm_round, func, hf - |.if hf == 1 - | vmov CARG1, CARG2, d0 - |.endif - | lsl CARG3, CARG2, #1 - | adds RB, CARG3, #0x00200000 - | bpl >2 // |x| < 1? - | mvn CARG4, #0x3cc - | subs RB, CARG4, RB, asr #21 // 2^0: RB = 51, 2^51: RB = 0. - | bxlo lr // |x| >= 2^52: done. - | mvn CARG4, #1 - | bic CARG3, CARG1, CARG4, lsl RB // ztest = lo & ~lomask - | and CARG1, CARG1, CARG4, lsl RB // lo &= lomask - | subs RB, RB, #32 - | bicpl CARG4, CARG2, CARG4, lsl RB // |x| <= 2^20: ztest |= hi & ~himask - | orrpl CARG3, CARG3, CARG4 - | mvnpl CARG4, #1 - | andpl CARG2, CARG2, CARG4, lsl RB // |x| <= 2^20: hi &= himask - |.if "func" == "floor" - | tst CARG3, CARG2, asr #31 // iszero = ((ztest & signmask) == 0) - |.else - | bics CARG3, CARG3, CARG2, asr #31 // iszero = ((ztest & ~signmask) == 0) - |.endif - |.if hf == 1 - | vmoveq d0, CARG1, CARG2 - |.endif - | bxeq lr // iszero: done. - | mvn CARG4, #1 - | cmp RB, #0 - | lslpl CARG3, CARG4, RB - | mvnmi CARG3, #0 - | add RB, RB, #32 - | subs CARG1, CARG1, CARG4, lsl RB // lo = lo-lomask - | sbc CARG2, CARG2, CARG3 // hi = hi-himask+carry - |.if hf == 1 - | vmov d0, CARG1, CARG2 - |.endif - | bx lr - | - |2: // |x| < 1: - | bxcs lr // |x| is not finite. - | orr CARG3, CARG3, CARG1 // ztest = (2*hi) | lo - |.if "func" == "floor" - | tst CARG3, CARG2, asr #31 // iszero = ((ztest & signmask) == 0) - |.else - | bics CARG3, CARG3, CARG2, asr #31 // iszero = ((ztest & ~signmask) == 0) - |.endif - | mov CARG1, #0 // lo = 0 - | and CARG2, CARG2, #0x80000000 - | ldrne CARG4, <9 // hi = sign(x) | (iszero ? 0.0 : 1.0) - | orrne CARG2, CARG2, CARG4 - |.if hf == 1 - | vmov d0, CARG1, CARG2 - |.endif - | bx lr - |.endmacro - | - |9: - | .long 0x3ff00000 // hiword(+1.0) - | - |->vm_floor: - |.if HFABI - | vm_round floor, 1 - |.endif - |->vm_floor_sf: - | vm_round floor, 0 - | - |->vm_ceil: - |.if HFABI - | vm_round ceil, 1 - |.endif - |->vm_ceil_sf: - | vm_round ceil, 0 - | - |.macro vm_trunc, hf - |.if JIT - |.if hf == 1 - | vmov CARG1, CARG2, d0 - |.endif - | lsl CARG3, CARG2, #1 - | adds RB, CARG3, #0x00200000 - | andpl CARG2, CARG2, #0x80000000 // |x| < 1? hi = sign(x), lo = 0. - | movpl CARG1, #0 - |.if hf == 1 - | vmovpl d0, CARG1, CARG2 - |.endif - | bxpl lr - | mvn CARG4, #0x3cc - | subs RB, CARG4, RB, asr #21 // 2^0: RB = 51, 2^51: RB = 0. - | bxlo lr // |x| >= 2^52: already done. - | mvn CARG4, #1 - | and CARG1, CARG1, CARG4, lsl RB // lo &= lomask - | subs RB, RB, #32 - | andpl CARG2, CARG2, CARG4, lsl RB // |x| <= 2^20: hi &= himask - |.if hf == 1 - | vmov d0, CARG1, CARG2 - |.endif - | bx lr - |.endif - |.endmacro - | - |->vm_trunc: - |.if HFABI - | vm_trunc 1 - |.endif - |->vm_trunc_sf: - | vm_trunc 0 - | - | // double lj_vm_mod(double dividend, double divisor); - |->vm_mod: - |.if FPU - | // Special calling convention. Also, RC (r11) is not preserved. - | vdiv.f64 d0, d6, d7 - | mov RC, lr - | vmov CARG1, CARG2, d0 - | bl ->vm_floor_sf - | vmov d0, CARG1, CARG2 - | vmul.f64 d0, d0, d7 - | mov lr, RC - | vsub.f64 d6, d6, d0 - | bx lr - |.else - | push {r0, r1, r2, r3, r4, lr} - | bl extern __aeabi_ddiv - | bl ->vm_floor_sf - | ldrd CARG34, [sp, #8] - | bl extern __aeabi_dmul - | ldrd CARG34, [sp] - | eor CARG2, CARG2, #0x80000000 - | bl extern __aeabi_dadd - | add sp, sp, #20 - | pop {pc} - |.endif - | - | // int lj_vm_modi(int dividend, int divisor); - |->vm_modi: - | ands RB, CARG1, #0x80000000 - | rsbmi CARG1, CARG1, #0 // a = |dividend| - | eor RB, RB, CARG2, asr #1 // Keep signdiff and sign(divisor). - | cmp CARG2, #0 - | rsbmi CARG2, CARG2, #0 // b = |divisor| - | subs CARG4, CARG2, #1 - | cmpne CARG1, CARG2 - | moveq CARG1, #0 // if (b == 1 || a == b) a = 0 - | tsthi CARG2, CARG4 - | andeq CARG1, CARG1, CARG4 // else if ((b & (b-1)) == 0) a &= b-1 - | bls >1 - | // Use repeated subtraction to get the remainder. - | clz CARG3, CARG1 - | clz CARG4, CARG2 - | sub CARG4, CARG4, CARG3 - | rsbs CARG3, CARG4, #31 // entry = (31-(clz(b)-clz(a)))*8 - | addne pc, pc, CARG3, lsl #3 // Duff's device. - | nop - { - int i; - for (i = 31; i >= 0; i--) { - | cmp CARG1, CARG2, lsl #i - | subhs CARG1, CARG1, CARG2, lsl #i - } - } - |1: - | cmp CARG1, #0 - | cmpne RB, #0 - | submi CARG1, CARG1, CARG2 // if (y != 0 && signdiff) y = y - b - | eors CARG2, CARG1, RB, lsl #1 - | rsbmi CARG1, CARG1, #0 // if (sign(divisor) != sign(y)) y = -y - | bx lr - | - |//----------------------------------------------------------------------- - |//-- Miscellaneous functions -------------------------------------------- - |//----------------------------------------------------------------------- - | - |//----------------------------------------------------------------------- - |//-- FFI helper functions ----------------------------------------------- - |//----------------------------------------------------------------------- - | - |// Handler for callback functions. - |// Saveregs already performed. Callback slot number in [sp], g in r12. - |->vm_ffi_callback: - |.if FFI - |.type CTSTATE, CTState, PC - | ldr CTSTATE, GL:r12->ctype_state - | add DISPATCH, r12, #GG_G2DISP - |.if FPU - | str r4, SAVE_R4 - | add r4, sp, CFRAME_SPACE+4+8*8 - | vstmdb r4!, {d8-d15} - |.endif - |.if HFABI - | add r12, CTSTATE, #offsetof(CTState, cb.fpr[8]) - |.endif - | strd CARG34, CTSTATE->cb.gpr[2] - | strd CARG12, CTSTATE->cb.gpr[0] - |.if HFABI - | vstmdb r12!, {d0-d7} - |.endif - | ldr CARG4, [sp] - | add CARG3, sp, #CFRAME_SIZE - | mov CARG1, CTSTATE - | lsr CARG4, CARG4, #3 - | str CARG3, CTSTATE->cb.stack - | mov CARG2, sp - | str CARG4, CTSTATE->cb.slot - | str CTSTATE, SAVE_PC // Any value outside of bytecode is ok. - | bl extern lj_ccallback_enter // (CTState *cts, void *cf) - | // Returns lua_State *. - | ldr BASE, L:CRET1->base - | mv_vmstate CARG2, INTERP - | ldr RC, L:CRET1->top - | mov MASKR8, #255 - | ldr LFUNC:CARG3, [BASE, FRAME_FUNC] - | mov L, CRET1 - | sub RC, RC, BASE - | lsl MASKR8, MASKR8, #3 // MASKR8 = 255*8. - | st_vmstate CARG2 - | ins_callt - |.endif - | - |->cont_ffi_callback: // Return from FFI callback. - |.if FFI - | ldr CTSTATE, [DISPATCH, #DISPATCH_GL(ctype_state)] - | str BASE, L->base - | str CARG4, L->top - | str L, CTSTATE->L - | mov CARG1, CTSTATE - | mov CARG2, RA - | bl extern lj_ccallback_leave // (CTState *cts, TValue *o) - | ldrd CARG12, CTSTATE->cb.gpr[0] - |.if HFABI - | vldr d0, CTSTATE->cb.fpr[0] - |.endif - | b ->vm_leave_unw - |.endif - | - |->vm_ffi_call: // Call C function via FFI. - | // Caveat: needs special frame unwinding, see below. - |.if FFI - | .type CCSTATE, CCallState, r4 - | push {CCSTATE, r5, r11, lr} - | mov CCSTATE, CARG1 - | ldr CARG1, CCSTATE:CARG1->spadj - | ldrb CARG2, CCSTATE->nsp - | add CARG3, CCSTATE, #offsetof(CCallState, stack) - |.if HFABI - | add RB, CCSTATE, #offsetof(CCallState, fpr[0]) - |.endif - | mov r11, sp - | sub sp, sp, CARG1 // Readjust stack. - | subs CARG2, CARG2, #1 - |.if HFABI - | vldm RB, {d0-d7} - |.endif - | ldr RB, CCSTATE->func - | bmi >2 - |1: // Copy stack slots. - | ldr CARG4, [CARG3, CARG2, lsl #2] - | str CARG4, [sp, CARG2, lsl #2] - | subs CARG2, CARG2, #1 - | bpl <1 - |2: - | ldrd CARG12, CCSTATE->gpr[0] - | ldrd CARG34, CCSTATE->gpr[2] - | blx RB - | mov sp, r11 - |.if HFABI - | add r12, CCSTATE, #offsetof(CCallState, fpr[4]) - |.endif - | strd CRET1, CCSTATE->gpr[0] - |.if HFABI - | vstmdb r12!, {d0-d3} - |.endif - | pop {CCSTATE, r5, r11, pc} - |.endif - |// Note: vm_ffi_call must be the last function in this object file! - | - |//----------------------------------------------------------------------- -} - -/* Generate the code for a single instruction. */ -static void build_ins(BuildCtx *ctx, BCOp op, int defop) -{ - int vk = 0; - |=>defop: - - switch (op) { - - /* -- Comparison ops ---------------------------------------------------- */ - - /* Remember: all ops branch for a true comparison, fall through otherwise. */ - - case BC_ISLT: case BC_ISGE: case BC_ISLE: case BC_ISGT: - | // RA = src1*8, RC = src2, JMP with RC = target - | lsl RC, RC, #3 - | ldrd CARG12, [RA, BASE]! - | ldrh RB, [PC, #2] - | ldrd CARG34, [RC, BASE]! - | add PC, PC, #4 - | add RB, PC, RB, lsl #2 - | checktp CARG2, LJ_TISNUM - | bne >3 - | checktp CARG4, LJ_TISNUM - | bne >4 - | cmp CARG1, CARG3 - if (op == BC_ISLT) { - | sublt PC, RB, #0x20000 - } else if (op == BC_ISGE) { - | subge PC, RB, #0x20000 - } else if (op == BC_ISLE) { - | suble PC, RB, #0x20000 - } else { - | subgt PC, RB, #0x20000 - } - |1: - | ins_next - | - |3: // CARG12 is not an integer. - |.if FPU - | vldr d0, [RA] - | bhi ->vmeta_comp - | // d0 is a number. - | checktp CARG4, LJ_TISNUM - | vldr d1, [RC] - | blo >5 - | bhi ->vmeta_comp - | // d0 is a number, CARG3 is an integer. - | vmov s4, CARG3 - | vcvt.f64.s32 d1, s4 - | b >5 - |4: // CARG1 is an integer, CARG34 is not an integer. - | vldr d1, [RC] - | bhi ->vmeta_comp - | // CARG1 is an integer, d1 is a number. - | vmov s4, CARG1 - | vcvt.f64.s32 d0, s4 - |5: // d0 and d1 are numbers. - | vcmp.f64 d0, d1 - | vmrs - | // To preserve NaN semantics GE/GT branch on unordered, but LT/LE don't. - if (op == BC_ISLT) { - | sublo PC, RB, #0x20000 - } else if (op == BC_ISGE) { - | subhs PC, RB, #0x20000 - } else if (op == BC_ISLE) { - | subls PC, RB, #0x20000 - } else { - | subhi PC, RB, #0x20000 - } - | b <1 - |.else - | bhi ->vmeta_comp - | // CARG12 is a number. - | checktp CARG4, LJ_TISNUM - | movlo RA, RB // Save RB. - | blo >5 - | bhi ->vmeta_comp - | // CARG12 is a number, CARG3 is an integer. - | mov CARG1, CARG3 - | mov RC, RA - | mov RA, RB // Save RB. - | bl extern __aeabi_i2d - | mov CARG3, CARG1 - | mov CARG4, CARG2 - | ldrd CARG12, [RC] // Restore first operand. - | b >5 - |4: // CARG1 is an integer, CARG34 is not an integer. - | bhi ->vmeta_comp - | // CARG1 is an integer, CARG34 is a number. - | mov RA, RB // Save RB. - | bl extern __aeabi_i2d - | ldrd CARG34, [RC] // Restore second operand. - |5: // CARG12 and CARG34 are numbers. - | bl extern __aeabi_cdcmple - | // To preserve NaN semantics GE/GT branch on unordered, but LT/LE don't. - if (op == BC_ISLT) { - | sublo PC, RA, #0x20000 - } else if (op == BC_ISGE) { - | subhs PC, RA, #0x20000 - } else if (op == BC_ISLE) { - | subls PC, RA, #0x20000 - } else { - | subhi PC, RA, #0x20000 - } - | b <1 - |.endif - break; - - case BC_ISEQV: case BC_ISNEV: - vk = op == BC_ISEQV; - | // RA = src1*8, RC = src2, JMP with RC = target - | lsl RC, RC, #3 - | ldrd CARG12, [RA, BASE]! - | ldrh RB, [PC, #2] - | ldrd CARG34, [RC, BASE]! - | add PC, PC, #4 - | add RB, PC, RB, lsl #2 - | checktp CARG2, LJ_TISNUM - | cmnls CARG4, #-LJ_TISNUM - if (vk) { - | bls ->BC_ISEQN_Z - } else { - | bls ->BC_ISNEN_Z - } - | // Either or both types are not numbers. - |.if FFI - | checktp CARG2, LJ_TCDATA - | checktpne CARG4, LJ_TCDATA - | beq ->vmeta_equal_cd - |.endif - | cmp CARG2, CARG4 // Compare types. - | bne >2 // Not the same type? - | checktp CARG2, LJ_TISPRI - | bhs >1 // Same type and primitive type? - | - | // Same types and not a primitive type. Compare GCobj or pvalue. - | cmp CARG1, CARG3 - if (vk) { - | bne >3 // Different GCobjs or pvalues? - |1: // Branch if same. - | sub PC, RB, #0x20000 - |2: // Different. - | ins_next - |3: - | checktp CARG2, LJ_TISTABUD - | bhi <2 // Different objects and not table/ud? - } else { - | beq >1 // Same GCobjs or pvalues? - | checktp CARG2, LJ_TISTABUD - | bhi >2 // Different objects and not table/ud? - } - | // Different tables or userdatas. Need to check __eq metamethod. - | // Field metatable must be at same offset for GCtab and GCudata! - | ldr TAB:RA, TAB:CARG1->metatable - | cmp TAB:RA, #0 - if (vk) { - | beq <2 // No metatable? - } else { - | beq >2 // No metatable? - } - | ldrb RA, TAB:RA->nomm - | mov CARG4, #1-vk // ne = 0 or 1. - | mov CARG2, CARG1 - | tst RA, #1<vmeta_equal // 'no __eq' flag not set? - if (vk) { - | b <2 - } else { - |2: // Branch if different. - | sub PC, RB, #0x20000 - |1: // Same. - | ins_next - } - break; - - case BC_ISEQS: case BC_ISNES: - vk = op == BC_ISEQS; - | // RA = src*8, RC = str_const (~), JMP with RC = target - | mvn RC, RC - | ldrd CARG12, [BASE, RA] - | ldrh RB, [PC, #2] - | ldr STR:CARG3, [KBASE, RC, lsl #2] - | add PC, PC, #4 - | add RB, PC, RB, lsl #2 - | checktp CARG2, LJ_TSTR - |.if FFI - | bne >7 - | cmp CARG1, CARG3 - |.else - | cmpeq CARG1, CARG3 - |.endif - if (vk) { - | subeq PC, RB, #0x20000 - |1: - } else { - |1: - | subne PC, RB, #0x20000 - } - | ins_next - | - |.if FFI - |7: - | checktp CARG2, LJ_TCDATA - | bne <1 - | b ->vmeta_equal_cd - |.endif - break; - - case BC_ISEQN: case BC_ISNEN: - vk = op == BC_ISEQN; - | // RA = src*8, RC = num_const (~), JMP with RC = target - | lsl RC, RC, #3 - | ldrd CARG12, [RA, BASE]! - | ldrh RB, [PC, #2] - | ldrd CARG34, [RC, KBASE]! - | add PC, PC, #4 - | add RB, PC, RB, lsl #2 - if (vk) { - |->BC_ISEQN_Z: - } else { - |->BC_ISNEN_Z: - } - | checktp CARG2, LJ_TISNUM - | bne >3 - | checktp CARG4, LJ_TISNUM - | bne >4 - | cmp CARG1, CARG3 - if (vk) { - | subeq PC, RB, #0x20000 - |1: - } else { - |1: - | subne PC, RB, #0x20000 - } - |2: - | ins_next - | - |3: // CARG12 is not an integer. - |.if FFI - | bhi >7 - |.else - if (!vk) { - | subhi PC, RB, #0x20000 - } - | bhi <2 - |.endif - |.if FPU - | checktp CARG4, LJ_TISNUM - | vmov s4, CARG3 - | vldr d0, [RA] - | vldrlo d1, [RC] - | vcvths.f64.s32 d1, s4 - | b >5 - |4: // CARG1 is an integer, d1 is a number. - | vmov s4, CARG1 - | vldr d1, [RC] - | vcvt.f64.s32 d0, s4 - |5: // d0 and d1 are numbers. - | vcmp.f64 d0, d1 - | vmrs - if (vk) { - | subeq PC, RB, #0x20000 - } else { - | subne PC, RB, #0x20000 - } - | b <2 - |.else - | // CARG12 is a number. - | checktp CARG4, LJ_TISNUM - | movlo RA, RB // Save RB. - | blo >5 - | // CARG12 is a number, CARG3 is an integer. - | mov CARG1, CARG3 - | mov RC, RA - |4: // CARG1 is an integer, CARG34 is a number. - | mov RA, RB // Save RB. - | bl extern __aeabi_i2d - | ldrd CARG34, [RC] // Restore other operand. - |5: // CARG12 and CARG34 are numbers. - | bl extern __aeabi_cdcmpeq - if (vk) { - | subeq PC, RA, #0x20000 - } else { - | subne PC, RA, #0x20000 - } - | b <2 - |.endif - | - |.if FFI - |7: - | checktp CARG2, LJ_TCDATA - | bne <1 - | b ->vmeta_equal_cd - |.endif - break; - - case BC_ISEQP: case BC_ISNEP: - vk = op == BC_ISEQP; - | // RA = src*8, RC = primitive_type (~), JMP with RC = target - | ldrd CARG12, [BASE, RA] - | ldrh RB, [PC, #2] - | add PC, PC, #4 - | mvn RC, RC - | add RB, PC, RB, lsl #2 - |.if FFI - | checktp CARG2, LJ_TCDATA - | beq ->vmeta_equal_cd - |.endif - | cmp CARG2, RC - if (vk) { - | subeq PC, RB, #0x20000 - } else { - | subne PC, RB, #0x20000 - } - | ins_next - break; - - /* -- Unary test and copy ops ------------------------------------------- */ - - case BC_ISTC: case BC_ISFC: case BC_IST: case BC_ISF: - | // RA = dst*8 or unused, RC = src, JMP with RC = target - | add RC, BASE, RC, lsl #3 - | ldrh RB, [PC, #2] - | ldrd CARG12, [RC] - | add PC, PC, #4 - | add RB, PC, RB, lsl #2 - | checktp CARG2, LJ_TTRUE - if (op == BC_ISTC || op == BC_IST) { - | subls PC, RB, #0x20000 - if (op == BC_ISTC) { - | strdls CARG12, [BASE, RA] - } - } else { - | subhi PC, RB, #0x20000 - if (op == BC_ISFC) { - | strdhi CARG12, [BASE, RA] - } - } - | ins_next - break; - - /* -- Unary ops --------------------------------------------------------- */ - - case BC_MOV: - | // RA = dst*8, RC = src - | lsl RC, RC, #3 - | ins_next1 - | ldrd CARG12, [BASE, RC] - | ins_next2 - | strd CARG12, [BASE, RA] - | ins_next3 - break; - case BC_NOT: - | // RA = dst*8, RC = src - | add RC, BASE, RC, lsl #3 - | ins_next1 - | ldr CARG1, [RC, #4] - | add RA, BASE, RA - | ins_next2 - | checktp CARG1, LJ_TTRUE - | mvnls CARG2, #~LJ_TFALSE - | mvnhi CARG2, #~LJ_TTRUE - | str CARG2, [RA, #4] - | ins_next3 - break; - case BC_UNM: - | // RA = dst*8, RC = src - | lsl RC, RC, #3 - | ldrd CARG12, [BASE, RC] - | ins_next1 - | ins_next2 - | checktp CARG2, LJ_TISNUM - | bhi ->vmeta_unm - | eorne CARG2, CARG2, #0x80000000 - | bne >5 - | rsbseq CARG1, CARG1, #0 - | ldrdvs CARG12, >9 - |5: - | strd CARG12, [BASE, RA] - | ins_next3 - | - |.align 8 - |9: - | .long 0x00000000, 0x41e00000 // 2^31. - break; - case BC_LEN: - | // RA = dst*8, RC = src - | lsl RC, RC, #3 - | ldrd CARG12, [BASE, RC] - | checkstr CARG2, >2 - | ldr CARG1, STR:CARG1->len - |1: - | mvn CARG2, #~LJ_TISNUM - | ins_next1 - | ins_next2 - | strd CARG12, [BASE, RA] - | ins_next3 - |2: - | checktab CARG2, ->vmeta_len -#if LJ_52 - | ldr TAB:CARG3, TAB:CARG1->metatable - | cmp TAB:CARG3, #0 - | bne >9 - |3: -#endif - |->BC_LEN_Z: - | .IOS mov RC, BASE - | bl extern lj_tab_len // (GCtab *t) - | // Returns uint32_t (but less than 2^31). - | .IOS mov BASE, RC - | b <1 -#if LJ_52 - |9: - | ldrb CARG4, TAB:CARG3->nomm - | tst CARG4, #1<vmeta_len -#endif - break; - - /* -- Binary ops -------------------------------------------------------- */ - - |.macro ins_arithcheck, cond, ncond, target - ||if (vk == 1) { - | cmn CARG4, #-LJ_TISNUM - | cmn..cond CARG2, #-LJ_TISNUM - ||} else { - | cmn CARG2, #-LJ_TISNUM - | cmn..cond CARG4, #-LJ_TISNUM - ||} - | b..ncond target - |.endmacro - |.macro ins_arithcheck_int, target - | ins_arithcheck eq, ne, target - |.endmacro - |.macro ins_arithcheck_num, target - | ins_arithcheck lo, hs, target - |.endmacro - | - |.macro ins_arithpre - | decode_RB8 RB, INS - | decode_RC8 RC, INS - | // RA = dst*8, RB = src1*8, RC = src2*8 | num_const*8 - ||vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN); - ||switch (vk) { - ||case 0: - | .if FPU - | ldrd CARG12, [RB, BASE]! - | ldrd CARG34, [RC, KBASE]! - | .else - | ldrd CARG12, [BASE, RB] - | ldrd CARG34, [KBASE, RC] - | .endif - || break; - ||case 1: - | .if FPU - | ldrd CARG34, [RB, BASE]! - | ldrd CARG12, [RC, KBASE]! - | .else - | ldrd CARG34, [BASE, RB] - | ldrd CARG12, [KBASE, RC] - | .endif - || break; - ||default: - | .if FPU - | ldrd CARG12, [RB, BASE]! - | ldrd CARG34, [RC, BASE]! - | .else - | ldrd CARG12, [BASE, RB] - | ldrd CARG34, [BASE, RC] - | .endif - || break; - ||} - |.endmacro - | - |.macro ins_arithpre_fpu, reg1, reg2 - |.if FPU - ||if (vk == 1) { - | vldr reg2, [RB] - | vldr reg1, [RC] - ||} else { - | vldr reg1, [RB] - | vldr reg2, [RC] - ||} - |.endif - |.endmacro - | - |.macro ins_arithpost_fpu, reg - | ins_next1 - | add RA, BASE, RA - | ins_next2 - | vstr reg, [RA] - | ins_next3 - |.endmacro - | - |.macro ins_arithfallback, ins - ||switch (vk) { - ||case 0: - | ins ->vmeta_arith_vn - || break; - ||case 1: - | ins ->vmeta_arith_nv - || break; - ||default: - | ins ->vmeta_arith_vv - || break; - ||} - |.endmacro - | - |.macro ins_arithdn, intins, fpins, fpcall - | ins_arithpre - |.if "intins" ~= "vm_modi" and not FPU - | ins_next1 - |.endif - | ins_arithcheck_int >5 - |.if "intins" == "smull" - | smull CARG1, RC, CARG3, CARG1 - | cmp RC, CARG1, asr #31 - | ins_arithfallback bne - |.elif "intins" == "vm_modi" - | movs CARG2, CARG3 - | ins_arithfallback beq - | bl ->vm_modi - | mvn CARG2, #~LJ_TISNUM - |.else - | intins CARG1, CARG1, CARG3 - | ins_arithfallback bvs - |.endif - |4: - |.if "intins" == "vm_modi" or FPU - | ins_next1 - |.endif - | ins_next2 - | strd CARG12, [BASE, RA] - | ins_next3 - |5: // FP variant. - | ins_arithpre_fpu d6, d7 - | ins_arithfallback ins_arithcheck_num - |.if FPU - |.if "intins" == "vm_modi" - | bl fpcall - |.else - | fpins d6, d6, d7 - |.endif - | ins_arithpost_fpu d6 - |.else - | bl fpcall - |.if "intins" ~= "vm_modi" - | ins_next1 - |.endif - | b <4 - |.endif - |.endmacro - | - |.macro ins_arithfp, fpins, fpcall - | ins_arithpre - |.if "fpins" ~= "extern" or HFABI - | ins_arithpre_fpu d0, d1 - |.endif - | ins_arithfallback ins_arithcheck_num - |.if "fpins" == "extern" - | .IOS mov RC, BASE - | bl fpcall - | .IOS mov BASE, RC - |.elif FPU - | fpins d0, d0, d1 - |.else - | bl fpcall - |.endif - |.if ("fpins" ~= "extern" or HFABI) and FPU - | ins_arithpost_fpu d0 - |.else - | ins_next1 - | ins_next2 - | strd CARG12, [BASE, RA] - | ins_next3 - |.endif - |.endmacro - - case BC_ADDVN: case BC_ADDNV: case BC_ADDVV: - | ins_arithdn adds, vadd.f64, extern __aeabi_dadd - break; - case BC_SUBVN: case BC_SUBNV: case BC_SUBVV: - | ins_arithdn subs, vsub.f64, extern __aeabi_dsub - break; - case BC_MULVN: case BC_MULNV: case BC_MULVV: - | ins_arithdn smull, vmul.f64, extern __aeabi_dmul - break; - case BC_DIVVN: case BC_DIVNV: case BC_DIVVV: - | ins_arithfp vdiv.f64, extern __aeabi_ddiv - break; - case BC_MODVN: case BC_MODNV: case BC_MODVV: - | ins_arithdn vm_modi, vm_mod, ->vm_mod - break; - case BC_POW: - | // NYI: (partial) integer arithmetic. - | ins_arithfp extern, extern pow - break; - - case BC_CAT: - | decode_RB8 RC, INS - | decode_RC8 RB, INS - | // RA = dst*8, RC = src_start*8, RB = src_end*8 (note: RB/RC swapped!) - | sub CARG3, RB, RC - | str BASE, L->base - | add CARG2, BASE, RB - |->BC_CAT_Z: - | // RA = dst*8, RC = src_start*8, CARG2 = top-1 - | mov CARG1, L - | str PC, SAVE_PC - | lsr CARG3, CARG3, #3 - | bl extern lj_meta_cat // (lua_State *L, TValue *top, int left) - | // Returns NULL (finished) or TValue * (metamethod). - | ldr BASE, L->base - | cmp CRET1, #0 - | bne ->vmeta_binop - | ldrd CARG34, [BASE, RC] - | ins_next1 - | ins_next2 - | strd CARG34, [BASE, RA] // Copy result to RA. - | ins_next3 - break; - - /* -- Constant ops ------------------------------------------------------ */ - - case BC_KSTR: - | // RA = dst*8, RC = str_const (~) - | mvn RC, RC - | ins_next1 - | ldr CARG1, [KBASE, RC, lsl #2] - | mvn CARG2, #~LJ_TSTR - | ins_next2 - | strd CARG12, [BASE, RA] - | ins_next3 - break; - case BC_KCDATA: - |.if FFI - | // RA = dst*8, RC = cdata_const (~) - | mvn RC, RC - | ins_next1 - | ldr CARG1, [KBASE, RC, lsl #2] - | mvn CARG2, #~LJ_TCDATA - | ins_next2 - | strd CARG12, [BASE, RA] - | ins_next3 - |.endif - break; - case BC_KSHORT: - | // RA = dst*8, (RC = int16_literal) - | mov CARG1, INS, asr #16 // Refetch sign-extended reg. - | mvn CARG2, #~LJ_TISNUM - | ins_next1 - | ins_next2 - | strd CARG12, [BASE, RA] - | ins_next3 - break; - case BC_KNUM: - | // RA = dst*8, RC = num_const - | lsl RC, RC, #3 - | ins_next1 - | ldrd CARG12, [KBASE, RC] - | ins_next2 - | strd CARG12, [BASE, RA] - | ins_next3 - break; - case BC_KPRI: - | // RA = dst*8, RC = primitive_type (~) - | add RA, BASE, RA - | mvn RC, RC - | ins_next1 - | ins_next2 - | str RC, [RA, #4] - | ins_next3 - break; - case BC_KNIL: - | // RA = base*8, RC = end - | add RA, BASE, RA - | add RC, BASE, RC, lsl #3 - | mvn CARG1, #~LJ_TNIL - | str CARG1, [RA, #4] - | add RA, RA, #8 - |1: - | str CARG1, [RA, #4] - | cmp RA, RC - | add RA, RA, #8 - | blt <1 - | ins_next_ - break; - - /* -- Upvalue and function ops ------------------------------------------ */ - - case BC_UGET: - | // RA = dst*8, RC = uvnum - | ldr LFUNC:CARG2, [BASE, FRAME_FUNC] - | lsl RC, RC, #2 - | add RC, RC, #offsetof(GCfuncL, uvptr) - | ldr UPVAL:CARG2, [LFUNC:CARG2, RC] - | ldr CARG2, UPVAL:CARG2->v - | ldrd CARG34, [CARG2] - | ins_next1 - | ins_next2 - | strd CARG34, [BASE, RA] - | ins_next3 - break; - case BC_USETV: - | // RA = uvnum*8, RC = src - | ldr LFUNC:CARG2, [BASE, FRAME_FUNC] - | lsr RA, RA, #1 - | add RA, RA, #offsetof(GCfuncL, uvptr) - | lsl RC, RC, #3 - | ldr UPVAL:CARG2, [LFUNC:CARG2, RA] - | ldrd CARG34, [BASE, RC] - | ldrb RB, UPVAL:CARG2->marked - | ldrb RC, UPVAL:CARG2->closed - | ldr CARG2, UPVAL:CARG2->v - | tst RB, #LJ_GC_BLACK // isblack(uv) - | add RB, CARG4, #-LJ_TISGCV - | cmpne RC, #0 - | strd CARG34, [CARG2] - | bne >2 // Upvalue is closed and black? - |1: - | ins_next - | - |2: // Check if new value is collectable. - | cmn RB, #-(LJ_TNUMX - LJ_TISGCV) - | ldrbhi RC, GCOBJ:CARG3->gch.marked - | bls <1 // tvisgcv(v) - | sub CARG1, DISPATCH, #-GG_DISP2G - | tst RC, #LJ_GC_WHITES - | // Crossed a write barrier. Move the barrier forward. - |.if IOS - | beq <1 - | mov RC, BASE - | bl extern lj_gc_barrieruv // (global_State *g, TValue *tv) - | mov BASE, RC - |.else - | blne extern lj_gc_barrieruv // (global_State *g, TValue *tv) - |.endif - | b <1 - break; - case BC_USETS: - | // RA = uvnum*8, RC = str_const (~) - | ldr LFUNC:CARG2, [BASE, FRAME_FUNC] - | lsr RA, RA, #1 - | add RA, RA, #offsetof(GCfuncL, uvptr) - | mvn RC, RC - | ldr UPVAL:CARG2, [LFUNC:CARG2, RA] - | ldr STR:CARG3, [KBASE, RC, lsl #2] - | ldrb RB, UPVAL:CARG2->marked - | ldrb RC, UPVAL:CARG2->closed - | ldr CARG2, UPVAL:CARG2->v - | mvn CARG4, #~LJ_TSTR - | tst RB, #LJ_GC_BLACK // isblack(uv) - | ldrb RB, STR:CARG3->marked - | strd CARG34, [CARG2] - | bne >2 - |1: - | ins_next - | - |2: // Check if string is white and ensure upvalue is closed. - | tst RB, #LJ_GC_WHITES // iswhite(str) - | cmpne RC, #0 - | sub CARG1, DISPATCH, #-GG_DISP2G - | // Crossed a write barrier. Move the barrier forward. - |.if IOS - | beq <1 - | mov RC, BASE - | bl extern lj_gc_barrieruv // (global_State *g, TValue *tv) - | mov BASE, RC - |.else - | blne extern lj_gc_barrieruv // (global_State *g, TValue *tv) - |.endif - | b <1 - break; - case BC_USETN: - | // RA = uvnum*8, RC = num_const - | ldr LFUNC:CARG2, [BASE, FRAME_FUNC] - | lsr RA, RA, #1 - | add RA, RA, #offsetof(GCfuncL, uvptr) - | lsl RC, RC, #3 - | ldr UPVAL:CARG2, [LFUNC:CARG2, RA] - | ldrd CARG34, [KBASE, RC] - | ldr CARG2, UPVAL:CARG2->v - | ins_next1 - | ins_next2 - | strd CARG34, [CARG2] - | ins_next3 - break; - case BC_USETP: - | // RA = uvnum*8, RC = primitive_type (~) - | ldr LFUNC:CARG2, [BASE, FRAME_FUNC] - | lsr RA, RA, #1 - | add RA, RA, #offsetof(GCfuncL, uvptr) - | ldr UPVAL:CARG2, [LFUNC:CARG2, RA] - | mvn RC, RC - | ldr CARG2, UPVAL:CARG2->v - | ins_next1 - | ins_next2 - | str RC, [CARG2, #4] - | ins_next3 - break; - - case BC_UCLO: - | // RA = level*8, RC = target - | ldr CARG3, L->openupval - | add RC, PC, RC, lsl #2 - | str BASE, L->base - | cmp CARG3, #0 - | sub PC, RC, #0x20000 - | beq >1 - | mov CARG1, L - | add CARG2, BASE, RA - | bl extern lj_func_closeuv // (lua_State *L, TValue *level) - | ldr BASE, L->base - |1: - | ins_next - break; - - case BC_FNEW: - | // RA = dst*8, RC = proto_const (~) (holding function prototype) - | mvn RC, RC - | str BASE, L->base - | ldr CARG2, [KBASE, RC, lsl #2] - | str PC, SAVE_PC - | ldr CARG3, [BASE, FRAME_FUNC] - | mov CARG1, L - | // (lua_State *L, GCproto *pt, GCfuncL *parent) - | bl extern lj_func_newL_gc - | // Returns GCfuncL *. - | ldr BASE, L->base - | mvn CARG2, #~LJ_TFUNC - | ins_next1 - | ins_next2 - | strd CARG12, [BASE, RA] - | ins_next3 - break; - - /* -- Table ops --------------------------------------------------------- */ - - case BC_TNEW: - case BC_TDUP: - | // RA = dst*8, RC = (hbits|asize) | tab_const (~) - if (op == BC_TDUP) { - | mvn RC, RC - } - | ldr CARG3, [DISPATCH, #DISPATCH_GL(gc.total)] - | ldr CARG4, [DISPATCH, #DISPATCH_GL(gc.threshold)] - | str BASE, L->base - | str PC, SAVE_PC - | cmp CARG3, CARG4 - | mov CARG1, L - | bhs >5 - |1: - if (op == BC_TNEW) { - | lsl CARG2, RC, #21 - | lsr CARG3, RC, #11 - | asr RC, CARG2, #21 - | lsr CARG2, CARG2, #21 - | cmn RC, #1 - | addeq CARG2, CARG2, #2 - | bl extern lj_tab_new // (lua_State *L, int32_t asize, uint32_t hbits) - | // Returns GCtab *. - } else { - | ldr CARG2, [KBASE, RC, lsl #2] - | bl extern lj_tab_dup // (lua_State *L, Table *kt) - | // Returns GCtab *. - } - | ldr BASE, L->base - | mvn CARG2, #~LJ_TTAB - | ins_next1 - | ins_next2 - | strd CARG12, [BASE, RA] - | ins_next3 - |5: - | bl extern lj_gc_step_fixtop // (lua_State *L) - | mov CARG1, L - | b <1 - break; - - case BC_GGET: - | // RA = dst*8, RC = str_const (~) - case BC_GSET: - | // RA = dst*8, RC = str_const (~) - | ldr LFUNC:CARG2, [BASE, FRAME_FUNC] - | mvn RC, RC - | ldr TAB:CARG1, LFUNC:CARG2->env - | ldr STR:RC, [KBASE, RC, lsl #2] - if (op == BC_GGET) { - | b ->BC_TGETS_Z - } else { - | b ->BC_TSETS_Z - } - break; - - case BC_TGETV: - | decode_RB8 RB, INS - | decode_RC8 RC, INS - | // RA = dst*8, RB = table*8, RC = key*8 - | ldrd TAB:CARG12, [BASE, RB] - | ldrd CARG34, [BASE, RC] - | checktab CARG2, ->vmeta_tgetv // STALL: load CARG12. - | checktp CARG4, LJ_TISNUM // Integer key? - | ldreq CARG4, TAB:CARG1->array - | ldreq CARG2, TAB:CARG1->asize - | bne >9 - | - | add CARG4, CARG4, CARG3, lsl #3 - | cmp CARG3, CARG2 // In array part? - | ldrdlo CARG34, [CARG4] - | bhs ->vmeta_tgetv - | ins_next1 // Overwrites RB! - | checktp CARG4, LJ_TNIL - | beq >5 - |1: - | ins_next2 - | strd CARG34, [BASE, RA] - | ins_next3 - | - |5: // Check for __index if table value is nil. - | ldr TAB:CARG2, TAB:CARG1->metatable - | cmp TAB:CARG2, #0 - | beq <1 // No metatable: done. - | ldrb CARG2, TAB:CARG2->nomm - | tst CARG2, #1<vmeta_tgetv - | - |9: - | checktp CARG4, LJ_TSTR // String key? - | moveq STR:RC, CARG3 - | beq ->BC_TGETS_Z - | b ->vmeta_tgetv - break; - case BC_TGETS: - | decode_RB8 RB, INS - | and RC, RC, #255 - | // RA = dst*8, RB = table*8, RC = str_const (~) - | ldrd CARG12, [BASE, RB] - | mvn RC, RC - | ldr STR:RC, [KBASE, RC, lsl #2] // STALL: early RC. - | checktab CARG2, ->vmeta_tgets1 - |->BC_TGETS_Z: - | // (TAB:RB =) TAB:CARG1 = GCtab *, STR:RC = GCstr *, RA = dst*8 - | ldr CARG3, TAB:CARG1->hmask - | ldr CARG4, STR:RC->hash - | ldr NODE:INS, TAB:CARG1->node - | mov TAB:RB, TAB:CARG1 - | and CARG3, CARG3, CARG4 // idx = str->hash & tab->hmask - | add CARG3, CARG3, CARG3, lsl #1 - | add NODE:INS, NODE:INS, CARG3, lsl #3 // node = tab->node + idx*3*8 - |1: - | ldrd CARG12, NODE:INS->key // STALL: early NODE:INS. - | ldrd CARG34, NODE:INS->val - | ldr NODE:INS, NODE:INS->next - | checktp CARG2, LJ_TSTR - | cmpeq CARG1, STR:RC - | bne >4 - | checktp CARG4, LJ_TNIL - | beq >5 - |3: - | ins_next1 - | ins_next2 - | strd CARG34, [BASE, RA] - | ins_next3 - | - |4: // Follow hash chain. - | cmp NODE:INS, #0 - | bne <1 - | // End of hash chain: key not found, nil result. - | - |5: // Check for __index if table value is nil. - | ldr TAB:CARG1, TAB:RB->metatable - | mov CARG3, #0 // Optional clear of undef. value (during load stall). - | mvn CARG4, #~LJ_TNIL - | cmp TAB:CARG1, #0 - | beq <3 // No metatable: done. - | ldrb CARG2, TAB:CARG1->nomm - | tst CARG2, #1<vmeta_tgets - break; - case BC_TGETB: - | decode_RB8 RB, INS - | and RC, RC, #255 - | // RA = dst*8, RB = table*8, RC = index - | ldrd CARG12, [BASE, RB] - | checktab CARG2, ->vmeta_tgetb // STALL: load CARG12. - | ldr CARG3, TAB:CARG1->asize - | ldr CARG4, TAB:CARG1->array - | lsl CARG2, RC, #3 - | cmp RC, CARG3 - | ldrdlo CARG34, [CARG4, CARG2] - | bhs ->vmeta_tgetb - | ins_next1 // Overwrites RB! - | checktp CARG4, LJ_TNIL - | beq >5 - |1: - | ins_next2 - | strd CARG34, [BASE, RA] - | ins_next3 - | - |5: // Check for __index if table value is nil. - | ldr TAB:CARG2, TAB:CARG1->metatable - | cmp TAB:CARG2, #0 - | beq <1 // No metatable: done. - | ldrb CARG2, TAB:CARG2->nomm - | tst CARG2, #1<vmeta_tgetb - break; - - case BC_TSETV: - | decode_RB8 RB, INS - | decode_RC8 RC, INS - | // RA = src*8, RB = table*8, RC = key*8 - | ldrd TAB:CARG12, [BASE, RB] - | ldrd CARG34, [BASE, RC] - | checktab CARG2, ->vmeta_tsetv // STALL: load CARG12. - | checktp CARG4, LJ_TISNUM // Integer key? - | ldreq CARG2, TAB:CARG1->array - | ldreq CARG4, TAB:CARG1->asize - | bne >9 - | - | add CARG2, CARG2, CARG3, lsl #3 - | cmp CARG3, CARG4 // In array part? - | ldrlo INS, [CARG2, #4] - | bhs ->vmeta_tsetv - | ins_next1 // Overwrites RB! - | checktp INS, LJ_TNIL - | ldrb INS, TAB:CARG1->marked - | ldrd CARG34, [BASE, RA] - | beq >5 - |1: - | tst INS, #LJ_GC_BLACK // isblack(table) - | strd CARG34, [CARG2] - | bne >7 - |2: - | ins_next2 - | ins_next3 - | - |5: // Check for __newindex if previous value is nil. - | ldr TAB:RA, TAB:CARG1->metatable - | cmp TAB:RA, #0 - | beq <1 // No metatable: done. - | ldrb RA, TAB:RA->nomm - | tst RA, #1<vmeta_tsetv - | - |7: // Possible table write barrier for the value. Skip valiswhite check. - | barrierback TAB:CARG1, INS, CARG3 - | b <2 - | - |9: - | checktp CARG4, LJ_TSTR // String key? - | moveq STR:RC, CARG3 - | beq ->BC_TSETS_Z - | b ->vmeta_tsetv - break; - case BC_TSETS: - | decode_RB8 RB, INS - | and RC, RC, #255 - | // RA = src*8, RB = table*8, RC = str_const (~) - | ldrd CARG12, [BASE, RB] - | mvn RC, RC - | ldr STR:RC, [KBASE, RC, lsl #2] // STALL: early RC. - | checktab CARG2, ->vmeta_tsets1 - |->BC_TSETS_Z: - | // (TAB:RB =) TAB:CARG1 = GCtab *, STR:RC = GCstr *, RA = dst*8 - | ldr CARG3, TAB:CARG1->hmask - | ldr CARG4, STR:RC->hash - | ldr NODE:INS, TAB:CARG1->node - | mov TAB:RB, TAB:CARG1 - | and CARG3, CARG3, CARG4 // idx = str->hash & tab->hmask - | add CARG3, CARG3, CARG3, lsl #1 - | mov CARG4, #0 - | add NODE:INS, NODE:INS, CARG3, lsl #3 // node = tab->node + idx*3*8 - | strb CARG4, TAB:RB->nomm // Clear metamethod cache. - |1: - | ldrd CARG12, NODE:INS->key - | ldr CARG4, NODE:INS->val.it - | ldr NODE:CARG3, NODE:INS->next - | checktp CARG2, LJ_TSTR - | cmpeq CARG1, STR:RC - | bne >5 - | ldrb CARG2, TAB:RB->marked - | checktp CARG4, LJ_TNIL // Key found, but nil value? - | ldrd CARG34, [BASE, RA] - | beq >4 - |2: - | tst CARG2, #LJ_GC_BLACK // isblack(table) - | strd CARG34, NODE:INS->val - | bne >7 - |3: - | ins_next - | - |4: // Check for __newindex if previous value is nil. - | ldr TAB:CARG1, TAB:RB->metatable - | cmp TAB:CARG1, #0 - | beq <2 // No metatable: done. - | ldrb CARG1, TAB:CARG1->nomm - | tst CARG1, #1<vmeta_tsets - | - |5: // Follow hash chain. - | movs NODE:INS, NODE:CARG3 - | bne <1 - | // End of hash chain: key not found, add a new one. - | - | // But check for __newindex first. - | ldr TAB:CARG1, TAB:RB->metatable - | mov CARG3, TMPDp - | str PC, SAVE_PC - | cmp TAB:CARG1, #0 // No metatable: continue. - | str BASE, L->base - | ldrbne CARG2, TAB:CARG1->nomm - | mov CARG1, L - | beq >6 - | tst CARG2, #1<vmeta_tsets // 'no __newindex' flag NOT set: check. - |6: - | mvn CARG4, #~LJ_TSTR - | str STR:RC, TMPDlo - | mov CARG2, TAB:RB - | str CARG4, TMPDhi - | bl extern lj_tab_newkey // (lua_State *L, GCtab *t, TValue *k) - | // Returns TValue *. - | ldr BASE, L->base - | ldrd CARG34, [BASE, RA] - | strd CARG34, [CRET1] - | b <3 // No 2nd write barrier needed. - | - |7: // Possible table write barrier for the value. Skip valiswhite check. - | barrierback TAB:RB, CARG2, CARG3 - | b <3 - break; - case BC_TSETB: - | decode_RB8 RB, INS - | and RC, RC, #255 - | // RA = src*8, RB = table*8, RC = index - | ldrd CARG12, [BASE, RB] - | checktab CARG2, ->vmeta_tsetb // STALL: load CARG12. - | ldr CARG3, TAB:CARG1->asize - | ldr RB, TAB:CARG1->array - | lsl CARG2, RC, #3 - | cmp RC, CARG3 - | ldrdlo CARG34, [CARG2, RB]! - | bhs ->vmeta_tsetb - | ins_next1 // Overwrites RB! - | checktp CARG4, LJ_TNIL - | ldrb INS, TAB:CARG1->marked - | ldrd CARG34, [BASE, RA] - | beq >5 - |1: - | tst INS, #LJ_GC_BLACK // isblack(table) - | strd CARG34, [CARG2] - | bne >7 - |2: - | ins_next2 - | ins_next3 - | - |5: // Check for __newindex if previous value is nil. - | ldr TAB:RA, TAB:CARG1->metatable - | cmp TAB:RA, #0 - | beq <1 // No metatable: done. - | ldrb RA, TAB:RA->nomm - | tst RA, #1<vmeta_tsetb - | - |7: // Possible table write barrier for the value. Skip valiswhite check. - | barrierback TAB:CARG1, INS, CARG3 - | b <2 - break; - - case BC_TSETM: - | // RA = base*8 (table at base-1), RC = num_const (start index) - | add RA, BASE, RA - |1: - | ldr RB, SAVE_MULTRES - | ldr TAB:CARG2, [RA, #-8] // Guaranteed to be a table. - | ldr CARG1, [KBASE, RC, lsl #3] // Integer constant is in lo-word. - | subs RB, RB, #8 - | ldr CARG4, TAB:CARG2->asize - | beq >4 // Nothing to copy? - | add CARG3, CARG1, RB, lsr #3 - | cmp CARG3, CARG4 - | ldr CARG4, TAB:CARG2->array - | add RB, RA, RB - | bhi >5 - | add INS, CARG4, CARG1, lsl #3 - | ldrb CARG1, TAB:CARG2->marked - |3: // Copy result slots to table. - | ldrd CARG34, [RA], #8 - | strd CARG34, [INS], #8 - | cmp RA, RB - | blo <3 - | tst CARG1, #LJ_GC_BLACK // isblack(table) - | bne >7 - |4: - | ins_next - | - |5: // Need to resize array part. - | str BASE, L->base - | mov CARG1, L - | str PC, SAVE_PC - | bl extern lj_tab_reasize // (lua_State *L, GCtab *t, int nasize) - | // Must not reallocate the stack. - | .IOS ldr BASE, L->base - | b <1 - | - |7: // Possible table write barrier for any value. Skip valiswhite check. - | barrierback TAB:CARG2, CARG1, CARG3 - | b <4 - break; - - /* -- Calls and vararg handling ----------------------------------------- */ - - case BC_CALLM: - | // RA = base*8, (RB = nresults+1,) RC = extra_nargs - | ldr CARG1, SAVE_MULTRES - | decode_RC8 NARGS8:RC, INS - | add NARGS8:RC, NARGS8:RC, CARG1 - | b ->BC_CALL_Z - break; - case BC_CALL: - | decode_RC8 NARGS8:RC, INS - | // RA = base*8, (RB = nresults+1,) RC = (nargs+1)*8 - |->BC_CALL_Z: - | mov RB, BASE // Save old BASE for vmeta_call. - | ldrd CARG34, [BASE, RA]! - | sub NARGS8:RC, NARGS8:RC, #8 - | add BASE, BASE, #8 - | checkfunc CARG4, ->vmeta_call - | ins_call - break; - - case BC_CALLMT: - | // RA = base*8, (RB = 0,) RC = extra_nargs - | ldr CARG1, SAVE_MULTRES - | add NARGS8:RC, CARG1, RC, lsl #3 - | b ->BC_CALLT1_Z - break; - case BC_CALLT: - | lsl NARGS8:RC, RC, #3 - | // RA = base*8, (RB = 0,) RC = (nargs+1)*8 - |->BC_CALLT1_Z: - | ldrd LFUNC:CARG34, [RA, BASE]! - | sub NARGS8:RC, NARGS8:RC, #8 - | add RA, RA, #8 - | checkfunc CARG4, ->vmeta_callt - | ldr PC, [BASE, FRAME_PC] - |->BC_CALLT2_Z: - | mov RB, #0 - | ldrb CARG4, LFUNC:CARG3->ffid - | tst PC, #FRAME_TYPE - | bne >7 - |1: - | str LFUNC:CARG3, [BASE, FRAME_FUNC] // Copy function down, but keep PC. - | cmp NARGS8:RC, #0 - | beq >3 - |2: - | ldrd CARG12, [RA, RB] - | add INS, RB, #8 - | cmp INS, NARGS8:RC - | strd CARG12, [BASE, RB] - | mov RB, INS - | bne <2 - |3: - | cmp CARG4, #1 // (> FF_C) Calling a fast function? - | bhi >5 - |4: - | ins_callt - | - |5: // Tailcall to a fast function with a Lua frame below. - | ldr INS, [PC, #-4] - | decode_RA8 RA, INS - | sub CARG1, BASE, RA - | ldr LFUNC:CARG1, [CARG1, #-16] - | ldr CARG1, LFUNC:CARG1->field_pc - | ldr KBASE, [CARG1, #PC2PROTO(k)] - | b <4 - | - |7: // Tailcall from a vararg function. - | eor PC, PC, #FRAME_VARG - | tst PC, #FRAME_TYPEP // Vararg frame below? - | movne CARG4, #0 // Clear ffid if no Lua function below. - | bne <1 - | sub BASE, BASE, PC - | ldr PC, [BASE, FRAME_PC] - | tst PC, #FRAME_TYPE - | movne CARG4, #0 // Clear ffid if no Lua function below. - | b <1 - break; - - case BC_ITERC: - | // RA = base*8, (RB = nresults+1, RC = nargs+1 (2+1)) - | add RA, BASE, RA - | mov RB, BASE // Save old BASE for vmeta_call. - | ldrd CARG34, [RA, #-16] - | ldrd CARG12, [RA, #-8] - | add BASE, RA, #8 - | strd CARG34, [RA, #8] // Copy state. - | strd CARG12, [RA, #16] // Copy control var. - | // STALL: locked CARG34. - | ldrd LFUNC:CARG34, [RA, #-24] - | mov NARGS8:RC, #16 // Iterators get 2 arguments. - | // STALL: load CARG34. - | strd LFUNC:CARG34, [RA] // Copy callable. - | checkfunc CARG4, ->vmeta_call - | ins_call - break; - - case BC_ITERN: - | // RA = base*8, (RB = nresults+1, RC = nargs+1 (2+1)) - |.if JIT - | // NYI: add hotloop, record BC_ITERN. - |.endif - | add RA, BASE, RA - | ldr TAB:RB, [RA, #-16] - | ldr CARG1, [RA, #-8] // Get index from control var. - | ldr INS, TAB:RB->asize - | ldr CARG2, TAB:RB->array - | add PC, PC, #4 - |1: // Traverse array part. - | subs RC, CARG1, INS - | add CARG3, CARG2, CARG1, lsl #3 - | bhs >5 // Index points after array part? - | ldrd CARG34, [CARG3] - | checktp CARG4, LJ_TNIL - | addeq CARG1, CARG1, #1 // Skip holes in array part. - | beq <1 - | ldrh RC, [PC, #-2] - | mvn CARG2, #~LJ_TISNUM - | strd CARG34, [RA, #8] - | add RC, PC, RC, lsl #2 - | add RB, CARG1, #1 - | strd CARG12, [RA] - | sub PC, RC, #0x20000 - | str RB, [RA, #-8] // Update control var. - |3: - | ins_next - | - |5: // Traverse hash part. - | ldr CARG4, TAB:RB->hmask - | ldr NODE:RB, TAB:RB->node - |6: - | add CARG1, RC, RC, lsl #1 - | cmp RC, CARG4 // End of iteration? Branch to ITERL+1. - | add NODE:CARG3, NODE:RB, CARG1, lsl #3 // node = tab->node + idx*3*8 - | bhi <3 - | ldrd CARG12, NODE:CARG3->val - | checktp CARG2, LJ_TNIL - | add RC, RC, #1 - | beq <6 // Skip holes in hash part. - | ldrh RB, [PC, #-2] - | add RC, RC, INS - | ldrd CARG34, NODE:CARG3->key - | str RC, [RA, #-8] // Update control var. - | strd CARG12, [RA, #8] - | add RC, PC, RB, lsl #2 - | sub PC, RC, #0x20000 - | strd CARG34, [RA] - | b <3 - break; - - case BC_ISNEXT: - | // RA = base*8, RC = target (points to ITERN) - | add RA, BASE, RA - | add RC, PC, RC, lsl #2 - | ldrd CFUNC:CARG12, [RA, #-24] - | ldr CARG3, [RA, #-12] - | ldr CARG4, [RA, #-4] - | checktp CARG2, LJ_TFUNC - | ldrbeq CARG1, CFUNC:CARG1->ffid - | checktpeq CARG3, LJ_TTAB - | checktpeq CARG4, LJ_TNIL - | cmpeq CARG1, #FF_next_N - | subeq PC, RC, #0x20000 - | bne >5 - | ins_next1 - | ins_next2 - | mov CARG1, #0 - | mvn CARG2, #0x00018000 - | strd CARG1, [RA, #-8] // Initialize control var. - |1: - | ins_next3 - |5: // Despecialize bytecode if any of the checks fail. - | mov CARG1, #BC_JMP - | mov OP, #BC_ITERC - | strb CARG1, [PC, #-4] - | sub PC, RC, #0x20000 - | strb OP, [PC] // Subsumes ins_next1. - | ins_next2 - | b <1 - break; - - case BC_VARG: - | decode_RB8 RB, INS - | decode_RC8 RC, INS - | // RA = base*8, RB = (nresults+1)*8, RC = numparams*8 - | ldr CARG1, [BASE, FRAME_PC] - | add RC, BASE, RC - | add RA, BASE, RA - | add RC, RC, #FRAME_VARG - | add CARG4, RA, RB - | sub CARG3, BASE, #8 // CARG3 = vtop - | sub RC, RC, CARG1 // RC = vbase - | // Note: RC may now be even _above_ BASE if nargs was < numparams. - | cmp RB, #0 - | sub CARG1, CARG3, RC - | beq >5 // Copy all varargs? - | sub CARG4, CARG4, #16 - |1: // Copy vararg slots to destination slots. - | cmp RC, CARG3 - | ldrdlo CARG12, [RC], #8 - | mvnhs CARG2, #~LJ_TNIL - | cmp RA, CARG4 - | strd CARG12, [RA], #8 - | blo <1 - |2: - | ins_next - | - |5: // Copy all varargs. - | ldr CARG4, L->maxstack - | cmp CARG1, #0 - | movle RB, #8 // MULTRES = (0+1)*8 - | addgt RB, CARG1, #8 - | add CARG2, RA, CARG1 - | str RB, SAVE_MULTRES - | ble <2 - | cmp CARG2, CARG4 - | bhi >7 - |6: - | ldrd CARG12, [RC], #8 - | strd CARG12, [RA], #8 - | cmp RC, CARG3 - | blo <6 - | b <2 - | - |7: // Grow stack for varargs. - | lsr CARG2, CARG1, #3 - | str RA, L->top - | mov CARG1, L - | str BASE, L->base - | sub RC, RC, BASE // Need delta, because BASE may change. - | str PC, SAVE_PC - | sub RA, RA, BASE - | bl extern lj_state_growstack // (lua_State *L, int n) - | ldr BASE, L->base - | add RA, BASE, RA - | add RC, BASE, RC - | sub CARG3, BASE, #8 - | b <6 - break; - - /* -- Returns ----------------------------------------------------------- */ - - case BC_RETM: - | // RA = results*8, RC = extra results - | ldr CARG1, SAVE_MULTRES - | ldr PC, [BASE, FRAME_PC] - | add RA, BASE, RA - | add RC, CARG1, RC, lsl #3 - | b ->BC_RETM_Z - break; - - case BC_RET: - | // RA = results*8, RC = nresults+1 - | ldr PC, [BASE, FRAME_PC] - | lsl RC, RC, #3 - | add RA, BASE, RA - |->BC_RETM_Z: - | str RC, SAVE_MULTRES - |1: - | ands CARG1, PC, #FRAME_TYPE - | eor CARG2, PC, #FRAME_VARG - | bne ->BC_RETV2_Z - | - |->BC_RET_Z: - | // BASE = base, RA = resultptr, RC = (nresults+1)*8, PC = return - | ldr INS, [PC, #-4] - | subs CARG4, RC, #8 - | sub CARG3, BASE, #8 - | beq >3 - |2: - | ldrd CARG12, [RA], #8 - | add BASE, BASE, #8 - | subs CARG4, CARG4, #8 - | strd CARG12, [BASE, #-16] - | bne <2 - |3: - | decode_RA8 RA, INS - | sub CARG4, CARG3, RA - | decode_RB8 RB, INS - | ldr LFUNC:CARG1, [CARG4, FRAME_FUNC] - |5: - | cmp RB, RC // More results expected? - | bhi >6 - | mov BASE, CARG4 - | ldr CARG2, LFUNC:CARG1->field_pc - | ins_next1 - | ins_next2 - | ldr KBASE, [CARG2, #PC2PROTO(k)] - | ins_next3 - | - |6: // Fill up results with nil. - | mvn CARG2, #~LJ_TNIL - | add BASE, BASE, #8 - | add RC, RC, #8 - | str CARG2, [BASE, #-12] - | b <5 - | - |->BC_RETV1_Z: // Non-standard return case. - | add RA, BASE, RA - |->BC_RETV2_Z: - | tst CARG2, #FRAME_TYPEP - | bne ->vm_return - | // Return from vararg function: relocate BASE down. - | sub BASE, BASE, CARG2 - | ldr PC, [BASE, FRAME_PC] - | b <1 - break; - - case BC_RET0: case BC_RET1: - | // RA = results*8, RC = nresults+1 - | ldr PC, [BASE, FRAME_PC] - | lsl RC, RC, #3 - | str RC, SAVE_MULTRES - | ands CARG1, PC, #FRAME_TYPE - | eor CARG2, PC, #FRAME_VARG - | ldreq INS, [PC, #-4] - | bne ->BC_RETV1_Z - if (op == BC_RET1) { - | ldrd CARG12, [BASE, RA] - } - | sub CARG4, BASE, #8 - | decode_RA8 RA, INS - if (op == BC_RET1) { - | strd CARG12, [CARG4] - } - | sub BASE, CARG4, RA - | decode_RB8 RB, INS - | ldr LFUNC:CARG1, [BASE, FRAME_FUNC] - |5: - | cmp RB, RC - | bhi >6 - | ldr CARG2, LFUNC:CARG1->field_pc - | ins_next1 - | ins_next2 - | ldr KBASE, [CARG2, #PC2PROTO(k)] - | ins_next3 - | - |6: // Fill up results with nil. - | sub CARG2, CARG4, #4 - | mvn CARG3, #~LJ_TNIL - | str CARG3, [CARG2, RC] - | add RC, RC, #8 - | b <5 - break; - - /* -- Loops and branches ------------------------------------------------ */ - - |.define FOR_IDX, [RA]; .define FOR_TIDX, [RA, #4] - |.define FOR_STOP, [RA, #8]; .define FOR_TSTOP, [RA, #12] - |.define FOR_STEP, [RA, #16]; .define FOR_TSTEP, [RA, #20] - |.define FOR_EXT, [RA, #24]; .define FOR_TEXT, [RA, #28] - - case BC_FORL: - |.if JIT - | hotloop - |.endif - | // Fall through. Assumes BC_IFORL follows. - break; - - case BC_JFORI: - case BC_JFORL: -#if !LJ_HASJIT - break; -#endif - case BC_FORI: - case BC_IFORL: - | // RA = base*8, RC = target (after end of loop or start of loop) - vk = (op == BC_IFORL || op == BC_JFORL); - | ldrd CARG12, [RA, BASE]! - if (op != BC_JFORL) { - | add RC, PC, RC, lsl #2 - } - if (!vk) { - | ldrd CARG34, FOR_STOP - | checktp CARG2, LJ_TISNUM - | ldr RB, FOR_TSTEP - | bne >5 - | checktp CARG4, LJ_TISNUM - | ldr CARG4, FOR_STEP - | checktpeq RB, LJ_TISNUM - | bne ->vmeta_for - | cmp CARG4, #0 - | blt >4 - | cmp CARG1, CARG3 - } else { - | ldrd CARG34, FOR_STEP - | checktp CARG2, LJ_TISNUM - | bne >5 - | adds CARG1, CARG1, CARG3 - | ldr CARG4, FOR_STOP - if (op == BC_IFORL) { - | addvs RC, PC, #0x20000 // Overflow: prevent branch. - } else { - | bvs >2 // Overflow: do not enter mcode. - } - | cmp CARG3, #0 - | blt >4 - | cmp CARG1, CARG4 - } - |1: - if (op == BC_FORI) { - | subgt PC, RC, #0x20000 - } else if (op == BC_JFORI) { - | sub PC, RC, #0x20000 - | ldrhle RC, [PC, #-2] - } else if (op == BC_IFORL) { - | suble PC, RC, #0x20000 - } - if (vk) { - | strd CARG12, FOR_IDX - } - |2: - | ins_next1 - | ins_next2 - | strd CARG12, FOR_EXT - if (op == BC_JFORI || op == BC_JFORL) { - | ble =>BC_JLOOP - } - |3: - | ins_next3 - | - |4: // Invert check for negative step. - if (!vk) { - | cmp CARG3, CARG1 - } else { - | cmp CARG4, CARG1 - } - | b <1 - | - |5: // FP loop. - if (!vk) { - | cmnlo CARG4, #-LJ_TISNUM - | cmnlo RB, #-LJ_TISNUM - | bhs ->vmeta_for - |.if FPU - | vldr d0, FOR_IDX - | vldr d1, FOR_STOP - | cmp RB, #0 - | vstr d0, FOR_EXT - |.else - | cmp RB, #0 - | strd CARG12, FOR_EXT - | blt >8 - |.endif - } else { - |.if FPU - | vldr d0, FOR_IDX - | vldr d2, FOR_STEP - | vldr d1, FOR_STOP - | cmp CARG4, #0 - | vadd.f64 d0, d0, d2 - |.else - | cmp CARG4, #0 - | blt >8 - | bl extern __aeabi_dadd - | strd CARG12, FOR_IDX - | ldrd CARG34, FOR_STOP - | strd CARG12, FOR_EXT - |.endif - } - |6: - |.if FPU - | vcmpge.f64 d0, d1 - | vcmplt.f64 d1, d0 - | vmrs - |.else - | bl extern __aeabi_cdcmple - |.endif - if (vk) { - |.if FPU - | vstr d0, FOR_IDX - | vstr d0, FOR_EXT - |.endif - } - if (op == BC_FORI) { - | subhi PC, RC, #0x20000 - } else if (op == BC_JFORI) { - | sub PC, RC, #0x20000 - | ldrhls RC, [PC, #-2] - | bls =>BC_JLOOP - } else if (op == BC_IFORL) { - | subls PC, RC, #0x20000 - } else { - | bls =>BC_JLOOP - } - | ins_next1 - | ins_next2 - | b <3 - | - |.if not FPU - |8: // Invert check for negative step. - if (vk) { - | bl extern __aeabi_dadd - | strd CARG12, FOR_IDX - | strd CARG12, FOR_EXT - } - | mov CARG3, CARG1 - | mov CARG4, CARG2 - | ldrd CARG12, FOR_STOP - | b <6 - |.endif - break; - - case BC_ITERL: - |.if JIT - | hotloop - |.endif - | // Fall through. Assumes BC_IITERL follows. - break; - - case BC_JITERL: -#if !LJ_HASJIT - break; -#endif - case BC_IITERL: - | // RA = base*8, RC = target - | ldrd CARG12, [RA, BASE]! - if (op == BC_JITERL) { - | cmn CARG2, #-LJ_TNIL // Stop if iterator returned nil. - | strdne CARG12, [RA, #-8] - | bne =>BC_JLOOP - } else { - | add RC, PC, RC, lsl #2 - | // STALL: load CARG12. - | cmn CARG2, #-LJ_TNIL // Stop if iterator returned nil. - | subne PC, RC, #0x20000 // Otherwise save control var + branch. - | strdne CARG12, [RA, #-8] - } - | ins_next - break; - - case BC_LOOP: - | // RA = base*8, RC = target (loop extent) - | // Note: RA/RC is only used by trace recorder to determine scope/extent - | // This opcode does NOT jump, it's only purpose is to detect a hot loop. - |.if JIT - | hotloop - |.endif - | // Fall through. Assumes BC_ILOOP follows. - break; - - case BC_ILOOP: - | // RA = base*8, RC = target (loop extent) - | ins_next - break; - - case BC_JLOOP: - |.if JIT - | // RA = base (ignored), RC = traceno - | ldr CARG1, [DISPATCH, #DISPATCH_J(trace)] - | mov CARG2, #0 // Traces on ARM don't store the trace number, so use 0. - | ldr TRACE:RC, [CARG1, RC, lsl #2] - | st_vmstate CARG2 - | ldr RA, TRACE:RC->mcode - | str BASE, [DISPATCH, #DISPATCH_GL(jit_base)] - | str L, [DISPATCH, #DISPATCH_GL(jit_L)] - | bx RA - |.endif - break; - - case BC_JMP: - | // RA = base*8 (only used by trace recorder), RC = target - | add RC, PC, RC, lsl #2 - | sub PC, RC, #0x20000 - | ins_next - break; - - /* -- Function headers -------------------------------------------------- */ - - case BC_FUNCF: - |.if JIT - | hotcall - |.endif - case BC_FUNCV: /* NYI: compiled vararg functions. */ - | // Fall through. Assumes BC_IFUNCF/BC_IFUNCV follow. - break; - - case BC_JFUNCF: -#if !LJ_HASJIT - break; -#endif - case BC_IFUNCF: - | // BASE = new base, RA = BASE+framesize*8, CARG3 = LFUNC, RC = nargs*8 - | ldr CARG1, L->maxstack - | ldrb CARG2, [PC, #-4+PC2PROTO(numparams)] - | ldr KBASE, [PC, #-4+PC2PROTO(k)] - | cmp RA, CARG1 - | bhi ->vm_growstack_l - if (op != BC_JFUNCF) { - | ins_next1 - | ins_next2 - } - |2: - | cmp NARGS8:RC, CARG2, lsl #3 // Check for missing parameters. - | mvn CARG4, #~LJ_TNIL - | blo >3 - if (op == BC_JFUNCF) { - | decode_RD RC, INS - | b =>BC_JLOOP - } else { - | ins_next3 - } - | - |3: // Clear missing parameters. - | strd CARG34, [BASE, NARGS8:RC] - | add NARGS8:RC, NARGS8:RC, #8 - | b <2 - break; - - case BC_JFUNCV: -#if !LJ_HASJIT - break; -#endif - | NYI // NYI: compiled vararg functions - break; /* NYI: compiled vararg functions. */ - - case BC_IFUNCV: - | // BASE = new base, RA = BASE+framesize*8, CARG3 = LFUNC, RC = nargs*8 - | ldr CARG1, L->maxstack - | add CARG4, BASE, RC - | add RA, RA, RC - | str LFUNC:CARG3, [CARG4] // Store copy of LFUNC. - | add CARG2, RC, #8+FRAME_VARG - | ldr KBASE, [PC, #-4+PC2PROTO(k)] - | cmp RA, CARG1 - | str CARG2, [CARG4, #4] // Store delta + FRAME_VARG. - | bhs ->vm_growstack_l - | ldrb RB, [PC, #-4+PC2PROTO(numparams)] - | mov RA, BASE - | mov RC, CARG4 - | cmp RB, #0 - | add BASE, CARG4, #8 - | beq >3 - | mvn CARG3, #~LJ_TNIL - |1: - | cmp RA, RC // Less args than parameters? - | ldrdlo CARG12, [RA], #8 - | movhs CARG2, CARG3 - | strlo CARG3, [RA, #-4] // Clear old fixarg slot (help the GC). - |2: - | subs RB, RB, #1 - | strd CARG12, [CARG4, #8]! - | bne <1 - |3: - | ins_next - break; - - case BC_FUNCC: - case BC_FUNCCW: - | // BASE = new base, RA = BASE+framesize*8, CARG3 = CFUNC, RC = nargs*8 - if (op == BC_FUNCC) { - | ldr CARG4, CFUNC:CARG3->f - } else { - | ldr CARG4, [DISPATCH, #DISPATCH_GL(wrapf)] - } - | add CARG2, RA, NARGS8:RC - | ldr CARG1, L->maxstack - | add RC, BASE, NARGS8:RC - | str BASE, L->base - | cmp CARG2, CARG1 - | str RC, L->top - if (op == BC_FUNCCW) { - | ldr CARG2, CFUNC:CARG3->f - } - | mv_vmstate CARG3, C - | mov CARG1, L - | bhi ->vm_growstack_c // Need to grow stack. - | st_vmstate CARG3 - | blx CARG4 // (lua_State *L [, lua_CFunction f]) - | // Returns nresults. - | ldr BASE, L->base - | mv_vmstate CARG3, INTERP - | ldr CRET2, L->top - | lsl RC, CRET1, #3 - | st_vmstate CARG3 - | ldr PC, [BASE, FRAME_PC] - | sub RA, CRET2, RC // RA = L->top - nresults*8 - | b ->vm_returnc - break; - - /* ---------------------------------------------------------------------- */ - - default: - fprintf(stderr, "Error: undefined opcode BC_%s\n", bc_names[op]); - exit(2); - break; - } -} - -static int build_backend(BuildCtx *ctx) -{ - int op; - - dasm_growpc(Dst, BC__MAX); - - build_subroutines(ctx); - - |.code_op - for (op = 0; op < BC__MAX; op++) - build_ins(ctx, (BCOp)op, op); - - return BC__MAX; -} - -/* Emit pseudo frame-info for all assembler functions. */ -static void emit_asm_debug(BuildCtx *ctx) -{ - int fcofs = (int)((uint8_t *)ctx->glob[GLOB_vm_ffi_call] - ctx->code); - int i; - switch (ctx->mode) { - case BUILD_elfasm: - fprintf(ctx->fp, "\t.section .debug_frame,\"\",%%progbits\n"); - fprintf(ctx->fp, - ".Lframe0:\n" - "\t.long .LECIE0-.LSCIE0\n" - ".LSCIE0:\n" - "\t.long 0xffffffff\n" - "\t.byte 0x1\n" - "\t.string \"\"\n" - "\t.uleb128 0x1\n" - "\t.sleb128 -4\n" - "\t.byte 0xe\n" /* Return address is in lr. */ - "\t.byte 0xc\n\t.uleb128 0xd\n\t.uleb128 0\n" /* def_cfa sp */ - "\t.align 2\n" - ".LECIE0:\n\n"); - fprintf(ctx->fp, - ".LSFDE0:\n" - "\t.long .LEFDE0-.LASFDE0\n" - ".LASFDE0:\n" - "\t.long .Lframe0\n" - "\t.long .Lbegin\n" - "\t.long %d\n" - "\t.byte 0xe\n\t.uleb128 %d\n" /* def_cfa_offset */ - "\t.byte 0x8e\n\t.uleb128 1\n", /* offset lr */ - fcofs, CFRAME_SIZE); - for (i = 11; i >= (LJ_ARCH_HASFPU ? 5 : 4); i--) /* offset r4-r11 */ - fprintf(ctx->fp, "\t.byte %d\n\t.uleb128 %d\n", 0x80+i, 2+(11-i)); -#if LJ_ARCH_HASFPU - for (i = 15; i >= 8; i--) /* offset d8-d15 */ - fprintf(ctx->fp, "\t.byte 5\n\t.uleb128 %d, %d\n", - 64+2*i, 10+2*(15-i)); - fprintf(ctx->fp, "\t.byte 0x84\n\t.uleb128 %d\n", 25); /* offset r4 */ -#endif - fprintf(ctx->fp, - "\t.align 2\n" - ".LEFDE0:\n\n"); -#if LJ_HASFFI - fprintf(ctx->fp, - ".LSFDE1:\n" - "\t.long .LEFDE1-.LASFDE1\n" - ".LASFDE1:\n" - "\t.long .Lframe0\n" - "\t.long lj_vm_ffi_call\n" - "\t.long %d\n" - "\t.byte 0xe\n\t.uleb128 16\n" /* def_cfa_offset */ - "\t.byte 0x8e\n\t.uleb128 1\n" /* offset lr */ - "\t.byte 0x8b\n\t.uleb128 2\n" /* offset r11 */ - "\t.byte 0x85\n\t.uleb128 3\n" /* offset r5 */ - "\t.byte 0x84\n\t.uleb128 4\n" /* offset r4 */ - "\t.byte 0xd\n\t.uleb128 0xb\n" /* def_cfa_register r11 */ - "\t.align 2\n" - ".LEFDE1:\n\n", (int)ctx->codesz - fcofs); -#endif - break; - default: - break; - } -} - diff --git a/deps/luajit/src/vm_mips.dasc b/deps/luajit/src/vm_mips.dasc deleted file mode 100644 index ac8346bb..00000000 --- a/deps/luajit/src/vm_mips.dasc +++ /dev/null @@ -1,4241 +0,0 @@ -|// Low-level VM code for MIPS CPUs. -|// Bytecode interpreter, fast functions and helper functions. -|// Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -| -|.arch mips -|.section code_op, code_sub -| -|.actionlist build_actionlist -|.globals GLOB_ -|.globalnames globnames -|.externnames extnames -| -|// Note: The ragged indentation of the instructions is intentional. -|// The starting columns indicate data dependencies. -| -|//----------------------------------------------------------------------- -| -|// Fixed register assignments for the interpreter. -|// Don't use: r0 = 0, r26/r27 = reserved, r28 = gp, r29 = sp, r31 = ra -| -|// The following must be C callee-save (but BASE is often refetched). -|.define BASE, r16 // Base of current Lua stack frame. -|.define KBASE, r17 // Constants of current Lua function. -|.define PC, r18 // Next PC. -|.define DISPATCH, r19 // Opcode dispatch table. -|.define LREG, r20 // Register holding lua_State (also in SAVE_L). -|.define MULTRES, r21 // Size of multi-result: (nresults+1)*8. -|// NYI: r22 currently unused. -| -|.define JGL, r30 // On-trace: global_State + 32768. -| -|// Constants for type-comparisons, stores and conversions. C callee-save. -|.define TISNIL, r30 -|.define TOBIT, f30 // 2^52 + 2^51. -| -|// The following temporaries are not saved across C calls, except for RA. -|.define RA, r23 // Callee-save. -|.define RB, r8 -|.define RC, r9 -|.define RD, r10 -|.define INS, r11 -| -|.define AT, r1 // Assembler temporary. -|.define TMP0, r12 -|.define TMP1, r13 -|.define TMP2, r14 -|.define TMP3, r15 -| -|// Calling conventions. -|.define CFUNCADDR, r25 -|.define CARG1, r4 -|.define CARG2, r5 -|.define CARG3, r6 -|.define CARG4, r7 -| -|.define CRET1, r2 -|.define CRET2, r3 -| -|.define FARG1, f12 -|.define FARG2, f14 -| -|.define FRET1, f0 -|.define FRET2, f2 -| -|// Stack layout while in interpreter. Must match with lj_frame.h. -|.define CFRAME_SPACE, 112 // Delta for sp. -| -|.define SAVE_ERRF, 124(sp) // 32 bit C frame info. -|.define SAVE_NRES, 120(sp) -|.define SAVE_CFRAME, 116(sp) -|.define SAVE_L, 112(sp) -|//----- 8 byte aligned, ^^^^ 16 byte register save area, owned by interpreter. -|.define SAVE_GPR_, 72 // .. 72+10*4: 32 bit GPR saves. -|.define SAVE_FPR_, 24 // .. 24+6*8: 64 bit FPR saves. -|.define SAVE_PC, 20(sp) -|.define ARG5, 16(sp) -|.define CSAVE_4, 12(sp) -|.define CSAVE_3, 8(sp) -|.define CSAVE_2, 4(sp) -|.define CSAVE_1, 0(sp) -|//----- 8 byte aligned, ^^^^ 16 byte register save area, owned by callee. -| -|.define ARG5_OFS, 16 -|.define SAVE_MULTRES, ARG5 -| -|.macro saveregs -| addiu sp, sp, -CFRAME_SPACE -| sw ra, SAVE_GPR_+9*4(sp) -| sw r30, SAVE_GPR_+8*4(sp) -| sdc1 f30, SAVE_FPR_+5*8(sp) -| sw r23, SAVE_GPR_+7*4(sp) -| sw r22, SAVE_GPR_+6*4(sp) -| sdc1 f28, SAVE_FPR_+4*8(sp) -| sw r21, SAVE_GPR_+5*4(sp) -| sw r20, SAVE_GPR_+4*4(sp) -| sdc1 f26, SAVE_FPR_+3*8(sp) -| sw r19, SAVE_GPR_+3*4(sp) -| sw r18, SAVE_GPR_+2*4(sp) -| sdc1 f24, SAVE_FPR_+2*8(sp) -| sw r17, SAVE_GPR_+1*4(sp) -| sw r16, SAVE_GPR_+0*4(sp) -| sdc1 f22, SAVE_FPR_+1*8(sp) -| sdc1 f20, SAVE_FPR_+0*8(sp) -|.endmacro -| -|.macro restoreregs_ret -| lw ra, SAVE_GPR_+9*4(sp) -| lw r30, SAVE_GPR_+8*4(sp) -| ldc1 f30, SAVE_FPR_+5*8(sp) -| lw r23, SAVE_GPR_+7*4(sp) -| lw r22, SAVE_GPR_+6*4(sp) -| ldc1 f28, SAVE_FPR_+4*8(sp) -| lw r21, SAVE_GPR_+5*4(sp) -| lw r20, SAVE_GPR_+4*4(sp) -| ldc1 f26, SAVE_FPR_+3*8(sp) -| lw r19, SAVE_GPR_+3*4(sp) -| lw r18, SAVE_GPR_+2*4(sp) -| ldc1 f24, SAVE_FPR_+2*8(sp) -| lw r17, SAVE_GPR_+1*4(sp) -| lw r16, SAVE_GPR_+0*4(sp) -| ldc1 f22, SAVE_FPR_+1*8(sp) -| ldc1 f20, SAVE_FPR_+0*8(sp) -| jr ra -| addiu sp, sp, CFRAME_SPACE -|.endmacro -| -|// Type definitions. Some of these are only used for documentation. -|.type L, lua_State, LREG -|.type GL, global_State -|.type TVALUE, TValue -|.type GCOBJ, GCobj -|.type STR, GCstr -|.type TAB, GCtab -|.type LFUNC, GCfuncL -|.type CFUNC, GCfuncC -|.type PROTO, GCproto -|.type UPVAL, GCupval -|.type NODE, Node -|.type NARGS8, int -|.type TRACE, GCtrace -| -|//----------------------------------------------------------------------- -| -|// Trap for not-yet-implemented parts. -|.macro NYI; .long 0xf0f0f0f0; .endmacro -| -|// Macros to mark delay slots. -|.macro ., a; a; .endmacro -|.macro ., a,b; a,b; .endmacro -|.macro ., a,b,c; a,b,c; .endmacro -| -|//----------------------------------------------------------------------- -| -|// Endian-specific defines. -|.define FRAME_PC, LJ_ENDIAN_SELECT(-4,-8) -|.define FRAME_FUNC, LJ_ENDIAN_SELECT(-8,-4) -|.define HI, LJ_ENDIAN_SELECT(4,0) -|.define LO, LJ_ENDIAN_SELECT(0,4) -|.define OFS_RD, LJ_ENDIAN_SELECT(2,0) -|.define OFS_RA, LJ_ENDIAN_SELECT(1,2) -|.define OFS_OP, LJ_ENDIAN_SELECT(0,3) -| -|// Instruction decode. -|.macro decode_OP1, dst, ins; andi dst, ins, 0xff; .endmacro -|.macro decode_OP4a, dst, ins; andi dst, ins, 0xff; .endmacro -|.macro decode_OP4b, dst; sll dst, dst, 2; .endmacro -|.macro decode_RC4a, dst, ins; srl dst, ins, 14; .endmacro -|.macro decode_RC4b, dst; andi dst, dst, 0x3fc; .endmacro -|.macro decode_RD4b, dst; sll dst, dst, 2; .endmacro -|.macro decode_RA8a, dst, ins; srl dst, ins, 5; .endmacro -|.macro decode_RA8b, dst; andi dst, dst, 0x7f8; .endmacro -|.macro decode_RB8a, dst, ins; srl dst, ins, 21; .endmacro -|.macro decode_RB8b, dst; andi dst, dst, 0x7f8; .endmacro -|.macro decode_RD8a, dst, ins; srl dst, ins, 16; .endmacro -|.macro decode_RD8b, dst; sll dst, dst, 3; .endmacro -|.macro decode_RDtoRC8, dst, src; andi dst, src, 0x7f8; .endmacro -| -|// Instruction fetch. -|.macro ins_NEXT1 -| lw INS, 0(PC) -| addiu PC, PC, 4 -|.endmacro -|// Instruction decode+dispatch. -|.macro ins_NEXT2 -| decode_OP4a TMP1, INS -| decode_OP4b TMP1 -| addu TMP0, DISPATCH, TMP1 -| decode_RD8a RD, INS -| lw AT, 0(TMP0) -| decode_RA8a RA, INS -| decode_RD8b RD -| jr AT -| decode_RA8b RA -|.endmacro -|.macro ins_NEXT -| ins_NEXT1 -| ins_NEXT2 -|.endmacro -| -|// Instruction footer. -|.if 1 -| // Replicated dispatch. Less unpredictable branches, but higher I-Cache use. -| .define ins_next, ins_NEXT -| .define ins_next_, ins_NEXT -| .define ins_next1, ins_NEXT1 -| .define ins_next2, ins_NEXT2 -|.else -| // Common dispatch. Lower I-Cache use, only one (very) unpredictable branch. -| // Affects only certain kinds of benchmarks (and only with -j off). -| .macro ins_next -| b ->ins_next -| .endmacro -| .macro ins_next1 -| .endmacro -| .macro ins_next2 -| b ->ins_next -| .endmacro -| .macro ins_next_ -| ->ins_next: -| ins_NEXT -| .endmacro -|.endif -| -|// Call decode and dispatch. -|.macro ins_callt -| // BASE = new base, RB = LFUNC/CFUNC, RC = nargs*8, FRAME_PC(BASE) = PC -| lw PC, LFUNC:RB->pc -| lw INS, 0(PC) -| addiu PC, PC, 4 -| decode_OP4a TMP1, INS -| decode_RA8a RA, INS -| decode_OP4b TMP1 -| decode_RA8b RA -| addu TMP0, DISPATCH, TMP1 -| lw TMP0, 0(TMP0) -| jr TMP0 -| addu RA, RA, BASE -|.endmacro -| -|.macro ins_call -| // BASE = new base, RB = LFUNC/CFUNC, RC = nargs*8, PC = caller PC -| sw PC, FRAME_PC(BASE) -| ins_callt -|.endmacro -| -|//----------------------------------------------------------------------- -| -|.macro branch_RD -| srl TMP0, RD, 1 -| lui AT, (-(BCBIAS_J*4 >> 16) & 65535) -| addu TMP0, TMP0, AT -| addu PC, PC, TMP0 -|.endmacro -| -|// Assumes DISPATCH is relative to GL. -#define DISPATCH_GL(field) (GG_DISP2G + (int)offsetof(global_State, field)) -#define DISPATCH_J(field) (GG_DISP2J + (int)offsetof(jit_State, field)) -#define GG_DISP2GOT (GG_OFS(got) - GG_OFS(dispatch)) -#define DISPATCH_GOT(name) (GG_DISP2GOT + 4*LJ_GOT_##name) -| -#define PC2PROTO(field) ((int)offsetof(GCproto, field)-(int)sizeof(GCproto)) -| -|.macro load_got, func -| lw CFUNCADDR, DISPATCH_GOT(func)(DISPATCH) -|.endmacro -|// Much faster. Sadly, there's no easy way to force the required code layout. -|// .macro call_intern, func; bal extern func; .endmacro -|.macro call_intern, func; jalr CFUNCADDR; .endmacro -|.macro call_extern; jalr CFUNCADDR; .endmacro -|.macro jmp_extern; jr CFUNCADDR; .endmacro -| -|.macro hotcheck, delta, target -| srl TMP1, PC, 1 -| andi TMP1, TMP1, 126 -| addu TMP1, TMP1, DISPATCH -| lhu TMP2, GG_DISP2HOT(TMP1) -| addiu TMP2, TMP2, -delta -| bltz TMP2, target -|. sh TMP2, GG_DISP2HOT(TMP1) -|.endmacro -| -|.macro hotloop -| hotcheck HOTCOUNT_LOOP, ->vm_hotloop -|.endmacro -| -|.macro hotcall -| hotcheck HOTCOUNT_CALL, ->vm_hotcall -|.endmacro -| -|// Set current VM state. Uses TMP0. -|.macro li_vmstate, st; li TMP0, ~LJ_VMST_..st; .endmacro -|.macro st_vmstate; sw TMP0, DISPATCH_GL(vmstate)(DISPATCH); .endmacro -| -|// Move table write barrier back. Overwrites mark and tmp. -|.macro barrierback, tab, mark, tmp, target -| lw tmp, DISPATCH_GL(gc.grayagain)(DISPATCH) -| andi mark, mark, ~LJ_GC_BLACK & 255 // black2gray(tab) -| sw tab, DISPATCH_GL(gc.grayagain)(DISPATCH) -| sb mark, tab->marked -| b target -|. sw tmp, tab->gclist -|.endmacro -| -|//----------------------------------------------------------------------- - -/* Generate subroutines used by opcodes and other parts of the VM. */ -/* The .code_sub section should be last to help static branch prediction. */ -static void build_subroutines(BuildCtx *ctx) -{ - |.code_sub - | - |//----------------------------------------------------------------------- - |//-- Return handling ---------------------------------------------------- - |//----------------------------------------------------------------------- - | - |->vm_returnp: - | // See vm_return. Also: TMP2 = previous base. - | andi AT, PC, FRAME_P - | beqz AT, ->cont_dispatch - |. li TMP1, LJ_TTRUE - | - | // Return from pcall or xpcall fast func. - | lw PC, FRAME_PC(TMP2) // Fetch PC of previous frame. - | move BASE, TMP2 // Restore caller base. - | // Prepending may overwrite the pcall frame, so do it at the end. - | sw TMP1, FRAME_PC(RA) // Prepend true to results. - | addiu RA, RA, -8 - | - |->vm_returnc: - | addiu RD, RD, 8 // RD = (nresults+1)*8. - | andi TMP0, PC, FRAME_TYPE - | beqz RD, ->vm_unwind_c_eh - |. li CRET1, LUA_YIELD - | beqz TMP0, ->BC_RET_Z // Handle regular return to Lua. - |. move MULTRES, RD - | - |->vm_return: - | // BASE = base, RA = resultptr, RD/MULTRES = (nresults+1)*8, PC = return - | // TMP0 = PC & FRAME_TYPE - | li TMP2, -8 - | xori AT, TMP0, FRAME_C - | and TMP2, PC, TMP2 - | bnez AT, ->vm_returnp - | subu TMP2, BASE, TMP2 // TMP2 = previous base. - | - | addiu TMP1, RD, -8 - | sw TMP2, L->base - | li_vmstate C - | lw TMP2, SAVE_NRES - | addiu BASE, BASE, -8 - | st_vmstate - | beqz TMP1, >2 - |. sll TMP2, TMP2, 3 - |1: - | addiu TMP1, TMP1, -8 - | ldc1 f0, 0(RA) - | addiu RA, RA, 8 - | sdc1 f0, 0(BASE) - | bnez TMP1, <1 - |. addiu BASE, BASE, 8 - | - |2: - | bne TMP2, RD, >6 - |3: - |. sw BASE, L->top // Store new top. - | - |->vm_leave_cp: - | lw TMP0, SAVE_CFRAME // Restore previous C frame. - | move CRET1, r0 // Ok return status for vm_pcall. - | sw TMP0, L->cframe - | - |->vm_leave_unw: - | restoreregs_ret - | - |6: - | lw TMP1, L->maxstack - | slt AT, TMP2, RD - | bnez AT, >7 // Less results wanted? - | // More results wanted. Check stack size and fill up results with nil. - |. slt AT, BASE, TMP1 - | beqz AT, >8 - |. nop - | sw TISNIL, HI(BASE) - | addiu RD, RD, 8 - | b <2 - |. addiu BASE, BASE, 8 - | - |7: // Less results wanted. - | subu TMP0, RD, TMP2 - | subu TMP0, BASE, TMP0 // Either keep top or shrink it. - | b <3 - |. movn BASE, TMP0, TMP2 // LUA_MULTRET+1 case? - | - |8: // Corner case: need to grow stack for filling up results. - | // This can happen if: - | // - A C function grows the stack (a lot). - | // - The GC shrinks the stack in between. - | // - A return back from a lua_call() with (high) nresults adjustment. - | load_got lj_state_growstack - | move MULTRES, RD - | srl CARG2, TMP2, 3 - | call_intern lj_state_growstack // (lua_State *L, int n) - |. move CARG1, L - | lw TMP2, SAVE_NRES - | lw BASE, L->top // Need the (realloced) L->top in BASE. - | move RD, MULTRES - | b <2 - |. sll TMP2, TMP2, 3 - | - |->vm_unwind_c: // Unwind C stack, return from vm_pcall. - | // (void *cframe, int errcode) - | move sp, CARG1 - | move CRET1, CARG2 - |->vm_unwind_c_eh: // Landing pad for external unwinder. - | lw L, SAVE_L - | li TMP0, ~LJ_VMST_C - | lw GL:TMP1, L->glref - | b ->vm_leave_unw - |. sw TMP0, GL:TMP1->vmstate - | - |->vm_unwind_ff: // Unwind C stack, return from ff pcall. - | // (void *cframe) - | li AT, -4 - | and sp, CARG1, AT - |->vm_unwind_ff_eh: // Landing pad for external unwinder. - | lw L, SAVE_L - | lui TMP3, 0x59c0 // TOBIT = 2^52 + 2^51 (float). - | li TISNIL, LJ_TNIL - | lw BASE, L->base - | lw DISPATCH, L->glref // Setup pointer to dispatch table. - | mtc1 TMP3, TOBIT - | li TMP1, LJ_TFALSE - | li_vmstate INTERP - | lw PC, FRAME_PC(BASE) // Fetch PC of previous frame. - | cvt.d.s TOBIT, TOBIT - | addiu RA, BASE, -8 // Results start at BASE-8. - | addiu DISPATCH, DISPATCH, GG_G2DISP - | sw TMP1, HI(RA) // Prepend false to error message. - | st_vmstate - | b ->vm_returnc - |. li RD, 16 // 2 results: false + error message. - | - |//----------------------------------------------------------------------- - |//-- Grow stack for calls ----------------------------------------------- - |//----------------------------------------------------------------------- - | - |->vm_growstack_c: // Grow stack for C function. - | b >2 - |. li CARG2, LUA_MINSTACK - | - |->vm_growstack_l: // Grow stack for Lua function. - | // BASE = new base, RA = BASE+framesize*8, RC = nargs*8, PC = first PC - | addu RC, BASE, RC - | subu RA, RA, BASE - | sw BASE, L->base - | addiu PC, PC, 4 // Must point after first instruction. - | sw RC, L->top - | srl CARG2, RA, 3 - |2: - | // L->base = new base, L->top = top - | load_got lj_state_growstack - | sw PC, SAVE_PC - | call_intern lj_state_growstack // (lua_State *L, int n) - |. move CARG1, L - | lw BASE, L->base - | lw RC, L->top - | lw LFUNC:RB, FRAME_FUNC(BASE) - | subu RC, RC, BASE - | // BASE = new base, RB = LFUNC/CFUNC, RC = nargs*8, FRAME_PC(BASE) = PC - | ins_callt // Just retry the call. - | - |//----------------------------------------------------------------------- - |//-- Entry points into the assembler VM --------------------------------- - |//----------------------------------------------------------------------- - | - |->vm_resume: // Setup C frame and resume thread. - | // (lua_State *L, TValue *base, int nres1 = 0, ptrdiff_t ef = 0) - | saveregs - | move L, CARG1 - | lw DISPATCH, L->glref // Setup pointer to dispatch table. - | move BASE, CARG2 - | lbu TMP1, L->status - | sw L, SAVE_L - | li PC, FRAME_CP - | addiu TMP0, sp, CFRAME_RESUME - | addiu DISPATCH, DISPATCH, GG_G2DISP - | sw r0, SAVE_NRES - | sw r0, SAVE_ERRF - | sw TMP0, L->cframe - | sw r0, SAVE_CFRAME - | beqz TMP1, >3 - |. sw CARG1, SAVE_PC // Any value outside of bytecode is ok. - | - | // Resume after yield (like a return). - | move RA, BASE - | lw BASE, L->base - | lw TMP1, L->top - | lw PC, FRAME_PC(BASE) - | lui TMP3, 0x59c0 // TOBIT = 2^52 + 2^51 (float). - | subu RD, TMP1, BASE - | mtc1 TMP3, TOBIT - | sb r0, L->status - | cvt.d.s TOBIT, TOBIT - | li_vmstate INTERP - | addiu RD, RD, 8 - | st_vmstate - | move MULTRES, RD - | andi TMP0, PC, FRAME_TYPE - | beqz TMP0, ->BC_RET_Z - |. li TISNIL, LJ_TNIL - | b ->vm_return - |. nop - | - |->vm_pcall: // Setup protected C frame and enter VM. - | // (lua_State *L, TValue *base, int nres1, ptrdiff_t ef) - | saveregs - | sw CARG4, SAVE_ERRF - | b >1 - |. li PC, FRAME_CP - | - |->vm_call: // Setup C frame and enter VM. - | // (lua_State *L, TValue *base, int nres1) - | saveregs - | li PC, FRAME_C - | - |1: // Entry point for vm_pcall above (PC = ftype). - | lw TMP1, L:CARG1->cframe - | sw CARG3, SAVE_NRES - | move L, CARG1 - | sw CARG1, SAVE_L - | move BASE, CARG2 - | sw sp, L->cframe // Add our C frame to cframe chain. - | lw DISPATCH, L->glref // Setup pointer to dispatch table. - | sw CARG1, SAVE_PC // Any value outside of bytecode is ok. - | sw TMP1, SAVE_CFRAME - | addiu DISPATCH, DISPATCH, GG_G2DISP - | - |3: // Entry point for vm_cpcall/vm_resume (BASE = base, PC = ftype). - | lw TMP2, L->base // TMP2 = old base (used in vmeta_call). - | lui TMP3, 0x59c0 // TOBIT = 2^52 + 2^51 (float). - | lw TMP1, L->top - | mtc1 TMP3, TOBIT - | addu PC, PC, BASE - | subu NARGS8:RC, TMP1, BASE - | subu PC, PC, TMP2 // PC = frame delta + frame type - | cvt.d.s TOBIT, TOBIT - | li_vmstate INTERP - | li TISNIL, LJ_TNIL - | st_vmstate - | - |->vm_call_dispatch: - | // TMP2 = old base, BASE = new base, RC = nargs*8, PC = caller PC - | lw TMP0, FRAME_PC(BASE) - | li AT, LJ_TFUNC - | bne TMP0, AT, ->vmeta_call - |. lw LFUNC:RB, FRAME_FUNC(BASE) - | - |->vm_call_dispatch_f: - | ins_call - | // BASE = new base, RB = func, RC = nargs*8, PC = caller PC - | - |->vm_cpcall: // Setup protected C frame, call C. - | // (lua_State *L, lua_CFunction func, void *ud, lua_CPFunction cp) - | saveregs - | move L, CARG1 - | lw TMP0, L:CARG1->stack - | sw CARG1, SAVE_L - | lw TMP1, L->top - | sw CARG1, SAVE_PC // Any value outside of bytecode is ok. - | subu TMP0, TMP0, TMP1 // Compute -savestack(L, L->top). - | lw TMP1, L->cframe - | sw sp, L->cframe // Add our C frame to cframe chain. - | sw TMP0, SAVE_NRES // Neg. delta means cframe w/o frame. - | sw r0, SAVE_ERRF // No error function. - | move CFUNCADDR, CARG4 - | jalr CARG4 // (lua_State *L, lua_CFunction func, void *ud) - |. sw TMP1, SAVE_CFRAME - | move BASE, CRET1 - | lw DISPATCH, L->glref // Setup pointer to dispatch table. - | li PC, FRAME_CP - | bnez CRET1, <3 // Else continue with the call. - |. addiu DISPATCH, DISPATCH, GG_G2DISP - | b ->vm_leave_cp // No base? Just remove C frame. - |. nop - | - |//----------------------------------------------------------------------- - |//-- Metamethod handling ------------------------------------------------ - |//----------------------------------------------------------------------- - | - |// The lj_meta_* functions (except for lj_meta_cat) don't reallocate the - |// stack, so BASE doesn't need to be reloaded across these calls. - | - |//-- Continuation dispatch ---------------------------------------------- - | - |->cont_dispatch: - | // BASE = meta base, RA = resultptr, RD = (nresults+1)*8 - | lw TMP0, -16+LO(BASE) // Continuation. - | move RB, BASE - | move BASE, TMP2 // Restore caller BASE. - | lw LFUNC:TMP1, FRAME_FUNC(TMP2) - |.if FFI - | sltiu AT, TMP0, 2 - |.endif - | lw PC, -16+HI(RB) // Restore PC from [cont|PC]. - | addu TMP2, RA, RD - | lw TMP1, LFUNC:TMP1->pc - |.if FFI - | bnez AT, >1 - |.endif - |. sw TISNIL, -8+HI(TMP2) // Ensure one valid arg. - | // BASE = base, RA = resultptr, RB = meta base - | jr TMP0 // Jump to continuation. - |. lw KBASE, PC2PROTO(k)(TMP1) - | - |.if FFI - |1: - | bnez TMP0, ->cont_ffi_callback // cont = 1: return from FFI callback. - | // cont = 0: tailcall from C function. - |. addiu TMP1, RB, -16 - | b ->vm_call_tail - |. subu RC, TMP1, BASE - |.endif - | - |->cont_cat: // RA = resultptr, RB = meta base - | lw INS, -4(PC) - | addiu CARG2, RB, -16 - | ldc1 f0, 0(RA) - | decode_RB8a MULTRES, INS - | decode_RA8a RA, INS - | decode_RB8b MULTRES - | decode_RA8b RA - | addu TMP1, BASE, MULTRES - | sw BASE, L->base - | subu CARG3, CARG2, TMP1 - | bne TMP1, CARG2, ->BC_CAT_Z - |. sdc1 f0, 0(CARG2) - | addu RA, BASE, RA - | b ->cont_nop - |. sdc1 f0, 0(RA) - | - |//-- Table indexing metamethods ----------------------------------------- - | - |->vmeta_tgets1: - | addiu CARG3, DISPATCH, DISPATCH_GL(tmptv) - | li TMP0, LJ_TSTR - | sw STR:RC, LO(CARG3) - | b >1 - |. sw TMP0, HI(CARG3) - | - |->vmeta_tgets: - | addiu CARG2, DISPATCH, DISPATCH_GL(tmptv) - | li TMP0, LJ_TTAB - | sw TAB:RB, LO(CARG2) - | addiu CARG3, DISPATCH, DISPATCH_GL(tmptv2) - | sw TMP0, HI(CARG2) - | li TMP1, LJ_TSTR - | sw STR:RC, LO(CARG3) - | b >1 - |. sw TMP1, HI(CARG3) - | - |->vmeta_tgetb: // TMP0 = index - | mtc1 TMP0, f0 - | cvt.d.w f0, f0 - | addiu CARG3, DISPATCH, DISPATCH_GL(tmptv) - | sdc1 f0, 0(CARG3) - | - |->vmeta_tgetv: - |1: - | load_got lj_meta_tget - | sw BASE, L->base - | sw PC, SAVE_PC - | call_intern lj_meta_tget // (lua_State *L, TValue *o, TValue *k) - |. move CARG1, L - | // Returns TValue * (finished) or NULL (metamethod). - | beqz CRET1, >3 - |. addiu TMP1, BASE, -FRAME_CONT - | ldc1 f0, 0(CRET1) - | ins_next1 - | sdc1 f0, 0(RA) - | ins_next2 - | - |3: // Call __index metamethod. - | // BASE = base, L->top = new base, stack = cont/func/t/k - | lw BASE, L->top - | sw PC, -16+HI(BASE) // [cont|PC] - | subu PC, BASE, TMP1 - | lw LFUNC:RB, FRAME_FUNC(BASE) // Guaranteed to be a function here. - | b ->vm_call_dispatch_f - |. li NARGS8:RC, 16 // 2 args for func(t, k). - | - |//----------------------------------------------------------------------- - | - |->vmeta_tsets1: - | addiu CARG3, DISPATCH, DISPATCH_GL(tmptv) - | li TMP0, LJ_TSTR - | sw STR:RC, LO(CARG3) - | b >1 - |. sw TMP0, HI(CARG3) - | - |->vmeta_tsets: - | addiu CARG2, DISPATCH, DISPATCH_GL(tmptv) - | li TMP0, LJ_TTAB - | sw TAB:RB, LO(CARG2) - | addiu CARG3, DISPATCH, DISPATCH_GL(tmptv2) - | sw TMP0, HI(CARG2) - | li TMP1, LJ_TSTR - | sw STR:RC, LO(CARG3) - | b >1 - |. sw TMP1, HI(CARG3) - | - |->vmeta_tsetb: // TMP0 = index - | mtc1 TMP0, f0 - | cvt.d.w f0, f0 - | addiu CARG3, DISPATCH, DISPATCH_GL(tmptv) - | sdc1 f0, 0(CARG3) - | - |->vmeta_tsetv: - |1: - | load_got lj_meta_tset - | sw BASE, L->base - | sw PC, SAVE_PC - | call_intern lj_meta_tset // (lua_State *L, TValue *o, TValue *k) - |. move CARG1, L - | // Returns TValue * (finished) or NULL (metamethod). - | beqz CRET1, >3 - |. ldc1 f0, 0(RA) - | // NOBARRIER: lj_meta_tset ensures the table is not black. - | ins_next1 - | sdc1 f0, 0(CRET1) - | ins_next2 - | - |3: // Call __newindex metamethod. - | // BASE = base, L->top = new base, stack = cont/func/t/k/(v) - | addiu TMP1, BASE, -FRAME_CONT - | lw BASE, L->top - | sw PC, -16+HI(BASE) // [cont|PC] - | subu PC, BASE, TMP1 - | lw LFUNC:RB, FRAME_FUNC(BASE) // Guaranteed to be a function here. - | sdc1 f0, 16(BASE) // Copy value to third argument. - | b ->vm_call_dispatch_f - |. li NARGS8:RC, 24 // 3 args for func(t, k, v) - | - |//-- Comparison metamethods --------------------------------------------- - | - |->vmeta_comp: - | // CARG2, CARG3 are already set by BC_ISLT/BC_ISGE/BC_ISLE/BC_ISGT. - | load_got lj_meta_comp - | addiu PC, PC, -4 - | sw BASE, L->base - | sw PC, SAVE_PC - | decode_OP1 CARG4, INS - | call_intern lj_meta_comp // (lua_State *L, TValue *o1, *o2, int op) - |. move CARG1, L - | // Returns 0/1 or TValue * (metamethod). - |3: - | sltiu AT, CRET1, 2 - | beqz AT, ->vmeta_binop - | negu TMP2, CRET1 - |4: - | lhu RD, OFS_RD(PC) - | addiu PC, PC, 4 - | lui TMP1, (-(BCBIAS_J*4 >> 16) & 65535) - | sll RD, RD, 2 - | addu RD, RD, TMP1 - | and RD, RD, TMP2 - | addu PC, PC, RD - |->cont_nop: - | ins_next - | - |->cont_ra: // RA = resultptr - | lbu TMP1, -4+OFS_RA(PC) - | ldc1 f0, 0(RA) - | sll TMP1, TMP1, 3 - | addu TMP1, BASE, TMP1 - | b ->cont_nop - |. sdc1 f0, 0(TMP1) - | - |->cont_condt: // RA = resultptr - | lw TMP0, HI(RA) - | sltiu AT, TMP0, LJ_TISTRUECOND - | b <4 - |. negu TMP2, AT // Branch if result is true. - | - |->cont_condf: // RA = resultptr - | lw TMP0, HI(RA) - | sltiu AT, TMP0, LJ_TISTRUECOND - | b <4 - |. addiu TMP2, AT, -1 // Branch if result is false. - | - |->vmeta_equal: - | // CARG2, CARG3, CARG4 are already set by BC_ISEQV/BC_ISNEV. - | load_got lj_meta_equal - | addiu PC, PC, -4 - | sw BASE, L->base - | sw PC, SAVE_PC - | call_intern lj_meta_equal // (lua_State *L, GCobj *o1, *o2, int ne) - |. move CARG1, L - | // Returns 0/1 or TValue * (metamethod). - | b <3 - |. nop - | - |->vmeta_equal_cd: - |.if FFI - | load_got lj_meta_equal_cd - | move CARG2, INS - | addiu PC, PC, -4 - | sw BASE, L->base - | sw PC, SAVE_PC - | call_intern lj_meta_equal_cd // (lua_State *L, BCIns op) - |. move CARG1, L - | // Returns 0/1 or TValue * (metamethod). - | b <3 - |. nop - |.endif - | - |//-- Arithmetic metamethods --------------------------------------------- - | - |->vmeta_unm: - | move CARG4, CARG3 - | - |->vmeta_arith: - | load_got lj_meta_arith - | decode_OP1 TMP0, INS - | sw BASE, L->base - | sw PC, SAVE_PC - | move CARG2, RA - | sw TMP0, ARG5 - | call_intern lj_meta_arith // (lua_State *L, TValue *ra,*rb,*rc, BCReg op) - |. move CARG1, L - | // Returns NULL (finished) or TValue * (metamethod). - | beqz CRET1, ->cont_nop - |. nop - | - | // Call metamethod for binary op. - |->vmeta_binop: - | // BASE = old base, CRET1 = new base, stack = cont/func/o1/o2 - | subu TMP1, CRET1, BASE - | sw PC, -16+HI(CRET1) // [cont|PC] - | move TMP2, BASE - | addiu PC, TMP1, FRAME_CONT - | move BASE, CRET1 - | b ->vm_call_dispatch - |. li NARGS8:RC, 16 // 2 args for func(o1, o2). - | - |->vmeta_len: - | // CARG2 already set by BC_LEN. -#if LJ_52 - | move MULTRES, CARG1 -#endif - | load_got lj_meta_len - | sw BASE, L->base - | sw PC, SAVE_PC - | call_intern lj_meta_len // (lua_State *L, TValue *o) - |. move CARG1, L - | // Returns NULL (retry) or TValue * (metamethod base). -#if LJ_52 - | bnez CRET1, ->vmeta_binop // Binop call for compatibility. - |. nop - | b ->BC_LEN_Z - |. move CARG1, MULTRES -#else - | b ->vmeta_binop // Binop call for compatibility. - |. nop -#endif - | - |//-- Call metamethod ---------------------------------------------------- - | - |->vmeta_call: // Resolve and call __call metamethod. - | // TMP2 = old base, BASE = new base, RC = nargs*8 - | load_got lj_meta_call - | sw TMP2, L->base // This is the callers base! - | addiu CARG2, BASE, -8 - | sw PC, SAVE_PC - | addu CARG3, BASE, RC - | move MULTRES, NARGS8:RC - | call_intern lj_meta_call // (lua_State *L, TValue *func, TValue *top) - |. move CARG1, L - | lw LFUNC:RB, FRAME_FUNC(BASE) // Guaranteed to be a function here. - | addiu NARGS8:RC, MULTRES, 8 // Got one more argument now. - | ins_call - | - |->vmeta_callt: // Resolve __call for BC_CALLT. - | // BASE = old base, RA = new base, RC = nargs*8 - | load_got lj_meta_call - | sw BASE, L->base - | addiu CARG2, RA, -8 - | sw PC, SAVE_PC - | addu CARG3, RA, RC - | move MULTRES, NARGS8:RC - | call_intern lj_meta_call // (lua_State *L, TValue *func, TValue *top) - |. move CARG1, L - | lw TMP1, FRAME_PC(BASE) - | lw LFUNC:RB, FRAME_FUNC(RA) // Guaranteed to be a function here. - | b ->BC_CALLT_Z - |. addiu NARGS8:RC, MULTRES, 8 // Got one more argument now. - | - |//-- Argument coercion for 'for' statement ------------------------------ - | - |->vmeta_for: - | load_got lj_meta_for - | sw BASE, L->base - | move CARG2, RA - | sw PC, SAVE_PC - | move MULTRES, INS - | call_intern lj_meta_for // (lua_State *L, TValue *base) - |. move CARG1, L - |.if JIT - | decode_OP1 TMP0, MULTRES - | li AT, BC_JFORI - |.endif - | decode_RA8a RA, MULTRES - | decode_RD8a RD, MULTRES - | decode_RA8b RA - |.if JIT - | beq TMP0, AT, =>BC_JFORI - |. decode_RD8b RD - | b =>BC_FORI - |. nop - |.else - | b =>BC_FORI - |. decode_RD8b RD - |.endif - | - |//----------------------------------------------------------------------- - |//-- Fast functions ----------------------------------------------------- - |//----------------------------------------------------------------------- - | - |.macro .ffunc, name - |->ff_ .. name: - |.endmacro - | - |.macro .ffunc_1, name - |->ff_ .. name: - | beqz NARGS8:RC, ->fff_fallback - |. lw CARG3, HI(BASE) - | lw CARG1, LO(BASE) - |.endmacro - | - |.macro .ffunc_2, name - |->ff_ .. name: - | sltiu AT, NARGS8:RC, 16 - | lw CARG3, HI(BASE) - | bnez AT, ->fff_fallback - |. lw CARG4, 8+HI(BASE) - | lw CARG1, LO(BASE) - | lw CARG2, 8+LO(BASE) - |.endmacro - | - |.macro .ffunc_n, name // Caveat: has delay slot! - |->ff_ .. name: - | lw CARG3, HI(BASE) - | beqz NARGS8:RC, ->fff_fallback - |. ldc1 FARG1, 0(BASE) - | sltiu AT, CARG3, LJ_TISNUM - | beqz AT, ->fff_fallback - |.endmacro - | - |.macro .ffunc_nn, name // Caveat: has delay slot! - |->ff_ .. name: - | sltiu AT, NARGS8:RC, 16 - | lw CARG3, HI(BASE) - | bnez AT, ->fff_fallback - |. lw CARG4, 8+HI(BASE) - | ldc1 FARG1, 0(BASE) - | ldc1 FARG2, 8(BASE) - | sltiu TMP0, CARG3, LJ_TISNUM - | sltiu TMP1, CARG4, LJ_TISNUM - | and TMP0, TMP0, TMP1 - | beqz TMP0, ->fff_fallback - |.endmacro - | - |// Inlined GC threshold check. Caveat: uses TMP0 and TMP1 and has delay slot! - |.macro ffgccheck - | lw TMP0, DISPATCH_GL(gc.total)(DISPATCH) - | lw TMP1, DISPATCH_GL(gc.threshold)(DISPATCH) - | subu AT, TMP0, TMP1 - | bgezal AT, ->fff_gcstep - |.endmacro - | - |//-- Base library: checks ----------------------------------------------- - | - |.ffunc_1 assert - | sltiu AT, CARG3, LJ_TISTRUECOND - | beqz AT, ->fff_fallback - |. addiu RA, BASE, -8 - | lw PC, FRAME_PC(BASE) - | addiu RD, NARGS8:RC, 8 // Compute (nresults+1)*8. - | addu TMP2, RA, NARGS8:RC - | sw CARG3, HI(RA) - | addiu TMP1, BASE, 8 - | beq BASE, TMP2, ->fff_res // Done if exactly 1 argument. - |. sw CARG1, LO(RA) - |1: - | ldc1 f0, 0(TMP1) - | sdc1 f0, -8(TMP1) - | bne TMP1, TMP2, <1 - |. addiu TMP1, TMP1, 8 - | b ->fff_res - |. nop - | - |.ffunc type - | lw CARG3, HI(BASE) - | li TMP1, LJ_TISNUM - | beqz NARGS8:RC, ->fff_fallback - |. sltiu TMP0, CARG3, LJ_TISNUM - | movz TMP1, CARG3, TMP0 - | not TMP1, TMP1 - | sll TMP1, TMP1, 3 - | addu TMP1, CFUNC:RB, TMP1 - | b ->fff_resn - |. ldc1 FRET1, CFUNC:TMP1->upvalue - | - |//-- Base library: getters and setters --------------------------------- - | - |.ffunc_1 getmetatable - | li AT, LJ_TTAB - | bne CARG3, AT, >6 - |. li AT, LJ_TUDATA - |1: // Field metatable must be at same offset for GCtab and GCudata! - | lw TAB:CARG1, TAB:CARG1->metatable - |2: - | lw STR:RC, DISPATCH_GL(gcroot[GCROOT_MMNAME+MM_metatable])(DISPATCH) - | beqz TAB:CARG1, ->fff_restv - |. li CARG3, LJ_TNIL - | lw TMP0, TAB:CARG1->hmask - | li CARG3, LJ_TTAB // Use metatable as default result. - | lw TMP1, STR:RC->hash - | lw NODE:TMP2, TAB:CARG1->node - | and TMP1, TMP1, TMP0 // idx = str->hash & tab->hmask - | sll TMP0, TMP1, 5 - | sll TMP1, TMP1, 3 - | subu TMP1, TMP0, TMP1 - | addu NODE:TMP2, NODE:TMP2, TMP1 // node = tab->node + (idx*32-idx*8) - | li AT, LJ_TSTR - |3: // Rearranged logic, because we expect _not_ to find the key. - | lw CARG4, offsetof(Node, key)+HI(NODE:TMP2) - | lw TMP0, offsetof(Node, key)+LO(NODE:TMP2) - | lw NODE:TMP3, NODE:TMP2->next - | bne CARG4, AT, >4 - |. lw CARG2, offsetof(Node, val)+HI(NODE:TMP2) - | beq TMP0, STR:RC, >5 - |. lw TMP1, offsetof(Node, val)+LO(NODE:TMP2) - |4: - | beqz NODE:TMP3, ->fff_restv // Not found, keep default result. - |. move NODE:TMP2, NODE:TMP3 - | b <3 - |. nop - |5: - | beq CARG2, TISNIL, ->fff_restv // Ditto for nil value. - |. nop - | move CARG3, CARG2 // Return value of mt.__metatable. - | b ->fff_restv - |. move CARG1, TMP1 - | - |6: - | beq CARG3, AT, <1 - |. sltiu TMP0, CARG3, LJ_TISNUM - | li TMP1, LJ_TISNUM - | movz TMP1, CARG3, TMP0 - | not TMP1, TMP1 - | sll TMP1, TMP1, 2 - | addu TMP1, DISPATCH, TMP1 - | b <2 - |. lw TAB:CARG1, DISPATCH_GL(gcroot[GCROOT_BASEMT])(TMP1) - | - |.ffunc_2 setmetatable - | // Fast path: no mt for table yet and not clearing the mt. - | li AT, LJ_TTAB - | bne CARG3, AT, ->fff_fallback - |. addiu CARG4, CARG4, -LJ_TTAB - | lw TAB:TMP1, TAB:CARG1->metatable - | lbu TMP3, TAB:CARG1->marked - | or AT, CARG4, TAB:TMP1 - | bnez AT, ->fff_fallback - |. andi AT, TMP3, LJ_GC_BLACK // isblack(table) - | beqz AT, ->fff_restv - |. sw TAB:CARG2, TAB:CARG1->metatable - | barrierback TAB:CARG1, TMP3, TMP0, ->fff_restv - | - |.ffunc rawget - | lw CARG4, HI(BASE) - | sltiu AT, NARGS8:RC, 16 - | lw TAB:CARG2, LO(BASE) - | load_got lj_tab_get - | addiu CARG4, CARG4, -LJ_TTAB - | or AT, AT, CARG4 - | bnez AT, ->fff_fallback - | addiu CARG3, BASE, 8 - | call_intern lj_tab_get // (lua_State *L, GCtab *t, cTValue *key) - |. move CARG1, L - | // Returns cTValue *. - | b ->fff_resn - |. ldc1 FRET1, 0(CRET1) - | - |//-- Base library: conversions ------------------------------------------ - | - |.ffunc tonumber - | // Only handles the number case inline (without a base argument). - | lw CARG1, HI(BASE) - | xori AT, NARGS8:RC, 8 - | sltiu CARG1, CARG1, LJ_TISNUM - | movn CARG1, r0, AT - | beqz CARG1, ->fff_fallback // Exactly one number argument. - |. ldc1 FRET1, 0(BASE) - | b ->fff_resn - |. nop - | - |.ffunc_1 tostring - | // Only handles the string or number case inline. - | li AT, LJ_TSTR - | // A __tostring method in the string base metatable is ignored. - | beq CARG3, AT, ->fff_restv // String key? - | // Handle numbers inline, unless a number base metatable is present. - |. lw TMP1, DISPATCH_GL(gcroot[GCROOT_BASEMT_NUM])(DISPATCH) - | sltiu TMP0, CARG3, LJ_TISNUM - | sltiu TMP1, TMP1, 1 - | and TMP0, TMP0, TMP1 - | beqz TMP0, ->fff_fallback - |. sw BASE, L->base // Add frame since C call can throw. - | ffgccheck - |. sw PC, SAVE_PC // Redundant (but a defined value). - | load_got lj_str_fromnum - | move CARG1, L - | call_intern lj_str_fromnum // (lua_State *L, lua_Number *np) - |. move CARG2, BASE - | // Returns GCstr *. - | li CARG3, LJ_TSTR - | b ->fff_restv - |. move CARG1, CRET1 - | - |//-- Base library: iterators ------------------------------------------- - | - |.ffunc next - | lw CARG1, HI(BASE) - | lw TAB:CARG2, LO(BASE) - | beqz NARGS8:RC, ->fff_fallback - |. addu TMP2, BASE, NARGS8:RC - | li AT, LJ_TTAB - | sw TISNIL, HI(TMP2) // Set missing 2nd arg to nil. - | bne CARG1, AT, ->fff_fallback - |. lw PC, FRAME_PC(BASE) - | load_got lj_tab_next - | sw BASE, L->base // Add frame since C call can throw. - | sw BASE, L->top // Dummy frame length is ok. - | addiu CARG3, BASE, 8 - | sw PC, SAVE_PC - | call_intern lj_tab_next // (lua_State *L, GCtab *t, TValue *key) - |. move CARG1, L - | // Returns 0 at end of traversal. - | beqz CRET1, ->fff_restv // End of traversal: return nil. - |. li CARG3, LJ_TNIL - | ldc1 f0, 8(BASE) // Copy key and value to results. - | addiu RA, BASE, -8 - | ldc1 f2, 16(BASE) - | li RD, (2+1)*8 - | sdc1 f0, 0(RA) - | b ->fff_res - |. sdc1 f2, 8(RA) - | - |.ffunc_1 pairs - | li AT, LJ_TTAB - | bne CARG3, AT, ->fff_fallback - |. lw PC, FRAME_PC(BASE) -#if LJ_52 - | lw TAB:TMP2, TAB:CARG1->metatable - | ldc1 f0, CFUNC:RB->upvalue[0] - | bnez TAB:TMP2, ->fff_fallback -#else - | ldc1 f0, CFUNC:RB->upvalue[0] -#endif - |. addiu RA, BASE, -8 - | sw TISNIL, 8+HI(BASE) - | li RD, (3+1)*8 - | b ->fff_res - |. sdc1 f0, 0(RA) - | - |.ffunc ipairs_aux - | sltiu AT, NARGS8:RC, 16 - | lw CARG3, HI(BASE) - | lw TAB:CARG1, LO(BASE) - | lw CARG4, 8+HI(BASE) - | bnez AT, ->fff_fallback - |. ldc1 FARG2, 8(BASE) - | addiu CARG3, CARG3, -LJ_TTAB - | sltiu AT, CARG4, LJ_TISNUM - | li TMP0, 1 - | movn AT, r0, CARG3 - | mtc1 TMP0, FARG1 - | beqz AT, ->fff_fallback - |. lw PC, FRAME_PC(BASE) - | cvt.w.d FRET1, FARG2 - | cvt.d.w FARG1, FARG1 - | lw TMP0, TAB:CARG1->asize - | lw TMP1, TAB:CARG1->array - | mfc1 TMP2, FRET1 - | addiu RA, BASE, -8 - | add.d FARG2, FARG2, FARG1 - | addiu TMP2, TMP2, 1 - | sltu AT, TMP2, TMP0 - | sll TMP3, TMP2, 3 - | addu TMP3, TMP1, TMP3 - | beqz AT, >2 // Not in array part? - |. sdc1 FARG2, 0(RA) - | lw TMP2, HI(TMP3) - | ldc1 f0, 0(TMP3) - |1: - | beq TMP2, TISNIL, ->fff_res // End of iteration, return 0 results. - |. li RD, (0+1)*8 - | li RD, (2+1)*8 - | b ->fff_res - |. sdc1 f0, 8(RA) - |2: // Check for empty hash part first. Otherwise call C function. - | lw TMP0, TAB:CARG1->hmask - | load_got lj_tab_getinth - | beqz TMP0, ->fff_res - |. li RD, (0+1)*8 - | call_intern lj_tab_getinth // (GCtab *t, int32_t key) - |. move CARG2, TMP2 - | // Returns cTValue * or NULL. - | beqz CRET1, ->fff_res - |. li RD, (0+1)*8 - | lw TMP2, HI(CRET1) - | b <1 - |. ldc1 f0, 0(CRET1) - | - |.ffunc_1 ipairs - | li AT, LJ_TTAB - | bne CARG3, AT, ->fff_fallback - |. lw PC, FRAME_PC(BASE) -#if LJ_52 - | lw TAB:TMP2, TAB:CARG1->metatable - | ldc1 f0, CFUNC:RB->upvalue[0] - | bnez TAB:TMP2, ->fff_fallback -#else - | ldc1 f0, CFUNC:RB->upvalue[0] -#endif - |. addiu RA, BASE, -8 - | sw r0, 8+HI(BASE) - | sw r0, 8+LO(BASE) - | li RD, (3+1)*8 - | b ->fff_res - |. sdc1 f0, 0(RA) - | - |//-- Base library: catch errors ---------------------------------------- - | - |.ffunc pcall - | lbu TMP3, DISPATCH_GL(hookmask)(DISPATCH) - | beqz NARGS8:RC, ->fff_fallback - | move TMP2, BASE - | addiu BASE, BASE, 8 - | // Remember active hook before pcall. - | srl TMP3, TMP3, HOOK_ACTIVE_SHIFT - | andi TMP3, TMP3, 1 - | addiu PC, TMP3, 8+FRAME_PCALL - | b ->vm_call_dispatch - |. addiu NARGS8:RC, NARGS8:RC, -8 - | - |.ffunc xpcall - | sltiu AT, NARGS8:RC, 16 - | lw CARG4, 8+HI(BASE) - | bnez AT, ->fff_fallback - |. ldc1 FARG2, 8(BASE) - | ldc1 FARG1, 0(BASE) - | lbu TMP1, DISPATCH_GL(hookmask)(DISPATCH) - | li AT, LJ_TFUNC - | move TMP2, BASE - | bne CARG4, AT, ->fff_fallback // Traceback must be a function. - | addiu BASE, BASE, 16 - | // Remember active hook before pcall. - | srl TMP3, TMP3, HOOK_ACTIVE_SHIFT - | sdc1 FARG2, 0(TMP2) // Swap function and traceback. - | andi TMP3, TMP3, 1 - | sdc1 FARG1, 8(TMP2) - | addiu PC, TMP3, 16+FRAME_PCALL - | b ->vm_call_dispatch - |. addiu NARGS8:RC, NARGS8:RC, -16 - | - |//-- Coroutine library -------------------------------------------------- - | - |.macro coroutine_resume_wrap, resume - |.if resume - |.ffunc_1 coroutine_resume - | li AT, LJ_TTHREAD - | bne CARG3, AT, ->fff_fallback - |.else - |.ffunc coroutine_wrap_aux - | lw L:CARG1, CFUNC:RB->upvalue[0].gcr - |.endif - | lbu TMP0, L:CARG1->status - | lw TMP1, L:CARG1->cframe - | lw CARG2, L:CARG1->top - | lw TMP2, L:CARG1->base - | addiu TMP3, TMP0, -LUA_YIELD - | bgtz TMP3, ->fff_fallback // st > LUA_YIELD? - |. xor TMP2, TMP2, CARG2 - | bnez TMP1, ->fff_fallback // cframe != 0? - |. or AT, TMP2, TMP0 - | lw TMP0, L:CARG1->maxstack - | beqz AT, ->fff_fallback // base == top && st == 0? - |. lw PC, FRAME_PC(BASE) - | addu TMP2, CARG2, NARGS8:RC - | sltu AT, TMP0, TMP2 - | bnez AT, ->fff_fallback // Stack overflow? - |. sw PC, SAVE_PC - | sw BASE, L->base - |1: - |.if resume - | addiu BASE, BASE, 8 // Keep resumed thread in stack for GC. - | addiu NARGS8:RC, NARGS8:RC, -8 - | addiu TMP2, TMP2, -8 - |.endif - | sw TMP2, L:CARG1->top - | addu TMP1, BASE, NARGS8:RC - | move CARG3, CARG2 - | sw BASE, L->top - |2: // Move args to coroutine. - | ldc1 f0, 0(BASE) - | sltu AT, BASE, TMP1 - | beqz AT, >3 - |. addiu BASE, BASE, 8 - | sdc1 f0, 0(CARG3) - | b <2 - |. addiu CARG3, CARG3, 8 - |3: - | bal ->vm_resume // (lua_State *L, TValue *base, 0, 0) - |. move L:RA, L:CARG1 - | // Returns thread status. - |4: - | lw TMP2, L:RA->base - | sltiu AT, CRET1, LUA_YIELD+1 - | lw TMP3, L:RA->top - | li_vmstate INTERP - | lw BASE, L->base - | st_vmstate - | beqz AT, >8 - |. subu RD, TMP3, TMP2 - | lw TMP0, L->maxstack - | beqz RD, >6 // No results? - |. addu TMP1, BASE, RD - | sltu AT, TMP0, TMP1 - | bnez AT, >9 // Need to grow stack? - |. addu TMP3, TMP2, RD - | sw TMP2, L:RA->top // Clear coroutine stack. - | move TMP1, BASE - |5: // Move results from coroutine. - | ldc1 f0, 0(TMP2) - | addiu TMP2, TMP2, 8 - | sltu AT, TMP2, TMP3 - | sdc1 f0, 0(TMP1) - | bnez AT, <5 - |. addiu TMP1, TMP1, 8 - |6: - | andi TMP0, PC, FRAME_TYPE - |.if resume - | li TMP1, LJ_TTRUE - | addiu RA, BASE, -8 - | sw TMP1, -8+HI(BASE) // Prepend true to results. - | addiu RD, RD, 16 - |.else - | move RA, BASE - | addiu RD, RD, 8 - |.endif - |7: - | sw PC, SAVE_PC - | beqz TMP0, ->BC_RET_Z - |. move MULTRES, RD - | b ->vm_return - |. nop - | - |8: // Coroutine returned with error (at co->top-1). - |.if resume - | addiu TMP3, TMP3, -8 - | li TMP1, LJ_TFALSE - | ldc1 f0, 0(TMP3) - | sw TMP3, L:RA->top // Remove error from coroutine stack. - | li RD, (2+1)*8 - | sw TMP1, -8+HI(BASE) // Prepend false to results. - | addiu RA, BASE, -8 - | sdc1 f0, 0(BASE) // Copy error message. - | b <7 - |. andi TMP0, PC, FRAME_TYPE - |.else - | load_got lj_ffh_coroutine_wrap_err - | move CARG2, L:RA - | call_intern lj_ffh_coroutine_wrap_err // (lua_State *L, lua_State *co) - |. move CARG1, L - |.endif - | - |9: // Handle stack expansion on return from yield. - | load_got lj_state_growstack - | srl CARG2, RD, 3 - | call_intern lj_state_growstack // (lua_State *L, int n) - |. move CARG1, L - | b <4 - |. li CRET1, 0 - |.endmacro - | - | coroutine_resume_wrap 1 // coroutine.resume - | coroutine_resume_wrap 0 // coroutine.wrap - | - |.ffunc coroutine_yield - | lw TMP0, L->cframe - | addu TMP1, BASE, NARGS8:RC - | sw BASE, L->base - | andi TMP0, TMP0, CFRAME_RESUME - | sw TMP1, L->top - | beqz TMP0, ->fff_fallback - |. li CRET1, LUA_YIELD - | sw r0, L->cframe - | b ->vm_leave_unw - |. sb CRET1, L->status - | - |//-- Math library ------------------------------------------------------- - | - |.ffunc_n math_abs - |. abs.d FRET1, FARG1 - |->fff_resn: - | lw PC, FRAME_PC(BASE) - | addiu RA, BASE, -8 - | b ->fff_res1 - |. sdc1 FRET1, -8(BASE) - | - |->fff_restv: - | // CARG3/CARG1 = TValue result. - | lw PC, FRAME_PC(BASE) - | sw CARG3, -8+HI(BASE) - | addiu RA, BASE, -8 - | sw CARG1, -8+LO(BASE) - |->fff_res1: - | // RA = results, PC = return. - | li RD, (1+1)*8 - |->fff_res: - | // RA = results, RD = (nresults+1)*8, PC = return. - | andi TMP0, PC, FRAME_TYPE - | bnez TMP0, ->vm_return - |. move MULTRES, RD - | lw INS, -4(PC) - | decode_RB8a RB, INS - | decode_RB8b RB - |5: - | sltu AT, RD, RB - | bnez AT, >6 // More results expected? - |. decode_RA8a TMP0, INS - | decode_RA8b TMP0 - | ins_next1 - | // Adjust BASE. KBASE is assumed to be set for the calling frame. - | subu BASE, RA, TMP0 - | ins_next2 - | - |6: // Fill up results with nil. - | addu TMP1, RA, RD - | addiu RD, RD, 8 - | b <5 - |. sw TISNIL, -8+HI(TMP1) - | - |.macro math_extern, func - |->ff_math_ .. func: - | lw CARG3, HI(BASE) - | beqz NARGS8:RC, ->fff_fallback - |. load_got func - | sltiu AT, CARG3, LJ_TISNUM - | beqz AT, ->fff_fallback - |. nop - | call_extern - |. ldc1 FARG1, 0(BASE) - | b ->fff_resn - |. nop - |.endmacro - | - |.macro math_extern2, func - | .ffunc_nn math_ .. func - |. load_got func - | call_extern - |. nop - | b ->fff_resn - |. nop - |.endmacro - | - |.macro math_round, func - | .ffunc_n math_ .. func - |. nop - | bal ->vm_ .. func - |. nop - | b ->fff_resn - |. nop - |.endmacro - | - | math_round floor - | math_round ceil - | - |.ffunc math_log - | lw CARG3, HI(BASE) - | li AT, 8 - | bne NARGS8:RC, AT, ->fff_fallback // Exactly 1 argument. - |. load_got log - | sltiu AT, CARG3, LJ_TISNUM - | beqz AT, ->fff_fallback - |. nop - | call_extern - |. ldc1 FARG1, 0(BASE) - | b ->fff_resn - |. nop - | - | math_extern log10 - | math_extern exp - | math_extern sin - | math_extern cos - | math_extern tan - | math_extern asin - | math_extern acos - | math_extern atan - | math_extern sinh - | math_extern cosh - | math_extern tanh - | math_extern2 pow - | math_extern2 atan2 - | math_extern2 fmod - | - |.ffunc_n math_sqrt - |. sqrt.d FRET1, FARG1 - | b ->fff_resn - |. nop - | - |->ff_math_deg: - |.ffunc_n math_rad - |. ldc1 FARG2, CFUNC:RB->upvalue[0] - | b ->fff_resn - |. mul.d FRET1, FARG1, FARG2 - | - |.ffunc_nn math_ldexp - | cvt.w.d FARG2, FARG2 - | load_got ldexp - | mfc1 CARG3, FARG2 - | call_extern - |. nop - | b ->fff_resn - |. nop - | - |.ffunc_n math_frexp - | load_got frexp - | lw PC, FRAME_PC(BASE) - | call_extern - |. addiu CARG3, DISPATCH, DISPATCH_GL(tmptv) - | lw TMP1, DISPATCH_GL(tmptv)(DISPATCH) - | addiu RA, BASE, -8 - | mtc1 TMP1, FARG2 - | sdc1 FRET1, 0(RA) - | cvt.d.w FARG2, FARG2 - | sdc1 FARG2, 8(RA) - | b ->fff_res - |. li RD, (2+1)*8 - | - |.ffunc_n math_modf - | load_got modf - | lw PC, FRAME_PC(BASE) - | call_extern - |. addiu CARG3, BASE, -8 - | addiu RA, BASE, -8 - | sdc1 FRET1, 0(BASE) - | b ->fff_res - |. li RD, (2+1)*8 - | - |.macro math_minmax, name, ismax - |->ff_ .. name: - | lw CARG3, HI(BASE) - | beqz NARGS8:RC, ->fff_fallback - |. ldc1 FRET1, 0(BASE) - | sltiu AT, CARG3, LJ_TISNUM - | beqz AT, ->fff_fallback - |. addu TMP2, BASE, NARGS8:RC - | addiu TMP1, BASE, 8 - | beq TMP1, TMP2, ->fff_resn - |1: - |. lw CARG3, HI(TMP1) - | ldc1 FARG1, 0(TMP1) - | addiu TMP1, TMP1, 8 - | sltiu AT, CARG3, LJ_TISNUM - | beqz AT, ->fff_fallback - |.if ismax - |. c.olt.d FARG1, FRET1 - |.else - |. c.olt.d FRET1, FARG1 - |.endif - | bne TMP1, TMP2, <1 - |. movf.d FRET1, FARG1 - | b ->fff_resn - |. nop - |.endmacro - | - | math_minmax math_min, 0 - | math_minmax math_max, 1 - | - |//-- String library ----------------------------------------------------- - | - |.ffunc_1 string_len - | li AT, LJ_TSTR - | bne CARG3, AT, ->fff_fallback - |. nop - | b ->fff_resi - |. lw CRET1, STR:CARG1->len - | - |.ffunc string_byte // Only handle the 1-arg case here. - | lw CARG3, HI(BASE) - | lw STR:CARG1, LO(BASE) - | xori AT, NARGS8:RC, 8 - | addiu CARG3, CARG3, -LJ_TSTR - | or AT, AT, CARG3 - | bnez AT, ->fff_fallback // Need exactly 1 string argument. - |. nop - | lw TMP0, STR:CARG1->len - | lbu TMP1, STR:CARG1[1] // Access is always ok (NUL at end). - | addiu RA, BASE, -8 - | sltu RD, r0, TMP0 - | mtc1 TMP1, f0 - | addiu RD, RD, 1 - | cvt.d.w f0, f0 - | lw PC, FRAME_PC(BASE) - | sll RD, RD, 3 // RD = ((str->len != 0)+1)*8 - | b ->fff_res - |. sdc1 f0, 0(RA) - | - |.ffunc string_char // Only handle the 1-arg case here. - | ffgccheck - | lw CARG3, HI(BASE) - | ldc1 FARG1, 0(BASE) - | li AT, 8 - | bne NARGS8:RC, AT, ->fff_fallback // Exactly 1 argument. - |. sltiu AT, CARG3, LJ_TISNUM - | beqz AT, ->fff_fallback - |. li CARG3, 1 - | cvt.w.d FARG1, FARG1 - | addiu CARG2, sp, ARG5_OFS - | sltiu AT, TMP0, 256 - | mfc1 TMP0, FARG1 - | beqz AT, ->fff_fallback - |. sw TMP0, ARG5 - |->fff_newstr: - | load_got lj_str_new - | sw BASE, L->base - | sw PC, SAVE_PC - | call_intern lj_str_new // (lua_State *L, char *str, size_t l) - |. move CARG1, L - | // Returns GCstr *. - | lw BASE, L->base - | move CARG1, CRET1 - | b ->fff_restv - |. li CARG3, LJ_TSTR - | - |.ffunc string_sub - | ffgccheck - | addiu AT, NARGS8:RC, -16 - | lw CARG3, 16+HI(BASE) - | ldc1 f0, 16(BASE) - | lw TMP0, HI(BASE) - | lw STR:CARG1, LO(BASE) - | bltz AT, ->fff_fallback - | lw CARG2, 8+HI(BASE) - | ldc1 f2, 8(BASE) - | beqz AT, >1 - |. li CARG4, -1 - | cvt.w.d f0, f0 - | sltiu AT, CARG3, LJ_TISNUM - | beqz AT, ->fff_fallback - |. mfc1 CARG4, f0 - |1: - | sltiu AT, CARG2, LJ_TISNUM - | beqz AT, ->fff_fallback - |. li AT, LJ_TSTR - | cvt.w.d f2, f2 - | bne TMP0, AT, ->fff_fallback - |. lw CARG2, STR:CARG1->len - | mfc1 CARG3, f2 - | // STR:CARG1 = str, CARG2 = str->len, CARG3 = start, CARG4 = end - | slt AT, CARG4, r0 - | addiu TMP0, CARG2, 1 - | addu TMP1, CARG4, TMP0 - | slt TMP3, CARG3, r0 - | movn CARG4, TMP1, AT // if (end < 0) end += len+1 - | addu TMP1, CARG3, TMP0 - | movn CARG3, TMP1, TMP3 // if (start < 0) start += len+1 - | li TMP2, 1 - | slt AT, CARG4, r0 - | slt TMP3, r0, CARG3 - | movn CARG4, r0, AT // if (end < 0) end = 0 - | movz CARG3, TMP2, TMP3 // if (start < 1) start = 1 - | slt AT, CARG2, CARG4 - | movn CARG4, CARG2, AT // if (end > len) end = len - | addu CARG2, STR:CARG1, CARG3 - | subu CARG3, CARG4, CARG3 // len = end - start - | addiu CARG2, CARG2, sizeof(GCstr)-1 - | bgez CARG3, ->fff_newstr - |. addiu CARG3, CARG3, 1 // len++ - |->fff_emptystr: // Return empty string. - | addiu STR:CARG1, DISPATCH, DISPATCH_GL(strempty) - | b ->fff_restv - |. li CARG3, LJ_TSTR - | - |.ffunc string_rep // Only handle the 1-char case inline. - | ffgccheck - | lw TMP0, HI(BASE) - | addiu AT, NARGS8:RC, -16 // Exactly 2 arguments. - | lw CARG4, 8+HI(BASE) - | lw STR:CARG1, LO(BASE) - | addiu TMP0, TMP0, -LJ_TSTR - | ldc1 f0, 8(BASE) - | or AT, AT, TMP0 - | bnez AT, ->fff_fallback - |. sltiu AT, CARG4, LJ_TISNUM - | cvt.w.d f0, f0 - | beqz AT, ->fff_fallback - |. lw TMP0, STR:CARG1->len - | mfc1 CARG3, f0 - | lw TMP1, DISPATCH_GL(tmpbuf.sz)(DISPATCH) - | li AT, 1 - | blez CARG3, ->fff_emptystr // Count <= 0? - |. sltu AT, AT, TMP0 - | beqz TMP0, ->fff_emptystr // Zero length string? - |. sltu TMP0, TMP1, CARG3 - | or AT, AT, TMP0 - | lw CARG2, DISPATCH_GL(tmpbuf.buf)(DISPATCH) - | bnez AT, ->fff_fallback // Fallback for > 1-char strings. - |. lbu TMP0, STR:CARG1[1] - | addu TMP2, CARG2, CARG3 - |1: // Fill buffer with char. Yes, this is suboptimal code (do you care?). - | addiu TMP2, TMP2, -1 - | sltu AT, CARG2, TMP2 - | bnez AT, <1 - |. sb TMP0, 0(TMP2) - | b ->fff_newstr - |. nop - | - |.ffunc string_reverse - | ffgccheck - | lw CARG3, HI(BASE) - | lw STR:CARG1, LO(BASE) - | beqz NARGS8:RC, ->fff_fallback - |. li AT, LJ_TSTR - | bne CARG3, AT, ->fff_fallback - |. lw TMP1, DISPATCH_GL(tmpbuf.sz)(DISPATCH) - | lw CARG3, STR:CARG1->len - | addiu CARG1, STR:CARG1, #STR - | lw CARG2, DISPATCH_GL(tmpbuf.buf)(DISPATCH) - | sltu AT, TMP1, CARG3 - | bnez AT, ->fff_fallback - |. addu TMP3, CARG1, CARG3 - | addu CARG4, CARG2, CARG3 - |1: // Reverse string copy. - | lbu TMP1, 0(CARG1) - | sltu AT, CARG1, TMP3 - | beqz AT, ->fff_newstr - |. addiu CARG1, CARG1, 1 - | addiu CARG4, CARG4, -1 - | b <1 - | sb TMP1, 0(CARG4) - | - |.macro ffstring_case, name, lo - | .ffunc name - | ffgccheck - | lw CARG3, HI(BASE) - | lw STR:CARG1, LO(BASE) - | beqz NARGS8:RC, ->fff_fallback - |. li AT, LJ_TSTR - | bne CARG3, AT, ->fff_fallback - |. lw TMP1, DISPATCH_GL(tmpbuf.sz)(DISPATCH) - | lw CARG3, STR:CARG1->len - | addiu CARG1, STR:CARG1, #STR - | lw CARG2, DISPATCH_GL(tmpbuf.buf)(DISPATCH) - | sltu AT, TMP1, CARG3 - | bnez AT, ->fff_fallback - |. addu TMP3, CARG1, CARG3 - | move CARG4, CARG2 - |1: // ASCII case conversion. - | lbu TMP1, 0(CARG1) - | sltu AT, CARG1, TMP3 - | beqz AT, ->fff_newstr - |. addiu TMP0, TMP1, -lo - | xori TMP2, TMP1, 0x20 - | sltiu AT, TMP0, 26 - | movn TMP1, TMP2, AT - | addiu CARG1, CARG1, 1 - | sb TMP1, 0(CARG4) - | b <1 - |. addiu CARG4, CARG4, 1 - |.endmacro - | - |ffstring_case string_lower, 65 - |ffstring_case string_upper, 97 - | - |//-- Table library ------------------------------------------------------ - | - |.ffunc_1 table_getn - | li AT, LJ_TTAB - | bne CARG3, AT, ->fff_fallback - |. load_got lj_tab_len - | call_intern lj_tab_len // (GCtab *t) - |. nop - | // Returns uint32_t (but less than 2^31). - | b ->fff_resi - |. nop - | - |//-- Bit library -------------------------------------------------------- - | - |.macro .ffunc_bit, name - | .ffunc_n bit_..name - |. add.d FARG1, FARG1, TOBIT - | mfc1 CRET1, FARG1 - |.endmacro - | - |.macro .ffunc_bit_op, name, ins - | .ffunc_bit name - | addiu TMP1, BASE, 8 - | addu TMP2, BASE, NARGS8:RC - |1: - | lw CARG4, HI(TMP1) - | beq TMP1, TMP2, ->fff_resi - |. ldc1 FARG1, 0(TMP1) - | sltiu AT, CARG4, LJ_TISNUM - | beqz AT, ->fff_fallback - | add.d FARG1, FARG1, TOBIT - | mfc1 CARG2, FARG1 - | ins CRET1, CRET1, CARG2 - | b <1 - |. addiu TMP1, TMP1, 8 - |.endmacro - | - |.ffunc_bit_op band, and - |.ffunc_bit_op bor, or - |.ffunc_bit_op bxor, xor - | - |.ffunc_bit bswap - | srl TMP0, CRET1, 24 - | srl TMP2, CRET1, 8 - | sll TMP1, CRET1, 24 - | andi TMP2, TMP2, 0xff00 - | or TMP0, TMP0, TMP1 - | andi CRET1, CRET1, 0xff00 - | or TMP0, TMP0, TMP2 - | sll CRET1, CRET1, 8 - | b ->fff_resi - |. or CRET1, TMP0, CRET1 - | - |.ffunc_bit bnot - | b ->fff_resi - |. not CRET1, CRET1 - | - |.macro .ffunc_bit_sh, name, ins, shmod - | .ffunc_nn bit_..name - |. add.d FARG1, FARG1, TOBIT - | add.d FARG2, FARG2, TOBIT - | mfc1 CARG1, FARG1 - | mfc1 CARG2, FARG2 - |.if shmod == 1 - | li AT, 32 - | subu TMP0, AT, CARG2 - | sllv CARG2, CARG1, CARG2 - | srlv CARG1, CARG1, TMP0 - |.elif shmod == 2 - | li AT, 32 - | subu TMP0, AT, CARG2 - | srlv CARG2, CARG1, CARG2 - | sllv CARG1, CARG1, TMP0 - |.endif - | b ->fff_resi - |. ins CRET1, CARG1, CARG2 - |.endmacro - | - |.ffunc_bit_sh lshift, sllv, 0 - |.ffunc_bit_sh rshift, srlv, 0 - |.ffunc_bit_sh arshift, srav, 0 - |// Can't use rotrv, since it's only in MIPS32R2. - |.ffunc_bit_sh rol, or, 1 - |.ffunc_bit_sh ror, or, 2 - | - |.ffunc_bit tobit - |->fff_resi: - | mtc1 CRET1, FRET1 - | b ->fff_resn - |. cvt.d.w FRET1, FRET1 - | - |//----------------------------------------------------------------------- - | - |->fff_fallback: // Call fast function fallback handler. - | // BASE = new base, RB = CFUNC, RC = nargs*8 - | lw TMP3, CFUNC:RB->f - | addu TMP1, BASE, NARGS8:RC - | lw PC, FRAME_PC(BASE) // Fallback may overwrite PC. - | addiu TMP0, TMP1, 8*LUA_MINSTACK - | lw TMP2, L->maxstack - | sw PC, SAVE_PC // Redundant (but a defined value). - | sltu AT, TMP2, TMP0 - | sw BASE, L->base - | sw TMP1, L->top - | bnez AT, >5 // Need to grow stack. - |. move CFUNCADDR, TMP3 - | jalr TMP3 // (lua_State *L) - |. move CARG1, L - | // Either throws an error, or recovers and returns -1, 0 or nresults+1. - | lw BASE, L->base - | sll RD, CRET1, 3 - | bgtz CRET1, ->fff_res // Returned nresults+1? - |. addiu RA, BASE, -8 - |1: // Returned 0 or -1: retry fast path. - | lw TMP0, L->top - | lw LFUNC:RB, FRAME_FUNC(BASE) - | bnez CRET1, ->vm_call_tail // Returned -1? - |. subu NARGS8:RC, TMP0, BASE - | ins_callt // Returned 0: retry fast path. - | - |// Reconstruct previous base for vmeta_call during tailcall. - |->vm_call_tail: - | andi TMP0, PC, FRAME_TYPE - | li AT, -4 - | bnez TMP0, >3 - |. and TMP1, PC, AT - | lbu TMP1, OFS_RA(PC) - | sll TMP1, TMP1, 3 - | addiu TMP1, TMP1, 8 - |3: - | b ->vm_call_dispatch // Resolve again for tailcall. - |. subu TMP2, BASE, TMP1 - | - |5: // Grow stack for fallback handler. - | load_got lj_state_growstack - | li CARG2, LUA_MINSTACK - | call_intern lj_state_growstack // (lua_State *L, int n) - |. move CARG1, L - | lw BASE, L->base - | b <1 - |. li CRET1, 0 // Force retry. - | - |->fff_gcstep: // Call GC step function. - | // BASE = new base, RC = nargs*8 - | move MULTRES, ra - | load_got lj_gc_step - | sw BASE, L->base - | addu TMP0, BASE, NARGS8:RC - | sw PC, SAVE_PC // Redundant (but a defined value). - | sw TMP0, L->top - | call_intern lj_gc_step // (lua_State *L) - |. move CARG1, L - | lw BASE, L->base - | move ra, MULTRES - | lw TMP0, L->top - | lw CFUNC:RB, FRAME_FUNC(BASE) - | jr ra - |. subu NARGS8:RC, TMP0, BASE - | - |//----------------------------------------------------------------------- - |//-- Special dispatch targets ------------------------------------------- - |//----------------------------------------------------------------------- - | - |->vm_record: // Dispatch target for recording phase. - |.if JIT - | lbu TMP3, DISPATCH_GL(hookmask)(DISPATCH) - | andi AT, TMP3, HOOK_VMEVENT // No recording while in vmevent. - | bnez AT, >5 - | // Decrement the hookcount for consistency, but always do the call. - |. lw TMP2, DISPATCH_GL(hookcount)(DISPATCH) - | andi AT, TMP3, HOOK_ACTIVE - | bnez AT, >1 - |. addiu TMP2, TMP2, -1 - | andi AT, TMP3, LUA_MASKLINE|LUA_MASKCOUNT - | beqz AT, >1 - |. nop - | b >1 - |. sw TMP2, DISPATCH_GL(hookcount)(DISPATCH) - |.endif - | - |->vm_rethook: // Dispatch target for return hooks. - | lbu TMP3, DISPATCH_GL(hookmask)(DISPATCH) - | andi AT, TMP3, HOOK_ACTIVE // Hook already active? - | beqz AT, >1 - |5: // Re-dispatch to static ins. - |. lw AT, GG_DISP2STATIC(TMP0) // Assumes TMP0 holds DISPATCH+OP*4. - | jr AT - |. nop - | - |->vm_inshook: // Dispatch target for instr/line hooks. - | lbu TMP3, DISPATCH_GL(hookmask)(DISPATCH) - | lw TMP2, DISPATCH_GL(hookcount)(DISPATCH) - | andi AT, TMP3, HOOK_ACTIVE // Hook already active? - | bnez AT, <5 - |. andi AT, TMP3, LUA_MASKLINE|LUA_MASKCOUNT - | beqz AT, <5 - |. addiu TMP2, TMP2, -1 - | beqz TMP2, >1 - |. sw TMP2, DISPATCH_GL(hookcount)(DISPATCH) - | andi AT, TMP3, LUA_MASKLINE - | beqz AT, <5 - |1: - |. load_got lj_dispatch_ins - | sw MULTRES, SAVE_MULTRES - | move CARG2, PC - | sw BASE, L->base - | // SAVE_PC must hold the _previous_ PC. The callee updates it with PC. - | call_intern lj_dispatch_ins // (lua_State *L, const BCIns *pc) - |. move CARG1, L - |3: - | lw BASE, L->base - |4: // Re-dispatch to static ins. - | lw INS, -4(PC) - | decode_OP4a TMP1, INS - | decode_OP4b TMP1 - | addu TMP0, DISPATCH, TMP1 - | decode_RD8a RD, INS - | lw AT, GG_DISP2STATIC(TMP0) - | decode_RA8a RA, INS - | decode_RD8b RD - | jr AT - | decode_RA8b RA - | - |->cont_hook: // Continue from hook yield. - | addiu PC, PC, 4 - | b <4 - |. lw MULTRES, -24+LO(RB) // Restore MULTRES for *M ins. - | - |->vm_hotloop: // Hot loop counter underflow. - |.if JIT - | lw LFUNC:TMP1, FRAME_FUNC(BASE) - | addiu CARG1, DISPATCH, GG_DISP2J - | sw PC, SAVE_PC - | lw TMP1, LFUNC:TMP1->pc - | move CARG2, PC - | sw L, DISPATCH_J(L)(DISPATCH) - | lbu TMP1, PC2PROTO(framesize)(TMP1) - | load_got lj_trace_hot - | sw BASE, L->base - | sll TMP1, TMP1, 3 - | addu TMP1, BASE, TMP1 - | call_intern lj_trace_hot // (jit_State *J, const BCIns *pc) - |. sw TMP1, L->top - | b <3 - |. nop - |.endif - | - |->vm_callhook: // Dispatch target for call hooks. - |.if JIT - | b >1 - |.endif - |. move CARG2, PC - | - |->vm_hotcall: // Hot call counter underflow. - |.if JIT - | ori CARG2, PC, 1 - |1: - |.endif - | load_got lj_dispatch_call - | addu TMP0, BASE, RC - | sw PC, SAVE_PC - | sw BASE, L->base - | subu RA, RA, BASE - | sw TMP0, L->top - | call_intern lj_dispatch_call // (lua_State *L, const BCIns *pc) - |. move CARG1, L - | // Returns ASMFunction. - | lw BASE, L->base - | lw TMP0, L->top - | sw r0, SAVE_PC // Invalidate for subsequent line hook. - | subu NARGS8:RC, TMP0, BASE - | addu RA, BASE, RA - | lw LFUNC:RB, FRAME_FUNC(BASE) - | jr CRET1 - |. lw INS, -4(PC) - | - |//----------------------------------------------------------------------- - |//-- Trace exit handler ------------------------------------------------- - |//----------------------------------------------------------------------- - | - |.macro savex_, a, b - | sdc1 f..a, 16+a*8(sp) - | sw r..a, 16+32*8+a*4(sp) - | sw r..b, 16+32*8+b*4(sp) - |.endmacro - | - |->vm_exit_handler: - |.if JIT - | addiu sp, sp, -(16+32*8+32*4) - | savex_ 0, 1 - | savex_ 2, 3 - | savex_ 4, 5 - | savex_ 6, 7 - | savex_ 8, 9 - | savex_ 10, 11 - | savex_ 12, 13 - | savex_ 14, 15 - | savex_ 16, 17 - | savex_ 18, 19 - | savex_ 20, 21 - | savex_ 22, 23 - | savex_ 24, 25 - | savex_ 26, 27 - | sdc1 f28, 16+28*8(sp) - | sw r28, 16+32*8+28*4(sp) - | sdc1 f30, 16+30*8(sp) - | sw r30, 16+32*8+30*4(sp) - | sw r0, 16+32*8+31*4(sp) // Clear RID_TMP. - | li_vmstate EXIT - | addiu TMP2, sp, 16+32*8+32*4 // Recompute original value of sp. - | addiu DISPATCH, JGL, -GG_DISP2G-32768 - | lw TMP1, 0(TMP2) // Load exit number. - | st_vmstate - | sw TMP2, 16+32*8+29*4(sp) // Store sp in RID_SP. - | lw L, DISPATCH_GL(jit_L)(DISPATCH) - | lw BASE, DISPATCH_GL(jit_base)(DISPATCH) - | load_got lj_trace_exit - | sw L, DISPATCH_J(L)(DISPATCH) - | sw ra, DISPATCH_J(parent)(DISPATCH) // Store trace number. - | sw TMP1, DISPATCH_J(exitno)(DISPATCH) // Store exit number. - | addiu CARG1, DISPATCH, GG_DISP2J - | sw BASE, L->base - | call_intern lj_trace_exit // (jit_State *J, ExitState *ex) - |. addiu CARG2, sp, 16 - | // Returns MULTRES (unscaled) or negated error code. - | lw TMP1, L->cframe - | li AT, -4 - | lw BASE, L->base - | and sp, TMP1, AT - | lw PC, SAVE_PC // Get SAVE_PC. - | b >1 - |. sw L, SAVE_L // Set SAVE_L (on-trace resume/yield). - |.endif - |->vm_exit_interp: - |.if JIT - | // CRET1 = MULTRES or negated error code, BASE, PC and JGL set. - | lw L, SAVE_L - | addiu DISPATCH, JGL, -GG_DISP2G-32768 - |1: - | bltz CRET1, >3 // Check for error from exit. - |. lw LFUNC:TMP1, FRAME_FUNC(BASE) - | lui TMP3, 0x59c0 // TOBIT = 2^52 + 2^51 (float). - | sll MULTRES, CRET1, 3 - | li TISNIL, LJ_TNIL - | sw MULTRES, SAVE_MULTRES - | mtc1 TMP3, TOBIT - | lw TMP1, LFUNC:TMP1->pc - | sw r0, DISPATCH_GL(jit_L)(DISPATCH) - | lw KBASE, PC2PROTO(k)(TMP1) - | cvt.d.s TOBIT, TOBIT - | // Modified copy of ins_next which handles function header dispatch, too. - | lw INS, 0(PC) - | addiu PC, PC, 4 - | // Assumes TISNIL == ~LJ_VMST_INTERP == -1 - | sw TISNIL, DISPATCH_GL(vmstate)(DISPATCH) - | decode_OP4a TMP1, INS - | decode_OP4b TMP1 - | sltiu TMP2, TMP1, BC_FUNCF*4 // Function header? - | addu TMP0, DISPATCH, TMP1 - | decode_RD8a RD, INS - | lw AT, 0(TMP0) - | decode_RA8a RA, INS - | beqz TMP2, >2 - |. decode_RA8b RA - | jr AT - |. decode_RD8b RD - |2: - | addiu RC, MULTRES, -8 - | jr AT - |. addu RA, RA, BASE - | - |3: // Rethrow error from the right C frame. - | load_got lj_err_throw - | negu CARG2, CRET1 - | call_intern lj_err_throw // (lua_State *L, int errcode) - |. move CARG1, L - |.endif - | - |//----------------------------------------------------------------------- - |//-- Math helper functions ---------------------------------------------- - |//----------------------------------------------------------------------- - | - |// Modifies AT, TMP0, FRET1, FRET2, f4. Keeps all others incl. FARG1. - |.macro vm_round, func - | lui TMP0, 0x4330 // Hiword of 2^52 (double). - | mtc1 r0, f4 - | mtc1 TMP0, f5 - | abs.d FRET2, FARG1 // |x| - | mfc1 AT, f13 - | c.olt.d 0, FRET2, f4 - | add.d FRET1, FRET2, f4 // (|x| + 2^52) - 2^52 - | bc1f 0, >1 // Truncate only if |x| < 2^52. - |. sub.d FRET1, FRET1, f4 - | slt AT, AT, r0 - |.if "func" == "ceil" - | lui TMP0, 0xbff0 // Hiword of -1 (double). Preserves -0. - |.else - | lui TMP0, 0x3ff0 // Hiword of +1 (double). - |.endif - |.if "func" == "trunc" - | mtc1 TMP0, f5 - | c.olt.d 0, FRET2, FRET1 // |x| < result? - | sub.d FRET2, FRET1, f4 - | movt.d FRET1, FRET2, 0 // If yes, subtract +1. - | neg.d FRET2, FRET1 - | jr ra - |. movn.d FRET1, FRET2, AT // Merge sign bit back in. - |.else - | neg.d FRET2, FRET1 - | mtc1 TMP0, f5 - | movn.d FRET1, FRET2, AT // Merge sign bit back in. - |.if "func" == "ceil" - | c.olt.d 0, FRET1, FARG1 // x > result? - |.else - | c.olt.d 0, FARG1, FRET1 // x < result? - |.endif - | sub.d FRET2, FRET1, f4 // If yes, subtract +-1. - | jr ra - |. movt.d FRET1, FRET2, 0 - |.endif - |1: - | jr ra - |. mov.d FRET1, FARG1 - |.endmacro - | - |->vm_floor: - | vm_round floor - |->vm_ceil: - | vm_round ceil - |->vm_trunc: - |.if JIT - | vm_round trunc - |.endif - | - |//----------------------------------------------------------------------- - |//-- Miscellaneous functions -------------------------------------------- - |//----------------------------------------------------------------------- - | - |//----------------------------------------------------------------------- - |//-- FFI helper functions ----------------------------------------------- - |//----------------------------------------------------------------------- - | - |// Handler for callback functions. Callback slot number in r1, g in r2. - |->vm_ffi_callback: - |.if FFI - |.type CTSTATE, CTState, PC - | saveregs - | lw CTSTATE, GL:r2->ctype_state - | addiu DISPATCH, r2, GG_G2DISP - | load_got lj_ccallback_enter - | sw r1, CTSTATE->cb.slot - | sw CARG1, CTSTATE->cb.gpr[0] - | sw CARG2, CTSTATE->cb.gpr[1] - | sdc1 FARG1, CTSTATE->cb.fpr[0] - | sw CARG3, CTSTATE->cb.gpr[2] - | sw CARG4, CTSTATE->cb.gpr[3] - | sdc1 FARG2, CTSTATE->cb.fpr[1] - | addiu TMP0, sp, CFRAME_SPACE+16 - | sw TMP0, CTSTATE->cb.stack - | sw r0, SAVE_PC // Any value outside of bytecode is ok. - | move CARG2, sp - | call_intern lj_ccallback_enter // (CTState *cts, void *cf) - |. move CARG1, CTSTATE - | // Returns lua_State *. - | lw BASE, L:CRET1->base - | lw RC, L:CRET1->top - | move L, CRET1 - | lui TMP3, 0x59c0 // TOBIT = 2^52 + 2^51 (float). - | lw LFUNC:RB, FRAME_FUNC(BASE) - | mtc1 TMP3, TOBIT - | li_vmstate INTERP - | li TISNIL, LJ_TNIL - | subu RC, RC, BASE - | st_vmstate - | cvt.d.s TOBIT, TOBIT - | ins_callt - |.endif - | - |->cont_ffi_callback: // Return from FFI callback. - |.if FFI - | load_got lj_ccallback_leave - | lw CTSTATE, DISPATCH_GL(ctype_state)(DISPATCH) - | sw BASE, L->base - | sw RB, L->top - | sw L, CTSTATE->L - | move CARG2, RA - | call_intern lj_ccallback_leave // (CTState *cts, TValue *o) - |. move CARG1, CTSTATE - | lw CRET1, CTSTATE->cb.gpr[0] - | ldc1 FRET1, CTSTATE->cb.fpr[0] - | lw CRET2, CTSTATE->cb.gpr[1] - | b ->vm_leave_unw - |. ldc1 FRET2, CTSTATE->cb.fpr[1] - |.endif - | - |->vm_ffi_call: // Call C function via FFI. - | // Caveat: needs special frame unwinding, see below. - |.if FFI - | .type CCSTATE, CCallState, CARG1 - | lw TMP1, CCSTATE->spadj - | lbu CARG2, CCSTATE->nsp - | move TMP2, sp - | subu sp, sp, TMP1 - | sw ra, -4(TMP2) - | sll CARG2, CARG2, 2 - | sw r16, -8(TMP2) - | sw CCSTATE, -12(TMP2) - | move r16, TMP2 - | addiu TMP1, CCSTATE, offsetof(CCallState, stack) - | addiu TMP2, sp, 16 - | beqz CARG2, >2 - |. addu TMP3, TMP1, CARG2 - |1: - | lw TMP0, 0(TMP1) - | addiu TMP1, TMP1, 4 - | sltu AT, TMP1, TMP3 - | sw TMP0, 0(TMP2) - | bnez AT, <1 - |. addiu TMP2, TMP2, 4 - |2: - | lw CFUNCADDR, CCSTATE->func - | lw CARG2, CCSTATE->gpr[1] - | lw CARG3, CCSTATE->gpr[2] - | lw CARG4, CCSTATE->gpr[3] - | ldc1 FARG1, CCSTATE->fpr[0] - | ldc1 FARG2, CCSTATE->fpr[1] - | jalr CFUNCADDR - |. lw CARG1, CCSTATE->gpr[0] // Do this last, since CCSTATE is CARG1. - | lw CCSTATE:TMP1, -12(r16) - | lw TMP2, -8(r16) - | lw ra, -4(r16) - | sw CRET1, CCSTATE:TMP1->gpr[0] - | sw CRET2, CCSTATE:TMP1->gpr[1] - | sdc1 FRET1, CCSTATE:TMP1->fpr[0] - | sdc1 FRET2, CCSTATE:TMP1->fpr[1] - | move sp, r16 - | jr ra - |. move r16, TMP2 - |.endif - |// Note: vm_ffi_call must be the last function in this object file! - | - |//----------------------------------------------------------------------- -} - -/* Generate the code for a single instruction. */ -static void build_ins(BuildCtx *ctx, BCOp op, int defop) -{ - int vk = 0; - |=>defop: - - switch (op) { - - /* -- Comparison ops ---------------------------------------------------- */ - - /* Remember: all ops branch for a true comparison, fall through otherwise. */ - - case BC_ISLT: case BC_ISGE: case BC_ISLE: case BC_ISGT: - | // RA = src1*8, RD = src2*8, JMP with RD = target - | addu CARG2, BASE, RA - | addu CARG3, BASE, RD - | lw TMP0, HI(CARG2) - | lw TMP1, HI(CARG3) - | ldc1 f0, 0(CARG2) - | ldc1 f2, 0(CARG3) - | sltiu TMP0, TMP0, LJ_TISNUM - | sltiu TMP1, TMP1, LJ_TISNUM - | lhu TMP2, OFS_RD(PC) - | and TMP0, TMP0, TMP1 - | addiu PC, PC, 4 - | beqz TMP0, ->vmeta_comp - |. lui TMP1, (-(BCBIAS_J*4 >> 16) & 65535) - | decode_RD4b TMP2 - | addu TMP2, TMP2, TMP1 - if (op == BC_ISLT || op == BC_ISGE) { - | c.olt.d f0, f2 - } else { - | c.ole.d f0, f2 - } - if (op == BC_ISLT || op == BC_ISLE) { - | movf TMP2, r0 - } else { - | movt TMP2, r0 - } - | addu PC, PC, TMP2 - |1: - | ins_next - break; - - case BC_ISEQV: case BC_ISNEV: - vk = op == BC_ISEQV; - | // RA = src1*8, RD = src2*8, JMP with RD = target - | addu RA, BASE, RA - | addiu PC, PC, 4 - | lw TMP0, HI(RA) - | ldc1 f0, 0(RA) - | addu RD, BASE, RD - | lhu TMP2, -4+OFS_RD(PC) - | lw TMP1, HI(RD) - | ldc1 f2, 0(RD) - | lui TMP3, (-(BCBIAS_J*4 >> 16) & 65535) - | sltiu AT, TMP0, LJ_TISNUM - | sltiu CARG1, TMP1, LJ_TISNUM - | decode_RD4b TMP2 - | and AT, AT, CARG1 - | beqz AT, >5 - |. addu TMP2, TMP2, TMP3 - | c.eq.d f0, f2 - if (vk) { - | movf TMP2, r0 - } else { - | movt TMP2, r0 - } - |1: - | addu PC, PC, TMP2 - | ins_next - |5: // Either or both types are not numbers. - | lw CARG2, LO(RA) - | lw CARG3, LO(RD) - |.if FFI - | li TMP3, LJ_TCDATA - | beq TMP0, TMP3, ->vmeta_equal_cd - |.endif - |. sltiu AT, TMP0, LJ_TISPRI // Not a primitive? - |.if FFI - | beq TMP1, TMP3, ->vmeta_equal_cd - |.endif - |. xor TMP3, CARG2, CARG3 // Same tv? - | xor TMP1, TMP1, TMP0 // Same type? - | sltiu CARG1, TMP0, LJ_TISTABUD+1 // Table or userdata? - | movz TMP3, r0, AT // Ignore tv if primitive. - | movn CARG1, r0, TMP1 // Tab/ud and same type? - | or AT, TMP1, TMP3 // Same type && (pri||same tv). - | movz CARG1, r0, AT - | beqz CARG1, <1 // Done if not tab/ud or not same type or same tv. - if (vk) { - |. movn TMP2, r0, AT - } else { - |. movz TMP2, r0, AT - } - | // Different tables or userdatas. Need to check __eq metamethod. - | // Field metatable must be at same offset for GCtab and GCudata! - | lw TAB:TMP1, TAB:CARG2->metatable - | beqz TAB:TMP1, <1 // No metatable? - |. nop - | lbu TMP1, TAB:TMP1->nomm - | andi TMP1, TMP1, 1<vmeta_equal // Handle __eq metamethod. - |. li CARG4, 1-vk // ne = 0 or 1. - break; - - case BC_ISEQS: case BC_ISNES: - vk = op == BC_ISEQS; - | // RA = src*8, RD = str_const*8 (~), JMP with RD = target - | addu RA, BASE, RA - | addiu PC, PC, 4 - | lw TMP0, HI(RA) - | srl RD, RD, 1 - | lw STR:TMP3, LO(RA) - | subu RD, KBASE, RD - | lhu TMP2, -4+OFS_RD(PC) - |.if FFI - | li AT, LJ_TCDATA - | beq TMP0, AT, ->vmeta_equal_cd - |.endif - |. lw STR:TMP1, -4(RD) // KBASE-4-str_const*4 - | addiu TMP0, TMP0, -LJ_TSTR - | decode_RD4b TMP2 - | xor TMP1, STR:TMP1, STR:TMP3 - | or TMP0, TMP0, TMP1 - | lui TMP3, (-(BCBIAS_J*4 >> 16) & 65535) - | addu TMP2, TMP2, TMP3 - if (vk) { - | movn TMP2, r0, TMP0 - } else { - | movz TMP2, r0, TMP0 - } - | addu PC, PC, TMP2 - | ins_next - break; - - case BC_ISEQN: case BC_ISNEN: - vk = op == BC_ISEQN; - | // RA = src*8, RD = num_const*8, JMP with RD = target - | addu RA, BASE, RA - | addiu PC, PC, 4 - | lw TMP0, HI(RA) - | ldc1 f0, 0(RA) - | addu RD, KBASE, RD - | lhu TMP2, -4+OFS_RD(PC) - | ldc1 f2, 0(RD) - | lui TMP3, (-(BCBIAS_J*4 >> 16) & 65535) - | sltiu AT, TMP0, LJ_TISNUM - | decode_RD4b TMP2 - |.if FFI - | beqz AT, >5 - |.else - | beqz AT, >1 - |.endif - |. addu TMP2, TMP2, TMP3 - | c.eq.d f0, f2 - if (vk) { - | movf TMP2, r0 - | addu PC, PC, TMP2 - |1: - } else { - | movt TMP2, r0 - |1: - | addu PC, PC, TMP2 - } - | ins_next - |.if FFI - |5: - | li AT, LJ_TCDATA - | beq TMP0, AT, ->vmeta_equal_cd - |. nop - | b <1 - |. nop - |.endif - break; - - case BC_ISEQP: case BC_ISNEP: - vk = op == BC_ISEQP; - | // RA = src*8, RD = primitive_type*8 (~), JMP with RD = target - | addu RA, BASE, RA - | srl TMP1, RD, 3 - | lw TMP0, HI(RA) - | lhu TMP2, OFS_RD(PC) - | not TMP1, TMP1 - | addiu PC, PC, 4 - |.if FFI - | li AT, LJ_TCDATA - | beq TMP0, AT, ->vmeta_equal_cd - |.endif - |. xor TMP0, TMP0, TMP1 - | decode_RD4b TMP2 - | lui TMP3, (-(BCBIAS_J*4 >> 16) & 65535) - | addu TMP2, TMP2, TMP3 - if (vk) { - | movn TMP2, r0, TMP0 - } else { - | movz TMP2, r0, TMP0 - } - | addu PC, PC, TMP2 - | ins_next - break; - - /* -- Unary test and copy ops ------------------------------------------- */ - - case BC_ISTC: case BC_ISFC: case BC_IST: case BC_ISF: - | // RA = dst*8 or unused, RD = src*8, JMP with RD = target - | addu RD, BASE, RD - | lhu TMP2, OFS_RD(PC) - | lw TMP0, HI(RD) - | addiu PC, PC, 4 - if (op == BC_IST || op == BC_ISF) { - | sltiu TMP0, TMP0, LJ_TISTRUECOND - | decode_RD4b TMP2 - | lui TMP3, (-(BCBIAS_J*4 >> 16) & 65535) - | addu TMP2, TMP2, TMP3 - if (op == BC_IST) { - | movz TMP2, r0, TMP0 - } else { - | movn TMP2, r0, TMP0 - } - | addu PC, PC, TMP2 - } else { - | sltiu TMP0, TMP0, LJ_TISTRUECOND - | ldc1 f0, 0(RD) - if (op == BC_ISTC) { - | beqz TMP0, >1 - } else { - | bnez TMP0, >1 - } - |. addu RA, BASE, RA - | decode_RD4b TMP2 - | lui TMP3, (-(BCBIAS_J*4 >> 16) & 65535) - | addu TMP2, TMP2, TMP3 - | sdc1 f0, 0(RA) - | addu PC, PC, TMP2 - |1: - } - | ins_next - break; - - /* -- Unary ops --------------------------------------------------------- */ - - case BC_MOV: - | // RA = dst*8, RD = src*8 - | addu RD, BASE, RD - | addu RA, BASE, RA - | ldc1 f0, 0(RD) - | ins_next1 - | sdc1 f0, 0(RA) - | ins_next2 - break; - case BC_NOT: - | // RA = dst*8, RD = src*8 - | addu RD, BASE, RD - | addu RA, BASE, RA - | lw TMP0, HI(RD) - | li TMP1, LJ_TFALSE - | sltiu TMP0, TMP0, LJ_TISTRUECOND - | addiu TMP1, TMP0, LJ_TTRUE - | ins_next1 - | sw TMP1, HI(RA) - | ins_next2 - break; - case BC_UNM: - | // RA = dst*8, RD = src*8 - | addu CARG3, BASE, RD - | addu RA, BASE, RA - | lw TMP0, HI(CARG3) - | ldc1 f0, 0(CARG3) - | sltiu AT, TMP0, LJ_TISNUM - | beqz AT, ->vmeta_unm - |. neg.d f0, f0 - | ins_next1 - | sdc1 f0, 0(RA) - | ins_next2 - break; - case BC_LEN: - | // RA = dst*8, RD = src*8 - | addu CARG2, BASE, RD - | addu RA, BASE, RA - | lw TMP0, HI(CARG2) - | lw CARG1, LO(CARG2) - | li AT, LJ_TSTR - | bne TMP0, AT, >2 - |. li AT, LJ_TTAB - | lw CRET1, STR:CARG1->len - |1: - | mtc1 CRET1, f0 - | cvt.d.w f0, f0 - | ins_next1 - | sdc1 f0, 0(RA) - | ins_next2 - |2: - | bne TMP0, AT, ->vmeta_len - |. nop -#if LJ_52 - | lw TAB:TMP2, TAB:CARG1->metatable - | bnez TAB:TMP2, >9 - |. nop - |3: -#endif - |->BC_LEN_Z: - | load_got lj_tab_len - | call_intern lj_tab_len // (GCtab *t) - |. nop - | // Returns uint32_t (but less than 2^31). - | b <1 - |. nop -#if LJ_52 - |9: - | lbu TMP0, TAB:TMP2->nomm - | andi TMP0, TMP0, 1<vmeta_len - |. nop -#endif - break; - - /* -- Binary ops -------------------------------------------------------- */ - - |.macro ins_arithpre - ||vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN); - | decode_RB8a RB, INS - | decode_RB8b RB - | decode_RDtoRC8 RC, RD - | // RA = dst*8, RB = src1*8, RC = src2*8 | num_const*8 - ||switch (vk) { - ||case 0: - | addu CARG3, BASE, RB - | addu CARG4, KBASE, RC - | lw TMP1, HI(CARG3) - | ldc1 f20, 0(CARG3) - | ldc1 f22, 0(CARG4) - | sltiu AT, TMP1, LJ_TISNUM - || break; - ||case 1: - | addu CARG4, BASE, RB - | addu CARG3, KBASE, RC - | lw TMP1, HI(CARG4) - | ldc1 f22, 0(CARG4) - | ldc1 f20, 0(CARG3) - | sltiu AT, TMP1, LJ_TISNUM - || break; - ||default: - | addu CARG3, BASE, RB - | addu CARG4, BASE, RC - | lw TMP1, HI(CARG3) - | lw TMP2, HI(CARG4) - | ldc1 f20, 0(CARG3) - | ldc1 f22, 0(CARG4) - | sltiu AT, TMP1, LJ_TISNUM - | sltiu TMP0, TMP2, LJ_TISNUM - | and AT, AT, TMP0 - || break; - ||} - | beqz AT, ->vmeta_arith - |. addu RA, BASE, RA - |.endmacro - | - |.macro fpmod, a, b, c - |->BC_MODVN_Z: - | bal ->vm_floor // floor(b/c) - |. div.d FARG1, b, c - | mul.d a, FRET1, c - | sub.d a, b, a // b - floor(b/c)*c - |.endmacro - | - |.macro ins_arith, ins - | ins_arithpre - |.if "ins" == "fpmod_" - | b ->BC_MODVN_Z // Avoid 3 copies. It's slow anyway. - |. nop - |.else - | ins f0, f20, f22 - | ins_next1 - | sdc1 f0, 0(RA) - | ins_next2 - |.endif - |.endmacro - - case BC_ADDVN: case BC_ADDNV: case BC_ADDVV: - | ins_arith add.d - break; - case BC_SUBVN: case BC_SUBNV: case BC_SUBVV: - | ins_arith sub.d - break; - case BC_MULVN: case BC_MULNV: case BC_MULVV: - | ins_arith mul.d - break; - case BC_DIVVN: case BC_DIVNV: case BC_DIVVV: - | ins_arith div.d - break; - case BC_MODVN: - | ins_arith fpmod - break; - case BC_MODNV: case BC_MODVV: - | ins_arith fpmod_ - break; - case BC_POW: - | decode_RB8a RB, INS - | decode_RB8b RB - | decode_RDtoRC8 RC, RD - | addu CARG3, BASE, RB - | addu CARG4, BASE, RC - | lw TMP1, HI(CARG3) - | lw TMP2, HI(CARG4) - | ldc1 FARG1, 0(CARG3) - | ldc1 FARG2, 0(CARG4) - | sltiu AT, TMP1, LJ_TISNUM - | sltiu TMP0, TMP2, LJ_TISNUM - | and AT, AT, TMP0 - | load_got pow - | beqz AT, ->vmeta_arith - |. addu RA, BASE, RA - | call_extern - |. nop - | ins_next1 - | sdc1 FRET1, 0(RA) - | ins_next2 - break; - - case BC_CAT: - | // RA = dst*8, RB = src_start*8, RC = src_end*8 - | decode_RB8a RB, INS - | decode_RB8b RB - | decode_RDtoRC8 RC, RD - | subu CARG3, RC, RB - | sw BASE, L->base - | addu CARG2, BASE, RC - | move MULTRES, RB - |->BC_CAT_Z: - | load_got lj_meta_cat - | srl CARG3, CARG3, 3 - | sw PC, SAVE_PC - | call_intern lj_meta_cat // (lua_State *L, TValue *top, int left) - |. move CARG1, L - | // Returns NULL (finished) or TValue * (metamethod). - | bnez CRET1, ->vmeta_binop - |. lw BASE, L->base - | addu RB, BASE, MULTRES - | ldc1 f0, 0(RB) - | addu RA, BASE, RA - | ins_next1 - | sdc1 f0, 0(RA) // Copy result from RB to RA. - | ins_next2 - break; - - /* -- Constant ops ------------------------------------------------------ */ - - case BC_KSTR: - | // RA = dst*8, RD = str_const*8 (~) - | srl TMP1, RD, 1 - | subu TMP1, KBASE, TMP1 - | ins_next1 - | lw TMP0, -4(TMP1) // KBASE-4-str_const*4 - | addu RA, BASE, RA - | li TMP2, LJ_TSTR - | sw TMP0, LO(RA) - | sw TMP2, HI(RA) - | ins_next2 - break; - case BC_KCDATA: - |.if FFI - | // RA = dst*8, RD = cdata_const*8 (~) - | srl TMP1, RD, 1 - | subu TMP1, KBASE, TMP1 - | ins_next1 - | lw TMP0, -4(TMP1) // KBASE-4-cdata_const*4 - | addu RA, BASE, RA - | li TMP2, LJ_TCDATA - | sw TMP0, LO(RA) - | sw TMP2, HI(RA) - | ins_next2 - |.endif - break; - case BC_KSHORT: - | // RA = dst*8, RD = int16_literal*8 - | sra RD, INS, 16 - | mtc1 RD, f0 - | addu RA, BASE, RA - | cvt.d.w f0, f0 - | ins_next1 - | sdc1 f0, 0(RA) - | ins_next2 - break; - case BC_KNUM: - | // RA = dst*8, RD = num_const*8 - | addu RD, KBASE, RD - | addu RA, BASE, RA - | ldc1 f0, 0(RD) - | ins_next1 - | sdc1 f0, 0(RA) - | ins_next2 - break; - case BC_KPRI: - | // RA = dst*8, RD = primitive_type*8 (~) - | srl TMP1, RD, 3 - | addu RA, BASE, RA - | not TMP0, TMP1 - | ins_next1 - | sw TMP0, HI(RA) - | ins_next2 - break; - case BC_KNIL: - | // RA = base*8, RD = end*8 - | addu RA, BASE, RA - | sw TISNIL, HI(RA) - | addiu RA, RA, 8 - | addu RD, BASE, RD - |1: - | sw TISNIL, HI(RA) - | slt AT, RA, RD - | bnez AT, <1 - |. addiu RA, RA, 8 - | ins_next_ - break; - - /* -- Upvalue and function ops ------------------------------------------ */ - - case BC_UGET: - | // RA = dst*8, RD = uvnum*8 - | lw LFUNC:RB, FRAME_FUNC(BASE) - | srl RD, RD, 1 - | addu RD, RD, LFUNC:RB - | lw UPVAL:RB, LFUNC:RD->uvptr - | ins_next1 - | lw TMP1, UPVAL:RB->v - | ldc1 f0, 0(TMP1) - | addu RA, BASE, RA - | sdc1 f0, 0(RA) - | ins_next2 - break; - case BC_USETV: - | // RA = uvnum*8, RD = src*8 - | lw LFUNC:RB, FRAME_FUNC(BASE) - | srl RA, RA, 1 - | addu RD, BASE, RD - | addu RA, RA, LFUNC:RB - | ldc1 f0, 0(RD) - | lw UPVAL:RB, LFUNC:RA->uvptr - | lbu TMP3, UPVAL:RB->marked - | lw CARG2, UPVAL:RB->v - | andi TMP3, TMP3, LJ_GC_BLACK // isblack(uv) - | lbu TMP0, UPVAL:RB->closed - | lw TMP2, HI(RD) - | sdc1 f0, 0(CARG2) - | li AT, LJ_GC_BLACK|1 - | or TMP3, TMP3, TMP0 - | beq TMP3, AT, >2 // Upvalue is closed and black? - |. addiu TMP2, TMP2, -(LJ_TNUMX+1) - |1: - | ins_next - | - |2: // Check if new value is collectable. - | sltiu AT, TMP2, LJ_TISGCV - (LJ_TNUMX+1) - | beqz AT, <1 // tvisgcv(v) - |. lw TMP1, LO(RD) - | lbu TMP3, GCOBJ:TMP1->gch.marked - | andi TMP3, TMP3, LJ_GC_WHITES // iswhite(v) - | beqz TMP3, <1 - |. load_got lj_gc_barrieruv - | // Crossed a write barrier. Move the barrier forward. - | call_intern lj_gc_barrieruv // (global_State *g, TValue *tv) - |. addiu CARG1, DISPATCH, GG_DISP2G - | b <1 - |. nop - break; - case BC_USETS: - | // RA = uvnum*8, RD = str_const*8 (~) - | lw LFUNC:RB, FRAME_FUNC(BASE) - | srl RA, RA, 1 - | srl TMP1, RD, 1 - | addu RA, RA, LFUNC:RB - | subu TMP1, KBASE, TMP1 - | lw UPVAL:RB, LFUNC:RA->uvptr - | lw STR:TMP1, -4(TMP1) // KBASE-4-str_const*4 - | lbu TMP2, UPVAL:RB->marked - | lw CARG2, UPVAL:RB->v - | lbu TMP3, STR:TMP1->marked - | andi AT, TMP2, LJ_GC_BLACK // isblack(uv) - | lbu TMP2, UPVAL:RB->closed - | li TMP0, LJ_TSTR - | sw STR:TMP1, LO(CARG2) - | bnez AT, >2 - |. sw TMP0, HI(CARG2) - |1: - | ins_next - | - |2: // Check if string is white and ensure upvalue is closed. - | beqz TMP2, <1 - |. andi AT, TMP3, LJ_GC_WHITES // iswhite(str) - | beqz AT, <1 - |. load_got lj_gc_barrieruv - | // Crossed a write barrier. Move the barrier forward. - | call_intern lj_gc_barrieruv // (global_State *g, TValue *tv) - |. addiu CARG1, DISPATCH, GG_DISP2G - | b <1 - |. nop - break; - case BC_USETN: - | // RA = uvnum*8, RD = num_const*8 - | lw LFUNC:RB, FRAME_FUNC(BASE) - | srl RA, RA, 1 - | addu RD, KBASE, RD - | addu RA, RA, LFUNC:RB - | ldc1 f0, 0(RD) - | lw UPVAL:RB, LFUNC:RA->uvptr - | ins_next1 - | lw TMP1, UPVAL:RB->v - | sdc1 f0, 0(TMP1) - | ins_next2 - break; - case BC_USETP: - | // RA = uvnum*8, RD = primitive_type*8 (~) - | lw LFUNC:RB, FRAME_FUNC(BASE) - | srl RA, RA, 1 - | srl TMP0, RD, 3 - | addu RA, RA, LFUNC:RB - | not TMP0, TMP0 - | lw UPVAL:RB, LFUNC:RA->uvptr - | ins_next1 - | lw TMP1, UPVAL:RB->v - | sw TMP0, HI(TMP1) - | ins_next2 - break; - - case BC_UCLO: - | // RA = level*8, RD = target - | lw TMP2, L->openupval - | branch_RD // Do this first since RD is not saved. - | load_got lj_func_closeuv - | sw BASE, L->base - | beqz TMP2, >1 - |. move CARG1, L - | call_intern lj_func_closeuv // (lua_State *L, TValue *level) - |. addu CARG2, BASE, RA - | lw BASE, L->base - |1: - | ins_next - break; - - case BC_FNEW: - | // RA = dst*8, RD = proto_const*8 (~) (holding function prototype) - | srl TMP1, RD, 1 - | load_got lj_func_newL_gc - | subu TMP1, KBASE, TMP1 - | lw CARG3, FRAME_FUNC(BASE) - | lw CARG2, -4(TMP1) // KBASE-4-tab_const*4 - | sw BASE, L->base - | sw PC, SAVE_PC - | // (lua_State *L, GCproto *pt, GCfuncL *parent) - | call_intern lj_func_newL_gc - |. move CARG1, L - | // Returns GCfuncL *. - | lw BASE, L->base - | li TMP0, LJ_TFUNC - | ins_next1 - | addu RA, BASE, RA - | sw TMP0, HI(RA) - | sw LFUNC:CRET1, LO(RA) - | ins_next2 - break; - - /* -- Table ops --------------------------------------------------------- */ - - case BC_TNEW: - case BC_TDUP: - | // RA = dst*8, RD = (hbits|asize)*8 | tab_const*8 (~) - | lw TMP0, DISPATCH_GL(gc.total)(DISPATCH) - | lw TMP1, DISPATCH_GL(gc.threshold)(DISPATCH) - | sw BASE, L->base - | sw PC, SAVE_PC - | sltu AT, TMP0, TMP1 - | beqz AT, >5 - |1: - if (op == BC_TNEW) { - | load_got lj_tab_new - | srl CARG2, RD, 3 - | andi CARG2, CARG2, 0x7ff - | li TMP0, 0x801 - | addiu AT, CARG2, -0x7ff - | srl CARG3, RD, 14 - | movz CARG2, TMP0, AT - | // (lua_State *L, int32_t asize, uint32_t hbits) - | call_intern lj_tab_new - |. move CARG1, L - | // Returns Table *. - } else { - | load_got lj_tab_dup - | srl TMP1, RD, 1 - | subu TMP1, KBASE, TMP1 - | move CARG1, L - | call_intern lj_tab_dup // (lua_State *L, Table *kt) - |. lw CARG2, -4(TMP1) // KBASE-4-str_const*4 - | // Returns Table *. - } - | lw BASE, L->base - | ins_next1 - | addu RA, BASE, RA - | li TMP0, LJ_TTAB - | sw TAB:CRET1, LO(RA) - | sw TMP0, HI(RA) - | ins_next2 - |5: - | load_got lj_gc_step_fixtop - | move MULTRES, RD - | call_intern lj_gc_step_fixtop // (lua_State *L) - |. move CARG1, L - | b <1 - |. move RD, MULTRES - break; - - case BC_GGET: - | // RA = dst*8, RD = str_const*8 (~) - case BC_GSET: - | // RA = src*8, RD = str_const*8 (~) - | lw LFUNC:TMP2, FRAME_FUNC(BASE) - | srl TMP1, RD, 1 - | subu TMP1, KBASE, TMP1 - | lw TAB:RB, LFUNC:TMP2->env - | lw STR:RC, -4(TMP1) // KBASE-4-str_const*4 - if (op == BC_GGET) { - | b ->BC_TGETS_Z - } else { - | b ->BC_TSETS_Z - } - |. addu RA, BASE, RA - break; - - case BC_TGETV: - | // RA = dst*8, RB = table*8, RC = key*8 - | decode_RB8a RB, INS - | decode_RB8b RB - | decode_RDtoRC8 RC, RD - | addu CARG2, BASE, RB - | addu CARG3, BASE, RC - | lw TMP1, HI(CARG2) - | lw TMP2, HI(CARG3) - | lw TAB:RB, LO(CARG2) - | li AT, LJ_TTAB - | ldc1 f0, 0(CARG3) - | bne TMP1, AT, ->vmeta_tgetv - |. addu RA, BASE, RA - | sltiu AT, TMP2, LJ_TISNUM - | beqz AT, >5 - |. li AT, LJ_TSTR - | - | // Convert number key to integer, check for integerness and range. - | cvt.w.d f2, f0 - | lw TMP0, TAB:RB->asize - | mfc1 TMP2, f2 - | cvt.d.w f4, f2 - | lw TMP1, TAB:RB->array - | c.eq.d f0, f4 - | sltu AT, TMP2, TMP0 - | movf AT, r0 - | sll TMP2, TMP2, 3 - | beqz AT, ->vmeta_tgetv // Integer key and in array part? - |. addu TMP2, TMP1, TMP2 - | lw TMP0, HI(TMP2) - | beq TMP0, TISNIL, >2 - |. ldc1 f0, 0(TMP2) - |1: - | ins_next1 - | sdc1 f0, 0(RA) - | ins_next2 - | - |2: // Check for __index if table value is nil. - | lw TAB:TMP2, TAB:RB->metatable - | beqz TAB:TMP2, <1 // No metatable: done. - |. nop - | lbu TMP0, TAB:TMP2->nomm - | andi TMP0, TMP0, 1<vmeta_tgetv - |. nop - | - |5: - | bne TMP2, AT, ->vmeta_tgetv - |. lw STR:RC, LO(CARG3) - | b ->BC_TGETS_Z // String key? - |. nop - break; - case BC_TGETS: - | // RA = dst*8, RB = table*8, RC = str_const*4 (~) - | decode_RB8a RB, INS - | decode_RB8b RB - | addu CARG2, BASE, RB - | decode_RC4a RC, INS - | lw TMP0, HI(CARG2) - | decode_RC4b RC - | li AT, LJ_TTAB - | lw TAB:RB, LO(CARG2) - | subu CARG3, KBASE, RC - | lw STR:RC, -4(CARG3) // KBASE-4-str_const*4 - | bne TMP0, AT, ->vmeta_tgets1 - |. addu RA, BASE, RA - |->BC_TGETS_Z: - | // TAB:RB = GCtab *, STR:RC = GCstr *, RA = dst*8 - | lw TMP0, TAB:RB->hmask - | lw TMP1, STR:RC->hash - | lw NODE:TMP2, TAB:RB->node - | and TMP1, TMP1, TMP0 // idx = str->hash & tab->hmask - | sll TMP0, TMP1, 5 - | sll TMP1, TMP1, 3 - | subu TMP1, TMP0, TMP1 - | addu NODE:TMP2, NODE:TMP2, TMP1 // node = tab->node + (idx*32-idx*8) - |1: - | lw CARG1, offsetof(Node, key)+HI(NODE:TMP2) - | lw TMP0, offsetof(Node, key)+LO(NODE:TMP2) - | lw NODE:TMP1, NODE:TMP2->next - | lw CARG2, offsetof(Node, val)+HI(NODE:TMP2) - | addiu CARG1, CARG1, -LJ_TSTR - | xor TMP0, TMP0, STR:RC - | or AT, CARG1, TMP0 - | bnez AT, >4 - |. lw TAB:TMP3, TAB:RB->metatable - | beq CARG2, TISNIL, >5 // Key found, but nil value? - |. lw CARG1, offsetof(Node, val)+LO(NODE:TMP2) - |3: - | ins_next1 - | sw CARG2, HI(RA) - | sw CARG1, LO(RA) - | ins_next2 - | - |4: // Follow hash chain. - | bnez NODE:TMP1, <1 - |. move NODE:TMP2, NODE:TMP1 - | // End of hash chain: key not found, nil result. - | - |5: // Check for __index if table value is nil. - | beqz TAB:TMP3, <3 // No metatable: done. - |. li CARG2, LJ_TNIL - | lbu TMP0, TAB:TMP3->nomm - | andi TMP0, TMP0, 1<vmeta_tgets - |. nop - break; - case BC_TGETB: - | // RA = dst*8, RB = table*8, RC = index*8 - | decode_RB8a RB, INS - | decode_RB8b RB - | addu CARG2, BASE, RB - | decode_RDtoRC8 RC, RD - | lw CARG1, HI(CARG2) - | li AT, LJ_TTAB - | lw TAB:RB, LO(CARG2) - | addu RA, BASE, RA - | bne CARG1, AT, ->vmeta_tgetb - |. srl TMP0, RC, 3 - | lw TMP1, TAB:RB->asize - | lw TMP2, TAB:RB->array - | sltu AT, TMP0, TMP1 - | beqz AT, ->vmeta_tgetb - |. addu RC, TMP2, RC - | lw TMP1, HI(RC) - | beq TMP1, TISNIL, >5 - |. ldc1 f0, 0(RC) - |1: - | ins_next1 - | sdc1 f0, 0(RA) - | ins_next2 - | - |5: // Check for __index if table value is nil. - | lw TAB:TMP2, TAB:RB->metatable - | beqz TAB:TMP2, <1 // No metatable: done. - |. nop - | lbu TMP1, TAB:TMP2->nomm - | andi TMP1, TMP1, 1<vmeta_tgetb // Caveat: preserve TMP0! - |. nop - break; - - case BC_TSETV: - | // RA = src*8, RB = table*8, RC = key*8 - | decode_RB8a RB, INS - | decode_RB8b RB - | decode_RDtoRC8 RC, RD - | addu CARG2, BASE, RB - | addu CARG3, BASE, RC - | lw TMP1, HI(CARG2) - | lw TMP2, HI(CARG3) - | lw TAB:RB, LO(CARG2) - | li AT, LJ_TTAB - | ldc1 f0, 0(CARG3) - | bne TMP1, AT, ->vmeta_tsetv - |. addu RA, BASE, RA - | sltiu AT, TMP2, LJ_TISNUM - | beqz AT, >5 - |. li AT, LJ_TSTR - | - | // Convert number key to integer, check for integerness and range. - | cvt.w.d f2, f0 - | lw TMP0, TAB:RB->asize - | mfc1 TMP2, f2 - | cvt.d.w f4, f2 - | lw TMP1, TAB:RB->array - | c.eq.d f0, f4 - | sltu AT, TMP2, TMP0 - | movf AT, r0 - | sll TMP2, TMP2, 3 - | beqz AT, ->vmeta_tsetv // Integer key and in array part? - |. addu TMP1, TMP1, TMP2 - | lbu TMP3, TAB:RB->marked - | lw TMP0, HI(TMP1) - | beq TMP0, TISNIL, >3 - |. ldc1 f0, 0(RA) - |1: - | andi AT, TMP3, LJ_GC_BLACK // isblack(table) - | bnez AT, >7 - |. sdc1 f0, 0(TMP1) - |2: - | ins_next - | - |3: // Check for __newindex if previous value is nil. - | lw TAB:TMP2, TAB:RB->metatable - | beqz TAB:TMP2, <1 // No metatable: done. - |. nop - | lbu TMP2, TAB:TMP2->nomm - | andi TMP2, TMP2, 1<vmeta_tsetv - |. nop - | - |5: - | bne TMP2, AT, ->vmeta_tsetv - |. lw STR:RC, LO(CARG3) - | b ->BC_TSETS_Z // String key? - |. nop - | - |7: // Possible table write barrier for the value. Skip valiswhite check. - | barrierback TAB:RB, TMP3, TMP0, <2 - break; - case BC_TSETS: - | // RA = src*8, RB = table*8, RC = str_const*8 (~) - | decode_RB8a RB, INS - | decode_RB8b RB - | addu CARG2, BASE, RB - | decode_RC4a RC, INS - | lw TMP0, HI(CARG2) - | decode_RC4b RC - | li AT, LJ_TTAB - | subu CARG3, KBASE, RC - | lw TAB:RB, LO(CARG2) - | lw STR:RC, -4(CARG3) // KBASE-4-str_const*4 - | bne TMP0, AT, ->vmeta_tsets1 - |. addu RA, BASE, RA - |->BC_TSETS_Z: - | // TAB:RB = GCtab *, STR:RC = GCstr *, RA = BASE+src*8 - | lw TMP0, TAB:RB->hmask - | lw TMP1, STR:RC->hash - | lw NODE:TMP2, TAB:RB->node - | sb r0, TAB:RB->nomm // Clear metamethod cache. - | and TMP1, TMP1, TMP0 // idx = str->hash & tab->hmask - | sll TMP0, TMP1, 5 - | sll TMP1, TMP1, 3 - | subu TMP1, TMP0, TMP1 - | addu NODE:TMP2, NODE:TMP2, TMP1 // node = tab->node + (idx*32-idx*8) - | ldc1 f20, 0(RA) - |1: - | lw CARG1, offsetof(Node, key)+HI(NODE:TMP2) - | lw TMP0, offsetof(Node, key)+LO(NODE:TMP2) - | li AT, LJ_TSTR - | lw NODE:TMP1, NODE:TMP2->next - | bne CARG1, AT, >5 - |. lw CARG2, offsetof(Node, val)+HI(NODE:TMP2) - | bne TMP0, STR:RC, >5 - |. lbu TMP3, TAB:RB->marked - | beq CARG2, TISNIL, >4 // Key found, but nil value? - |. lw TAB:TMP0, TAB:RB->metatable - |2: - | andi AT, TMP3, LJ_GC_BLACK // isblack(table) - | bnez AT, >7 - |. sdc1 f20, NODE:TMP2->val - |3: - | ins_next - | - |4: // Check for __newindex if previous value is nil. - | beqz TAB:TMP0, <2 // No metatable: done. - |. nop - | lbu TMP0, TAB:TMP0->nomm - | andi TMP0, TMP0, 1<vmeta_tsets - |. nop - | - |5: // Follow hash chain. - | bnez NODE:TMP1, <1 - |. move NODE:TMP2, NODE:TMP1 - | // End of hash chain: key not found, add a new one - | - | // But check for __newindex first. - | lw TAB:TMP2, TAB:RB->metatable - | beqz TAB:TMP2, >6 // No metatable: continue. - |. addiu CARG3, DISPATCH, DISPATCH_GL(tmptv) - | lbu TMP0, TAB:TMP2->nomm - | andi TMP0, TMP0, 1<vmeta_tsets // 'no __newindex' flag NOT set: check. - |. li AT, LJ_TSTR - |6: - | load_got lj_tab_newkey - | sw STR:RC, LO(CARG3) - | sw AT, HI(CARG3) - | sw BASE, L->base - | move CARG2, TAB:RB - | sw PC, SAVE_PC - | call_intern lj_tab_newkey // (lua_State *L, GCtab *t, TValue *k - |. move CARG1, L - | // Returns TValue *. - | lw BASE, L->base - | b <3 // No 2nd write barrier needed. - |. sdc1 f20, 0(CRET1) - | - |7: // Possible table write barrier for the value. Skip valiswhite check. - | barrierback TAB:RB, TMP3, TMP0, <3 - break; - case BC_TSETB: - | // RA = src*8, RB = table*8, RC = index*8 - | decode_RB8a RB, INS - | decode_RB8b RB - | addu CARG2, BASE, RB - | decode_RDtoRC8 RC, RD - | lw CARG1, HI(CARG2) - | li AT, LJ_TTAB - | lw TAB:RB, LO(CARG2) - | addu RA, BASE, RA - | bne CARG1, AT, ->vmeta_tsetb - |. srl TMP0, RC, 3 - | lw TMP1, TAB:RB->asize - | lw TMP2, TAB:RB->array - | sltu AT, TMP0, TMP1 - | beqz AT, ->vmeta_tsetb - |. addu RC, TMP2, RC - | lw TMP1, HI(RC) - | lbu TMP3, TAB:RB->marked - | beq TMP1, TISNIL, >5 - |. ldc1 f0, 0(RA) - |1: - | andi AT, TMP3, LJ_GC_BLACK // isblack(table) - | bnez AT, >7 - |. sdc1 f0, 0(RC) - |2: - | ins_next - | - |5: // Check for __newindex if previous value is nil. - | lw TAB:TMP2, TAB:RB->metatable - | beqz TAB:TMP2, <1 // No metatable: done. - |. nop - | lbu TMP1, TAB:TMP2->nomm - | andi TMP1, TMP1, 1<vmeta_tsetb // Caveat: preserve TMP0! - |. nop - | - |7: // Possible table write barrier for the value. Skip valiswhite check. - | barrierback TAB:RB, TMP3, TMP0, <2 - break; - - case BC_TSETM: - | // RA = base*8 (table at base-1), RD = num_const*8 (start index) - | addu RA, BASE, RA - |1: - | addu TMP3, KBASE, RD - | lw TAB:CARG2, -8+LO(RA) // Guaranteed to be a table. - | addiu TMP0, MULTRES, -8 - | lw TMP3, LO(TMP3) // Integer constant is in lo-word. - | beqz TMP0, >4 // Nothing to copy? - |. srl CARG3, TMP0, 3 - | addu CARG3, CARG3, TMP3 - | lw TMP2, TAB:CARG2->asize - | sll TMP1, TMP3, 3 - | lbu TMP3, TAB:CARG2->marked - | lw CARG1, TAB:CARG2->array - | sltu AT, TMP2, CARG3 - | bnez AT, >5 - |. addu TMP2, RA, TMP0 - | addu TMP1, TMP1, CARG1 - | andi TMP0, TMP3, LJ_GC_BLACK // isblack(table) - |3: // Copy result slots to table. - | ldc1 f0, 0(RA) - | addiu RA, RA, 8 - | sltu AT, RA, TMP2 - | sdc1 f0, 0(TMP1) - | bnez AT, <3 - |. addiu TMP1, TMP1, 8 - | bnez TMP0, >7 - |. nop - |4: - | ins_next - | - |5: // Need to resize array part. - | load_got lj_tab_reasize - | sw BASE, L->base - | sw PC, SAVE_PC - | move BASE, RD - | call_intern lj_tab_reasize // (lua_State *L, GCtab *t, int nasize) - |. move CARG1, L - | // Must not reallocate the stack. - | move RD, BASE - | b <1 - |. lw BASE, L->base // Reload BASE for lack of a saved register. - | - |7: // Possible table write barrier for any value. Skip valiswhite check. - | barrierback TAB:CARG2, TMP3, TMP0, <4 - break; - - /* -- Calls and vararg handling ----------------------------------------- */ - - case BC_CALLM: - | // RA = base*8, (RB = (nresults+1)*8,) RC = extra_nargs*8 - | decode_RDtoRC8 NARGS8:RC, RD - | b ->BC_CALL_Z - |. addu NARGS8:RC, NARGS8:RC, MULTRES - break; - case BC_CALL: - | // RA = base*8, (RB = (nresults+1)*8,) RC = (nargs+1)*8 - | decode_RDtoRC8 NARGS8:RC, RD - |->BC_CALL_Z: - | move TMP2, BASE - | addu BASE, BASE, RA - | li AT, LJ_TFUNC - | lw TMP0, HI(BASE) - | lw LFUNC:RB, LO(BASE) - | addiu BASE, BASE, 8 - | bne TMP0, AT, ->vmeta_call - |. addiu NARGS8:RC, NARGS8:RC, -8 - | ins_call - break; - - case BC_CALLMT: - | // RA = base*8, (RB = 0,) RC = extra_nargs*8 - | addu NARGS8:RD, NARGS8:RD, MULTRES // BC_CALLT gets RC from RD. - | // Fall through. Assumes BC_CALLT follows. - break; - case BC_CALLT: - | // RA = base*8, (RB = 0,) RC = (nargs+1)*8 - | addu RA, BASE, RA - | li AT, LJ_TFUNC - | lw TMP0, HI(RA) - | lw LFUNC:RB, LO(RA) - | move NARGS8:RC, RD - | lw TMP1, FRAME_PC(BASE) - | addiu RA, RA, 8 - | bne TMP0, AT, ->vmeta_callt - |. addiu NARGS8:RC, NARGS8:RC, -8 - |->BC_CALLT_Z: - | andi TMP0, TMP1, FRAME_TYPE // Caveat: preserve TMP0 until the 'or'. - | lbu TMP3, LFUNC:RB->ffid - | bnez TMP0, >7 - |. xori TMP2, TMP1, FRAME_VARG - |1: - | sw LFUNC:RB, FRAME_FUNC(BASE) // Copy function down, but keep PC. - | sltiu AT, TMP3, 2 // (> FF_C) Calling a fast function? - | move TMP2, BASE - | beqz NARGS8:RC, >3 - |. move TMP3, NARGS8:RC - |2: - | ldc1 f0, 0(RA) - | addiu RA, RA, 8 - | addiu TMP3, TMP3, -8 - | sdc1 f0, 0(TMP2) - | bnez TMP3, <2 - |. addiu TMP2, TMP2, 8 - |3: - | or TMP0, TMP0, AT - | beqz TMP0, >5 - |. nop - |4: - | ins_callt - | - |5: // Tailcall to a fast function with a Lua frame below. - | lw INS, -4(TMP1) - | decode_RA8a RA, INS - | decode_RA8b RA - | subu TMP1, BASE, RA - | lw LFUNC:TMP1, -8+FRAME_FUNC(TMP1) - | lw TMP1, LFUNC:TMP1->pc - | b <4 - |. lw KBASE, PC2PROTO(k)(TMP1) // Need to prepare KBASE. - | - |7: // Tailcall from a vararg function. - | andi AT, TMP2, FRAME_TYPEP - | bnez AT, <1 // Vararg frame below? - |. subu TMP2, BASE, TMP2 // Relocate BASE down. - | move BASE, TMP2 - | lw TMP1, FRAME_PC(TMP2) - | b <1 - |. andi TMP0, TMP1, FRAME_TYPE - break; - - case BC_ITERC: - | // RA = base*8, (RB = (nresults+1)*8, RC = (nargs+1)*8 ((2+1)*8)) - | move TMP2, BASE - | addu BASE, BASE, RA - | li AT, LJ_TFUNC - | lw TMP1, -24+HI(BASE) - | lw LFUNC:RB, -24+LO(BASE) - | ldc1 f2, -8(BASE) - | ldc1 f0, -16(BASE) - | sw TMP1, HI(BASE) // Copy callable. - | sw LFUNC:RB, LO(BASE) - | sdc1 f2, 16(BASE) // Copy control var. - | sdc1 f0, 8(BASE) // Copy state. - | addiu BASE, BASE, 8 - | bne TMP1, AT, ->vmeta_call - |. li NARGS8:RC, 16 // Iterators get 2 arguments. - | ins_call - break; - - case BC_ITERN: - | // RA = base*8, (RB = (nresults+1)*8, RC = (nargs+1)*8 (2+1)*8) - |.if JIT - | // NYI: add hotloop, record BC_ITERN. - |.endif - | addu RA, BASE, RA - | lw TAB:RB, -16+LO(RA) - | lw RC, -8+LO(RA) // Get index from control var. - | lw TMP0, TAB:RB->asize - | lw TMP1, TAB:RB->array - | addiu PC, PC, 4 - |1: // Traverse array part. - | sltu AT, RC, TMP0 - | beqz AT, >5 // Index points after array part? - |. sll TMP3, RC, 3 - | addu TMP3, TMP1, TMP3 - | lw TMP2, HI(TMP3) - | ldc1 f0, 0(TMP3) - | mtc1 RC, f2 - | lhu RD, -4+OFS_RD(PC) - | beq TMP2, TISNIL, <1 // Skip holes in array part. - |. addiu RC, RC, 1 - | cvt.d.w f2, f2 - | lui TMP3, (-(BCBIAS_J*4 >> 16) & 65535) - | sdc1 f0, 8(RA) - | decode_RD4b RD - | addu RD, RD, TMP3 - | sw RC, -8+LO(RA) // Update control var. - | addu PC, PC, RD - | sdc1 f2, 0(RA) - |3: - | ins_next - | - |5: // Traverse hash part. - | lw TMP1, TAB:RB->hmask - | subu RC, RC, TMP0 - | lw TMP2, TAB:RB->node - |6: - | sltu AT, TMP1, RC // End of iteration? Branch to ITERL+1. - | bnez AT, <3 - |. sll TMP3, RC, 5 - | sll RB, RC, 3 - | subu TMP3, TMP3, RB - | addu NODE:TMP3, TMP3, TMP2 - | lw RB, HI(NODE:TMP3) - | ldc1 f0, 0(NODE:TMP3) - | lhu RD, -4+OFS_RD(PC) - | beq RB, TISNIL, <6 // Skip holes in hash part. - |. addiu RC, RC, 1 - | ldc1 f2, NODE:TMP3->key - | lui TMP3, (-(BCBIAS_J*4 >> 16) & 65535) - | sdc1 f0, 8(RA) - | addu RC, RC, TMP0 - | decode_RD4b RD - | addu RD, RD, TMP3 - | sdc1 f2, 0(RA) - | addu PC, PC, RD - | b <3 - |. sw RC, -8+LO(RA) // Update control var. - break; - - case BC_ISNEXT: - | // RA = base*8, RD = target (points to ITERN) - | addu RA, BASE, RA - | lw TMP0, -24+HI(RA) - | lw CFUNC:TMP1, -24+LO(RA) - | lw TMP2, -16+HI(RA) - | lw TMP3, -8+HI(RA) - | li AT, LJ_TFUNC - | bne TMP0, AT, >5 - |. addiu TMP2, TMP2, -LJ_TTAB - | lbu TMP1, CFUNC:TMP1->ffid - | addiu TMP3, TMP3, -LJ_TNIL - | srl TMP0, RD, 1 - | or TMP2, TMP2, TMP3 - | addiu TMP1, TMP1, -FF_next_N - | addu TMP0, PC, TMP0 - | or TMP1, TMP1, TMP2 - | bnez TMP1, >5 - |. lui TMP2, (-(BCBIAS_J*4 >> 16) & 65535) - | addu PC, TMP0, TMP2 - | lui TMP1, 0xfffe - | ori TMP1, TMP1, 0x7fff - | sw r0, -8+LO(RA) // Initialize control var. - | sw TMP1, -8+HI(RA) - |1: - | ins_next - |5: // Despecialize bytecode if any of the checks fail. - | li TMP3, BC_JMP - | li TMP1, BC_ITERC - | sb TMP3, -4+OFS_OP(PC) - | addu PC, TMP0, TMP2 - | b <1 - |. sb TMP1, OFS_OP(PC) - break; - - case BC_VARG: - | // RA = base*8, RB = (nresults+1)*8, RC = numparams*8 - | lw TMP0, FRAME_PC(BASE) - | decode_RDtoRC8 RC, RD - | decode_RB8a RB, INS - | addu RC, BASE, RC - | decode_RB8b RB - | addu RA, BASE, RA - | addiu RC, RC, FRAME_VARG - | addu TMP2, RA, RB - | addiu TMP3, BASE, -8 // TMP3 = vtop - | subu RC, RC, TMP0 // RC = vbase - | // Note: RC may now be even _above_ BASE if nargs was < numparams. - | beqz RB, >5 // Copy all varargs? - |. subu TMP1, TMP3, RC - | addiu TMP2, TMP2, -16 - |1: // Copy vararg slots to destination slots. - | lw CARG1, HI(RC) - | sltu AT, RC, TMP3 - | lw CARG2, LO(RC) - | addiu RC, RC, 8 - | movz CARG1, TISNIL, AT - | sw CARG1, HI(RA) - | sw CARG2, LO(RA) - | sltu AT, RA, TMP2 - | bnez AT, <1 - |. addiu RA, RA, 8 - |3: - | ins_next - | - |5: // Copy all varargs. - | lw TMP0, L->maxstack - | blez TMP1, <3 // No vararg slots? - |. li MULTRES, 8 // MULTRES = (0+1)*8 - | addu TMP2, RA, TMP1 - | sltu AT, TMP0, TMP2 - | bnez AT, >7 - |. addiu MULTRES, TMP1, 8 - |6: - | ldc1 f0, 0(RC) - | addiu RC, RC, 8 - | sdc1 f0, 0(RA) - | sltu AT, RC, TMP3 - | bnez AT, <6 // More vararg slots? - |. addiu RA, RA, 8 - | b <3 - |. nop - | - |7: // Grow stack for varargs. - | load_got lj_state_growstack - | sw RA, L->top - | subu RA, RA, BASE - | sw BASE, L->base - | subu BASE, RC, BASE // Need delta, because BASE may change. - | sw PC, SAVE_PC - | srl CARG2, TMP1, 3 - | call_intern lj_state_growstack // (lua_State *L, int n) - |. move CARG1, L - | move RC, BASE - | lw BASE, L->base - | addu RA, BASE, RA - | addu RC, BASE, RC - | b <6 - |. addiu TMP3, BASE, -8 - break; - - /* -- Returns ----------------------------------------------------------- */ - - case BC_RETM: - | // RA = results*8, RD = extra_nresults*8 - | addu RD, RD, MULTRES // MULTRES >= 8, so RD >= 8. - | // Fall through. Assumes BC_RET follows. - break; - - case BC_RET: - | // RA = results*8, RD = (nresults+1)*8 - | lw PC, FRAME_PC(BASE) - | addu RA, BASE, RA - | move MULTRES, RD - |1: - | andi TMP0, PC, FRAME_TYPE - | bnez TMP0, ->BC_RETV_Z - |. xori TMP1, PC, FRAME_VARG - | - |->BC_RET_Z: - | // BASE = base, RA = resultptr, RD = (nresults+1)*8, PC = return - | lw INS, -4(PC) - | addiu TMP2, BASE, -8 - | addiu RC, RD, -8 - | decode_RA8a TMP0, INS - | decode_RB8a RB, INS - | decode_RA8b TMP0 - | decode_RB8b RB - | addu TMP3, TMP2, RB - | beqz RC, >3 - |. subu BASE, TMP2, TMP0 - |2: - | ldc1 f0, 0(RA) - | addiu RA, RA, 8 - | addiu RC, RC, -8 - | sdc1 f0, 0(TMP2) - | bnez RC, <2 - |. addiu TMP2, TMP2, 8 - |3: - | addiu TMP3, TMP3, -8 - |5: - | sltu AT, TMP2, TMP3 - | bnez AT, >6 - |. lw LFUNC:TMP1, FRAME_FUNC(BASE) - | ins_next1 - | lw TMP1, LFUNC:TMP1->pc - | lw KBASE, PC2PROTO(k)(TMP1) - | ins_next2 - | - |6: // Fill up results with nil. - | sw TISNIL, HI(TMP2) - | b <5 - |. addiu TMP2, TMP2, 8 - | - |->BC_RETV_Z: // Non-standard return case. - | andi TMP2, TMP1, FRAME_TYPEP - | bnez TMP2, ->vm_return - |. nop - | // Return from vararg function: relocate BASE down. - | subu BASE, BASE, TMP1 - | b <1 - |. lw PC, FRAME_PC(BASE) - break; - - case BC_RET0: case BC_RET1: - | // RA = results*8, RD = (nresults+1)*8 - | lw PC, FRAME_PC(BASE) - | addu RA, BASE, RA - | move MULTRES, RD - | andi TMP0, PC, FRAME_TYPE - | bnez TMP0, ->BC_RETV_Z - |. xori TMP1, PC, FRAME_VARG - | - | lw INS, -4(PC) - | addiu TMP2, BASE, -8 - if (op == BC_RET1) { - | ldc1 f0, 0(RA) - } - | decode_RB8a RB, INS - | decode_RA8a RA, INS - | decode_RB8b RB - | decode_RA8b RA - if (op == BC_RET1) { - | sdc1 f0, 0(TMP2) - } - | subu BASE, TMP2, RA - |5: - | sltu AT, RD, RB - | bnez AT, >6 - |. lw LFUNC:TMP1, FRAME_FUNC(BASE) - | ins_next1 - | lw TMP1, LFUNC:TMP1->pc - | lw KBASE, PC2PROTO(k)(TMP1) - | ins_next2 - | - |6: // Fill up results with nil. - | addiu TMP2, TMP2, 8 - | addiu RD, RD, 8 - | b <5 - if (op == BC_RET1) { - |. sw TISNIL, HI(TMP2) - } else { - |. sw TISNIL, -8+HI(TMP2) - } - break; - - /* -- Loops and branches ------------------------------------------------ */ - - case BC_FORL: - |.if JIT - | hotloop - |.endif - | // Fall through. Assumes BC_IFORL follows. - break; - - case BC_JFORI: - case BC_JFORL: -#if !LJ_HASJIT - break; -#endif - case BC_FORI: - case BC_IFORL: - | // RA = base*8, RD = target (after end of loop or start of loop) - vk = (op == BC_IFORL || op == BC_JFORL); - | addu RA, BASE, RA - if (vk) { - | ldc1 f0, FORL_IDX*8(RA) - | ldc1 f4, FORL_STEP*8(RA) - | ldc1 f2, FORL_STOP*8(RA) - | lw TMP3, FORL_STEP*8+HI(RA) - | add.d f0, f0, f4 - | sdc1 f0, FORL_IDX*8(RA) - } else { - | lw TMP1, FORL_IDX*8+HI(RA) - | lw TMP3, FORL_STEP*8+HI(RA) - | lw TMP2, FORL_STOP*8+HI(RA) - | sltiu TMP1, TMP1, LJ_TISNUM - | sltiu TMP0, TMP3, LJ_TISNUM - | sltiu TMP2, TMP2, LJ_TISNUM - | and TMP1, TMP1, TMP0 - | and TMP1, TMP1, TMP2 - | ldc1 f0, FORL_IDX*8(RA) - | beqz TMP1, ->vmeta_for - |. ldc1 f2, FORL_STOP*8(RA) - } - if (op != BC_JFORL) { - | srl RD, RD, 1 - | lui TMP0, (-(BCBIAS_J*4 >> 16) & 65535) - } - | c.le.d 0, f0, f2 - | c.le.d 1, f2, f0 - | sdc1 f0, FORL_EXT*8(RA) - if (op == BC_JFORI) { - | li TMP1, 1 - | li TMP2, 1 - | addu TMP0, RD, TMP0 - | slt TMP3, TMP3, r0 - | movf TMP1, r0, 0 - | addu PC, PC, TMP0 - | movf TMP2, r0, 1 - | lhu RD, -4+OFS_RD(PC) - | movn TMP1, TMP2, TMP3 - | bnez TMP1, =>BC_JLOOP - |. decode_RD8b RD - } else if (op == BC_JFORL) { - | li TMP1, 1 - | li TMP2, 1 - | slt TMP3, TMP3, r0 - | movf TMP1, r0, 0 - | movf TMP2, r0, 1 - | movn TMP1, TMP2, TMP3 - | bnez TMP1, =>BC_JLOOP - |. nop - } else { - | addu TMP1, RD, TMP0 - | slt TMP3, TMP3, r0 - | move TMP2, TMP1 - if (op == BC_FORI) { - | movt TMP1, r0, 0 - | movt TMP2, r0, 1 - } else { - | movf TMP1, r0, 0 - | movf TMP2, r0, 1 - } - | movn TMP1, TMP2, TMP3 - | addu PC, PC, TMP1 - } - | ins_next - break; - - case BC_ITERL: - |.if JIT - | hotloop - |.endif - | // Fall through. Assumes BC_IITERL follows. - break; - - case BC_JITERL: -#if !LJ_HASJIT - break; -#endif - case BC_IITERL: - | // RA = base*8, RD = target - | addu RA, BASE, RA - | lw TMP1, HI(RA) - | beq TMP1, TISNIL, >1 // Stop if iterator returned nil. - |. lw TMP2, LO(RA) - if (op == BC_JITERL) { - | sw TMP1, -8+HI(RA) - | b =>BC_JLOOP - |. sw TMP2, -8+LO(RA) - } else { - | branch_RD // Otherwise save control var + branch. - | sw TMP1, -8+HI(RA) - | sw TMP2, -8+LO(RA) - } - |1: - | ins_next - break; - - case BC_LOOP: - | // RA = base*8, RD = target (loop extent) - | // Note: RA/RD is only used by trace recorder to determine scope/extent - | // This opcode does NOT jump, it's only purpose is to detect a hot loop. - |.if JIT - | hotloop - |.endif - | // Fall through. Assumes BC_ILOOP follows. - break; - - case BC_ILOOP: - | // RA = base*8, RD = target (loop extent) - | ins_next - break; - - case BC_JLOOP: - |.if JIT - | // RA = base*8 (ignored), RD = traceno*8 - | lw TMP1, DISPATCH_J(trace)(DISPATCH) - | srl RD, RD, 1 - | li AT, 0 - | addu TMP1, TMP1, RD - | // Traces on MIPS don't store the trace number, so use 0. - | sw AT, DISPATCH_GL(vmstate)(DISPATCH) - | lw TRACE:TMP2, 0(TMP1) - | sw BASE, DISPATCH_GL(jit_base)(DISPATCH) - | sw L, DISPATCH_GL(jit_L)(DISPATCH) - | lw TMP2, TRACE:TMP2->mcode - | jr TMP2 - |. addiu JGL, DISPATCH, GG_DISP2G+32768 - |.endif - break; - - case BC_JMP: - | // RA = base*8 (only used by trace recorder), RD = target - | branch_RD - | ins_next - break; - - /* -- Function headers -------------------------------------------------- */ - - case BC_FUNCF: - |.if JIT - | hotcall - |.endif - case BC_FUNCV: /* NYI: compiled vararg functions. */ - | // Fall through. Assumes BC_IFUNCF/BC_IFUNCV follow. - break; - - case BC_JFUNCF: -#if !LJ_HASJIT - break; -#endif - case BC_IFUNCF: - | // BASE = new base, RA = BASE+framesize*8, RB = LFUNC, RC = nargs*8 - | lw TMP2, L->maxstack - | lbu TMP1, -4+PC2PROTO(numparams)(PC) - | lw KBASE, -4+PC2PROTO(k)(PC) - | sltu AT, TMP2, RA - | bnez AT, ->vm_growstack_l - |. sll TMP1, TMP1, 3 - if (op != BC_JFUNCF) { - | ins_next1 - } - |2: - | sltu AT, NARGS8:RC, TMP1 // Check for missing parameters. - | bnez AT, >3 - |. addu AT, BASE, NARGS8:RC - if (op == BC_JFUNCF) { - | decode_RD8a RD, INS - | b =>BC_JLOOP - |. decode_RD8b RD - } else { - | ins_next2 - } - | - |3: // Clear missing parameters. - | sw TISNIL, HI(AT) - | b <2 - |. addiu NARGS8:RC, NARGS8:RC, 8 - break; - - case BC_JFUNCV: -#if !LJ_HASJIT - break; -#endif - | NYI // NYI: compiled vararg functions - break; /* NYI: compiled vararg functions. */ - - case BC_IFUNCV: - | // BASE = new base, RA = BASE+framesize*8, RB = LFUNC, RC = nargs*8 - | addu TMP1, BASE, RC - | lw TMP2, L->maxstack - | addu TMP0, RA, RC - | sw LFUNC:RB, LO(TMP1) // Store copy of LFUNC. - | addiu TMP3, RC, 8+FRAME_VARG - | sltu AT, TMP0, TMP2 - | lw KBASE, -4+PC2PROTO(k)(PC) - | beqz AT, ->vm_growstack_l - |. sw TMP3, HI(TMP1) // Store delta + FRAME_VARG. - | lbu TMP2, -4+PC2PROTO(numparams)(PC) - | move RA, BASE - | move RC, TMP1 - | ins_next1 - | beqz TMP2, >3 - |. addiu BASE, TMP1, 8 - |1: - | lw TMP0, HI(RA) - | lw TMP3, LO(RA) - | sltu AT, RA, RC // Less args than parameters? - | move CARG1, TMP0 - | movz TMP0, TISNIL, AT // Clear missing parameters. - | movn CARG1, TISNIL, AT // Clear old fixarg slot (help the GC). - | sw TMP3, 8+LO(TMP1) - | addiu TMP2, TMP2, -1 - | sw TMP0, 8+HI(TMP1) - | addiu TMP1, TMP1, 8 - | sw CARG1, HI(RA) - | bnez TMP2, <1 - |. addiu RA, RA, 8 - |3: - | ins_next2 - break; - - case BC_FUNCC: - case BC_FUNCCW: - | // BASE = new base, RA = BASE+framesize*8, RB = CFUNC, RC = nargs*8 - if (op == BC_FUNCC) { - | lw CFUNCADDR, CFUNC:RB->f - } else { - | lw CFUNCADDR, DISPATCH_GL(wrapf)(DISPATCH) - } - | addu TMP1, RA, NARGS8:RC - | lw TMP2, L->maxstack - | addu RC, BASE, NARGS8:RC - | sw BASE, L->base - | sltu AT, TMP2, TMP1 - | sw RC, L->top - | li_vmstate C - if (op == BC_FUNCCW) { - | lw CARG2, CFUNC:RB->f - } - | bnez AT, ->vm_growstack_c // Need to grow stack. - |. move CARG1, L - | jalr CFUNCADDR // (lua_State *L [, lua_CFunction f]) - |. st_vmstate - | // Returns nresults. - | lw BASE, L->base - | sll RD, CRET1, 3 - | lw TMP1, L->top - | li_vmstate INTERP - | lw PC, FRAME_PC(BASE) // Fetch PC of caller. - | subu RA, TMP1, RD // RA = L->top - nresults*8 - | b ->vm_returnc - |. st_vmstate - break; - - /* ---------------------------------------------------------------------- */ - - default: - fprintf(stderr, "Error: undefined opcode BC_%s\n", bc_names[op]); - exit(2); - break; - } -} - -static int build_backend(BuildCtx *ctx) -{ - int op; - - dasm_growpc(Dst, BC__MAX); - - build_subroutines(ctx); - - |.code_op - for (op = 0; op < BC__MAX; op++) - build_ins(ctx, (BCOp)op, op); - - return BC__MAX; -} - -/* Emit pseudo frame-info for all assembler functions. */ -static void emit_asm_debug(BuildCtx *ctx) -{ - int fcofs = (int)((uint8_t *)ctx->glob[GLOB_vm_ffi_call] - ctx->code); - int i; - switch (ctx->mode) { - case BUILD_elfasm: - fprintf(ctx->fp, "\t.section .debug_frame,\"\",@progbits\n"); - fprintf(ctx->fp, - ".Lframe0:\n" - "\t.4byte .LECIE0-.LSCIE0\n" - ".LSCIE0:\n" - "\t.4byte 0xffffffff\n" - "\t.byte 0x1\n" - "\t.string \"\"\n" - "\t.uleb128 0x1\n" - "\t.sleb128 -4\n" - "\t.byte 31\n" - "\t.byte 0xc\n\t.uleb128 29\n\t.uleb128 0\n" - "\t.align 2\n" - ".LECIE0:\n\n"); - fprintf(ctx->fp, - ".LSFDE0:\n" - "\t.4byte .LEFDE0-.LASFDE0\n" - ".LASFDE0:\n" - "\t.4byte .Lframe0\n" - "\t.4byte .Lbegin\n" - "\t.4byte %d\n" - "\t.byte 0xe\n\t.uleb128 %d\n" - "\t.byte 0x9f\n\t.sleb128 1\n" - "\t.byte 0x9e\n\t.sleb128 2\n", - fcofs, CFRAME_SIZE); - for (i = 23; i >= 16; i--) - fprintf(ctx->fp, "\t.byte %d\n\t.uleb128 %d\n", 0x80+i, 26-i); - for (i = 30; i >= 20; i -= 2) - fprintf(ctx->fp, "\t.byte %d\n\t.uleb128 %d\n", 0x80+32+i, 42-i); - fprintf(ctx->fp, - "\t.align 2\n" - ".LEFDE0:\n\n"); -#if LJ_HASFFI - fprintf(ctx->fp, - ".LSFDE1:\n" - "\t.4byte .LEFDE1-.LASFDE1\n" - ".LASFDE1:\n" - "\t.4byte .Lframe0\n" - "\t.4byte lj_vm_ffi_call\n" - "\t.4byte %d\n" - "\t.byte 0x9f\n\t.uleb128 1\n" - "\t.byte 0x90\n\t.uleb128 2\n" - "\t.byte 0xd\n\t.uleb128 0x10\n" - "\t.align 2\n" - ".LEFDE1:\n\n", (int)ctx->codesz - fcofs); -#endif - fprintf(ctx->fp, "\t.section .eh_frame,\"aw\",@progbits\n"); - fprintf(ctx->fp, - "\t.globl lj_err_unwind_dwarf\n" - ".Lframe1:\n" - "\t.4byte .LECIE1-.LSCIE1\n" - ".LSCIE1:\n" - "\t.4byte 0\n" - "\t.byte 0x1\n" - "\t.string \"zPR\"\n" - "\t.uleb128 0x1\n" - "\t.sleb128 -4\n" - "\t.byte 31\n" - "\t.uleb128 6\n" /* augmentation length */ - "\t.byte 0\n" - "\t.4byte lj_err_unwind_dwarf\n" - "\t.byte 0\n" - "\t.byte 0xc\n\t.uleb128 29\n\t.uleb128 0\n" - "\t.align 2\n" - ".LECIE1:\n\n"); - fprintf(ctx->fp, - ".LSFDE2:\n" - "\t.4byte .LEFDE2-.LASFDE2\n" - ".LASFDE2:\n" - "\t.4byte .LASFDE2-.Lframe1\n" - "\t.4byte .Lbegin\n" - "\t.4byte %d\n" - "\t.uleb128 0\n" /* augmentation length */ - "\t.byte 0xe\n\t.uleb128 %d\n" - "\t.byte 0x9f\n\t.sleb128 1\n" - "\t.byte 0x9e\n\t.sleb128 2\n", - fcofs, CFRAME_SIZE); - for (i = 23; i >= 16; i--) - fprintf(ctx->fp, "\t.byte %d\n\t.uleb128 %d\n", 0x80+i, 26-i); - for (i = 30; i >= 20; i -= 2) - fprintf(ctx->fp, "\t.byte %d\n\t.uleb128 %d\n", 0x80+32+i, 42-i); - fprintf(ctx->fp, - "\t.align 2\n" - ".LEFDE2:\n\n"); -#if LJ_HASFFI - fprintf(ctx->fp, - ".Lframe2:\n" - "\t.4byte .LECIE2-.LSCIE2\n" - ".LSCIE2:\n" - "\t.4byte 0\n" - "\t.byte 0x1\n" - "\t.string \"zR\"\n" - "\t.uleb128 0x1\n" - "\t.sleb128 -4\n" - "\t.byte 31\n" - "\t.uleb128 1\n" /* augmentation length */ - "\t.byte 0\n" - "\t.byte 0xc\n\t.uleb128 29\n\t.uleb128 0\n" - "\t.align 2\n" - ".LECIE2:\n\n"); - fprintf(ctx->fp, - ".LSFDE3:\n" - "\t.4byte .LEFDE3-.LASFDE3\n" - ".LASFDE3:\n" - "\t.4byte .LASFDE3-.Lframe2\n" - "\t.4byte lj_vm_ffi_call\n" - "\t.4byte %d\n" - "\t.uleb128 0\n" /* augmentation length */ - "\t.byte 0x9f\n\t.uleb128 1\n" - "\t.byte 0x90\n\t.uleb128 2\n" - "\t.byte 0xd\n\t.uleb128 0x10\n" - "\t.align 2\n" - ".LEFDE3:\n\n", (int)ctx->codesz - fcofs); -#endif - break; - default: - break; - } -} - diff --git a/deps/luajit/src/vm_ppc.dasc b/deps/luajit/src/vm_ppc.dasc deleted file mode 100644 index ad8a023e..00000000 --- a/deps/luajit/src/vm_ppc.dasc +++ /dev/null @@ -1,5160 +0,0 @@ -|// Low-level VM code for PowerPC CPUs. -|// Bytecode interpreter, fast functions and helper functions. -|// Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -| -|.arch ppc -|.section code_op, code_sub -| -|.actionlist build_actionlist -|.globals GLOB_ -|.globalnames globnames -|.externnames extnames -| -|// Note: The ragged indentation of the instructions is intentional. -|// The starting columns indicate data dependencies. -| -|//----------------------------------------------------------------------- -| -|// DynASM defines used by the PPC port: -|// -|// P64 64 bit pointers (only for GPR64 testing). -|// Note: a full PPC64 _LP64 port is not planned. -|// GPR64 64 bit registers (but possibly 32 bit pointers, e.g. PS3). -|// Affects reg saves, stack layout, carry/overflow/dot flags etc. -|// FRAME32 Use 32 bit frame layout, even with GPR64 (Xbox 360). -|// TOC Need table of contents (64 bit or 32 bit variant, e.g. PS3). -|// Function pointers are really a struct: code, TOC, env (optional). -|// TOCENV Function pointers have an environment pointer, too (not on PS3). -|// PPE Power Processor Element of Cell (PS3) or Xenon (Xbox 360). -|// Must avoid (slow) micro-coded instructions. -| -|.if P64 -|.define TOC, 1 -|.define TOCENV, 1 -|.macro lpx, a, b, c; ldx a, b, c; .endmacro -|.macro lp, a, b; ld a, b; .endmacro -|.macro stp, a, b; std a, b; .endmacro -|.define decode_OPP, decode_OP8 -|.if FFI -|// Missing: Calling conventions, 64 bit regs, TOC. -|.error lib_ffi not yet implemented for PPC64 -|.endif -|.else -|.macro lpx, a, b, c; lwzx a, b, c; .endmacro -|.macro lp, a, b; lwz a, b; .endmacro -|.macro stp, a, b; stw a, b; .endmacro -|.define decode_OPP, decode_OP4 -|.endif -| -|// Convenience macros for TOC handling. -|.if TOC -|// Linker needs a TOC patch area for every external call relocation. -|.macro blex, target; bl extern target@plt; nop; .endmacro -|.macro .toc, a, b; a, b; .endmacro -|.if P64 -|.define TOC_OFS, 8 -|.define ENV_OFS, 16 -|.else -|.define TOC_OFS, 4 -|.define ENV_OFS, 8 -|.endif -|.else // No TOC. -|.macro blex, target; bl extern target@plt; .endmacro -|.macro .toc, a, b; .endmacro -|.endif -|.macro .tocenv, a, b; .if TOCENV; a, b; .endif; .endmacro -| -|.macro .gpr64, a, b; .if GPR64; a, b; .endif; .endmacro -| -|.macro andix., y, a, i -|.if PPE -| rlwinm y, a, 0, 31-lj_fls(i), 31-lj_ffs(i) -| cmpwi y, 0 -|.else -| andi. y, a, i -|.endif -|.endmacro -| -|.macro clrso, reg -|.if PPE -| li reg, 0 -| mtxer reg -|.else -| mcrxr cr0 -|.endif -|.endmacro -| -|.macro checkov, reg, noov -|.if PPE -| mfxer reg -| add reg, reg, reg -| cmpwi reg, 0 -| li reg, 0 -| mtxer reg -| bgey noov -|.else -| mcrxr cr0 -| bley noov -|.endif -|.endmacro -| -|//----------------------------------------------------------------------- -| -|// Fixed register assignments for the interpreter. -|// Don't use: r1 = sp, r2 and r13 = reserved (TOC, TLS or SDATA) -| -|// The following must be C callee-save (but BASE is often refetched). -|.define BASE, r14 // Base of current Lua stack frame. -|.define KBASE, r15 // Constants of current Lua function. -|.define PC, r16 // Next PC. -|.define DISPATCH, r17 // Opcode dispatch table. -|.define LREG, r18 // Register holding lua_State (also in SAVE_L). -|.define MULTRES, r19 // Size of multi-result: (nresults+1)*8. -|.define JGL, r31 // On-trace: global_State + 32768. -| -|// Constants for type-comparisons, stores and conversions. C callee-save. -|.define TISNUM, r22 -|.define TISNIL, r23 -|.define ZERO, r24 -|.define TOBIT, f30 // 2^52 + 2^51. -|.define TONUM, f31 // 2^52 + 2^51 + 2^31. -| -|// The following temporaries are not saved across C calls, except for RA. -|.define RA, r20 // Callee-save. -|.define RB, r10 -|.define RC, r11 -|.define RD, r12 -|.define INS, r7 // Overlaps CARG5. -| -|.define TMP0, r0 -|.define TMP1, r8 -|.define TMP2, r9 -|.define TMP3, r6 // Overlaps CARG4. -| -|// Saved temporaries. -|.define SAVE0, r21 -| -|// Calling conventions. -|.define CARG1, r3 -|.define CARG2, r4 -|.define CARG3, r5 -|.define CARG4, r6 // Overlaps TMP3. -|.define CARG5, r7 // Overlaps INS. -| -|.define FARG1, f1 -|.define FARG2, f2 -| -|.define CRET1, r3 -|.define CRET2, r4 -| -|.define TOCREG, r2 // TOC register (only used by C code). -|.define ENVREG, r11 // Environment pointer (nested C functions). -| -|// Stack layout while in interpreter. Must match with lj_frame.h. -|.if GPR64 -|.if FRAME32 -| -|// 456(sp) // \ 32/64 bit C frame info -|.define TONUM_LO, 452(sp) // | -|.define TONUM_HI, 448(sp) // | -|.define TMPD_LO, 444(sp) // | -|.define TMPD_HI, 440(sp) // | -|.define SAVE_CR, 432(sp) // | 64 bit CR save. -|.define SAVE_ERRF, 424(sp) // > Parameter save area. -|.define SAVE_NRES, 420(sp) // | -|.define SAVE_L, 416(sp) // | -|.define SAVE_PC, 412(sp) // | -|.define SAVE_MULTRES, 408(sp) // | -|.define SAVE_CFRAME, 400(sp) // / 64 bit C frame chain. -|// 392(sp) // Reserved. -|.define CFRAME_SPACE, 384 // Delta for sp. -|// Back chain for sp: 384(sp) <-- sp entering interpreter -|.define SAVE_LR, 376(sp) // 32 bit LR stored in hi-part. -|.define SAVE_GPR_, 232 // .. 232+18*8: 64 bit GPR saves. -|.define SAVE_FPR_, 88 // .. 88+18*8: 64 bit FPR saves. -|// 80(sp) // Needed for 16 byte stack frame alignment. -|// 16(sp) // Callee parameter save area (ABI mandated). -|// 8(sp) // Reserved -|// Back chain for sp: 0(sp) <-- sp while in interpreter -|// 32 bit sp stored in hi-part of 0(sp). -| -|.define TMPD_BLO, 447(sp) -|.define TMPD, TMPD_HI -|.define TONUM_D, TONUM_HI -| -|.else -| -|// 508(sp) // \ 32 bit C frame info. -|.define SAVE_ERRF, 472(sp) // | -|.define SAVE_NRES, 468(sp) // | -|.define SAVE_L, 464(sp) // > Parameter save area. -|.define SAVE_PC, 460(sp) // | -|.define SAVE_MULTRES, 456(sp) // | -|.define SAVE_CFRAME, 448(sp) // / 64 bit C frame chain. -|.define SAVE_LR, 416(sp) -|.define CFRAME_SPACE, 400 // Delta for sp. -|// Back chain for sp: 400(sp) <-- sp entering interpreter -|.define SAVE_FPR_, 256 // .. 256+18*8: 64 bit FPR saves. -|.define SAVE_GPR_, 112 // .. 112+18*8: 64 bit GPR saves. -|// 48(sp) // Callee parameter save area (ABI mandated). -|.define SAVE_TOC, 40(sp) // TOC save area. -|.define TMPD_LO, 36(sp) // \ Link editor temp (ABI mandated). -|.define TMPD_HI, 32(sp) // / -|.define TONUM_LO, 28(sp) // \ Compiler temp (ABI mandated). -|.define TONUM_HI, 24(sp) // / -|// Next frame lr: 16(sp) -|.define SAVE_CR, 8(sp) // 64 bit CR save. -|// Back chain for sp: 0(sp) <-- sp while in interpreter -| -|.define TMPD_BLO, 39(sp) -|.define TMPD, TMPD_HI -|.define TONUM_D, TONUM_HI -| -|.endif -|.else -| -|.define SAVE_LR, 276(sp) -|.define CFRAME_SPACE, 272 // Delta for sp. -|// Back chain for sp: 272(sp) <-- sp entering interpreter -|.define SAVE_FPR_, 128 // .. 128+18*8: 64 bit FPR saves. -|.define SAVE_GPR_, 56 // .. 56+18*4: 32 bit GPR saves. -|.define SAVE_CR, 52(sp) // 32 bit CR save. -|.define SAVE_ERRF, 48(sp) // 32 bit C frame info. -|.define SAVE_NRES, 44(sp) -|.define SAVE_CFRAME, 40(sp) -|.define SAVE_L, 36(sp) -|.define SAVE_PC, 32(sp) -|.define SAVE_MULTRES, 28(sp) -|.define UNUSED1, 24(sp) -|.define TMPD_LO, 20(sp) -|.define TMPD_HI, 16(sp) -|.define TONUM_LO, 12(sp) -|.define TONUM_HI, 8(sp) -|// Next frame lr: 4(sp) -|// Back chain for sp: 0(sp) <-- sp while in interpreter -| -|.define TMPD_BLO, 23(sp) -|.define TMPD, TMPD_HI -|.define TONUM_D, TONUM_HI -| -|.endif -| -|.macro save_, reg -|.if GPR64 -| std r..reg, SAVE_GPR_+(reg-14)*8(sp) -|.else -| stw r..reg, SAVE_GPR_+(reg-14)*4(sp) -|.endif -| stfd f..reg, SAVE_FPR_+(reg-14)*8(sp) -|.endmacro -|.macro rest_, reg -|.if GPR64 -| ld r..reg, SAVE_GPR_+(reg-14)*8(sp) -|.else -| lwz r..reg, SAVE_GPR_+(reg-14)*4(sp) -|.endif -| lfd f..reg, SAVE_FPR_+(reg-14)*8(sp) -|.endmacro -| -|.macro saveregs -|.if GPR64 and not FRAME32 -| stdu sp, -CFRAME_SPACE(sp) -|.else -| stwu sp, -CFRAME_SPACE(sp) -|.endif -| save_ 14; save_ 15; save_ 16 -| mflr r0 -| save_ 17; save_ 18; save_ 19; save_ 20; save_ 21; save_ 22 -|.if GPR64 and not FRAME32 -| std r0, SAVE_LR -|.else -| stw r0, SAVE_LR -|.endif -| save_ 23; save_ 24; save_ 25 -| mfcr r0 -| save_ 26; save_ 27; save_ 28; save_ 29; save_ 30; save_ 31 -|.if GPR64 -| std r0, SAVE_CR -|.else -| stw r0, SAVE_CR -|.endif -| .toc std TOCREG, SAVE_TOC -|.endmacro -| -|.macro restoreregs -|.if GPR64 and not FRAME32 -| ld r0, SAVE_LR -|.else -| lwz r0, SAVE_LR -|.endif -|.if GPR64 -| ld r12, SAVE_CR -|.else -| lwz r12, SAVE_CR -|.endif -| rest_ 14; rest_ 15; rest_ 16; rest_ 17; rest_ 18; rest_ 19 -| mtlr r0; -|.if PPE; mtocrf 0x20, r12; .else; mtcrf 0x38, r12; .endif -| rest_ 20; rest_ 21; rest_ 22; rest_ 23; rest_ 24; rest_ 25 -|.if PPE; mtocrf 0x10, r12; .endif -| rest_ 26; rest_ 27; rest_ 28; rest_ 29; rest_ 30; rest_ 31 -|.if PPE; mtocrf 0x08, r12; .endif -| addi sp, sp, CFRAME_SPACE -|.endmacro -| -|// Type definitions. Some of these are only used for documentation. -|.type L, lua_State, LREG -|.type GL, global_State -|.type TVALUE, TValue -|.type GCOBJ, GCobj -|.type STR, GCstr -|.type TAB, GCtab -|.type LFUNC, GCfuncL -|.type CFUNC, GCfuncC -|.type PROTO, GCproto -|.type UPVAL, GCupval -|.type NODE, Node -|.type NARGS8, int -|.type TRACE, GCtrace -| -|//----------------------------------------------------------------------- -| -|// These basic macros should really be part of DynASM. -|.macro srwi, rx, ry, n; rlwinm rx, ry, 32-n, n, 31; .endmacro -|.macro slwi, rx, ry, n; rlwinm rx, ry, n, 0, 31-n; .endmacro -|.macro rotlwi, rx, ry, n; rlwinm rx, ry, n, 0, 31; .endmacro -|.macro rotlw, rx, ry, rn; rlwnm rx, ry, rn, 0, 31; .endmacro -|.macro subi, rx, ry, i; addi rx, ry, -i; .endmacro -| -|// Trap for not-yet-implemented parts. -|.macro NYI; tw 4, sp, sp; .endmacro -| -|// int/FP conversions. -|.macro tonum_i, freg, reg -| xoris reg, reg, 0x8000 -| stw reg, TONUM_LO -| lfd freg, TONUM_D -| fsub freg, freg, TONUM -|.endmacro -| -|.macro tonum_u, freg, reg -| stw reg, TONUM_LO -| lfd freg, TONUM_D -| fsub freg, freg, TOBIT -|.endmacro -| -|.macro toint, reg, freg, tmpfreg -| fctiwz tmpfreg, freg -| stfd tmpfreg, TMPD -| lwz reg, TMPD_LO -|.endmacro -| -|.macro toint, reg, freg -| toint reg, freg, freg -|.endmacro -| -|//----------------------------------------------------------------------- -| -|// Access to frame relative to BASE. -|.define FRAME_PC, -8 -|.define FRAME_FUNC, -4 -| -|// Instruction decode. -|.macro decode_OP4, dst, ins; rlwinm dst, ins, 2, 22, 29; .endmacro -|.macro decode_OP8, dst, ins; rlwinm dst, ins, 3, 21, 28; .endmacro -|.macro decode_RA8, dst, ins; rlwinm dst, ins, 27, 21, 28; .endmacro -|.macro decode_RB8, dst, ins; rlwinm dst, ins, 11, 21, 28; .endmacro -|.macro decode_RC8, dst, ins; rlwinm dst, ins, 19, 21, 28; .endmacro -|.macro decode_RD8, dst, ins; rlwinm dst, ins, 19, 13, 28; .endmacro -| -|.macro decode_OP1, dst, ins; rlwinm dst, ins, 0, 24, 31; .endmacro -|.macro decode_RD4, dst, ins; rlwinm dst, ins, 18, 14, 29; .endmacro -| -|// Instruction fetch. -|.macro ins_NEXT1 -| lwz INS, 0(PC) -| addi PC, PC, 4 -|.endmacro -|// Instruction decode+dispatch. Note: optimized for e300! -|.macro ins_NEXT2 -| decode_OPP TMP1, INS -| lpx TMP0, DISPATCH, TMP1 -| mtctr TMP0 -| decode_RB8 RB, INS -| decode_RD8 RD, INS -| decode_RA8 RA, INS -| decode_RC8 RC, INS -| bctr -|.endmacro -|.macro ins_NEXT -| ins_NEXT1 -| ins_NEXT2 -|.endmacro -| -|// Instruction footer. -|.if 1 -| // Replicated dispatch. Less unpredictable branches, but higher I-Cache use. -| .define ins_next, ins_NEXT -| .define ins_next_, ins_NEXT -| .define ins_next1, ins_NEXT1 -| .define ins_next2, ins_NEXT2 -|.else -| // Common dispatch. Lower I-Cache use, only one (very) unpredictable branch. -| // Affects only certain kinds of benchmarks (and only with -j off). -| .macro ins_next -| b ->ins_next -| .endmacro -| .macro ins_next1 -| .endmacro -| .macro ins_next2 -| b ->ins_next -| .endmacro -| .macro ins_next_ -| ->ins_next: -| ins_NEXT -| .endmacro -|.endif -| -|// Call decode and dispatch. -|.macro ins_callt -| // BASE = new base, RB = LFUNC/CFUNC, RC = nargs*8, FRAME_PC(BASE) = PC -| lwz PC, LFUNC:RB->pc -| lwz INS, 0(PC) -| addi PC, PC, 4 -| decode_OPP TMP1, INS -| decode_RA8 RA, INS -| lpx TMP0, DISPATCH, TMP1 -| add RA, RA, BASE -| mtctr TMP0 -| bctr -|.endmacro -| -|.macro ins_call -| // BASE = new base, RB = LFUNC/CFUNC, RC = nargs*8, PC = caller PC -| stw PC, FRAME_PC(BASE) -| ins_callt -|.endmacro -| -|//----------------------------------------------------------------------- -| -|// Macros to test operand types. -|.macro checknum, reg; cmplw reg, TISNUM; .endmacro -|.macro checknum, cr, reg; cmplw cr, reg, TISNUM; .endmacro -|.macro checkstr, reg; cmpwi reg, LJ_TSTR; .endmacro -|.macro checktab, reg; cmpwi reg, LJ_TTAB; .endmacro -|.macro checkfunc, reg; cmpwi reg, LJ_TFUNC; .endmacro -|.macro checknil, reg; cmpwi reg, LJ_TNIL; .endmacro -| -|.macro branch_RD -| srwi TMP0, RD, 1 -| addis PC, PC, -(BCBIAS_J*4 >> 16) -| add PC, PC, TMP0 -|.endmacro -| -|// Assumes DISPATCH is relative to GL. -#define DISPATCH_GL(field) (GG_DISP2G + (int)offsetof(global_State, field)) -#define DISPATCH_J(field) (GG_DISP2J + (int)offsetof(jit_State, field)) -| -#define PC2PROTO(field) ((int)offsetof(GCproto, field)-(int)sizeof(GCproto)) -| -|.macro hotcheck, delta, target -| rlwinm TMP1, PC, 31, 25, 30 -| addi TMP1, TMP1, GG_DISP2HOT -| lhzx TMP2, DISPATCH, TMP1 -| addic. TMP2, TMP2, -delta -| sthx TMP2, DISPATCH, TMP1 -| blt target -|.endmacro -| -|.macro hotloop -| hotcheck HOTCOUNT_LOOP, ->vm_hotloop -|.endmacro -| -|.macro hotcall -| hotcheck HOTCOUNT_CALL, ->vm_hotcall -|.endmacro -| -|// Set current VM state. Uses TMP0. -|.macro li_vmstate, st; li TMP0, ~LJ_VMST_..st; .endmacro -|.macro st_vmstate; stw TMP0, DISPATCH_GL(vmstate)(DISPATCH); .endmacro -| -|// Move table write barrier back. Overwrites mark and tmp. -|.macro barrierback, tab, mark, tmp -| lwz tmp, DISPATCH_GL(gc.grayagain)(DISPATCH) -| // Assumes LJ_GC_BLACK is 0x04. -| rlwinm mark, mark, 0, 30, 28 // black2gray(tab) -| stw tab, DISPATCH_GL(gc.grayagain)(DISPATCH) -| stb mark, tab->marked -| stw tmp, tab->gclist -|.endmacro -| -|//----------------------------------------------------------------------- - -/* Generate subroutines used by opcodes and other parts of the VM. */ -/* The .code_sub section should be last to help static branch prediction. */ -static void build_subroutines(BuildCtx *ctx) -{ - |.code_sub - | - |//----------------------------------------------------------------------- - |//-- Return handling ---------------------------------------------------- - |//----------------------------------------------------------------------- - | - |->vm_returnp: - | // See vm_return. Also: TMP2 = previous base. - | andix. TMP0, PC, FRAME_P - | li TMP1, LJ_TTRUE - | beq ->cont_dispatch - | - | // Return from pcall or xpcall fast func. - | lwz PC, FRAME_PC(TMP2) // Fetch PC of previous frame. - | mr BASE, TMP2 // Restore caller base. - | // Prepending may overwrite the pcall frame, so do it at the end. - | stwu TMP1, FRAME_PC(RA) // Prepend true to results. - | - |->vm_returnc: - | addi RD, RD, 8 // RD = (nresults+1)*8. - | andix. TMP0, PC, FRAME_TYPE - | cmpwi cr1, RD, 0 - | li CRET1, LUA_YIELD - | beq cr1, ->vm_unwind_c_eh - | mr MULTRES, RD - | beq ->BC_RET_Z // Handle regular return to Lua. - | - |->vm_return: - | // BASE = base, RA = resultptr, RD/MULTRES = (nresults+1)*8, PC = return - | // TMP0 = PC & FRAME_TYPE - | cmpwi TMP0, FRAME_C - | rlwinm TMP2, PC, 0, 0, 28 - | li_vmstate C - | sub TMP2, BASE, TMP2 // TMP2 = previous base. - | bney ->vm_returnp - | - | addic. TMP1, RD, -8 - | stp TMP2, L->base - | lwz TMP2, SAVE_NRES - | subi BASE, BASE, 8 - | st_vmstate - | slwi TMP2, TMP2, 3 - | beq >2 - |1: - | addic. TMP1, TMP1, -8 - | lfd f0, 0(RA) - | addi RA, RA, 8 - | stfd f0, 0(BASE) - | addi BASE, BASE, 8 - | bney <1 - | - |2: - | cmpw TMP2, RD // More/less results wanted? - | bne >6 - |3: - | stp BASE, L->top // Store new top. - | - |->vm_leave_cp: - | lp TMP0, SAVE_CFRAME // Restore previous C frame. - | li CRET1, 0 // Ok return status for vm_pcall. - | stp TMP0, L->cframe - | - |->vm_leave_unw: - | restoreregs - | blr - | - |6: - | ble >7 // Less results wanted? - | // More results wanted. Check stack size and fill up results with nil. - | lwz TMP1, L->maxstack - | cmplw BASE, TMP1 - | bge >8 - | stw TISNIL, 0(BASE) - | addi RD, RD, 8 - | addi BASE, BASE, 8 - | b <2 - | - |7: // Less results wanted. - | subfic TMP3, TMP2, 0 // LUA_MULTRET+1 case? - | sub TMP0, RD, TMP2 - | subfe TMP1, TMP1, TMP1 // TMP1 = TMP2 == 0 ? 0 : -1 - | and TMP0, TMP0, TMP1 - | sub BASE, BASE, TMP0 // Either keep top or shrink it. - | b <3 - | - |8: // Corner case: need to grow stack for filling up results. - | // This can happen if: - | // - A C function grows the stack (a lot). - | // - The GC shrinks the stack in between. - | // - A return back from a lua_call() with (high) nresults adjustment. - | stp BASE, L->top // Save current top held in BASE (yes). - | mr SAVE0, RD - | srwi CARG2, TMP2, 3 - | mr CARG1, L - | bl extern lj_state_growstack // (lua_State *L, int n) - | lwz TMP2, SAVE_NRES - | mr RD, SAVE0 - | slwi TMP2, TMP2, 3 - | lp BASE, L->top // Need the (realloced) L->top in BASE. - | b <2 - | - |->vm_unwind_c: // Unwind C stack, return from vm_pcall. - | // (void *cframe, int errcode) - | mr sp, CARG1 - | mr CRET1, CARG2 - |->vm_unwind_c_eh: // Landing pad for external unwinder. - | lwz L, SAVE_L - | .toc ld TOCREG, SAVE_TOC - | li TMP0, ~LJ_VMST_C - | lwz GL:TMP1, L->glref - | stw TMP0, GL:TMP1->vmstate - | b ->vm_leave_unw - | - |->vm_unwind_ff: // Unwind C stack, return from ff pcall. - | // (void *cframe) - |.if GPR64 - | rldicr sp, CARG1, 0, 61 - |.else - | rlwinm sp, CARG1, 0, 0, 29 - |.endif - |->vm_unwind_ff_eh: // Landing pad for external unwinder. - | lwz L, SAVE_L - | .toc ld TOCREG, SAVE_TOC - | li TISNUM, LJ_TISNUM // Setup type comparison constants. - | lp BASE, L->base - | lus TMP3, 0x59c0 // TOBIT = 2^52 + 2^51 (float). - | lwz DISPATCH, L->glref // Setup pointer to dispatch table. - | li ZERO, 0 - | stw TMP3, TMPD - | li TMP1, LJ_TFALSE - | ori TMP3, TMP3, 0x0004 // TONUM = 2^52 + 2^51 + 2^31 (float). - | li TISNIL, LJ_TNIL - | li_vmstate INTERP - | lfs TOBIT, TMPD - | lwz PC, FRAME_PC(BASE) // Fetch PC of previous frame. - | la RA, -8(BASE) // Results start at BASE-8. - | stw TMP3, TMPD - | addi DISPATCH, DISPATCH, GG_G2DISP - | stw TMP1, 0(RA) // Prepend false to error message. - | li RD, 16 // 2 results: false + error message. - | st_vmstate - | lfs TONUM, TMPD - | b ->vm_returnc - | - |//----------------------------------------------------------------------- - |//-- Grow stack for calls ----------------------------------------------- - |//----------------------------------------------------------------------- - | - |->vm_growstack_c: // Grow stack for C function. - | li CARG2, LUA_MINSTACK - | b >2 - | - |->vm_growstack_l: // Grow stack for Lua function. - | // BASE = new base, RA = BASE+framesize*8, RC = nargs*8, PC = first PC - | add RC, BASE, RC - | sub RA, RA, BASE - | stp BASE, L->base - | addi PC, PC, 4 // Must point after first instruction. - | stp RC, L->top - | srwi CARG2, RA, 3 - |2: - | // L->base = new base, L->top = top - | stw PC, SAVE_PC - | mr CARG1, L - | bl extern lj_state_growstack // (lua_State *L, int n) - | lp BASE, L->base - | lp RC, L->top - | lwz LFUNC:RB, FRAME_FUNC(BASE) - | sub RC, RC, BASE - | // BASE = new base, RB = LFUNC/CFUNC, RC = nargs*8, FRAME_PC(BASE) = PC - | ins_callt // Just retry the call. - | - |//----------------------------------------------------------------------- - |//-- Entry points into the assembler VM --------------------------------- - |//----------------------------------------------------------------------- - | - |->vm_resume: // Setup C frame and resume thread. - | // (lua_State *L, TValue *base, int nres1 = 0, ptrdiff_t ef = 0) - | saveregs - | mr L, CARG1 - | lwz DISPATCH, L->glref // Setup pointer to dispatch table. - | mr BASE, CARG2 - | lbz TMP1, L->status - | stw L, SAVE_L - | li PC, FRAME_CP - | addi TMP0, sp, CFRAME_RESUME - | addi DISPATCH, DISPATCH, GG_G2DISP - | stw CARG3, SAVE_NRES - | cmplwi TMP1, 0 - | stw CARG3, SAVE_ERRF - | stp TMP0, L->cframe - | stp CARG3, SAVE_CFRAME - | stw CARG1, SAVE_PC // Any value outside of bytecode is ok. - | beq >3 - | - | // Resume after yield (like a return). - | mr RA, BASE - | lp BASE, L->base - | li TISNUM, LJ_TISNUM // Setup type comparison constants. - | lp TMP1, L->top - | lwz PC, FRAME_PC(BASE) - | lus TMP3, 0x59c0 // TOBIT = 2^52 + 2^51 (float). - | stb CARG3, L->status - | stw TMP3, TMPD - | ori TMP3, TMP3, 0x0004 // TONUM = 2^52 + 2^51 + 2^31 (float). - | lfs TOBIT, TMPD - | sub RD, TMP1, BASE - | stw TMP3, TMPD - | lus TMP0, 0x4338 // Hiword of 2^52 + 2^51 (double) - | addi RD, RD, 8 - | stw TMP0, TONUM_HI - | li_vmstate INTERP - | li ZERO, 0 - | st_vmstate - | andix. TMP0, PC, FRAME_TYPE - | mr MULTRES, RD - | lfs TONUM, TMPD - | li TISNIL, LJ_TNIL - | beq ->BC_RET_Z - | b ->vm_return - | - |->vm_pcall: // Setup protected C frame and enter VM. - | // (lua_State *L, TValue *base, int nres1, ptrdiff_t ef) - | saveregs - | li PC, FRAME_CP - | stw CARG4, SAVE_ERRF - | b >1 - | - |->vm_call: // Setup C frame and enter VM. - | // (lua_State *L, TValue *base, int nres1) - | saveregs - | li PC, FRAME_C - | - |1: // Entry point for vm_pcall above (PC = ftype). - | lp TMP1, L:CARG1->cframe - | stw CARG3, SAVE_NRES - | mr L, CARG1 - | stw CARG1, SAVE_L - | mr BASE, CARG2 - | stp sp, L->cframe // Add our C frame to cframe chain. - | lwz DISPATCH, L->glref // Setup pointer to dispatch table. - | stw CARG1, SAVE_PC // Any value outside of bytecode is ok. - | stp TMP1, SAVE_CFRAME - | addi DISPATCH, DISPATCH, GG_G2DISP - | - |3: // Entry point for vm_cpcall/vm_resume (BASE = base, PC = ftype). - | lp TMP2, L->base // TMP2 = old base (used in vmeta_call). - | li TISNUM, LJ_TISNUM // Setup type comparison constants. - | lp TMP1, L->top - | lus TMP3, 0x59c0 // TOBIT = 2^52 + 2^51 (float). - | add PC, PC, BASE - | stw TMP3, TMPD - | li ZERO, 0 - | ori TMP3, TMP3, 0x0004 // TONUM = 2^52 + 2^51 + 2^31 (float). - | lfs TOBIT, TMPD - | sub PC, PC, TMP2 // PC = frame delta + frame type - | stw TMP3, TMPD - | lus TMP0, 0x4338 // Hiword of 2^52 + 2^51 (double) - | sub NARGS8:RC, TMP1, BASE - | stw TMP0, TONUM_HI - | li_vmstate INTERP - | lfs TONUM, TMPD - | li TISNIL, LJ_TNIL - | st_vmstate - | - |->vm_call_dispatch: - | // TMP2 = old base, BASE = new base, RC = nargs*8, PC = caller PC - | lwz TMP0, FRAME_PC(BASE) - | lwz LFUNC:RB, FRAME_FUNC(BASE) - | checkfunc TMP0; bne ->vmeta_call - | - |->vm_call_dispatch_f: - | ins_call - | // BASE = new base, RB = func, RC = nargs*8, PC = caller PC - | - |->vm_cpcall: // Setup protected C frame, call C. - | // (lua_State *L, lua_CFunction func, void *ud, lua_CPFunction cp) - | saveregs - | mr L, CARG1 - | lwz TMP0, L:CARG1->stack - | stw CARG1, SAVE_L - | lp TMP1, L->top - | stw CARG1, SAVE_PC // Any value outside of bytecode is ok. - | sub TMP0, TMP0, TMP1 // Compute -savestack(L, L->top). - | lp TMP1, L->cframe - | stp sp, L->cframe // Add our C frame to cframe chain. - | .toc lp CARG4, 0(CARG4) - | li TMP2, 0 - | stw TMP0, SAVE_NRES // Neg. delta means cframe w/o frame. - | stw TMP2, SAVE_ERRF // No error function. - | stp TMP1, SAVE_CFRAME - | mtctr CARG4 - | bctrl // (lua_State *L, lua_CFunction func, void *ud) - |.if PPE - | mr BASE, CRET1 - | cmpwi CRET1, 0 - |.else - | mr. BASE, CRET1 - |.endif - | lwz DISPATCH, L->glref // Setup pointer to dispatch table. - | li PC, FRAME_CP - | addi DISPATCH, DISPATCH, GG_G2DISP - | bne <3 // Else continue with the call. - | b ->vm_leave_cp // No base? Just remove C frame. - | - |//----------------------------------------------------------------------- - |//-- Metamethod handling ------------------------------------------------ - |//----------------------------------------------------------------------- - | - |// The lj_meta_* functions (except for lj_meta_cat) don't reallocate the - |// stack, so BASE doesn't need to be reloaded across these calls. - | - |//-- Continuation dispatch ---------------------------------------------- - | - |->cont_dispatch: - | // BASE = meta base, RA = resultptr, RD = (nresults+1)*8 - | lwz TMP0, -12(BASE) // Continuation. - | mr RB, BASE - | mr BASE, TMP2 // Restore caller BASE. - | lwz LFUNC:TMP1, FRAME_FUNC(TMP2) - |.if FFI - | cmplwi TMP0, 1 - |.endif - | lwz PC, -16(RB) // Restore PC from [cont|PC]. - | subi TMP2, RD, 8 - | lwz TMP1, LFUNC:TMP1->pc - | stwx TISNIL, RA, TMP2 // Ensure one valid arg. - |.if FFI - | ble >1 - |.endif - | lwz KBASE, PC2PROTO(k)(TMP1) - | // BASE = base, RA = resultptr, RB = meta base - | mtctr TMP0 - | bctr // Jump to continuation. - | - |.if FFI - |1: - | beq ->cont_ffi_callback // cont = 1: return from FFI callback. - | // cont = 0: tailcall from C function. - | subi TMP1, RB, 16 - | sub RC, TMP1, BASE - | b ->vm_call_tail - |.endif - | - |->cont_cat: // RA = resultptr, RB = meta base - | lwz INS, -4(PC) - | subi CARG2, RB, 16 - | decode_RB8 SAVE0, INS - | lfd f0, 0(RA) - | add TMP1, BASE, SAVE0 - | stp BASE, L->base - | cmplw TMP1, CARG2 - | sub CARG3, CARG2, TMP1 - | decode_RA8 RA, INS - | stfd f0, 0(CARG2) - | bney ->BC_CAT_Z - | stfdx f0, BASE, RA - | b ->cont_nop - | - |//-- Table indexing metamethods ----------------------------------------- - | - |->vmeta_tgets1: - | la CARG3, DISPATCH_GL(tmptv)(DISPATCH) - | li TMP0, LJ_TSTR - | decode_RB8 RB, INS - | stw STR:RC, 4(CARG3) - | add CARG2, BASE, RB - | stw TMP0, 0(CARG3) - | b >1 - | - |->vmeta_tgets: - | la CARG2, DISPATCH_GL(tmptv)(DISPATCH) - | li TMP0, LJ_TTAB - | stw TAB:RB, 4(CARG2) - | la CARG3, DISPATCH_GL(tmptv2)(DISPATCH) - | stw TMP0, 0(CARG2) - | li TMP1, LJ_TSTR - | stw STR:RC, 4(CARG3) - | stw TMP1, 0(CARG3) - | b >1 - | - |->vmeta_tgetb: // TMP0 = index - |.if not DUALNUM - | tonum_u f0, TMP0 - |.endif - | decode_RB8 RB, INS - | la CARG3, DISPATCH_GL(tmptv)(DISPATCH) - | add CARG2, BASE, RB - |.if DUALNUM - | stw TISNUM, 0(CARG3) - | stw TMP0, 4(CARG3) - |.else - | stfd f0, 0(CARG3) - |.endif - | b >1 - | - |->vmeta_tgetv: - | decode_RB8 RB, INS - | decode_RC8 RC, INS - | add CARG2, BASE, RB - | add CARG3, BASE, RC - |1: - | stp BASE, L->base - | mr CARG1, L - | stw PC, SAVE_PC - | bl extern lj_meta_tget // (lua_State *L, TValue *o, TValue *k) - | // Returns TValue * (finished) or NULL (metamethod). - | cmplwi CRET1, 0 - | beq >3 - | lfd f0, 0(CRET1) - | ins_next1 - | stfdx f0, BASE, RA - | ins_next2 - | - |3: // Call __index metamethod. - | // BASE = base, L->top = new base, stack = cont/func/t/k - | subfic TMP1, BASE, FRAME_CONT - | lp BASE, L->top - | stw PC, -16(BASE) // [cont|PC] - | add PC, TMP1, BASE - | lwz LFUNC:RB, FRAME_FUNC(BASE) // Guaranteed to be a function here. - | li NARGS8:RC, 16 // 2 args for func(t, k). - | b ->vm_call_dispatch_f - | - |//----------------------------------------------------------------------- - | - |->vmeta_tsets1: - | la CARG3, DISPATCH_GL(tmptv)(DISPATCH) - | li TMP0, LJ_TSTR - | decode_RB8 RB, INS - | stw STR:RC, 4(CARG3) - | add CARG2, BASE, RB - | stw TMP0, 0(CARG3) - | b >1 - | - |->vmeta_tsets: - | la CARG2, DISPATCH_GL(tmptv)(DISPATCH) - | li TMP0, LJ_TTAB - | stw TAB:RB, 4(CARG2) - | la CARG3, DISPATCH_GL(tmptv2)(DISPATCH) - | stw TMP0, 0(CARG2) - | li TMP1, LJ_TSTR - | stw STR:RC, 4(CARG3) - | stw TMP1, 0(CARG3) - | b >1 - | - |->vmeta_tsetb: // TMP0 = index - |.if not DUALNUM - | tonum_u f0, TMP0 - |.endif - | decode_RB8 RB, INS - | la CARG3, DISPATCH_GL(tmptv)(DISPATCH) - | add CARG2, BASE, RB - |.if DUALNUM - | stw TISNUM, 0(CARG3) - | stw TMP0, 4(CARG3) - |.else - | stfd f0, 0(CARG3) - |.endif - | b >1 - | - |->vmeta_tsetv: - | decode_RB8 RB, INS - | decode_RC8 RC, INS - | add CARG2, BASE, RB - | add CARG3, BASE, RC - |1: - | stp BASE, L->base - | mr CARG1, L - | stw PC, SAVE_PC - | bl extern lj_meta_tset // (lua_State *L, TValue *o, TValue *k) - | // Returns TValue * (finished) or NULL (metamethod). - | cmplwi CRET1, 0 - | lfdx f0, BASE, RA - | beq >3 - | // NOBARRIER: lj_meta_tset ensures the table is not black. - | ins_next1 - | stfd f0, 0(CRET1) - | ins_next2 - | - |3: // Call __newindex metamethod. - | // BASE = base, L->top = new base, stack = cont/func/t/k/(v) - | subfic TMP1, BASE, FRAME_CONT - | lp BASE, L->top - | stw PC, -16(BASE) // [cont|PC] - | add PC, TMP1, BASE - | lwz LFUNC:RB, FRAME_FUNC(BASE) // Guaranteed to be a function here. - | li NARGS8:RC, 24 // 3 args for func(t, k, v) - | stfd f0, 16(BASE) // Copy value to third argument. - | b ->vm_call_dispatch_f - | - |//-- Comparison metamethods --------------------------------------------- - | - |->vmeta_comp: - | mr CARG1, L - | subi PC, PC, 4 - |.if DUALNUM - | mr CARG2, RA - |.else - | add CARG2, BASE, RA - |.endif - | stw PC, SAVE_PC - |.if DUALNUM - | mr CARG3, RD - |.else - | add CARG3, BASE, RD - |.endif - | stp BASE, L->base - | decode_OP1 CARG4, INS - | bl extern lj_meta_comp // (lua_State *L, TValue *o1, *o2, int op) - | // Returns 0/1 or TValue * (metamethod). - |3: - | cmplwi CRET1, 1 - | bgt ->vmeta_binop - | subfic CRET1, CRET1, 0 - |4: - | lwz INS, 0(PC) - | addi PC, PC, 4 - | decode_RD4 TMP2, INS - | addis TMP2, TMP2, -(BCBIAS_J*4 >> 16) - | and TMP2, TMP2, CRET1 - | add PC, PC, TMP2 - |->cont_nop: - | ins_next - | - |->cont_ra: // RA = resultptr - | lwz INS, -4(PC) - | lfd f0, 0(RA) - | decode_RA8 TMP1, INS - | stfdx f0, BASE, TMP1 - | b ->cont_nop - | - |->cont_condt: // RA = resultptr - | lwz TMP0, 0(RA) - | .gpr64 extsw TMP0, TMP0 - | subfic TMP0, TMP0, LJ_TTRUE // Branch if result is true. - | subfe CRET1, CRET1, CRET1 - | not CRET1, CRET1 - | b <4 - | - |->cont_condf: // RA = resultptr - | lwz TMP0, 0(RA) - | .gpr64 extsw TMP0, TMP0 - | subfic TMP0, TMP0, LJ_TTRUE // Branch if result is false. - | subfe CRET1, CRET1, CRET1 - | b <4 - | - |->vmeta_equal: - | // CARG2, CARG3, CARG4 are already set by BC_ISEQV/BC_ISNEV. - | subi PC, PC, 4 - | stp BASE, L->base - | mr CARG1, L - | stw PC, SAVE_PC - | bl extern lj_meta_equal // (lua_State *L, GCobj *o1, *o2, int ne) - | // Returns 0/1 or TValue * (metamethod). - | b <3 - | - |->vmeta_equal_cd: - |.if FFI - | mr CARG2, INS - | subi PC, PC, 4 - | stp BASE, L->base - | mr CARG1, L - | stw PC, SAVE_PC - | bl extern lj_meta_equal_cd // (lua_State *L, BCIns op) - | // Returns 0/1 or TValue * (metamethod). - | b <3 - |.endif - | - |//-- Arithmetic metamethods --------------------------------------------- - | - |->vmeta_arith_nv: - | add CARG3, KBASE, RC - | add CARG4, BASE, RB - | b >1 - |->vmeta_arith_nv2: - |.if DUALNUM - | mr CARG3, RC - | mr CARG4, RB - | b >1 - |.endif - | - |->vmeta_unm: - | mr CARG3, RD - | mr CARG4, RD - | b >1 - | - |->vmeta_arith_vn: - | add CARG3, BASE, RB - | add CARG4, KBASE, RC - | b >1 - | - |->vmeta_arith_vv: - | add CARG3, BASE, RB - | add CARG4, BASE, RC - |.if DUALNUM - | b >1 - |.endif - |->vmeta_arith_vn2: - |->vmeta_arith_vv2: - |.if DUALNUM - | mr CARG3, RB - | mr CARG4, RC - |.endif - |1: - | add CARG2, BASE, RA - | stp BASE, L->base - | mr CARG1, L - | stw PC, SAVE_PC - | decode_OP1 CARG5, INS // Caveat: CARG5 overlaps INS. - | bl extern lj_meta_arith // (lua_State *L, TValue *ra,*rb,*rc, BCReg op) - | // Returns NULL (finished) or TValue * (metamethod). - | cmplwi CRET1, 0 - | beq ->cont_nop - | - | // Call metamethod for binary op. - |->vmeta_binop: - | // BASE = old base, CRET1 = new base, stack = cont/func/o1/o2 - | sub TMP1, CRET1, BASE - | stw PC, -16(CRET1) // [cont|PC] - | mr TMP2, BASE - | addi PC, TMP1, FRAME_CONT - | mr BASE, CRET1 - | li NARGS8:RC, 16 // 2 args for func(o1, o2). - | b ->vm_call_dispatch - | - |->vmeta_len: -#if LJ_52 - | mr SAVE0, CARG1 -#endif - | mr CARG2, RD - | stp BASE, L->base - | mr CARG1, L - | stw PC, SAVE_PC - | bl extern lj_meta_len // (lua_State *L, TValue *o) - | // Returns NULL (retry) or TValue * (metamethod base). -#if LJ_52 - | cmplwi CRET1, 0 - | bne ->vmeta_binop // Binop call for compatibility. - | mr CARG1, SAVE0 - | b ->BC_LEN_Z -#else - | b ->vmeta_binop // Binop call for compatibility. -#endif - | - |//-- Call metamethod ---------------------------------------------------- - | - |->vmeta_call: // Resolve and call __call metamethod. - | // TMP2 = old base, BASE = new base, RC = nargs*8 - | mr CARG1, L - | stp TMP2, L->base // This is the callers base! - | subi CARG2, BASE, 8 - | stw PC, SAVE_PC - | add CARG3, BASE, RC - | mr SAVE0, NARGS8:RC - | bl extern lj_meta_call // (lua_State *L, TValue *func, TValue *top) - | lwz LFUNC:RB, FRAME_FUNC(BASE) // Guaranteed to be a function here. - | addi NARGS8:RC, SAVE0, 8 // Got one more argument now. - | ins_call - | - |->vmeta_callt: // Resolve __call for BC_CALLT. - | // BASE = old base, RA = new base, RC = nargs*8 - | mr CARG1, L - | stp BASE, L->base - | subi CARG2, RA, 8 - | stw PC, SAVE_PC - | add CARG3, RA, RC - | mr SAVE0, NARGS8:RC - | bl extern lj_meta_call // (lua_State *L, TValue *func, TValue *top) - | lwz TMP1, FRAME_PC(BASE) - | addi NARGS8:RC, SAVE0, 8 // Got one more argument now. - | lwz LFUNC:RB, FRAME_FUNC(RA) // Guaranteed to be a function here. - | b ->BC_CALLT_Z - | - |//-- Argument coercion for 'for' statement ------------------------------ - | - |->vmeta_for: - | mr CARG1, L - | stp BASE, L->base - | mr CARG2, RA - | stw PC, SAVE_PC - | mr SAVE0, INS - | bl extern lj_meta_for // (lua_State *L, TValue *base) - |.if JIT - | decode_OP1 TMP0, SAVE0 - |.endif - | decode_RA8 RA, SAVE0 - |.if JIT - | cmpwi TMP0, BC_JFORI - |.endif - | decode_RD8 RD, SAVE0 - |.if JIT - | beqy =>BC_JFORI - |.endif - | b =>BC_FORI - | - |//----------------------------------------------------------------------- - |//-- Fast functions ----------------------------------------------------- - |//----------------------------------------------------------------------- - | - |.macro .ffunc, name - |->ff_ .. name: - |.endmacro - | - |.macro .ffunc_1, name - |->ff_ .. name: - | cmplwi NARGS8:RC, 8 - | lwz CARG3, 0(BASE) - | lwz CARG1, 4(BASE) - | blt ->fff_fallback - |.endmacro - | - |.macro .ffunc_2, name - |->ff_ .. name: - | cmplwi NARGS8:RC, 16 - | lwz CARG3, 0(BASE) - | lwz CARG4, 8(BASE) - | lwz CARG1, 4(BASE) - | lwz CARG2, 12(BASE) - | blt ->fff_fallback - |.endmacro - | - |.macro .ffunc_n, name - |->ff_ .. name: - | cmplwi NARGS8:RC, 8 - | lwz CARG3, 0(BASE) - | lfd FARG1, 0(BASE) - | blt ->fff_fallback - | checknum CARG3; bge ->fff_fallback - |.endmacro - | - |.macro .ffunc_nn, name - |->ff_ .. name: - | cmplwi NARGS8:RC, 16 - | lwz CARG3, 0(BASE) - | lfd FARG1, 0(BASE) - | lwz CARG4, 8(BASE) - | lfd FARG2, 8(BASE) - | blt ->fff_fallback - | checknum CARG3; bge ->fff_fallback - | checknum CARG4; bge ->fff_fallback - |.endmacro - | - |// Inlined GC threshold check. Caveat: uses TMP0 and TMP1. - |.macro ffgccheck - | lwz TMP0, DISPATCH_GL(gc.total)(DISPATCH) - | lwz TMP1, DISPATCH_GL(gc.threshold)(DISPATCH) - | cmplw TMP0, TMP1 - | bgel ->fff_gcstep - |.endmacro - | - |//-- Base library: checks ----------------------------------------------- - | - |.ffunc_1 assert - | li TMP1, LJ_TFALSE - | la RA, -8(BASE) - | cmplw cr1, CARG3, TMP1 - | lwz PC, FRAME_PC(BASE) - | bge cr1, ->fff_fallback - | stw CARG3, 0(RA) - | addi RD, NARGS8:RC, 8 // Compute (nresults+1)*8. - | stw CARG1, 4(RA) - | beq ->fff_res // Done if exactly 1 argument. - | li TMP1, 8 - | subi RC, RC, 8 - |1: - | cmplw TMP1, RC - | lfdx f0, BASE, TMP1 - | stfdx f0, RA, TMP1 - | addi TMP1, TMP1, 8 - | bney <1 - | b ->fff_res - | - |.ffunc type - | cmplwi NARGS8:RC, 8 - | lwz CARG1, 0(BASE) - | blt ->fff_fallback - | .gpr64 extsw CARG1, CARG1 - | subfc TMP0, TISNUM, CARG1 - | subfe TMP2, CARG1, CARG1 - | orc TMP1, TMP2, TMP0 - | addi TMP1, TMP1, ~LJ_TISNUM+1 - | slwi TMP1, TMP1, 3 - | la TMP2, CFUNC:RB->upvalue - | lfdx FARG1, TMP2, TMP1 - | b ->fff_resn - | - |//-- Base library: getters and setters --------------------------------- - | - |.ffunc_1 getmetatable - | checktab CARG3; bne >6 - |1: // Field metatable must be at same offset for GCtab and GCudata! - | lwz TAB:CARG1, TAB:CARG1->metatable - |2: - | li CARG3, LJ_TNIL - | cmplwi TAB:CARG1, 0 - | lwz STR:RC, DISPATCH_GL(gcroot[GCROOT_MMNAME+MM_metatable])(DISPATCH) - | beq ->fff_restv - | lwz TMP0, TAB:CARG1->hmask - | li CARG3, LJ_TTAB // Use metatable as default result. - | lwz TMP1, STR:RC->hash - | lwz NODE:TMP2, TAB:CARG1->node - | and TMP1, TMP1, TMP0 // idx = str->hash & tab->hmask - | slwi TMP0, TMP1, 5 - | slwi TMP1, TMP1, 3 - | sub TMP1, TMP0, TMP1 - | add NODE:TMP2, NODE:TMP2, TMP1 // node = tab->node + (idx*32-idx*8) - |3: // Rearranged logic, because we expect _not_ to find the key. - | lwz CARG4, NODE:TMP2->key - | lwz TMP0, 4+offsetof(Node, key)(NODE:TMP2) - | lwz CARG2, NODE:TMP2->val - | lwz TMP1, 4+offsetof(Node, val)(NODE:TMP2) - | checkstr CARG4; bne >4 - | cmpw TMP0, STR:RC; beq >5 - |4: - | lwz NODE:TMP2, NODE:TMP2->next - | cmplwi NODE:TMP2, 0 - | beq ->fff_restv // Not found, keep default result. - | b <3 - |5: - | checknil CARG2 - | beq ->fff_restv // Ditto for nil value. - | mr CARG3, CARG2 // Return value of mt.__metatable. - | mr CARG1, TMP1 - | b ->fff_restv - | - |6: - | cmpwi CARG3, LJ_TUDATA; beq <1 - | .gpr64 extsw CARG3, CARG3 - | subfc TMP0, TISNUM, CARG3 - | subfe TMP2, CARG3, CARG3 - | orc TMP1, TMP2, TMP0 - | addi TMP1, TMP1, ~LJ_TISNUM+1 - | slwi TMP1, TMP1, 2 - | la TMP2, DISPATCH_GL(gcroot[GCROOT_BASEMT])(DISPATCH) - | lwzx TAB:CARG1, TMP2, TMP1 - | b <2 - | - |.ffunc_2 setmetatable - | // Fast path: no mt for table yet and not clearing the mt. - | checktab CARG3; bne ->fff_fallback - | lwz TAB:TMP1, TAB:CARG1->metatable - | checktab CARG4; bne ->fff_fallback - | cmplwi TAB:TMP1, 0 - | lbz TMP3, TAB:CARG1->marked - | bne ->fff_fallback - | andix. TMP0, TMP3, LJ_GC_BLACK // isblack(table) - | stw TAB:CARG2, TAB:CARG1->metatable - | beq ->fff_restv - | barrierback TAB:CARG1, TMP3, TMP0 - | b ->fff_restv - | - |.ffunc rawget - | cmplwi NARGS8:RC, 16 - | lwz CARG4, 0(BASE) - | lwz TAB:CARG2, 4(BASE) - | blt ->fff_fallback - | checktab CARG4; bne ->fff_fallback - | la CARG3, 8(BASE) - | mr CARG1, L - | bl extern lj_tab_get // (lua_State *L, GCtab *t, cTValue *key) - | // Returns cTValue *. - | lfd FARG1, 0(CRET1) - | b ->fff_resn - | - |//-- Base library: conversions ------------------------------------------ - | - |.ffunc tonumber - | // Only handles the number case inline (without a base argument). - | cmplwi NARGS8:RC, 8 - | lwz CARG1, 0(BASE) - | lfd FARG1, 0(BASE) - | bne ->fff_fallback // Exactly one argument. - | checknum CARG1; bgt ->fff_fallback - | b ->fff_resn - | - |.ffunc_1 tostring - | // Only handles the string or number case inline. - | checkstr CARG3 - | // A __tostring method in the string base metatable is ignored. - | beq ->fff_restv // String key? - | // Handle numbers inline, unless a number base metatable is present. - | lwz TMP0, DISPATCH_GL(gcroot[GCROOT_BASEMT_NUM])(DISPATCH) - | checknum CARG3 - | cmplwi cr1, TMP0, 0 - | stp BASE, L->base // Add frame since C call can throw. - | crorc 4*cr0+eq, 4*cr0+gt, 4*cr1+eq - | stw PC, SAVE_PC // Redundant (but a defined value). - | beq ->fff_fallback - | ffgccheck - | mr CARG1, L - | mr CARG2, BASE - |.if DUALNUM - | bl extern lj_str_fromnumber // (lua_State *L, cTValue *o) - |.else - | bl extern lj_str_fromnum // (lua_State *L, lua_Number *np) - |.endif - | // Returns GCstr *. - | li CARG3, LJ_TSTR - | b ->fff_restv - | - |//-- Base library: iterators ------------------------------------------- - | - |.ffunc next - | cmplwi NARGS8:RC, 8 - | lwz CARG1, 0(BASE) - | lwz TAB:CARG2, 4(BASE) - | blt ->fff_fallback - | stwx TISNIL, BASE, NARGS8:RC // Set missing 2nd arg to nil. - | checktab CARG1 - | lwz PC, FRAME_PC(BASE) - | bne ->fff_fallback - | stp BASE, L->base // Add frame since C call can throw. - | mr CARG1, L - | stp BASE, L->top // Dummy frame length is ok. - | la CARG3, 8(BASE) - | stw PC, SAVE_PC - | bl extern lj_tab_next // (lua_State *L, GCtab *t, TValue *key) - | // Returns 0 at end of traversal. - | cmplwi CRET1, 0 - | li CARG3, LJ_TNIL - | beq ->fff_restv // End of traversal: return nil. - | lfd f0, 8(BASE) // Copy key and value to results. - | la RA, -8(BASE) - | lfd f1, 16(BASE) - | stfd f0, 0(RA) - | li RD, (2+1)*8 - | stfd f1, 8(RA) - | b ->fff_res - | - |.ffunc_1 pairs - | checktab CARG3 - | lwz PC, FRAME_PC(BASE) - | bne ->fff_fallback -#if LJ_52 - | lwz TAB:TMP2, TAB:CARG1->metatable - | lfd f0, CFUNC:RB->upvalue[0] - | cmplwi TAB:TMP2, 0 - | la RA, -8(BASE) - | bne ->fff_fallback -#else - | lfd f0, CFUNC:RB->upvalue[0] - | la RA, -8(BASE) -#endif - | stw TISNIL, 8(BASE) - | li RD, (3+1)*8 - | stfd f0, 0(RA) - | b ->fff_res - | - |.ffunc ipairs_aux - | cmplwi NARGS8:RC, 16 - | lwz CARG3, 0(BASE) - | lwz TAB:CARG1, 4(BASE) - | lwz CARG4, 8(BASE) - |.if DUALNUM - | lwz TMP2, 12(BASE) - |.else - | lfd FARG2, 8(BASE) - |.endif - | blt ->fff_fallback - | checktab CARG3 - | checknum cr1, CARG4 - | lwz PC, FRAME_PC(BASE) - |.if DUALNUM - | bne ->fff_fallback - | bne cr1, ->fff_fallback - |.else - | lus TMP0, 0x3ff0 - | stw ZERO, TMPD_LO - | bne ->fff_fallback - | stw TMP0, TMPD_HI - | bge cr1, ->fff_fallback - | lfd FARG1, TMPD - | toint TMP2, FARG2, f0 - |.endif - | lwz TMP0, TAB:CARG1->asize - | lwz TMP1, TAB:CARG1->array - |.if not DUALNUM - | fadd FARG2, FARG2, FARG1 - |.endif - | addi TMP2, TMP2, 1 - | la RA, -8(BASE) - | cmplw TMP0, TMP2 - |.if DUALNUM - | stw TISNUM, 0(RA) - | slwi TMP3, TMP2, 3 - | stw TMP2, 4(RA) - |.else - | slwi TMP3, TMP2, 3 - | stfd FARG2, 0(RA) - |.endif - | ble >2 // Not in array part? - | lwzx TMP2, TMP1, TMP3 - | lfdx f0, TMP1, TMP3 - |1: - | checknil TMP2 - | li RD, (0+1)*8 - | beq ->fff_res // End of iteration, return 0 results. - | li RD, (2+1)*8 - | stfd f0, 8(RA) - | b ->fff_res - |2: // Check for empty hash part first. Otherwise call C function. - | lwz TMP0, TAB:CARG1->hmask - | cmplwi TMP0, 0 - | li RD, (0+1)*8 - | beq ->fff_res - | mr CARG2, TMP2 - | bl extern lj_tab_getinth // (GCtab *t, int32_t key) - | // Returns cTValue * or NULL. - | cmplwi CRET1, 0 - | li RD, (0+1)*8 - | beq ->fff_res - | lwz TMP2, 0(CRET1) - | lfd f0, 0(CRET1) - | b <1 - | - |.ffunc_1 ipairs - | checktab CARG3 - | lwz PC, FRAME_PC(BASE) - | bne ->fff_fallback -#if LJ_52 - | lwz TAB:TMP2, TAB:CARG1->metatable - | lfd f0, CFUNC:RB->upvalue[0] - | cmplwi TAB:TMP2, 0 - | la RA, -8(BASE) - | bne ->fff_fallback -#else - | lfd f0, CFUNC:RB->upvalue[0] - | la RA, -8(BASE) -#endif - |.if DUALNUM - | stw TISNUM, 8(BASE) - |.else - | stw ZERO, 8(BASE) - |.endif - | stw ZERO, 12(BASE) - | li RD, (3+1)*8 - | stfd f0, 0(RA) - | b ->fff_res - | - |//-- Base library: catch errors ---------------------------------------- - | - |.ffunc pcall - | cmplwi NARGS8:RC, 8 - | lbz TMP3, DISPATCH_GL(hookmask)(DISPATCH) - | blt ->fff_fallback - | mr TMP2, BASE - | la BASE, 8(BASE) - | // Remember active hook before pcall. - | rlwinm TMP3, TMP3, 32-HOOK_ACTIVE_SHIFT, 31, 31 - | subi NARGS8:RC, NARGS8:RC, 8 - | addi PC, TMP3, 8+FRAME_PCALL - | b ->vm_call_dispatch - | - |.ffunc xpcall - | cmplwi NARGS8:RC, 16 - | lwz CARG4, 8(BASE) - | lfd FARG2, 8(BASE) - | lfd FARG1, 0(BASE) - | blt ->fff_fallback - | lbz TMP1, DISPATCH_GL(hookmask)(DISPATCH) - | mr TMP2, BASE - | checkfunc CARG4; bne ->fff_fallback // Traceback must be a function. - | la BASE, 16(BASE) - | // Remember active hook before pcall. - | rlwinm TMP1, TMP1, 32-HOOK_ACTIVE_SHIFT, 31, 31 - | stfd FARG2, 0(TMP2) // Swap function and traceback. - | subi NARGS8:RC, NARGS8:RC, 16 - | stfd FARG1, 8(TMP2) - | addi PC, TMP1, 16+FRAME_PCALL - | b ->vm_call_dispatch - | - |//-- Coroutine library -------------------------------------------------- - | - |.macro coroutine_resume_wrap, resume - |.if resume - |.ffunc_1 coroutine_resume - | cmpwi CARG3, LJ_TTHREAD; bne ->fff_fallback - |.else - |.ffunc coroutine_wrap_aux - | lwz L:CARG1, CFUNC:RB->upvalue[0].gcr - |.endif - | lbz TMP0, L:CARG1->status - | lp TMP1, L:CARG1->cframe - | lp CARG2, L:CARG1->top - | cmplwi cr0, TMP0, LUA_YIELD - | lp TMP2, L:CARG1->base - | cmplwi cr1, TMP1, 0 - | lwz TMP0, L:CARG1->maxstack - | cmplw cr7, CARG2, TMP2 - | lwz PC, FRAME_PC(BASE) - | crorc 4*cr6+lt, 4*cr0+gt, 4*cr1+eq // st>LUA_YIELD || cframe!=0 - | add TMP2, CARG2, NARGS8:RC - | crandc 4*cr6+gt, 4*cr7+eq, 4*cr0+eq // base==top && st!=LUA_YIELD - | cmplw cr1, TMP2, TMP0 - | cror 4*cr6+lt, 4*cr6+lt, 4*cr6+gt - | stw PC, SAVE_PC - | cror 4*cr6+lt, 4*cr6+lt, 4*cr1+gt // cond1 || cond2 || stackov - | stp BASE, L->base - | blt cr6, ->fff_fallback - |1: - |.if resume - | addi BASE, BASE, 8 // Keep resumed thread in stack for GC. - | subi NARGS8:RC, NARGS8:RC, 8 - | subi TMP2, TMP2, 8 - |.endif - | stp TMP2, L:CARG1->top - | li TMP1, 0 - | stp BASE, L->top - |2: // Move args to coroutine. - | cmpw TMP1, NARGS8:RC - | lfdx f0, BASE, TMP1 - | beq >3 - | stfdx f0, CARG2, TMP1 - | addi TMP1, TMP1, 8 - | b <2 - |3: - | li CARG3, 0 - | mr L:SAVE0, L:CARG1 - | li CARG4, 0 - | bl ->vm_resume // (lua_State *L, TValue *base, 0, 0) - | // Returns thread status. - |4: - | lp TMP2, L:SAVE0->base - | cmplwi CRET1, LUA_YIELD - | lp TMP3, L:SAVE0->top - | li_vmstate INTERP - | lp BASE, L->base - | st_vmstate - | bgt >8 - | sub RD, TMP3, TMP2 - | lwz TMP0, L->maxstack - | cmplwi RD, 0 - | add TMP1, BASE, RD - | beq >6 // No results? - | cmplw TMP1, TMP0 - | li TMP1, 0 - | bgt >9 // Need to grow stack? - | - | subi TMP3, RD, 8 - | stp TMP2, L:SAVE0->top // Clear coroutine stack. - |5: // Move results from coroutine. - | cmplw TMP1, TMP3 - | lfdx f0, TMP2, TMP1 - | stfdx f0, BASE, TMP1 - | addi TMP1, TMP1, 8 - | bne <5 - |6: - | andix. TMP0, PC, FRAME_TYPE - |.if resume - | li TMP1, LJ_TTRUE - | la RA, -8(BASE) - | stw TMP1, -8(BASE) // Prepend true to results. - | addi RD, RD, 16 - |.else - | mr RA, BASE - | addi RD, RD, 8 - |.endif - |7: - | stw PC, SAVE_PC - | mr MULTRES, RD - | beq ->BC_RET_Z - | b ->vm_return - | - |8: // Coroutine returned with error (at co->top-1). - |.if resume - | andix. TMP0, PC, FRAME_TYPE - | la TMP3, -8(TMP3) - | li TMP1, LJ_TFALSE - | lfd f0, 0(TMP3) - | stp TMP3, L:SAVE0->top // Remove error from coroutine stack. - | li RD, (2+1)*8 - | stw TMP1, -8(BASE) // Prepend false to results. - | la RA, -8(BASE) - | stfd f0, 0(BASE) // Copy error message. - | b <7 - |.else - | mr CARG1, L - | mr CARG2, L:SAVE0 - | bl extern lj_ffh_coroutine_wrap_err // (lua_State *L, lua_State *co) - |.endif - | - |9: // Handle stack expansion on return from yield. - | mr CARG1, L - | srwi CARG2, RD, 3 - | bl extern lj_state_growstack // (lua_State *L, int n) - | li CRET1, 0 - | b <4 - |.endmacro - | - | coroutine_resume_wrap 1 // coroutine.resume - | coroutine_resume_wrap 0 // coroutine.wrap - | - |.ffunc coroutine_yield - | lp TMP0, L->cframe - | add TMP1, BASE, NARGS8:RC - | stp BASE, L->base - | andix. TMP0, TMP0, CFRAME_RESUME - | stp TMP1, L->top - | li CRET1, LUA_YIELD - | beq ->fff_fallback - | stp ZERO, L->cframe - | stb CRET1, L->status - | b ->vm_leave_unw - | - |//-- Math library ------------------------------------------------------- - | - |.ffunc_1 math_abs - | checknum CARG3 - |.if DUALNUM - | bne >2 - | srawi TMP1, CARG1, 31 - | xor TMP2, TMP1, CARG1 - |.if GPR64 - | lus TMP0, 0x8000 - | sub CARG1, TMP2, TMP1 - | cmplw CARG1, TMP0 - | beq >1 - |.else - | sub. CARG1, TMP2, TMP1 - | blt >1 - |.endif - |->fff_resi: - | lwz PC, FRAME_PC(BASE) - | la RA, -8(BASE) - | stw TISNUM, -8(BASE) - | stw CRET1, -4(BASE) - | b ->fff_res1 - |1: - | lus CARG3, 0x41e0 // 2^31. - | li CARG1, 0 - | b ->fff_restv - |2: - |.endif - | bge ->fff_fallback - | rlwinm CARG3, CARG3, 0, 1, 31 - | // Fallthrough. - | - |->fff_restv: - | // CARG3/CARG1 = TValue result. - | lwz PC, FRAME_PC(BASE) - | stw CARG3, -8(BASE) - | la RA, -8(BASE) - | stw CARG1, -4(BASE) - |->fff_res1: - | // RA = results, PC = return. - | li RD, (1+1)*8 - |->fff_res: - | // RA = results, RD = (nresults+1)*8, PC = return. - | andix. TMP0, PC, FRAME_TYPE - | mr MULTRES, RD - | bney ->vm_return - | lwz INS, -4(PC) - | decode_RB8 RB, INS - |5: - | cmplw RB, RD // More results expected? - | decode_RA8 TMP0, INS - | bgt >6 - | ins_next1 - | // Adjust BASE. KBASE is assumed to be set for the calling frame. - | sub BASE, RA, TMP0 - | ins_next2 - | - |6: // Fill up results with nil. - | subi TMP1, RD, 8 - | addi RD, RD, 8 - | stwx TISNIL, RA, TMP1 - | b <5 - | - |.macro math_extern, func - | .ffunc_n math_ .. func - | blex func - | b ->fff_resn - |.endmacro - | - |.macro math_extern2, func - | .ffunc_nn math_ .. func - | blex func - | b ->fff_resn - |.endmacro - | - |.macro math_round, func - | .ffunc_1 math_ .. func - | checknum CARG3; beqy ->fff_restv - | rlwinm TMP2, CARG3, 12, 21, 31 - | bge ->fff_fallback - | addic. TMP2, TMP2, -1023 // exp = exponent(x) - 1023 - | cmplwi cr1, TMP2, 31 // 0 <= exp < 31? - | subfic TMP0, TMP2, 31 - | blt >3 - | slwi TMP1, CARG3, 11 - | srwi TMP3, CARG1, 21 - | oris TMP1, TMP1, 0x8000 - | addi TMP2, TMP2, 1 - | or TMP1, TMP1, TMP3 - | slwi CARG2, CARG1, 11 - | bge cr1, >4 - | slw TMP3, TMP1, TMP2 - | srw RD, TMP1, TMP0 - | or TMP3, TMP3, CARG2 - | srawi TMP2, CARG3, 31 - |.if "func" == "floor" - | and TMP1, TMP3, TMP2 - | addic TMP0, TMP1, -1 - | subfe TMP1, TMP0, TMP1 - | add CARG1, RD, TMP1 - | xor CARG1, CARG1, TMP2 - | sub CARG1, CARG1, TMP2 - | b ->fff_resi - |.else - | andc TMP1, TMP3, TMP2 - | addic TMP0, TMP1, -1 - | subfe TMP1, TMP0, TMP1 - | add CARG1, RD, TMP1 - | cmpw CARG1, RD - | xor CARG1, CARG1, TMP2 - | sub CARG1, CARG1, TMP2 - | bge ->fff_resi - | // Overflow to 2^31. - | lus CARG3, 0x41e0 // 2^31. - | li CARG1, 0 - | b ->fff_restv - |.endif - |3: // |x| < 1 - | slwi TMP2, CARG3, 1 - | srawi TMP1, CARG3, 31 - | or TMP2, CARG1, TMP2 // ztest = (hi+hi) | lo - |.if "func" == "floor" - | and TMP1, TMP2, TMP1 // (ztest & sign) == 0 ? 0 : -1 - | subfic TMP2, TMP1, 0 - | subfe CARG1, CARG1, CARG1 - |.else - | andc TMP1, TMP2, TMP1 // (ztest & ~sign) == 0 ? 0 : 1 - | addic TMP2, TMP1, -1 - | subfe CARG1, TMP2, TMP1 - |.endif - | b ->fff_resi - |4: // exp >= 31. Check for -(2^31). - | xoris TMP1, TMP1, 0x8000 - | srawi TMP2, CARG3, 31 - |.if "func" == "floor" - | or TMP1, TMP1, CARG2 - |.endif - |.if PPE - | orc TMP1, TMP1, TMP2 - | cmpwi TMP1, 0 - |.else - | orc. TMP1, TMP1, TMP2 - |.endif - | crand 4*cr0+eq, 4*cr0+eq, 4*cr1+eq - | lus CARG1, 0x8000 // -(2^31). - | beqy ->fff_resi - |5: - | lfd FARG1, 0(BASE) - | blex func - | b ->fff_resn - |.endmacro - | - |.if DUALNUM - | math_round floor - | math_round ceil - |.else - | // NYI: use internal implementation. - | math_extern floor - | math_extern ceil - |.endif - | - |.if SQRT - |.ffunc_n math_sqrt - | fsqrt FARG1, FARG1 - | b ->fff_resn - |.else - | math_extern sqrt - |.endif - | - |.ffunc math_log - | cmplwi NARGS8:RC, 8 - | lwz CARG3, 0(BASE) - | lfd FARG1, 0(BASE) - | bne ->fff_fallback // Need exactly 1 argument. - | checknum CARG3; bge ->fff_fallback - | blex log - | b ->fff_resn - | - | math_extern log10 - | math_extern exp - | math_extern sin - | math_extern cos - | math_extern tan - | math_extern asin - | math_extern acos - | math_extern atan - | math_extern sinh - | math_extern cosh - | math_extern tanh - | math_extern2 pow - | math_extern2 atan2 - | math_extern2 fmod - | - |->ff_math_deg: - |.ffunc_n math_rad - | lfd FARG2, CFUNC:RB->upvalue[0] - | fmul FARG1, FARG1, FARG2 - | b ->fff_resn - | - |.if DUALNUM - |.ffunc math_ldexp - | cmplwi NARGS8:RC, 16 - | lwz CARG3, 0(BASE) - | lfd FARG1, 0(BASE) - | lwz CARG4, 8(BASE) - |.if GPR64 - | lwz CARG2, 12(BASE) - |.else - | lwz CARG1, 12(BASE) - |.endif - | blt ->fff_fallback - | checknum CARG3; bge ->fff_fallback - | checknum CARG4; bne ->fff_fallback - |.else - |.ffunc_nn math_ldexp - |.if GPR64 - | toint CARG2, FARG2 - |.else - | toint CARG1, FARG2 - |.endif - |.endif - | blex ldexp - | b ->fff_resn - | - |.ffunc_n math_frexp - |.if GPR64 - | la CARG2, DISPATCH_GL(tmptv)(DISPATCH) - |.else - | la CARG1, DISPATCH_GL(tmptv)(DISPATCH) - |.endif - | lwz PC, FRAME_PC(BASE) - | blex frexp - | lwz TMP1, DISPATCH_GL(tmptv)(DISPATCH) - | la RA, -8(BASE) - |.if not DUALNUM - | tonum_i FARG2, TMP1 - |.endif - | stfd FARG1, 0(RA) - | li RD, (2+1)*8 - |.if DUALNUM - | stw TISNUM, 8(RA) - | stw TMP1, 12(RA) - |.else - | stfd FARG2, 8(RA) - |.endif - | b ->fff_res - | - |.ffunc_n math_modf - |.if GPR64 - | la CARG2, -8(BASE) - |.else - | la CARG1, -8(BASE) - |.endif - | lwz PC, FRAME_PC(BASE) - | blex modf - | la RA, -8(BASE) - | stfd FARG1, 0(BASE) - | li RD, (2+1)*8 - | b ->fff_res - | - |.macro math_minmax, name, ismax - |.if DUALNUM - | .ffunc_1 name - | checknum CARG3 - | addi TMP1, BASE, 8 - | add TMP2, BASE, NARGS8:RC - | bne >4 - |1: // Handle integers. - | lwz CARG4, 0(TMP1) - | cmplw cr1, TMP1, TMP2 - | lwz CARG2, 4(TMP1) - | bge cr1, ->fff_resi - | checknum CARG4 - | xoris TMP0, CARG1, 0x8000 - | xoris TMP3, CARG2, 0x8000 - | bne >3 - | subfc TMP3, TMP3, TMP0 - | subfe TMP0, TMP0, TMP0 - |.if ismax - | andc TMP3, TMP3, TMP0 - |.else - | and TMP3, TMP3, TMP0 - |.endif - | add CARG1, TMP3, CARG2 - |.if GPR64 - | rldicl CARG1, CARG1, 0, 32 - |.endif - | addi TMP1, TMP1, 8 - | b <1 - |3: - | bge ->fff_fallback - | // Convert intermediate result to number and continue below. - | tonum_i FARG1, CARG1 - | lfd FARG2, 0(TMP1) - | b >6 - |4: - | lfd FARG1, 0(BASE) - | bge ->fff_fallback - |5: // Handle numbers. - | lwz CARG4, 0(TMP1) - | cmplw cr1, TMP1, TMP2 - | lfd FARG2, 0(TMP1) - | bge cr1, ->fff_resn - | checknum CARG4; bge >7 - |6: - | fsub f0, FARG1, FARG2 - | addi TMP1, TMP1, 8 - |.if ismax - | fsel FARG1, f0, FARG1, FARG2 - |.else - | fsel FARG1, f0, FARG2, FARG1 - |.endif - | b <5 - |7: // Convert integer to number and continue above. - | lwz CARG2, 4(TMP1) - | bne ->fff_fallback - | tonum_i FARG2, CARG2 - | b <6 - |.else - | .ffunc_n name - | li TMP1, 8 - |1: - | lwzx CARG2, BASE, TMP1 - | lfdx FARG2, BASE, TMP1 - | cmplw cr1, TMP1, NARGS8:RC - | checknum CARG2 - | bge cr1, ->fff_resn - | bge ->fff_fallback - | fsub f0, FARG1, FARG2 - | addi TMP1, TMP1, 8 - |.if ismax - | fsel FARG1, f0, FARG1, FARG2 - |.else - | fsel FARG1, f0, FARG2, FARG1 - |.endif - | b <1 - |.endif - |.endmacro - | - | math_minmax math_min, 0 - | math_minmax math_max, 1 - | - |//-- String library ----------------------------------------------------- - | - |.ffunc_1 string_len - | checkstr CARG3; bne ->fff_fallback - | lwz CRET1, STR:CARG1->len - | b ->fff_resi - | - |.ffunc string_byte // Only handle the 1-arg case here. - | cmplwi NARGS8:RC, 8 - | lwz CARG3, 0(BASE) - | lwz STR:CARG1, 4(BASE) - | bne ->fff_fallback // Need exactly 1 argument. - | checkstr CARG3 - | bne ->fff_fallback - | lwz TMP0, STR:CARG1->len - |.if DUALNUM - | lbz CARG1, STR:CARG1[1] // Access is always ok (NUL at end). - | li RD, (0+1)*8 - | lwz PC, FRAME_PC(BASE) - | cmplwi TMP0, 0 - | la RA, -8(BASE) - | beqy ->fff_res - | b ->fff_resi - |.else - | lbz TMP1, STR:CARG1[1] // Access is always ok (NUL at end). - | addic TMP3, TMP0, -1 // RD = ((str->len != 0)+1)*8 - | subfe RD, TMP3, TMP0 - | stw TMP1, TONUM_LO // Inlined tonum_u f0, TMP1. - | addi RD, RD, 1 - | lfd f0, TONUM_D - | la RA, -8(BASE) - | lwz PC, FRAME_PC(BASE) - | fsub f0, f0, TOBIT - | slwi RD, RD, 3 - | stfd f0, 0(RA) - | b ->fff_res - |.endif - | - |.ffunc string_char // Only handle the 1-arg case here. - | ffgccheck - | cmplwi NARGS8:RC, 8 - | lwz CARG3, 0(BASE) - |.if DUALNUM - | lwz TMP0, 4(BASE) - | bne ->fff_fallback // Exactly 1 argument. - | checknum CARG3; bne ->fff_fallback - | la CARG2, 7(BASE) - |.else - | lfd FARG1, 0(BASE) - | bne ->fff_fallback // Exactly 1 argument. - | checknum CARG3; bge ->fff_fallback - | toint TMP0, FARG1 - | la CARG2, TMPD_BLO - |.endif - | li CARG3, 1 - | cmplwi TMP0, 255; bgt ->fff_fallback - |->fff_newstr: - | mr CARG1, L - | stp BASE, L->base - | stw PC, SAVE_PC - | bl extern lj_str_new // (lua_State *L, char *str, size_t l) - | // Returns GCstr *. - | lp BASE, L->base - | li CARG3, LJ_TSTR - | b ->fff_restv - | - |.ffunc string_sub - | ffgccheck - | cmplwi NARGS8:RC, 16 - | lwz CARG3, 16(BASE) - |.if not DUALNUM - | lfd f0, 16(BASE) - |.endif - | lwz TMP0, 0(BASE) - | lwz STR:CARG1, 4(BASE) - | blt ->fff_fallback - | lwz CARG2, 8(BASE) - |.if DUALNUM - | lwz TMP1, 12(BASE) - |.else - | lfd f1, 8(BASE) - |.endif - | li TMP2, -1 - | beq >1 - |.if DUALNUM - | checknum CARG3 - | lwz TMP2, 20(BASE) - | bne ->fff_fallback - |1: - | checknum CARG2; bne ->fff_fallback - |.else - | checknum CARG3; bge ->fff_fallback - | toint TMP2, f0 - |1: - | checknum CARG2; bge ->fff_fallback - |.endif - | checkstr TMP0; bne ->fff_fallback - |.if not DUALNUM - | toint TMP1, f1 - |.endif - | lwz TMP0, STR:CARG1->len - | cmplw TMP0, TMP2 // len < end? (unsigned compare) - | addi TMP3, TMP2, 1 - | blt >5 - |2: - | cmpwi TMP1, 0 // start <= 0? - | add TMP3, TMP1, TMP0 - | ble >7 - |3: - | sub CARG3, TMP2, TMP1 - | addi CARG2, STR:CARG1, #STR-1 - | srawi TMP0, CARG3, 31 - | addi CARG3, CARG3, 1 - | add CARG2, CARG2, TMP1 - | andc CARG3, CARG3, TMP0 - |.if GPR64 - | rldicl CARG2, CARG2, 0, 32 - | rldicl CARG3, CARG3, 0, 32 - |.endif - | b ->fff_newstr - | - |5: // Negative end or overflow. - | cmpw TMP0, TMP2 // len >= end? (signed compare) - | add TMP2, TMP0, TMP3 // Negative end: end = end+len+1. - | bge <2 - | mr TMP2, TMP0 // Overflow: end = len. - | b <2 - | - |7: // Negative start or underflow. - | .gpr64 extsw TMP1, TMP1 - | addic CARG3, TMP1, -1 - | subfe CARG3, CARG3, CARG3 - | srawi CARG2, TMP3, 31 // Note: modifies carry. - | andc TMP3, TMP3, CARG3 - | andc TMP1, TMP3, CARG2 - | addi TMP1, TMP1, 1 // start = 1 + (start ? start+len : 0) - | b <3 - | - |.ffunc string_rep // Only handle the 1-char case inline. - | ffgccheck - | cmplwi NARGS8:RC, 16 - | lwz TMP0, 0(BASE) - | lwz STR:CARG1, 4(BASE) - | lwz CARG4, 8(BASE) - |.if DUALNUM - | lwz CARG3, 12(BASE) - |.else - | lfd FARG2, 8(BASE) - |.endif - | bne ->fff_fallback // Exactly 2 arguments. - | checkstr TMP0; bne ->fff_fallback - |.if DUALNUM - | checknum CARG4; bne ->fff_fallback - |.else - | checknum CARG4; bge ->fff_fallback - | toint CARG3, FARG2 - |.endif - | lwz TMP0, STR:CARG1->len - | cmpwi CARG3, 0 - | lwz TMP1, DISPATCH_GL(tmpbuf.sz)(DISPATCH) - | ble >2 // Count <= 0? (or non-int) - | cmplwi TMP0, 1 - | subi TMP2, CARG3, 1 - | blt >2 // Zero length string? - | cmplw cr1, TMP1, CARG3 - | bne ->fff_fallback // Fallback for > 1-char strings. - | lbz TMP0, STR:CARG1[1] - | lp CARG2, DISPATCH_GL(tmpbuf.buf)(DISPATCH) - | blt cr1, ->fff_fallback - |1: // Fill buffer with char. Yes, this is suboptimal code (do you care?). - | cmplwi TMP2, 0 - | stbx TMP0, CARG2, TMP2 - | subi TMP2, TMP2, 1 - | bne <1 - | b ->fff_newstr - |2: // Return empty string. - | la STR:CARG1, DISPATCH_GL(strempty)(DISPATCH) - | li CARG3, LJ_TSTR - | b ->fff_restv - | - |.ffunc string_reverse - | ffgccheck - | cmplwi NARGS8:RC, 8 - | lwz CARG3, 0(BASE) - | lwz STR:CARG1, 4(BASE) - | blt ->fff_fallback - | checkstr CARG3 - | lwz TMP1, DISPATCH_GL(tmpbuf.sz)(DISPATCH) - | bne ->fff_fallback - | lwz CARG3, STR:CARG1->len - | la CARG1, #STR(STR:CARG1) - | lp CARG2, DISPATCH_GL(tmpbuf.buf)(DISPATCH) - | li TMP2, 0 - | cmplw TMP1, CARG3 - | subi TMP3, CARG3, 1 - | blt ->fff_fallback - |1: // Reverse string copy. - | cmpwi TMP3, 0 - | lbzx TMP1, CARG1, TMP2 - | blty ->fff_newstr - | stbx TMP1, CARG2, TMP3 - | subi TMP3, TMP3, 1 - | addi TMP2, TMP2, 1 - | b <1 - | - |.macro ffstring_case, name, lo - | .ffunc name - | ffgccheck - | cmplwi NARGS8:RC, 8 - | lwz CARG3, 0(BASE) - | lwz STR:CARG1, 4(BASE) - | blt ->fff_fallback - | checkstr CARG3 - | lwz TMP1, DISPATCH_GL(tmpbuf.sz)(DISPATCH) - | bne ->fff_fallback - | lwz CARG3, STR:CARG1->len - | la CARG1, #STR(STR:CARG1) - | lp CARG2, DISPATCH_GL(tmpbuf.buf)(DISPATCH) - | cmplw TMP1, CARG3 - | li TMP2, 0 - | blt ->fff_fallback - |1: // ASCII case conversion. - | cmplw TMP2, CARG3 - | lbzx TMP1, CARG1, TMP2 - | bgey ->fff_newstr - | subi TMP0, TMP1, lo - | xori TMP3, TMP1, 0x20 - | addic TMP0, TMP0, -26 - | subfe TMP3, TMP3, TMP3 - | rlwinm TMP3, TMP3, 0, 26, 26 // x &= 0x20. - | xor TMP1, TMP1, TMP3 - | stbx TMP1, CARG2, TMP2 - | addi TMP2, TMP2, 1 - | b <1 - |.endmacro - | - |ffstring_case string_lower, 65 - |ffstring_case string_upper, 97 - | - |//-- Table library ------------------------------------------------------ - | - |.ffunc_1 table_getn - | checktab CARG3; bne ->fff_fallback - | bl extern lj_tab_len // (GCtab *t) - | // Returns uint32_t (but less than 2^31). - | b ->fff_resi - | - |//-- Bit library -------------------------------------------------------- - | - |.macro .ffunc_bit, name - |.if DUALNUM - | .ffunc_1 bit_..name - | checknum CARG3; bnel ->fff_tobit_fb - |.else - | .ffunc_n bit_..name - | fadd FARG1, FARG1, TOBIT - | stfd FARG1, TMPD - | lwz CARG1, TMPD_LO - |.endif - |.endmacro - | - |.macro .ffunc_bit_op, name, ins - | .ffunc_bit name - | addi TMP1, BASE, 8 - | add TMP2, BASE, NARGS8:RC - |1: - | lwz CARG4, 0(TMP1) - | cmplw cr1, TMP1, TMP2 - |.if DUALNUM - | lwz CARG2, 4(TMP1) - |.else - | lfd FARG1, 0(TMP1) - |.endif - | bgey cr1, ->fff_resi - | checknum CARG4 - |.if DUALNUM - | bnel ->fff_bitop_fb - |.else - | fadd FARG1, FARG1, TOBIT - | bge ->fff_fallback - | stfd FARG1, TMPD - | lwz CARG2, TMPD_LO - |.endif - | ins CARG1, CARG1, CARG2 - | addi TMP1, TMP1, 8 - | b <1 - |.endmacro - | - |.ffunc_bit_op band, and - |.ffunc_bit_op bor, or - |.ffunc_bit_op bxor, xor - | - |.ffunc_bit bswap - | rotlwi TMP0, CARG1, 8 - | rlwimi TMP0, CARG1, 24, 0, 7 - | rlwimi TMP0, CARG1, 24, 16, 23 - | mr CRET1, TMP0 - | b ->fff_resi - | - |.ffunc_bit bnot - | not CRET1, CARG1 - | b ->fff_resi - | - |.macro .ffunc_bit_sh, name, ins, shmod - |.if DUALNUM - | .ffunc_2 bit_..name - | checknum CARG3; bnel ->fff_tobit_fb - | // Note: no inline conversion from number for 2nd argument! - | checknum CARG4; bne ->fff_fallback - |.else - | .ffunc_nn bit_..name - | fadd FARG1, FARG1, TOBIT - | fadd FARG2, FARG2, TOBIT - | stfd FARG1, TMPD - | lwz CARG1, TMPD_LO - | stfd FARG2, TMPD - | lwz CARG2, TMPD_LO - |.endif - |.if shmod == 1 - | rlwinm CARG2, CARG2, 0, 27, 31 - |.elif shmod == 2 - | neg CARG2, CARG2 - |.endif - | ins CRET1, CARG1, CARG2 - | b ->fff_resi - |.endmacro - | - |.ffunc_bit_sh lshift, slw, 1 - |.ffunc_bit_sh rshift, srw, 1 - |.ffunc_bit_sh arshift, sraw, 1 - |.ffunc_bit_sh rol, rotlw, 0 - |.ffunc_bit_sh ror, rotlw, 2 - | - |.ffunc_bit tobit - |.if DUALNUM - | b ->fff_resi - |.else - |->fff_resi: - | tonum_i FARG1, CRET1 - |.endif - |->fff_resn: - | lwz PC, FRAME_PC(BASE) - | la RA, -8(BASE) - | stfd FARG1, -8(BASE) - | b ->fff_res1 - | - |// Fallback FP number to bit conversion. - |->fff_tobit_fb: - |.if DUALNUM - | lfd FARG1, 0(BASE) - | bgt ->fff_fallback - | fadd FARG1, FARG1, TOBIT - | stfd FARG1, TMPD - | lwz CARG1, TMPD_LO - | blr - |.endif - |->fff_bitop_fb: - |.if DUALNUM - | lfd FARG1, 0(TMP1) - | bgt ->fff_fallback - | fadd FARG1, FARG1, TOBIT - | stfd FARG1, TMPD - | lwz CARG2, TMPD_LO - | blr - |.endif - | - |//----------------------------------------------------------------------- - | - |->fff_fallback: // Call fast function fallback handler. - | // BASE = new base, RB = CFUNC, RC = nargs*8 - | lp TMP3, CFUNC:RB->f - | add TMP1, BASE, NARGS8:RC - | lwz PC, FRAME_PC(BASE) // Fallback may overwrite PC. - | addi TMP0, TMP1, 8*LUA_MINSTACK - | lwz TMP2, L->maxstack - | stw PC, SAVE_PC // Redundant (but a defined value). - | .toc lp TMP3, 0(TMP3) - | cmplw TMP0, TMP2 - | stp BASE, L->base - | stp TMP1, L->top - | mr CARG1, L - | bgt >5 // Need to grow stack. - | mtctr TMP3 - | bctrl // (lua_State *L) - | // Either throws an error, or recovers and returns -1, 0 or nresults+1. - | lp BASE, L->base - | cmpwi CRET1, 0 - | slwi RD, CRET1, 3 - | la RA, -8(BASE) - | bgt ->fff_res // Returned nresults+1? - |1: // Returned 0 or -1: retry fast path. - | lp TMP0, L->top - | lwz LFUNC:RB, FRAME_FUNC(BASE) - | sub NARGS8:RC, TMP0, BASE - | bne ->vm_call_tail // Returned -1? - | ins_callt // Returned 0: retry fast path. - | - |// Reconstruct previous base for vmeta_call during tailcall. - |->vm_call_tail: - | andix. TMP0, PC, FRAME_TYPE - | rlwinm TMP1, PC, 0, 0, 28 - | bne >3 - | lwz INS, -4(PC) - | decode_RA8 TMP1, INS - | addi TMP1, TMP1, 8 - |3: - | sub TMP2, BASE, TMP1 - | b ->vm_call_dispatch // Resolve again for tailcall. - | - |5: // Grow stack for fallback handler. - | li CARG2, LUA_MINSTACK - | bl extern lj_state_growstack // (lua_State *L, int n) - | lp BASE, L->base - | cmpw TMP0, TMP0 // Set 4*cr0+eq to force retry. - | b <1 - | - |->fff_gcstep: // Call GC step function. - | // BASE = new base, RC = nargs*8 - | mflr SAVE0 - | stp BASE, L->base - | add TMP0, BASE, NARGS8:RC - | stw PC, SAVE_PC // Redundant (but a defined value). - | stp TMP0, L->top - | mr CARG1, L - | bl extern lj_gc_step // (lua_State *L) - | lp BASE, L->base - | mtlr SAVE0 - | lp TMP0, L->top - | sub NARGS8:RC, TMP0, BASE - | lwz CFUNC:RB, FRAME_FUNC(BASE) - | blr - | - |//----------------------------------------------------------------------- - |//-- Special dispatch targets ------------------------------------------- - |//----------------------------------------------------------------------- - | - |->vm_record: // Dispatch target for recording phase. - |.if JIT - | lbz TMP3, DISPATCH_GL(hookmask)(DISPATCH) - | andix. TMP0, TMP3, HOOK_VMEVENT // No recording while in vmevent. - | bne >5 - | // Decrement the hookcount for consistency, but always do the call. - | lwz TMP2, DISPATCH_GL(hookcount)(DISPATCH) - | andix. TMP0, TMP3, HOOK_ACTIVE - | bne >1 - | subi TMP2, TMP2, 1 - | andi. TMP0, TMP3, LUA_MASKLINE|LUA_MASKCOUNT - | beqy >1 - | stw TMP2, DISPATCH_GL(hookcount)(DISPATCH) - | b >1 - |.endif - | - |->vm_rethook: // Dispatch target for return hooks. - | lbz TMP3, DISPATCH_GL(hookmask)(DISPATCH) - | andix. TMP0, TMP3, HOOK_ACTIVE // Hook already active? - | beq >1 - |5: // Re-dispatch to static ins. - | addi TMP1, TMP1, GG_DISP2STATIC // Assumes decode_OPP TMP1, INS. - | lpx TMP0, DISPATCH, TMP1 - | mtctr TMP0 - | bctr - | - |->vm_inshook: // Dispatch target for instr/line hooks. - | lbz TMP3, DISPATCH_GL(hookmask)(DISPATCH) - | lwz TMP2, DISPATCH_GL(hookcount)(DISPATCH) - | andix. TMP0, TMP3, HOOK_ACTIVE // Hook already active? - | rlwinm TMP0, TMP3, 31-LUA_HOOKLINE, 31, 0 - | bne <5 - | - | cmpwi cr1, TMP0, 0 - | addic. TMP2, TMP2, -1 - | beq cr1, <5 - | stw TMP2, DISPATCH_GL(hookcount)(DISPATCH) - | beq >1 - | bge cr1, <5 - |1: - | mr CARG1, L - | stw MULTRES, SAVE_MULTRES - | mr CARG2, PC - | stp BASE, L->base - | // SAVE_PC must hold the _previous_ PC. The callee updates it with PC. - | bl extern lj_dispatch_ins // (lua_State *L, const BCIns *pc) - |3: - | lp BASE, L->base - |4: // Re-dispatch to static ins. - | lwz INS, -4(PC) - | decode_OPP TMP1, INS - | decode_RB8 RB, INS - | addi TMP1, TMP1, GG_DISP2STATIC - | decode_RD8 RD, INS - | lpx TMP0, DISPATCH, TMP1 - | decode_RA8 RA, INS - | decode_RC8 RC, INS - | mtctr TMP0 - | bctr - | - |->cont_hook: // Continue from hook yield. - | addi PC, PC, 4 - | lwz MULTRES, -20(RB) // Restore MULTRES for *M ins. - | b <4 - | - |->vm_hotloop: // Hot loop counter underflow. - |.if JIT - | lwz LFUNC:TMP1, FRAME_FUNC(BASE) - | addi CARG1, DISPATCH, GG_DISP2J - | stw PC, SAVE_PC - | lwz TMP1, LFUNC:TMP1->pc - | mr CARG2, PC - | stw L, DISPATCH_J(L)(DISPATCH) - | lbz TMP1, PC2PROTO(framesize)(TMP1) - | stp BASE, L->base - | slwi TMP1, TMP1, 3 - | add TMP1, BASE, TMP1 - | stp TMP1, L->top - | bl extern lj_trace_hot // (jit_State *J, const BCIns *pc) - | b <3 - |.endif - | - |->vm_callhook: // Dispatch target for call hooks. - | mr CARG2, PC - |.if JIT - | b >1 - |.endif - | - |->vm_hotcall: // Hot call counter underflow. - |.if JIT - | ori CARG2, PC, 1 - |1: - |.endif - | add TMP0, BASE, RC - | stw PC, SAVE_PC - | mr CARG1, L - | stp BASE, L->base - | sub RA, RA, BASE - | stp TMP0, L->top - | bl extern lj_dispatch_call // (lua_State *L, const BCIns *pc) - | // Returns ASMFunction. - | lp BASE, L->base - | lp TMP0, L->top - | stw ZERO, SAVE_PC // Invalidate for subsequent line hook. - | sub NARGS8:RC, TMP0, BASE - | add RA, BASE, RA - | lwz LFUNC:RB, FRAME_FUNC(BASE) - | lwz INS, -4(PC) - | mtctr CRET1 - | bctr - | - |//----------------------------------------------------------------------- - |//-- Trace exit handler ------------------------------------------------- - |//----------------------------------------------------------------------- - | - |.macro savex_, a, b, c, d - | stfd f..a, 16+a*8(sp) - | stfd f..b, 16+b*8(sp) - | stfd f..c, 16+c*8(sp) - | stfd f..d, 16+d*8(sp) - |.endmacro - | - |->vm_exit_handler: - |.if JIT - | addi sp, sp, -(16+32*8+32*4) - | stmw r2, 16+32*8+2*4(sp) - | addi DISPATCH, JGL, -GG_DISP2G-32768 - | li CARG2, ~LJ_VMST_EXIT - | lwz CARG1, 16+32*8+32*4(sp) // Get stack chain. - | stw CARG2, DISPATCH_GL(vmstate)(DISPATCH) - | savex_ 0,1,2,3 - | stw CARG1, 0(sp) // Store extended stack chain. - | clrso TMP1 - | savex_ 4,5,6,7 - | addi CARG2, sp, 16+32*8+32*4 // Recompute original value of sp. - | savex_ 8,9,10,11 - | stw CARG2, 16+32*8+1*4(sp) // Store sp in RID_SP. - | savex_ 12,13,14,15 - | mflr CARG3 - | li TMP1, 0 - | savex_ 16,17,18,19 - | stw TMP1, 16+32*8+0*4(sp) // Clear RID_TMP. - | savex_ 20,21,22,23 - | lhz CARG4, 2(CARG3) // Load trace number. - | savex_ 24,25,26,27 - | lwz L, DISPATCH_GL(jit_L)(DISPATCH) - | savex_ 28,29,30,31 - | sub CARG3, TMP0, CARG3 // Compute exit number. - | lp BASE, DISPATCH_GL(jit_base)(DISPATCH) - | srwi CARG3, CARG3, 2 - | stw L, DISPATCH_J(L)(DISPATCH) - | subi CARG3, CARG3, 2 - | stw TMP1, DISPATCH_GL(jit_L)(DISPATCH) - | stw CARG4, DISPATCH_J(parent)(DISPATCH) - | stp BASE, L->base - | addi CARG1, DISPATCH, GG_DISP2J - | stw CARG3, DISPATCH_J(exitno)(DISPATCH) - | addi CARG2, sp, 16 - | bl extern lj_trace_exit // (jit_State *J, ExitState *ex) - | // Returns MULTRES (unscaled) or negated error code. - | lp TMP1, L->cframe - | lwz TMP2, 0(sp) - | lp BASE, L->base - |.if GPR64 - | rldicr sp, TMP1, 0, 61 - |.else - | rlwinm sp, TMP1, 0, 0, 29 - |.endif - | lwz PC, SAVE_PC // Get SAVE_PC. - | stw TMP2, 0(sp) - | stw L, SAVE_L // Set SAVE_L (on-trace resume/yield). - | b >1 - |.endif - |->vm_exit_interp: - |.if JIT - | // CARG1 = MULTRES or negated error code, BASE, PC and JGL set. - | lwz L, SAVE_L - | addi DISPATCH, JGL, -GG_DISP2G-32768 - |1: - | cmpwi CARG1, 0 - | blt >3 // Check for error from exit. - | lwz LFUNC:TMP1, FRAME_FUNC(BASE) - | slwi MULTRES, CARG1, 3 - | li TMP2, 0 - | stw MULTRES, SAVE_MULTRES - | lwz TMP1, LFUNC:TMP1->pc - | stw TMP2, DISPATCH_GL(jit_L)(DISPATCH) - | lwz KBASE, PC2PROTO(k)(TMP1) - | // Setup type comparison constants. - | li TISNUM, LJ_TISNUM - | lus TMP3, 0x59c0 // TOBIT = 2^52 + 2^51 (float). - | stw TMP3, TMPD - | li ZERO, 0 - | ori TMP3, TMP3, 0x0004 // TONUM = 2^52 + 2^51 + 2^31 (float). - | lfs TOBIT, TMPD - | stw TMP3, TMPD - | lus TMP0, 0x4338 // Hiword of 2^52 + 2^51 (double) - | li TISNIL, LJ_TNIL - | stw TMP0, TONUM_HI - | lfs TONUM, TMPD - | // Modified copy of ins_next which handles function header dispatch, too. - | lwz INS, 0(PC) - | addi PC, PC, 4 - | // Assumes TISNIL == ~LJ_VMST_INTERP == -1. - | stw TISNIL, DISPATCH_GL(vmstate)(DISPATCH) - | decode_OPP TMP1, INS - | decode_RA8 RA, INS - | lpx TMP0, DISPATCH, TMP1 - | mtctr TMP0 - | cmplwi TMP1, BC_FUNCF*4 // Function header? - | bge >2 - | decode_RB8 RB, INS - | decode_RD8 RD, INS - | decode_RC8 RC, INS - | bctr - |2: - | subi RC, MULTRES, 8 - | add RA, RA, BASE - | bctr - | - |3: // Rethrow error from the right C frame. - | neg CARG2, CARG1 - | mr CARG1, L - | bl extern lj_err_throw // (lua_State *L, int errcode) - |.endif - | - |//----------------------------------------------------------------------- - |//-- Math helper functions ---------------------------------------------- - |//----------------------------------------------------------------------- - | - |// NYI: Use internal implementations of floor, ceil, trunc. - | - |->vm_modi: - | divwo. TMP0, CARG1, CARG2 - | bso >1 - |.if GPR64 - | xor CARG3, CARG1, CARG2 - | cmpwi CARG3, 0 - |.else - | xor. CARG3, CARG1, CARG2 - |.endif - | mullw TMP0, TMP0, CARG2 - | sub CARG1, CARG1, TMP0 - | bgelr - | cmpwi CARG1, 0; beqlr - | add CARG1, CARG1, CARG2 - | blr - |1: - | cmpwi CARG2, 0 - | li CARG1, 0 - | beqlr - | clrso TMP0 // Clear SO for -2147483648 % -1 and return 0. - | blr - | - |//----------------------------------------------------------------------- - |//-- Miscellaneous functions -------------------------------------------- - |//----------------------------------------------------------------------- - | - |// void lj_vm_cachesync(void *start, void *end) - |// Flush D-Cache and invalidate I-Cache. Assumes 32 byte cache line size. - |// This is a good lower bound, except for very ancient PPC models. - |->vm_cachesync: - |.if JIT or FFI - | // Compute start of first cache line and number of cache lines. - | rlwinm CARG1, CARG1, 0, 0, 26 - | sub CARG2, CARG2, CARG1 - | addi CARG2, CARG2, 31 - | rlwinm. CARG2, CARG2, 27, 5, 31 - | beqlr - | mtctr CARG2 - | mr CARG3, CARG1 - |1: // Flush D-Cache. - | dcbst r0, CARG1 - | addi CARG1, CARG1, 32 - | bdnz <1 - | sync - | mtctr CARG2 - |1: // Invalidate I-Cache. - | icbi r0, CARG3 - | addi CARG3, CARG3, 32 - | bdnz <1 - | isync - | blr - |.endif - | - |//----------------------------------------------------------------------- - |//-- FFI helper functions ----------------------------------------------- - |//----------------------------------------------------------------------- - | - |// Handler for callback functions. Callback slot number in r11, g in r12. - |->vm_ffi_callback: - |.if FFI - |.type CTSTATE, CTState, PC - | saveregs - | lwz CTSTATE, GL:r12->ctype_state - | addi DISPATCH, r12, GG_G2DISP - | stw r11, CTSTATE->cb.slot - | stw r3, CTSTATE->cb.gpr[0] - | stfd f1, CTSTATE->cb.fpr[0] - | stw r4, CTSTATE->cb.gpr[1] - | stfd f2, CTSTATE->cb.fpr[1] - | stw r5, CTSTATE->cb.gpr[2] - | stfd f3, CTSTATE->cb.fpr[2] - | stw r6, CTSTATE->cb.gpr[3] - | stfd f4, CTSTATE->cb.fpr[3] - | stw r7, CTSTATE->cb.gpr[4] - | stfd f5, CTSTATE->cb.fpr[4] - | stw r8, CTSTATE->cb.gpr[5] - | stfd f6, CTSTATE->cb.fpr[5] - | stw r9, CTSTATE->cb.gpr[6] - | stfd f7, CTSTATE->cb.fpr[6] - | stw r10, CTSTATE->cb.gpr[7] - | stfd f8, CTSTATE->cb.fpr[7] - | addi TMP0, sp, CFRAME_SPACE+8 - | stw TMP0, CTSTATE->cb.stack - | mr CARG1, CTSTATE - | stw CTSTATE, SAVE_PC // Any value outside of bytecode is ok. - | mr CARG2, sp - | bl extern lj_ccallback_enter // (CTState *cts, void *cf) - | // Returns lua_State *. - | lp BASE, L:CRET1->base - | li TISNUM, LJ_TISNUM // Setup type comparison constants. - | lp RC, L:CRET1->top - | lus TMP3, 0x59c0 // TOBIT = 2^52 + 2^51 (float). - | li ZERO, 0 - | mr L, CRET1 - | stw TMP3, TMPD - | lus TMP0, 0x4338 // Hiword of 2^52 + 2^51 (double) - | lwz LFUNC:RB, FRAME_FUNC(BASE) - | ori TMP3, TMP3, 0x0004 // TONUM = 2^52 + 2^51 + 2^31 (float). - | stw TMP0, TONUM_HI - | li TISNIL, LJ_TNIL - | li_vmstate INTERP - | lfs TOBIT, TMPD - | stw TMP3, TMPD - | sub RC, RC, BASE - | st_vmstate - | lfs TONUM, TMPD - | ins_callt - |.endif - | - |->cont_ffi_callback: // Return from FFI callback. - |.if FFI - | lwz CTSTATE, DISPATCH_GL(ctype_state)(DISPATCH) - | stp BASE, L->base - | stp RB, L->top - | stp L, CTSTATE->L - | mr CARG1, CTSTATE - | mr CARG2, RA - | bl extern lj_ccallback_leave // (CTState *cts, TValue *o) - | lwz CRET1, CTSTATE->cb.gpr[0] - | lfd FARG1, CTSTATE->cb.fpr[0] - | lwz CRET2, CTSTATE->cb.gpr[1] - | b ->vm_leave_unw - |.endif - | - |->vm_ffi_call: // Call C function via FFI. - | // Caveat: needs special frame unwinding, see below. - |.if FFI - | .type CCSTATE, CCallState, CARG1 - | lwz TMP1, CCSTATE->spadj - | mflr TMP0 - | lbz CARG2, CCSTATE->nsp - | lbz CARG3, CCSTATE->nfpr - | neg TMP1, TMP1 - | stw TMP0, 4(sp) - | cmpwi cr1, CARG3, 0 - | mr TMP2, sp - | addic. CARG2, CARG2, -1 - | stwux sp, sp, TMP1 - | crnot 4*cr1+eq, 4*cr1+eq // For vararg calls. - | stw r14, -4(TMP2) - | stw CCSTATE, -8(TMP2) - | mr r14, TMP2 - | la TMP1, CCSTATE->stack - | slwi CARG2, CARG2, 2 - | blty >2 - | la TMP2, 8(sp) - |1: - | lwzx TMP0, TMP1, CARG2 - | stwx TMP0, TMP2, CARG2 - | addic. CARG2, CARG2, -4 - | bge <1 - |2: - | bney cr1, >3 - | lfd f1, CCSTATE->fpr[0] - | lfd f2, CCSTATE->fpr[1] - | lfd f3, CCSTATE->fpr[2] - | lfd f4, CCSTATE->fpr[3] - | lfd f5, CCSTATE->fpr[4] - | lfd f6, CCSTATE->fpr[5] - | lfd f7, CCSTATE->fpr[6] - | lfd f8, CCSTATE->fpr[7] - |3: - | lp TMP0, CCSTATE->func - | lwz CARG2, CCSTATE->gpr[1] - | lwz CARG3, CCSTATE->gpr[2] - | lwz CARG4, CCSTATE->gpr[3] - | lwz CARG5, CCSTATE->gpr[4] - | mtctr TMP0 - | lwz r8, CCSTATE->gpr[5] - | lwz r9, CCSTATE->gpr[6] - | lwz r10, CCSTATE->gpr[7] - | lwz CARG1, CCSTATE->gpr[0] // Do this last, since CCSTATE is CARG1. - | bctrl - | lwz CCSTATE:TMP1, -8(r14) - | lwz TMP2, -4(r14) - | lwz TMP0, 4(r14) - | stw CARG1, CCSTATE:TMP1->gpr[0] - | stfd FARG1, CCSTATE:TMP1->fpr[0] - | stw CARG2, CCSTATE:TMP1->gpr[1] - | mtlr TMP0 - | stw CARG3, CCSTATE:TMP1->gpr[2] - | mr sp, r14 - | stw CARG4, CCSTATE:TMP1->gpr[3] - | mr r14, TMP2 - | blr - |.endif - |// Note: vm_ffi_call must be the last function in this object file! - | - |//----------------------------------------------------------------------- -} - -/* Generate the code for a single instruction. */ -static void build_ins(BuildCtx *ctx, BCOp op, int defop) -{ - int vk = 0; - |=>defop: - - switch (op) { - - /* -- Comparison ops ---------------------------------------------------- */ - - /* Remember: all ops branch for a true comparison, fall through otherwise. */ - - case BC_ISLT: case BC_ISGE: case BC_ISLE: case BC_ISGT: - | // RA = src1*8, RD = src2*8, JMP with RD = target - |.if DUALNUM - | lwzux TMP0, RA, BASE - | addi PC, PC, 4 - | lwz CARG2, 4(RA) - | lwzux TMP1, RD, BASE - | lwz TMP2, -4(PC) - | checknum cr0, TMP0 - | lwz CARG3, 4(RD) - | decode_RD4 TMP2, TMP2 - | checknum cr1, TMP1 - | addis TMP2, TMP2, -(BCBIAS_J*4 >> 16) - | bne cr0, >7 - | bne cr1, >8 - | cmpw CARG2, CARG3 - if (op == BC_ISLT) { - | bge >2 - } else if (op == BC_ISGE) { - | blt >2 - } else if (op == BC_ISLE) { - | bgt >2 - } else { - | ble >2 - } - |1: - | add PC, PC, TMP2 - |2: - | ins_next - | - |7: // RA is not an integer. - | bgt cr0, ->vmeta_comp - | // RA is a number. - | lfd f0, 0(RA) - | bgt cr1, ->vmeta_comp - | blt cr1, >4 - | // RA is a number, RD is an integer. - | tonum_i f1, CARG3 - | b >5 - | - |8: // RA is an integer, RD is not an integer. - | bgt cr1, ->vmeta_comp - | // RA is an integer, RD is a number. - | tonum_i f0, CARG2 - |4: - | lfd f1, 0(RD) - |5: - | fcmpu cr0, f0, f1 - if (op == BC_ISLT) { - | bge <2 - } else if (op == BC_ISGE) { - | blt <2 - } else if (op == BC_ISLE) { - | cror 4*cr0+lt, 4*cr0+lt, 4*cr0+eq - | bge <2 - } else { - | cror 4*cr0+lt, 4*cr0+lt, 4*cr0+eq - | blt <2 - } - | b <1 - |.else - | lwzx TMP0, BASE, RA - | addi PC, PC, 4 - | lfdx f0, BASE, RA - | lwzx TMP1, BASE, RD - | checknum cr0, TMP0 - | lwz TMP2, -4(PC) - | lfdx f1, BASE, RD - | checknum cr1, TMP1 - | decode_RD4 TMP2, TMP2 - | bge cr0, ->vmeta_comp - | addis TMP2, TMP2, -(BCBIAS_J*4 >> 16) - | bge cr1, ->vmeta_comp - | fcmpu cr0, f0, f1 - if (op == BC_ISLT) { - | bge >1 - } else if (op == BC_ISGE) { - | blt >1 - } else if (op == BC_ISLE) { - | cror 4*cr0+lt, 4*cr0+lt, 4*cr0+eq - | bge >1 - } else { - | cror 4*cr0+lt, 4*cr0+lt, 4*cr0+eq - | blt >1 - } - | add PC, PC, TMP2 - |1: - | ins_next - |.endif - break; - - case BC_ISEQV: case BC_ISNEV: - vk = op == BC_ISEQV; - | // RA = src1*8, RD = src2*8, JMP with RD = target - |.if DUALNUM - | lwzux TMP0, RA, BASE - | addi PC, PC, 4 - | lwz CARG2, 4(RA) - | lwzux TMP1, RD, BASE - | checknum cr0, TMP0 - | lwz TMP2, -4(PC) - | checknum cr1, TMP1 - | decode_RD4 TMP2, TMP2 - | lwz CARG3, 4(RD) - | cror 4*cr7+gt, 4*cr0+gt, 4*cr1+gt - | addis TMP2, TMP2, -(BCBIAS_J*4 >> 16) - if (vk) { - | ble cr7, ->BC_ISEQN_Z - } else { - | ble cr7, ->BC_ISNEN_Z - } - |.else - | lwzux TMP0, RA, BASE - | lwz TMP2, 0(PC) - | lfd f0, 0(RA) - | addi PC, PC, 4 - | lwzux TMP1, RD, BASE - | checknum cr0, TMP0 - | decode_RD4 TMP2, TMP2 - | lfd f1, 0(RD) - | checknum cr1, TMP1 - | addis TMP2, TMP2, -(BCBIAS_J*4 >> 16) - | bge cr0, >5 - | bge cr1, >5 - | fcmpu cr0, f0, f1 - if (vk) { - | bne >1 - | add PC, PC, TMP2 - } else { - | beq >1 - | add PC, PC, TMP2 - } - |1: - | ins_next - |.endif - |5: // Either or both types are not numbers. - |.if not DUALNUM - | lwz CARG2, 4(RA) - | lwz CARG3, 4(RD) - |.endif - |.if FFI - | cmpwi cr7, TMP0, LJ_TCDATA - | cmpwi cr5, TMP1, LJ_TCDATA - |.endif - | not TMP3, TMP0 - | cmplw TMP0, TMP1 - | cmplwi cr1, TMP3, ~LJ_TISPRI // Primitive? - |.if FFI - | cror 4*cr7+eq, 4*cr7+eq, 4*cr5+eq - |.endif - | cmplwi cr6, TMP3, ~LJ_TISTABUD // Table or userdata? - |.if FFI - | beq cr7, ->vmeta_equal_cd - |.endif - | cmplw cr5, CARG2, CARG3 - | crandc 4*cr0+gt, 4*cr0+eq, 4*cr1+gt // 2: Same type and primitive. - | crorc 4*cr0+lt, 4*cr5+eq, 4*cr0+eq // 1: Same tv or different type. - | crand 4*cr0+eq, 4*cr0+eq, 4*cr5+eq // 0: Same type and same tv. - | mr SAVE0, PC - | cror 4*cr0+eq, 4*cr0+eq, 4*cr0+gt // 0 or 2. - | cror 4*cr0+lt, 4*cr0+lt, 4*cr0+gt // 1 or 2. - if (vk) { - | bne cr0, >6 - | add PC, PC, TMP2 - |6: - } else { - | beq cr0, >6 - | add PC, PC, TMP2 - |6: - } - |.if DUALNUM - | bge cr0, >2 // Done if 1 or 2. - |1: - | ins_next - |2: - |.else - | blt cr0, <1 // Done if 1 or 2. - |.endif - | blt cr6, <1 // Done if not tab/ud. - | - | // Different tables or userdatas. Need to check __eq metamethod. - | // Field metatable must be at same offset for GCtab and GCudata! - | lwz TAB:TMP2, TAB:CARG2->metatable - | li CARG4, 1-vk // ne = 0 or 1. - | cmplwi TAB:TMP2, 0 - | beq <1 // No metatable? - | lbz TMP2, TAB:TMP2->nomm - | andix. TMP2, TMP2, 1<vmeta_equal // Handle __eq metamethod. - break; - - case BC_ISEQS: case BC_ISNES: - vk = op == BC_ISEQS; - | // RA = src*8, RD = str_const*8 (~), JMP with RD = target - | lwzux TMP0, RA, BASE - | srwi RD, RD, 1 - | lwz STR:TMP3, 4(RA) - | lwz TMP2, 0(PC) - | subfic RD, RD, -4 - | addi PC, PC, 4 - |.if FFI - | cmpwi TMP0, LJ_TCDATA - |.endif - | lwzx STR:TMP1, KBASE, RD // KBASE-4-str_const*4 - | .gpr64 extsw TMP0, TMP0 - | subfic TMP0, TMP0, LJ_TSTR - |.if FFI - | beq ->vmeta_equal_cd - |.endif - | sub TMP1, STR:TMP1, STR:TMP3 - | or TMP0, TMP0, TMP1 - | decode_RD4 TMP2, TMP2 - | subfic TMP0, TMP0, 0 - | addis TMP2, TMP2, -(BCBIAS_J*4 >> 16) - | subfe TMP1, TMP1, TMP1 - if (vk) { - | andc TMP2, TMP2, TMP1 - } else { - | and TMP2, TMP2, TMP1 - } - | add PC, PC, TMP2 - | ins_next - break; - - case BC_ISEQN: case BC_ISNEN: - vk = op == BC_ISEQN; - | // RA = src*8, RD = num_const*8, JMP with RD = target - |.if DUALNUM - | lwzux TMP0, RA, BASE - | addi PC, PC, 4 - | lwz CARG2, 4(RA) - | lwzux TMP1, RD, KBASE - | checknum cr0, TMP0 - | lwz TMP2, -4(PC) - | checknum cr1, TMP1 - | decode_RD4 TMP2, TMP2 - | lwz CARG3, 4(RD) - | addis TMP2, TMP2, -(BCBIAS_J*4 >> 16) - if (vk) { - |->BC_ISEQN_Z: - } else { - |->BC_ISNEN_Z: - } - | bne cr0, >7 - | bne cr1, >8 - | cmpw CARG2, CARG3 - |4: - |.else - if (vk) { - |->BC_ISEQN_Z: // Dummy label. - } else { - |->BC_ISNEN_Z: // Dummy label. - } - | lwzx TMP0, BASE, RA - | addi PC, PC, 4 - | lfdx f0, BASE, RA - | lwz TMP2, -4(PC) - | lfdx f1, KBASE, RD - | decode_RD4 TMP2, TMP2 - | checknum TMP0 - | addis TMP2, TMP2, -(BCBIAS_J*4 >> 16) - | bge >3 - | fcmpu cr0, f0, f1 - |.endif - if (vk) { - | bne >1 - | add PC, PC, TMP2 - |1: - |.if not FFI - |3: - |.endif - } else { - | beq >2 - |1: - |.if not FFI - |3: - |.endif - | add PC, PC, TMP2 - |2: - } - | ins_next - |.if FFI - |3: - | cmpwi TMP0, LJ_TCDATA - | beq ->vmeta_equal_cd - | b <1 - |.endif - |.if DUALNUM - |7: // RA is not an integer. - | bge cr0, <3 - | // RA is a number. - | lfd f0, 0(RA) - | blt cr1, >1 - | // RA is a number, RD is an integer. - | tonum_i f1, CARG3 - | b >2 - | - |8: // RA is an integer, RD is a number. - | tonum_i f0, CARG2 - |1: - | lfd f1, 0(RD) - |2: - | fcmpu cr0, f0, f1 - | b <4 - |.endif - break; - - case BC_ISEQP: case BC_ISNEP: - vk = op == BC_ISEQP; - | // RA = src*8, RD = primitive_type*8 (~), JMP with RD = target - | lwzx TMP0, BASE, RA - | srwi TMP1, RD, 3 - | lwz TMP2, 0(PC) - | not TMP1, TMP1 - | addi PC, PC, 4 - |.if FFI - | cmpwi TMP0, LJ_TCDATA - |.endif - | sub TMP0, TMP0, TMP1 - |.if FFI - | beq ->vmeta_equal_cd - |.endif - | decode_RD4 TMP2, TMP2 - | .gpr64 extsw TMP0, TMP0 - | addic TMP0, TMP0, -1 - | addis TMP2, TMP2, -(BCBIAS_J*4 >> 16) - | subfe TMP1, TMP1, TMP1 - if (vk) { - | and TMP2, TMP2, TMP1 - } else { - | andc TMP2, TMP2, TMP1 - } - | add PC, PC, TMP2 - | ins_next - break; - - /* -- Unary test and copy ops ------------------------------------------- */ - - case BC_ISTC: case BC_ISFC: case BC_IST: case BC_ISF: - | // RA = dst*8 or unused, RD = src*8, JMP with RD = target - | lwzx TMP0, BASE, RD - | lwz INS, 0(PC) - | addi PC, PC, 4 - if (op == BC_IST || op == BC_ISF) { - | .gpr64 extsw TMP0, TMP0 - | subfic TMP0, TMP0, LJ_TTRUE - | decode_RD4 TMP2, INS - | subfe TMP1, TMP1, TMP1 - | addis TMP2, TMP2, -(BCBIAS_J*4 >> 16) - if (op == BC_IST) { - | andc TMP2, TMP2, TMP1 - } else { - | and TMP2, TMP2, TMP1 - } - | add PC, PC, TMP2 - } else { - | li TMP1, LJ_TFALSE - | lfdx f0, BASE, RD - | cmplw TMP0, TMP1 - if (op == BC_ISTC) { - | bge >1 - } else { - | blt >1 - } - | addis PC, PC, -(BCBIAS_J*4 >> 16) - | decode_RD4 TMP2, INS - | stfdx f0, BASE, RA - | add PC, PC, TMP2 - |1: - } - | ins_next - break; - - /* -- Unary ops --------------------------------------------------------- */ - - case BC_MOV: - | // RA = dst*8, RD = src*8 - | ins_next1 - | lfdx f0, BASE, RD - | stfdx f0, BASE, RA - | ins_next2 - break; - case BC_NOT: - | // RA = dst*8, RD = src*8 - | ins_next1 - | lwzx TMP0, BASE, RD - | .gpr64 extsw TMP0, TMP0 - | subfic TMP1, TMP0, LJ_TTRUE - | adde TMP0, TMP0, TMP1 - | stwx TMP0, BASE, RA - | ins_next2 - break; - case BC_UNM: - | // RA = dst*8, RD = src*8 - | lwzux TMP1, RD, BASE - | lwz TMP0, 4(RD) - | checknum TMP1 - |.if DUALNUM - | bne >5 - |.if GPR64 - | lus TMP2, 0x8000 - | neg TMP0, TMP0 - | cmplw TMP0, TMP2 - | beq >4 - |.else - | nego. TMP0, TMP0 - | bso >4 - |1: - |.endif - | ins_next1 - | stwux TISNUM, RA, BASE - | stw TMP0, 4(RA) - |3: - | ins_next2 - |4: - |.if not GPR64 - | // Potential overflow. - | checkov TMP1, <1 // Ignore unrelated overflow. - |.endif - | lus TMP1, 0x41e0 // 2^31. - | li TMP0, 0 - | b >7 - |.endif - |5: - | bge ->vmeta_unm - | xoris TMP1, TMP1, 0x8000 - |7: - | ins_next1 - | stwux TMP1, RA, BASE - | stw TMP0, 4(RA) - |.if DUALNUM - | b <3 - |.else - | ins_next2 - |.endif - break; - case BC_LEN: - | // RA = dst*8, RD = src*8 - | lwzux TMP0, RD, BASE - | lwz CARG1, 4(RD) - | checkstr TMP0; bne >2 - | lwz CRET1, STR:CARG1->len - |1: - |.if DUALNUM - | ins_next1 - | stwux TISNUM, RA, BASE - | stw CRET1, 4(RA) - |.else - | tonum_u f0, CRET1 // Result is a non-negative integer. - | ins_next1 - | stfdx f0, BASE, RA - |.endif - | ins_next2 - |2: - | checktab TMP0; bne ->vmeta_len -#if LJ_52 - | lwz TAB:TMP2, TAB:CARG1->metatable - | cmplwi TAB:TMP2, 0 - | bne >9 - |3: -#endif - |->BC_LEN_Z: - | bl extern lj_tab_len // (GCtab *t) - | // Returns uint32_t (but less than 2^31). - | b <1 -#if LJ_52 - |9: - | lbz TMP0, TAB:TMP2->nomm - | andix. TMP0, TMP0, 1<vmeta_len -#endif - break; - - /* -- Binary ops -------------------------------------------------------- */ - - |.macro ins_arithpre - | // RA = dst*8, RB = src1*8, RC = src2*8 | num_const*8 - ||vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN); - ||switch (vk) { - ||case 0: - | lwzx TMP1, BASE, RB - | .if DUALNUM - | lwzx TMP2, KBASE, RC - | .endif - | lfdx f14, BASE, RB - | lfdx f15, KBASE, RC - | .if DUALNUM - | checknum cr0, TMP1 - | checknum cr1, TMP2 - | crand 4*cr0+lt, 4*cr0+lt, 4*cr1+lt - | bge ->vmeta_arith_vn - | .else - | checknum TMP1; bge ->vmeta_arith_vn - | .endif - || break; - ||case 1: - | lwzx TMP1, BASE, RB - | .if DUALNUM - | lwzx TMP2, KBASE, RC - | .endif - | lfdx f15, BASE, RB - | lfdx f14, KBASE, RC - | .if DUALNUM - | checknum cr0, TMP1 - | checknum cr1, TMP2 - | crand 4*cr0+lt, 4*cr0+lt, 4*cr1+lt - | bge ->vmeta_arith_nv - | .else - | checknum TMP1; bge ->vmeta_arith_nv - | .endif - || break; - ||default: - | lwzx TMP1, BASE, RB - | lwzx TMP2, BASE, RC - | lfdx f14, BASE, RB - | lfdx f15, BASE, RC - | checknum cr0, TMP1 - | checknum cr1, TMP2 - | crand 4*cr0+lt, 4*cr0+lt, 4*cr1+lt - | bge ->vmeta_arith_vv - || break; - ||} - |.endmacro - | - |.macro ins_arithfallback, ins - ||switch (vk) { - ||case 0: - | ins ->vmeta_arith_vn2 - || break; - ||case 1: - | ins ->vmeta_arith_nv2 - || break; - ||default: - | ins ->vmeta_arith_vv2 - || break; - ||} - |.endmacro - | - |.macro intmod, a, b, c - | bl ->vm_modi - |.endmacro - | - |.macro fpmod, a, b, c - |->BC_MODVN_Z: - | fdiv FARG1, b, c - | // NYI: Use internal implementation of floor. - | blex floor // floor(b/c) - | fmul a, FARG1, c - | fsub a, b, a // b - floor(b/c)*c - |.endmacro - | - |.macro ins_arithfp, fpins - | ins_arithpre - |.if "fpins" == "fpmod_" - | b ->BC_MODVN_Z // Avoid 3 copies. It's slow anyway. - |.else - | fpins f0, f14, f15 - | ins_next1 - | stfdx f0, BASE, RA - | ins_next2 - |.endif - |.endmacro - | - |.macro ins_arithdn, intins, fpins - | // RA = dst*8, RB = src1*8, RC = src2*8 | num_const*8 - ||vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN); - ||switch (vk) { - ||case 0: - | lwzux TMP1, RB, BASE - | lwzux TMP2, RC, KBASE - | lwz CARG1, 4(RB) - | checknum cr0, TMP1 - | lwz CARG2, 4(RC) - || break; - ||case 1: - | lwzux TMP1, RB, BASE - | lwzux TMP2, RC, KBASE - | lwz CARG2, 4(RB) - | checknum cr0, TMP1 - | lwz CARG1, 4(RC) - || break; - ||default: - | lwzux TMP1, RB, BASE - | lwzux TMP2, RC, BASE - | lwz CARG1, 4(RB) - | checknum cr0, TMP1 - | lwz CARG2, 4(RC) - || break; - ||} - | checknum cr1, TMP2 - | bne >5 - | bne cr1, >5 - | intins CARG1, CARG1, CARG2 - | bso >4 - |1: - | ins_next1 - | stwux TISNUM, RA, BASE - | stw CARG1, 4(RA) - |2: - | ins_next2 - |4: // Overflow. - | checkov TMP0, <1 // Ignore unrelated overflow. - | ins_arithfallback b - |5: // FP variant. - ||if (vk == 1) { - | lfd f15, 0(RB) - | crand 4*cr0+lt, 4*cr0+lt, 4*cr1+lt - | lfd f14, 0(RC) - ||} else { - | lfd f14, 0(RB) - | crand 4*cr0+lt, 4*cr0+lt, 4*cr1+lt - | lfd f15, 0(RC) - ||} - | ins_arithfallback bge - |.if "fpins" == "fpmod_" - | b ->BC_MODVN_Z // Avoid 3 copies. It's slow anyway. - |.else - | fpins f0, f14, f15 - | ins_next1 - | stfdx f0, BASE, RA - | b <2 - |.endif - |.endmacro - | - |.macro ins_arith, intins, fpins - |.if DUALNUM - | ins_arithdn intins, fpins - |.else - | ins_arithfp fpins - |.endif - |.endmacro - - case BC_ADDVN: case BC_ADDNV: case BC_ADDVV: - |.if GPR64 - |.macro addo32., y, a, b - | // Need to check overflow for (a<<32) + (b<<32). - | rldicr TMP0, a, 32, 31 - | rldicr TMP3, b, 32, 31 - | addo. TMP0, TMP0, TMP3 - | add y, a, b - |.endmacro - | ins_arith addo32., fadd - |.else - | ins_arith addo., fadd - |.endif - break; - case BC_SUBVN: case BC_SUBNV: case BC_SUBVV: - |.if GPR64 - |.macro subo32., y, a, b - | // Need to check overflow for (a<<32) - (b<<32). - | rldicr TMP0, a, 32, 31 - | rldicr TMP3, b, 32, 31 - | subo. TMP0, TMP0, TMP3 - | sub y, a, b - |.endmacro - | ins_arith subo32., fsub - |.else - | ins_arith subo., fsub - |.endif - break; - case BC_MULVN: case BC_MULNV: case BC_MULVV: - | ins_arith mullwo., fmul - break; - case BC_DIVVN: case BC_DIVNV: case BC_DIVVV: - | ins_arithfp fdiv - break; - case BC_MODVN: - | ins_arith intmod, fpmod - break; - case BC_MODNV: case BC_MODVV: - | ins_arith intmod, fpmod_ - break; - case BC_POW: - | // NYI: (partial) integer arithmetic. - | lwzx TMP1, BASE, RB - | lfdx FARG1, BASE, RB - | lwzx TMP2, BASE, RC - | lfdx FARG2, BASE, RC - | checknum cr0, TMP1 - | checknum cr1, TMP2 - | crand 4*cr0+lt, 4*cr0+lt, 4*cr1+lt - | bge ->vmeta_arith_vv - | blex pow - | ins_next1 - | stfdx FARG1, BASE, RA - | ins_next2 - break; - - case BC_CAT: - | // RA = dst*8, RB = src_start*8, RC = src_end*8 - | sub CARG3, RC, RB - | stp BASE, L->base - | add CARG2, BASE, RC - | mr SAVE0, RB - |->BC_CAT_Z: - | stw PC, SAVE_PC - | mr CARG1, L - | srwi CARG3, CARG3, 3 - | bl extern lj_meta_cat // (lua_State *L, TValue *top, int left) - | // Returns NULL (finished) or TValue * (metamethod). - | cmplwi CRET1, 0 - | lp BASE, L->base - | bne ->vmeta_binop - | ins_next1 - | lfdx f0, BASE, SAVE0 // Copy result from RB to RA. - | stfdx f0, BASE, RA - | ins_next2 - break; - - /* -- Constant ops ------------------------------------------------------ */ - - case BC_KSTR: - | // RA = dst*8, RD = str_const*8 (~) - | srwi TMP1, RD, 1 - | subfic TMP1, TMP1, -4 - | ins_next1 - | lwzx TMP0, KBASE, TMP1 // KBASE-4-str_const*4 - | li TMP2, LJ_TSTR - | stwux TMP2, RA, BASE - | stw TMP0, 4(RA) - | ins_next2 - break; - case BC_KCDATA: - |.if FFI - | // RA = dst*8, RD = cdata_const*8 (~) - | srwi TMP1, RD, 1 - | subfic TMP1, TMP1, -4 - | ins_next1 - | lwzx TMP0, KBASE, TMP1 // KBASE-4-cdata_const*4 - | li TMP2, LJ_TCDATA - | stwux TMP2, RA, BASE - | stw TMP0, 4(RA) - | ins_next2 - |.endif - break; - case BC_KSHORT: - | // RA = dst*8, RD = int16_literal*8 - |.if DUALNUM - | slwi RD, RD, 13 - | srawi RD, RD, 16 - | ins_next1 - | stwux TISNUM, RA, BASE - | stw RD, 4(RA) - | ins_next2 - |.else - | // The soft-float approach is faster. - | slwi RD, RD, 13 - | srawi TMP1, RD, 31 - | xor TMP2, TMP1, RD - | sub TMP2, TMP2, TMP1 // TMP2 = abs(x) - | cntlzw TMP3, TMP2 - | subfic TMP1, TMP3, 0x40d // TMP1 = exponent-1 - | slw TMP2, TMP2, TMP3 // TMP2 = left aligned mantissa - | subfic TMP3, RD, 0 - | slwi TMP1, TMP1, 20 - | rlwimi RD, TMP2, 21, 1, 31 // hi = sign(x) | (mantissa>>11) - | subfe TMP0, TMP0, TMP0 - | add RD, RD, TMP1 // hi = hi + exponent-1 - | and RD, RD, TMP0 // hi = x == 0 ? 0 : hi - | ins_next1 - | stwux RD, RA, BASE - | stw ZERO, 4(RA) - | ins_next2 - |.endif - break; - case BC_KNUM: - | // RA = dst*8, RD = num_const*8 - | ins_next1 - | lfdx f0, KBASE, RD - | stfdx f0, BASE, RA - | ins_next2 - break; - case BC_KPRI: - | // RA = dst*8, RD = primitive_type*8 (~) - | srwi TMP1, RD, 3 - | not TMP0, TMP1 - | ins_next1 - | stwx TMP0, BASE, RA - | ins_next2 - break; - case BC_KNIL: - | // RA = base*8, RD = end*8 - | stwx TISNIL, BASE, RA - | addi RA, RA, 8 - |1: - | stwx TISNIL, BASE, RA - | cmpw RA, RD - | addi RA, RA, 8 - | blt <1 - | ins_next_ - break; - - /* -- Upvalue and function ops ------------------------------------------ */ - - case BC_UGET: - | // RA = dst*8, RD = uvnum*8 - | lwz LFUNC:RB, FRAME_FUNC(BASE) - | srwi RD, RD, 1 - | addi RD, RD, offsetof(GCfuncL, uvptr) - | lwzx UPVAL:RB, LFUNC:RB, RD - | ins_next1 - | lwz TMP1, UPVAL:RB->v - | lfd f0, 0(TMP1) - | stfdx f0, BASE, RA - | ins_next2 - break; - case BC_USETV: - | // RA = uvnum*8, RD = src*8 - | lwz LFUNC:RB, FRAME_FUNC(BASE) - | srwi RA, RA, 1 - | addi RA, RA, offsetof(GCfuncL, uvptr) - | lfdux f0, RD, BASE - | lwzx UPVAL:RB, LFUNC:RB, RA - | lbz TMP3, UPVAL:RB->marked - | lwz CARG2, UPVAL:RB->v - | andix. TMP3, TMP3, LJ_GC_BLACK // isblack(uv) - | lbz TMP0, UPVAL:RB->closed - | lwz TMP2, 0(RD) - | stfd f0, 0(CARG2) - | cmplwi cr1, TMP0, 0 - | lwz TMP1, 4(RD) - | cror 4*cr0+eq, 4*cr0+eq, 4*cr1+eq - | subi TMP2, TMP2, (LJ_TNUMX+1) - | bne >2 // Upvalue is closed and black? - |1: - | ins_next - | - |2: // Check if new value is collectable. - | cmplwi TMP2, LJ_TISGCV - (LJ_TNUMX+1) - | bge <1 // tvisgcv(v) - | lbz TMP3, GCOBJ:TMP1->gch.marked - | andix. TMP3, TMP3, LJ_GC_WHITES // iswhite(v) - | la CARG1, GG_DISP2G(DISPATCH) - | // Crossed a write barrier. Move the barrier forward. - | beq <1 - | bl extern lj_gc_barrieruv // (global_State *g, TValue *tv) - | b <1 - break; - case BC_USETS: - | // RA = uvnum*8, RD = str_const*8 (~) - | lwz LFUNC:RB, FRAME_FUNC(BASE) - | srwi TMP1, RD, 1 - | srwi RA, RA, 1 - | subfic TMP1, TMP1, -4 - | addi RA, RA, offsetof(GCfuncL, uvptr) - | lwzx STR:TMP1, KBASE, TMP1 // KBASE-4-str_const*4 - | lwzx UPVAL:RB, LFUNC:RB, RA - | lbz TMP3, UPVAL:RB->marked - | lwz CARG2, UPVAL:RB->v - | andix. TMP3, TMP3, LJ_GC_BLACK // isblack(uv) - | lbz TMP3, STR:TMP1->marked - | lbz TMP2, UPVAL:RB->closed - | li TMP0, LJ_TSTR - | stw STR:TMP1, 4(CARG2) - | stw TMP0, 0(CARG2) - | bne >2 - |1: - | ins_next - | - |2: // Check if string is white and ensure upvalue is closed. - | andix. TMP3, TMP3, LJ_GC_WHITES // iswhite(str) - | cmplwi cr1, TMP2, 0 - | cror 4*cr0+eq, 4*cr0+eq, 4*cr1+eq - | la CARG1, GG_DISP2G(DISPATCH) - | // Crossed a write barrier. Move the barrier forward. - | beq <1 - | bl extern lj_gc_barrieruv // (global_State *g, TValue *tv) - | b <1 - break; - case BC_USETN: - | // RA = uvnum*8, RD = num_const*8 - | lwz LFUNC:RB, FRAME_FUNC(BASE) - | srwi RA, RA, 1 - | addi RA, RA, offsetof(GCfuncL, uvptr) - | lfdx f0, KBASE, RD - | lwzx UPVAL:RB, LFUNC:RB, RA - | ins_next1 - | lwz TMP1, UPVAL:RB->v - | stfd f0, 0(TMP1) - | ins_next2 - break; - case BC_USETP: - | // RA = uvnum*8, RD = primitive_type*8 (~) - | lwz LFUNC:RB, FRAME_FUNC(BASE) - | srwi RA, RA, 1 - | srwi TMP0, RD, 3 - | addi RA, RA, offsetof(GCfuncL, uvptr) - | not TMP0, TMP0 - | lwzx UPVAL:RB, LFUNC:RB, RA - | ins_next1 - | lwz TMP1, UPVAL:RB->v - | stw TMP0, 0(TMP1) - | ins_next2 - break; - - case BC_UCLO: - | // RA = level*8, RD = target - | lwz TMP1, L->openupval - | branch_RD // Do this first since RD is not saved. - | stp BASE, L->base - | cmplwi TMP1, 0 - | mr CARG1, L - | beq >1 - | add CARG2, BASE, RA - | bl extern lj_func_closeuv // (lua_State *L, TValue *level) - | lp BASE, L->base - |1: - | ins_next - break; - - case BC_FNEW: - | // RA = dst*8, RD = proto_const*8 (~) (holding function prototype) - | srwi TMP1, RD, 1 - | stp BASE, L->base - | subfic TMP1, TMP1, -4 - | stw PC, SAVE_PC - | lwzx CARG2, KBASE, TMP1 // KBASE-4-tab_const*4 - | mr CARG1, L - | lwz CARG3, FRAME_FUNC(BASE) - | // (lua_State *L, GCproto *pt, GCfuncL *parent) - | bl extern lj_func_newL_gc - | // Returns GCfuncL *. - | lp BASE, L->base - | li TMP0, LJ_TFUNC - | stwux TMP0, RA, BASE - | stw LFUNC:CRET1, 4(RA) - | ins_next - break; - - /* -- Table ops --------------------------------------------------------- */ - - case BC_TNEW: - case BC_TDUP: - | // RA = dst*8, RD = (hbits|asize)*8 | tab_const*8 (~) - | lwz TMP0, DISPATCH_GL(gc.total)(DISPATCH) - | mr CARG1, L - | lwz TMP1, DISPATCH_GL(gc.threshold)(DISPATCH) - | stp BASE, L->base - | cmplw TMP0, TMP1 - | stw PC, SAVE_PC - | bge >5 - |1: - if (op == BC_TNEW) { - | rlwinm CARG2, RD, 29, 21, 31 - | rlwinm CARG3, RD, 18, 27, 31 - | cmpwi CARG2, 0x7ff; beq >3 - |2: - | bl extern lj_tab_new // (lua_State *L, int32_t asize, uint32_t hbits) - | // Returns Table *. - } else { - | srwi TMP1, RD, 1 - | subfic TMP1, TMP1, -4 - | lwzx CARG2, KBASE, TMP1 // KBASE-4-tab_const*4 - | bl extern lj_tab_dup // (lua_State *L, Table *kt) - | // Returns Table *. - } - | lp BASE, L->base - | li TMP0, LJ_TTAB - | stwux TMP0, RA, BASE - | stw TAB:CRET1, 4(RA) - | ins_next - if (op == BC_TNEW) { - |3: - | li CARG2, 0x801 - | b <2 - } - |5: - | mr SAVE0, RD - | bl extern lj_gc_step_fixtop // (lua_State *L) - | mr RD, SAVE0 - | mr CARG1, L - | b <1 - break; - - case BC_GGET: - | // RA = dst*8, RD = str_const*8 (~) - case BC_GSET: - | // RA = src*8, RD = str_const*8 (~) - | lwz LFUNC:TMP2, FRAME_FUNC(BASE) - | srwi TMP1, RD, 1 - | lwz TAB:RB, LFUNC:TMP2->env - | subfic TMP1, TMP1, -4 - | lwzx STR:RC, KBASE, TMP1 // KBASE-4-str_const*4 - if (op == BC_GGET) { - | b ->BC_TGETS_Z - } else { - | b ->BC_TSETS_Z - } - break; - - case BC_TGETV: - | // RA = dst*8, RB = table*8, RC = key*8 - | lwzux CARG1, RB, BASE - | lwzux CARG2, RC, BASE - | lwz TAB:RB, 4(RB) - |.if DUALNUM - | lwz RC, 4(RC) - |.else - | lfd f0, 0(RC) - |.endif - | checktab CARG1 - | checknum cr1, CARG2 - | bne ->vmeta_tgetv - |.if DUALNUM - | lwz TMP0, TAB:RB->asize - | bne cr1, >5 - | lwz TMP1, TAB:RB->array - | cmplw TMP0, RC - | slwi TMP2, RC, 3 - |.else - | bge cr1, >5 - | // Convert number key to integer, check for integerness and range. - | fctiwz f1, f0 - | fadd f2, f0, TOBIT - | stfd f1, TMPD - | lwz TMP0, TAB:RB->asize - | fsub f2, f2, TOBIT - | lwz TMP2, TMPD_LO - | lwz TMP1, TAB:RB->array - | fcmpu cr1, f0, f2 - | cmplw cr0, TMP0, TMP2 - | crand 4*cr0+gt, 4*cr0+gt, 4*cr1+eq - | slwi TMP2, TMP2, 3 - |.endif - | ble ->vmeta_tgetv // Integer key and in array part? - | lwzx TMP0, TMP1, TMP2 - | lfdx f14, TMP1, TMP2 - | checknil TMP0; beq >2 - |1: - | ins_next1 - | stfdx f14, BASE, RA - | ins_next2 - | - |2: // Check for __index if table value is nil. - | lwz TAB:TMP2, TAB:RB->metatable - | cmplwi TAB:TMP2, 0 - | beq <1 // No metatable: done. - | lbz TMP0, TAB:TMP2->nomm - | andix. TMP0, TMP0, 1<vmeta_tgetv - | - |5: - | checkstr CARG2; bne ->vmeta_tgetv - |.if not DUALNUM - | lwz STR:RC, 4(RC) - |.endif - | b ->BC_TGETS_Z // String key? - break; - case BC_TGETS: - | // RA = dst*8, RB = table*8, RC = str_const*8 (~) - | lwzux CARG1, RB, BASE - | srwi TMP1, RC, 1 - | lwz TAB:RB, 4(RB) - | subfic TMP1, TMP1, -4 - | checktab CARG1 - | lwzx STR:RC, KBASE, TMP1 // KBASE-4-str_const*4 - | bne ->vmeta_tgets1 - |->BC_TGETS_Z: - | // TAB:RB = GCtab *, STR:RC = GCstr *, RA = dst*8 - | lwz TMP0, TAB:RB->hmask - | lwz TMP1, STR:RC->hash - | lwz NODE:TMP2, TAB:RB->node - | and TMP1, TMP1, TMP0 // idx = str->hash & tab->hmask - | slwi TMP0, TMP1, 5 - | slwi TMP1, TMP1, 3 - | sub TMP1, TMP0, TMP1 - | add NODE:TMP2, NODE:TMP2, TMP1 // node = tab->node + (idx*32-idx*8) - |1: - | lwz CARG1, NODE:TMP2->key - | lwz TMP0, 4+offsetof(Node, key)(NODE:TMP2) - | lwz CARG2, NODE:TMP2->val - | lwz TMP1, 4+offsetof(Node, val)(NODE:TMP2) - | checkstr CARG1; bne >4 - | cmpw TMP0, STR:RC; bne >4 - | checknil CARG2; beq >5 // Key found, but nil value? - |3: - | stwux CARG2, RA, BASE - | stw TMP1, 4(RA) - | ins_next - | - |4: // Follow hash chain. - | lwz NODE:TMP2, NODE:TMP2->next - | cmplwi NODE:TMP2, 0 - | bne <1 - | // End of hash chain: key not found, nil result. - | li CARG2, LJ_TNIL - | - |5: // Check for __index if table value is nil. - | lwz TAB:TMP2, TAB:RB->metatable - | cmplwi TAB:TMP2, 0 - | beq <3 // No metatable: done. - | lbz TMP0, TAB:TMP2->nomm - | andix. TMP0, TMP0, 1<vmeta_tgets - break; - case BC_TGETB: - | // RA = dst*8, RB = table*8, RC = index*8 - | lwzux CARG1, RB, BASE - | srwi TMP0, RC, 3 - | lwz TAB:RB, 4(RB) - | checktab CARG1; bne ->vmeta_tgetb - | lwz TMP1, TAB:RB->asize - | lwz TMP2, TAB:RB->array - | cmplw TMP0, TMP1; bge ->vmeta_tgetb - | lwzx TMP1, TMP2, RC - | lfdx f0, TMP2, RC - | checknil TMP1; beq >5 - |1: - | ins_next1 - | stfdx f0, BASE, RA - | ins_next2 - | - |5: // Check for __index if table value is nil. - | lwz TAB:TMP2, TAB:RB->metatable - | cmplwi TAB:TMP2, 0 - | beq <1 // No metatable: done. - | lbz TMP2, TAB:TMP2->nomm - | andix. TMP2, TMP2, 1<vmeta_tgetb // Caveat: preserve TMP0! - break; - - case BC_TSETV: - | // RA = src*8, RB = table*8, RC = key*8 - | lwzux CARG1, RB, BASE - | lwzux CARG2, RC, BASE - | lwz TAB:RB, 4(RB) - |.if DUALNUM - | lwz RC, 4(RC) - |.else - | lfd f0, 0(RC) - |.endif - | checktab CARG1 - | checknum cr1, CARG2 - | bne ->vmeta_tsetv - |.if DUALNUM - | lwz TMP0, TAB:RB->asize - | bne cr1, >5 - | lwz TMP1, TAB:RB->array - | cmplw TMP0, RC - | slwi TMP0, RC, 3 - |.else - | bge cr1, >5 - | // Convert number key to integer, check for integerness and range. - | fctiwz f1, f0 - | fadd f2, f0, TOBIT - | stfd f1, TMPD - | lwz TMP0, TAB:RB->asize - | fsub f2, f2, TOBIT - | lwz TMP2, TMPD_LO - | lwz TMP1, TAB:RB->array - | fcmpu cr1, f0, f2 - | cmplw cr0, TMP0, TMP2 - | crand 4*cr0+gt, 4*cr0+gt, 4*cr1+eq - | slwi TMP0, TMP2, 3 - |.endif - | ble ->vmeta_tsetv // Integer key and in array part? - | lwzx TMP2, TMP1, TMP0 - | lbz TMP3, TAB:RB->marked - | lfdx f14, BASE, RA - | checknil TMP2; beq >3 - |1: - | andix. TMP2, TMP3, LJ_GC_BLACK // isblack(table) - | stfdx f14, TMP1, TMP0 - | bne >7 - |2: - | ins_next - | - |3: // Check for __newindex if previous value is nil. - | lwz TAB:TMP2, TAB:RB->metatable - | cmplwi TAB:TMP2, 0 - | beq <1 // No metatable: done. - | lbz TMP2, TAB:TMP2->nomm - | andix. TMP2, TMP2, 1<vmeta_tsetv - | - |5: - | checkstr CARG2; bne ->vmeta_tsetv - |.if not DUALNUM - | lwz STR:RC, 4(RC) - |.endif - | b ->BC_TSETS_Z // String key? - | - |7: // Possible table write barrier for the value. Skip valiswhite check. - | barrierback TAB:RB, TMP3, TMP0 - | b <2 - break; - case BC_TSETS: - | // RA = src*8, RB = table*8, RC = str_const*8 (~) - | lwzux CARG1, RB, BASE - | srwi TMP1, RC, 1 - | lwz TAB:RB, 4(RB) - | subfic TMP1, TMP1, -4 - | checktab CARG1 - | lwzx STR:RC, KBASE, TMP1 // KBASE-4-str_const*4 - | bne ->vmeta_tsets1 - |->BC_TSETS_Z: - | // TAB:RB = GCtab *, STR:RC = GCstr *, RA = src*8 - | lwz TMP0, TAB:RB->hmask - | lwz TMP1, STR:RC->hash - | lwz NODE:TMP2, TAB:RB->node - | stb ZERO, TAB:RB->nomm // Clear metamethod cache. - | and TMP1, TMP1, TMP0 // idx = str->hash & tab->hmask - | lfdx f14, BASE, RA - | slwi TMP0, TMP1, 5 - | slwi TMP1, TMP1, 3 - | sub TMP1, TMP0, TMP1 - | lbz TMP3, TAB:RB->marked - | add NODE:TMP2, NODE:TMP2, TMP1 // node = tab->node + (idx*32-idx*8) - |1: - | lwz CARG1, NODE:TMP2->key - | lwz TMP0, 4+offsetof(Node, key)(NODE:TMP2) - | lwz CARG2, NODE:TMP2->val - | lwz NODE:TMP1, NODE:TMP2->next - | checkstr CARG1; bne >5 - | cmpw TMP0, STR:RC; bne >5 - | checknil CARG2; beq >4 // Key found, but nil value? - |2: - | andix. TMP0, TMP3, LJ_GC_BLACK // isblack(table) - | stfd f14, NODE:TMP2->val - | bne >7 - |3: - | ins_next - | - |4: // Check for __newindex if previous value is nil. - | lwz TAB:TMP1, TAB:RB->metatable - | cmplwi TAB:TMP1, 0 - | beq <2 // No metatable: done. - | lbz TMP0, TAB:TMP1->nomm - | andix. TMP0, TMP0, 1<vmeta_tsets - | - |5: // Follow hash chain. - | cmplwi NODE:TMP1, 0 - | mr NODE:TMP2, NODE:TMP1 - | bne <1 - | // End of hash chain: key not found, add a new one. - | - | // But check for __newindex first. - | lwz TAB:TMP1, TAB:RB->metatable - | la CARG3, DISPATCH_GL(tmptv)(DISPATCH) - | stw PC, SAVE_PC - | mr CARG1, L - | cmplwi TAB:TMP1, 0 - | stp BASE, L->base - | beq >6 // No metatable: continue. - | lbz TMP0, TAB:TMP1->nomm - | andix. TMP0, TMP0, 1<vmeta_tsets // 'no __newindex' flag NOT set: check. - |6: - | li TMP0, LJ_TSTR - | stw STR:RC, 4(CARG3) - | mr CARG2, TAB:RB - | stw TMP0, 0(CARG3) - | bl extern lj_tab_newkey // (lua_State *L, GCtab *t, TValue *k) - | // Returns TValue *. - | lp BASE, L->base - | stfd f14, 0(CRET1) - | b <3 // No 2nd write barrier needed. - | - |7: // Possible table write barrier for the value. Skip valiswhite check. - | barrierback TAB:RB, TMP3, TMP0 - | b <3 - break; - case BC_TSETB: - | // RA = src*8, RB = table*8, RC = index*8 - | lwzux CARG1, RB, BASE - | srwi TMP0, RC, 3 - | lwz TAB:RB, 4(RB) - | checktab CARG1; bne ->vmeta_tsetb - | lwz TMP1, TAB:RB->asize - | lwz TMP2, TAB:RB->array - | lbz TMP3, TAB:RB->marked - | cmplw TMP0, TMP1 - | lfdx f14, BASE, RA - | bge ->vmeta_tsetb - | lwzx TMP1, TMP2, RC - | checknil TMP1; beq >5 - |1: - | andix. TMP0, TMP3, LJ_GC_BLACK // isblack(table) - | stfdx f14, TMP2, RC - | bne >7 - |2: - | ins_next - | - |5: // Check for __newindex if previous value is nil. - | lwz TAB:TMP1, TAB:RB->metatable - | cmplwi TAB:TMP1, 0 - | beq <1 // No metatable: done. - | lbz TMP1, TAB:TMP1->nomm - | andix. TMP1, TMP1, 1<vmeta_tsetb // Caveat: preserve TMP0! - | - |7: // Possible table write barrier for the value. Skip valiswhite check. - | barrierback TAB:RB, TMP3, TMP0 - | b <2 - break; - - case BC_TSETM: - | // RA = base*8 (table at base-1), RD = num_const*8 (start index) - | add RA, BASE, RA - |1: - | add TMP3, KBASE, RD - | lwz TAB:CARG2, -4(RA) // Guaranteed to be a table. - | addic. TMP0, MULTRES, -8 - | lwz TMP3, 4(TMP3) // Integer constant is in lo-word. - | srwi CARG3, TMP0, 3 - | beq >4 // Nothing to copy? - | add CARG3, CARG3, TMP3 - | lwz TMP2, TAB:CARG2->asize - | slwi TMP1, TMP3, 3 - | lbz TMP3, TAB:CARG2->marked - | cmplw CARG3, TMP2 - | add TMP2, RA, TMP0 - | lwz TMP0, TAB:CARG2->array - | bgt >5 - | add TMP1, TMP1, TMP0 - | andix. TMP0, TMP3, LJ_GC_BLACK // isblack(table) - |3: // Copy result slots to table. - | lfd f0, 0(RA) - | addi RA, RA, 8 - | cmpw cr1, RA, TMP2 - | stfd f0, 0(TMP1) - | addi TMP1, TMP1, 8 - | blt cr1, <3 - | bne >7 - |4: - | ins_next - | - |5: // Need to resize array part. - | stp BASE, L->base - | mr CARG1, L - | stw PC, SAVE_PC - | mr SAVE0, RD - | bl extern lj_tab_reasize // (lua_State *L, GCtab *t, int nasize) - | // Must not reallocate the stack. - | mr RD, SAVE0 - | b <1 - | - |7: // Possible table write barrier for any value. Skip valiswhite check. - | barrierback TAB:CARG2, TMP3, TMP0 - | b <4 - break; - - /* -- Calls and vararg handling ----------------------------------------- */ - - case BC_CALLM: - | // RA = base*8, (RB = (nresults+1)*8,) RC = extra_nargs*8 - | add NARGS8:RC, NARGS8:RC, MULTRES - | // Fall through. Assumes BC_CALL follows. - break; - case BC_CALL: - | // RA = base*8, (RB = (nresults+1)*8,) RC = (nargs+1)*8 - | mr TMP2, BASE - | lwzux TMP0, BASE, RA - | lwz LFUNC:RB, 4(BASE) - | subi NARGS8:RC, NARGS8:RC, 8 - | addi BASE, BASE, 8 - | checkfunc TMP0; bne ->vmeta_call - | ins_call - break; - - case BC_CALLMT: - | // RA = base*8, (RB = 0,) RC = extra_nargs*8 - | add NARGS8:RC, NARGS8:RC, MULTRES - | // Fall through. Assumes BC_CALLT follows. - break; - case BC_CALLT: - | // RA = base*8, (RB = 0,) RC = (nargs+1)*8 - | lwzux TMP0, RA, BASE - | lwz LFUNC:RB, 4(RA) - | subi NARGS8:RC, NARGS8:RC, 8 - | lwz TMP1, FRAME_PC(BASE) - | checkfunc TMP0 - | addi RA, RA, 8 - | bne ->vmeta_callt - |->BC_CALLT_Z: - | andix. TMP0, TMP1, FRAME_TYPE // Caveat: preserve cr0 until the crand. - | lbz TMP3, LFUNC:RB->ffid - | xori TMP2, TMP1, FRAME_VARG - | cmplwi cr1, NARGS8:RC, 0 - | bne >7 - |1: - | stw LFUNC:RB, FRAME_FUNC(BASE) // Copy function down, but keep PC. - | li TMP2, 0 - | cmplwi cr7, TMP3, 1 // (> FF_C) Calling a fast function? - | beq cr1, >3 - |2: - | addi TMP3, TMP2, 8 - | lfdx f0, RA, TMP2 - | cmplw cr1, TMP3, NARGS8:RC - | stfdx f0, BASE, TMP2 - | mr TMP2, TMP3 - | bne cr1, <2 - |3: - | crand 4*cr0+eq, 4*cr0+eq, 4*cr7+gt - | beq >5 - |4: - | ins_callt - | - |5: // Tailcall to a fast function with a Lua frame below. - | lwz INS, -4(TMP1) - | decode_RA8 RA, INS - | sub TMP1, BASE, RA - | lwz LFUNC:TMP1, FRAME_FUNC-8(TMP1) - | lwz TMP1, LFUNC:TMP1->pc - | lwz KBASE, PC2PROTO(k)(TMP1) // Need to prepare KBASE. - | b <4 - | - |7: // Tailcall from a vararg function. - | andix. TMP0, TMP2, FRAME_TYPEP - | bne <1 // Vararg frame below? - | sub BASE, BASE, TMP2 // Relocate BASE down. - | lwz TMP1, FRAME_PC(BASE) - | andix. TMP0, TMP1, FRAME_TYPE - | b <1 - break; - - case BC_ITERC: - | // RA = base*8, (RB = (nresults+1)*8, RC = (nargs+1)*8 ((2+1)*8)) - | mr TMP2, BASE - | add BASE, BASE, RA - | lwz TMP1, -24(BASE) - | lwz LFUNC:RB, -20(BASE) - | lfd f1, -8(BASE) - | lfd f0, -16(BASE) - | stw TMP1, 0(BASE) // Copy callable. - | stw LFUNC:RB, 4(BASE) - | checkfunc TMP1 - | stfd f1, 16(BASE) // Copy control var. - | li NARGS8:RC, 16 // Iterators get 2 arguments. - | stfdu f0, 8(BASE) // Copy state. - | bne ->vmeta_call - | ins_call - break; - - case BC_ITERN: - | // RA = base*8, (RB = (nresults+1)*8, RC = (nargs+1)*8 (2+1)*8) - |.if JIT - | // NYI: add hotloop, record BC_ITERN. - |.endif - | add RA, BASE, RA - | lwz TAB:RB, -12(RA) - | lwz RC, -4(RA) // Get index from control var. - | lwz TMP0, TAB:RB->asize - | lwz TMP1, TAB:RB->array - | addi PC, PC, 4 - |1: // Traverse array part. - | cmplw RC, TMP0 - | slwi TMP3, RC, 3 - | bge >5 // Index points after array part? - | lwzx TMP2, TMP1, TMP3 - | lfdx f0, TMP1, TMP3 - | checknil TMP2 - | lwz INS, -4(PC) - | beq >4 - |.if DUALNUM - | stw RC, 4(RA) - | stw TISNUM, 0(RA) - |.else - | tonum_u f1, RC - |.endif - | addi RC, RC, 1 - | addis TMP3, PC, -(BCBIAS_J*4 >> 16) - | stfd f0, 8(RA) - | decode_RD4 TMP1, INS - | stw RC, -4(RA) // Update control var. - | add PC, TMP1, TMP3 - |.if not DUALNUM - | stfd f1, 0(RA) - |.endif - |3: - | ins_next - | - |4: // Skip holes in array part. - | addi RC, RC, 1 - | b <1 - | - |5: // Traverse hash part. - | lwz TMP1, TAB:RB->hmask - | sub RC, RC, TMP0 - | lwz TMP2, TAB:RB->node - |6: - | cmplw RC, TMP1 // End of iteration? Branch to ITERL+1. - | slwi TMP3, RC, 5 - | bgty <3 - | slwi RB, RC, 3 - | sub TMP3, TMP3, RB - | lwzx RB, TMP2, TMP3 - | lfdx f0, TMP2, TMP3 - | add NODE:TMP3, TMP2, TMP3 - | checknil RB - | lwz INS, -4(PC) - | beq >7 - | lfd f1, NODE:TMP3->key - | addis TMP2, PC, -(BCBIAS_J*4 >> 16) - | stfd f0, 8(RA) - | add RC, RC, TMP0 - | decode_RD4 TMP1, INS - | stfd f1, 0(RA) - | addi RC, RC, 1 - | add PC, TMP1, TMP2 - | stw RC, -4(RA) // Update control var. - | b <3 - | - |7: // Skip holes in hash part. - | addi RC, RC, 1 - | b <6 - break; - - case BC_ISNEXT: - | // RA = base*8, RD = target (points to ITERN) - | add RA, BASE, RA - | lwz TMP0, -24(RA) - | lwz CFUNC:TMP1, -20(RA) - | lwz TMP2, -16(RA) - | lwz TMP3, -8(RA) - | cmpwi cr0, TMP2, LJ_TTAB - | cmpwi cr1, TMP0, LJ_TFUNC - | cmpwi cr6, TMP3, LJ_TNIL - | bne cr1, >5 - | lbz TMP1, CFUNC:TMP1->ffid - | crand 4*cr0+eq, 4*cr0+eq, 4*cr6+eq - | cmpwi cr7, TMP1, FF_next_N - | srwi TMP0, RD, 1 - | crand 4*cr0+eq, 4*cr0+eq, 4*cr7+eq - | add TMP3, PC, TMP0 - | bne cr0, >5 - | lus TMP1, 0xfffe - | ori TMP1, TMP1, 0x7fff - | stw ZERO, -4(RA) // Initialize control var. - | stw TMP1, -8(RA) - | addis PC, TMP3, -(BCBIAS_J*4 >> 16) - |1: - | ins_next - |5: // Despecialize bytecode if any of the checks fail. - | li TMP0, BC_JMP - | li TMP1, BC_ITERC - | stb TMP0, -1(PC) - | addis PC, TMP3, -(BCBIAS_J*4 >> 16) - | stb TMP1, 3(PC) - | b <1 - break; - - case BC_VARG: - | // RA = base*8, RB = (nresults+1)*8, RC = numparams*8 - | lwz TMP0, FRAME_PC(BASE) - | add RC, BASE, RC - | add RA, BASE, RA - | addi RC, RC, FRAME_VARG - | add TMP2, RA, RB - | subi TMP3, BASE, 8 // TMP3 = vtop - | sub RC, RC, TMP0 // RC = vbase - | // Note: RC may now be even _above_ BASE if nargs was < numparams. - | cmplwi cr1, RB, 0 - |.if PPE - | sub TMP1, TMP3, RC - | cmpwi TMP1, 0 - |.else - | sub. TMP1, TMP3, RC - |.endif - | beq cr1, >5 // Copy all varargs? - | subi TMP2, TMP2, 16 - | ble >2 // No vararg slots? - |1: // Copy vararg slots to destination slots. - | lfd f0, 0(RC) - | addi RC, RC, 8 - | stfd f0, 0(RA) - | cmplw RA, TMP2 - | cmplw cr1, RC, TMP3 - | bge >3 // All destination slots filled? - | addi RA, RA, 8 - | blt cr1, <1 // More vararg slots? - |2: // Fill up remainder with nil. - | stw TISNIL, 0(RA) - | cmplw RA, TMP2 - | addi RA, RA, 8 - | blt <2 - |3: - | ins_next - | - |5: // Copy all varargs. - | lwz TMP0, L->maxstack - | li MULTRES, 8 // MULTRES = (0+1)*8 - | bley <3 // No vararg slots? - | add TMP2, RA, TMP1 - | cmplw TMP2, TMP0 - | addi MULTRES, TMP1, 8 - | bgt >7 - |6: - | lfd f0, 0(RC) - | addi RC, RC, 8 - | stfd f0, 0(RA) - | cmplw RC, TMP3 - | addi RA, RA, 8 - | blt <6 // More vararg slots? - | b <3 - | - |7: // Grow stack for varargs. - | mr CARG1, L - | stp RA, L->top - | sub SAVE0, RC, BASE // Need delta, because BASE may change. - | stp BASE, L->base - | sub RA, RA, BASE - | stw PC, SAVE_PC - | srwi CARG2, TMP1, 3 - | bl extern lj_state_growstack // (lua_State *L, int n) - | lp BASE, L->base - | add RA, BASE, RA - | add RC, BASE, SAVE0 - | subi TMP3, BASE, 8 - | b <6 - break; - - /* -- Returns ----------------------------------------------------------- */ - - case BC_RETM: - | // RA = results*8, RD = extra_nresults*8 - | add RD, RD, MULTRES // MULTRES >= 8, so RD >= 8. - | // Fall through. Assumes BC_RET follows. - break; - - case BC_RET: - | // RA = results*8, RD = (nresults+1)*8 - | lwz PC, FRAME_PC(BASE) - | add RA, BASE, RA - | mr MULTRES, RD - |1: - | andix. TMP0, PC, FRAME_TYPE - | xori TMP1, PC, FRAME_VARG - | bne ->BC_RETV_Z - | - |->BC_RET_Z: - | // BASE = base, RA = resultptr, RD = (nresults+1)*8, PC = return - | lwz INS, -4(PC) - | cmpwi RD, 8 - | subi TMP2, BASE, 8 - | subi RC, RD, 8 - | decode_RB8 RB, INS - | beq >3 - | li TMP1, 0 - |2: - | addi TMP3, TMP1, 8 - | lfdx f0, RA, TMP1 - | cmpw TMP3, RC - | stfdx f0, TMP2, TMP1 - | beq >3 - | addi TMP1, TMP3, 8 - | lfdx f1, RA, TMP3 - | cmpw TMP1, RC - | stfdx f1, TMP2, TMP3 - | bne <2 - |3: - |5: - | cmplw RB, RD - | decode_RA8 RA, INS - | bgt >6 - | sub BASE, TMP2, RA - | lwz LFUNC:TMP1, FRAME_FUNC(BASE) - | ins_next1 - | lwz TMP1, LFUNC:TMP1->pc - | lwz KBASE, PC2PROTO(k)(TMP1) - | ins_next2 - | - |6: // Fill up results with nil. - | subi TMP1, RD, 8 - | addi RD, RD, 8 - | stwx TISNIL, TMP2, TMP1 - | b <5 - | - |->BC_RETV_Z: // Non-standard return case. - | andix. TMP2, TMP1, FRAME_TYPEP - | bne ->vm_return - | // Return from vararg function: relocate BASE down. - | sub BASE, BASE, TMP1 - | lwz PC, FRAME_PC(BASE) - | b <1 - break; - - case BC_RET0: case BC_RET1: - | // RA = results*8, RD = (nresults+1)*8 - | lwz PC, FRAME_PC(BASE) - | add RA, BASE, RA - | mr MULTRES, RD - | andix. TMP0, PC, FRAME_TYPE - | xori TMP1, PC, FRAME_VARG - | bney ->BC_RETV_Z - | - | lwz INS, -4(PC) - | subi TMP2, BASE, 8 - | decode_RB8 RB, INS - if (op == BC_RET1) { - | lfd f0, 0(RA) - | stfd f0, 0(TMP2) - } - |5: - | cmplw RB, RD - | decode_RA8 RA, INS - | bgt >6 - | sub BASE, TMP2, RA - | lwz LFUNC:TMP1, FRAME_FUNC(BASE) - | ins_next1 - | lwz TMP1, LFUNC:TMP1->pc - | lwz KBASE, PC2PROTO(k)(TMP1) - | ins_next2 - | - |6: // Fill up results with nil. - | subi TMP1, RD, 8 - | addi RD, RD, 8 - | stwx TISNIL, TMP2, TMP1 - | b <5 - break; - - /* -- Loops and branches ------------------------------------------------ */ - - case BC_FORL: - |.if JIT - | hotloop - |.endif - | // Fall through. Assumes BC_IFORL follows. - break; - - case BC_JFORI: - case BC_JFORL: -#if !LJ_HASJIT - break; -#endif - case BC_FORI: - case BC_IFORL: - | // RA = base*8, RD = target (after end of loop or start of loop) - vk = (op == BC_IFORL || op == BC_JFORL); - |.if DUALNUM - | // Integer loop. - | lwzux TMP1, RA, BASE - | lwz CARG1, FORL_IDX*8+4(RA) - | cmplw cr0, TMP1, TISNUM - if (vk) { - | lwz CARG3, FORL_STEP*8+4(RA) - | bne >9 - |.if GPR64 - | // Need to check overflow for (a<<32) + (b<<32). - | rldicr TMP0, CARG1, 32, 31 - | rldicr TMP2, CARG3, 32, 31 - | add CARG1, CARG1, CARG3 - | addo. TMP0, TMP0, TMP2 - |.else - | addo. CARG1, CARG1, CARG3 - |.endif - | cmpwi cr6, CARG3, 0 - | lwz CARG2, FORL_STOP*8+4(RA) - | bso >6 - |4: - | stw CARG1, FORL_IDX*8+4(RA) - } else { - | lwz TMP3, FORL_STEP*8(RA) - | lwz CARG3, FORL_STEP*8+4(RA) - | lwz TMP2, FORL_STOP*8(RA) - | lwz CARG2, FORL_STOP*8+4(RA) - | cmplw cr7, TMP3, TISNUM - | cmplw cr1, TMP2, TISNUM - | crand 4*cr0+eq, 4*cr0+eq, 4*cr7+eq - | crand 4*cr0+eq, 4*cr0+eq, 4*cr1+eq - | cmpwi cr6, CARG3, 0 - | bne >9 - } - | blt cr6, >5 - | cmpw CARG1, CARG2 - |1: - | stw TISNUM, FORL_EXT*8(RA) - if (op != BC_JFORL) { - | srwi RD, RD, 1 - } - | stw CARG1, FORL_EXT*8+4(RA) - if (op != BC_JFORL) { - | add RD, PC, RD - } - if (op == BC_FORI) { - | bgt >3 // See FP loop below. - } else if (op == BC_JFORI) { - | addis PC, RD, -(BCBIAS_J*4 >> 16) - | bley >7 - } else if (op == BC_IFORL) { - | bgt >2 - | addis PC, RD, -(BCBIAS_J*4 >> 16) - } else { - | bley =>BC_JLOOP - } - |2: - | ins_next - |5: // Invert check for negative step. - | cmpw CARG2, CARG1 - | b <1 - if (vk) { - |6: // Potential overflow. - | checkov TMP0, <4 // Ignore unrelated overflow. - | b <2 - } - |.endif - if (vk) { - |.if DUALNUM - |9: // FP loop. - | lfd f1, FORL_IDX*8(RA) - |.else - | lfdux f1, RA, BASE - |.endif - | lfd f3, FORL_STEP*8(RA) - | lfd f2, FORL_STOP*8(RA) - | lwz TMP3, FORL_STEP*8(RA) - | fadd f1, f1, f3 - | stfd f1, FORL_IDX*8(RA) - } else { - |.if DUALNUM - |9: // FP loop. - |.else - | lwzux TMP1, RA, BASE - | lwz TMP3, FORL_STEP*8(RA) - | lwz TMP2, FORL_STOP*8(RA) - | cmplw cr0, TMP1, TISNUM - | cmplw cr7, TMP3, TISNUM - | cmplw cr1, TMP2, TISNUM - |.endif - | lfd f1, FORL_IDX*8(RA) - | crand 4*cr0+lt, 4*cr0+lt, 4*cr7+lt - | crand 4*cr0+lt, 4*cr0+lt, 4*cr1+lt - | lfd f2, FORL_STOP*8(RA) - | bge ->vmeta_for - } - | cmpwi cr6, TMP3, 0 - if (op != BC_JFORL) { - | srwi RD, RD, 1 - } - | stfd f1, FORL_EXT*8(RA) - if (op != BC_JFORL) { - | add RD, PC, RD - } - | fcmpu cr0, f1, f2 - if (op == BC_JFORI) { - | addis PC, RD, -(BCBIAS_J*4 >> 16) - } - | blt cr6, >5 - if (op == BC_FORI) { - | bgt >3 - } else if (op == BC_IFORL) { - |.if DUALNUM - | bgty <2 - |.else - | bgt >2 - |.endif - |1: - | addis PC, RD, -(BCBIAS_J*4 >> 16) - } else if (op == BC_JFORI) { - | bley >7 - } else { - | bley =>BC_JLOOP - } - |.if DUALNUM - | b <2 - |.else - |2: - | ins_next - |.endif - |5: // Negative step. - if (op == BC_FORI) { - | bge <2 - |3: // Used by integer loop, too. - | addis PC, RD, -(BCBIAS_J*4 >> 16) - } else if (op == BC_IFORL) { - | bgey <1 - } else if (op == BC_JFORI) { - | bgey >7 - } else { - | bgey =>BC_JLOOP - } - | b <2 - if (op == BC_JFORI) { - |7: - | lwz INS, -4(PC) - | decode_RD8 RD, INS - | b =>BC_JLOOP - } - break; - - case BC_ITERL: - |.if JIT - | hotloop - |.endif - | // Fall through. Assumes BC_IITERL follows. - break; - - case BC_JITERL: -#if !LJ_HASJIT - break; -#endif - case BC_IITERL: - | // RA = base*8, RD = target - | lwzux TMP1, RA, BASE - | lwz TMP2, 4(RA) - | checknil TMP1; beq >1 // Stop if iterator returned nil. - if (op == BC_JITERL) { - | stw TMP1, -8(RA) - | stw TMP2, -4(RA) - | b =>BC_JLOOP - } else { - | branch_RD // Otherwise save control var + branch. - | stw TMP1, -8(RA) - | stw TMP2, -4(RA) - } - |1: - | ins_next - break; - - case BC_LOOP: - | // RA = base*8, RD = target (loop extent) - | // Note: RA/RD is only used by trace recorder to determine scope/extent - | // This opcode does NOT jump, it's only purpose is to detect a hot loop. - |.if JIT - | hotloop - |.endif - | // Fall through. Assumes BC_ILOOP follows. - break; - - case BC_ILOOP: - | // RA = base*8, RD = target (loop extent) - | ins_next - break; - - case BC_JLOOP: - |.if JIT - | // RA = base*8 (ignored), RD = traceno*8 - | lwz TMP1, DISPATCH_J(trace)(DISPATCH) - | srwi RD, RD, 1 - | // Traces on PPC don't store the trace number, so use 0. - | stw ZERO, DISPATCH_GL(vmstate)(DISPATCH) - | lwzx TRACE:TMP2, TMP1, RD - | clrso TMP1 - | lp TMP2, TRACE:TMP2->mcode - | stw BASE, DISPATCH_GL(jit_base)(DISPATCH) - | mtctr TMP2 - | stw L, DISPATCH_GL(jit_L)(DISPATCH) - | addi JGL, DISPATCH, GG_DISP2G+32768 - | bctr - |.endif - break; - - case BC_JMP: - | // RA = base*8 (only used by trace recorder), RD = target - | branch_RD - | ins_next - break; - - /* -- Function headers -------------------------------------------------- */ - - case BC_FUNCF: - |.if JIT - | hotcall - |.endif - case BC_FUNCV: /* NYI: compiled vararg functions. */ - | // Fall through. Assumes BC_IFUNCF/BC_IFUNCV follow. - break; - - case BC_JFUNCF: -#if !LJ_HASJIT - break; -#endif - case BC_IFUNCF: - | // BASE = new base, RA = BASE+framesize*8, RB = LFUNC, RC = nargs*8 - | lwz TMP2, L->maxstack - | lbz TMP1, -4+PC2PROTO(numparams)(PC) - | lwz KBASE, -4+PC2PROTO(k)(PC) - | cmplw RA, TMP2 - | slwi TMP1, TMP1, 3 - | bgt ->vm_growstack_l - if (op != BC_JFUNCF) { - | ins_next1 - } - |2: - | cmplw NARGS8:RC, TMP1 // Check for missing parameters. - | blt >3 - if (op == BC_JFUNCF) { - | decode_RD8 RD, INS - | b =>BC_JLOOP - } else { - | ins_next2 - } - | - |3: // Clear missing parameters. - | stwx TISNIL, BASE, NARGS8:RC - | addi NARGS8:RC, NARGS8:RC, 8 - | b <2 - break; - - case BC_JFUNCV: -#if !LJ_HASJIT - break; -#endif - | NYI // NYI: compiled vararg functions - break; /* NYI: compiled vararg functions. */ - - case BC_IFUNCV: - | // BASE = new base, RA = BASE+framesize*8, RB = LFUNC, RC = nargs*8 - | lwz TMP2, L->maxstack - | add TMP1, BASE, RC - | add TMP0, RA, RC - | stw LFUNC:RB, 4(TMP1) // Store copy of LFUNC. - | addi TMP3, RC, 8+FRAME_VARG - | lwz KBASE, -4+PC2PROTO(k)(PC) - | cmplw TMP0, TMP2 - | stw TMP3, 0(TMP1) // Store delta + FRAME_VARG. - | bge ->vm_growstack_l - | lbz TMP2, -4+PC2PROTO(numparams)(PC) - | mr RA, BASE - | mr RC, TMP1 - | ins_next1 - | cmpwi TMP2, 0 - | addi BASE, TMP1, 8 - | beq >3 - |1: - | cmplw RA, RC // Less args than parameters? - | lwz TMP0, 0(RA) - | lwz TMP3, 4(RA) - | bge >4 - | stw TISNIL, 0(RA) // Clear old fixarg slot (help the GC). - | addi RA, RA, 8 - |2: - | addic. TMP2, TMP2, -1 - | stw TMP0, 8(TMP1) - | stw TMP3, 12(TMP1) - | addi TMP1, TMP1, 8 - | bne <1 - |3: - | ins_next2 - | - |4: // Clear missing parameters. - | li TMP0, LJ_TNIL - | b <2 - break; - - case BC_FUNCC: - case BC_FUNCCW: - | // BASE = new base, RA = BASE+framesize*8, RB = CFUNC, RC = nargs*8 - if (op == BC_FUNCC) { - | lp RD, CFUNC:RB->f - } else { - | lp RD, DISPATCH_GL(wrapf)(DISPATCH) - } - | add TMP1, RA, NARGS8:RC - | lwz TMP2, L->maxstack - | .toc lp TMP3, 0(RD) - | add RC, BASE, NARGS8:RC - | stp BASE, L->base - | cmplw TMP1, TMP2 - | stp RC, L->top - | li_vmstate C - |.if TOC - | mtctr TMP3 - |.else - | mtctr RD - |.endif - if (op == BC_FUNCCW) { - | lp CARG2, CFUNC:RB->f - } - | mr CARG1, L - | bgt ->vm_growstack_c // Need to grow stack. - | .toc lp TOCREG, TOC_OFS(RD) - | .tocenv lp ENVREG, ENV_OFS(RD) - | st_vmstate - | bctrl // (lua_State *L [, lua_CFunction f]) - | // Returns nresults. - | lp BASE, L->base - | .toc ld TOCREG, SAVE_TOC - | slwi RD, CRET1, 3 - | lp TMP1, L->top - | li_vmstate INTERP - | lwz PC, FRAME_PC(BASE) // Fetch PC of caller. - | sub RA, TMP1, RD // RA = L->top - nresults*8 - | st_vmstate - | b ->vm_returnc - break; - - /* ---------------------------------------------------------------------- */ - - default: - fprintf(stderr, "Error: undefined opcode BC_%s\n", bc_names[op]); - exit(2); - break; - } -} - -static int build_backend(BuildCtx *ctx) -{ - int op; - - dasm_growpc(Dst, BC__MAX); - - build_subroutines(ctx); - - |.code_op - for (op = 0; op < BC__MAX; op++) - build_ins(ctx, (BCOp)op, op); - - return BC__MAX; -} - -/* Emit pseudo frame-info for all assembler functions. */ -static void emit_asm_debug(BuildCtx *ctx) -{ - int fcofs = (int)((uint8_t *)ctx->glob[GLOB_vm_ffi_call] - ctx->code); - int i; - switch (ctx->mode) { - case BUILD_elfasm: - fprintf(ctx->fp, "\t.section .debug_frame,\"\",@progbits\n"); - fprintf(ctx->fp, - ".Lframe0:\n" - "\t.long .LECIE0-.LSCIE0\n" - ".LSCIE0:\n" - "\t.long 0xffffffff\n" - "\t.byte 0x1\n" - "\t.string \"\"\n" - "\t.uleb128 0x1\n" - "\t.sleb128 -4\n" - "\t.byte 65\n" - "\t.byte 0xc\n\t.uleb128 1\n\t.uleb128 0\n" - "\t.align 2\n" - ".LECIE0:\n\n"); - fprintf(ctx->fp, - ".LSFDE0:\n" - "\t.long .LEFDE0-.LASFDE0\n" - ".LASFDE0:\n" - "\t.long .Lframe0\n" - "\t.long .Lbegin\n" - "\t.long %d\n" - "\t.byte 0xe\n\t.uleb128 %d\n" - "\t.byte 0x11\n\t.uleb128 65\n\t.sleb128 -1\n" - "\t.byte 0x5\n\t.uleb128 70\n\t.uleb128 55\n", - fcofs, CFRAME_SIZE); - for (i = 14; i <= 31; i++) - fprintf(ctx->fp, - "\t.byte %d\n\t.uleb128 %d\n" - "\t.byte %d\n\t.uleb128 %d\n", - 0x80+i, 37+(31-i), 0x80+32+i, 2+2*(31-i)); - fprintf(ctx->fp, - "\t.align 2\n" - ".LEFDE0:\n\n"); -#if LJ_HASFFI - fprintf(ctx->fp, - ".LSFDE1:\n" - "\t.long .LEFDE1-.LASFDE1\n" - ".LASFDE1:\n" - "\t.long .Lframe0\n" -#if LJ_TARGET_PS3 - "\t.long .lj_vm_ffi_call\n" -#else - "\t.long lj_vm_ffi_call\n" -#endif - "\t.long %d\n" - "\t.byte 0x11\n\t.uleb128 65\n\t.sleb128 -1\n" - "\t.byte 0x8e\n\t.uleb128 2\n" - "\t.byte 0xd\n\t.uleb128 0xe\n" - "\t.align 2\n" - ".LEFDE1:\n\n", (int)ctx->codesz - fcofs); -#endif -#if !LJ_NO_UNWIND - fprintf(ctx->fp, "\t.section .eh_frame,\"a\",@progbits\n"); - fprintf(ctx->fp, - ".Lframe1:\n" - "\t.long .LECIE1-.LSCIE1\n" - ".LSCIE1:\n" - "\t.long 0\n" - "\t.byte 0x1\n" - "\t.string \"zPR\"\n" - "\t.uleb128 0x1\n" - "\t.sleb128 -4\n" - "\t.byte 65\n" - "\t.uleb128 6\n" /* augmentation length */ - "\t.byte 0x1b\n" /* pcrel|sdata4 */ - "\t.long lj_err_unwind_dwarf-.\n" - "\t.byte 0x1b\n" /* pcrel|sdata4 */ - "\t.byte 0xc\n\t.uleb128 1\n\t.uleb128 0\n" - "\t.align 2\n" - ".LECIE1:\n\n"); - fprintf(ctx->fp, - ".LSFDE2:\n" - "\t.long .LEFDE2-.LASFDE2\n" - ".LASFDE2:\n" - "\t.long .LASFDE2-.Lframe1\n" - "\t.long .Lbegin-.\n" - "\t.long %d\n" - "\t.uleb128 0\n" /* augmentation length */ - "\t.byte 0xe\n\t.uleb128 %d\n" - "\t.byte 0x11\n\t.uleb128 65\n\t.sleb128 -1\n" - "\t.byte 0x5\n\t.uleb128 70\n\t.uleb128 55\n", - fcofs, CFRAME_SIZE); - for (i = 14; i <= 31; i++) - fprintf(ctx->fp, - "\t.byte %d\n\t.uleb128 %d\n" - "\t.byte %d\n\t.uleb128 %d\n", - 0x80+i, 37+(31-i), 0x80+32+i, 2+2*(31-i)); - fprintf(ctx->fp, - "\t.align 2\n" - ".LEFDE2:\n\n"); -#if LJ_HASFFI - fprintf(ctx->fp, - ".Lframe2:\n" - "\t.long .LECIE2-.LSCIE2\n" - ".LSCIE2:\n" - "\t.long 0\n" - "\t.byte 0x1\n" - "\t.string \"zR\"\n" - "\t.uleb128 0x1\n" - "\t.sleb128 -4\n" - "\t.byte 65\n" - "\t.uleb128 1\n" /* augmentation length */ - "\t.byte 0x1b\n" /* pcrel|sdata4 */ - "\t.byte 0xc\n\t.uleb128 1\n\t.uleb128 0\n" - "\t.align 2\n" - ".LECIE2:\n\n"); - fprintf(ctx->fp, - ".LSFDE3:\n" - "\t.long .LEFDE3-.LASFDE3\n" - ".LASFDE3:\n" - "\t.long .LASFDE3-.Lframe2\n" - "\t.long lj_vm_ffi_call-.\n" - "\t.long %d\n" - "\t.uleb128 0\n" /* augmentation length */ - "\t.byte 0x11\n\t.uleb128 65\n\t.sleb128 -1\n" - "\t.byte 0x8e\n\t.uleb128 2\n" - "\t.byte 0xd\n\t.uleb128 0xe\n" - "\t.align 2\n" - ".LEFDE3:\n\n", (int)ctx->codesz - fcofs); -#endif -#endif - break; - default: - break; - } -} - diff --git a/deps/luajit/src/vm_ppcspe.dasc b/deps/luajit/src/vm_ppcspe.dasc deleted file mode 100644 index 53ea2d96..00000000 --- a/deps/luajit/src/vm_ppcspe.dasc +++ /dev/null @@ -1,3691 +0,0 @@ -|// Low-level VM code for PowerPC/e500 CPUs. -|// Bytecode interpreter, fast functions and helper functions. -|// Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -| -|.arch ppc -|.section code_op, code_sub -| -|.actionlist build_actionlist -|.globals GLOB_ -|.globalnames globnames -|.externnames extnames -| -|// Note: The ragged indentation of the instructions is intentional. -|// The starting columns indicate data dependencies. -| -|//----------------------------------------------------------------------- -| -|// Fixed register assignments for the interpreter. -|// Don't use: r1 = sp, r2 and r13 = reserved and/or small data area ptr -| -|// The following must be C callee-save (but BASE is often refetched). -|.define BASE, r14 // Base of current Lua stack frame. -|.define KBASE, r15 // Constants of current Lua function. -|.define PC, r16 // Next PC. -|.define DISPATCH, r17 // Opcode dispatch table. -|.define LREG, r18 // Register holding lua_State (also in SAVE_L). -|.define MULTRES, r19 // Size of multi-result: (nresults+1)*8. -| -|// Constants for vectorized type-comparisons (hi+low GPR). C callee-save. -|.define TISNUM, r22 -|.define TISSTR, r23 -|.define TISTAB, r24 -|.define TISFUNC, r25 -|.define TISNIL, r26 -|.define TOBIT, r27 -|.define ZERO, TOBIT // Zero in lo word. -| -|// The following temporaries are not saved across C calls, except for RA. -|.define RA, r20 // Callee-save. -|.define RB, r10 -|.define RC, r11 -|.define RD, r12 -|.define INS, r7 // Overlaps CARG5. -| -|.define TMP0, r0 -|.define TMP1, r8 -|.define TMP2, r9 -|.define TMP3, r6 // Overlaps CARG4. -| -|// Saved temporaries. -|.define SAVE0, r21 -| -|// Calling conventions. -|.define CARG1, r3 -|.define CARG2, r4 -|.define CARG3, r5 -|.define CARG4, r6 // Overlaps TMP3. -|.define CARG5, r7 // Overlaps INS. -| -|.define CRET1, r3 -|.define CRET2, r4 -| -|// Stack layout while in interpreter. Must match with lj_frame.h. -|.define SAVE_LR, 188(sp) -|.define CFRAME_SPACE, 184 // Delta for sp. -|// Back chain for sp: 184(sp) <-- sp entering interpreter -|.define SAVE_r31, 176(sp) // 64 bit register saves. -|.define SAVE_r30, 168(sp) -|.define SAVE_r29, 160(sp) -|.define SAVE_r28, 152(sp) -|.define SAVE_r27, 144(sp) -|.define SAVE_r26, 136(sp) -|.define SAVE_r25, 128(sp) -|.define SAVE_r24, 120(sp) -|.define SAVE_r23, 112(sp) -|.define SAVE_r22, 104(sp) -|.define SAVE_r21, 96(sp) -|.define SAVE_r20, 88(sp) -|.define SAVE_r19, 80(sp) -|.define SAVE_r18, 72(sp) -|.define SAVE_r17, 64(sp) -|.define SAVE_r16, 56(sp) -|.define SAVE_r15, 48(sp) -|.define SAVE_r14, 40(sp) -|.define SAVE_CR, 36(sp) -|.define UNUSED1, 32(sp) -|.define SAVE_ERRF, 28(sp) // 32 bit C frame info. -|.define SAVE_NRES, 24(sp) -|.define SAVE_CFRAME, 20(sp) -|.define SAVE_L, 16(sp) -|.define SAVE_PC, 12(sp) -|.define SAVE_MULTRES, 8(sp) -|// Next frame lr: 4(sp) -|// Back chain for sp: 0(sp) <-- sp while in interpreter -| -|.macro save_, reg; evstdd reg, SAVE_..reg; .endmacro -|.macro rest_, reg; evldd reg, SAVE_..reg; .endmacro -| -|.macro saveregs -| stwu sp, -CFRAME_SPACE(sp) -| save_ r14; save_ r15; save_ r16; save_ r17; save_ r18; save_ r19 -| mflr r0; mfcr r12 -| save_ r20; save_ r21; save_ r22; save_ r23; save_ r24; save_ r25 -| stw r0, SAVE_LR; stw r12, SAVE_CR -| save_ r26; save_ r27; save_ r28; save_ r29; save_ r30; save_ r31 -|.endmacro -| -|.macro restoreregs -| lwz r0, SAVE_LR; lwz r12, SAVE_CR -| rest_ r14; rest_ r15; rest_ r16; rest_ r17; rest_ r18; rest_ r19 -| mtlr r0; mtcrf 0x38, r12 -| rest_ r20; rest_ r21; rest_ r22; rest_ r23; rest_ r24; rest_ r25 -| rest_ r26; rest_ r27; rest_ r28; rest_ r29; rest_ r30; rest_ r31 -| addi sp, sp, CFRAME_SPACE -|.endmacro -| -|// Type definitions. Some of these are only used for documentation. -|.type L, lua_State, LREG -|.type GL, global_State -|.type TVALUE, TValue -|.type GCOBJ, GCobj -|.type STR, GCstr -|.type TAB, GCtab -|.type LFUNC, GCfuncL -|.type CFUNC, GCfuncC -|.type PROTO, GCproto -|.type UPVAL, GCupval -|.type NODE, Node -|.type NARGS8, int -|.type TRACE, GCtrace -| -|//----------------------------------------------------------------------- -| -|// These basic macros should really be part of DynASM. -|.macro srwi, rx, ry, n; rlwinm rx, ry, 32-n, n, 31; .endmacro -|.macro slwi, rx, ry, n; rlwinm rx, ry, n, 0, 31-n; .endmacro -|.macro rotlwi, rx, ry, n; rlwinm rx, ry, n, 0, 31; .endmacro -|.macro rotlw, rx, ry, rn; rlwnm rx, ry, rn, 0, 31; .endmacro -|.macro subi, rx, ry, i; addi rx, ry, -i; .endmacro -| -|// Trap for not-yet-implemented parts. -|.macro NYI; tw 4, sp, sp; .endmacro -| -|//----------------------------------------------------------------------- -| -|// Access to frame relative to BASE. -|.define FRAME_PC, -8 -|.define FRAME_FUNC, -4 -| -|// Instruction decode. -|.macro decode_OP4, dst, ins; rlwinm dst, ins, 2, 22, 29; .endmacro -|.macro decode_RA8, dst, ins; rlwinm dst, ins, 27, 21, 28; .endmacro -|.macro decode_RB8, dst, ins; rlwinm dst, ins, 11, 21, 28; .endmacro -|.macro decode_RC8, dst, ins; rlwinm dst, ins, 19, 21, 28; .endmacro -|.macro decode_RD8, dst, ins; rlwinm dst, ins, 19, 13, 28; .endmacro -| -|.macro decode_OP1, dst, ins; rlwinm dst, ins, 0, 24, 31; .endmacro -|.macro decode_RD4, dst, ins; rlwinm dst, ins, 18, 14, 29; .endmacro -| -|// Instruction fetch. -|.macro ins_NEXT1 -| lwz INS, 0(PC) -| addi PC, PC, 4 -|.endmacro -|// Instruction decode+dispatch. -|.macro ins_NEXT2 -| decode_OP4 TMP1, INS -| decode_RB8 RB, INS -| decode_RD8 RD, INS -| lwzx TMP0, DISPATCH, TMP1 -| decode_RA8 RA, INS -| decode_RC8 RC, INS -| mtctr TMP0 -| bctr -|.endmacro -|.macro ins_NEXT -| ins_NEXT1 -| ins_NEXT2 -|.endmacro -| -|// Instruction footer. -|.if 1 -| // Replicated dispatch. Less unpredictable branches, but higher I-Cache use. -| .define ins_next, ins_NEXT -| .define ins_next_, ins_NEXT -| .define ins_next1, ins_NEXT1 -| .define ins_next2, ins_NEXT2 -|.else -| // Common dispatch. Lower I-Cache use, only one (very) unpredictable branch. -| // Affects only certain kinds of benchmarks (and only with -j off). -| .macro ins_next -| b ->ins_next -| .endmacro -| .macro ins_next1 -| .endmacro -| .macro ins_next2 -| b ->ins_next -| .endmacro -| .macro ins_next_ -| ->ins_next: -| ins_NEXT -| .endmacro -|.endif -| -|// Call decode and dispatch. -|.macro ins_callt -| // BASE = new base, RB = LFUNC/CFUNC, RC = nargs*8, FRAME_PC(BASE) = PC -| lwz PC, LFUNC:RB->pc -| lwz INS, 0(PC) -| addi PC, PC, 4 -| decode_OP4 TMP1, INS -| decode_RA8 RA, INS -| lwzx TMP0, DISPATCH, TMP1 -| add RA, RA, BASE -| mtctr TMP0 -| bctr -|.endmacro -| -|.macro ins_call -| // BASE = new base, RB = LFUNC/CFUNC, RC = nargs*8, PC = caller PC -| stw PC, FRAME_PC(BASE) -| ins_callt -|.endmacro -| -|//----------------------------------------------------------------------- -| -|// Macros to test operand types. -|.macro checknum, reg; evcmpltu reg, TISNUM; .endmacro -|.macro checkstr, reg; evcmpeq reg, TISSTR; .endmacro -|.macro checktab, reg; evcmpeq reg, TISTAB; .endmacro -|.macro checkfunc, reg; evcmpeq reg, TISFUNC; .endmacro -|.macro checknil, reg; evcmpeq reg, TISNIL; .endmacro -|.macro checkok, label; blt label; .endmacro -|.macro checkfail, label; bge label; .endmacro -|.macro checkanyfail, label; bns label; .endmacro -|.macro checkallok, label; bso label; .endmacro -| -|.macro branch_RD -| srwi TMP0, RD, 1 -| add PC, PC, TMP0 -| addis PC, PC, -(BCBIAS_J*4 >> 16) -|.endmacro -| -|// Assumes DISPATCH is relative to GL. -#define DISPATCH_GL(field) (GG_DISP2G + (int)offsetof(global_State, field)) -#define DISPATCH_J(field) (GG_DISP2J + (int)offsetof(jit_State, field)) -| -#define PC2PROTO(field) ((int)offsetof(GCproto, field)-(int)sizeof(GCproto)) -| -|.macro hotloop -| NYI -|.endmacro -| -|.macro hotcall -| NYI -|.endmacro -| -|// Set current VM state. Uses TMP0. -|.macro li_vmstate, st; li TMP0, ~LJ_VMST_..st; .endmacro -|.macro st_vmstate; stw TMP0, DISPATCH_GL(vmstate)(DISPATCH); .endmacro -| -|// Move table write barrier back. Overwrites mark and tmp. -|.macro barrierback, tab, mark, tmp -| lwz tmp, DISPATCH_GL(gc.grayagain)(DISPATCH) -| // Assumes LJ_GC_BLACK is 0x04. -| rlwinm mark, mark, 0, 30, 28 // black2gray(tab) -| stw tab, DISPATCH_GL(gc.grayagain)(DISPATCH) -| stb mark, tab->marked -| stw tmp, tab->gclist -|.endmacro -| -|//----------------------------------------------------------------------- - -/* Generate subroutines used by opcodes and other parts of the VM. */ -/* The .code_sub section should be last to help static branch prediction. */ -static void build_subroutines(BuildCtx *ctx) -{ - |.code_sub - | - |//----------------------------------------------------------------------- - |//-- Return handling ---------------------------------------------------- - |//----------------------------------------------------------------------- - | - |->vm_returnp: - | // See vm_return. Also: TMP2 = previous base. - | andi. TMP0, PC, FRAME_P - | evsplati TMP1, LJ_TTRUE - | beq ->cont_dispatch - | - | // Return from pcall or xpcall fast func. - | lwz PC, FRAME_PC(TMP2) // Fetch PC of previous frame. - | mr BASE, TMP2 // Restore caller base. - | // Prepending may overwrite the pcall frame, so do it at the end. - | stwu TMP1, FRAME_PC(RA) // Prepend true to results. - | - |->vm_returnc: - | addi RD, RD, 8 // RD = (nresults+1)*8. - | andi. TMP0, PC, FRAME_TYPE - | cmpwi cr1, RD, 0 - | li CRET1, LUA_YIELD - | beq cr1, ->vm_unwind_c_eh - | mr MULTRES, RD - | beq ->BC_RET_Z // Handle regular return to Lua. - | - |->vm_return: - | // BASE = base, RA = resultptr, RD/MULTRES = (nresults+1)*8, PC = return - | // TMP0 = PC & FRAME_TYPE - | cmpwi TMP0, FRAME_C - | rlwinm TMP2, PC, 0, 0, 28 - | li_vmstate C - | sub TMP2, BASE, TMP2 // TMP2 = previous base. - | bne ->vm_returnp - | - | addic. TMP1, RD, -8 - | stw TMP2, L->base - | lwz TMP2, SAVE_NRES - | subi BASE, BASE, 8 - | st_vmstate - | slwi TMP2, TMP2, 3 - | beq >2 - |1: - | addic. TMP1, TMP1, -8 - | evldd TMP0, 0(RA) - | addi RA, RA, 8 - | evstdd TMP0, 0(BASE) - | addi BASE, BASE, 8 - | bne <1 - | - |2: - | cmpw TMP2, RD // More/less results wanted? - | bne >6 - |3: - | stw BASE, L->top // Store new top. - | - |->vm_leave_cp: - | lwz TMP0, SAVE_CFRAME // Restore previous C frame. - | li CRET1, 0 // Ok return status for vm_pcall. - | stw TMP0, L->cframe - | - |->vm_leave_unw: - | restoreregs - | blr - | - |6: - | ble >7 // Less results wanted? - | // More results wanted. Check stack size and fill up results with nil. - | lwz TMP1, L->maxstack - | cmplw BASE, TMP1 - | bge >8 - | evstdd TISNIL, 0(BASE) - | addi RD, RD, 8 - | addi BASE, BASE, 8 - | b <2 - | - |7: // Less results wanted. - | sub TMP0, RD, TMP2 - | cmpwi TMP2, 0 // LUA_MULTRET+1 case? - | sub TMP0, BASE, TMP0 // Subtract the difference. - | iseleq BASE, BASE, TMP0 // Either keep top or shrink it. - | b <3 - | - |8: // Corner case: need to grow stack for filling up results. - | // This can happen if: - | // - A C function grows the stack (a lot). - | // - The GC shrinks the stack in between. - | // - A return back from a lua_call() with (high) nresults adjustment. - | stw BASE, L->top // Save current top held in BASE (yes). - | mr SAVE0, RD - | mr CARG2, TMP2 - | mr CARG1, L - | bl extern lj_state_growstack // (lua_State *L, int n) - | lwz TMP2, SAVE_NRES - | mr RD, SAVE0 - | slwi TMP2, TMP2, 3 - | lwz BASE, L->top // Need the (realloced) L->top in BASE. - | b <2 - | - |->vm_unwind_c: // Unwind C stack, return from vm_pcall. - | // (void *cframe, int errcode) - | mr sp, CARG1 - | mr CRET1, CARG2 - |->vm_unwind_c_eh: // Landing pad for external unwinder. - | lwz L, SAVE_L - | li TMP0, ~LJ_VMST_C - | lwz GL:TMP1, L->glref - | stw TMP0, GL:TMP1->vmstate - | b ->vm_leave_unw - | - |->vm_unwind_ff: // Unwind C stack, return from ff pcall. - | // (void *cframe) - | rlwinm sp, CARG1, 0, 0, 29 - |->vm_unwind_ff_eh: // Landing pad for external unwinder. - | lwz L, SAVE_L - | evsplati TISNUM, LJ_TISNUM+1 // Setup type comparison constants. - | evsplati TISFUNC, LJ_TFUNC - | lus TOBIT, 0x4338 - | evsplati TISTAB, LJ_TTAB - | li TMP0, 0 - | lwz BASE, L->base - | evmergelo TOBIT, TOBIT, TMP0 - | lwz DISPATCH, L->glref // Setup pointer to dispatch table. - | evsplati TISSTR, LJ_TSTR - | li TMP1, LJ_TFALSE - | evsplati TISNIL, LJ_TNIL - | li_vmstate INTERP - | lwz PC, FRAME_PC(BASE) // Fetch PC of previous frame. - | la RA, -8(BASE) // Results start at BASE-8. - | addi DISPATCH, DISPATCH, GG_G2DISP - | stw TMP1, 0(RA) // Prepend false to error message. - | li RD, 16 // 2 results: false + error message. - | st_vmstate - | b ->vm_returnc - | - |//----------------------------------------------------------------------- - |//-- Grow stack for calls ----------------------------------------------- - |//----------------------------------------------------------------------- - | - |->vm_growstack_c: // Grow stack for C function. - | li CARG2, LUA_MINSTACK - | b >2 - | - |->vm_growstack_l: // Grow stack for Lua function. - | // BASE = new base, RA = BASE+framesize*8, RC = nargs*8, PC = first PC - | add RC, BASE, RC - | sub RA, RA, BASE - | stw BASE, L->base - | addi PC, PC, 4 // Must point after first instruction. - | stw RC, L->top - | srwi CARG2, RA, 3 - |2: - | // L->base = new base, L->top = top - | stw PC, SAVE_PC - | mr CARG1, L - | bl extern lj_state_growstack // (lua_State *L, int n) - | lwz BASE, L->base - | lwz RC, L->top - | lwz LFUNC:RB, FRAME_FUNC(BASE) - | sub RC, RC, BASE - | // BASE = new base, RB = LFUNC/CFUNC, RC = nargs*8, FRAME_PC(BASE) = PC - | ins_callt // Just retry the call. - | - |//----------------------------------------------------------------------- - |//-- Entry points into the assembler VM --------------------------------- - |//----------------------------------------------------------------------- - | - |->vm_resume: // Setup C frame and resume thread. - | // (lua_State *L, TValue *base, int nres1 = 0, ptrdiff_t ef = 0) - | saveregs - | mr L, CARG1 - | lwz DISPATCH, L->glref // Setup pointer to dispatch table. - | mr BASE, CARG2 - | lbz TMP1, L->status - | stw L, SAVE_L - | li PC, FRAME_CP - | addi TMP0, sp, CFRAME_RESUME - | addi DISPATCH, DISPATCH, GG_G2DISP - | stw CARG3, SAVE_NRES - | cmplwi TMP1, 0 - | stw CARG3, SAVE_ERRF - | stw TMP0, L->cframe - | stw CARG3, SAVE_CFRAME - | stw CARG1, SAVE_PC // Any value outside of bytecode is ok. - | beq >3 - | - | // Resume after yield (like a return). - | mr RA, BASE - | lwz BASE, L->base - | evsplati TISNUM, LJ_TISNUM+1 // Setup type comparison constants. - | lwz TMP1, L->top - | evsplati TISFUNC, LJ_TFUNC - | lus TOBIT, 0x4338 - | evsplati TISTAB, LJ_TTAB - | lwz PC, FRAME_PC(BASE) - | li TMP2, 0 - | evsplati TISSTR, LJ_TSTR - | sub RD, TMP1, BASE - | evmergelo TOBIT, TOBIT, TMP2 - | stb CARG3, L->status - | andi. TMP0, PC, FRAME_TYPE - | li_vmstate INTERP - | addi RD, RD, 8 - | evsplati TISNIL, LJ_TNIL - | mr MULTRES, RD - | st_vmstate - | beq ->BC_RET_Z - | b ->vm_return - | - |->vm_pcall: // Setup protected C frame and enter VM. - | // (lua_State *L, TValue *base, int nres1, ptrdiff_t ef) - | saveregs - | li PC, FRAME_CP - | stw CARG4, SAVE_ERRF - | b >1 - | - |->vm_call: // Setup C frame and enter VM. - | // (lua_State *L, TValue *base, int nres1) - | saveregs - | li PC, FRAME_C - | - |1: // Entry point for vm_pcall above (PC = ftype). - | lwz TMP1, L:CARG1->cframe - | stw CARG3, SAVE_NRES - | mr L, CARG1 - | stw CARG1, SAVE_L - | mr BASE, CARG2 - | stw sp, L->cframe // Add our C frame to cframe chain. - | lwz DISPATCH, L->glref // Setup pointer to dispatch table. - | stw CARG1, SAVE_PC // Any value outside of bytecode is ok. - | stw TMP1, SAVE_CFRAME - | addi DISPATCH, DISPATCH, GG_G2DISP - | - |3: // Entry point for vm_cpcall/vm_resume (BASE = base, PC = ftype). - | lwz TMP2, L->base // TMP2 = old base (used in vmeta_call). - | evsplati TISNUM, LJ_TISNUM+1 // Setup type comparison constants. - | lwz TMP1, L->top - | evsplati TISFUNC, LJ_TFUNC - | add PC, PC, BASE - | evsplati TISTAB, LJ_TTAB - | lus TOBIT, 0x4338 - | li TMP0, 0 - | sub PC, PC, TMP2 // PC = frame delta + frame type - | evsplati TISSTR, LJ_TSTR - | sub NARGS8:RC, TMP1, BASE - | evmergelo TOBIT, TOBIT, TMP0 - | li_vmstate INTERP - | evsplati TISNIL, LJ_TNIL - | st_vmstate - | - |->vm_call_dispatch: - | // TMP2 = old base, BASE = new base, RC = nargs*8, PC = caller PC - | li TMP0, -8 - | evlddx LFUNC:RB, BASE, TMP0 - | checkfunc LFUNC:RB - | checkfail ->vmeta_call - | - |->vm_call_dispatch_f: - | ins_call - | // BASE = new base, RB = func, RC = nargs*8, PC = caller PC - | - |->vm_cpcall: // Setup protected C frame, call C. - | // (lua_State *L, lua_CFunction func, void *ud, lua_CPFunction cp) - | saveregs - | mr L, CARG1 - | lwz TMP0, L:CARG1->stack - | stw CARG1, SAVE_L - | lwz TMP1, L->top - | stw CARG1, SAVE_PC // Any value outside of bytecode is ok. - | sub TMP0, TMP0, TMP1 // Compute -savestack(L, L->top). - | lwz TMP1, L->cframe - | stw sp, L->cframe // Add our C frame to cframe chain. - | li TMP2, 0 - | stw TMP0, SAVE_NRES // Neg. delta means cframe w/o frame. - | stw TMP2, SAVE_ERRF // No error function. - | stw TMP1, SAVE_CFRAME - | mtctr CARG4 - | bctrl // (lua_State *L, lua_CFunction func, void *ud) - | mr. BASE, CRET1 - | lwz DISPATCH, L->glref // Setup pointer to dispatch table. - | li PC, FRAME_CP - | addi DISPATCH, DISPATCH, GG_G2DISP - | bne <3 // Else continue with the call. - | b ->vm_leave_cp // No base? Just remove C frame. - | - |//----------------------------------------------------------------------- - |//-- Metamethod handling ------------------------------------------------ - |//----------------------------------------------------------------------- - | - |// The lj_meta_* functions (except for lj_meta_cat) don't reallocate the - |// stack, so BASE doesn't need to be reloaded across these calls. - | - |//-- Continuation dispatch ---------------------------------------------- - | - |->cont_dispatch: - | // BASE = meta base, RA = resultptr, RD = (nresults+1)*8 - | lwz TMP0, -12(BASE) // Continuation. - | mr RB, BASE - | mr BASE, TMP2 // Restore caller BASE. - | lwz LFUNC:TMP1, FRAME_FUNC(TMP2) - | cmplwi TMP0, 0 - | lwz PC, -16(RB) // Restore PC from [cont|PC]. - | beq >1 - | subi TMP2, RD, 8 - | lwz TMP1, LFUNC:TMP1->pc - | evstddx TISNIL, RA, TMP2 // Ensure one valid arg. - | lwz KBASE, PC2PROTO(k)(TMP1) - | // BASE = base, RA = resultptr, RB = meta base - | mtctr TMP0 - | bctr // Jump to continuation. - | - |1: // Tail call from C function. - | subi TMP1, RB, 16 - | sub RC, TMP1, BASE - | b ->vm_call_tail - | - |->cont_cat: // RA = resultptr, RB = meta base - | lwz INS, -4(PC) - | subi CARG2, RB, 16 - | decode_RB8 SAVE0, INS - | evldd TMP0, 0(RA) - | add TMP1, BASE, SAVE0 - | stw BASE, L->base - | cmplw TMP1, CARG2 - | sub CARG3, CARG2, TMP1 - | decode_RA8 RA, INS - | evstdd TMP0, 0(CARG2) - | bne ->BC_CAT_Z - | evstddx TMP0, BASE, RA - | b ->cont_nop - | - |//-- Table indexing metamethods ----------------------------------------- - | - |->vmeta_tgets1: - | evmergelo STR:RC, TISSTR, STR:RC - | la CARG3, DISPATCH_GL(tmptv)(DISPATCH) - | decode_RB8 RB, INS - | evstdd STR:RC, 0(CARG3) - | add CARG2, BASE, RB - | b >1 - | - |->vmeta_tgets: - | evmergelo TAB:RB, TISTAB, TAB:RB - | la CARG2, DISPATCH_GL(tmptv)(DISPATCH) - | evmergelo STR:RC, TISSTR, STR:RC - | evstdd TAB:RB, 0(CARG2) - | la CARG3, DISPATCH_GL(tmptv2)(DISPATCH) - | evstdd STR:RC, 0(CARG3) - | b >1 - | - |->vmeta_tgetb: // TMP0 = index - | efdcfsi TMP0, TMP0 - | decode_RB8 RB, INS - | la CARG3, DISPATCH_GL(tmptv)(DISPATCH) - | add CARG2, BASE, RB - | evstdd TMP0, 0(CARG3) - | b >1 - | - |->vmeta_tgetv: - | decode_RB8 RB, INS - | decode_RC8 RC, INS - | add CARG2, BASE, RB - | add CARG3, BASE, RC - |1: - | stw BASE, L->base - | mr CARG1, L - | stw PC, SAVE_PC - | bl extern lj_meta_tget // (lua_State *L, TValue *o, TValue *k) - | // Returns TValue * (finished) or NULL (metamethod). - | cmplwi CRET1, 0 - | beq >3 - | evldd TMP0, 0(CRET1) - | evstddx TMP0, BASE, RA - | ins_next - | - |3: // Call __index metamethod. - | // BASE = base, L->top = new base, stack = cont/func/t/k - | subfic TMP1, BASE, FRAME_CONT - | lwz BASE, L->top - | stw PC, -16(BASE) // [cont|PC] - | add PC, TMP1, BASE - | lwz LFUNC:RB, FRAME_FUNC(BASE) // Guaranteed to be a function here. - | li NARGS8:RC, 16 // 2 args for func(t, k). - | b ->vm_call_dispatch_f - | - |//----------------------------------------------------------------------- - | - |->vmeta_tsets1: - | evmergelo STR:RC, TISSTR, STR:RC - | la CARG3, DISPATCH_GL(tmptv)(DISPATCH) - | decode_RB8 RB, INS - | evstdd STR:RC, 0(CARG3) - | add CARG2, BASE, RB - | b >1 - | - |->vmeta_tsets: - | evmergelo TAB:RB, TISTAB, TAB:RB - | la CARG2, DISPATCH_GL(tmptv)(DISPATCH) - | evmergelo STR:RC, TISSTR, STR:RC - | evstdd TAB:RB, 0(CARG2) - | la CARG3, DISPATCH_GL(tmptv2)(DISPATCH) - | evstdd STR:RC, 0(CARG3) - | b >1 - | - |->vmeta_tsetb: // TMP0 = index - | efdcfsi TMP0, TMP0 - | decode_RB8 RB, INS - | la CARG3, DISPATCH_GL(tmptv)(DISPATCH) - | add CARG2, BASE, RB - | evstdd TMP0, 0(CARG3) - | b >1 - | - |->vmeta_tsetv: - | decode_RB8 RB, INS - | decode_RC8 RC, INS - | add CARG2, BASE, RB - | add CARG3, BASE, RC - |1: - | stw BASE, L->base - | mr CARG1, L - | stw PC, SAVE_PC - | bl extern lj_meta_tset // (lua_State *L, TValue *o, TValue *k) - | // Returns TValue * (finished) or NULL (metamethod). - | cmplwi CRET1, 0 - | evlddx TMP0, BASE, RA - | beq >3 - | // NOBARRIER: lj_meta_tset ensures the table is not black. - | evstdd TMP0, 0(CRET1) - | ins_next - | - |3: // Call __newindex metamethod. - | // BASE = base, L->top = new base, stack = cont/func/t/k/(v) - | subfic TMP1, BASE, FRAME_CONT - | lwz BASE, L->top - | stw PC, -16(BASE) // [cont|PC] - | add PC, TMP1, BASE - | lwz LFUNC:RB, FRAME_FUNC(BASE) // Guaranteed to be a function here. - | li NARGS8:RC, 24 // 3 args for func(t, k, v) - | evstdd TMP0, 16(BASE) // Copy value to third argument. - | b ->vm_call_dispatch_f - | - |//-- Comparison metamethods --------------------------------------------- - | - |->vmeta_comp: - | mr CARG1, L - | subi PC, PC, 4 - | add CARG2, BASE, RA - | stw PC, SAVE_PC - | add CARG3, BASE, RD - | stw BASE, L->base - | decode_OP1 CARG4, INS - | bl extern lj_meta_comp // (lua_State *L, TValue *o1, *o2, int op) - | // Returns 0/1 or TValue * (metamethod). - |3: - | cmplwi CRET1, 1 - | bgt ->vmeta_binop - |4: - | lwz INS, 0(PC) - | addi PC, PC, 4 - | decode_RD4 TMP2, INS - | addis TMP3, PC, -(BCBIAS_J*4 >> 16) - | add TMP2, TMP2, TMP3 - | isellt PC, PC, TMP2 - |->cont_nop: - | ins_next - | - |->cont_ra: // RA = resultptr - | lwz INS, -4(PC) - | evldd TMP0, 0(RA) - | decode_RA8 TMP1, INS - | evstddx TMP0, BASE, TMP1 - | b ->cont_nop - | - |->cont_condt: // RA = resultptr - | lwz TMP0, 0(RA) - | li TMP1, LJ_TTRUE - | cmplw TMP1, TMP0 // Branch if result is true. - | b <4 - | - |->cont_condf: // RA = resultptr - | lwz TMP0, 0(RA) - | li TMP1, LJ_TFALSE - | cmplw TMP0, TMP1 // Branch if result is false. - | b <4 - | - |->vmeta_equal: - | // CARG2, CARG3, CARG4 are already set by BC_ISEQV/BC_ISNEV. - | subi PC, PC, 4 - | stw BASE, L->base - | mr CARG1, L - | stw PC, SAVE_PC - | bl extern lj_meta_equal // (lua_State *L, GCobj *o1, *o2, int ne) - | // Returns 0/1 or TValue * (metamethod). - | b <3 - | - |//-- Arithmetic metamethods --------------------------------------------- - | - |->vmeta_arith_vn: - | add CARG3, BASE, RB - | add CARG4, KBASE, RC - | b >1 - | - |->vmeta_arith_nv: - | add CARG3, KBASE, RC - | add CARG4, BASE, RB - | b >1 - | - |->vmeta_unm: - | add CARG3, BASE, RD - | mr CARG4, CARG3 - | b >1 - | - |->vmeta_arith_vv: - | add CARG3, BASE, RB - | add CARG4, BASE, RC - |1: - | add CARG2, BASE, RA - | stw BASE, L->base - | mr CARG1, L - | stw PC, SAVE_PC - | decode_OP1 CARG5, INS // Caveat: CARG5 overlaps INS. - | bl extern lj_meta_arith // (lua_State *L, TValue *ra,*rb,*rc, BCReg op) - | // Returns NULL (finished) or TValue * (metamethod). - | cmplwi CRET1, 0 - | beq ->cont_nop - | - | // Call metamethod for binary op. - |->vmeta_binop: - | // BASE = old base, CRET1 = new base, stack = cont/func/o1/o2 - | sub TMP1, CRET1, BASE - | stw PC, -16(CRET1) // [cont|PC] - | mr TMP2, BASE - | addi PC, TMP1, FRAME_CONT - | mr BASE, CRET1 - | li NARGS8:RC, 16 // 2 args for func(o1, o2). - | b ->vm_call_dispatch - | - |->vmeta_len: -#if LJ_52 - | mr SAVE0, CARG1 -#endif - | add CARG2, BASE, RD - | stw BASE, L->base - | mr CARG1, L - | stw PC, SAVE_PC - | bl extern lj_meta_len // (lua_State *L, TValue *o) - | // Returns NULL (retry) or TValue * (metamethod base). -#if LJ_52 - | cmplwi CRET1, 0 - | bne ->vmeta_binop // Binop call for compatibility. - | mr CARG1, SAVE0 - | b ->BC_LEN_Z -#else - | b ->vmeta_binop // Binop call for compatibility. -#endif - | - |//-- Call metamethod ---------------------------------------------------- - | - |->vmeta_call: // Resolve and call __call metamethod. - | // TMP2 = old base, BASE = new base, RC = nargs*8 - | mr CARG1, L - | stw TMP2, L->base // This is the callers base! - | subi CARG2, BASE, 8 - | stw PC, SAVE_PC - | add CARG3, BASE, RC - | mr SAVE0, NARGS8:RC - | bl extern lj_meta_call // (lua_State *L, TValue *func, TValue *top) - | lwz LFUNC:RB, FRAME_FUNC(BASE) // Guaranteed to be a function here. - | addi NARGS8:RC, SAVE0, 8 // Got one more argument now. - | ins_call - | - |->vmeta_callt: // Resolve __call for BC_CALLT. - | // BASE = old base, RA = new base, RC = nargs*8 - | mr CARG1, L - | stw BASE, L->base - | subi CARG2, RA, 8 - | stw PC, SAVE_PC - | add CARG3, RA, RC - | mr SAVE0, NARGS8:RC - | bl extern lj_meta_call // (lua_State *L, TValue *func, TValue *top) - | lwz TMP1, FRAME_PC(BASE) - | addi NARGS8:RC, SAVE0, 8 // Got one more argument now. - | lwz LFUNC:RB, FRAME_FUNC(RA) // Guaranteed to be a function here. - | b ->BC_CALLT_Z - | - |//-- Argument coercion for 'for' statement ------------------------------ - | - |->vmeta_for: - | mr CARG1, L - | stw BASE, L->base - | mr CARG2, RA - | stw PC, SAVE_PC - | mr SAVE0, INS - | bl extern lj_meta_for // (lua_State *L, TValue *base) - |.if JIT - | decode_OP1 TMP0, SAVE0 - |.endif - | decode_RA8 RA, SAVE0 - |.if JIT - | cmpwi TMP0, BC_JFORI - |.endif - | decode_RD8 RD, SAVE0 - |.if JIT - | beq =>BC_JFORI - |.endif - | b =>BC_FORI - | - |//----------------------------------------------------------------------- - |//-- Fast functions ----------------------------------------------------- - |//----------------------------------------------------------------------- - | - |.macro .ffunc, name - |->ff_ .. name: - |.endmacro - | - |.macro .ffunc_1, name - |->ff_ .. name: - | cmplwi NARGS8:RC, 8 - | evldd CARG1, 0(BASE) - | blt ->fff_fallback - |.endmacro - | - |.macro .ffunc_2, name - |->ff_ .. name: - | cmplwi NARGS8:RC, 16 - | evldd CARG1, 0(BASE) - | evldd CARG2, 8(BASE) - | blt ->fff_fallback - |.endmacro - | - |.macro .ffunc_n, name - | .ffunc_1 name - | checknum CARG1 - | checkfail ->fff_fallback - |.endmacro - | - |.macro .ffunc_nn, name - | .ffunc_2 name - | evmergehi TMP0, CARG1, CARG2 - | checknum TMP0 - | checkanyfail ->fff_fallback - |.endmacro - | - |// Inlined GC threshold check. Caveat: uses TMP0 and TMP1. - |.macro ffgccheck - | lwz TMP0, DISPATCH_GL(gc.total)(DISPATCH) - | lwz TMP1, DISPATCH_GL(gc.threshold)(DISPATCH) - | cmplw TMP0, TMP1 - | bgel ->fff_gcstep - |.endmacro - | - |//-- Base library: checks ----------------------------------------------- - | - |.ffunc assert - | cmplwi NARGS8:RC, 8 - | evldd TMP0, 0(BASE) - | blt ->fff_fallback - | evaddw TMP1, TISNIL, TISNIL // Synthesize LJ_TFALSE. - | la RA, -8(BASE) - | evcmpltu cr1, TMP0, TMP1 - | lwz PC, FRAME_PC(BASE) - | bge cr1, ->fff_fallback - | evstdd TMP0, 0(RA) - | addi RD, NARGS8:RC, 8 // Compute (nresults+1)*8. - | beq ->fff_res // Done if exactly 1 argument. - | li TMP1, 8 - | subi RC, RC, 8 - |1: - | cmplw TMP1, RC - | evlddx TMP0, BASE, TMP1 - | evstddx TMP0, RA, TMP1 - | addi TMP1, TMP1, 8 - | bne <1 - | b ->fff_res - | - |.ffunc type - | cmplwi NARGS8:RC, 8 - | lwz CARG1, 0(BASE) - | blt ->fff_fallback - | li TMP2, ~LJ_TNUMX - | cmplw CARG1, TISNUM - | not TMP1, CARG1 - | isellt TMP1, TMP2, TMP1 - | slwi TMP1, TMP1, 3 - | la TMP2, CFUNC:RB->upvalue - | evlddx STR:CRET1, TMP2, TMP1 - | b ->fff_restv - | - |//-- Base library: getters and setters --------------------------------- - | - |.ffunc_1 getmetatable - | checktab CARG1 - | evmergehi TMP1, CARG1, CARG1 - | checkfail >6 - |1: // Field metatable must be at same offset for GCtab and GCudata! - | lwz TAB:RB, TAB:CARG1->metatable - |2: - | evmr CRET1, TISNIL - | cmplwi TAB:RB, 0 - | lwz STR:RC, DISPATCH_GL(gcroot[GCROOT_MMNAME+MM_metatable])(DISPATCH) - | beq ->fff_restv - | lwz TMP0, TAB:RB->hmask - | evmergelo CRET1, TISTAB, TAB:RB // Use metatable as default result. - | lwz TMP1, STR:RC->hash - | lwz NODE:TMP2, TAB:RB->node - | evmergelo STR:RC, TISSTR, STR:RC - | and TMP1, TMP1, TMP0 // idx = str->hash & tab->hmask - | slwi TMP0, TMP1, 5 - | slwi TMP1, TMP1, 3 - | sub TMP1, TMP0, TMP1 - | add NODE:TMP2, NODE:TMP2, TMP1 // node = tab->node + (idx*32-idx*8) - |3: // Rearranged logic, because we expect _not_ to find the key. - | evldd TMP0, NODE:TMP2->key - | evldd TMP1, NODE:TMP2->val - | evcmpeq TMP0, STR:RC - | lwz NODE:TMP2, NODE:TMP2->next - | checkallok >5 - | cmplwi NODE:TMP2, 0 - | beq ->fff_restv // Not found, keep default result. - | b <3 - |5: - | checknil TMP1 - | checkok ->fff_restv // Ditto for nil value. - | evmr CRET1, TMP1 // Return value of mt.__metatable. - | b ->fff_restv - | - |6: - | cmpwi TMP1, LJ_TUDATA - | not TMP1, TMP1 - | beq <1 - | checknum CARG1 - | slwi TMP1, TMP1, 2 - | li TMP2, 4*~LJ_TNUMX - | isellt TMP1, TMP2, TMP1 - | la TMP2, DISPATCH_GL(gcroot[GCROOT_BASEMT])(DISPATCH) - | lwzx TAB:RB, TMP2, TMP1 - | b <2 - | - |.ffunc_2 setmetatable - | // Fast path: no mt for table yet and not clearing the mt. - | evmergehi TMP0, TAB:CARG1, TAB:CARG2 - | checktab TMP0 - | checkanyfail ->fff_fallback - | lwz TAB:TMP1, TAB:CARG1->metatable - | cmplwi TAB:TMP1, 0 - | lbz TMP3, TAB:CARG1->marked - | bne ->fff_fallback - | andi. TMP0, TMP3, LJ_GC_BLACK // isblack(table) - | stw TAB:CARG2, TAB:CARG1->metatable - | beq ->fff_restv - | barrierback TAB:CARG1, TMP3, TMP0 - | b ->fff_restv - | - |.ffunc rawget - | cmplwi NARGS8:RC, 16 - | evldd CARG2, 0(BASE) - | blt ->fff_fallback - | checktab CARG2 - | la CARG3, 8(BASE) - | checkfail ->fff_fallback - | mr CARG1, L - | bl extern lj_tab_get // (lua_State *L, GCtab *t, cTValue *key) - | // Returns cTValue *. - | evldd CRET1, 0(CRET1) - | b ->fff_restv - | - |//-- Base library: conversions ------------------------------------------ - | - |.ffunc tonumber - | // Only handles the number case inline (without a base argument). - | cmplwi NARGS8:RC, 8 - | evldd CARG1, 0(BASE) - | bne ->fff_fallback // Exactly one argument. - | checknum CARG1 - | checkok ->fff_restv - | b ->fff_fallback - | - |.ffunc_1 tostring - | // Only handles the string or number case inline. - | checkstr CARG1 - | // A __tostring method in the string base metatable is ignored. - | checkok ->fff_restv // String key? - | // Handle numbers inline, unless a number base metatable is present. - | lwz TMP0, DISPATCH_GL(gcroot[GCROOT_BASEMT_NUM])(DISPATCH) - | checknum CARG1 - | cmplwi cr1, TMP0, 0 - | stw BASE, L->base // Add frame since C call can throw. - | crand 4*cr0+eq, 4*cr0+lt, 4*cr1+eq - | stw PC, SAVE_PC // Redundant (but a defined value). - | bne ->fff_fallback - | ffgccheck - | mr CARG1, L - | mr CARG2, BASE - | bl extern lj_str_fromnum // (lua_State *L, lua_Number *np) - | // Returns GCstr *. - | evmergelo STR:CRET1, TISSTR, STR:CRET1 - | b ->fff_restv - | - |//-- Base library: iterators ------------------------------------------- - | - |.ffunc next - | cmplwi NARGS8:RC, 8 - | evldd CARG2, 0(BASE) - | blt ->fff_fallback - | evstddx TISNIL, BASE, NARGS8:RC // Set missing 2nd arg to nil. - | checktab TAB:CARG2 - | lwz PC, FRAME_PC(BASE) - | checkfail ->fff_fallback - | stw BASE, L->base // Add frame since C call can throw. - | mr CARG1, L - | stw BASE, L->top // Dummy frame length is ok. - | la CARG3, 8(BASE) - | stw PC, SAVE_PC - | bl extern lj_tab_next // (lua_State *L, GCtab *t, TValue *key) - | // Returns 0 at end of traversal. - | cmplwi CRET1, 0 - | evmr CRET1, TISNIL - | beq ->fff_restv // End of traversal: return nil. - | evldd TMP0, 8(BASE) // Copy key and value to results. - | la RA, -8(BASE) - | evldd TMP1, 16(BASE) - | evstdd TMP0, 0(RA) - | li RD, (2+1)*8 - | evstdd TMP1, 8(RA) - | b ->fff_res - | - |.ffunc_1 pairs - | checktab TAB:CARG1 - | lwz PC, FRAME_PC(BASE) - | checkfail ->fff_fallback -#if LJ_52 - | lwz TAB:TMP2, TAB:CARG1->metatable - | evldd CFUNC:TMP0, CFUNC:RB->upvalue[0] - | cmplwi TAB:TMP2, 0 - | la RA, -8(BASE) - | bne ->fff_fallback -#else - | evldd CFUNC:TMP0, CFUNC:RB->upvalue[0] - | la RA, -8(BASE) -#endif - | evstdd TISNIL, 8(BASE) - | li RD, (3+1)*8 - | evstdd CFUNC:TMP0, 0(RA) - | b ->fff_res - | - |.ffunc_2 ipairs_aux - | checktab TAB:CARG1 - | lwz PC, FRAME_PC(BASE) - | checkfail ->fff_fallback - | checknum CARG2 - | lus TMP3, 0x3ff0 - | checkfail ->fff_fallback - | efdctsi TMP2, CARG2 - | lwz TMP0, TAB:CARG1->asize - | evmergelo TMP3, TMP3, ZERO - | lwz TMP1, TAB:CARG1->array - | efdadd CARG2, CARG2, TMP3 - | addi TMP2, TMP2, 1 - | la RA, -8(BASE) - | cmplw TMP0, TMP2 - | slwi TMP3, TMP2, 3 - | evstdd CARG2, 0(RA) - | ble >2 // Not in array part? - | evlddx TMP1, TMP1, TMP3 - |1: - | checknil TMP1 - | li RD, (0+1)*8 - | checkok ->fff_res // End of iteration, return 0 results. - | li RD, (2+1)*8 - | evstdd TMP1, 8(RA) - | b ->fff_res - |2: // Check for empty hash part first. Otherwise call C function. - | lwz TMP0, TAB:CARG1->hmask - | cmplwi TMP0, 0 - | li RD, (0+1)*8 - | beq ->fff_res - | mr CARG2, TMP2 - | bl extern lj_tab_getinth // (GCtab *t, int32_t key) - | // Returns cTValue * or NULL. - | cmplwi CRET1, 0 - | li RD, (0+1)*8 - | beq ->fff_res - | evldd TMP1, 0(CRET1) - | b <1 - | - |.ffunc_1 ipairs - | checktab TAB:CARG1 - | lwz PC, FRAME_PC(BASE) - | checkfail ->fff_fallback -#if LJ_52 - | lwz TAB:TMP2, TAB:CARG1->metatable - | evldd CFUNC:TMP0, CFUNC:RB->upvalue[0] - | cmplwi TAB:TMP2, 0 - | la RA, -8(BASE) - | bne ->fff_fallback -#else - | evldd CFUNC:TMP0, CFUNC:RB->upvalue[0] - | la RA, -8(BASE) -#endif - | evsplati TMP1, 0 - | li RD, (3+1)*8 - | evstdd TMP1, 8(BASE) - | evstdd CFUNC:TMP0, 0(RA) - | b ->fff_res - | - |//-- Base library: catch errors ---------------------------------------- - | - |.ffunc pcall - | cmplwi NARGS8:RC, 8 - | lbz TMP3, DISPATCH_GL(hookmask)(DISPATCH) - | blt ->fff_fallback - | mr TMP2, BASE - | la BASE, 8(BASE) - | // Remember active hook before pcall. - | rlwinm TMP3, TMP3, 32-HOOK_ACTIVE_SHIFT, 31, 31 - | subi NARGS8:RC, NARGS8:RC, 8 - | addi PC, TMP3, 8+FRAME_PCALL - | b ->vm_call_dispatch - | - |.ffunc_2 xpcall - | lbz TMP3, DISPATCH_GL(hookmask)(DISPATCH) - | mr TMP2, BASE - | checkfunc CARG2 // Traceback must be a function. - | checkfail ->fff_fallback - | la BASE, 16(BASE) - | // Remember active hook before pcall. - | rlwinm TMP3, TMP3, 32-HOOK_ACTIVE_SHIFT, 31, 31 - | evstdd CARG2, 0(TMP2) // Swap function and traceback. - | subi NARGS8:RC, NARGS8:RC, 16 - | evstdd CARG1, 8(TMP2) - | addi PC, TMP3, 16+FRAME_PCALL - | b ->vm_call_dispatch - | - |//-- Coroutine library -------------------------------------------------- - | - |.macro coroutine_resume_wrap, resume - |.if resume - |.ffunc_1 coroutine_resume - | evmergehi TMP0, L:CARG1, L:CARG1 - |.else - |.ffunc coroutine_wrap_aux - | lwz L:CARG1, CFUNC:RB->upvalue[0].gcr - |.endif - |.if resume - | cmpwi TMP0, LJ_TTHREAD - | bne ->fff_fallback - |.endif - | lbz TMP0, L:CARG1->status - | lwz TMP1, L:CARG1->cframe - | lwz CARG2, L:CARG1->top - | cmplwi cr0, TMP0, LUA_YIELD - | lwz TMP2, L:CARG1->base - | cmplwi cr1, TMP1, 0 - | lwz TMP0, L:CARG1->maxstack - | cmplw cr7, CARG2, TMP2 - | lwz PC, FRAME_PC(BASE) - | crorc 4*cr6+lt, 4*cr0+gt, 4*cr1+eq // st>LUA_YIELD || cframe!=0 - | add TMP2, CARG2, NARGS8:RC - | crandc 4*cr6+gt, 4*cr7+eq, 4*cr0+eq // base==top && st!=LUA_YIELD - | cmplw cr1, TMP2, TMP0 - | cror 4*cr6+lt, 4*cr6+lt, 4*cr6+gt - | stw PC, SAVE_PC - | cror 4*cr6+lt, 4*cr6+lt, 4*cr1+gt // cond1 || cond2 || stackov - | stw BASE, L->base - | blt cr6, ->fff_fallback - |1: - |.if resume - | addi BASE, BASE, 8 // Keep resumed thread in stack for GC. - | subi NARGS8:RC, NARGS8:RC, 8 - | subi TMP2, TMP2, 8 - |.endif - | stw TMP2, L:CARG1->top - | li TMP1, 0 - | stw BASE, L->top - |2: // Move args to coroutine. - | cmpw TMP1, NARGS8:RC - | evlddx TMP0, BASE, TMP1 - | beq >3 - | evstddx TMP0, CARG2, TMP1 - | addi TMP1, TMP1, 8 - | b <2 - |3: - | li CARG3, 0 - | mr L:SAVE0, L:CARG1 - | li CARG4, 0 - | bl ->vm_resume // (lua_State *L, TValue *base, 0, 0) - | // Returns thread status. - |4: - | lwz TMP2, L:SAVE0->base - | cmplwi CRET1, LUA_YIELD - | lwz TMP3, L:SAVE0->top - | li_vmstate INTERP - | lwz BASE, L->base - | st_vmstate - | bgt >8 - | sub RD, TMP3, TMP2 - | lwz TMP0, L->maxstack - | cmplwi RD, 0 - | add TMP1, BASE, RD - | beq >6 // No results? - | cmplw TMP1, TMP0 - | li TMP1, 0 - | bgt >9 // Need to grow stack? - | - | subi TMP3, RD, 8 - | stw TMP2, L:SAVE0->top // Clear coroutine stack. - |5: // Move results from coroutine. - | cmplw TMP1, TMP3 - | evlddx TMP0, TMP2, TMP1 - | evstddx TMP0, BASE, TMP1 - | addi TMP1, TMP1, 8 - | bne <5 - |6: - | andi. TMP0, PC, FRAME_TYPE - |.if resume - | li TMP1, LJ_TTRUE - | la RA, -8(BASE) - | stw TMP1, -8(BASE) // Prepend true to results. - | addi RD, RD, 16 - |.else - | mr RA, BASE - | addi RD, RD, 8 - |.endif - |7: - | stw PC, SAVE_PC - | mr MULTRES, RD - | beq ->BC_RET_Z - | b ->vm_return - | - |8: // Coroutine returned with error (at co->top-1). - |.if resume - | andi. TMP0, PC, FRAME_TYPE - | la TMP3, -8(TMP3) - | li TMP1, LJ_TFALSE - | evldd TMP0, 0(TMP3) - | stw TMP3, L:SAVE0->top // Remove error from coroutine stack. - | li RD, (2+1)*8 - | stw TMP1, -8(BASE) // Prepend false to results. - | la RA, -8(BASE) - | evstdd TMP0, 0(BASE) // Copy error message. - | b <7 - |.else - | mr CARG1, L - | mr CARG2, L:SAVE0 - | bl extern lj_ffh_coroutine_wrap_err // (lua_State *L, lua_State *co) - |.endif - | - |9: // Handle stack expansion on return from yield. - | mr CARG1, L - | srwi CARG2, RD, 3 - | bl extern lj_state_growstack // (lua_State *L, int n) - | li CRET1, 0 - | b <4 - |.endmacro - | - | coroutine_resume_wrap 1 // coroutine.resume - | coroutine_resume_wrap 0 // coroutine.wrap - | - |.ffunc coroutine_yield - | lwz TMP0, L->cframe - | add TMP1, BASE, NARGS8:RC - | stw BASE, L->base - | andi. TMP0, TMP0, CFRAME_RESUME - | stw TMP1, L->top - | li CRET1, LUA_YIELD - | beq ->fff_fallback - | stw ZERO, L->cframe - | stb CRET1, L->status - | b ->vm_leave_unw - | - |//-- Math library ------------------------------------------------------- - | - |.ffunc_n math_abs - | efdabs CRET1, CARG1 - | // Fallthrough. - | - |->fff_restv: - | // CRET1 = TValue result. - | lwz PC, FRAME_PC(BASE) - | la RA, -8(BASE) - | evstdd CRET1, 0(RA) - |->fff_res1: - | // RA = results, PC = return. - | li RD, (1+1)*8 - |->fff_res: - | // RA = results, RD = (nresults+1)*8, PC = return. - | andi. TMP0, PC, FRAME_TYPE - | mr MULTRES, RD - | bne ->vm_return - | lwz INS, -4(PC) - | decode_RB8 RB, INS - |5: - | cmplw RB, RD // More results expected? - | decode_RA8 TMP0, INS - | bgt >6 - | ins_next1 - | // Adjust BASE. KBASE is assumed to be set for the calling frame. - | sub BASE, RA, TMP0 - | ins_next2 - | - |6: // Fill up results with nil. - | subi TMP1, RD, 8 - | addi RD, RD, 8 - | evstddx TISNIL, RA, TMP1 - | b <5 - | - |.macro math_extern, func - | .ffunc math_ .. func - | cmplwi NARGS8:RC, 8 - | evldd CARG2, 0(BASE) - | blt ->fff_fallback - | checknum CARG2 - | evmergehi CARG1, CARG2, CARG2 - | checkfail ->fff_fallback - | bl extern func@plt - | evmergelo CRET1, CRET1, CRET2 - | b ->fff_restv - |.endmacro - | - |.macro math_extern2, func - | .ffunc math_ .. func - | cmplwi NARGS8:RC, 16 - | evldd CARG2, 0(BASE) - | evldd CARG4, 8(BASE) - | blt ->fff_fallback - | evmergehi CARG1, CARG4, CARG2 - | checknum CARG1 - | evmergehi CARG3, CARG4, CARG4 - | checkanyfail ->fff_fallback - | bl extern func@plt - | evmergelo CRET1, CRET1, CRET2 - | b ->fff_restv - |.endmacro - | - |.macro math_round, func - | .ffunc math_ .. func - | cmplwi NARGS8:RC, 8 - | evldd CARG2, 0(BASE) - | blt ->fff_fallback - | checknum CARG2 - | evmergehi CARG1, CARG2, CARG2 - | checkfail ->fff_fallback - | lwz PC, FRAME_PC(BASE) - | bl ->vm_..func.._hilo; - | la RA, -8(BASE) - | evstdd CRET2, 0(RA) - | b ->fff_res1 - |.endmacro - | - | math_round floor - | math_round ceil - | - | math_extern sqrt - | - |.ffunc math_log - | cmplwi NARGS8:RC, 8 - | evldd CARG2, 0(BASE) - | bne ->fff_fallback // Need exactly 1 argument. - | checknum CARG2 - | evmergehi CARG1, CARG2, CARG2 - | checkfail ->fff_fallback - | bl extern log@plt - | evmergelo CRET1, CRET1, CRET2 - | b ->fff_restv - | - | math_extern log10 - | math_extern exp - | math_extern sin - | math_extern cos - | math_extern tan - | math_extern asin - | math_extern acos - | math_extern atan - | math_extern sinh - | math_extern cosh - | math_extern tanh - | math_extern2 pow - | math_extern2 atan2 - | math_extern2 fmod - | - |->ff_math_deg: - |.ffunc_n math_rad - | evldd CARG2, CFUNC:RB->upvalue[0] - | efdmul CRET1, CARG1, CARG2 - | b ->fff_restv - | - |.ffunc math_ldexp - | cmplwi NARGS8:RC, 16 - | evldd CARG2, 0(BASE) - | evldd CARG4, 8(BASE) - | blt ->fff_fallback - | evmergehi CARG1, CARG4, CARG2 - | checknum CARG1 - | checkanyfail ->fff_fallback - | efdctsi CARG3, CARG4 - | bl extern ldexp@plt - | evmergelo CRET1, CRET1, CRET2 - | b ->fff_restv - | - |.ffunc math_frexp - | cmplwi NARGS8:RC, 8 - | evldd CARG2, 0(BASE) - | blt ->fff_fallback - | checknum CARG2 - | evmergehi CARG1, CARG2, CARG2 - | checkfail ->fff_fallback - | la CARG3, DISPATCH_GL(tmptv)(DISPATCH) - | lwz PC, FRAME_PC(BASE) - | bl extern frexp@plt - | lwz TMP1, DISPATCH_GL(tmptv)(DISPATCH) - | evmergelo CRET1, CRET1, CRET2 - | efdcfsi CRET2, TMP1 - | la RA, -8(BASE) - | evstdd CRET1, 0(RA) - | li RD, (2+1)*8 - | evstdd CRET2, 8(RA) - | b ->fff_res - | - |.ffunc math_modf - | cmplwi NARGS8:RC, 8 - | evldd CARG2, 0(BASE) - | blt ->fff_fallback - | checknum CARG2 - | evmergehi CARG1, CARG2, CARG2 - | checkfail ->fff_fallback - | la CARG3, -8(BASE) - | lwz PC, FRAME_PC(BASE) - | bl extern modf@plt - | evmergelo CRET1, CRET1, CRET2 - | la RA, -8(BASE) - | evstdd CRET1, 0(BASE) - | li RD, (2+1)*8 - | b ->fff_res - | - |.macro math_minmax, name, cmpop - | .ffunc_1 name - | checknum CARG1 - | li TMP1, 8 - | checkfail ->fff_fallback - |1: - | evlddx CARG2, BASE, TMP1 - | cmplw cr1, TMP1, NARGS8:RC - | checknum CARG2 - | bge cr1, ->fff_restv // Ok, since CRET1 = CARG1. - | checkfail ->fff_fallback - | cmpop CARG2, CARG1 - | addi TMP1, TMP1, 8 - | crmove 4*cr0+lt, 4*cr0+gt - | evsel CARG1, CARG2, CARG1 - | b <1 - |.endmacro - | - | math_minmax math_min, efdtstlt - | math_minmax math_max, efdtstgt - | - |//-- String library ----------------------------------------------------- - | - |.ffunc_1 string_len - | checkstr STR:CARG1 - | checkfail ->fff_fallback - | lwz TMP0, STR:CARG1->len - | efdcfsi CRET1, TMP0 - | b ->fff_restv - | - |.ffunc string_byte // Only handle the 1-arg case here. - | cmplwi NARGS8:RC, 8 - | evldd STR:CARG1, 0(BASE) - | bne ->fff_fallback // Need exactly 1 argument. - | checkstr STR:CARG1 - | la RA, -8(BASE) - | checkfail ->fff_fallback - | lwz TMP0, STR:CARG1->len - | li RD, (0+1)*8 - | lbz TMP1, STR:CARG1[1] // Access is always ok (NUL at end). - | li TMP2, (1+1)*8 - | cmplwi TMP0, 0 - | lwz PC, FRAME_PC(BASE) - | efdcfsi CRET1, TMP1 - | iseleq RD, RD, TMP2 - | evstdd CRET1, 0(RA) - | b ->fff_res - | - |.ffunc string_char // Only handle the 1-arg case here. - | ffgccheck - | cmplwi NARGS8:RC, 8 - | evldd CARG1, 0(BASE) - | bne ->fff_fallback // Exactly 1 argument. - | checknum CARG1 - | la CARG2, DISPATCH_GL(tmptv)(DISPATCH) - | checkfail ->fff_fallback - | efdctsiz TMP0, CARG1 - | li CARG3, 1 - | cmplwi TMP0, 255 - | stb TMP0, 0(CARG2) - | bgt ->fff_fallback - |->fff_newstr: - | mr CARG1, L - | stw BASE, L->base - | stw PC, SAVE_PC - | bl extern lj_str_new // (lua_State *L, char *str, size_t l) - | // Returns GCstr *. - | lwz BASE, L->base - | evmergelo STR:CRET1, TISSTR, STR:CRET1 - | b ->fff_restv - | - |.ffunc string_sub - | ffgccheck - | cmplwi NARGS8:RC, 16 - | evldd CARG3, 16(BASE) - | evldd STR:CARG1, 0(BASE) - | blt ->fff_fallback - | evldd CARG2, 8(BASE) - | li TMP2, -1 - | beq >1 - | checknum CARG3 - | checkfail ->fff_fallback - | efdctsiz TMP2, CARG3 - |1: - | checknum CARG2 - | checkfail ->fff_fallback - | checkstr STR:CARG1 - | efdctsiz TMP1, CARG2 - | checkfail ->fff_fallback - | lwz TMP0, STR:CARG1->len - | cmplw TMP0, TMP2 // len < end? (unsigned compare) - | add TMP3, TMP2, TMP0 - | blt >5 - |2: - | cmpwi TMP1, 0 // start <= 0? - | add TMP3, TMP1, TMP0 - | ble >7 - |3: - | sub. CARG3, TMP2, TMP1 - | addi CARG2, STR:CARG1, #STR-1 - | addi CARG3, CARG3, 1 - | add CARG2, CARG2, TMP1 - | isellt CARG3, r0, CARG3 - | b ->fff_newstr - | - |5: // Negative end or overflow. - | cmpw TMP0, TMP2 - | addi TMP3, TMP3, 1 - | iselgt TMP2, TMP3, TMP0 // end = end > len ? len : end+len+1 - | b <2 - | - |7: // Negative start or underflow. - | cmpwi cr1, TMP3, 0 - | iseleq TMP1, r0, TMP3 - | isel TMP1, r0, TMP1, 4*cr1+lt - | addi TMP1, TMP1, 1 // start = 1 + (start ? start+len : 0) - | b <3 - | - |.ffunc string_rep // Only handle the 1-char case inline. - | ffgccheck - | cmplwi NARGS8:RC, 16 - | evldd CARG1, 0(BASE) - | evldd CARG2, 8(BASE) - | bne ->fff_fallback // Exactly 2 arguments. - | checknum CARG2 - | checkfail ->fff_fallback - | checkstr STR:CARG1 - | efdctsiz CARG3, CARG2 - | checkfail ->fff_fallback - | lwz TMP0, STR:CARG1->len - | cmpwi CARG3, 0 - | lwz TMP1, DISPATCH_GL(tmpbuf.sz)(DISPATCH) - | ble >2 // Count <= 0? (or non-int) - | cmplwi TMP0, 1 - | subi TMP2, CARG3, 1 - | blt >2 // Zero length string? - | cmplw cr1, TMP1, CARG3 - | bne ->fff_fallback // Fallback for > 1-char strings. - | lbz TMP0, STR:CARG1[1] - | lwz CARG2, DISPATCH_GL(tmpbuf.buf)(DISPATCH) - | blt cr1, ->fff_fallback - |1: // Fill buffer with char. Yes, this is suboptimal code (do you care?). - | cmplwi TMP2, 0 - | stbx TMP0, CARG2, TMP2 - | subi TMP2, TMP2, 1 - | bne <1 - | b ->fff_newstr - |2: // Return empty string. - | la STR:CRET1, DISPATCH_GL(strempty)(DISPATCH) - | evmergelo CRET1, TISSTR, STR:CRET1 - | b ->fff_restv - | - |.ffunc string_reverse - | ffgccheck - | cmplwi NARGS8:RC, 8 - | evldd CARG1, 0(BASE) - | blt ->fff_fallback - | checkstr STR:CARG1 - | lwz TMP1, DISPATCH_GL(tmpbuf.sz)(DISPATCH) - | checkfail ->fff_fallback - | lwz CARG3, STR:CARG1->len - | la CARG1, #STR(STR:CARG1) - | lwz CARG2, DISPATCH_GL(tmpbuf.buf)(DISPATCH) - | li TMP2, 0 - | cmplw TMP1, CARG3 - | subi TMP3, CARG3, 1 - | blt ->fff_fallback - |1: // Reverse string copy. - | cmpwi TMP3, 0 - | lbzx TMP1, CARG1, TMP2 - | blt ->fff_newstr - | stbx TMP1, CARG2, TMP3 - | subi TMP3, TMP3, 1 - | addi TMP2, TMP2, 1 - | b <1 - | - |.macro ffstring_case, name, lo - | .ffunc name - | ffgccheck - | cmplwi NARGS8:RC, 8 - | evldd CARG1, 0(BASE) - | blt ->fff_fallback - | checkstr STR:CARG1 - | lwz TMP1, DISPATCH_GL(tmpbuf.sz)(DISPATCH) - | checkfail ->fff_fallback - | lwz CARG3, STR:CARG1->len - | la CARG1, #STR(STR:CARG1) - | lwz CARG2, DISPATCH_GL(tmpbuf.buf)(DISPATCH) - | cmplw TMP1, CARG3 - | li TMP2, 0 - | blt ->fff_fallback - |1: // ASCII case conversion. - | cmplw TMP2, CARG3 - | lbzx TMP1, CARG1, TMP2 - | bge ->fff_newstr - | subi TMP0, TMP1, lo - | xori TMP3, TMP1, 0x20 - | cmplwi TMP0, 26 - | isellt TMP1, TMP3, TMP1 - | stbx TMP1, CARG2, TMP2 - | addi TMP2, TMP2, 1 - | b <1 - |.endmacro - | - |ffstring_case string_lower, 65 - |ffstring_case string_upper, 97 - | - |//-- Table library ------------------------------------------------------ - | - |.ffunc_1 table_getn - | checktab CARG1 - | checkfail ->fff_fallback - | bl extern lj_tab_len // (GCtab *t) - | // Returns uint32_t (but less than 2^31). - | efdcfsi CRET1, CRET1 - | b ->fff_restv - | - |//-- Bit library -------------------------------------------------------- - | - |.macro .ffunc_bit, name - | .ffunc_n bit_..name - | efdadd CARG1, CARG1, TOBIT - |.endmacro - | - |.ffunc_bit tobit - |->fff_resbit: - | efdcfsi CRET1, CARG1 - | b ->fff_restv - | - |.macro .ffunc_bit_op, name, ins - | .ffunc_bit name - | li TMP1, 8 - |1: - | evlddx CARG2, BASE, TMP1 - | cmplw cr1, TMP1, NARGS8:RC - | checknum CARG2 - | bge cr1, ->fff_resbit - | checkfail ->fff_fallback - | efdadd CARG2, CARG2, TOBIT - | ins CARG1, CARG1, CARG2 - | addi TMP1, TMP1, 8 - | b <1 - |.endmacro - | - |.ffunc_bit_op band, and - |.ffunc_bit_op bor, or - |.ffunc_bit_op bxor, xor - | - |.ffunc_bit bswap - | rotlwi TMP0, CARG1, 8 - | rlwimi TMP0, CARG1, 24, 0, 7 - | rlwimi TMP0, CARG1, 24, 16, 23 - | efdcfsi CRET1, TMP0 - | b ->fff_restv - | - |.ffunc_bit bnot - | not TMP0, CARG1 - | efdcfsi CRET1, TMP0 - | b ->fff_restv - | - |.macro .ffunc_bit_sh, name, ins, shmod - | .ffunc_nn bit_..name - | efdadd CARG2, CARG2, TOBIT - | efdadd CARG1, CARG1, TOBIT - |.if shmod == 1 - | rlwinm CARG2, CARG2, 0, 27, 31 - |.elif shmod == 2 - | neg CARG2, CARG2 - |.endif - | ins TMP0, CARG1, CARG2 - | efdcfsi CRET1, TMP0 - | b ->fff_restv - |.endmacro - | - |.ffunc_bit_sh lshift, slw, 1 - |.ffunc_bit_sh rshift, srw, 1 - |.ffunc_bit_sh arshift, sraw, 1 - |.ffunc_bit_sh rol, rotlw, 0 - |.ffunc_bit_sh ror, rotlw, 2 - | - |//----------------------------------------------------------------------- - | - |->fff_fallback: // Call fast function fallback handler. - | // BASE = new base, RB = CFUNC, RC = nargs*8 - | lwz TMP3, CFUNC:RB->f - | add TMP1, BASE, NARGS8:RC - | lwz PC, FRAME_PC(BASE) // Fallback may overwrite PC. - | addi TMP0, TMP1, 8*LUA_MINSTACK - | lwz TMP2, L->maxstack - | stw PC, SAVE_PC // Redundant (but a defined value). - | cmplw TMP0, TMP2 - | stw BASE, L->base - | stw TMP1, L->top - | mr CARG1, L - | bgt >5 // Need to grow stack. - | mtctr TMP3 - | bctrl // (lua_State *L) - | // Either throws an error, or recovers and returns -1, 0 or nresults+1. - | lwz BASE, L->base - | cmpwi CRET1, 0 - | slwi RD, CRET1, 3 - | la RA, -8(BASE) - | bgt ->fff_res // Returned nresults+1? - |1: // Returned 0 or -1: retry fast path. - | lwz TMP0, L->top - | lwz LFUNC:RB, FRAME_FUNC(BASE) - | sub NARGS8:RC, TMP0, BASE - | bne ->vm_call_tail // Returned -1? - | ins_callt // Returned 0: retry fast path. - | - |// Reconstruct previous base for vmeta_call during tailcall. - |->vm_call_tail: - | andi. TMP0, PC, FRAME_TYPE - | rlwinm TMP1, PC, 0, 0, 28 - | bne >3 - | lwz INS, -4(PC) - | decode_RA8 TMP1, INS - | addi TMP1, TMP1, 8 - |3: - | sub TMP2, BASE, TMP1 - | b ->vm_call_dispatch // Resolve again for tailcall. - | - |5: // Grow stack for fallback handler. - | li CARG2, LUA_MINSTACK - | bl extern lj_state_growstack // (lua_State *L, int n) - | lwz BASE, L->base - | cmpw TMP0, TMP0 // Set 4*cr0+eq to force retry. - | b <1 - | - |->fff_gcstep: // Call GC step function. - | // BASE = new base, RC = nargs*8 - | mflr SAVE0 - | stw BASE, L->base - | add TMP0, BASE, NARGS8:RC - | stw PC, SAVE_PC // Redundant (but a defined value). - | stw TMP0, L->top - | mr CARG1, L - | bl extern lj_gc_step // (lua_State *L) - | lwz BASE, L->base - | mtlr SAVE0 - | lwz TMP0, L->top - | sub NARGS8:RC, TMP0, BASE - | lwz CFUNC:RB, FRAME_FUNC(BASE) - | blr - | - |//----------------------------------------------------------------------- - |//-- Special dispatch targets ------------------------------------------- - |//----------------------------------------------------------------------- - | - |->vm_record: // Dispatch target for recording phase. - |.if JIT - | NYI - |.endif - | - |->vm_rethook: // Dispatch target for return hooks. - | lbz TMP3, DISPATCH_GL(hookmask)(DISPATCH) - | andi. TMP0, TMP3, HOOK_ACTIVE // Hook already active? - | beq >1 - |5: // Re-dispatch to static ins. - | addi TMP1, TMP1, GG_DISP2STATIC // Assumes decode_OP4 TMP1, INS. - | lwzx TMP0, DISPATCH, TMP1 - | mtctr TMP0 - | bctr - | - |->vm_inshook: // Dispatch target for instr/line hooks. - | lbz TMP3, DISPATCH_GL(hookmask)(DISPATCH) - | lwz TMP2, DISPATCH_GL(hookcount)(DISPATCH) - | andi. TMP0, TMP3, HOOK_ACTIVE // Hook already active? - | rlwinm TMP0, TMP3, 31-LUA_HOOKLINE, 31, 0 - | bne <5 - | - | cmpwi cr1, TMP0, 0 - | addic. TMP2, TMP2, -1 - | beq cr1, <5 - | stw TMP2, DISPATCH_GL(hookcount)(DISPATCH) - | beq >1 - | bge cr1, <5 - |1: - | mr CARG1, L - | stw MULTRES, SAVE_MULTRES - | mr CARG2, PC - | stw BASE, L->base - | // SAVE_PC must hold the _previous_ PC. The callee updates it with PC. - | bl extern lj_dispatch_ins // (lua_State *L, const BCIns *pc) - |3: - | lwz BASE, L->base - |4: // Re-dispatch to static ins. - | lwz INS, -4(PC) - | decode_OP4 TMP1, INS - | decode_RB8 RB, INS - | addi TMP1, TMP1, GG_DISP2STATIC - | decode_RD8 RD, INS - | lwzx TMP0, DISPATCH, TMP1 - | decode_RA8 RA, INS - | decode_RC8 RC, INS - | mtctr TMP0 - | bctr - | - |->cont_hook: // Continue from hook yield. - | addi PC, PC, 4 - | lwz MULTRES, -20(RB) // Restore MULTRES for *M ins. - | b <4 - | - |->vm_hotloop: // Hot loop counter underflow. - |.if JIT - | NYI - |.endif - | - |->vm_callhook: // Dispatch target for call hooks. - | mr CARG2, PC - |.if JIT - | b >1 - |.endif - | - |->vm_hotcall: // Hot call counter underflow. - |.if JIT - | ori CARG2, PC, 1 - |1: - |.endif - | add TMP0, BASE, RC - | stw PC, SAVE_PC - | mr CARG1, L - | stw BASE, L->base - | sub RA, RA, BASE - | stw TMP0, L->top - | bl extern lj_dispatch_call // (lua_State *L, const BCIns *pc) - | // Returns ASMFunction. - | lwz BASE, L->base - | lwz TMP0, L->top - | stw ZERO, SAVE_PC // Invalidate for subsequent line hook. - | sub NARGS8:RC, TMP0, BASE - | add RA, BASE, RA - | lwz LFUNC:RB, FRAME_FUNC(BASE) - | mtctr CRET1 - | bctr - | - |//----------------------------------------------------------------------- - |//-- Trace exit handler ------------------------------------------------- - |//----------------------------------------------------------------------- - | - |->vm_exit_handler: - |.if JIT - | NYI - |.endif - |->vm_exit_interp: - |.if JIT - | NYI - |.endif - | - |//----------------------------------------------------------------------- - |//-- Math helper functions ---------------------------------------------- - |//----------------------------------------------------------------------- - | - |// FP value rounding. Called by math.floor/math.ceil fast functions - |// and from JIT code. - |// - |// This can be inlined if the CPU has the frin/friz/frip/frim instructions. - |// The alternative hard-float approaches have a deep dependency chain. - |// The resulting latency is at least 3x-7x the double-precision FP latency - |// (e500v2: 6cy, e600: 5cy, Cell: 10cy) or around 20-70 cycles. - |// - |// The soft-float approach is tedious, but much faster (e500v2: ~11cy/~6cy). - |// However it relies on a fast way to transfer the FP value to GPRs - |// (e500v2: 0cy for lo-word, 1cy for hi-word). - |// - |.macro vm_round, name, mode - | // Used temporaries: TMP0, TMP1, TMP2, TMP3. - |->name.._efd: // Input: CARG2, output: CRET2 - | evmergehi CARG1, CARG2, CARG2 - |->name.._hilo: - | // Input: CARG1 (hi), CARG2 (hi, lo), output: CRET2 - | rlwinm TMP2, CARG1, 12, 21, 31 - | addic. TMP2, TMP2, -1023 // exp = exponent(x) - 1023 - | li TMP1, -1 - | cmplwi cr1, TMP2, 51 // 0 <= exp <= 51? - | subfic TMP0, TMP2, 52 - | bgt cr1, >1 - | lus TMP3, 0xfff0 - | slw TMP0, TMP1, TMP0 // lomask = -1 << (52-exp) - | sraw TMP1, TMP3, TMP2 // himask = (int32_t)0xfff00000 >> exp - |.if mode == 2 // trunc(x): - | evmergelo TMP0, TMP1, TMP0 - | evand CRET2, CARG2, TMP0 // hi &= himask, lo &= lomask - |.else - | andc TMP2, CARG2, TMP0 - | andc TMP3, CARG1, TMP1 - | or TMP2, TMP2, TMP3 // ztest = (hi&~himask) | (lo&~lomask) - | srawi TMP3, CARG1, 31 // signmask = (int32_t)hi >> 31 - |.if mode == 0 // floor(x): - | and. TMP2, TMP2, TMP3 // iszero = ((ztest & signmask) == 0) - |.else // ceil(x): - | andc. TMP2, TMP2, TMP3 // iszero = ((ztest & ~signmask) == 0) - |.endif - | and CARG2, CARG2, TMP0 // lo &= lomask - | and CARG1, CARG1, TMP1 // hi &= himask - | subc TMP0, CARG2, TMP0 - | iseleq TMP0, CARG2, TMP0 // lo = iszero ? lo : lo-lomask - | sube TMP1, CARG1, TMP1 - | iseleq TMP1, CARG1, TMP1 // hi = iszero ? hi : hi-himask+carry - | evmergelo CRET2, TMP1, TMP0 - |.endif - | blr - |1: - | bgtlr // Already done if >=2^52, +-inf or nan. - |.if mode == 2 // trunc(x): - | rlwinm TMP1, CARG1, 0, 0, 0 // hi = sign(x) - | li TMP0, 0 - | evmergelo CRET2, TMP1, TMP0 - |.else - | rlwinm TMP2, CARG1, 0, 1, 31 - | srawi TMP0, CARG1, 31 // signmask = (int32_t)hi >> 31 - | or TMP2, TMP2, CARG2 // ztest = abs(hi) | lo - | lus TMP1, 0x3ff0 - |.if mode == 0 // floor(x): - | and. TMP2, TMP2, TMP0 // iszero = ((ztest & signmask) == 0) - |.else // ceil(x): - | andc. TMP2, TMP2, TMP0 // iszero = ((ztest & ~signmask) == 0) - |.endif - | li TMP0, 0 - | iseleq TMP1, r0, TMP1 - | rlwimi CARG1, TMP1, 0, 1, 31 // hi = sign(x) | (iszero ? 0.0 : 1.0) - | evmergelo CRET2, CARG1, TMP0 - |.endif - | blr - |.endmacro - | - |->vm_floor: - | mflr CARG3 - | evmergelo CARG2, CARG1, CARG2 - | bl ->vm_floor_hilo - | mtlr CARG3 - | evmergehi CRET1, CRET2, CRET2 - | blr - | - | vm_round vm_floor, 0 - | vm_round vm_ceil, 1 - |.if JIT - | vm_round vm_trunc, 2 - |.else - |->vm_trunc_efd: - |->vm_trunc_hilo: - |.endif - | - |//----------------------------------------------------------------------- - |//-- Miscellaneous functions -------------------------------------------- - |//----------------------------------------------------------------------- - | - |//----------------------------------------------------------------------- - |//-- FFI helper functions ----------------------------------------------- - |//----------------------------------------------------------------------- - | - |->vm_ffi_call: - |.if FFI - | NYI - |.endif - | - |//----------------------------------------------------------------------- -} - -/* Generate the code for a single instruction. */ -static void build_ins(BuildCtx *ctx, BCOp op, int defop) -{ - int vk = 0; - |=>defop: - - switch (op) { - - /* -- Comparison ops ---------------------------------------------------- */ - - /* Remember: all ops branch for a true comparison, fall through otherwise. */ - - case BC_ISLT: case BC_ISGE: case BC_ISLE: case BC_ISGT: - | // RA = src1*8, RD = src2*8, JMP with RD = target - | evlddx TMP0, BASE, RA - | addi PC, PC, 4 - | evlddx TMP1, BASE, RD - | addis TMP3, PC, -(BCBIAS_J*4 >> 16) - | lwz TMP2, -4(PC) - | evmergehi RB, TMP0, TMP1 - | decode_RD4 TMP2, TMP2 - | checknum RB - | add TMP2, TMP2, TMP3 - | checkanyfail ->vmeta_comp - | efdcmplt TMP0, TMP1 - if (op == BC_ISLE || op == BC_ISGT) { - | efdcmpeq cr1, TMP0, TMP1 - | cror 4*cr0+gt, 4*cr0+gt, 4*cr1+gt - } - if (op == BC_ISLT || op == BC_ISLE) { - | iselgt PC, TMP2, PC - } else { - | iselgt PC, PC, TMP2 - } - | ins_next - break; - - case BC_ISEQV: case BC_ISNEV: - vk = op == BC_ISEQV; - | // RA = src1*8, RD = src2*8, JMP with RD = target - | evlddx CARG2, BASE, RA - | addi PC, PC, 4 - | evlddx CARG3, BASE, RD - | addis TMP3, PC, -(BCBIAS_J*4 >> 16) - | lwz TMP2, -4(PC) - | evmergehi RB, CARG2, CARG3 - | decode_RD4 TMP2, TMP2 - | checknum RB - | add TMP2, TMP2, TMP3 - | checkanyfail >5 - | efdcmpeq CARG2, CARG3 - if (vk) { - | iselgt PC, TMP2, PC - } else { - | iselgt PC, PC, TMP2 - } - |1: - | ins_next - | - |5: // Either or both types are not numbers. - | evcmpeq CARG2, CARG3 - | not TMP3, RB - | cmplwi cr1, TMP3, ~LJ_TISPRI // Primitive? - | crorc 4*cr7+lt, 4*cr0+so, 4*cr0+lt // 1: Same tv or different type. - | cmplwi cr6, TMP3, ~LJ_TISTABUD // Table or userdata? - | crandc 4*cr7+gt, 4*cr0+lt, 4*cr1+gt // 2: Same type and primitive. - | mr SAVE0, PC - if (vk) { - | isel PC, TMP2, PC, 4*cr7+gt - } else { - | isel TMP2, PC, TMP2, 4*cr7+gt - } - | cror 4*cr7+lt, 4*cr7+lt, 4*cr7+gt // 1 or 2. - if (vk) { - | isel PC, TMP2, PC, 4*cr0+so - } else { - | isel PC, PC, TMP2, 4*cr0+so - } - | blt cr7, <1 // Done if 1 or 2. - | blt cr6, <1 // Done if not tab/ud. - | - | // Different tables or userdatas. Need to check __eq metamethod. - | // Field metatable must be at same offset for GCtab and GCudata! - | lwz TAB:TMP2, TAB:CARG2->metatable - | li CARG4, 1-vk // ne = 0 or 1. - | cmplwi TAB:TMP2, 0 - | beq <1 // No metatable? - | lbz TMP2, TAB:TMP2->nomm - | andi. TMP2, TMP2, 1<vmeta_equal // Handle __eq metamethod. - break; - - case BC_ISEQS: case BC_ISNES: - vk = op == BC_ISEQS; - | // RA = src*8, RD = str_const*8 (~), JMP with RD = target - | evlddx TMP0, BASE, RA - | srwi RD, RD, 1 - | lwz INS, 0(PC) - | subfic RD, RD, -4 - | addi PC, PC, 4 - | lwzx STR:TMP1, KBASE, RD // KBASE-4-str_const*4 - | addis TMP3, PC, -(BCBIAS_J*4 >> 16) - | decode_RD4 TMP2, INS - | evmergelo STR:TMP1, TISSTR, STR:TMP1 - | add TMP2, TMP2, TMP3 - | evcmpeq TMP0, STR:TMP1 - if (vk) { - | isel PC, TMP2, PC, 4*cr0+so - } else { - | isel PC, PC, TMP2, 4*cr0+so - } - | ins_next - break; - - case BC_ISEQN: case BC_ISNEN: - vk = op == BC_ISEQN; - | // RA = src*8, RD = num_const*8, JMP with RD = target - | evlddx TMP0, BASE, RA - | addi PC, PC, 4 - | evlddx TMP1, KBASE, RD - | addis TMP3, PC, -(BCBIAS_J*4 >> 16) - | lwz INS, -4(PC) - | checknum TMP0 - | checkfail >5 - | efdcmpeq TMP0, TMP1 - |1: - | decode_RD4 TMP2, INS - | add TMP2, TMP2, TMP3 - if (vk) { - | iselgt PC, TMP2, PC - |5: - } else { - | iselgt PC, PC, TMP2 - } - |3: - | ins_next - if (!vk) { - |5: - | decode_RD4 TMP2, INS - | add PC, TMP2, TMP3 - | b <3 - } - break; - - case BC_ISEQP: case BC_ISNEP: - vk = op == BC_ISEQP; - | // RA = src*8, RD = primitive_type*8 (~), JMP with RD = target - | lwzx TMP0, BASE, RA - | srwi TMP1, RD, 3 - | lwz INS, 0(PC) - | addi PC, PC, 4 - | not TMP1, TMP1 - | addis TMP3, PC, -(BCBIAS_J*4 >> 16) - | cmplw TMP0, TMP1 - | decode_RD4 TMP2, INS - | add TMP2, TMP2, TMP3 - if (vk) { - | iseleq PC, TMP2, PC - } else { - | iseleq PC, PC, TMP2 - } - | ins_next - break; - - /* -- Unary test and copy ops ------------------------------------------- */ - - case BC_ISTC: case BC_ISFC: case BC_IST: case BC_ISF: - | // RA = dst*8 or unused, RD = src*8, JMP with RD = target - | evlddx TMP0, BASE, RD - | evaddw TMP1, TISNIL, TISNIL // Synthesize LJ_TFALSE. - | lwz INS, 0(PC) - | evcmpltu TMP0, TMP1 - | addi PC, PC, 4 - if (op == BC_IST || op == BC_ISF) { - | addis TMP3, PC, -(BCBIAS_J*4 >> 16) - | decode_RD4 TMP2, INS - | add TMP2, TMP2, TMP3 - if (op == BC_IST) { - | isellt PC, TMP2, PC - } else { - | isellt PC, PC, TMP2 - } - } else { - if (op == BC_ISTC) { - | checkfail >1 - } else { - | checkok >1 - } - | addis PC, PC, -(BCBIAS_J*4 >> 16) - | decode_RD4 TMP2, INS - | evstddx TMP0, BASE, RA - | add PC, PC, TMP2 - |1: - } - | ins_next - break; - - /* -- Unary ops --------------------------------------------------------- */ - - case BC_MOV: - | // RA = dst*8, RD = src*8 - | ins_next1 - | evlddx TMP0, BASE, RD - | evstddx TMP0, BASE, RA - | ins_next2 - break; - case BC_NOT: - | // RA = dst*8, RD = src*8 - | ins_next1 - | lwzx TMP0, BASE, RD - | subfic TMP1, TMP0, LJ_TTRUE - | adde TMP0, TMP0, TMP1 - | stwx TMP0, BASE, RA - | ins_next2 - break; - case BC_UNM: - | // RA = dst*8, RD = src*8 - | evlddx TMP0, BASE, RD - | checknum TMP0 - | checkfail ->vmeta_unm - | efdneg TMP0, TMP0 - | ins_next1 - | evstddx TMP0, BASE, RA - | ins_next2 - break; - case BC_LEN: - | // RA = dst*8, RD = src*8 - | evlddx CARG1, BASE, RD - | checkstr CARG1 - | checkfail >2 - | lwz CRET1, STR:CARG1->len - |1: - | ins_next1 - | efdcfsi TMP0, CRET1 - | evstddx TMP0, BASE, RA - | ins_next2 - |2: - | checktab CARG1 - | checkfail ->vmeta_len -#if LJ_52 - | lwz TAB:TMP2, TAB:CARG1->metatable - | cmplwi TAB:TMP2, 0 - | bne >9 - |3: -#endif - |->BC_LEN_Z: - | bl extern lj_tab_len // (GCtab *t) - | // Returns uint32_t (but less than 2^31). - | b <1 -#if LJ_52 - |9: - | lbz TMP0, TAB:TMP2->nomm - | andi. TMP0, TMP0, 1<vmeta_len -#endif - break; - - /* -- Binary ops -------------------------------------------------------- */ - - |.macro ins_arithpre, t0, t1 - | // RA = dst*8, RB = src1*8, RC = src2*8 | num_const*8 - ||vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN); - ||switch (vk) { - ||case 0: - | evlddx t0, BASE, RB - | checknum t0 - | evlddx t1, KBASE, RC - | checkfail ->vmeta_arith_vn - || break; - ||case 1: - | evlddx t1, BASE, RB - | checknum t1 - | evlddx t0, KBASE, RC - | checkfail ->vmeta_arith_nv - || break; - ||default: - | evlddx t0, BASE, RB - | evlddx t1, BASE, RC - | evmergehi TMP2, t0, t1 - | checknum TMP2 - | checkanyfail ->vmeta_arith_vv - || break; - ||} - |.endmacro - | - |.macro ins_arith, ins - | ins_arithpre TMP0, TMP1 - | ins_next1 - | ins TMP0, TMP0, TMP1 - | evstddx TMP0, BASE, RA - | ins_next2 - |.endmacro - - case BC_ADDVN: case BC_ADDNV: case BC_ADDVV: - | ins_arith efdadd - break; - case BC_SUBVN: case BC_SUBNV: case BC_SUBVV: - | ins_arith efdsub - break; - case BC_MULVN: case BC_MULNV: case BC_MULVV: - | ins_arith efdmul - break; - case BC_DIVVN: case BC_DIVNV: case BC_DIVVV: - | ins_arith efddiv - break; - case BC_MODVN: - | ins_arithpre RD, SAVE0 - |->BC_MODVN_Z: - | efddiv CARG2, RD, SAVE0 - | bl ->vm_floor_efd // floor(b/c) - | efdmul TMP0, CRET2, SAVE0 - | ins_next1 - | efdsub TMP0, RD, TMP0 // b - floor(b/c)*c - | evstddx TMP0, BASE, RA - | ins_next2 - break; - case BC_MODNV: case BC_MODVV: - | ins_arithpre RD, SAVE0 - | b ->BC_MODVN_Z // Avoid 3 copies. It's slow anyway. - break; - case BC_POW: - | evlddx CARG2, BASE, RB - | evlddx CARG4, BASE, RC - | evmergehi CARG1, CARG4, CARG2 - | checknum CARG1 - | evmergehi CARG3, CARG4, CARG4 - | checkanyfail ->vmeta_arith_vv - | bl extern pow@plt - | evmergelo CRET2, CRET1, CRET2 - | evstddx CRET2, BASE, RA - | ins_next - break; - - case BC_CAT: - | // RA = dst*8, RB = src_start*8, RC = src_end*8 - | sub CARG3, RC, RB - | stw BASE, L->base - | add CARG2, BASE, RC - | mr SAVE0, RB - |->BC_CAT_Z: - | stw PC, SAVE_PC - | mr CARG1, L - | srwi CARG3, CARG3, 3 - | bl extern lj_meta_cat // (lua_State *L, TValue *top, int left) - | // Returns NULL (finished) or TValue * (metamethod). - | cmplwi CRET1, 0 - | lwz BASE, L->base - | bne ->vmeta_binop - | evlddx TMP0, BASE, SAVE0 // Copy result from RB to RA. - | evstddx TMP0, BASE, RA - | ins_next - break; - - /* -- Constant ops ------------------------------------------------------ */ - - case BC_KSTR: - | // RA = dst*8, RD = str_const*8 (~) - | ins_next1 - | srwi TMP1, RD, 1 - | subfic TMP1, TMP1, -4 - | lwzx TMP0, KBASE, TMP1 // KBASE-4-str_const*4 - | evmergelo TMP0, TISSTR, TMP0 - | evstddx TMP0, BASE, RA - | ins_next2 - break; - case BC_KCDATA: - |.if FFI - | // RA = dst*8, RD = cdata_const*8 (~) - | ins_next1 - | srwi TMP1, RD, 1 - | subfic TMP1, TMP1, -4 - | lwzx TMP0, KBASE, TMP1 // KBASE-4-cdata_const*4 - | li TMP2, LJ_TCDATA - | evmergelo TMP0, TMP2, TMP0 - | evstddx TMP0, BASE, RA - | ins_next2 - |.endif - break; - case BC_KSHORT: - | // RA = dst*8, RD = int16_literal*8 - | srwi TMP1, RD, 3 - | extsh TMP1, TMP1 - | ins_next1 - | efdcfsi TMP0, TMP1 - | evstddx TMP0, BASE, RA - | ins_next2 - break; - case BC_KNUM: - | // RA = dst*8, RD = num_const*8 - | evlddx TMP0, KBASE, RD - | ins_next1 - | evstddx TMP0, BASE, RA - | ins_next2 - break; - case BC_KPRI: - | // RA = dst*8, RD = primitive_type*8 (~) - | srwi TMP1, RD, 3 - | not TMP0, TMP1 - | ins_next1 - | stwx TMP0, BASE, RA - | ins_next2 - break; - case BC_KNIL: - | // RA = base*8, RD = end*8 - | evstddx TISNIL, BASE, RA - | addi RA, RA, 8 - |1: - | evstddx TISNIL, BASE, RA - | cmpw RA, RD - | addi RA, RA, 8 - | blt <1 - | ins_next_ - break; - - /* -- Upvalue and function ops ------------------------------------------ */ - - case BC_UGET: - | // RA = dst*8, RD = uvnum*8 - | ins_next1 - | lwz LFUNC:RB, FRAME_FUNC(BASE) - | srwi RD, RD, 1 - | addi RD, RD, offsetof(GCfuncL, uvptr) - | lwzx UPVAL:RB, LFUNC:RB, RD - | lwz TMP1, UPVAL:RB->v - | evldd TMP0, 0(TMP1) - | evstddx TMP0, BASE, RA - | ins_next2 - break; - case BC_USETV: - | // RA = uvnum*8, RD = src*8 - | lwz LFUNC:RB, FRAME_FUNC(BASE) - | srwi RA, RA, 1 - | addi RA, RA, offsetof(GCfuncL, uvptr) - | evlddx TMP1, BASE, RD - | lwzx UPVAL:RB, LFUNC:RB, RA - | lbz TMP3, UPVAL:RB->marked - | lwz CARG2, UPVAL:RB->v - | andi. TMP3, TMP3, LJ_GC_BLACK // isblack(uv) - | lbz TMP0, UPVAL:RB->closed - | evmergehi TMP2, TMP1, TMP1 - | evstdd TMP1, 0(CARG2) - | cmplwi cr1, TMP0, 0 - | cror 4*cr0+eq, 4*cr0+eq, 4*cr1+eq - | subi TMP2, TMP2, (LJ_TISNUM+1) - | bne >2 // Upvalue is closed and black? - |1: - | ins_next - | - |2: // Check if new value is collectable. - | cmplwi TMP2, LJ_TISGCV - (LJ_TISNUM+1) - | bge <1 // tvisgcv(v) - | lbz TMP3, GCOBJ:TMP1->gch.marked - | andi. TMP3, TMP3, LJ_GC_WHITES // iswhite(v) - | la CARG1, GG_DISP2G(DISPATCH) - | // Crossed a write barrier. Move the barrier forward. - | beq <1 - | bl extern lj_gc_barrieruv // (global_State *g, TValue *tv) - | b <1 - break; - case BC_USETS: - | // RA = uvnum*8, RD = str_const*8 (~) - | lwz LFUNC:RB, FRAME_FUNC(BASE) - | srwi TMP1, RD, 1 - | srwi RA, RA, 1 - | subfic TMP1, TMP1, -4 - | addi RA, RA, offsetof(GCfuncL, uvptr) - | lwzx STR:TMP1, KBASE, TMP1 // KBASE-4-str_const*4 - | lwzx UPVAL:RB, LFUNC:RB, RA - | evmergelo STR:TMP1, TISSTR, STR:TMP1 - | lbz TMP3, UPVAL:RB->marked - | lwz CARG2, UPVAL:RB->v - | andi. TMP3, TMP3, LJ_GC_BLACK // isblack(uv) - | lbz TMP3, STR:TMP1->marked - | lbz TMP2, UPVAL:RB->closed - | evstdd STR:TMP1, 0(CARG2) - | bne >2 - |1: - | ins_next - | - |2: // Check if string is white and ensure upvalue is closed. - | andi. TMP3, TMP3, LJ_GC_WHITES // iswhite(str) - | cmplwi cr1, TMP2, 0 - | cror 4*cr0+eq, 4*cr0+eq, 4*cr1+eq - | la CARG1, GG_DISP2G(DISPATCH) - | // Crossed a write barrier. Move the barrier forward. - | beq <1 - | bl extern lj_gc_barrieruv // (global_State *g, TValue *tv) - | b <1 - break; - case BC_USETN: - | // RA = uvnum*8, RD = num_const*8 - | ins_next1 - | lwz LFUNC:RB, FRAME_FUNC(BASE) - | srwi RA, RA, 1 - | addi RA, RA, offsetof(GCfuncL, uvptr) - | evlddx TMP0, KBASE, RD - | lwzx UPVAL:RB, LFUNC:RB, RA - | lwz TMP1, UPVAL:RB->v - | evstdd TMP0, 0(TMP1) - | ins_next2 - break; - case BC_USETP: - | // RA = uvnum*8, RD = primitive_type*8 (~) - | ins_next1 - | lwz LFUNC:RB, FRAME_FUNC(BASE) - | srwi RA, RA, 1 - | addi RA, RA, offsetof(GCfuncL, uvptr) - | srwi TMP0, RD, 3 - | lwzx UPVAL:RB, LFUNC:RB, RA - | not TMP0, TMP0 - | lwz TMP1, UPVAL:RB->v - | stw TMP0, 0(TMP1) - | ins_next2 - break; - - case BC_UCLO: - | // RA = level*8, RD = target - | lwz TMP1, L->openupval - | branch_RD // Do this first since RD is not saved. - | stw BASE, L->base - | cmplwi TMP1, 0 - | mr CARG1, L - | beq >1 - | add CARG2, BASE, RA - | bl extern lj_func_closeuv // (lua_State *L, TValue *level) - | lwz BASE, L->base - |1: - | ins_next - break; - - case BC_FNEW: - | // RA = dst*8, RD = proto_const*8 (~) (holding function prototype) - | srwi TMP1, RD, 1 - | stw BASE, L->base - | subfic TMP1, TMP1, -4 - | stw PC, SAVE_PC - | lwzx CARG2, KBASE, TMP1 // KBASE-4-tab_const*4 - | mr CARG1, L - | lwz CARG3, FRAME_FUNC(BASE) - | // (lua_State *L, GCproto *pt, GCfuncL *parent) - | bl extern lj_func_newL_gc - | // Returns GCfuncL *. - | lwz BASE, L->base - | evmergelo LFUNC:CRET1, TISFUNC, LFUNC:CRET1 - | evstddx LFUNC:CRET1, BASE, RA - | ins_next - break; - - /* -- Table ops --------------------------------------------------------- */ - - case BC_TNEW: - case BC_TDUP: - | // RA = dst*8, RD = (hbits|asize)*8 | tab_const*8 (~) - | lwz TMP0, DISPATCH_GL(gc.total)(DISPATCH) - | mr CARG1, L - | lwz TMP1, DISPATCH_GL(gc.threshold)(DISPATCH) - | stw BASE, L->base - | cmplw TMP0, TMP1 - | stw PC, SAVE_PC - | bge >5 - |1: - if (op == BC_TNEW) { - | rlwinm CARG2, RD, 29, 21, 31 - | rlwinm CARG3, RD, 18, 27, 31 - | cmpwi CARG2, 0x7ff - | li TMP1, 0x801 - | iseleq CARG2, TMP1, CARG2 - | bl extern lj_tab_new // (lua_State *L, int32_t asize, uint32_t hbits) - | // Returns Table *. - } else { - | srwi TMP1, RD, 1 - | subfic TMP1, TMP1, -4 - | lwzx CARG2, KBASE, TMP1 // KBASE-4-tab_const*4 - | bl extern lj_tab_dup // (lua_State *L, Table *kt) - | // Returns Table *. - } - | lwz BASE, L->base - | evmergelo TAB:CRET1, TISTAB, TAB:CRET1 - | evstddx TAB:CRET1, BASE, RA - | ins_next - |5: - | mr SAVE0, RD - | bl extern lj_gc_step_fixtop // (lua_State *L) - | mr RD, SAVE0 - | mr CARG1, L - | b <1 - break; - - case BC_GGET: - | // RA = dst*8, RD = str_const*8 (~) - case BC_GSET: - | // RA = src*8, RD = str_const*8 (~) - | lwz LFUNC:TMP2, FRAME_FUNC(BASE) - | srwi TMP1, RD, 1 - | lwz TAB:RB, LFUNC:TMP2->env - | subfic TMP1, TMP1, -4 - | lwzx STR:RC, KBASE, TMP1 // KBASE-4-str_const*4 - if (op == BC_GGET) { - | b ->BC_TGETS_Z - } else { - | b ->BC_TSETS_Z - } - break; - - case BC_TGETV: - | // RA = dst*8, RB = table*8, RC = key*8 - | evlddx TAB:RB, BASE, RB - | evlddx RC, BASE, RC - | checktab TAB:RB - | checkfail ->vmeta_tgetv - | checknum RC - | checkfail >5 - | // Convert number key to integer - | efdctsi TMP2, RC - | lwz TMP0, TAB:RB->asize - | efdcfsi TMP1, TMP2 - | cmplw cr0, TMP0, TMP2 - | efdcmpeq cr1, RC, TMP1 - | lwz TMP1, TAB:RB->array - | crand 4*cr0+gt, 4*cr0+gt, 4*cr1+gt - | slwi TMP2, TMP2, 3 - | ble ->vmeta_tgetv // Integer key and in array part? - | evlddx TMP1, TMP1, TMP2 - | checknil TMP1 - | checkok >2 - |1: - | evstddx TMP1, BASE, RA - | ins_next - | - |2: // Check for __index if table value is nil. - | lwz TAB:TMP2, TAB:RB->metatable - | cmplwi TAB:TMP2, 0 - | beq <1 // No metatable: done. - | lbz TMP0, TAB:TMP2->nomm - | andi. TMP0, TMP0, 1<vmeta_tgetv - | - |5: - | checkstr STR:RC // String key? - | checkok ->BC_TGETS_Z - | b ->vmeta_tgetv - break; - case BC_TGETS: - | // RA = dst*8, RB = table*8, RC = str_const*8 (~) - | evlddx TAB:RB, BASE, RB - | srwi TMP1, RC, 1 - | checktab TAB:RB - | subfic TMP1, TMP1, -4 - | lwzx STR:RC, KBASE, TMP1 // KBASE-4-str_const*4 - | checkfail ->vmeta_tgets1 - |->BC_TGETS_Z: - | // TAB:RB = GCtab *, STR:RC = GCstr *, RA = dst*8 - | lwz TMP0, TAB:RB->hmask - | lwz TMP1, STR:RC->hash - | lwz NODE:TMP2, TAB:RB->node - | evmergelo STR:RC, TISSTR, STR:RC - | and TMP1, TMP1, TMP0 // idx = str->hash & tab->hmask - | slwi TMP0, TMP1, 5 - | slwi TMP1, TMP1, 3 - | sub TMP1, TMP0, TMP1 - | add NODE:TMP2, NODE:TMP2, TMP1 // node = tab->node + (idx*32-idx*8) - |1: - | evldd TMP0, NODE:TMP2->key - | evldd TMP1, NODE:TMP2->val - | evcmpeq TMP0, STR:RC - | checkanyfail >4 - | checknil TMP1 - | checkok >5 // Key found, but nil value? - |3: - | evstddx TMP1, BASE, RA - | ins_next - | - |4: // Follow hash chain. - | lwz NODE:TMP2, NODE:TMP2->next - | cmplwi NODE:TMP2, 0 - | bne <1 - | // End of hash chain: key not found, nil result. - | evmr TMP1, TISNIL - | - |5: // Check for __index if table value is nil. - | lwz TAB:TMP2, TAB:RB->metatable - | cmplwi TAB:TMP2, 0 - | beq <3 // No metatable: done. - | lbz TMP0, TAB:TMP2->nomm - | andi. TMP0, TMP0, 1<vmeta_tgets - break; - case BC_TGETB: - | // RA = dst*8, RB = table*8, RC = index*8 - | evlddx TAB:RB, BASE, RB - | srwi TMP0, RC, 3 - | checktab TAB:RB - | checkfail ->vmeta_tgetb - | lwz TMP1, TAB:RB->asize - | lwz TMP2, TAB:RB->array - | cmplw TMP0, TMP1 - | bge ->vmeta_tgetb - | evlddx TMP1, TMP2, RC - | checknil TMP1 - | checkok >5 - |1: - | ins_next1 - | evstddx TMP1, BASE, RA - | ins_next2 - | - |5: // Check for __index if table value is nil. - | lwz TAB:TMP2, TAB:RB->metatable - | cmplwi TAB:TMP2, 0 - | beq <1 // No metatable: done. - | lbz TMP2, TAB:TMP2->nomm - | andi. TMP2, TMP2, 1<vmeta_tgetb // Caveat: preserve TMP0! - break; - - case BC_TSETV: - | // RA = src*8, RB = table*8, RC = key*8 - | evlddx TAB:RB, BASE, RB - | evlddx RC, BASE, RC - | checktab TAB:RB - | checkfail ->vmeta_tsetv - | checknum RC - | checkfail >5 - | // Convert number key to integer - | efdctsi TMP2, RC - | evlddx SAVE0, BASE, RA - | lwz TMP0, TAB:RB->asize - | efdcfsi TMP1, TMP2 - | cmplw cr0, TMP0, TMP2 - | efdcmpeq cr1, RC, TMP1 - | lwz TMP1, TAB:RB->array - | crand 4*cr0+gt, 4*cr0+gt, 4*cr1+gt - | slwi TMP0, TMP2, 3 - | ble ->vmeta_tsetv // Integer key and in array part? - | lbz TMP3, TAB:RB->marked - | evlddx TMP2, TMP1, TMP0 - | checknil TMP2 - | checkok >3 - |1: - | andi. TMP2, TMP3, LJ_GC_BLACK // isblack(table) - | evstddx SAVE0, TMP1, TMP0 - | bne >7 - |2: - | ins_next - | - |3: // Check for __newindex if previous value is nil. - | lwz TAB:TMP2, TAB:RB->metatable - | cmplwi TAB:TMP2, 0 - | beq <1 // No metatable: done. - | lbz TMP2, TAB:TMP2->nomm - | andi. TMP2, TMP2, 1<vmeta_tsetv - | - |5: - | checkstr STR:RC // String key? - | checkok ->BC_TSETS_Z - | b ->vmeta_tsetv - | - |7: // Possible table write barrier for the value. Skip valiswhite check. - | barrierback TAB:RB, TMP3, TMP0 - | b <2 - break; - case BC_TSETS: - | // RA = src*8, RB = table*8, RC = str_const*8 (~) - | evlddx TAB:RB, BASE, RB - | srwi TMP1, RC, 1 - | checktab TAB:RB - | subfic TMP1, TMP1, -4 - | lwzx STR:RC, KBASE, TMP1 // KBASE-4-str_const*4 - | checkfail ->vmeta_tsets1 - |->BC_TSETS_Z: - | // TAB:RB = GCtab *, STR:RC = GCstr *, RA = src*8 - | lwz TMP0, TAB:RB->hmask - | lwz TMP1, STR:RC->hash - | lwz NODE:TMP2, TAB:RB->node - | evmergelo STR:RC, TISSTR, STR:RC - | stb ZERO, TAB:RB->nomm // Clear metamethod cache. - | and TMP1, TMP1, TMP0 // idx = str->hash & tab->hmask - | evlddx SAVE0, BASE, RA - | slwi TMP0, TMP1, 5 - | slwi TMP1, TMP1, 3 - | sub TMP1, TMP0, TMP1 - | lbz TMP3, TAB:RB->marked - | add NODE:TMP2, NODE:TMP2, TMP1 // node = tab->node + (idx*32-idx*8) - |1: - | evldd TMP0, NODE:TMP2->key - | evldd TMP1, NODE:TMP2->val - | evcmpeq TMP0, STR:RC - | checkanyfail >5 - | checknil TMP1 - | checkok >4 // Key found, but nil value? - |2: - | andi. TMP0, TMP3, LJ_GC_BLACK // isblack(table) - | evstdd SAVE0, NODE:TMP2->val - | bne >7 - |3: - | ins_next - | - |4: // Check for __newindex if previous value is nil. - | lwz TAB:TMP1, TAB:RB->metatable - | cmplwi TAB:TMP1, 0 - | beq <2 // No metatable: done. - | lbz TMP0, TAB:TMP1->nomm - | andi. TMP0, TMP0, 1<vmeta_tsets - | - |5: // Follow hash chain. - | lwz NODE:TMP2, NODE:TMP2->next - | cmplwi NODE:TMP2, 0 - | bne <1 - | // End of hash chain: key not found, add a new one. - | - | // But check for __newindex first. - | lwz TAB:TMP1, TAB:RB->metatable - | la CARG3, DISPATCH_GL(tmptv)(DISPATCH) - | stw PC, SAVE_PC - | mr CARG1, L - | cmplwi TAB:TMP1, 0 - | stw BASE, L->base - | beq >6 // No metatable: continue. - | lbz TMP0, TAB:TMP1->nomm - | andi. TMP0, TMP0, 1<vmeta_tsets // 'no __newindex' flag NOT set: check. - |6: - | mr CARG2, TAB:RB - | evstdd STR:RC, 0(CARG3) - | bl extern lj_tab_newkey // (lua_State *L, GCtab *t, TValue *k) - | // Returns TValue *. - | lwz BASE, L->base - | evstdd SAVE0, 0(CRET1) - | b <3 // No 2nd write barrier needed. - | - |7: // Possible table write barrier for the value. Skip valiswhite check. - | barrierback TAB:RB, TMP3, TMP0 - | b <3 - break; - case BC_TSETB: - | // RA = src*8, RB = table*8, RC = index*8 - | evlddx TAB:RB, BASE, RB - | srwi TMP0, RC, 3 - | checktab TAB:RB - | checkfail ->vmeta_tsetb - | lwz TMP1, TAB:RB->asize - | lwz TMP2, TAB:RB->array - | lbz TMP3, TAB:RB->marked - | cmplw TMP0, TMP1 - | evlddx SAVE0, BASE, RA - | bge ->vmeta_tsetb - | evlddx TMP1, TMP2, RC - | checknil TMP1 - | checkok >5 - |1: - | andi. TMP0, TMP3, LJ_GC_BLACK // isblack(table) - | evstddx SAVE0, TMP2, RC - | bne >7 - |2: - | ins_next - | - |5: // Check for __newindex if previous value is nil. - | lwz TAB:TMP1, TAB:RB->metatable - | cmplwi TAB:TMP1, 0 - | beq <1 // No metatable: done. - | lbz TMP1, TAB:TMP1->nomm - | andi. TMP1, TMP1, 1<vmeta_tsetb // Caveat: preserve TMP0! - | - |7: // Possible table write barrier for the value. Skip valiswhite check. - | barrierback TAB:RB, TMP3, TMP0 - | b <2 - break; - - case BC_TSETM: - | // RA = base*8 (table at base-1), RD = num_const*8 (start index) - | add RA, BASE, RA - |1: - | add TMP3, KBASE, RD - | lwz TAB:CARG2, -4(RA) // Guaranteed to be a table. - | addic. TMP0, MULTRES, -8 - | lwz TMP3, 4(TMP3) // Integer constant is in lo-word. - | srwi CARG3, TMP0, 3 - | beq >4 // Nothing to copy? - | add CARG3, CARG3, TMP3 - | lwz TMP2, TAB:CARG2->asize - | slwi TMP1, TMP3, 3 - | lbz TMP3, TAB:CARG2->marked - | cmplw CARG3, TMP2 - | add TMP2, RA, TMP0 - | lwz TMP0, TAB:CARG2->array - | bgt >5 - | add TMP1, TMP1, TMP0 - | andi. TMP0, TMP3, LJ_GC_BLACK // isblack(table) - |3: // Copy result slots to table. - | evldd TMP0, 0(RA) - | addi RA, RA, 8 - | cmpw cr1, RA, TMP2 - | evstdd TMP0, 0(TMP1) - | addi TMP1, TMP1, 8 - | blt cr1, <3 - | bne >7 - |4: - | ins_next - | - |5: // Need to resize array part. - | stw BASE, L->base - | mr CARG1, L - | stw PC, SAVE_PC - | mr SAVE0, RD - | bl extern lj_tab_reasize // (lua_State *L, GCtab *t, int nasize) - | // Must not reallocate the stack. - | mr RD, SAVE0 - | b <1 - | - |7: // Possible table write barrier for any value. Skip valiswhite check. - | barrierback TAB:CARG2, TMP3, TMP0 - | b <4 - break; - - /* -- Calls and vararg handling ----------------------------------------- */ - - case BC_CALLM: - | // RA = base*8, (RB = (nresults+1)*8,) RC = extra_nargs*8 - | add NARGS8:RC, NARGS8:RC, MULTRES - | // Fall through. Assumes BC_CALL follows. - break; - case BC_CALL: - | // RA = base*8, (RB = (nresults+1)*8,) RC = (nargs+1)*8 - | evlddx LFUNC:RB, BASE, RA - | mr TMP2, BASE - | add BASE, BASE, RA - | subi NARGS8:RC, NARGS8:RC, 8 - | checkfunc LFUNC:RB - | addi BASE, BASE, 8 - | checkfail ->vmeta_call - | ins_call - break; - - case BC_CALLMT: - | // RA = base*8, (RB = 0,) RC = extra_nargs*8 - | add NARGS8:RC, NARGS8:RC, MULTRES - | // Fall through. Assumes BC_CALLT follows. - break; - case BC_CALLT: - | // RA = base*8, (RB = 0,) RC = (nargs+1)*8 - | evlddx LFUNC:RB, BASE, RA - | add RA, BASE, RA - | lwz TMP1, FRAME_PC(BASE) - | subi NARGS8:RC, NARGS8:RC, 8 - | checkfunc LFUNC:RB - | addi RA, RA, 8 - | checkfail ->vmeta_callt - |->BC_CALLT_Z: - | andi. TMP0, TMP1, FRAME_TYPE // Caveat: preserve cr0 until the crand. - | lbz TMP3, LFUNC:RB->ffid - | xori TMP2, TMP1, FRAME_VARG - | cmplwi cr1, NARGS8:RC, 0 - | bne >7 - |1: - | stw LFUNC:RB, FRAME_FUNC(BASE) // Copy function down, but keep PC. - | li TMP2, 0 - | cmplwi cr7, TMP3, 1 // (> FF_C) Calling a fast function? - | beq cr1, >3 - |2: - | addi TMP3, TMP2, 8 - | evlddx TMP0, RA, TMP2 - | cmplw cr1, TMP3, NARGS8:RC - | evstddx TMP0, BASE, TMP2 - | mr TMP2, TMP3 - | bne cr1, <2 - |3: - | crand 4*cr0+eq, 4*cr0+eq, 4*cr7+gt - | beq >5 - |4: - | ins_callt - | - |5: // Tailcall to a fast function with a Lua frame below. - | lwz INS, -4(TMP1) - | decode_RA8 RA, INS - | sub TMP1, BASE, RA - | lwz LFUNC:TMP1, FRAME_FUNC-8(TMP1) - | lwz TMP1, LFUNC:TMP1->pc - | lwz KBASE, PC2PROTO(k)(TMP1) // Need to prepare KBASE. - | b <4 - | - |7: // Tailcall from a vararg function. - | andi. TMP0, TMP2, FRAME_TYPEP - | bne <1 // Vararg frame below? - | sub BASE, BASE, TMP2 // Relocate BASE down. - | lwz TMP1, FRAME_PC(BASE) - | andi. TMP0, TMP1, FRAME_TYPE - | b <1 - break; - - case BC_ITERC: - | // RA = base*8, (RB = (nresults+1)*8, RC = (nargs+1)*8 ((2+1)*8)) - | subi RA, RA, 24 // evldd doesn't support neg. offsets. - | mr TMP2, BASE - | evlddx LFUNC:RB, BASE, RA - | add BASE, BASE, RA - | evldd TMP0, 8(BASE) - | evldd TMP1, 16(BASE) - | evstdd LFUNC:RB, 24(BASE) // Copy callable. - | checkfunc LFUNC:RB - | evstdd TMP0, 32(BASE) // Copy state. - | li NARGS8:RC, 16 // Iterators get 2 arguments. - | evstdd TMP1, 40(BASE) // Copy control var. - | addi BASE, BASE, 32 - | checkfail ->vmeta_call - | ins_call - break; - - case BC_ITERN: - | // RA = base*8, (RB = (nresults+1)*8, RC = (nargs+1)*8 (2+1)*8) - |.if JIT - | // NYI: add hotloop, record BC_ITERN. - |.endif - | add RA, BASE, RA - | lwz TAB:RB, -12(RA) - | lwz RC, -4(RA) // Get index from control var. - | lwz TMP0, TAB:RB->asize - | lwz TMP1, TAB:RB->array - | addi PC, PC, 4 - |1: // Traverse array part. - | cmplw RC, TMP0 - | slwi TMP3, RC, 3 - | bge >5 // Index points after array part? - | evlddx TMP2, TMP1, TMP3 - | checknil TMP2 - | lwz INS, -4(PC) - | checkok >4 - | efdcfsi TMP0, RC - | addi RC, RC, 1 - | addis TMP3, PC, -(BCBIAS_J*4 >> 16) - | evstdd TMP2, 8(RA) - | decode_RD4 TMP1, INS - | stw RC, -4(RA) // Update control var. - | add PC, TMP1, TMP3 - | evstdd TMP0, 0(RA) - |3: - | ins_next - | - |4: // Skip holes in array part. - | addi RC, RC, 1 - | b <1 - | - |5: // Traverse hash part. - | lwz TMP1, TAB:RB->hmask - | sub RC, RC, TMP0 - | lwz TMP2, TAB:RB->node - |6: - | cmplw RC, TMP1 // End of iteration? Branch to ITERL+1. - | slwi TMP3, RC, 5 - | bgt <3 - | slwi RB, RC, 3 - | sub TMP3, TMP3, RB - | evlddx RB, TMP2, TMP3 - | add NODE:TMP3, TMP2, TMP3 - | checknil RB - | lwz INS, -4(PC) - | checkok >7 - | evldd TMP3, NODE:TMP3->key - | addis TMP2, PC, -(BCBIAS_J*4 >> 16) - | evstdd RB, 8(RA) - | add RC, RC, TMP0 - | decode_RD4 TMP1, INS - | evstdd TMP3, 0(RA) - | addi RC, RC, 1 - | add PC, TMP1, TMP2 - | stw RC, -4(RA) // Update control var. - | b <3 - | - |7: // Skip holes in hash part. - | addi RC, RC, 1 - | b <6 - break; - - case BC_ISNEXT: - | // RA = base*8, RD = target (points to ITERN) - | add RA, BASE, RA - | li TMP2, -24 - | evlddx CFUNC:TMP1, RA, TMP2 - | lwz TMP2, -16(RA) - | lwz TMP3, -8(RA) - | evmergehi TMP0, CFUNC:TMP1, CFUNC:TMP1 - | cmpwi cr0, TMP2, LJ_TTAB - | cmpwi cr1, TMP0, LJ_TFUNC - | cmpwi cr6, TMP3, LJ_TNIL - | bne cr1, >5 - | lbz TMP1, CFUNC:TMP1->ffid - | crand 4*cr0+eq, 4*cr0+eq, 4*cr6+eq - | cmpwi cr7, TMP1, FF_next_N - | srwi TMP0, RD, 1 - | crand 4*cr0+eq, 4*cr0+eq, 4*cr7+eq - | add TMP3, PC, TMP0 - | bne cr0, >5 - | lus TMP1, 0xfffe - | ori TMP1, TMP1, 0x7fff - | stw ZERO, -4(RA) // Initialize control var. - | stw TMP1, -8(RA) - | addis PC, TMP3, -(BCBIAS_J*4 >> 16) - |1: - | ins_next - |5: // Despecialize bytecode if any of the checks fail. - | li TMP0, BC_JMP - | li TMP1, BC_ITERC - | stb TMP0, -1(PC) - | addis PC, TMP3, -(BCBIAS_J*4 >> 16) - | stb TMP1, 3(PC) - | b <1 - break; - - case BC_VARG: - | // RA = base*8, RB = (nresults+1)*8, RC = numparams*8 - | lwz TMP0, FRAME_PC(BASE) - | add RC, BASE, RC - | add RA, BASE, RA - | addi RC, RC, FRAME_VARG - | add TMP2, RA, RB - | subi TMP3, BASE, 8 // TMP3 = vtop - | sub RC, RC, TMP0 // RC = vbase - | // Note: RC may now be even _above_ BASE if nargs was < numparams. - | cmplwi cr1, RB, 0 - | sub. TMP1, TMP3, RC - | beq cr1, >5 // Copy all varargs? - | subi TMP2, TMP2, 16 - | ble >2 // No vararg slots? - |1: // Copy vararg slots to destination slots. - | evldd TMP0, 0(RC) - | addi RC, RC, 8 - | evstdd TMP0, 0(RA) - | cmplw RA, TMP2 - | cmplw cr1, RC, TMP3 - | bge >3 // All destination slots filled? - | addi RA, RA, 8 - | blt cr1, <1 // More vararg slots? - |2: // Fill up remainder with nil. - | evstdd TISNIL, 0(RA) - | cmplw RA, TMP2 - | addi RA, RA, 8 - | blt <2 - |3: - | ins_next - | - |5: // Copy all varargs. - | lwz TMP0, L->maxstack - | li MULTRES, 8 // MULTRES = (0+1)*8 - | ble <3 // No vararg slots? - | add TMP2, RA, TMP1 - | cmplw TMP2, TMP0 - | addi MULTRES, TMP1, 8 - | bgt >7 - |6: - | evldd TMP0, 0(RC) - | addi RC, RC, 8 - | evstdd TMP0, 0(RA) - | cmplw RC, TMP3 - | addi RA, RA, 8 - | blt <6 // More vararg slots? - | b <3 - | - |7: // Grow stack for varargs. - | mr CARG1, L - | stw RA, L->top - | sub SAVE0, RC, BASE // Need delta, because BASE may change. - | stw BASE, L->base - | sub RA, RA, BASE - | stw PC, SAVE_PC - | srwi CARG2, TMP1, 3 - | bl extern lj_state_growstack // (lua_State *L, int n) - | lwz BASE, L->base - | add RA, BASE, RA - | add RC, BASE, SAVE0 - | subi TMP3, BASE, 8 - | b <6 - break; - - /* -- Returns ----------------------------------------------------------- */ - - case BC_RETM: - | // RA = results*8, RD = extra_nresults*8 - | add RD, RD, MULTRES // MULTRES >= 8, so RD >= 8. - | // Fall through. Assumes BC_RET follows. - break; - - case BC_RET: - | // RA = results*8, RD = (nresults+1)*8 - | lwz PC, FRAME_PC(BASE) - | add RA, BASE, RA - | mr MULTRES, RD - |1: - | andi. TMP0, PC, FRAME_TYPE - | xori TMP1, PC, FRAME_VARG - | bne ->BC_RETV_Z - | - |->BC_RET_Z: - | // BASE = base, RA = resultptr, RD = (nresults+1)*8, PC = return - | lwz INS, -4(PC) - | cmpwi RD, 8 - | subi TMP2, BASE, 8 - | subi RC, RD, 8 - | decode_RB8 RB, INS - | beq >3 - | li TMP1, 0 - |2: - | addi TMP3, TMP1, 8 - | evlddx TMP0, RA, TMP1 - | cmpw TMP3, RC - | evstddx TMP0, TMP2, TMP1 - | beq >3 - | addi TMP1, TMP3, 8 - | evlddx TMP0, RA, TMP3 - | cmpw TMP1, RC - | evstddx TMP0, TMP2, TMP3 - | bne <2 - |3: - |5: - | cmplw RB, RD - | decode_RA8 RA, INS - | bgt >6 - | sub BASE, TMP2, RA - | lwz LFUNC:TMP1, FRAME_FUNC(BASE) - | ins_next1 - | lwz TMP1, LFUNC:TMP1->pc - | lwz KBASE, PC2PROTO(k)(TMP1) - | ins_next2 - | - |6: // Fill up results with nil. - | subi TMP1, RD, 8 - | addi RD, RD, 8 - | evstddx TISNIL, TMP2, TMP1 - | b <5 - | - |->BC_RETV_Z: // Non-standard return case. - | andi. TMP2, TMP1, FRAME_TYPEP - | bne ->vm_return - | // Return from vararg function: relocate BASE down. - | sub BASE, BASE, TMP1 - | lwz PC, FRAME_PC(BASE) - | b <1 - break; - - case BC_RET0: case BC_RET1: - | // RA = results*8, RD = (nresults+1)*8 - | lwz PC, FRAME_PC(BASE) - | add RA, BASE, RA - | mr MULTRES, RD - | andi. TMP0, PC, FRAME_TYPE - | xori TMP1, PC, FRAME_VARG - | bne ->BC_RETV_Z - | - | lwz INS, -4(PC) - | subi TMP2, BASE, 8 - | decode_RB8 RB, INS - if (op == BC_RET1) { - | evldd TMP0, 0(RA) - | evstdd TMP0, 0(TMP2) - } - |5: - | cmplw RB, RD - | decode_RA8 RA, INS - | bgt >6 - | sub BASE, TMP2, RA - | lwz LFUNC:TMP1, FRAME_FUNC(BASE) - | ins_next1 - | lwz TMP1, LFUNC:TMP1->pc - | lwz KBASE, PC2PROTO(k)(TMP1) - | ins_next2 - | - |6: // Fill up results with nil. - | subi TMP1, RD, 8 - | addi RD, RD, 8 - | evstddx TISNIL, TMP2, TMP1 - | b <5 - break; - - /* -- Loops and branches ------------------------------------------------ */ - - case BC_FORL: - |.if JIT - | hotloop - |.endif - | // Fall through. Assumes BC_IFORL follows. - break; - - case BC_JFORI: - case BC_JFORL: -#if !LJ_HASJIT - break; -#endif - case BC_FORI: - case BC_IFORL: - | // RA = base*8, RD = target (after end of loop or start of loop) - vk = (op == BC_IFORL || op == BC_JFORL); - | add RA, BASE, RA - | evldd TMP1, FORL_IDX*8(RA) - | evldd TMP3, FORL_STEP*8(RA) - | evldd TMP2, FORL_STOP*8(RA) - if (!vk) { - | evcmpgtu cr0, TMP1, TISNUM - | evcmpgtu cr7, TMP3, TISNUM - | evcmpgtu cr1, TMP2, TISNUM - | cror 4*cr0+lt, 4*cr0+lt, 4*cr7+lt - | cror 4*cr0+lt, 4*cr0+lt, 4*cr1+lt - | blt ->vmeta_for - } - if (vk) { - | efdadd TMP1, TMP1, TMP3 - | evstdd TMP1, FORL_IDX*8(RA) - } - | evcmpgts TMP3, TISNIL - | evstdd TMP1, FORL_EXT*8(RA) - | bge >2 - | efdcmpgt TMP1, TMP2 - |1: - if (op != BC_JFORL) { - | srwi RD, RD, 1 - | add RD, PC, RD - if (op == BC_JFORI) { - | addis PC, RD, -(BCBIAS_J*4 >> 16) - } else { - | addis RD, RD, -(BCBIAS_J*4 >> 16) - } - } - if (op == BC_FORI) { - | iselgt PC, RD, PC - } else if (op == BC_IFORL) { - | iselgt PC, PC, RD - } else { - | ble =>BC_JLOOP - } - | ins_next - |2: - | efdcmpgt TMP2, TMP1 - | b <1 - break; - - case BC_ITERL: - |.if JIT - | hotloop - |.endif - | // Fall through. Assumes BC_IITERL follows. - break; - - case BC_JITERL: -#if !LJ_HASJIT - break; -#endif - case BC_IITERL: - | // RA = base*8, RD = target - | evlddx TMP1, BASE, RA - | subi RA, RA, 8 - | checknil TMP1 - | checkok >1 // Stop if iterator returned nil. - if (op == BC_JITERL) { - | NYI - } else { - | branch_RD // Otherwise save control var + branch. - | evstddx TMP1, BASE, RA - } - |1: - | ins_next - break; - - case BC_LOOP: - | // RA = base*8, RD = target (loop extent) - | // Note: RA/RD is only used by trace recorder to determine scope/extent - | // This opcode does NOT jump, it's only purpose is to detect a hot loop. - |.if JIT - | hotloop - |.endif - | // Fall through. Assumes BC_ILOOP follows. - break; - - case BC_ILOOP: - | // RA = base*8, RD = target (loop extent) - | ins_next - break; - - case BC_JLOOP: - |.if JIT - | NYI - |.endif - break; - - case BC_JMP: - | // RA = base*8 (only used by trace recorder), RD = target - | branch_RD - | ins_next - break; - - /* -- Function headers -------------------------------------------------- */ - - case BC_FUNCF: - |.if JIT - | hotcall - |.endif - case BC_FUNCV: /* NYI: compiled vararg functions. */ - | // Fall through. Assumes BC_IFUNCF/BC_IFUNCV follow. - break; - - case BC_JFUNCF: -#if !LJ_HASJIT - break; -#endif - case BC_IFUNCF: - | // BASE = new base, RA = BASE+framesize*8, RB = LFUNC, RC = nargs*8 - | lwz TMP2, L->maxstack - | lbz TMP1, -4+PC2PROTO(numparams)(PC) - | lwz KBASE, -4+PC2PROTO(k)(PC) - | cmplw RA, TMP2 - | slwi TMP1, TMP1, 3 - | bgt ->vm_growstack_l - | ins_next1 - |2: - | cmplw NARGS8:RC, TMP1 // Check for missing parameters. - | ble >3 - if (op == BC_JFUNCF) { - | NYI - } else { - | ins_next2 - } - | - |3: // Clear missing parameters. - | evstddx TISNIL, BASE, NARGS8:RC - | addi NARGS8:RC, NARGS8:RC, 8 - | b <2 - break; - - case BC_JFUNCV: -#if !LJ_HASJIT - break; -#endif - | NYI // NYI: compiled vararg functions - break; /* NYI: compiled vararg functions. */ - - case BC_IFUNCV: - | // BASE = new base, RA = BASE+framesize*8, RB = LFUNC, RC = nargs*8 - | lwz TMP2, L->maxstack - | add TMP1, BASE, RC - | add TMP0, RA, RC - | stw LFUNC:RB, 4(TMP1) // Store copy of LFUNC. - | addi TMP3, RC, 8+FRAME_VARG - | lwz KBASE, -4+PC2PROTO(k)(PC) - | cmplw TMP0, TMP2 - | stw TMP3, 0(TMP1) // Store delta + FRAME_VARG. - | bge ->vm_growstack_l - | lbz TMP2, -4+PC2PROTO(numparams)(PC) - | mr RA, BASE - | mr RC, TMP1 - | ins_next1 - | cmpwi TMP2, 0 - | addi BASE, TMP1, 8 - | beq >3 - |1: - | cmplw RA, RC // Less args than parameters? - | evldd TMP0, 0(RA) - | bge >4 - | evstdd TISNIL, 0(RA) // Clear old fixarg slot (help the GC). - | addi RA, RA, 8 - |2: - | addic. TMP2, TMP2, -1 - | evstdd TMP0, 8(TMP1) - | addi TMP1, TMP1, 8 - | bne <1 - |3: - | ins_next2 - | - |4: // Clear missing parameters. - | evmr TMP0, TISNIL - | b <2 - break; - - case BC_FUNCC: - case BC_FUNCCW: - | // BASE = new base, RA = BASE+framesize*8, RB = CFUNC, RC = nargs*8 - if (op == BC_FUNCC) { - | lwz TMP3, CFUNC:RB->f - } else { - | lwz TMP3, DISPATCH_GL(wrapf)(DISPATCH) - } - | add TMP1, RA, NARGS8:RC - | lwz TMP2, L->maxstack - | add RC, BASE, NARGS8:RC - | stw BASE, L->base - | cmplw TMP1, TMP2 - | stw RC, L->top - | li_vmstate C - | mtctr TMP3 - if (op == BC_FUNCCW) { - | lwz CARG2, CFUNC:RB->f - } - | mr CARG1, L - | bgt ->vm_growstack_c // Need to grow stack. - | st_vmstate - | bctrl // (lua_State *L [, lua_CFunction f]) - | // Returns nresults. - | lwz TMP1, L->top - | slwi RD, CRET1, 3 - | lwz BASE, L->base - | li_vmstate INTERP - | lwz PC, FRAME_PC(BASE) // Fetch PC of caller. - | sub RA, TMP1, RD // RA = L->top - nresults*8 - | st_vmstate - | b ->vm_returnc - break; - - /* ---------------------------------------------------------------------- */ - - default: - fprintf(stderr, "Error: undefined opcode BC_%s\n", bc_names[op]); - exit(2); - break; - } -} - -static int build_backend(BuildCtx *ctx) -{ - int op; - - dasm_growpc(Dst, BC__MAX); - - build_subroutines(ctx); - - |.code_op - for (op = 0; op < BC__MAX; op++) - build_ins(ctx, (BCOp)op, op); - - return BC__MAX; -} - -/* Emit pseudo frame-info for all assembler functions. */ -static void emit_asm_debug(BuildCtx *ctx) -{ - int i; - switch (ctx->mode) { - case BUILD_elfasm: - fprintf(ctx->fp, "\t.section .debug_frame,\"\",@progbits\n"); - fprintf(ctx->fp, - ".Lframe0:\n" - "\t.long .LECIE0-.LSCIE0\n" - ".LSCIE0:\n" - "\t.long 0xffffffff\n" - "\t.byte 0x1\n" - "\t.string \"\"\n" - "\t.uleb128 0x1\n" - "\t.sleb128 -4\n" - "\t.byte 65\n" - "\t.byte 0xc\n\t.uleb128 1\n\t.uleb128 0\n" - "\t.align 2\n" - ".LECIE0:\n\n"); - fprintf(ctx->fp, - ".LSFDE0:\n" - "\t.long .LEFDE0-.LASFDE0\n" - ".LASFDE0:\n" - "\t.long .Lframe0\n" - "\t.long .Lbegin\n" - "\t.long %d\n" - "\t.byte 0xe\n\t.uleb128 %d\n" - "\t.byte 0x11\n\t.uleb128 65\n\t.sleb128 -1\n" - "\t.byte 0x5\n\t.uleb128 70\n\t.sleb128 37\n", - (int)ctx->codesz, CFRAME_SIZE); - for (i = 14; i <= 31; i++) - fprintf(ctx->fp, - "\t.byte %d\n\t.uleb128 %d\n" - "\t.byte 5\n\t.uleb128 %d\n\t.uleb128 %d\n", - 0x80+i, 1+2*(31-i), 1200+i, 2+2*(31-i)); - fprintf(ctx->fp, - "\t.align 2\n" - ".LEFDE0:\n\n"); - fprintf(ctx->fp, "\t.section .eh_frame,\"a\",@progbits\n"); - fprintf(ctx->fp, - ".Lframe1:\n" - "\t.long .LECIE1-.LSCIE1\n" - ".LSCIE1:\n" - "\t.long 0\n" - "\t.byte 0x1\n" - "\t.string \"zPR\"\n" - "\t.uleb128 0x1\n" - "\t.sleb128 -4\n" - "\t.byte 65\n" - "\t.uleb128 6\n" /* augmentation length */ - "\t.byte 0x1b\n" /* pcrel|sdata4 */ - "\t.long lj_err_unwind_dwarf-.\n" - "\t.byte 0x1b\n" /* pcrel|sdata4 */ - "\t.byte 0xc\n\t.uleb128 1\n\t.uleb128 0\n" - "\t.align 2\n" - ".LECIE1:\n\n"); - fprintf(ctx->fp, - ".LSFDE1:\n" - "\t.long .LEFDE1-.LASFDE1\n" - ".LASFDE1:\n" - "\t.long .LASFDE1-.Lframe1\n" - "\t.long .Lbegin-.\n" - "\t.long %d\n" - "\t.uleb128 0\n" /* augmentation length */ - "\t.byte 0xe\n\t.uleb128 %d\n" - "\t.byte 0x11\n\t.uleb128 65\n\t.sleb128 -1\n" - "\t.byte 0x5\n\t.uleb128 70\n\t.sleb128 37\n", - (int)ctx->codesz, CFRAME_SIZE); - for (i = 14; i <= 31; i++) - fprintf(ctx->fp, - "\t.byte %d\n\t.uleb128 %d\n" - "\t.byte 5\n\t.uleb128 %d\n\t.uleb128 %d\n", - 0x80+i, 1+2*(31-i), 1200+i, 2+2*(31-i)); - fprintf(ctx->fp, - "\t.align 2\n" - ".LEFDE1:\n\n"); - break; - default: - break; - } -} - diff --git a/deps/luajit/src/vm_x86.dasc b/deps/luajit/src/vm_x86.dasc deleted file mode 100644 index 6cdb8cbd..00000000 --- a/deps/luajit/src/vm_x86.dasc +++ /dev/null @@ -1,6377 +0,0 @@ -|// Low-level VM code for x86 CPUs. -|// Bytecode interpreter, fast functions and helper functions. -|// Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h -| -|.if P64 -|.arch x64 -|.else -|.arch x86 -|.endif -|.section code_op, code_sub -| -|.actionlist build_actionlist -|.globals GLOB_ -|.globalnames globnames -|.externnames extnames -| -|//----------------------------------------------------------------------- -| -|.if P64 -|.define X64, 1 -|.define SSE, 1 -|.if WIN -|.define X64WIN, 1 -|.endif -|.endif -| -|// Fixed register assignments for the interpreter. -|// This is very fragile and has many dependencies. Caveat emptor. -|.define BASE, edx // Not C callee-save, refetched anyway. -|.if not X64 -|.define KBASE, edi // Must be C callee-save. -|.define KBASEa, KBASE -|.define PC, esi // Must be C callee-save. -|.define PCa, PC -|.define DISPATCH, ebx // Must be C callee-save. -|.elif X64WIN -|.define KBASE, edi // Must be C callee-save. -|.define KBASEa, rdi -|.define PC, esi // Must be C callee-save. -|.define PCa, rsi -|.define DISPATCH, ebx // Must be C callee-save. -|.else -|.define KBASE, r15d // Must be C callee-save. -|.define KBASEa, r15 -|.define PC, ebx // Must be C callee-save. -|.define PCa, rbx -|.define DISPATCH, r14d // Must be C callee-save. -|.endif -| -|.define RA, ecx -|.define RAH, ch -|.define RAL, cl -|.define RB, ebp // Must be ebp (C callee-save). -|.define RC, eax // Must be eax. -|.define RCW, ax -|.define RCH, ah -|.define RCL, al -|.define OP, RB -|.define RD, RC -|.define RDW, RCW -|.define RDL, RCL -|.if X64 -|.define RAa, rcx -|.define RBa, rbp -|.define RCa, rax -|.define RDa, rax -|.else -|.define RAa, RA -|.define RBa, RB -|.define RCa, RC -|.define RDa, RD -|.endif -| -|.if not X64 -|.define FCARG1, ecx // x86 fastcall arguments. -|.define FCARG2, edx -|.elif X64WIN -|.define CARG1, rcx // x64/WIN64 C call arguments. -|.define CARG2, rdx -|.define CARG3, r8 -|.define CARG4, r9 -|.define CARG1d, ecx -|.define CARG2d, edx -|.define CARG3d, r8d -|.define CARG4d, r9d -|.define FCARG1, CARG1d // Upwards compatible to x86 fastcall. -|.define FCARG2, CARG2d -|.else -|.define CARG1, rdi // x64/POSIX C call arguments. -|.define CARG2, rsi -|.define CARG3, rdx -|.define CARG4, rcx -|.define CARG5, r8 -|.define CARG6, r9 -|.define CARG1d, edi -|.define CARG2d, esi -|.define CARG3d, edx -|.define CARG4d, ecx -|.define CARG5d, r8d -|.define CARG6d, r9d -|.define FCARG1, CARG1d // Simulate x86 fastcall. -|.define FCARG2, CARG2d -|.endif -| -|// Type definitions. Some of these are only used for documentation. -|.type L, lua_State -|.type GL, global_State -|.type TVALUE, TValue -|.type GCOBJ, GCobj -|.type STR, GCstr -|.type TAB, GCtab -|.type LFUNC, GCfuncL -|.type CFUNC, GCfuncC -|.type PROTO, GCproto -|.type UPVAL, GCupval -|.type NODE, Node -|.type NARGS, int -|.type TRACE, GCtrace -| -|// Stack layout while in interpreter. Must match with lj_frame.h. -|//----------------------------------------------------------------------- -|.if not X64 // x86 stack layout. -| -|.define CFRAME_SPACE, aword*7 // Delta for esp (see <--). -|.macro saveregs_ -| push edi; push esi; push ebx -| sub esp, CFRAME_SPACE -|.endmacro -|.macro saveregs -| push ebp; saveregs_ -|.endmacro -|.macro restoreregs -| add esp, CFRAME_SPACE -| pop ebx; pop esi; pop edi; pop ebp -|.endmacro -| -|.define SAVE_ERRF, aword [esp+aword*15] // vm_pcall/vm_cpcall only. -|.define SAVE_NRES, aword [esp+aword*14] -|.define SAVE_CFRAME, aword [esp+aword*13] -|.define SAVE_L, aword [esp+aword*12] -|//----- 16 byte aligned, ^^^ arguments from C caller -|.define SAVE_RET, aword [esp+aword*11] //<-- esp entering interpreter. -|.define SAVE_R4, aword [esp+aword*10] -|.define SAVE_R3, aword [esp+aword*9] -|.define SAVE_R2, aword [esp+aword*8] -|//----- 16 byte aligned -|.define SAVE_R1, aword [esp+aword*7] //<-- esp after register saves. -|.define SAVE_PC, aword [esp+aword*6] -|.define TMP2, aword [esp+aword*5] -|.define TMP1, aword [esp+aword*4] -|//----- 16 byte aligned -|.define ARG4, aword [esp+aword*3] -|.define ARG3, aword [esp+aword*2] -|.define ARG2, aword [esp+aword*1] -|.define ARG1, aword [esp] //<-- esp while in interpreter. -|//----- 16 byte aligned, ^^^ arguments for C callee -| -|// FPARGx overlaps ARGx and ARG(x+1) on x86. -|.define FPARG3, qword [esp+qword*1] -|.define FPARG1, qword [esp] -|// TMPQ overlaps TMP1/TMP2. ARG5/MULTRES overlap TMP1/TMP2 (and TMPQ). -|.define TMPQ, qword [esp+aword*4] -|.define TMP3, ARG4 -|.define ARG5, TMP1 -|.define TMPa, TMP1 -|.define MULTRES, TMP2 -| -|// Arguments for vm_call and vm_pcall. -|.define INARG_BASE, SAVE_CFRAME // Overwritten by SAVE_CFRAME! -| -|// Arguments for vm_cpcall. -|.define INARG_CP_CALL, SAVE_ERRF -|.define INARG_CP_UD, SAVE_NRES -|.define INARG_CP_FUNC, SAVE_CFRAME -| -|//----------------------------------------------------------------------- -|.elif X64WIN // x64/Windows stack layout -| -|.define CFRAME_SPACE, aword*5 // Delta for rsp (see <--). -|.macro saveregs_ -| push rdi; push rsi; push rbx -| sub rsp, CFRAME_SPACE -|.endmacro -|.macro saveregs -| push rbp; saveregs_ -|.endmacro -|.macro restoreregs -| add rsp, CFRAME_SPACE -| pop rbx; pop rsi; pop rdi; pop rbp -|.endmacro -| -|.define SAVE_CFRAME, aword [rsp+aword*13] -|.define SAVE_PC, dword [rsp+dword*25] -|.define SAVE_L, dword [rsp+dword*24] -|.define SAVE_ERRF, dword [rsp+dword*23] -|.define SAVE_NRES, dword [rsp+dword*22] -|.define TMP2, dword [rsp+dword*21] -|.define TMP1, dword [rsp+dword*20] -|//----- 16 byte aligned, ^^^ 32 byte register save area, owned by interpreter -|.define SAVE_RET, aword [rsp+aword*9] //<-- rsp entering interpreter. -|.define SAVE_R4, aword [rsp+aword*8] -|.define SAVE_R3, aword [rsp+aword*7] -|.define SAVE_R2, aword [rsp+aword*6] -|.define SAVE_R1, aword [rsp+aword*5] //<-- rsp after register saves. -|.define ARG5, aword [rsp+aword*4] -|.define CSAVE_4, aword [rsp+aword*3] -|.define CSAVE_3, aword [rsp+aword*2] -|.define CSAVE_2, aword [rsp+aword*1] -|.define CSAVE_1, aword [rsp] //<-- rsp while in interpreter. -|//----- 16 byte aligned, ^^^ 32 byte register save area, owned by callee -| -|// TMPQ overlaps TMP1/TMP2. MULTRES overlaps TMP2 (and TMPQ). -|.define TMPQ, qword [rsp+aword*10] -|.define MULTRES, TMP2 -|.define TMPa, ARG5 -|.define ARG5d, dword [rsp+aword*4] -|.define TMP3, ARG5d -| -|//----------------------------------------------------------------------- -|.else // x64/POSIX stack layout -| -|.define CFRAME_SPACE, aword*5 // Delta for rsp (see <--). -|.macro saveregs_ -| push rbx; push r15; push r14 -| sub rsp, CFRAME_SPACE -|.endmacro -|.macro saveregs -| push rbp; saveregs_ -|.endmacro -|.macro restoreregs -| add rsp, CFRAME_SPACE -| pop r14; pop r15; pop rbx; pop rbp -|.endmacro -| -|//----- 16 byte aligned, -|.define SAVE_RET, aword [rsp+aword*9] //<-- rsp entering interpreter. -|.define SAVE_R4, aword [rsp+aword*8] -|.define SAVE_R3, aword [rsp+aword*7] -|.define SAVE_R2, aword [rsp+aword*6] -|.define SAVE_R1, aword [rsp+aword*5] //<-- rsp after register saves. -|.define SAVE_CFRAME, aword [rsp+aword*4] -|.define SAVE_PC, dword [rsp+dword*7] -|.define SAVE_L, dword [rsp+dword*6] -|.define SAVE_ERRF, dword [rsp+dword*5] -|.define SAVE_NRES, dword [rsp+dword*4] -|.define TMPa, aword [rsp+aword*1] -|.define TMP2, dword [rsp+dword*1] -|.define TMP1, dword [rsp] //<-- rsp while in interpreter. -|//----- 16 byte aligned -| -|// TMPQ overlaps TMP1/TMP2. MULTRES overlaps TMP2 (and TMPQ). -|.define TMPQ, qword [rsp] -|.define TMP3, dword [rsp+aword*1] -|.define MULTRES, TMP2 -| -|.endif -| -|//----------------------------------------------------------------------- -| -|// Instruction headers. -|.macro ins_A; .endmacro -|.macro ins_AD; .endmacro -|.macro ins_AJ; .endmacro -|.macro ins_ABC; movzx RB, RCH; movzx RC, RCL; .endmacro -|.macro ins_AB_; movzx RB, RCH; .endmacro -|.macro ins_A_C; movzx RC, RCL; .endmacro -|.macro ins_AND; not RDa; .endmacro -| -|// Instruction decode+dispatch. Carefully tuned (nope, lodsd is not faster). -|.macro ins_NEXT -| mov RC, [PC] -| movzx RA, RCH -| movzx OP, RCL -| add PC, 4 -| shr RC, 16 -|.if X64 -| jmp aword [DISPATCH+OP*8] -|.else -| jmp aword [DISPATCH+OP*4] -|.endif -|.endmacro -| -|// Instruction footer. -|.if 1 -| // Replicated dispatch. Less unpredictable branches, but higher I-Cache use. -| .define ins_next, ins_NEXT -| .define ins_next_, ins_NEXT -|.else -| // Common dispatch. Lower I-Cache use, only one (very) unpredictable branch. -| // Affects only certain kinds of benchmarks (and only with -j off). -| // Around 10%-30% slower on Core2, a lot more slower on P4. -| .macro ins_next -| jmp ->ins_next -| .endmacro -| .macro ins_next_ -| ->ins_next: -| ins_NEXT -| .endmacro -|.endif -| -|// Call decode and dispatch. -|.macro ins_callt -| // BASE = new base, RB = LFUNC, RD = nargs+1, [BASE-4] = PC -| mov PC, LFUNC:RB->pc -| mov RA, [PC] -| movzx OP, RAL -| movzx RA, RAH -| add PC, 4 -|.if X64 -| jmp aword [DISPATCH+OP*8] -|.else -| jmp aword [DISPATCH+OP*4] -|.endif -|.endmacro -| -|.macro ins_call -| // BASE = new base, RB = LFUNC, RD = nargs+1 -| mov [BASE-4], PC -| ins_callt -|.endmacro -| -|//----------------------------------------------------------------------- -| -|// Macros to test operand types. -|.macro checktp, reg, tp; cmp dword [BASE+reg*8+4], tp; .endmacro -|.macro checknum, reg, target; checktp reg, LJ_TISNUM; jae target; .endmacro -|.macro checkint, reg, target; checktp reg, LJ_TISNUM; jne target; .endmacro -|.macro checkstr, reg, target; checktp reg, LJ_TSTR; jne target; .endmacro -|.macro checktab, reg, target; checktp reg, LJ_TTAB; jne target; .endmacro -| -|// These operands must be used with movzx. -|.define PC_OP, byte [PC-4] -|.define PC_RA, byte [PC-3] -|.define PC_RB, byte [PC-1] -|.define PC_RC, byte [PC-2] -|.define PC_RD, word [PC-2] -| -|.macro branchPC, reg -| lea PC, [PC+reg*4-BCBIAS_J*4] -|.endmacro -| -|// Assumes DISPATCH is relative to GL. -#define DISPATCH_GL(field) (GG_DISP2G + (int)offsetof(global_State, field)) -#define DISPATCH_J(field) (GG_DISP2J + (int)offsetof(jit_State, field)) -| -#define PC2PROTO(field) ((int)offsetof(GCproto, field)-(int)sizeof(GCproto)) -| -|// Decrement hashed hotcount and trigger trace recorder if zero. -|.macro hotloop, reg -| mov reg, PC -| shr reg, 1 -| and reg, HOTCOUNT_PCMASK -| sub word [DISPATCH+reg+GG_DISP2HOT], HOTCOUNT_LOOP -| jb ->vm_hotloop -|.endmacro -| -|.macro hotcall, reg -| mov reg, PC -| shr reg, 1 -| and reg, HOTCOUNT_PCMASK -| sub word [DISPATCH+reg+GG_DISP2HOT], HOTCOUNT_CALL -| jb ->vm_hotcall -|.endmacro -| -|// Set current VM state. -|.macro set_vmstate, st -| mov dword [DISPATCH+DISPATCH_GL(vmstate)], ~LJ_VMST_..st -|.endmacro -| -|// x87 compares. -|.macro fcomparepp // Compare and pop st0 >< st1. -| fucomip st1 -| fpop -|.endmacro -| -|.macro fdup; fld st0; .endmacro -|.macro fpop1; fstp st1; .endmacro -| -|// Synthesize SSE FP constants. -|.macro sseconst_abs, reg, tmp // Synthesize abs mask. -|.if X64 -| mov64 tmp, U64x(7fffffff,ffffffff); movd reg, tmp -|.else -| pxor reg, reg; pcmpeqd reg, reg; psrlq reg, 1 -|.endif -|.endmacro -| -|.macro sseconst_hi, reg, tmp, val // Synthesize hi-32 bit const. -|.if X64 -| mov64 tmp, U64x(val,00000000); movd reg, tmp -|.else -| mov tmp, 0x .. val; movd reg, tmp; pshufd reg, reg, 0x51 -|.endif -|.endmacro -| -|.macro sseconst_sign, reg, tmp // Synthesize sign mask. -| sseconst_hi reg, tmp, 80000000 -|.endmacro -|.macro sseconst_1, reg, tmp // Synthesize 1.0. -| sseconst_hi reg, tmp, 3ff00000 -|.endmacro -|.macro sseconst_m1, reg, tmp // Synthesize -1.0. -| sseconst_hi reg, tmp, bff00000 -|.endmacro -|.macro sseconst_2p52, reg, tmp // Synthesize 2^52. -| sseconst_hi reg, tmp, 43300000 -|.endmacro -|.macro sseconst_tobit, reg, tmp // Synthesize 2^52 + 2^51. -| sseconst_hi reg, tmp, 43380000 -|.endmacro -| -|// Move table write barrier back. Overwrites reg. -|.macro barrierback, tab, reg -| and byte tab->marked, (uint8_t)~LJ_GC_BLACK // black2gray(tab) -| mov reg, [DISPATCH+DISPATCH_GL(gc.grayagain)] -| mov [DISPATCH+DISPATCH_GL(gc.grayagain)], tab -| mov tab->gclist, reg -|.endmacro -| -|//----------------------------------------------------------------------- - -/* Generate subroutines used by opcodes and other parts of the VM. */ -/* The .code_sub section should be last to help static branch prediction. */ -static void build_subroutines(BuildCtx *ctx) -{ - |.code_sub - | - |//----------------------------------------------------------------------- - |//-- Return handling ---------------------------------------------------- - |//----------------------------------------------------------------------- - | - |->vm_returnp: - | test PC, FRAME_P - | jz ->cont_dispatch - | - | // Return from pcall or xpcall fast func. - | and PC, -8 - | sub BASE, PC // Restore caller base. - | lea RAa, [RA+PC-8] // Rebase RA and prepend one result. - | mov PC, [BASE-4] // Fetch PC of previous frame. - | // Prepending may overwrite the pcall frame, so do it at the end. - | mov dword [BASE+RA+4], LJ_TTRUE // Prepend true to results. - | - |->vm_returnc: - | add RD, 1 // RD = nresults+1 - | jz ->vm_unwind_yield - | mov MULTRES, RD - | test PC, FRAME_TYPE - | jz ->BC_RET_Z // Handle regular return to Lua. - | - |->vm_return: - | // BASE = base, RA = resultofs, RD = nresults+1 (= MULTRES), PC = return - | xor PC, FRAME_C - | test PC, FRAME_TYPE - | jnz ->vm_returnp - | - | // Return to C. - | set_vmstate C - | and PC, -8 - | sub PC, BASE - | neg PC // Previous base = BASE - delta. - | - | sub RD, 1 - | jz >2 - |1: // Move results down. - |.if X64 - | mov RBa, [BASE+RA] - | mov [BASE-8], RBa - |.else - | mov RB, [BASE+RA] - | mov [BASE-8], RB - | mov RB, [BASE+RA+4] - | mov [BASE-4], RB - |.endif - | add BASE, 8 - | sub RD, 1 - | jnz <1 - |2: - | mov L:RB, SAVE_L - | mov L:RB->base, PC - |3: - | mov RD, MULTRES - | mov RA, SAVE_NRES // RA = wanted nresults+1 - |4: - | cmp RA, RD - | jne >6 // More/less results wanted? - |5: - | sub BASE, 8 - | mov L:RB->top, BASE - | - |->vm_leave_cp: - | mov RAa, SAVE_CFRAME // Restore previous C frame. - | mov L:RB->cframe, RAa - | xor eax, eax // Ok return status for vm_pcall. - | - |->vm_leave_unw: - | restoreregs - | ret - | - |6: - | jb >7 // Less results wanted? - | // More results wanted. Check stack size and fill up results with nil. - | cmp BASE, L:RB->maxstack - | ja >8 - | mov dword [BASE-4], LJ_TNIL - | add BASE, 8 - | add RD, 1 - | jmp <4 - | - |7: // Less results wanted. - | test RA, RA - | jz <5 // But check for LUA_MULTRET+1. - | sub RA, RD // Negative result! - | lea BASE, [BASE+RA*8] // Correct top. - | jmp <5 - | - |8: // Corner case: need to grow stack for filling up results. - | // This can happen if: - | // - A C function grows the stack (a lot). - | // - The GC shrinks the stack in between. - | // - A return back from a lua_call() with (high) nresults adjustment. - | mov L:RB->top, BASE // Save current top held in BASE (yes). - | mov MULTRES, RD // Need to fill only remainder with nil. - | mov FCARG2, RA - | mov FCARG1, L:RB - | call extern lj_state_growstack@8 // (lua_State *L, int n) - | mov BASE, L:RB->top // Need the (realloced) L->top in BASE. - | jmp <3 - | - |->vm_unwind_yield: - | mov al, LUA_YIELD - | jmp ->vm_unwind_c_eh - | - |->vm_unwind_c@8: // Unwind C stack, return from vm_pcall. - | // (void *cframe, int errcode) - |.if X64 - | mov eax, CARG2d // Error return status for vm_pcall. - | mov rsp, CARG1 - |.else - | mov eax, FCARG2 // Error return status for vm_pcall. - | mov esp, FCARG1 - |.endif - |->vm_unwind_c_eh: // Landing pad for external unwinder. - | mov L:RB, SAVE_L - | mov GL:RB, L:RB->glref - | mov dword GL:RB->vmstate, ~LJ_VMST_C - | jmp ->vm_leave_unw - | - |->vm_unwind_rethrow: - |.if X64 and not X64WIN - | mov FCARG1, SAVE_L - | mov FCARG2, eax - | restoreregs - | jmp extern lj_err_throw@8 // (lua_State *L, int errcode) - |.endif - | - |->vm_unwind_ff@4: // Unwind C stack, return from ff pcall. - | // (void *cframe) - |.if X64 - | and CARG1, CFRAME_RAWMASK - | mov rsp, CARG1 - |.else - | and FCARG1, CFRAME_RAWMASK - | mov esp, FCARG1 - |.endif - |->vm_unwind_ff_eh: // Landing pad for external unwinder. - | mov L:RB, SAVE_L - | mov RAa, -8 // Results start at BASE+RA = BASE-8. - | mov RD, 1+1 // Really 1+2 results, incr. later. - | mov BASE, L:RB->base - | mov DISPATCH, L:RB->glref // Setup pointer to dispatch table. - | add DISPATCH, GG_G2DISP - | mov PC, [BASE-4] // Fetch PC of previous frame. - | mov dword [BASE-4], LJ_TFALSE // Prepend false to error message. - | set_vmstate INTERP - | jmp ->vm_returnc // Increments RD/MULTRES and returns. - | - |//----------------------------------------------------------------------- - |//-- Grow stack for calls ----------------------------------------------- - |//----------------------------------------------------------------------- - | - |->vm_growstack_c: // Grow stack for C function. - | mov FCARG2, LUA_MINSTACK - | jmp >2 - | - |->vm_growstack_v: // Grow stack for vararg Lua function. - | sub RD, 8 - | jmp >1 - | - |->vm_growstack_f: // Grow stack for fixarg Lua function. - | // BASE = new base, RD = nargs+1, RB = L, PC = first PC - | lea RD, [BASE+NARGS:RD*8-8] - |1: - | movzx RA, byte [PC-4+PC2PROTO(framesize)] - | add PC, 4 // Must point after first instruction. - | mov L:RB->base, BASE - | mov L:RB->top, RD - | mov SAVE_PC, PC - | mov FCARG2, RA - |2: - | // RB = L, L->base = new base, L->top = top - | mov FCARG1, L:RB - | call extern lj_state_growstack@8 // (lua_State *L, int n) - | mov BASE, L:RB->base - | mov RD, L:RB->top - | mov LFUNC:RB, [BASE-8] - | sub RD, BASE - | shr RD, 3 - | add NARGS:RD, 1 - | // BASE = new base, RB = LFUNC, RD = nargs+1 - | ins_callt // Just retry the call. - | - |//----------------------------------------------------------------------- - |//-- Entry points into the assembler VM --------------------------------- - |//----------------------------------------------------------------------- - | - |->vm_resume: // Setup C frame and resume thread. - | // (lua_State *L, TValue *base, int nres1 = 0, ptrdiff_t ef = 0) - | saveregs - |.if X64 - | mov L:RB, CARG1d // Caveat: CARG1d may be RA. - | mov SAVE_L, CARG1d - | mov RA, CARG2d - |.else - | mov L:RB, SAVE_L - | mov RA, INARG_BASE // Caveat: overlaps SAVE_CFRAME! - |.endif - | mov PC, FRAME_CP - | xor RD, RD - | lea KBASEa, [esp+CFRAME_RESUME] - | mov DISPATCH, L:RB->glref // Setup pointer to dispatch table. - | add DISPATCH, GG_G2DISP - | mov L:RB->cframe, KBASEa - | mov SAVE_PC, RD // Any value outside of bytecode is ok. - | mov SAVE_CFRAME, RDa - |.if X64 - | mov SAVE_NRES, RD - | mov SAVE_ERRF, RD - |.endif - | cmp byte L:RB->status, RDL - | je >3 // Initial resume (like a call). - | - | // Resume after yield (like a return). - | set_vmstate INTERP - | mov byte L:RB->status, RDL - | mov BASE, L:RB->base - | mov RD, L:RB->top - | sub RD, RA - | shr RD, 3 - | add RD, 1 // RD = nresults+1 - | sub RA, BASE // RA = resultofs - | mov PC, [BASE-4] - | mov MULTRES, RD - | test PC, FRAME_TYPE - | jz ->BC_RET_Z - | jmp ->vm_return - | - |->vm_pcall: // Setup protected C frame and enter VM. - | // (lua_State *L, TValue *base, int nres1, ptrdiff_t ef) - | saveregs - | mov PC, FRAME_CP - |.if X64 - | mov SAVE_ERRF, CARG4d - |.endif - | jmp >1 - | - |->vm_call: // Setup C frame and enter VM. - | // (lua_State *L, TValue *base, int nres1) - | saveregs - | mov PC, FRAME_C - | - |1: // Entry point for vm_pcall above (PC = ftype). - |.if X64 - | mov SAVE_NRES, CARG3d - | mov L:RB, CARG1d // Caveat: CARG1d may be RA. - | mov SAVE_L, CARG1d - | mov RA, CARG2d - |.else - | mov L:RB, SAVE_L - | mov RA, INARG_BASE // Caveat: overlaps SAVE_CFRAME! - |.endif - | - | mov KBASEa, L:RB->cframe // Add our C frame to cframe chain. - | mov SAVE_CFRAME, KBASEa - | mov SAVE_PC, L:RB // Any value outside of bytecode is ok. - |.if X64 - | mov L:RB->cframe, rsp - |.else - | mov L:RB->cframe, esp - |.endif - | - |2: // Entry point for vm_cpcall below (RA = base, RB = L, PC = ftype). - | mov DISPATCH, L:RB->glref // Setup pointer to dispatch table. - | add DISPATCH, GG_G2DISP - | - |3: // Entry point for vm_resume above (RA = base, RB = L, PC = ftype). - | set_vmstate INTERP - | mov BASE, L:RB->base // BASE = old base (used in vmeta_call). - | add PC, RA - | sub PC, BASE // PC = frame delta + frame type - | - | mov RD, L:RB->top - | sub RD, RA - | shr NARGS:RD, 3 - | add NARGS:RD, 1 // RD = nargs+1 - | - |->vm_call_dispatch: - | mov LFUNC:RB, [RA-8] - | cmp dword [RA-4], LJ_TFUNC - | jne ->vmeta_call // Ensure KBASE defined and != BASE. - | - |->vm_call_dispatch_f: - | mov BASE, RA - | ins_call - | // BASE = new base, RB = func, RD = nargs+1, PC = caller PC - | - |->vm_cpcall: // Setup protected C frame, call C. - | // (lua_State *L, lua_CFunction func, void *ud, lua_CPFunction cp) - | saveregs - |.if X64 - | mov L:RB, CARG1d // Caveat: CARG1d may be RA. - | mov SAVE_L, CARG1d - |.else - | mov L:RB, SAVE_L - | // Caveat: INARG_CP_* and SAVE_CFRAME/SAVE_NRES/SAVE_ERRF overlap! - | mov RC, INARG_CP_UD // Get args before they are overwritten. - | mov RA, INARG_CP_FUNC - | mov BASE, INARG_CP_CALL - |.endif - | mov SAVE_PC, L:RB // Any value outside of bytecode is ok. - | - | mov KBASE, L:RB->stack // Compute -savestack(L, L->top). - | sub KBASE, L:RB->top - | mov SAVE_ERRF, 0 // No error function. - | mov SAVE_NRES, KBASE // Neg. delta means cframe w/o frame. - | // Handler may change cframe_nres(L->cframe) or cframe_errfunc(L->cframe). - | - |.if X64 - | mov KBASEa, L:RB->cframe // Add our C frame to cframe chain. - | mov SAVE_CFRAME, KBASEa - | mov L:RB->cframe, rsp - | - | call CARG4 // (lua_State *L, lua_CFunction func, void *ud) - |.else - | mov ARG3, RC // Have to copy args downwards. - | mov ARG2, RA - | mov ARG1, L:RB - | - | mov KBASE, L:RB->cframe // Add our C frame to cframe chain. - | mov SAVE_CFRAME, KBASE - | mov L:RB->cframe, esp - | - | call BASE // (lua_State *L, lua_CFunction func, void *ud) - |.endif - | // TValue * (new base) or NULL returned in eax (RC). - | test RC, RC - | jz ->vm_leave_cp // No base? Just remove C frame. - | mov RA, RC - | mov PC, FRAME_CP - | jmp <2 // Else continue with the call. - | - |//----------------------------------------------------------------------- - |//-- Metamethod handling ------------------------------------------------ - |//----------------------------------------------------------------------- - | - |//-- Continuation dispatch ---------------------------------------------- - | - |->cont_dispatch: - | // BASE = meta base, RA = resultofs, RD = nresults+1 (also in MULTRES) - | add RA, BASE - | and PC, -8 - | mov RB, BASE - | sub BASE, PC // Restore caller BASE. - | mov dword [RA+RD*8-4], LJ_TNIL // Ensure one valid arg. - | mov RC, RA // ... in [RC] - | mov PC, [RB-12] // Restore PC from [cont|PC]. - |.if X64 - | movsxd RAa, dword [RB-16] // May be negative on WIN64 with debug. - |.if FFI - | cmp RA, 1 - | jbe >1 - |.endif - | lea KBASEa, qword [=>0] - | add RAa, KBASEa - |.else - | mov RA, dword [RB-16] - |.if FFI - | cmp RA, 1 - | jbe >1 - |.endif - |.endif - | mov LFUNC:KBASE, [BASE-8] - | mov KBASE, LFUNC:KBASE->pc - | mov KBASE, [KBASE+PC2PROTO(k)] - | // BASE = base, RC = result, RB = meta base - | jmp RAa // Jump to continuation. - | - |.if FFI - |1: - | je ->cont_ffi_callback // cont = 1: return from FFI callback. - | // cont = 0: Tail call from C function. - | sub RB, BASE - | shr RB, 3 - | lea RD, [RB-1] - | jmp ->vm_call_tail - |.endif - | - |->cont_cat: // BASE = base, RC = result, RB = mbase - | movzx RA, PC_RB - | sub RB, 16 - | lea RA, [BASE+RA*8] - | sub RA, RB - | je ->cont_ra - | neg RA - | shr RA, 3 - |.if X64WIN - | mov CARG3d, RA - | mov L:CARG1d, SAVE_L - | mov L:CARG1d->base, BASE - | mov RCa, [RC] - | mov [RB], RCa - | mov CARG2d, RB - |.elif X64 - | mov L:CARG1d, SAVE_L - | mov L:CARG1d->base, BASE - | mov CARG3d, RA - | mov RAa, [RC] - | mov [RB], RAa - | mov CARG2d, RB - |.else - | mov ARG3, RA - | mov RA, [RC+4] - | mov RC, [RC] - | mov [RB+4], RA - | mov [RB], RC - | mov ARG2, RB - |.endif - | jmp ->BC_CAT_Z - | - |//-- Table indexing metamethods ----------------------------------------- - | - |->vmeta_tgets: - | mov TMP1, RC // RC = GCstr * - | mov TMP2, LJ_TSTR - | lea RCa, TMP1 // Store temp. TValue in TMP1/TMP2. - | cmp PC_OP, BC_GGET - | jne >1 - | lea RA, [DISPATCH+DISPATCH_GL(tmptv)] // Store fn->l.env in g->tmptv. - | mov [RA], TAB:RB // RB = GCtab * - | mov dword [RA+4], LJ_TTAB - | mov RB, RA - | jmp >2 - | - |->vmeta_tgetb: - | movzx RC, PC_RC - |.if DUALNUM - | mov TMP2, LJ_TISNUM - | mov TMP1, RC - |.elif SSE - | cvtsi2sd xmm0, RC - | movsd TMPQ, xmm0 - |.else - | mov ARG4, RC - | fild ARG4 - | fstp TMPQ - |.endif - | lea RCa, TMPQ // Store temp. TValue in TMPQ. - | jmp >1 - | - |->vmeta_tgetv: - | movzx RC, PC_RC // Reload TValue *k from RC. - | lea RC, [BASE+RC*8] - |1: - | movzx RB, PC_RB // Reload TValue *t from RB. - | lea RB, [BASE+RB*8] - |2: - |.if X64 - | mov L:CARG1d, SAVE_L - | mov L:CARG1d->base, BASE // Caveat: CARG2d/CARG3d may be BASE. - | mov CARG2d, RB - | mov CARG3, RCa // May be 64 bit ptr to stack. - | mov L:RB, L:CARG1d - |.else - | mov ARG2, RB - | mov L:RB, SAVE_L - | mov ARG3, RC - | mov ARG1, L:RB - | mov L:RB->base, BASE - |.endif - | mov SAVE_PC, PC - | call extern lj_meta_tget // (lua_State *L, TValue *o, TValue *k) - | // TValue * (finished) or NULL (metamethod) returned in eax (RC). - | mov BASE, L:RB->base - | test RC, RC - | jz >3 - |->cont_ra: // BASE = base, RC = result - | movzx RA, PC_RA - |.if X64 - | mov RBa, [RC] - | mov [BASE+RA*8], RBa - |.else - | mov RB, [RC+4] - | mov RC, [RC] - | mov [BASE+RA*8+4], RB - | mov [BASE+RA*8], RC - |.endif - | ins_next - | - |3: // Call __index metamethod. - | // BASE = base, L->top = new base, stack = cont/func/t/k - | mov RA, L:RB->top - | mov [RA-12], PC // [cont|PC] - | lea PC, [RA+FRAME_CONT] - | sub PC, BASE - | mov LFUNC:RB, [RA-8] // Guaranteed to be a function here. - | mov NARGS:RD, 2+1 // 2 args for func(t, k). - | jmp ->vm_call_dispatch_f - | - |//----------------------------------------------------------------------- - | - |->vmeta_tsets: - | mov TMP1, RC // RC = GCstr * - | mov TMP2, LJ_TSTR - | lea RCa, TMP1 // Store temp. TValue in TMP1/TMP2. - | cmp PC_OP, BC_GSET - | jne >1 - | lea RA, [DISPATCH+DISPATCH_GL(tmptv)] // Store fn->l.env in g->tmptv. - | mov [RA], TAB:RB // RB = GCtab * - | mov dword [RA+4], LJ_TTAB - | mov RB, RA - | jmp >2 - | - |->vmeta_tsetb: - | movzx RC, PC_RC - |.if DUALNUM - | mov TMP2, LJ_TISNUM - | mov TMP1, RC - |.elif SSE - | cvtsi2sd xmm0, RC - | movsd TMPQ, xmm0 - |.else - | mov ARG4, RC - | fild ARG4 - | fstp TMPQ - |.endif - | lea RCa, TMPQ // Store temp. TValue in TMPQ. - | jmp >1 - | - |->vmeta_tsetv: - | movzx RC, PC_RC // Reload TValue *k from RC. - | lea RC, [BASE+RC*8] - |1: - | movzx RB, PC_RB // Reload TValue *t from RB. - | lea RB, [BASE+RB*8] - |2: - |.if X64 - | mov L:CARG1d, SAVE_L - | mov L:CARG1d->base, BASE // Caveat: CARG2d/CARG3d may be BASE. - | mov CARG2d, RB - | mov CARG3, RCa // May be 64 bit ptr to stack. - | mov L:RB, L:CARG1d - |.else - | mov ARG2, RB - | mov L:RB, SAVE_L - | mov ARG3, RC - | mov ARG1, L:RB - | mov L:RB->base, BASE - |.endif - | mov SAVE_PC, PC - | call extern lj_meta_tset // (lua_State *L, TValue *o, TValue *k) - | // TValue * (finished) or NULL (metamethod) returned in eax (RC). - | mov BASE, L:RB->base - | test RC, RC - | jz >3 - | // NOBARRIER: lj_meta_tset ensures the table is not black. - | movzx RA, PC_RA - |.if X64 - | mov RBa, [BASE+RA*8] - | mov [RC], RBa - |.else - | mov RB, [BASE+RA*8+4] - | mov RA, [BASE+RA*8] - | mov [RC+4], RB - | mov [RC], RA - |.endif - |->cont_nop: // BASE = base, (RC = result) - | ins_next - | - |3: // Call __newindex metamethod. - | // BASE = base, L->top = new base, stack = cont/func/t/k/(v) - | mov RA, L:RB->top - | mov [RA-12], PC // [cont|PC] - | movzx RC, PC_RA - | // Copy value to third argument. - |.if X64 - | mov RBa, [BASE+RC*8] - | mov [RA+16], RBa - |.else - | mov RB, [BASE+RC*8+4] - | mov RC, [BASE+RC*8] - | mov [RA+20], RB - | mov [RA+16], RC - |.endif - | lea PC, [RA+FRAME_CONT] - | sub PC, BASE - | mov LFUNC:RB, [RA-8] // Guaranteed to be a function here. - | mov NARGS:RD, 3+1 // 3 args for func(t, k, v). - | jmp ->vm_call_dispatch_f - | - |//-- Comparison metamethods --------------------------------------------- - | - |->vmeta_comp: - |.if X64 - | mov L:RB, SAVE_L - | mov L:RB->base, BASE // Caveat: CARG2d/CARG3d == BASE. - |.if X64WIN - | lea CARG3d, [BASE+RD*8] - | lea CARG2d, [BASE+RA*8] - |.else - | lea CARG2d, [BASE+RA*8] - | lea CARG3d, [BASE+RD*8] - |.endif - | mov CARG1d, L:RB // Caveat: CARG1d/CARG4d == RA. - | movzx CARG4d, PC_OP - |.else - | movzx RB, PC_OP - | lea RD, [BASE+RD*8] - | lea RA, [BASE+RA*8] - | mov ARG4, RB - | mov L:RB, SAVE_L - | mov ARG3, RD - | mov ARG2, RA - | mov ARG1, L:RB - | mov L:RB->base, BASE - |.endif - | mov SAVE_PC, PC - | call extern lj_meta_comp // (lua_State *L, TValue *o1, *o2, int op) - | // 0/1 or TValue * (metamethod) returned in eax (RC). - |3: - | mov BASE, L:RB->base - | cmp RC, 1 - | ja ->vmeta_binop - |4: - | lea PC, [PC+4] - | jb >6 - |5: - | movzx RD, PC_RD - | branchPC RD - |6: - | ins_next - | - |->cont_condt: // BASE = base, RC = result - | add PC, 4 - | cmp dword [RC+4], LJ_TISTRUECOND // Branch if result is true. - | jb <5 - | jmp <6 - | - |->cont_condf: // BASE = base, RC = result - | cmp dword [RC+4], LJ_TISTRUECOND // Branch if result is false. - | jmp <4 - | - |->vmeta_equal: - | sub PC, 4 - |.if X64WIN - | mov CARG3d, RD - | mov CARG4d, RB - | mov L:RB, SAVE_L - | mov L:RB->base, BASE // Caveat: CARG2d == BASE. - | mov CARG2d, RA - | mov CARG1d, L:RB // Caveat: CARG1d == RA. - |.elif X64 - | mov CARG2d, RA - | mov CARG4d, RB // Caveat: CARG4d == RA. - | mov L:RB, SAVE_L - | mov L:RB->base, BASE // Caveat: CARG3d == BASE. - | mov CARG3d, RD - | mov CARG1d, L:RB - |.else - | mov ARG4, RB - | mov L:RB, SAVE_L - | mov ARG3, RD - | mov ARG2, RA - | mov ARG1, L:RB - | mov L:RB->base, BASE - |.endif - | mov SAVE_PC, PC - | call extern lj_meta_equal // (lua_State *L, GCobj *o1, *o2, int ne) - | // 0/1 or TValue * (metamethod) returned in eax (RC). - | jmp <3 - | - |->vmeta_equal_cd: - |.if FFI - | sub PC, 4 - | mov L:RB, SAVE_L - | mov L:RB->base, BASE - | mov FCARG1, L:RB - | mov FCARG2, dword [PC-4] - | mov SAVE_PC, PC - | call extern lj_meta_equal_cd@8 // (lua_State *L, BCIns ins) - | // 0/1 or TValue * (metamethod) returned in eax (RC). - | jmp <3 - |.endif - | - |//-- Arithmetic metamethods --------------------------------------------- - | - |->vmeta_arith_vno: - |.if DUALNUM - | movzx RB, PC_RB - |.endif - |->vmeta_arith_vn: - | lea RC, [KBASE+RC*8] - | jmp >1 - | - |->vmeta_arith_nvo: - |.if DUALNUM - | movzx RC, PC_RC - |.endif - |->vmeta_arith_nv: - | lea RC, [KBASE+RC*8] - | lea RB, [BASE+RB*8] - | xchg RB, RC - | jmp >2 - | - |->vmeta_unm: - | lea RC, [BASE+RD*8] - | mov RB, RC - | jmp >2 - | - |->vmeta_arith_vvo: - |.if DUALNUM - | movzx RB, PC_RB - |.endif - |->vmeta_arith_vv: - | lea RC, [BASE+RC*8] - |1: - | lea RB, [BASE+RB*8] - |2: - | lea RA, [BASE+RA*8] - |.if X64WIN - | mov CARG3d, RB - | mov CARG4d, RC - | movzx RC, PC_OP - | mov ARG5d, RC - | mov L:RB, SAVE_L - | mov L:RB->base, BASE // Caveat: CARG2d == BASE. - | mov CARG2d, RA - | mov CARG1d, L:RB // Caveat: CARG1d == RA. - |.elif X64 - | movzx CARG5d, PC_OP - | mov CARG2d, RA - | mov CARG4d, RC // Caveat: CARG4d == RA. - | mov L:CARG1d, SAVE_L - | mov L:CARG1d->base, BASE // Caveat: CARG3d == BASE. - | mov CARG3d, RB - | mov L:RB, L:CARG1d - |.else - | mov ARG3, RB - | mov L:RB, SAVE_L - | mov ARG4, RC - | movzx RC, PC_OP - | mov ARG2, RA - | mov ARG5, RC - | mov ARG1, L:RB - | mov L:RB->base, BASE - |.endif - | mov SAVE_PC, PC - | call extern lj_meta_arith // (lua_State *L, TValue *ra,*rb,*rc, BCReg op) - | // NULL (finished) or TValue * (metamethod) returned in eax (RC). - | mov BASE, L:RB->base - | test RC, RC - | jz ->cont_nop - | - | // Call metamethod for binary op. - |->vmeta_binop: - | // BASE = base, RC = new base, stack = cont/func/o1/o2 - | mov RA, RC - | sub RC, BASE - | mov [RA-12], PC // [cont|PC] - | lea PC, [RC+FRAME_CONT] - | mov NARGS:RD, 2+1 // 2 args for func(o1, o2). - | jmp ->vm_call_dispatch - | - |->vmeta_len: - | mov L:RB, SAVE_L - | mov L:RB->base, BASE - | lea FCARG2, [BASE+RD*8] // Caveat: FCARG2 == BASE - | mov L:FCARG1, L:RB - | mov SAVE_PC, PC - | call extern lj_meta_len@8 // (lua_State *L, TValue *o) - | // NULL (retry) or TValue * (metamethod) returned in eax (RC). - | mov BASE, L:RB->base -#if LJ_52 - | test RC, RC - | jne ->vmeta_binop // Binop call for compatibility. - | movzx RD, PC_RD - | mov TAB:FCARG1, [BASE+RD*8] - | jmp ->BC_LEN_Z -#else - | jmp ->vmeta_binop // Binop call for compatibility. -#endif - | - |//-- Call metamethod ---------------------------------------------------- - | - |->vmeta_call_ra: - | lea RA, [BASE+RA*8+8] - |->vmeta_call: // Resolve and call __call metamethod. - | // BASE = old base, RA = new base, RC = nargs+1, PC = return - | mov TMP2, RA // Save RA, RC for us. - | mov TMP1, NARGS:RD - | sub RA, 8 - |.if X64 - | mov L:RB, SAVE_L - | mov L:RB->base, BASE // Caveat: CARG2d/CARG3d may be BASE. - | mov CARG2d, RA - | lea CARG3d, [RA+NARGS:RD*8] - | mov CARG1d, L:RB // Caveat: CARG1d may be RA. - |.else - | lea RC, [RA+NARGS:RD*8] - | mov L:RB, SAVE_L - | mov ARG2, RA - | mov ARG3, RC - | mov ARG1, L:RB - | mov L:RB->base, BASE // This is the callers base! - |.endif - | mov SAVE_PC, PC - | call extern lj_meta_call // (lua_State *L, TValue *func, TValue *top) - | mov BASE, L:RB->base - | mov RA, TMP2 - | mov NARGS:RD, TMP1 - | mov LFUNC:RB, [RA-8] - | add NARGS:RD, 1 - | // This is fragile. L->base must not move, KBASE must always be defined. - | cmp KBASE, BASE // Continue with CALLT if flag set. - | je ->BC_CALLT_Z - | mov BASE, RA - | ins_call // Otherwise call resolved metamethod. - | - |//-- Argument coercion for 'for' statement ------------------------------ - | - |->vmeta_for: - | mov L:RB, SAVE_L - | mov L:RB->base, BASE - | mov FCARG2, RA // Caveat: FCARG2 == BASE - | mov L:FCARG1, L:RB // Caveat: FCARG1 == RA - | mov SAVE_PC, PC - | call extern lj_meta_for@8 // (lua_State *L, TValue *base) - | mov BASE, L:RB->base - | mov RC, [PC-4] - | movzx RA, RCH - | movzx OP, RCL - | shr RC, 16 - |.if X64 - | jmp aword [DISPATCH+OP*8+GG_DISP2STATIC] // Retry FORI or JFORI. - |.else - | jmp aword [DISPATCH+OP*4+GG_DISP2STATIC] // Retry FORI or JFORI. - |.endif - | - |//----------------------------------------------------------------------- - |//-- Fast functions ----------------------------------------------------- - |//----------------------------------------------------------------------- - | - |.macro .ffunc, name - |->ff_ .. name: - |.endmacro - | - |.macro .ffunc_1, name - |->ff_ .. name: - | cmp NARGS:RD, 1+1; jb ->fff_fallback - |.endmacro - | - |.macro .ffunc_2, name - |->ff_ .. name: - | cmp NARGS:RD, 2+1; jb ->fff_fallback - |.endmacro - | - |.macro .ffunc_n, name - | .ffunc_1 name - | cmp dword [BASE+4], LJ_TISNUM; jae ->fff_fallback - | fld qword [BASE] - |.endmacro - | - |.macro .ffunc_n, name, op - | .ffunc_1 name - | cmp dword [BASE+4], LJ_TISNUM; jae ->fff_fallback - | op - | fld qword [BASE] - |.endmacro - | - |.macro .ffunc_nsse, name, op - | .ffunc_1 name - | cmp dword [BASE+4], LJ_TISNUM; jae ->fff_fallback - | op xmm0, qword [BASE] - |.endmacro - | - |.macro .ffunc_nsse, name - | .ffunc_nsse name, movsd - |.endmacro - | - |.macro .ffunc_nn, name - | .ffunc_2 name - | cmp dword [BASE+4], LJ_TISNUM; jae ->fff_fallback - | cmp dword [BASE+12], LJ_TISNUM; jae ->fff_fallback - | fld qword [BASE] - | fld qword [BASE+8] - |.endmacro - | - |.macro .ffunc_nnsse, name - | .ffunc_2 name - | cmp dword [BASE+4], LJ_TISNUM; jae ->fff_fallback - | cmp dword [BASE+12], LJ_TISNUM; jae ->fff_fallback - | movsd xmm0, qword [BASE] - | movsd xmm1, qword [BASE+8] - |.endmacro - | - |.macro .ffunc_nnr, name - | .ffunc_2 name - | cmp dword [BASE+4], LJ_TISNUM; jae ->fff_fallback - | cmp dword [BASE+12], LJ_TISNUM; jae ->fff_fallback - | fld qword [BASE+8] - | fld qword [BASE] - |.endmacro - | - |// Inlined GC threshold check. Caveat: uses label 1. - |.macro ffgccheck - | mov RB, [DISPATCH+DISPATCH_GL(gc.total)] - | cmp RB, [DISPATCH+DISPATCH_GL(gc.threshold)] - | jb >1 - | call ->fff_gcstep - |1: - |.endmacro - | - |//-- Base library: checks ----------------------------------------------- - | - |.ffunc_1 assert - | mov RB, [BASE+4] - | cmp RB, LJ_TISTRUECOND; jae ->fff_fallback - | mov PC, [BASE-4] - | mov MULTRES, RD - | mov [BASE-4], RB - | mov RB, [BASE] - | mov [BASE-8], RB - | sub RD, 2 - | jz >2 - | mov RA, BASE - |1: - | add RA, 8 - |.if X64 - | mov RBa, [RA] - | mov [RA-8], RBa - |.else - | mov RB, [RA+4] - | mov [RA-4], RB - | mov RB, [RA] - | mov [RA-8], RB - |.endif - | sub RD, 1 - | jnz <1 - |2: - | mov RD, MULTRES - | jmp ->fff_res_ - | - |.ffunc_1 type - | mov RB, [BASE+4] - |.if X64 - | mov RA, RB - | sar RA, 15 - | cmp RA, -2 - | je >3 - |.endif - | mov RC, ~LJ_TNUMX - | not RB - | cmp RC, RB - | cmova RC, RB - |2: - | mov CFUNC:RB, [BASE-8] - | mov STR:RC, [CFUNC:RB+RC*8+((char *)(&((GCfuncC *)0)->upvalue))] - | mov PC, [BASE-4] - | mov dword [BASE-4], LJ_TSTR - | mov [BASE-8], STR:RC - | jmp ->fff_res1 - |.if X64 - |3: - | mov RC, ~LJ_TLIGHTUD - | jmp <2 - |.endif - | - |//-- Base library: getters and setters --------------------------------- - | - |.ffunc_1 getmetatable - | mov RB, [BASE+4] - | mov PC, [BASE-4] - | cmp RB, LJ_TTAB; jne >6 - |1: // Field metatable must be at same offset for GCtab and GCudata! - | mov TAB:RB, [BASE] - | mov TAB:RB, TAB:RB->metatable - |2: - | test TAB:RB, TAB:RB - | mov dword [BASE-4], LJ_TNIL - | jz ->fff_res1 - | mov STR:RC, [DISPATCH+DISPATCH_GL(gcroot)+4*(GCROOT_MMNAME+MM_metatable)] - | mov dword [BASE-4], LJ_TTAB // Store metatable as default result. - | mov [BASE-8], TAB:RB - | mov RA, TAB:RB->hmask - | and RA, STR:RC->hash - | imul RA, #NODE - | add NODE:RA, TAB:RB->node - |3: // Rearranged logic, because we expect _not_ to find the key. - | cmp dword NODE:RA->key.it, LJ_TSTR - | jne >4 - | cmp dword NODE:RA->key.gcr, STR:RC - | je >5 - |4: - | mov NODE:RA, NODE:RA->next - | test NODE:RA, NODE:RA - | jnz <3 - | jmp ->fff_res1 // Not found, keep default result. - |5: - | mov RB, [RA+4] - | cmp RB, LJ_TNIL; je ->fff_res1 // Ditto for nil value. - | mov RC, [RA] - | mov [BASE-4], RB // Return value of mt.__metatable. - | mov [BASE-8], RC - | jmp ->fff_res1 - | - |6: - | cmp RB, LJ_TUDATA; je <1 - |.if X64 - | cmp RB, LJ_TNUMX; ja >8 - | cmp RB, LJ_TISNUM; jbe >7 - | mov RB, LJ_TLIGHTUD - | jmp >8 - |7: - |.else - | cmp RB, LJ_TISNUM; ja >8 - |.endif - | mov RB, LJ_TNUMX - |8: - | not RB - | mov TAB:RB, [DISPATCH+RB*4+DISPATCH_GL(gcroot[GCROOT_BASEMT])] - | jmp <2 - | - |.ffunc_2 setmetatable - | cmp dword [BASE+4], LJ_TTAB; jne ->fff_fallback - | // Fast path: no mt for table yet and not clearing the mt. - | mov TAB:RB, [BASE] - | cmp dword TAB:RB->metatable, 0; jne ->fff_fallback - | cmp dword [BASE+12], LJ_TTAB; jne ->fff_fallback - | mov TAB:RC, [BASE+8] - | mov TAB:RB->metatable, TAB:RC - | mov PC, [BASE-4] - | mov dword [BASE-4], LJ_TTAB // Return original table. - | mov [BASE-8], TAB:RB - | test byte TAB:RB->marked, LJ_GC_BLACK // isblack(table) - | jz >1 - | // Possible write barrier. Table is black, but skip iswhite(mt) check. - | barrierback TAB:RB, RC - |1: - | jmp ->fff_res1 - | - |.ffunc_2 rawget - | cmp dword [BASE+4], LJ_TTAB; jne ->fff_fallback - |.if X64WIN - | mov RB, BASE // Save BASE. - | lea CARG3d, [BASE+8] - | mov CARG2d, [BASE] // Caveat: CARG2d == BASE. - | mov CARG1d, SAVE_L - |.elif X64 - | mov RB, BASE // Save BASE. - | mov CARG2d, [BASE] - | lea CARG3d, [BASE+8] // Caveat: CARG3d == BASE. - | mov CARG1d, SAVE_L - |.else - | mov TAB:RD, [BASE] - | mov L:RB, SAVE_L - | mov ARG2, TAB:RD - | mov ARG1, L:RB - | mov RB, BASE // Save BASE. - | add BASE, 8 - | mov ARG3, BASE - |.endif - | call extern lj_tab_get // (lua_State *L, GCtab *t, cTValue *key) - | // cTValue * returned in eax (RD). - | mov BASE, RB // Restore BASE. - | // Copy table slot. - |.if X64 - | mov RBa, [RD] - | mov PC, [BASE-4] - | mov [BASE-8], RBa - |.else - | mov RB, [RD] - | mov RD, [RD+4] - | mov PC, [BASE-4] - | mov [BASE-8], RB - | mov [BASE-4], RD - |.endif - | jmp ->fff_res1 - | - |//-- Base library: conversions ------------------------------------------ - | - |.ffunc tonumber - | // Only handles the number case inline (without a base argument). - | cmp NARGS:RD, 1+1; jne ->fff_fallback // Exactly one argument. - | cmp dword [BASE+4], LJ_TISNUM - |.if DUALNUM - | jne >1 - | mov RB, dword [BASE]; jmp ->fff_resi - |1: - | ja ->fff_fallback - |.else - | jae ->fff_fallback - |.endif - |.if SSE - | movsd xmm0, qword [BASE]; jmp ->fff_resxmm0 - |.else - | fld qword [BASE]; jmp ->fff_resn - |.endif - | - |.ffunc_1 tostring - | // Only handles the string or number case inline. - | mov PC, [BASE-4] - | cmp dword [BASE+4], LJ_TSTR; jne >3 - | // A __tostring method in the string base metatable is ignored. - | mov STR:RD, [BASE] - |2: - | mov dword [BASE-4], LJ_TSTR - | mov [BASE-8], STR:RD - | jmp ->fff_res1 - |3: // Handle numbers inline, unless a number base metatable is present. - | cmp dword [BASE+4], LJ_TISNUM; ja ->fff_fallback - | cmp dword [DISPATCH+DISPATCH_GL(gcroot[GCROOT_BASEMT_NUM])], 0 - | jne ->fff_fallback - | ffgccheck // Caveat: uses label 1. - | mov L:RB, SAVE_L - | mov L:RB->base, BASE // Add frame since C call can throw. - | mov SAVE_PC, PC // Redundant (but a defined value). - |.if X64 and not X64WIN - | mov FCARG2, BASE // Otherwise: FCARG2 == BASE - |.endif - | mov L:FCARG1, L:RB - |.if DUALNUM - | call extern lj_str_fromnumber@8 // (lua_State *L, cTValue *o) - |.else - | call extern lj_str_fromnum@8 // (lua_State *L, lua_Number *np) - |.endif - | // GCstr returned in eax (RD). - | mov BASE, L:RB->base - | jmp <2 - | - |//-- Base library: iterators ------------------------------------------- - | - |.ffunc_1 next - | je >2 // Missing 2nd arg? - |1: - | cmp dword [BASE+4], LJ_TTAB; jne ->fff_fallback - | mov L:RB, SAVE_L - | mov L:RB->base, BASE // Add frame since C call can throw. - | mov L:RB->top, BASE // Dummy frame length is ok. - | mov PC, [BASE-4] - |.if X64WIN - | lea CARG3d, [BASE+8] - | mov CARG2d, [BASE] // Caveat: CARG2d == BASE. - | mov CARG1d, L:RB - |.elif X64 - | mov CARG2d, [BASE] - | lea CARG3d, [BASE+8] // Caveat: CARG3d == BASE. - | mov CARG1d, L:RB - |.else - | mov TAB:RD, [BASE] - | mov ARG2, TAB:RD - | mov ARG1, L:RB - | add BASE, 8 - | mov ARG3, BASE - |.endif - | mov SAVE_PC, PC // Needed for ITERN fallback. - | call extern lj_tab_next // (lua_State *L, GCtab *t, TValue *key) - | // Flag returned in eax (RD). - | mov BASE, L:RB->base - | test RD, RD; jz >3 // End of traversal? - | // Copy key and value to results. - |.if X64 - | mov RBa, [BASE+8] - | mov RDa, [BASE+16] - | mov [BASE-8], RBa - | mov [BASE], RDa - |.else - | mov RB, [BASE+8] - | mov RD, [BASE+12] - | mov [BASE-8], RB - | mov [BASE-4], RD - | mov RB, [BASE+16] - | mov RD, [BASE+20] - | mov [BASE], RB - | mov [BASE+4], RD - |.endif - |->fff_res2: - | mov RD, 1+2 - | jmp ->fff_res - |2: // Set missing 2nd arg to nil. - | mov dword [BASE+12], LJ_TNIL - | jmp <1 - |3: // End of traversal: return nil. - | mov dword [BASE-4], LJ_TNIL - | jmp ->fff_res1 - | - |.ffunc_1 pairs - | mov TAB:RB, [BASE] - | cmp dword [BASE+4], LJ_TTAB; jne ->fff_fallback -#if LJ_52 - | cmp dword TAB:RB->metatable, 0; jne ->fff_fallback -#endif - | mov CFUNC:RB, [BASE-8] - | mov CFUNC:RD, CFUNC:RB->upvalue[0] - | mov PC, [BASE-4] - | mov dword [BASE-4], LJ_TFUNC - | mov [BASE-8], CFUNC:RD - | mov dword [BASE+12], LJ_TNIL - | mov RD, 1+3 - | jmp ->fff_res - | - |.ffunc_2 ipairs_aux - | cmp dword [BASE+4], LJ_TTAB; jne ->fff_fallback - | cmp dword [BASE+12], LJ_TISNUM - |.if DUALNUM - | jne ->fff_fallback - |.else - | jae ->fff_fallback - |.endif - | mov PC, [BASE-4] - |.if DUALNUM - | mov RD, dword [BASE+8] - | add RD, 1 - | mov dword [BASE-4], LJ_TISNUM - | mov dword [BASE-8], RD - |.elif SSE - | movsd xmm0, qword [BASE+8] - | sseconst_1 xmm1, RBa - | addsd xmm0, xmm1 - | cvtsd2si RD, xmm0 - | movsd qword [BASE-8], xmm0 - |.else - | fld qword [BASE+8] - | fld1 - | faddp st1 - | fist ARG1 - | fstp qword [BASE-8] - | mov RD, ARG1 - |.endif - | mov TAB:RB, [BASE] - | cmp RD, TAB:RB->asize; jae >2 // Not in array part? - | shl RD, 3 - | add RD, TAB:RB->array - |1: - | cmp dword [RD+4], LJ_TNIL; je ->fff_res0 - | // Copy array slot. - |.if X64 - | mov RBa, [RD] - | mov [BASE], RBa - |.else - | mov RB, [RD] - | mov RD, [RD+4] - | mov [BASE], RB - | mov [BASE+4], RD - |.endif - | jmp ->fff_res2 - |2: // Check for empty hash part first. Otherwise call C function. - | cmp dword TAB:RB->hmask, 0; je ->fff_res0 - | mov FCARG1, TAB:RB - | mov RB, BASE // Save BASE. - | mov FCARG2, RD // Caveat: FCARG2 == BASE - | call extern lj_tab_getinth@8 // (GCtab *t, int32_t key) - | // cTValue * or NULL returned in eax (RD). - | mov BASE, RB - | test RD, RD - | jnz <1 - |->fff_res0: - | mov RD, 1+0 - | jmp ->fff_res - | - |.ffunc_1 ipairs - | mov TAB:RB, [BASE] - | cmp dword [BASE+4], LJ_TTAB; jne ->fff_fallback -#if LJ_52 - | cmp dword TAB:RB->metatable, 0; jne ->fff_fallback -#endif - | mov CFUNC:RB, [BASE-8] - | mov CFUNC:RD, CFUNC:RB->upvalue[0] - | mov PC, [BASE-4] - | mov dword [BASE-4], LJ_TFUNC - | mov [BASE-8], CFUNC:RD - |.if DUALNUM - | mov dword [BASE+12], LJ_TISNUM - | mov dword [BASE+8], 0 - |.elif SSE - | xorps xmm0, xmm0 - | movsd qword [BASE+8], xmm0 - |.else - | fldz - | fstp qword [BASE+8] - |.endif - | mov RD, 1+3 - | jmp ->fff_res - | - |//-- Base library: catch errors ---------------------------------------- - | - |.ffunc_1 pcall - | lea RA, [BASE+8] - | sub NARGS:RD, 1 - | mov PC, 8+FRAME_PCALL - |1: - | movzx RB, byte [DISPATCH+DISPATCH_GL(hookmask)] - | shr RB, HOOK_ACTIVE_SHIFT - | and RB, 1 - | add PC, RB // Remember active hook before pcall. - | jmp ->vm_call_dispatch - | - |.ffunc_2 xpcall - | cmp dword [BASE+12], LJ_TFUNC; jne ->fff_fallback - | mov RB, [BASE+4] // Swap function and traceback. - | mov [BASE+12], RB - | mov dword [BASE+4], LJ_TFUNC - | mov LFUNC:RB, [BASE] - | mov PC, [BASE+8] - | mov [BASE+8], LFUNC:RB - | mov [BASE], PC - | lea RA, [BASE+16] - | sub NARGS:RD, 2 - | mov PC, 16+FRAME_PCALL - | jmp <1 - | - |//-- Coroutine library -------------------------------------------------- - | - |.macro coroutine_resume_wrap, resume - |.if resume - |.ffunc_1 coroutine_resume - | mov L:RB, [BASE] - |.else - |.ffunc coroutine_wrap_aux - | mov CFUNC:RB, [BASE-8] - | mov L:RB, CFUNC:RB->upvalue[0].gcr - |.endif - | mov PC, [BASE-4] - | mov SAVE_PC, PC - |.if X64 - | mov TMP1, L:RB - |.else - | mov ARG1, L:RB - |.endif - |.if resume - | cmp dword [BASE+4], LJ_TTHREAD; jne ->fff_fallback - |.endif - | cmp aword L:RB->cframe, 0; jne ->fff_fallback - | cmp byte L:RB->status, LUA_YIELD; ja ->fff_fallback - | mov RA, L:RB->top - | je >1 // Status != LUA_YIELD (i.e. 0)? - | cmp RA, L:RB->base // Check for presence of initial func. - | je ->fff_fallback - |1: - |.if resume - | lea PC, [RA+NARGS:RD*8-16] // Check stack space (-1-thread). - |.else - | lea PC, [RA+NARGS:RD*8-8] // Check stack space (-1). - |.endif - | cmp PC, L:RB->maxstack; ja ->fff_fallback - | mov L:RB->top, PC - | - | mov L:RB, SAVE_L - | mov L:RB->base, BASE - |.if resume - | add BASE, 8 // Keep resumed thread in stack for GC. - |.endif - | mov L:RB->top, BASE - |.if resume - | lea RB, [BASE+NARGS:RD*8-24] // RB = end of source for stack move. - |.else - | lea RB, [BASE+NARGS:RD*8-16] // RB = end of source for stack move. - |.endif - | sub RBa, PCa // Relative to PC. - | - | cmp PC, RA - | je >3 - |2: // Move args to coroutine. - |.if X64 - | mov RCa, [PC+RB] - | mov [PC-8], RCa - |.else - | mov RC, [PC+RB+4] - | mov [PC-4], RC - | mov RC, [PC+RB] - | mov [PC-8], RC - |.endif - | sub PC, 8 - | cmp PC, RA - | jne <2 - |3: - |.if X64 - | mov CARG2d, RA - | mov CARG1d, TMP1 - |.else - | mov ARG2, RA - | xor RA, RA - | mov ARG4, RA - | mov ARG3, RA - |.endif - | call ->vm_resume // (lua_State *L, TValue *base, 0, 0) - | set_vmstate INTERP - | - | mov L:RB, SAVE_L - |.if X64 - | mov L:PC, TMP1 - |.else - | mov L:PC, ARG1 // The callee doesn't modify SAVE_L. - |.endif - | mov BASE, L:RB->base - | cmp eax, LUA_YIELD - | ja >8 - |4: - | mov RA, L:PC->base - | mov KBASE, L:PC->top - | mov L:PC->top, RA // Clear coroutine stack. - | mov PC, KBASE - | sub PC, RA - | je >6 // No results? - | lea RD, [BASE+PC] - | shr PC, 3 - | cmp RD, L:RB->maxstack - | ja >9 // Need to grow stack? - | - | mov RB, BASE - | sub RBa, RAa - |5: // Move results from coroutine. - |.if X64 - | mov RDa, [RA] - | mov [RA+RB], RDa - |.else - | mov RD, [RA] - | mov [RA+RB], RD - | mov RD, [RA+4] - | mov [RA+RB+4], RD - |.endif - | add RA, 8 - | cmp RA, KBASE - | jne <5 - |6: - |.if resume - | lea RD, [PC+2] // nresults+1 = 1 + true + results. - | mov dword [BASE-4], LJ_TTRUE // Prepend true to results. - |.else - | lea RD, [PC+1] // nresults+1 = 1 + results. - |.endif - |7: - | mov PC, SAVE_PC - | mov MULTRES, RD - |.if resume - | mov RAa, -8 - |.else - | xor RA, RA - |.endif - | test PC, FRAME_TYPE - | jz ->BC_RET_Z - | jmp ->vm_return - | - |8: // Coroutine returned with error (at co->top-1). - |.if resume - | mov dword [BASE-4], LJ_TFALSE // Prepend false to results. - | mov RA, L:PC->top - | sub RA, 8 - | mov L:PC->top, RA // Clear error from coroutine stack. - | // Copy error message. - |.if X64 - | mov RDa, [RA] - | mov [BASE], RDa - |.else - | mov RD, [RA] - | mov [BASE], RD - | mov RD, [RA+4] - | mov [BASE+4], RD - |.endif - | mov RD, 1+2 // nresults+1 = 1 + false + error. - | jmp <7 - |.else - | mov FCARG2, L:PC - | mov FCARG1, L:RB - | call extern lj_ffh_coroutine_wrap_err@8 // (lua_State *L, lua_State *co) - | // Error function does not return. - |.endif - | - |9: // Handle stack expansion on return from yield. - |.if X64 - | mov L:RA, TMP1 - |.else - | mov L:RA, ARG1 // The callee doesn't modify SAVE_L. - |.endif - | mov L:RA->top, KBASE // Undo coroutine stack clearing. - | mov FCARG2, PC - | mov FCARG1, L:RB - | call extern lj_state_growstack@8 // (lua_State *L, int n) - |.if X64 - | mov L:PC, TMP1 - |.else - | mov L:PC, ARG1 - |.endif - | mov BASE, L:RB->base - | jmp <4 // Retry the stack move. - |.endmacro - | - | coroutine_resume_wrap 1 // coroutine.resume - | coroutine_resume_wrap 0 // coroutine.wrap - | - |.ffunc coroutine_yield - | mov L:RB, SAVE_L - | test aword L:RB->cframe, CFRAME_RESUME - | jz ->fff_fallback - | mov L:RB->base, BASE - | lea RD, [BASE+NARGS:RD*8-8] - | mov L:RB->top, RD - | xor RD, RD - | mov aword L:RB->cframe, RDa - | mov al, LUA_YIELD - | mov byte L:RB->status, al - | jmp ->vm_leave_unw - | - |//-- Math library ------------------------------------------------------- - | - |.if not DUALNUM - |->fff_resi: // Dummy. - |.endif - | - |.if SSE - |->fff_resn: - | mov PC, [BASE-4] - | fstp qword [BASE-8] - | jmp ->fff_res1 - |.endif - | - | .ffunc_1 math_abs - |.if DUALNUM - | cmp dword [BASE+4], LJ_TISNUM; jne >2 - | mov RB, dword [BASE] - | cmp RB, 0; jns ->fff_resi - | neg RB; js >1 - |->fff_resbit: - |->fff_resi: - | mov PC, [BASE-4] - | mov dword [BASE-4], LJ_TISNUM - | mov dword [BASE-8], RB - | jmp ->fff_res1 - |1: - | mov PC, [BASE-4] - | mov dword [BASE-4], 0x41e00000 // 2^31. - | mov dword [BASE-8], 0 - | jmp ->fff_res1 - |2: - | ja ->fff_fallback - |.else - | cmp dword [BASE+4], LJ_TISNUM; jae ->fff_fallback - |.endif - | - |.if SSE - | movsd xmm0, qword [BASE] - | sseconst_abs xmm1, RDa - | andps xmm0, xmm1 - |->fff_resxmm0: - | mov PC, [BASE-4] - | movsd qword [BASE-8], xmm0 - | // fallthrough - |.else - | fld qword [BASE] - | fabs - | // fallthrough - |->fff_resxmm0: // Dummy. - |->fff_resn: - | mov PC, [BASE-4] - | fstp qword [BASE-8] - |.endif - | - |->fff_res1: - | mov RD, 1+1 - |->fff_res: - | mov MULTRES, RD - |->fff_res_: - | test PC, FRAME_TYPE - | jnz >7 - |5: - | cmp PC_RB, RDL // More results expected? - | ja >6 - | // Adjust BASE. KBASE is assumed to be set for the calling frame. - | movzx RA, PC_RA - | not RAa // Note: ~RA = -(RA+1) - | lea BASE, [BASE+RA*8] // base = base - (RA+1)*8 - | ins_next - | - |6: // Fill up results with nil. - | mov dword [BASE+RD*8-12], LJ_TNIL - | add RD, 1 - | jmp <5 - | - |7: // Non-standard return case. - | mov RAa, -8 // Results start at BASE+RA = BASE-8. - | jmp ->vm_return - | - |.macro math_round, func - | .ffunc math_ .. func - |.if DUALNUM - | cmp dword [BASE+4], LJ_TISNUM; jne >1 - | mov RB, dword [BASE]; jmp ->fff_resi - |1: - | ja ->fff_fallback - |.else - | cmp dword [BASE+4], LJ_TISNUM; jae ->fff_fallback - |.endif - |.if SSE - | movsd xmm0, qword [BASE] - | call ->vm_ .. func - | .if DUALNUM - | cvtsd2si RB, xmm0 - | cmp RB, 0x80000000 - | jne ->fff_resi - | cvtsi2sd xmm1, RB - | ucomisd xmm0, xmm1 - | jp ->fff_resxmm0 - | je ->fff_resi - | .endif - | jmp ->fff_resxmm0 - |.else - | fld qword [BASE] - | call ->vm_ .. func - | .if DUALNUM - | fist ARG1 - | mov RB, ARG1 - | cmp RB, 0x80000000; jne >2 - | fdup - | fild ARG1 - | fcomparepp - | jp ->fff_resn - | jne ->fff_resn - |2: - | fpop - | jmp ->fff_resi - | .else - | jmp ->fff_resn - | .endif - |.endif - |.endmacro - | - | math_round floor - | math_round ceil - | - |.if SSE - |.ffunc_nsse math_sqrt, sqrtsd; jmp ->fff_resxmm0 - |.else - |.ffunc_n math_sqrt; fsqrt; jmp ->fff_resn - |.endif - | - |.ffunc math_log - | cmp NARGS:RD, 1+1; jne ->fff_fallback // Exactly one argument. - | cmp dword [BASE+4], LJ_TISNUM; jae ->fff_fallback - | fldln2; fld qword [BASE]; fyl2x; jmp ->fff_resn - | - |.ffunc_n math_log10, fldlg2; fyl2x; jmp ->fff_resn - |.ffunc_n math_exp; call ->vm_exp_x87; jmp ->fff_resn - | - |.ffunc_n math_sin; fsin; jmp ->fff_resn - |.ffunc_n math_cos; fcos; jmp ->fff_resn - |.ffunc_n math_tan; fptan; fpop; jmp ->fff_resn - | - |.ffunc_n math_asin - | fdup; fmul st0; fld1; fsubrp st1; fsqrt; fpatan - | jmp ->fff_resn - |.ffunc_n math_acos - | fdup; fmul st0; fld1; fsubrp st1; fsqrt; fxch; fpatan - | jmp ->fff_resn - |.ffunc_n math_atan; fld1; fpatan; jmp ->fff_resn - | - |.macro math_extern, func - |.if SSE - | .ffunc_nsse math_ .. func - | .if not X64 - | movsd FPARG1, xmm0 - | .endif - |.else - | .ffunc_n math_ .. func - | fstp FPARG1 - |.endif - | mov RB, BASE - | call extern lj_vm_ .. func - | mov BASE, RB - | .if X64 - | jmp ->fff_resxmm0 - | .else - | jmp ->fff_resn - | .endif - |.endmacro - | - | math_extern sinh - | math_extern cosh - | math_extern tanh - | - |->ff_math_deg: - |.if SSE - |.ffunc_nsse math_rad - | mov CFUNC:RB, [BASE-8] - | mulsd xmm0, qword CFUNC:RB->upvalue[0] - | jmp ->fff_resxmm0 - |.else - |.ffunc_n math_rad - | mov CFUNC:RB, [BASE-8] - | fmul qword CFUNC:RB->upvalue[0] - | jmp ->fff_resn - |.endif - | - |.ffunc_nn math_atan2; fpatan; jmp ->fff_resn - |.ffunc_nnr math_ldexp; fscale; fpop1; jmp ->fff_resn - | - |.ffunc_1 math_frexp - | mov RB, [BASE+4] - | cmp RB, LJ_TISNUM; jae ->fff_fallback - | mov PC, [BASE-4] - | mov RC, [BASE] - | mov [BASE-4], RB; mov [BASE-8], RC - | shl RB, 1; cmp RB, 0xffe00000; jae >3 - | or RC, RB; jz >3 - | mov RC, 1022 - | cmp RB, 0x00200000; jb >4 - |1: - | shr RB, 21; sub RB, RC // Extract and unbias exponent. - |.if SSE - | cvtsi2sd xmm0, RB - |.else - | mov TMP1, RB; fild TMP1 - |.endif - | mov RB, [BASE-4] - | and RB, 0x800fffff // Mask off exponent. - | or RB, 0x3fe00000 // Put mantissa in range [0.5,1) or 0. - | mov [BASE-4], RB - |2: - |.if SSE - | movsd qword [BASE], xmm0 - |.else - | fstp qword [BASE] - |.endif - | mov RD, 1+2 - | jmp ->fff_res - |3: // Return +-0, +-Inf, NaN unmodified and an exponent of 0. - |.if SSE - | xorps xmm0, xmm0; jmp <2 - |.else - | fldz; jmp <2 - |.endif - |4: // Handle denormals by multiplying with 2^54 and adjusting the bias. - |.if SSE - | movsd xmm0, qword [BASE] - | sseconst_hi xmm1, RBa, 43500000 // 2^54. - | mulsd xmm0, xmm1 - | movsd qword [BASE-8], xmm0 - |.else - | fld qword [BASE] - | mov TMP1, 0x5a800000; fmul TMP1 // x = x*2^54 - | fstp qword [BASE-8] - |.endif - | mov RB, [BASE-4]; mov RC, 1076; shl RB, 1; jmp <1 - | - |.if SSE - |.ffunc_nsse math_modf - |.else - |.ffunc_n math_modf - |.endif - | mov RB, [BASE+4] - | mov PC, [BASE-4] - | shl RB, 1; cmp RB, 0xffe00000; je >4 // +-Inf? - |.if SSE - | movaps xmm4, xmm0 - | call ->vm_trunc - | subsd xmm4, xmm0 - |1: - | movsd qword [BASE-8], xmm0 - | movsd qword [BASE], xmm4 - |.else - | fdup - | call ->vm_trunc - | fsub st1, st0 - |1: - | fstp qword [BASE-8] - | fstp qword [BASE] - |.endif - | mov RC, [BASE-4]; mov RB, [BASE+4] - | xor RC, RB; js >3 // Need to adjust sign? - |2: - | mov RD, 1+2 - | jmp ->fff_res - |3: - | xor RB, 0x80000000; mov [BASE+4], RB // Flip sign of fraction. - | jmp <2 - |4: - |.if SSE - | xorps xmm4, xmm4; jmp <1 // Return +-Inf and +-0. - |.else - | fldz; fxch; jmp <1 // Return +-Inf and +-0. - |.endif - | - |.ffunc_nnr math_fmod - |1: ; fprem; fnstsw ax; and ax, 0x400; jnz <1 - | fpop1 - | jmp ->fff_resn - | - |.if SSE - |.ffunc_nnsse math_pow; call ->vm_pow; jmp ->fff_resxmm0 - |.else - |.ffunc_nn math_pow; call ->vm_pow; jmp ->fff_resn - |.endif - | - |.macro math_minmax, name, cmovop, fcmovop, sseop - | .ffunc name - | mov RA, 2 - | cmp dword [BASE+4], LJ_TISNUM - |.if DUALNUM - | jne >4 - | mov RB, dword [BASE] - |1: // Handle integers. - | cmp RA, RD; jae ->fff_resi - | cmp dword [BASE+RA*8-4], LJ_TISNUM; jne >3 - | cmp RB, dword [BASE+RA*8-8] - | cmovop RB, dword [BASE+RA*8-8] - | add RA, 1 - | jmp <1 - |3: - | ja ->fff_fallback - | // Convert intermediate result to number and continue below. - |.if SSE - | cvtsi2sd xmm0, RB - |.else - | mov TMP1, RB - | fild TMP1 - |.endif - | jmp >6 - |4: - | ja ->fff_fallback - |.else - | jae ->fff_fallback - |.endif - | - |.if SSE - | movsd xmm0, qword [BASE] - |5: // Handle numbers or integers. - | cmp RA, RD; jae ->fff_resxmm0 - | cmp dword [BASE+RA*8-4], LJ_TISNUM - |.if DUALNUM - | jb >6 - | ja ->fff_fallback - | cvtsi2sd xmm1, dword [BASE+RA*8-8] - | jmp >7 - |.else - | jae ->fff_fallback - |.endif - |6: - | movsd xmm1, qword [BASE+RA*8-8] - |7: - | sseop xmm0, xmm1 - | add RA, 1 - | jmp <5 - |.else - | fld qword [BASE] - |5: // Handle numbers or integers. - | cmp RA, RD; jae ->fff_resn - | cmp dword [BASE+RA*8-4], LJ_TISNUM - |.if DUALNUM - | jb >6 - | ja >9 - | fild dword [BASE+RA*8-8] - | jmp >7 - |.else - | jae >9 - |.endif - |6: - | fld qword [BASE+RA*8-8] - |7: - | fucomi st1; fcmovop st1; fpop1 - | add RA, 1 - | jmp <5 - |.endif - |.endmacro - | - | math_minmax math_min, cmovg, fcmovnbe, minsd - | math_minmax math_max, cmovl, fcmovbe, maxsd - |.if not SSE - |9: - | fpop; jmp ->fff_fallback - |.endif - | - |//-- String library ----------------------------------------------------- - | - |.ffunc_1 string_len - | cmp dword [BASE+4], LJ_TSTR; jne ->fff_fallback - | mov STR:RB, [BASE] - |.if DUALNUM - | mov RB, dword STR:RB->len; jmp ->fff_resi - |.elif SSE - | cvtsi2sd xmm0, dword STR:RB->len; jmp ->fff_resxmm0 - |.else - | fild dword STR:RB->len; jmp ->fff_resn - |.endif - | - |.ffunc string_byte // Only handle the 1-arg case here. - | cmp NARGS:RD, 1+1; jne ->fff_fallback - | cmp dword [BASE+4], LJ_TSTR; jne ->fff_fallback - | mov STR:RB, [BASE] - | mov PC, [BASE-4] - | cmp dword STR:RB->len, 1 - | jb ->fff_res0 // Return no results for empty string. - | movzx RB, byte STR:RB[1] - |.if DUALNUM - | jmp ->fff_resi - |.elif SSE - | cvtsi2sd xmm0, RB; jmp ->fff_resxmm0 - |.else - | mov TMP1, RB; fild TMP1; jmp ->fff_resn - |.endif - | - |.ffunc string_char // Only handle the 1-arg case here. - | ffgccheck - | cmp NARGS:RD, 1+1; jne ->fff_fallback // *Exactly* 1 arg. - | cmp dword [BASE+4], LJ_TISNUM - |.if DUALNUM - | jne ->fff_fallback - | mov RB, dword [BASE] - | cmp RB, 255; ja ->fff_fallback - | mov TMP2, RB - |.elif SSE - | jae ->fff_fallback - | cvttsd2si RB, qword [BASE] - | cmp RB, 255; ja ->fff_fallback - | mov TMP2, RB - |.else - | jae ->fff_fallback - | fld qword [BASE] - | fistp TMP2 - | cmp TMP2, 255; ja ->fff_fallback - |.endif - |.if X64 - | mov TMP3, 1 - |.else - | mov ARG3, 1 - |.endif - | lea RDa, TMP2 // Points to stack. Little-endian. - |->fff_newstr: - | mov L:RB, SAVE_L - | mov L:RB->base, BASE - |.if X64 - | mov CARG3d, TMP3 // Zero-extended to size_t. - | mov CARG2, RDa // May be 64 bit ptr to stack. - | mov CARG1d, L:RB - |.else - | mov ARG2, RD - | mov ARG1, L:RB - |.endif - | mov SAVE_PC, PC - | call extern lj_str_new // (lua_State *L, char *str, size_t l) - | // GCstr * returned in eax (RD). - | mov BASE, L:RB->base - | mov PC, [BASE-4] - | mov dword [BASE-4], LJ_TSTR - | mov [BASE-8], STR:RD - | jmp ->fff_res1 - | - |.ffunc string_sub - | ffgccheck - | mov TMP2, -1 - | cmp NARGS:RD, 1+2; jb ->fff_fallback - | jna >1 - | cmp dword [BASE+20], LJ_TISNUM - |.if DUALNUM - | jne ->fff_fallback - | mov RB, dword [BASE+16] - | mov TMP2, RB - |.elif SSE - | jae ->fff_fallback - | cvttsd2si RB, qword [BASE+16] - | mov TMP2, RB - |.else - | jae ->fff_fallback - | fld qword [BASE+16] - | fistp TMP2 - |.endif - |1: - | cmp dword [BASE+4], LJ_TSTR; jne ->fff_fallback - | cmp dword [BASE+12], LJ_TISNUM - |.if DUALNUM - | jne ->fff_fallback - |.else - | jae ->fff_fallback - |.endif - | mov STR:RB, [BASE] - | mov TMP3, STR:RB - | mov RB, STR:RB->len - |.if DUALNUM - | mov RA, dword [BASE+8] - |.elif SSE - | cvttsd2si RA, qword [BASE+8] - |.else - | fld qword [BASE+8] - | fistp ARG3 - | mov RA, ARG3 - |.endif - | mov RC, TMP2 - | cmp RB, RC // len < end? (unsigned compare) - | jb >5 - |2: - | test RA, RA // start <= 0? - | jle >7 - |3: - | mov STR:RB, TMP3 - | sub RC, RA // start > end? - | jl ->fff_emptystr - | lea RB, [STR:RB+RA+#STR-1] - | add RC, 1 - |4: - |.if X64 - | mov TMP3, RC - |.else - | mov ARG3, RC - |.endif - | mov RD, RB - | jmp ->fff_newstr - | - |5: // Negative end or overflow. - | jl >6 - | lea RC, [RC+RB+1] // end = end+(len+1) - | jmp <2 - |6: // Overflow. - | mov RC, RB // end = len - | jmp <2 - | - |7: // Negative start or underflow. - | je >8 - | add RA, RB // start = start+(len+1) - | add RA, 1 - | jg <3 // start > 0? - |8: // Underflow. - | mov RA, 1 // start = 1 - | jmp <3 - | - |->fff_emptystr: // Range underflow. - | xor RC, RC // Zero length. Any ptr in RB is ok. - | jmp <4 - | - |.ffunc string_rep // Only handle the 1-char case inline. - | ffgccheck - | cmp NARGS:RD, 2+1; jne ->fff_fallback // Exactly 2 arguments. - | cmp dword [BASE+4], LJ_TSTR; jne ->fff_fallback - | cmp dword [BASE+12], LJ_TISNUM - | mov STR:RB, [BASE] - |.if DUALNUM - | jne ->fff_fallback - | mov RC, dword [BASE+8] - |.elif SSE - | jae ->fff_fallback - | cvttsd2si RC, qword [BASE+8] - |.else - | jae ->fff_fallback - | fld qword [BASE+8] - | fistp TMP2 - | mov RC, TMP2 - |.endif - | test RC, RC - | jle ->fff_emptystr // Count <= 0? (or non-int) - | cmp dword STR:RB->len, 1 - | jb ->fff_emptystr // Zero length string? - | jne ->fff_fallback_2 // Fallback for > 1-char strings. - | cmp [DISPATCH+DISPATCH_GL(tmpbuf.sz)], RC; jb ->fff_fallback_2 - | movzx RA, byte STR:RB[1] - | mov RB, [DISPATCH+DISPATCH_GL(tmpbuf.buf)] - |.if X64 - | mov TMP3, RC - |.else - | mov ARG3, RC - |.endif - |1: // Fill buffer with char. Yes, this is suboptimal code (do you care?). - | mov [RB], RAL - | add RB, 1 - | sub RC, 1 - | jnz <1 - | mov RD, [DISPATCH+DISPATCH_GL(tmpbuf.buf)] - | jmp ->fff_newstr - | - |.ffunc_1 string_reverse - | ffgccheck - | cmp dword [BASE+4], LJ_TSTR; jne ->fff_fallback - | mov STR:RB, [BASE] - | mov RC, STR:RB->len - | test RC, RC - | jz ->fff_emptystr // Zero length string? - | cmp [DISPATCH+DISPATCH_GL(tmpbuf.sz)], RC; jb ->fff_fallback_1 - | add RB, #STR - | mov TMP2, PC // Need another temp register. - |.if X64 - | mov TMP3, RC - |.else - | mov ARG3, RC - |.endif - | mov PC, [DISPATCH+DISPATCH_GL(tmpbuf.buf)] - |1: - | movzx RA, byte [RB] - | add RB, 1 - | sub RC, 1 - | mov [PC+RC], RAL - | jnz <1 - | mov RD, PC - | mov PC, TMP2 - | jmp ->fff_newstr - | - |.macro ffstring_case, name, lo, hi - | .ffunc_1 name - | ffgccheck - | cmp dword [BASE+4], LJ_TSTR; jne ->fff_fallback - | mov STR:RB, [BASE] - | mov RC, STR:RB->len - | cmp [DISPATCH+DISPATCH_GL(tmpbuf.sz)], RC; jb ->fff_fallback_1 - | add RB, #STR - | mov TMP2, PC // Need another temp register. - |.if X64 - | mov TMP3, RC - |.else - | mov ARG3, RC - |.endif - | mov PC, [DISPATCH+DISPATCH_GL(tmpbuf.buf)] - | jmp >3 - |1: // ASCII case conversion. Yes, this is suboptimal code (do you care?). - | movzx RA, byte [RB+RC] - | cmp RA, lo - | jb >2 - | cmp RA, hi - | ja >2 - | xor RA, 0x20 - |2: - | mov [PC+RC], RAL - |3: - | sub RC, 1 - | jns <1 - | mov RD, PC - | mov PC, TMP2 - | jmp ->fff_newstr - |.endmacro - | - |ffstring_case string_lower, 0x41, 0x5a - |ffstring_case string_upper, 0x61, 0x7a - | - |//-- Table library ------------------------------------------------------ - | - |.ffunc_1 table_getn - | cmp dword [BASE+4], LJ_TTAB; jne ->fff_fallback - | mov RB, BASE // Save BASE. - | mov TAB:FCARG1, [BASE] - | call extern lj_tab_len@4 // LJ_FASTCALL (GCtab *t) - | // Length of table returned in eax (RD). - | mov BASE, RB // Restore BASE. - |.if DUALNUM - | mov RB, RD; jmp ->fff_resi - |.elif SSE - | cvtsi2sd xmm0, RD; jmp ->fff_resxmm0 - |.else - | mov ARG1, RD; fild ARG1; jmp ->fff_resn - |.endif - | - |//-- Bit library -------------------------------------------------------- - | - |.define TOBIT_BIAS, 0x59c00000 // 2^52 + 2^51 (float, not double!). - | - |.macro .ffunc_bit, name, kind, fdef - | fdef name - |.if kind == 2 - |.if SSE - | sseconst_tobit xmm1, RBa - |.else - | mov TMP1, TOBIT_BIAS - |.endif - |.endif - | cmp dword [BASE+4], LJ_TISNUM - |.if DUALNUM - | jne >1 - | mov RB, dword [BASE] - |.if kind > 0 - | jmp >2 - |.else - | jmp ->fff_resbit - |.endif - |1: - | ja ->fff_fallback - |.else - | jae ->fff_fallback - |.endif - |.if SSE - | movsd xmm0, qword [BASE] - |.if kind < 2 - | sseconst_tobit xmm1, RBa - |.endif - | addsd xmm0, xmm1 - | movd RB, xmm0 - |.else - | fld qword [BASE] - |.if kind < 2 - | mov TMP1, TOBIT_BIAS - |.endif - | fadd TMP1 - | fstp FPARG1 - |.if kind > 0 - | mov RB, ARG1 - |.endif - |.endif - |2: - |.endmacro - | - |.macro .ffunc_bit, name, kind - | .ffunc_bit name, kind, .ffunc_1 - |.endmacro - | - |.ffunc_bit bit_tobit, 0 - |.if DUALNUM or SSE - |.if not SSE - | mov RB, ARG1 - |.endif - | jmp ->fff_resbit - |.else - | fild ARG1 - | jmp ->fff_resn - |.endif - | - |.macro .ffunc_bit_op, name, ins - | .ffunc_bit name, 2 - | mov TMP2, NARGS:RD // Save for fallback. - | lea RD, [BASE+NARGS:RD*8-16] - |1: - | cmp RD, BASE - | jbe ->fff_resbit - | cmp dword [RD+4], LJ_TISNUM - |.if DUALNUM - | jne >2 - | ins RB, dword [RD] - | sub RD, 8 - | jmp <1 - |2: - | ja ->fff_fallback_bit_op - |.else - | jae ->fff_fallback_bit_op - |.endif - |.if SSE - | movsd xmm0, qword [RD] - | addsd xmm0, xmm1 - | movd RA, xmm0 - | ins RB, RA - |.else - | fld qword [RD] - | fadd TMP1 - | fstp FPARG1 - | ins RB, ARG1 - |.endif - | sub RD, 8 - | jmp <1 - |.endmacro - | - |.ffunc_bit_op bit_band, and - |.ffunc_bit_op bit_bor, or - |.ffunc_bit_op bit_bxor, xor - | - |.ffunc_bit bit_bswap, 1 - | bswap RB - | jmp ->fff_resbit - | - |.ffunc_bit bit_bnot, 1 - | not RB - |.if DUALNUM - | jmp ->fff_resbit - |.elif SSE - |->fff_resbit: - | cvtsi2sd xmm0, RB - | jmp ->fff_resxmm0 - |.else - |->fff_resbit: - | mov ARG1, RB - | fild ARG1 - | jmp ->fff_resn - |.endif - | - |->fff_fallback_bit_op: - | mov NARGS:RD, TMP2 // Restore for fallback - | jmp ->fff_fallback - | - |.macro .ffunc_bit_sh, name, ins - |.if DUALNUM - | .ffunc_bit name, 1, .ffunc_2 - | // Note: no inline conversion from number for 2nd argument! - | cmp dword [BASE+12], LJ_TISNUM; jne ->fff_fallback - | mov RA, dword [BASE+8] - |.elif SSE - | .ffunc_nnsse name - | sseconst_tobit xmm2, RBa - | addsd xmm0, xmm2 - | addsd xmm1, xmm2 - | movd RB, xmm0 - | movd RA, xmm1 - |.else - | .ffunc_nn name - | mov TMP1, TOBIT_BIAS - | fadd TMP1 - | fstp FPARG3 - | fadd TMP1 - | fstp FPARG1 - | mov RA, ARG3 - | mov RB, ARG1 - |.endif - | ins RB, cl // Assumes RA is ecx. - | jmp ->fff_resbit - |.endmacro - | - |.ffunc_bit_sh bit_lshift, shl - |.ffunc_bit_sh bit_rshift, shr - |.ffunc_bit_sh bit_arshift, sar - |.ffunc_bit_sh bit_rol, rol - |.ffunc_bit_sh bit_ror, ror - | - |//----------------------------------------------------------------------- - | - |->fff_fallback_2: - | mov NARGS:RD, 1+2 // Other args are ignored, anyway. - | jmp ->fff_fallback - |->fff_fallback_1: - | mov NARGS:RD, 1+1 // Other args are ignored, anyway. - |->fff_fallback: // Call fast function fallback handler. - | // BASE = new base, RD = nargs+1 - | mov L:RB, SAVE_L - | mov PC, [BASE-4] // Fallback may overwrite PC. - | mov SAVE_PC, PC // Redundant (but a defined value). - | mov L:RB->base, BASE - | lea RD, [BASE+NARGS:RD*8-8] - | lea RA, [RD+8*LUA_MINSTACK] // Ensure enough space for handler. - | mov L:RB->top, RD - | mov CFUNC:RD, [BASE-8] - | cmp RA, L:RB->maxstack - | ja >5 // Need to grow stack. - |.if X64 - | mov CARG1d, L:RB - |.else - | mov ARG1, L:RB - |.endif - | call aword CFUNC:RD->f // (lua_State *L) - | mov BASE, L:RB->base - | // Either throws an error, or recovers and returns -1, 0 or nresults+1. - | test RD, RD; jg ->fff_res // Returned nresults+1? - |1: - | mov RA, L:RB->top - | sub RA, BASE - | shr RA, 3 - | test RD, RD - | lea NARGS:RD, [RA+1] - | mov LFUNC:RB, [BASE-8] - | jne ->vm_call_tail // Returned -1? - | ins_callt // Returned 0: retry fast path. - | - |// Reconstruct previous base for vmeta_call during tailcall. - |->vm_call_tail: - | mov RA, BASE - | test PC, FRAME_TYPE - | jnz >3 - | movzx RB, PC_RA - | not RBa // Note: ~RB = -(RB+1) - | lea BASE, [BASE+RB*8] // base = base - (RB+1)*8 - | jmp ->vm_call_dispatch // Resolve again for tailcall. - |3: - | mov RB, PC - | and RB, -8 - | sub BASE, RB - | jmp ->vm_call_dispatch // Resolve again for tailcall. - | - |5: // Grow stack for fallback handler. - | mov FCARG2, LUA_MINSTACK - | mov FCARG1, L:RB - | call extern lj_state_growstack@8 // (lua_State *L, int n) - | mov BASE, L:RB->base - | xor RD, RD // Simulate a return 0. - | jmp <1 // Dumb retry (goes through ff first). - | - |->fff_gcstep: // Call GC step function. - | // BASE = new base, RD = nargs+1 - | pop RBa // Must keep stack at same level. - | mov TMPa, RBa // Save return address - | mov L:RB, SAVE_L - | mov SAVE_PC, PC // Redundant (but a defined value). - | mov L:RB->base, BASE - | lea RD, [BASE+NARGS:RD*8-8] - | mov FCARG1, L:RB - | mov L:RB->top, RD - | call extern lj_gc_step@4 // (lua_State *L) - | mov BASE, L:RB->base - | mov RD, L:RB->top - | sub RD, BASE - | shr RD, 3 - | add NARGS:RD, 1 - | mov RBa, TMPa - | push RBa // Restore return address. - | ret - | - |//----------------------------------------------------------------------- - |//-- Special dispatch targets ------------------------------------------- - |//----------------------------------------------------------------------- - | - |->vm_record: // Dispatch target for recording phase. - |.if JIT - | movzx RD, byte [DISPATCH+DISPATCH_GL(hookmask)] - | test RDL, HOOK_VMEVENT // No recording while in vmevent. - | jnz >5 - | // Decrement the hookcount for consistency, but always do the call. - | test RDL, HOOK_ACTIVE - | jnz >1 - | test RDL, LUA_MASKLINE|LUA_MASKCOUNT - | jz >1 - | dec dword [DISPATCH+DISPATCH_GL(hookcount)] - | jmp >1 - |.endif - | - |->vm_rethook: // Dispatch target for return hooks. - | movzx RD, byte [DISPATCH+DISPATCH_GL(hookmask)] - | test RDL, HOOK_ACTIVE // Hook already active? - | jnz >5 - | jmp >1 - | - |->vm_inshook: // Dispatch target for instr/line hooks. - | movzx RD, byte [DISPATCH+DISPATCH_GL(hookmask)] - | test RDL, HOOK_ACTIVE // Hook already active? - | jnz >5 - | - | test RDL, LUA_MASKLINE|LUA_MASKCOUNT - | jz >5 - | dec dword [DISPATCH+DISPATCH_GL(hookcount)] - | jz >1 - | test RDL, LUA_MASKLINE - | jz >5 - |1: - | mov L:RB, SAVE_L - | mov L:RB->base, BASE - | mov FCARG2, PC // Caveat: FCARG2 == BASE - | mov FCARG1, L:RB - | // SAVE_PC must hold the _previous_ PC. The callee updates it with PC. - | call extern lj_dispatch_ins@8 // (lua_State *L, BCIns *pc) - |3: - | mov BASE, L:RB->base - |4: - | movzx RA, PC_RA - |5: - | movzx OP, PC_OP - | movzx RD, PC_RD - |.if X64 - | jmp aword [DISPATCH+OP*8+GG_DISP2STATIC] // Re-dispatch to static ins. - |.else - | jmp aword [DISPATCH+OP*4+GG_DISP2STATIC] // Re-dispatch to static ins. - |.endif - | - |->cont_hook: // Continue from hook yield. - | add PC, 4 - | mov RA, [RB-24] - | mov MULTRES, RA // Restore MULTRES for *M ins. - | jmp <4 - | - |->vm_hotloop: // Hot loop counter underflow. - |.if JIT - | mov LFUNC:RB, [BASE-8] // Same as curr_topL(L). - | mov RB, LFUNC:RB->pc - | movzx RD, byte [RB+PC2PROTO(framesize)] - | lea RD, [BASE+RD*8] - | mov L:RB, SAVE_L - | mov L:RB->base, BASE - | mov L:RB->top, RD - | mov FCARG2, PC - | lea FCARG1, [DISPATCH+GG_DISP2J] - | mov aword [DISPATCH+DISPATCH_J(L)], L:RBa - | mov SAVE_PC, PC - | call extern lj_trace_hot@8 // (jit_State *J, const BCIns *pc) - | jmp <3 - |.endif - | - |->vm_callhook: // Dispatch target for call hooks. - | mov SAVE_PC, PC - |.if JIT - | jmp >1 - |.endif - | - |->vm_hotcall: // Hot call counter underflow. - |.if JIT - | mov SAVE_PC, PC - | or PC, 1 // Marker for hot call. - |1: - |.endif - | lea RD, [BASE+NARGS:RD*8-8] - | mov L:RB, SAVE_L - | mov L:RB->base, BASE - | mov L:RB->top, RD - | mov FCARG2, PC - | mov FCARG1, L:RB - | call extern lj_dispatch_call@8 // (lua_State *L, const BCIns *pc) - | // ASMFunction returned in eax/rax (RDa). - | mov SAVE_PC, 0 // Invalidate for subsequent line hook. - |.if JIT - | and PC, -2 - |.endif - | mov BASE, L:RB->base - | mov RAa, RDa - | mov RD, L:RB->top - | sub RD, BASE - | mov RBa, RAa - | movzx RA, PC_RA - | shr RD, 3 - | add NARGS:RD, 1 - | jmp RBa - | - |//----------------------------------------------------------------------- - |//-- Trace exit handler ------------------------------------------------- - |//----------------------------------------------------------------------- - | - |// Called from an exit stub with the exit number on the stack. - |// The 16 bit exit number is stored with two (sign-extended) push imm8. - |->vm_exit_handler: - |.if JIT - |.if X64 - | push r13; push r12 - | push r11; push r10; push r9; push r8 - | push rdi; push rsi; push rbp; lea rbp, [rsp+88]; push rbp - | push rbx; push rdx; push rcx; push rax - | movzx RC, byte [rbp-8] // Reconstruct exit number. - | mov RCH, byte [rbp-16] - | mov [rbp-8], r15; mov [rbp-16], r14 - |.else - | push ebp; lea ebp, [esp+12]; push ebp - | push ebx; push edx; push ecx; push eax - | movzx RC, byte [ebp-4] // Reconstruct exit number. - | mov RCH, byte [ebp-8] - | mov [ebp-4], edi; mov [ebp-8], esi - |.endif - | // Caveat: DISPATCH is ebx. - | mov DISPATCH, [ebp] - | mov RA, [DISPATCH+DISPATCH_GL(vmstate)] // Get trace number. - | set_vmstate EXIT - | mov [DISPATCH+DISPATCH_J(exitno)], RC - | mov [DISPATCH+DISPATCH_J(parent)], RA - |.if X64 - |.if X64WIN - | sub rsp, 16*8+4*8 // Room for SSE regs + save area. - |.else - | sub rsp, 16*8 // Room for SSE regs. - |.endif - | add rbp, -128 - | movsd qword [rbp-8], xmm15; movsd qword [rbp-16], xmm14 - | movsd qword [rbp-24], xmm13; movsd qword [rbp-32], xmm12 - | movsd qword [rbp-40], xmm11; movsd qword [rbp-48], xmm10 - | movsd qword [rbp-56], xmm9; movsd qword [rbp-64], xmm8 - | movsd qword [rbp-72], xmm7; movsd qword [rbp-80], xmm6 - | movsd qword [rbp-88], xmm5; movsd qword [rbp-96], xmm4 - | movsd qword [rbp-104], xmm3; movsd qword [rbp-112], xmm2 - | movsd qword [rbp-120], xmm1; movsd qword [rbp-128], xmm0 - |.else - | sub esp, 8*8+16 // Room for SSE regs + args. - | movsd qword [ebp-40], xmm7; movsd qword [ebp-48], xmm6 - | movsd qword [ebp-56], xmm5; movsd qword [ebp-64], xmm4 - | movsd qword [ebp-72], xmm3; movsd qword [ebp-80], xmm2 - | movsd qword [ebp-88], xmm1; movsd qword [ebp-96], xmm0 - |.endif - | // Caveat: RB is ebp. - | mov L:RB, [DISPATCH+DISPATCH_GL(jit_L)] - | mov BASE, [DISPATCH+DISPATCH_GL(jit_base)] - | mov aword [DISPATCH+DISPATCH_J(L)], L:RBa - | mov dword [DISPATCH+DISPATCH_GL(jit_L)], 0 - | mov L:RB->base, BASE - |.if X64WIN - | lea CARG2, [rsp+4*8] - |.elif X64 - | mov CARG2, rsp - |.else - | lea FCARG2, [esp+16] - |.endif - | lea FCARG1, [DISPATCH+GG_DISP2J] - | call extern lj_trace_exit@8 // (jit_State *J, ExitState *ex) - | // MULTRES or negated error code returned in eax (RD). - | mov RAa, L:RB->cframe - | and RAa, CFRAME_RAWMASK - |.if X64WIN - | // Reposition stack later. - |.elif X64 - | mov rsp, RAa // Reposition stack to C frame. - |.else - | mov esp, RAa // Reposition stack to C frame. - |.endif - | mov [RAa+CFRAME_OFS_L], L:RB // Set SAVE_L (on-trace resume/yield). - | mov BASE, L:RB->base - | mov PC, [RAa+CFRAME_OFS_PC] // Get SAVE_PC. - |.if X64 - | jmp >1 - |.endif - |.endif - |->vm_exit_interp: - | // RD = MULTRES or negated error code, BASE, PC and DISPATCH set. - |.if JIT - |.if X64 - | // Restore additional callee-save registers only used in compiled code. - |.if X64WIN - | lea RAa, [rsp+9*16+4*8] - |1: - | movdqa xmm15, [RAa-9*16] - | movdqa xmm14, [RAa-8*16] - | movdqa xmm13, [RAa-7*16] - | movdqa xmm12, [RAa-6*16] - | movdqa xmm11, [RAa-5*16] - | movdqa xmm10, [RAa-4*16] - | movdqa xmm9, [RAa-3*16] - | movdqa xmm8, [RAa-2*16] - | movdqa xmm7, [RAa-1*16] - | mov rsp, RAa // Reposition stack to C frame. - | movdqa xmm6, [RAa] - | mov r15, CSAVE_3 - | mov r14, CSAVE_4 - |.else - | add rsp, 16 // Reposition stack to C frame. - |1: - |.endif - | mov r13, TMPa - | mov r12, TMPQ - |.endif - | test RD, RD; js >3 // Check for error from exit. - | mov MULTRES, RD - | mov LFUNC:KBASE, [BASE-8] - | mov KBASE, LFUNC:KBASE->pc - | mov KBASE, [KBASE+PC2PROTO(k)] - | mov dword [DISPATCH+DISPATCH_GL(jit_L)], 0 - | set_vmstate INTERP - | // Modified copy of ins_next which handles function header dispatch, too. - | mov RC, [PC] - | movzx RA, RCH - | movzx OP, RCL - | add PC, 4 - | shr RC, 16 - | cmp OP, BC_FUNCF // Function header? - | jb >2 - | mov RC, MULTRES // RC/RD holds nres+1. - |2: - |.if X64 - | jmp aword [DISPATCH+OP*8] - |.else - | jmp aword [DISPATCH+OP*4] - |.endif - | - |3: // Rethrow error from the right C frame. - | neg RD - | mov FCARG1, L:RB - | mov FCARG2, RD - | call extern lj_err_throw@8 // (lua_State *L, int errcode) - |.endif - | - |//----------------------------------------------------------------------- - |//-- Math helper functions ---------------------------------------------- - |//----------------------------------------------------------------------- - | - |// FP value rounding. Called by math.floor/math.ceil fast functions - |// and from JIT code. - | - |// x87 variant: Arg/ret on x87 stack. No int/xmm registers modified. - |.macro vm_round_x87, mode1, mode2 - | fnstcw word [esp+4] // Caveat: overwrites ARG1 and ARG2. - | mov [esp+8], eax - | mov ax, mode1 - | or ax, [esp+4] - |.if mode2 ~= 0xffff - | and ax, mode2 - |.endif - | mov [esp+6], ax - | fldcw word [esp+6] - | frndint - | fldcw word [esp+4] - | mov eax, [esp+8] - | ret - |.endmacro - | - |// SSE variant: arg/ret is xmm0. xmm0-xmm3 and RD (eax) modified. - |.macro vm_round_sse, mode - | sseconst_abs xmm2, RDa - | sseconst_2p52 xmm3, RDa - | movaps xmm1, xmm0 - | andpd xmm1, xmm2 // |x| - | ucomisd xmm3, xmm1 // No truncation if 2^52 <= |x|. - | jbe >1 - | andnpd xmm2, xmm0 // Isolate sign bit. - |.if mode == 2 // trunc(x)? - | movaps xmm0, xmm1 - | addsd xmm1, xmm3 // (|x| + 2^52) - 2^52 - | subsd xmm1, xmm3 - | sseconst_1 xmm3, RDa - | cmpsd xmm0, xmm1, 1 // |x| < result? - | andpd xmm0, xmm3 - | subsd xmm1, xmm0 // If yes, subtract -1. - | orpd xmm1, xmm2 // Merge sign bit back in. - |.else - | addsd xmm1, xmm3 // (|x| + 2^52) - 2^52 - | subsd xmm1, xmm3 - | orpd xmm1, xmm2 // Merge sign bit back in. - | .if mode == 1 // ceil(x)? - | sseconst_m1 xmm2, RDa // Must subtract -1 to preserve -0. - | cmpsd xmm0, xmm1, 6 // x > result? - | .else // floor(x)? - | sseconst_1 xmm2, RDa - | cmpsd xmm0, xmm1, 1 // x < result? - | .endif - | andpd xmm0, xmm2 - | subsd xmm1, xmm0 // If yes, subtract +-1. - |.endif - | movaps xmm0, xmm1 - |1: - | ret - |.endmacro - | - |.macro vm_round, name, ssemode, mode1, mode2 - |->name: - |.if not SSE - | vm_round_x87 mode1, mode2 - |.endif - |->name .. _sse: - | vm_round_sse ssemode - |.endmacro - | - | vm_round vm_floor, 0, 0x0400, 0xf7ff - | vm_round vm_ceil, 1, 0x0800, 0xfbff - | vm_round vm_trunc, 2, 0x0c00, 0xffff - | - |// FP modulo x%y. Called by BC_MOD* and vm_arith. - |->vm_mod: - |.if SSE - |// Args in xmm0/xmm1, return value in xmm0. - |// Caveat: xmm0-xmm5 and RC (eax) modified! - | movaps xmm5, xmm0 - | divsd xmm0, xmm1 - | sseconst_abs xmm2, RDa - | sseconst_2p52 xmm3, RDa - | movaps xmm4, xmm0 - | andpd xmm4, xmm2 // |x/y| - | ucomisd xmm3, xmm4 // No truncation if 2^52 <= |x/y|. - | jbe >1 - | andnpd xmm2, xmm0 // Isolate sign bit. - | addsd xmm4, xmm3 // (|x/y| + 2^52) - 2^52 - | subsd xmm4, xmm3 - | orpd xmm4, xmm2 // Merge sign bit back in. - | sseconst_1 xmm2, RDa - | cmpsd xmm0, xmm4, 1 // x/y < result? - | andpd xmm0, xmm2 - | subsd xmm4, xmm0 // If yes, subtract 1.0. - | movaps xmm0, xmm5 - | mulsd xmm1, xmm4 - | subsd xmm0, xmm1 - | ret - |1: - | mulsd xmm1, xmm0 - | movaps xmm0, xmm5 - | subsd xmm0, xmm1 - | ret - |.else - |// Args/ret on x87 stack (y on top). No xmm registers modified. - |// Caveat: needs 3 slots on x87 stack! RC (eax) modified! - | fld st1 - | fdiv st1 - | fnstcw word [esp+4] - | mov ax, 0x0400 - | or ax, [esp+4] - | and ax, 0xf7ff - | mov [esp+6], ax - | fldcw word [esp+6] - | frndint - | fldcw word [esp+4] - | fmulp st1 - | fsubp st1 - | ret - |.endif - | - |// FP log2(x). Called by math.log(x, base). - |->vm_log2: - |.if X64WIN - | movsd qword [rsp+8], xmm0 // Use scratch area. - | fld1 - | fld qword [rsp+8] - | fyl2x - | fstp qword [rsp+8] - | movsd xmm0, qword [rsp+8] - |.elif X64 - | movsd qword [rsp-8], xmm0 // Use red zone. - | fld1 - | fld qword [rsp-8] - | fyl2x - | fstp qword [rsp-8] - | movsd xmm0, qword [rsp-8] - |.else - | fld1 - | fld qword [esp+4] - | fyl2x - |.endif - | ret - | - |// FP exponentiation e^x and 2^x. Called by math.exp fast function and - |// from JIT code. Arg/ret on x87 stack. No int/xmm regs modified. - |// Caveat: needs 3 slots on x87 stack! - |->vm_exp_x87: - | fldl2e; fmulp st1 // e^x ==> 2^(x*log2(e)) - |->vm_exp2_x87: - | .if X64WIN - | .define expscratch, dword [rsp+8] // Use scratch area. - | .elif X64 - | .define expscratch, dword [rsp-8] // Use red zone. - | .else - | .define expscratch, dword [esp+4] // Needs 4 byte scratch area. - | .endif - | fst expscratch // Caveat: overwrites ARG1. - | cmp expscratch, 0x7f800000; je >1 // Special case: e^+Inf = +Inf - | cmp expscratch, 0xff800000; je >2 // Special case: e^-Inf = 0 - |->vm_exp2raw: // Entry point for vm_pow. Without +-Inf check. - | fdup; frndint; fsub st1, st0; fxch // Split into frac/int part. - | f2xm1; fld1; faddp st1; fscale; fpop1 // ==> (2^frac-1 +1) << int - |1: - | ret - |2: - | fpop; fldz; ret - | - |// Generic power function x^y. Called by BC_POW, math.pow fast function, - |// and vm_arith. - |// Args/ret on x87 stack (y on top). RC (eax) modified. - |// Caveat: needs 3 slots on x87 stack! - |->vm_pow: - |.if not SSE - | fist dword [esp+4] // Store/reload int before comparison. - | fild dword [esp+4] // Integral exponent used in vm_powi. - | fucomip st1 - | jnz >8 // Branch for FP exponents. - | jp >9 // Branch for NaN exponent. - | fpop // Pop y and fallthrough to vm_powi. - | - |// FP/int power function x^i. Arg1/ret on x87 stack. - |// Arg2 (int) on C stack. RC (eax) modified. - |// Caveat: needs 2 slots on x87 stack! - | mov eax, [esp+4] - | cmp eax, 1; jle >6 // i<=1? - | // Now 1 < (unsigned)i <= 0x80000000. - |1: // Handle leading zeros. - | test eax, 1; jnz >2 - | fmul st0 - | shr eax, 1 - | jmp <1 - |2: - | shr eax, 1; jz >5 - | fdup - |3: // Handle trailing bits. - | fmul st0 - | shr eax, 1; jz >4 - | jnc <3 - | fmul st1, st0 - | jmp <3 - |4: - | fmulp st1 - |5: - | ret - |6: - | je <5 // x^1 ==> x - | jb >7 - | fld1; fdivrp st1 - | neg eax - | cmp eax, 1; je <5 // x^-1 ==> 1/x - | jmp <1 // x^-i ==> (1/x)^i - |7: - | fpop; fld1 // x^0 ==> 1 - | ret - | - |8: // FP/FP power function x^y. - | fst dword [esp+4] - | fxch - | fst dword [esp+8] - | mov eax, [esp+4]; shl eax, 1 - | cmp eax, 0xff000000; je >2 // x^+-Inf? - | mov eax, [esp+8]; shl eax, 1; je >4 // +-0^y? - | cmp eax, 0xff000000; je >4 // +-Inf^y? - | fyl2x - | jmp ->vm_exp2raw - | - |9: // Handle x^NaN. - | fld1 - | fucomip st2 - | je >1 // 1^NaN ==> 1 - | fxch // x^NaN ==> NaN - |1: - | fpop - | ret - | - |2: // Handle x^+-Inf. - | fabs - | fld1 - | fucomip st1 - | je >3 // +-1^+-Inf ==> 1 - | fpop; fabs; fldz; mov eax, 0; setc al - | ror eax, 1; xor eax, [esp+4]; jns >3 // |x|<>1, x^+-Inf ==> +Inf/0 - | fxch - |3: - | fpop1; fabs - | ret - | - |4: // Handle +-0^y or +-Inf^y. - | cmp dword [esp+4], 0; jge <3 // y >= 0, x^y ==> |x| - | fpop; fpop - | test eax, eax; jz >5 // y < 0, +-0^y ==> +Inf - | fldz // y < 0, +-Inf^y ==> 0 - | ret - |5: - | mov dword [esp+4], 0x7f800000 // Return +Inf. - | fld dword [esp+4] - | ret - |.endif - | - |// Args in xmm0/xmm1. Ret in xmm0. xmm0-xmm2 and RC (eax) modified. - |// Needs 16 byte scratch area for x86. Also called from JIT code. - |->vm_pow_sse: - | cvtsd2si eax, xmm1 - | cvtsi2sd xmm2, eax - | ucomisd xmm1, xmm2 - | jnz >8 // Branch for FP exponents. - | jp >9 // Branch for NaN exponent. - | // Fallthrough to vm_powi_sse. - | - |// Args in xmm0/eax. Ret in xmm0. xmm0-xmm1 and eax modified. - |->vm_powi_sse: - | cmp eax, 1; jle >6 // i<=1? - | // Now 1 < (unsigned)i <= 0x80000000. - |1: // Handle leading zeros. - | test eax, 1; jnz >2 - | mulsd xmm0, xmm0 - | shr eax, 1 - | jmp <1 - |2: - | shr eax, 1; jz >5 - | movaps xmm1, xmm0 - |3: // Handle trailing bits. - | mulsd xmm0, xmm0 - | shr eax, 1; jz >4 - | jnc <3 - | mulsd xmm1, xmm0 - | jmp <3 - |4: - | mulsd xmm0, xmm1 - |5: - | ret - |6: - | je <5 // x^1 ==> x - | jb >7 // x^0 ==> 1 - | neg eax - | call <1 - | sseconst_1 xmm1, RDa - | divsd xmm1, xmm0 - | movaps xmm0, xmm1 - | ret - |7: - | sseconst_1 xmm0, RDa - | ret - | - |8: // FP/FP power function x^y. - |.if X64 - | movd rax, xmm1; shl rax, 1 - | rol rax, 12; cmp rax, 0xffe; je >2 // x^+-Inf? - | movd rax, xmm0; shl rax, 1; je >4 // +-0^y? - | rol rax, 12; cmp rax, 0xffe; je >5 // +-Inf^y? - | .if X64WIN - | movsd qword [rsp+16], xmm1 // Use scratch area. - | movsd qword [rsp+8], xmm0 - | fld qword [rsp+16] - | fld qword [rsp+8] - | .else - | movsd qword [rsp-16], xmm1 // Use red zone. - | movsd qword [rsp-8], xmm0 - | fld qword [rsp-16] - | fld qword [rsp-8] - | .endif - |.else - | movsd qword [esp+12], xmm1 // Needs 16 byte scratch area. - | movsd qword [esp+4], xmm0 - | cmp dword [esp+12], 0; jne >1 - | mov eax, [esp+16]; shl eax, 1 - | cmp eax, 0xffe00000; je >2 // x^+-Inf? - |1: - | cmp dword [esp+4], 0; jne >1 - | mov eax, [esp+8]; shl eax, 1; je >4 // +-0^y? - | cmp eax, 0xffe00000; je >5 // +-Inf^y? - |1: - | fld qword [esp+12] - | fld qword [esp+4] - |.endif - | fyl2x // y*log2(x) - | fdup; frndint; fsub st1, st0; fxch // Split into frac/int part. - | f2xm1; fld1; faddp st1; fscale; fpop1 // ==> (2^frac-1 +1) << int - |.if X64WIN - | fstp qword [rsp+8] // Use scratch area. - | movsd xmm0, qword [rsp+8] - |.elif X64 - | fstp qword [rsp-8] // Use red zone. - | movsd xmm0, qword [rsp-8] - |.else - | fstp qword [esp+4] // Needs 8 byte scratch area. - | movsd xmm0, qword [esp+4] - |.endif - | ret - | - |9: // Handle x^NaN. - | sseconst_1 xmm2, RDa - | ucomisd xmm0, xmm2; je >1 // 1^NaN ==> 1 - | movaps xmm0, xmm1 // x^NaN ==> NaN - |1: - | ret - | - |2: // Handle x^+-Inf. - | sseconst_abs xmm2, RDa - | andpd xmm0, xmm2 // |x| - | sseconst_1 xmm2, RDa - | ucomisd xmm0, xmm2; je <1 // +-1^+-Inf ==> 1 - | movmskpd eax, xmm1 - | xorps xmm0, xmm0 - | mov ah, al; setc al; xor al, ah; jne <1 // |x|<>1, x^+-Inf ==> +Inf/0 - |3: - | sseconst_hi xmm0, RDa, 7ff00000 // +Inf - | ret - | - |4: // Handle +-0^y. - | movmskpd eax, xmm1; test eax, eax; jnz <3 // y < 0, +-0^y ==> +Inf - | xorps xmm0, xmm0 // y >= 0, +-0^y ==> 0 - | ret - | - |5: // Handle +-Inf^y. - | movmskpd eax, xmm1; test eax, eax; jz <3 // y >= 0, +-Inf^y ==> +Inf - | xorps xmm0, xmm0 // y < 0, +-Inf^y ==> 0 - | ret - | - |// Callable from C: double lj_vm_foldfpm(double x, int fpm) - |// Computes fpm(x) for extended math functions. ORDER FPM. - |->vm_foldfpm: - |.if JIT - |.if X64 - | .if X64WIN - | .define fpmop, CARG2d - | .else - | .define fpmop, CARG1d - | .endif - | cmp fpmop, 1; jb ->vm_floor; je ->vm_ceil - | cmp fpmop, 3; jb ->vm_trunc; ja >2 - | sqrtsd xmm0, xmm0; ret - |2: - | .if X64WIN - | movsd qword [rsp+8], xmm0 // Use scratch area. - | fld qword [rsp+8] - | .else - | movsd qword [rsp-8], xmm0 // Use red zone. - | fld qword [rsp-8] - | .endif - | cmp fpmop, 5; ja >2 - | .if X64WIN; pop rax; .endif - | je >1 - | call ->vm_exp_x87 - | .if X64WIN; push rax; .endif - | jmp >7 - |1: - | call ->vm_exp2_x87 - | .if X64WIN; push rax; .endif - | jmp >7 - |2: ; cmp fpmop, 7; je >1; ja >2 - | fldln2; fxch; fyl2x; jmp >7 - |1: ; fld1; fxch; fyl2x; jmp >7 - |2: ; cmp fpmop, 9; je >1; ja >2 - | fldlg2; fxch; fyl2x; jmp >7 - |1: ; fsin; jmp >7 - |2: ; cmp fpmop, 11; je >1; ja >9 - | fcos; jmp >7 - |1: ; fptan; fpop - |7: - | .if X64WIN - | fstp qword [rsp+8] // Use scratch area. - | movsd xmm0, qword [rsp+8] - | .else - | fstp qword [rsp-8] // Use red zone. - | movsd xmm0, qword [rsp-8] - | .endif - | ret - |.else // x86 calling convention. - | .define fpmop, eax - |.if SSE - | mov fpmop, [esp+12] - | movsd xmm0, qword [esp+4] - | cmp fpmop, 1; je >1; ja >2 - | call ->vm_floor; jmp >7 - |1: ; call ->vm_ceil; jmp >7 - |2: ; cmp fpmop, 3; je >1; ja >2 - | call ->vm_trunc; jmp >7 - |1: - | sqrtsd xmm0, xmm0 - |7: - | movsd qword [esp+4], xmm0 // Overwrite callee-owned args. - | fld qword [esp+4] - | ret - |2: ; fld qword [esp+4] - | cmp fpmop, 5; jb ->vm_exp_x87; je ->vm_exp2_x87 - |2: ; cmp fpmop, 7; je >1; ja >2 - | fldln2; fxch; fyl2x; ret - |1: ; fld1; fxch; fyl2x; ret - |2: ; cmp fpmop, 9; je >1; ja >2 - | fldlg2; fxch; fyl2x; ret - |1: ; fsin; ret - |2: ; cmp fpmop, 11; je >1; ja >9 - | fcos; ret - |1: ; fptan; fpop; ret - |.else - | mov fpmop, [esp+12] - | fld qword [esp+4] - | cmp fpmop, 1; jb ->vm_floor; je ->vm_ceil - | cmp fpmop, 3; jb ->vm_trunc; ja >2 - | fsqrt; ret - |2: ; cmp fpmop, 5; jb ->vm_exp_x87; je ->vm_exp2_x87 - | cmp fpmop, 7; je >1; ja >2 - | fldln2; fxch; fyl2x; ret - |1: ; fld1; fxch; fyl2x; ret - |2: ; cmp fpmop, 9; je >1; ja >2 - | fldlg2; fxch; fyl2x; ret - |1: ; fsin; ret - |2: ; cmp fpmop, 11; je >1; ja >9 - | fcos; ret - |1: ; fptan; fpop; ret - |.endif - |.endif - |9: ; int3 // Bad fpm. - |.endif - | - |// Callable from C: double lj_vm_foldarith(double x, double y, int op) - |// Compute x op y for basic arithmetic operators (+ - * / % ^ and unary -) - |// and basic math functions. ORDER ARITH - |->vm_foldarith: - |.if X64 - | - | .if X64WIN - | .define foldop, CARG3d - | .else - | .define foldop, CARG1d - | .endif - | cmp foldop, 1; je >1; ja >2 - | addsd xmm0, xmm1; ret - |1: ; subsd xmm0, xmm1; ret - |2: ; cmp foldop, 3; je >1; ja >2 - | mulsd xmm0, xmm1; ret - |1: ; divsd xmm0, xmm1; ret - |2: ; cmp foldop, 5; jb ->vm_mod; je ->vm_pow - | cmp foldop, 7; je >1; ja >2 - | sseconst_sign xmm1, RDa; xorps xmm0, xmm1; ret - |1: ; sseconst_abs xmm1, RDa; andps xmm0, xmm1; ret - |2: ; cmp foldop, 9; ja >2 - |.if X64WIN - | movsd qword [rsp+8], xmm0 // Use scratch area. - | movsd qword [rsp+16], xmm1 - | fld qword [rsp+8] - | fld qword [rsp+16] - |.else - | movsd qword [rsp-8], xmm0 // Use red zone. - | movsd qword [rsp-16], xmm1 - | fld qword [rsp-8] - | fld qword [rsp-16] - |.endif - | je >1 - | fpatan - |7: - |.if X64WIN - | fstp qword [rsp+8] // Use scratch area. - | movsd xmm0, qword [rsp+8] - |.else - | fstp qword [rsp-8] // Use red zone. - | movsd xmm0, qword [rsp-8] - |.endif - | ret - |1: ; fxch; fscale; fpop1; jmp <7 - |2: ; cmp foldop, 11; je >1; ja >9 - | minsd xmm0, xmm1; ret - |1: ; maxsd xmm0, xmm1; ret - |9: ; int3 // Bad op. - | - |.elif SSE // x86 calling convention with SSE ops. - | - | .define foldop, eax - | mov foldop, [esp+20] - | movsd xmm0, qword [esp+4] - | movsd xmm1, qword [esp+12] - | cmp foldop, 1; je >1; ja >2 - | addsd xmm0, xmm1 - |7: - | movsd qword [esp+4], xmm0 // Overwrite callee-owned args. - | fld qword [esp+4] - | ret - |1: ; subsd xmm0, xmm1; jmp <7 - |2: ; cmp foldop, 3; je >1; ja >2 - | mulsd xmm0, xmm1; jmp <7 - |1: ; divsd xmm0, xmm1; jmp <7 - |2: ; cmp foldop, 5 - | je >1; ja >2 - | call ->vm_mod; jmp <7 - |1: ; pop edx; call ->vm_pow; push edx; jmp <7 // Writes to scratch area. - |2: ; cmp foldop, 7; je >1; ja >2 - | sseconst_sign xmm1, RDa; xorps xmm0, xmm1; jmp <7 - |1: ; sseconst_abs xmm1, RDa; andps xmm0, xmm1; jmp <7 - |2: ; cmp foldop, 9; ja >2 - | fld qword [esp+4] // Reload from stack - | fld qword [esp+12] - | je >1 - | fpatan; ret - |1: ; fxch; fscale; fpop1; ret - |2: ; cmp foldop, 11; je >1; ja >9 - | minsd xmm0, xmm1; jmp <7 - |1: ; maxsd xmm0, xmm1; jmp <7 - |9: ; int3 // Bad op. - | - |.else // x86 calling convention with x87 ops. - | - | mov eax, [esp+20] - | fld qword [esp+4] - | fld qword [esp+12] - | cmp eax, 1; je >1; ja >2 - | faddp st1; ret - |1: ; fsubp st1; ret - |2: ; cmp eax, 3; je >1; ja >2 - | fmulp st1; ret - |1: ; fdivp st1; ret - |2: ; cmp eax, 5; jb ->vm_mod; je ->vm_pow - | cmp eax, 7; je >1; ja >2 - | fpop; fchs; ret - |1: ; fpop; fabs; ret - |2: ; cmp eax, 9; je >1; ja >2 - | fpatan; ret - |1: ; fxch; fscale; fpop1; ret - |2: ; cmp eax, 11; je >1; ja >9 - | fucomi st1; fcmovnbe st1; fpop1; ret - |1: ; fucomi st1; fcmovbe st1; fpop1; ret - |9: ; int3 // Bad op. - | - |.endif - | - |//----------------------------------------------------------------------- - |//-- Miscellaneous functions -------------------------------------------- - |//----------------------------------------------------------------------- - | - |// int lj_vm_cpuid(uint32_t f, uint32_t res[4]) - |->vm_cpuid: - |.if X64 - | mov eax, CARG1d - | .if X64WIN; push rsi; mov rsi, CARG2; .endif - | push rbx - | cpuid - | mov [rsi], eax - | mov [rsi+4], ebx - | mov [rsi+8], ecx - | mov [rsi+12], edx - | pop rbx - | .if X64WIN; pop rsi; .endif - | ret - |.else - | pushfd - | pop edx - | mov ecx, edx - | xor edx, 0x00200000 // Toggle ID bit in flags. - | push edx - | popfd - | pushfd - | pop edx - | xor eax, eax // Zero means no features supported. - | cmp ecx, edx - | jz >1 // No ID toggle means no CPUID support. - | mov eax, [esp+4] // Argument 1 is function number. - | push edi - | push ebx - | cpuid - | mov edi, [esp+16] // Argument 2 is result area. - | mov [edi], eax - | mov [edi+4], ebx - | mov [edi+8], ecx - | mov [edi+12], edx - | pop ebx - | pop edi - |1: - | ret - |.endif - | - |//----------------------------------------------------------------------- - |//-- Assertions --------------------------------------------------------- - |//----------------------------------------------------------------------- - | - |->assert_bad_for_arg_type: -#ifdef LUA_USE_ASSERT - | int3 -#endif - | int3 - | - |//----------------------------------------------------------------------- - |//-- FFI helper functions ----------------------------------------------- - |//----------------------------------------------------------------------- - | - |// Handler for callback functions. Callback slot number in ah/al. - |->vm_ffi_callback: - |.if FFI - |.type CTSTATE, CTState, PC - |.if not X64 - | sub esp, 16 // Leave room for SAVE_ERRF etc. - |.endif - | saveregs_ // ebp/rbp already saved. ebp now holds global_State *. - | lea DISPATCH, [ebp+GG_G2DISP] - | mov CTSTATE, GL:ebp->ctype_state - | movzx eax, ax - | mov CTSTATE->cb.slot, eax - |.if X64 - | mov CTSTATE->cb.gpr[0], CARG1 - | mov CTSTATE->cb.gpr[1], CARG2 - | mov CTSTATE->cb.gpr[2], CARG3 - | mov CTSTATE->cb.gpr[3], CARG4 - | movsd qword CTSTATE->cb.fpr[0], xmm0 - | movsd qword CTSTATE->cb.fpr[1], xmm1 - | movsd qword CTSTATE->cb.fpr[2], xmm2 - | movsd qword CTSTATE->cb.fpr[3], xmm3 - |.if X64WIN - | lea rax, [rsp+CFRAME_SIZE+4*8] - |.else - | lea rax, [rsp+CFRAME_SIZE] - | mov CTSTATE->cb.gpr[4], CARG5 - | mov CTSTATE->cb.gpr[5], CARG6 - | movsd qword CTSTATE->cb.fpr[4], xmm4 - | movsd qword CTSTATE->cb.fpr[5], xmm5 - | movsd qword CTSTATE->cb.fpr[6], xmm6 - | movsd qword CTSTATE->cb.fpr[7], xmm7 - |.endif - | mov CTSTATE->cb.stack, rax - | mov CARG2, rsp - |.else - | lea eax, [esp+CFRAME_SIZE+16] - | mov CTSTATE->cb.gpr[0], FCARG1 - | mov CTSTATE->cb.gpr[1], FCARG2 - | mov CTSTATE->cb.stack, eax - | mov FCARG1, [esp+CFRAME_SIZE+12] // Move around misplaced retaddr/ebp. - | mov FCARG2, [esp+CFRAME_SIZE+8] - | mov SAVE_RET, FCARG1 - | mov SAVE_R4, FCARG2 - | mov FCARG2, esp - |.endif - | mov SAVE_PC, CTSTATE // Any value outside of bytecode is ok. - | mov FCARG1, CTSTATE - | call extern lj_ccallback_enter@8 // (CTState *cts, void *cf) - | // lua_State * returned in eax (RD). - | set_vmstate INTERP - | mov BASE, L:RD->base - | mov RD, L:RD->top - | sub RD, BASE - | mov LFUNC:RB, [BASE-8] - | shr RD, 3 - | add RD, 1 - | ins_callt - |.endif - | - |->cont_ffi_callback: // Return from FFI callback. - |.if FFI - | mov L:RA, SAVE_L - | mov CTSTATE, [DISPATCH+DISPATCH_GL(ctype_state)] - | mov aword CTSTATE->L, L:RAa - | mov L:RA->base, BASE - | mov L:RA->top, RB - | mov FCARG1, CTSTATE - | mov FCARG2, RC - | call extern lj_ccallback_leave@8 // (CTState *cts, TValue *o) - |.if X64 - | mov rax, CTSTATE->cb.gpr[0] - | movsd xmm0, qword CTSTATE->cb.fpr[0] - | jmp ->vm_leave_unw - |.else - | mov L:RB, SAVE_L - | mov eax, CTSTATE->cb.gpr[0] - | mov edx, CTSTATE->cb.gpr[1] - | cmp dword CTSTATE->cb.gpr[2], 1 - | jb >7 - | je >6 - | fld qword CTSTATE->cb.fpr[0].d - | jmp >7 - |6: - | fld dword CTSTATE->cb.fpr[0].f - |7: - | mov ecx, L:RB->top - | movzx ecx, word [ecx+6] // Get stack adjustment and copy up. - | mov SAVE_L, ecx // Must be one slot above SAVE_RET - | restoreregs - | pop ecx // Move return addr from SAVE_RET. - | add esp, [esp] // Adjust stack. - | add esp, 16 - | push ecx - | ret - |.endif - |.endif - | - |->vm_ffi_call@4: // Call C function via FFI. - | // Caveat: needs special frame unwinding, see below. - |.if FFI - |.if X64 - | .type CCSTATE, CCallState, rbx - | push rbp; mov rbp, rsp; push rbx; mov CCSTATE, CARG1 - |.else - | .type CCSTATE, CCallState, ebx - | push ebp; mov ebp, esp; push ebx; mov CCSTATE, FCARG1 - |.endif - | - | // Readjust stack. - |.if X64 - | mov eax, CCSTATE->spadj - | sub rsp, rax - |.else - | sub esp, CCSTATE->spadj - |.if WIN - | mov CCSTATE->spadj, esp - |.endif - |.endif - | - | // Copy stack slots. - | movzx ecx, byte CCSTATE->nsp - | sub ecx, 1 - | js >2 - |1: - |.if X64 - | mov rax, [CCSTATE+rcx*8+offsetof(CCallState, stack)] - | mov [rsp+rcx*8+CCALL_SPS_EXTRA*8], rax - |.else - | mov eax, [CCSTATE+ecx*4+offsetof(CCallState, stack)] - | mov [esp+ecx*4], eax - |.endif - | sub ecx, 1 - | jns <1 - |2: - | - |.if X64 - | movzx eax, byte CCSTATE->nfpr - | mov CARG1, CCSTATE->gpr[0] - | mov CARG2, CCSTATE->gpr[1] - | mov CARG3, CCSTATE->gpr[2] - | mov CARG4, CCSTATE->gpr[3] - |.if not X64WIN - | mov CARG5, CCSTATE->gpr[4] - | mov CARG6, CCSTATE->gpr[5] - |.endif - | test eax, eax; jz >5 - | movaps xmm0, CCSTATE->fpr[0] - | movaps xmm1, CCSTATE->fpr[1] - | movaps xmm2, CCSTATE->fpr[2] - | movaps xmm3, CCSTATE->fpr[3] - |.if not X64WIN - | cmp eax, 4; jbe >5 - | movaps xmm4, CCSTATE->fpr[4] - | movaps xmm5, CCSTATE->fpr[5] - | movaps xmm6, CCSTATE->fpr[6] - | movaps xmm7, CCSTATE->fpr[7] - |.endif - |5: - |.else - | mov FCARG1, CCSTATE->gpr[0] - | mov FCARG2, CCSTATE->gpr[1] - |.endif - | - | call aword CCSTATE->func - | - |.if X64 - | mov CCSTATE->gpr[0], rax - | movaps CCSTATE->fpr[0], xmm0 - |.if not X64WIN - | mov CCSTATE->gpr[1], rdx - | movaps CCSTATE->fpr[1], xmm1 - |.endif - |.else - | mov CCSTATE->gpr[0], eax - | mov CCSTATE->gpr[1], edx - | cmp byte CCSTATE->resx87, 1 - | jb >7 - | je >6 - | fstp qword CCSTATE->fpr[0].d[0] - | jmp >7 - |6: - | fstp dword CCSTATE->fpr[0].f[0] - |7: - |.if WIN - | sub CCSTATE->spadj, esp - |.endif - |.endif - | - |.if X64 - | mov rbx, [rbp-8]; leave; ret - |.else - | mov ebx, [ebp-4]; leave; ret - |.endif - |.endif - |// Note: vm_ffi_call must be the last function in this object file! - | - |//----------------------------------------------------------------------- -} - -/* Generate the code for a single instruction. */ -static void build_ins(BuildCtx *ctx, BCOp op, int defop) -{ - int vk = 0; - |// Note: aligning all instructions does not pay off. - |=>defop: - - switch (op) { - - /* -- Comparison ops ---------------------------------------------------- */ - - /* Remember: all ops branch for a true comparison, fall through otherwise. */ - - |.macro jmp_comp, lt, ge, le, gt, target - ||switch (op) { - ||case BC_ISLT: - | lt target - ||break; - ||case BC_ISGE: - | ge target - ||break; - ||case BC_ISLE: - | le target - ||break; - ||case BC_ISGT: - | gt target - ||break; - ||default: break; /* Shut up GCC. */ - ||} - |.endmacro - - case BC_ISLT: case BC_ISGE: case BC_ISLE: case BC_ISGT: - | // RA = src1, RD = src2, JMP with RD = target - | ins_AD - |.if DUALNUM - | checkint RA, >7 - | checkint RD, >8 - | mov RB, dword [BASE+RA*8] - | add PC, 4 - | cmp RB, dword [BASE+RD*8] - | jmp_comp jge, jl, jg, jle, >9 - |6: - | movzx RD, PC_RD - | branchPC RD - |9: - | ins_next - | - |7: // RA is not an integer. - | ja ->vmeta_comp - | // RA is a number. - | cmp dword [BASE+RD*8+4], LJ_TISNUM; jb >1; jne ->vmeta_comp - | // RA is a number, RD is an integer. - |.if SSE - | cvtsi2sd xmm0, dword [BASE+RD*8] - | jmp >2 - |.else - | fld qword [BASE+RA*8] - | fild dword [BASE+RD*8] - | jmp >3 - |.endif - | - |8: // RA is an integer, RD is not an integer. - | ja ->vmeta_comp - | // RA is an integer, RD is a number. - |.if SSE - | cvtsi2sd xmm1, dword [BASE+RA*8] - | movsd xmm0, qword [BASE+RD*8] - | add PC, 4 - | ucomisd xmm0, xmm1 - | jmp_comp jbe, ja, jb, jae, <9 - | jmp <6 - |.else - | fild dword [BASE+RA*8] - | jmp >2 - |.endif - |.else - | checknum RA, ->vmeta_comp - | checknum RD, ->vmeta_comp - |.endif - |.if SSE - |1: - | movsd xmm0, qword [BASE+RD*8] - |2: - | add PC, 4 - | ucomisd xmm0, qword [BASE+RA*8] - |3: - |.else - |1: - | fld qword [BASE+RA*8] // Reverse order, i.e like cmp D, A. - |2: - | fld qword [BASE+RD*8] - |3: - | add PC, 4 - | fcomparepp - |.endif - | // Unordered: all of ZF CF PF set, ordered: PF clear. - | // To preserve NaN semantics GE/GT branch on unordered, but LT/LE don't. - |.if DUALNUM - | jmp_comp jbe, ja, jb, jae, <9 - | jmp <6 - |.else - | jmp_comp jbe, ja, jb, jae, >1 - | movzx RD, PC_RD - | branchPC RD - |1: - | ins_next - |.endif - break; - - case BC_ISEQV: case BC_ISNEV: - vk = op == BC_ISEQV; - | ins_AD // RA = src1, RD = src2, JMP with RD = target - | mov RB, [BASE+RD*8+4] - | add PC, 4 - |.if DUALNUM - | cmp RB, LJ_TISNUM; jne >7 - | checkint RA, >8 - | mov RB, dword [BASE+RD*8] - | cmp RB, dword [BASE+RA*8] - if (vk) { - | jne >9 - } else { - | je >9 - } - | movzx RD, PC_RD - | branchPC RD - |9: - | ins_next - | - |7: // RD is not an integer. - | ja >5 - | // RD is a number. - | cmp dword [BASE+RA*8+4], LJ_TISNUM; jb >1; jne >5 - | // RD is a number, RA is an integer. - |.if SSE - | cvtsi2sd xmm0, dword [BASE+RA*8] - |.else - | fild dword [BASE+RA*8] - |.endif - | jmp >2 - | - |8: // RD is an integer, RA is not an integer. - | ja >5 - | // RD is an integer, RA is a number. - |.if SSE - | cvtsi2sd xmm0, dword [BASE+RD*8] - | ucomisd xmm0, qword [BASE+RA*8] - |.else - | fild dword [BASE+RD*8] - | fld qword [BASE+RA*8] - |.endif - | jmp >4 - | - |.else - | cmp RB, LJ_TISNUM; jae >5 - | checknum RA, >5 - |.endif - |.if SSE - |1: - | movsd xmm0, qword [BASE+RA*8] - |2: - | ucomisd xmm0, qword [BASE+RD*8] - |4: - |.else - |1: - | fld qword [BASE+RA*8] - |2: - | fld qword [BASE+RD*8] - |4: - | fcomparepp - |.endif - iseqne_fp: - if (vk) { - | jp >2 // Unordered means not equal. - | jne >2 - } else { - | jp >2 // Unordered means not equal. - | je >1 - } - iseqne_end: - if (vk) { - |1: // EQ: Branch to the target. - | movzx RD, PC_RD - | branchPC RD - |2: // NE: Fallthrough to next instruction. - |.if not FFI - |3: - |.endif - } else { - |.if not FFI - |3: - |.endif - |2: // NE: Branch to the target. - | movzx RD, PC_RD - | branchPC RD - |1: // EQ: Fallthrough to next instruction. - } - if (LJ_DUALNUM && (op == BC_ISEQV || op == BC_ISNEV || - op == BC_ISEQN || op == BC_ISNEN)) { - | jmp <9 - } else { - | ins_next - } - | - if (op == BC_ISEQV || op == BC_ISNEV) { - |5: // Either or both types are not numbers. - |.if FFI - | cmp RB, LJ_TCDATA; je ->vmeta_equal_cd - | checktp RA, LJ_TCDATA; je ->vmeta_equal_cd - |.endif - | checktp RA, RB // Compare types. - | jne <2 // Not the same type? - | cmp RB, LJ_TISPRI - | jae <1 // Same type and primitive type? - | - | // Same types and not a primitive type. Compare GCobj or pvalue. - | mov RA, [BASE+RA*8] - | mov RD, [BASE+RD*8] - | cmp RA, RD - | je <1 // Same GCobjs or pvalues? - | cmp RB, LJ_TISTABUD - | ja <2 // Different objects and not table/ud? - |.if X64 - | cmp RB, LJ_TUDATA // And not 64 bit lightuserdata. - | jb <2 - |.endif - | - | // Different tables or userdatas. Need to check __eq metamethod. - | // Field metatable must be at same offset for GCtab and GCudata! - | mov TAB:RB, TAB:RA->metatable - | test TAB:RB, TAB:RB - | jz <2 // No metatable? - | test byte TAB:RB->nomm, 1<vmeta_equal // Handle __eq metamethod. - } else { - |.if FFI - |3: - | cmp RB, LJ_TCDATA - if (LJ_DUALNUM && vk) { - | jne <9 - } else { - | jne <2 - } - | jmp ->vmeta_equal_cd - |.endif - } - break; - case BC_ISEQS: case BC_ISNES: - vk = op == BC_ISEQS; - | ins_AND // RA = src, RD = str const, JMP with RD = target - | mov RB, [BASE+RA*8+4] - | add PC, 4 - | cmp RB, LJ_TSTR; jne >3 - | mov RA, [BASE+RA*8] - | cmp RA, [KBASE+RD*4] - iseqne_test: - if (vk) { - | jne >2 - } else { - | je >1 - } - goto iseqne_end; - case BC_ISEQN: case BC_ISNEN: - vk = op == BC_ISEQN; - | ins_AD // RA = src, RD = num const, JMP with RD = target - | mov RB, [BASE+RA*8+4] - | add PC, 4 - |.if DUALNUM - | cmp RB, LJ_TISNUM; jne >7 - | cmp dword [KBASE+RD*8+4], LJ_TISNUM; jne >8 - | mov RB, dword [KBASE+RD*8] - | cmp RB, dword [BASE+RA*8] - if (vk) { - | jne >9 - } else { - | je >9 - } - | movzx RD, PC_RD - | branchPC RD - |9: - | ins_next - | - |7: // RA is not an integer. - | ja >3 - | // RA is a number. - | cmp dword [KBASE+RD*8+4], LJ_TISNUM; jb >1 - | // RA is a number, RD is an integer. - |.if SSE - | cvtsi2sd xmm0, dword [KBASE+RD*8] - |.else - | fild dword [KBASE+RD*8] - |.endif - | jmp >2 - | - |8: // RA is an integer, RD is a number. - |.if SSE - | cvtsi2sd xmm0, dword [BASE+RA*8] - | ucomisd xmm0, qword [KBASE+RD*8] - |.else - | fild dword [BASE+RA*8] - | fld qword [KBASE+RD*8] - |.endif - | jmp >4 - |.else - | cmp RB, LJ_TISNUM; jae >3 - |.endif - |.if SSE - |1: - | movsd xmm0, qword [KBASE+RD*8] - |2: - | ucomisd xmm0, qword [BASE+RA*8] - |4: - |.else - |1: - | fld qword [KBASE+RD*8] - |2: - | fld qword [BASE+RA*8] - |4: - | fcomparepp - |.endif - goto iseqne_fp; - case BC_ISEQP: case BC_ISNEP: - vk = op == BC_ISEQP; - | ins_AND // RA = src, RD = primitive type (~), JMP with RD = target - | mov RB, [BASE+RA*8+4] - | add PC, 4 - | cmp RB, RD - if (!LJ_HASFFI) goto iseqne_test; - if (vk) { - | jne >3 - | movzx RD, PC_RD - | branchPC RD - |2: - | ins_next - |3: - | cmp RB, LJ_TCDATA; jne <2 - | jmp ->vmeta_equal_cd - } else { - | je >2 - | cmp RB, LJ_TCDATA; je ->vmeta_equal_cd - | movzx RD, PC_RD - | branchPC RD - |2: - | ins_next - } - break; - - /* -- Unary test and copy ops ------------------------------------------- */ - - case BC_ISTC: case BC_ISFC: case BC_IST: case BC_ISF: - | ins_AD // RA = dst or unused, RD = src, JMP with RD = target - | mov RB, [BASE+RD*8+4] - | add PC, 4 - | cmp RB, LJ_TISTRUECOND - if (op == BC_IST || op == BC_ISTC) { - | jae >1 - } else { - | jb >1 - } - if (op == BC_ISTC || op == BC_ISFC) { - | mov [BASE+RA*8+4], RB - | mov RB, [BASE+RD*8] - | mov [BASE+RA*8], RB - } - | movzx RD, PC_RD - | branchPC RD - |1: // Fallthrough to the next instruction. - | ins_next - break; - - /* -- Unary ops --------------------------------------------------------- */ - - case BC_MOV: - | ins_AD // RA = dst, RD = src - |.if X64 - | mov RBa, [BASE+RD*8] - | mov [BASE+RA*8], RBa - |.else - | mov RB, [BASE+RD*8+4] - | mov RD, [BASE+RD*8] - | mov [BASE+RA*8+4], RB - | mov [BASE+RA*8], RD - |.endif - | ins_next_ - break; - case BC_NOT: - | ins_AD // RA = dst, RD = src - | xor RB, RB - | checktp RD, LJ_TISTRUECOND - | adc RB, LJ_TTRUE - | mov [BASE+RA*8+4], RB - | ins_next - break; - case BC_UNM: - | ins_AD // RA = dst, RD = src - |.if DUALNUM - | checkint RD, >5 - | mov RB, [BASE+RD*8] - | neg RB - | jo >4 - | mov dword [BASE+RA*8+4], LJ_TISNUM - | mov dword [BASE+RA*8], RB - |9: - | ins_next - |4: - | mov dword [BASE+RA*8+4], 0x41e00000 // 2^31. - | mov dword [BASE+RA*8], 0 - | jmp <9 - |5: - | ja ->vmeta_unm - |.else - | checknum RD, ->vmeta_unm - |.endif - |.if SSE - | movsd xmm0, qword [BASE+RD*8] - | sseconst_sign xmm1, RDa - | xorps xmm0, xmm1 - | movsd qword [BASE+RA*8], xmm0 - |.else - | fld qword [BASE+RD*8] - | fchs - | fstp qword [BASE+RA*8] - |.endif - |.if DUALNUM - | jmp <9 - |.else - | ins_next - |.endif - break; - case BC_LEN: - | ins_AD // RA = dst, RD = src - | checkstr RD, >2 - | mov STR:RD, [BASE+RD*8] - |.if DUALNUM - | mov RD, dword STR:RD->len - |1: - | mov dword [BASE+RA*8+4], LJ_TISNUM - | mov dword [BASE+RA*8], RD - |.elif SSE - | xorps xmm0, xmm0 - | cvtsi2sd xmm0, dword STR:RD->len - |1: - | movsd qword [BASE+RA*8], xmm0 - |.else - | fild dword STR:RD->len - |1: - | fstp qword [BASE+RA*8] - |.endif - | ins_next - |2: - | checktab RD, ->vmeta_len - | mov TAB:FCARG1, [BASE+RD*8] -#if LJ_52 - | mov TAB:RB, TAB:FCARG1->metatable - | cmp TAB:RB, 0 - | jnz >9 - |3: -#endif - |->BC_LEN_Z: - | mov RB, BASE // Save BASE. - | call extern lj_tab_len@4 // (GCtab *t) - | // Length of table returned in eax (RD). - |.if DUALNUM - | // Nothing to do. - |.elif SSE - | cvtsi2sd xmm0, RD - |.else - | mov ARG1, RD - | fild ARG1 - |.endif - | mov BASE, RB // Restore BASE. - | movzx RA, PC_RA - | jmp <1 -#if LJ_52 - |9: // Check for __len. - | test byte TAB:RB->nomm, 1<vmeta_len // 'no __len' flag NOT set: check. -#endif - break; - - /* -- Binary ops -------------------------------------------------------- */ - - |.macro ins_arithpre, x87ins, sseins, ssereg - | ins_ABC - ||vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN); - ||switch (vk) { - ||case 0: - | checknum RB, ->vmeta_arith_vn - | .if DUALNUM - | cmp dword [KBASE+RC*8+4], LJ_TISNUM; jae ->vmeta_arith_vn - | .endif - | .if SSE - | movsd xmm0, qword [BASE+RB*8] - | sseins ssereg, qword [KBASE+RC*8] - | .else - | fld qword [BASE+RB*8] - | x87ins qword [KBASE+RC*8] - | .endif - || break; - ||case 1: - | checknum RB, ->vmeta_arith_nv - | .if DUALNUM - | cmp dword [KBASE+RC*8+4], LJ_TISNUM; jae ->vmeta_arith_nv - | .endif - | .if SSE - | movsd xmm0, qword [KBASE+RC*8] - | sseins ssereg, qword [BASE+RB*8] - | .else - | fld qword [KBASE+RC*8] - | x87ins qword [BASE+RB*8] - | .endif - || break; - ||default: - | checknum RB, ->vmeta_arith_vv - | checknum RC, ->vmeta_arith_vv - | .if SSE - | movsd xmm0, qword [BASE+RB*8] - | sseins ssereg, qword [BASE+RC*8] - | .else - | fld qword [BASE+RB*8] - | x87ins qword [BASE+RC*8] - | .endif - || break; - ||} - |.endmacro - | - |.macro ins_arithdn, intins - | ins_ABC - ||vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN); - ||switch (vk) { - ||case 0: - | checkint RB, ->vmeta_arith_vn - | cmp dword [KBASE+RC*8+4], LJ_TISNUM; jne ->vmeta_arith_vn - | mov RB, [BASE+RB*8] - | intins RB, [KBASE+RC*8]; jo ->vmeta_arith_vno - || break; - ||case 1: - | checkint RB, ->vmeta_arith_nv - | cmp dword [KBASE+RC*8+4], LJ_TISNUM; jne ->vmeta_arith_nv - | mov RC, [KBASE+RC*8] - | intins RC, [BASE+RB*8]; jo ->vmeta_arith_nvo - || break; - ||default: - | checkint RB, ->vmeta_arith_vv - | checkint RC, ->vmeta_arith_vv - | mov RB, [BASE+RB*8] - | intins RB, [BASE+RC*8]; jo ->vmeta_arith_vvo - || break; - ||} - | mov dword [BASE+RA*8+4], LJ_TISNUM - ||if (vk == 1) { - | mov dword [BASE+RA*8], RC - ||} else { - | mov dword [BASE+RA*8], RB - ||} - | ins_next - |.endmacro - | - |.macro ins_arithpost - |.if SSE - | movsd qword [BASE+RA*8], xmm0 - |.else - | fstp qword [BASE+RA*8] - |.endif - |.endmacro - | - |.macro ins_arith, x87ins, sseins - | ins_arithpre x87ins, sseins, xmm0 - | ins_arithpost - | ins_next - |.endmacro - | - |.macro ins_arith, intins, x87ins, sseins - |.if DUALNUM - | ins_arithdn intins - |.else - | ins_arith, x87ins, sseins - |.endif - |.endmacro - - | // RA = dst, RB = src1 or num const, RC = src2 or num const - case BC_ADDVN: case BC_ADDNV: case BC_ADDVV: - | ins_arith add, fadd, addsd - break; - case BC_SUBVN: case BC_SUBNV: case BC_SUBVV: - | ins_arith sub, fsub, subsd - break; - case BC_MULVN: case BC_MULNV: case BC_MULVV: - | ins_arith imul, fmul, mulsd - break; - case BC_DIVVN: case BC_DIVNV: case BC_DIVVV: - | ins_arith fdiv, divsd - break; - case BC_MODVN: - | ins_arithpre fld, movsd, xmm1 - |->BC_MODVN_Z: - | call ->vm_mod - | ins_arithpost - | ins_next - break; - case BC_MODNV: case BC_MODVV: - | ins_arithpre fld, movsd, xmm1 - | jmp ->BC_MODVN_Z // Avoid 3 copies. It's slow anyway. - break; - case BC_POW: - | ins_arithpre fld, movsd, xmm1 - | call ->vm_pow - | ins_arithpost - | ins_next - break; - - case BC_CAT: - | ins_ABC // RA = dst, RB = src_start, RC = src_end - |.if X64 - | mov L:CARG1d, SAVE_L - | mov L:CARG1d->base, BASE - | lea CARG2d, [BASE+RC*8] - | mov CARG3d, RC - | sub CARG3d, RB - |->BC_CAT_Z: - | mov L:RB, L:CARG1d - |.else - | lea RA, [BASE+RC*8] - | sub RC, RB - | mov ARG2, RA - | mov ARG3, RC - |->BC_CAT_Z: - | mov L:RB, SAVE_L - | mov ARG1, L:RB - | mov L:RB->base, BASE - |.endif - | mov SAVE_PC, PC - | call extern lj_meta_cat // (lua_State *L, TValue *top, int left) - | // NULL (finished) or TValue * (metamethod) returned in eax (RC). - | mov BASE, L:RB->base - | test RC, RC - | jnz ->vmeta_binop - | movzx RB, PC_RB // Copy result to Stk[RA] from Stk[RB]. - | movzx RA, PC_RA - |.if X64 - | mov RCa, [BASE+RB*8] - | mov [BASE+RA*8], RCa - |.else - | mov RC, [BASE+RB*8+4] - | mov RB, [BASE+RB*8] - | mov [BASE+RA*8+4], RC - | mov [BASE+RA*8], RB - |.endif - | ins_next - break; - - /* -- Constant ops ------------------------------------------------------ */ - - case BC_KSTR: - | ins_AND // RA = dst, RD = str const (~) - | mov RD, [KBASE+RD*4] - | mov dword [BASE+RA*8+4], LJ_TSTR - | mov [BASE+RA*8], RD - | ins_next - break; - case BC_KCDATA: - |.if FFI - | ins_AND // RA = dst, RD = cdata const (~) - | mov RD, [KBASE+RD*4] - | mov dword [BASE+RA*8+4], LJ_TCDATA - | mov [BASE+RA*8], RD - | ins_next - |.endif - break; - case BC_KSHORT: - | ins_AD // RA = dst, RD = signed int16 literal - |.if DUALNUM - | movsx RD, RDW - | mov dword [BASE+RA*8+4], LJ_TISNUM - | mov dword [BASE+RA*8], RD - |.elif SSE - | movsx RD, RDW // Sign-extend literal. - | cvtsi2sd xmm0, RD - | movsd qword [BASE+RA*8], xmm0 - |.else - | fild PC_RD // Refetch signed RD from instruction. - | fstp qword [BASE+RA*8] - |.endif - | ins_next - break; - case BC_KNUM: - | ins_AD // RA = dst, RD = num const - |.if SSE - | movsd xmm0, qword [KBASE+RD*8] - | movsd qword [BASE+RA*8], xmm0 - |.else - | fld qword [KBASE+RD*8] - | fstp qword [BASE+RA*8] - |.endif - | ins_next - break; - case BC_KPRI: - | ins_AND // RA = dst, RD = primitive type (~) - | mov [BASE+RA*8+4], RD - | ins_next - break; - case BC_KNIL: - | ins_AD // RA = dst_start, RD = dst_end - | lea RA, [BASE+RA*8+12] - | lea RD, [BASE+RD*8+4] - | mov RB, LJ_TNIL - | mov [RA-8], RB // Sets minimum 2 slots. - |1: - | mov [RA], RB - | add RA, 8 - | cmp RA, RD - | jbe <1 - | ins_next - break; - - /* -- Upvalue and function ops ------------------------------------------ */ - - case BC_UGET: - | ins_AD // RA = dst, RD = upvalue # - | mov LFUNC:RB, [BASE-8] - | mov UPVAL:RB, [LFUNC:RB+RD*4+offsetof(GCfuncL, uvptr)] - | mov RB, UPVAL:RB->v - |.if X64 - | mov RDa, [RB] - | mov [BASE+RA*8], RDa - |.else - | mov RD, [RB+4] - | mov RB, [RB] - | mov [BASE+RA*8+4], RD - | mov [BASE+RA*8], RB - |.endif - | ins_next - break; - case BC_USETV: -#define TV2MARKOFS \ - ((int32_t)offsetof(GCupval, marked)-(int32_t)offsetof(GCupval, tv)) - | ins_AD // RA = upvalue #, RD = src - | mov LFUNC:RB, [BASE-8] - | mov UPVAL:RB, [LFUNC:RB+RA*4+offsetof(GCfuncL, uvptr)] - | cmp byte UPVAL:RB->closed, 0 - | mov RB, UPVAL:RB->v - | mov RA, [BASE+RD*8] - | mov RD, [BASE+RD*8+4] - | mov [RB], RA - | mov [RB+4], RD - | jz >1 - | // Check barrier for closed upvalue. - | test byte [RB+TV2MARKOFS], LJ_GC_BLACK // isblack(uv) - | jnz >2 - |1: - | ins_next - | - |2: // Upvalue is black. Check if new value is collectable and white. - | sub RD, LJ_TISGCV - | cmp RD, LJ_TNUMX - LJ_TISGCV // tvisgcv(v) - | jbe <1 - | test byte GCOBJ:RA->gch.marked, LJ_GC_WHITES // iswhite(v) - | jz <1 - | // Crossed a write barrier. Move the barrier forward. - |.if X64 and not X64WIN - | mov FCARG2, RB - | mov RB, BASE // Save BASE. - |.else - | xchg FCARG2, RB // Save BASE (FCARG2 == BASE). - |.endif - | lea GL:FCARG1, [DISPATCH+GG_DISP2G] - | call extern lj_gc_barrieruv@8 // (global_State *g, TValue *tv) - | mov BASE, RB // Restore BASE. - | jmp <1 - break; -#undef TV2MARKOFS - case BC_USETS: - | ins_AND // RA = upvalue #, RD = str const (~) - | mov LFUNC:RB, [BASE-8] - | mov UPVAL:RB, [LFUNC:RB+RA*4+offsetof(GCfuncL, uvptr)] - | mov GCOBJ:RA, [KBASE+RD*4] - | mov RD, UPVAL:RB->v - | mov [RD], GCOBJ:RA - | mov dword [RD+4], LJ_TSTR - | test byte UPVAL:RB->marked, LJ_GC_BLACK // isblack(uv) - | jnz >2 - |1: - | ins_next - | - |2: // Check if string is white and ensure upvalue is closed. - | test byte GCOBJ:RA->gch.marked, LJ_GC_WHITES // iswhite(str) - | jz <1 - | cmp byte UPVAL:RB->closed, 0 - | jz <1 - | // Crossed a write barrier. Move the barrier forward. - | mov RB, BASE // Save BASE (FCARG2 == BASE). - | mov FCARG2, RD - | lea GL:FCARG1, [DISPATCH+GG_DISP2G] - | call extern lj_gc_barrieruv@8 // (global_State *g, TValue *tv) - | mov BASE, RB // Restore BASE. - | jmp <1 - break; - case BC_USETN: - | ins_AD // RA = upvalue #, RD = num const - | mov LFUNC:RB, [BASE-8] - |.if SSE - | movsd xmm0, qword [KBASE+RD*8] - |.else - | fld qword [KBASE+RD*8] - |.endif - | mov UPVAL:RB, [LFUNC:RB+RA*4+offsetof(GCfuncL, uvptr)] - | mov RA, UPVAL:RB->v - |.if SSE - | movsd qword [RA], xmm0 - |.else - | fstp qword [RA] - |.endif - | ins_next - break; - case BC_USETP: - | ins_AND // RA = upvalue #, RD = primitive type (~) - | mov LFUNC:RB, [BASE-8] - | mov UPVAL:RB, [LFUNC:RB+RA*4+offsetof(GCfuncL, uvptr)] - | mov RA, UPVAL:RB->v - | mov [RA+4], RD - | ins_next - break; - case BC_UCLO: - | ins_AD // RA = level, RD = target - | branchPC RD // Do this first to free RD. - | mov L:RB, SAVE_L - | cmp dword L:RB->openupval, 0 - | je >1 - | mov L:RB->base, BASE - | lea FCARG2, [BASE+RA*8] // Caveat: FCARG2 == BASE - | mov L:FCARG1, L:RB // Caveat: FCARG1 == RA - | call extern lj_func_closeuv@8 // (lua_State *L, TValue *level) - | mov BASE, L:RB->base - |1: - | ins_next - break; - - case BC_FNEW: - | ins_AND // RA = dst, RD = proto const (~) (holding function prototype) - |.if X64 - | mov L:RB, SAVE_L - | mov L:RB->base, BASE // Caveat: CARG2d/CARG3d may be BASE. - | mov CARG3d, [BASE-8] - | mov CARG2d, [KBASE+RD*4] // Fetch GCproto *. - | mov CARG1d, L:RB - |.else - | mov LFUNC:RA, [BASE-8] - | mov PROTO:RD, [KBASE+RD*4] // Fetch GCproto *. - | mov L:RB, SAVE_L - | mov ARG3, LFUNC:RA - | mov ARG2, PROTO:RD - | mov ARG1, L:RB - | mov L:RB->base, BASE - |.endif - | mov SAVE_PC, PC - | // (lua_State *L, GCproto *pt, GCfuncL *parent) - | call extern lj_func_newL_gc - | // GCfuncL * returned in eax (RC). - | mov BASE, L:RB->base - | movzx RA, PC_RA - | mov [BASE+RA*8], LFUNC:RC - | mov dword [BASE+RA*8+4], LJ_TFUNC - | ins_next - break; - - /* -- Table ops --------------------------------------------------------- */ - - case BC_TNEW: - | ins_AD // RA = dst, RD = hbits|asize - | mov L:RB, SAVE_L - | mov L:RB->base, BASE - | mov RA, [DISPATCH+DISPATCH_GL(gc.total)] - | cmp RA, [DISPATCH+DISPATCH_GL(gc.threshold)] - | mov SAVE_PC, PC - | jae >5 - |1: - |.if X64 - | mov CARG3d, RD - | and RD, 0x7ff - | shr CARG3d, 11 - |.else - | mov RA, RD - | and RD, 0x7ff - | shr RA, 11 - | mov ARG3, RA - |.endif - | cmp RD, 0x7ff - | je >3 - |2: - |.if X64 - | mov L:CARG1d, L:RB - | mov CARG2d, RD - |.else - | mov ARG1, L:RB - | mov ARG2, RD - |.endif - | call extern lj_tab_new // (lua_State *L, int32_t asize, uint32_t hbits) - | // Table * returned in eax (RC). - | mov BASE, L:RB->base - | movzx RA, PC_RA - | mov [BASE+RA*8], TAB:RC - | mov dword [BASE+RA*8+4], LJ_TTAB - | ins_next - |3: // Turn 0x7ff into 0x801. - | mov RD, 0x801 - | jmp <2 - |5: - | mov L:FCARG1, L:RB - | call extern lj_gc_step_fixtop@4 // (lua_State *L) - | movzx RD, PC_RD - | jmp <1 - break; - case BC_TDUP: - | ins_AND // RA = dst, RD = table const (~) (holding template table) - | mov L:RB, SAVE_L - | mov RA, [DISPATCH+DISPATCH_GL(gc.total)] - | mov SAVE_PC, PC - | cmp RA, [DISPATCH+DISPATCH_GL(gc.threshold)] - | mov L:RB->base, BASE - | jae >3 - |2: - | mov TAB:FCARG2, [KBASE+RD*4] // Caveat: FCARG2 == BASE - | mov L:FCARG1, L:RB // Caveat: FCARG1 == RA - | call extern lj_tab_dup@8 // (lua_State *L, Table *kt) - | // Table * returned in eax (RC). - | mov BASE, L:RB->base - | movzx RA, PC_RA - | mov [BASE+RA*8], TAB:RC - | mov dword [BASE+RA*8+4], LJ_TTAB - | ins_next - |3: - | mov L:FCARG1, L:RB - | call extern lj_gc_step_fixtop@4 // (lua_State *L) - | movzx RD, PC_RD // Need to reload RD. - | not RDa - | jmp <2 - break; - - case BC_GGET: - | ins_AND // RA = dst, RD = str const (~) - | mov LFUNC:RB, [BASE-8] - | mov TAB:RB, LFUNC:RB->env - | mov STR:RC, [KBASE+RD*4] - | jmp ->BC_TGETS_Z - break; - case BC_GSET: - | ins_AND // RA = src, RD = str const (~) - | mov LFUNC:RB, [BASE-8] - | mov TAB:RB, LFUNC:RB->env - | mov STR:RC, [KBASE+RD*4] - | jmp ->BC_TSETS_Z - break; - - case BC_TGETV: - | ins_ABC // RA = dst, RB = table, RC = key - | checktab RB, ->vmeta_tgetv - | mov TAB:RB, [BASE+RB*8] - | - | // Integer key? - |.if DUALNUM - | checkint RC, >5 - | mov RC, dword [BASE+RC*8] - |.else - | // Convert number to int and back and compare. - | checknum RC, >5 - |.if SSE - | movsd xmm0, qword [BASE+RC*8] - | cvtsd2si RC, xmm0 - | cvtsi2sd xmm1, RC - | ucomisd xmm0, xmm1 - |.else - | fld qword [BASE+RC*8] - | fist ARG1 - | fild ARG1 - | fcomparepp - | mov RC, ARG1 - |.endif - | jne ->vmeta_tgetv // Generic numeric key? Use fallback. - |.endif - | cmp RC, TAB:RB->asize // Takes care of unordered, too. - | jae ->vmeta_tgetv // Not in array part? Use fallback. - | shl RC, 3 - | add RC, TAB:RB->array - | cmp dword [RC+4], LJ_TNIL // Avoid overwriting RB in fastpath. - | je >2 - | // Get array slot. - |.if X64 - | mov RBa, [RC] - | mov [BASE+RA*8], RBa - |.else - | mov RB, [RC] - | mov RC, [RC+4] - | mov [BASE+RA*8], RB - | mov [BASE+RA*8+4], RC - |.endif - |1: - | ins_next - | - |2: // Check for __index if table value is nil. - | cmp dword TAB:RB->metatable, 0 // Shouldn't overwrite RA for fastpath. - | jz >3 - | mov TAB:RA, TAB:RB->metatable - | test byte TAB:RA->nomm, 1<vmeta_tgetv // 'no __index' flag NOT set: check. - | movzx RA, PC_RA // Restore RA. - |3: - | mov dword [BASE+RA*8+4], LJ_TNIL - | jmp <1 - | - |5: // String key? - | checkstr RC, ->vmeta_tgetv - | mov STR:RC, [BASE+RC*8] - | jmp ->BC_TGETS_Z - break; - case BC_TGETS: - | ins_ABC // RA = dst, RB = table, RC = str const (~) - | not RCa - | mov STR:RC, [KBASE+RC*4] - | checktab RB, ->vmeta_tgets - | mov TAB:RB, [BASE+RB*8] - |->BC_TGETS_Z: // RB = GCtab *, RC = GCstr *, refetches PC_RA. - | mov RA, TAB:RB->hmask - | and RA, STR:RC->hash - | imul RA, #NODE - | add NODE:RA, TAB:RB->node - |1: - | cmp dword NODE:RA->key.it, LJ_TSTR - | jne >4 - | cmp dword NODE:RA->key.gcr, STR:RC - | jne >4 - | // Ok, key found. Assumes: offsetof(Node, val) == 0 - | cmp dword [RA+4], LJ_TNIL // Avoid overwriting RB in fastpath. - | je >5 // Key found, but nil value? - | movzx RC, PC_RA - | // Get node value. - |.if X64 - | mov RBa, [RA] - | mov [BASE+RC*8], RBa - |.else - | mov RB, [RA] - | mov RA, [RA+4] - | mov [BASE+RC*8], RB - | mov [BASE+RC*8+4], RA - |.endif - |2: - | ins_next - | - |3: - | movzx RC, PC_RA - | mov dword [BASE+RC*8+4], LJ_TNIL - | jmp <2 - | - |4: // Follow hash chain. - | mov NODE:RA, NODE:RA->next - | test NODE:RA, NODE:RA - | jnz <1 - | // End of hash chain: key not found, nil result. - | - |5: // Check for __index if table value is nil. - | mov TAB:RA, TAB:RB->metatable - | test TAB:RA, TAB:RA - | jz <3 // No metatable: done. - | test byte TAB:RA->nomm, 1<vmeta_tgets // Caveat: preserve STR:RC. - break; - case BC_TGETB: - | ins_ABC // RA = dst, RB = table, RC = byte literal - | checktab RB, ->vmeta_tgetb - | mov TAB:RB, [BASE+RB*8] - | cmp RC, TAB:RB->asize - | jae ->vmeta_tgetb - | shl RC, 3 - | add RC, TAB:RB->array - | cmp dword [RC+4], LJ_TNIL // Avoid overwriting RB in fastpath. - | je >2 - | // Get array slot. - |.if X64 - | mov RBa, [RC] - | mov [BASE+RA*8], RBa - |.else - | mov RB, [RC] - | mov RC, [RC+4] - | mov [BASE+RA*8], RB - | mov [BASE+RA*8+4], RC - |.endif - |1: - | ins_next - | - |2: // Check for __index if table value is nil. - | cmp dword TAB:RB->metatable, 0 // Shouldn't overwrite RA for fastpath. - | jz >3 - | mov TAB:RA, TAB:RB->metatable - | test byte TAB:RA->nomm, 1<vmeta_tgetb // 'no __index' flag NOT set: check. - | movzx RA, PC_RA // Restore RA. - |3: - | mov dword [BASE+RA*8+4], LJ_TNIL - | jmp <1 - break; - - case BC_TSETV: - | ins_ABC // RA = src, RB = table, RC = key - | checktab RB, ->vmeta_tsetv - | mov TAB:RB, [BASE+RB*8] - | - | // Integer key? - |.if DUALNUM - | checkint RC, >5 - | mov RC, dword [BASE+RC*8] - |.else - | // Convert number to int and back and compare. - | checknum RC, >5 - |.if SSE - | movsd xmm0, qword [BASE+RC*8] - | cvtsd2si RC, xmm0 - | cvtsi2sd xmm1, RC - | ucomisd xmm0, xmm1 - |.else - | fld qword [BASE+RC*8] - | fist ARG1 - | fild ARG1 - | fcomparepp - | mov RC, ARG1 - |.endif - | jne ->vmeta_tsetv // Generic numeric key? Use fallback. - |.endif - | cmp RC, TAB:RB->asize // Takes care of unordered, too. - | jae ->vmeta_tsetv - | shl RC, 3 - | add RC, TAB:RB->array - | cmp dword [RC+4], LJ_TNIL - | je >3 // Previous value is nil? - |1: - | test byte TAB:RB->marked, LJ_GC_BLACK // isblack(table) - | jnz >7 - |2: // Set array slot. - |.if X64 - | mov RBa, [BASE+RA*8] - | mov [RC], RBa - |.else - | mov RB, [BASE+RA*8+4] - | mov RA, [BASE+RA*8] - | mov [RC+4], RB - | mov [RC], RA - |.endif - | ins_next - | - |3: // Check for __newindex if previous value is nil. - | cmp dword TAB:RB->metatable, 0 // Shouldn't overwrite RA for fastpath. - | jz <1 - | mov TAB:RA, TAB:RB->metatable - | test byte TAB:RA->nomm, 1<vmeta_tsetv // 'no __newindex' flag NOT set: check. - | movzx RA, PC_RA // Restore RA. - | jmp <1 - | - |5: // String key? - | checkstr RC, ->vmeta_tsetv - | mov STR:RC, [BASE+RC*8] - | jmp ->BC_TSETS_Z - | - |7: // Possible table write barrier for the value. Skip valiswhite check. - | barrierback TAB:RB, RA - | movzx RA, PC_RA // Restore RA. - | jmp <2 - break; - case BC_TSETS: - | ins_ABC // RA = src, RB = table, RC = str const (~) - | not RCa - | mov STR:RC, [KBASE+RC*4] - | checktab RB, ->vmeta_tsets - | mov TAB:RB, [BASE+RB*8] - |->BC_TSETS_Z: // RB = GCtab *, RC = GCstr *, refetches PC_RA. - | mov RA, TAB:RB->hmask - | and RA, STR:RC->hash - | imul RA, #NODE - | mov byte TAB:RB->nomm, 0 // Clear metamethod cache. - | add NODE:RA, TAB:RB->node - |1: - | cmp dword NODE:RA->key.it, LJ_TSTR - | jne >5 - | cmp dword NODE:RA->key.gcr, STR:RC - | jne >5 - | // Ok, key found. Assumes: offsetof(Node, val) == 0 - | cmp dword [RA+4], LJ_TNIL - | je >4 // Previous value is nil? - |2: - | test byte TAB:RB->marked, LJ_GC_BLACK // isblack(table) - | jnz >7 - |3: // Set node value. - | movzx RC, PC_RA - |.if X64 - | mov RBa, [BASE+RC*8] - | mov [RA], RBa - |.else - | mov RB, [BASE+RC*8+4] - | mov RC, [BASE+RC*8] - | mov [RA+4], RB - | mov [RA], RC - |.endif - | ins_next - | - |4: // Check for __newindex if previous value is nil. - | cmp dword TAB:RB->metatable, 0 // Shouldn't overwrite RA for fastpath. - | jz <2 - | mov TMP1, RA // Save RA. - | mov TAB:RA, TAB:RB->metatable - | test byte TAB:RA->nomm, 1<vmeta_tsets // 'no __newindex' flag NOT set: check. - | mov RA, TMP1 // Restore RA. - | jmp <2 - | - |5: // Follow hash chain. - | mov NODE:RA, NODE:RA->next - | test NODE:RA, NODE:RA - | jnz <1 - | // End of hash chain: key not found, add a new one. - | - | // But check for __newindex first. - | mov TAB:RA, TAB:RB->metatable - | test TAB:RA, TAB:RA - | jz >6 // No metatable: continue. - | test byte TAB:RA->nomm, 1<vmeta_tsets // 'no __newindex' flag NOT set: check. - |6: - | mov TMP1, STR:RC - | mov TMP2, LJ_TSTR - | mov TMP3, TAB:RB // Save TAB:RB for us. - |.if X64 - | mov L:CARG1d, SAVE_L - | mov L:CARG1d->base, BASE - | lea CARG3, TMP1 - | mov CARG2d, TAB:RB - | mov L:RB, L:CARG1d - |.else - | lea RC, TMP1 // Store temp. TValue in TMP1/TMP2. - | mov ARG2, TAB:RB - | mov L:RB, SAVE_L - | mov ARG3, RC - | mov ARG1, L:RB - | mov L:RB->base, BASE - |.endif - | mov SAVE_PC, PC - | call extern lj_tab_newkey // (lua_State *L, GCtab *t, TValue *k) - | // Handles write barrier for the new key. TValue * returned in eax (RC). - | mov BASE, L:RB->base - | mov TAB:RB, TMP3 // Need TAB:RB for barrier. - | mov RA, eax - | jmp <2 // Must check write barrier for value. - | - |7: // Possible table write barrier for the value. Skip valiswhite check. - | barrierback TAB:RB, RC // Destroys STR:RC. - | jmp <3 - break; - case BC_TSETB: - | ins_ABC // RA = src, RB = table, RC = byte literal - | checktab RB, ->vmeta_tsetb - | mov TAB:RB, [BASE+RB*8] - | cmp RC, TAB:RB->asize - | jae ->vmeta_tsetb - | shl RC, 3 - | add RC, TAB:RB->array - | cmp dword [RC+4], LJ_TNIL - | je >3 // Previous value is nil? - |1: - | test byte TAB:RB->marked, LJ_GC_BLACK // isblack(table) - | jnz >7 - |2: // Set array slot. - |.if X64 - | mov RAa, [BASE+RA*8] - | mov [RC], RAa - |.else - | mov RB, [BASE+RA*8+4] - | mov RA, [BASE+RA*8] - | mov [RC+4], RB - | mov [RC], RA - |.endif - | ins_next - | - |3: // Check for __newindex if previous value is nil. - | cmp dword TAB:RB->metatable, 0 // Shouldn't overwrite RA for fastpath. - | jz <1 - | mov TAB:RA, TAB:RB->metatable - | test byte TAB:RA->nomm, 1<vmeta_tsetb // 'no __newindex' flag NOT set: check. - | movzx RA, PC_RA // Restore RA. - | jmp <1 - | - |7: // Possible table write barrier for the value. Skip valiswhite check. - | barrierback TAB:RB, RA - | movzx RA, PC_RA // Restore RA. - | jmp <2 - break; - - case BC_TSETM: - | ins_AD // RA = base (table at base-1), RD = num const (start index) - | mov TMP1, KBASE // Need one more free register. - | mov KBASE, dword [KBASE+RD*8] // Integer constant is in lo-word. - |1: - | lea RA, [BASE+RA*8] - | mov TAB:RB, [RA-8] // Guaranteed to be a table. - | test byte TAB:RB->marked, LJ_GC_BLACK // isblack(table) - | jnz >7 - |2: - | mov RD, MULTRES - | sub RD, 1 - | jz >4 // Nothing to copy? - | add RD, KBASE // Compute needed size. - | cmp RD, TAB:RB->asize - | ja >5 // Doesn't fit into array part? - | sub RD, KBASE - | shl KBASE, 3 - | add KBASE, TAB:RB->array - |3: // Copy result slots to table. - |.if X64 - | mov RBa, [RA] - | add RA, 8 - | mov [KBASE], RBa - |.else - | mov RB, [RA] - | mov [KBASE], RB - | mov RB, [RA+4] - | add RA, 8 - | mov [KBASE+4], RB - |.endif - | add KBASE, 8 - | sub RD, 1 - | jnz <3 - |4: - | mov KBASE, TMP1 - | ins_next - | - |5: // Need to resize array part. - |.if X64 - | mov L:CARG1d, SAVE_L - | mov L:CARG1d->base, BASE // Caveat: CARG2d/CARG3d may be BASE. - | mov CARG2d, TAB:RB - | mov CARG3d, RD - | mov L:RB, L:CARG1d - |.else - | mov ARG2, TAB:RB - | mov L:RB, SAVE_L - | mov L:RB->base, BASE - | mov ARG3, RD - | mov ARG1, L:RB - |.endif - | mov SAVE_PC, PC - | call extern lj_tab_reasize // (lua_State *L, GCtab *t, int nasize) - | mov BASE, L:RB->base - | movzx RA, PC_RA // Restore RA. - | jmp <1 // Retry. - | - |7: // Possible table write barrier for any value. Skip valiswhite check. - | barrierback TAB:RB, RD - | jmp <2 - break; - - /* -- Calls and vararg handling ----------------------------------------- */ - - case BC_CALL: case BC_CALLM: - | ins_A_C // RA = base, (RB = nresults+1,) RC = nargs+1 | extra_nargs - if (op == BC_CALLM) { - | add NARGS:RD, MULTRES - } - | cmp dword [BASE+RA*8+4], LJ_TFUNC - | mov LFUNC:RB, [BASE+RA*8] - | jne ->vmeta_call_ra - | lea BASE, [BASE+RA*8+8] - | ins_call - break; - - case BC_CALLMT: - | ins_AD // RA = base, RD = extra_nargs - | add NARGS:RD, MULTRES - | // Fall through. Assumes BC_CALLT follows and ins_AD is a no-op. - break; - case BC_CALLT: - | ins_AD // RA = base, RD = nargs+1 - | lea RA, [BASE+RA*8+8] - | mov KBASE, BASE // Use KBASE for move + vmeta_call hint. - | mov LFUNC:RB, [RA-8] - | cmp dword [RA-4], LJ_TFUNC - | jne ->vmeta_call - |->BC_CALLT_Z: - | mov PC, [BASE-4] - | test PC, FRAME_TYPE - | jnz >7 - |1: - | mov [BASE-8], LFUNC:RB // Copy function down, reloaded below. - | mov MULTRES, NARGS:RD - | sub NARGS:RD, 1 - | jz >3 - |2: // Move args down. - |.if X64 - | mov RBa, [RA] - | add RA, 8 - | mov [KBASE], RBa - |.else - | mov RB, [RA] - | mov [KBASE], RB - | mov RB, [RA+4] - | add RA, 8 - | mov [KBASE+4], RB - |.endif - | add KBASE, 8 - | sub NARGS:RD, 1 - | jnz <2 - | - | mov LFUNC:RB, [BASE-8] - |3: - | mov NARGS:RD, MULTRES - | cmp byte LFUNC:RB->ffid, 1 // (> FF_C) Calling a fast function? - | ja >5 - |4: - | ins_callt - | - |5: // Tailcall to a fast function. - | test PC, FRAME_TYPE // Lua frame below? - | jnz <4 - | movzx RA, PC_RA - | not RAa - | mov LFUNC:KBASE, [BASE+RA*8-8] // Need to prepare KBASE. - | mov KBASE, LFUNC:KBASE->pc - | mov KBASE, [KBASE+PC2PROTO(k)] - | jmp <4 - | - |7: // Tailcall from a vararg function. - | sub PC, FRAME_VARG - | test PC, FRAME_TYPEP - | jnz >8 // Vararg frame below? - | sub BASE, PC // Need to relocate BASE/KBASE down. - | mov KBASE, BASE - | mov PC, [BASE-4] - | jmp <1 - |8: - | add PC, FRAME_VARG - | jmp <1 - break; - - case BC_ITERC: - | ins_A // RA = base, (RB = nresults+1,) RC = nargs+1 (2+1) - | lea RA, [BASE+RA*8+8] // fb = base+1 - |.if X64 - | mov RBa, [RA-24] // Copy state. fb[0] = fb[-3]. - | mov RCa, [RA-16] // Copy control var. fb[1] = fb[-2]. - | mov [RA], RBa - | mov [RA+8], RCa - |.else - | mov RB, [RA-24] // Copy state. fb[0] = fb[-3]. - | mov RC, [RA-20] - | mov [RA], RB - | mov [RA+4], RC - | mov RB, [RA-16] // Copy control var. fb[1] = fb[-2]. - | mov RC, [RA-12] - | mov [RA+8], RB - | mov [RA+12], RC - |.endif - | mov LFUNC:RB, [RA-32] // Copy callable. fb[-1] = fb[-4] - | mov RC, [RA-28] - | mov [RA-8], LFUNC:RB - | mov [RA-4], RC - | cmp RC, LJ_TFUNC // Handle like a regular 2-arg call. - | mov NARGS:RD, 2+1 - | jne ->vmeta_call - | mov BASE, RA - | ins_call - break; - - case BC_ITERN: - | ins_A // RA = base, (RB = nresults+1, RC = nargs+1 (2+1)) - |.if JIT - | // NYI: add hotloop, record BC_ITERN. - |.endif - | mov TMP1, KBASE // Need two more free registers. - | mov TMP2, DISPATCH - | mov TAB:RB, [BASE+RA*8-16] - | mov RC, [BASE+RA*8-8] // Get index from control var. - | mov DISPATCH, TAB:RB->asize - | add PC, 4 - | mov KBASE, TAB:RB->array - |1: // Traverse array part. - | cmp RC, DISPATCH; jae >5 // Index points after array part? - | cmp dword [KBASE+RC*8+4], LJ_TNIL; je >4 - |.if DUALNUM - | mov dword [BASE+RA*8+4], LJ_TISNUM - | mov dword [BASE+RA*8], RC - |.elif SSE - | cvtsi2sd xmm0, RC - |.else - | fild dword [BASE+RA*8-8] - |.endif - | // Copy array slot to returned value. - |.if X64 - | mov RBa, [KBASE+RC*8] - | mov [BASE+RA*8+8], RBa - |.else - | mov RB, [KBASE+RC*8+4] - | mov [BASE+RA*8+12], RB - | mov RB, [KBASE+RC*8] - | mov [BASE+RA*8+8], RB - |.endif - | add RC, 1 - | // Return array index as a numeric key. - |.if DUALNUM - | // See above. - |.elif SSE - | movsd qword [BASE+RA*8], xmm0 - |.else - | fstp qword [BASE+RA*8] - |.endif - | mov [BASE+RA*8-8], RC // Update control var. - |2: - | movzx RD, PC_RD // Get target from ITERL. - | branchPC RD - |3: - | mov DISPATCH, TMP2 - | mov KBASE, TMP1 - | ins_next - | - |4: // Skip holes in array part. - | add RC, 1 - |.if not (DUALNUM or SSE) - | mov [BASE+RA*8-8], RC - |.endif - | jmp <1 - | - |5: // Traverse hash part. - | sub RC, DISPATCH - |6: - | cmp RC, TAB:RB->hmask; ja <3 // End of iteration? Branch to ITERL+1. - | imul KBASE, RC, #NODE - | add NODE:KBASE, TAB:RB->node - | cmp dword NODE:KBASE->val.it, LJ_TNIL; je >7 - | lea DISPATCH, [RC+DISPATCH+1] - | // Copy key and value from hash slot. - |.if X64 - | mov RBa, NODE:KBASE->key - | mov RCa, NODE:KBASE->val - | mov [BASE+RA*8], RBa - | mov [BASE+RA*8+8], RCa - |.else - | mov RB, NODE:KBASE->key.gcr - | mov RC, NODE:KBASE->key.it - | mov [BASE+RA*8], RB - | mov [BASE+RA*8+4], RC - | mov RB, NODE:KBASE->val.gcr - | mov RC, NODE:KBASE->val.it - | mov [BASE+RA*8+8], RB - | mov [BASE+RA*8+12], RC - |.endif - | mov [BASE+RA*8-8], DISPATCH - | jmp <2 - | - |7: // Skip holes in hash part. - | add RC, 1 - | jmp <6 - break; - - case BC_ISNEXT: - | ins_AD // RA = base, RD = target (points to ITERN) - | cmp dword [BASE+RA*8-20], LJ_TFUNC; jne >5 - | mov CFUNC:RB, [BASE+RA*8-24] - | cmp dword [BASE+RA*8-12], LJ_TTAB; jne >5 - | cmp dword [BASE+RA*8-4], LJ_TNIL; jne >5 - | cmp byte CFUNC:RB->ffid, FF_next_N; jne >5 - | branchPC RD - | mov dword [BASE+RA*8-8], 0 // Initialize control var. - | mov dword [BASE+RA*8-4], 0xfffe7fff - |1: - | ins_next - |5: // Despecialize bytecode if any of the checks fail. - | mov PC_OP, BC_JMP - | branchPC RD - | mov byte [PC], BC_ITERC - | jmp <1 - break; - - case BC_VARG: - | ins_ABC // RA = base, RB = nresults+1, RC = numparams - | mov TMP1, KBASE // Need one more free register. - | lea KBASE, [BASE+RC*8+(8+FRAME_VARG)] - | lea RA, [BASE+RA*8] - | sub KBASE, [BASE-4] - | // Note: KBASE may now be even _above_ BASE if nargs was < numparams. - | test RB, RB - | jz >5 // Copy all varargs? - | lea RB, [RA+RB*8-8] - | cmp KBASE, BASE // No vararg slots? - | jnb >2 - |1: // Copy vararg slots to destination slots. - |.if X64 - | mov RCa, [KBASE-8] - | add KBASE, 8 - | mov [RA], RCa - |.else - | mov RC, [KBASE-8] - | mov [RA], RC - | mov RC, [KBASE-4] - | add KBASE, 8 - | mov [RA+4], RC - |.endif - | add RA, 8 - | cmp RA, RB // All destination slots filled? - | jnb >3 - | cmp KBASE, BASE // No more vararg slots? - | jb <1 - |2: // Fill up remainder with nil. - | mov dword [RA+4], LJ_TNIL - | add RA, 8 - | cmp RA, RB - | jb <2 - |3: - | mov KBASE, TMP1 - | ins_next - | - |5: // Copy all varargs. - | mov MULTRES, 1 // MULTRES = 0+1 - | mov RC, BASE - | sub RC, KBASE - | jbe <3 // No vararg slots? - | mov RB, RC - | shr RB, 3 - | add RB, 1 - | mov MULTRES, RB // MULTRES = #varargs+1 - | mov L:RB, SAVE_L - | add RC, RA - | cmp RC, L:RB->maxstack - | ja >7 // Need to grow stack? - |6: // Copy all vararg slots. - |.if X64 - | mov RCa, [KBASE-8] - | add KBASE, 8 - | mov [RA], RCa - |.else - | mov RC, [KBASE-8] - | mov [RA], RC - | mov RC, [KBASE-4] - | add KBASE, 8 - | mov [RA+4], RC - |.endif - | add RA, 8 - | cmp KBASE, BASE // No more vararg slots? - | jb <6 - | jmp <3 - | - |7: // Grow stack for varargs. - | mov L:RB->base, BASE - | mov L:RB->top, RA - | mov SAVE_PC, PC - | sub KBASE, BASE // Need delta, because BASE may change. - | mov FCARG2, MULTRES - | sub FCARG2, 1 - | mov FCARG1, L:RB - | call extern lj_state_growstack@8 // (lua_State *L, int n) - | mov BASE, L:RB->base - | mov RA, L:RB->top - | add KBASE, BASE - | jmp <6 - break; - - /* -- Returns ----------------------------------------------------------- */ - - case BC_RETM: - | ins_AD // RA = results, RD = extra_nresults - | add RD, MULTRES // MULTRES >=1, so RD >=1. - | // Fall through. Assumes BC_RET follows and ins_AD is a no-op. - break; - - case BC_RET: case BC_RET0: case BC_RET1: - | ins_AD // RA = results, RD = nresults+1 - if (op != BC_RET0) { - | shl RA, 3 - } - |1: - | mov PC, [BASE-4] - | mov MULTRES, RD // Save nresults+1. - | test PC, FRAME_TYPE // Check frame type marker. - | jnz >7 // Not returning to a fixarg Lua func? - switch (op) { - case BC_RET: - |->BC_RET_Z: - | mov KBASE, BASE // Use KBASE for result move. - | sub RD, 1 - | jz >3 - |2: // Move results down. - |.if X64 - | mov RBa, [KBASE+RA] - | mov [KBASE-8], RBa - |.else - | mov RB, [KBASE+RA] - | mov [KBASE-8], RB - | mov RB, [KBASE+RA+4] - | mov [KBASE-4], RB - |.endif - | add KBASE, 8 - | sub RD, 1 - | jnz <2 - |3: - | mov RD, MULTRES // Note: MULTRES may be >255. - | movzx RB, PC_RB // So cannot compare with RDL! - |5: - | cmp RB, RD // More results expected? - | ja >6 - break; - case BC_RET1: - |.if X64 - | mov RBa, [BASE+RA] - | mov [BASE-8], RBa - |.else - | mov RB, [BASE+RA+4] - | mov [BASE-4], RB - | mov RB, [BASE+RA] - | mov [BASE-8], RB - |.endif - /* fallthrough */ - case BC_RET0: - |5: - | cmp PC_RB, RDL // More results expected? - | ja >6 - default: - break; - } - | movzx RA, PC_RA - | not RAa // Note: ~RA = -(RA+1) - | lea BASE, [BASE+RA*8] // base = base - (RA+1)*8 - | mov LFUNC:KBASE, [BASE-8] - | mov KBASE, LFUNC:KBASE->pc - | mov KBASE, [KBASE+PC2PROTO(k)] - | ins_next - | - |6: // Fill up results with nil. - if (op == BC_RET) { - | mov dword [KBASE-4], LJ_TNIL // Note: relies on shifted base. - | add KBASE, 8 - } else { - | mov dword [BASE+RD*8-12], LJ_TNIL - } - | add RD, 1 - | jmp <5 - | - |7: // Non-standard return case. - | lea RB, [PC-FRAME_VARG] - | test RB, FRAME_TYPEP - | jnz ->vm_return - | // Return from vararg function: relocate BASE down and RA up. - | sub BASE, RB - if (op != BC_RET0) { - | add RA, RB - } - | jmp <1 - break; - - /* -- Loops and branches ------------------------------------------------ */ - - |.define FOR_IDX, [RA]; .define FOR_TIDX, dword [RA+4] - |.define FOR_STOP, [RA+8]; .define FOR_TSTOP, dword [RA+12] - |.define FOR_STEP, [RA+16]; .define FOR_TSTEP, dword [RA+20] - |.define FOR_EXT, [RA+24]; .define FOR_TEXT, dword [RA+28] - - case BC_FORL: - |.if JIT - | hotloop RB - |.endif - | // Fall through. Assumes BC_IFORL follows and ins_AJ is a no-op. - break; - - case BC_JFORI: - case BC_JFORL: -#if !LJ_HASJIT - break; -#endif - case BC_FORI: - case BC_IFORL: - vk = (op == BC_IFORL || op == BC_JFORL); - | ins_AJ // RA = base, RD = target (after end of loop or start of loop) - | lea RA, [BASE+RA*8] - if (LJ_DUALNUM) { - | cmp FOR_TIDX, LJ_TISNUM; jne >9 - if (!vk) { - | cmp FOR_TSTOP, LJ_TISNUM; jne ->vmeta_for - | cmp FOR_TSTEP, LJ_TISNUM; jne ->vmeta_for - | mov RB, dword FOR_IDX - | cmp dword FOR_STEP, 0; jl >5 - } else { -#ifdef LUA_USE_ASSERT - | cmp FOR_TSTOP, LJ_TISNUM; jne ->assert_bad_for_arg_type - | cmp FOR_TSTEP, LJ_TISNUM; jne ->assert_bad_for_arg_type -#endif - | mov RB, dword FOR_STEP - | test RB, RB; js >5 - | add RB, dword FOR_IDX; jo >1 - | mov dword FOR_IDX, RB - } - | cmp RB, dword FOR_STOP - | mov FOR_TEXT, LJ_TISNUM - | mov dword FOR_EXT, RB - if (op == BC_FORI) { - | jle >7 - |1: - |6: - | branchPC RD - } else if (op == BC_JFORI) { - | branchPC RD - | movzx RD, PC_RD - | jle =>BC_JLOOP - |1: - |6: - } else if (op == BC_IFORL) { - | jg >7 - |6: - | branchPC RD - |1: - } else { - | jle =>BC_JLOOP - |1: - |6: - } - |7: - | ins_next - | - |5: // Invert check for negative step. - if (vk) { - | add RB, dword FOR_IDX; jo <1 - | mov dword FOR_IDX, RB - } - | cmp RB, dword FOR_STOP - | mov FOR_TEXT, LJ_TISNUM - | mov dword FOR_EXT, RB - if (op == BC_FORI) { - | jge <7 - } else if (op == BC_JFORI) { - | branchPC RD - | movzx RD, PC_RD - | jge =>BC_JLOOP - } else if (op == BC_IFORL) { - | jl <7 - } else { - | jge =>BC_JLOOP - } - | jmp <6 - |9: // Fallback to FP variant. - } else if (!vk) { - | cmp FOR_TIDX, LJ_TISNUM - } - if (!vk) { - | jae ->vmeta_for - | cmp FOR_TSTOP, LJ_TISNUM; jae ->vmeta_for - } else { -#ifdef LUA_USE_ASSERT - | cmp FOR_TSTOP, LJ_TISNUM; jae ->assert_bad_for_arg_type - | cmp FOR_TSTEP, LJ_TISNUM; jae ->assert_bad_for_arg_type -#endif - } - | mov RB, FOR_TSTEP // Load type/hiword of for step. - if (!vk) { - | cmp RB, LJ_TISNUM; jae ->vmeta_for - } - |.if SSE - | movsd xmm0, qword FOR_IDX - | movsd xmm1, qword FOR_STOP - if (vk) { - | addsd xmm0, qword FOR_STEP - | movsd qword FOR_IDX, xmm0 - | test RB, RB; js >3 - } else { - | jl >3 - } - | ucomisd xmm1, xmm0 - |1: - | movsd qword FOR_EXT, xmm0 - |.else - | fld qword FOR_STOP - | fld qword FOR_IDX - if (vk) { - | fadd qword FOR_STEP // nidx = idx + step - | fst qword FOR_IDX - | fst qword FOR_EXT - | test RB, RB; js >1 - } else { - | fst qword FOR_EXT - | jl >1 - } - | fxch // Swap lim/(n)idx if step non-negative. - |1: - | fcomparepp - |.endif - if (op == BC_FORI) { - |.if DUALNUM - | jnb <7 - |.else - | jnb >2 - | branchPC RD - |.endif - } else if (op == BC_JFORI) { - | branchPC RD - | movzx RD, PC_RD - | jnb =>BC_JLOOP - } else if (op == BC_IFORL) { - |.if DUALNUM - | jb <7 - |.else - | jb >2 - | branchPC RD - |.endif - } else { - | jnb =>BC_JLOOP - } - |.if DUALNUM - | jmp <6 - |.else - |2: - | ins_next - |.endif - |.if SSE - |3: // Invert comparison if step is negative. - | ucomisd xmm0, xmm1 - | jmp <1 - |.endif - break; - - case BC_ITERL: - |.if JIT - | hotloop RB - |.endif - | // Fall through. Assumes BC_IITERL follows and ins_AJ is a no-op. - break; - - case BC_JITERL: -#if !LJ_HASJIT - break; -#endif - case BC_IITERL: - | ins_AJ // RA = base, RD = target - | lea RA, [BASE+RA*8] - | mov RB, [RA+4] - | cmp RB, LJ_TNIL; je >1 // Stop if iterator returned nil. - if (op == BC_JITERL) { - | mov [RA-4], RB - | mov RB, [RA] - | mov [RA-8], RB - | jmp =>BC_JLOOP - } else { - | branchPC RD // Otherwise save control var + branch. - | mov RD, [RA] - | mov [RA-4], RB - | mov [RA-8], RD - } - |1: - | ins_next - break; - - case BC_LOOP: - | ins_A // RA = base, RD = target (loop extent) - | // Note: RA/RD is only used by trace recorder to determine scope/extent - | // This opcode does NOT jump, it's only purpose is to detect a hot loop. - |.if JIT - | hotloop RB - |.endif - | // Fall through. Assumes BC_ILOOP follows and ins_A is a no-op. - break; - - case BC_ILOOP: - | ins_A // RA = base, RD = target (loop extent) - | ins_next - break; - - case BC_JLOOP: - |.if JIT - | ins_AD // RA = base (ignored), RD = traceno - | mov RA, [DISPATCH+DISPATCH_J(trace)] - | mov TRACE:RD, [RA+RD*4] - | mov RDa, TRACE:RD->mcode - | mov L:RB, SAVE_L - | mov [DISPATCH+DISPATCH_GL(jit_base)], BASE - | mov [DISPATCH+DISPATCH_GL(jit_L)], L:RB - | // Save additional callee-save registers only used in compiled code. - |.if X64WIN - | mov TMPQ, r12 - | mov TMPa, r13 - | mov CSAVE_4, r14 - | mov CSAVE_3, r15 - | mov RAa, rsp - | sub rsp, 9*16+4*8 - | movdqa [RAa], xmm6 - | movdqa [RAa-1*16], xmm7 - | movdqa [RAa-2*16], xmm8 - | movdqa [RAa-3*16], xmm9 - | movdqa [RAa-4*16], xmm10 - | movdqa [RAa-5*16], xmm11 - | movdqa [RAa-6*16], xmm12 - | movdqa [RAa-7*16], xmm13 - | movdqa [RAa-8*16], xmm14 - | movdqa [RAa-9*16], xmm15 - |.elif X64 - | mov TMPQ, r12 - | mov TMPa, r13 - | sub rsp, 16 - |.endif - | jmp RDa - |.endif - break; - - case BC_JMP: - | ins_AJ // RA = unused, RD = target - | branchPC RD - | ins_next - break; - - /* -- Function headers -------------------------------------------------- */ - - /* - ** Reminder: A function may be called with func/args above L->maxstack, - ** i.e. occupying EXTRA_STACK slots. And vmeta_call may add one extra slot, - ** too. This means all FUNC* ops (including fast functions) must check - ** for stack overflow _before_ adding more slots! - */ - - case BC_FUNCF: - |.if JIT - | hotcall RB - |.endif - case BC_FUNCV: /* NYI: compiled vararg functions. */ - | // Fall through. Assumes BC_IFUNCF/BC_IFUNCV follow and ins_AD is a no-op. - break; - - case BC_JFUNCF: -#if !LJ_HASJIT - break; -#endif - case BC_IFUNCF: - | ins_AD // BASE = new base, RA = framesize, RD = nargs+1 - | mov KBASE, [PC-4+PC2PROTO(k)] - | mov L:RB, SAVE_L - | lea RA, [BASE+RA*8] // Top of frame. - | cmp RA, L:RB->maxstack - | ja ->vm_growstack_f - | movzx RA, byte [PC-4+PC2PROTO(numparams)] - | cmp NARGS:RD, RA // Check for missing parameters. - | jbe >3 - |2: - if (op == BC_JFUNCF) { - | movzx RD, PC_RD - | jmp =>BC_JLOOP - } else { - | ins_next - } - | - |3: // Clear missing parameters. - | mov dword [BASE+NARGS:RD*8-4], LJ_TNIL - | add NARGS:RD, 1 - | cmp NARGS:RD, RA - | jbe <3 - | jmp <2 - break; - - case BC_JFUNCV: -#if !LJ_HASJIT - break; -#endif - | int3 // NYI: compiled vararg functions - break; /* NYI: compiled vararg functions. */ - - case BC_IFUNCV: - | ins_AD // BASE = new base, RA = framesize, RD = nargs+1 - | lea RB, [NARGS:RD*8+FRAME_VARG] - | lea RD, [BASE+NARGS:RD*8] - | mov LFUNC:KBASE, [BASE-8] - | mov [RD-4], RB // Store delta + FRAME_VARG. - | mov [RD-8], LFUNC:KBASE // Store copy of LFUNC. - | mov L:RB, SAVE_L - | lea RA, [RD+RA*8] - | cmp RA, L:RB->maxstack - | ja ->vm_growstack_v // Need to grow stack. - | mov RA, BASE - | mov BASE, RD - | movzx RB, byte [PC-4+PC2PROTO(numparams)] - | test RB, RB - | jz >2 - |1: // Copy fixarg slots up to new frame. - | add RA, 8 - | cmp RA, BASE - | jnb >3 // Less args than parameters? - | mov KBASE, [RA-8] - | mov [RD], KBASE - | mov KBASE, [RA-4] - | mov [RD+4], KBASE - | add RD, 8 - | mov dword [RA-4], LJ_TNIL // Clear old fixarg slot (help the GC). - | sub RB, 1 - | jnz <1 - |2: - if (op == BC_JFUNCV) { - | movzx RD, PC_RD - | jmp =>BC_JLOOP - } else { - | mov KBASE, [PC-4+PC2PROTO(k)] - | ins_next - } - | - |3: // Clear missing parameters. - | mov dword [RD+4], LJ_TNIL - | add RD, 8 - | sub RB, 1 - | jnz <3 - | jmp <2 - break; - - case BC_FUNCC: - case BC_FUNCCW: - | ins_AD // BASE = new base, RA = ins RA|RD (unused), RD = nargs+1 - | mov CFUNC:RB, [BASE-8] - | mov KBASEa, CFUNC:RB->f - | mov L:RB, SAVE_L - | lea RD, [BASE+NARGS:RD*8-8] - | mov L:RB->base, BASE - | lea RA, [RD+8*LUA_MINSTACK] - | cmp RA, L:RB->maxstack - | mov L:RB->top, RD - if (op == BC_FUNCC) { - |.if X64 - | mov CARG1d, L:RB // Caveat: CARG1d may be RA. - |.else - | mov ARG1, L:RB - |.endif - } else { - |.if X64 - | mov CARG2, KBASEa - | mov CARG1d, L:RB // Caveat: CARG1d may be RA. - |.else - | mov ARG2, KBASEa - | mov ARG1, L:RB - |.endif - } - | ja ->vm_growstack_c // Need to grow stack. - | set_vmstate C - if (op == BC_FUNCC) { - | call KBASEa // (lua_State *L) - } else { - | // (lua_State *L, lua_CFunction f) - | call aword [DISPATCH+DISPATCH_GL(wrapf)] - } - | set_vmstate INTERP - | // nresults returned in eax (RD). - | mov BASE, L:RB->base - | lea RA, [BASE+RD*8] - | neg RA - | add RA, L:RB->top // RA = (L->top-(L->base+nresults))*8 - | mov PC, [BASE-4] // Fetch PC of caller. - | jmp ->vm_returnc - break; - - /* ---------------------------------------------------------------------- */ - - default: - fprintf(stderr, "Error: undefined opcode BC_%s\n", bc_names[op]); - exit(2); - break; - } -} - -static int build_backend(BuildCtx *ctx) -{ - int op; - dasm_growpc(Dst, BC__MAX); - build_subroutines(ctx); - |.code_op - for (op = 0; op < BC__MAX; op++) - build_ins(ctx, (BCOp)op, op); - return BC__MAX; -} - -/* Emit pseudo frame-info for all assembler functions. */ -static void emit_asm_debug(BuildCtx *ctx) -{ - int fcofs = (int)((uint8_t *)ctx->glob[GLOB_vm_ffi_call] - ctx->code); -#if LJ_64 -#define SZPTR "8" -#define BSZPTR "3" -#define REG_SP "0x7" -#define REG_RA "0x10" -#else -#define SZPTR "4" -#define BSZPTR "2" -#define REG_SP "0x4" -#define REG_RA "0x8" -#endif - switch (ctx->mode) { - case BUILD_elfasm: - fprintf(ctx->fp, "\t.section .debug_frame,\"\",@progbits\n"); - fprintf(ctx->fp, - ".Lframe0:\n" - "\t.long .LECIE0-.LSCIE0\n" - ".LSCIE0:\n" - "\t.long 0xffffffff\n" - "\t.byte 0x1\n" - "\t.string \"\"\n" - "\t.uleb128 0x1\n" - "\t.sleb128 -" SZPTR "\n" - "\t.byte " REG_RA "\n" - "\t.byte 0xc\n\t.uleb128 " REG_SP "\n\t.uleb128 " SZPTR "\n" - "\t.byte 0x80+" REG_RA "\n\t.uleb128 0x1\n" - "\t.align " SZPTR "\n" - ".LECIE0:\n\n"); - fprintf(ctx->fp, - ".LSFDE0:\n" - "\t.long .LEFDE0-.LASFDE0\n" - ".LASFDE0:\n" - "\t.long .Lframe0\n" -#if LJ_64 - "\t.quad .Lbegin\n" - "\t.quad %d\n" - "\t.byte 0xe\n\t.uleb128 %d\n" /* def_cfa_offset */ - "\t.byte 0x86\n\t.uleb128 0x2\n" /* offset rbp */ - "\t.byte 0x83\n\t.uleb128 0x3\n" /* offset rbx */ - "\t.byte 0x8f\n\t.uleb128 0x4\n" /* offset r15 */ - "\t.byte 0x8e\n\t.uleb128 0x5\n" /* offset r14 */ -#else - "\t.long .Lbegin\n" - "\t.long %d\n" - "\t.byte 0xe\n\t.uleb128 %d\n" /* def_cfa_offset */ - "\t.byte 0x85\n\t.uleb128 0x2\n" /* offset ebp */ - "\t.byte 0x87\n\t.uleb128 0x3\n" /* offset edi */ - "\t.byte 0x86\n\t.uleb128 0x4\n" /* offset esi */ - "\t.byte 0x83\n\t.uleb128 0x5\n" /* offset ebx */ -#endif - "\t.align " SZPTR "\n" - ".LEFDE0:\n\n", fcofs, CFRAME_SIZE); -#if LJ_HASFFI - fprintf(ctx->fp, - ".LSFDE1:\n" - "\t.long .LEFDE1-.LASFDE1\n" - ".LASFDE1:\n" - "\t.long .Lframe0\n" -#if LJ_64 - "\t.quad lj_vm_ffi_call\n" - "\t.quad %d\n" - "\t.byte 0xe\n\t.uleb128 16\n" /* def_cfa_offset */ - "\t.byte 0x86\n\t.uleb128 0x2\n" /* offset rbp */ - "\t.byte 0xd\n\t.uleb128 0x6\n" /* def_cfa_register rbp */ - "\t.byte 0x83\n\t.uleb128 0x3\n" /* offset rbx */ -#else - "\t.long lj_vm_ffi_call\n" - "\t.long %d\n" - "\t.byte 0xe\n\t.uleb128 8\n" /* def_cfa_offset */ - "\t.byte 0x85\n\t.uleb128 0x2\n" /* offset ebp */ - "\t.byte 0xd\n\t.uleb128 0x5\n" /* def_cfa_register ebp */ - "\t.byte 0x83\n\t.uleb128 0x3\n" /* offset ebx */ -#endif - "\t.align " SZPTR "\n" - ".LEFDE1:\n\n", (int)ctx->codesz - fcofs); -#endif -#if (defined(__sun__) && defined(__svr4__)) -#if LJ_64 - fprintf(ctx->fp, "\t.section .eh_frame,\"a\",@unwind\n"); -#else - fprintf(ctx->fp, "\t.section .eh_frame,\"aw\",@progbits\n"); -#endif -#else - fprintf(ctx->fp, "\t.section .eh_frame,\"a\",@progbits\n"); -#endif - fprintf(ctx->fp, - ".Lframe1:\n" - "\t.long .LECIE1-.LSCIE1\n" - ".LSCIE1:\n" - "\t.long 0\n" - "\t.byte 0x1\n" - "\t.string \"zPR\"\n" - "\t.uleb128 0x1\n" - "\t.sleb128 -" SZPTR "\n" - "\t.byte " REG_RA "\n" - "\t.uleb128 6\n" /* augmentation length */ - "\t.byte 0x1b\n" /* pcrel|sdata4 */ - "\t.long lj_err_unwind_dwarf-.\n" - "\t.byte 0x1b\n" /* pcrel|sdata4 */ - "\t.byte 0xc\n\t.uleb128 " REG_SP "\n\t.uleb128 " SZPTR "\n" - "\t.byte 0x80+" REG_RA "\n\t.uleb128 0x1\n" - "\t.align " SZPTR "\n" - ".LECIE1:\n\n"); - fprintf(ctx->fp, - ".LSFDE2:\n" - "\t.long .LEFDE2-.LASFDE2\n" - ".LASFDE2:\n" - "\t.long .LASFDE2-.Lframe1\n" - "\t.long .Lbegin-.\n" - "\t.long %d\n" - "\t.uleb128 0\n" /* augmentation length */ - "\t.byte 0xe\n\t.uleb128 %d\n" /* def_cfa_offset */ -#if LJ_64 - "\t.byte 0x86\n\t.uleb128 0x2\n" /* offset rbp */ - "\t.byte 0x83\n\t.uleb128 0x3\n" /* offset rbx */ - "\t.byte 0x8f\n\t.uleb128 0x4\n" /* offset r15 */ - "\t.byte 0x8e\n\t.uleb128 0x5\n" /* offset r14 */ -#else - "\t.byte 0x85\n\t.uleb128 0x2\n" /* offset ebp */ - "\t.byte 0x87\n\t.uleb128 0x3\n" /* offset edi */ - "\t.byte 0x86\n\t.uleb128 0x4\n" /* offset esi */ - "\t.byte 0x83\n\t.uleb128 0x5\n" /* offset ebx */ -#endif - "\t.align " SZPTR "\n" - ".LEFDE2:\n\n", fcofs, CFRAME_SIZE); -#if LJ_HASFFI - fprintf(ctx->fp, - ".Lframe2:\n" - "\t.long .LECIE2-.LSCIE2\n" - ".LSCIE2:\n" - "\t.long 0\n" - "\t.byte 0x1\n" - "\t.string \"zR\"\n" - "\t.uleb128 0x1\n" - "\t.sleb128 -" SZPTR "\n" - "\t.byte " REG_RA "\n" - "\t.uleb128 1\n" /* augmentation length */ - "\t.byte 0x1b\n" /* pcrel|sdata4 */ - "\t.byte 0xc\n\t.uleb128 " REG_SP "\n\t.uleb128 " SZPTR "\n" - "\t.byte 0x80+" REG_RA "\n\t.uleb128 0x1\n" - "\t.align " SZPTR "\n" - ".LECIE2:\n\n"); - fprintf(ctx->fp, - ".LSFDE3:\n" - "\t.long .LEFDE3-.LASFDE3\n" - ".LASFDE3:\n" - "\t.long .LASFDE3-.Lframe2\n" - "\t.long lj_vm_ffi_call-.\n" - "\t.long %d\n" - "\t.uleb128 0\n" /* augmentation length */ -#if LJ_64 - "\t.byte 0xe\n\t.uleb128 16\n" /* def_cfa_offset */ - "\t.byte 0x86\n\t.uleb128 0x2\n" /* offset rbp */ - "\t.byte 0xd\n\t.uleb128 0x6\n" /* def_cfa_register rbp */ - "\t.byte 0x83\n\t.uleb128 0x3\n" /* offset rbx */ -#else - "\t.byte 0xe\n\t.uleb128 8\n" /* def_cfa_offset */ - "\t.byte 0x85\n\t.uleb128 0x2\n" /* offset ebp */ - "\t.byte 0xd\n\t.uleb128 0x5\n" /* def_cfa_register ebp */ - "\t.byte 0x83\n\t.uleb128 0x3\n" /* offset ebx */ -#endif - "\t.align " SZPTR "\n" - ".LEFDE3:\n\n", (int)ctx->codesz - fcofs); -#endif - break; - /* Mental note: never let Apple design an assembler. - ** Or a linker. Or a plastic case. But I digress. - */ - case BUILD_machasm: { -#if LJ_HASFFI - int fcsize = 0; -#endif - int i; - fprintf(ctx->fp, "\t.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support\n"); - fprintf(ctx->fp, - "EH_frame1:\n" - "\t.set L$set$x,LECIEX-LSCIEX\n" - "\t.long L$set$x\n" - "LSCIEX:\n" - "\t.long 0\n" - "\t.byte 0x1\n" - "\t.ascii \"zPR\\0\"\n" - "\t.byte 0x1\n" - "\t.byte 128-" SZPTR "\n" - "\t.byte " REG_RA "\n" - "\t.byte 6\n" /* augmentation length */ - "\t.byte 0x9b\n" /* indirect|pcrel|sdata4 */ -#if LJ_64 - "\t.long _lj_err_unwind_dwarf+4@GOTPCREL\n" - "\t.byte 0x1b\n" /* pcrel|sdata4 */ - "\t.byte 0xc\n\t.byte " REG_SP "\n\t.byte " SZPTR "\n" -#else - "\t.long L_lj_err_unwind_dwarf$non_lazy_ptr-.\n" - "\t.byte 0x1b\n" /* pcrel|sdata4 */ - "\t.byte 0xc\n\t.byte 0x5\n\t.byte 0x4\n" /* esp=5 on 32 bit MACH-O. */ -#endif - "\t.byte 0x80+" REG_RA "\n\t.byte 0x1\n" - "\t.align " BSZPTR "\n" - "LECIEX:\n\n"); - for (i = 0; i < ctx->nsym; i++) { - const char *name = ctx->sym[i].name; - int32_t size = ctx->sym[i+1].ofs - ctx->sym[i].ofs; - if (size == 0) continue; -#if LJ_HASFFI - if (!strcmp(name, "_lj_vm_ffi_call")) { fcsize = size; continue; } -#endif - fprintf(ctx->fp, - "%s.eh:\n" - "LSFDE%d:\n" - "\t.set L$set$%d,LEFDE%d-LASFDE%d\n" - "\t.long L$set$%d\n" - "LASFDE%d:\n" - "\t.long LASFDE%d-EH_frame1\n" - "\t.long %s-.\n" - "\t.long %d\n" - "\t.byte 0\n" /* augmentation length */ - "\t.byte 0xe\n\t.byte %d\n" /* def_cfa_offset */ -#if LJ_64 - "\t.byte 0x86\n\t.byte 0x2\n" /* offset rbp */ - "\t.byte 0x83\n\t.byte 0x3\n" /* offset rbx */ - "\t.byte 0x8f\n\t.byte 0x4\n" /* offset r15 */ - "\t.byte 0x8e\n\t.byte 0x5\n" /* offset r14 */ -#else - "\t.byte 0x84\n\t.byte 0x2\n" /* offset ebp (4 for MACH-O)*/ - "\t.byte 0x87\n\t.byte 0x3\n" /* offset edi */ - "\t.byte 0x86\n\t.byte 0x4\n" /* offset esi */ - "\t.byte 0x83\n\t.byte 0x5\n" /* offset ebx */ -#endif - "\t.align " BSZPTR "\n" - "LEFDE%d:\n\n", - name, i, i, i, i, i, i, i, name, size, CFRAME_SIZE, i); - } -#if LJ_HASFFI - if (fcsize) { - fprintf(ctx->fp, - "EH_frame2:\n" - "\t.set L$set$y,LECIEY-LSCIEY\n" - "\t.long L$set$y\n" - "LSCIEY:\n" - "\t.long 0\n" - "\t.byte 0x1\n" - "\t.ascii \"zR\\0\"\n" - "\t.byte 0x1\n" - "\t.byte 128-" SZPTR "\n" - "\t.byte " REG_RA "\n" - "\t.byte 1\n" /* augmentation length */ -#if LJ_64 - "\t.byte 0x1b\n" /* pcrel|sdata4 */ - "\t.byte 0xc\n\t.byte " REG_SP "\n\t.byte " SZPTR "\n" -#else - "\t.byte 0x1b\n" /* pcrel|sdata4 */ - "\t.byte 0xc\n\t.byte 0x5\n\t.byte 0x4\n" /* esp=5 on 32 bit MACH. */ -#endif - "\t.byte 0x80+" REG_RA "\n\t.byte 0x1\n" - "\t.align " BSZPTR "\n" - "LECIEY:\n\n"); - fprintf(ctx->fp, - "_lj_vm_ffi_call.eh:\n" - "LSFDEY:\n" - "\t.set L$set$yy,LEFDEY-LASFDEY\n" - "\t.long L$set$yy\n" - "LASFDEY:\n" - "\t.long LASFDEY-EH_frame2\n" - "\t.long _lj_vm_ffi_call-.\n" - "\t.long %d\n" - "\t.byte 0\n" /* augmentation length */ -#if LJ_64 - "\t.byte 0xe\n\t.byte 16\n" /* def_cfa_offset */ - "\t.byte 0x86\n\t.byte 0x2\n" /* offset rbp */ - "\t.byte 0xd\n\t.byte 0x6\n" /* def_cfa_register rbp */ - "\t.byte 0x83\n\t.byte 0x3\n" /* offset rbx */ -#else - "\t.byte 0xe\n\t.byte 8\n" /* def_cfa_offset */ - "\t.byte 0x84\n\t.byte 0x2\n" /* offset ebp (4 for MACH-O)*/ - "\t.byte 0xd\n\t.byte 0x4\n" /* def_cfa_register ebp */ - "\t.byte 0x83\n\t.byte 0x3\n" /* offset ebx */ -#endif - "\t.align " BSZPTR "\n" - "LEFDEY:\n\n", fcsize); - } -#endif -#if LJ_64 - fprintf(ctx->fp, "\t.subsections_via_symbols\n"); -#else - fprintf(ctx->fp, - "\t.non_lazy_symbol_pointer\n" - "L_lj_err_unwind_dwarf$non_lazy_ptr:\n" - ".indirect_symbol _lj_err_unwind_dwarf\n" - ".long 0\n"); -#endif - } - break; - default: /* Difficult for other modes. */ - break; - } -} - diff --git a/deps/luajit/src/xedkbuild.bat b/deps/luajit/src/xedkbuild.bat deleted file mode 100644 index 240ec878..00000000 --- a/deps/luajit/src/xedkbuild.bat +++ /dev/null @@ -1,92 +0,0 @@ -@rem Script to build LuaJIT with the Xbox 360 SDK. -@rem Donated to the public domain. -@rem -@rem Open a "Visual Studio .NET Command Prompt" (32 bit host compiler) -@rem Then cd to this directory and run this script. - -@if not defined INCLUDE goto :FAIL -@if not defined XEDK goto :FAIL - -@setlocal -@rem ---- Host compiler ---- -@set LJCOMPILE=cl /nologo /c /MD /O2 /W3 /D_CRT_SECURE_NO_DEPRECATE -@set LJLINK=link /nologo -@set LJMT=mt /nologo -@set DASMDIR=..\dynasm -@set DASM=%DASMDIR%\dynasm.lua -@set ALL_LIB=lib_base.c lib_math.c lib_bit.c lib_string.c lib_table.c lib_io.c lib_os.c lib_package.c lib_debug.c lib_jit.c lib_ffi.c - -%LJCOMPILE% host\minilua.c -@if errorlevel 1 goto :BAD -%LJLINK% /out:minilua.exe minilua.obj -@if errorlevel 1 goto :BAD -if exist minilua.exe.manifest^ - %LJMT% -manifest minilua.exe.manifest -outputresource:minilua.exe - -@rem Error out for 64 bit host compiler -@minilua -@if errorlevel 8 goto :FAIL - -@set DASMFLAGS=-D GPR64 -D FRAME32 -D PPE -D SQRT -D DUALNUM -minilua %DASM% -LN %DASMFLAGS% -o host\buildvm_arch.h vm_ppc.dasc -@if errorlevel 1 goto :BAD - -%LJCOMPILE% /I "." /I %DASMDIR% /D_XBOX_VER=200 /DLUAJIT_TARGET=LUAJIT_ARCH_PPC host\buildvm*.c -@if errorlevel 1 goto :BAD -%LJLINK% /out:buildvm.exe buildvm*.obj -@if errorlevel 1 goto :BAD -if exist buildvm.exe.manifest^ - %LJMT% -manifest buildvm.exe.manifest -outputresource:buildvm.exe - -buildvm -m peobj -o lj_vm.obj -@if errorlevel 1 goto :BAD -buildvm -m bcdef -o lj_bcdef.h %ALL_LIB% -@if errorlevel 1 goto :BAD -buildvm -m ffdef -o lj_ffdef.h %ALL_LIB% -@if errorlevel 1 goto :BAD -buildvm -m libdef -o lj_libdef.h %ALL_LIB% -@if errorlevel 1 goto :BAD -buildvm -m recdef -o lj_recdef.h %ALL_LIB% -@if errorlevel 1 goto :BAD -buildvm -m vmdef -o jit\vmdef.lua %ALL_LIB% -@if errorlevel 1 goto :BAD -buildvm -m folddef -o lj_folddef.h lj_opt_fold.c -@if errorlevel 1 goto :BAD - -@rem ---- Cross compiler ---- -@set LJCOMPILE="%XEDK%\bin\win32\cl" /nologo /c /MT /O2 /W3 /GF /Gm- /GR- /GS- /Gy /openmp- /D_CRT_SECURE_NO_DEPRECATE /DNDEBUG /D_XBOX /D_LIB /DLUAJIT_USE_SYSMALLOC -@set LJLIB="%XEDK%\bin\win32\lib" /nologo -@set "INCLUDE=%XEDK%\include\xbox" - -@if "%1" neq "debug" goto :NODEBUG -@shift -@set "LJCOMPILE=%LJCOMPILE% /Zi" -:NODEBUG -@if "%1"=="amalg" goto :AMALG -%LJCOMPILE% /DLUA_BUILD_AS_DLL lj_*.c lib_*.c -@if errorlevel 1 goto :BAD -%LJLIB% /OUT:luajit20.lib lj_*.obj lib_*.obj -@if errorlevel 1 goto :BAD -@goto :NOAMALG -:AMALG -%LJCOMPILE% /DLUA_BUILD_AS_DLL ljamalg.c -@if errorlevel 1 goto :BAD -%LJLIB% /OUT:luajit20.lib ljamalg.obj lj_vm.obj -@if errorlevel 1 goto :BAD -:NOAMALG - -@del *.obj *.manifest minilua.exe buildvm.exe -@echo. -@echo === Successfully built LuaJIT for Xbox 360 === - -@goto :END -:BAD -@echo. -@echo ******************************************************* -@echo *** Build FAILED -- Please check the error messages *** -@echo ******************************************************* -@goto :END -:FAIL -@echo To run this script you must open a "Visual Studio .NET Command Prompt" -@echo (32 bit host compiler). The Xbox 360 SDK must be installed, too. -:END diff --git a/deps/openssl-1.0.2g.tar.gz b/deps/openssl-1.0.2g.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..315ad62cb716761af508716c6348614d7f8bf6df GIT binary patch literal 5266102 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

    ZU9p~y-DNca-qsV_(LG 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%0Dbs&=x4npV&buM5WYTcP$?Zpv?RW_Y`Msa+3x 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�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ΜiVk>TM=FVqs-1)NC4J(~&q$BTzlcLTXQg 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 z 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 O3M0#nOBr%}B&{KoL>&5Y zfOrKD4XLQ9G?6eDa%o>q?MvM`4RXi$8Jp9K4YCNayrHnzQ;~^x7M%FsG`+uNN(V*3 z!vr7_1CR*(+#CX~xD;J33Sj-xJMO&iE>%}r4lf=tZlNE8;m873n~^&W^>l7V%3qNO zLVB&D@{9I?|Qo_vL?=xaB(-|assm|Jma>u3V z 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%0A_{DZt0 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 NRry%uHB?_}b+ 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

    XbulkMxLbBubo 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,UbT*PQn;bGASZ;KOBUh9}B78I}@y0Q? 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�l}g*V=B_S&??gxi2RH}YkX)T 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¬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

    mcYQ1n*3>m{td70X3 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