src/share/vm/c1/c1_LIR.hpp

changeset 739
dc7f315e41f7
parent 435
a61af66fc99e
child 772
9ee9cf798b59
     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  

mercurial