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,6 +1,6 @@
1
1
  /*
2
2
  ** MIPS IR assembler (SSA IR -> machine code).
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
  /* -- Register allocator extensions --------------------------------------- */
@@ -23,7 +23,7 @@ static Reg ra_alloc1z(ASMState *as, IRRef ref, RegSet allow)
23
23
  {
24
24
  Reg r = IR(ref)->r;
25
25
  if (ra_noreg(r)) {
26
- if (!(allow & RSET_FPR) && irref_isk(ref) && IR(ref)->i == 0)
26
+ if (!(allow & RSET_FPR) && irref_isk(ref) && get_kval(IR(ref)) == 0)
27
27
  return RID_ZERO;
28
28
  r = ra_allocref(as, ref, allow);
29
29
  } else {
@@ -166,9 +166,9 @@ static Reg asm_fuseahuref(ASMState *as, IRRef ref, int32_t *ofsp, RegSet allow)
166
166
  } else if (ir->o == IR_UREFC) {
167
167
  if (irref_isk(ir->op1)) {
168
168
  GCfunc *fn = ir_kfunc(IR(ir->op1));
169
- int32_t ofs = i32ptr(&gcref(fn->l.uvptr[(ir->op2 >> 8)])->uv.tv);
170
- int32_t jgl = (intptr_t)J2G(as->J);
171
- if ((uint32_t)(ofs-jgl) < 65536) {
169
+ intptr_t ofs = (intptr_t)&gcref(fn->l.uvptr[(ir->op2 >> 8)])->uv.tv;
170
+ intptr_t jgl = (intptr_t)J2G(as->J);
171
+ if ((uintptr_t)(ofs-jgl) < 65536) {
172
172
  *ofsp = ofs-jgl-32768;
173
173
  return RID_JGL;
174
174
  } else {
@@ -190,20 +190,21 @@ static void asm_fusexref(ASMState *as, MIPSIns mi, Reg rt, IRRef ref,
190
190
  Reg base;
191
191
  if (ra_noreg(ir->r) && canfuse(as, ir)) {
192
192
  if (ir->o == IR_ADD) {
193
- int32_t ofs2;
194
- if (irref_isk(ir->op2) && (ofs2 = ofs + IR(ir->op2)->i, checki16(ofs2))) {
193
+ intptr_t ofs2;
194
+ if (irref_isk(ir->op2) && (ofs2 = ofs + get_kval(IR(ir->op2)),
195
+ checki16(ofs2))) {
195
196
  ref = ir->op1;
196
- ofs = ofs2;
197
+ ofs = (int32_t)ofs2;
197
198
  }
198
199
  } else if (ir->o == IR_STRREF) {
199
- int32_t ofs2 = 65536;
200
+ intptr_t ofs2 = 65536;
200
201
  lua_assert(ofs == 0);
201
202
  ofs = (int32_t)sizeof(GCstr);
202
203
  if (irref_isk(ir->op2)) {
203
- ofs2 = ofs + IR(ir->op2)->i;
204
+ ofs2 = ofs + get_kval(IR(ir->op2));
204
205
  ref = ir->op1;
205
206
  } else if (irref_isk(ir->op1)) {
206
- ofs2 = ofs + IR(ir->op1)->i;
207
+ ofs2 = ofs + get_kval(IR(ir->op1));
207
208
  ref = ir->op2;
208
209
  }
209
210
  if (!checki16(ofs2)) {
@@ -211,7 +212,7 @@ static void asm_fusexref(ASMState *as, MIPSIns mi, Reg rt, IRRef ref,
211
212
  Reg right, left = ra_alloc2(as, ir, allow);
212
213
  right = (left >> 8); left &= 255;
213
214
  emit_hsi(as, mi, rt, RID_TMP, ofs);
214
- emit_dst(as, MIPSI_ADDU, RID_TMP, left, right);
215
+ emit_dst(as, MIPSI_AADDU, RID_TMP, left, right);
215
216
  return;
216
217
  }
217
218
  ofs = ofs2;
@@ -227,7 +228,7 @@ static void asm_fusexref(ASMState *as, MIPSIns mi, Reg rt, IRRef ref,
227
228
  static void asm_gencall(ASMState *as, const CCallInfo *ci, IRRef *args)
228
229
  {
229
230
  uint32_t n, nargs = CCI_XNARGS(ci);
230
- int32_t ofs = 16;
231
+ int32_t ofs = LJ_32 ? 16 : 0;
231
232
  #if LJ_SOFTFP
232
233
  Reg gpr = REGARG_FIRSTGPR;
233
234
  #else
@@ -249,15 +250,15 @@ static void asm_gencall(ASMState *as, const CCallInfo *ci, IRRef *args)
249
250
  !(ci->flags & CCI_VARARG)) {
250
251
  lua_assert(rset_test(as->freeset, fpr)); /* Already evicted. */
251
252
  ra_leftov(as, fpr, ref);
252
- fpr += 2;
253
- gpr += irt_isnum(ir->t) ? 2 : 1;
253
+ fpr += LJ_32 ? 2 : 1;
254
+ gpr += (LJ_32 && irt_isnum(ir->t)) ? 2 : 1;
254
255
  } else
255
256
  #endif
256
257
  {
257
- #if !LJ_SOFTFP
258
+ #if LJ_32 && !LJ_SOFTFP
258
259
  fpr = REGARG_LASTFPR+1;
259
260
  #endif
260
- if (irt_isnum(ir->t)) gpr = (gpr+1) & ~1;
261
+ if (LJ_32 && irt_isnum(ir->t)) gpr = (gpr+1) & ~1;
261
262
  if (gpr <= REGARG_LASTGPR) {
262
263
  lua_assert(rset_test(as->freeset, gpr)); /* Already evicted. */
263
264
  #if !LJ_SOFTFP
@@ -269,35 +270,55 @@ static void asm_gencall(ASMState *as, const CCallInfo *ci, IRRef *args)
269
270
  r = ra_alloc1(as, ref, RSET_FPR);
270
271
  as->freeset |= (of & RSET_RANGE(REGARG_FIRSTGPR, REGARG_LASTGPR+1));
271
272
  if (irt_isnum(ir->t)) {
273
+ #if LJ_32
272
274
  emit_tg(as, MIPSI_MFC1, gpr+(LJ_BE?0:1), r+1);
273
275
  emit_tg(as, MIPSI_MFC1, gpr+(LJ_BE?1:0), r);
274
276
  lua_assert(rset_test(as->freeset, gpr+1)); /* Already evicted. */
275
277
  gpr += 2;
278
+ #else
279
+ emit_tg(as, MIPSI_DMFC1, gpr, r);
280
+ gpr++; fpr++;
281
+ #endif
276
282
  } else if (irt_isfloat(ir->t)) {
277
283
  emit_tg(as, MIPSI_MFC1, gpr, r);
278
284
  gpr++;
285
+ #if LJ_64
286
+ fpr++;
287
+ #endif
279
288
  }
280
289
  } else
281
290
  #endif
282
291
  {
283
292
  ra_leftov(as, gpr, ref);
284
293
  gpr++;
294
+ #if LJ_64
295
+ fpr++;
296
+ #endif
285
297
  }
286
298
  } else {
287
299
  Reg r = ra_alloc1z(as, ref, !LJ_SOFTFP && irt_isfp(ir->t) ? RSET_FPR : RSET_GPR);
300
+ #if LJ_32
288
301
  if (irt_isnum(ir->t)) ofs = (ofs + 4) & ~4;
289
302
  emit_spstore(as, ir, r, ofs);
290
303
  ofs += irt_isnum(ir->t) ? 8 : 4;
304
+ #else
305
+ emit_spstore(as, ir, r, ofs + ((LJ_BE && (LJ_SOFTFP || r < RID_MAX_GPR) && !irt_is64(ir->t)) ? 4 : 0));
306
+ ofs += 8;
307
+ #endif
291
308
  }
292
309
  }
293
310
  } else {
294
311
  #if !LJ_SOFTFP
295
312
  fpr = REGARG_LASTFPR+1;
296
313
  #endif
297
- if (gpr <= REGARG_LASTGPR)
314
+ if (gpr <= REGARG_LASTGPR) {
298
315
  gpr++;
299
- else
300
- ofs += 4;
316
+ #if LJ_64
317
+ fpr++;
318
+ #endif
319
+ } else {
320
+ ofs += LJ_32 ? 4 : 8;
321
+ }
301
322
  }
302
323
  checkmclim(as);
303
324
  }
@@ -307,15 +328,19 @@ static void asm_gencall(ASMState *as, const CCallInfo *ci, IRRef *args)
307
328
  static void asm_setupresult(ASMState *as, IRIns *ir, const CCallInfo *ci)
308
329
  {
309
330
  RegSet drop = RSET_SCRATCH;
331
+ #if LJ_32
310
332
  int hiop = ((ir+1)->o == IR_HIOP && !irt_isnil((ir+1)->t));
333
+ #endif
311
334
  #if !LJ_SOFTFP
312
335
  if ((ci->flags & CCI_NOFPRCLOBBER))
313
336
  drop &= ~RSET_FPR;
314
337
  #endif
315
338
  if (ra_hasreg(ir->r))
316
339
  rset_clear(drop, ir->r); /* Dest reg handled below. */
340
+ #if LJ_32
317
341
  if (hiop && ra_hasreg((ir+1)->r))
318
342
  rset_clear(drop, (ir+1)->r); /* Dest reg handled below. */
343
+ #endif
319
344
  ra_evictset(as, drop); /* Evictions must be performed first. */
320
345
  if (ra_used(ir)) {
321
346
  lua_assert(!irt_ispri(ir->t));
@@ -326,18 +351,28 @@ static void asm_setupresult(ASMState *as, IRIns *ir, const CCallInfo *ci)
326
351
  if (ra_hasreg(dest)) {
327
352
  ra_free(as, dest);
328
353
  ra_modified(as, dest);
354
+ #if LJ_32
329
355
  emit_tg(as, MIPSI_MTC1, RID_RETHI, dest+1);
330
356
  emit_tg(as, MIPSI_MTC1, RID_RETLO, dest);
357
+ #else
358
+ emit_tg(as, MIPSI_DMTC1, RID_RET, dest);
359
+ #endif
331
360
  }
332
361
  if (ofs) {
362
+ #if LJ_32
333
363
  emit_tsi(as, MIPSI_SW, RID_RETLO, RID_SP, ofs+(LJ_BE?4:0));
334
364
  emit_tsi(as, MIPSI_SW, RID_RETHI, RID_SP, ofs+(LJ_BE?0:4));
365
+ #else
366
+ emit_tsi(as, MIPSI_SD, RID_RET, RID_SP, ofs);
367
+ #endif
335
368
  }
336
369
  } else {
337
370
  ra_destreg(as, ir, RID_FPRET);
338
371
  }
372
+ #if LJ_32
339
373
  } else if (hiop) {
340
374
  ra_destpair(as, ir);
375
+ #endif
341
376
  } else {
342
377
  ra_destreg(as, ir, RID_RET);
343
378
  }
@@ -356,7 +391,7 @@ static void asm_callx(ASMState *as, IRIns *ir)
356
391
  func = ir->op2; irf = IR(func);
357
392
  if (irf->o == IR_CARG) { func = irf->op1; irf = IR(func); }
358
393
  if (irref_isk(func)) { /* Call to constant address. */
359
- ci.func = (ASMFunction)(void *)(irf->i);
394
+ ci.func = (ASMFunction)(void *)get_kval(irf);
360
395
  } else { /* Need specific register for indirect calls. */
361
396
  Reg r = ra_alloc1(as, func, RID2RSET(RID_CFUNCADDR));
362
397
  MCode *p = as->mcp;
@@ -399,8 +434,8 @@ static void asm_retf(ASMState *as, IRIns *ir)
399
434
  emit_setgl(as, base, jit_base);
400
435
  emit_addptr(as, base, -8*delta);
401
436
  asm_guard(as, MIPSI_BNE, RID_TMP,
402
- ra_allock(as, i32ptr(pc), rset_exclude(RSET_GPR, base)));
403
- emit_tsi(as, MIPSI_LW, RID_TMP, base, -8);
437
+ ra_allock(as, igcptr(pc), rset_exclude(RSET_GPR, base)));
438
+ emit_tsi(as, MIPSI_AL, RID_TMP, base, -8);
404
439
  }
405
440
 
406
441
  /* -- Type conversions ---------------------------------------------------- */
@@ -434,11 +469,16 @@ static void asm_conv(ASMState *as, IRIns *ir)
434
469
  IRType st = (IRType)(ir->op2 & IRCONV_SRCMASK);
435
470
  #if !LJ_SOFTFP
436
471
  int stfp = (st == IRT_NUM || st == IRT_FLOAT);
472
+ #endif
473
+ #if LJ_64
474
+ int st64 = (st == IRT_I64 || st == IRT_U64 || st == IRT_P64);
437
475
  #endif
438
476
  IRRef lref = ir->op1;
477
+ #if LJ_32
439
478
  lua_assert(!(irt_isint64(ir->t) ||
440
479
  (st == IRT_I64 || st == IRT_U64))); /* Handled by SPLIT. */
441
- #if LJ_SOFTFP
480
+ #endif
481
+ #if LJ_32 && LJ_SOFTFP
442
482
  /* FP conversions are handled by SPLIT. */
443
483
  lua_assert(!irt_isfp(ir->t) && !(st == IRT_NUM || st == IRT_FLOAT));
444
484
  /* Can't check for same types: SPLIT uses CONV int.int + BXOR for sfp NEG. */
@@ -453,26 +493,50 @@ static void asm_conv(ASMState *as, IRIns *ir)
453
493
  /* y = (x ^ 0x8000000) + 2147483648.0 */
454
494
  Reg left = ra_alloc1(as, lref, RSET_GPR);
455
495
  Reg tmp = ra_scratch(as, rset_exclude(RSET_FPR, dest));
456
- emit_fgh(as, irt_isfloat(ir->t) ? MIPSI_ADD_S : MIPSI_ADD_D,
457
- dest, dest, tmp);
458
- emit_fg(as, irt_isfloat(ir->t) ? MIPSI_CVT_S_W : MIPSI_CVT_D_W,
459
- dest, dest);
460
496
  if (irt_isfloat(ir->t))
461
- emit_lsptr(as, MIPSI_LWC1, (tmp & 31),
462
- (void *)lj_ir_k64_find(as->J, U64x(4f000000,4f000000)),
463
- RSET_GPR);
464
- else
465
- emit_lsptr(as, MIPSI_LDC1, (tmp & 31),
466
- (void *)lj_ir_k64_find(as->J, U64x(41e00000,00000000)),
467
- RSET_GPR);
497
+ emit_fg(as, MIPSI_CVT_S_D, dest, dest);
498
+ /* Must perform arithmetic with doubles to keep the precision. */
499
+ emit_fgh(as, MIPSI_ADD_D, dest, dest, tmp);
500
+ emit_fg(as, MIPSI_CVT_D_W, dest, dest);
501
+ emit_lsptr(as, MIPSI_LDC1, (tmp & 31),
502
+ (void *)&as->J->k64[LJ_K64_2P31], RSET_GPR);
468
503
  emit_tg(as, MIPSI_MTC1, RID_TMP, dest);
469
504
  emit_dst(as, MIPSI_XOR, RID_TMP, RID_TMP, left);
470
505
  emit_ti(as, MIPSI_LUI, RID_TMP, 0x8000);
506
+ #if LJ_64
507
+ } else if(st == IRT_U64) { /* U64 to FP conversion. */
508
+ /* if (x >= 1u<<63) y = (double)(int64_t)(x&(1u<<63)-1) + pow(2.0, 63) */
509
+ Reg left = ra_alloc1(as, lref, RSET_GPR);
510
+ Reg tmp = ra_scratch(as, rset_exclude(RSET_FPR, dest));
511
+ MCLabel l_end = emit_label(as);
512
+ if (irt_isfloat(ir->t)) {
513
+ emit_fgh(as, MIPSI_ADD_S, dest, dest, tmp);
514
+ emit_lsptr(as, MIPSI_LWC1, (tmp & 31), (void *)&as->J->k32[LJ_K32_2P63],
515
+ rset_exclude(RSET_GPR, left));
516
+ emit_fg(as, MIPSI_CVT_S_L, dest, dest);
517
+ } else {
518
+ emit_fgh(as, MIPSI_ADD_D, dest, dest, tmp);
519
+ emit_lsptr(as, MIPSI_LDC1, (tmp & 31), (void *)&as->J->k64[LJ_K64_2P63],
520
+ rset_exclude(RSET_GPR, left));
521
+ emit_fg(as, MIPSI_CVT_D_L, dest, dest);
522
+ }
523
+ emit_branch(as, MIPSI_BGEZ, left, RID_ZERO, l_end);
524
+ emit_tg(as, MIPSI_DMTC1, RID_TMP, dest);
525
+ emit_tsml(as, MIPSI_DEXTM, RID_TMP, left, 30, 0);
526
+ #endif
471
527
  } else { /* Integer to FP conversion. */
472
528
  Reg left = ra_alloc1(as, lref, RSET_GPR);
529
+ #if LJ_32
473
530
  emit_fg(as, irt_isfloat(ir->t) ? MIPSI_CVT_S_W : MIPSI_CVT_D_W,
474
531
  dest, dest);
475
532
  emit_tg(as, MIPSI_MTC1, left, dest);
533
+ #else
534
+ MIPSIns mi = irt_isfloat(ir->t) ?
535
+ (st64 ? MIPSI_CVT_S_L : MIPSI_CVT_S_W) :
536
+ (st64 ? MIPSI_CVT_D_L : MIPSI_CVT_D_W);
537
+ emit_fg(as, mi, dest, dest);
538
+ emit_tg(as, st64 ? MIPSI_DMTC1 : MIPSI_MTC1, left, dest);
539
+ #endif
476
540
  }
477
541
  } else if (stfp) { /* FP to integer conversion. */
478
542
  if (irt_isguard(ir->t)) {
@@ -483,7 +547,7 @@ static void asm_conv(ASMState *as, IRIns *ir)
483
547
  Reg dest = ra_dest(as, ir, RSET_GPR);
484
548
  Reg left = ra_alloc1(as, lref, RSET_FPR);
485
549
  Reg tmp = ra_scratch(as, rset_exclude(RSET_FPR, left));
486
- if (irt_isu32(ir->t)) {
550
+ if (irt_isu32(ir->t)) { /* FP to U32 conversion. */
487
551
  /* y = (int)floor(x - 2147483648.0) ^ 0x80000000 */
488
552
  emit_dst(as, MIPSI_XOR, dest, dest, RID_TMP);
489
553
  emit_ti(as, MIPSI_LUI, RID_TMP, 0x8000);
@@ -494,16 +558,54 @@ static void asm_conv(ASMState *as, IRIns *ir)
494
558
  tmp, left, tmp);
495
559
  if (st == IRT_FLOAT)
496
560
  emit_lsptr(as, MIPSI_LWC1, (tmp & 31),
497
- (void *)lj_ir_k64_find(as->J, U64x(4f000000,4f000000)),
498
- RSET_GPR);
561
+ (void *)&as->J->k32[LJ_K32_2P31], RSET_GPR);
499
562
  else
500
563
  emit_lsptr(as, MIPSI_LDC1, (tmp & 31),
501
- (void *)lj_ir_k64_find(as->J, U64x(41e00000,00000000)),
502
- RSET_GPR);
564
+ (void *)&as->J->k64[LJ_K64_2P31], RSET_GPR);
565
+ #if LJ_64
566
+ } else if (irt_isu64(ir->t)) { /* FP to U64 conversion. */
567
+ MCLabel l_end;
568
+ emit_tg(as, MIPSI_DMFC1, dest, tmp);
569
+ l_end = emit_label(as);
570
+ /* For inputs >= 2^63 add -2^64 and convert again. */
571
+ if (st == IRT_NUM) {
572
+ emit_fg(as, MIPSI_TRUNC_L_D, tmp, tmp);
573
+ emit_fgh(as, MIPSI_ADD_D, tmp, left, tmp);
574
+ emit_lsptr(as, MIPSI_LDC1, (tmp & 31),
575
+ (void *)&as->J->k64[LJ_K64_M2P64],
576
+ rset_exclude(RSET_GPR, dest));
577
+ emit_fg(as, MIPSI_TRUNC_L_D, tmp, left); /* Delay slot. */
578
+ emit_branch(as, MIPSI_BC1T, 0, 0, l_end);
579
+ emit_fgh(as, MIPSI_C_OLT_D, 0, left, tmp);
580
+ emit_lsptr(as, MIPSI_LDC1, (tmp & 31),
581
+ (void *)&as->J->k64[LJ_K64_2P63],
582
+ rset_exclude(RSET_GPR, dest));
583
+ } else {
584
+ emit_fg(as, MIPSI_TRUNC_L_S, tmp, tmp);
585
+ emit_fgh(as, MIPSI_ADD_S, tmp, left, tmp);
586
+ emit_lsptr(as, MIPSI_LWC1, (tmp & 31),
587
+ (void *)&as->J->k32[LJ_K32_M2P64],
588
+ rset_exclude(RSET_GPR, dest));
589
+ emit_fg(as, MIPSI_TRUNC_L_S, tmp, left); /* Delay slot. */
590
+ emit_branch(as, MIPSI_BC1T, 0, 0, l_end);
591
+ emit_fgh(as, MIPSI_C_OLT_S, 0, left, tmp);
592
+ emit_lsptr(as, MIPSI_LWC1, (tmp & 31),
593
+ (void *)&as->J->k32[LJ_K32_2P63],
594
+ rset_exclude(RSET_GPR, dest));
595
+ }
596
+ #endif
503
597
  } else {
598
+ #if LJ_32
504
599
  emit_tg(as, MIPSI_MFC1, dest, tmp);
505
600
  emit_fg(as, st == IRT_FLOAT ? MIPSI_TRUNC_W_S : MIPSI_TRUNC_W_D,
506
601
  tmp, left);
602
+ #else
603
+ MIPSIns mi = irt_is64(ir->t) ?
604
+ (st == IRT_NUM ? MIPSI_TRUNC_L_D : MIPSI_TRUNC_L_S) :
605
+ (st == IRT_NUM ? MIPSI_TRUNC_W_D : MIPSI_TRUNC_W_S);
606
+ emit_tg(as, irt_is64(ir->t) ? MIPSI_DMFC1 : MIPSI_MFC1, dest, left);
607
+ emit_fg(as, mi, left, left);
608
+ #endif
507
609
  }
508
610
  }
509
611
  } else
@@ -514,7 +616,7 @@ static void asm_conv(ASMState *as, IRIns *ir)
514
616
  Reg left = ra_alloc1(as, ir->op1, RSET_GPR);
515
617
  lua_assert(irt_isint(ir->t) || irt_isu32(ir->t));
516
618
  if ((ir->op2 & IRCONV_SEXT)) {
517
- if ((as->flags & JIT_F_MIPS32R2)) {
619
+ if (LJ_64 || (as->flags & JIT_F_MIPSXXR2)) {
518
620
  emit_dst(as, st == IRT_I8 ? MIPSI_SEB : MIPSI_SEH, dest, 0, left);
519
621
  } else {
520
622
  uint32_t shift = st == IRT_I8 ? 24 : 16;
@@ -526,8 +628,35 @@ static void asm_conv(ASMState *as, IRIns *ir)
526
628
  (int32_t)(st == IRT_U8 ? 0xff : 0xffff));
527
629
  }
528
630
  } else { /* 32/64 bit integer conversions. */
631
+ #if LJ_32
529
632
  /* Only need to handle 32/32 bit no-op (cast) on 32 bit archs. */
530
633
  ra_leftov(as, dest, lref); /* Do nothing, but may need to move regs. */
634
+ #else
635
+ if (irt_is64(ir->t)) {
636
+ if (st64) {
637
+ /* 64/64 bit no-op (cast)*/
638
+ ra_leftov(as, dest, lref);
639
+ } else {
640
+ Reg left = ra_alloc1(as, lref, RSET_GPR);
641
+ if ((ir->op2 & IRCONV_SEXT)) { /* 32 to 64 bit sign extension. */
642
+ emit_dta(as, MIPSI_SLL, dest, left, 0);
643
+ } else { /* 32 to 64 bit zero extension. */
644
+ emit_tsml(as, MIPSI_DEXT, dest, left, 31, 0);
645
+ }
646
+ }
647
+ } else {
648
+ if (st64) {
649
+ /* This is either a 32 bit reg/reg mov which zeroes the hiword
650
+ ** or a load of the loword from a 64 bit address.
651
+ */
652
+ Reg left = ra_alloc1(as, lref, RSET_GPR);
653
+ emit_tsml(as, MIPSI_DEXT, dest, left, 31, 0);
654
+ } else { /* 32/32 bit no-op (cast). */
655
+ /* Do nothing, but may need to move regs. */
656
+ ra_leftov(as, dest, lref);
657
+ }
658
+ }
659
+ #endif
531
660
  }
532
661
  }
533
662
  }
@@ -570,23 +699,50 @@ static void asm_strto(ASMState *as, IRIns *ir)
570
699
  args[1] = ASMREF_TMP1; /* TValue *n */
571
700
  asm_gencall(as, ci, args);
572
701
  /* Store the result to the spill slot or temp slots. */
573
- emit_tsi(as, MIPSI_ADDIU, ra_releasetmp(as, ASMREF_TMP1),
702
+ emit_tsi(as, MIPSI_AADDIU, ra_releasetmp(as, ASMREF_TMP1),
574
703
  RID_SP, ofs);
575
704
  }
576
705
 
577
706
  /* -- Memory references --------------------------------------------------- */
578
707
 
708
+ #if LJ_64
709
+ /* Store tagged value for ref at base+ofs. */
710
+ static void asm_tvstore64(ASMState *as, Reg base, int32_t ofs, IRRef ref)
711
+ {
712
+ RegSet allow = rset_exclude(RSET_GPR, base);
713
+ IRIns *ir = IR(ref);
714
+ lua_assert(irt_ispri(ir->t) || irt_isaddr(ir->t) || irt_isinteger(ir->t));
715
+ if (irref_isk(ref)) {
716
+ TValue k;
717
+ lj_ir_kvalue(as->J->L, &k, ir);
718
+ emit_tsi(as, MIPSI_SD, ra_allock(as, (int64_t)k.u64, allow), base, ofs);
719
+ } else {
720
+ Reg src = ra_alloc1(as, ref, allow);
721
+ Reg type = ra_allock(as, (int64_t)irt_toitype(ir->t) << 47,
722
+ rset_exclude(allow, src));
723
+ emit_tsi(as, MIPSI_SD, RID_TMP, base, ofs);
724
+ if (irt_isinteger(ir->t)) {
725
+ emit_dst(as, MIPSI_DADDU, RID_TMP, RID_TMP, type);
726
+ emit_tsml(as, MIPSI_DEXT, RID_TMP, src, 31, 0);
727
+ } else {
728
+ emit_dst(as, MIPSI_DADDU, RID_TMP, src, type);
729
+ }
730
+ }
731
+ }
732
+ #endif
733
+
579
734
  /* Get pointer to TValue. */
580
735
  static void asm_tvptr(ASMState *as, Reg dest, IRRef ref)
581
736
  {
582
737
  IRIns *ir = IR(ref);
583
738
  if (irt_isnum(ir->t)) {
584
739
  if (irref_isk(ref)) /* Use the number constant itself as a TValue. */
585
- ra_allockreg(as, i32ptr(ir_knum(ir)), dest);
740
+ ra_allockreg(as, igcptr(ir_knum(ir)), dest);
586
741
  else /* Otherwise force a spill and use the spill slot. */
587
- emit_tsi(as, MIPSI_ADDIU, dest, RID_SP, ra_spill(as, ir));
742
+ emit_tsi(as, MIPSI_AADDIU, dest, RID_SP, ra_spill(as, ir));
588
743
  } else {
589
744
  /* Otherwise use g->tmptv to hold the TValue. */
745
+ #if LJ_32
590
746
  RegSet allow = rset_exclude(RSET_GPR, dest);
591
747
  Reg type;
592
748
  emit_tsi(as, MIPSI_ADDIU, dest, RID_JGL, (int32_t)(offsetof(global_State, tmptv)-32768));
@@ -599,6 +755,11 @@ static void asm_tvptr(ASMState *as, Reg dest, IRRef ref)
599
755
  else
600
756
  type = ra_allock(as, (int32_t)irt_toitype(ir->t), allow);
601
757
  emit_setgl(as, type, tmptv.it);
758
+ #else
759
+ asm_tvstore64(as, dest, 0, ref);
760
+ emit_tsi(as, MIPSI_DADDIU, dest, RID_JGL,
761
+ (int32_t)(offsetof(global_State, tmptv)-32768));
762
+ #endif
602
763
  }
603
764
  }
604
765
 
@@ -613,13 +774,13 @@ static void asm_aref(ASMState *as, IRIns *ir)
613
774
  ofs += 8*IR(ir->op2)->i;
614
775
  if (checki16(ofs)) {
615
776
  base = ra_alloc1(as, refa, RSET_GPR);
616
- emit_tsi(as, MIPSI_ADDIU, dest, base, ofs);
777
+ emit_tsi(as, MIPSI_AADDIU, dest, base, ofs);
617
778
  return;
618
779
  }
619
780
  }
