src/cpu/x86/vm/c1_LIRAssembler_x86.cpp

changeset 3760
8f972594effc
parent 3744
3576af4cb939
child 3787
6759698e3140
     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

mercurial