- static guint8* start;
- guint8 *code;
- guint64 throw_ex;
-
- start = code = mono_global_codeman_reserve (64);
-
- *ji = NULL;
-
- /* Push throw_ip */
- amd64_push_reg (code, AMD64_ARG_REG2);
-
- /* Call exception_from_token */
- amd64_mov_reg_reg (code, AMD64_ARG_REG2, AMD64_ARG_REG1, 8);
- if (aot) {
- *ji = mono_patch_info_list_prepend (*ji, code - start, MONO_PATCH_INFO_IMAGE, mono_defaults.exception_class->image);
- amd64_mov_reg_membase (code, AMD64_ARG_REG1, AMD64_RIP, 0, 8);
- *ji = mono_patch_info_list_prepend (*ji, code - start, MONO_PATCH_INFO_JIT_ICALL_ADDR, "mono_exception_from_token");
- amd64_mov_reg_membase (code, AMD64_R11, AMD64_RIP, 0, 8);
- } else {
- amd64_mov_reg_imm (code, AMD64_ARG_REG1, mono_defaults.exception_class->image);
- amd64_mov_reg_imm (code, AMD64_R11, mono_exception_from_token);
- }
-#ifdef PLATFORM_WIN32
- amd64_alu_reg_imm (code, X86_SUB, AMD64_RSP, 32);
-#endif
- amd64_call_reg (code, AMD64_R11);
-#ifdef PLATFORM_WIN32
- amd64_alu_reg_imm (code, X86_ADD, AMD64_RSP, 32);
-#endif
-
- /* Compute throw_ip */
- amd64_pop_reg (code, AMD64_ARG_REG2);
- /* return addr */
- amd64_pop_reg (code, AMD64_ARG_REG3);
- amd64_alu_reg_reg (code, X86_SUB, AMD64_ARG_REG3, AMD64_ARG_REG2);
-
- /* Put the throw_ip at the top of the misaligned stack */
- amd64_push_reg (code, AMD64_ARG_REG3);
-
- throw_ex = (guint64)mono_get_throw_exception ();
-
- /* Call throw_exception */
- amd64_mov_reg_reg (code, AMD64_ARG_REG1, AMD64_RAX, 8);
- if (aot) {
- *ji = mono_patch_info_list_prepend (*ji, code - start, MONO_PATCH_INFO_JIT_ICALL_ADDR, "mono_throw_exception");
- amd64_mov_reg_membase (code, AMD64_R11, AMD64_RIP, 0, 8);
- } else {
- amd64_mov_reg_imm (code, AMD64_R11, throw_ex);
- }
- /* The original IP is on the stack */
- amd64_jump_reg (code, AMD64_R11);
-
- g_assert ((code - start) < 64);
-
- mono_arch_flush_icache (start, code - start);
-
- *code_size = code - start;
-
- return start;