620
781
  base = ra_alloc1(as, ir->op1, RSET_GPR);
621
782
  idx = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, base));
622
- emit_dst(as, MIPSI_ADDU, dest, RID_TMP, base);
783
+ emit_dst(as, MIPSI_AADDU, dest, RID_TMP, base);
623
784
  emit_dta(as, MIPSI_SLL, RID_TMP, idx, 3);
624
785
  }
625
786
 
@@ -640,19 +801,19 @@ static void asm_href(ASMState *as, IRIns *ir, IROp merge)
640
801
  Reg key = RID_NONE, type = RID_NONE, tmpnum = RID_NONE, tmp1 = RID_TMP, tmp2;
641
802
  IRRef refkey = ir->op2;
642
803
  IRIns *irkey = IR(refkey);
804
+ int isk = irref_isk(refkey);
643
805
  IRType1 kt = irkey->t;
644
806
  uint32_t khash;
645
807
  MCLabel l_end, l_loop, l_next;
646
808
 
647
809
  rset_clear(allow, tab);
648
- #if LJ_SOFTFP
649
- if (!irref_isk(refkey)) {
810
+ #if LJ_32 && LJ_SOFTFP
811
+ if (!isk) {
650
812
  key = ra_alloc1(as, refkey, allow);
651
813
  rset_clear(allow, key);
652
814
  if (irkey[1].o == IR_HIOP) {
653
815
  if (ra_hasreg((irkey+1)->r)) {
654
- tmpnum = (irkey+1)->r;
655
- type = RID_TMP;
816
+ type = tmpnum = (irkey+1)->r;
656
817
  tmp1 = ra_scratch(as, allow);
657
818
  rset_clear(allow, tmp1);
658
819
  ra_noweak(as, tmpnum);
@@ -672,8 +833,10 @@ static void asm_href(ASMState *as, IRIns *ir, IROp merge)
672
833
  } else if (!irt_ispri(kt)) {
673
834
  key = ra_alloc1(as, refkey, allow);
674
835
  rset_clear(allow, key);
836
+ #if LJ_32
675
837
  type = ra_allock(as, (int32_t)irt_toitype(irkey->t), allow);
676
838
  rset_clear(allow, type);
839
+ #endif
677
840
  }
678
841
  #endif
679
842
  tmp2 = ra_scratch(as, allow);
@@ -687,9 +850,9 @@ static void asm_href(ASMState *as, IRIns *ir, IROp merge)
687
850
  else if (destused)
688
851
  emit_loada(as, dest, niltvg(J2G(as->J)));
689
852
  /* Follow hash chain until the end. */
690
- emit_move(as, dest, tmp2);
853
+ emit_move(as, dest, tmp1);
691
854
  l_loop = --as->mcp;
692
- emit_tsi(as, MIPSI_LW, tmp2, dest, (int32_t)offsetof(Node, next));
855
+ emit_tsi(as, MIPSI_AL, tmp1, dest, (int32_t)offsetof(Node, next));
693
856
  l_next = emit_label(as);
694
857
 
695
858
  /* Type and value comparison. */
@@ -701,38 +864,66 @@ static void asm_href(ASMState *as, IRIns *ir, IROp merge)
701
864
  emit_branch(as, MIPSI_BC1T, 0, 0, l_end);
702
865
  emit_fgh(as, MIPSI_C_EQ_D, 0, tmpnum, key);
703
866
  *--as->mcp = MIPSI_NOP; /* Avoid NaN comparison overhead. */
704
- emit_branch(as, MIPSI_BEQ, tmp2, RID_ZERO, l_next);
705
- emit_tsi(as, MIPSI_SLTIU, tmp2, tmp2, (int32_t)LJ_TISNUM);
867
+ emit_branch(as, MIPSI_BEQ, tmp1, RID_ZERO, l_next);
868
+ emit_tsi(as, MIPSI_SLTIU, tmp1, tmp1, (int32_t)LJ_TISNUM);
869
+ #if LJ_32
706
870
  emit_hsi(as, MIPSI_LDC1, tmpnum, dest, (int32_t)offsetof(Node, key.n));
707
871
  } else {
708
872
  if (irt_ispri(kt)) {
709
- emit_branch(as, MIPSI_BEQ, tmp2, type, l_end);
873
+ emit_branch(as, MIPSI_BEQ, tmp1, type, l_end);
710
874
  } else {
711
- emit_branch(as, MIPSI_BEQ, tmp1, key, l_end);
712
- emit_tsi(as, MIPSI_LW, tmp1, dest, (int32_t)offsetof(Node, key.gcr));
713
- emit_branch(as, MIPSI_BNE, tmp2, type, l_next);
875
+ emit_branch(as, MIPSI_BEQ, tmp2, key, l_end);
876
+ emit_tsi(as, MIPSI_LW, tmp2, dest, (int32_t)offsetof(Node, key.gcr));
877
+ emit_branch(as, MIPSI_BNE, tmp1, type, l_next);
878
+ }
879
+ }
880
+ emit_tsi(as, MIPSI_LW, tmp1, dest, (int32_t)offsetof(Node, key.it));
881
+ *l_loop = MIPSI_BNE | MIPSF_S(tmp1) | ((as->mcp-l_loop-1) & 0xffffu);
882
+ #else
883
+ emit_dta(as, MIPSI_DSRA32, tmp1, tmp1, 15);
884
+ emit_tg(as, MIPSI_DMTC1, tmp1, tmpnum);
885
+ emit_tsi(as, MIPSI_LD, tmp1, dest, (int32_t)offsetof(Node, key.u64));
886
+ } else if (irt_isaddr(kt)) {
887
+ Reg refk = tmp2;
888
+ if (isk) {
889
+ int64_t k = ((int64_t)irt_toitype(irkey->t) << 47) | irkey[1].tv.u64;
890
+ refk = ra_allock(as, k, allow);
891
+ rset_clear(allow, refk);
714
892
  }
893
+ emit_branch(as, MIPSI_BEQ, tmp1, refk, l_end);
894
+ emit_tsi(as, MIPSI_LD, tmp1, dest, offsetof(Node, key));
895
+ } else {
896
+ Reg pri = ra_allock(as, ~((int64_t)~irt_toitype(ir->t) << 47), allow);
897
+ rset_clear(allow, pri);
898
+ lua_assert(irt_ispri(kt) && !irt_isnil(kt));
899
+ emit_branch(as, MIPSI_BEQ, tmp1, pri, l_end);
900
+ emit_tsi(as, MIPSI_LD, tmp1, dest, offsetof(Node, key));
901
+ }
902
+ *l_loop = MIPSI_BNE | MIPSF_S(tmp1) | ((as->mcp-l_loop-1) & 0xffffu);
903
+ if (!isk && irt_isaddr(kt)) {
904
+ type = ra_allock(as, (int64_t)irt_toitype(kt) << 47, allow);
905
+ emit_dst(as, MIPSI_DADDU, tmp2, key, type);
906
+ rset_clear(allow, type);
715
907
  }
716
- emit_tsi(as, MIPSI_LW, tmp2, dest, (int32_t)offsetof(Node, key.it));
717
- *l_loop = MIPSI_BNE | MIPSF_S(tmp2) | ((as->mcp-l_loop-1) & 0xffffu);
908
+ #endif
718
909
 
719
910
  /* Load main position relative to tab->node into dest. */
720
- khash = irref_isk(refkey) ? ir_khash(irkey) : 1;
911
+ khash = isk ? ir_khash(irkey) : 1;
721
912
  if (khash == 0) {
722
- emit_tsi(as, MIPSI_LW, dest, tab, (int32_t)offsetof(GCtab, node));
913
+ emit_tsi(as, MIPSI_AL, dest, tab, (int32_t)offsetof(GCtab, node));
723
914
  } else {
724
915
  Reg tmphash = tmp1;
725
- if (irref_isk(refkey))
916
+ if (isk)
726
917
  tmphash = ra_allock(as, khash, allow);
727
- emit_dst(as, MIPSI_ADDU, dest, dest, tmp1);
918
+ emit_dst(as, MIPSI_AADDU, dest, dest, tmp1);
728
919
  lua_assert(sizeof(Node) == 24);
729
920
  emit_dst(as, MIPSI_SUBU, tmp1, tmp2, tmp1);
730
921
  emit_dta(as, MIPSI_SLL, tmp1, tmp1, 3);
731
922
  emit_dta(as, MIPSI_SLL, tmp2, tmp1, 5);
732
923
  emit_dst(as, MIPSI_AND, tmp1, tmp2, tmphash);
733
- emit_tsi(as, MIPSI_LW, dest, tab, (int32_t)offsetof(GCtab, node));
924
+ emit_tsi(as, MIPSI_AL, dest, tab, (int32_t)offsetof(GCtab, node));
734
925
  emit_tsi(as, MIPSI_LW, tmp2, tab, (int32_t)offsetof(GCtab, hmask));
735
- if (irref_isk(refkey)) {
926
+ if (isk) {
736
927
  /* Nothing to do. */
737
928
  } else if (irt_isstr(kt)) {
738
929
  emit_tsi(as, MIPSI_LW, tmp1, key, (int32_t)offsetof(GCstr, hash));
@@ -742,9 +933,10 @@ static void asm_href(ASMState *as, IRIns *ir, IROp merge)
742
933
  emit_dst(as, MIPSI_XOR, tmp1, tmp1, tmp2);
743
934
  emit_rotr(as, tmp1, tmp1, dest, (-HASH_ROT2-HASH_ROT1)&31);
744
935
  emit_dst(as, MIPSI_SUBU, tmp2, tmp2, dest);
936
+ #if LJ_32
745
937
  if (LJ_SOFTFP ? (irkey[1].o == IR_HIOP) : irt_isnum(kt)) {
746
938
  emit_dst(as, MIPSI_XOR, tmp2, tmp2, tmp1);
747
- if ((as->flags & JIT_F_MIPS32R2)) {
939
+ if ((as->flags & JIT_F_MIPSXXR2)) {
748
940
  emit_dta(as, MIPSI_ROTR, dest, tmp1, (-HASH_ROT1)&31);
749
941
  } else {
750
942
  emit_dst(as, MIPSI_OR, dest, dest, tmp1);
@@ -764,6 +956,23 @@ static void asm_href(ASMState *as, IRIns *ir, IROp merge)
764
956
  emit_rotr(as, dest, tmp1, tmp2, (-HASH_ROT1)&31);
765
957
  emit_dst(as, MIPSI_ADDU, tmp1, key, ra_allock(as, HASH_BIAS, allow));
766
958
  }
959
+ #else
960
+ emit_dst(as, MIPSI_XOR, tmp2, tmp2, tmp1);
961
+ emit_dta(as, MIPSI_ROTR, dest, tmp1, (-HASH_ROT1)&31);
962
+ if (irt_isnum(kt)) {
963
+ emit_dst(as, MIPSI_ADDU, tmp1, tmp1, tmp1);
964
+ emit_dta(as, MIPSI_DSRA32, tmp1, tmp1, 0);
965
+ emit_dta(as, MIPSI_SLL, tmp2, LJ_SOFTFP ? key : tmp1, 0);
966
+ #if !LJ_SOFTFP
967
+ emit_tg(as, MIPSI_DMFC1, tmp1, key);
968
+ #endif
969
+ } else {
970
+ checkmclim(as);
971
+ emit_dta(as, MIPSI_DSRA32, tmp1, tmp1, 0);
972
+ emit_dta(as, MIPSI_SLL, tmp2, key, 0);
973
+ emit_dst(as, MIPSI_DADDU, tmp1, key, type);
974
+ }
975
+ #endif
767
976
  }
768
977
  }
769
978
  }
@@ -776,17 +985,24 @@ static void asm_hrefk(ASMState *as, IRIns *ir)
776
985
  int32_t kofs = ofs + (int32_t)offsetof(Node, key);
777
986
  Reg dest = (ra_used(ir)||ofs > 32736) ? ra_dest(as, ir, RSET_GPR) : RID_NONE;
778
987
  Reg node = ra_alloc1(as, ir->op1, RSET_GPR);
779
- Reg key = RID_NONE, type = RID_TMP, idx = node;
780
988
  RegSet allow = rset_exclude(RSET_GPR, node);
989
+ Reg idx = node;
990
+ #if LJ_32
991
+ Reg key = RID_NONE, type = RID_TMP;
781
992
  int32_t lo, hi;
993
+ #else
994
+ Reg key = ra_scratch(as, allow);
995
+ int64_t k;
996
+ #endif
782
997
  lua_assert(ofs % sizeof(Node) == 0);
783
998
  if (ofs > 32736) {
784
999
  idx = dest;
785
1000
  rset_clear(allow, dest);
786
1001
  kofs = (int32_t)offsetof(Node, key);
787
1002
  } else if (ra_hasreg(dest)) {
788
- emit_tsi(as, MIPSI_ADDIU, dest, node, ofs);
1003
+ emit_tsi(as, MIPSI_AADDIU, dest, node, ofs);
789
1004
  }
1005
+ #if LJ_32
790
1006
  if (!irt_ispri(irkey->t)) {
791
1007
  key = ra_scratch(as, allow);
792
1008
  rset_clear(allow, key);
@@ -805,30 +1021,41 @@ nolo:
805
1021
  asm_guard(as, MIPSI_BNE, type, hi ? ra_allock(as, hi, allow) : RID_ZERO);
806
1022
  if (ra_hasreg(key)) emit_tsi(as, MIPSI_LW, key, idx, kofs+(LJ_BE?4:0));
807
1023
  emit_tsi(as, MIPSI_LW, type, idx, kofs+(LJ_BE?0:4));
1024
+ #else
1025
+ if (irt_ispri(irkey->t)) {
1026
+ lua_assert(!irt_isnil(irkey->t));
1027
+ k = ~((int64_t)~irt_toitype(irkey->t) << 47);
1028
+ } else if (irt_isnum(irkey->t)) {
1029
+ k = (int64_t)ir_knum(irkey)->u64;
1030
+ } else {
1031
+ k = ((int64_t)irt_toitype(irkey->t) << 47) | (int64_t)ir_kgc(irkey);
1032
+ }
1033
+ asm_guard(as, MIPSI_BNE, key, ra_allock(as, k, allow));
1034
+ emit_tsi(as, MIPSI_LD, key, idx, kofs);
1035
+ #endif
808
1036
  if (ofs > 32736)
809
- emit_tsi(as, MIPSI_ADDU, dest, node, ra_allock(as, ofs, allow));
1037
+ emit_tsi(as, MIPSI_AADDU, dest, node, ra_allock(as, ofs, allow));
810
1038
  }
811
1039
 
812
1040
  static void asm_uref(ASMState *as, IRIns *ir)
813
1041
  {
814
- /* NYI: Check that UREFO is still open and not aliasing a slot. */
815
1042
  Reg dest = ra_dest(as, ir, RSET_GPR);
816
1043
  if (irref_isk(ir->op1)) {
817
1044
  GCfunc *fn = ir_kfunc(IR(ir->op1));
818
1045
  MRef *v = &gcref(fn->l.uvptr[(ir->op2 >> 8)])->uv.v;
819
- emit_lsptr(as, MIPSI_LW, dest, v, RSET_GPR);
1046
+ emit_lsptr(as, MIPSI_AL, dest, v, RSET_GPR);
820
1047
  } else {
821
1048
  Reg uv = ra_scratch(as, RSET_GPR);
822
1049
  Reg func = ra_alloc1(as, ir->op1, RSET_GPR);
823
1050
  if (ir->o == IR_UREFC) {
824
1051
  asm_guard(as, MIPSI_BEQ, RID_TMP, RID_ZERO);
825
- emit_tsi(as, MIPSI_ADDIU, dest, uv, (int32_t)offsetof(GCupval, tv));
1052
+ emit_tsi(as, MIPSI_AADDIU, dest, uv, (int32_t)offsetof(GCupval, tv));
826
1053
  emit_tsi(as, MIPSI_LBU, RID_TMP, uv, (int32_t)offsetof(GCupval, closed));
827
1054
  } else {
828
- emit_tsi(as, MIPSI_LW, dest, uv, (int32_t)offsetof(GCupval, v));
1055
+ emit_tsi(as, MIPSI_AL, dest, uv, (int32_t)offsetof(GCupval, v));
829
1056
  }
830
- emit_tsi(as, MIPSI_LW, uv, func,
831
- (int32_t)offsetof(GCfuncL, uvptr) + 4*(int32_t)(ir->op2 >> 8));
1057
+ emit_tsi(as, MIPSI_AL, uv, func, (int32_t)offsetof(GCfuncL, uvptr) +
1058
+ (int32_t)sizeof(MRef) * (int32_t)(ir->op2 >> 8));
832
1059
  }
833
1060
  }
834
1061
 
@@ -840,6 +1067,7 @@ static void asm_fref(ASMState *as, IRIns *ir)
840
1067
 
841
1068
  static void asm_strref(ASMState *as, IRIns *ir)
842
1069
  {
1070
+ #if LJ_32
843
1071
  Reg dest = ra_dest(as, ir, RSET_GPR);
844
1072
  IRRef ref = ir->op2, refk = ir->op1;
845
1073
  int32_t ofs = (int32_t)sizeof(GCstr);
@@ -871,6 +1099,20 @@ static void asm_strref(ASMState *as, IRIns *ir)
871
1099
  else
872
1100
  emit_dst(as, MIPSI_ADDU, dest, r,
873
1101
  ra_allock(as, ofs, rset_exclude(RSET_GPR, r)));
1102
+ #else
1103
+ RegSet allow = RSET_GPR;
1104
+ Reg dest = ra_dest(as, ir, allow);
1105
+ Reg base = ra_alloc1(as, ir->op1, allow);
1106
+ IRIns *irr = IR(ir->op2);
1107
+ int32_t ofs = sizeof(GCstr);
1108
+ rset_clear(allow, base);
1109
+ if (irref_isk(ir->op2) && checki16(ofs + irr->i)) {
1110
+ emit_tsi(as, MIPSI_DADDIU, dest, base, ofs + irr->i);
1111
+ } else {
1112
+ emit_tsi(as, MIPSI_DADDIU, dest, dest, ofs);
1113
+ emit_dst(as, MIPSI_DADDU, dest, base, ra_alloc1(as, ir->op2, allow));
1114
+ }
1115
+ #endif
874
1116
  }
875
1117
 
876
1118
  /* -- Loads and stores ---------------------------------------------------- */
@@ -884,7 +1126,7 @@ static MIPSIns asm_fxloadins(IRIns *ir)
884
1126
  case IRT_U16: return MIPSI_LHU;
885
1127
  case IRT_NUM: lua_assert(!LJ_SOFTFP); return MIPSI_LDC1;
886
1128
  case IRT_FLOAT: if (!LJ_SOFTFP) return MIPSI_LWC1;
887
- default: return MIPSI_LW;
1129
+ default: return (LJ_64 && irt_is64(ir->t)) ? MIPSI_LD : MIPSI_LW;
888
1130
  }
889
1131
  }
890
1132
 
@@ -895,24 +1137,30 @@ static MIPSIns asm_fxstoreins(IRIns *ir)
895
1137
  case IRT_I16: case IRT_U16: return MIPSI_SH;
896
1138
  case IRT_NUM: lua_assert(!LJ_SOFTFP); return MIPSI_SDC1;
897
1139
  case IRT_FLOAT: if (!LJ_SOFTFP) return MIPSI_SWC1;
898
- default: return MIPSI_SW;
1140
+ default: return (LJ_64 && irt_is64(ir->t)) ? MIPSI_SD : MIPSI_SW;
899
1141
  }
