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.
Files changed (291) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +13 -5
  3. data/ext/immunio/Rakefile +14 -6
  4. data/lib/immunio/context.rb +2 -0
  5. data/lib/immunio/plugins/action_view.rb +7 -668
  6. data/lib/immunio/plugins/action_view/action_view.rb +22 -0
  7. data/lib/immunio/plugins/action_view/active_support_hash.rb +29 -0
  8. data/lib/immunio/plugins/action_view/cache_store.rb +24 -0
  9. data/lib/immunio/plugins/action_view/erubi.rb +38 -0
  10. data/lib/immunio/plugins/action_view/erubis.rb +39 -0
  11. data/lib/immunio/plugins/action_view/fragment_caching.rb +29 -0
  12. data/lib/immunio/plugins/action_view/haml.rb +46 -0
  13. data/lib/immunio/plugins/action_view/slim.rb +42 -0
  14. data/lib/immunio/plugins/action_view/template.rb +431 -0
  15. data/lib/immunio/plugins/action_view/template_rendering.rb +45 -0
  16. data/lib/immunio/plugins/http_tracker.rb +2 -0
  17. data/lib/immunio/plugins/io.rb +34 -0
  18. data/lib/immunio/version.rb +1 -1
  19. data/lua-hooks/Makefile +36 -9
  20. data/lua-hooks/ext/luajit/COPYRIGHT +1 -1
  21. data/lua-hooks/ext/luajit/Makefile +22 -15
  22. data/lua-hooks/ext/luajit/README +2 -2
  23. data/lua-hooks/ext/luajit/doc/bluequad-print.css +1 -1
  24. data/lua-hooks/ext/luajit/doc/bluequad.css +1 -1
  25. data/lua-hooks/ext/luajit/doc/changes.html +69 -3
  26. data/lua-hooks/ext/luajit/doc/contact.html +10 -3
  27. data/lua-hooks/ext/luajit/doc/ext_c_api.html +2 -2
  28. data/lua-hooks/ext/luajit/doc/ext_ffi.html +2 -2
  29. data/lua-hooks/ext/luajit/doc/ext_ffi_api.html +2 -2
  30. data/lua-hooks/ext/luajit/doc/ext_ffi_semantics.html +3 -4
  31. data/lua-hooks/ext/luajit/doc/ext_ffi_tutorial.html +2 -2
  32. data/lua-hooks/ext/luajit/doc/ext_jit.html +3 -3
  33. data/lua-hooks/ext/luajit/doc/ext_profiler.html +2 -2
  34. data/lua-hooks/ext/luajit/doc/extensions.html +47 -20
  35. data/lua-hooks/ext/luajit/doc/faq.html +2 -2
  36. data/lua-hooks/ext/luajit/doc/install.html +74 -45
  37. data/lua-hooks/ext/luajit/doc/luajit.html +5 -5
  38. data/lua-hooks/ext/luajit/doc/running.html +3 -3
  39. data/lua-hooks/ext/luajit/doc/status.html +13 -8
  40. data/lua-hooks/ext/luajit/dynasm/dasm_arm.h +1 -1
  41. data/lua-hooks/ext/luajit/dynasm/dasm_arm.lua +1 -1
  42. data/lua-hooks/ext/luajit/dynasm/dasm_arm64.h +1 -1
  43. data/lua-hooks/ext/luajit/dynasm/dasm_arm64.lua +1 -1
  44. data/lua-hooks/ext/luajit/dynasm/dasm_mips.h +8 -5
  45. data/lua-hooks/ext/luajit/dynasm/dasm_mips.lua +66 -11
  46. data/lua-hooks/ext/luajit/dynasm/dasm_mips64.lua +12 -0
  47. data/lua-hooks/ext/luajit/dynasm/dasm_ppc.h +1 -1
  48. data/lua-hooks/ext/luajit/dynasm/dasm_ppc.lua +1 -1
  49. data/lua-hooks/ext/luajit/dynasm/dasm_proto.h +1 -1
  50. data/lua-hooks/ext/luajit/dynasm/dasm_x64.lua +1 -1
  51. data/lua-hooks/ext/luajit/dynasm/dasm_x86.h +1 -1
  52. data/lua-hooks/ext/luajit/dynasm/dasm_x86.lua +5 -1
  53. data/lua-hooks/ext/luajit/dynasm/dynasm.lua +2 -2
  54. data/lua-hooks/ext/luajit/etc/luajit.1 +1 -1
  55. data/lua-hooks/ext/luajit/etc/luajit.pc +1 -1
  56. data/lua-hooks/ext/luajit/src/Makefile +15 -11
  57. data/lua-hooks/ext/luajit/src/Makefile.dep +16 -16
  58. data/lua-hooks/ext/luajit/src/host/buildvm.c +2 -2
  59. data/lua-hooks/ext/luajit/src/host/buildvm.h +1 -1
  60. data/lua-hooks/ext/luajit/src/host/buildvm_asm.c +9 -4
  61. data/lua-hooks/ext/luajit/src/host/buildvm_fold.c +2 -2
  62. data/lua-hooks/ext/luajit/src/host/buildvm_lib.c +1 -1
  63. data/lua-hooks/ext/luajit/src/host/buildvm_libbc.h +14 -3
  64. data/lua-hooks/ext/luajit/src/host/buildvm_peobj.c +27 -3
  65. data/lua-hooks/ext/luajit/src/host/genlibbc.lua +1 -1
  66. data/lua-hooks/ext/luajit/src/host/genminilua.lua +6 -5
  67. data/lua-hooks/ext/luajit/src/host/minilua.c +1 -1
  68. data/lua-hooks/ext/luajit/src/jit/bc.lua +1 -1
  69. data/lua-hooks/ext/luajit/src/jit/bcsave.lua +8 -8
  70. data/lua-hooks/ext/luajit/src/jit/dis_arm.lua +2 -2
  71. data/lua-hooks/ext/luajit/src/jit/dis_arm64.lua +1216 -0
  72. data/lua-hooks/ext/luajit/src/jit/dis_arm64be.lua +12 -0
  73. data/lua-hooks/ext/luajit/src/jit/dis_mips.lua +35 -20
  74. data/lua-hooks/ext/luajit/src/jit/dis_mips64.lua +17 -0
  75. data/lua-hooks/ext/luajit/src/jit/dis_mips64el.lua +17 -0
  76. data/lua-hooks/ext/luajit/src/jit/dis_mipsel.lua +1 -1
  77. data/lua-hooks/ext/luajit/src/jit/dis_ppc.lua +2 -2
  78. data/lua-hooks/ext/luajit/src/jit/dis_x64.lua +1 -1
  79. data/lua-hooks/ext/luajit/src/jit/dis_x86.lua +7 -4
  80. data/lua-hooks/ext/luajit/src/jit/dump.lua +17 -12
  81. data/lua-hooks/ext/luajit/src/jit/p.lua +3 -2
  82. data/lua-hooks/ext/luajit/src/jit/v.lua +2 -2
  83. data/lua-hooks/ext/luajit/src/jit/zone.lua +1 -1
  84. data/lua-hooks/ext/luajit/src/lauxlib.h +14 -20
  85. data/lua-hooks/ext/luajit/src/lib_aux.c +38 -27
  86. data/lua-hooks/ext/luajit/src/lib_base.c +12 -5
  87. data/lua-hooks/ext/luajit/src/lib_bit.c +1 -1
  88. data/lua-hooks/ext/luajit/src/lib_debug.c +5 -5
  89. data/lua-hooks/ext/luajit/src/lib_ffi.c +2 -2
  90. data/lua-hooks/ext/luajit/src/lib_init.c +16 -16
  91. data/lua-hooks/ext/luajit/src/lib_io.c +6 -7
  92. data/lua-hooks/ext/luajit/src/lib_jit.c +14 -4
  93. data/lua-hooks/ext/luajit/src/lib_math.c +1 -5
  94. data/lua-hooks/ext/luajit/src/lib_os.c +1 -1
  95. data/lua-hooks/ext/luajit/src/lib_package.c +14 -23
  96. data/lua-hooks/ext/luajit/src/lib_string.c +1 -5
  97. data/lua-hooks/ext/luajit/src/lib_table.c +21 -1
  98. data/lua-hooks/ext/luajit/src/lj.supp +3 -3
  99. data/lua-hooks/ext/luajit/src/lj_alloc.c +174 -83
  100. data/lua-hooks/ext/luajit/src/lj_api.c +97 -18
  101. data/lua-hooks/ext/luajit/src/lj_arch.h +54 -22
  102. data/lua-hooks/ext/luajit/src/lj_asm.c +172 -53
  103. data/lua-hooks/ext/luajit/src/lj_asm.h +1 -1
  104. data/lua-hooks/ext/luajit/src/lj_asm_arm.h +19 -16
  105. data/lua-hooks/ext/luajit/src/lj_asm_arm64.h +2022 -0
  106. data/lua-hooks/ext/luajit/src/lj_asm_mips.h +564 -158
  107. data/lua-hooks/ext/luajit/src/lj_asm_ppc.h +19 -18
  108. data/lua-hooks/ext/luajit/src/lj_asm_x86.h +578 -92
  109. data/lua-hooks/ext/luajit/src/lj_bc.c +1 -1
  110. data/lua-hooks/ext/luajit/src/lj_bc.h +1 -1
  111. data/lua-hooks/ext/luajit/src/lj_bcdump.h +1 -1
  112. data/lua-hooks/ext/luajit/src/lj_bcread.c +1 -1
  113. data/lua-hooks/ext/luajit/src/lj_bcwrite.c +1 -1
  114. data/lua-hooks/ext/luajit/src/lj_buf.c +1 -1
  115. data/lua-hooks/ext/luajit/src/lj_buf.h +1 -1
  116. data/lua-hooks/ext/luajit/src/lj_carith.c +1 -1
  117. data/lua-hooks/ext/luajit/src/lj_carith.h +1 -1
  118. data/lua-hooks/ext/luajit/src/lj_ccall.c +172 -7
  119. data/lua-hooks/ext/luajit/src/lj_ccall.h +21 -5
  120. data/lua-hooks/ext/luajit/src/lj_ccallback.c +71 -17
  121. data/lua-hooks/ext/luajit/src/lj_ccallback.h +1 -1
  122. data/lua-hooks/ext/luajit/src/lj_cconv.c +4 -2
  123. data/lua-hooks/ext/luajit/src/lj_cconv.h +1 -1
  124. data/lua-hooks/ext/luajit/src/lj_cdata.c +7 -5
  125. data/lua-hooks/ext/luajit/src/lj_cdata.h +1 -1
  126. data/lua-hooks/ext/luajit/src/lj_clib.c +5 -5
  127. data/lua-hooks/ext/luajit/src/lj_clib.h +1 -1
  128. data/lua-hooks/ext/luajit/src/lj_cparse.c +11 -6
  129. data/lua-hooks/ext/luajit/src/lj_cparse.h +1 -1
  130. data/lua-hooks/ext/luajit/src/lj_crecord.c +70 -14
  131. data/lua-hooks/ext/luajit/src/lj_crecord.h +1 -1
  132. data/lua-hooks/ext/luajit/src/lj_ctype.c +1 -1
  133. data/lua-hooks/ext/luajit/src/lj_ctype.h +8 -8
  134. data/lua-hooks/ext/luajit/src/lj_debug.c +1 -1
  135. data/lua-hooks/ext/luajit/src/lj_debug.h +1 -1
  136. data/lua-hooks/ext/luajit/src/lj_def.h +6 -9
  137. data/lua-hooks/ext/luajit/src/lj_dispatch.c +3 -3
  138. data/lua-hooks/ext/luajit/src/lj_dispatch.h +2 -1
  139. data/lua-hooks/ext/luajit/src/lj_emit_arm.h +5 -4
  140. data/lua-hooks/ext/luajit/src/lj_emit_arm64.h +419 -0
  141. data/lua-hooks/ext/luajit/src/lj_emit_mips.h +100 -20
  142. data/lua-hooks/ext/luajit/src/lj_emit_ppc.h +4 -4
  143. data/lua-hooks/ext/luajit/src/lj_emit_x86.h +116 -25
  144. data/lua-hooks/ext/luajit/src/lj_err.c +34 -13
  145. data/lua-hooks/ext/luajit/src/lj_err.h +1 -1
  146. data/lua-hooks/ext/luajit/src/lj_errmsg.h +1 -1
  147. data/lua-hooks/ext/luajit/src/lj_ff.h +1 -1
  148. data/lua-hooks/ext/luajit/src/lj_ffrecord.c +58 -49
  149. data/lua-hooks/ext/luajit/src/lj_ffrecord.h +1 -1
  150. data/lua-hooks/ext/luajit/src/lj_frame.h +33 -6
  151. data/lua-hooks/ext/luajit/src/lj_func.c +4 -2
  152. data/lua-hooks/ext/luajit/src/lj_func.h +1 -1
  153. data/lua-hooks/ext/luajit/src/lj_gc.c +16 -7
  154. data/lua-hooks/ext/luajit/src/lj_gc.h +1 -1
  155. data/lua-hooks/ext/luajit/src/lj_gdbjit.c +31 -1
  156. data/lua-hooks/ext/luajit/src/lj_gdbjit.h +1 -1
  157. data/lua-hooks/ext/luajit/src/lj_ir.c +69 -96
  158. data/lua-hooks/ext/luajit/src/lj_ir.h +29 -18
  159. data/lua-hooks/ext/luajit/src/lj_ircall.h +24 -30
  160. data/lua-hooks/ext/luajit/src/lj_iropt.h +9 -9
  161. data/lua-hooks/ext/luajit/src/lj_jit.h +67 -9
  162. data/lua-hooks/ext/luajit/src/lj_lex.c +1 -1
  163. data/lua-hooks/ext/luajit/src/lj_lex.h +1 -1
  164. data/lua-hooks/ext/luajit/src/lj_lib.c +1 -1
  165. data/lua-hooks/ext/luajit/src/lj_lib.h +1 -1
  166. data/lua-hooks/ext/luajit/src/lj_load.c +1 -1
  167. data/lua-hooks/ext/luajit/src/lj_mcode.c +11 -10
  168. data/lua-hooks/ext/luajit/src/lj_mcode.h +1 -1
  169. data/lua-hooks/ext/luajit/src/lj_meta.c +1 -1
  170. data/lua-hooks/ext/luajit/src/lj_meta.h +1 -1
  171. data/lua-hooks/ext/luajit/src/lj_obj.c +1 -1
  172. data/lua-hooks/ext/luajit/src/lj_obj.h +7 -3
  173. data/lua-hooks/ext/luajit/src/lj_opt_dce.c +1 -1
  174. data/lua-hooks/ext/luajit/src/lj_opt_fold.c +84 -17
  175. data/lua-hooks/ext/luajit/src/lj_opt_loop.c +1 -1
  176. data/lua-hooks/ext/luajit/src/lj_opt_mem.c +3 -3
  177. data/lua-hooks/ext/luajit/src/lj_opt_narrow.c +24 -22
  178. data/lua-hooks/ext/luajit/src/lj_opt_sink.c +11 -6
  179. data/lua-hooks/ext/luajit/src/lj_opt_split.c +11 -2
  180. data/lua-hooks/ext/luajit/src/lj_parse.c +9 -7
  181. data/lua-hooks/ext/luajit/src/lj_parse.h +1 -1
  182. data/lua-hooks/ext/luajit/src/lj_profile.c +1 -1
  183. data/lua-hooks/ext/luajit/src/lj_profile.h +1 -1
  184. data/lua-hooks/ext/luajit/src/lj_record.c +201 -117
  185. data/lua-hooks/ext/luajit/src/lj_record.h +1 -1
  186. data/lua-hooks/ext/luajit/src/lj_snap.c +72 -26
  187. data/lua-hooks/ext/luajit/src/lj_snap.h +1 -1
  188. data/lua-hooks/ext/luajit/src/lj_state.c +6 -6
  189. data/lua-hooks/ext/luajit/src/lj_state.h +2 -2
  190. data/lua-hooks/ext/luajit/src/lj_str.c +1 -1
  191. data/lua-hooks/ext/luajit/src/lj_str.h +1 -1
  192. data/lua-hooks/ext/luajit/src/lj_strfmt.c +7 -3
  193. data/lua-hooks/ext/luajit/src/lj_strfmt.h +1 -1
  194. data/lua-hooks/ext/luajit/src/lj_strfmt_num.c +4 -3
  195. data/lua-hooks/ext/luajit/src/lj_strscan.c +1 -1
  196. data/lua-hooks/ext/luajit/src/lj_strscan.h +1 -1
  197. data/lua-hooks/ext/luajit/src/lj_tab.c +1 -2
  198. data/lua-hooks/ext/luajit/src/lj_tab.h +1 -1
  199. data/lua-hooks/ext/luajit/src/lj_target.h +3 -3
  200. data/lua-hooks/ext/luajit/src/lj_target_arm.h +1 -1
  201. data/lua-hooks/ext/luajit/src/lj_target_arm64.h +239 -7
  202. data/lua-hooks/ext/luajit/src/lj_target_mips.h +111 -22
  203. data/lua-hooks/ext/luajit/src/lj_target_ppc.h +1 -1
  204. data/lua-hooks/ext/luajit/src/lj_target_x86.h +21 -4
  205. data/lua-hooks/ext/luajit/src/lj_trace.c +63 -18
  206. data/lua-hooks/ext/luajit/src/lj_trace.h +2 -1
  207. data/lua-hooks/ext/luajit/src/lj_traceerr.h +1 -1
  208. data/lua-hooks/ext/luajit/src/lj_udata.c +1 -1
  209. data/lua-hooks/ext/luajit/src/lj_udata.h +1 -1
  210. data/lua-hooks/ext/luajit/src/lj_vm.h +5 -1
  211. data/lua-hooks/ext/luajit/src/lj_vmevent.c +1 -1
  212. data/lua-hooks/ext/luajit/src/lj_vmevent.h +1 -1
  213. data/lua-hooks/ext/luajit/src/lj_vmmath.c +1 -1
  214. data/lua-hooks/ext/luajit/src/ljamalg.c +1 -1
  215. data/lua-hooks/ext/luajit/src/lua.h +9 -1
  216. data/lua-hooks/ext/luajit/src/luaconf.h +3 -7
  217. data/lua-hooks/ext/luajit/src/luajit.c +69 -54
  218. data/lua-hooks/ext/luajit/src/luajit.h +4 -4
  219. data/lua-hooks/ext/luajit/src/lualib.h +1 -1
  220. data/lua-hooks/ext/luajit/src/msvcbuild.bat +12 -4
  221. data/lua-hooks/ext/luajit/src/vm_arm.dasc +1 -1
  222. data/lua-hooks/ext/luajit/src/vm_arm64.dasc +255 -32
  223. data/lua-hooks/ext/luajit/src/vm_mips.dasc +26 -23
  224. data/lua-hooks/ext/luajit/src/vm_mips64.dasc +5062 -0
  225. data/lua-hooks/ext/luajit/src/vm_ppc.dasc +1 -1
  226. data/lua-hooks/ext/luajit/src/vm_x64.dasc +24 -25
  227. data/lua-hooks/ext/luajit/src/vm_x86.dasc +77 -4
  228. data/lua-hooks/libluahooks.darwin.a +0 -0
  229. data/lua-hooks/libluahooks.linux.a +0 -0
  230. data/lua-hooks/options.mk +1 -1
  231. metadata +37 -77
  232. data/lua-hooks/ext/all.c +0 -69
  233. data/lua-hooks/ext/libinjection/COPYING +0 -37
  234. data/lua-hooks/ext/libinjection/libinjection.h +0 -65
  235. data/lua-hooks/ext/libinjection/libinjection_html5.c +0 -847
  236. data/lua-hooks/ext/libinjection/libinjection_html5.h +0 -54
  237. data/lua-hooks/ext/libinjection/libinjection_sqli.c +0 -2301
  238. data/lua-hooks/ext/libinjection/libinjection_sqli.h +0 -295
  239. data/lua-hooks/ext/libinjection/libinjection_sqli_data.h +0 -9349
  240. data/lua-hooks/ext/libinjection/libinjection_xss.c +0 -531
  241. data/lua-hooks/ext/libinjection/libinjection_xss.h +0 -21
  242. data/lua-hooks/ext/libinjection/lualib.c +0 -145
  243. data/lua-hooks/ext/libinjection/module.mk +0 -5
  244. data/lua-hooks/ext/lpeg/HISTORY +0 -96
  245. data/lua-hooks/ext/lpeg/lpcap.c +0 -537
  246. data/lua-hooks/ext/lpeg/lpcap.h +0 -56
  247. data/lua-hooks/ext/lpeg/lpcode.c +0 -1014
  248. data/lua-hooks/ext/lpeg/lpcode.h +0 -40
  249. data/lua-hooks/ext/lpeg/lpeg-128.gif +0 -0
  250. data/lua-hooks/ext/lpeg/lpeg.html +0 -1445
  251. data/lua-hooks/ext/lpeg/lpprint.c +0 -244
  252. data/lua-hooks/ext/lpeg/lpprint.h +0 -36
  253. data/lua-hooks/ext/lpeg/lptree.c +0 -1303
  254. data/lua-hooks/ext/lpeg/lptree.h +0 -82
  255. data/lua-hooks/ext/lpeg/lptypes.h +0 -149
  256. data/lua-hooks/ext/lpeg/lpvm.c +0 -364
  257. data/lua-hooks/ext/lpeg/lpvm.h +0 -58
  258. data/lua-hooks/ext/lpeg/makefile +0 -55
  259. data/lua-hooks/ext/lpeg/module.mk +0 -6
  260. data/lua-hooks/ext/lpeg/re.html +0 -498
  261. data/lua-hooks/ext/lua-cmsgpack/.gitignore +0 -13
  262. data/lua-hooks/ext/lua-cmsgpack/CMakeLists.txt +0 -45
  263. data/lua-hooks/ext/lua-cmsgpack/README.md +0 -115
  264. data/lua-hooks/ext/lua-cmsgpack/lua_cmsgpack.c +0 -970
  265. data/lua-hooks/ext/lua-cmsgpack/module.mk +0 -2
  266. data/lua-hooks/ext/lua-cmsgpack/test.lua +0 -570
  267. data/lua-hooks/ext/lua-snapshot/LICENSE +0 -7
  268. data/lua-hooks/ext/lua-snapshot/Makefile +0 -12
  269. data/lua-hooks/ext/lua-snapshot/README.md +0 -18
  270. data/lua-hooks/ext/lua-snapshot/dump.lua +0 -15
  271. data/lua-hooks/ext/lua-snapshot/module.mk +0 -2
  272. data/lua-hooks/ext/lua-snapshot/snapshot.c +0 -462
  273. data/lua-hooks/ext/luautf8/README.md +0 -152
  274. data/lua-hooks/ext/luautf8/lutf8lib.c +0 -1274
  275. data/lua-hooks/ext/luautf8/module.mk +0 -2
  276. data/lua-hooks/ext/luautf8/unidata.h +0 -3064
  277. data/lua-hooks/ext/module.mk +0 -15
  278. data/lua-hooks/ext/modules.h +0 -17
  279. data/lua-hooks/ext/perf/luacpu.c +0 -114
  280. data/lua-hooks/ext/perf/lualoadavg.c +0 -40
  281. data/lua-hooks/ext/perf/luameminfo.c +0 -38
  282. data/lua-hooks/ext/perf/luaoslib.c +0 -203
  283. data/lua-hooks/ext/perf/module.mk +0 -5
  284. data/lua-hooks/ext/sha1/luasha1.c +0 -74
  285. data/lua-hooks/ext/sha1/module.mk +0 -5
  286. data/lua-hooks/ext/sha1/sha1.c +0 -145
  287. data/lua-hooks/ext/sha2/luasha256.c +0 -77
  288. data/lua-hooks/ext/sha2/module.mk +0 -5
  289. data/lua-hooks/ext/sha2/sha256.c +0 -196
  290. data/lua-hooks/ext/sysutils/lua_utils.c +0 -56
  291. data/lua-hooks/ext/sysutils/module.mk +0 -2
