1.1 --- a/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp Fri May 11 14:54:35 2012 -0700 1.2 +++ b/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp Mon May 14 09:36:00 2012 -0700 1.3 @@ -1,5 +1,5 @@ 1.4 /* 1.5 - * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. 1.6 + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. 1.7 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 1.8 * 1.9 * This code is free software; you can redistribute it and/or modify it 1.10 @@ -505,19 +505,28 @@ 1.11 1.12 // Get addresses of first characters from both Strings 1.13 __ load_heap_oop(rsi, Address(rax, java_lang_String::value_offset_in_bytes())); 1.14 - __ movptr (rcx, Address(rax, java_lang_String::offset_offset_in_bytes())); 1.15 - __ lea (rsi, Address(rsi, rcx, Address::times_2, arrayOopDesc::base_offset_in_bytes(T_CHAR))); 1.16 - 1.17 + if (java_lang_String::has_offset_field()) { 1.18 + __ movptr (rcx, Address(rax, java_lang_String::offset_offset_in_bytes())); 1.19 + __ movl (rax, Address(rax, java_lang_String::count_offset_in_bytes())); 1.20 + __ lea (rsi, Address(rsi, rcx, Address::times_2, arrayOopDesc::base_offset_in_bytes(T_CHAR))); 1.21 + } else { 1.22 + __ movl (rax, Address(rsi, arrayOopDesc::length_offset_in_bytes())); 1.23 + __ lea (rsi, Address(rsi, arrayOopDesc::base_offset_in_bytes(T_CHAR))); 1.24 + } 1.25 1.26 // rbx, may be NULL 1.27 add_debug_info_for_null_check_here(info); 1.28 __ load_heap_oop(rdi, Address(rbx, java_lang_String::value_offset_in_bytes())); 1.29 - __ movptr (rcx, Address(rbx, java_lang_String::offset_offset_in_bytes())); 1.30 - __ lea (rdi, Address(rdi, rcx, Address::times_2, arrayOopDesc::base_offset_in_bytes(T_CHAR))); 1.31 + if (java_lang_String::has_offset_field()) { 1.32 + __ movptr (rcx, Address(rbx, java_lang_String::offset_offset_in_bytes())); 1.33 + __ movl (rbx, Address(rbx, java_lang_String::count_offset_in_bytes())); 1.34 + __ lea (rdi, Address(rdi, rcx, Address::times_2, arrayOopDesc::base_offset_in_bytes(T_CHAR))); 1.35 + } else { 1.36 + __ movl (rbx, Address(rdi, arrayOopDesc::length_offset_in_bytes())); 1.37 + __ lea (rdi, Address(rdi, arrayOopDesc::base_offset_in_bytes(T_CHAR))); 1.38 + } 1.39 1.40 // compute minimum length (in rax) and difference of lengths (on top of stack) 1.41 - __ movl (rbx, Address(rbx, java_lang_String::count_offset_in_bytes())); 1.42 - __ movl (rax, Address(rax, java_lang_String::count_offset_in_bytes())); 1.43 __ mov (rcx, rbx); 1.44 __ subptr(rbx, rax); // subtract lengths 1.45 __ push (rbx); // result