immunio 1.2.1 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +13 -5
- data/ext/immunio/Rakefile +14 -6
- data/lib/immunio/context.rb +2 -0
- data/lib/immunio/plugins/action_view.rb +7 -668
- data/lib/immunio/plugins/action_view/action_view.rb +22 -0
- data/lib/immunio/plugins/action_view/active_support_hash.rb +29 -0
- data/lib/immunio/plugins/action_view/cache_store.rb +24 -0
- data/lib/immunio/plugins/action_view/erubi.rb +38 -0
- data/lib/immunio/plugins/action_view/erubis.rb +39 -0
- data/lib/immunio/plugins/action_view/fragment_caching.rb +29 -0
- data/lib/immunio/plugins/action_view/haml.rb +46 -0
- data/lib/immunio/plugins/action_view/slim.rb +42 -0
- data/lib/immunio/plugins/action_view/template.rb +431 -0
- data/lib/immunio/plugins/action_view/template_rendering.rb +45 -0
- data/lib/immunio/plugins/http_tracker.rb +2 -0
- data/lib/immunio/plugins/io.rb +34 -0
- data/lib/immunio/version.rb +1 -1
- data/lua-hooks/Makefile +36 -9
- data/lua-hooks/ext/luajit/COPYRIGHT +1 -1
- data/lua-hooks/ext/luajit/Makefile +22 -15
- data/lua-hooks/ext/luajit/README +2 -2
- data/lua-hooks/ext/luajit/doc/bluequad-print.css +1 -1
- data/lua-hooks/ext/luajit/doc/bluequad.css +1 -1
- data/lua-hooks/ext/luajit/doc/changes.html +69 -3
- data/lua-hooks/ext/luajit/doc/contact.html +10 -3
- data/lua-hooks/ext/luajit/doc/ext_c_api.html +2 -2
- data/lua-hooks/ext/luajit/doc/ext_ffi.html +2 -2
- data/lua-hooks/ext/luajit/doc/ext_ffi_api.html +2 -2
- data/lua-hooks/ext/luajit/doc/ext_ffi_semantics.html +3 -4
- data/lua-hooks/ext/luajit/doc/ext_ffi_tutorial.html +2 -2
- data/lua-hooks/ext/luajit/doc/ext_jit.html +3 -3
- data/lua-hooks/ext/luajit/doc/ext_profiler.html +2 -2
- data/lua-hooks/ext/luajit/doc/extensions.html +47 -20
- data/lua-hooks/ext/luajit/doc/faq.html +2 -2
- data/lua-hooks/ext/luajit/doc/install.html +74 -45
- data/lua-hooks/ext/luajit/doc/luajit.html +5 -5
- data/lua-hooks/ext/luajit/doc/running.html +3 -3
- data/lua-hooks/ext/luajit/doc/status.html +13 -8
- data/lua-hooks/ext/luajit/dynasm/dasm_arm.h +1 -1
- data/lua-hooks/ext/luajit/dynasm/dasm_arm.lua +1 -1
- data/lua-hooks/ext/luajit/dynasm/dasm_arm64.h +1 -1
- data/lua-hooks/ext/luajit/dynasm/dasm_arm64.lua +1 -1
- data/lua-hooks/ext/luajit/dynasm/dasm_mips.h +8 -5
- data/lua-hooks/ext/luajit/dynasm/dasm_mips.lua +66 -11
- data/lua-hooks/ext/luajit/dynasm/dasm_mips64.lua +12 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_ppc.h +1 -1
- data/lua-hooks/ext/luajit/dynasm/dasm_ppc.lua +1 -1
- data/lua-hooks/ext/luajit/dynasm/dasm_proto.h +1 -1
- data/lua-hooks/ext/luajit/dynasm/dasm_x64.lua +1 -1
- data/lua-hooks/ext/luajit/dynasm/dasm_x86.h +1 -1
- data/lua-hooks/ext/luajit/dynasm/dasm_x86.lua +5 -1
- data/lua-hooks/ext/luajit/dynasm/dynasm.lua +2 -2
- data/lua-hooks/ext/luajit/etc/luajit.1 +1 -1
- data/lua-hooks/ext/luajit/etc/luajit.pc +1 -1
- data/lua-hooks/ext/luajit/src/Makefile +15 -11
- data/lua-hooks/ext/luajit/src/Makefile.dep +16 -16
- data/lua-hooks/ext/luajit/src/host/buildvm.c +2 -2
- data/lua-hooks/ext/luajit/src/host/buildvm.h +1 -1
- data/lua-hooks/ext/luajit/src/host/buildvm_asm.c +9 -4
- data/lua-hooks/ext/luajit/src/host/buildvm_fold.c +2 -2
- data/lua-hooks/ext/luajit/src/host/buildvm_lib.c +1 -1
- data/lua-hooks/ext/luajit/src/host/buildvm_libbc.h +14 -3
- data/lua-hooks/ext/luajit/src/host/buildvm_peobj.c +27 -3
- data/lua-hooks/ext/luajit/src/host/genlibbc.lua +1 -1
- data/lua-hooks/ext/luajit/src/host/genminilua.lua +6 -5
- data/lua-hooks/ext/luajit/src/host/minilua.c +1 -1
- data/lua-hooks/ext/luajit/src/jit/bc.lua +1 -1
- data/lua-hooks/ext/luajit/src/jit/bcsave.lua +8 -8
- data/lua-hooks/ext/luajit/src/jit/dis_arm.lua +2 -2
- data/lua-hooks/ext/luajit/src/jit/dis_arm64.lua +1216 -0
- data/lua-hooks/ext/luajit/src/jit/dis_arm64be.lua +12 -0
- data/lua-hooks/ext/luajit/src/jit/dis_mips.lua +35 -20
- data/lua-hooks/ext/luajit/src/jit/dis_mips64.lua +17 -0
- data/lua-hooks/ext/luajit/src/jit/dis_mips64el.lua +17 -0
- data/lua-hooks/ext/luajit/src/jit/dis_mipsel.lua +1 -1
- data/lua-hooks/ext/luajit/src/jit/dis_ppc.lua +2 -2
- data/lua-hooks/ext/luajit/src/jit/dis_x64.lua +1 -1
- data/lua-hooks/ext/luajit/src/jit/dis_x86.lua +7 -4
- data/lua-hooks/ext/luajit/src/jit/dump.lua +17 -12
- data/lua-hooks/ext/luajit/src/jit/p.lua +3 -2
- data/lua-hooks/ext/luajit/src/jit/v.lua +2 -2
- data/lua-hooks/ext/luajit/src/jit/zone.lua +1 -1
- data/lua-hooks/ext/luajit/src/lauxlib.h +14 -20
- data/lua-hooks/ext/luajit/src/lib_aux.c +38 -27
- data/lua-hooks/ext/luajit/src/lib_base.c +12 -5
- data/lua-hooks/ext/luajit/src/lib_bit.c +1 -1
- data/lua-hooks/ext/luajit/src/lib_debug.c +5 -5
- data/lua-hooks/ext/luajit/src/lib_ffi.c +2 -2
- data/lua-hooks/ext/luajit/src/lib_init.c +16 -16
- data/lua-hooks/ext/luajit/src/lib_io.c +6 -7
- data/lua-hooks/ext/luajit/src/lib_jit.c +14 -4
- data/lua-hooks/ext/luajit/src/lib_math.c +1 -5
- data/lua-hooks/ext/luajit/src/lib_os.c +1 -1
- data/lua-hooks/ext/luajit/src/lib_package.c +14 -23
- data/lua-hooks/ext/luajit/src/lib_string.c +1 -5
- data/lua-hooks/ext/luajit/src/lib_table.c +21 -1
- data/lua-hooks/ext/luajit/src/lj.supp +3 -3
- data/lua-hooks/ext/luajit/src/lj_alloc.c +174 -83
- data/lua-hooks/ext/luajit/src/lj_api.c +97 -18
- data/lua-hooks/ext/luajit/src/lj_arch.h +54 -22
- data/lua-hooks/ext/luajit/src/lj_asm.c +172 -53
- data/lua-hooks/ext/luajit/src/lj_asm.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_asm_arm.h +19 -16
- data/lua-hooks/ext/luajit/src/lj_asm_arm64.h +2022 -0
- data/lua-hooks/ext/luajit/src/lj_asm_mips.h +564 -158
- data/lua-hooks/ext/luajit/src/lj_asm_ppc.h +19 -18
- data/lua-hooks/ext/luajit/src/lj_asm_x86.h +578 -92
- data/lua-hooks/ext/luajit/src/lj_bc.c +1 -1
- data/lua-hooks/ext/luajit/src/lj_bc.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_bcdump.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_bcread.c +1 -1
- data/lua-hooks/ext/luajit/src/lj_bcwrite.c +1 -1
- data/lua-hooks/ext/luajit/src/lj_buf.c +1 -1
- data/lua-hooks/ext/luajit/src/lj_buf.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_carith.c +1 -1
- data/lua-hooks/ext/luajit/src/lj_carith.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_ccall.c +172 -7
- data/lua-hooks/ext/luajit/src/lj_ccall.h +21 -5
- data/lua-hooks/ext/luajit/src/lj_ccallback.c +71 -17
- data/lua-hooks/ext/luajit/src/lj_ccallback.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_cconv.c +4 -2
- data/lua-hooks/ext/luajit/src/lj_cconv.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_cdata.c +7 -5
- data/lua-hooks/ext/luajit/src/lj_cdata.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_clib.c +5 -5
- data/lua-hooks/ext/luajit/src/lj_clib.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_cparse.c +11 -6
- data/lua-hooks/ext/luajit/src/lj_cparse.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_crecord.c +70 -14
- data/lua-hooks/ext/luajit/src/lj_crecord.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_ctype.c +1 -1
- data/lua-hooks/ext/luajit/src/lj_ctype.h +8 -8
- data/lua-hooks/ext/luajit/src/lj_debug.c +1 -1
- data/lua-hooks/ext/luajit/src/lj_debug.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_def.h +6 -9
- data/lua-hooks/ext/luajit/src/lj_dispatch.c +3 -3
- data/lua-hooks/ext/luajit/src/lj_dispatch.h +2 -1
- data/lua-hooks/ext/luajit/src/lj_emit_arm.h +5 -4
- data/lua-hooks/ext/luajit/src/lj_emit_arm64.h +419 -0
- data/lua-hooks/ext/luajit/src/lj_emit_mips.h +100 -20
- data/lua-hooks/ext/luajit/src/lj_emit_ppc.h +4 -4
- data/lua-hooks/ext/luajit/src/lj_emit_x86.h +116 -25
- data/lua-hooks/ext/luajit/src/lj_err.c +34 -13
- data/lua-hooks/ext/luajit/src/lj_err.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_errmsg.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_ff.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_ffrecord.c +58 -49
- data/lua-hooks/ext/luajit/src/lj_ffrecord.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_frame.h +33 -6
- data/lua-hooks/ext/luajit/src/lj_func.c +4 -2
- data/lua-hooks/ext/luajit/src/lj_func.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_gc.c +16 -7
- data/lua-hooks/ext/luajit/src/lj_gc.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_gdbjit.c +31 -1
- data/lua-hooks/ext/luajit/src/lj_gdbjit.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_ir.c +69 -96
- data/lua-hooks/ext/luajit/src/lj_ir.h +29 -18
- data/lua-hooks/ext/luajit/src/lj_ircall.h +24 -30
- data/lua-hooks/ext/luajit/src/lj_iropt.h +9 -9
- data/lua-hooks/ext/luajit/src/lj_jit.h +67 -9
- data/lua-hooks/ext/luajit/src/lj_lex.c +1 -1
- data/lua-hooks/ext/luajit/src/lj_lex.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_lib.c +1 -1
- data/lua-hooks/ext/luajit/src/lj_lib.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_load.c +1 -1
- data/lua-hooks/ext/luajit/src/lj_mcode.c +11 -10
- data/lua-hooks/ext/luajit/src/lj_mcode.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_meta.c +1 -1
- data/lua-hooks/ext/luajit/src/lj_meta.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_obj.c +1 -1
- data/lua-hooks/ext/luajit/src/lj_obj.h +7 -3
- data/lua-hooks/ext/luajit/src/lj_opt_dce.c +1 -1
- data/lua-hooks/ext/luajit/src/lj_opt_fold.c +84 -17
- data/lua-hooks/ext/luajit/src/lj_opt_loop.c +1 -1
- data/lua-hooks/ext/luajit/src/lj_opt_mem.c +3 -3
- data/lua-hooks/ext/luajit/src/lj_opt_narrow.c +24 -22
- data/lua-hooks/ext/luajit/src/lj_opt_sink.c +11 -6
- data/lua-hooks/ext/luajit/src/lj_opt_split.c +11 -2
- data/lua-hooks/ext/luajit/src/lj_parse.c +9 -7
- data/lua-hooks/ext/luajit/src/lj_parse.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_profile.c +1 -1
- data/lua-hooks/ext/luajit/src/lj_profile.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_record.c +201 -117
- data/lua-hooks/ext/luajit/src/lj_record.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_snap.c +72 -26
- data/lua-hooks/ext/luajit/src/lj_snap.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_state.c +6 -6
- data/lua-hooks/ext/luajit/src/lj_state.h +2 -2
- data/lua-hooks/ext/luajit/src/lj_str.c +1 -1
- data/lua-hooks/ext/luajit/src/lj_str.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_strfmt.c +7 -3
- data/lua-hooks/ext/luajit/src/lj_strfmt.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_strfmt_num.c +4 -3
- data/lua-hooks/ext/luajit/src/lj_strscan.c +1 -1
- data/lua-hooks/ext/luajit/src/lj_strscan.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_tab.c +1 -2
- data/lua-hooks/ext/luajit/src/lj_tab.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_target.h +3 -3
- data/lua-hooks/ext/luajit/src/lj_target_arm.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_target_arm64.h +239 -7
- data/lua-hooks/ext/luajit/src/lj_target_mips.h +111 -22
- data/lua-hooks/ext/luajit/src/lj_target_ppc.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_target_x86.h +21 -4
- data/lua-hooks/ext/luajit/src/lj_trace.c +63 -18
- data/lua-hooks/ext/luajit/src/lj_trace.h +2 -1
- data/lua-hooks/ext/luajit/src/lj_traceerr.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_udata.c +1 -1
- data/lua-hooks/ext/luajit/src/lj_udata.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_vm.h +5 -1
- data/lua-hooks/ext/luajit/src/lj_vmevent.c +1 -1
- data/lua-hooks/ext/luajit/src/lj_vmevent.h +1 -1
- data/lua-hooks/ext/luajit/src/lj_vmmath.c +1 -1
- data/lua-hooks/ext/luajit/src/ljamalg.c +1 -1
- data/lua-hooks/ext/luajit/src/lua.h +9 -1
- data/lua-hooks/ext/luajit/src/luaconf.h +3 -7
- data/lua-hooks/ext/luajit/src/luajit.c +69 -54
- data/lua-hooks/ext/luajit/src/luajit.h +4 -4
- data/lua-hooks/ext/luajit/src/lualib.h +1 -1
- data/lua-hooks/ext/luajit/src/msvcbuild.bat +12 -4
- data/lua-hooks/ext/luajit/src/vm_arm.dasc +1 -1
- data/lua-hooks/ext/luajit/src/vm_arm64.dasc +255 -32
- data/lua-hooks/ext/luajit/src/vm_mips.dasc +26 -23
- data/lua-hooks/ext/luajit/src/vm_mips64.dasc +5062 -0
- data/lua-hooks/ext/luajit/src/vm_ppc.dasc +1 -1
- data/lua-hooks/ext/luajit/src/vm_x64.dasc +24 -25
- data/lua-hooks/ext/luajit/src/vm_x86.dasc +77 -4
- data/lua-hooks/libluahooks.darwin.a +0 -0
- data/lua-hooks/libluahooks.linux.a +0 -0
- data/lua-hooks/options.mk +1 -1
- metadata +37 -77
- data/lua-hooks/ext/all.c +0 -69
- data/lua-hooks/ext/libinjection/COPYING +0 -37
- data/lua-hooks/ext/libinjection/libinjection.h +0 -65
- data/lua-hooks/ext/libinjection/libinjection_html5.c +0 -847
- data/lua-hooks/ext/libinjection/libinjection_html5.h +0 -54
- data/lua-hooks/ext/libinjection/libinjection_sqli.c +0 -2301
- data/lua-hooks/ext/libinjection/libinjection_sqli.h +0 -295
- data/lua-hooks/ext/libinjection/libinjection_sqli_data.h +0 -9349
- data/lua-hooks/ext/libinjection/libinjection_xss.c +0 -531
- data/lua-hooks/ext/libinjection/libinjection_xss.h +0 -21
- data/lua-hooks/ext/libinjection/lualib.c +0 -145
- data/lua-hooks/ext/libinjection/module.mk +0 -5
- data/lua-hooks/ext/lpeg/HISTORY +0 -96
- data/lua-hooks/ext/lpeg/lpcap.c +0 -537
- data/lua-hooks/ext/lpeg/lpcap.h +0 -56
- data/lua-hooks/ext/lpeg/lpcode.c +0 -1014
- data/lua-hooks/ext/lpeg/lpcode.h +0 -40
- data/lua-hooks/ext/lpeg/lpeg-128.gif +0 -0
- data/lua-hooks/ext/lpeg/lpeg.html +0 -1445
- data/lua-hooks/ext/lpeg/lpprint.c +0 -244
- data/lua-hooks/ext/lpeg/lpprint.h +0 -36
- data/lua-hooks/ext/lpeg/lptree.c +0 -1303
- data/lua-hooks/ext/lpeg/lptree.h +0 -82
- data/lua-hooks/ext/lpeg/lptypes.h +0 -149
- data/lua-hooks/ext/lpeg/lpvm.c +0 -364
- data/lua-hooks/ext/lpeg/lpvm.h +0 -58
- data/lua-hooks/ext/lpeg/makefile +0 -55
- data/lua-hooks/ext/lpeg/module.mk +0 -6
- data/lua-hooks/ext/lpeg/re.html +0 -498
- data/lua-hooks/ext/lua-cmsgpack/.gitignore +0 -13
- data/lua-hooks/ext/lua-cmsgpack/CMakeLists.txt +0 -45
- data/lua-hooks/ext/lua-cmsgpack/README.md +0 -115
- data/lua-hooks/ext/lua-cmsgpack/lua_cmsgpack.c +0 -970
- data/lua-hooks/ext/lua-cmsgpack/module.mk +0 -2
- data/lua-hooks/ext/lua-cmsgpack/test.lua +0 -570
- data/lua-hooks/ext/lua-snapshot/LICENSE +0 -7
- data/lua-hooks/ext/lua-snapshot/Makefile +0 -12
- data/lua-hooks/ext/lua-snapshot/README.md +0 -18
- data/lua-hooks/ext/lua-snapshot/dump.lua +0 -15
- data/lua-hooks/ext/lua-snapshot/module.mk +0 -2
- data/lua-hooks/ext/lua-snapshot/snapshot.c +0 -462
- data/lua-hooks/ext/luautf8/README.md +0 -152
- data/lua-hooks/ext/luautf8/lutf8lib.c +0 -1274
- data/lua-hooks/ext/luautf8/module.mk +0 -2
- data/lua-hooks/ext/luautf8/unidata.h +0 -3064
- data/lua-hooks/ext/module.mk +0 -15
- data/lua-hooks/ext/modules.h +0 -17
- data/lua-hooks/ext/perf/luacpu.c +0 -114
- data/lua-hooks/ext/perf/lualoadavg.c +0 -40
- data/lua-hooks/ext/perf/luameminfo.c +0 -38
- data/lua-hooks/ext/perf/luaoslib.c +0 -203
- data/lua-hooks/ext/perf/module.mk +0 -5
- data/lua-hooks/ext/sha1/luasha1.c +0 -74
- data/lua-hooks/ext/sha1/module.mk +0 -5
- data/lua-hooks/ext/sha1/sha1.c +0 -145
- data/lua-hooks/ext/sha2/luasha256.c +0 -77
- data/lua-hooks/ext/sha2/module.mk +0 -5
- data/lua-hooks/ext/sha2/sha256.c +0 -196
- data/lua-hooks/ext/sysutils/lua_utils.c +0 -56
- data/lua-hooks/ext/sysutils/module.mk +0 -2
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*
|
|
2
2
|
** FFI C call handling.
|
|
3
|
-
** Copyright (C) 2005-
|
|
3
|
+
** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
#include "lj_obj.h"
|
|
@@ -301,7 +301,7 @@
|
|
|
301
301
|
unsigned int cl = ccall_classify_struct(cts, ctr); \
|
|
302
302
|
if ((cl & 4)) { /* Combine float HFA from separate registers. */ \
|
|
303
303
|
CTSize i = (cl >> 8) - 1; \
|
|
304
|
-
do { ((uint32_t *)dp)[i] = cc->fpr[i].
|
|
304
|
+
do { ((uint32_t *)dp)[i] = cc->fpr[i].lo; } while (i--); \
|
|
305
305
|
} else { \
|
|
306
306
|
if (cl > 1) sp = (uint8_t *)&cc->fpr[0]; \
|
|
307
307
|
memcpy(dp, sp, ctr->size); \
|
|
@@ -331,7 +331,7 @@
|
|
|
331
331
|
|
|
332
332
|
#define CCALL_HANDLE_COMPLEXARG \
|
|
333
333
|
/* Pass complex by value in separate (!) FPRs or on stack. */ \
|
|
334
|
-
isfp =
|
|
334
|
+
isfp = sz == 2*sizeof(float) ? 2 : 1;
|
|
335
335
|
|
|
336
336
|
#define CCALL_HANDLE_REGARG \
|
|
337
337
|
if (LJ_TARGET_IOS && isva) { \
|
|
@@ -359,6 +359,13 @@
|
|
|
359
359
|
} \
|
|
360
360
|
}
|
|
361
361
|
|
|
362
|
+
#if LJ_BE
|
|
363
|
+
#define CCALL_HANDLE_RET \
|
|
364
|
+
if (ctype_isfp(ctr->info) && ctr->size == sizeof(float)) \
|
|
365
|
+
sp = (uint8_t *)&cc->fpr[0].f;
|
|
366
|
+
#endif
|
|
367
|
+
|
|
368
|
+
|
|
362
369
|
#elif LJ_TARGET_PPC
|
|
363
370
|
/* -- PPC calling conventions --------------------------------------------- */
|
|
364
371
|
|
|
@@ -407,8 +414,8 @@
|
|
|
407
414
|
if (ctype_isfp(ctr->info) && ctr->size == sizeof(float)) \
|
|
408
415
|
ctr = ctype_get(cts, CTID_DOUBLE); /* FPRs always hold doubles. */
|
|
409
416
|
|
|
410
|
-
#elif
|
|
411
|
-
/* -- MIPS calling conventions
|
|
417
|
+
#elif LJ_TARGET_MIPS32
|
|
418
|
+
/* -- MIPS o32 calling conventions ---------------------------------------- */
|
|
412
419
|
|
|
413
420
|
#define CCALL_HANDLE_STRUCTRET \
|
|
414
421
|
cc->retref = 1; /* Return all structs by reference. */ \
|
|
@@ -483,6 +490,78 @@
|
|
|
483
490
|
sp = (uint8_t *)&cc->fpr[0].f;
|
|
484
491
|
#endif
|
|
485
492
|
|
|
493
|
+
#elif LJ_TARGET_MIPS64
|
|
494
|
+
/* -- MIPS n64 calling conventions ---------------------------------------- */
|
|
495
|
+
|
|
496
|
+
#define CCALL_HANDLE_STRUCTRET \
|
|
497
|
+
cc->retref = !(sz <= 16); \
|
|
498
|
+
if (cc->retref) cc->gpr[ngpr++] = (GPRArg)dp;
|
|
499
|
+
|
|
500
|
+
#define CCALL_HANDLE_STRUCTRET2 \
|
|
501
|
+
ccall_copy_struct(cc, ctr, dp, sp, ccall_classify_struct(cts, ctr, ct));
|
|
502
|
+
|
|
503
|
+
#define CCALL_HANDLE_COMPLEXRET \
|
|
504
|
+
/* Complex values are returned in 1 or 2 FPRs. */ \
|
|
505
|
+
cc->retref = 0;
|
|
506
|
+
|
|
507
|
+
#if LJ_ABI_SOFTFP /* MIPS64 soft-float */
|
|
508
|
+
|
|
509
|
+
#define CCALL_HANDLE_COMPLEXRET2 \
|
|
510
|
+
if (ctr->size == 2*sizeof(float)) { /* Copy complex float from GPRs. */ \
|
|
511
|
+
((intptr_t *)dp)[0] = cc->gpr[0]; \
|
|
512
|
+
} else { /* Copy complex double from GPRs. */ \
|
|
513
|
+
((intptr_t *)dp)[0] = cc->gpr[0]; \
|
|
514
|
+
((intptr_t *)dp)[1] = cc->gpr[1]; \
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
#define CCALL_HANDLE_COMPLEXARG \
|
|
518
|
+
/* Pass complex by value in 2 or 4 GPRs. */
|
|
519
|
+
|
|
520
|
+
/* Position of soft-float 'float' return value depends on endianess. */
|
|
521
|
+
#define CCALL_HANDLE_RET \
|
|
522
|
+
if (ctype_isfp(ctr->info) && ctr->size == sizeof(float)) \
|
|
523
|
+
sp = (uint8_t *)cc->gpr + LJ_ENDIAN_SELECT(0, 4);
|
|
524
|
+
|
|
525
|
+
#else /* MIPS64 hard-float */
|
|
526
|
+
|
|
527
|
+
#define CCALL_HANDLE_COMPLEXRET2 \
|
|
528
|
+
if (ctr->size == 2*sizeof(float)) { /* Copy complex float from FPRs. */ \
|
|
529
|
+
((float *)dp)[0] = cc->fpr[0].f; \
|
|
530
|
+
((float *)dp)[1] = cc->fpr[1].f; \
|
|
531
|
+
} else { /* Copy complex double from FPRs. */ \
|
|
532
|
+
((double *)dp)[0] = cc->fpr[0].d; \
|
|
533
|
+
((double *)dp)[1] = cc->fpr[1].d; \
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
#define CCALL_HANDLE_COMPLEXARG \
|
|
537
|
+
if (sz == 2*sizeof(float)) { \
|
|
538
|
+
isfp = 2; \
|
|
539
|
+
if (ngpr < maxgpr) \
|
|
540
|
+
sz *= 2; \
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
#define CCALL_HANDLE_RET \
|
|
544
|
+
if (ctype_isfp(ctr->info) && ctr->size == sizeof(float)) \
|
|
545
|
+
sp = (uint8_t *)&cc->fpr[0].f;
|
|
546
|
+
|
|
547
|
+
#endif
|
|
548
|
+
|
|
549
|
+
#define CCALL_HANDLE_STRUCTARG \
|
|
550
|
+
/* Pass all structs by value in registers and/or on the stack. */
|
|
551
|
+
|
|
552
|
+
#define CCALL_HANDLE_REGARG \
|
|
553
|
+
if (ngpr < maxgpr) { \
|
|
554
|
+
dp = &cc->gpr[ngpr]; \
|
|
555
|
+
if (ngpr + n > maxgpr) { \
|
|
556
|
+
nsp += ngpr + n - maxgpr; /* Assumes contiguous gpr/stack fields. */ \
|
|
557
|
+
if (nsp > CCALL_MAXSTACK) goto err_nyi; /* Too many arguments. */ \
|
|
558
|
+
ngpr = maxgpr; \
|
|
559
|
+
} else { \
|
|
560
|
+
ngpr += n; \
|
|
561
|
+
} \
|
|
562
|
+
goto done; \
|
|
563
|
+
}
|
|
564
|
+
|
|
486
565
|
#else
|
|
487
566
|
#error "Missing calling convention definitions for this architecture"
|
|
488
567
|
#endif
|
|
@@ -722,6 +801,78 @@ noth: /* Not a homogeneous float/double aggregate. */
|
|
|
722
801
|
|
|
723
802
|
#endif
|
|
724
803
|
|
|
804
|
+
/* -- MIPS64 ABI struct classification ---------------------------- */
|
|
805
|
+
|
|
806
|
+
#if LJ_TARGET_MIPS64
|
|
807
|
+
|
|
808
|
+
#define FTYPE_FLOAT 1
|
|
809
|
+
#define FTYPE_DOUBLE 2
|
|
810
|
+
|
|
811
|
+
/* Classify FP fields (max. 2) and their types. */
|
|
812
|
+
static unsigned int ccall_classify_struct(CTState *cts, CType *ct, CType *ctf)
|
|
813
|
+
{
|
|
814
|
+
int n = 0, ft = 0;
|
|
815
|
+
if ((ctf->info & CTF_VARARG) || (ct->info & CTF_UNION))
|
|
816
|
+
goto noth;
|
|
817
|
+
while (ct->sib) {
|
|
818
|
+
CType *sct;
|
|
819
|
+
ct = ctype_get(cts, ct->sib);
|
|
820
|
+
if (n == 2) {
|
|
821
|
+
goto noth;
|
|
822
|
+
} else if (ctype_isfield(ct->info)) {
|
|
823
|
+
sct = ctype_rawchild(cts, ct);
|
|
824
|
+
if (ctype_isfp(sct->info)) {
|
|
825
|
+
ft |= (sct->size == 4 ? FTYPE_FLOAT : FTYPE_DOUBLE) << 2*n;
|
|
826
|
+
n++;
|
|
827
|
+
} else {
|
|
828
|
+
goto noth;
|
|
829
|
+
}
|
|
830
|
+
} else if (ctype_isbitfield(ct->info) ||
|
|
831
|
+
ctype_isxattrib(ct->info, CTA_SUBTYPE)) {
|
|
832
|
+
goto noth;
|
|
833
|
+
}
|
|
834
|
+
}
|
|
835
|
+
if (n <= 2)
|
|
836
|
+
return ft;
|
|
837
|
+
noth: /* Not a homogeneous float/double aggregate. */
|
|
838
|
+
return 0; /* Struct is in GPRs. */
|
|
839
|
+
}
|
|
840
|
+
|
|
841
|
+
void ccall_copy_struct(CCallState *cc, CType *ctr, void *dp, void *sp, int ft)
|
|
842
|
+
{
|
|
843
|
+
if (LJ_ABI_SOFTFP ? ft :
|
|
844
|
+
((ft & 3) == FTYPE_FLOAT || (ft >> 2) == FTYPE_FLOAT)) {
|
|
845
|
+
int i, ofs = 0;
|
|
846
|
+
for (i = 0; ft != 0; i++, ft >>= 2) {
|
|
847
|
+
if ((ft & 3) == FTYPE_FLOAT) {
|
|
848
|
+
#if LJ_ABI_SOFTFP
|
|
849
|
+
/* The 2nd FP struct result is in CARG1 (gpr[2]) and not CRET2. */
|
|
850
|
+
memcpy((uint8_t *)dp + ofs,
|
|
851
|
+
(uint8_t *)&cc->gpr[2*i] + LJ_ENDIAN_SELECT(0, 4), 4);
|
|
852
|
+
#else
|
|
853
|
+
*(float *)((uint8_t *)dp + ofs) = cc->fpr[i].f;
|
|
854
|
+
#endif
|
|
855
|
+
ofs += 4;
|
|
856
|
+
} else {
|
|
857
|
+
ofs = (ofs + 7) & ~7; /* 64 bit alignment. */
|
|
858
|
+
#if LJ_ABI_SOFTFP
|
|
859
|
+
*(intptr_t *)((uint8_t *)dp + ofs) = cc->gpr[2*i];
|
|
860
|
+
#else
|
|
861
|
+
*(double *)((uint8_t *)dp + ofs) = cc->fpr[i].d;
|
|
862
|
+
#endif
|
|
863
|
+
ofs += 8;
|
|
864
|
+
}
|
|
865
|
+
}
|
|
866
|
+
} else {
|
|
867
|
+
#if !LJ_ABI_SOFTFP
|
|
868
|
+
if (ft) sp = (uint8_t *)&cc->fpr[0];
|
|
869
|
+
#endif
|
|
870
|
+
memcpy(dp, sp, ctr->size);
|
|
871
|
+
}
|
|
872
|
+
}
|
|
873
|
+
|
|
874
|
+
#endif
|
|
875
|
+
|
|
725
876
|
/* -- Common C call handling ---------------------------------------------- */
|
|
726
877
|
|
|
727
878
|
/* Infer the destination CTypeID for a vararg argument. */
|
|
@@ -889,6 +1040,19 @@ static int ccall_set_args(lua_State *L, CTState *cts, CType *ct,
|
|
|
889
1040
|
*(int32_t *)dp = d->size == 1 ? (int32_t)*(int8_t *)dp :
|
|
890
1041
|
(int32_t)*(int16_t *)dp;
|
|
891
1042
|
}
|
|
1043
|
+
#if LJ_TARGET_ARM64 && LJ_BE
|
|
1044
|
+
if (isfp && d->size == sizeof(float))
|
|
1045
|
+
((float *)dp)[1] = ((float *)dp)[0]; /* Floats occupy high slot. */
|
|
1046
|
+
#endif
|
|
1047
|
+
#if LJ_TARGET_MIPS64 || (LJ_TARGET_ARM64 && LJ_BE)
|
|
1048
|
+
if ((ctype_isinteger_or_bool(d->info) || ctype_isenum(d->info)
|
|
1049
|
+
#if LJ_TARGET_MIPS64
|
|
1050
|
+
|| (isfp && nsp == 0)
|
|
1051
|
+
#endif
|
|
1052
|
+
) && d->size <= 4) {
|
|
1053
|
+
*(int64_t *)dp = (int64_t)*(int32_t *)dp; /* Sign-extend to 64 bit. */
|
|
1054
|
+
}
|
|
1055
|
+
#endif
|
|
892
1056
|
#if LJ_TARGET_X64 && LJ_ABI_WIN
|
|
893
1057
|
if (isva) { /* Windows/x64 mirrors varargs in both register sets. */
|
|
894
1058
|
if (nfpr == ngpr)
|
|
@@ -904,7 +1068,7 @@ static int ccall_set_args(lua_State *L, CTState *cts, CType *ct,
|
|
|
904
1068
|
cc->fpr[nfpr-1].d[0] = cc->fpr[nfpr-2].d[1]; /* Split complex double. */
|
|
905
1069
|
cc->fpr[nfpr-2].d[1] = 0;
|
|
906
1070
|
}
|
|
907
|
-
#elif LJ_TARGET_ARM64
|
|
1071
|
+
#elif LJ_TARGET_ARM64 || (LJ_TARGET_MIPS64 && !LJ_ABI_SOFTFP)
|
|
908
1072
|
if (isfp == 2 && (uint8_t *)dp < (uint8_t *)cc->stack) {
|
|
909
1073
|
/* Split float HFA or complex float into separate registers. */
|
|
910
1074
|
CTSize i = (sz >> 2) - 1;
|
|
@@ -951,7 +1115,8 @@ static int ccall_get_results(lua_State *L, CTState *cts, CType *ct,
|
|
|
951
1115
|
CCALL_HANDLE_COMPLEXRET2
|
|
952
1116
|
return 1; /* One GC step. */
|
|
953
1117
|
}
|
|
954
|
-
if (LJ_BE &&
|
|
1118
|
+
if (LJ_BE && ctr->size < CTSIZE_PTR &&
|
|
1119
|
+
(ctype_isinteger_or_bool(ctr->info) || ctype_isenum(ctr->info)))
|
|
955
1120
|
sp += (CTSIZE_PTR - ctr->size);
|
|
956
1121
|
#if CCALL_NUM_FPR
|
|
957
1122
|
if (ctype_isfp(ctr->info) || ctype_isvector(ctr->info))
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*
|
|
2
2
|
** FFI C call handling.
|
|
3
|
-
** Copyright (C) 2005-
|
|
3
|
+
** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
#ifndef _LJ_CCALL_H
|
|
@@ -79,8 +79,8 @@ typedef union FPRArg {
|
|
|
79
79
|
typedef intptr_t GPRArg;
|
|
80
80
|
typedef union FPRArg {
|
|
81
81
|
double d;
|
|
82
|
-
float f;
|
|
83
|
-
uint32_t
|
|
82
|
+
struct { LJ_ENDIAN_LOHI(float f; , float g;) };
|
|
83
|
+
struct { LJ_ENDIAN_LOHI(uint32_t lo; , uint32_t hi;) };
|
|
84
84
|
} FPRArg;
|
|
85
85
|
|
|
86
86
|
#elif LJ_TARGET_PPC
|
|
@@ -95,11 +95,11 @@ typedef union FPRArg {
|
|
|
95
95
|
typedef intptr_t GPRArg;
|
|
96
96
|
typedef double FPRArg;
|
|
97
97
|
|
|
98
|
-
#elif
|
|
98
|
+
#elif LJ_TARGET_MIPS32
|
|
99
99
|
|
|
100
100
|
#define CCALL_NARG_GPR 4
|
|
101
101
|
#define CCALL_NARG_FPR (LJ_ABI_SOFTFP ? 0 : 2)
|
|
102
|
-
#define CCALL_NRET_GPR 2
|
|
102
|
+
#define CCALL_NRET_GPR (LJ_ABI_SOFTFP ? 4 : 2)
|
|
103
103
|
#define CCALL_NRET_FPR (LJ_ABI_SOFTFP ? 0 : 2)
|
|
104
104
|
#define CCALL_SPS_EXTRA 7
|
|
105
105
|
#define CCALL_SPS_FREE 1
|
|
@@ -110,6 +110,22 @@ typedef union FPRArg {
|
|
|
110
110
|
struct { LJ_ENDIAN_LOHI(float f; , float g;) };
|
|
111
111
|
} FPRArg;
|
|
112
112
|
|
|
113
|
+
#elif LJ_TARGET_MIPS64
|
|
114
|
+
|
|
115
|
+
/* FP args are positional and overlay the GPR array. */
|
|
116
|
+
#define CCALL_NARG_GPR 8
|
|
117
|
+
#define CCALL_NARG_FPR 0
|
|
118
|
+
#define CCALL_NRET_GPR 2
|
|
119
|
+
#define CCALL_NRET_FPR (LJ_ABI_SOFTFP ? 0 : 2)
|
|
120
|
+
#define CCALL_SPS_EXTRA 3
|
|
121
|
+
#define CCALL_SPS_FREE 1
|
|
122
|
+
|
|
123
|
+
typedef intptr_t GPRArg;
|
|
124
|
+
typedef union FPRArg {
|
|
125
|
+
double d;
|
|
126
|
+
struct { LJ_ENDIAN_LOHI(float f; , float g;) };
|
|
127
|
+
} FPRArg;
|
|
128
|
+
|
|
113
129
|
#else
|
|
114
130
|
#error "Missing calling convention definitions for this architecture"
|
|
115
131
|
#endif
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*
|
|
2
2
|
** FFI C callback handling.
|
|
3
|
-
** Copyright (C) 2005-
|
|
3
|
+
** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
#include "lj_obj.h"
|
|
@@ -63,9 +63,13 @@ static MSize CALLBACK_OFS2SLOT(MSize ofs)
|
|
|
63
63
|
|
|
64
64
|
#define CALLBACK_MCODE_HEAD 24
|
|
65
65
|
|
|
66
|
-
#elif
|
|
66
|
+
#elif LJ_TARGET_MIPS32
|
|
67
67
|
|
|
68
|
-
#define CALLBACK_MCODE_HEAD
|
|
68
|
+
#define CALLBACK_MCODE_HEAD 20
|
|
69
|
+
|
|
70
|
+
#elif LJ_TARGET_MIPS64
|
|
71
|
+
|
|
72
|
+
#define CALLBACK_MCODE_HEAD 52
|
|
69
73
|
|
|
70
74
|
#else
|
|
71
75
|
|
|
@@ -169,16 +173,16 @@ static void callback_mcode_init(global_State *g, uint32_t *page)
|
|
|
169
173
|
uint32_t *p = page;
|
|
170
174
|
void *target = (void *)lj_vm_ffi_callback;
|
|
171
175
|
MSize slot;
|
|
172
|
-
*p++ = A64I_LDRLx | A64F_D(RID_X11) | A64F_S19(4);
|
|
173
|
-
*p++ = A64I_LDRLx | A64F_D(RID_X10) | A64F_S19(5);
|
|
174
|
-
*p++ = A64I_BR | A64F_N(RID_X11);
|
|
175
|
-
*p++ = A64I_NOP;
|
|
176
|
+
*p++ = A64I_LE(A64I_LDRLx | A64F_D(RID_X11) | A64F_S19(4));
|
|
177
|
+
*p++ = A64I_LE(A64I_LDRLx | A64F_D(RID_X10) | A64F_S19(5));
|
|
178
|
+
*p++ = A64I_LE(A64I_BR | A64F_N(RID_X11));
|
|
179
|
+
*p++ = A64I_LE(A64I_NOP);
|
|
176
180
|
((void **)p)[0] = target;
|
|
177
181
|
((void **)p)[1] = g;
|
|
178
182
|
p += 4;
|
|
179
183
|
for (slot = 0; slot < CALLBACK_MAX_SLOT; slot++) {
|
|
180
|
-
*p++ = A64I_MOVZw | A64F_D(RID_X9) | A64F_U16(slot);
|
|
181
|
-
*p = A64I_B | A64F_S26((page-p) & 0x03ffffffu);
|
|
184
|
+
*p++ = A64I_LE(A64I_MOVZw | A64F_D(RID_X9) | A64F_U16(slot));
|
|
185
|
+
*p = A64I_LE(A64I_B | A64F_S26((page-p) & 0x03ffffffu));
|
|
182
186
|
p++;
|
|
183
187
|
}
|
|
184
188
|
lua_assert(p - page <= CALLBACK_MCODE_SIZE);
|
|
@@ -206,14 +210,27 @@ static void callback_mcode_init(global_State *g, uint32_t *page)
|
|
|
206
210
|
static void callback_mcode_init(global_State *g, uint32_t *page)
|
|
207
211
|
{
|
|
208
212
|
uint32_t *p = page;
|
|
209
|
-
|
|
213
|
+
uintptr_t target = (uintptr_t)(void *)lj_vm_ffi_callback;
|
|
214
|
+
uintptr_t ug = (uintptr_t)(void *)g;
|
|
210
215
|
MSize slot;
|
|
211
|
-
|
|
212
|
-
*p++ = MIPSI_LUI | MIPSF_T(RID_R3) | (
|
|
213
|
-
*p++ = MIPSI_LUI | MIPSF_T(RID_R2) | (
|
|
214
|
-
|
|
216
|
+
#if LJ_TARGET_MIPS32
|
|
217
|
+
*p++ = MIPSI_LUI | MIPSF_T(RID_R3) | (target >> 16);
|
|
218
|
+
*p++ = MIPSI_LUI | MIPSF_T(RID_R2) | (ug >> 16);
|
|
219
|
+
#else
|
|
220
|
+
*p++ = MIPSI_LUI | MIPSF_T(RID_R3) | (target >> 48);
|
|
221
|
+
*p++ = MIPSI_LUI | MIPSF_T(RID_R2) | (ug >> 48);
|
|
222
|
+
*p++ = MIPSI_ORI | MIPSF_T(RID_R3)|MIPSF_S(RID_R3) | ((target >> 32) & 0xffff);
|
|
223
|
+
*p++ = MIPSI_ORI | MIPSF_T(RID_R2)|MIPSF_S(RID_R2) | ((ug >> 32) & 0xffff);
|
|
224
|
+
*p++ = MIPSI_DSLL | MIPSF_D(RID_R3)|MIPSF_T(RID_R3) | MIPSF_A(16);
|
|
225
|
+
*p++ = MIPSI_DSLL | MIPSF_D(RID_R2)|MIPSF_T(RID_R2) | MIPSF_A(16);
|
|
226
|
+
*p++ = MIPSI_ORI | MIPSF_T(RID_R3)|MIPSF_S(RID_R3) | ((target >> 16) & 0xffff);
|
|
227
|
+
*p++ = MIPSI_ORI | MIPSF_T(RID_R2)|MIPSF_S(RID_R2) | ((ug >> 16) & 0xffff);
|
|
228
|
+
*p++ = MIPSI_DSLL | MIPSF_D(RID_R3)|MIPSF_T(RID_R3) | MIPSF_A(16);
|
|
229
|
+
*p++ = MIPSI_DSLL | MIPSF_D(RID_R2)|MIPSF_T(RID_R2) | MIPSF_A(16);
|
|
230
|
+
#endif
|
|
231
|
+
*p++ = MIPSI_ORI | MIPSF_T(RID_R3)|MIPSF_S(RID_R3) | (target & 0xffff);
|
|
215
232
|
*p++ = MIPSI_JR | MIPSF_S(RID_R3);
|
|
216
|
-
*p++ = MIPSI_ORI | MIPSF_T(RID_R2)|MIPSF_S(RID_R2) | (
|
|
233
|
+
*p++ = MIPSI_ORI | MIPSF_T(RID_R2)|MIPSF_S(RID_R2) | (ug & 0xffff);
|
|
217
234
|
for (slot = 0; slot < CALLBACK_MAX_SLOT; slot++) {
|
|
218
235
|
*p = MIPSI_B | ((page-p-1) & 0x0000ffffu);
|
|
219
236
|
p++;
|
|
@@ -425,7 +442,7 @@ void lj_ccallback_mcode_free(CTState *cts)
|
|
|
425
442
|
if (ctype_isfp(ctr->info) && ctr->size == sizeof(float)) \
|
|
426
443
|
*(double *)dp = *(float *)dp; /* FPRs always hold doubles. */
|
|
427
444
|
|
|
428
|
-
#elif
|
|
445
|
+
#elif LJ_TARGET_MIPS32
|
|
429
446
|
|
|
430
447
|
#define CALLBACK_HANDLE_GPR \
|
|
431
448
|
if (n > 1) ngpr = (ngpr + 1u) & ~1u; /* Align to regpair. */ \
|
|
@@ -451,6 +468,29 @@ void lj_ccallback_mcode_free(CTState *cts)
|
|
|
451
468
|
UNUSED(isfp);
|
|
452
469
|
#endif
|
|
453
470
|
|
|
471
|
+
#define CALLBACK_HANDLE_RET \
|
|
472
|
+
if (ctype_isfp(ctr->info) && ctr->size == sizeof(float)) \
|
|
473
|
+
((float *)dp)[1] = *(float *)dp;
|
|
474
|
+
|
|
475
|
+
#elif LJ_TARGET_MIPS64
|
|
476
|
+
|
|
477
|
+
#if !LJ_ABI_SOFTFP /* MIPS64 hard-float */
|
|
478
|
+
#define CALLBACK_HANDLE_REGARG \
|
|
479
|
+
if (ngpr + n <= maxgpr) { \
|
|
480
|
+
sp = isfp ? (void*) &cts->cb.fpr[ngpr] : (void*) &cts->cb.gpr[ngpr]; \
|
|
481
|
+
ngpr += n; \
|
|
482
|
+
goto done; \
|
|
483
|
+
}
|
|
484
|
+
#else /* MIPS64 soft-float */
|
|
485
|
+
#define CALLBACK_HANDLE_REGARG \
|
|
486
|
+
if (ngpr + n <= maxgpr) { \
|
|
487
|
+
UNUSED(isfp); \
|
|
488
|
+
sp = (void*) &cts->cb.gpr[ngpr]; \
|
|
489
|
+
ngpr += n; \
|
|
490
|
+
goto done; \
|
|
491
|
+
}
|
|
492
|
+
#endif
|
|
493
|
+
|
|
454
494
|
#define CALLBACK_HANDLE_RET \
|
|
455
495
|
if (ctype_isfp(ctr->info) && ctr->size == sizeof(float)) \
|
|
456
496
|
((float *)dp)[1] = *(float *)dp;
|
|
@@ -542,7 +582,11 @@ static void callback_conv_args(CTState *cts, lua_State *L)
|
|
|
542
582
|
nsp += n;
|
|
543
583
|
|
|
544
584
|
done:
|
|
545
|
-
if (LJ_BE && cta->size < CTSIZE_PTR
|
|
585
|
+
if (LJ_BE && cta->size < CTSIZE_PTR
|
|
586
|
+
#if LJ_TARGET_MIPS64
|
|
587
|
+
&& !(isfp && nsp)
|
|
588
|
+
#endif
|
|
589
|
+
)
|
|
546
590
|
sp = (void *)((uint8_t *)sp + CTSIZE_PTR-cta->size);
|
|
547
591
|
gcsteps += lj_cconv_tv_ct(cts, cta, 0, o++, sp);
|
|
548
592
|
}
|
|
@@ -579,6 +623,10 @@ static void callback_conv_result(CTState *cts, lua_State *L, TValue *o)
|
|
|
579
623
|
#if CCALL_NUM_FPR
|
|
580
624
|
if (ctype_isfp(ctr->info))
|
|
581
625
|
dp = (uint8_t *)&cts->cb.fpr[0];
|
|
626
|
+
#endif
|
|
627
|
+
#if LJ_TARGET_ARM64 && LJ_BE
|
|
628
|
+
if (ctype_isfp(ctr->info) && ctr->size == sizeof(float))
|
|
629
|
+
dp = (uint8_t *)&cts->cb.fpr[0].f[1];
|
|
582
630
|
#endif
|
|
583
631
|
lj_cconv_ct_tv(cts, ctr, dp, o, 0);
|
|
584
632
|
#ifdef CALLBACK_HANDLE_RET
|
|
@@ -593,6 +641,12 @@ static void callback_conv_result(CTState *cts, lua_State *L, TValue *o)
|
|
|
593
641
|
*(int32_t *)dp = ctr->size == 1 ? (int32_t)*(int8_t *)dp :
|
|
594
642
|
(int32_t)*(int16_t *)dp;
|
|
595
643
|
}
|
|
644
|
+
#if LJ_TARGET_MIPS64 || (LJ_TARGET_ARM64 && LJ_BE)
|
|
645
|
+
/* Always sign-extend results to 64 bits. Even a soft-fp 'float'. */
|
|
646
|
+
if (ctr->size <= 4 &&
|
|
647
|
+
(LJ_ABI_SOFTFP || ctype_isinteger_or_bool(ctr->info)))
|
|
648
|
+
*(int64_t *)dp = (int64_t)*(int32_t *)dp;
|
|
649
|
+
#endif
|
|
596
650
|
#if LJ_TARGET_X86
|
|
597
651
|
if (ctype_isfp(ctr->info))
|
|
598
652
|
cts->cb.gpr[2] = ctr->size == sizeof(float) ? 1 : 2;
|