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