hotspot/src/cpu/x86/vm/interp_masm_x86_64.cpp
changeset 5702 201c5cde25bb
parent 5547 f4b087cbb361
parent 5688 9052dc91ea67
child 6453 970dc585ab63
equal deleted inserted replaced
5685:0e4c848d5c06 5702:201c5cde25bb
   185 }
   185 }
   186 
   186 
   187 
   187 
   188 void InterpreterMacroAssembler::get_cache_index_at_bcp(Register index,
   188 void InterpreterMacroAssembler::get_cache_index_at_bcp(Register index,
   189                                                        int bcp_offset,
   189                                                        int bcp_offset,
   190                                                        bool giant_index) {
   190                                                        size_t index_size) {
   191   assert(bcp_offset > 0, "bcp is still pointing to start of bytecode");
   191   assert(bcp_offset > 0, "bcp is still pointing to start of bytecode");
   192   if (!giant_index) {
   192   if (index_size == sizeof(u2)) {
   193     load_unsigned_short(index, Address(r13, bcp_offset));
   193     load_unsigned_short(index, Address(r13, bcp_offset));
   194   } else {
   194   } else if (index_size == sizeof(u4)) {
   195     assert(EnableInvokeDynamic, "giant index used only for EnableInvokeDynamic");
   195     assert(EnableInvokeDynamic, "giant index used only for EnableInvokeDynamic");
   196     movl(index, Address(r13, bcp_offset));
   196     movl(index, Address(r13, bcp_offset));
   197     // Check if the secondary index definition is still ~x, otherwise
   197     // Check if the secondary index definition is still ~x, otherwise
   198     // we have to change the following assembler code to calculate the
   198     // we have to change the following assembler code to calculate the
   199     // plain index.
   199     // plain index.
   200     assert(constantPoolCacheOopDesc::decode_secondary_index(~123) == 123, "else change next line");
   200     assert(constantPoolCacheOopDesc::decode_secondary_index(~123) == 123, "else change next line");
   201     notl(index);  // convert to plain index
   201     notl(index);  // convert to plain index
       
   202   } else if (index_size == sizeof(u1)) {
       
   203     assert(EnableMethodHandles, "tiny index used only for EnableMethodHandles");
       
   204     load_unsigned_byte(index, Address(r13, bcp_offset));
       
   205   } else {
       
   206     ShouldNotReachHere();
   202   }
   207   }
   203 }
   208 }
   204 
   209 
   205 
   210 
   206 void InterpreterMacroAssembler::get_cache_and_index_at_bcp(Register cache,
   211 void InterpreterMacroAssembler::get_cache_and_index_at_bcp(Register cache,
   207                                                            Register index,
   212                                                            Register index,
   208                                                            int bcp_offset,
   213                                                            int bcp_offset,
   209                                                            bool giant_index) {
   214                                                            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   // convert from field index to ConstantPoolCacheEntry index
   219   // convert from field index to ConstantPoolCacheEntry index
   215   shll(index, 2);
   220   shll(index, 2);
   216 }
   221 }
   217 
   222 
   218 
   223 
   219 void InterpreterMacroAssembler::get_cache_entry_pointer_at_bcp(Register cache,
   224 void InterpreterMacroAssembler::get_cache_entry_pointer_at_bcp(Register cache,
   220                                                                Register tmp,
   225                                                                Register tmp,
   221                                                                int bcp_offset,
   226                                                                int bcp_offset,
   222                                                                bool giant_index) {
   227                                                                size_t index_size) {
   223   assert(cache != tmp, "must use different register");
   228   assert(cache != tmp, "must use different register");
   224   get_cache_index_at_bcp(tmp, bcp_offset, giant_index);
   229   get_cache_index_at_bcp(tmp, bcp_offset, index_size);
   225   assert(sizeof(ConstantPoolCacheEntry) == 4 * wordSize, "adjust code below");
   230   assert(sizeof(ConstantPoolCacheEntry) == 4 * wordSize, "adjust code below");
   226   // convert from field index to ConstantPoolCacheEntry index
   231   // convert from field index to ConstantPoolCacheEntry index
   227   // and from word offset to byte offset
   232   // and from word offset to byte offset
   228   shll(tmp, 2 + LogBytesPerWord);
   233   shll(tmp, 2 + LogBytesPerWord);
   229   movptr(cache, Address(rbp, frame::interpreter_frame_cache_offset * wordSize));
   234   movptr(cache, Address(rbp, frame::interpreter_frame_cache_offset * wordSize));