@@ -1,8 +1,30 @@
1
1
  /*
2
2
  ** MIPS instruction emitter.
3
- ** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
3
+ ** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
4
4
  */
5
5
 
6
+ #if LJ_64
7
+ static intptr_t get_k64val(IRIns *ir)
8
+ {
9
+ if (ir->o == IR_KINT64) {
10
+ return (intptr_t)ir_kint64(ir)->u64;
11
+ } else if (ir->o == IR_KGC) {
12
+ return (intptr_t)ir_kgc(ir);
13
+ } else if (ir->o == IR_KPTR || ir->o == IR_KKPTR) {
14
+ return (intptr_t)ir_kptr(ir);
15
+ } else {
16
+ lua_assert(ir->o == IR_KINT || ir->o == IR_KNULL);
17
+ return ir->i; /* Sign-extended. */
18
+ }
19
+ }
20
+ #endif
21
+
22
+ #if LJ_64
23
+ #define get_kval(ir) get_k64val(ir)
24
+ #else
25
+ #define get_kval(ir) ((ir)->i)
26
+ #endif
27
+
6
28
  /* -- Emit basic instructions --------------------------------------------- */
7
29
 
8
30
  static void emit_dst(ASMState *as, MIPSIns mi, Reg rd, Reg rs, Reg rt)
