X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Fmini-amd64.c;h=6b4949170d60e39e13c618a5499ebc2e60bbccf7;hb=dd8aadfd5840df8cd88479d6cb81622a6d6cae1e;hp=6dec1e35442eac4276b04a8817929fe6a3151448;hpb=736ffe64c5a43fa61697ef88948c91540d02d71d;p=mono.git diff --git a/mono/mini/mini-amd64.c b/mono/mini/mini-amd64.c index 6dec1e35442..6b4949170d6 100644 --- a/mono/mini/mini-amd64.c +++ b/mono/mini/mini-amd64.c @@ -4831,6 +4831,28 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) amd64_pop_reg (code, AMD64_RDI); break; } + case OP_GENERIC_CLASS_INIT: { + static int byte_offset = -1; + static guint8 bitmask; + guint8 *jump; + + g_assert (ins->sreg1 == MONO_AMD64_ARG_REG1); + + if (byte_offset < 0) + mono_marshal_find_bitfield_offset (MonoVTable, initialized, &byte_offset, &bitmask); + + amd64_test_membase_imm_size (code, ins->sreg1, byte_offset, bitmask, 1); + jump = code; + amd64_branch8 (code, X86_CC_NZ, -1, 1); + + code = emit_call (cfg, code, MONO_PATCH_INFO_JIT_ICALL_ADDR, "specific_trampoline_generic_class_init", FALSE); + ins->flags |= MONO_INST_GC_CALLSITE; + ins->backend.pc_offset = code - cfg->native_code; + + x86_patch (jump, code); + break; + } + case OP_X86_LEA: amd64_lea_memindex (code, ins->dreg, ins->sreg1, ins->inst_imm, ins->sreg2, ins->backend.shift_amount); break;