comparison src/cpu/x86/vm/c1_LIRAssembler_x86.cpp @ 2415:09f96c3ff1ad

7032388: guarantee(VM_Version::supports_cmov()) failed: illegal instruction on i586 after 6919934 Summary: 6919934 added some unguarded cmov instructions which hit a guarantee on older hardware. Reviewed-by: never, iveresov, kvn, phh
author twisti
date Thu, 31 Mar 2011 00:27:08 -0700
parents b40d4fa697bf
children 13bc79b5c9c8
comparison
equal deleted inserted replaced
2414:9d343b8113db 2415:09f96c3ff1ad
21 * questions. 21 * questions.
22 * 22 *
23 */ 23 */
24 24
25 #include "precompiled.hpp" 25 #include "precompiled.hpp"
26 #include "asm/assembler.hpp"
26 #include "c1/c1_Compilation.hpp" 27 #include "c1/c1_Compilation.hpp"
27 #include "c1/c1_LIRAssembler.hpp" 28 #include "c1/c1_LIRAssembler.hpp"
28 #include "c1/c1_MacroAssembler.hpp" 29 #include "c1/c1_MacroAssembler.hpp"
29 #include "c1/c1_Runtime1.hpp" 30 #include "c1/c1_Runtime1.hpp"
30 #include "c1/c1_ValueStack.hpp" 31 #include "c1/c1_ValueStack.hpp"
567 __ load_heap_oop(rdi, Address(rbx, java_lang_String::value_offset_in_bytes())); 568 __ load_heap_oop(rdi, Address(rbx, java_lang_String::value_offset_in_bytes()));
568 __ movptr (rcx, Address(rbx, java_lang_String::offset_offset_in_bytes())); 569 __ movptr (rcx, Address(rbx, java_lang_String::offset_offset_in_bytes()));
569 __ lea (rdi, Address(rdi, rcx, Address::times_2, arrayOopDesc::base_offset_in_bytes(T_CHAR))); 570 __ lea (rdi, Address(rdi, rcx, Address::times_2, arrayOopDesc::base_offset_in_bytes(T_CHAR)));
570 571
571 // compute minimum length (in rax) and difference of lengths (on top of stack) 572 // compute minimum length (in rax) and difference of lengths (on top of stack)
572 if (VM_Version::supports_cmov()) { 573 __ movl (rbx, Address(rbx, java_lang_String::count_offset_in_bytes()));
573 __ movl (rbx, Address(rbx, java_lang_String::count_offset_in_bytes())); 574 __ movl (rax, Address(rax, java_lang_String::count_offset_in_bytes()));
574 __ movl (rax, Address(rax, java_lang_String::count_offset_in_bytes())); 575 __ mov (rcx, rbx);
575 __ mov (rcx, rbx); 576 __ subptr(rbx, rax); // subtract lengths
576 __ subptr (rbx, rax); // subtract lengths 577 __ push (rbx); // result
577 __ push (rbx); // result 578 __ cmov (Assembler::lessEqual, rax, rcx);
578 __ cmov (Assembler::lessEqual, rax, rcx); 579
579 } else {
580 Label L;
581 __ movl (rbx, Address(rbx, java_lang_String::count_offset_in_bytes()));
582 __ movl (rcx, Address(rax, java_lang_String::count_offset_in_bytes()));
583 __ mov (rax, rbx);
584 __ subptr (rbx, rcx);
585 __ push (rbx);
586 __ jcc (Assembler::lessEqual, L);
587 __ mov (rax, rcx);
588 __ bind (L);
589 }
590 // is minimum length 0? 580 // is minimum length 0?
591 Label noLoop, haveResult; 581 Label noLoop, haveResult;
592 __ testptr (rax, rax); 582 __ testptr (rax, rax);
593 __ jcc (Assembler::zero, noLoop); 583 __ jcc (Assembler::zero, noLoop);
594 584