Mercurial > hg > graal-jvmci-8
comparison src/share/vm/c1x/c1x_CodeInstaller.cpp @ 1468:e4cd5d2de7e1
Changes to sync with CRI changes.
author | Doug Simon <doug.simon@oracle.com> |
---|---|
date | Fri, 19 Nov 2010 00:26:51 +0100 |
parents | 2c754f3a2722 |
children | 52bb06250d35 |
comparison
equal
deleted
inserted
replaced
1467:c0de7306803c | 1468:e4cd5d2de7e1 |
---|---|
31 bool OOP_ALLOWED[] = {true, true, true, true, false, false, true, true, true, true, false, true, true, true, true, true}; | 31 bool OOP_ALLOWED[] = {true, true, true, true, false, false, true, true, true, true, false, true, true, true, true, true}; |
32 const static int NUM_CPU_REGS = sizeof(CPU_REGS) / sizeof(Register); | 32 const static int NUM_CPU_REGS = sizeof(CPU_REGS) / sizeof(Register); |
33 XMMRegister XMM_REGS[] = { xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15 }; | 33 XMMRegister XMM_REGS[] = { xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15 }; |
34 const static int NUM_XMM_REGS = sizeof(XMM_REGS) / sizeof(XMMRegister); | 34 const static int NUM_XMM_REGS = sizeof(XMM_REGS) / sizeof(XMMRegister); |
35 const static int NUM_REGS = NUM_CPU_REGS + NUM_XMM_REGS; | 35 const static int NUM_REGS = NUM_CPU_REGS + NUM_XMM_REGS; |
36 const static jlong NO_REF_MAP = 0x8000000000000000L; | |
36 | 37 |
37 // convert c1x register indices (as used in oop maps) to hotspot registers | 38 // convert c1x register indices (as used in oop maps) to hotspot registers |
38 VMReg get_hotspot_reg(jint c1x_reg) { | 39 VMReg get_hotspot_reg(jint c1x_reg) { |
39 | 40 |
40 assert(c1x_reg >= 0 && c1x_reg < NUM_REGS, "invalid register number"); | 41 assert(c1x_reg >= 0 && c1x_reg < NUM_REGS, "invalid register number"); |
46 } | 47 } |
47 | 48 |
48 // creates a hotspot oop map out of the byte arrays provided by CiDebugInfo | 49 // creates a hotspot oop map out of the byte arrays provided by CiDebugInfo |
49 static OopMap* create_oop_map(jint frame_size, jint parameter_count, oop debug_info) { | 50 static OopMap* create_oop_map(jint frame_size, jint parameter_count, oop debug_info) { |
50 OopMap* map = new OopMap(frame_size, parameter_count); | 51 OopMap* map = new OopMap(frame_size, parameter_count); |
51 arrayOop register_map = (arrayOop) CiDebugInfo::registerRefMap(debug_info); | 52 jlong register_map = CiDebugInfo::registerRefMap(debug_info); |
52 arrayOop frame_map = (arrayOop) CiDebugInfo::frameRefMap(debug_info); | 53 oop frame_map = (oop) CiDebugInfo::frameRefMap(debug_info); |
53 | 54 |
54 if (register_map != NULL) { | 55 assert(sizeof(register_map) * 8 >= (unsigned) NUM_CPU_REGS, "unexpected register_map length"); |
55 assert(register_map->length() == (NUM_CPU_REGS + 7) / 8, "unexpected register_map length"); | 56 if (register_map != NO_REF_MAP) { |
56 | |
57 for (jint i = 0; i < NUM_CPU_REGS; i++) { | 57 for (jint i = 0; i < NUM_CPU_REGS; i++) { |
58 unsigned char byte = ((unsigned char*) register_map->base(T_BYTE))[i / 8]; | 58 bool is_oop = (register_map & (1L << i)) != 0; |
59 bool is_oop = (byte & (1 << (i % 8))) != 0; | |
60 VMReg reg = get_hotspot_reg(i); | 59 VMReg reg = get_hotspot_reg(i); |
61 if (is_oop) { | 60 if (is_oop) { |
62 assert(OOP_ALLOWED[i], "this register may never be an oop, register map misaligned?"); | 61 assert(OOP_ALLOWED[i], "this register may never be an oop, register map misaligned?"); |
63 map->set_oop(reg); | 62 map->set_oop(reg); |
64 } else { | 63 } else { |
66 } | 65 } |
67 } | 66 } |
68 } | 67 } |
69 | 68 |
70 if (frame_size > 0) { | 69 if (frame_size > 0) { |
71 assert(frame_map->length() == ((frame_size / HeapWordSize) + 7) / 8, "unexpected frame_map length"); | 70 assert(CiBitMap::size(frame_map) == frame_size / HeapWordSize, "unexpected frame_map length"); |
72 | 71 |
73 for (jint i = 0; i < frame_size / HeapWordSize; i++) { | 72 for (jint i = 0; i < frame_size / HeapWordSize; i++) { |
74 unsigned char byte = ((unsigned char*) frame_map->base(T_BYTE))[i / 8]; | 73 bool is_oop; |
75 bool is_oop = (byte & (1 << (i % 8))) != 0; | 74 if (i < 64) { |
75 jlong low = CiBitMap::low(frame_map); | |
76 is_oop = (low & (1 << i)) != 0; | |
77 } else { | |
78 const unsigned int MapWordBits = 64; | |
79 jint extra_idx = (i - MapWordBits) / MapWordBits; | |
80 arrayOop extra = (arrayOop) CiBitMap::extra(frame_map); | |
81 assert(extra_idx >= 0 && extra_idx < extra->length(), "unexpected index"); | |
82 jlong word = ((jlong*) extra->base(T_LONG))[extra_idx]; | |
83 is_oop = (word & (1 << (i % MapWordBits))) != 0; | |
84 } | |
76 // hotspot stack slots are 4 bytes | 85 // hotspot stack slots are 4 bytes |
77 VMReg reg = VMRegImpl::stack2reg(i * 2); | 86 VMReg reg = VMRegImpl::stack2reg(i * 2); |
78 if (is_oop) { | 87 if (is_oop) { |
79 map->set_oop(reg); | 88 map->set_oop(reg); |
80 } else { | 89 } else { |
81 map->set_value(reg); | 90 map->set_value(reg); |
82 } | 91 } |
83 } | 92 } |
84 } else { | 93 } else { |
85 assert(frame_map == NULL || frame_map->length() == 0, "cannot have frame_map for frames with size 0"); | 94 assert(frame_map == NULL || CiBitMap::size(frame_map) == 0, "cannot have frame_map for frames with size 0"); |
86 } | 95 } |
87 | 96 |
88 return map; | 97 return map; |
89 } | 98 } |
90 | 99 |