@@ -35,7 +57,7 @@ static void emit_fgh(ASMState *as, MIPSIns mi, Reg rf, Reg rg, Reg rh)
35
57
 
36
58
  static void emit_rotr(ASMState *as, Reg dest, Reg src, Reg tmp, uint32_t shift)
37
59
  {
38
- if ((as->flags & JIT_F_MIPS32R2)) {
60
+ if (LJ_64 || (as->flags & JIT_F_MIPSXXR2)) {
39
61
  emit_dta(as, MIPSI_ROTR, dest, src, shift);
40
62
  } else {
41
63
  emit_dst(as, MIPSI_OR, dest, dest, tmp);
@@ -44,13 +66,21 @@ static void emit_rotr(ASMState *as, Reg dest, Reg src, Reg tmp, uint32_t shift)
44
66
  }
45
67
  }
46
68
 
69
+ #if LJ_64
70
+ static void emit_tsml(ASMState *as, MIPSIns mi, Reg rt, Reg rs, uint32_t msb,
71
+ uint32_t lsb)
72
+ {
73
+ *--as->mcp = mi | MIPSF_T(rt) | MIPSF_S(rs) | MIPSF_M(msb) | MIPSF_L(lsb);
74
+ }
75
+ #endif
76
+
47
77
  /* -- Emit loads/stores --------------------------------------------------- */
48
78
 
49
79
  /* Prefer rematerialization of BASE/L from global_State over spills. */
50
80
  #define emit_canremat(ref) ((ref) <= REF_BASE)
51
81
 
52
82
  /* Try to find a one step delta relative to another constant. */
53
- static int emit_kdelta1(ASMState *as, Reg t, int32_t i)
83
+ static int emit_kdelta1(ASMState *as, Reg t, intptr_t i)
54
84
  {
55
85
  RegSet work = ~as->freeset & RSET_GPR;
56
86
  while (work) {
@@ -58,9 +88,10 @@ static int emit_kdelta1(ASMState *as, Reg t, int32_t i)
58
88
  IRRef ref = regcost_ref(as->cost[r]);
59
89
  lua_assert(r != t);
60
90
  if (ref < ASMREF_L) {
61
- int32_t delta = i - (ra_iskref(ref) ? ra_krefk(as, ref) : IR(ref)->i);
91
+ intptr_t delta = (intptr_t)((uintptr_t)i -
92
+ (uintptr_t)(ra_iskref(ref) ? ra_krefk(as, ref) : get_kval(IR(ref))));
62
93
  if (checki16(delta)) {
63
- emit_tsi(as, MIPSI_ADDIU, t, r, delta);
94
+ emit_tsi(as, MIPSI_AADDIU, t, r, delta);
64
95
  return 1;
65
96
  }
66
97
  }
@@ -76,8 +107,8 @@ static void emit_loadi(ASMState *as, Reg r, int32_t i)
76
107
  emit_ti(as, MIPSI_LI, r, i);
77
108
  } else {
78
109
  if ((i & 0xffff)) {
79
- int32_t jgl = i32ptr(J2G(as->J));
80
- if ((uint32_t)(i-jgl) < 65536) {
110
+ intptr_t jgl = (intptr_t)(void *)J2G(as->J);
111
+ if ((uintptr_t)(i-jgl) < 65536) {
81
112
  emit_tsi(as, MIPSI_ADDIU, r, RID_JGL, i-jgl-32768);
82
113
  return;
83
114
  } else if (emit_kdelta1(as, r, i)) {
@@ -92,16 +123,48 @@ static void emit_loadi(ASMState *as, Reg r, int32_t i)
92
123
  }
93
124
  }
94
125
 
126
+ #if LJ_64
127
+ /* Load a 64 bit constant into a GPR. */
128
+ static void emit_loadu64(ASMState *as, Reg r, uint64_t u64)
129
+ {
130
+ if (checki32((int64_t)u64)) {
131
+ emit_loadi(as, r, (int32_t)u64);
132
+ } else {
133
+ uint64_t delta = u64 - (uint64_t)(void *)J2G(as->J);
134
+ if (delta < 65536) {
135
+ emit_tsi(as, MIPSI_DADDIU, r, RID_JGL, (int32_t)(delta-32768));
136
+ } else if (emit_kdelta1(as, r, (intptr_t)u64)) {
137
+ return;
138
+ } else {
139
+ if ((u64 & 0xffff)) {
140
+ emit_tsi(as, MIPSI_ORI, r, r, u64 & 0xffff);
141
+ }
142
+ if (((u64 >> 16) & 0xffff)) {
143
+ emit_dta(as, MIPSI_DSLL, r, r, 16);
144
+ emit_tsi(as, MIPSI_ORI, r, r, (u64 >> 16) & 0xffff);
145
+ emit_dta(as, MIPSI_DSLL, r, r, 16);
146
+ } else {
147
+ emit_dta(as, MIPSI_DSLL32, r, r, 0);
148
+ }
149
+ emit_loadi(as, r, (int32_t)(u64 >> 32));
150
+ }
151
+ /* TODO: There are probably more optimization opportunities. */
152
+ }
153
+ }
154
+
155
+ #define emit_loada(as, r, addr) emit_loadu64(as, (r), u64ptr((addr)))
156
+ #else
95
157
  #define emit_loada(as, r, addr) emit_loadi(as, (r), i32ptr((addr)))
158
+ #endif
96
159
 
97
- static Reg ra_allock(ASMState *as, int32_t k, RegSet allow);
98
- static void ra_allockreg(ASMState *as, int32_t k, Reg r);
160
+ static Reg ra_allock(ASMState *as, intptr_t k, RegSet allow);
161
+ static void ra_allockreg(ASMState *as, intptr_t k, Reg r);
99
162
 
100
163
  /* Get/set from constant pointer. */
101
164
  static void emit_lsptr(ASMState *as, MIPSIns mi, Reg r, void *p, RegSet allow)
102
165
  {
103
- int32_t jgl = i32ptr(J2G(as->J));
104
- int32_t i = i32ptr(p);
166
+ intptr_t jgl = (intptr_t)(J2G(as->J));
167
+ intptr_t i = (intptr_t)(p);
105
168
  Reg base;
106
169
  if ((uint32_t)(i-jgl) < 65536) {
107
170
  i = i-jgl-32768;
@@ -112,8 +175,24 @@ static void emit_lsptr(ASMState *as, MIPSIns mi, Reg r, void *p, RegSet allow)
112
175
  emit_tsi(as, mi, r, base, i);
113
176
  }
114
177
 
115
- #define emit_loadn(as, r, tv) \
116
- emit_lsptr(as, MIPSI_LDC1, ((r) & 31), (void *)(tv), RSET_GPR)
178
+ #if LJ_64
179
+ static void emit_loadk64(ASMState *as, Reg r, IRIns *ir)
180
+ {
181
+ const uint64_t *k = &ir_k64(ir)->u64;
182
+ Reg r64 = r;
183
+ if (rset_test(RSET_FPR, r)) {
184
+ r64 = RID_TMP;
185
+ emit_tg(as, MIPSI_DMTC1, r64, r);
186
+ }
187
+ if ((uint32_t)((intptr_t)k-(intptr_t)J2G(as->J)) < 65536)
188
+ emit_lsptr(as, MIPSI_LD, r64, (void *)k, 0);
189
+ else
190
+ emit_loadu64(as, r64, *k);
191
+ }
192
+ #else
193
+ #define emit_loadk64(as, r, ir) \
194
+ emit_lsptr(as, MIPSI_LDC1, ((r) & 31), (void *)&ir_knum((ir))->u64, RSET_GPR)
195
+ #endif
117
196
 
118
197
  /* Get/set global_State fields. */
119
198
  static void emit_lsglptr(ASMState *as, MIPSIns mi, Reg r, int32_t ofs)
@@ -122,9 +201,9 @@ static void emit_lsglptr(ASMState *as, MIPSIns mi, Reg r, int32_t ofs)
122
201
  }
123
202
 
124
203
  #define emit_getgl(as, r, field) \
125
- emit_lsglptr(as, MIPSI_LW, (r), (int32_t)offsetof(global_State, field))
204
+ emit_lsglptr(as, MIPSI_AL, (r), (int32_t)offsetof(global_State, field))
126
205
  #define emit_setgl(as, r, field) \
127
- emit_lsglptr(as, MIPSI_SW, (r), (int32_t)offsetof(global_State, field))
206
+ emit_lsglptr(as, MIPSI_AS, (r), (int32_t)offsetof(global_State, field))
128
207
 
129
208
  /* Trace number is determined from per-trace exit stubs. */
130
209
  #define emit_setvmstate(as, i) UNUSED(i)
@@ -157,13 +236,14 @@ static void emit_call(ASMState *as, void *target, int needcfa)
157
236
  MCode *p = as->mcp;
158
237
  *--p = MIPSI_NOP;
159
238
  if ((((uintptr_t)target ^ (uintptr_t)p) >> 28) == 0) {
160
- *--p = MIPSI_JAL | (((uintptr_t)target >>2) & 0x03ffffffu);
239
+ *--p = (((uintptr_t)target & 1) ? MIPSI_JALX : MIPSI_JAL) |
240
+ (((uintptr_t)target >>2) & 0x03ffffffu);
161
241
  } else { /* Target out of range: need indirect call. */
162
242
  *--p = MIPSI_JALR | MIPSF_S(RID_CFUNCADDR);
163
243
  needcfa = 1;
164
244
  }
165
245
  as->mcp = p;
166
- if (needcfa) ra_allockreg(as, i32ptr(target), RID_CFUNCADDR);
246
+ if (needcfa) ra_allockreg(as, (intptr_t)target, RID_CFUNCADDR);
167
247
  }
168
248
 
169
249
  /* -- Emit generic operations --------------------------------------------- */
@@ -184,7 +264,7 @@ static void emit_movrr(ASMState *as, IRIns *ir, Reg dst, Reg src)
184
264
  static void emit_loadofs(ASMState *as, IRIns *ir, Reg r, Reg base, int32_t ofs)
185
265
  {
186
266
  if (r < RID_MAX_GPR)
187
- emit_tsi(as, MIPSI_LW, r, base, ofs);
267
+ emit_tsi(as, irt_is64(ir->t) ? MIPSI_LD : MIPSI_LW, r, base, ofs);
188
268
  else
189
269
  emit_tsi(as, irt_isnum(ir->t) ? MIPSI_LDC1 : MIPSI_LWC1,
190
270
  (r & 31), base, ofs);
@@ -194,7 +274,7 @@ static void emit_loadofs(ASMState *as, IRIns *ir, Reg r, Reg base, int32_t ofs)
194
274
  static void emit_storeofs(ASMState *as, IRIns *ir, Reg r, Reg base, int32_t ofs)
195
275
  {
196
276
  if (r < RID_MAX_GPR)
197
- emit_tsi(as, MIPSI_SW, r, base, ofs);
277
+ emit_tsi(as, irt_is64(ir->t) ? MIPSI_SD : MIPSI_SW, r, base, ofs);
198
278
  else
199
279
  emit_tsi(as, irt_isnum(ir->t) ? MIPSI_SDC1 : MIPSI_SWC1,
200
280
  (r&31), base, ofs);
@@ -205,7 +285,7 @@ static void emit_addptr(ASMState *as, Reg r, int32_t ofs)
205
285
  {
206
286
  if (ofs) {
207
287
  lua_assert(checki16(ofs));
208
- emit_tsi(as, MIPSI_ADDIU, r, r, ofs);
288
+ emit_tsi(as, MIPSI_AADDIU, r, r, ofs);
209
289
  }
210
290
  }
211
291
 
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  ** PPC instruction emitter.
3
- ** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
3
+ ** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
4
4
  */
5
5
 
6
6
  /* -- Emit basic instructions --------------------------------------------- */
@@ -98,7 +98,7 @@ static void emit_loadi(ASMState *as, Reg r, int32_t i)
98
98
 
99
99
  #define emit_loada(as, r, addr) emit_loadi(as, (r), i32ptr((addr)))
100
100
 
101
- static Reg ra_allock(ASMState *as, int32_t k, RegSet allow);
101
+ static Reg ra_allock(ASMState *as, intptr_t k, RegSet allow);
102
102
 
103
103
  /* Get/set from constant pointer. */
104
104
  static void emit_lsptr(ASMState *as, PPCIns pi, Reg r, void *p, RegSet allow)
@@ -115,8 +115,8 @@ static void emit_lsptr(ASMState *as, PPCIns pi, Reg r, void *p, RegSet allow)
115
115
  emit_tai(as, pi, r, base, i);
116
116
  }
117
117
 
118
- #define emit_loadn(as, r, tv) \
119
- emit_lsptr(as, PPCI_LFD, ((r) & 31), (void *)(tv), RSET_GPR)
118
+ #define emit_loadk64(as, r, ir) \
119
+ emit_lsptr(as, PPCI_LFD, ((r) & 31), (void *)&ir_knum((ir))->u64, RSET_GPR)
120
120
 
121
121
  /* Get/set global_State fields. */
122
122
  static void emit_lsglptr(ASMState *as, PPCIns pi, Reg r, int32_t ofs)
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  ** x86/x64 instruction emitter.
3
- ** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
3
+ ** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
4
4
  */
5
5
 
6
6
  /* -- Emit basic instructions --------------------------------------------- */
@@ -13,10 +13,17 @@
13
13
  if (rex != 0x40) *--(p) = rex; }
14
14
  #define FORCE_REX 0x200
15
15
  #define REX_64 (FORCE_REX|0x080000)
16
+ #define VEX_64 0x800000
16
17
  #else
17
18
  #define REXRB(p, rr, rb) ((void)0)
18
19
  #define FORCE_REX 0
19
20
  #define REX_64 0
21
+ #define VEX_64 0
22
+ #endif
23
+ #if LJ_GC64
24
+ #define REX_GC64 REX_64
25
+ #else
26
+ #define REX_GC64 0
20
27
  #endif
21
28
 
22
29
  #define emit_i8(as, i) (*--as->mcp = (MCode)(i))
@@ -31,6 +38,13 @@ static LJ_AINLINE MCode *emit_op(x86Op xo, Reg rr, Reg rb, Reg rx,
31
38
  MCode *p, int delta)
32
39
  {
33
40
  int n = (int8_t)xo;
41
+ if (n == -60) { /* VEX-encoded instruction */
42
+ #if LJ_64
43
+ xo ^= (((rr>>1)&4)+((rx>>2)&2)+((rb>>3)&1))<<13;
44
+ #endif
45
+ *(uint32_t *)(p+delta-5) = (uint32_t)xo;
46
+ return p+delta-5;
47
+ }
34
48
  #if defined(__GNUC__)
35
49
  if (__builtin_constant_p(xo) && n == -2)
36
50
  p[delta-2] = (MCode)(xo >> 24);
@@ -85,26 +99,17 @@ static int32_t ptr2addr(const void *p)
85
99
  #define ptr2addr(p) (i32ptr((p)))
86
100
  #endif
87
101
 
88
- /* op r, [addr] */
89
- static void emit_rma(ASMState *as, x86Op xo, Reg rr, const void *addr)
90
- {
91
- MCode *p = as->mcp;
92
- *(int32_t *)(p-4) = ptr2addr(addr);
93
- #if LJ_64
94
- p[-5] = MODRM(XM_SCALE1, RID_ESP, RID_EBP);
95
- as->mcp = emit_opm(xo, XM_OFS0, rr, RID_ESP, p, -5);
96
- #else
97
- as->mcp = emit_opm(xo, XM_OFS0, rr, RID_EBP, p, -4);
98
- #endif
99
- }
100
-
101
102
  /* op r, [base+ofs] */
102
103
  static void emit_rmro(ASMState *as, x86Op xo, Reg rr, Reg rb, int32_t ofs)
103
104
  {
104
105
  MCode *p = as->mcp;
105
106
  x86Mode mode;
106
107
  if (ra_hasreg(rb)) {
107
- if (ofs == 0 && (rb&7) != RID_EBP) {
108
+ if (LJ_GC64 && rb == RID_RIP) {
109
+ mode = XM_OFS0;
110
+ p -= 4;
111
+ *(int32_t *)p = ofs;
112
+ } else if (ofs == 0 && (rb&7) != RID_EBP) {
108
113
  mode = XM_OFS0;
109
114
  } else if (checki8(ofs)) {
110
115
  *--p = (MCode)ofs;
@@ -202,6 +207,11 @@ static void emit_mrm(ASMState *as, x86Op xo, Reg rr, Reg rb)
202
207
  *--p = MODRM(XM_SCALE1, RID_ESP, RID_EBP);
203
208
  rb = RID_ESP;
204
209
  #endif
210
+ } else if (LJ_GC64 && rb == RID_RIP) {
211
+ lua_assert(as->mrm.idx == RID_NONE);
212
+ mode = XM_OFS0;
213
+ p -= 4;
214
+ *(int32_t *)p = as->mrm.ofs;
205
215
  } else {
206
216
  if (as->mrm.ofs == 0 && (rb&7) != RID_EBP) {
207
217
  mode = XM_OFS0;
@@ -255,8 +265,8 @@ static void emit_movmroi(ASMState *as, Reg base, int32_t ofs, int32_t i)
255
265
  /* Get/set global_State fields. */
256
266
  #define emit_opgl(as, xo, r, field) \
257
267
  emit_rma(as, (xo), (r), (void *)&J2G(as->J)->field)
258
- #define emit_getgl(as, r, field) emit_opgl(as, XO_MOV, (r), field)
259
- #define emit_setgl(as, r, field) emit_opgl(as, XO_MOVto, (r), field)
268
+ #define emit_getgl(as, r, field) emit_opgl(as, XO_MOV, (r)|REX_GC64, field)
269
+ #define emit_setgl(as, r, field) emit_opgl(as, XO_MOVto, (r)|REX_GC64, field)
260
270
 
261
271
  #define emit_setvmstate(as, i) \
262
272
  (emit_i32(as, i), emit_opgl(as, XO_MOVmi, 0, vmstate))
@@ -279,9 +289,21 @@ static void emit_loadi(ASMState *as, Reg r, int32_t i)
279
289
  }
280
290
  }
281
291
 
292
+ #if LJ_GC64
293
+ #define dispofs(as, k) \
294
+ ((intptr_t)((uintptr_t)(k) - (uintptr_t)J2GG(as->J)->dispatch))
295
+ #define mcpofs(as, k) \
296
+ ((intptr_t)((uintptr_t)(k) - (uintptr_t)as->mcp))
297
+ #define mctopofs(as, k) \
298
+ ((intptr_t)((uintptr_t)(k) - (uintptr_t)as->mctop))
299
+ /* mov r, addr */
300
+ #define emit_loada(as, r, addr) \
301
+ emit_loadu64(as, (r), (uintptr_t)(addr))
302
+ #else
282
303
  /* mov r, addr */
283
304
  #define emit_loada(as, r, addr) \
284
305
  emit_loadi(as, (r), ptr2addr((addr)))
306
+ #endif
285
307
 
286
308
  #if LJ_64
287
309
  /* mov r, imm64 or shorter 32 bit extended load. */
@@ -293,6 +315,15 @@ static void emit_loadu64(ASMState *as, Reg r, uint64_t u64)
293
315
  MCode *p = as->mcp;
294
316
  *(int32_t *)(p-4) = (int32_t)u64;
295
317
  as->mcp = emit_opm(XO_MOVmi, XM_REG, REX_64, r, p, -4);
318
+ #if LJ_GC64
319
+ } else if (checki32(dispofs(as, u64))) {
320
+ emit_rmro(as, XO_LEA, r|REX_64, RID_DISPATCH, (int32_t)dispofs(as, u64));
321
+ } else if (checki32(mcpofs(as, u64)) && checki32(mctopofs(as, u64))) {
322
+ /* Since as->realign assumes the code size doesn't change, check
323
+ ** RIP-relative addressing reachability for both as->mcp and as->mctop.
324
+ */
325
+ emit_rmro(as, XO_LEA, r|REX_64, RID_RIP, (int32_t)mcpofs(as, u64));
326
+ #endif
296
327
  } else { /* Full-size 64 bit load. */
297
328
  MCode *p = as->mcp;
298
329
  *(uint64_t *)(p-8) = u64;
@@ -304,13 +335,71 @@ static void emit_loadu64(ASMState *as, Reg r, uint64_t u64)
304
335
  }
305
336
  #endif
306
337
 
307
- /* movsd r, [&tv->n] / xorps r, r */
308
- static void emit_loadn(ASMState *as, Reg r, cTValue *tv)
338
+ /* op r, [addr] */
339
+ static void emit_rma(ASMState *as, x86Op xo, Reg rr, const void *addr)
309
340
  {
310
- if (tvispzero(tv)) /* Use xor only for +0. */
311
- emit_rr(as, XO_XORPS, r, r);
312
- else
313
- emit_rma(as, XO_MOVSD, r, &tv->n);
341
+ #if LJ_GC64
342
+ if (checki32(dispofs(as, addr))) {
343
+ emit_rmro(as, xo, rr, RID_DISPATCH, (int32_t)dispofs(as, addr));
344
+ } else if (checki32(mcpofs(as, addr)) && checki32(mctopofs(as, addr))) {
345
+ emit_rmro(as, xo, rr, RID_RIP, (int32_t)mcpofs(as, addr));
346
+ } else if (!checki32((intptr_t)addr) && (xo == XO_MOV || xo == XO_MOVSD)) {
347
+ emit_rmro(as, xo, rr, rr, 0);
348
+ emit_loadu64(as, rr, (uintptr_t)addr);
349
+ } else
350
+ #endif
351
+ {
352
+ MCode *p = as->mcp;
353
+ *(int32_t *)(p-4) = ptr2addr(addr);
354
+ #if LJ_64
355
+ p[-5] = MODRM(XM_SCALE1, RID_ESP, RID_EBP);
356
+ as->mcp = emit_opm(xo, XM_OFS0, rr, RID_ESP, p, -5);
357
+ #else
358
+ as->mcp = emit_opm(xo, XM_OFS0, rr, RID_EBP, p, -4);
359
+ #endif
360
+ }
361
+ }
362
+
363
+ /* Load 64 bit IR constant into register. */
364
+ static void emit_loadk64(ASMState *as, Reg r, IRIns *ir)
365
+ {
366
+ Reg r64;
367
+ x86Op xo;
368
+ const uint64_t *k = &ir_k64(ir)->u64;
369
+ if (rset_test(RSET_FPR, r)) {
370
+ r64 = r;
371
+ xo = XO_MOVSD;
372
+ } else {
373
+ r64 = r | REX_64;
374
+ xo = XO_MOV;
375
+ }
376
+ if (*k == 0) {
377
+ emit_rr(as, rset_test(RSET_FPR, r) ? XO_XORPS : XO_ARITH(XOg_XOR), r, r);
378
+ #if LJ_GC64
379
+ } else if (checki32((intptr_t)k) || checki32(dispofs(as, k)) ||
380
+ (checki32(mcpofs(as, k)) && checki32(mctopofs(as, k)))) {
381
+ emit_rma(as, xo, r64, k);
382
+ } else {
383
+ if (ir->i) {
384
+ lua_assert(*k == *(uint64_t*)(as->mctop - ir->i));
385
+ } else if (as->curins <= as->stopins && rset_test(RSET_GPR, r)) {
386
+ emit_loadu64(as, r, *k);
387
+ return;
388
+ } else {
389
+ /* If all else fails, add the FP constant at the MCode area bottom. */
390
+ while ((uintptr_t)as->mcbot & 7) *as->mcbot++ = XI_INT3;
391
+ *(uint64_t *)as->mcbot = *k;
392
+ ir->i = (int32_t)(as->mctop - as->mcbot);
393
+ as->mcbot += 8;
394
+ as->mclim = as->mcbot + MCLIM_REDZONE;
395
+ lj_mcode_commitbot(as->J, as->mcbot);
396
+ }
397
+ emit_rmro(as, xo, r64, RID_RIP, (int32_t)mcpofs(as, as->mctop - ir->i));
398
+ #else
399
+ } else {
400
+ emit_rma(as, xo, r64, k);
401
+ #endif
402
+ }
314
403
  }
315
404
 
316
405
  /* -- Emit control-flow instructions -------------------------------------- */
@@ -412,8 +501,10 @@ static void emit_call_(ASMState *as, MCode *target)
412
501
  /* Use 64 bit operations to handle 64 bit IR types. */
413
502
  #if LJ_64
414
503
  #define REX_64IR(ir, r) ((r) + (irt_is64((ir)->t) ? REX_64 : 0))
504
+ #define VEX_64IR(ir, r) ((r) + (irt_is64((ir)->t) ? VEX_64 : 0))
415
505
  #else
416
506
  #define REX_64IR(ir, r) (r)
507
+ #define VEX_64IR(ir, r) (r)
417
508
  #endif
418
509
 
419
510
  /* Generic move between two regs. */
@@ -449,9 +540,9 @@ static void emit_addptr(ASMState *as, Reg r, int32_t ofs)
449
540
  {
450
541
  if (ofs) {
451
542
  if ((as->flags & JIT_F_LEA_AGU))
452
- emit_rmro(as, XO_LEA, r, r, ofs);
543
+ emit_rmro(as, XO_LEA, r|REX_GC64, r, ofs);
453
544
  else
454
- emit_gri(as, XG_ARITHi(XOg_ADD), r, ofs);
545
+ emit_gri(as, XG_ARITHi(XOg_ADD), r|REX_GC64, ofs);
455
546
  }
456
547
  }
457
548