1.1 --- a/src/share/vm/c1/c1_LIR.hpp Tue Aug 26 15:49:40 2008 -0700 1.2 +++ b/src/share/vm/c1/c1_LIR.hpp Wed Aug 27 00:21:55 2008 -0700 1.3 @@ -135,6 +135,13 @@ 1.4 return as_jint_hi(); 1.5 } 1.6 } 1.7 + jlong as_jlong_bits() const { 1.8 + if (type() == T_DOUBLE) { 1.9 + return jlong_cast(_value.get_jdouble()); 1.10 + } else { 1.11 + return as_jlong(); 1.12 + } 1.13 + } 1.14 1.15 virtual void print_value_on(outputStream* out) const PRODUCT_RETURN; 1.16 1.17 @@ -302,6 +309,7 @@ 1.18 1.19 default: 1.20 ShouldNotReachHere(); 1.21 + return single_size; 1.22 } 1.23 } 1.24 1.25 @@ -417,12 +425,12 @@ 1.26 return as_register(); 1.27 } 1.28 1.29 -#ifdef IA32 1.30 +#ifdef X86 1.31 XMMRegister as_xmm_float_reg() const; 1.32 XMMRegister as_xmm_double_reg() const; 1.33 // for compatibility with RInfo 1.34 int fpu () const { return lo_reg_half(); } 1.35 -#endif 1.36 +#endif // X86 1.37 1.38 #ifdef SPARC 1.39 FloatRegister as_float_reg () const; 1.40 @@ -503,14 +511,14 @@ 1.41 , _type(type) 1.42 , _disp(disp) { verify(); } 1.43 1.44 -#ifdef IA32 1.45 +#ifdef X86 1.46 LIR_Address(LIR_Opr base, LIR_Opr index, Scale scale, int disp, BasicType type): 1.47 _base(base) 1.48 , _index(index) 1.49 , _scale(scale) 1.50 , _type(type) 1.51 , _disp(disp) { verify(); } 1.52 -#endif 1.53 +#endif // X86 1.54 1.55 LIR_Opr base() const { return _base; } 1.56 LIR_Opr index() const { return _index; } 1.57 @@ -535,31 +543,93 @@ 1.58 1.59 static LIR_Opr illegalOpr; 1.60 1.61 - static LIR_Opr single_cpu(int reg) { return (LIR_Opr)((reg << LIR_OprDesc::reg1_shift) | LIR_OprDesc::int_type | LIR_OprDesc::cpu_register | LIR_OprDesc::single_size); } 1.62 - static LIR_Opr single_cpu_oop(int reg) { return (LIR_Opr)((reg << LIR_OprDesc::reg1_shift) | LIR_OprDesc::object_type | LIR_OprDesc::cpu_register | LIR_OprDesc::single_size); } 1.63 - static LIR_Opr double_cpu(int reg1, int reg2) { return (LIR_Opr)((reg1 << LIR_OprDesc::reg1_shift) | (reg2 << LIR_OprDesc::reg2_shift) | LIR_OprDesc::long_type | LIR_OprDesc::cpu_register | LIR_OprDesc::double_size); } 1.64 + static LIR_Opr single_cpu(int reg) { return (LIR_Opr)(intptr_t)((reg << LIR_OprDesc::reg1_shift) | LIR_OprDesc::int_type | LIR_OprDesc::cpu_register | LIR_OprDesc::single_size); } 1.65 + static LIR_Opr single_cpu_oop(int reg) { return (LIR_Opr)(intptr_t)((reg << LIR_OprDesc::reg1_shift) | LIR_OprDesc::object_type | LIR_OprDesc::cpu_register | LIR_OprDesc::single_size); } 1.66 + static LIR_Opr double_cpu(int reg1, int reg2) { 1.67 + LP64_ONLY(assert(reg1 == reg2, "must be identical")); 1.68 + return (LIR_Opr)(intptr_t)((reg1 << LIR_OprDesc::reg1_shift) | 1.69 + (reg2 << LIR_OprDesc::reg2_shift) | 1.70 + LIR_OprDesc::long_type | 1.71 + LIR_OprDesc::cpu_register | 1.72 + LIR_OprDesc::double_size); 1.73 + } 1.74 1.75 - static LIR_Opr single_fpu(int reg) { return (LIR_Opr)((reg << LIR_OprDesc::reg1_shift) | LIR_OprDesc::float_type | LIR_OprDesc::fpu_register | LIR_OprDesc::single_size); } 1.76 + static LIR_Opr single_fpu(int reg) { return (LIR_Opr)(intptr_t)((reg << LIR_OprDesc::reg1_shift) | 1.77 + LIR_OprDesc::float_type | 1.78 + LIR_OprDesc::fpu_register | 1.79 + LIR_OprDesc::single_size); } 1.80 1.81 #ifdef SPARC 1.82 - static LIR_Opr double_fpu(int reg1, int reg2) { return (LIR_Opr)((reg1 << LIR_OprDesc::reg1_shift) | (reg2 << LIR_OprDesc::reg2_shift) | LIR_OprDesc::double_type | LIR_OprDesc::fpu_register | LIR_OprDesc::double_size); } 1.83 + static LIR_Opr double_fpu(int reg1, int reg2) { return (LIR_Opr)(intptr_t)((reg1 << LIR_OprDesc::reg1_shift) | 1.84 + (reg2 << LIR_OprDesc::reg2_shift) | 1.85 + LIR_OprDesc::double_type | 1.86 + LIR_OprDesc::fpu_register | 1.87 + LIR_OprDesc::double_size); } 1.88 #endif 1.89 -#ifdef IA32 1.90 - static LIR_Opr double_fpu(int reg) { return (LIR_Opr)((reg << LIR_OprDesc::reg1_shift) | (reg << LIR_OprDesc::reg2_shift) | LIR_OprDesc::double_type | LIR_OprDesc::fpu_register | LIR_OprDesc::double_size); } 1.91 - static LIR_Opr single_xmm(int reg) { return (LIR_Opr)((reg << LIR_OprDesc::reg1_shift) | LIR_OprDesc::float_type | LIR_OprDesc::fpu_register | LIR_OprDesc::single_size | LIR_OprDesc::is_xmm_mask); } 1.92 - static LIR_Opr double_xmm(int reg) { return (LIR_Opr)((reg << LIR_OprDesc::reg1_shift) | (reg << LIR_OprDesc::reg2_shift) | LIR_OprDesc::double_type | LIR_OprDesc::fpu_register | LIR_OprDesc::double_size | LIR_OprDesc::is_xmm_mask); } 1.93 -#endif 1.94 +#ifdef X86 1.95 + static LIR_Opr double_fpu(int reg) { return (LIR_Opr)(intptr_t)((reg << LIR_OprDesc::reg1_shift) | 1.96 + (reg << LIR_OprDesc::reg2_shift) | 1.97 + LIR_OprDesc::double_type | 1.98 + LIR_OprDesc::fpu_register | 1.99 + LIR_OprDesc::double_size); } 1.100 + 1.101 + static LIR_Opr single_xmm(int reg) { return (LIR_Opr)(intptr_t)((reg << LIR_OprDesc::reg1_shift) | 1.102 + LIR_OprDesc::float_type | 1.103 + LIR_OprDesc::fpu_register | 1.104 + LIR_OprDesc::single_size | 1.105 + LIR_OprDesc::is_xmm_mask); } 1.106 + static LIR_Opr double_xmm(int reg) { return (LIR_Opr)(intptr_t)((reg << LIR_OprDesc::reg1_shift) | 1.107 + (reg << LIR_OprDesc::reg2_shift) | 1.108 + LIR_OprDesc::double_type | 1.109 + LIR_OprDesc::fpu_register | 1.110 + LIR_OprDesc::double_size | 1.111 + LIR_OprDesc::is_xmm_mask); } 1.112 +#endif // X86 1.113 1.114 1.115 static LIR_Opr virtual_register(int index, BasicType type) { 1.116 LIR_Opr res; 1.117 switch (type) { 1.118 case T_OBJECT: // fall through 1.119 - case T_ARRAY: res = (LIR_Opr)((index << LIR_OprDesc::data_shift) | LIR_OprDesc::object_type | LIR_OprDesc::cpu_register | LIR_OprDesc::single_size | LIR_OprDesc::virtual_mask); break; 1.120 - case T_INT: res = (LIR_Opr)((index << LIR_OprDesc::data_shift) | LIR_OprDesc::int_type | LIR_OprDesc::cpu_register | LIR_OprDesc::single_size | LIR_OprDesc::virtual_mask); break; 1.121 - case T_LONG: res = (LIR_Opr)((index << LIR_OprDesc::data_shift) | LIR_OprDesc::long_type | LIR_OprDesc::cpu_register | LIR_OprDesc::double_size | LIR_OprDesc::virtual_mask); break; 1.122 - case T_FLOAT: res = (LIR_Opr)((index << LIR_OprDesc::data_shift) | LIR_OprDesc::float_type | LIR_OprDesc::fpu_register | LIR_OprDesc::single_size | LIR_OprDesc::virtual_mask); break; 1.123 - case T_DOUBLE: res = (LIR_Opr)((index << LIR_OprDesc::data_shift) | LIR_OprDesc::double_type | LIR_OprDesc::fpu_register | LIR_OprDesc::double_size | LIR_OprDesc::virtual_mask); break; 1.124 + case T_ARRAY: 1.125 + res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) | 1.126 + LIR_OprDesc::object_type | 1.127 + LIR_OprDesc::cpu_register | 1.128 + LIR_OprDesc::single_size | 1.129 + LIR_OprDesc::virtual_mask); 1.130 + break; 1.131 + 1.132 + case T_INT: 1.133 + res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) | 1.134 + LIR_OprDesc::int_type | 1.135 + LIR_OprDesc::cpu_register | 1.136 + LIR_OprDesc::single_size | 1.137 + LIR_OprDesc::virtual_mask); 1.138 + break; 1.139 + 1.140 + case T_LONG: 1.141 + res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) | 1.142 + LIR_OprDesc::long_type | 1.143 + LIR_OprDesc::cpu_register | 1.144 + LIR_OprDesc::double_size | 1.145 + LIR_OprDesc::virtual_mask); 1.146 + break; 1.147 + 1.148 + case T_FLOAT: 1.149 + res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) | 1.150 + LIR_OprDesc::float_type | 1.151 + LIR_OprDesc::fpu_register | 1.152 + LIR_OprDesc::single_size | 1.153 + LIR_OprDesc::virtual_mask); 1.154 + break; 1.155 + 1.156 + case 1.157 + T_DOUBLE: res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) | 1.158 + LIR_OprDesc::double_type | 1.159 + LIR_OprDesc::fpu_register | 1.160 + LIR_OprDesc::double_size | 1.161 + LIR_OprDesc::virtual_mask); 1.162 + break; 1.163 1.164 default: ShouldNotReachHere(); res = illegalOpr; 1.165 } 1.166 @@ -572,8 +642,8 @@ 1.167 1.168 // old-style calculation; check if old and new method are equal 1.169 LIR_OprDesc::OprType t = as_OprType(type); 1.170 - LIR_Opr old_res = (LIR_Opr)((index << LIR_OprDesc::data_shift) | t | 1.171 - ((type == T_FLOAT || type == T_DOUBLE) ? LIR_OprDesc::fpu_register : LIR_OprDesc::cpu_register) | 1.172 + LIR_Opr old_res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) | t | 1.173 + ((type == T_FLOAT || type == T_DOUBLE) ? LIR_OprDesc::fpu_register : LIR_OprDesc::cpu_register) | 1.174 LIR_OprDesc::size_for(type) | LIR_OprDesc::virtual_mask); 1.175 assert(res == old_res, "old and new method not equal"); 1.176 #endif 1.177 @@ -588,11 +658,39 @@ 1.178 LIR_Opr res; 1.179 switch (type) { 1.180 case T_OBJECT: // fall through 1.181 - case T_ARRAY: res = (LIR_Opr)((index << LIR_OprDesc::data_shift) | LIR_OprDesc::object_type | LIR_OprDesc::stack_value | LIR_OprDesc::single_size); break; 1.182 - case T_INT: res = (LIR_Opr)((index << LIR_OprDesc::data_shift) | LIR_OprDesc::int_type | LIR_OprDesc::stack_value | LIR_OprDesc::single_size); break; 1.183 - case T_LONG: res = (LIR_Opr)((index << LIR_OprDesc::data_shift) | LIR_OprDesc::long_type | LIR_OprDesc::stack_value | LIR_OprDesc::double_size); break; 1.184 - case T_FLOAT: res = (LIR_Opr)((index << LIR_OprDesc::data_shift) | LIR_OprDesc::float_type | LIR_OprDesc::stack_value | LIR_OprDesc::single_size); break; 1.185 - case T_DOUBLE: res = (LIR_Opr)((index << LIR_OprDesc::data_shift) | LIR_OprDesc::double_type | LIR_OprDesc::stack_value | LIR_OprDesc::double_size); break; 1.186 + case T_ARRAY: 1.187 + res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) | 1.188 + LIR_OprDesc::object_type | 1.189 + LIR_OprDesc::stack_value | 1.190 + LIR_OprDesc::single_size); 1.191 + break; 1.192 + 1.193 + case T_INT: 1.194 + res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) | 1.195 + LIR_OprDesc::int_type | 1.196 + LIR_OprDesc::stack_value | 1.197 + LIR_OprDesc::single_size); 1.198 + break; 1.199 + 1.200 + case T_LONG: 1.201 + res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) | 1.202 + LIR_OprDesc::long_type | 1.203 + LIR_OprDesc::stack_value | 1.204 + LIR_OprDesc::double_size); 1.205 + break; 1.206 + 1.207 + case T_FLOAT: 1.208 + res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) | 1.209 + LIR_OprDesc::float_type | 1.210 + LIR_OprDesc::stack_value | 1.211 + LIR_OprDesc::single_size); 1.212 + break; 1.213 + case T_DOUBLE: 1.214 + res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) | 1.215 + LIR_OprDesc::double_type | 1.216 + LIR_OprDesc::stack_value | 1.217 + LIR_OprDesc::double_size); 1.218 + break; 1.219 1.220 default: ShouldNotReachHere(); res = illegalOpr; 1.221 } 1.222 @@ -601,7 +699,10 @@ 1.223 assert(index >= 0, "index must be positive"); 1.224 assert(index <= (max_jint >> LIR_OprDesc::data_shift), "index is too big"); 1.225 1.226 - LIR_Opr old_res = (LIR_Opr)((index << LIR_OprDesc::data_shift) | LIR_OprDesc::stack_value | as_OprType(type) | LIR_OprDesc::size_for(type)); 1.227 + LIR_Opr old_res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) | 1.228 + LIR_OprDesc::stack_value | 1.229 + as_OprType(type) | 1.230 + LIR_OprDesc::size_for(type)); 1.231 assert(res == old_res, "old and new method not equal"); 1.232 #endif 1.233