annotate src/cpu/x86/vm/macroAssembler_x86.hpp @ 17716:cdb71841f4bc

6498581: ThreadInterruptTest3 produces wrong output on Windows Summary: There is race condition between os::interrupt and os::is_interrupted on Windows. In JVM_Sleep(Thread.sleep), check if thread gets interrupted, it may see interrupted but not really interrupted so cause spurious waking up (early return from sleep). Fix by checking if interrupt event really gets set thus prevent false return. For intrinsic of _isInterrupted, on Windows, go fastpath only on bit not set. Reviewed-by: acorn, kvn Contributed-by: david.holmes@oracle.com, yumin.qi@oracle.com
author minqi
date Wed, 26 Feb 2014 15:20:41 -0800
parents d13d7aba8c12
children 5292439ef895
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1 /*
11080
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
2 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4 *
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
7 * published by the Free Software Foundation.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
8 *
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
13 * accompanied this code).
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
14 *
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
18 *
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
21 * questions.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
22 *
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
23 */
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
24
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
25 #ifndef CPU_X86_VM_MACROASSEMBLER_X86_HPP
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
26 #define CPU_X86_VM_MACROASSEMBLER_X86_HPP
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
27
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
28 #include "asm/assembler.hpp"
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7477
diff changeset
29 #include "utilities/macros.hpp"
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
30
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
31
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
32 // MacroAssembler extends Assembler by frequently used macros.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
33 //
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
34 // Instructions for which a 'better' code sequence exists depending
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
35 // on arguments should also go in here.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
36
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
37 class MacroAssembler: public Assembler {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
38 friend class LIR_Assembler;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
39 friend class Runtime1; // as_Address()
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
40
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
41 protected:
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
42
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
43 Address as_Address(AddressLiteral adr);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
44 Address as_Address(ArrayAddress adr);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
45
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
46 // Support for VM calls
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
47 //
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
48 // This is the base routine called by the different versions of call_VM_leaf. The interpreter
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
49 // may customize this version by overriding it for its purposes (e.g., to save/restore
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
50 // additional registers when doing a VM call).
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
51 #ifdef CC_INTERP
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
52 // c++ interpreter never wants to use interp_masm version of call_VM
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
53 #define VIRTUAL
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
54 #else
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
55 #define VIRTUAL virtual
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
56 #endif
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
57
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
58 VIRTUAL void call_VM_leaf_base(
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
59 address entry_point, // the entry point
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
60 int number_of_arguments // the number of arguments to pop after the call
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
61 );
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
62
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
63 // This is the base routine called by the different versions of call_VM. The interpreter
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
64 // may customize this version by overriding it for its purposes (e.g., to save/restore
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
65 // additional registers when doing a VM call).
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
66 //
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
67 // If no java_thread register is specified (noreg) than rdi will be used instead. call_VM_base
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
68 // returns the register which contains the thread upon return. If a thread register has been
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
69 // specified, the return value will correspond to that register. If no last_java_sp is specified
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
70 // (noreg) than rsp will be used instead.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
71 VIRTUAL void call_VM_base( // returns the register containing the thread upon return
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
72 Register oop_result, // where an oop-result ends up if any; use noreg otherwise
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
73 Register java_thread, // the thread if computed before ; use noreg otherwise
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
74 Register last_java_sp, // to set up last_Java_frame in stubs; use noreg otherwise
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
75 address entry_point, // the entry point
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
76 int number_of_arguments, // the number of arguments (w/o thread) to pop after the call
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
77 bool check_exceptions // whether to check for pending exceptions after return
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
78 );
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
79
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
80 // These routines should emit JVMTI PopFrame and ForceEarlyReturn handling code.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
81 // The implementation is only non-empty for the InterpreterMacroAssembler,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
82 // as only the interpreter handles PopFrame and ForceEarlyReturn requests.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
83 virtual void check_and_handle_popframe(Register java_thread);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
84 virtual void check_and_handle_earlyret(Register java_thread);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
85
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
86 void call_VM_helper(Register oop_result, address entry_point, int number_of_arguments, bool check_exceptions = true);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
87
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
88 // helpers for FPU flag access
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
89 // tmp is a temporary register, if none is available use noreg
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
90 void save_rax (Register tmp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
91 void restore_rax(Register tmp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
92
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
93 public:
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
94 MacroAssembler(CodeBuffer* code) : Assembler(code) {}
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
95
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
96 // Support for NULL-checks
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
97 //
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
98 // Generates code that causes a NULL OS exception if the content of reg is NULL.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
99 // If the accessed location is M[reg + offset] and the offset is known, provide the
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
100 // offset. No explicit code generation is needed if the offset is within a certain
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
101 // range (0 <= offset <= page_size).
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
102
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
103 void null_check(Register reg, int offset = -1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
104 static bool needs_explicit_null_check(intptr_t offset);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
105
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
106 // Required platform-specific helpers for Label::patch_instructions.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
107 // They _shadow_ the declarations in AbstractAssembler, which are undefined.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
108 void pd_patch_instruction(address branch, address target) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
109 unsigned char op = branch[0];
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
110 assert(op == 0xE8 /* call */ ||
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
111 op == 0xE9 /* jmp */ ||
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
112 op == 0xEB /* short jmp */ ||
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
113 (op & 0xF0) == 0x70 /* short jcc */ ||
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
114 op == 0x0F && (branch[1] & 0xF0) == 0x80 /* jcc */,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
115 "Invalid opcode at patch point");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
116
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
117 if (op == 0xEB || (op & 0xF0) == 0x70) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
118 // short offset operators (jmp and jcc)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
119 char* disp = (char*) &branch[1];
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
120 int imm8 = target - (address) &disp[1];
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
121 guarantee(this->is8bit(imm8), "Short forward jump exceeds 8-bit offset");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
122 *disp = imm8;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
123 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
124 int* disp = (int*) &branch[(op == 0x0F)? 2: 1];
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
125 int imm32 = target - (address) &disp[1];
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
126 *disp = imm32;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
127 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
128 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
129
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
130 // The following 4 methods return the offset of the appropriate move instruction
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
131
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
132 // Support for fast byte/short loading with zero extension (depending on particular CPU)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
133 int load_unsigned_byte(Register dst, Address src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
134 int load_unsigned_short(Register dst, Address src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
135
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
136 // Support for fast byte/short loading with sign extension (depending on particular CPU)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
137 int load_signed_byte(Register dst, Address src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
138 int load_signed_short(Register dst, Address src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
139
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
140 // Support for sign-extension (hi:lo = extend_sign(lo))
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
141 void extend_sign(Register hi, Register lo);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
142
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
143 // Load and store values by size and signed-ness
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
144 void load_sized_value(Register dst, Address src, size_t size_in_bytes, bool is_signed, Register dst2 = noreg);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
145 void store_sized_value(Address dst, Register src, size_t size_in_bytes, Register src2 = noreg);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
146
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
147 // Support for inc/dec with optimal instruction selection depending on value
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
148
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
149 void increment(Register reg, int value = 1) { LP64_ONLY(incrementq(reg, value)) NOT_LP64(incrementl(reg, value)) ; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
150 void decrement(Register reg, int value = 1) { LP64_ONLY(decrementq(reg, value)) NOT_LP64(decrementl(reg, value)) ; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
151
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
152 void decrementl(Address dst, int value = 1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
153 void decrementl(Register reg, int value = 1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
154
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
155 void decrementq(Register reg, int value = 1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
156 void decrementq(Address dst, int value = 1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
157
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
158 void incrementl(Address dst, int value = 1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
159 void incrementl(Register reg, int value = 1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
160
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
161 void incrementq(Register reg, int value = 1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
162 void incrementq(Address dst, int value = 1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
163
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
164
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
165 // Support optimal SSE move instructions.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
166 void movflt(XMMRegister dst, XMMRegister src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
167 if (UseXmmRegToRegMoveAll) { movaps(dst, src); return; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
168 else { movss (dst, src); return; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
169 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
170 void movflt(XMMRegister dst, Address src) { movss(dst, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
171 void movflt(XMMRegister dst, AddressLiteral src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
172 void movflt(Address dst, XMMRegister src) { movss(dst, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
173
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
174 void movdbl(XMMRegister dst, XMMRegister src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
175 if (UseXmmRegToRegMoveAll) { movapd(dst, src); return; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
176 else { movsd (dst, src); return; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
177 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
178
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
179 void movdbl(XMMRegister dst, AddressLiteral src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
180
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
181 void movdbl(XMMRegister dst, Address src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
182 if (UseXmmLoadAndClearUpper) { movsd (dst, src); return; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
183 else { movlpd(dst, src); return; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
184 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
185 void movdbl(Address dst, XMMRegister src) { movsd(dst, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
186
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
187 void incrementl(AddressLiteral dst);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
188 void incrementl(ArrayAddress dst);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
189
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
190 // Alignment
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
191 void align(int modulus);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
192
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
193 // A 5 byte nop that is safe for patching (see patch_verified_entry)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
194 void fat_nop();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
195
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
196 // Stack frame creation/removal
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
197 void enter();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
198 void leave();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
200 // Support for getting the JavaThread pointer (i.e.; a reference to thread-local information)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
201 // The pointer will be loaded into the thread register.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
202 void get_thread(Register thread);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
203
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
204
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
205 // Support for VM calls
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
206 //
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
207 // It is imperative that all calls into the VM are handled via the call_VM macros.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
208 // They make sure that the stack linkage is setup correctly. call_VM's correspond
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
209 // to ENTRY/ENTRY_X entry points while call_VM_leaf's correspond to LEAF entry points.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
210
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
211
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
212 void call_VM(Register oop_result,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
213 address entry_point,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
214 bool check_exceptions = true);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
215 void call_VM(Register oop_result,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
216 address entry_point,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
217 Register arg_1,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
218 bool check_exceptions = true);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
219 void call_VM(Register oop_result,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
220 address entry_point,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
221 Register arg_1, Register arg_2,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
222 bool check_exceptions = true);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
223 void call_VM(Register oop_result,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
224 address entry_point,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
225 Register arg_1, Register arg_2, Register arg_3,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
226 bool check_exceptions = true);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
227
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
228 // Overloadings with last_Java_sp
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
229 void call_VM(Register oop_result,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
230 Register last_java_sp,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
231 address entry_point,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
232 int number_of_arguments = 0,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
233 bool check_exceptions = true);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
234 void call_VM(Register oop_result,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
235 Register last_java_sp,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
236 address entry_point,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
237 Register arg_1, bool
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
238 check_exceptions = true);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
239 void call_VM(Register oop_result,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
240 Register last_java_sp,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
241 address entry_point,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
242 Register arg_1, Register arg_2,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
243 bool check_exceptions = true);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
244 void call_VM(Register oop_result,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
245 Register last_java_sp,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
246 address entry_point,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
247 Register arg_1, Register arg_2, Register arg_3,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
248 bool check_exceptions = true);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
249
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
250 void get_vm_result (Register oop_result, Register thread);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
251 void get_vm_result_2(Register metadata_result, Register thread);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
252
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
253 // These always tightly bind to MacroAssembler::call_VM_base
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
254 // bypassing the virtual implementation
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
255 void super_call_VM(Register oop_result, Register last_java_sp, address entry_point, int number_of_arguments = 0, bool check_exceptions = true);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
256 void super_call_VM(Register oop_result, Register last_java_sp, address entry_point, Register arg_1, bool check_exceptions = true);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
257 void super_call_VM(Register oop_result, Register last_java_sp, address entry_point, Register arg_1, Register arg_2, bool check_exceptions = true);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
258 void super_call_VM(Register oop_result, Register last_java_sp, address entry_point, Register arg_1, Register arg_2, Register arg_3, bool check_exceptions = true);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
259 void super_call_VM(Register oop_result, Register last_java_sp, address entry_point, Register arg_1, Register arg_2, Register arg_3, Register arg_4, bool check_exceptions = true);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
260
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
261 void call_VM_leaf(address entry_point,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
262 int number_of_arguments = 0);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
263 void call_VM_leaf(address entry_point,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
264 Register arg_1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
265 void call_VM_leaf(address entry_point,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
266 Register arg_1, Register arg_2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
267 void call_VM_leaf(address entry_point,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
268 Register arg_1, Register arg_2, Register arg_3);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
269
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
270 // These always tightly bind to MacroAssembler::call_VM_leaf_base
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
271 // bypassing the virtual implementation
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
272 void super_call_VM_leaf(address entry_point);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
273 void super_call_VM_leaf(address entry_point, Register arg_1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
274 void super_call_VM_leaf(address entry_point, Register arg_1, Register arg_2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
275 void super_call_VM_leaf(address entry_point, Register arg_1, Register arg_2, Register arg_3);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
276 void super_call_VM_leaf(address entry_point, Register arg_1, Register arg_2, Register arg_3, Register arg_4);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
277
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
278 // last Java Frame (fills frame anchor)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
279 void set_last_Java_frame(Register thread,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
280 Register last_java_sp,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
281 Register last_java_fp,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
282 address last_java_pc);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
283
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
284 // thread in the default location (r15_thread on 64bit)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
285 void set_last_Java_frame(Register last_java_sp,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
286 Register last_java_fp,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
287 address last_java_pc);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
288
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
289 void reset_last_Java_frame(Register thread, bool clear_fp, bool clear_pc);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
290
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
291 // thread in the default location (r15_thread on 64bit)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
292 void reset_last_Java_frame(bool clear_fp, bool clear_pc);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
293
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
294 // Stores
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
295 void store_check(Register obj); // store check for obj - register is destroyed afterwards
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
296 void store_check(Register obj, Address dst); // same as above, dst is exact store location (reg. is destroyed)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
297
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7477
diff changeset
298 #if INCLUDE_ALL_GCS
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
299
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
300 void g1_write_barrier_pre(Register obj,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
301 Register pre_val,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
302 Register thread,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
303 Register tmp,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
304 bool tosca_live,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
305 bool expand_call);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
306
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
307 void g1_write_barrier_post(Register store_addr,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
308 Register new_val,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
309 Register thread,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
310 Register tmp,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
311 Register tmp2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
312
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7477
diff changeset
313 #endif // INCLUDE_ALL_GCS
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
314
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
315 // split store_check(Register obj) to enhance instruction interleaving
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
316 void store_check_part_1(Register obj);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
317 void store_check_part_2(Register obj);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
318
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
319 // C 'boolean' to Java boolean: x == 0 ? 0 : 1
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
320 void c2bool(Register x);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
321
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
322 // C++ bool manipulation
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
323
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
324 void movbool(Register dst, Address src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
325 void movbool(Address dst, bool boolconst);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
326 void movbool(Address dst, Register src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
327 void testbool(Register dst);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
328
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
329 // oop manipulations
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
330 void load_klass(Register dst, Register src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
331 void store_klass(Register dst, Register src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
332
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
333 void load_heap_oop(Register dst, Address src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
334 void load_heap_oop_not_null(Register dst, Address src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
335 void store_heap_oop(Address dst, Register src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
336 void cmp_heap_oop(Register src1, Address src2, Register tmp = noreg);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
337
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
338 // Used for storing NULL. All other oop constants should be
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
339 // stored using routines that take a jobject.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
340 void store_heap_oop_null(Address dst);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
341
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
342 void load_prototype_header(Register dst, Register src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
343
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
344 #ifdef _LP64
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
345 void store_klass_gap(Register dst, Register src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
346
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
347 // This dummy is to prevent a call to store_heap_oop from
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
348 // converting a zero (like NULL) into a Register by giving
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
349 // the compiler two choices it can't resolve
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
350
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
351 void store_heap_oop(Address dst, void* dummy);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
352
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
353 void encode_heap_oop(Register r);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
354 void decode_heap_oop(Register r);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
355 void encode_heap_oop_not_null(Register r);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
356 void decode_heap_oop_not_null(Register r);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
357 void encode_heap_oop_not_null(Register dst, Register src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
358 void decode_heap_oop_not_null(Register dst, Register src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
359
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
360 void set_narrow_oop(Register dst, jobject obj);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
361 void set_narrow_oop(Address dst, jobject obj);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
362 void cmp_narrow_oop(Register dst, jobject obj);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
363 void cmp_narrow_oop(Address dst, jobject obj);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
364
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
365 void encode_klass_not_null(Register r);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
366 void decode_klass_not_null(Register r);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
367 void encode_klass_not_null(Register dst, Register src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
368 void decode_klass_not_null(Register dst, Register src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
369 void set_narrow_klass(Register dst, Klass* k);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
370 void set_narrow_klass(Address dst, Klass* k);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
371 void cmp_narrow_klass(Register dst, Klass* k);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
372 void cmp_narrow_klass(Address dst, Klass* k);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
373
12056
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
374 // Returns the byte size of the instructions generated by decode_klass_not_null()
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
375 // when compressed klass pointers are being used.
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
376 static int instr_size_for_decode_klass_not_null();
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
377
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
378 // if heap base register is used - reinit it with the correct value
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
379 void reinit_heapbase();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
380
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
381 DEBUG_ONLY(void verify_heapbase(const char* msg);)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
382
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
383 #endif // _LP64
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
384
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
385 // Int division/remainder for Java
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
386 // (as idivl, but checks for special case as described in JVM spec.)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
387 // returns idivl instruction offset for implicit exception handling
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
388 int corrected_idivl(Register reg);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
389
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
390 // Long division/remainder for Java
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
391 // (as idivq, but checks for special case as described in JVM spec.)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
392 // returns idivq instruction offset for implicit exception handling
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
393 int corrected_idivq(Register reg);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
394
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
395 void int3();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
396
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
397 // Long operation macros for a 32bit cpu
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
398 // Long negation for Java
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
399 void lneg(Register hi, Register lo);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
400
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
401 // Long multiplication for Java
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
402 // (destroys contents of eax, ebx, ecx and edx)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
403 void lmul(int x_rsp_offset, int y_rsp_offset); // rdx:rax = x * y
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
404
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
405 // Long shifts for Java
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
406 // (semantics as described in JVM spec.)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
407 void lshl(Register hi, Register lo); // hi:lo << (rcx & 0x3f)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
408 void lshr(Register hi, Register lo, bool sign_extension = false); // hi:lo >> (rcx & 0x3f)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
409
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
410 // Long compare for Java
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
411 // (semantics as described in JVM spec.)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
412 void lcmp2int(Register x_hi, Register x_lo, Register y_hi, Register y_lo); // x_hi = lcmp(x, y)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
413
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
414
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
415 // misc
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
416
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
417 // Sign extension
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
418 void sign_extend_short(Register reg);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
419 void sign_extend_byte(Register reg);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
420
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
421 // Division by power of 2, rounding towards 0
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
422 void division_with_shift(Register reg, int shift_value);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
423
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
424 // Compares the top-most stack entries on the FPU stack and sets the eflags as follows:
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
425 //
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
426 // CF (corresponds to C0) if x < y
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
427 // PF (corresponds to C2) if unordered
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
428 // ZF (corresponds to C3) if x = y
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
429 //
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
430 // The arguments are in reversed order on the stack (i.e., top of stack is first argument).
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
431 // tmp is a temporary register, if none is available use noreg (only matters for non-P6 code)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
432 void fcmp(Register tmp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
433 // Variant of the above which allows y to be further down the stack
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
434 // and which only pops x and y if specified. If pop_right is
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
435 // specified then pop_left must also be specified.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
436 void fcmp(Register tmp, int index, bool pop_left, bool pop_right);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
437
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
438 // Floating-point comparison for Java
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
439 // Compares the top-most stack entries on the FPU stack and stores the result in dst.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
440 // The arguments are in reversed order on the stack (i.e., top of stack is first argument).
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
441 // (semantics as described in JVM spec.)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
442 void fcmp2int(Register dst, bool unordered_is_less);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
443 // Variant of the above which allows y to be further down the stack
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
444 // and which only pops x and y if specified. If pop_right is
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
445 // specified then pop_left must also be specified.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
446 void fcmp2int(Register dst, bool unordered_is_less, int index, bool pop_left, bool pop_right);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
447
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
448 // Floating-point remainder for Java (ST0 = ST0 fremr ST1, ST1 is empty afterwards)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
449 // tmp is a temporary register, if none is available use noreg
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
450 void fremr(Register tmp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
451
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
452
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
453 // same as fcmp2int, but using SSE2
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
454 void cmpss2int(XMMRegister opr1, XMMRegister opr2, Register dst, bool unordered_is_less);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
455 void cmpsd2int(XMMRegister opr1, XMMRegister opr2, Register dst, bool unordered_is_less);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
456
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
457 // Inlined sin/cos generator for Java; must not use CPU instruction
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
458 // directly on Intel as it does not have high enough precision
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
459 // outside of the range [-pi/4, pi/4]. Extra argument indicate the
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
460 // number of FPU stack slots in use; all but the topmost will
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
461 // require saving if a slow case is necessary. Assumes argument is
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
462 // on FP TOS; result is on FP TOS. No cpu registers are changed by
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
463 // this code.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
464 void trigfunc(char trig, int num_fpu_regs_in_use = 1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
465
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
466 // branch to L if FPU flag C2 is set/not set
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
467 // tmp is a temporary register, if none is available use noreg
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
468 void jC2 (Register tmp, Label& L);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
469 void jnC2(Register tmp, Label& L);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
470
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
471 // Pop ST (ffree & fincstp combined)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
472 void fpop();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
473
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
474 // pushes double TOS element of FPU stack on CPU stack; pops from FPU stack
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
475 void push_fTOS();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
476
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
477 // pops double TOS element from CPU stack and pushes on FPU stack
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
478 void pop_fTOS();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
479
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
480 void empty_FPU_stack();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
481
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
482 void push_IU_state();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
483 void pop_IU_state();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
484
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
485 void push_FPU_state();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
486 void pop_FPU_state();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
487
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
488 void push_CPU_state();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
489 void pop_CPU_state();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
490
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
491 // Round up to a power of two
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
492 void round_to(Register reg, int modulus);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
493
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
494 // Callee saved registers handling
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
495 void push_callee_saved_registers();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
496 void pop_callee_saved_registers();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
497
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
498 // allocation
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
499 void eden_allocate(
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
500 Register obj, // result: pointer to object after successful allocation
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
501 Register var_size_in_bytes, // object size in bytes if unknown at compile time; invalid otherwise
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
502 int con_size_in_bytes, // object size in bytes if known at compile time
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
503 Register t1, // temp register
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
504 Label& slow_case // continuation point if fast allocation fails
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
505 );
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
506 void tlab_allocate(
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
507 Register obj, // result: pointer to object after successful allocation
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
508 Register var_size_in_bytes, // object size in bytes if unknown at compile time; invalid otherwise
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
509 int con_size_in_bytes, // object size in bytes if known at compile time
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
510 Register t1, // temp register
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
511 Register t2, // temp register
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
512 Label& slow_case // continuation point if fast allocation fails
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
513 );
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
514 Register tlab_refill(Label& retry_tlab, Label& try_eden, Label& slow_case); // returns TLS address
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
515 void incr_allocated_bytes(Register thread,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
516 Register var_size_in_bytes, int con_size_in_bytes,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
517 Register t1 = noreg);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
518
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
519 // interface method calling
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
520 void lookup_interface_method(Register recv_klass,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
521 Register intf_klass,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
522 RegisterOrConstant itable_index,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
523 Register method_result,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
524 Register scan_temp,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
525 Label& no_such_interface);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
526
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
527 // virtual method calling
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
528 void lookup_virtual_method(Register recv_klass,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
529 RegisterOrConstant vtable_index,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
530 Register method_result);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
531
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
532 // Test sub_klass against super_klass, with fast and slow paths.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
533
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
534 // The fast path produces a tri-state answer: yes / no / maybe-slow.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
535 // One of the three labels can be NULL, meaning take the fall-through.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
536 // If super_check_offset is -1, the value is loaded up from super_klass.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
537 // No registers are killed, except temp_reg.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
538 void check_klass_subtype_fast_path(Register sub_klass,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
539 Register super_klass,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
540 Register temp_reg,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
541 Label* L_success,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
542 Label* L_failure,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
543 Label* L_slow_path,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
544 RegisterOrConstant super_check_offset = RegisterOrConstant(-1));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
545
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
546 // The rest of the type check; must be wired to a corresponding fast path.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
547 // It does not repeat the fast path logic, so don't use it standalone.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
548 // The temp_reg and temp2_reg can be noreg, if no temps are available.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
549 // Updates the sub's secondary super cache as necessary.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
550 // If set_cond_codes, condition codes will be Z on success, NZ on failure.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
551 void check_klass_subtype_slow_path(Register sub_klass,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
552 Register super_klass,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
553 Register temp_reg,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
554 Register temp2_reg,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
555 Label* L_success,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
556 Label* L_failure,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
557 bool set_cond_codes = false);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
558
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
559 // Simplified, combined version, good for typical uses.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
560 // Falls through on failure.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
561 void check_klass_subtype(Register sub_klass,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
562 Register super_klass,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
563 Register temp_reg,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
564 Label& L_success);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
565
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
566 // method handles (JSR 292)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
567 Address argument_address(RegisterOrConstant arg_slot, int extra_slot_offset = 0);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
568
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
569 //----
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
570 void set_word_if_not_zero(Register reg); // sets reg to 1 if not zero, otherwise 0
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
571
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
572 // Debugging
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
573
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
574 // only if +VerifyOops
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
575 // TODO: Make these macros with file and line like sparc version!
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
576 void verify_oop(Register reg, const char* s = "broken oop");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
577 void verify_oop_addr(Address addr, const char * s = "broken oop addr");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
578
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
579 // TODO: verify method and klass metadata (compare against vptr?)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
580 void _verify_method_ptr(Register reg, const char * msg, const char * file, int line) {}
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
581 void _verify_klass_ptr(Register reg, const char * msg, const char * file, int line){}
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
582
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
583 #define verify_method_ptr(reg) _verify_method_ptr(reg, "broken method " #reg, __FILE__, __LINE__)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
584 #define verify_klass_ptr(reg) _verify_klass_ptr(reg, "broken klass " #reg, __FILE__, __LINE__)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
585
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
586 // only if +VerifyFPU
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
587 void verify_FPU(int stack_depth, const char* s = "illegal FPU state");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
588
8873
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 8002
diff changeset
589 // Verify or restore cpu control state after JNI call
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 8002
diff changeset
590 void restore_cpu_control_state_after_jni();
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 8002
diff changeset
591
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
592 // prints msg, dumps registers and stops execution
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
593 void stop(const char* msg);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
594
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
595 // prints msg and continues
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
596 void warn(const char* msg);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
597
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
598 // dumps registers and other state
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
599 void print_state();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
600
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
601 static void debug32(int rdi, int rsi, int rbp, int rsp, int rbx, int rdx, int rcx, int rax, int eip, char* msg);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
602 static void debug64(char* msg, int64_t pc, int64_t regs[]);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
603 static void print_state32(int rdi, int rsi, int rbp, int rsp, int rbx, int rdx, int rcx, int rax, int eip);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
604 static void print_state64(int64_t pc, int64_t regs[]);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
605
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
606 void os_breakpoint();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
607
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
608 void untested() { stop("untested"); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
609
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
610 void unimplemented(const char* what = "") { char* b = new char[1024]; jio_snprintf(b, 1024, "unimplemented: %s", what); stop(b); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
611
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
612 void should_not_reach_here() { stop("should not reach here"); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
613
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
614 void print_CPU_state();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
615
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
616 // Stack overflow checking
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
617 void bang_stack_with_offset(int offset) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
618 // stack grows down, caller passes positive offset
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
619 assert(offset > 0, "must bang with negative offset");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
620 movl(Address(rsp, (-offset)), rax);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
621 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
622
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
623 // Writes to stack successive pages until offset reached to check for
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
624 // stack overflow + shadow pages. Also, clobbers tmp
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
625 void bang_stack_size(Register size, Register tmp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
626
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
627 virtual RegisterOrConstant delayed_value_impl(intptr_t* delayed_value_addr,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
628 Register tmp,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
629 int offset);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
630
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
631 // Support for serializing memory accesses between threads
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
632 void serialize_memory(Register thread, Register tmp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
633
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
634 void verify_tlab();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
635
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
636 // Biased locking support
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
637 // lock_reg and obj_reg must be loaded up with the appropriate values.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
638 // swap_reg must be rax, and is killed.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
639 // tmp_reg is optional. If it is supplied (i.e., != noreg) it will
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
640 // be killed; if not supplied, push/pop will be used internally to
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
641 // allocate a temporary (inefficient, avoid if possible).
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
642 // Optional slow case is for implementations (interpreter and C1) which branch to
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
643 // slow case directly. Leaves condition codes set for C2's Fast_Lock node.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
644 // Returns offset of first potentially-faulting instruction for null
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
645 // check info (currently consumed only by C1). If
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
646 // swap_reg_contains_mark is true then returns -1 as it is assumed
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
647 // the calling code has already passed any potential faults.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
648 int biased_locking_enter(Register lock_reg, Register obj_reg,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
649 Register swap_reg, Register tmp_reg,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
650 bool swap_reg_contains_mark,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
651 Label& done, Label* slow_case = NULL,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
652 BiasedLockingCounters* counters = NULL);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
653 void biased_locking_exit (Register obj_reg, Register temp_reg, Label& done);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
654
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
655
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
656 Condition negate_condition(Condition cond);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
657
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
658 // Instructions that use AddressLiteral operands. These instruction can handle 32bit/64bit
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
659 // operands. In general the names are modified to avoid hiding the instruction in Assembler
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
660 // so that we don't need to implement all the varieties in the Assembler with trivial wrappers
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
661 // here in MacroAssembler. The major exception to this rule is call
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
662
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
663 // Arithmetics
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
664
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
665
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
666 void addptr(Address dst, int32_t src) { LP64_ONLY(addq(dst, src)) NOT_LP64(addl(dst, src)) ; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
667 void addptr(Address dst, Register src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
668
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
669 void addptr(Register dst, Address src) { LP64_ONLY(addq(dst, src)) NOT_LP64(addl(dst, src)); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
670 void addptr(Register dst, int32_t src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
671 void addptr(Register dst, Register src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
672 void addptr(Register dst, RegisterOrConstant src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
673 if (src.is_constant()) addptr(dst, (int) src.as_constant());
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
674 else addptr(dst, src.as_register());
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
675 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
676
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
677 void andptr(Register dst, int32_t src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
678 void andptr(Register src1, Register src2) { LP64_ONLY(andq(src1, src2)) NOT_LP64(andl(src1, src2)) ; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
679
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
680 void cmp8(AddressLiteral src1, int imm);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
681
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
682 // renamed to drag out the casting of address to int32_t/intptr_t
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
683 void cmp32(Register src1, int32_t imm);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
684
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
685 void cmp32(AddressLiteral src1, int32_t imm);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
686 // compare reg - mem, or reg - &mem
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
687 void cmp32(Register src1, AddressLiteral src2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
688
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
689 void cmp32(Register src1, Address src2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
690
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
691 #ifndef _LP64
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
692 void cmpklass(Address dst, Metadata* obj);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
693 void cmpklass(Register dst, Metadata* obj);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
694 void cmpoop(Address dst, jobject obj);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
695 void cmpoop(Register dst, jobject obj);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
696 #endif // _LP64
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
697
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
698 // NOTE src2 must be the lval. This is NOT an mem-mem compare
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
699 void cmpptr(Address src1, AddressLiteral src2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
700
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
701 void cmpptr(Register src1, AddressLiteral src2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
702
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
703 void cmpptr(Register src1, Register src2) { LP64_ONLY(cmpq(src1, src2)) NOT_LP64(cmpl(src1, src2)) ; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
704 void cmpptr(Register src1, Address src2) { LP64_ONLY(cmpq(src1, src2)) NOT_LP64(cmpl(src1, src2)) ; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
705 // void cmpptr(Address src1, Register src2) { LP64_ONLY(cmpq(src1, src2)) NOT_LP64(cmpl(src1, src2)) ; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
706
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
707 void cmpptr(Register src1, int32_t src2) { LP64_ONLY(cmpq(src1, src2)) NOT_LP64(cmpl(src1, src2)) ; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
708 void cmpptr(Address src1, int32_t src2) { LP64_ONLY(cmpq(src1, src2)) NOT_LP64(cmpl(src1, src2)) ; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
709
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
710 // cmp64 to avoild hiding cmpq
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
711 void cmp64(Register src1, AddressLiteral src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
712
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
713 void cmpxchgptr(Register reg, Address adr);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
714
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
715 void locked_cmpxchgptr(Register reg, AddressLiteral adr);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
716
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
717
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
718 void imulptr(Register dst, Register src) { LP64_ONLY(imulq(dst, src)) NOT_LP64(imull(dst, src)); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
719
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
720
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
721 void negptr(Register dst) { LP64_ONLY(negq(dst)) NOT_LP64(negl(dst)); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
722
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
723 void notptr(Register dst) { LP64_ONLY(notq(dst)) NOT_LP64(notl(dst)); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
724
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
725 void shlptr(Register dst, int32_t shift);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
726 void shlptr(Register dst) { LP64_ONLY(shlq(dst)) NOT_LP64(shll(dst)); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
727
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
728 void shrptr(Register dst, int32_t shift);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
729 void shrptr(Register dst) { LP64_ONLY(shrq(dst)) NOT_LP64(shrl(dst)); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
730
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
731 void sarptr(Register dst) { LP64_ONLY(sarq(dst)) NOT_LP64(sarl(dst)); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
732 void sarptr(Register dst, int32_t src) { LP64_ONLY(sarq(dst, src)) NOT_LP64(sarl(dst, src)); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
733
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
734 void subptr(Address dst, int32_t src) { LP64_ONLY(subq(dst, src)) NOT_LP64(subl(dst, src)); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
735
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
736 void subptr(Register dst, Address src) { LP64_ONLY(subq(dst, src)) NOT_LP64(subl(dst, src)); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
737 void subptr(Register dst, int32_t src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
738 // Force generation of a 4 byte immediate value even if it fits into 8bit
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
739 void subptr_imm32(Register dst, int32_t src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
740 void subptr(Register dst, Register src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
741 void subptr(Register dst, RegisterOrConstant src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
742 if (src.is_constant()) subptr(dst, (int) src.as_constant());
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
743 else subptr(dst, src.as_register());
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
744 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
745
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
746 void sbbptr(Address dst, int32_t src) { LP64_ONLY(sbbq(dst, src)) NOT_LP64(sbbl(dst, src)); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
747 void sbbptr(Register dst, int32_t src) { LP64_ONLY(sbbq(dst, src)) NOT_LP64(sbbl(dst, src)); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
748
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
749 void xchgptr(Register src1, Register src2) { LP64_ONLY(xchgq(src1, src2)) NOT_LP64(xchgl(src1, src2)) ; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
750 void xchgptr(Register src1, Address src2) { LP64_ONLY(xchgq(src1, src2)) NOT_LP64(xchgl(src1, src2)) ; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
751
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
752 void xaddptr(Address src1, Register src2) { LP64_ONLY(xaddq(src1, src2)) NOT_LP64(xaddl(src1, src2)) ; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
753
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
754
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
755
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
756 // Helper functions for statistics gathering.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
757 // Conditionally (atomically, on MPs) increments passed counter address, preserving condition codes.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
758 void cond_inc32(Condition cond, AddressLiteral counter_addr);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
759 // Unconditional atomic increment.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
760 void atomic_incl(AddressLiteral counter_addr);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
761
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
762 void lea(Register dst, AddressLiteral adr);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
763 void lea(Address dst, AddressLiteral adr);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
764 void lea(Register dst, Address adr) { Assembler::lea(dst, adr); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
765
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
766 void leal32(Register dst, Address src) { leal(dst, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
767
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
768 // Import other testl() methods from the parent class or else
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
769 // they will be hidden by the following overriding declaration.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
770 using Assembler::testl;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
771 void testl(Register dst, AddressLiteral src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
772
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
773 void orptr(Register dst, Address src) { LP64_ONLY(orq(dst, src)) NOT_LP64(orl(dst, src)); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
774 void orptr(Register dst, Register src) { LP64_ONLY(orq(dst, src)) NOT_LP64(orl(dst, src)); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
775 void orptr(Register dst, int32_t src) { LP64_ONLY(orq(dst, src)) NOT_LP64(orl(dst, src)); }
12875
d13d7aba8c12 8023657: New type profiling points: arguments to call
roland
parents: 12056
diff changeset
776 void orptr(Address dst, int32_t imm32) { LP64_ONLY(orq(dst, imm32)) NOT_LP64(orl(dst, imm32)); }
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
777
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
778 void testptr(Register src, int32_t imm32) { LP64_ONLY(testq(src, imm32)) NOT_LP64(testl(src, imm32)); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
779 void testptr(Register src1, Register src2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
780
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
781 void xorptr(Register dst, Register src) { LP64_ONLY(xorq(dst, src)) NOT_LP64(xorl(dst, src)); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
782 void xorptr(Register dst, Address src) { LP64_ONLY(xorq(dst, src)) NOT_LP64(xorl(dst, src)); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
783
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
784 // Calls
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
785
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
786 void call(Label& L, relocInfo::relocType rtype);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
787 void call(Register entry);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
788
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
789 // NOTE: this call tranfers to the effective address of entry NOT
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
790 // the address contained by entry. This is because this is more natural
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
791 // for jumps/calls.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
792 void call(AddressLiteral entry);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
793
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
794 // Emit the CompiledIC call idiom
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
795 void ic_call(address entry);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
796
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
797 // Jumps
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
798
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
799 // NOTE: these jumps tranfer to the effective address of dst NOT
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
800 // the address contained by dst. This is because this is more natural
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
801 // for jumps/calls.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
802 void jump(AddressLiteral dst);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
803 void jump_cc(Condition cc, AddressLiteral dst);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
804
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
805 // 32bit can do a case table jump in one instruction but we no longer allow the base
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
806 // to be installed in the Address class. This jump will tranfers to the address
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
807 // contained in the location described by entry (not the address of entry)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
808 void jump(ArrayAddress entry);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
809
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
810 // Floating
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
811
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
812 void andpd(XMMRegister dst, Address src) { Assembler::andpd(dst, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
813 void andpd(XMMRegister dst, AddressLiteral src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
814
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
815 void andps(XMMRegister dst, XMMRegister src) { Assembler::andps(dst, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
816 void andps(XMMRegister dst, Address src) { Assembler::andps(dst, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
817 void andps(XMMRegister dst, AddressLiteral src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
818
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
819 void comiss(XMMRegister dst, XMMRegister src) { Assembler::comiss(dst, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
820 void comiss(XMMRegister dst, Address src) { Assembler::comiss(dst, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
821 void comiss(XMMRegister dst, AddressLiteral src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
822
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
823 void comisd(XMMRegister dst, XMMRegister src) { Assembler::comisd(dst, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
824 void comisd(XMMRegister dst, Address src) { Assembler::comisd(dst, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
825 void comisd(XMMRegister dst, AddressLiteral src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
826
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
827 void fadd_s(Address src) { Assembler::fadd_s(src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
828 void fadd_s(AddressLiteral src) { Assembler::fadd_s(as_Address(src)); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
829
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
830 void fldcw(Address src) { Assembler::fldcw(src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
831 void fldcw(AddressLiteral src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
832
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
833 void fld_s(int index) { Assembler::fld_s(index); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
834 void fld_s(Address src) { Assembler::fld_s(src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
835 void fld_s(AddressLiteral src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
836
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
837 void fld_d(Address src) { Assembler::fld_d(src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
838 void fld_d(AddressLiteral src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
839
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
840 void fld_x(Address src) { Assembler::fld_x(src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
841 void fld_x(AddressLiteral src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
842
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
843 void fmul_s(Address src) { Assembler::fmul_s(src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
844 void fmul_s(AddressLiteral src) { Assembler::fmul_s(as_Address(src)); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
845
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
846 void ldmxcsr(Address src) { Assembler::ldmxcsr(src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
847 void ldmxcsr(AddressLiteral src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
848
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
849 // compute pow(x,y) and exp(x) with x86 instructions. Don't cover
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
850 // all corner cases and may result in NaN and require fallback to a
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
851 // runtime call.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
852 void fast_pow();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
853 void fast_exp();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
854 void increase_precision();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
855 void restore_precision();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
856
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
857 // computes exp(x). Fallback to runtime call included.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
858 void exp_with_fallback(int num_fpu_regs_in_use) { pow_or_exp(true, num_fpu_regs_in_use); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
859 // computes pow(x,y). Fallback to runtime call included.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
860 void pow_with_fallback(int num_fpu_regs_in_use) { pow_or_exp(false, num_fpu_regs_in_use); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
861
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
862 private:
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
863
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
864 // call runtime as a fallback for trig functions and pow/exp.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
865 void fp_runtime_fallback(address runtime_entry, int nb_args, int num_fpu_regs_in_use);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
866
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
867 // computes 2^(Ylog2X); Ylog2X in ST(0)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
868 void pow_exp_core_encoding();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
869
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
870 // computes pow(x,y) or exp(x). Fallback to runtime call included.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
871 void pow_or_exp(bool is_exp, int num_fpu_regs_in_use);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
872
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
873 // these are private because users should be doing movflt/movdbl
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
874
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
875 void movss(Address dst, XMMRegister src) { Assembler::movss(dst, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
876 void movss(XMMRegister dst, XMMRegister src) { Assembler::movss(dst, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
877 void movss(XMMRegister dst, Address src) { Assembler::movss(dst, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
878 void movss(XMMRegister dst, AddressLiteral src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
879
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
880 void movlpd(XMMRegister dst, Address src) {Assembler::movlpd(dst, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
881 void movlpd(XMMRegister dst, AddressLiteral src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
882
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
883 public:
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
884
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
885 void addsd(XMMRegister dst, XMMRegister src) { Assembler::addsd(dst, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
886 void addsd(XMMRegister dst, Address src) { Assembler::addsd(dst, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
887 void addsd(XMMRegister dst, AddressLiteral src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
888
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
889 void addss(XMMRegister dst, XMMRegister src) { Assembler::addss(dst, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
890 void addss(XMMRegister dst, Address src) { Assembler::addss(dst, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
891 void addss(XMMRegister dst, AddressLiteral src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
892
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
893 void divsd(XMMRegister dst, XMMRegister src) { Assembler::divsd(dst, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
894 void divsd(XMMRegister dst, Address src) { Assembler::divsd(dst, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
895 void divsd(XMMRegister dst, AddressLiteral src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
896
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
897 void divss(XMMRegister dst, XMMRegister src) { Assembler::divss(dst, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
898 void divss(XMMRegister dst, Address src) { Assembler::divss(dst, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
899 void divss(XMMRegister dst, AddressLiteral src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
900
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
901 // Move Unaligned Double Quadword
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
902 void movdqu(Address dst, XMMRegister src) { Assembler::movdqu(dst, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
903 void movdqu(XMMRegister dst, Address src) { Assembler::movdqu(dst, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
904 void movdqu(XMMRegister dst, XMMRegister src) { Assembler::movdqu(dst, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
905 void movdqu(XMMRegister dst, AddressLiteral src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
906
11080
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
907 // Move Aligned Double Quadword
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
908 void movdqa(XMMRegister dst, Address src) { Assembler::movdqa(dst, src); }
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
909 void movdqa(XMMRegister dst, XMMRegister src) { Assembler::movdqa(dst, src); }
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
910 void movdqa(XMMRegister dst, AddressLiteral src);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
911
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
912 void movsd(XMMRegister dst, XMMRegister src) { Assembler::movsd(dst, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
913 void movsd(Address dst, XMMRegister src) { Assembler::movsd(dst, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
914 void movsd(XMMRegister dst, Address src) { Assembler::movsd(dst, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
915 void movsd(XMMRegister dst, AddressLiteral src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
916
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
917 void mulsd(XMMRegister dst, XMMRegister src) { Assembler::mulsd(dst, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
918 void mulsd(XMMRegister dst, Address src) { Assembler::mulsd(dst, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
919 void mulsd(XMMRegister dst, AddressLiteral src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
920
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
921 void mulss(XMMRegister dst, XMMRegister src) { Assembler::mulss(dst, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
922 void mulss(XMMRegister dst, Address src) { Assembler::mulss(dst, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
923 void mulss(XMMRegister dst, AddressLiteral src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
924
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
925 void sqrtsd(XMMRegister dst, XMMRegister src) { Assembler::sqrtsd(dst, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
926 void sqrtsd(XMMRegister dst, Address src) { Assembler::sqrtsd(dst, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
927 void sqrtsd(XMMRegister dst, AddressLiteral src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
928
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
929 void sqrtss(XMMRegister dst, XMMRegister src) { Assembler::sqrtss(dst, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
930 void sqrtss(XMMRegister dst, Address src) { Assembler::sqrtss(dst, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
931 void sqrtss(XMMRegister dst, AddressLiteral src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
932
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
933 void subsd(XMMRegister dst, XMMRegister src) { Assembler::subsd(dst, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
934 void subsd(XMMRegister dst, Address src) { Assembler::subsd(dst, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
935 void subsd(XMMRegister dst, AddressLiteral src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
936
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
937 void subss(XMMRegister dst, XMMRegister src) { Assembler::subss(dst, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
938 void subss(XMMRegister dst, Address src) { Assembler::subss(dst, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
939 void subss(XMMRegister dst, AddressLiteral src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
940
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
941 void ucomiss(XMMRegister dst, XMMRegister src) { Assembler::ucomiss(dst, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
942 void ucomiss(XMMRegister dst, Address src) { Assembler::ucomiss(dst, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
943 void ucomiss(XMMRegister dst, AddressLiteral src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
944
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
945 void ucomisd(XMMRegister dst, XMMRegister src) { Assembler::ucomisd(dst, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
946 void ucomisd(XMMRegister dst, Address src) { Assembler::ucomisd(dst, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
947 void ucomisd(XMMRegister dst, AddressLiteral src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
948
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
949 // Bitwise Logical XOR of Packed Double-Precision Floating-Point Values
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
950 void xorpd(XMMRegister dst, XMMRegister src) { Assembler::xorpd(dst, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
951 void xorpd(XMMRegister dst, Address src) { Assembler::xorpd(dst, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
952 void xorpd(XMMRegister dst, AddressLiteral src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
953
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
954 // Bitwise Logical XOR of Packed Single-Precision Floating-Point Values
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
955 void xorps(XMMRegister dst, XMMRegister src) { Assembler::xorps(dst, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
956 void xorps(XMMRegister dst, Address src) { Assembler::xorps(dst, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
957 void xorps(XMMRegister dst, AddressLiteral src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
958
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
959 // Shuffle Bytes
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
960 void pshufb(XMMRegister dst, XMMRegister src) { Assembler::pshufb(dst, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
961 void pshufb(XMMRegister dst, Address src) { Assembler::pshufb(dst, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
962 void pshufb(XMMRegister dst, AddressLiteral src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
963 // AVX 3-operands instructions
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
964
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
965 void vaddsd(XMMRegister dst, XMMRegister nds, XMMRegister src) { Assembler::vaddsd(dst, nds, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
966 void vaddsd(XMMRegister dst, XMMRegister nds, Address src) { Assembler::vaddsd(dst, nds, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
967 void vaddsd(XMMRegister dst, XMMRegister nds, AddressLiteral src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
968
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
969 void vaddss(XMMRegister dst, XMMRegister nds, XMMRegister src) { Assembler::vaddss(dst, nds, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
970 void vaddss(XMMRegister dst, XMMRegister nds, Address src) { Assembler::vaddss(dst, nds, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
971 void vaddss(XMMRegister dst, XMMRegister nds, AddressLiteral src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
972
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
973 void vandpd(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) { Assembler::vandpd(dst, nds, src, vector256); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
974 void vandpd(XMMRegister dst, XMMRegister nds, Address src, bool vector256) { Assembler::vandpd(dst, nds, src, vector256); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
975 void vandpd(XMMRegister dst, XMMRegister nds, AddressLiteral src, bool vector256);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
976
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
977 void vandps(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) { Assembler::vandps(dst, nds, src, vector256); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
978 void vandps(XMMRegister dst, XMMRegister nds, Address src, bool vector256) { Assembler::vandps(dst, nds, src, vector256); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
979 void vandps(XMMRegister dst, XMMRegister nds, AddressLiteral src, bool vector256);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
980
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
981 void vdivsd(XMMRegister dst, XMMRegister nds, XMMRegister src) { Assembler::vdivsd(dst, nds, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
982 void vdivsd(XMMRegister dst, XMMRegister nds, Address src) { Assembler::vdivsd(dst, nds, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
983 void vdivsd(XMMRegister dst, XMMRegister nds, AddressLiteral src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
984
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
985 void vdivss(XMMRegister dst, XMMRegister nds, XMMRegister src) { Assembler::vdivss(dst, nds, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
986 void vdivss(XMMRegister dst, XMMRegister nds, Address src) { Assembler::vdivss(dst, nds, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
987 void vdivss(XMMRegister dst, XMMRegister nds, AddressLiteral src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
988
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
989 void vmulsd(XMMRegister dst, XMMRegister nds, XMMRegister src) { Assembler::vmulsd(dst, nds, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
990 void vmulsd(XMMRegister dst, XMMRegister nds, Address src) { Assembler::vmulsd(dst, nds, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
991 void vmulsd(XMMRegister dst, XMMRegister nds, AddressLiteral src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
992
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
993 void vmulss(XMMRegister dst, XMMRegister nds, XMMRegister src) { Assembler::vmulss(dst, nds, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
994 void vmulss(XMMRegister dst, XMMRegister nds, Address src) { Assembler::vmulss(dst, nds, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
995 void vmulss(XMMRegister dst, XMMRegister nds, AddressLiteral src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
996
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
997 void vsubsd(XMMRegister dst, XMMRegister nds, XMMRegister src) { Assembler::vsubsd(dst, nds, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
998 void vsubsd(XMMRegister dst, XMMRegister nds, Address src) { Assembler::vsubsd(dst, nds, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
999 void vsubsd(XMMRegister dst, XMMRegister nds, AddressLiteral src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1000
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1001 void vsubss(XMMRegister dst, XMMRegister nds, XMMRegister src) { Assembler::vsubss(dst, nds, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1002 void vsubss(XMMRegister dst, XMMRegister nds, Address src) { Assembler::vsubss(dst, nds, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1003 void vsubss(XMMRegister dst, XMMRegister nds, AddressLiteral src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1004
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1005 // AVX Vector instructions
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1006
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1007 void vxorpd(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) { Assembler::vxorpd(dst, nds, src, vector256); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1008 void vxorpd(XMMRegister dst, XMMRegister nds, Address src, bool vector256) { Assembler::vxorpd(dst, nds, src, vector256); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1009 void vxorpd(XMMRegister dst, XMMRegister nds, AddressLiteral src, bool vector256);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1010
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1011 void vxorps(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) { Assembler::vxorps(dst, nds, src, vector256); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1012 void vxorps(XMMRegister dst, XMMRegister nds, Address src, bool vector256) { Assembler::vxorps(dst, nds, src, vector256); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1013 void vxorps(XMMRegister dst, XMMRegister nds, AddressLiteral src, bool vector256);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1014
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1015 void vpxor(XMMRegister dst, XMMRegister nds, XMMRegister src, bool vector256) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1016 if (UseAVX > 1 || !vector256) // vpxor 256 bit is available only in AVX2
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1017 Assembler::vpxor(dst, nds, src, vector256);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1018 else
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1019 Assembler::vxorpd(dst, nds, src, vector256);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1020 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1021 void vpxor(XMMRegister dst, XMMRegister nds, Address src, bool vector256) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1022 if (UseAVX > 1 || !vector256) // vpxor 256 bit is available only in AVX2
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1023 Assembler::vpxor(dst, nds, src, vector256);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1024 else
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1025 Assembler::vxorpd(dst, nds, src, vector256);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1026 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1027
7477
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7474
diff changeset
1028 // Simple version for AVX2 256bit vectors
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7474
diff changeset
1029 void vpxor(XMMRegister dst, XMMRegister src) { Assembler::vpxor(dst, dst, src, true); }
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7474
diff changeset
1030 void vpxor(XMMRegister dst, Address src) { Assembler::vpxor(dst, dst, src, true); }
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7474
diff changeset
1031
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1032 // Move packed integer values from low 128 bit to hign 128 bit in 256 bit vector.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1033 void vinserti128h(XMMRegister dst, XMMRegister nds, XMMRegister src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1034 if (UseAVX > 1) // vinserti128h is available only in AVX2
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1035 Assembler::vinserti128h(dst, nds, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1036 else
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1037 Assembler::vinsertf128h(dst, nds, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1038 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1039
11080
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
1040 // Carry-Less Multiplication Quadword
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
1041 void vpclmulldq(XMMRegister dst, XMMRegister nds, XMMRegister src) {
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
1042 // 0x00 - multiply lower 64 bits [0:63]
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
1043 Assembler::vpclmulqdq(dst, nds, src, 0x00);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
1044 }
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
1045 void vpclmulhdq(XMMRegister dst, XMMRegister nds, XMMRegister src) {
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
1046 // 0x11 - multiply upper 64 bits [64:127]
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
1047 Assembler::vpclmulqdq(dst, nds, src, 0x11);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
1048 }
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
1049
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1050 // Data
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1051
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1052 void cmov32( Condition cc, Register dst, Address src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1053 void cmov32( Condition cc, Register dst, Register src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1054
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1055 void cmov( Condition cc, Register dst, Register src) { cmovptr(cc, dst, src); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1056
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1057 void cmovptr(Condition cc, Register dst, Address src) { LP64_ONLY(cmovq(cc, dst, src)) NOT_LP64(cmov32(cc, dst, src)); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1058 void cmovptr(Condition cc, Register dst, Register src) { LP64_ONLY(cmovq(cc, dst, src)) NOT_LP64(cmov32(cc, dst, src)); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1059
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1060 void movoop(Register dst, jobject obj);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1061 void movoop(Address dst, jobject obj);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1062
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1063 void mov_metadata(Register dst, Metadata* obj);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1064 void mov_metadata(Address dst, Metadata* obj);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1065
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1066 void movptr(ArrayAddress dst, Register src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1067 // can this do an lea?
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1068 void movptr(Register dst, ArrayAddress src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1069
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1070 void movptr(Register dst, Address src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1071
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1072 void movptr(Register dst, AddressLiteral src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1073
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1074 void movptr(Register dst, intptr_t src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1075 void movptr(Register dst, Register src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1076 void movptr(Address dst, intptr_t src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1077
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1078 void movptr(Address dst, Register src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1079
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1080 void movptr(Register dst, RegisterOrConstant src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1081 if (src.is_constant()) movptr(dst, src.as_constant());
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1082 else movptr(dst, src.as_register());
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1083 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1084
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1085 #ifdef _LP64
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1086 // Generally the next two are only used for moving NULL
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1087 // Although there are situations in initializing the mark word where
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1088 // they could be used. They are dangerous.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1089
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1090 // They only exist on LP64 so that int32_t and intptr_t are not the same
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1091 // and we have ambiguous declarations.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1092
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1093 void movptr(Address dst, int32_t imm32);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1094 void movptr(Register dst, int32_t imm32);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1095 #endif // _LP64
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1096
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1097 // to avoid hiding movl
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1098 void mov32(AddressLiteral dst, Register src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1099 void mov32(Register dst, AddressLiteral src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1100
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1101 // to avoid hiding movb
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1102 void movbyte(ArrayAddress dst, int src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1103
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1104 // Import other mov() methods from the parent class or else
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1105 // they will be hidden by the following overriding declaration.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1106 using Assembler::movdl;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1107 using Assembler::movq;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1108 void movdl(XMMRegister dst, AddressLiteral src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1109 void movq(XMMRegister dst, AddressLiteral src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1110
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1111 // Can push value or effective address
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1112 void pushptr(AddressLiteral src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1113
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1114 void pushptr(Address src) { LP64_ONLY(pushq(src)) NOT_LP64(pushl(src)); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1115 void popptr(Address src) { LP64_ONLY(popq(src)) NOT_LP64(popl(src)); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1116
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1117 void pushoop(jobject obj);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1118 void pushklass(Metadata* obj);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1119
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1120 // sign extend as need a l to ptr sized element
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1121 void movl2ptr(Register dst, Address src) { LP64_ONLY(movslq(dst, src)) NOT_LP64(movl(dst, src)); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1122 void movl2ptr(Register dst, Register src) { LP64_ONLY(movslq(dst, src)) NOT_LP64(if (dst != src) movl(dst, src)); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1123
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1124 // C2 compiled method's prolog code.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1125 void verified_entry(int framesize, bool stack_bang, bool fp_mode_24b);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1126
7474
00af3a3a8df4 8005522: use fast-string instructions on x86 for zeroing
kvn
parents: 7420
diff changeset
1127 // clear memory of size 'cnt' qwords, starting at 'base'.
00af3a3a8df4 8005522: use fast-string instructions on x86 for zeroing
kvn
parents: 7420
diff changeset
1128 void clear_mem(Register base, Register cnt, Register rtmp);
00af3a3a8df4 8005522: use fast-string instructions on x86 for zeroing
kvn
parents: 7420
diff changeset
1129
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1130 // IndexOf strings.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1131 // Small strings are loaded through stack if they cross page boundary.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1132 void string_indexof(Register str1, Register str2,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1133 Register cnt1, Register cnt2,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1134 int int_cnt2, Register result,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1135 XMMRegister vec, Register tmp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1136
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1137 // IndexOf for constant substrings with size >= 8 elements
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1138 // which don't need to be loaded through stack.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1139 void string_indexofC8(Register str1, Register str2,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1140 Register cnt1, Register cnt2,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1141 int int_cnt2, Register result,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1142 XMMRegister vec, Register tmp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1143
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1144 // Smallest code: we don't need to load through stack,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1145 // check string tail.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1146
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1147 // Compare strings.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1148 void string_compare(Register str1, Register str2,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1149 Register cnt1, Register cnt2, Register result,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1150 XMMRegister vec1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1151
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1152 // Compare char[] arrays.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1153 void char_arrays_equals(bool is_array_equ, Register ary1, Register ary2,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1154 Register limit, Register result, Register chr,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1155 XMMRegister vec1, XMMRegister vec2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1156
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1157 // Fill primitive arrays
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1158 void generate_fill(BasicType t, bool aligned,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1159 Register to, Register value, Register count,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1160 Register rtmp, XMMRegister xtmp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1161
7637
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
1162 void encode_iso_array(Register src, Register dst, Register len,
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
1163 XMMRegister tmp1, XMMRegister tmp2, XMMRegister tmp3,
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
1164 XMMRegister tmp4, Register tmp5, Register result);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
1165
11080
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
1166 // CRC32 code for java.util.zip.CRC32::updateBytes() instrinsic.
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
1167 void update_byte_crc32(Register crc, Register val, Register table);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
1168 void kernel_crc32(Register crc, Register buf, Register len, Register table, Register tmp);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
1169 // Fold 128-bit data chunk
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
1170 void fold_128bit_crc32(XMMRegister xcrc, XMMRegister xK, XMMRegister xtmp, Register buf, int offset);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
1171 void fold_128bit_crc32(XMMRegister xcrc, XMMRegister xK, XMMRegister xtmp, XMMRegister xbuf);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
1172 // Fold 8-bit data
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
1173 void fold_8bit_crc32(Register crc, Register table, Register tmp);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
1174 void fold_8bit_crc32(XMMRegister crc, Register table, XMMRegister xtmp, Register tmp);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
1175
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1176 #undef VIRTUAL
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1177
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1178 };
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1179
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1180 /**
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1181 * class SkipIfEqual:
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1182 *
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1183 * Instantiating this class will result in assembly code being output that will
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1184 * jump around any code emitted between the creation of the instance and it's
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1185 * automatic destruction at the end of a scope block, depending on the value of
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1186 * the flag passed to the constructor, which will be checked at run-time.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1187 */
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1188 class SkipIfEqual {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1189 private:
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1190 MacroAssembler* _masm;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1191 Label _label;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1192
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1193 public:
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1194 SkipIfEqual(MacroAssembler*, const bool* flag_addr, bool value);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1195 ~SkipIfEqual();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1196 };
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1197
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1198 #endif // CPU_X86_VM_MACROASSEMBLER_X86_HPP