Tue, 07 Dec 2010 11:00:02 -0800
7004925: CTW: assert(nbits == 32 || -(1 << nbits-1) <= x && x < ( 1 << nbits-1)) failed: value out of range
Summary: Set offset in register if it does not fit 13 bits.
Reviewed-by: iveresov
src/cpu/sparc/vm/sparc.ad | file | annotate | diff | comparison | revisions |
1.1 --- a/src/cpu/sparc/vm/sparc.ad Fri Dec 03 15:53:57 2010 -0800 1.2 +++ b/src/cpu/sparc/vm/sparc.ad Tue Dec 07 11:00:02 2010 -0800 1.3 @@ -6094,7 +6094,8 @@ 1.4 ins_cost(MEMORY_REF_COST); 1.5 format %{ "LD [$constanttablebase + $constantoffset],$dst\t! load from constant table: ptr=$con" %} 1.6 ins_encode %{ 1.7 - __ ld_ptr($constanttablebase, $constantoffset($con), $dst$$Register); 1.8 + RegisterOrConstant con_offset = __ ensure_simm13_or_reg($constantoffset($con), $dst$$Register); 1.9 + __ ld_ptr($constanttablebase, con_offset, $dst$$Register); 1.10 %} 1.11 ins_pipe(loadConP); 1.12 %} 1.13 @@ -6162,7 +6163,8 @@ 1.14 ins_cost(MEMORY_REF_COST); 1.15 format %{ "LDX [$constanttablebase + $constantoffset],$dst\t! load from constant table: long=$con" %} 1.16 ins_encode %{ 1.17 - __ ldx($constanttablebase, $constantoffset($con), $dst$$Register); 1.18 + RegisterOrConstant con_offset = __ ensure_simm13_or_reg($constantoffset($con), $dst$$Register); 1.19 + __ ldx($constanttablebase, con_offset, $dst$$Register); 1.20 %} 1.21 ins_pipe(loadConL); 1.22 %} 1.23 @@ -6186,24 +6188,26 @@ 1.24 ins_pipe(ialu_imm); 1.25 %} 1.26 1.27 -instruct loadConF(regF dst, immF con) %{ 1.28 +instruct loadConF(regF dst, immF con, o7RegI tmp) %{ 1.29 match(Set dst con); 1.30 - size(4); 1.31 + effect(KILL tmp); 1.32 format %{ "LDF [$constanttablebase + $constantoffset],$dst\t! load from constant table: float=$con" %} 1.33 ins_encode %{ 1.34 - __ ldf(FloatRegisterImpl::S, $constanttablebase, $constantoffset($con), $dst$$FloatRegister); 1.35 + RegisterOrConstant con_offset = __ ensure_simm13_or_reg($constantoffset($con), $tmp$$Register); 1.36 + __ ldf(FloatRegisterImpl::S, $constanttablebase, con_offset, $dst$$FloatRegister); 1.37 %} 1.38 ins_pipe(loadConFD); 1.39 %} 1.40 1.41 -instruct loadConD(regD dst, immD con) %{ 1.42 +instruct loadConD(regD dst, immD con, o7RegI tmp) %{ 1.43 match(Set dst con); 1.44 - size(4); 1.45 + effect(KILL tmp); 1.46 format %{ "LDDF [$constanttablebase + $constantoffset],$dst\t! load from constant table: double=$con" %} 1.47 ins_encode %{ 1.48 // XXX This is a quick fix for 6833573. 1.49 //__ ldf(FloatRegisterImpl::D, $constanttablebase, $constantoffset($con), $dst$$FloatRegister); 1.50 - __ ldf(FloatRegisterImpl::D, $constanttablebase, $constantoffset($con), as_DoubleFloatRegister($dst$$reg)); 1.51 + RegisterOrConstant con_offset = __ ensure_simm13_or_reg($constantoffset($con), $tmp$$Register); 1.52 + __ ldf(FloatRegisterImpl::D, $constanttablebase, con_offset, as_DoubleFloatRegister($dst$$reg)); 1.53 %} 1.54 ins_pipe(loadConFD); 1.55 %} 1.56 @@ -8655,14 +8659,15 @@ 1.57 %} 1.58 1.59 // Replicate scalar constant to packed byte values in Double register 1.60 -instruct Repl8B_immI(regD dst, immI13 con) %{ 1.61 +instruct Repl8B_immI(regD dst, immI13 con, o7RegI tmp) %{ 1.62 match(Set dst (Replicate8B con)); 1.63 - size(4); 1.64 + effect(KILL tmp); 1.65 format %{ "LDDF [$constanttablebase + $constantoffset],$dst\t! load from constant table: Repl8B($con)" %} 1.66 ins_encode %{ 1.67 // XXX This is a quick fix for 6833573. 1.68 //__ ldf(FloatRegisterImpl::D, $constanttablebase, $constantoffset(replicate_immI($con$$constant, 8, 1)), $dst$$FloatRegister); 1.69 - __ ldf(FloatRegisterImpl::D, $constanttablebase, $constantoffset(replicate_immI($con$$constant, 8, 1)), as_DoubleFloatRegister($dst$$reg)); 1.70 + RegisterOrConstant con_offset = __ ensure_simm13_or_reg($constantoffset(replicate_immI($con$$constant, 8, 1)), $tmp$$Register); 1.71 + __ ldf(FloatRegisterImpl::D, $constanttablebase, con_offset, as_DoubleFloatRegister($dst$$reg)); 1.72 %} 1.73 ins_pipe(loadConFD); 1.74 %} 1.75 @@ -8690,14 +8695,15 @@ 1.76 %} 1.77 1.78 // Replicate scalar constant to packed char values in Double register 1.79 -instruct Repl4C_immI(regD dst, immI con) %{ 1.80 +instruct Repl4C_immI(regD dst, immI con, o7RegI tmp) %{ 1.81 match(Set dst (Replicate4C con)); 1.82 - size(4); 1.83 + effect(KILL tmp); 1.84 format %{ "LDDF [$constanttablebase + $constantoffset],$dst\t! load from constant table: Repl4C($con)" %} 1.85 ins_encode %{ 1.86 // XXX This is a quick fix for 6833573. 1.87 //__ ldf(FloatRegisterImpl::D, $constanttablebase, $constantoffset(replicate_immI($con$$constant, 4, 2)), $dst$$FloatRegister); 1.88 - __ ldf(FloatRegisterImpl::D, $constanttablebase, $constantoffset(replicate_immI($con$$constant, 4, 2)), as_DoubleFloatRegister($dst$$reg)); 1.89 + RegisterOrConstant con_offset = __ ensure_simm13_or_reg($constantoffset(replicate_immI($con$$constant, 4, 2)), $tmp$$Register); 1.90 + __ ldf(FloatRegisterImpl::D, $constanttablebase, con_offset, as_DoubleFloatRegister($dst$$reg)); 1.91 %} 1.92 ins_pipe(loadConFD); 1.93 %} 1.94 @@ -8725,14 +8731,15 @@ 1.95 %} 1.96 1.97 // Replicate scalar constant to packed short values in Double register 1.98 -instruct Repl4S_immI(regD dst, immI con) %{ 1.99 +instruct Repl4S_immI(regD dst, immI con, o7RegI tmp) %{ 1.100 match(Set dst (Replicate4S con)); 1.101 - size(4); 1.102 + effect(KILL tmp); 1.103 format %{ "LDDF [$constanttablebase + $constantoffset],$dst\t! load from constant table: Repl4S($con)" %} 1.104 ins_encode %{ 1.105 // XXX This is a quick fix for 6833573. 1.106 //__ ldf(FloatRegisterImpl::D, $constanttablebase, $constantoffset(replicate_immI($con$$constant, 4, 2)), $dst$$FloatRegister); 1.107 - __ ldf(FloatRegisterImpl::D, $constanttablebase, $constantoffset(replicate_immI($con$$constant, 4, 2)), as_DoubleFloatRegister($dst$$reg)); 1.108 + RegisterOrConstant con_offset = __ ensure_simm13_or_reg($constantoffset(replicate_immI($con$$constant, 4, 2)), $tmp$$Register); 1.109 + __ ldf(FloatRegisterImpl::D, $constanttablebase, con_offset, as_DoubleFloatRegister($dst$$reg)); 1.110 %} 1.111 ins_pipe(loadConFD); 1.112 %} 1.113 @@ -8758,14 +8765,15 @@ 1.114 %} 1.115 1.116 // Replicate scalar zero constant to packed int values in Double register 1.117 -instruct Repl2I_immI(regD dst, immI con) %{ 1.118 +instruct Repl2I_immI(regD dst, immI con, o7RegI tmp) %{ 1.119 match(Set dst (Replicate2I con)); 1.120 - size(4); 1.121 + effect(KILL tmp); 1.122 format %{ "LDDF [$constanttablebase + $constantoffset],$dst\t! load from constant table: Repl2I($con)" %} 1.123 ins_encode %{ 1.124 // XXX This is a quick fix for 6833573. 1.125 //__ ldf(FloatRegisterImpl::D, $constanttablebase, $constantoffset(replicate_immI($con$$constant, 2, 4)), $dst$$FloatRegister); 1.126 - __ ldf(FloatRegisterImpl::D, $constanttablebase, $constantoffset(replicate_immI($con$$constant, 2, 4)), as_DoubleFloatRegister($dst$$reg)); 1.127 + RegisterOrConstant con_offset = __ ensure_simm13_or_reg($constantoffset(replicate_immI($con$$constant, 2, 4)), $tmp$$Register); 1.128 + __ ldf(FloatRegisterImpl::D, $constanttablebase, con_offset, as_DoubleFloatRegister($dst$$reg)); 1.129 %} 1.130 ins_pipe(loadConFD); 1.131 %} 1.132 @@ -9034,7 +9042,8 @@ 1.133 table_reg = $constanttablebase; 1.134 } else { 1.135 table_reg = O7; 1.136 - __ add($constanttablebase, $constantoffset, table_reg); 1.137 + RegisterOrConstant con_offset = __ ensure_simm13_or_reg($constantoffset, O7); 1.138 + __ add($constanttablebase, con_offset, table_reg); 1.139 } 1.140 1.141 // Jump to base address + switch value