Print this page


Split Close
Expand all
Collapse all
          --- old/src/cpu/sparc/vm/assembler_sparc.hpp
          +++ new/src/cpu/sparc/vm/assembler_sparc.hpp
   1    1  /*
   2      - * Copyright 1997-2009 Sun Microsystems, Inc.  All Rights Reserved.
        2 + * Copyright 1997-2010 Sun Microsystems, Inc.  All Rights Reserved.
   3    3   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4    4   *
   5    5   * This code is free software; you can redistribute it and/or modify it
   6    6   * under the terms of the GNU General Public License version 2 only, as
   7    7   * published by the Free Software Foundation.
   8    8   *
   9    9   * This code is distributed in the hope that it will be useful, but WITHOUT
  10   10   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11   11   * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12   12   * version 2 for more details (a copy is included in the LICENSE file that
↓ open down ↓ 1363 lines elided ↑ open up ↑
1376 1376    inline void ldstub(  Register s1, Register s2, Register d );
1377 1377    inline void ldstub(  Register s1, int simm13a, Register d);
1378 1378  
1379 1379    // pp 180
1380 1380  
1381 1381    void ldstuba( Register s1, Register s2, int ia, Register d ) { emit_long( op(ldst_op) | rd(d) | op3(ldstub_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
1382 1382    void ldstuba( Register s1, int simm13a,         Register d ) { emit_long( op(ldst_op) | rd(d) | op3(ldstub_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
1383 1383  
1384 1384    // pp 181
1385 1385  
1386      -  void and3(     Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(and_op3               ) | rs1(s1) | rs2(s2) ); }
1387      -  void and3(     Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(and_op3               ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
     1386 +  void and3(    Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(and_op3              ) | rs1(s1) | rs2(s2) ); }
     1387 +  void and3(    Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(and_op3              ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
1388 1388    void andcc(   Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(and_op3  | cc_bit_op3) | rs1(s1) | rs2(s2) ); }
1389 1389    void andcc(   Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(and_op3  | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
1390 1390    void andn(    Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(andn_op3             ) | rs1(s1) | rs2(s2) ); }
1391 1391    void andn(    Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(andn_op3             ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
     1392 +  void andn(    Register s1, RegisterOrConstant s2, Register d, int offset = 0);
1392 1393    void andncc(  Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(andn_op3 | cc_bit_op3) | rs1(s1) | rs2(s2) ); }
1393 1394    void andncc(  Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(andn_op3 | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
1394      -  void or3(      Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(or_op3               ) | rs1(s1) | rs2(s2) ); }
1395      -  void or3(      Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(or_op3               ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
     1395 +  void or3(     Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(or_op3               ) | rs1(s1) | rs2(s2) ); }
     1396 +  void or3(     Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(or_op3               ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
1396 1397    void orcc(    Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(or_op3   | cc_bit_op3) | rs1(s1) | rs2(s2) ); }
1397 1398    void orcc(    Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(or_op3   | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
1398 1399    void orn(     Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(orn_op3) | rs1(s1) | rs2(s2) ); }
1399 1400    void orn(     Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(orn_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
1400 1401    void orncc(   Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(orn_op3  | cc_bit_op3) | rs1(s1) | rs2(s2) ); }
1401 1402    void orncc(   Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(orn_op3  | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
1402      -  void xor3(     Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(xor_op3              ) | rs1(s1) | rs2(s2) ); }
1403      -  void xor3(     Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(xor_op3              ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
     1403 +  void xor3(    Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(xor_op3              ) | rs1(s1) | rs2(s2) ); }
     1404 +  void xor3(    Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(xor_op3              ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
1404 1405    void xorcc(   Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(xor_op3  | cc_bit_op3) | rs1(s1) | rs2(s2) ); }
1405 1406    void xorcc(   Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(xor_op3  | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
1406 1407    void xnor(    Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(xnor_op3             ) | rs1(s1) | rs2(s2) ); }
1407 1408    void xnor(    Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(xnor_op3             ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
1408 1409    void xnorcc(  Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(xnor_op3 | cc_bit_op3) | rs1(s1) | rs2(s2) ); }
1409 1410    void xnorcc(  Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(xnor_op3 | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
1410 1411  
1411 1412    // pp 183
1412 1413  
1413 1414    void membar( Membar_mask_bits const7a ) { v9_only(); emit_long( op(arith_op) | op3(membar_op3) | rs1(O7) | immed(true) | u_field( int(const7a), 6, 0)); }
↓ open down ↓ 608 lines elided ↑ open up ↑
2022 2023    inline void st_ptr(Register d, Register s1, int simm13a);
2023 2024    inline void st_ptr(Register d, Register s1, RegisterOrConstant s2);
2024 2025    inline void st_ptr(Register d, const Address& a, int offset = 0);
2025 2026  
2026 2027  #ifdef ASSERT
2027 2028    // ByteSize is only a class when ASSERT is defined, otherwise it's an int.
2028 2029    inline void ld_ptr(Register s1, ByteSize simm13a, Register d);
2029 2030    inline void st_ptr(Register d, Register s1, ByteSize simm13a);
2030 2031  #endif
2031 2032  
2032      -  // ld_long will perform ld for 32 bit VM's and ldx for 64 bit VM's
2033      -  // st_long will perform st for 32 bit VM's and stx for 64 bit VM's
     2033 +  // ld_long will perform ldd for 32 bit VM's and ldx for 64 bit VM's
     2034 +  // st_long will perform std for 32 bit VM's and stx for 64 bit VM's
2034 2035    inline void ld_long(Register s1, Register s2, Register d);
2035 2036    inline void ld_long(Register s1, int simm13a, Register d);
2036 2037    inline void ld_long(Register s1, RegisterOrConstant s2, Register d);
2037 2038    inline void ld_long(const Address& a, Register d, int offset = 0);
2038 2039    inline void st_long(Register d, Register s1, Register s2);
2039 2040    inline void st_long(Register d, Register s1, int simm13a);
2040 2041    inline void st_long(Register d, Register s1, RegisterOrConstant s2);
2041 2042    inline void st_long(Register d, const Address& a, int offset = 0);
2042 2043  
2043 2044    // Helpers for address formation.
2044      -  // They update the dest in place, whether it is a register or constant.
2045      -  // They emit no code at all if src is a constant zero.
2046      -  // If dest is a constant and src is a register, the temp argument
2047      -  // is required, and becomes the result.
2048      -  // If dest is a register and src is a non-simm13 constant,
2049      -  // the temp argument is required, and is used to materialize the constant.
2050      -  void regcon_inc_ptr( RegisterOrConstant& dest, RegisterOrConstant src,
2051      -                       Register temp = noreg );
2052      -  void regcon_sll_ptr( RegisterOrConstant& dest, RegisterOrConstant src,
2053      -                       Register temp = noreg );
2054      -
2055      -  RegisterOrConstant ensure_simm13_or_reg(RegisterOrConstant roc, Register Rtemp) {
2056      -    guarantee(Rtemp != noreg, "constant offset overflow");
2057      -    if (is_simm13(roc.constant_or_zero()))
2058      -      return roc;               // register or short constant
2059      -    set(roc.as_constant(), Rtemp);
2060      -    return RegisterOrConstant(Rtemp);
     2045 +  // - They emit only a move if s2 is a constant zero.
     2046 +  // - If dest is a constant and either s1 or s2 is a register, the temp argument is required and becomes the result.
     2047 +  // - If dest is a register and either s1 or s2 is a non-simm13 constant, the temp argument is required and used to materialize the constant.
     2048 +  RegisterOrConstant regcon_andn_ptr(RegisterOrConstant s1, RegisterOrConstant s2, RegisterOrConstant d, Register temp = noreg);
     2049 +  RegisterOrConstant regcon_inc_ptr( RegisterOrConstant s1, RegisterOrConstant s2, RegisterOrConstant d, Register temp = noreg);
     2050 +  RegisterOrConstant regcon_sll_ptr( RegisterOrConstant s1, RegisterOrConstant s2, RegisterOrConstant d, Register temp = noreg);
     2051 +
     2052 +  RegisterOrConstant ensure_simm13_or_reg(RegisterOrConstant src, Register temp) {
     2053 +    if (is_simm13(src.constant_or_zero()))
     2054 +      return src;               // register or short constant
     2055 +    guarantee(temp != noreg, "constant offset overflow");
     2056 +    set(src.as_constant(), temp);
     2057 +    return temp;
2061 2058    }
2062 2059  
2063 2060    // --------------------------------------------------
2064 2061  
2065 2062   public:
2066 2063    // traps as per trap.h (SPARC ABI?)
2067 2064  
2068 2065    void breakpoint_trap();
2069 2066    void breakpoint_trap(Condition c, CC cc = icc);
2070 2067    void flush_windows_trap();
↓ open down ↓ 228 lines elided ↑ open up ↑
2299 2296    void lshr(  Register Rin_high,  Register Rin_low,  Register Rcount,
2300 2297                Register Rout_high, Register Rout_low, Register Rtemp );
2301 2298  
2302 2299    void lushr( Register Rin_high,  Register Rin_low,  Register Rcount,
2303 2300                Register Rout_high, Register Rout_low, Register Rtemp );
2304 2301  
2305 2302  #ifdef _LP64
2306 2303    void lcmp( Register Ra, Register Rb, Register Rresult);
2307 2304  #endif
2308 2305  
     2306 +  // Loading values by size and signed-ness
     2307 +  void load_sized_value(Address src, Register dst, int size_in_bytes, bool is_signed);
     2308 +
2309 2309    void float_cmp( bool is_float, int unordered_result,
2310 2310                    FloatRegister Fa, FloatRegister Fb,
2311 2311                    Register Rresult);
2312 2312  
2313 2313    void fneg( FloatRegisterImpl::Width w, FloatRegister s, FloatRegister d);
2314 2314    void fneg( FloatRegisterImpl::Width w, FloatRegister sd ) { Assembler::fneg(w, sd); }
2315 2315    void fmov( FloatRegisterImpl::Width w, FloatRegister s, FloatRegister d);
2316 2316    void fabs( FloatRegisterImpl::Width w, FloatRegister s, FloatRegister d);
2317 2317  
2318 2318    void save_all_globals_into_locals();
↓ open down ↓ 98 lines elided ↑ open up ↑
2417 2417    void check_klass_subtype(Register sub_klass,
2418 2418                             Register super_klass,
2419 2419                             Register temp_reg,
2420 2420                             Register temp2_reg,
2421 2421                             Label& L_success);
2422 2422  
2423 2423    // method handles (JSR 292)
2424 2424    void check_method_handle_type(Register mtype_reg, Register mh_reg,
2425 2425                                  Register temp_reg,
2426 2426                                  Label& wrong_method_type);
2427      -  void jump_to_method_handle_entry(Register mh_reg, Register temp_reg);
     2427 +  void load_method_handle_vmslots(Register vmslots_reg, Register mh_reg,
     2428 +                                  Register temp_reg);
     2429 +  void jump_to_method_handle_entry(Register mh_reg, Register temp_reg, bool emit_delayed_nop = true);
2428 2430    // offset relative to Gargs of argument at tos[arg_slot].
2429 2431    // (arg_slot == 0 means the last argument, not the first).
2430 2432    RegisterOrConstant argument_offset(RegisterOrConstant arg_slot,
2431 2433                                       int extra_slot_offset = 0);
2432      -
     2434 +  // Address of Gargs and argument_offset.
     2435 +  Address            argument_address(RegisterOrConstant arg_slot,
     2436 +                                      int extra_slot_offset = 0);
2433 2437  
2434 2438    // Stack overflow checking
2435 2439  
2436 2440    // Note: this clobbers G3_scratch
2437 2441    void bang_stack_with_offset(int offset) {
2438 2442      // stack grows down, caller passes positive offset
2439 2443      assert(offset > 0, "must bang with negative offset");
2440 2444      set((-offset)+STACK_BIAS, G3_scratch);
2441 2445      st(G0, SP, G3_scratch);
2442 2446    }
↓ open down ↓ 51 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX