Mercurial > hg > graal-jvmci-8
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 |