src/cpu/mips/vm/macroAssembler_mips.cpp

changeset 9227
f1560009a081
parent 9219
0fa7c31d7b02
child 9228
617b86d17edb
     1.1 --- a/src/cpu/mips/vm/macroAssembler_mips.cpp	Wed Aug 29 17:32:00 2018 +0800
     1.2 +++ b/src/cpu/mips/vm/macroAssembler_mips.cpp	Mon Sep 03 14:27:42 2018 +0800
     1.3 @@ -4201,7 +4201,10 @@
     1.4    }
     1.5  
     1.6    int disp = addr.disp();
     1.7 -  guarantee(Assembler::is_simm16(disp), "must be");
     1.8 +  bool disp_is_simm16 = true;
     1.9 +  if (!Assembler::is_simm16(disp)) {
    1.10 +    disp_is_simm16 = false;
    1.11 +  }
    1.12  
    1.13    Register base_reg = addr.base();
    1.14    if (tmp_reg != NOREG) {
    1.15 @@ -4210,9 +4213,19 @@
    1.16  
    1.17    if (tmp_reg != NOREG) {
    1.18      daddu(tmp_reg, base_reg, tmp_reg);
    1.19 -    store_for_type_by_register(src_reg, tmp_reg, disp, type, wide);
    1.20 +    if (!disp_is_simm16) {
    1.21 +      move(tmp_reg, disp);
    1.22 +      daddu(tmp_reg, base_reg, tmp_reg);
    1.23 +    }
    1.24 +    store_for_type_by_register(src_reg, tmp_reg, disp_is_simm16 ? disp : 0, type, wide);
    1.25    } else {
    1.26 -    store_for_type_by_register(src_reg, base_reg, disp, type, wide);
    1.27 +    if (!disp_is_simm16) {
    1.28 +      tmp_reg = T9;
    1.29 +      assert_different_registers(tmp_reg, base_reg);
    1.30 +      move(tmp_reg, disp);
    1.31 +      daddu(tmp_reg, base_reg, tmp_reg);
    1.32 +    }
    1.33 +    store_for_type_by_register(src_reg, disp_is_simm16 ? base_reg : tmp_reg, disp_is_simm16 ? disp : 0, type, wide);
    1.34    }
    1.35  }
    1.36  
    1.37 @@ -4242,7 +4255,10 @@
    1.38    }
    1.39  
    1.40    int disp = addr.disp();
    1.41 -  guarantee(Assembler::is_simm16(disp), "must be");
    1.42 +  bool disp_is_simm16 = true;
    1.43 +  if (!Assembler::is_simm16(disp)) {
    1.44 +    disp_is_simm16 = false;
    1.45 +  }
    1.46  
    1.47    Register base_reg = addr.base();
    1.48    if (tmp_reg != NOREG) {
    1.49 @@ -4251,9 +4267,19 @@
    1.50  
    1.51    if (tmp_reg != NOREG) {
    1.52      daddu(tmp_reg, base_reg, tmp_reg);
    1.53 -    store_for_type_by_register(src_reg, tmp_reg, disp, type);
    1.54 +    if (!disp_is_simm16) {
    1.55 +      move(tmp_reg, disp);
    1.56 +      daddu(tmp_reg, base_reg, tmp_reg);
    1.57 +    }
    1.58 +    store_for_type_by_register(src_reg, tmp_reg, disp_is_simm16 ? disp : 0, type);
    1.59    } else {
    1.60 -    store_for_type_by_register(src_reg, base_reg, disp, type);
    1.61 +    if (!disp_is_simm16) {
    1.62 +      tmp_reg = T9;
    1.63 +      assert_different_registers(tmp_reg, base_reg);
    1.64 +      move(tmp_reg, disp);
    1.65 +      daddu(tmp_reg, base_reg, tmp_reg);
    1.66 +    }
    1.67 +    store_for_type_by_register(src_reg, disp_is_simm16 ? base_reg : tmp_reg, disp_is_simm16 ? disp : 0, type);
    1.68    }
    1.69  }
    1.70  
    1.71 @@ -4309,7 +4335,10 @@
    1.72    }
    1.73  
    1.74    int disp = addr.disp();
    1.75 -  guarantee(Assembler::is_simm16(disp), "must be");
    1.76 +  bool disp_is_simm16 = true;
    1.77 +  if (!Assembler::is_simm16(disp)) {
    1.78 +    disp_is_simm16 = false;
    1.79 +  }
    1.80  
    1.81    Register base_reg = addr.base();
    1.82    if (tmp_reg != NOREG) {
    1.83 @@ -4318,11 +4347,21 @@
    1.84  
    1.85    if (tmp_reg != NOREG) {
    1.86      daddu(tmp_reg, base_reg, tmp_reg);
    1.87 +    if (!disp_is_simm16) {
    1.88 +      move(tmp_reg, disp);
    1.89 +      daddu(tmp_reg, base_reg, tmp_reg);
    1.90 +    }
    1.91      code_offset = offset();
    1.92 -    load_for_type_by_register(dst_reg, tmp_reg, disp, type, wide);
    1.93 +    load_for_type_by_register(dst_reg, tmp_reg, disp_is_simm16 ? disp : 0, type, wide);
    1.94    } else {
    1.95 +    if (!disp_is_simm16) {
    1.96 +      tmp_reg = T9;
    1.97 +      assert_different_registers(tmp_reg, base_reg);
    1.98 +      move(tmp_reg, disp);
    1.99 +      daddu(tmp_reg, base_reg, tmp_reg);
   1.100 +    }
   1.101      code_offset = offset();
   1.102 -    load_for_type_by_register(dst_reg, base_reg, disp, type, wide);
   1.103 +    load_for_type_by_register(dst_reg, disp_is_simm16 ? base_reg : tmp_reg, disp_is_simm16 ? disp : 0, type, wide);
   1.104    }
   1.105  
   1.106    return code_offset;
   1.107 @@ -4355,7 +4394,10 @@
   1.108    }
   1.109  
   1.110    int disp = addr.disp();
   1.111 -  guarantee(Assembler::is_simm16(disp), "must be");
   1.112 +  bool disp_is_simm16 = true;
   1.113 +  if (!Assembler::is_simm16(disp)) {
   1.114 +    disp_is_simm16 = false;
   1.115 +  }
   1.116  
   1.117    Register base_reg = addr.base();
   1.118    if (tmp_reg != NOREG) {
   1.119 @@ -4364,11 +4406,21 @@
   1.120  
   1.121    if (tmp_reg != NOREG) {
   1.122      daddu(tmp_reg, base_reg, tmp_reg);
   1.123 +    if (!disp_is_simm16) {
   1.124 +      move(tmp_reg, disp);
   1.125 +      daddu(tmp_reg, base_reg, tmp_reg);
   1.126 +    }
   1.127      code_offset = offset();
   1.128 -    load_for_type_by_register(dst_reg, tmp_reg, disp, type);
   1.129 +    load_for_type_by_register(dst_reg, tmp_reg, disp_is_simm16 ? disp : 0, type);
   1.130    } else {
   1.131 +    if (!disp_is_simm16) {
   1.132 +      tmp_reg = T9;
   1.133 +      assert_different_registers(tmp_reg, base_reg);
   1.134 +      move(tmp_reg, disp);
   1.135 +      daddu(tmp_reg, base_reg, tmp_reg);
   1.136 +    }
   1.137      code_offset = offset();
   1.138 -    load_for_type_by_register(dst_reg, base_reg, disp, type);
   1.139 +    load_for_type_by_register(dst_reg, disp_is_simm16 ? base_reg : tmp_reg, disp_is_simm16 ? disp : 0, type);
   1.140    }
   1.141  
   1.142    return code_offset;

mercurial