Mercurial > hg > truffle
comparison src/cpu/x86/vm/interp_masm_x86_32.cpp @ 1565:ab102d5d923e
6939207: refactor constant pool index processing
Summary: Factored cleanup of instruction decode which prepares for enhanced ldc semantics.
Reviewed-by: twisti
author | jrose |
---|---|
date | Sun, 23 May 2010 01:38:26 -0700 |
parents | 2338d41fbd81 |
children | e9ff18c4ace7 |
comparison
equal
deleted
inserted
replaced
1564:61b2245abf36 | 1565:ab102d5d923e |
---|---|
187 bswapl(reg); | 187 bswapl(reg); |
188 shrl(reg, 16); | 188 shrl(reg, 16); |
189 } | 189 } |
190 | 190 |
191 | 191 |
192 void InterpreterMacroAssembler::get_cache_index_at_bcp(Register reg, int bcp_offset, bool giant_index) { | 192 void InterpreterMacroAssembler::get_cache_index_at_bcp(Register reg, int bcp_offset, size_t index_size) { |
193 assert(bcp_offset > 0, "bcp is still pointing to start of bytecode"); | 193 assert(bcp_offset > 0, "bcp is still pointing to start of bytecode"); |
194 if (!giant_index) { | 194 if (index_size == sizeof(u2)) { |
195 load_unsigned_short(reg, Address(rsi, bcp_offset)); | 195 load_unsigned_short(reg, Address(rsi, bcp_offset)); |
196 } else { | 196 } else if (index_size == sizeof(u4)) { |
197 assert(EnableInvokeDynamic, "giant index used only for EnableInvokeDynamic"); | 197 assert(EnableInvokeDynamic, "giant index used only for EnableInvokeDynamic"); |
198 movl(reg, Address(rsi, bcp_offset)); | 198 movl(reg, Address(rsi, bcp_offset)); |
199 // Check if the secondary index definition is still ~x, otherwise | 199 // Check if the secondary index definition is still ~x, otherwise |
200 // we have to change the following assembler code to calculate the | 200 // we have to change the following assembler code to calculate the |
201 // plain index. | 201 // plain index. |
202 assert(constantPoolCacheOopDesc::decode_secondary_index(~123) == 123, "else change next line"); | 202 assert(constantPoolCacheOopDesc::decode_secondary_index(~123) == 123, "else change next line"); |
203 notl(reg); // convert to plain index | 203 notl(reg); // convert to plain index |
204 } else if (index_size == sizeof(u1)) { | |
205 assert(EnableMethodHandles, "tiny index used only for EnableMethodHandles"); | |
206 load_unsigned_byte(reg, Address(rsi, bcp_offset)); | |
207 } else { | |
208 ShouldNotReachHere(); | |
204 } | 209 } |
205 } | 210 } |
206 | 211 |
207 | 212 |
208 void InterpreterMacroAssembler::get_cache_and_index_at_bcp(Register cache, Register index, | 213 void InterpreterMacroAssembler::get_cache_and_index_at_bcp(Register cache, Register index, |
209 int bcp_offset, bool giant_index) { | 214 int bcp_offset, size_t index_size) { |
210 assert(cache != index, "must use different registers"); | 215 assert(cache != index, "must use different registers"); |
211 get_cache_index_at_bcp(index, bcp_offset, giant_index); | 216 get_cache_index_at_bcp(index, bcp_offset, index_size); |
212 movptr(cache, Address(rbp, frame::interpreter_frame_cache_offset * wordSize)); | 217 movptr(cache, Address(rbp, frame::interpreter_frame_cache_offset * wordSize)); |
213 assert(sizeof(ConstantPoolCacheEntry) == 4*wordSize, "adjust code below"); | 218 assert(sizeof(ConstantPoolCacheEntry) == 4*wordSize, "adjust code below"); |
214 shlptr(index, 2); // convert from field index to ConstantPoolCacheEntry index | 219 shlptr(index, 2); // convert from field index to ConstantPoolCacheEntry index |
215 } | 220 } |
216 | 221 |
217 | 222 |
218 void InterpreterMacroAssembler::get_cache_entry_pointer_at_bcp(Register cache, Register tmp, | 223 void InterpreterMacroAssembler::get_cache_entry_pointer_at_bcp(Register cache, Register tmp, |
219 int bcp_offset, bool giant_index) { | 224 int bcp_offset, size_t index_size) { |
220 assert(cache != tmp, "must use different register"); | 225 assert(cache != tmp, "must use different register"); |
221 get_cache_index_at_bcp(tmp, bcp_offset, giant_index); | 226 get_cache_index_at_bcp(tmp, bcp_offset, index_size); |
222 assert(sizeof(ConstantPoolCacheEntry) == 4*wordSize, "adjust code below"); | 227 assert(sizeof(ConstantPoolCacheEntry) == 4*wordSize, "adjust code below"); |
223 // convert from field index to ConstantPoolCacheEntry index | 228 // convert from field index to ConstantPoolCacheEntry index |
224 // and from word offset to byte offset | 229 // and from word offset to byte offset |
225 shll(tmp, 2 + LogBytesPerWord); | 230 shll(tmp, 2 + LogBytesPerWord); |
226 movptr(cache, Address(rbp, frame::interpreter_frame_cache_offset * wordSize)); | 231 movptr(cache, Address(rbp, frame::interpreter_frame_cache_offset * wordSize)); |