900
1142
  }
901
1143
 
902
1144
  static void asm_fload(ASMState *as, IRIns *ir)
903
1145
  {
904
1146
  Reg dest = ra_dest(as, ir, RSET_GPR);
905
- Reg idx = ra_alloc1(as, ir->op1, RSET_GPR);
906
1147
  MIPSIns mi = asm_fxloadins(ir);
1148
+ Reg idx;
907
1149
  int32_t ofs;
908
- if (ir->op2 == IRFL_TAB_ARRAY) {
909
- ofs = asm_fuseabase(as, ir->op1);
910
- if (ofs) { /* Turn the t->array load into an add for colocated arrays. */
911
- emit_tsi(as, MIPSI_ADDIU, dest, idx, ofs);
912
- return;
1150
+ if (ir->op1 == REF_NIL) {
1151
+ idx = RID_JGL;
1152
+ ofs = (ir->op2 << 2) - 32768 - GG_OFS(g);
1153
+ } else {
1154
+ idx = ra_alloc1(as, ir->op1, RSET_GPR);
1155
+ if (ir->op2 == IRFL_TAB_ARRAY) {
1156
+ ofs = asm_fuseabase(as, ir->op1);
1157
+ if (ofs) { /* Turn the t->array load into an add for colocated arrays. */
1158
+ emit_tsi(as, MIPSI_AADDIU, dest, idx, ofs);
1159
+ return;
1160
+ }
913
1161
  }
1162
+ ofs = field_ofs[ir->op2];
914
1163
  }
915
- ofs = field_ofs[ir->op2];
916
1164
  lua_assert(!irt_isfp(ir->t));
917
1165
  emit_tsi(as, mi, dest, idx, ofs);
918
1166
  }
@@ -952,36 +1200,59 @@ static void asm_xstore_(ASMState *as, IRIns *ir, int32_t ofs)
952
1200
 
953
1201
  static void asm_ahuvload(ASMState *as, IRIns *ir)
954
1202
  {
955
- int hiop = (LJ_SOFTFP && (ir+1)->o == IR_HIOP);
956
- IRType t = hiop ? IRT_NUM : irt_type(ir->t);
1203
+ int hiop = (LJ_32 && LJ_SOFTFP && (ir+1)->o == IR_HIOP);
957
1204
  Reg dest = RID_NONE, type = RID_TMP, idx;
958
1205
  RegSet allow = RSET_GPR;
959
1206
  int32_t ofs = 0;
960
- if (hiop && ra_used(ir+1)) {
961
- type = ra_dest(as, ir+1, allow);
962
- rset_clear(allow, type);
1207
+ IRType1 t = ir->t;
1208
+ if (hiop) {
1209
+ t.irt = IRT_NUM;
1210
+ if (ra_used(ir+1)) {
1211
+ type = ra_dest(as, ir+1, allow);
1212
+ rset_clear(allow, type);
1213
+ }
963
1214
  }
964
1215
  if (ra_used(ir)) {
965
1216
  lua_assert((LJ_SOFTFP ? 0 : irt_isnum(ir->t)) ||
966
1217
  irt_isint(ir->t) || irt_isaddr(ir->t));
967
- dest = ra_dest(as, ir, (!LJ_SOFTFP && t == IRT_NUM) ? RSET_FPR : allow);
1218
+ dest = ra_dest(as, ir, (!LJ_SOFTFP && irt_isnum(t)) ? RSET_FPR : allow);
968
1219
  rset_clear(allow, dest);
1220
+ #if LJ_64
1221
+ if (irt_isaddr(t))
1222
+ emit_tsml(as, MIPSI_DEXTM, dest, dest, 14, 0);
1223
+ else if (irt_isint(t))
1224
+ emit_dta(as, MIPSI_SLL, dest, dest, 0);
1225
+ #endif
969
1226
  }
970
1227
  idx = asm_fuseahuref(as, ir->op1, &ofs, allow);
971
1228
  rset_clear(allow, idx);
972
- if (t == IRT_NUM) {
1229
+ if (irt_isnum(t)) {
973
1230
  asm_guard(as, MIPSI_BEQ, RID_TMP, RID_ZERO);
974
1231
  emit_tsi(as, MIPSI_SLTIU, RID_TMP, type, (int32_t)LJ_TISNUM);
975
1232
  } else {
976
- asm_guard(as, MIPSI_BNE, type, ra_allock(as, irt_toitype_(t), allow));
1233
+ asm_guard(as, MIPSI_BNE, type,
1234
+ ra_allock(as, (int32_t)irt_toitype(t), allow));
977
1235
  }
1236
+ #if LJ_32
978
1237
  if (ra_hasreg(dest)) {
979
- if (!LJ_SOFTFP && t == IRT_NUM)
1238
+ if (!LJ_SOFTFP && irt_isnum(t))
980
1239
  emit_hsi(as, MIPSI_LDC1, dest, idx, ofs);
981
1240
  else
982
1241
  emit_tsi(as, MIPSI_LW, dest, idx, ofs+(LJ_BE?4:0));
983
1242
  }
984
1243
  emit_tsi(as, MIPSI_LW, type, idx, ofs+(LJ_BE?0:4));
1244
+ #else
1245
+ if (ra_hasreg(dest)) {
1246
+ if (!LJ_SOFTFP && irt_isnum(t)) {
1247
+ emit_hsi(as, MIPSI_LDC1, dest, idx, ofs);
1248
+ dest = type;
1249
+ }
1250
+ } else {
1251
+ dest = type;
1252
+ }
1253
+ emit_dta(as, MIPSI_DSRA32, type, dest, 15);
1254
+ emit_tsi(as, MIPSI_LD, dest, idx, ofs);
1255
+ #endif
985
1256
  }
986
1257
 
987
1258
  static void asm_ahustore(ASMState *as, IRIns *ir)
@@ -993,103 +1264,159 @@ static void asm_ahustore(ASMState *as, IRIns *ir)
993
1264
  return;
994
1265
  if (!LJ_SOFTFP && irt_isnum(ir->t)) {
995
1266
  src = ra_alloc1(as, ir->op2, RSET_FPR);
1267
+ idx = asm_fuseahuref(as, ir->op1, &ofs, allow);
1268
+ emit_hsi(as, MIPSI_SDC1, src, idx, ofs);
996
1269
  } else {
997
- int hiop = (LJ_SOFTFP && (ir+1)->o == IR_HIOP);
1270
+ #if LJ_32
998
1271
  if (!irt_ispri(ir->t)) {
999
1272
  src = ra_alloc1(as, ir->op2, allow);
1000
1273
  rset_clear(allow, src);
1001
1274
  }
1002
- if (hiop)
1275
+ if (LJ_SOFTFP && (ir+1)->o == IR_HIOP)
1003
1276
  type = ra_alloc1(as, (ir+1)->op2, allow);
1004
1277
  else
1005
1278
  type = ra_allock(as, (int32_t)irt_toitype(ir->t), allow);
1006
1279
  rset_clear(allow, type);
1007
- }
1008
- idx = asm_fuseahuref(as, ir->op1, &ofs, allow);
1009
- if (!LJ_SOFTFP && irt_isnum(ir->t)) {
1010
- emit_hsi(as, MIPSI_SDC1, src, idx, ofs);
1011
- } else {
1280
+ idx = asm_fuseahuref(as, ir->op1, &ofs, allow);
1012
1281
  if (ra_hasreg(src))
1013
1282
  emit_tsi(as, MIPSI_SW, src, idx, ofs+(LJ_BE?4:0));
1014
1283
  emit_tsi(as, MIPSI_SW, type, idx, ofs+(LJ_BE?0:4));
1284
+ #else
1285
+ Reg tmp = RID_TMP;
1286
+ if (irt_ispri(ir->t)) {
1287
+ tmp = ra_allock(as, ~((int64_t)~irt_toitype(ir->t) << 47), allow);
1288
+ rset_clear(allow, tmp);
1289
+ } else {
1290
+ src = ra_alloc1(as, ir->op2, allow);
1291
+ rset_clear(allow, src);
1292
+ type = ra_allock(as, (int64_t)irt_toitype(ir->t) << 47, allow);
1293
+ rset_clear(allow, type);
1294
+ }
1295
+ idx = asm_fuseahuref(as, ir->op1, &ofs, allow);
1296
+ emit_tsi(as, MIPSI_SD, tmp, idx, ofs);
1297
+ if (ra_hasreg(src)) {
1298
+ if (irt_isinteger(ir->t)) {
1299
+ emit_dst(as, MIPSI_DADDU, tmp, tmp, type);
1300
+ emit_tsml(as, MIPSI_DEXT, tmp, src, 31, 0);
1301
+ } else {
1302
+ emit_dst(as, MIPSI_DADDU, tmp, src, type);
1303
+ }
1304
+ }
1305
+ #endif
1015
1306
  }
1016
1307
  }
1017
1308
 
1018
1309
  static void asm_sload(ASMState *as, IRIns *ir)
1019
1310
  {
1020
- int32_t ofs = 8*((int32_t)ir->op1-1) + ((ir->op2 & IRSLOAD_FRAME) ? 4 : 0);
1021
- int hiop = (LJ_SOFTFP && (ir+1)->o == IR_HIOP);
1022
- IRType t = hiop ? IRT_NUM : irt_type(ir->t);
1023
1311
  Reg dest = RID_NONE, type = RID_NONE, base;
1024
1312
  RegSet allow = RSET_GPR;
1313
+ IRType1 t = ir->t;
1314
+ #if LJ_32
1315
+ int32_t ofs = 8*((int32_t)ir->op1-1) + ((ir->op2 & IRSLOAD_FRAME) ? 4 : 0);
1316
+ int hiop = (LJ_32 && LJ_SOFTFP && (ir+1)->o == IR_HIOP);
1317
+ if (hiop)
1318
+ t.irt = IRT_NUM;
1319
+ #else
1320
+ int32_t ofs = 8*((int32_t)ir->op1-2);
1321
+ #endif
1025
1322
  lua_assert(!(ir->op2 & IRSLOAD_PARENT)); /* Handled by asm_head_side(). */
1026
1323
  lua_assert(irt_isguard(ir->t) || !(ir->op2 & IRSLOAD_TYPECHECK));
1027
- #if LJ_SOFTFP
1324
+ #if LJ_32 && LJ_SOFTFP
1028
1325
  lua_assert(!(ir->op2 & IRSLOAD_CONVERT)); /* Handled by LJ_SOFTFP SPLIT. */
1029
1326
  if (hiop && ra_used(ir+1)) {
1030
1327
  type = ra_dest(as, ir+1, allow);
1031
1328
  rset_clear(allow, type);
1032
1329
  }
1033
1330
  #else
1034
- if ((ir->op2 & IRSLOAD_CONVERT) && irt_isguard(ir->t) && t == IRT_INT) {
1331
+ if ((ir->op2 & IRSLOAD_CONVERT) && irt_isguard(t) && irt_isint(t)) {
1035
1332
  dest = ra_scratch(as, RSET_FPR);
1036
1333
  asm_tointg(as, ir, dest);
1037
- t = IRT_NUM; /* Continue with a regular number type check. */
1334
+ t.irt = IRT_NUM; /* Continue with a regular number type check. */
1038
1335
  } else
1039
1336
  #endif
1040
1337
  if (ra_used(ir)) {
1041
1338
  lua_assert((LJ_SOFTFP ? 0 : irt_isnum(ir->t)) ||
1042
1339
  irt_isint(ir->t) || irt_isaddr(ir->t));
1043
- dest = ra_dest(as, ir, (!LJ_SOFTFP && t == IRT_NUM) ? RSET_FPR : allow);
1340
+ dest = ra_dest(as, ir, (!LJ_SOFTFP && irt_isnum(t)) ? RSET_FPR : allow);
1044
1341
  rset_clear(allow, dest);
1045
1342
  base = ra_alloc1(as, REF_BASE, allow);
1046
1343
  rset_clear(allow, base);
1047
1344
  if (!LJ_SOFTFP && (ir->op2 & IRSLOAD_CONVERT)) {
1048
- if (t == IRT_INT) {
1345
+ if (irt_isint(t)) {
1049
1346
  Reg tmp = ra_scratch(as, RSET_FPR);
1050
1347
  emit_tg(as, MIPSI_MFC1, dest, tmp);
1051
1348
  emit_fg(as, MIPSI_TRUNC_W_D, tmp, tmp);
1052
1349
  dest = tmp;
1053
- t = IRT_NUM; /* Check for original type. */
1350
+ t.irt = IRT_NUM; /* Check for original type. */
1054
1351
  } else {
1055
1352
  Reg tmp = ra_scratch(as, RSET_GPR);
1056
1353
  emit_fg(as, MIPSI_CVT_D_W, dest, dest);
1057
1354
  emit_tg(as, MIPSI_MTC1, tmp, dest);
1058
1355
  dest = tmp;
1059
- t = IRT_INT; /* Check for original type. */
1356
+ t.irt = IRT_INT; /* Check for original type. */
1060
1357
  }
1061
1358
  }
1359
+ #if LJ_64
1360
+ else if (irt_isaddr(t)) {
1361
+ /* Clear type from pointers. */
1362
+ emit_tsml(as, MIPSI_DEXTM, dest, dest, 14, 0);
1363
+ } else if (irt_isint(t) && (ir->op2 & IRSLOAD_TYPECHECK)) {
1364
+ /* Sign-extend integers. */
1365
+ emit_dta(as, MIPSI_SLL, dest, dest, 0);
1366
+ }
1367
+ #endif
1062
1368
  goto dotypecheck;
1063
1369
  }
1064
1370
  base = ra_alloc1(as, REF_BASE, allow);
1065
1371
  rset_clear(allow, base);
1066
1372
  dotypecheck:
1373
+ #if LJ_32
1067
1374
  if ((ir->op2 & IRSLOAD_TYPECHECK)) {
1068
- if (ra_noreg(type)) {
1069
- if (ofs < 256 && ra_hasreg(dest) && (dest & 1) == 0 &&
1070
- rset_test((as->freeset & allow), dest+1)) {
1071
- type = dest+1;
1072
- ra_modified(as, type);
1073
- } else {
1074
- type = RID_TMP;
1075
- }
1076
- }
1077
- if (t == IRT_NUM) {
1375
+ if (ra_noreg(type))
1376
+ type = RID_TMP;
1377
+ if (irt_isnum(t)) {
1078
1378
  asm_guard(as, MIPSI_BEQ, RID_TMP, RID_ZERO);
1079
1379
  emit_tsi(as, MIPSI_SLTIU, RID_TMP, type, (int32_t)LJ_TISNUM);
1080
1380
  } else {
1081
- Reg ktype = ra_allock(as, irt_toitype_(t), allow);
1381
+ Reg ktype = ra_allock(as, irt_toitype(t), allow);
1082
1382
  asm_guard(as, MIPSI_BNE, type, ktype);
1083
1383
  }
1084
1384
  }
1085
1385
  if (ra_hasreg(dest)) {
1086
- if (!LJ_SOFTFP && t == IRT_NUM)
1386
+ if (!LJ_SOFTFP && irt_isnum(t))
1087
1387
  emit_hsi(as, MIPSI_LDC1, dest, base, ofs);
1088
1388
  else
1089
1389
  emit_tsi(as, MIPSI_LW, dest, base, ofs ^ (LJ_BE?4:0));
1090
1390
  }
1091
1391
  if (ra_hasreg(type))
1092
1392
  emit_tsi(as, MIPSI_LW, type, base, ofs ^ (LJ_BE?0:4));
1393
+ #else
1394
+ if ((ir->op2 & IRSLOAD_TYPECHECK)) {
1395
+ type = dest < RID_MAX_GPR ? dest : RID_TMP;
1396
+ if (irt_ispri(t)) {
1397
+ asm_guard(as, MIPSI_BNE, type,
1398
+ ra_allock(as, ~((int64_t)~irt_toitype(t) << 47) , allow));
1399
+ } else {
1400
+ if (irt_isnum(t)) {
1401
+ asm_guard(as, MIPSI_BEQ, RID_TMP, RID_ZERO);
1402
+ emit_tsi(as, MIPSI_SLTIU, RID_TMP, RID_TMP, (int32_t)LJ_TISNUM);
1403
+ if (ra_hasreg(dest))
1404
+ emit_hsi(as, MIPSI_LDC1, dest, base, ofs);
1405
+ } else {
1406
+ asm_guard(as, MIPSI_BNE, RID_TMP,
1407
+ ra_allock(as, (int32_t)irt_toitype(t), allow));
1408
+ }
1409
+ emit_dta(as, MIPSI_DSRA32, RID_TMP, type, 15);
1410
+ }
1411
+ emit_tsi(as, MIPSI_LD, type, base, ofs);
1412
+ } else if (ra_hasreg(dest)) {
1413
+ if (irt_isnum(t))
1414
+ emit_hsi(as, MIPSI_LDC1, dest, base, ofs);
1415
+ else
1416
+ emit_tsi(as, irt_isint(t) ? MIPSI_LW : MIPSI_LD, dest, base,
1417
+ ofs ^ ((LJ_BE && irt_isint(t)) ? 4 : 0));
1418
+ }
1419
+ #endif
1093
1420
  }
1094
1421
 
1095
1422
  /* -- Allocations --------------------------------------------------------- */
@@ -1116,8 +1443,8 @@ static void asm_cnew(ASMState *as, IRIns *ir)
1116
1443
  /* Initialize immutable cdata object. */
1117
1444
  if (ir->o == IR_CNEWI) {
1118
1445
  RegSet allow = (RSET_GPR & ~RSET_SCRATCH);
1446
+ #if LJ_32
1119
1447
  int32_t ofs = sizeof(GCcdata);
1120
- lua_assert(sz == 4 || sz == 8);
1121
1448
  if (sz == 8) {
1122
1449
  ofs += 4;
1123
1450
  lua_assert((ir+1)->o == IR_HIOP);
@@ -1130,6 +1457,11 @@ static void asm_cnew(ASMState *as, IRIns *ir)
1130
1457
  if (ofs == sizeof(GCcdata)) break;
1131
1458
  ofs -= 4; if (LJ_BE) ir++; else ir--;
1132
1459
  }
1460
+ #else
1461
+ emit_tsi(as, MIPSI_SD, ra_alloc1(as, ir->op2, allow),
1462
+ RID_RET, sizeof(GCcdata));
1463
+ #endif
1464
+ lua_assert(sz == 4 || sz == 8);
1133
1465
  } else if (ir->op2 != REF_NIL) { /* Create VLA/VLS/aligned cdata. */
1134
1466
  ci = &lj_ir_callinfo[IRCALL_lj_cdata_newv];
1135
1467
  args[0] = ASMREF_L; /* lua_State *L */
@@ -1164,7 +1496,7 @@ static void asm_tbar(ASMState *as, IRIns *ir)
1164
1496
  Reg mark = ra_scratch(as, rset_exclude(RSET_GPR, tab));
1165
1497
  Reg link = RID_TMP;
1166
1498
  MCLabel l_end = emit_label(as);
1167
- emit_tsi(as, MIPSI_SW, link, tab, (int32_t)offsetof(GCtab, gclist));
1499
+ emit_tsi(as, MIPSI_AS, link, tab, (int32_t)offsetof(GCtab, gclist));
1168
1500
  emit_tsi(as, MIPSI_SB, mark, tab, (int32_t)offsetof(GCtab, marked));
1169
1501
  emit_setgl(as, tab, gc.grayagain);
1170
1502
  emit_getgl(as, link, gc.grayagain);
@@ -1187,7 +1519,7 @@ static void asm_obar(ASMState *as, IRIns *ir)
1187
1519
  args[0] = ASMREF_TMP1; /* global_State *g */
1188
1520
  args[1] = ir->op1; /* TValue *tv */
1189
1521
  asm_gencall(as, ci, args);
1190
- emit_tsi(as, MIPSI_ADDIU, ra_releasetmp(as, ASMREF_TMP1), RID_JGL, -32768);
1522
+ emit_tsi(as, MIPSI_AADDIU, ra_releasetmp(as, ASMREF_TMP1), RID_JGL, -32768);
1191
1523
  obj = IR(ir->op1)->r;
1192
1524
  tmp = ra_scratch(as, rset_exclude(RSET_GPR, obj));
1193
1525
  emit_branch(as, MIPSI_BEQ, RID_TMP, RID_ZERO, l_end);
@@ -1233,8 +1565,9 @@ static void asm_fpmath(ASMState *as, IRIns *ir)
1233
1565
 
1234
1566
  static void asm_add(ASMState *as, IRIns *ir)
1235
1567
  {
1568
+ IRType1 t = ir->t;
1236
1569
  #if !LJ_SOFTFP
1237
- if (irt_isnum(ir->t)) {
1570
+ if (irt_isnum(t)) {
1238
1571
  asm_fparith(as, ir, MIPSI_ADD_D);
1239
1572
  } else
1240
1573
  #endif
@@ -1242,14 +1575,16 @@ static void asm_add(ASMState *as, IRIns *ir)
1242
1575
  Reg dest = ra_dest(as, ir, RSET_GPR);
1243
1576
  Reg right, left = ra_hintalloc(as, ir->op1, dest, RSET_GPR);
1244
1577
  if (irref_isk(ir->op2)) {
1245
- int32_t k = IR(ir->op2)->i;
1578
+ intptr_t k = get_kval(IR(ir->op2));
1246
1579
  if (checki16(k)) {
1247
- emit_tsi(as, MIPSI_ADDIU, dest, left, k);
1580
+ emit_tsi(as, (LJ_64 && irt_is64(t)) ? MIPSI_DADDIU : MIPSI_ADDIU, dest,
1581
+ left, k);
1248
1582
  return;
1249
1583
  }
1250
1584
  }
1251
1585
  right = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, left));
1252
- emit_dst(as, MIPSI_ADDU, dest, left, right);
1586
+ emit_dst(as, (LJ_64 && irt_is64(t)) ? MIPSI_DADDU : MIPSI_ADDU, dest,
1587
+ left, right);
1253
1588
  }
1254
1589
  }
1255
1590
 
@@ -1264,7 +1599,8 @@ static void asm_sub(ASMState *as, IRIns *ir)
1264
1599
  Reg dest = ra_dest(as, ir, RSET_GPR);
1265
1600
  Reg right, left = ra_alloc2(as, ir, RSET_GPR);
1266
1601
  right = (left >> 8); left &= 255;
1267
- emit_dst(as, MIPSI_SUBU, dest, left, right);
1602
+ emit_dst(as, (LJ_64 && irt_is64(ir->t)) ? MIPSI_DSUBU : MIPSI_SUBU, dest,
1603
+ left, right);
1268
1604
  }
1269
1605
  }
1270
1606
 
@@ -1279,13 +1615,49 @@ static void asm_mul(ASMState *as, IRIns *ir)
1279
1615
  Reg dest = ra_dest(as, ir, RSET_GPR);
1280
1616
  Reg right, left = ra_alloc2(as, ir, RSET_GPR);
1281
1617
  right = (left >> 8); left &= 255;
1282
- emit_dst(as, MIPSI_MUL, dest, left, right);
1618
+ if (LJ_64 && irt_is64(ir->t)) {
1619
+ emit_dst(as, MIPSI_MFLO, dest, 0, 0);
1620
+ emit_dst(as, MIPSI_DMULT, 0, left, right);
1621
+ } else {
1622
+ emit_dst(as, MIPSI_MUL, dest, left, right);
1623
+ }
1283
1624
  }
1284
1625
  }
1285
1626
 
1286
- #define asm_div(as, ir) asm_fparith(as, ir, MIPSI_DIV_D)
1287
- #define asm_mod(as, ir) asm_callid(as, ir, IRCALL_lj_vm_modi)
1288
- #define asm_pow(as, ir) asm_callid(as, ir, IRCALL_lj_vm_powi)
1627
+ static void asm_mod(ASMState *as, IRIns *ir)
1628
+ {
1629
+ #if LJ_64 && LJ_HASFFI
1630
+ if (!irt_isint(ir->t))
1631
+ asm_callid(as, ir, irt_isi64(ir->t) ? IRCALL_lj_carith_modi64 :
1632
+ IRCALL_lj_carith_modu64);
1633
+ else
1634
+ #endif
1635
+ asm_callid(as, ir, IRCALL_lj_vm_modi);
1636
+ }
1637
+
1638
+ #if !LJ_SOFTFP
1639
+ static void asm_pow(ASMState *as, IRIns *ir)
1640
+ {
1641
+ #if LJ_64 && LJ_HASFFI
1642
+ if (!irt_isnum(ir->t))
1643
+ asm_callid(as, ir, irt_isi64(ir->t) ? IRCALL_lj_carith_powi64 :
1644
+ IRCALL_lj_carith_powu64);
1645
+ else
1646
+ #endif
1647
+ asm_callid(as, ir, IRCALL_lj_vm_powi);
1648
+ }
1649
+
1650
+ static void asm_div(ASMState *as, IRIns *ir)
1651
+ {
1652
+ #if LJ_64 && LJ_HASFFI
1653
+ if (!irt_isnum(ir->t))
1654
+ asm_callid(as, ir, irt_isi64(ir->t) ? IRCALL_lj_carith_divi64 :
1655
+ IRCALL_lj_carith_divu64);
1656
+ else
1657
+ #endif
1658
+ asm_fparith(as, ir, MIPSI_DIV_D);
1659
+ }
1660
+ #endif
1289
1661
 
1290
1662
  static void asm_neg(ASMState *as, IRIns *ir)
1291
1663
  {
@@ -1297,7 +1669,8 @@ static void asm_neg(ASMState *as, IRIns *ir)
1297
1669
  {
1298
1670
  Reg dest = ra_dest(as, ir, RSET_GPR);
1299
1671
  Reg left = ra_hintalloc(as, ir->op1, dest, RSET_GPR);
1300
- emit_dst(as, MIPSI_SUBU, dest, RID_ZERO, left);
1672
+ emit_dst(as, (LJ_64 && irt_is64(ir->t)) ? MIPSI_DSUBU : MIPSI_SUBU, dest,
1673
+ RID_ZERO, left);
1301
1674
  }
1302
1675
  }
1303
1676
 
@@ -1308,6 +1681,7 @@ static void asm_neg(ASMState *as, IRIns *ir)
1308
1681
  static void asm_arithov(ASMState *as, IRIns *ir)
1309
1682
  {
1310
1683
  Reg right, left, tmp, dest = ra_dest(as, ir, RSET_GPR);
1684
+ lua_assert(!irt_is64(ir->t));
1311
1685
  if (irref_isk(ir->op2)) {
1312
1686
  int k = IR(ir->op2)->i;
1313
1687
  if (ir->o == IR_SUBOV) k = -k;
@@ -1355,7 +1729,7 @@ static void asm_mulov(ASMState *as, IRIns *ir)
1355
1729
  emit_dst(as, MIPSI_MULT, 0, left, right);
1356
1730
  }
1357
1731
 
1358
- #if LJ_HASFFI
1732
+ #if LJ_32 && LJ_HASFFI
1359
1733
  static void asm_add64(ASMState *as, IRIns *ir)
1360
1734
  {
1361
1735
  Reg dest = ra_dest(as, ir, RSET_GPR);
@@ -1457,7 +1831,8 @@ static void asm_bswap(ASMState *as, IRIns *ir)
1457
1831
  {
1458
1832
  Reg dest = ra_dest(as, ir, RSET_GPR);
1459
1833
  Reg left = ra_alloc1(as, ir->op1, RSET_GPR);
1460
- if ((as->flags & JIT_F_MIPS32R2)) {
1834
+ #if LJ_32
1835
+ if ((as->flags & JIT_F_MIPSXXR2)) {
1461
1836
  emit_dta(as, MIPSI_ROTR, dest, RID_TMP, 16);
1462
1837
  emit_dst(as, MIPSI_WSBH, RID_TMP, 0, left);
1463
1838
  } else {
@@ -1472,6 +1847,15 @@ static void asm_bswap(ASMState *as, IRIns *ir)
1472
1847
  emit_dta(as, MIPSI_SRL, tmp, left, 24);
1473
1848
  emit_dta(as, MIPSI_SLL, RID_TMP, left, 24);
1474
1849
  }
1850
+ #else
1851
+ if (irt_is64(ir->t)) {
1852
+ emit_dst(as, MIPSI_DSHD, dest, 0, RID_TMP);
1853
+ emit_dst(as, MIPSI_DSBH, RID_TMP, 0, left);
1854
+ } else {
1855
+ emit_dta(as, MIPSI_ROTR, dest, RID_TMP, 16);
1856
+ emit_dst(as, MIPSI_WSBH, RID_TMP, 0, left);
1857
+ }
1858
+ #endif
1475
1859
  }
1476
1860
 
1477
1861
  static void asm_bitop(ASMState *as, IRIns *ir, MIPSIns mi, MIPSIns mik)
@@ -1479,7 +1863,7 @@ static void asm_bitop(ASMState *as, IRIns *ir, MIPSIns mi, MIPSIns mik)
1479
1863
  Reg dest = ra_dest(as, ir, RSET_GPR);
1480
1864
  Reg right, left = ra_hintalloc(as, ir->op1, dest, RSET_GPR);
1481
1865
  if (irref_isk(ir->op2)) {
1482
- int32_t k = IR(ir->op2)->i;
1866
+ intptr_t k = get_kval(IR(ir->op2));
1483
1867
  if (checku16(k)) {
1484
1868
  emit_tsi(as, mik, dest, left, k);
1485
1869
  return;
@@ -1497,11 +1881,14 @@ static void asm_bitshift(ASMState *as, IRIns *ir, MIPSIns mi, MIPSIns mik)
1497
1881
  {
1498
1882
  Reg dest = ra_dest(as, ir, RSET_GPR);
1499
1883
  if (irref_isk(ir->op2)) { /* Constant shifts. */
1500
- uint32_t shift = (uint32_t)(IR(ir->op2)->i & 31);
1501
- emit_dta(as, mik, dest, ra_hintalloc(as, ir->op1, dest, RSET_GPR), shift);
1884
+ uint32_t shift = (uint32_t)IR(ir->op2)->i;
1885
+ if (LJ_64 && irt_is64(ir->t)) mik |= (shift & 32) ? MIPSI_D32 : MIPSI_D;
1886
+ emit_dta(as, mik, dest, ra_hintalloc(as, ir->op1, dest, RSET_GPR),
1887
+ (shift & 31));
1502
1888
  } else {
1503
1889
  Reg right, left = ra_alloc2(as, ir, RSET_GPR);
1504
1890
  right = (left >> 8); left &= 255;
1891
+ if (LJ_64 && irt_is64(ir->t)) mi |= MIPSI_DV;
1505
1892
  emit_dst(as, mi, dest, right, left); /* Shift amount is in rs. */
1506
1893
  }
1507
1894
  }
@@ -1513,7 +1900,7 @@ static void asm_bitshift(ASMState *as, IRIns *ir, MIPSIns mi, MIPSIns mik)
1513
1900
 
1514
1901
  static void asm_bror(ASMState *as, IRIns *ir)
1515
1902
  {
1516
- if ((as->flags & JIT_F_MIPS32R2)) {
1903
+ if (LJ_64 || (as->flags & JIT_F_MIPSXXR2)) {
1517
1904
  asm_bitshift(as, ir, MIPSI_ROTRV, MIPSI_ROTR);
1518
1905
  } else {
1519
1906
  Reg dest = ra_dest(as, ir, RSET_GPR);
@@ -1532,7 +1919,7 @@ static void asm_bror(ASMState *as, IRIns *ir)
1532
1919
  }
1533
1920
  }
1534
1921
 
1535
- #if LJ_SOFTFP
1922
+ #if LJ_32 && LJ_SOFTFP
1536
1923
  static void asm_sfpmin_max(ASMState *as, IRIns *ir)
1537
1924
  {
1538
1925
  CCallInfo ci = lj_ir_callinfo[(IROp)ir->o == IR_MIN ? IRCALL_lj_vm_sfmin : IRCALL_lj_vm_sfmax];
@@ -1581,7 +1968,7 @@ static void asm_min_max(ASMState *as, IRIns *ir, int ismax)
1581
1968
 
1582
1969
  /* -- Comparisons --------------------------------------------------------- */
1583
1970
 
1584
- #if LJ_SOFTFP
1971
+ #if LJ_32 && LJ_SOFTFP
1585
1972
  /* SFP comparisons. */
1586
1973
  static void asm_sfpcomp(ASMState *as, IRIns *ir)
1587
1974
  {
@@ -1654,13 +2041,13 @@ static void asm_comp(ASMState *as, IRIns *ir)
1654
2041
  } else {
1655
2042
  Reg right, left = ra_alloc1(as, ir->op1, RSET_GPR);
1656
2043
  if (op == IR_ABC) op = IR_UGT;
1657
- if ((op&4) == 0 && irref_isk(ir->op2) && IR(ir->op2)->i == 0) {
2044
+ if ((op&4) == 0 && irref_isk(ir->op2) && get_kval(IR(ir->op2)) == 0) {
1658
2045
  MIPSIns mi = (op&2) ? ((op&1) ? MIPSI_BLEZ : MIPSI_BGTZ) :
1659
2046
  ((op&1) ? MIPSI_BLTZ : MIPSI_BGEZ);
1660
2047
  asm_guard(as, mi, left, 0);
1661
2048
  } else {
1662
2049
  if (irref_isk(ir->op2)) {
1663
- int32_t k = IR(ir->op2)->i;
2050
+ intptr_t k = get_kval(IR(ir->op2));
1664
2051
  if ((op&2)) k++;
1665
2052
  if (checki16(k)) {
1666
2053
  asm_guard(as, (op&1) ? MIPSI_BNE : MIPSI_BEQ, RID_TMP, RID_ZERO);
@@ -1679,7 +2066,8 @@ static void asm_comp(ASMState *as, IRIns *ir)
1679
2066
 
1680
2067
  static void asm_equal(ASMState *as, IRIns *ir)
1681
2068
  {
1682
- Reg right, left = ra_alloc2(as, ir, (!LJ_SOFTFP && irt_isnum(ir->t)) ? RSET_FPR : RSET_GPR);
2069
+ Reg right, left = ra_alloc2(as, ir, (!LJ_SOFTFP && irt_isnum(ir->t)) ?
2070
+ RSET_FPR : RSET_GPR);
1683
2071
  right = (left >> 8); left &= 255;
1684
2072
  if (!LJ_SOFTFP && irt_isnum(ir->t)) {
1685
2073
  asm_guard(as, (ir->o & 1) ? MIPSI_BC1T : MIPSI_BC1F, 0, 0);
@@ -1689,7 +2077,7 @@ static void asm_equal(ASMState *as, IRIns *ir)
1689
2077
  }
1690
2078
  }
1691
2079
 
1692
- #if LJ_HASFFI
2080
+ #if LJ_32 && LJ_HASFFI
1693
2081
  /* 64 bit integer comparisons. */
1694
2082
  static void asm_comp64(ASMState *as, IRIns *ir)
1695
2083
  {
@@ -1731,7 +2119,7 @@ static void asm_comp64eq(ASMState *as, IRIns *ir)
1731
2119
  /* Hiword op of a split 64 bit op. Previous op must be the loword op. */
1732
2120
  static void asm_hiop(ASMState *as, IRIns *ir)
1733
2121
  {
1734
- #if LJ_HASFFI || LJ_SOFTFP
2122
+ #if LJ_32 && (LJ_HASFFI || LJ_SOFTFP)
1735
2123
  /* HIOP is marked as a store because it needs its own DCE logic. */
1736
2124
  int uselo = ra_used(ir-1), usehi = ra_used(ir); /* Loword/hiword used? */
1737
2125
  if (LJ_UNLIKELY(!(as->flags & JIT_F_OPT_DCE))) uselo = usehi = 1;
@@ -1835,36 +2223,42 @@ static void asm_stack_check(ASMState *as, BCReg topslot,
1835
2223
  Reg tmp, pbase = irp ? (ra_hasreg(irp->r) ? irp->r : RID_TMP) : RID_BASE;
1836
2224
  ExitNo oldsnap = as->snapno;
1837
2225
  rset_clear(allow, pbase);
2226
+ #if LJ_32
1838
2227
  tmp = allow ? rset_pickbot(allow) :
1839
2228
  (pbase == RID_RETHI ? RID_RETLO : RID_RETHI);
2229
+ #else
2230
+ tmp = allow ? rset_pickbot(allow) : RID_RET;
2231
+ #endif
1840
2232
  as->snapno = exitno;
1841
2233
  asm_guard(as, MIPSI_BNE, RID_TMP, RID_ZERO);
1842
2234
  as->snapno = oldsnap;
1843
2235
  if (allow == RSET_EMPTY) /* Restore temp. register. */
1844
- emit_tsi(as, MIPSI_LW, tmp, RID_SP, 0);
2236
+ emit_tsi(as, MIPSI_AL, tmp, RID_SP, 0);
1845
2237
  else
1846
2238
  ra_modified(as, tmp);
1847
2239
  emit_tsi(as, MIPSI_SLTIU, RID_TMP, RID_TMP, (int32_t)(8*topslot));
1848
- emit_dst(as, MIPSI_SUBU, RID_TMP, tmp, pbase);
1849
- emit_tsi(as, MIPSI_LW, tmp, tmp, offsetof(lua_State, maxstack));
2240
+ emit_dst(as, MIPSI_ASUBU, RID_TMP, tmp, pbase);
2241
+ emit_tsi(as, MIPSI_AL, tmp, tmp, offsetof(lua_State, maxstack));
1850
2242
  if (pbase == RID_TMP)
1851
2243
  emit_getgl(as, RID_TMP, jit_base);
1852
2244
  emit_getgl(as, tmp, cur_L);
1853
2245
  if (allow == RSET_EMPTY) /* Spill temp. register. */
1854
- emit_tsi(as, MIPSI_SW, tmp, RID_SP, 0);
2246
+ emit_tsi(as, MIPSI_AS, tmp, RID_SP, 0);
1855
2247
  }
1856
2248
 
1857
2249
  /* Restore Lua stack from on-trace state. */
1858
2250
  static void asm_stack_restore(ASMState *as, SnapShot *snap)
1859
2251
  {
1860
2252
  SnapEntry *map = &as->T->snapmap[snap->mapofs];
1861
- SnapEntry *flinks = &as->T->snapmap[snap_nextofs(as->T, snap)-1];
2253
+ #if LJ_32 || defined(LUA_USE_ASSERT)
2254
+ SnapEntry *flinks = &as->T->snapmap[snap_nextofs(as->T, snap)-1-LJ_FR2];
2255
+ #endif
1862
2256
  MSize n, nent = snap->nent;
1863
2257
  /* Store the value of all modified slots to the Lua stack. */
1864
2258
  for (n = 0; n < nent; n++) {
1865
2259
  SnapEntry sn = map[n];
1866
2260
  BCReg s = snap_slot(sn);
1867
- int32_t ofs = 8*((int32_t)s-1);
2261
+ int32_t ofs = 8*((int32_t)s-1-LJ_FR2);
1868
2262
  IRRef ref = snap_ref(sn);
1869
2263
  IRIns *ir = IR(ref);
1870
2264
  if ((sn & SNAP_NORESTORE))
@@ -1884,8 +2278,9 @@ static void asm_stack_restore(ASMState *as, SnapShot *snap)
1884
2278
  emit_hsi(as, MIPSI_SDC1, src, RID_BASE, ofs);
1885
2279
  #endif
1886
2280
  } else {
1887
- Reg type;
2281
+ #if LJ_32
1888
2282
  RegSet allow = rset_exclude(RSET_GPR, RID_BASE);
2283
+ Reg type;
1889
2284
  lua_assert(irt_ispri(ir->t) || irt_isaddr(ir->t) || irt_isinteger(ir->t));
1890
2285
  if (!irt_ispri(ir->t)) {
1891
2286
  Reg src = ra_alloc1(as, ref, allow);
@@ -1903,6 +2298,9 @@ static void asm_stack_restore(ASMState *as, SnapShot *snap)
1903
2298
  type = ra_allock(as, (int32_t)irt_toitype(ir->t), allow);
1904
2299
  }
1905
2300
  emit_tsi(as, MIPSI_SW, type, RID_BASE, ofs+(LJ_BE?0:4));
2301
+ #else
2302
+ asm_tvstore64(as, RID_BASE, ofs, ref);
2303
+ #endif
1906
2304
  }
1907
2305
  checkmclim(as);
1908
2306
  }
@@ -1926,7 +2324,7 @@ static void asm_gc_check(ASMState *as)
1926
2324
  args[0] = ASMREF_TMP1; /* global_State *g */
1927
2325
  args[1] = ASMREF_TMP2; /* MSize steps */
1928
2326
  asm_gencall(as, ci, args);
1929
- emit_tsi(as, MIPSI_ADDIU, ra_releasetmp(as, ASMREF_TMP1), RID_JGL, -32768);
2327
+ emit_tsi(as, MIPSI_AADDIU, ra_releasetmp(as, ASMREF_TMP1), RID_JGL, -32768);
1930
2328
  tmp = ra_releasetmp(as, ASMREF_TMP2);
1931
2329
  emit_loadi(as, tmp, as->gcsteps);
1932
2330
  /* Jump around GC step if GC total < GC threshold. */
@@ -2001,7 +2399,7 @@ static void asm_tail_fixup(ASMState *as, TraceNo lnk)
2001
2399
  MCode *target = lnk ? traceref(as->J,lnk)->mcode : (MCode *)lj_vm_exit_interp;
2002
2400
  int32_t spadj = as->T->spadjust;
2003
2401
  MCode *p = as->mctop-1;
2004
- *p = spadj ? (MIPSI_ADDIU|MIPSF_T(RID_SP)|MIPSF_S(RID_SP)|spadj) : MIPSI_NOP;
2402
+ *p = spadj ? (MIPSI_AADDIU|MIPSF_T(RID_SP)|MIPSF_S(RID_SP)|spadj) : MIPSI_NOP;
2005
2403
  p[-1] = MIPSI_J|(((uintptr_t)target>>2)&0x03ffffffu);
2006
2404
  }
2007
2405
 
@@ -2019,9 +2417,14 @@ static Reg asm_setup_call_slots(ASMState *as, IRIns *ir, const CCallInfo *ci)
2019
2417
  {
2020
2418
  IRRef args[CCI_NARGS_MAX*2];
2021
2419
  uint32_t i, nargs = CCI_XNARGS(ci);
2420
+ #if LJ_32
2022
2421
  int nslots = 4, ngpr = REGARG_NUMGPR, nfpr = REGARG_NUMFPR;
2422
+ #else
2423
+ int nslots = 0, ngpr = REGARG_NUMGPR;
2424
+ #endif
2023
2425
  asm_collectargs(as, ir, ci, args);
2024
2426
  for (i = 0; i < nargs; i++) {
2427
+ #if LJ_32
2025
2428
  if (!LJ_SOFTFP && args[i] && irt_isfp(IR(args[i])->t) &&
2026
2429
  nfpr > 0 && !(ci->flags & CCI_VARARG)) {
2027
2430
  nfpr--;
@@ -2034,6 +2437,9 @@ static Reg asm_setup_call_slots(ASMState *as, IRIns *ir, const CCallInfo *ci)
2034
2437
  nfpr = 0;
2035
2438
  if (ngpr > 0) ngpr--; else nslots++;
2036
2439
  }
2440
+ #else
2441
+ if (ngpr > 0) ngpr--; else nslots += 2;
2442
+ #endif
2037
2443
  }
2038
2444
  if (nslots > as->evenspill) /* Leave room for args in stack slots. */
2039
2445
  as->evenspill = nslots;