< prev index next >
src/hotspot/cpu/x86/x86_64.ad
Print this page
*** 789,802 ****
void MachPrologNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const {
Compile* C = ra_->C;
MacroAssembler _masm(&cbuf);
! int framesize = C->frame_size_in_bytes();
! int bangsize = C->bang_size_in_bytes();
!
! __ verified_entry(framesize, C->need_stack_bang(bangsize)?bangsize:0, false, C->stub_function() != NULL);
C->set_frame_complete(cbuf.insts_size());
if (C->has_mach_constant_base_node()) {
// NOTE: We set the table base offset here because users might be
--- 789,800 ----
void MachPrologNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const {
Compile* C = ra_->C;
MacroAssembler _masm(&cbuf);
! __ verified_entry(C);
! __ bind(*_verified_entry);
C->set_frame_complete(cbuf.insts_size());
if (C->has_mach_constant_base_node()) {
// NOTE: We set the table base offset here because users might be
*** 866,898 ****
// Clear upper bits of YMM registers when current compiled code uses
// wide vectors to avoid AVX <-> SSE transition penalty during call.
__ vzeroupper();
}
! int framesize = C->frame_size_in_bytes();
! assert((framesize & (StackAlignmentInBytes-1)) == 0, "frame size not aligned");
! // Remove word for return adr already pushed
! // and RBP
! framesize -= 2*wordSize;
- // Note that VerifyStackAtCalls' Majik cookie does not change the frame size popped here
-
- if (framesize) {
- emit_opcode(cbuf, Assembler::REX_W);
- if (framesize < 0x80) {
- emit_opcode(cbuf, 0x83); // addq rsp, #framesize
- emit_rm(cbuf, 0x3, 0x00, RSP_enc);
- emit_d8(cbuf, framesize);
- } else {
- emit_opcode(cbuf, 0x81); // addq rsp, #framesize
- emit_rm(cbuf, 0x3, 0x00, RSP_enc);
- emit_d32(cbuf, framesize);
- }
- }
-
- // popq rbp
- emit_opcode(cbuf, 0x58 | RBP_enc);
if (StackReservedPages > 0 && C->has_reserved_stack_access()) {
__ reserved_stack_check();
}
--- 864,875 ----
// Clear upper bits of YMM registers when current compiled code uses
// wide vectors to avoid AVX <-> SSE transition penalty during call.
__ vzeroupper();
}
! __ restore_stack(C);
if (StackReservedPages > 0 && C->has_reserved_stack_access()) {
__ reserved_stack_check();
}
*** 1461,1470 ****
--- 1438,1480 ----
return (offset < 0x80) ? 5 : 8; // REX
}
//=============================================================================
#ifndef PRODUCT
+ void MachVEPNode::format(PhaseRegAlloc* ra_, outputStream* st) const
+ {
+ st->print_cr("MachVEPNode");
+ }
+ #endif
+
+ void MachVEPNode::emit(CodeBuffer& cbuf, PhaseRegAlloc* ra_) const
+ {
+ MacroAssembler masm(&cbuf);
+ if (!_verified) {
+ uint insts_size = cbuf.insts_size();
+ if (UseCompressedClassPointers) {
+ masm.load_klass(rscratch1, j_rarg0);
+ masm.cmpptr(rax, rscratch1);
+ } else {
+ masm.cmpptr(rax, Address(j_rarg0, oopDesc::klass_offset_in_bytes()));
+ }
+ masm.jump_cc(Assembler::notEqual, RuntimeAddress(SharedRuntime::get_ic_miss_stub()));
+ } else {
+ // Unpack value type args passed as oop and then jump to
+ // the verified entry point (skipping the unverified entry).
+ masm.unpack_value_args(ra_->C, _receiver_only);
+ masm.jmp(*_verified_entry);
+ }
+ }
+
+ uint MachVEPNode::size(PhaseRegAlloc* ra_) const
+ {
+ return MachNode::size(ra_); // too many variables; just compute it the hard way
+ }
+
+ //=============================================================================
+ #ifndef PRODUCT
void MachUEPNode::format(PhaseRegAlloc* ra_, outputStream* st) const
{
if (UseCompressedClassPointers) {
st->print_cr("movl rscratch1, [j_rarg0 + oopDesc::klass_offset_in_bytes()]\t# compressed klass");
st->print_cr("\tdecode_klass_not_null rscratch1, rscratch1");
*** 6599,6608 ****
--- 6609,6631 ----
}
%}
ins_pipe(ialu_reg_reg); // XXX
%}
+ instruct castN2X(rRegL dst, rRegN src)
+ %{
+ match(Set dst (CastP2X src));
+
+ format %{ "movq $dst, $src\t# ptr -> long" %}
+ ins_encode %{
+ if ($dst$$reg != $src$$reg) {
+ __ movptr($dst$$Register, $src$$Register);
+ }
+ %}
+ ins_pipe(ialu_reg_reg); // XXX
+ %}
+
instruct castP2X(rRegL dst, rRegP src)
%{
match(Set dst (CastP2X src));
format %{ "movq $dst, $src\t# ptr -> long" %}
*** 10834,10852 ****
%}
// =======================================================================
// fast clearing of an array
! instruct rep_stos(rcx_RegL cnt, rdi_RegP base, regD tmp, rax_RegI zero,
Universe dummy, rFlagsReg cr)
%{
! predicate(!((ClearArrayNode*)n)->is_large());
! match(Set dummy (ClearArray cnt base));
! effect(USE_KILL cnt, USE_KILL base, TEMP tmp, KILL zero, KILL cr);
format %{ $$template
- $$emit$$"xorq rax, rax\t# ClearArray:\n\t"
$$emit$$"cmp InitArrayShortSize,rcx\n\t"
$$emit$$"jg LARGE\n\t"
$$emit$$"dec rcx\n\t"
$$emit$$"js DONE\t# Zero length\n\t"
$$emit$$"mov rax,(rdi,rcx,8)\t# LOOP\n\t"
--- 10857,10874 ----
%}
// =======================================================================
// fast clearing of an array
! instruct rep_stos(rcx_RegL cnt, rdi_RegP base, regD tmp, rax_RegL val,
Universe dummy, rFlagsReg cr)
%{
! predicate(!((ClearArrayNode*)n)->is_large() && !((ClearArrayNode*)n)->word_copy_only());
! match(Set dummy (ClearArray (Binary cnt base) val));
! effect(USE_KILL cnt, USE_KILL base, TEMP tmp, KILL cr);
format %{ $$template
$$emit$$"cmp InitArrayShortSize,rcx\n\t"
$$emit$$"jg LARGE\n\t"
$$emit$$"dec rcx\n\t"
$$emit$$"js DONE\t# Zero length\n\t"
$$emit$$"mov rax,(rdi,rcx,8)\t# LOOP\n\t"
*** 10856,10878 ****
$$emit$$"# LARGE:\n\t"
if (UseFastStosb) {
$$emit$$"shlq rcx,3\t# Convert doublewords to bytes\n\t"
$$emit$$"rep stosb\t# Store rax to *rdi++ while rcx--\n\t"
} else if (UseXMMForObjInit) {
! $$emit$$"mov rdi,rax\n\t"
! $$emit$$"vpxor ymm0,ymm0,ymm0\n\t"
$$emit$$"jmpq L_zero_64_bytes\n\t"
$$emit$$"# L_loop:\t# 64-byte LOOP\n\t"
! $$emit$$"vmovdqu ymm0,(rax)\n\t"
! $$emit$$"vmovdqu ymm0,0x20(rax)\n\t"
$$emit$$"add 0x40,rax\n\t"
$$emit$$"# L_zero_64_bytes:\n\t"
$$emit$$"sub 0x8,rcx\n\t"
$$emit$$"jge L_loop\n\t"
$$emit$$"add 0x4,rcx\n\t"
$$emit$$"jl L_tail\n\t"
! $$emit$$"vmovdqu ymm0,(rax)\n\t"
$$emit$$"add 0x20,rax\n\t"
$$emit$$"sub 0x4,rcx\n\t"
$$emit$$"# L_tail:\t# Clearing tail bytes\n\t"
$$emit$$"add 0x4,rcx\n\t"
$$emit$$"jle L_end\n\t"
--- 10878,10957 ----
$$emit$$"# LARGE:\n\t"
if (UseFastStosb) {
$$emit$$"shlq rcx,3\t# Convert doublewords to bytes\n\t"
$$emit$$"rep stosb\t# Store rax to *rdi++ while rcx--\n\t"
} else if (UseXMMForObjInit) {
! $$emit$$"movdq $tmp, $val\n\t"
! $$emit$$"punpcklqdq $tmp, $tmp\n\t"
! $$emit$$"vinserti128_high $tmp, $tmp\n\t"
! $$emit$$"jmpq L_zero_64_bytes\n\t"
! $$emit$$"# L_loop:\t# 64-byte LOOP\n\t"
! $$emit$$"vmovdqu $tmp,(rax)\n\t"
! $$emit$$"vmovdqu $tmp,0x20(rax)\n\t"
! $$emit$$"add 0x40,rax\n\t"
! $$emit$$"# L_zero_64_bytes:\n\t"
! $$emit$$"sub 0x8,rcx\n\t"
! $$emit$$"jge L_loop\n\t"
! $$emit$$"add 0x4,rcx\n\t"
! $$emit$$"jl L_tail\n\t"
! $$emit$$"vmovdqu $tmp,(rax)\n\t"
! $$emit$$"add 0x20,rax\n\t"
! $$emit$$"sub 0x4,rcx\n\t"
! $$emit$$"# L_tail:\t# Clearing tail bytes\n\t"
! $$emit$$"add 0x4,rcx\n\t"
! $$emit$$"jle L_end\n\t"
! $$emit$$"dec rcx\n\t"
! $$emit$$"# L_sloop:\t# 8-byte short loop\n\t"
! $$emit$$"vmovq xmm0,(rax)\n\t"
! $$emit$$"add 0x8,rax\n\t"
! $$emit$$"dec rcx\n\t"
! $$emit$$"jge L_sloop\n\t"
! $$emit$$"# L_end:\n\t"
! } else {
! $$emit$$"rep stosq\t# Store rax to *rdi++ while rcx--\n\t"
! }
! $$emit$$"# DONE"
! %}
! ins_encode %{
! __ clear_mem($base$$Register, $cnt$$Register, $val$$Register,
! $tmp$$XMMRegister, false, false);
! %}
! ins_pipe(pipe_slow);
! %}
!
! instruct rep_stos_word_copy(rcx_RegL cnt, rdi_RegP base, regD tmp, rax_RegL val,
! Universe dummy, rFlagsReg cr)
! %{
! predicate(!((ClearArrayNode*)n)->is_large() && ((ClearArrayNode*)n)->word_copy_only());
! match(Set dummy (ClearArray (Binary cnt base) val));
! effect(USE_KILL cnt, USE_KILL base, TEMP tmp, KILL cr);
!
! format %{ $$template
! $$emit$$"cmp InitArrayShortSize,rcx\n\t"
! $$emit$$"jg LARGE\n\t"
! $$emit$$"dec rcx\n\t"
! $$emit$$"js DONE\t# Zero length\n\t"
! $$emit$$"mov rax,(rdi,rcx,8)\t# LOOP\n\t"
! $$emit$$"dec rcx\n\t"
! $$emit$$"jge LOOP\n\t"
! $$emit$$"jmp DONE\n\t"
! $$emit$$"# LARGE:\n\t"
! if (UseXMMForObjInit) {
! $$emit$$"movdq $tmp, $val\n\t"
! $$emit$$"punpcklqdq $tmp, $tmp\n\t"
! $$emit$$"vinserti128_high $tmp, $tmp\n\t"
$$emit$$"jmpq L_zero_64_bytes\n\t"
$$emit$$"# L_loop:\t# 64-byte LOOP\n\t"
! $$emit$$"vmovdqu $tmp,(rax)\n\t"
! $$emit$$"vmovdqu $tmp,0x20(rax)\n\t"
$$emit$$"add 0x40,rax\n\t"
$$emit$$"# L_zero_64_bytes:\n\t"
$$emit$$"sub 0x8,rcx\n\t"
$$emit$$"jge L_loop\n\t"
$$emit$$"add 0x4,rcx\n\t"
$$emit$$"jl L_tail\n\t"
! $$emit$$"vmovdqu $tmp,(rax)\n\t"
$$emit$$"add 0x20,rax\n\t"
$$emit$$"sub 0x4,rcx\n\t"
$$emit$$"# L_tail:\t# Clearing tail bytes\n\t"
$$emit$$"add 0x4,rcx\n\t"
$$emit$$"jle L_end\n\t"
*** 10887,10928 ****
$$emit$$"rep stosq\t# Store rax to *rdi++ while rcx--\n\t"
}
$$emit$$"# DONE"
%}
ins_encode %{
! __ clear_mem($base$$Register, $cnt$$Register, $zero$$Register,
! $tmp$$XMMRegister, false);
%}
ins_pipe(pipe_slow);
%}
! instruct rep_stos_large(rcx_RegL cnt, rdi_RegP base, regD tmp, rax_RegI zero,
Universe dummy, rFlagsReg cr)
%{
! predicate(((ClearArrayNode*)n)->is_large());
! match(Set dummy (ClearArray cnt base));
! effect(USE_KILL cnt, USE_KILL base, TEMP tmp, KILL zero, KILL cr);
format %{ $$template
if (UseFastStosb) {
- $$emit$$"xorq rax, rax\t# ClearArray:\n\t"
$$emit$$"shlq rcx,3\t# Convert doublewords to bytes\n\t"
$$emit$$"rep stosb\t# Store rax to *rdi++ while rcx--"
} else if (UseXMMForObjInit) {
! $$emit$$"mov rdi,rax\t# ClearArray:\n\t"
! $$emit$$"vpxor ymm0,ymm0,ymm0\n\t"
$$emit$$"jmpq L_zero_64_bytes\n\t"
$$emit$$"# L_loop:\t# 64-byte LOOP\n\t"
! $$emit$$"vmovdqu ymm0,(rax)\n\t"
! $$emit$$"vmovdqu ymm0,0x20(rax)\n\t"
$$emit$$"add 0x40,rax\n\t"
$$emit$$"# L_zero_64_bytes:\n\t"
$$emit$$"sub 0x8,rcx\n\t"
$$emit$$"jge L_loop\n\t"
$$emit$$"add 0x4,rcx\n\t"
$$emit$$"jl L_tail\n\t"
! $$emit$$"vmovdqu ymm0,(rax)\n\t"
$$emit$$"add 0x20,rax\n\t"
$$emit$$"sub 0x4,rcx\n\t"
$$emit$$"# L_tail:\t# Clearing tail bytes\n\t"
$$emit$$"add 0x4,rcx\n\t"
$$emit$$"jle L_end\n\t"
--- 10966,11007 ----
$$emit$$"rep stosq\t# Store rax to *rdi++ while rcx--\n\t"
}
$$emit$$"# DONE"
%}
ins_encode %{
! __ clear_mem($base$$Register, $cnt$$Register, $val$$Register,
! $tmp$$XMMRegister, false, true);
%}
ins_pipe(pipe_slow);
%}
! instruct rep_stos_large(rcx_RegL cnt, rdi_RegP base, regD tmp, rax_RegL val,
Universe dummy, rFlagsReg cr)
%{
! predicate(((ClearArrayNode*)n)->is_large() && !((ClearArrayNode*)n)->word_copy_only());
! match(Set dummy (ClearArray (Binary cnt base) val));
! effect(USE_KILL cnt, USE_KILL base, TEMP tmp, KILL cr);
format %{ $$template
if (UseFastStosb) {
$$emit$$"shlq rcx,3\t# Convert doublewords to bytes\n\t"
$$emit$$"rep stosb\t# Store rax to *rdi++ while rcx--"
} else if (UseXMMForObjInit) {
! $$emit$$"movdq $tmp, $val\n\t"
! $$emit$$"punpcklqdq $tmp, $tmp\n\t"
! $$emit$$"vinserti128_high $tmp, $tmp\n\t"
$$emit$$"jmpq L_zero_64_bytes\n\t"
$$emit$$"# L_loop:\t# 64-byte LOOP\n\t"
! $$emit$$"vmovdqu $tmp,(rax)\n\t"
! $$emit$$"vmovdqu $tmp,0x20(rax)\n\t"
$$emit$$"add 0x40,rax\n\t"
$$emit$$"# L_zero_64_bytes:\n\t"
$$emit$$"sub 0x8,rcx\n\t"
$$emit$$"jge L_loop\n\t"
$$emit$$"add 0x4,rcx\n\t"
$$emit$$"jl L_tail\n\t"
! $$emit$$"vmovdqu $tmp,(rax)\n\t"
$$emit$$"add 0x20,rax\n\t"
$$emit$$"sub 0x4,rcx\n\t"
$$emit$$"# L_tail:\t# Clearing tail bytes\n\t"
$$emit$$"add 0x4,rcx\n\t"
$$emit$$"jle L_end\n\t"
*** 10932,10948 ****
$$emit$$"add 0x8,rax\n\t"
$$emit$$"dec rcx\n\t"
$$emit$$"jge L_sloop\n\t"
$$emit$$"# L_end:\n\t"
} else {
- $$emit$$"xorq rax, rax\t# ClearArray:\n\t"
$$emit$$"rep stosq\t# Store rax to *rdi++ while rcx--"
}
%}
ins_encode %{
! __ clear_mem($base$$Register, $cnt$$Register, $zero$$Register,
! $tmp$$XMMRegister, true);
%}
ins_pipe(pipe_slow);
%}
instruct string_compareL(rdi_RegP str1, rcx_RegI cnt1, rsi_RegP str2, rdx_RegI cnt2,
--- 11011,11072 ----
$$emit$$"add 0x8,rax\n\t"
$$emit$$"dec rcx\n\t"
$$emit$$"jge L_sloop\n\t"
$$emit$$"# L_end:\n\t"
} else {
$$emit$$"rep stosq\t# Store rax to *rdi++ while rcx--"
}
%}
ins_encode %{
! __ clear_mem($base$$Register, $cnt$$Register, $val$$Register,
! $tmp$$XMMRegister, true, false);
! %}
! ins_pipe(pipe_slow);
! %}
!
! instruct rep_stos_large_word_copy(rcx_RegL cnt, rdi_RegP base, regD tmp, rax_RegL val,
! Universe dummy, rFlagsReg cr)
! %{
! predicate(((ClearArrayNode*)n)->is_large() && ((ClearArrayNode*)n)->word_copy_only());
! match(Set dummy (ClearArray (Binary cnt base) val));
! effect(USE_KILL cnt, USE_KILL base, TEMP tmp, KILL cr);
!
! format %{ $$template
! if (UseXMMForObjInit) {
! $$emit$$"movdq $tmp, $val\n\t"
! $$emit$$"punpcklqdq $tmp, $tmp\n\t"
! $$emit$$"vinserti128_high $tmp, $tmp\n\t"
! $$emit$$"jmpq L_zero_64_bytes\n\t"
! $$emit$$"# L_loop:\t# 64-byte LOOP\n\t"
! $$emit$$"vmovdqu $tmp,(rax)\n\t"
! $$emit$$"vmovdqu $tmp,0x20(rax)\n\t"
! $$emit$$"add 0x40,rax\n\t"
! $$emit$$"# L_zero_64_bytes:\n\t"
! $$emit$$"sub 0x8,rcx\n\t"
! $$emit$$"jge L_loop\n\t"
! $$emit$$"add 0x4,rcx\n\t"
! $$emit$$"jl L_tail\n\t"
! $$emit$$"vmovdqu $tmp,(rax)\n\t"
! $$emit$$"add 0x20,rax\n\t"
! $$emit$$"sub 0x4,rcx\n\t"
! $$emit$$"# L_tail:\t# Clearing tail bytes\n\t"
! $$emit$$"add 0x4,rcx\n\t"
! $$emit$$"jle L_end\n\t"
! $$emit$$"dec rcx\n\t"
! $$emit$$"# L_sloop:\t# 8-byte short loop\n\t"
! $$emit$$"vmovq xmm0,(rax)\n\t"
! $$emit$$"add 0x8,rax\n\t"
! $$emit$$"dec rcx\n\t"
! $$emit$$"jge L_sloop\n\t"
! $$emit$$"# L_end:\n\t"
! } else {
! $$emit$$"rep stosq\t# Store rax to *rdi++ while rcx--"
! }
! %}
! ins_encode %{
! __ clear_mem($base$$Register, $cnt$$Register, $val$$Register,
! $tmp$$XMMRegister, true, true);
%}
ins_pipe(pipe_slow);
%}
instruct string_compareL(rdi_RegP str1, rcx_RegI cnt1, rsi_RegP str2, rdx_RegI cnt2,
*** 12511,12522 ****
--- 12635,12662 ----
ins_encode(clear_avx, Java_To_Runtime(meth));
ins_pipe(pipe_slow);
%}
// Call runtime without safepoint
+ // entry point is null, target holds the address to call
+ instruct CallLeafNoFPInDirect(rRegP target)
+ %{
+ predicate(n->as_Call()->entry_point() == NULL);
+ match(CallLeafNoFP target);
+
+ ins_cost(300);
+ format %{ "call_leaf_nofp,runtime indirect " %}
+ ins_encode %{
+ __ call($target$$Register);
+ %}
+
+ ins_pipe(pipe_slow);
+ %}
+
instruct CallLeafNoFPDirect(method meth)
%{
+ predicate(n->as_Call()->entry_point() != NULL);
match(CallLeafNoFP);
effect(USE meth);
ins_cost(300);
format %{ "call_leaf_nofp,runtime " %}
< prev index next >