src/cpu/sparc/vm/assembler_sparc.hpp

changeset 1868
df736661d0c8
parent 1846
befdf73d6b82
parent 1858
c640000b7cc1
child 1902
fb1a39993f69
child 1919
61b2245abf36
     1.1 --- a/src/cpu/sparc/vm/assembler_sparc.hpp	Mon May 10 14:58:38 2010 -0700
     1.2 +++ b/src/cpu/sparc/vm/assembler_sparc.hpp	Tue May 11 15:19:19 2010 -0700
     1.3 @@ -1,5 +1,5 @@
     1.4  /*
     1.5 - * Copyright 1997-2009 Sun Microsystems, Inc.  All Rights Reserved.
     1.6 + * Copyright 1997-2010 Sun Microsystems, Inc.  All Rights Reserved.
     1.7   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     1.8   *
     1.9   * This code is free software; you can redistribute it and/or modify it
    1.10 @@ -1380,24 +1380,25 @@
    1.11  
    1.12    // pp 181
    1.13  
    1.14 -  void and3(     Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(and_op3               ) | rs1(s1) | rs2(s2) ); }
    1.15 -  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) ); }
    1.16 +  void and3(    Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(and_op3              ) | rs1(s1) | rs2(s2) ); }
    1.17 +  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) ); }
    1.18    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) ); }
    1.19    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) ); }
    1.20    void andn(    Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(andn_op3             ) | rs1(s1) | rs2(s2) ); }
    1.21    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) ); }
    1.22 +  void andn(    Register s1, RegisterOrConstant s2, Register d);
    1.23    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) ); }
    1.24    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) ); }
    1.25 -  void or3(      Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(or_op3               ) | rs1(s1) | rs2(s2) ); }
    1.26 -  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) ); }
    1.27 +  void or3(     Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(or_op3               ) | rs1(s1) | rs2(s2) ); }
    1.28 +  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) ); }
    1.29    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) ); }
    1.30    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) ); }
    1.31    void orn(     Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(orn_op3) | rs1(s1) | rs2(s2) ); }
    1.32    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) ); }
    1.33    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) ); }
    1.34    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) ); }
    1.35 -  void xor3(     Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(xor_op3              ) | rs1(s1) | rs2(s2) ); }
    1.36 -  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) ); }
    1.37 +  void xor3(    Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(xor_op3              ) | rs1(s1) | rs2(s2) ); }
    1.38 +  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) ); }
    1.39    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) ); }
    1.40    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) ); }
    1.41    void xnor(    Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(xnor_op3             ) | rs1(s1) | rs2(s2) ); }
    1.42 @@ -2026,8 +2027,8 @@
    1.43    inline void st_ptr(Register d, Register s1, ByteSize simm13a);
    1.44  #endif
    1.45  
    1.46 -  // ld_long will perform ld for 32 bit VM's and ldx for 64 bit VM's
    1.47 -  // st_long will perform st for 32 bit VM's and stx for 64 bit VM's
    1.48 +  // ld_long will perform ldd for 32 bit VM's and ldx for 64 bit VM's
    1.49 +  // st_long will perform std for 32 bit VM's and stx for 64 bit VM's
    1.50    inline void ld_long(Register s1, Register s2, Register d);
    1.51    inline void ld_long(Register s1, int simm13a, Register d);
    1.52    inline void ld_long(Register s1, RegisterOrConstant s2, Register d);
    1.53 @@ -2038,23 +2039,19 @@
    1.54    inline void st_long(Register d, const Address& a, int offset = 0);
    1.55  
    1.56    // Helpers for address formation.
    1.57 -  // They update the dest in place, whether it is a register or constant.
    1.58 -  // They emit no code at all if src is a constant zero.
    1.59 -  // If dest is a constant and src is a register, the temp argument
    1.60 -  // is required, and becomes the result.
    1.61 -  // If dest is a register and src is a non-simm13 constant,
    1.62 -  // the temp argument is required, and is used to materialize the constant.
    1.63 -  void regcon_inc_ptr( RegisterOrConstant& dest, RegisterOrConstant src,
    1.64 -                       Register temp = noreg );
    1.65 -  void regcon_sll_ptr( RegisterOrConstant& dest, RegisterOrConstant src,
    1.66 -                       Register temp = noreg );
    1.67 -
    1.68 -  RegisterOrConstant ensure_simm13_or_reg(RegisterOrConstant roc, Register Rtemp) {
    1.69 -    guarantee(Rtemp != noreg, "constant offset overflow");
    1.70 -    if (is_simm13(roc.constant_or_zero()))
    1.71 -      return roc;               // register or short constant
    1.72 -    set(roc.as_constant(), Rtemp);
    1.73 -    return RegisterOrConstant(Rtemp);
    1.74 +  // - They emit only a move if s2 is a constant zero.
    1.75 +  // - If dest is a constant and either s1 or s2 is a register, the temp argument is required and becomes the result.
    1.76 +  // - 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.
    1.77 +  RegisterOrConstant regcon_andn_ptr(RegisterOrConstant s1, RegisterOrConstant s2, RegisterOrConstant d, Register temp = noreg);
    1.78 +  RegisterOrConstant regcon_inc_ptr( RegisterOrConstant s1, RegisterOrConstant s2, RegisterOrConstant d, Register temp = noreg);
    1.79 +  RegisterOrConstant regcon_sll_ptr( RegisterOrConstant s1, RegisterOrConstant s2, RegisterOrConstant d, Register temp = noreg);
    1.80 +
    1.81 +  RegisterOrConstant ensure_simm13_or_reg(RegisterOrConstant src, Register temp) {
    1.82 +    if (is_simm13(src.constant_or_zero()))
    1.83 +      return src;               // register or short constant
    1.84 +    guarantee(temp != noreg, "constant offset overflow");
    1.85 +    set(src.as_constant(), temp);
    1.86 +    return temp;
    1.87    }
    1.88  
    1.89    // --------------------------------------------------
    1.90 @@ -2303,6 +2300,9 @@
    1.91    void lcmp( Register Ra, Register Rb, Register Rresult);
    1.92  #endif
    1.93  
    1.94 +  // Loading values by size and signed-ness
    1.95 +  void load_sized_value(Address src, Register dst, size_t size_in_bytes, bool is_signed);
    1.96 +
    1.97    void float_cmp( bool is_float, int unordered_result,
    1.98                    FloatRegister Fa, FloatRegister Fb,
    1.99                    Register Rresult);
   1.100 @@ -2421,12 +2421,16 @@
   1.101    void check_method_handle_type(Register mtype_reg, Register mh_reg,
   1.102                                  Register temp_reg,
   1.103                                  Label& wrong_method_type);
   1.104 -  void jump_to_method_handle_entry(Register mh_reg, Register temp_reg);
   1.105 +  void load_method_handle_vmslots(Register vmslots_reg, Register mh_reg,
   1.106 +                                  Register temp_reg);
   1.107 +  void jump_to_method_handle_entry(Register mh_reg, Register temp_reg, bool emit_delayed_nop = true);
   1.108    // offset relative to Gargs of argument at tos[arg_slot].
   1.109    // (arg_slot == 0 means the last argument, not the first).
   1.110    RegisterOrConstant argument_offset(RegisterOrConstant arg_slot,
   1.111                                       int extra_slot_offset = 0);
   1.112 -
   1.113 +  // Address of Gargs and argument_offset.
   1.114 +  Address            argument_address(RegisterOrConstant arg_slot,
   1.115 +                                      int extra_slot_offset = 0);
   1.116  
   1.117    // Stack overflow checking
   1.118  

mercurial