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;