comparison hotspot/src/cpu/x86/vm/icBuffer_x86.cpp @ 42650:1f304d0c888b

8171008: Integrate AOT compiler into JDK Reviewed-by: erikj, mchung, psandoz, coleenp, iklam, stefank, simonis Contributed-by: Bharadwaj Yadavalli <bharadwaj.yadavalli@oracle.com>, Christian Thalinger <cthalinger@twitter.com>, Dean Long <dean.long@oracle.com>, Dmitrij Pochepko <dmitrij.pochepko@oracle.com>, Dmitry Chuyko <dmitry.chuyko@oracle.com>, Doug Simon <doug.simon@oracle.com>, Eric Caspole <eric.caspole@oracle.com>, Igor Ignatyev <igor.ignatyev@oracle.com>, Igor Veresov <igor.veresov@oracle.com>, John Rose <john.r.rose@oracle.com>, Morris Meyer <morris.meyer@oracle.com>, Niclas Adlertz <niclas.adlertz@oracle.com>, Rickard Backman <rickard.backman@oracle.com>
author kvn
date Sun, 11 Dec 2016 19:07:04 -0800
parents fec48bf5a827
children
comparison
equal deleted inserted replaced
6:c39a76ff878a 7:6dcbe05aa74c
31 #include "memory/resourceArea.hpp" 31 #include "memory/resourceArea.hpp"
32 #include "nativeInst_x86.hpp" 32 #include "nativeInst_x86.hpp"
33 #include "oops/oop.inline.hpp" 33 #include "oops/oop.inline.hpp"
34 34
35 int InlineCacheBuffer::ic_stub_code_size() { 35 int InlineCacheBuffer::ic_stub_code_size() {
36 return NativeMovConstReg::instruction_size + 36 // Worst case, if destination is not a near call:
37 NativeJump::instruction_size + 37 // lea rax, lit1
38 1; 38 // lea scratch, lit2
39 // so that code_end can be set in CodeBuffer 39 // jmp scratch
40 // 64bit 16 = 5 + 10 bytes + 1 byte 40
41 // 32bit 11 = 10 bytes + 1 byte 41 // Best case
42 // lea rax, lit1
43 // jmp lit2
44
45 int best = NativeMovConstReg::instruction_size + NativeJump::instruction_size;
46 int worst = 2 * NativeMovConstReg::instruction_size + 3;
47 return MAX2(best, worst);
42 } 48 }
43 49
44 50
45 51
46 void InlineCacheBuffer::assemble_ic_buffer_code(address code_begin, void* cached_value, address entry_point) { 52 void InlineCacheBuffer::assemble_ic_buffer_code(address code_begin, void* cached_value, address entry_point) {
57 } 63 }
58 64
59 65
60 address InlineCacheBuffer::ic_buffer_entry_point(address code_begin) { 66 address InlineCacheBuffer::ic_buffer_entry_point(address code_begin) {
61 NativeMovConstReg* move = nativeMovConstReg_at(code_begin); // creation also verifies the object 67 NativeMovConstReg* move = nativeMovConstReg_at(code_begin); // creation also verifies the object
62 NativeJump* jump = nativeJump_at(move->next_instruction_address()); 68 address jmp = move->next_instruction_address();
63 return jump->jump_destination(); 69 NativeInstruction* ni = nativeInstruction_at(jmp);
70 if (ni->is_jump()) {
71 NativeJump* jump = nativeJump_at(jmp);
72 return jump->jump_destination();
73 } else {
74 assert(ni->is_far_jump(), "unexpected instruction");
75 NativeFarJump* jump = nativeFarJump_at(jmp);
76 return jump->jump_destination();
77 }
64 } 78 }
65 79
66 80
67 void* InlineCacheBuffer::ic_buffer_cached_value(address code_begin) { 81 void* InlineCacheBuffer::ic_buffer_cached_value(address code_begin) {
68 // creation also verifies the object 82 // creation also verifies the object
69 NativeMovConstReg* move = nativeMovConstReg_at(code_begin); 83 NativeMovConstReg* move = nativeMovConstReg_at(code_begin);
70 // Verifies the jump 84 // Verifies the jump
71 NativeJump* jump = nativeJump_at(move->next_instruction_address()); 85 address jmp = move->next_instruction_address();
86 NativeInstruction* ni = nativeInstruction_at(jmp);
87 if (ni->is_jump()) {
88 NativeJump* jump = nativeJump_at(jmp);
89 } else {
90 assert(ni->is_far_jump(), "unexpected instruction");
91 NativeFarJump* jump = nativeFarJump_at(jmp);
92 }
72 void* o = (void*)move->data(); 93 void* o = (void*)move->data();
73 return o; 94 return o;
74 } 95 }