annotate src/cpu/x86/vm/macroAssembler_x86.cpp @ 15388:769fc3629f59

Add phase FlowSensitiveReductionPhase. It is possible to remove GuardingPiNodes, CheckCastNodes, and FixedGuards during HighTier under certain conditions (control-flow sensitive conditions). The phase added in this commit (FlowSensitiveReductionPhase) does that, and in addition replaces usages with "downcasting" PiNodes when possible thus resulting in more precise object stamps (e.g., non-null). Finally, usages of floating, side-effects free, expressions are also simplified (as per control-flow sensitive conditions). The newly added phase runs only during HighTier and can be deactivated using Graal option FlowSensitiveReduction (it is active by default).
author Miguel Garcia <miguel.m.garcia@oracle.com>
date Fri, 25 Apr 2014 16:50:52 +0200
parents 4ca6dc0799b6
children 52b4284cb496
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 #include "precompiled.hpp"
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
26 #include "asm/assembler.hpp"
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
27 #include "asm/assembler.inline.hpp"
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
28 #include "compiler/disassembler.hpp"
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
29 #include "gc_interface/collectedHeap.inline.hpp"
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
30 #include "interpreter/interpreter.hpp"
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
31 #include "memory/cardTableModRefBS.hpp"
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
32 #include "memory/resourceArea.hpp"
12056
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
33 #include "memory/universe.hpp"
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
34 #include "prims/methodHandles.hpp"
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
35 #include "runtime/biasedLocking.hpp"
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
36 #include "runtime/interfaceSupport.hpp"
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
37 #include "runtime/objectMonitor.hpp"
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
38 #include "runtime/os.hpp"
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
39 #include "runtime/sharedRuntime.hpp"
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
40 #include "runtime/stubRoutines.hpp"
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7477
diff changeset
41 #include "utilities/macros.hpp"
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7477
diff changeset
42 #if INCLUDE_ALL_GCS
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
43 #include "gc_implementation/g1/g1CollectedHeap.inline.hpp"
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
44 #include "gc_implementation/g1/g1SATBCardTableModRefBS.hpp"
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
45 #include "gc_implementation/g1/heapRegion.hpp"
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7477
diff changeset
46 #endif // INCLUDE_ALL_GCS
7199
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 #ifdef PRODUCT
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
49 #define BLOCK_COMMENT(str) /* nothing */
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
50 #define STOP(error) stop(error)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
51 #else
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
52 #define BLOCK_COMMENT(str) block_comment(str)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
53 #define STOP(error) block_comment(error); stop(error)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
54 #endif
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
55
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
56 #define BIND(label) bind(label); BLOCK_COMMENT(#label ":")
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
7204
f0c2369fda5a 8003250: SPARC: move MacroAssembler into separate file
twisti
parents: 7199
diff changeset
59 #ifdef ASSERT
f0c2369fda5a 8003250: SPARC: move MacroAssembler into separate file
twisti
parents: 7199
diff changeset
60 bool AbstractAssembler::pd_check_instruction_mark() { return true; }
f0c2369fda5a 8003250: SPARC: move MacroAssembler into separate file
twisti
parents: 7199
diff changeset
61 #endif
f0c2369fda5a 8003250: SPARC: move MacroAssembler into separate file
twisti
parents: 7199
diff changeset
62
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
63 static Assembler::Condition reverse[] = {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
64 Assembler::noOverflow /* overflow = 0x0 */ ,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
65 Assembler::overflow /* noOverflow = 0x1 */ ,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
66 Assembler::aboveEqual /* carrySet = 0x2, below = 0x2 */ ,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
67 Assembler::below /* aboveEqual = 0x3, carryClear = 0x3 */ ,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
68 Assembler::notZero /* zero = 0x4, equal = 0x4 */ ,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
69 Assembler::zero /* notZero = 0x5, notEqual = 0x5 */ ,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
70 Assembler::above /* belowEqual = 0x6 */ ,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
71 Assembler::belowEqual /* above = 0x7 */ ,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
72 Assembler::positive /* negative = 0x8 */ ,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
73 Assembler::negative /* positive = 0x9 */ ,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
74 Assembler::noParity /* parity = 0xa */ ,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
75 Assembler::parity /* noParity = 0xb */ ,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
76 Assembler::greaterEqual /* less = 0xc */ ,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
77 Assembler::less /* greaterEqual = 0xd */ ,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
78 Assembler::greater /* lessEqual = 0xe */ ,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
79 Assembler::lessEqual /* greater = 0xf, */
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
80
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
81 };
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
82
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
83
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
84 // Implementation of MacroAssembler
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 // First all the versions that have distinct versions depending on 32/64 bit
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
87 // Unless the difference is trivial (1 line or so).
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
88
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
89 #ifndef _LP64
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
90
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
91 // 32bit versions
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 Address MacroAssembler::as_Address(AddressLiteral adr) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
94 return Address(adr.target(), adr.rspec());
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
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
97 Address MacroAssembler::as_Address(ArrayAddress adr) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
98 return Address::make_array(adr);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
99 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
100
14909
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
101 int MacroAssembler::biased_locking_enter(Register lock_reg,
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
102 Register obj_reg,
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
103 Register swap_reg,
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
104 Register tmp_reg,
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
105 bool swap_reg_contains_mark,
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
106 Label& done,
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
107 Label* slow_case,
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
108 BiasedLockingCounters* counters) {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
109 assert(UseBiasedLocking, "why call this otherwise?");
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
110 assert(swap_reg == rax, "swap_reg must be rax, for cmpxchg");
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
111 assert_different_registers(lock_reg, obj_reg, swap_reg);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
112
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
113 if (PrintBiasedLockingStatistics && counters == NULL)
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
114 counters = BiasedLocking::counters();
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
115
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
116 bool need_tmp_reg = false;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
117 if (tmp_reg == noreg) {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
118 need_tmp_reg = true;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
119 tmp_reg = lock_reg;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
120 } else {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
121 assert_different_registers(lock_reg, obj_reg, swap_reg, tmp_reg);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
122 }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
123 assert(markOopDesc::age_shift == markOopDesc::lock_bits + markOopDesc::biased_lock_bits, "biased locking makes assumptions about bit layout");
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
124 Address mark_addr (obj_reg, oopDesc::mark_offset_in_bytes());
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
125 Address klass_addr (obj_reg, oopDesc::klass_offset_in_bytes());
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
126 Address saved_mark_addr(lock_reg, 0);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
127
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
128 // Biased locking
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
129 // See whether the lock is currently biased toward our thread and
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
130 // whether the epoch is still valid
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
131 // Note that the runtime guarantees sufficient alignment of JavaThread
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
132 // pointers to allow age to be placed into low bits
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
133 // First check to see whether biasing is even enabled for this object
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
134 Label cas_label;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
135 int null_check_offset = -1;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
136 if (!swap_reg_contains_mark) {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
137 null_check_offset = offset();
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
138 movl(swap_reg, mark_addr);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
139 }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
140 if (need_tmp_reg) {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
141 push(tmp_reg);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
142 }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
143 movl(tmp_reg, swap_reg);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
144 andl(tmp_reg, markOopDesc::biased_lock_mask_in_place);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
145 cmpl(tmp_reg, markOopDesc::biased_lock_pattern);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
146 if (need_tmp_reg) {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
147 pop(tmp_reg);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
148 }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
149 jcc(Assembler::notEqual, cas_label);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
150 // The bias pattern is present in the object's header. Need to check
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
151 // whether the bias owner and the epoch are both still current.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
152 // Note that because there is no current thread register on x86 we
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
153 // need to store off the mark word we read out of the object to
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
154 // avoid reloading it and needing to recheck invariants below. This
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
155 // store is unfortunate but it makes the overall code shorter and
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
156 // simpler.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
157 movl(saved_mark_addr, swap_reg);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
158 if (need_tmp_reg) {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
159 push(tmp_reg);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
160 }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
161 get_thread(tmp_reg);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
162 xorl(swap_reg, tmp_reg);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
163 if (swap_reg_contains_mark) {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
164 null_check_offset = offset();
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
165 }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
166 movl(tmp_reg, klass_addr);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
167 xorl(swap_reg, Address(tmp_reg, Klass::prototype_header_offset()));
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
168 andl(swap_reg, ~((int) markOopDesc::age_mask_in_place));
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
169 if (need_tmp_reg) {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
170 pop(tmp_reg);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
171 }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
172 if (counters != NULL) {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
173 cond_inc32(Assembler::zero,
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
174 ExternalAddress((address)counters->biased_lock_entry_count_addr()));
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
175 }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
176 jcc(Assembler::equal, done);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
177
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
178 Label try_revoke_bias;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
179 Label try_rebias;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
180
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
181 // At this point we know that the header has the bias pattern and
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
182 // that we are not the bias owner in the current epoch. We need to
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
183 // figure out more details about the state of the header in order to
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
184 // know what operations can be legally performed on the object's
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
185 // header.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
186
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
187 // If the low three bits in the xor result aren't clear, that means
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
188 // the prototype header is no longer biased and we have to revoke
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
189 // the bias on this object.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
190 testl(swap_reg, markOopDesc::biased_lock_mask_in_place);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
191 jcc(Assembler::notZero, try_revoke_bias);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
192
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
193 // Biasing is still enabled for this data type. See whether the
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
194 // epoch of the current bias is still valid, meaning that the epoch
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
195 // bits of the mark word are equal to the epoch bits of the
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
196 // prototype header. (Note that the prototype header's epoch bits
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
197 // only change at a safepoint.) If not, attempt to rebias the object
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
198 // toward the current thread. Note that we must be absolutely sure
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
199 // that the current epoch is invalid in order to do this because
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
200 // otherwise the manipulations it performs on the mark word are
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
201 // illegal.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
202 testl(swap_reg, markOopDesc::epoch_mask_in_place);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
203 jcc(Assembler::notZero, try_rebias);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
204
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
205 // The epoch of the current bias is still valid but we know nothing
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
206 // about the owner; it might be set or it might be clear. Try to
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
207 // acquire the bias of the object using an atomic operation. If this
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
208 // fails we will go in to the runtime to revoke the object's bias.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
209 // Note that we first construct the presumed unbiased header so we
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
210 // don't accidentally blow away another thread's valid bias.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
211 movl(swap_reg, saved_mark_addr);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
212 andl(swap_reg,
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
213 markOopDesc::biased_lock_mask_in_place | markOopDesc::age_mask_in_place | markOopDesc::epoch_mask_in_place);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
214 if (need_tmp_reg) {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
215 push(tmp_reg);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
216 }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
217 get_thread(tmp_reg);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
218 orl(tmp_reg, swap_reg);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
219 if (os::is_MP()) {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
220 lock();
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
221 }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
222 cmpxchgptr(tmp_reg, Address(obj_reg, 0));
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
223 if (need_tmp_reg) {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
224 pop(tmp_reg);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
225 }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
226 // If the biasing toward our thread failed, this means that
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
227 // another thread succeeded in biasing it toward itself and we
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
228 // need to revoke that bias. The revocation will occur in the
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
229 // interpreter runtime in the slow case.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
230 if (counters != NULL) {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
231 cond_inc32(Assembler::zero,
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
232 ExternalAddress((address)counters->anonymously_biased_lock_entry_count_addr()));
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
233 }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
234 if (slow_case != NULL) {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
235 jcc(Assembler::notZero, *slow_case);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
236 }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
237 jmp(done);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
238
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
239 bind(try_rebias);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
240 // At this point we know the epoch has expired, meaning that the
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
241 // current "bias owner", if any, is actually invalid. Under these
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
242 // circumstances _only_, we are allowed to use the current header's
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
243 // value as the comparison value when doing the cas to acquire the
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
244 // bias in the current epoch. In other words, we allow transfer of
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
245 // the bias from one thread to another directly in this situation.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
246 //
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
247 // FIXME: due to a lack of registers we currently blow away the age
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
248 // bits in this situation. Should attempt to preserve them.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
249 if (need_tmp_reg) {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
250 push(tmp_reg);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
251 }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
252 get_thread(tmp_reg);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
253 movl(swap_reg, klass_addr);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
254 orl(tmp_reg, Address(swap_reg, Klass::prototype_header_offset()));
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
255 movl(swap_reg, saved_mark_addr);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
256 if (os::is_MP()) {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
257 lock();
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
258 }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
259 cmpxchgptr(tmp_reg, Address(obj_reg, 0));
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
260 if (need_tmp_reg) {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
261 pop(tmp_reg);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
262 }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
263 // If the biasing toward our thread failed, then another thread
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
264 // succeeded in biasing it toward itself and we need to revoke that
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
265 // bias. The revocation will occur in the runtime in the slow case.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
266 if (counters != NULL) {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
267 cond_inc32(Assembler::zero,
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
268 ExternalAddress((address)counters->rebiased_lock_entry_count_addr()));
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
269 }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
270 if (slow_case != NULL) {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
271 jcc(Assembler::notZero, *slow_case);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
272 }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
273 jmp(done);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
274
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
275 bind(try_revoke_bias);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
276 // The prototype mark in the klass doesn't have the bias bit set any
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
277 // more, indicating that objects of this data type are not supposed
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
278 // to be biased any more. We are going to try to reset the mark of
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
279 // this object to the prototype value and fall through to the
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
280 // CAS-based locking scheme. Note that if our CAS fails, it means
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
281 // that another thread raced us for the privilege of revoking the
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
282 // bias of this particular object, so it's okay to continue in the
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
283 // normal locking code.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
284 //
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
285 // FIXME: due to a lack of registers we currently blow away the age
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
286 // bits in this situation. Should attempt to preserve them.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
287 movl(swap_reg, saved_mark_addr);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
288 if (need_tmp_reg) {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
289 push(tmp_reg);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
290 }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
291 movl(tmp_reg, klass_addr);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
292 movl(tmp_reg, Address(tmp_reg, Klass::prototype_header_offset()));
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
293 if (os::is_MP()) {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
294 lock();
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
295 }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
296 cmpxchgptr(tmp_reg, Address(obj_reg, 0));
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
297 if (need_tmp_reg) {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
298 pop(tmp_reg);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
299 }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
300 // Fall through to the normal CAS-based lock, because no matter what
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
301 // the result of the above CAS, some thread must have succeeded in
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
302 // removing the bias bit from the object's header.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
303 if (counters != NULL) {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
304 cond_inc32(Assembler::zero,
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
305 ExternalAddress((address)counters->revoked_lock_entry_count_addr()));
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
306 }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
307
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
308 bind(cas_label);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
309
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
310 return null_check_offset;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
311 }
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
312 void MacroAssembler::call_VM_leaf_base(address entry_point,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
313 int number_of_arguments) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
314 call(RuntimeAddress(entry_point));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
315 increment(rsp, number_of_arguments * wordSize);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
316 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
317
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
318 void MacroAssembler::cmpklass(Address src1, Metadata* obj) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
319 cmp_literal32(src1, (int32_t)obj, metadata_Relocation::spec_for_immediate());
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
320 }
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 void MacroAssembler::cmpklass(Register src1, Metadata* obj) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
323 cmp_literal32(src1, (int32_t)obj, metadata_Relocation::spec_for_immediate());
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
324 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
325
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
326 void MacroAssembler::cmpoop(Address src1, jobject obj) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
327 cmp_literal32(src1, (int32_t)obj, oop_Relocation::spec_for_immediate());
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
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
330 void MacroAssembler::cmpoop(Register src1, jobject obj) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
331 cmp_literal32(src1, (int32_t)obj, oop_Relocation::spec_for_immediate());
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
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
334 void MacroAssembler::extend_sign(Register hi, Register lo) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
335 // According to Intel Doc. AP-526, "Integer Divide", p.18.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
336 if (VM_Version::is_P6() && hi == rdx && lo == rax) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
337 cdql();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
338 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
339 movl(hi, lo);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
340 sarl(hi, 31);
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 }
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 void MacroAssembler::jC2(Register tmp, Label& L) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
345 // set parity bit if FPU flag C2 is set (via rax)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
346 save_rax(tmp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
347 fwait(); fnstsw_ax();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
348 sahf();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
349 restore_rax(tmp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
350 // branch
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
351 jcc(Assembler::parity, L);
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
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
354 void MacroAssembler::jnC2(Register tmp, Label& L) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
355 // set parity bit if FPU flag C2 is set (via rax)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
356 save_rax(tmp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
357 fwait(); fnstsw_ax();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
358 sahf();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
359 restore_rax(tmp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
360 // branch
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
361 jcc(Assembler::noParity, L);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
362 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
363
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
364 // 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
365 // to be installed in the Address class
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
366 void MacroAssembler::jump(ArrayAddress entry) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
367 jmp(as_Address(entry));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
368 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
369
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
370 // Note: y_lo will be destroyed
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
371 void MacroAssembler::lcmp2int(Register x_hi, Register x_lo, Register y_hi, Register y_lo) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
372 // Long compare for Java (semantics as described in JVM spec.)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
373 Label high, low, done;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
374
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
375 cmpl(x_hi, y_hi);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
376 jcc(Assembler::less, low);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
377 jcc(Assembler::greater, high);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
378 // x_hi is the return register
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
379 xorl(x_hi, x_hi);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
380 cmpl(x_lo, y_lo);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
381 jcc(Assembler::below, low);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
382 jcc(Assembler::equal, done);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
383
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
384 bind(high);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
385 xorl(x_hi, x_hi);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
386 increment(x_hi);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
387 jmp(done);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
388
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
389 bind(low);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
390 xorl(x_hi, x_hi);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
391 decrementl(x_hi);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
392
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
393 bind(done);
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
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
396 void MacroAssembler::lea(Register dst, AddressLiteral src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
397 mov_literal32(dst, (int32_t)src.target(), src.rspec());
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
398 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
399
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
400 void MacroAssembler::lea(Address dst, AddressLiteral adr) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
401 // leal(dst, as_Address(adr));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
402 // see note in movl as to why we must use a move
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
403 mov_literal32(dst, (int32_t) adr.target(), adr.rspec());
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
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
406 void MacroAssembler::leave() {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
407 mov(rsp, rbp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
408 pop(rbp);
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
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
411 void MacroAssembler::lmul(int x_rsp_offset, int y_rsp_offset) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
412 // Multiplication of two Java long values stored on the stack
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
413 // as illustrated below. Result is in rdx:rax.
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 // rsp ---> [ ?? ] \ \
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
416 // .... | y_rsp_offset |
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
417 // [ y_lo ] / (in bytes) | x_rsp_offset
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
418 // [ y_hi ] | (in bytes)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
419 // .... |
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
420 // [ x_lo ] /
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
421 // [ x_hi ]
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
422 // ....
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 // Basic idea: lo(result) = lo(x_lo * y_lo)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
425 // hi(result) = hi(x_lo * y_lo) + lo(x_hi * y_lo) + lo(x_lo * y_hi)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
426 Address x_hi(rsp, x_rsp_offset + wordSize); Address x_lo(rsp, x_rsp_offset);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
427 Address y_hi(rsp, y_rsp_offset + wordSize); Address y_lo(rsp, y_rsp_offset);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
428 Label quick;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
429 // load x_hi, y_hi and check if quick
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
430 // multiplication is possible
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
431 movl(rbx, x_hi);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
432 movl(rcx, y_hi);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
433 movl(rax, rbx);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
434 orl(rbx, rcx); // rbx, = 0 <=> x_hi = 0 and y_hi = 0
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
435 jcc(Assembler::zero, quick); // if rbx, = 0 do quick multiply
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
436 // do full multiplication
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
437 // 1st step
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
438 mull(y_lo); // x_hi * y_lo
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
439 movl(rbx, rax); // save lo(x_hi * y_lo) in rbx,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
440 // 2nd step
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
441 movl(rax, x_lo);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
442 mull(rcx); // x_lo * y_hi
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
443 addl(rbx, rax); // add lo(x_lo * y_hi) to rbx,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
444 // 3rd step
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
445 bind(quick); // note: rbx, = 0 if quick multiply!
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
446 movl(rax, x_lo);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
447 mull(y_lo); // x_lo * y_lo
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
448 addl(rdx, rbx); // correct hi(x_lo * y_lo)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
449 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
450
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
451 void MacroAssembler::lneg(Register hi, Register lo) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
452 negl(lo);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
453 adcl(hi, 0);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
454 negl(hi);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
455 }
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 void MacroAssembler::lshl(Register hi, Register lo) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
458 // Java shift left long support (semantics as described in JVM spec., p.305)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
459 // (basic idea for shift counts s >= n: x << s == (x << n) << (s - n))
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
460 // shift value is in rcx !
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
461 assert(hi != rcx, "must not use rcx");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
462 assert(lo != rcx, "must not use rcx");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
463 const Register s = rcx; // shift count
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
464 const int n = BitsPerWord;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
465 Label L;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
466 andl(s, 0x3f); // s := s & 0x3f (s < 0x40)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
467 cmpl(s, n); // if (s < n)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
468 jcc(Assembler::less, L); // else (s >= n)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
469 movl(hi, lo); // x := x << n
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
470 xorl(lo, lo);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
471 // Note: subl(s, n) is not needed since the Intel shift instructions work rcx mod n!
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
472 bind(L); // s (mod n) < n
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
473 shldl(hi, lo); // x := x << s
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
474 shll(lo);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
475 }
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
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
478 void MacroAssembler::lshr(Register hi, Register lo, bool sign_extension) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
479 // Java shift right long support (semantics as described in JVM spec., p.306 & p.310)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
480 // (basic idea for shift counts s >= n: x >> s == (x >> n) >> (s - n))
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
481 assert(hi != rcx, "must not use rcx");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
482 assert(lo != rcx, "must not use rcx");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
483 const Register s = rcx; // shift count
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
484 const int n = BitsPerWord;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
485 Label L;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
486 andl(s, 0x3f); // s := s & 0x3f (s < 0x40)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
487 cmpl(s, n); // if (s < n)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
488 jcc(Assembler::less, L); // else (s >= n)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
489 movl(lo, hi); // x := x >> n
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
490 if (sign_extension) sarl(hi, 31);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
491 else xorl(hi, hi);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
492 // Note: subl(s, n) is not needed since the Intel shift instructions work rcx mod n!
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
493 bind(L); // s (mod n) < n
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
494 shrdl(lo, hi); // x := x >> s
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
495 if (sign_extension) sarl(hi);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
496 else shrl(hi);
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
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
499 void MacroAssembler::movoop(Register dst, jobject obj) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
500 mov_literal32(dst, (int32_t)obj, oop_Relocation::spec_for_immediate());
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
501 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
502
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
503 void MacroAssembler::movoop(Address dst, jobject obj) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
504 mov_literal32(dst, (int32_t)obj, oop_Relocation::spec_for_immediate());
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
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
507 void MacroAssembler::mov_metadata(Register dst, Metadata* obj) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
508 mov_literal32(dst, (int32_t)obj, metadata_Relocation::spec_for_immediate());
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
509 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
510
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
511 void MacroAssembler::mov_metadata(Address dst, Metadata* obj) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
512 mov_literal32(dst, (int32_t)obj, metadata_Relocation::spec_for_immediate());
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
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
515 void MacroAssembler::movptr(Register dst, AddressLiteral src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
516 if (src.is_lval()) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
517 mov_literal32(dst, (intptr_t)src.target(), src.rspec());
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
518 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
519 movl(dst, as_Address(src));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
520 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
521 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
522
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
523 void MacroAssembler::movptr(ArrayAddress dst, Register src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
524 movl(as_Address(dst), src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
525 }
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 void MacroAssembler::movptr(Register dst, ArrayAddress src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
528 movl(dst, as_Address(src));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
529 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
530
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
531 // src should NEVER be a real pointer. Use AddressLiteral for true pointers
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
532 void MacroAssembler::movptr(Address dst, intptr_t src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
533 movl(dst, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
534 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
535
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
536
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
537 void MacroAssembler::pop_callee_saved_registers() {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
538 pop(rcx);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
539 pop(rdx);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
540 pop(rdi);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
541 pop(rsi);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
542 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
543
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
544 void MacroAssembler::pop_fTOS() {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
545 fld_d(Address(rsp, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
546 addl(rsp, 2 * wordSize);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
547 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
548
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
549 void MacroAssembler::push_callee_saved_registers() {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
550 push(rsi);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
551 push(rdi);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
552 push(rdx);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
553 push(rcx);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
554 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
555
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
556 void MacroAssembler::push_fTOS() {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
557 subl(rsp, 2 * wordSize);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
558 fstp_d(Address(rsp, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
559 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
560
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
561
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
562 void MacroAssembler::pushoop(jobject obj) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
563 push_literal32((int32_t)obj, oop_Relocation::spec_for_immediate());
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
564 }
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 void MacroAssembler::pushklass(Metadata* obj) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
567 push_literal32((int32_t)obj, metadata_Relocation::spec_for_immediate());
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 MacroAssembler::pushptr(AddressLiteral src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
571 if (src.is_lval()) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
572 push_literal32((int32_t)src.target(), src.rspec());
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
573 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
574 pushl(as_Address(src));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
575 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
576 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
577
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
578 void MacroAssembler::set_word_if_not_zero(Register dst) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
579 xorl(dst, dst);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
580 set_byte_if_not_zero(dst);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
581 }
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 static void pass_arg0(MacroAssembler* masm, Register arg) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
584 masm->push(arg);
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
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
587 static void pass_arg1(MacroAssembler* masm, Register arg) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
588 masm->push(arg);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
589 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
590
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
591 static void pass_arg2(MacroAssembler* masm, Register arg) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
592 masm->push(arg);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
593 }
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 static void pass_arg3(MacroAssembler* masm, Register arg) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
596 masm->push(arg);
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
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
599 #ifndef PRODUCT
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
600 extern "C" void findpc(intptr_t x);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
601 #endif
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
602
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
603 void MacroAssembler::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
604 // In order to get locks to work, we need to fake a in_VM state
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
605 JavaThread* thread = JavaThread::current();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
606 JavaThreadState saved_state = thread->thread_state();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
607 thread->set_thread_state(_thread_in_vm);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
608 if (ShowMessageBoxOnError) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
609 JavaThread* thread = JavaThread::current();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
610 JavaThreadState saved_state = thread->thread_state();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
611 thread->set_thread_state(_thread_in_vm);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
612 if (CountBytecodes || TraceBytecodes || StopInterpreterAt) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
613 ttyLocker ttyl;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
614 BytecodeCounter::print();
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 // To see where a verify_oop failed, get $ebx+40/X for this frame.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
617 // This is the value of eip which points to where verify_oop will return.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
618 if (os::message_box(msg, "Execution stopped, print registers?")) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
619 print_state32(rdi, rsi, rbp, rsp, rbx, rdx, rcx, rax, eip);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
620 BREAKPOINT;
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 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
623 ttyLocker ttyl;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
624 ::tty->print_cr("=============== DEBUG MESSAGE: %s ================\n", msg);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
625 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
626 // Don't assert holding the ttyLock
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
627 assert(false, err_msg("DEBUG MESSAGE: %s", msg));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
628 ThreadStateTransition::transition(thread, _thread_in_vm, saved_state);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
629 }
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 void MacroAssembler::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
632 ttyLocker ttyl;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
633 FlagSetting fs(Debugging, true);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
634 tty->print_cr("eip = 0x%08x", eip);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
635 #ifndef PRODUCT
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
636 if ((WizardMode || Verbose) && PrintMiscellaneous) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
637 tty->cr();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
638 findpc(eip);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
639 tty->cr();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
640 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
641 #endif
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
642 #define PRINT_REG(rax) \
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
643 { tty->print("%s = ", #rax); os::print_location(tty, rax); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
644 PRINT_REG(rax);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
645 PRINT_REG(rbx);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
646 PRINT_REG(rcx);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
647 PRINT_REG(rdx);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
648 PRINT_REG(rdi);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
649 PRINT_REG(rsi);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
650 PRINT_REG(rbp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
651 PRINT_REG(rsp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
652 #undef PRINT_REG
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
653 // Print some words near top of staack.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
654 int* dump_sp = (int*) rsp;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
655 for (int col1 = 0; col1 < 8; col1++) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
656 tty->print("(rsp+0x%03x) 0x%08x: ", (int)((intptr_t)dump_sp - (intptr_t)rsp), (intptr_t)dump_sp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
657 os::print_location(tty, *dump_sp++);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
658 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
659 for (int row = 0; row < 16; row++) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
660 tty->print("(rsp+0x%03x) 0x%08x: ", (int)((intptr_t)dump_sp - (intptr_t)rsp), (intptr_t)dump_sp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
661 for (int col = 0; col < 8; col++) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
662 tty->print(" 0x%08x", *dump_sp++);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
663 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
664 tty->cr();
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 // Print some instructions around pc:
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
667 Disassembler::decode((address)eip-64, (address)eip);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
668 tty->print_cr("--------");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
669 Disassembler::decode((address)eip, (address)eip+32);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
670 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
671
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
672 void MacroAssembler::stop(const char* msg) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
673 ExternalAddress message((address)msg);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
674 // push address of message
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
675 pushptr(message.addr());
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
676 { Label L; call(L, relocInfo::none); bind(L); } // push eip
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
677 pusha(); // push registers
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
678 call(RuntimeAddress(CAST_FROM_FN_PTR(address, MacroAssembler::debug32)));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
679 hlt();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
680 }
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 void MacroAssembler::warn(const char* msg) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
683 push_CPU_state();
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 ExternalAddress message((address) msg);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
686 // push address of message
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
687 pushptr(message.addr());
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 call(RuntimeAddress(CAST_FROM_FN_PTR(address, warning)));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
690 addl(rsp, wordSize); // discard argument
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
691 pop_CPU_state();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
692 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
693
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
694 void MacroAssembler::print_state() {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
695 { Label L; call(L, relocInfo::none); bind(L); } // push eip
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
696 pusha(); // push registers
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 push_CPU_state();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
699 call(RuntimeAddress(CAST_FROM_FN_PTR(address, MacroAssembler::print_state32)));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
700 pop_CPU_state();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
701
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
702 popa();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
703 addl(rsp, wordSize);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
704 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
705
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
706 #else // _LP64
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
707
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
708 // 64 bit versions
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 Address MacroAssembler::as_Address(AddressLiteral adr) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
711 // amd64 always does this as a pc-rel
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
712 // we can be absolute or disp based on the instruction type
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
713 // jmp/call are displacements others are absolute
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
714 assert(!adr.is_lval(), "must be rval");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
715 assert(reachable(adr), "must be");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
716 return Address((int32_t)(intptr_t)(adr.target() - pc()), adr.target(), adr.reloc());
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 }
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 Address MacroAssembler::as_Address(ArrayAddress adr) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
721 AddressLiteral base = adr.base();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
722 lea(rscratch1, base);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
723 Address index = adr.index();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
724 assert(index._disp == 0, "must not have disp"); // maybe it can?
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
725 Address array(rscratch1, index._index, index._scale, index._disp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
726 return array;
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
14909
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
729 int MacroAssembler::biased_locking_enter(Register lock_reg,
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
730 Register obj_reg,
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
731 Register swap_reg,
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
732 Register tmp_reg,
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
733 bool swap_reg_contains_mark,
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
734 Label& done,
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
735 Label* slow_case,
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
736 BiasedLockingCounters* counters) {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
737 assert(UseBiasedLocking, "why call this otherwise?");
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
738 assert(swap_reg == rax, "swap_reg must be rax for cmpxchgq");
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
739 assert(tmp_reg != noreg, "tmp_reg must be supplied");
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
740 assert_different_registers(lock_reg, obj_reg, swap_reg, tmp_reg);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
741 assert(markOopDesc::age_shift == markOopDesc::lock_bits + markOopDesc::biased_lock_bits, "biased locking makes assumptions about bit layout");
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
742 Address mark_addr (obj_reg, oopDesc::mark_offset_in_bytes());
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
743 Address saved_mark_addr(lock_reg, 0);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
744
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
745 if (PrintBiasedLockingStatistics && counters == NULL)
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
746 counters = BiasedLocking::counters();
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
747
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
748 // Biased locking
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
749 // See whether the lock is currently biased toward our thread and
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
750 // whether the epoch is still valid
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
751 // Note that the runtime guarantees sufficient alignment of JavaThread
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
752 // pointers to allow age to be placed into low bits
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
753 // First check to see whether biasing is even enabled for this object
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
754 Label cas_label;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
755 int null_check_offset = -1;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
756 if (!swap_reg_contains_mark) {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
757 null_check_offset = offset();
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
758 movq(swap_reg, mark_addr);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
759 }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
760 movq(tmp_reg, swap_reg);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
761 andq(tmp_reg, markOopDesc::biased_lock_mask_in_place);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
762 cmpq(tmp_reg, markOopDesc::biased_lock_pattern);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
763 jcc(Assembler::notEqual, cas_label);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
764 // The bias pattern is present in the object's header. Need to check
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
765 // whether the bias owner and the epoch are both still current.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
766 load_prototype_header(tmp_reg, obj_reg);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
767 orq(tmp_reg, r15_thread);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
768 xorq(tmp_reg, swap_reg);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
769 andq(tmp_reg, ~((int) markOopDesc::age_mask_in_place));
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
770 if (counters != NULL) {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
771 cond_inc32(Assembler::zero,
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
772 ExternalAddress((address) counters->anonymously_biased_lock_entry_count_addr()));
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
773 }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
774 jcc(Assembler::equal, done);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
775
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
776 Label try_revoke_bias;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
777 Label try_rebias;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
778
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
779 // At this point we know that the header has the bias pattern and
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
780 // that we are not the bias owner in the current epoch. We need to
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
781 // figure out more details about the state of the header in order to
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
782 // know what operations can be legally performed on the object's
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
783 // header.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
784
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
785 // If the low three bits in the xor result aren't clear, that means
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
786 // the prototype header is no longer biased and we have to revoke
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
787 // the bias on this object.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
788 testq(tmp_reg, markOopDesc::biased_lock_mask_in_place);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
789 jcc(Assembler::notZero, try_revoke_bias);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
790
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
791 // Biasing is still enabled for this data type. See whether the
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
792 // epoch of the current bias is still valid, meaning that the epoch
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
793 // bits of the mark word are equal to the epoch bits of the
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
794 // prototype header. (Note that the prototype header's epoch bits
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
795 // only change at a safepoint.) If not, attempt to rebias the object
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
796 // toward the current thread. Note that we must be absolutely sure
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
797 // that the current epoch is invalid in order to do this because
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
798 // otherwise the manipulations it performs on the mark word are
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
799 // illegal.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
800 testq(tmp_reg, markOopDesc::epoch_mask_in_place);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
801 jcc(Assembler::notZero, try_rebias);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
802
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
803 // The epoch of the current bias is still valid but we know nothing
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
804 // about the owner; it might be set or it might be clear. Try to
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
805 // acquire the bias of the object using an atomic operation. If this
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
806 // fails we will go in to the runtime to revoke the object's bias.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
807 // Note that we first construct the presumed unbiased header so we
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
808 // don't accidentally blow away another thread's valid bias.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
809 andq(swap_reg,
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
810 markOopDesc::biased_lock_mask_in_place | markOopDesc::age_mask_in_place | markOopDesc::epoch_mask_in_place);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
811 movq(tmp_reg, swap_reg);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
812 orq(tmp_reg, r15_thread);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
813 if (os::is_MP()) {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
814 lock();
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
815 }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
816 cmpxchgq(tmp_reg, Address(obj_reg, 0));
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
817 // If the biasing toward our thread failed, this means that
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
818 // another thread succeeded in biasing it toward itself and we
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
819 // need to revoke that bias. The revocation will occur in the
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
820 // interpreter runtime in the slow case.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
821 if (counters != NULL) {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
822 cond_inc32(Assembler::zero,
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
823 ExternalAddress((address) counters->anonymously_biased_lock_entry_count_addr()));
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
824 }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
825 if (slow_case != NULL) {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
826 jcc(Assembler::notZero, *slow_case);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
827 }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
828 jmp(done);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
829
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
830 bind(try_rebias);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
831 // At this point we know the epoch has expired, meaning that the
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
832 // current "bias owner", if any, is actually invalid. Under these
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
833 // circumstances _only_, we are allowed to use the current header's
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
834 // value as the comparison value when doing the cas to acquire the
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
835 // bias in the current epoch. In other words, we allow transfer of
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
836 // the bias from one thread to another directly in this situation.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
837 //
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
838 // FIXME: due to a lack of registers we currently blow away the age
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
839 // bits in this situation. Should attempt to preserve them.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
840 load_prototype_header(tmp_reg, obj_reg);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
841 orq(tmp_reg, r15_thread);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
842 if (os::is_MP()) {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
843 lock();
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
844 }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
845 cmpxchgq(tmp_reg, Address(obj_reg, 0));
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
846 // If the biasing toward our thread failed, then another thread
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
847 // succeeded in biasing it toward itself and we need to revoke that
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
848 // bias. The revocation will occur in the runtime in the slow case.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
849 if (counters != NULL) {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
850 cond_inc32(Assembler::zero,
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
851 ExternalAddress((address) counters->rebiased_lock_entry_count_addr()));
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
852 }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
853 if (slow_case != NULL) {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
854 jcc(Assembler::notZero, *slow_case);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
855 }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
856 jmp(done);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
857
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
858 bind(try_revoke_bias);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
859 // The prototype mark in the klass doesn't have the bias bit set any
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
860 // more, indicating that objects of this data type are not supposed
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
861 // to be biased any more. We are going to try to reset the mark of
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
862 // this object to the prototype value and fall through to the
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
863 // CAS-based locking scheme. Note that if our CAS fails, it means
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
864 // that another thread raced us for the privilege of revoking the
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
865 // bias of this particular object, so it's okay to continue in the
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
866 // normal locking code.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
867 //
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
868 // FIXME: due to a lack of registers we currently blow away the age
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
869 // bits in this situation. Should attempt to preserve them.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
870 load_prototype_header(tmp_reg, obj_reg);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
871 if (os::is_MP()) {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
872 lock();
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
873 }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
874 cmpxchgq(tmp_reg, Address(obj_reg, 0));
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
875 // Fall through to the normal CAS-based lock, because no matter what
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
876 // the result of the above CAS, some thread must have succeeded in
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
877 // removing the bias bit from the object's header.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
878 if (counters != NULL) {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
879 cond_inc32(Assembler::zero,
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
880 ExternalAddress((address) counters->revoked_lock_entry_count_addr()));
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
881 }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
882
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
883 bind(cas_label);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
884
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
885 return null_check_offset;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
886 }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
887
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
888 void MacroAssembler::call_VM_leaf_base(address entry_point, int num_args) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
889 Label L, E;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
890
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
891 #ifdef _WIN64
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
892 // Windows always allocates space for it's register args
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
893 assert(num_args <= 4, "only register arguments supported");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
894 subq(rsp, frame::arg_reg_save_area_bytes);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
895 #endif
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 // Align stack if necessary
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
898 testl(rsp, 15);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
899 jcc(Assembler::zero, L);
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 subq(rsp, 8);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
902 {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
903 call(RuntimeAddress(entry_point));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
904 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
905 addq(rsp, 8);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
906 jmp(E);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
907
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
908 bind(L);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
909 {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
910 call(RuntimeAddress(entry_point));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
911 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
912
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
913 bind(E);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
914
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
915 #ifdef _WIN64
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
916 // restore stack pointer
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
917 addq(rsp, frame::arg_reg_save_area_bytes);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
918 #endif
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
919
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
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
922 void MacroAssembler::cmp64(Register src1, AddressLiteral src2) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
923 assert(!src2.is_lval(), "should use cmpptr");
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 if (reachable(src2)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
926 cmpq(src1, as_Address(src2));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
927 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
928 lea(rscratch1, src2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
929 Assembler::cmpq(src1, Address(rscratch1, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
930 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
931 }
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 int MacroAssembler::corrected_idivq(Register reg) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
934 // Full implementation of Java ldiv and lrem; checks for special
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
935 // case as described in JVM spec., p.243 & p.271. The function
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
936 // returns the (pc) offset of the idivl instruction - may be needed
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
937 // for implicit exceptions.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
938 //
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
939 // normal case special case
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 // input : rax: dividend min_long
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
942 // reg: divisor (may not be eax/edx) -1
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
943 //
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
944 // output: rax: quotient (= rax idiv reg) min_long
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
945 // rdx: remainder (= rax irem reg) 0
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
946 assert(reg != rax && reg != rdx, "reg cannot be rax or rdx register");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
947 static const int64_t min_long = 0x8000000000000000;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
948 Label normal_case, special_case;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
949
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
950 // check for special case
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
951 cmp64(rax, ExternalAddress((address) &min_long));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
952 jcc(Assembler::notEqual, normal_case);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
953 xorl(rdx, rdx); // prepare rdx for possible special case (where
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
954 // remainder = 0)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
955 cmpq(reg, -1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
956 jcc(Assembler::equal, special_case);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
957
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
958 // handle normal case
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
959 bind(normal_case);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
960 cdqq();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
961 int idivq_offset = offset();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
962 idivq(reg);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
963
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
964 // normal and special case exit
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
965 bind(special_case);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
966
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
967 return idivq_offset;
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
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
970 void MacroAssembler::decrementq(Register reg, int value) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
971 if (value == min_jint) { subq(reg, value); return; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
972 if (value < 0) { incrementq(reg, -value); return; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
973 if (value == 0) { ; return; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
974 if (value == 1 && UseIncDec) { decq(reg) ; return; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
975 /* else */ { subq(reg, value) ; return; }
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
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
978 void MacroAssembler::decrementq(Address dst, int value) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
979 if (value == min_jint) { subq(dst, value); return; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
980 if (value < 0) { incrementq(dst, -value); return; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
981 if (value == 0) { ; return; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
982 if (value == 1 && UseIncDec) { decq(dst) ; return; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
983 /* else */ { subq(dst, value) ; return; }
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
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
986 void MacroAssembler::incrementq(Register reg, int value) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
987 if (value == min_jint) { addq(reg, value); return; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
988 if (value < 0) { decrementq(reg, -value); return; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
989 if (value == 0) { ; return; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
990 if (value == 1 && UseIncDec) { incq(reg) ; return; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
991 /* else */ { addq(reg, value) ; return; }
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
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
994 void MacroAssembler::incrementq(Address dst, int value) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
995 if (value == min_jint) { addq(dst, value); return; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
996 if (value < 0) { decrementq(dst, -value); return; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
997 if (value == 0) { ; return; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
998 if (value == 1 && UseIncDec) { incq(dst) ; return; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
999 /* else */ { addq(dst, value) ; return; }
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
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1002 // 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
1003 // to be installed in the Address class
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1004 void MacroAssembler::jump(ArrayAddress entry) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1005 lea(rscratch1, entry.base());
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1006 Address dispatch = entry.index();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1007 assert(dispatch._base == noreg, "must be");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1008 dispatch._base = rscratch1;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1009 jmp(dispatch);
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
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1012 void MacroAssembler::lcmp2int(Register x_hi, Register x_lo, Register y_hi, Register y_lo) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1013 ShouldNotReachHere(); // 64bit doesn't use two regs
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1014 cmpq(x_lo, y_lo);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1015 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1016
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1017 void MacroAssembler::lea(Register dst, AddressLiteral src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1018 mov_literal64(dst, (intptr_t)src.target(), src.rspec());
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1019 }
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 MacroAssembler::lea(Address dst, AddressLiteral adr) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1022 mov_literal64(rscratch1, (intptr_t)adr.target(), adr.rspec());
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1023 movptr(dst, rscratch1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1024 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1025
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1026 void MacroAssembler::leave() {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1027 // %%% is this really better? Why not on 32bit too?
7430
d02120b7a34f 8004250: replace AbstractAssembler a_byte/a_long with emit_int8/emit_int32
twisti
parents: 7427
diff changeset
1028 emit_int8((unsigned char)0xC9); // LEAVE
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1029 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1030
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1031 void MacroAssembler::lneg(Register hi, Register lo) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1032 ShouldNotReachHere(); // 64bit doesn't use two regs
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1033 negq(lo);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1034 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1035
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1036 void MacroAssembler::movoop(Register dst, jobject obj) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1037 mov_literal64(dst, (intptr_t)obj, oop_Relocation::spec_for_immediate());
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
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1040 void MacroAssembler::movoop(Address dst, jobject obj) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1041 mov_literal64(rscratch1, (intptr_t)obj, oop_Relocation::spec_for_immediate());
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1042 movq(dst, rscratch1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1043 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1044
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1045 void MacroAssembler::mov_metadata(Register dst, Metadata* obj) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1046 mov_literal64(dst, (intptr_t)obj, metadata_Relocation::spec_for_immediate());
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1047 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1048
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1049 void MacroAssembler::mov_metadata(Address dst, Metadata* obj) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1050 mov_literal64(rscratch1, (intptr_t)obj, metadata_Relocation::spec_for_immediate());
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1051 movq(dst, rscratch1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1052 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1053
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1054 void MacroAssembler::movptr(Register dst, AddressLiteral src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1055 if (src.is_lval()) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1056 mov_literal64(dst, (intptr_t)src.target(), src.rspec());
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1057 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1058 if (reachable(src)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1059 movq(dst, as_Address(src));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1060 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1061 lea(rscratch1, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1062 movq(dst, Address(rscratch1,0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1063 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1064 }
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
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1067 void MacroAssembler::movptr(ArrayAddress dst, Register src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1068 movq(as_Address(dst), 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
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1071 void MacroAssembler::movptr(Register dst, ArrayAddress src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1072 movq(dst, as_Address(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
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1075 // src should NEVER be a real pointer. Use AddressLiteral for true pointers
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1076 void MacroAssembler::movptr(Address dst, intptr_t src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1077 mov64(rscratch1, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1078 movq(dst, rscratch1);
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
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1081 // These are mostly for initializing NULL
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1082 void MacroAssembler::movptr(Address dst, int32_t src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1083 movslq(dst, src);
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
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1086 void MacroAssembler::movptr(Register dst, int32_t src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1087 mov64(dst, (intptr_t)src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1088 }
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 void MacroAssembler::pushoop(jobject obj) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1091 movoop(rscratch1, obj);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1092 push(rscratch1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1093 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1094
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1095 void MacroAssembler::pushklass(Metadata* obj) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1096 mov_metadata(rscratch1, obj);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1097 push(rscratch1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1098 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1099
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1100 void MacroAssembler::pushptr(AddressLiteral src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1101 lea(rscratch1, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1102 if (src.is_lval()) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1103 push(rscratch1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1104 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1105 pushq(Address(rscratch1, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1106 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1107 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1108
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1109 void MacroAssembler::reset_last_Java_frame(bool clear_fp,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1110 bool clear_pc) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1111 // we must set sp to zero to clear frame
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1112 movptr(Address(r15_thread, JavaThread::last_Java_sp_offset()), NULL_WORD);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1113 // must clear fp, so that compiled frames are not confused; it is
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1114 // possible that we need it only for debugging
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1115 if (clear_fp) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1116 movptr(Address(r15_thread, JavaThread::last_Java_fp_offset()), NULL_WORD);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1117 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1118
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1119 if (clear_pc) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1120 movptr(Address(r15_thread, JavaThread::last_Java_pc_offset()), NULL_WORD);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1121 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1122 }
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 void MacroAssembler::set_last_Java_frame(Register last_java_sp,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1125 Register last_java_fp,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1126 address last_java_pc) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1127 // determine last_java_sp register
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1128 if (!last_java_sp->is_valid()) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1129 last_java_sp = rsp;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1130 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1131
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1132 // last_java_fp is optional
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1133 if (last_java_fp->is_valid()) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1134 movptr(Address(r15_thread, JavaThread::last_Java_fp_offset()),
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1135 last_java_fp);
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
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1138 // last_java_pc is optional
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1139 if (last_java_pc != NULL) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1140 Address java_pc(r15_thread,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1141 JavaThread::frame_anchor_offset() + JavaFrameAnchor::last_Java_pc_offset());
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1142 lea(rscratch1, InternalAddress(last_java_pc));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1143 movptr(java_pc, rscratch1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1144 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1145
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1146 movptr(Address(r15_thread, JavaThread::last_Java_sp_offset()), last_java_sp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1147 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1148
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1149 static void pass_arg0(MacroAssembler* masm, Register arg) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1150 if (c_rarg0 != arg ) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1151 masm->mov(c_rarg0, arg);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1152 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1153 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1154
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1155 static void pass_arg1(MacroAssembler* masm, Register arg) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1156 if (c_rarg1 != arg ) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1157 masm->mov(c_rarg1, arg);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1158 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1159 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1160
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1161 static void pass_arg2(MacroAssembler* masm, Register arg) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1162 if (c_rarg2 != arg ) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1163 masm->mov(c_rarg2, arg);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1164 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1165 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1166
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1167 static void pass_arg3(MacroAssembler* masm, Register arg) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1168 if (c_rarg3 != arg ) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1169 masm->mov(c_rarg3, arg);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1170 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1171 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1172
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1173 void MacroAssembler::stop(const char* msg) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1174 address rip = pc();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1175 pusha(); // get regs on stack
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1176 lea(c_rarg0, ExternalAddress((address) msg));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1177 lea(c_rarg1, InternalAddress(rip));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1178 movq(c_rarg2, rsp); // pass pointer to regs array
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1179 andq(rsp, -16); // align stack as required by ABI
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1180 call(RuntimeAddress(CAST_FROM_FN_PTR(address, MacroAssembler::debug64)));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1181 hlt();
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
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1184 void MacroAssembler::warn(const char* msg) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1185 push(rbp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1186 movq(rbp, rsp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1187 andq(rsp, -16); // align stack as required by push_CPU_state and call
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1188 push_CPU_state(); // keeps alignment at 16 bytes
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1189 lea(c_rarg0, ExternalAddress((address) msg));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1190 call_VM_leaf(CAST_FROM_FN_PTR(address, warning), c_rarg0);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1191 pop_CPU_state();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1192 mov(rsp, rbp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1193 pop(rbp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1194 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1195
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1196 void MacroAssembler::print_state() {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1197 address rip = pc();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1198 pusha(); // get regs on stack
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1199 push(rbp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1200 movq(rbp, rsp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1201 andq(rsp, -16); // align stack as required by push_CPU_state and call
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1202 push_CPU_state(); // keeps alignment at 16 bytes
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1203
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1204 lea(c_rarg0, InternalAddress(rip));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1205 lea(c_rarg1, Address(rbp, wordSize)); // pass pointer to regs array
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1206 call_VM_leaf(CAST_FROM_FN_PTR(address, MacroAssembler::print_state64), c_rarg0, c_rarg1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1207
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1208 pop_CPU_state();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1209 mov(rsp, rbp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1210 pop(rbp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1211 popa();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1212 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1213
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1214 #ifndef PRODUCT
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1215 extern "C" void findpc(intptr_t x);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1216 #endif
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1217
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1218 void MacroAssembler::debug64(char* msg, int64_t pc, int64_t regs[]) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1219 // In order to get locks to work, we need to fake a in_VM state
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1220 if (ShowMessageBoxOnError) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1221 JavaThread* thread = JavaThread::current();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1222 JavaThreadState saved_state = thread->thread_state();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1223 thread->set_thread_state(_thread_in_vm);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1224 #ifndef PRODUCT
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1225 if (CountBytecodes || TraceBytecodes || StopInterpreterAt) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1226 ttyLocker ttyl;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1227 BytecodeCounter::print();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1228 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1229 #endif
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1230 // To see where a verify_oop failed, get $ebx+40/X for this frame.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1231 // XXX correct this offset for amd64
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1232 // This is the value of eip which points to where verify_oop will return.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1233 if (os::message_box(msg, "Execution stopped, print registers?")) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1234 print_state64(pc, regs);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1235 BREAKPOINT;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1236 assert(false, "start up GDB");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1237 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1238 ThreadStateTransition::transition(thread, _thread_in_vm, saved_state);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1239 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1240 ttyLocker ttyl;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1241 ::tty->print_cr("=============== DEBUG MESSAGE: %s ================\n",
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1242 msg);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1243 assert(false, err_msg("DEBUG MESSAGE: %s", msg));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1244 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1245 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1246
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1247 void MacroAssembler::print_state64(int64_t pc, int64_t regs[]) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1248 ttyLocker ttyl;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1249 FlagSetting fs(Debugging, true);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1250 tty->print_cr("rip = 0x%016lx", pc);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1251 #ifndef PRODUCT
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1252 tty->cr();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1253 findpc(pc);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1254 tty->cr();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1255 #endif
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1256 #define PRINT_REG(rax, value) \
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1257 { tty->print("%s = ", #rax); os::print_location(tty, value); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1258 PRINT_REG(rax, regs[15]);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1259 PRINT_REG(rbx, regs[12]);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1260 PRINT_REG(rcx, regs[14]);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1261 PRINT_REG(rdx, regs[13]);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1262 PRINT_REG(rdi, regs[8]);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1263 PRINT_REG(rsi, regs[9]);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1264 PRINT_REG(rbp, regs[10]);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1265 PRINT_REG(rsp, regs[11]);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1266 PRINT_REG(r8 , regs[7]);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1267 PRINT_REG(r9 , regs[6]);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1268 PRINT_REG(r10, regs[5]);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1269 PRINT_REG(r11, regs[4]);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1270 PRINT_REG(r12, regs[3]);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1271 PRINT_REG(r13, regs[2]);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1272 PRINT_REG(r14, regs[1]);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1273 PRINT_REG(r15, regs[0]);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1274 #undef PRINT_REG
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1275 // Print some words near top of staack.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1276 int64_t* rsp = (int64_t*) regs[11];
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1277 int64_t* dump_sp = rsp;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1278 for (int col1 = 0; col1 < 8; col1++) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1279 tty->print("(rsp+0x%03x) 0x%016lx: ", (int)((intptr_t)dump_sp - (intptr_t)rsp), (int64_t)dump_sp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1280 os::print_location(tty, *dump_sp++);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1281 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1282 for (int row = 0; row < 25; row++) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1283 tty->print("(rsp+0x%03x) 0x%016lx: ", (int)((intptr_t)dump_sp - (intptr_t)rsp), (int64_t)dump_sp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1284 for (int col = 0; col < 4; col++) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1285 tty->print(" 0x%016lx", *dump_sp++);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1286 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1287 tty->cr();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1288 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1289 // Print some instructions around pc:
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1290 Disassembler::decode((address)pc-64, (address)pc);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1291 tty->print_cr("--------");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1292 Disassembler::decode((address)pc, (address)pc+32);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1293 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1294
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1295 #endif // _LP64
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1296
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1297 // Now versions that are common to 32/64 bit
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1298
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1299 void MacroAssembler::addptr(Register dst, int32_t imm32) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1300 LP64_ONLY(addq(dst, imm32)) NOT_LP64(addl(dst, imm32));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1301 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1302
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1303 void MacroAssembler::addptr(Register dst, Register src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1304 LP64_ONLY(addq(dst, src)) NOT_LP64(addl(dst, src));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1305 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1306
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1307 void MacroAssembler::addptr(Address dst, Register src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1308 LP64_ONLY(addq(dst, src)) NOT_LP64(addl(dst, src));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1309 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1310
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1311 void MacroAssembler::addsd(XMMRegister dst, AddressLiteral src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1312 if (reachable(src)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1313 Assembler::addsd(dst, as_Address(src));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1314 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1315 lea(rscratch1, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1316 Assembler::addsd(dst, Address(rscratch1, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1317 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1318 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1319
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1320 void MacroAssembler::addss(XMMRegister dst, AddressLiteral src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1321 if (reachable(src)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1322 addss(dst, as_Address(src));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1323 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1324 lea(rscratch1, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1325 addss(dst, Address(rscratch1, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1326 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1327 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1328
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1329 void MacroAssembler::align(int modulus) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1330 if (offset() % modulus != 0) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1331 nop(modulus - (offset() % modulus));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1332 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1333 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1334
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1335 void MacroAssembler::andpd(XMMRegister dst, AddressLiteral src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1336 // Used in sign-masking with aligned address.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1337 assert((UseAVX > 0) || (((intptr_t)src.target() & 15) == 0), "SSE mode requires address alignment 16 bytes");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1338 if (reachable(src)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1339 Assembler::andpd(dst, as_Address(src));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1340 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1341 lea(rscratch1, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1342 Assembler::andpd(dst, Address(rscratch1, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1343 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1344 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1345
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1346 void MacroAssembler::andps(XMMRegister dst, AddressLiteral src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1347 // Used in sign-masking with aligned address.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1348 assert((UseAVX > 0) || (((intptr_t)src.target() & 15) == 0), "SSE mode requires address alignment 16 bytes");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1349 if (reachable(src)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1350 Assembler::andps(dst, as_Address(src));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1351 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1352 lea(rscratch1, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1353 Assembler::andps(dst, Address(rscratch1, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1354 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1355 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1356
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1357 void MacroAssembler::andptr(Register dst, int32_t imm32) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1358 LP64_ONLY(andq(dst, imm32)) NOT_LP64(andl(dst, imm32));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1359 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1360
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1361 void MacroAssembler::atomic_incl(AddressLiteral counter_addr) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1362 pushf();
14909
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
1363 if (os::is_MP())
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
1364 lock();
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
1365 incrementl(counter_addr);
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1366 popf();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1367 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1368
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1369 // Writes to stack successive pages until offset reached to check for
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1370 // stack overflow + shadow pages. This clobbers tmp.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1371 void MacroAssembler::bang_stack_size(Register size, Register tmp) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1372 movptr(tmp, rsp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1373 // Bang stack for total size given plus shadow page size.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1374 // Bang one page at a time because large size can bang beyond yellow and
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1375 // red zones.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1376 Label loop;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1377 bind(loop);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1378 movl(Address(tmp, (-os::vm_page_size())), size );
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1379 subptr(tmp, os::vm_page_size());
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1380 subl(size, os::vm_page_size());
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1381 jcc(Assembler::greater, loop);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1382
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1383 // Bang down shadow pages too.
13047
be525e91f65b 8026775: nsk/jvmti/RedefineClasses/StressRedefine crashes due to EXCEPTION_ACCESS_VIOLATION
mikael
parents: 13000
diff changeset
1384 // At this point, (tmp-0) is the last address touched, so don't
be525e91f65b 8026775: nsk/jvmti/RedefineClasses/StressRedefine crashes due to EXCEPTION_ACCESS_VIOLATION
mikael
parents: 13000
diff changeset
1385 // touch it again. (It was touched as (tmp-pagesize) but then tmp
be525e91f65b 8026775: nsk/jvmti/RedefineClasses/StressRedefine crashes due to EXCEPTION_ACCESS_VIOLATION
mikael
parents: 13000
diff changeset
1386 // was post-decremented.) Skip this address by starting at i=1, and
be525e91f65b 8026775: nsk/jvmti/RedefineClasses/StressRedefine crashes due to EXCEPTION_ACCESS_VIOLATION
mikael
parents: 13000
diff changeset
1387 // touch a few more pages below. N.B. It is important to touch all
be525e91f65b 8026775: nsk/jvmti/RedefineClasses/StressRedefine crashes due to EXCEPTION_ACCESS_VIOLATION
mikael
parents: 13000
diff changeset
1388 // the way down to and including i=StackShadowPages.
be525e91f65b 8026775: nsk/jvmti/RedefineClasses/StressRedefine crashes due to EXCEPTION_ACCESS_VIOLATION
mikael
parents: 13000
diff changeset
1389 for (int i = 1; i <= StackShadowPages; i++) {
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1390 // this could be any sized move but this is can be a debugging crumb
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1391 // so the bigger the better.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1392 movptr(Address(tmp, (-i*os::vm_page_size())), size );
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1393 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1394 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1395
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1396 void MacroAssembler::biased_locking_exit(Register obj_reg, Register temp_reg, Label& done) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1397 assert(UseBiasedLocking, "why call this otherwise?");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1398
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1399 // Check for biased locking unlock case, which is a no-op
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1400 // Note: we do not have to check the thread ID for two reasons.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1401 // First, the interpreter checks for IllegalMonitorStateException at
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1402 // a higher level. Second, if the bias was revoked while we held the
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1403 // lock, the object could not be rebiased toward another thread, so
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1404 // the bias bit would be clear.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1405 movptr(temp_reg, Address(obj_reg, oopDesc::mark_offset_in_bytes()));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1406 andptr(temp_reg, markOopDesc::biased_lock_mask_in_place);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1407 cmpptr(temp_reg, markOopDesc::biased_lock_pattern);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1408 jcc(Assembler::equal, done);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1409 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1410
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1411 void MacroAssembler::c2bool(Register x) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1412 // implements x == 0 ? 0 : 1
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1413 // note: must only look at least-significant byte of x
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1414 // since C-style booleans are stored in one byte
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1415 // only! (was bug)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1416 andl(x, 0xFF);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1417 setb(Assembler::notZero, x);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1418 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1419
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1420 // Wouldn't need if AddressLiteral version had new name
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1421 void MacroAssembler::call(Label& L, relocInfo::relocType rtype) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1422 Assembler::call(L, rtype);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1423 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1424
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1425 void MacroAssembler::call(Register entry) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1426 Assembler::call(entry);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1427 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1428
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1429 void MacroAssembler::call(AddressLiteral entry) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1430 if (reachable(entry)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1431 Assembler::call_literal(entry.target(), entry.rspec());
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1432 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1433 lea(rscratch1, entry);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1434 Assembler::call(rscratch1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1435 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1436 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1437
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1438 void MacroAssembler::ic_call(address entry) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1439 RelocationHolder rh = virtual_call_Relocation::spec(pc());
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1440 movptr(rax, (intptr_t)Universe::non_oop_word());
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1441 call(AddressLiteral(entry, rh));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1442 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1443
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1444 // Implementation of call_VM versions
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1445
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1446 void MacroAssembler::call_VM(Register oop_result,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1447 address entry_point,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1448 bool check_exceptions) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1449 Label C, E;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1450 call(C, relocInfo::none);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1451 jmp(E);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1452
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1453 bind(C);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1454 call_VM_helper(oop_result, entry_point, 0, check_exceptions);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1455 ret(0);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1456
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1457 bind(E);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1458 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1459
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1460 void MacroAssembler::call_VM(Register oop_result,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1461 address entry_point,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1462 Register arg_1,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1463 bool check_exceptions) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1464 Label C, E;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1465 call(C, relocInfo::none);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1466 jmp(E);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1467
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1468 bind(C);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1469 pass_arg1(this, arg_1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1470 call_VM_helper(oop_result, entry_point, 1, check_exceptions);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1471 ret(0);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1472
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1473 bind(E);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1474 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1475
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1476 void MacroAssembler::call_VM(Register oop_result,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1477 address entry_point,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1478 Register arg_1,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1479 Register arg_2,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1480 bool check_exceptions) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1481 Label C, E;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1482 call(C, relocInfo::none);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1483 jmp(E);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1484
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1485 bind(C);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1486
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1487 LP64_ONLY(assert(arg_1 != c_rarg2, "smashed arg"));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1488
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1489 pass_arg2(this, arg_2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1490 pass_arg1(this, arg_1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1491 call_VM_helper(oop_result, entry_point, 2, check_exceptions);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1492 ret(0);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1493
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1494 bind(E);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1495 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1496
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1497 void MacroAssembler::call_VM(Register oop_result,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1498 address entry_point,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1499 Register arg_1,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1500 Register arg_2,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1501 Register arg_3,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1502 bool check_exceptions) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1503 Label C, E;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1504 call(C, relocInfo::none);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1505 jmp(E);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1506
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1507 bind(C);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1508
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1509 LP64_ONLY(assert(arg_1 != c_rarg3, "smashed arg"));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1510 LP64_ONLY(assert(arg_2 != c_rarg3, "smashed arg"));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1511 pass_arg3(this, arg_3);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1512
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1513 LP64_ONLY(assert(arg_1 != c_rarg2, "smashed arg"));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1514 pass_arg2(this, arg_2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1515
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1516 pass_arg1(this, arg_1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1517 call_VM_helper(oop_result, entry_point, 3, check_exceptions);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1518 ret(0);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1519
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1520 bind(E);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1521 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1522
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1523 void MacroAssembler::call_VM(Register oop_result,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1524 Register last_java_sp,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1525 address entry_point,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1526 int number_of_arguments,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1527 bool check_exceptions) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1528 Register thread = LP64_ONLY(r15_thread) NOT_LP64(noreg);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1529 call_VM_base(oop_result, thread, last_java_sp, entry_point, number_of_arguments, check_exceptions);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1530 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1531
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1532 void MacroAssembler::call_VM(Register oop_result,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1533 Register last_java_sp,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1534 address entry_point,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1535 Register arg_1,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1536 bool check_exceptions) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1537 pass_arg1(this, arg_1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1538 call_VM(oop_result, last_java_sp, entry_point, 1, check_exceptions);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1539 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1540
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1541 void MacroAssembler::call_VM(Register oop_result,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1542 Register last_java_sp,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1543 address entry_point,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1544 Register arg_1,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1545 Register arg_2,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1546 bool check_exceptions) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1547
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1548 LP64_ONLY(assert(arg_1 != c_rarg2, "smashed arg"));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1549 pass_arg2(this, arg_2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1550 pass_arg1(this, arg_1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1551 call_VM(oop_result, last_java_sp, entry_point, 2, check_exceptions);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1552 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1553
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1554 void MacroAssembler::call_VM(Register oop_result,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1555 Register last_java_sp,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1556 address entry_point,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1557 Register arg_1,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1558 Register arg_2,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1559 Register arg_3,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1560 bool check_exceptions) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1561 LP64_ONLY(assert(arg_1 != c_rarg3, "smashed arg"));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1562 LP64_ONLY(assert(arg_2 != c_rarg3, "smashed arg"));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1563 pass_arg3(this, arg_3);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1564 LP64_ONLY(assert(arg_1 != c_rarg2, "smashed arg"));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1565 pass_arg2(this, arg_2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1566 pass_arg1(this, arg_1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1567 call_VM(oop_result, last_java_sp, entry_point, 3, check_exceptions);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1568 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1569
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1570 void MacroAssembler::super_call_VM(Register oop_result,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1571 Register last_java_sp,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1572 address entry_point,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1573 int number_of_arguments,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1574 bool check_exceptions) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1575 Register thread = LP64_ONLY(r15_thread) NOT_LP64(noreg);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1576 MacroAssembler::call_VM_base(oop_result, thread, last_java_sp, entry_point, number_of_arguments, check_exceptions);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1577 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1578
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1579 void MacroAssembler::super_call_VM(Register oop_result,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1580 Register last_java_sp,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1581 address entry_point,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1582 Register arg_1,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1583 bool check_exceptions) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1584 pass_arg1(this, arg_1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1585 super_call_VM(oop_result, last_java_sp, entry_point, 1, check_exceptions);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1586 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1587
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1588 void MacroAssembler::super_call_VM(Register oop_result,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1589 Register last_java_sp,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1590 address entry_point,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1591 Register arg_1,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1592 Register arg_2,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1593 bool check_exceptions) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1594
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1595 LP64_ONLY(assert(arg_1 != c_rarg2, "smashed arg"));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1596 pass_arg2(this, arg_2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1597 pass_arg1(this, arg_1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1598 super_call_VM(oop_result, last_java_sp, entry_point, 2, check_exceptions);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1599 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1600
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1601 void MacroAssembler::super_call_VM(Register oop_result,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1602 Register last_java_sp,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1603 address entry_point,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1604 Register arg_1,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1605 Register arg_2,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1606 Register arg_3,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1607 bool check_exceptions) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1608 LP64_ONLY(assert(arg_1 != c_rarg3, "smashed arg"));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1609 LP64_ONLY(assert(arg_2 != c_rarg3, "smashed arg"));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1610 pass_arg3(this, arg_3);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1611 LP64_ONLY(assert(arg_1 != c_rarg2, "smashed arg"));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1612 pass_arg2(this, arg_2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1613 pass_arg1(this, arg_1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1614 super_call_VM(oop_result, last_java_sp, entry_point, 3, check_exceptions);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1615 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1616
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1617 void MacroAssembler::call_VM_base(Register oop_result,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1618 Register java_thread,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1619 Register last_java_sp,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1620 address entry_point,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1621 int number_of_arguments,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1622 bool check_exceptions) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1623 // determine java_thread register
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1624 if (!java_thread->is_valid()) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1625 #ifdef _LP64
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1626 java_thread = r15_thread;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1627 #else
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1628 java_thread = rdi;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1629 get_thread(java_thread);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1630 #endif // LP64
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1631 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1632 // determine last_java_sp register
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1633 if (!last_java_sp->is_valid()) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1634 last_java_sp = rsp;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1635 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1636 // debugging support
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1637 assert(number_of_arguments >= 0 , "cannot have negative number of arguments");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1638 LP64_ONLY(assert(java_thread == r15_thread, "unexpected register"));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1639 #ifdef ASSERT
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1640 // TraceBytecodes does not use r12 but saves it over the call, so don't verify
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1641 // r12 is the heapbase.
12226
7944aba7ba41 8015107: NPG: Use consistent naming for metaspace concepts
ehelin
parents: 12056
diff changeset
1642 LP64_ONLY(if ((UseCompressedOops || UseCompressedClassPointers) && !TraceBytecodes) verify_heapbase("call_VM_base: heap base corrupted?");)
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1643 #endif // ASSERT
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1644
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1645 assert(java_thread != oop_result , "cannot use the same register for java_thread & oop_result");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1646 assert(java_thread != last_java_sp, "cannot use the same register for java_thread & last_java_sp");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1647
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1648 // push java thread (becomes first argument of C function)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1649
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1650 NOT_LP64(push(java_thread); number_of_arguments++);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1651 LP64_ONLY(mov(c_rarg0, r15_thread));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1652
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1653 // set last Java frame before call
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1654 assert(last_java_sp != rbp, "can't use ebp/rbp");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1655
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1656 // Only interpreter should have to set fp
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1657 set_last_Java_frame(java_thread, last_java_sp, rbp, NULL);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1658
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1659 // do the call, remove parameters
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1660 MacroAssembler::call_VM_leaf_base(entry_point, number_of_arguments);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1661
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1662 // restore the thread (cannot use the pushed argument since arguments
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1663 // may be overwritten by C code generated by an optimizing compiler);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1664 // however can use the register value directly if it is callee saved.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1665 if (LP64_ONLY(true ||) java_thread == rdi || java_thread == rsi) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1666 // rdi & rsi (also r15) are callee saved -> nothing to do
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1667 #ifdef ASSERT
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1668 guarantee(java_thread != rax, "change this code");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1669 push(rax);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1670 { Label L;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1671 get_thread(rax);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1672 cmpptr(java_thread, rax);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1673 jcc(Assembler::equal, L);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1674 STOP("MacroAssembler::call_VM_base: rdi not callee saved?");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1675 bind(L);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1676 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1677 pop(rax);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1678 #endif
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1679 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1680 get_thread(java_thread);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1681 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1682 // reset last Java frame
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1683 // Only interpreter should have to clear fp
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1684 reset_last_Java_frame(java_thread, true, false);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1685
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1686 #ifndef CC_INTERP
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1687 // C++ interp handles this in the interpreter
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1688 check_and_handle_popframe(java_thread);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1689 check_and_handle_earlyret(java_thread);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1690 #endif /* CC_INTERP */
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1691
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1692 if (check_exceptions) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1693 // check for pending exceptions (java_thread is set upon return)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1694 cmpptr(Address(java_thread, Thread::pending_exception_offset()), (int32_t) NULL_WORD);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1695 #ifndef _LP64
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1696 jump_cc(Assembler::notEqual,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1697 RuntimeAddress(StubRoutines::forward_exception_entry()));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1698 #else
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1699 // This used to conditionally jump to forward_exception however it is
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1700 // possible if we relocate that the branch will not reach. So we must jump
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1701 // around so we can always reach
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1702
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1703 Label ok;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1704 jcc(Assembler::equal, ok);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1705 jump(RuntimeAddress(StubRoutines::forward_exception_entry()));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1706 bind(ok);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1707 #endif // LP64
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1708 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1709
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1710 // get oop result if there is one and reset the value in the thread
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1711 if (oop_result->is_valid()) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1712 get_vm_result(oop_result, java_thread);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1713 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1714 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1715
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1716 void MacroAssembler::call_VM_helper(Register oop_result, address entry_point, int number_of_arguments, bool check_exceptions) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1717
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1718 // Calculate the value for last_Java_sp
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1719 // somewhat subtle. call_VM does an intermediate call
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1720 // which places a return address on the stack just under the
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1721 // stack pointer as the user finsihed with it. This allows
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1722 // use to retrieve last_Java_pc from last_Java_sp[-1].
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1723 // On 32bit we then have to push additional args on the stack to accomplish
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1724 // the actual requested call. On 64bit call_VM only can use register args
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1725 // so the only extra space is the return address that call_VM created.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1726 // This hopefully explains the calculations here.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1727
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1728 #ifdef _LP64
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1729 // We've pushed one address, correct last_Java_sp
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1730 lea(rax, Address(rsp, wordSize));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1731 #else
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1732 lea(rax, Address(rsp, (1 + number_of_arguments) * wordSize));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1733 #endif // LP64
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1734
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1735 call_VM_base(oop_result, noreg, rax, entry_point, number_of_arguments, check_exceptions);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1736
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1737 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1738
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1739 void MacroAssembler::call_VM_leaf(address entry_point, int number_of_arguments) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1740 call_VM_leaf_base(entry_point, number_of_arguments);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1741 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1742
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1743 void MacroAssembler::call_VM_leaf(address entry_point, Register arg_0) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1744 pass_arg0(this, arg_0);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1745 call_VM_leaf(entry_point, 1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1746 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1747
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1748 void MacroAssembler::call_VM_leaf(address entry_point, Register arg_0, Register arg_1) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1749
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1750 LP64_ONLY(assert(arg_0 != c_rarg1, "smashed arg"));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1751 pass_arg1(this, arg_1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1752 pass_arg0(this, arg_0);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1753 call_VM_leaf(entry_point, 2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1754 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1755
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1756 void MacroAssembler::call_VM_leaf(address entry_point, Register arg_0, Register arg_1, Register arg_2) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1757 LP64_ONLY(assert(arg_0 != c_rarg2, "smashed arg"));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1758 LP64_ONLY(assert(arg_1 != c_rarg2, "smashed arg"));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1759 pass_arg2(this, arg_2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1760 LP64_ONLY(assert(arg_0 != c_rarg1, "smashed arg"));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1761 pass_arg1(this, arg_1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1762 pass_arg0(this, arg_0);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1763 call_VM_leaf(entry_point, 3);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1764 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1765
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1766 void MacroAssembler::super_call_VM_leaf(address entry_point, Register arg_0) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1767 pass_arg0(this, arg_0);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1768 MacroAssembler::call_VM_leaf_base(entry_point, 1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1769 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1770
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1771 void MacroAssembler::super_call_VM_leaf(address entry_point, Register arg_0, Register arg_1) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1772
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1773 LP64_ONLY(assert(arg_0 != c_rarg1, "smashed arg"));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1774 pass_arg1(this, arg_1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1775 pass_arg0(this, arg_0);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1776 MacroAssembler::call_VM_leaf_base(entry_point, 2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1777 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1778
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1779 void MacroAssembler::super_call_VM_leaf(address entry_point, Register arg_0, Register arg_1, Register arg_2) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1780 LP64_ONLY(assert(arg_0 != c_rarg2, "smashed arg"));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1781 LP64_ONLY(assert(arg_1 != c_rarg2, "smashed arg"));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1782 pass_arg2(this, arg_2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1783 LP64_ONLY(assert(arg_0 != c_rarg1, "smashed arg"));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1784 pass_arg1(this, arg_1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1785 pass_arg0(this, arg_0);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1786 MacroAssembler::call_VM_leaf_base(entry_point, 3);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1787 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1788
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1789 void MacroAssembler::super_call_VM_leaf(address entry_point, Register arg_0, Register arg_1, Register arg_2, Register arg_3) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1790 LP64_ONLY(assert(arg_0 != c_rarg3, "smashed arg"));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1791 LP64_ONLY(assert(arg_1 != c_rarg3, "smashed arg"));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1792 LP64_ONLY(assert(arg_2 != c_rarg3, "smashed arg"));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1793 pass_arg3(this, arg_3);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1794 LP64_ONLY(assert(arg_0 != c_rarg2, "smashed arg"));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1795 LP64_ONLY(assert(arg_1 != c_rarg2, "smashed arg"));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1796 pass_arg2(this, arg_2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1797 LP64_ONLY(assert(arg_0 != c_rarg1, "smashed arg"));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1798 pass_arg1(this, arg_1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1799 pass_arg0(this, arg_0);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1800 MacroAssembler::call_VM_leaf_base(entry_point, 4);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1801 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1802
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1803 void MacroAssembler::get_vm_result(Register oop_result, Register java_thread) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1804 movptr(oop_result, Address(java_thread, JavaThread::vm_result_offset()));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1805 movptr(Address(java_thread, JavaThread::vm_result_offset()), NULL_WORD);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1806 verify_oop(oop_result, "broken oop in call_VM_base");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1807 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1808
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1809 void MacroAssembler::get_vm_result_2(Register metadata_result, Register java_thread) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1810 movptr(metadata_result, Address(java_thread, JavaThread::vm_result_2_offset()));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1811 movptr(Address(java_thread, JavaThread::vm_result_2_offset()), NULL_WORD);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1812 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1813
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1814 void MacroAssembler::check_and_handle_earlyret(Register java_thread) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1815 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1816
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1817 void MacroAssembler::check_and_handle_popframe(Register java_thread) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1818 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1819
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1820 void MacroAssembler::cmp32(AddressLiteral src1, int32_t imm) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1821 if (reachable(src1)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1822 cmpl(as_Address(src1), imm);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1823 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1824 lea(rscratch1, src1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1825 cmpl(Address(rscratch1, 0), imm);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1826 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1827 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1828
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1829 void MacroAssembler::cmp32(Register src1, AddressLiteral src2) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1830 assert(!src2.is_lval(), "use cmpptr");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1831 if (reachable(src2)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1832 cmpl(src1, as_Address(src2));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1833 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1834 lea(rscratch1, src2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1835 cmpl(src1, Address(rscratch1, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1836 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1837 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1838
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1839 void MacroAssembler::cmp32(Register src1, int32_t imm) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1840 Assembler::cmpl(src1, imm);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1841 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1842
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1843 void MacroAssembler::cmp32(Register src1, Address src2) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1844 Assembler::cmpl(src1, src2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1845 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1846
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1847 void MacroAssembler::cmpsd2int(XMMRegister opr1, XMMRegister opr2, Register dst, bool unordered_is_less) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1848 ucomisd(opr1, opr2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1849
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1850 Label L;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1851 if (unordered_is_less) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1852 movl(dst, -1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1853 jcc(Assembler::parity, L);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1854 jcc(Assembler::below , L);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1855 movl(dst, 0);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1856 jcc(Assembler::equal , L);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1857 increment(dst);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1858 } else { // unordered is greater
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1859 movl(dst, 1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1860 jcc(Assembler::parity, L);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1861 jcc(Assembler::above , L);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1862 movl(dst, 0);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1863 jcc(Assembler::equal , L);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1864 decrementl(dst);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1865 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1866 bind(L);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1867 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1868
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1869 void MacroAssembler::cmpss2int(XMMRegister opr1, XMMRegister opr2, Register dst, bool unordered_is_less) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1870 ucomiss(opr1, opr2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1871
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1872 Label L;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1873 if (unordered_is_less) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1874 movl(dst, -1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1875 jcc(Assembler::parity, L);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1876 jcc(Assembler::below , L);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1877 movl(dst, 0);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1878 jcc(Assembler::equal , L);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1879 increment(dst);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1880 } else { // unordered is greater
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1881 movl(dst, 1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1882 jcc(Assembler::parity, L);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1883 jcc(Assembler::above , L);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1884 movl(dst, 0);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1885 jcc(Assembler::equal , L);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1886 decrementl(dst);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1887 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1888 bind(L);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1889 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1890
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1891
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1892 void MacroAssembler::cmp8(AddressLiteral src1, int imm) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1893 if (reachable(src1)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1894 cmpb(as_Address(src1), imm);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1895 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1896 lea(rscratch1, src1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1897 cmpb(Address(rscratch1, 0), imm);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1898 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1899 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1900
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1901 void MacroAssembler::cmpptr(Register src1, AddressLiteral src2) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1902 #ifdef _LP64
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1903 if (src2.is_lval()) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1904 movptr(rscratch1, src2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1905 Assembler::cmpq(src1, rscratch1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1906 } else if (reachable(src2)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1907 cmpq(src1, as_Address(src2));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1908 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1909 lea(rscratch1, src2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1910 Assembler::cmpq(src1, Address(rscratch1, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1911 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1912 #else
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1913 if (src2.is_lval()) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1914 cmp_literal32(src1, (int32_t) src2.target(), src2.rspec());
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1915 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1916 cmpl(src1, as_Address(src2));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1917 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1918 #endif // _LP64
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1919 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1920
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1921 void MacroAssembler::cmpptr(Address src1, AddressLiteral src2) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1922 assert(src2.is_lval(), "not a mem-mem compare");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1923 #ifdef _LP64
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1924 // moves src2's literal address
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1925 movptr(rscratch1, src2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1926 Assembler::cmpq(src1, rscratch1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1927 #else
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1928 cmp_literal32(src1, (int32_t) src2.target(), src2.rspec());
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1929 #endif // _LP64
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1930 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1931
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1932 void MacroAssembler::locked_cmpxchgptr(Register reg, AddressLiteral adr) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1933 if (reachable(adr)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1934 if (os::is_MP())
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1935 lock();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1936 cmpxchgptr(reg, as_Address(adr));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1937 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1938 lea(rscratch1, adr);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1939 if (os::is_MP())
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1940 lock();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1941 cmpxchgptr(reg, Address(rscratch1, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1942 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1943 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1944
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1945 void MacroAssembler::cmpxchgptr(Register reg, Address adr) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1946 LP64_ONLY(cmpxchgq(reg, adr)) NOT_LP64(cmpxchgl(reg, adr));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1947 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1948
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1949 void MacroAssembler::comisd(XMMRegister dst, AddressLiteral src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1950 if (reachable(src)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1951 Assembler::comisd(dst, as_Address(src));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1952 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1953 lea(rscratch1, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1954 Assembler::comisd(dst, Address(rscratch1, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1955 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1956 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1957
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1958 void MacroAssembler::comiss(XMMRegister dst, AddressLiteral src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1959 if (reachable(src)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1960 Assembler::comiss(dst, as_Address(src));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1961 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1962 lea(rscratch1, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1963 Assembler::comiss(dst, Address(rscratch1, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1964 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1965 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1966
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1967
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1968 void MacroAssembler::cond_inc32(Condition cond, AddressLiteral counter_addr) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1969 Condition negated_cond = negate_condition(cond);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1970 Label L;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1971 jcc(negated_cond, L);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1972 atomic_incl(counter_addr);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1973 bind(L);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1974 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1975
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1976 int MacroAssembler::corrected_idivl(Register reg) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1977 // Full implementation of Java idiv and irem; checks for
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1978 // special case as described in JVM spec., p.243 & p.271.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1979 // The function returns the (pc) offset of the idivl
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1980 // instruction - may be needed for implicit exceptions.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1981 //
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1982 // normal case special case
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1983 //
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1984 // input : rax,: dividend min_int
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1985 // reg: divisor (may not be rax,/rdx) -1
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1986 //
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1987 // output: rax,: quotient (= rax, idiv reg) min_int
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1988 // rdx: remainder (= rax, irem reg) 0
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1989 assert(reg != rax && reg != rdx, "reg cannot be rax, or rdx register");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1990 const int min_int = 0x80000000;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1991 Label normal_case, special_case;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1992
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1993 // check for special case
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1994 cmpl(rax, min_int);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1995 jcc(Assembler::notEqual, normal_case);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1996 xorl(rdx, rdx); // prepare rdx for possible special case (where remainder = 0)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1997 cmpl(reg, -1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1998 jcc(Assembler::equal, special_case);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
1999
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2000 // handle normal case
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2001 bind(normal_case);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2002 cdql();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2003 int idivl_offset = offset();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2004 idivl(reg);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2005
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2006 // normal and special case exit
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2007 bind(special_case);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2008
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2009 return idivl_offset;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2010 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2011
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2012
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2013
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2014 void MacroAssembler::decrementl(Register reg, int value) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2015 if (value == min_jint) {subl(reg, value) ; return; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2016 if (value < 0) { incrementl(reg, -value); return; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2017 if (value == 0) { ; return; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2018 if (value == 1 && UseIncDec) { decl(reg) ; return; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2019 /* else */ { subl(reg, value) ; return; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2020 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2021
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2022 void MacroAssembler::decrementl(Address dst, int value) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2023 if (value == min_jint) {subl(dst, value) ; return; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2024 if (value < 0) { incrementl(dst, -value); return; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2025 if (value == 0) { ; return; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2026 if (value == 1 && UseIncDec) { decl(dst) ; return; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2027 /* else */ { subl(dst, value) ; return; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2028 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2029
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2030 void MacroAssembler::division_with_shift (Register reg, int shift_value) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2031 assert (shift_value > 0, "illegal shift value");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2032 Label _is_positive;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2033 testl (reg, reg);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2034 jcc (Assembler::positive, _is_positive);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2035 int offset = (1 << shift_value) - 1 ;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2036
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2037 if (offset == 1) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2038 incrementl(reg);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2039 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2040 addl(reg, offset);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2041 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2042
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2043 bind (_is_positive);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2044 sarl(reg, shift_value);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2045 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2046
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2047 void MacroAssembler::divsd(XMMRegister dst, AddressLiteral src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2048 if (reachable(src)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2049 Assembler::divsd(dst, as_Address(src));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2050 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2051 lea(rscratch1, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2052 Assembler::divsd(dst, Address(rscratch1, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2053 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2054 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2055
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2056 void MacroAssembler::divss(XMMRegister dst, AddressLiteral src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2057 if (reachable(src)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2058 Assembler::divss(dst, as_Address(src));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2059 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2060 lea(rscratch1, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2061 Assembler::divss(dst, Address(rscratch1, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2062 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2063 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2064
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2065 // !defined(COMPILER2) is because of stupid core builds
8265
ded5288f5b96 fix windows build of the server and client vms
Andreas Woess <andreas.woess@jku.at>
parents: 8042
diff changeset
2066 #if !defined(_LP64) || defined(COMPILER1) || !defined(COMPILER2) || defined(GRAAL)
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2067 void MacroAssembler::empty_FPU_stack() {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2068 if (VM_Version::supports_mmx()) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2069 emms();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2070 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2071 for (int i = 8; i-- > 0; ) ffree(i);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2072 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2073 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2074 #endif // !LP64 || C1 || !C2
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2075
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2076
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2077 // Defines obj, preserves var_size_in_bytes
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2078 void MacroAssembler::eden_allocate(Register obj,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2079 Register var_size_in_bytes,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2080 int con_size_in_bytes,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2081 Register t1,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2082 Label& slow_case) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2083 assert(obj == rax, "obj must be in rax, for cmpxchg");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2084 assert_different_registers(obj, var_size_in_bytes, t1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2085 if (CMSIncrementalMode || !Universe::heap()->supports_inline_contig_alloc()) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2086 jmp(slow_case);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2087 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2088 Register end = t1;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2089 Label retry;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2090 bind(retry);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2091 ExternalAddress heap_top((address) Universe::heap()->top_addr());
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2092 movptr(obj, heap_top);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2093 if (var_size_in_bytes == noreg) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2094 lea(end, Address(obj, con_size_in_bytes));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2095 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2096 lea(end, Address(obj, var_size_in_bytes, Address::times_1));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2097 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2098 // if end < obj then we wrapped around => object too long => slow case
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2099 cmpptr(end, obj);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2100 jcc(Assembler::below, slow_case);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2101 cmpptr(end, ExternalAddress((address) Universe::heap()->end_addr()));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2102 jcc(Assembler::above, slow_case);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2103 // Compare obj with the top addr, and if still equal, store the new top addr in
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2104 // end at the address of the top addr pointer. Sets ZF if was equal, and clears
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2105 // it otherwise. Use lock prefix for atomicity on MPs.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2106 locked_cmpxchgptr(end, heap_top);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2107 jcc(Assembler::notEqual, retry);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2108 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2109 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2110
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2111 void MacroAssembler::enter() {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2112 push(rbp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2113 mov(rbp, rsp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2114 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2115
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2116 // 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
2117 void MacroAssembler::fat_nop() {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2118 if (UseAddressNop) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2119 addr_nop_5();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2120 } else {
7430
d02120b7a34f 8004250: replace AbstractAssembler a_byte/a_long with emit_int8/emit_int32
twisti
parents: 7427
diff changeset
2121 emit_int8(0x26); // es:
d02120b7a34f 8004250: replace AbstractAssembler a_byte/a_long with emit_int8/emit_int32
twisti
parents: 7427
diff changeset
2122 emit_int8(0x2e); // cs:
d02120b7a34f 8004250: replace AbstractAssembler a_byte/a_long with emit_int8/emit_int32
twisti
parents: 7427
diff changeset
2123 emit_int8(0x64); // fs:
d02120b7a34f 8004250: replace AbstractAssembler a_byte/a_long with emit_int8/emit_int32
twisti
parents: 7427
diff changeset
2124 emit_int8(0x65); // gs:
d02120b7a34f 8004250: replace AbstractAssembler a_byte/a_long with emit_int8/emit_int32
twisti
parents: 7427
diff changeset
2125 emit_int8((unsigned char)0x90);
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2126 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2127 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2128
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2129 void MacroAssembler::fcmp(Register tmp) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2130 fcmp(tmp, 1, true, true);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2131 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2132
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2133 void MacroAssembler::fcmp(Register tmp, int index, bool pop_left, bool pop_right) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2134 assert(!pop_right || pop_left, "usage error");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2135 if (VM_Version::supports_cmov()) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2136 assert(tmp == noreg, "unneeded temp");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2137 if (pop_left) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2138 fucomip(index);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2139 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2140 fucomi(index);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2141 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2142 if (pop_right) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2143 fpop();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2144 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2145 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2146 assert(tmp != noreg, "need temp");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2147 if (pop_left) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2148 if (pop_right) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2149 fcompp();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2150 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2151 fcomp(index);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2152 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2153 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2154 fcom(index);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2155 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2156 // convert FPU condition into eflags condition via rax,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2157 save_rax(tmp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2158 fwait(); fnstsw_ax();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2159 sahf();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2160 restore_rax(tmp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2161 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2162 // condition codes set as follows:
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2163 //
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2164 // CF (corresponds to C0) if x < y
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2165 // PF (corresponds to C2) if unordered
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2166 // ZF (corresponds to C3) if x = y
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2167 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2168
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2169 void MacroAssembler::fcmp2int(Register dst, bool unordered_is_less) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2170 fcmp2int(dst, unordered_is_less, 1, true, true);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2171 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2172
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2173 void MacroAssembler::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
2174 fcmp(VM_Version::supports_cmov() ? noreg : dst, index, pop_left, pop_right);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2175 Label L;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2176 if (unordered_is_less) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2177 movl(dst, -1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2178 jcc(Assembler::parity, L);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2179 jcc(Assembler::below , L);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2180 movl(dst, 0);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2181 jcc(Assembler::equal , L);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2182 increment(dst);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2183 } else { // unordered is greater
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2184 movl(dst, 1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2185 jcc(Assembler::parity, L);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2186 jcc(Assembler::above , L);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2187 movl(dst, 0);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2188 jcc(Assembler::equal , L);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2189 decrementl(dst);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2190 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2191 bind(L);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2192 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2193
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2194 void MacroAssembler::fld_d(AddressLiteral src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2195 fld_d(as_Address(src));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2196 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2197
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2198 void MacroAssembler::fld_s(AddressLiteral src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2199 fld_s(as_Address(src));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2200 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2201
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2202 void MacroAssembler::fld_x(AddressLiteral src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2203 Assembler::fld_x(as_Address(src));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2204 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2205
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2206 void MacroAssembler::fldcw(AddressLiteral src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2207 Assembler::fldcw(as_Address(src));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2208 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2209
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2210 void MacroAssembler::pow_exp_core_encoding() {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2211 // kills rax, rcx, rdx
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2212 subptr(rsp,sizeof(jdouble));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2213 // computes 2^X. Stack: X ...
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2214 // f2xm1 computes 2^X-1 but only operates on -1<=X<=1. Get int(X) and
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2215 // keep it on the thread's stack to compute 2^int(X) later
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2216 // then compute 2^(X-int(X)) as (2^(X-int(X)-1+1)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2217 // final result is obtained with: 2^X = 2^int(X) * 2^(X-int(X))
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2218 fld_s(0); // Stack: X X ...
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2219 frndint(); // Stack: int(X) X ...
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2220 fsuba(1); // Stack: int(X) X-int(X) ...
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2221 fistp_s(Address(rsp,0)); // move int(X) as integer to thread's stack. Stack: X-int(X) ...
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2222 f2xm1(); // Stack: 2^(X-int(X))-1 ...
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2223 fld1(); // Stack: 1 2^(X-int(X))-1 ...
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2224 faddp(1); // Stack: 2^(X-int(X))
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2225 // computes 2^(int(X)): add exponent bias (1023) to int(X), then
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2226 // shift int(X)+1023 to exponent position.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2227 // Exponent is limited to 11 bits if int(X)+1023 does not fit in 11
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2228 // bits, set result to NaN. 0x000 and 0x7FF are reserved exponent
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2229 // values so detect them and set result to NaN.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2230 movl(rax,Address(rsp,0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2231 movl(rcx, -2048); // 11 bit mask and valid NaN binary encoding
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2232 addl(rax, 1023);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2233 movl(rdx,rax);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2234 shll(rax,20);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2235 // Check that 0 < int(X)+1023 < 2047. Otherwise set rax to NaN.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2236 addl(rdx,1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2237 // Check that 1 < int(X)+1023+1 < 2048
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2238 // in 3 steps:
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2239 // 1- (int(X)+1023+1)&-2048 == 0 => 0 <= int(X)+1023+1 < 2048
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2240 // 2- (int(X)+1023+1)&-2048 != 0
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2241 // 3- (int(X)+1023+1)&-2048 != 1
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2242 // Do 2- first because addl just updated the flags.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2243 cmov32(Assembler::equal,rax,rcx);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2244 cmpl(rdx,1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2245 cmov32(Assembler::equal,rax,rcx);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2246 testl(rdx,rcx);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2247 cmov32(Assembler::notEqual,rax,rcx);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2248 movl(Address(rsp,4),rax);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2249 movl(Address(rsp,0),0);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2250 fmul_d(Address(rsp,0)); // Stack: 2^X ...
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2251 addptr(rsp,sizeof(jdouble));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2252 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2253
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2254 void MacroAssembler::increase_precision() {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2255 subptr(rsp, BytesPerWord);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2256 fnstcw(Address(rsp, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2257 movl(rax, Address(rsp, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2258 orl(rax, 0x300);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2259 push(rax);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2260 fldcw(Address(rsp, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2261 pop(rax);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2262 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2263
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2264 void MacroAssembler::restore_precision() {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2265 fldcw(Address(rsp, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2266 addptr(rsp, BytesPerWord);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2267 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2268
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2269 void MacroAssembler::fast_pow() {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2270 // computes X^Y = 2^(Y * log2(X))
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2271 // if fast computation is not possible, result is NaN. Requires
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2272 // fallback from user of this macro.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2273 // increase precision for intermediate steps of the computation
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2274 increase_precision();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2275 fyl2x(); // Stack: (Y*log2(X)) ...
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2276 pow_exp_core_encoding(); // Stack: exp(X) ...
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2277 restore_precision();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2278 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2279
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2280 void MacroAssembler::fast_exp() {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2281 // computes exp(X) = 2^(X * log2(e))
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2282 // if fast computation is not possible, result is NaN. Requires
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2283 // fallback from user of this macro.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2284 // increase precision for intermediate steps of the computation
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2285 increase_precision();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2286 fldl2e(); // Stack: log2(e) X ...
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2287 fmulp(1); // Stack: (X*log2(e)) ...
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2288 pow_exp_core_encoding(); // Stack: exp(X) ...
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2289 restore_precision();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2290 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2291
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2292 void MacroAssembler::pow_or_exp(bool is_exp, int num_fpu_regs_in_use) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2293 // kills rax, rcx, rdx
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2294 // pow and exp needs 2 extra registers on the fpu stack.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2295 Label slow_case, done;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2296 Register tmp = noreg;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2297 if (!VM_Version::supports_cmov()) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2298 // fcmp needs a temporary so preserve rdx,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2299 tmp = rdx;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2300 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2301 Register tmp2 = rax;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2302 Register tmp3 = rcx;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2303
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2304 if (is_exp) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2305 // Stack: X
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2306 fld_s(0); // duplicate argument for runtime call. Stack: X X
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2307 fast_exp(); // Stack: exp(X) X
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2308 fcmp(tmp, 0, false, false); // Stack: exp(X) X
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2309 // exp(X) not equal to itself: exp(X) is NaN go to slow case.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2310 jcc(Assembler::parity, slow_case);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2311 // get rid of duplicate argument. Stack: exp(X)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2312 if (num_fpu_regs_in_use > 0) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2313 fxch();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2314 fpop();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2315 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2316 ffree(1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2317 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2318 jmp(done);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2319 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2320 // Stack: X Y
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2321 Label x_negative, y_odd;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2322
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2323 fldz(); // Stack: 0 X Y
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2324 fcmp(tmp, 1, true, false); // Stack: X Y
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2325 jcc(Assembler::above, x_negative);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2326
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2327 // X >= 0
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2328
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2329 fld_s(1); // duplicate arguments for runtime call. Stack: Y X Y
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2330 fld_s(1); // Stack: X Y X Y
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2331 fast_pow(); // Stack: X^Y X Y
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2332 fcmp(tmp, 0, false, false); // Stack: X^Y X Y
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2333 // X^Y not equal to itself: X^Y is NaN go to slow case.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2334 jcc(Assembler::parity, slow_case);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2335 // get rid of duplicate arguments. Stack: X^Y
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2336 if (num_fpu_regs_in_use > 0) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2337 fxch(); fpop();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2338 fxch(); fpop();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2339 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2340 ffree(2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2341 ffree(1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2342 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2343 jmp(done);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2344
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2345 // X <= 0
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2346 bind(x_negative);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2347
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2348 fld_s(1); // Stack: Y X Y
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2349 frndint(); // Stack: int(Y) X Y
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2350 fcmp(tmp, 2, false, false); // Stack: int(Y) X Y
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2351 jcc(Assembler::notEqual, slow_case);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2352
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2353 subptr(rsp, 8);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2354
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2355 // For X^Y, when X < 0, Y has to be an integer and the final
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2356 // result depends on whether it's odd or even. We just checked
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2357 // that int(Y) == Y. We move int(Y) to gp registers as a 64 bit
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2358 // integer to test its parity. If int(Y) is huge and doesn't fit
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2359 // in the 64 bit integer range, the integer indefinite value will
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2360 // end up in the gp registers. Huge numbers are all even, the
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2361 // integer indefinite number is even so it's fine.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2362
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2363 #ifdef ASSERT
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2364 // Let's check we don't end up with an integer indefinite number
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2365 // when not expected. First test for huge numbers: check whether
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2366 // int(Y)+1 == int(Y) which is true for very large numbers and
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2367 // those are all even. A 64 bit integer is guaranteed to not
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2368 // overflow for numbers where y+1 != y (when precision is set to
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2369 // double precision).
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2370 Label y_not_huge;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2371
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2372 fld1(); // Stack: 1 int(Y) X Y
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2373 fadd(1); // Stack: 1+int(Y) int(Y) X Y
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2374
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2375 #ifdef _LP64
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2376 // trip to memory to force the precision down from double extended
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2377 // precision
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2378 fstp_d(Address(rsp, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2379 fld_d(Address(rsp, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2380 #endif
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2381
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2382 fcmp(tmp, 1, true, false); // Stack: int(Y) X Y
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2383 #endif
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2384
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2385 // move int(Y) as 64 bit integer to thread's stack
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2386 fistp_d(Address(rsp,0)); // Stack: X Y
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2387
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2388 #ifdef ASSERT
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2389 jcc(Assembler::notEqual, y_not_huge);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2390
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2391 // Y is huge so we know it's even. It may not fit in a 64 bit
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2392 // integer and we don't want the debug code below to see the
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2393 // integer indefinite value so overwrite int(Y) on the thread's
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2394 // stack with 0.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2395 movl(Address(rsp, 0), 0);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2396 movl(Address(rsp, 4), 0);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2397
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2398 bind(y_not_huge);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2399 #endif
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2400
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2401 fld_s(1); // duplicate arguments for runtime call. Stack: Y X Y
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2402 fld_s(1); // Stack: X Y X Y
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2403 fabs(); // Stack: abs(X) Y X Y
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2404 fast_pow(); // Stack: abs(X)^Y X Y
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2405 fcmp(tmp, 0, false, false); // Stack: abs(X)^Y X Y
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2406 // abs(X)^Y not equal to itself: abs(X)^Y is NaN go to slow case.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2407
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2408 pop(tmp2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2409 NOT_LP64(pop(tmp3));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2410 jcc(Assembler::parity, slow_case);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2411
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2412 #ifdef ASSERT
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2413 // Check that int(Y) is not integer indefinite value (int
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2414 // overflow). Shouldn't happen because for values that would
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2415 // overflow, 1+int(Y)==Y which was tested earlier.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2416 #ifndef _LP64
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2417 {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2418 Label integer;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2419 testl(tmp2, tmp2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2420 jcc(Assembler::notZero, integer);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2421 cmpl(tmp3, 0x80000000);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2422 jcc(Assembler::notZero, integer);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2423 STOP("integer indefinite value shouldn't be seen here");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2424 bind(integer);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2425 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2426 #else
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2427 {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2428 Label integer;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2429 mov(tmp3, tmp2); // preserve tmp2 for parity check below
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2430 shlq(tmp3, 1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2431 jcc(Assembler::carryClear, integer);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2432 jcc(Assembler::notZero, integer);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2433 STOP("integer indefinite value shouldn't be seen here");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2434 bind(integer);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2435 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2436 #endif
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2437 #endif
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2438
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2439 // get rid of duplicate arguments. Stack: X^Y
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2440 if (num_fpu_regs_in_use > 0) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2441 fxch(); fpop();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2442 fxch(); fpop();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2443 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2444 ffree(2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2445 ffree(1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2446 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2447
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2448 testl(tmp2, 1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2449 jcc(Assembler::zero, done); // X <= 0, Y even: X^Y = abs(X)^Y
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2450 // X <= 0, Y even: X^Y = -abs(X)^Y
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2451
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2452 fchs(); // Stack: -abs(X)^Y Y
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2453 jmp(done);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2454 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2455
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2456 // slow case: runtime call
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2457 bind(slow_case);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2458
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2459 fpop(); // pop incorrect result or int(Y)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2460
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2461 fp_runtime_fallback(is_exp ? CAST_FROM_FN_PTR(address, SharedRuntime::dexp) : CAST_FROM_FN_PTR(address, SharedRuntime::dpow),
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2462 is_exp ? 1 : 2, num_fpu_regs_in_use);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2463
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2464 // Come here with result in F-TOS
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2465 bind(done);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2466 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2467
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2468 void MacroAssembler::fpop() {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2469 ffree();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2470 fincstp();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2471 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2472
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2473 void MacroAssembler::fremr(Register tmp) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2474 save_rax(tmp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2475 { Label L;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2476 bind(L);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2477 fprem();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2478 fwait(); fnstsw_ax();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2479 #ifdef _LP64
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2480 testl(rax, 0x400);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2481 jcc(Assembler::notEqual, L);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2482 #else
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2483 sahf();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2484 jcc(Assembler::parity, L);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2485 #endif // _LP64
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2486 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2487 restore_rax(tmp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2488 // Result is in ST0.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2489 // Note: fxch & fpop to get rid of ST1
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2490 // (otherwise FPU stack could overflow eventually)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2491 fxch(1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2492 fpop();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2493 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2494
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2495
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2496 void MacroAssembler::incrementl(AddressLiteral dst) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2497 if (reachable(dst)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2498 incrementl(as_Address(dst));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2499 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2500 lea(rscratch1, dst);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2501 incrementl(Address(rscratch1, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2502 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2503 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2504
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2505 void MacroAssembler::incrementl(ArrayAddress dst) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2506 incrementl(as_Address(dst));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2507 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2508
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2509 void MacroAssembler::incrementl(Register reg, int value) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2510 if (value == min_jint) {addl(reg, value) ; return; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2511 if (value < 0) { decrementl(reg, -value); return; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2512 if (value == 0) { ; return; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2513 if (value == 1 && UseIncDec) { incl(reg) ; return; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2514 /* else */ { addl(reg, value) ; return; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2515 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2516
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2517 void MacroAssembler::incrementl(Address dst, int value) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2518 if (value == min_jint) {addl(dst, value) ; return; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2519 if (value < 0) { decrementl(dst, -value); return; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2520 if (value == 0) { ; return; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2521 if (value == 1 && UseIncDec) { incl(dst) ; return; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2522 /* else */ { addl(dst, value) ; return; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2523 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2524
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2525 void MacroAssembler::jump(AddressLiteral dst) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2526 if (reachable(dst)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2527 jmp_literal(dst.target(), dst.rspec());
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2528 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2529 lea(rscratch1, dst);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2530 jmp(rscratch1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2531 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2532 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2533
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2534 void MacroAssembler::jump_cc(Condition cc, AddressLiteral dst) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2535 if (reachable(dst)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2536 InstructionMark im(this);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2537 relocate(dst.reloc());
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2538 const int short_size = 2;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2539 const int long_size = 6;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2540 int offs = (intptr_t)dst.target() - ((intptr_t)pc());
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2541 if (dst.reloc() == relocInfo::none && is8bit(offs - short_size)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2542 // 0111 tttn #8-bit disp
7430
d02120b7a34f 8004250: replace AbstractAssembler a_byte/a_long with emit_int8/emit_int32
twisti
parents: 7427
diff changeset
2543 emit_int8(0x70 | cc);
d02120b7a34f 8004250: replace AbstractAssembler a_byte/a_long with emit_int8/emit_int32
twisti
parents: 7427
diff changeset
2544 emit_int8((offs - short_size) & 0xFF);
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2545 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2546 // 0000 1111 1000 tttn #32-bit disp
7430
d02120b7a34f 8004250: replace AbstractAssembler a_byte/a_long with emit_int8/emit_int32
twisti
parents: 7427
diff changeset
2547 emit_int8(0x0F);
d02120b7a34f 8004250: replace AbstractAssembler a_byte/a_long with emit_int8/emit_int32
twisti
parents: 7427
diff changeset
2548 emit_int8((unsigned char)(0x80 | cc));
7476
ffa87474d7a4 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 7475
diff changeset
2549 emit_int32(offs - long_size);
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2550 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2551 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2552 #ifdef ASSERT
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2553 warning("reversing conditional branch");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2554 #endif /* ASSERT */
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2555 Label skip;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2556 jccb(reverse[cc], skip);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2557 lea(rscratch1, dst);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2558 Assembler::jmp(rscratch1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2559 bind(skip);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2560 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2561 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2562
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2563 void MacroAssembler::ldmxcsr(AddressLiteral src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2564 if (reachable(src)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2565 Assembler::ldmxcsr(as_Address(src));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2566 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2567 lea(rscratch1, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2568 Assembler::ldmxcsr(Address(rscratch1, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2569 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2570 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2571
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2572 int MacroAssembler::load_signed_byte(Register dst, Address src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2573 int off;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2574 if (LP64_ONLY(true ||) VM_Version::is_P6()) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2575 off = offset();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2576 movsbl(dst, src); // movsxb
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2577 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2578 off = load_unsigned_byte(dst, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2579 shll(dst, 24);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2580 sarl(dst, 24);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2581 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2582 return off;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2583 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2584
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2585 // Note: load_signed_short used to be called load_signed_word.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2586 // Although the 'w' in x86 opcodes refers to the term "word" in the assembler
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2587 // manual, which means 16 bits, that usage is found nowhere in HotSpot code.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2588 // The term "word" in HotSpot means a 32- or 64-bit machine word.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2589 int MacroAssembler::load_signed_short(Register dst, Address src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2590 int off;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2591 if (LP64_ONLY(true ||) VM_Version::is_P6()) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2592 // This is dubious to me since it seems safe to do a signed 16 => 64 bit
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2593 // version but this is what 64bit has always done. This seems to imply
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2594 // that users are only using 32bits worth.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2595 off = offset();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2596 movswl(dst, src); // movsxw
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2597 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2598 off = load_unsigned_short(dst, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2599 shll(dst, 16);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2600 sarl(dst, 16);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2601 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2602 return off;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2603 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2604
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2605 int MacroAssembler::load_unsigned_byte(Register dst, Address src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2606 // According to Intel Doc. AP-526, "Zero-Extension of Short", p.16,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2607 // and "3.9 Partial Register Penalties", p. 22).
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2608 int off;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2609 if (LP64_ONLY(true || ) VM_Version::is_P6() || src.uses(dst)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2610 off = offset();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2611 movzbl(dst, src); // movzxb
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2612 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2613 xorl(dst, dst);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2614 off = offset();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2615 movb(dst, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2616 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2617 return off;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2618 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2619
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2620 // Note: load_unsigned_short used to be called load_unsigned_word.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2621 int MacroAssembler::load_unsigned_short(Register dst, Address src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2622 // According to Intel Doc. AP-526, "Zero-Extension of Short", p.16,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2623 // and "3.9 Partial Register Penalties", p. 22).
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2624 int off;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2625 if (LP64_ONLY(true ||) VM_Version::is_P6() || src.uses(dst)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2626 off = offset();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2627 movzwl(dst, src); // movzxw
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2628 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2629 xorl(dst, dst);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2630 off = offset();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2631 movw(dst, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2632 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2633 return off;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2634 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2635
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2636 void MacroAssembler::load_sized_value(Register dst, Address src, size_t size_in_bytes, bool is_signed, Register dst2) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2637 switch (size_in_bytes) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2638 #ifndef _LP64
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2639 case 8:
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2640 assert(dst2 != noreg, "second dest register required");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2641 movl(dst, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2642 movl(dst2, src.plus_disp(BytesPerInt));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2643 break;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2644 #else
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2645 case 8: movq(dst, src); break;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2646 #endif
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2647 case 4: movl(dst, src); break;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2648 case 2: is_signed ? load_signed_short(dst, src) : load_unsigned_short(dst, src); break;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2649 case 1: is_signed ? load_signed_byte( dst, src) : load_unsigned_byte( dst, src); break;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2650 default: ShouldNotReachHere();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2651 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2652 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2653
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2654 void MacroAssembler::store_sized_value(Address dst, Register src, size_t size_in_bytes, Register src2) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2655 switch (size_in_bytes) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2656 #ifndef _LP64
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2657 case 8:
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2658 assert(src2 != noreg, "second source register required");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2659 movl(dst, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2660 movl(dst.plus_disp(BytesPerInt), src2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2661 break;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2662 #else
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2663 case 8: movq(dst, src); break;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2664 #endif
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2665 case 4: movl(dst, src); break;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2666 case 2: movw(dst, src); break;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2667 case 1: movb(dst, src); break;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2668 default: ShouldNotReachHere();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2669 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2670 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2671
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2672 void MacroAssembler::mov32(AddressLiteral dst, Register src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2673 if (reachable(dst)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2674 movl(as_Address(dst), src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2675 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2676 lea(rscratch1, dst);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2677 movl(Address(rscratch1, 0), src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2678 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2679 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2680
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2681 void MacroAssembler::mov32(Register dst, AddressLiteral src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2682 if (reachable(src)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2683 movl(dst, as_Address(src));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2684 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2685 lea(rscratch1, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2686 movl(dst, Address(rscratch1, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2687 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2688 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2689
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2690 // C++ bool manipulation
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2691
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2692 void MacroAssembler::movbool(Register dst, Address src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2693 if(sizeof(bool) == 1)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2694 movb(dst, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2695 else if(sizeof(bool) == 2)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2696 movw(dst, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2697 else if(sizeof(bool) == 4)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2698 movl(dst, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2699 else
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2700 // unsupported
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2701 ShouldNotReachHere();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2702 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2703
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2704 void MacroAssembler::movbool(Address dst, bool boolconst) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2705 if(sizeof(bool) == 1)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2706 movb(dst, (int) boolconst);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2707 else if(sizeof(bool) == 2)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2708 movw(dst, (int) boolconst);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2709 else if(sizeof(bool) == 4)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2710 movl(dst, (int) boolconst);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2711 else
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2712 // unsupported
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2713 ShouldNotReachHere();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2714 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2715
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2716 void MacroAssembler::movbool(Address dst, Register src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2717 if(sizeof(bool) == 1)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2718 movb(dst, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2719 else if(sizeof(bool) == 2)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2720 movw(dst, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2721 else if(sizeof(bool) == 4)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2722 movl(dst, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2723 else
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2724 // unsupported
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2725 ShouldNotReachHere();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2726 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2727
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2728 void MacroAssembler::movbyte(ArrayAddress dst, int src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2729 movb(as_Address(dst), src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2730 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2731
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2732 void MacroAssembler::movdl(XMMRegister dst, AddressLiteral src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2733 if (reachable(src)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2734 movdl(dst, as_Address(src));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2735 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2736 lea(rscratch1, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2737 movdl(dst, Address(rscratch1, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2738 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2739 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2740
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2741 void MacroAssembler::movq(XMMRegister dst, AddressLiteral src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2742 if (reachable(src)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2743 movq(dst, as_Address(src));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2744 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2745 lea(rscratch1, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2746 movq(dst, Address(rscratch1, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2747 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2748 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2749
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2750 void MacroAssembler::movdbl(XMMRegister dst, AddressLiteral src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2751 if (reachable(src)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2752 if (UseXmmLoadAndClearUpper) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2753 movsd (dst, as_Address(src));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2754 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2755 movlpd(dst, as_Address(src));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2756 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2757 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2758 lea(rscratch1, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2759 if (UseXmmLoadAndClearUpper) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2760 movsd (dst, Address(rscratch1, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2761 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2762 movlpd(dst, Address(rscratch1, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2763 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2764 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2765 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2766
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2767 void MacroAssembler::movflt(XMMRegister dst, AddressLiteral src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2768 if (reachable(src)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2769 movss(dst, as_Address(src));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2770 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2771 lea(rscratch1, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2772 movss(dst, Address(rscratch1, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2773 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2774 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2775
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2776 void MacroAssembler::movptr(Register dst, Register src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2777 LP64_ONLY(movq(dst, src)) NOT_LP64(movl(dst, src));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2778 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2779
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2780 void MacroAssembler::movptr(Register dst, Address src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2781 LP64_ONLY(movq(dst, src)) NOT_LP64(movl(dst, src));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2782 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2783
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2784 // src should NEVER be a real pointer. Use AddressLiteral for true pointers
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2785 void MacroAssembler::movptr(Register dst, intptr_t src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2786 LP64_ONLY(mov64(dst, src)) NOT_LP64(movl(dst, src));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2787 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2788
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2789 void MacroAssembler::movptr(Address dst, Register src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2790 LP64_ONLY(movq(dst, src)) NOT_LP64(movl(dst, src));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2791 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2792
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2793 void MacroAssembler::movdqu(XMMRegister dst, AddressLiteral src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2794 if (reachable(src)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2795 Assembler::movdqu(dst, as_Address(src));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2796 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2797 lea(rscratch1, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2798 Assembler::movdqu(dst, Address(rscratch1, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2799 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2800 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2801
11080
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
2802 void MacroAssembler::movdqa(XMMRegister dst, AddressLiteral src) {
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
2803 if (reachable(src)) {
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
2804 Assembler::movdqa(dst, as_Address(src));
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
2805 } else {
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
2806 lea(rscratch1, src);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
2807 Assembler::movdqa(dst, Address(rscratch1, 0));
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
2808 }
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
2809 }
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
2810
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2811 void MacroAssembler::movsd(XMMRegister dst, AddressLiteral src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2812 if (reachable(src)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2813 Assembler::movsd(dst, as_Address(src));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2814 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2815 lea(rscratch1, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2816 Assembler::movsd(dst, Address(rscratch1, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2817 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2818 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2819
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2820 void MacroAssembler::movss(XMMRegister dst, AddressLiteral src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2821 if (reachable(src)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2822 Assembler::movss(dst, as_Address(src));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2823 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2824 lea(rscratch1, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2825 Assembler::movss(dst, Address(rscratch1, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2826 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2827 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2828
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2829 void MacroAssembler::mulsd(XMMRegister dst, AddressLiteral src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2830 if (reachable(src)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2831 Assembler::mulsd(dst, as_Address(src));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2832 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2833 lea(rscratch1, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2834 Assembler::mulsd(dst, Address(rscratch1, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2835 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2836 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2837
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2838 void MacroAssembler::mulss(XMMRegister dst, AddressLiteral src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2839 if (reachable(src)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2840 Assembler::mulss(dst, as_Address(src));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2841 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2842 lea(rscratch1, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2843 Assembler::mulss(dst, Address(rscratch1, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2844 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2845 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2846
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2847 void MacroAssembler::null_check(Register reg, int offset) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2848 if (needs_explicit_null_check(offset)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2849 // provoke OS NULL exception if reg = NULL by
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2850 // accessing M[reg] w/o changing any (non-CC) registers
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2851 // NOTE: cmpl is plenty here to provoke a segv
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2852 cmpptr(rax, Address(reg, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2853 // Note: should probably use testl(rax, Address(reg, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2854 // may be shorter code (however, this version of
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2855 // testl needs to be implemented first)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2856 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2857 // nothing to do, (later) access of M[reg + offset]
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2858 // will provoke OS NULL exception if reg = NULL
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2859 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2860 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2861
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2862 void MacroAssembler::os_breakpoint() {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2863 // instead of directly emitting a breakpoint, call os:breakpoint for better debugability
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2864 // (e.g., MSVC can't call ps() otherwise)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2865 call(RuntimeAddress(CAST_FROM_FN_PTR(address, os::breakpoint)));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2866 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2867
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2868 void MacroAssembler::pop_CPU_state() {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2869 pop_FPU_state();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2870 pop_IU_state();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2871 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2872
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2873 void MacroAssembler::pop_FPU_state() {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2874 NOT_LP64(frstor(Address(rsp, 0));)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2875 LP64_ONLY(fxrstor(Address(rsp, 0));)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2876 addptr(rsp, FPUStateSizeInWords * wordSize);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2877 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2878
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2879 void MacroAssembler::pop_IU_state() {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2880 popa();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2881 LP64_ONLY(addq(rsp, 8));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2882 popf();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2883 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2884
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2885 // Save Integer and Float state
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2886 // Warning: Stack must be 16 byte aligned (64bit)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2887 void MacroAssembler::push_CPU_state() {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2888 push_IU_state();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2889 push_FPU_state();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2890 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2891
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2892 void MacroAssembler::push_FPU_state() {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2893 subptr(rsp, FPUStateSizeInWords * wordSize);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2894 #ifndef _LP64
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2895 fnsave(Address(rsp, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2896 fwait();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2897 #else
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2898 fxsave(Address(rsp, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2899 #endif // LP64
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2900 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2901
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2902 void MacroAssembler::push_IU_state() {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2903 // Push flags first because pusha kills them
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2904 pushf();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2905 // Make sure rsp stays 16-byte aligned
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2906 LP64_ONLY(subq(rsp, 8));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2907 pusha();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2908 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2909
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2910 void MacroAssembler::reset_last_Java_frame(Register java_thread, bool clear_fp, bool clear_pc) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2911 // determine java_thread register
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2912 if (!java_thread->is_valid()) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2913 java_thread = rdi;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2914 get_thread(java_thread);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2915 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2916 // we must set sp to zero to clear frame
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2917 movptr(Address(java_thread, JavaThread::last_Java_sp_offset()), NULL_WORD);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2918 if (clear_fp) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2919 movptr(Address(java_thread, JavaThread::last_Java_fp_offset()), NULL_WORD);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2920 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2921
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2922 if (clear_pc)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2923 movptr(Address(java_thread, JavaThread::last_Java_pc_offset()), NULL_WORD);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2924
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2925 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2926
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2927 void MacroAssembler::restore_rax(Register tmp) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2928 if (tmp == noreg) pop(rax);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2929 else if (tmp != rax) mov(rax, tmp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2930 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2931
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2932 void MacroAssembler::round_to(Register reg, int modulus) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2933 addptr(reg, modulus - 1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2934 andptr(reg, -modulus);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2935 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2936
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2937 void MacroAssembler::save_rax(Register tmp) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2938 if (tmp == noreg) push(rax);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2939 else if (tmp != rax) mov(tmp, rax);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2940 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2941
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2942 // Write serialization page so VM thread can do a pseudo remote membar.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2943 // We use the current thread pointer to calculate a thread specific
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2944 // offset to write to within the page. This minimizes bus traffic
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2945 // due to cache line collision.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2946 void MacroAssembler::serialize_memory(Register thread, Register tmp) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2947 movl(tmp, thread);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2948 shrl(tmp, os::get_serialize_page_shift_count());
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2949 andl(tmp, (os::vm_page_size() - sizeof(int)));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2950
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2951 Address index(noreg, tmp, Address::times_1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2952 ExternalAddress page(os::get_memory_serialize_page());
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2953
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2954 // Size of store must match masking code above
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2955 movl(as_Address(ArrayAddress(page, index)), tmp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2956 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2957
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2958 // Calls to C land
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2959 //
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2960 // When entering C land, the rbp, & rsp of the last Java frame have to be recorded
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2961 // in the (thread-local) JavaThread object. When leaving C land, the last Java fp
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2962 // has to be reset to 0. This is required to allow proper stack traversal.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2963 void MacroAssembler::set_last_Java_frame(Register java_thread,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2964 Register last_java_sp,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2965 Register last_java_fp,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2966 address last_java_pc) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2967 // determine java_thread register
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2968 if (!java_thread->is_valid()) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2969 java_thread = rdi;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2970 get_thread(java_thread);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2971 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2972 // determine last_java_sp register
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2973 if (!last_java_sp->is_valid()) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2974 last_java_sp = rsp;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2975 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2976
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2977 // last_java_fp is optional
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2978
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2979 if (last_java_fp->is_valid()) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2980 movptr(Address(java_thread, JavaThread::last_Java_fp_offset()), last_java_fp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2981 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2982
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2983 // last_java_pc is optional
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2984
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2985 if (last_java_pc != NULL) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2986 lea(Address(java_thread,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2987 JavaThread::frame_anchor_offset() + JavaFrameAnchor::last_Java_pc_offset()),
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2988 InternalAddress(last_java_pc));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2989
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2990 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2991 movptr(Address(java_thread, JavaThread::last_Java_sp_offset()), last_java_sp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2992 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2993
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2994 void MacroAssembler::shlptr(Register dst, int imm8) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2995 LP64_ONLY(shlq(dst, imm8)) NOT_LP64(shll(dst, imm8));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2996 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2997
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2998 void MacroAssembler::shrptr(Register dst, int imm8) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
2999 LP64_ONLY(shrq(dst, imm8)) NOT_LP64(shrl(dst, imm8));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3000 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3001
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3002 void MacroAssembler::sign_extend_byte(Register reg) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3003 if (LP64_ONLY(true ||) (VM_Version::is_P6() && reg->has_byte_register())) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3004 movsbl(reg, reg); // movsxb
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3005 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3006 shll(reg, 24);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3007 sarl(reg, 24);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3008 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3009 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3010
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3011 void MacroAssembler::sign_extend_short(Register reg) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3012 if (LP64_ONLY(true ||) VM_Version::is_P6()) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3013 movswl(reg, reg); // movsxw
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3014 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3015 shll(reg, 16);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3016 sarl(reg, 16);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3017 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3018 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3019
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3020 void MacroAssembler::testl(Register dst, AddressLiteral src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3021 assert(reachable(src), "Address should be reachable");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3022 testl(dst, as_Address(src));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3023 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3024
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3025 void MacroAssembler::sqrtsd(XMMRegister dst, AddressLiteral src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3026 if (reachable(src)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3027 Assembler::sqrtsd(dst, as_Address(src));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3028 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3029 lea(rscratch1, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3030 Assembler::sqrtsd(dst, Address(rscratch1, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3031 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3032 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3033
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3034 void MacroAssembler::sqrtss(XMMRegister dst, AddressLiteral src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3035 if (reachable(src)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3036 Assembler::sqrtss(dst, as_Address(src));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3037 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3038 lea(rscratch1, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3039 Assembler::sqrtss(dst, Address(rscratch1, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3040 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3041 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3042
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3043 void MacroAssembler::subsd(XMMRegister dst, AddressLiteral src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3044 if (reachable(src)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3045 Assembler::subsd(dst, as_Address(src));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3046 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3047 lea(rscratch1, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3048 Assembler::subsd(dst, Address(rscratch1, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3049 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3050 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3051
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3052 void MacroAssembler::subss(XMMRegister dst, AddressLiteral src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3053 if (reachable(src)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3054 Assembler::subss(dst, as_Address(src));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3055 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3056 lea(rscratch1, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3057 Assembler::subss(dst, Address(rscratch1, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3058 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3059 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3060
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3061 void MacroAssembler::ucomisd(XMMRegister dst, AddressLiteral src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3062 if (reachable(src)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3063 Assembler::ucomisd(dst, as_Address(src));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3064 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3065 lea(rscratch1, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3066 Assembler::ucomisd(dst, Address(rscratch1, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3067 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3068 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3069
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3070 void MacroAssembler::ucomiss(XMMRegister dst, AddressLiteral src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3071 if (reachable(src)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3072 Assembler::ucomiss(dst, as_Address(src));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3073 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3074 lea(rscratch1, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3075 Assembler::ucomiss(dst, Address(rscratch1, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3076 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3077 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3078
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3079 void MacroAssembler::xorpd(XMMRegister dst, AddressLiteral src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3080 // Used in sign-bit flipping with aligned address.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3081 assert((UseAVX > 0) || (((intptr_t)src.target() & 15) == 0), "SSE mode requires address alignment 16 bytes");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3082 if (reachable(src)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3083 Assembler::xorpd(dst, as_Address(src));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3084 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3085 lea(rscratch1, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3086 Assembler::xorpd(dst, Address(rscratch1, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3087 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3088 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3089
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3090 void MacroAssembler::xorps(XMMRegister dst, AddressLiteral src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3091 // Used in sign-bit flipping with aligned address.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3092 assert((UseAVX > 0) || (((intptr_t)src.target() & 15) == 0), "SSE mode requires address alignment 16 bytes");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3093 if (reachable(src)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3094 Assembler::xorps(dst, as_Address(src));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3095 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3096 lea(rscratch1, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3097 Assembler::xorps(dst, Address(rscratch1, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3098 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3099 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3100
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3101 void MacroAssembler::pshufb(XMMRegister dst, AddressLiteral src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3102 // Used in sign-bit flipping with aligned address.
7427
2c7f594145dc 8004835: Improve AES intrinsics on x86
kvn
parents: 7204
diff changeset
3103 bool aligned_adr = (((intptr_t)src.target() & 15) == 0);
2c7f594145dc 8004835: Improve AES intrinsics on x86
kvn
parents: 7204
diff changeset
3104 assert((UseAVX > 0) || aligned_adr, "SSE mode requires address alignment 16 bytes");
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3105 if (reachable(src)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3106 Assembler::pshufb(dst, as_Address(src));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3107 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3108 lea(rscratch1, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3109 Assembler::pshufb(dst, Address(rscratch1, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3110 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3111 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3112
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3113 // AVX 3-operands instructions
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3114
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3115 void MacroAssembler::vaddsd(XMMRegister dst, XMMRegister nds, AddressLiteral src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3116 if (reachable(src)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3117 vaddsd(dst, nds, as_Address(src));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3118 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3119 lea(rscratch1, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3120 vaddsd(dst, nds, Address(rscratch1, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3121 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3122 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3123
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3124 void MacroAssembler::vaddss(XMMRegister dst, XMMRegister nds, AddressLiteral src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3125 if (reachable(src)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3126 vaddss(dst, nds, as_Address(src));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3127 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3128 lea(rscratch1, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3129 vaddss(dst, nds, Address(rscratch1, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3130 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3131 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3132
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3133 void MacroAssembler::vandpd(XMMRegister dst, XMMRegister nds, AddressLiteral src, bool vector256) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3134 if (reachable(src)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3135 vandpd(dst, nds, as_Address(src), vector256);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3136 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3137 lea(rscratch1, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3138 vandpd(dst, nds, Address(rscratch1, 0), vector256);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3139 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3140 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3141
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3142 void MacroAssembler::vandps(XMMRegister dst, XMMRegister nds, AddressLiteral src, bool vector256) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3143 if (reachable(src)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3144 vandps(dst, nds, as_Address(src), vector256);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3145 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3146 lea(rscratch1, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3147 vandps(dst, nds, Address(rscratch1, 0), vector256);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3148 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3149 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3150
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3151 void MacroAssembler::vdivsd(XMMRegister dst, XMMRegister nds, AddressLiteral src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3152 if (reachable(src)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3153 vdivsd(dst, nds, as_Address(src));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3154 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3155 lea(rscratch1, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3156 vdivsd(dst, nds, Address(rscratch1, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3157 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3158 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3159
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3160 void MacroAssembler::vdivss(XMMRegister dst, XMMRegister nds, AddressLiteral src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3161 if (reachable(src)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3162 vdivss(dst, nds, as_Address(src));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3163 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3164 lea(rscratch1, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3165 vdivss(dst, nds, Address(rscratch1, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3166 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3167 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3168
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3169 void MacroAssembler::vmulsd(XMMRegister dst, XMMRegister nds, AddressLiteral src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3170 if (reachable(src)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3171 vmulsd(dst, nds, as_Address(src));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3172 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3173 lea(rscratch1, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3174 vmulsd(dst, nds, Address(rscratch1, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3175 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3176 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3177
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3178 void MacroAssembler::vmulss(XMMRegister dst, XMMRegister nds, AddressLiteral src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3179 if (reachable(src)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3180 vmulss(dst, nds, as_Address(src));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3181 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3182 lea(rscratch1, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3183 vmulss(dst, nds, Address(rscratch1, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3184 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3185 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3186
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3187 void MacroAssembler::vsubsd(XMMRegister dst, XMMRegister nds, AddressLiteral src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3188 if (reachable(src)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3189 vsubsd(dst, nds, as_Address(src));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3190 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3191 lea(rscratch1, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3192 vsubsd(dst, nds, Address(rscratch1, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3193 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3194 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3195
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3196 void MacroAssembler::vsubss(XMMRegister dst, XMMRegister nds, AddressLiteral src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3197 if (reachable(src)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3198 vsubss(dst, nds, as_Address(src));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3199 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3200 lea(rscratch1, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3201 vsubss(dst, nds, Address(rscratch1, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3202 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3203 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3204
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3205 void MacroAssembler::vxorpd(XMMRegister dst, XMMRegister nds, AddressLiteral src, bool vector256) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3206 if (reachable(src)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3207 vxorpd(dst, nds, as_Address(src), vector256);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3208 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3209 lea(rscratch1, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3210 vxorpd(dst, nds, Address(rscratch1, 0), vector256);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3211 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3212 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3213
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3214 void MacroAssembler::vxorps(XMMRegister dst, XMMRegister nds, AddressLiteral src, bool vector256) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3215 if (reachable(src)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3216 vxorps(dst, nds, as_Address(src), vector256);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3217 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3218 lea(rscratch1, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3219 vxorps(dst, nds, Address(rscratch1, 0), vector256);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3220 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3221 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3222
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3223
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3224 //////////////////////////////////////////////////////////////////////////////////
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7477
diff changeset
3225 #if INCLUDE_ALL_GCS
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3226
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3227 void MacroAssembler::g1_write_barrier_pre(Register obj,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3228 Register pre_val,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3229 Register thread,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3230 Register tmp,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3231 bool tosca_live,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3232 bool expand_call) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3233
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3234 // If expand_call is true then we expand the call_VM_leaf macro
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3235 // directly to skip generating the check by
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3236 // InterpreterMacroAssembler::call_VM_leaf_base that checks _last_sp.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3237
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3238 #ifdef _LP64
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3239 assert(thread == r15_thread, "must be");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3240 #endif // _LP64
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3241
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3242 Label done;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3243 Label runtime;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3244
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3245 assert(pre_val != noreg, "check this code");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3246
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3247 if (obj != noreg) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3248 assert_different_registers(obj, pre_val, tmp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3249 assert(pre_val != rax, "check this code");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3250 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3251
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3252 Address in_progress(thread, in_bytes(JavaThread::satb_mark_queue_offset() +
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3253 PtrQueue::byte_offset_of_active()));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3254 Address index(thread, in_bytes(JavaThread::satb_mark_queue_offset() +
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3255 PtrQueue::byte_offset_of_index()));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3256 Address buffer(thread, in_bytes(JavaThread::satb_mark_queue_offset() +
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3257 PtrQueue::byte_offset_of_buf()));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3258
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3259
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3260 // Is marking active?
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3261 if (in_bytes(PtrQueue::byte_width_of_active()) == 4) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3262 cmpl(in_progress, 0);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3263 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3264 assert(in_bytes(PtrQueue::byte_width_of_active()) == 1, "Assumption");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3265 cmpb(in_progress, 0);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3266 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3267 jcc(Assembler::equal, done);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3268
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3269 // Do we need to load the previous value?
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3270 if (obj != noreg) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3271 load_heap_oop(pre_val, Address(obj, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3272 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3273
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3274 // Is the previous value null?
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3275 cmpptr(pre_val, (int32_t) NULL_WORD);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3276 jcc(Assembler::equal, done);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3277
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3278 // Can we store original value in the thread's buffer?
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3279 // Is index == 0?
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3280 // (The index field is typed as size_t.)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3281
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3282 movptr(tmp, index); // tmp := *index_adr
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3283 cmpptr(tmp, 0); // tmp == 0?
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3284 jcc(Assembler::equal, runtime); // If yes, goto runtime
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3285
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3286 subptr(tmp, wordSize); // tmp := tmp - wordSize
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3287 movptr(index, tmp); // *index_adr := tmp
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3288 addptr(tmp, buffer); // tmp := tmp + *buffer_adr
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3289
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3290 // Record the previous value
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3291 movptr(Address(tmp, 0), pre_val);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3292 jmp(done);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3293
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3294 bind(runtime);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3295 // save the live input values
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3296 if(tosca_live) push(rax);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3297
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3298 if (obj != noreg && obj != rax)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3299 push(obj);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3300
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3301 if (pre_val != rax)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3302 push(pre_val);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3303
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3304 // Calling the runtime using the regular call_VM_leaf mechanism generates
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3305 // code (generated by InterpreterMacroAssember::call_VM_leaf_base)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3306 // that checks that the *(ebp+frame::interpreter_frame_last_sp) == NULL.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3307 //
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3308 // If we care generating the pre-barrier without a frame (e.g. in the
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3309 // intrinsified Reference.get() routine) then ebp might be pointing to
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3310 // the caller frame and so this check will most likely fail at runtime.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3311 //
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3312 // Expanding the call directly bypasses the generation of the check.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3313 // So when we do not have have a full interpreter frame on the stack
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3314 // expand_call should be passed true.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3315
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3316 NOT_LP64( push(thread); )
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3317
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3318 if (expand_call) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3319 LP64_ONLY( assert(pre_val != c_rarg1, "smashed arg"); )
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3320 pass_arg1(this, thread);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3321 pass_arg0(this, pre_val);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3322 MacroAssembler::call_VM_leaf_base(CAST_FROM_FN_PTR(address, SharedRuntime::g1_wb_pre), 2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3323 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3324 call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::g1_wb_pre), pre_val, thread);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3325 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3326
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3327 NOT_LP64( pop(thread); )
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3328
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3329 // save the live input values
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3330 if (pre_val != rax)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3331 pop(pre_val);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3332
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3333 if (obj != noreg && obj != rax)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3334 pop(obj);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3335
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3336 if(tosca_live) pop(rax);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3337
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3338 bind(done);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3339 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3340
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3341 void MacroAssembler::g1_write_barrier_post(Register store_addr,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3342 Register new_val,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3343 Register thread,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3344 Register tmp,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3345 Register tmp2) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3346 #ifdef _LP64
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3347 assert(thread == r15_thread, "must be");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3348 #endif // _LP64
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3349
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3350 Address queue_index(thread, in_bytes(JavaThread::dirty_card_queue_offset() +
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3351 PtrQueue::byte_offset_of_index()));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3352 Address buffer(thread, in_bytes(JavaThread::dirty_card_queue_offset() +
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3353 PtrQueue::byte_offset_of_buf()));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3354
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3355 BarrierSet* bs = Universe::heap()->barrier_set();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3356 CardTableModRefBS* ct = (CardTableModRefBS*)bs;
13424
61746b5f0ed3 8028109: compiler/codecache/CheckReservedInitialCodeCacheSizeArgOrder.java crashes in RT_Baseline
anoll
parents: 13047
diff changeset
3357 assert(sizeof(*ct->byte_map_base) == sizeof(jbyte), "adjust this code");
61746b5f0ed3 8028109: compiler/codecache/CheckReservedInitialCodeCacheSizeArgOrder.java crashes in RT_Baseline
anoll
parents: 13047
diff changeset
3358
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3359 Label done;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3360 Label runtime;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3361
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3362 // Does store cross heap regions?
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3363
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3364 movptr(tmp, store_addr);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3365 xorptr(tmp, new_val);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3366 shrptr(tmp, HeapRegion::LogOfHRGrainBytes);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3367 jcc(Assembler::equal, done);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3368
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3369 // crosses regions, storing NULL?
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3370
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3371 cmpptr(new_val, (int32_t) NULL_WORD);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3372 jcc(Assembler::equal, done);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3373
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3374 // storing region crossing non-NULL, is card already dirty?
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3375
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3376 const Register card_addr = tmp;
13424
61746b5f0ed3 8028109: compiler/codecache/CheckReservedInitialCodeCacheSizeArgOrder.java crashes in RT_Baseline
anoll
parents: 13047
diff changeset
3377 const Register cardtable = tmp2;
61746b5f0ed3 8028109: compiler/codecache/CheckReservedInitialCodeCacheSizeArgOrder.java crashes in RT_Baseline
anoll
parents: 13047
diff changeset
3378
61746b5f0ed3 8028109: compiler/codecache/CheckReservedInitialCodeCacheSizeArgOrder.java crashes in RT_Baseline
anoll
parents: 13047
diff changeset
3379 movptr(card_addr, store_addr);
61746b5f0ed3 8028109: compiler/codecache/CheckReservedInitialCodeCacheSizeArgOrder.java crashes in RT_Baseline
anoll
parents: 13047
diff changeset
3380 shrptr(card_addr, CardTableModRefBS::card_shift);
61746b5f0ed3 8028109: compiler/codecache/CheckReservedInitialCodeCacheSizeArgOrder.java crashes in RT_Baseline
anoll
parents: 13047
diff changeset
3381 // Do not use ExternalAddress to load 'byte_map_base', since 'byte_map_base' is NOT
61746b5f0ed3 8028109: compiler/codecache/CheckReservedInitialCodeCacheSizeArgOrder.java crashes in RT_Baseline
anoll
parents: 13047
diff changeset
3382 // a valid address and therefore is not properly handled by the relocation code.
61746b5f0ed3 8028109: compiler/codecache/CheckReservedInitialCodeCacheSizeArgOrder.java crashes in RT_Baseline
anoll
parents: 13047
diff changeset
3383 movptr(cardtable, (intptr_t)ct->byte_map_base);
61746b5f0ed3 8028109: compiler/codecache/CheckReservedInitialCodeCacheSizeArgOrder.java crashes in RT_Baseline
anoll
parents: 13047
diff changeset
3384 addptr(card_addr, cardtable);
61746b5f0ed3 8028109: compiler/codecache/CheckReservedInitialCodeCacheSizeArgOrder.java crashes in RT_Baseline
anoll
parents: 13047
diff changeset
3385
12835
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12226
diff changeset
3386 cmpb(Address(card_addr, 0), (int)G1SATBCardTableModRefBS::g1_young_card_val());
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3387 jcc(Assembler::equal, done);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3388
12835
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12226
diff changeset
3389 membar(Assembler::Membar_mask_bits(Assembler::StoreLoad));
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12226
diff changeset
3390 cmpb(Address(card_addr, 0), (int)CardTableModRefBS::dirty_card_val());
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12226
diff changeset
3391 jcc(Assembler::equal, done);
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12226
diff changeset
3392
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12226
diff changeset
3393
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3394 // storing a region crossing, non-NULL oop, card is clean.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3395 // dirty card and log.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3396
12835
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12226
diff changeset
3397 movb(Address(card_addr, 0), (int)CardTableModRefBS::dirty_card_val());
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3398
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3399 cmpl(queue_index, 0);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3400 jcc(Assembler::equal, runtime);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3401 subl(queue_index, wordSize);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3402 movptr(tmp2, buffer);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3403 #ifdef _LP64
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3404 movslq(rscratch1, queue_index);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3405 addq(tmp2, rscratch1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3406 movq(Address(tmp2, 0), card_addr);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3407 #else
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3408 addl(tmp2, queue_index);
13424
61746b5f0ed3 8028109: compiler/codecache/CheckReservedInitialCodeCacheSizeArgOrder.java crashes in RT_Baseline
anoll
parents: 13047
diff changeset
3409 movl(Address(tmp2, 0), card_addr);
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3410 #endif
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3411 jmp(done);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3412
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3413 bind(runtime);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3414 // save the live input values
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3415 push(store_addr);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3416 push(new_val);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3417 #ifdef _LP64
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3418 call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::g1_wb_post), card_addr, r15_thread);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3419 #else
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3420 push(thread);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3421 call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::g1_wb_post), card_addr, thread);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3422 pop(thread);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3423 #endif
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3424 pop(new_val);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3425 pop(store_addr);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3426
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3427 bind(done);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3428 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3429
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7477
diff changeset
3430 #endif // INCLUDE_ALL_GCS
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3431 //////////////////////////////////////////////////////////////////////////////////
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3432
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3433
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3434 void MacroAssembler::store_check(Register obj) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3435 // Does a store check for the oop in register obj. The content of
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3436 // register obj is destroyed afterwards.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3437 store_check_part_1(obj);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3438 store_check_part_2(obj);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3439 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3440
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3441 void MacroAssembler::store_check(Register obj, Address dst) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3442 store_check(obj);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3443 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3444
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3445
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3446 // split the store check operation so that other instructions can be scheduled inbetween
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3447 void MacroAssembler::store_check_part_1(Register obj) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3448 BarrierSet* bs = Universe::heap()->barrier_set();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3449 assert(bs->kind() == BarrierSet::CardTableModRef, "Wrong barrier set kind");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3450 shrptr(obj, CardTableModRefBS::card_shift);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3451 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3452
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3453 void MacroAssembler::store_check_part_2(Register obj) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3454 BarrierSet* bs = Universe::heap()->barrier_set();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3455 assert(bs->kind() == BarrierSet::CardTableModRef, "Wrong barrier set kind");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3456 CardTableModRefBS* ct = (CardTableModRefBS*)bs;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3457 assert(sizeof(*ct->byte_map_base) == sizeof(jbyte), "adjust this code");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3458
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3459 // The calculation for byte_map_base is as follows:
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3460 // byte_map_base = _byte_map - (uintptr_t(low_bound) >> card_shift);
13424
61746b5f0ed3 8028109: compiler/codecache/CheckReservedInitialCodeCacheSizeArgOrder.java crashes in RT_Baseline
anoll
parents: 13047
diff changeset
3461 // So this essentially converts an address to a displacement and it will
61746b5f0ed3 8028109: compiler/codecache/CheckReservedInitialCodeCacheSizeArgOrder.java crashes in RT_Baseline
anoll
parents: 13047
diff changeset
3462 // never need to be relocated. On 64bit however the value may be too
61746b5f0ed3 8028109: compiler/codecache/CheckReservedInitialCodeCacheSizeArgOrder.java crashes in RT_Baseline
anoll
parents: 13047
diff changeset
3463 // large for a 32bit displacement.
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3464 intptr_t disp = (intptr_t) ct->byte_map_base;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3465 if (is_simm32(disp)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3466 Address cardtable(noreg, obj, Address::times_1, disp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3467 movb(cardtable, 0);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3468 } else {
13424
61746b5f0ed3 8028109: compiler/codecache/CheckReservedInitialCodeCacheSizeArgOrder.java crashes in RT_Baseline
anoll
parents: 13047
diff changeset
3469 // By doing it as an ExternalAddress 'disp' could be converted to a rip-relative
61746b5f0ed3 8028109: compiler/codecache/CheckReservedInitialCodeCacheSizeArgOrder.java crashes in RT_Baseline
anoll
parents: 13047
diff changeset
3470 // displacement and done in a single instruction given favorable mapping and a
61746b5f0ed3 8028109: compiler/codecache/CheckReservedInitialCodeCacheSizeArgOrder.java crashes in RT_Baseline
anoll
parents: 13047
diff changeset
3471 // smarter version of as_Address. However, 'ExternalAddress' generates a relocation
61746b5f0ed3 8028109: compiler/codecache/CheckReservedInitialCodeCacheSizeArgOrder.java crashes in RT_Baseline
anoll
parents: 13047
diff changeset
3472 // entry and that entry is not properly handled by the relocation code.
61746b5f0ed3 8028109: compiler/codecache/CheckReservedInitialCodeCacheSizeArgOrder.java crashes in RT_Baseline
anoll
parents: 13047
diff changeset
3473 AddressLiteral cardtable((address)ct->byte_map_base, relocInfo::none);
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3474 Address index(noreg, obj, Address::times_1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3475 movb(as_Address(ArrayAddress(cardtable, index)), 0);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3476 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3477 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3478
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3479 void MacroAssembler::subptr(Register dst, int32_t imm32) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3480 LP64_ONLY(subq(dst, imm32)) NOT_LP64(subl(dst, imm32));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3481 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3482
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3483 // 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
3484 void MacroAssembler::subptr_imm32(Register dst, int32_t imm32) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3485 LP64_ONLY(subq_imm32(dst, imm32)) NOT_LP64(subl_imm32(dst, imm32));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3486 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3487
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3488 void MacroAssembler::subptr(Register dst, Register src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3489 LP64_ONLY(subq(dst, src)) NOT_LP64(subl(dst, src));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3490 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3491
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3492 // C++ bool manipulation
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3493 void MacroAssembler::testbool(Register dst) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3494 if(sizeof(bool) == 1)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3495 testb(dst, 0xff);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3496 else if(sizeof(bool) == 2) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3497 // testw implementation needed for two byte bools
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3498 ShouldNotReachHere();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3499 } else if(sizeof(bool) == 4)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3500 testl(dst, dst);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3501 else
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3502 // unsupported
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3503 ShouldNotReachHere();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3504 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3505
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3506 void MacroAssembler::testptr(Register dst, Register src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3507 LP64_ONLY(testq(dst, src)) NOT_LP64(testl(dst, src));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3508 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3509
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3510 // Defines obj, preserves var_size_in_bytes, okay for t2 == var_size_in_bytes.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3511 void MacroAssembler::tlab_allocate(Register obj,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3512 Register var_size_in_bytes,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3513 int con_size_in_bytes,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3514 Register t1,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3515 Register t2,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3516 Label& slow_case) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3517 assert_different_registers(obj, t1, t2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3518 assert_different_registers(obj, var_size_in_bytes, t1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3519 Register end = t2;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3520 Register thread = NOT_LP64(t1) LP64_ONLY(r15_thread);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3521
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3522 verify_tlab();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3523
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3524 NOT_LP64(get_thread(thread));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3525
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3526 movptr(obj, Address(thread, JavaThread::tlab_top_offset()));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3527 if (var_size_in_bytes == noreg) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3528 lea(end, Address(obj, con_size_in_bytes));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3529 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3530 lea(end, Address(obj, var_size_in_bytes, Address::times_1));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3531 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3532 cmpptr(end, Address(thread, JavaThread::tlab_end_offset()));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3533 jcc(Assembler::above, slow_case);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3534
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3535 // update the tlab top pointer
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3536 movptr(Address(thread, JavaThread::tlab_top_offset()), end);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3537
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3538 // recover var_size_in_bytes if necessary
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3539 if (var_size_in_bytes == end) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3540 subptr(var_size_in_bytes, obj);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3541 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3542 verify_tlab();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3543 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3544
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3545 // Preserves rbx, and rdx.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3546 Register MacroAssembler::tlab_refill(Label& retry,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3547 Label& try_eden,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3548 Label& slow_case) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3549 Register top = rax;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3550 Register t1 = rcx;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3551 Register t2 = rsi;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3552 Register thread_reg = NOT_LP64(rdi) LP64_ONLY(r15_thread);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3553 assert_different_registers(top, thread_reg, t1, t2, /* preserve: */ rbx, rdx);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3554 Label do_refill, discard_tlab;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3555
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3556 if (CMSIncrementalMode || !Universe::heap()->supports_inline_contig_alloc()) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3557 // No allocation in the shared eden.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3558 jmp(slow_case);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3559 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3560
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3561 NOT_LP64(get_thread(thread_reg));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3562
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3563 movptr(top, Address(thread_reg, in_bytes(JavaThread::tlab_top_offset())));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3564 movptr(t1, Address(thread_reg, in_bytes(JavaThread::tlab_end_offset())));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3565
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3566 // calculate amount of free space
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3567 subptr(t1, top);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3568 shrptr(t1, LogHeapWordSize);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3569
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3570 // Retain tlab and allocate object in shared space if
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3571 // the amount free in the tlab is too large to discard.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3572 cmpptr(t1, Address(thread_reg, in_bytes(JavaThread::tlab_refill_waste_limit_offset())));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3573 jcc(Assembler::lessEqual, discard_tlab);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3574
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3575 // Retain
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3576 // %%% yuck as movptr...
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3577 movptr(t2, (int32_t) ThreadLocalAllocBuffer::refill_waste_limit_increment());
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3578 addptr(Address(thread_reg, in_bytes(JavaThread::tlab_refill_waste_limit_offset())), t2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3579 if (TLABStats) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3580 // increment number of slow_allocations
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3581 addl(Address(thread_reg, in_bytes(JavaThread::tlab_slow_allocations_offset())), 1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3582 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3583 jmp(try_eden);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3584
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3585 bind(discard_tlab);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3586 if (TLABStats) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3587 // increment number of refills
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3588 addl(Address(thread_reg, in_bytes(JavaThread::tlab_number_of_refills_offset())), 1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3589 // accumulate wastage -- t1 is amount free in tlab
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3590 addl(Address(thread_reg, in_bytes(JavaThread::tlab_fast_refill_waste_offset())), t1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3591 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3592
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3593 // if tlab is currently allocated (top or end != null) then
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3594 // fill [top, end + alignment_reserve) with array object
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3595 testptr(top, top);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3596 jcc(Assembler::zero, do_refill);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3597
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3598 // set up the mark word
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3599 movptr(Address(top, oopDesc::mark_offset_in_bytes()), (intptr_t)markOopDesc::prototype()->copy_set_hash(0x2));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3600 // set the length to the remaining space
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3601 subptr(t1, typeArrayOopDesc::header_size(T_INT));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3602 addptr(t1, (int32_t)ThreadLocalAllocBuffer::alignment_reserve());
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3603 shlptr(t1, log2_intptr(HeapWordSize/sizeof(jint)));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3604 movl(Address(top, arrayOopDesc::length_offset_in_bytes()), t1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3605 // set klass to intArrayKlass
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3606 // dubious reloc why not an oop reloc?
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3607 movptr(t1, ExternalAddress((address)Universe::intArrayKlassObj_addr()));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3608 // store klass last. concurrent gcs assumes klass length is valid if
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3609 // klass field is not null.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3610 store_klass(top, t1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3611
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3612 movptr(t1, top);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3613 subptr(t1, Address(thread_reg, in_bytes(JavaThread::tlab_start_offset())));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3614 incr_allocated_bytes(thread_reg, t1, 0);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3615
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3616 // refill the tlab with an eden allocation
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3617 bind(do_refill);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3618 movptr(t1, Address(thread_reg, in_bytes(JavaThread::tlab_size_offset())));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3619 shlptr(t1, LogHeapWordSize);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3620 // allocate new tlab, address returned in top
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3621 eden_allocate(top, t1, 0, t2, slow_case);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3622
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3623 // Check that t1 was preserved in eden_allocate.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3624 #ifdef ASSERT
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3625 if (UseTLAB) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3626 Label ok;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3627 Register tsize = rsi;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3628 assert_different_registers(tsize, thread_reg, t1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3629 push(tsize);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3630 movptr(tsize, Address(thread_reg, in_bytes(JavaThread::tlab_size_offset())));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3631 shlptr(tsize, LogHeapWordSize);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3632 cmpptr(t1, tsize);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3633 jcc(Assembler::equal, ok);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3634 STOP("assert(t1 != tlab size)");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3635 should_not_reach_here();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3636
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3637 bind(ok);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3638 pop(tsize);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3639 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3640 #endif
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3641 movptr(Address(thread_reg, in_bytes(JavaThread::tlab_start_offset())), top);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3642 movptr(Address(thread_reg, in_bytes(JavaThread::tlab_top_offset())), top);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3643 addptr(top, t1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3644 subptr(top, (int32_t)ThreadLocalAllocBuffer::alignment_reserve_in_bytes());
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3645 movptr(Address(thread_reg, in_bytes(JavaThread::tlab_end_offset())), top);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3646 verify_tlab();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3647 jmp(retry);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3648
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3649 return thread_reg; // for use by caller
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3650 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3651
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3652 void MacroAssembler::incr_allocated_bytes(Register thread,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3653 Register var_size_in_bytes,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3654 int con_size_in_bytes,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3655 Register t1) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3656 if (!thread->is_valid()) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3657 #ifdef _LP64
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3658 thread = r15_thread;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3659 #else
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3660 assert(t1->is_valid(), "need temp reg");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3661 thread = t1;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3662 get_thread(thread);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3663 #endif
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3664 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3665
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3666 #ifdef _LP64
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3667 if (var_size_in_bytes->is_valid()) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3668 addq(Address(thread, in_bytes(JavaThread::allocated_bytes_offset())), var_size_in_bytes);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3669 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3670 addq(Address(thread, in_bytes(JavaThread::allocated_bytes_offset())), con_size_in_bytes);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3671 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3672 #else
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3673 if (var_size_in_bytes->is_valid()) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3674 addl(Address(thread, in_bytes(JavaThread::allocated_bytes_offset())), var_size_in_bytes);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3675 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3676 addl(Address(thread, in_bytes(JavaThread::allocated_bytes_offset())), con_size_in_bytes);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3677 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3678 adcl(Address(thread, in_bytes(JavaThread::allocated_bytes_offset())+4), 0);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3679 #endif
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3680 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3681
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3682 void MacroAssembler::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
3683 pusha();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3684
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3685 // if we are coming from c1, xmm registers may be live
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3686 int off = 0;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3687 if (UseSSE == 1) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3688 subptr(rsp, sizeof(jdouble)*8);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3689 movflt(Address(rsp,off++*sizeof(jdouble)),xmm0);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3690 movflt(Address(rsp,off++*sizeof(jdouble)),xmm1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3691 movflt(Address(rsp,off++*sizeof(jdouble)),xmm2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3692 movflt(Address(rsp,off++*sizeof(jdouble)),xmm3);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3693 movflt(Address(rsp,off++*sizeof(jdouble)),xmm4);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3694 movflt(Address(rsp,off++*sizeof(jdouble)),xmm5);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3695 movflt(Address(rsp,off++*sizeof(jdouble)),xmm6);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3696 movflt(Address(rsp,off++*sizeof(jdouble)),xmm7);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3697 } else if (UseSSE >= 2) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3698 #ifdef COMPILER2
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3699 if (MaxVectorSize > 16) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3700 assert(UseAVX > 0, "256bit vectors are supported only with AVX");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3701 // Save upper half of YMM registes
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3702 subptr(rsp, 16 * LP64_ONLY(16) NOT_LP64(8));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3703 vextractf128h(Address(rsp, 0),xmm0);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3704 vextractf128h(Address(rsp, 16),xmm1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3705 vextractf128h(Address(rsp, 32),xmm2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3706 vextractf128h(Address(rsp, 48),xmm3);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3707 vextractf128h(Address(rsp, 64),xmm4);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3708 vextractf128h(Address(rsp, 80),xmm5);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3709 vextractf128h(Address(rsp, 96),xmm6);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3710 vextractf128h(Address(rsp,112),xmm7);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3711 #ifdef _LP64
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3712 vextractf128h(Address(rsp,128),xmm8);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3713 vextractf128h(Address(rsp,144),xmm9);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3714 vextractf128h(Address(rsp,160),xmm10);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3715 vextractf128h(Address(rsp,176),xmm11);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3716 vextractf128h(Address(rsp,192),xmm12);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3717 vextractf128h(Address(rsp,208),xmm13);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3718 vextractf128h(Address(rsp,224),xmm14);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3719 vextractf128h(Address(rsp,240),xmm15);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3720 #endif
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3721 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3722 #endif
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3723 // Save whole 128bit (16 bytes) XMM regiters
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3724 subptr(rsp, 16 * LP64_ONLY(16) NOT_LP64(8));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3725 movdqu(Address(rsp,off++*16),xmm0);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3726 movdqu(Address(rsp,off++*16),xmm1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3727 movdqu(Address(rsp,off++*16),xmm2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3728 movdqu(Address(rsp,off++*16),xmm3);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3729 movdqu(Address(rsp,off++*16),xmm4);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3730 movdqu(Address(rsp,off++*16),xmm5);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3731 movdqu(Address(rsp,off++*16),xmm6);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3732 movdqu(Address(rsp,off++*16),xmm7);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3733 #ifdef _LP64
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3734 movdqu(Address(rsp,off++*16),xmm8);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3735 movdqu(Address(rsp,off++*16),xmm9);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3736 movdqu(Address(rsp,off++*16),xmm10);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3737 movdqu(Address(rsp,off++*16),xmm11);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3738 movdqu(Address(rsp,off++*16),xmm12);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3739 movdqu(Address(rsp,off++*16),xmm13);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3740 movdqu(Address(rsp,off++*16),xmm14);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3741 movdqu(Address(rsp,off++*16),xmm15);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3742 #endif
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3743 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3744
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3745 // Preserve registers across runtime call
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3746 int incoming_argument_and_return_value_offset = -1;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3747 if (num_fpu_regs_in_use > 1) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3748 // Must preserve all other FPU regs (could alternatively convert
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3749 // SharedRuntime::dsin, dcos etc. into assembly routines known not to trash
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3750 // FPU state, but can not trust C compiler)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3751 NEEDS_CLEANUP;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3752 // NOTE that in this case we also push the incoming argument(s) to
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3753 // the stack and restore it later; we also use this stack slot to
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3754 // hold the return value from dsin, dcos etc.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3755 for (int i = 0; i < num_fpu_regs_in_use; i++) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3756 subptr(rsp, sizeof(jdouble));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3757 fstp_d(Address(rsp, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3758 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3759 incoming_argument_and_return_value_offset = sizeof(jdouble)*(num_fpu_regs_in_use-1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3760 for (int i = nb_args-1; i >= 0; i--) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3761 fld_d(Address(rsp, incoming_argument_and_return_value_offset-i*sizeof(jdouble)));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3762 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3763 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3764
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3765 subptr(rsp, nb_args*sizeof(jdouble));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3766 for (int i = 0; i < nb_args; i++) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3767 fstp_d(Address(rsp, i*sizeof(jdouble)));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3768 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3769
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3770 #ifdef _LP64
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3771 if (nb_args > 0) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3772 movdbl(xmm0, Address(rsp, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3773 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3774 if (nb_args > 1) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3775 movdbl(xmm1, Address(rsp, sizeof(jdouble)));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3776 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3777 assert(nb_args <= 2, "unsupported number of args");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3778 #endif // _LP64
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3779
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3780 // NOTE: we must not use call_VM_leaf here because that requires a
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3781 // complete interpreter frame in debug mode -- same bug as 4387334
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3782 // MacroAssembler::call_VM_leaf_base is perfectly safe and will
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3783 // do proper 64bit abi
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3784
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3785 NEEDS_CLEANUP;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3786 // Need to add stack banging before this runtime call if it needs to
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3787 // be taken; however, there is no generic stack banging routine at
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3788 // the MacroAssembler level
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3789
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3790 MacroAssembler::call_VM_leaf_base(runtime_entry, 0);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3791
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3792 #ifdef _LP64
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3793 movsd(Address(rsp, 0), xmm0);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3794 fld_d(Address(rsp, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3795 #endif // _LP64
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3796 addptr(rsp, sizeof(jdouble) * nb_args);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3797 if (num_fpu_regs_in_use > 1) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3798 // Must save return value to stack and then restore entire FPU
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3799 // stack except incoming arguments
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3800 fstp_d(Address(rsp, incoming_argument_and_return_value_offset));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3801 for (int i = 0; i < num_fpu_regs_in_use - nb_args; i++) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3802 fld_d(Address(rsp, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3803 addptr(rsp, sizeof(jdouble));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3804 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3805 fld_d(Address(rsp, (nb_args-1)*sizeof(jdouble)));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3806 addptr(rsp, sizeof(jdouble) * nb_args);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3807 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3808
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3809 off = 0;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3810 if (UseSSE == 1) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3811 movflt(xmm0, Address(rsp,off++*sizeof(jdouble)));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3812 movflt(xmm1, Address(rsp,off++*sizeof(jdouble)));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3813 movflt(xmm2, Address(rsp,off++*sizeof(jdouble)));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3814 movflt(xmm3, Address(rsp,off++*sizeof(jdouble)));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3815 movflt(xmm4, Address(rsp,off++*sizeof(jdouble)));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3816 movflt(xmm5, Address(rsp,off++*sizeof(jdouble)));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3817 movflt(xmm6, Address(rsp,off++*sizeof(jdouble)));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3818 movflt(xmm7, Address(rsp,off++*sizeof(jdouble)));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3819 addptr(rsp, sizeof(jdouble)*8);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3820 } else if (UseSSE >= 2) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3821 // Restore whole 128bit (16 bytes) XMM regiters
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3822 movdqu(xmm0, Address(rsp,off++*16));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3823 movdqu(xmm1, Address(rsp,off++*16));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3824 movdqu(xmm2, Address(rsp,off++*16));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3825 movdqu(xmm3, Address(rsp,off++*16));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3826 movdqu(xmm4, Address(rsp,off++*16));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3827 movdqu(xmm5, Address(rsp,off++*16));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3828 movdqu(xmm6, Address(rsp,off++*16));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3829 movdqu(xmm7, Address(rsp,off++*16));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3830 #ifdef _LP64
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3831 movdqu(xmm8, Address(rsp,off++*16));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3832 movdqu(xmm9, Address(rsp,off++*16));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3833 movdqu(xmm10, Address(rsp,off++*16));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3834 movdqu(xmm11, Address(rsp,off++*16));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3835 movdqu(xmm12, Address(rsp,off++*16));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3836 movdqu(xmm13, Address(rsp,off++*16));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3837 movdqu(xmm14, Address(rsp,off++*16));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3838 movdqu(xmm15, Address(rsp,off++*16));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3839 #endif
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3840 addptr(rsp, 16 * LP64_ONLY(16) NOT_LP64(8));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3841 #ifdef COMPILER2
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3842 if (MaxVectorSize > 16) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3843 // Restore upper half of YMM registes.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3844 vinsertf128h(xmm0, Address(rsp, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3845 vinsertf128h(xmm1, Address(rsp, 16));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3846 vinsertf128h(xmm2, Address(rsp, 32));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3847 vinsertf128h(xmm3, Address(rsp, 48));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3848 vinsertf128h(xmm4, Address(rsp, 64));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3849 vinsertf128h(xmm5, Address(rsp, 80));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3850 vinsertf128h(xmm6, Address(rsp, 96));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3851 vinsertf128h(xmm7, Address(rsp,112));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3852 #ifdef _LP64
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3853 vinsertf128h(xmm8, Address(rsp,128));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3854 vinsertf128h(xmm9, Address(rsp,144));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3855 vinsertf128h(xmm10, Address(rsp,160));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3856 vinsertf128h(xmm11, Address(rsp,176));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3857 vinsertf128h(xmm12, Address(rsp,192));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3858 vinsertf128h(xmm13, Address(rsp,208));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3859 vinsertf128h(xmm14, Address(rsp,224));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3860 vinsertf128h(xmm15, Address(rsp,240));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3861 #endif
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3862 addptr(rsp, 16 * LP64_ONLY(16) NOT_LP64(8));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3863 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3864 #endif
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3865 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3866 popa();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3867 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3868
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3869 static const double pi_4 = 0.7853981633974483;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3870
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3871 void MacroAssembler::trigfunc(char trig, int num_fpu_regs_in_use) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3872 // A hand-coded argument reduction for values in fabs(pi/4, pi/2)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3873 // was attempted in this code; unfortunately it appears that the
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3874 // switch to 80-bit precision and back causes this to be
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3875 // unprofitable compared with simply performing a runtime call if
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3876 // the argument is out of the (-pi/4, pi/4) range.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3877
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3878 Register tmp = noreg;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3879 if (!VM_Version::supports_cmov()) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3880 // fcmp needs a temporary so preserve rbx,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3881 tmp = rbx;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3882 push(tmp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3883 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3884
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3885 Label slow_case, done;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3886
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3887 ExternalAddress pi4_adr = (address)&pi_4;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3888 if (reachable(pi4_adr)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3889 // x ?<= pi/4
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3890 fld_d(pi4_adr);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3891 fld_s(1); // Stack: X PI/4 X
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3892 fabs(); // Stack: |X| PI/4 X
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3893 fcmp(tmp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3894 jcc(Assembler::above, slow_case);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3895
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3896 // fastest case: -pi/4 <= x <= pi/4
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3897 switch(trig) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3898 case 's':
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3899 fsin();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3900 break;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3901 case 'c':
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3902 fcos();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3903 break;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3904 case 't':
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3905 ftan();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3906 break;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3907 default:
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3908 assert(false, "bad intrinsic");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3909 break;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3910 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3911 jmp(done);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3912 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3913
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3914 // slow case: runtime call
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3915 bind(slow_case);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3916
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3917 switch(trig) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3918 case 's':
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3919 {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3920 fp_runtime_fallback(CAST_FROM_FN_PTR(address, SharedRuntime::dsin), 1, num_fpu_regs_in_use);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3921 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3922 break;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3923 case 'c':
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3924 {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3925 fp_runtime_fallback(CAST_FROM_FN_PTR(address, SharedRuntime::dcos), 1, num_fpu_regs_in_use);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3926 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3927 break;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3928 case 't':
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3929 {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3930 fp_runtime_fallback(CAST_FROM_FN_PTR(address, SharedRuntime::dtan), 1, num_fpu_regs_in_use);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3931 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3932 break;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3933 default:
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3934 assert(false, "bad intrinsic");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3935 break;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3936 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3937
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3938 // Come here with result in F-TOS
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3939 bind(done);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3940
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3941 if (tmp != noreg) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3942 pop(tmp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3943 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3944 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3945
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3946
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3947 // Look up the method for a megamorphic invokeinterface call.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3948 // The target method is determined by <intf_klass, itable_index>.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3949 // The receiver klass is in recv_klass.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3950 // On success, the result will be in method_result, and execution falls through.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3951 // On failure, execution transfers to the given label.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3952 void MacroAssembler::lookup_interface_method(Register recv_klass,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3953 Register intf_klass,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3954 RegisterOrConstant itable_index,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3955 Register method_result,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3956 Register scan_temp,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3957 Label& L_no_such_interface) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3958 assert_different_registers(recv_klass, intf_klass, method_result, scan_temp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3959 assert(itable_index.is_constant() || itable_index.as_register() == method_result,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3960 "caller must use same register for non-constant itable index as for method");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3961
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3962 // Compute start of first itableOffsetEntry (which is at the end of the vtable)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3963 int vtable_base = InstanceKlass::vtable_start_offset() * wordSize;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3964 int itentry_off = itableMethodEntry::method_offset_in_bytes();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3965 int scan_step = itableOffsetEntry::size() * wordSize;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3966 int vte_size = vtableEntry::size() * wordSize;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3967 Address::ScaleFactor times_vte_scale = Address::times_ptr;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3968 assert(vte_size == wordSize, "else adjust times_vte_scale");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3969
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3970 movl(scan_temp, Address(recv_klass, InstanceKlass::vtable_length_offset() * wordSize));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3971
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3972 // %%% Could store the aligned, prescaled offset in the klassoop.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3973 lea(scan_temp, Address(recv_klass, scan_temp, times_vte_scale, vtable_base));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3974 if (HeapWordsPerLong > 1) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3975 // Round up to align_object_offset boundary
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3976 // see code for InstanceKlass::start_of_itable!
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3977 round_to(scan_temp, BytesPerLong);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3978 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3979
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3980 // Adjust recv_klass by scaled itable_index, so we can free itable_index.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3981 assert(itableMethodEntry::size() * wordSize == wordSize, "adjust the scaling in the code below");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3982 lea(recv_klass, Address(recv_klass, itable_index, Address::times_ptr, itentry_off));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3983
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3984 // for (scan = klass->itable(); scan->interface() != NULL; scan += scan_step) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3985 // if (scan->interface() == intf) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3986 // result = (klass + scan->offset() + itable_index);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3987 // }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3988 // }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3989 Label search, found_method;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3990
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3991 for (int peel = 1; peel >= 0; peel--) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3992 movptr(method_result, Address(scan_temp, itableOffsetEntry::interface_offset_in_bytes()));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3993 cmpptr(intf_klass, method_result);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3994
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3995 if (peel) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3996 jccb(Assembler::equal, found_method);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3997 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3998 jccb(Assembler::notEqual, search);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
3999 // (invert the test to fall through to found_method...)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4000 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4001
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4002 if (!peel) break;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4003
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4004 bind(search);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4005
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4006 // Check that the previous entry is non-null. A null entry means that
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4007 // the receiver class doesn't implement the interface, and wasn't the
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4008 // same as when the caller was compiled.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4009 testptr(method_result, method_result);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4010 jcc(Assembler::zero, L_no_such_interface);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4011 addptr(scan_temp, scan_step);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4012 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4013
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4014 bind(found_method);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4015
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4016 // Got a hit.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4017 movl(scan_temp, Address(scan_temp, itableOffsetEntry::offset_offset_in_bytes()));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4018 movptr(method_result, Address(recv_klass, scan_temp, Address::times_1));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4019 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4020
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4021
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4022 // virtual method calling
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4023 void MacroAssembler::lookup_virtual_method(Register recv_klass,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4024 RegisterOrConstant vtable_index,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4025 Register method_result) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4026 const int base = InstanceKlass::vtable_start_offset() * wordSize;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4027 assert(vtableEntry::size() * wordSize == wordSize, "else adjust the scaling in the code below");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4028 Address vtable_entry_addr(recv_klass,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4029 vtable_index, Address::times_ptr,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4030 base + vtableEntry::method_offset_in_bytes());
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4031 movptr(method_result, vtable_entry_addr);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4032 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4033
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4034
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4035 void MacroAssembler::check_klass_subtype(Register sub_klass,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4036 Register super_klass,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4037 Register temp_reg,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4038 Label& L_success) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4039 Label L_failure;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4040 check_klass_subtype_fast_path(sub_klass, super_klass, temp_reg, &L_success, &L_failure, NULL);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4041 check_klass_subtype_slow_path(sub_klass, super_klass, temp_reg, noreg, &L_success, NULL);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4042 bind(L_failure);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4043 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4044
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4045
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4046 void MacroAssembler::check_klass_subtype_fast_path(Register sub_klass,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4047 Register super_klass,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4048 Register temp_reg,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4049 Label* L_success,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4050 Label* L_failure,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4051 Label* L_slow_path,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4052 RegisterOrConstant super_check_offset) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4053 assert_different_registers(sub_klass, super_klass, temp_reg);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4054 bool must_load_sco = (super_check_offset.constant_or_zero() == -1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4055 if (super_check_offset.is_register()) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4056 assert_different_registers(sub_klass, super_klass,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4057 super_check_offset.as_register());
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4058 } else if (must_load_sco) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4059 assert(temp_reg != noreg, "supply either a temp or a register offset");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4060 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4061
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4062 Label L_fallthrough;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4063 int label_nulls = 0;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4064 if (L_success == NULL) { L_success = &L_fallthrough; label_nulls++; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4065 if (L_failure == NULL) { L_failure = &L_fallthrough; label_nulls++; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4066 if (L_slow_path == NULL) { L_slow_path = &L_fallthrough; label_nulls++; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4067 assert(label_nulls <= 1, "at most one NULL in the batch");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4068
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4069 int sc_offset = in_bytes(Klass::secondary_super_cache_offset());
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4070 int sco_offset = in_bytes(Klass::super_check_offset_offset());
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4071 Address super_check_offset_addr(super_klass, sco_offset);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4072
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4073 // Hacked jcc, which "knows" that L_fallthrough, at least, is in
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4074 // range of a jccb. If this routine grows larger, reconsider at
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4075 // least some of these.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4076 #define local_jcc(assembler_cond, label) \
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4077 if (&(label) == &L_fallthrough) jccb(assembler_cond, label); \
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4078 else jcc( assembler_cond, label) /*omit semi*/
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4079
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4080 // Hacked jmp, which may only be used just before L_fallthrough.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4081 #define final_jmp(label) \
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4082 if (&(label) == &L_fallthrough) { /*do nothing*/ } \
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4083 else jmp(label) /*omit semi*/
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4084
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4085 // If the pointers are equal, we are done (e.g., String[] elements).
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4086 // This self-check enables sharing of secondary supertype arrays among
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4087 // non-primary types such as array-of-interface. Otherwise, each such
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4088 // type would need its own customized SSA.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4089 // We move this check to the front of the fast path because many
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4090 // type checks are in fact trivially successful in this manner,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4091 // so we get a nicely predicted branch right at the start of the check.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4092 cmpptr(sub_klass, super_klass);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4093 local_jcc(Assembler::equal, *L_success);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4094
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4095 // Check the supertype display:
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4096 if (must_load_sco) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4097 // Positive movl does right thing on LP64.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4098 movl(temp_reg, super_check_offset_addr);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4099 super_check_offset = RegisterOrConstant(temp_reg);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4100 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4101 Address super_check_addr(sub_klass, super_check_offset, Address::times_1, 0);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4102 cmpptr(super_klass, super_check_addr); // load displayed supertype
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4103
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4104 // This check has worked decisively for primary supers.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4105 // Secondary supers are sought in the super_cache ('super_cache_addr').
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4106 // (Secondary supers are interfaces and very deeply nested subtypes.)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4107 // This works in the same check above because of a tricky aliasing
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4108 // between the super_cache and the primary super display elements.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4109 // (The 'super_check_addr' can address either, as the case requires.)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4110 // Note that the cache is updated below if it does not help us find
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4111 // what we need immediately.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4112 // So if it was a primary super, we can just fail immediately.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4113 // Otherwise, it's the slow path for us (no success at this point).
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4114
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4115 if (super_check_offset.is_register()) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4116 local_jcc(Assembler::equal, *L_success);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4117 cmpl(super_check_offset.as_register(), sc_offset);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4118 if (L_failure == &L_fallthrough) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4119 local_jcc(Assembler::equal, *L_slow_path);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4120 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4121 local_jcc(Assembler::notEqual, *L_failure);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4122 final_jmp(*L_slow_path);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4123 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4124 } else if (super_check_offset.as_constant() == sc_offset) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4125 // Need a slow path; fast failure is impossible.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4126 if (L_slow_path == &L_fallthrough) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4127 local_jcc(Assembler::equal, *L_success);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4128 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4129 local_jcc(Assembler::notEqual, *L_slow_path);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4130 final_jmp(*L_success);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4131 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4132 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4133 // No slow path; it's a fast decision.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4134 if (L_failure == &L_fallthrough) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4135 local_jcc(Assembler::equal, *L_success);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4136 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4137 local_jcc(Assembler::notEqual, *L_failure);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4138 final_jmp(*L_success);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4139 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4140 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4141
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4142 bind(L_fallthrough);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4143
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4144 #undef local_jcc
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4145 #undef final_jmp
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4146 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4147
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4148
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4149 void MacroAssembler::check_klass_subtype_slow_path(Register sub_klass,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4150 Register super_klass,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4151 Register temp_reg,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4152 Register temp2_reg,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4153 Label* L_success,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4154 Label* L_failure,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4155 bool set_cond_codes) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4156 assert_different_registers(sub_klass, super_klass, temp_reg);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4157 if (temp2_reg != noreg)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4158 assert_different_registers(sub_klass, super_klass, temp_reg, temp2_reg);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4159 #define IS_A_TEMP(reg) ((reg) == temp_reg || (reg) == temp2_reg)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4160
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4161 Label L_fallthrough;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4162 int label_nulls = 0;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4163 if (L_success == NULL) { L_success = &L_fallthrough; label_nulls++; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4164 if (L_failure == NULL) { L_failure = &L_fallthrough; label_nulls++; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4165 assert(label_nulls <= 1, "at most one NULL in the batch");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4166
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4167 // a couple of useful fields in sub_klass:
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4168 int ss_offset = in_bytes(Klass::secondary_supers_offset());
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4169 int sc_offset = in_bytes(Klass::secondary_super_cache_offset());
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4170 Address secondary_supers_addr(sub_klass, ss_offset);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4171 Address super_cache_addr( sub_klass, sc_offset);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4172
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4173 // Do a linear scan of the secondary super-klass chain.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4174 // This code is rarely used, so simplicity is a virtue here.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4175 // The repne_scan instruction uses fixed registers, which we must spill.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4176 // Don't worry too much about pre-existing connections with the input regs.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4177
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4178 assert(sub_klass != rax, "killed reg"); // killed by mov(rax, super)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4179 assert(sub_klass != rcx, "killed reg"); // killed by lea(rcx, &pst_counter)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4180
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4181 // Get super_klass value into rax (even if it was in rdi or rcx).
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4182 bool pushed_rax = false, pushed_rcx = false, pushed_rdi = false;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4183 if (super_klass != rax || UseCompressedOops) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4184 if (!IS_A_TEMP(rax)) { push(rax); pushed_rax = true; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4185 mov(rax, super_klass);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4186 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4187 if (!IS_A_TEMP(rcx)) { push(rcx); pushed_rcx = true; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4188 if (!IS_A_TEMP(rdi)) { push(rdi); pushed_rdi = true; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4189
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4190 #ifndef PRODUCT
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4191 int* pst_counter = &SharedRuntime::_partial_subtype_ctr;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4192 ExternalAddress pst_counter_addr((address) pst_counter);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4193 NOT_LP64( incrementl(pst_counter_addr) );
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4194 LP64_ONLY( lea(rcx, pst_counter_addr) );
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4195 LP64_ONLY( incrementl(Address(rcx, 0)) );
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4196 #endif //PRODUCT
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4197
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4198 // We will consult the secondary-super array.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4199 movptr(rdi, secondary_supers_addr);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4200 // Load the array length. (Positive movl does right thing on LP64.)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4201 movl(rcx, Address(rdi, Array<Klass*>::length_offset_in_bytes()));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4202 // Skip to start of data.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4203 addptr(rdi, Array<Klass*>::base_offset_in_bytes());
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4204
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4205 // Scan RCX words at [RDI] for an occurrence of RAX.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4206 // Set NZ/Z based on last compare.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4207 // Z flag value will not be set by 'repne' if RCX == 0 since 'repne' does
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4208 // not change flags (only scas instruction which is repeated sets flags).
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4209 // Set Z = 0 (not equal) before 'repne' to indicate that class was not found.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4210
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4211 testptr(rax,rax); // Set Z = 0
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4212 repne_scan();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4213
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4214 // Unspill the temp. registers:
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4215 if (pushed_rdi) pop(rdi);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4216 if (pushed_rcx) pop(rcx);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4217 if (pushed_rax) pop(rax);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4218
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4219 if (set_cond_codes) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4220 // Special hack for the AD files: rdi is guaranteed non-zero.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4221 assert(!pushed_rdi, "rdi must be left non-NULL");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4222 // Also, the condition codes are properly set Z/NZ on succeed/failure.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4223 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4224
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4225 if (L_failure == &L_fallthrough)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4226 jccb(Assembler::notEqual, *L_failure);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4227 else jcc(Assembler::notEqual, *L_failure);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4228
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4229 // Success. Cache the super we found and proceed in triumph.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4230 movptr(super_cache_addr, super_klass);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4231
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4232 if (L_success != &L_fallthrough) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4233 jmp(*L_success);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4234 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4235
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4236 #undef IS_A_TEMP
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4237
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4238 bind(L_fallthrough);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4239 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4240
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4241
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4242 void MacroAssembler::cmov32(Condition cc, Register dst, Address src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4243 if (VM_Version::supports_cmov()) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4244 cmovl(cc, dst, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4245 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4246 Label L;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4247 jccb(negate_condition(cc), L);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4248 movl(dst, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4249 bind(L);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4250 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4251 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4252
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4253 void MacroAssembler::cmov32(Condition cc, Register dst, Register src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4254 if (VM_Version::supports_cmov()) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4255 cmovl(cc, dst, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4256 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4257 Label L;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4258 jccb(negate_condition(cc), L);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4259 movl(dst, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4260 bind(L);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4261 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4262 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4263
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4264 void MacroAssembler::verify_oop(Register reg, const char* s) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4265 if (!VerifyOops) return;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4266
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4267 // Pass register number to verify_oop_subroutine
8767
a5de0cc2f91c 8008555: Debugging code in compiled method sometimes leaks memory
roland
parents: 8042
diff changeset
4268 const char* b = NULL;
a5de0cc2f91c 8008555: Debugging code in compiled method sometimes leaks memory
roland
parents: 8042
diff changeset
4269 {
a5de0cc2f91c 8008555: Debugging code in compiled method sometimes leaks memory
roland
parents: 8042
diff changeset
4270 ResourceMark rm;
a5de0cc2f91c 8008555: Debugging code in compiled method sometimes leaks memory
roland
parents: 8042
diff changeset
4271 stringStream ss;
a5de0cc2f91c 8008555: Debugging code in compiled method sometimes leaks memory
roland
parents: 8042
diff changeset
4272 ss.print("verify_oop: %s: %s", reg->name(), s);
a5de0cc2f91c 8008555: Debugging code in compiled method sometimes leaks memory
roland
parents: 8042
diff changeset
4273 b = code_string(ss.as_string());
a5de0cc2f91c 8008555: Debugging code in compiled method sometimes leaks memory
roland
parents: 8042
diff changeset
4274 }
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4275 BLOCK_COMMENT("verify_oop {");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4276 #ifdef _LP64
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4277 push(rscratch1); // save r10, trashed by movptr()
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4278 #endif
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4279 push(rax); // save rax,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4280 push(reg); // pass register argument
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4281 ExternalAddress buffer((address) b);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4282 // avoid using pushptr, as it modifies scratch registers
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4283 // and our contract is not to modify anything
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4284 movptr(rax, buffer.addr());
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4285 push(rax);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4286 // call indirectly to solve generation ordering problem
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4287 movptr(rax, ExternalAddress(StubRoutines::verify_oop_subroutine_entry_address()));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4288 call(rax);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4289 // Caller pops the arguments (oop, message) and restores rax, r10
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4290 BLOCK_COMMENT("} verify_oop");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4291 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4292
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4293
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4294 RegisterOrConstant MacroAssembler::delayed_value_impl(intptr_t* delayed_value_addr,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4295 Register tmp,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4296 int offset) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4297 intptr_t value = *delayed_value_addr;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4298 if (value != 0)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4299 return RegisterOrConstant(value + offset);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4300
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4301 // load indirectly to solve generation ordering problem
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4302 movptr(tmp, ExternalAddress((address) delayed_value_addr));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4303
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4304 #ifdef ASSERT
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4305 { Label L;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4306 testptr(tmp, tmp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4307 if (WizardMode) {
8767
a5de0cc2f91c 8008555: Debugging code in compiled method sometimes leaks memory
roland
parents: 8042
diff changeset
4308 const char* buf = NULL;
a5de0cc2f91c 8008555: Debugging code in compiled method sometimes leaks memory
roland
parents: 8042
diff changeset
4309 {
a5de0cc2f91c 8008555: Debugging code in compiled method sometimes leaks memory
roland
parents: 8042
diff changeset
4310 ResourceMark rm;
a5de0cc2f91c 8008555: Debugging code in compiled method sometimes leaks memory
roland
parents: 8042
diff changeset
4311 stringStream ss;
a5de0cc2f91c 8008555: Debugging code in compiled method sometimes leaks memory
roland
parents: 8042
diff changeset
4312 ss.print("DelayedValue="INTPTR_FORMAT, delayed_value_addr[1]);
a5de0cc2f91c 8008555: Debugging code in compiled method sometimes leaks memory
roland
parents: 8042
diff changeset
4313 buf = code_string(ss.as_string());
a5de0cc2f91c 8008555: Debugging code in compiled method sometimes leaks memory
roland
parents: 8042
diff changeset
4314 }
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4315 jcc(Assembler::notZero, L);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4316 STOP(buf);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4317 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4318 jccb(Assembler::notZero, L);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4319 hlt();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4320 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4321 bind(L);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4322 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4323 #endif
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4324
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4325 if (offset != 0)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4326 addptr(tmp, offset);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4327
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4328 return RegisterOrConstant(tmp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4329 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4330
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4331
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4332 Address MacroAssembler::argument_address(RegisterOrConstant arg_slot,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4333 int extra_slot_offset) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4334 // cf. TemplateTable::prepare_invoke(), if (load_receiver).
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4335 int stackElementSize = Interpreter::stackElementSize;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4336 int offset = Interpreter::expr_offset_in_bytes(extra_slot_offset+0);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4337 #ifdef ASSERT
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4338 int offset1 = Interpreter::expr_offset_in_bytes(extra_slot_offset+1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4339 assert(offset1 - offset == stackElementSize, "correct arithmetic");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4340 #endif
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4341 Register scale_reg = noreg;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4342 Address::ScaleFactor scale_factor = Address::no_scale;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4343 if (arg_slot.is_constant()) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4344 offset += arg_slot.as_constant() * stackElementSize;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4345 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4346 scale_reg = arg_slot.as_register();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4347 scale_factor = Address::times(stackElementSize);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4348 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4349 offset += wordSize; // return PC is on stack
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4350 return Address(rsp, scale_reg, scale_factor, offset);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4351 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4352
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4353
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4354 void MacroAssembler::verify_oop_addr(Address addr, const char* s) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4355 if (!VerifyOops) return;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4356
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4357 // Address adjust(addr.base(), addr.index(), addr.scale(), addr.disp() + BytesPerWord);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4358 // Pass register number to verify_oop_subroutine
8767
a5de0cc2f91c 8008555: Debugging code in compiled method sometimes leaks memory
roland
parents: 8042
diff changeset
4359 const char* b = NULL;
a5de0cc2f91c 8008555: Debugging code in compiled method sometimes leaks memory
roland
parents: 8042
diff changeset
4360 {
a5de0cc2f91c 8008555: Debugging code in compiled method sometimes leaks memory
roland
parents: 8042
diff changeset
4361 ResourceMark rm;
a5de0cc2f91c 8008555: Debugging code in compiled method sometimes leaks memory
roland
parents: 8042
diff changeset
4362 stringStream ss;
a5de0cc2f91c 8008555: Debugging code in compiled method sometimes leaks memory
roland
parents: 8042
diff changeset
4363 ss.print("verify_oop_addr: %s", s);
a5de0cc2f91c 8008555: Debugging code in compiled method sometimes leaks memory
roland
parents: 8042
diff changeset
4364 b = code_string(ss.as_string());
a5de0cc2f91c 8008555: Debugging code in compiled method sometimes leaks memory
roland
parents: 8042
diff changeset
4365 }
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4366 #ifdef _LP64
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4367 push(rscratch1); // save r10, trashed by movptr()
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4368 #endif
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4369 push(rax); // save rax,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4370 // addr may contain rsp so we will have to adjust it based on the push
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4371 // we just did (and on 64 bit we do two pushes)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4372 // NOTE: 64bit seemed to have had a bug in that it did movq(addr, rax); which
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4373 // stores rax into addr which is backwards of what was intended.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4374 if (addr.uses(rsp)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4375 lea(rax, addr);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4376 pushptr(Address(rax, LP64_ONLY(2 *) BytesPerWord));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4377 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4378 pushptr(addr);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4379 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4380
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4381 ExternalAddress buffer((address) b);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4382 // pass msg argument
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4383 // avoid using pushptr, as it modifies scratch registers
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4384 // and our contract is not to modify anything
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4385 movptr(rax, buffer.addr());
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4386 push(rax);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4387
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4388 // call indirectly to solve generation ordering problem
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4389 movptr(rax, ExternalAddress(StubRoutines::verify_oop_subroutine_entry_address()));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4390 call(rax);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4391 // Caller pops the arguments (addr, message) and restores rax, r10.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4392 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4393
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4394 void MacroAssembler::verify_tlab() {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4395 #ifdef ASSERT
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4396 if (UseTLAB && VerifyOops) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4397 Label next, ok;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4398 Register t1 = rsi;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4399 Register thread_reg = NOT_LP64(rbx) LP64_ONLY(r15_thread);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4400
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4401 push(t1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4402 NOT_LP64(push(thread_reg));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4403 NOT_LP64(get_thread(thread_reg));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4404
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4405 movptr(t1, Address(thread_reg, in_bytes(JavaThread::tlab_top_offset())));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4406 cmpptr(t1, Address(thread_reg, in_bytes(JavaThread::tlab_start_offset())));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4407 jcc(Assembler::aboveEqual, next);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4408 STOP("assert(top >= start)");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4409 should_not_reach_here();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4410
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4411 bind(next);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4412 movptr(t1, Address(thread_reg, in_bytes(JavaThread::tlab_end_offset())));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4413 cmpptr(t1, Address(thread_reg, in_bytes(JavaThread::tlab_top_offset())));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4414 jcc(Assembler::aboveEqual, ok);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4415 STOP("assert(top <= end)");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4416 should_not_reach_here();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4417
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4418 bind(ok);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4419 NOT_LP64(pop(thread_reg));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4420 pop(t1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4421 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4422 #endif
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4423 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4424
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4425 class ControlWord {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4426 public:
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4427 int32_t _value;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4428
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4429 int rounding_control() const { return (_value >> 10) & 3 ; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4430 int precision_control() const { return (_value >> 8) & 3 ; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4431 bool precision() const { return ((_value >> 5) & 1) != 0; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4432 bool underflow() const { return ((_value >> 4) & 1) != 0; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4433 bool overflow() const { return ((_value >> 3) & 1) != 0; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4434 bool zero_divide() const { return ((_value >> 2) & 1) != 0; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4435 bool denormalized() const { return ((_value >> 1) & 1) != 0; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4436 bool invalid() const { return ((_value >> 0) & 1) != 0; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4437
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4438 void print() const {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4439 // rounding control
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4440 const char* rc;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4441 switch (rounding_control()) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4442 case 0: rc = "round near"; break;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4443 case 1: rc = "round down"; break;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4444 case 2: rc = "round up "; break;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4445 case 3: rc = "chop "; break;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4446 };
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4447 // precision control
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4448 const char* pc;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4449 switch (precision_control()) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4450 case 0: pc = "24 bits "; break;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4451 case 1: pc = "reserved"; break;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4452 case 2: pc = "53 bits "; break;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4453 case 3: pc = "64 bits "; break;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4454 };
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4455 // flags
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4456 char f[9];
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4457 f[0] = ' ';
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4458 f[1] = ' ';
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4459 f[2] = (precision ()) ? 'P' : 'p';
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4460 f[3] = (underflow ()) ? 'U' : 'u';
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4461 f[4] = (overflow ()) ? 'O' : 'o';
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4462 f[5] = (zero_divide ()) ? 'Z' : 'z';
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4463 f[6] = (denormalized()) ? 'D' : 'd';
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4464 f[7] = (invalid ()) ? 'I' : 'i';
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4465 f[8] = '\x0';
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4466 // output
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4467 printf("%04x masks = %s, %s, %s", _value & 0xFFFF, f, rc, pc);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4468 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4469
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4470 };
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4471
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4472 class StatusWord {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4473 public:
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4474 int32_t _value;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4475
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4476 bool busy() const { return ((_value >> 15) & 1) != 0; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4477 bool C3() const { return ((_value >> 14) & 1) != 0; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4478 bool C2() const { return ((_value >> 10) & 1) != 0; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4479 bool C1() const { return ((_value >> 9) & 1) != 0; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4480 bool C0() const { return ((_value >> 8) & 1) != 0; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4481 int top() const { return (_value >> 11) & 7 ; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4482 bool error_status() const { return ((_value >> 7) & 1) != 0; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4483 bool stack_fault() const { return ((_value >> 6) & 1) != 0; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4484 bool precision() const { return ((_value >> 5) & 1) != 0; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4485 bool underflow() const { return ((_value >> 4) & 1) != 0; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4486 bool overflow() const { return ((_value >> 3) & 1) != 0; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4487 bool zero_divide() const { return ((_value >> 2) & 1) != 0; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4488 bool denormalized() const { return ((_value >> 1) & 1) != 0; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4489 bool invalid() const { return ((_value >> 0) & 1) != 0; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4490
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4491 void print() const {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4492 // condition codes
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4493 char c[5];
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4494 c[0] = (C3()) ? '3' : '-';
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4495 c[1] = (C2()) ? '2' : '-';
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4496 c[2] = (C1()) ? '1' : '-';
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4497 c[3] = (C0()) ? '0' : '-';
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4498 c[4] = '\x0';
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4499 // flags
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4500 char f[9];
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4501 f[0] = (error_status()) ? 'E' : '-';
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4502 f[1] = (stack_fault ()) ? 'S' : '-';
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4503 f[2] = (precision ()) ? 'P' : '-';
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4504 f[3] = (underflow ()) ? 'U' : '-';
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4505 f[4] = (overflow ()) ? 'O' : '-';
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4506 f[5] = (zero_divide ()) ? 'Z' : '-';
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4507 f[6] = (denormalized()) ? 'D' : '-';
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4508 f[7] = (invalid ()) ? 'I' : '-';
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4509 f[8] = '\x0';
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4510 // output
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4511 printf("%04x flags = %s, cc = %s, top = %d", _value & 0xFFFF, f, c, top());
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4512 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4513
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4514 };
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4515
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4516 class TagWord {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4517 public:
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4518 int32_t _value;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4519
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4520 int tag_at(int i) const { return (_value >> (i*2)) & 3; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4521
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4522 void print() const {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4523 printf("%04x", _value & 0xFFFF);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4524 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4525
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4526 };
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4527
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4528 class FPU_Register {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4529 public:
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4530 int32_t _m0;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4531 int32_t _m1;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4532 int16_t _ex;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4533
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4534 bool is_indefinite() const {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4535 return _ex == -1 && _m1 == (int32_t)0xC0000000 && _m0 == 0;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4536 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4537
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4538 void print() const {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4539 char sign = (_ex < 0) ? '-' : '+';
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4540 const char* kind = (_ex == 0x7FFF || _ex == (int16_t)-1) ? "NaN" : " ";
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4541 printf("%c%04hx.%08x%08x %s", sign, _ex, _m1, _m0, kind);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4542 };
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4543
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4544 };
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4545
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4546 class FPU_State {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4547 public:
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4548 enum {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4549 register_size = 10,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4550 number_of_registers = 8,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4551 register_mask = 7
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4552 };
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4553
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4554 ControlWord _control_word;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4555 StatusWord _status_word;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4556 TagWord _tag_word;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4557 int32_t _error_offset;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4558 int32_t _error_selector;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4559 int32_t _data_offset;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4560 int32_t _data_selector;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4561 int8_t _register[register_size * number_of_registers];
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4562
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4563 int tag_for_st(int i) const { return _tag_word.tag_at((_status_word.top() + i) & register_mask); }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4564 FPU_Register* st(int i) const { return (FPU_Register*)&_register[register_size * i]; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4565
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4566 const char* tag_as_string(int tag) const {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4567 switch (tag) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4568 case 0: return "valid";
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4569 case 1: return "zero";
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4570 case 2: return "special";
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4571 case 3: return "empty";
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4572 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4573 ShouldNotReachHere();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4574 return NULL;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4575 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4576
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4577 void print() const {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4578 // print computation registers
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4579 { int t = _status_word.top();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4580 for (int i = 0; i < number_of_registers; i++) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4581 int j = (i - t) & register_mask;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4582 printf("%c r%d = ST%d = ", (j == 0 ? '*' : ' '), i, j);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4583 st(j)->print();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4584 printf(" %s\n", tag_as_string(_tag_word.tag_at(i)));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4585 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4586 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4587 printf("\n");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4588 // print control registers
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4589 printf("ctrl = "); _control_word.print(); printf("\n");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4590 printf("stat = "); _status_word .print(); printf("\n");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4591 printf("tags = "); _tag_word .print(); printf("\n");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4592 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4593
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4594 };
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4595
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4596 class Flag_Register {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4597 public:
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4598 int32_t _value;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4599
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4600 bool overflow() const { return ((_value >> 11) & 1) != 0; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4601 bool direction() const { return ((_value >> 10) & 1) != 0; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4602 bool sign() const { return ((_value >> 7) & 1) != 0; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4603 bool zero() const { return ((_value >> 6) & 1) != 0; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4604 bool auxiliary_carry() const { return ((_value >> 4) & 1) != 0; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4605 bool parity() const { return ((_value >> 2) & 1) != 0; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4606 bool carry() const { return ((_value >> 0) & 1) != 0; }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4607
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4608 void print() const {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4609 // flags
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4610 char f[8];
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4611 f[0] = (overflow ()) ? 'O' : '-';
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4612 f[1] = (direction ()) ? 'D' : '-';
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4613 f[2] = (sign ()) ? 'S' : '-';
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4614 f[3] = (zero ()) ? 'Z' : '-';
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4615 f[4] = (auxiliary_carry()) ? 'A' : '-';
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4616 f[5] = (parity ()) ? 'P' : '-';
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4617 f[6] = (carry ()) ? 'C' : '-';
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4618 f[7] = '\x0';
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4619 // output
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4620 printf("%08x flags = %s", _value, f);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4621 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4622
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4623 };
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4624
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4625 class IU_Register {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4626 public:
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4627 int32_t _value;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4628
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4629 void print() const {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4630 printf("%08x %11d", _value, _value);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4631 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4632
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4633 };
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4634
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4635 class IU_State {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4636 public:
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4637 Flag_Register _eflags;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4638 IU_Register _rdi;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4639 IU_Register _rsi;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4640 IU_Register _rbp;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4641 IU_Register _rsp;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4642 IU_Register _rbx;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4643 IU_Register _rdx;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4644 IU_Register _rcx;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4645 IU_Register _rax;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4646
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4647 void print() const {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4648 // computation registers
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4649 printf("rax, = "); _rax.print(); printf("\n");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4650 printf("rbx, = "); _rbx.print(); printf("\n");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4651 printf("rcx = "); _rcx.print(); printf("\n");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4652 printf("rdx = "); _rdx.print(); printf("\n");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4653 printf("rdi = "); _rdi.print(); printf("\n");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4654 printf("rsi = "); _rsi.print(); printf("\n");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4655 printf("rbp, = "); _rbp.print(); printf("\n");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4656 printf("rsp = "); _rsp.print(); printf("\n");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4657 printf("\n");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4658 // control registers
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4659 printf("flgs = "); _eflags.print(); printf("\n");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4660 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4661 };
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4662
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4663
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4664 class CPU_State {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4665 public:
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4666 FPU_State _fpu_state;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4667 IU_State _iu_state;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4668
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4669 void print() const {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4670 printf("--------------------------------------------------\n");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4671 _iu_state .print();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4672 printf("\n");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4673 _fpu_state.print();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4674 printf("--------------------------------------------------\n");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4675 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4676
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4677 };
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4678
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4679
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4680 static void _print_CPU_state(CPU_State* state) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4681 state->print();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4682 };
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4683
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4684
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4685 void MacroAssembler::print_CPU_state() {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4686 push_CPU_state();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4687 push(rsp); // pass CPU state
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4688 call(RuntimeAddress(CAST_FROM_FN_PTR(address, _print_CPU_state)));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4689 addptr(rsp, wordSize); // discard argument
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4690 pop_CPU_state();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4691 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4692
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4693
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4694 static bool _verify_FPU(int stack_depth, char* s, CPU_State* state) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4695 static int counter = 0;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4696 FPU_State* fs = &state->_fpu_state;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4697 counter++;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4698 // For leaf calls, only verify that the top few elements remain empty.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4699 // We only need 1 empty at the top for C2 code.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4700 if( stack_depth < 0 ) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4701 if( fs->tag_for_st(7) != 3 ) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4702 printf("FPR7 not empty\n");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4703 state->print();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4704 assert(false, "error");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4705 return false;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4706 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4707 return true; // All other stack states do not matter
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4708 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4709
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4710 assert((fs->_control_word._value & 0xffff) == StubRoutines::_fpu_cntrl_wrd_std,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4711 "bad FPU control word");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4712
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4713 // compute stack depth
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4714 int i = 0;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4715 while (i < FPU_State::number_of_registers && fs->tag_for_st(i) < 3) i++;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4716 int d = i;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4717 while (i < FPU_State::number_of_registers && fs->tag_for_st(i) == 3) i++;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4718 // verify findings
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4719 if (i != FPU_State::number_of_registers) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4720 // stack not contiguous
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4721 printf("%s: stack not contiguous at ST%d\n", s, i);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4722 state->print();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4723 assert(false, "error");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4724 return false;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4725 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4726 // check if computed stack depth corresponds to expected stack depth
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4727 if (stack_depth < 0) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4728 // expected stack depth is -stack_depth or less
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4729 if (d > -stack_depth) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4730 // too many elements on the stack
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4731 printf("%s: <= %d stack elements expected but found %d\n", s, -stack_depth, d);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4732 state->print();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4733 assert(false, "error");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4734 return false;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4735 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4736 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4737 // expected stack depth is stack_depth
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4738 if (d != stack_depth) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4739 // wrong stack depth
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4740 printf("%s: %d stack elements expected but found %d\n", s, stack_depth, d);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4741 state->print();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4742 assert(false, "error");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4743 return false;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4744 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4745 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4746 // everything is cool
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4747 return true;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4748 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4749
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4750
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4751 void MacroAssembler::verify_FPU(int stack_depth, const char* s) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4752 if (!VerifyFPU) return;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4753 push_CPU_state();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4754 push(rsp); // pass CPU state
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4755 ExternalAddress msg((address) s);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4756 // pass message string s
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4757 pushptr(msg.addr());
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4758 push(stack_depth); // pass stack depth
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4759 call(RuntimeAddress(CAST_FROM_FN_PTR(address, _verify_FPU)));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4760 addptr(rsp, 3 * wordSize); // discard arguments
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4761 // check for error
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4762 { Label L;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4763 testl(rax, rax);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4764 jcc(Assembler::notZero, L);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4765 int3(); // break if error condition
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4766 bind(L);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4767 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4768 pop_CPU_state();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4769 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4770
8873
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 8767
diff changeset
4771 void MacroAssembler::restore_cpu_control_state_after_jni() {
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 8767
diff changeset
4772 // Either restore the MXCSR register after returning from the JNI Call
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 8767
diff changeset
4773 // or verify that it wasn't changed (with -Xcheck:jni flag).
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 8767
diff changeset
4774 if (VM_Version::supports_sse()) {
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 8767
diff changeset
4775 if (RestoreMXCSROnJNICalls) {
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 8767
diff changeset
4776 ldmxcsr(ExternalAddress(StubRoutines::addr_mxcsr_std()));
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 8767
diff changeset
4777 } else if (CheckJNICalls) {
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 8767
diff changeset
4778 call(RuntimeAddress(StubRoutines::x86::verify_mxcsr_entry()));
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 8767
diff changeset
4779 }
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 8767
diff changeset
4780 }
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 8767
diff changeset
4781 if (VM_Version::supports_avx()) {
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 8767
diff changeset
4782 // Clear upper bits of YMM registers to avoid SSE <-> AVX transition penalty.
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 8767
diff changeset
4783 vzeroupper();
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 8767
diff changeset
4784 }
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 8767
diff changeset
4785
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 8767
diff changeset
4786 #ifndef _LP64
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 8767
diff changeset
4787 // Either restore the x87 floating pointer control word after returning
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 8767
diff changeset
4788 // from the JNI call or verify that it wasn't changed.
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 8767
diff changeset
4789 if (CheckJNICalls) {
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 8767
diff changeset
4790 call(RuntimeAddress(StubRoutines::x86::verify_fpu_cntrl_wrd_entry()));
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 8767
diff changeset
4791 }
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 8767
diff changeset
4792 #endif // _LP64
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 8767
diff changeset
4793 }
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 8767
diff changeset
4794
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 8767
diff changeset
4795
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4796 void MacroAssembler::load_klass(Register dst, Register src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4797 #ifdef _LP64
12226
7944aba7ba41 8015107: NPG: Use consistent naming for metaspace concepts
ehelin
parents: 12056
diff changeset
4798 if (UseCompressedClassPointers) {
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4799 movl(dst, Address(src, oopDesc::klass_offset_in_bytes()));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4800 decode_klass_not_null(dst);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4801 } else
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4802 #endif
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4803 movptr(dst, Address(src, oopDesc::klass_offset_in_bytes()));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4804 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4805
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4806 void MacroAssembler::load_prototype_header(Register dst, Register src) {
12056
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
4807 load_klass(dst, src);
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
4808 movptr(dst, Address(dst, Klass::prototype_header_offset()));
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4809 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4810
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4811 void MacroAssembler::store_klass(Register dst, Register src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4812 #ifdef _LP64
12226
7944aba7ba41 8015107: NPG: Use consistent naming for metaspace concepts
ehelin
parents: 12056
diff changeset
4813 if (UseCompressedClassPointers) {
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4814 encode_klass_not_null(src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4815 movl(Address(dst, oopDesc::klass_offset_in_bytes()), src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4816 } else
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4817 #endif
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4818 movptr(Address(dst, oopDesc::klass_offset_in_bytes()), src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4819 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4820
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4821 void MacroAssembler::load_heap_oop(Register dst, Address src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4822 #ifdef _LP64
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4823 // FIXME: Must change all places where we try to load the klass.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4824 if (UseCompressedOops) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4825 movl(dst, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4826 decode_heap_oop(dst);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4827 } else
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4828 #endif
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4829 movptr(dst, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4830 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4831
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4832 // Doesn't do verfication, generates fixed size code
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4833 void MacroAssembler::load_heap_oop_not_null(Register dst, Address src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4834 #ifdef _LP64
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4835 if (UseCompressedOops) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4836 movl(dst, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4837 decode_heap_oop_not_null(dst);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4838 } else
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4839 #endif
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4840 movptr(dst, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4841 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4842
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4843 void MacroAssembler::store_heap_oop(Address dst, Register src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4844 #ifdef _LP64
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4845 if (UseCompressedOops) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4846 assert(!dst.uses(src), "not enough registers");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4847 encode_heap_oop(src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4848 movl(dst, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4849 } else
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4850 #endif
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4851 movptr(dst, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4852 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4853
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4854 void MacroAssembler::cmp_heap_oop(Register src1, Address src2, Register tmp) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4855 assert_different_registers(src1, tmp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4856 #ifdef _LP64
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4857 if (UseCompressedOops) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4858 bool did_push = false;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4859 if (tmp == noreg) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4860 tmp = rax;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4861 push(tmp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4862 did_push = true;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4863 assert(!src2.uses(rsp), "can't push");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4864 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4865 load_heap_oop(tmp, src2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4866 cmpptr(src1, tmp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4867 if (did_push) pop(tmp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4868 } else
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4869 #endif
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4870 cmpptr(src1, src2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4871 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4872
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4873 // Used for storing NULLs.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4874 void MacroAssembler::store_heap_oop_null(Address dst) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4875 #ifdef _LP64
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4876 if (UseCompressedOops) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4877 movl(dst, (int32_t)NULL_WORD);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4878 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4879 movslq(dst, (int32_t)NULL_WORD);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4880 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4881 #else
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4882 movl(dst, (int32_t)NULL_WORD);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4883 #endif
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4884 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4885
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4886 #ifdef _LP64
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4887 void MacroAssembler::store_klass_gap(Register dst, Register src) {
12226
7944aba7ba41 8015107: NPG: Use consistent naming for metaspace concepts
ehelin
parents: 12056
diff changeset
4888 if (UseCompressedClassPointers) {
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4889 // Store to klass gap in destination
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4890 movl(Address(dst, oopDesc::klass_gap_offset_in_bytes()), src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4891 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4892 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4893
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4894 #ifdef ASSERT
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4895 void MacroAssembler::verify_heapbase(const char* msg) {
12056
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
4896 assert (UseCompressedOops, "should be compressed");
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4897 assert (Universe::heap() != NULL, "java heap should be initialized");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4898 if (CheckCompressedOops) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4899 Label ok;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4900 push(rscratch1); // cmpptr trashes rscratch1
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4901 cmpptr(r12_heapbase, ExternalAddress((address)Universe::narrow_ptrs_base_addr()));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4902 jcc(Assembler::equal, ok);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4903 STOP(msg);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4904 bind(ok);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4905 pop(rscratch1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4906 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4907 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4908 #endif
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4909
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4910 // Algorithm must match oop.inline.hpp encode_heap_oop.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4911 void MacroAssembler::encode_heap_oop(Register r) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4912 #ifdef ASSERT
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4913 verify_heapbase("MacroAssembler::encode_heap_oop: heap base corrupted?");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4914 #endif
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4915 verify_oop(r, "broken oop in encode_heap_oop");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4916 if (Universe::narrow_oop_base() == NULL) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4917 if (Universe::narrow_oop_shift() != 0) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4918 assert (LogMinObjAlignmentInBytes == Universe::narrow_oop_shift(), "decode alg wrong");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4919 shrq(r, LogMinObjAlignmentInBytes);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4920 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4921 return;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4922 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4923 testq(r, r);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4924 cmovq(Assembler::equal, r, r12_heapbase);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4925 subq(r, r12_heapbase);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4926 shrq(r, LogMinObjAlignmentInBytes);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4927 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4928
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4929 void MacroAssembler::encode_heap_oop_not_null(Register r) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4930 #ifdef ASSERT
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4931 verify_heapbase("MacroAssembler::encode_heap_oop_not_null: heap base corrupted?");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4932 if (CheckCompressedOops) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4933 Label ok;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4934 testq(r, r);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4935 jcc(Assembler::notEqual, ok);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4936 STOP("null oop passed to encode_heap_oop_not_null");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4937 bind(ok);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4938 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4939 #endif
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4940 verify_oop(r, "broken oop in encode_heap_oop_not_null");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4941 if (Universe::narrow_oop_base() != NULL) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4942 subq(r, r12_heapbase);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4943 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4944 if (Universe::narrow_oop_shift() != 0) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4945 assert (LogMinObjAlignmentInBytes == Universe::narrow_oop_shift(), "decode alg wrong");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4946 shrq(r, LogMinObjAlignmentInBytes);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4947 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4948 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4949
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4950 void MacroAssembler::encode_heap_oop_not_null(Register dst, Register src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4951 #ifdef ASSERT
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4952 verify_heapbase("MacroAssembler::encode_heap_oop_not_null2: heap base corrupted?");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4953 if (CheckCompressedOops) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4954 Label ok;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4955 testq(src, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4956 jcc(Assembler::notEqual, ok);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4957 STOP("null oop passed to encode_heap_oop_not_null2");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4958 bind(ok);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4959 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4960 #endif
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4961 verify_oop(src, "broken oop in encode_heap_oop_not_null2");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4962 if (dst != src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4963 movq(dst, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4964 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4965 if (Universe::narrow_oop_base() != NULL) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4966 subq(dst, r12_heapbase);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4967 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4968 if (Universe::narrow_oop_shift() != 0) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4969 assert (LogMinObjAlignmentInBytes == Universe::narrow_oop_shift(), "decode alg wrong");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4970 shrq(dst, LogMinObjAlignmentInBytes);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4971 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4972 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4973
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4974 void MacroAssembler::decode_heap_oop(Register r) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4975 #ifdef ASSERT
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4976 verify_heapbase("MacroAssembler::decode_heap_oop: heap base corrupted?");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4977 #endif
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4978 if (Universe::narrow_oop_base() == NULL) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4979 if (Universe::narrow_oop_shift() != 0) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4980 assert (LogMinObjAlignmentInBytes == Universe::narrow_oop_shift(), "decode alg wrong");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4981 shlq(r, LogMinObjAlignmentInBytes);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4982 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4983 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4984 Label done;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4985 shlq(r, LogMinObjAlignmentInBytes);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4986 jccb(Assembler::equal, done);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4987 addq(r, r12_heapbase);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4988 bind(done);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4989 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4990 verify_oop(r, "broken oop in decode_heap_oop");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4991 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4992
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4993 void MacroAssembler::decode_heap_oop_not_null(Register r) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4994 // Note: it will change flags
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4995 assert (UseCompressedOops, "should only be used for compressed headers");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4996 assert (Universe::heap() != NULL, "java heap should be initialized");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4997 // Cannot assert, unverified entry point counts instructions (see .ad file)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4998 // vtableStubs also counts instructions in pd_code_size_limit.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
4999 // Also do not verify_oop as this is called by verify_oop.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5000 if (Universe::narrow_oop_shift() != 0) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5001 assert(LogMinObjAlignmentInBytes == Universe::narrow_oop_shift(), "decode alg wrong");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5002 shlq(r, LogMinObjAlignmentInBytes);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5003 if (Universe::narrow_oop_base() != NULL) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5004 addq(r, r12_heapbase);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5005 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5006 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5007 assert (Universe::narrow_oop_base() == NULL, "sanity");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5008 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5009 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5010
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5011 void MacroAssembler::decode_heap_oop_not_null(Register dst, Register src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5012 // Note: it will change flags
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5013 assert (UseCompressedOops, "should only be used for compressed headers");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5014 assert (Universe::heap() != NULL, "java heap should be initialized");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5015 // Cannot assert, unverified entry point counts instructions (see .ad file)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5016 // vtableStubs also counts instructions in pd_code_size_limit.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5017 // Also do not verify_oop as this is called by verify_oop.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5018 if (Universe::narrow_oop_shift() != 0) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5019 assert(LogMinObjAlignmentInBytes == Universe::narrow_oop_shift(), "decode alg wrong");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5020 if (LogMinObjAlignmentInBytes == Address::times_8) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5021 leaq(dst, Address(r12_heapbase, src, Address::times_8, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5022 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5023 if (dst != src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5024 movq(dst, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5025 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5026 shlq(dst, LogMinObjAlignmentInBytes);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5027 if (Universe::narrow_oop_base() != NULL) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5028 addq(dst, r12_heapbase);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5029 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5030 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5031 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5032 assert (Universe::narrow_oop_base() == NULL, "sanity");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5033 if (dst != src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5034 movq(dst, src);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5035 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5036 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5037 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5038
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5039 void MacroAssembler::encode_klass_not_null(Register r) {
13000
209aa13ab8c0 8024927: Nashorn performance regression with CompressedOops
coleenp
parents: 12835
diff changeset
5040 if (Universe::narrow_klass_base() != NULL) {
209aa13ab8c0 8024927: Nashorn performance regression with CompressedOops
coleenp
parents: 12835
diff changeset
5041 // Use r12 as a scratch register in which to temporarily load the narrow_klass_base.
209aa13ab8c0 8024927: Nashorn performance regression with CompressedOops
coleenp
parents: 12835
diff changeset
5042 assert(r != r12_heapbase, "Encoding a klass in r12");
209aa13ab8c0 8024927: Nashorn performance regression with CompressedOops
coleenp
parents: 12835
diff changeset
5043 mov64(r12_heapbase, (int64_t)Universe::narrow_klass_base());
209aa13ab8c0 8024927: Nashorn performance regression with CompressedOops
coleenp
parents: 12835
diff changeset
5044 subq(r, r12_heapbase);
209aa13ab8c0 8024927: Nashorn performance regression with CompressedOops
coleenp
parents: 12835
diff changeset
5045 }
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5046 if (Universe::narrow_klass_shift() != 0) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5047 assert (LogKlassAlignmentInBytes == Universe::narrow_klass_shift(), "decode alg wrong");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5048 shrq(r, LogKlassAlignmentInBytes);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5049 }
13000
209aa13ab8c0 8024927: Nashorn performance regression with CompressedOops
coleenp
parents: 12835
diff changeset
5050 if (Universe::narrow_klass_base() != NULL) {
209aa13ab8c0 8024927: Nashorn performance regression with CompressedOops
coleenp
parents: 12835
diff changeset
5051 reinit_heapbase();
209aa13ab8c0 8024927: Nashorn performance regression with CompressedOops
coleenp
parents: 12835
diff changeset
5052 }
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5053 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5054
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5055 void MacroAssembler::encode_klass_not_null(Register dst, Register src) {
12056
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
5056 if (dst == src) {
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
5057 encode_klass_not_null(src);
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
5058 } else {
13000
209aa13ab8c0 8024927: Nashorn performance regression with CompressedOops
coleenp
parents: 12835
diff changeset
5059 if (Universe::narrow_klass_base() != NULL) {
209aa13ab8c0 8024927: Nashorn performance regression with CompressedOops
coleenp
parents: 12835
diff changeset
5060 mov64(dst, (int64_t)Universe::narrow_klass_base());
209aa13ab8c0 8024927: Nashorn performance regression with CompressedOops
coleenp
parents: 12835
diff changeset
5061 negq(dst);
209aa13ab8c0 8024927: Nashorn performance regression with CompressedOops
coleenp
parents: 12835
diff changeset
5062 addq(dst, src);
209aa13ab8c0 8024927: Nashorn performance regression with CompressedOops
coleenp
parents: 12835
diff changeset
5063 } else {
209aa13ab8c0 8024927: Nashorn performance regression with CompressedOops
coleenp
parents: 12835
diff changeset
5064 movptr(dst, src);
209aa13ab8c0 8024927: Nashorn performance regression with CompressedOops
coleenp
parents: 12835
diff changeset
5065 }
12056
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
5066 if (Universe::narrow_klass_shift() != 0) {
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
5067 assert (LogKlassAlignmentInBytes == Universe::narrow_klass_shift(), "decode alg wrong");
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
5068 shrq(dst, LogKlassAlignmentInBytes);
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
5069 }
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
5070 }
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
5071 }
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
5072
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
5073 // Function instr_size_for_decode_klass_not_null() counts the instructions
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
5074 // generated by decode_klass_not_null(register r) and reinit_heapbase(),
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
5075 // when (Universe::heap() != NULL). Hence, if the instructions they
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
5076 // generate change, then this method needs to be updated.
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
5077 int MacroAssembler::instr_size_for_decode_klass_not_null() {
12226
7944aba7ba41 8015107: NPG: Use consistent naming for metaspace concepts
ehelin
parents: 12056
diff changeset
5078 assert (UseCompressedClassPointers, "only for compressed klass ptrs");
13000
209aa13ab8c0 8024927: Nashorn performance regression with CompressedOops
coleenp
parents: 12835
diff changeset
5079 if (Universe::narrow_klass_base() != NULL) {
209aa13ab8c0 8024927: Nashorn performance regression with CompressedOops
coleenp
parents: 12835
diff changeset
5080 // mov64 + addq + shlq? + mov64 (for reinit_heapbase()).
209aa13ab8c0 8024927: Nashorn performance regression with CompressedOops
coleenp
parents: 12835
diff changeset
5081 return (Universe::narrow_klass_shift() == 0 ? 20 : 24);
209aa13ab8c0 8024927: Nashorn performance regression with CompressedOops
coleenp
parents: 12835
diff changeset
5082 } else {
209aa13ab8c0 8024927: Nashorn performance regression with CompressedOops
coleenp
parents: 12835
diff changeset
5083 // longest load decode klass function, mov64, leaq
209aa13ab8c0 8024927: Nashorn performance regression with CompressedOops
coleenp
parents: 12835
diff changeset
5084 return 16;
209aa13ab8c0 8024927: Nashorn performance regression with CompressedOops
coleenp
parents: 12835
diff changeset
5085 }
12056
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
5086 }
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
5087
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
5088 // !!! If the instructions that get generated here change then function
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
5089 // instr_size_for_decode_klass_not_null() needs to get updated.
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5090 void MacroAssembler::decode_klass_not_null(Register r) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5091 // Note: it will change flags
12226
7944aba7ba41 8015107: NPG: Use consistent naming for metaspace concepts
ehelin
parents: 12056
diff changeset
5092 assert (UseCompressedClassPointers, "should only be used for compressed headers");
12056
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
5093 assert(r != r12_heapbase, "Decoding a klass in r12");
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5094 // Cannot assert, unverified entry point counts instructions (see .ad file)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5095 // vtableStubs also counts instructions in pd_code_size_limit.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5096 // Also do not verify_oop as this is called by verify_oop.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5097 if (Universe::narrow_klass_shift() != 0) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5098 assert(LogKlassAlignmentInBytes == Universe::narrow_klass_shift(), "decode alg wrong");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5099 shlq(r, LogKlassAlignmentInBytes);
12056
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
5100 }
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
5101 // Use r12 as a scratch register in which to temporarily load the narrow_klass_base.
13000
209aa13ab8c0 8024927: Nashorn performance regression with CompressedOops
coleenp
parents: 12835
diff changeset
5102 if (Universe::narrow_klass_base() != NULL) {
209aa13ab8c0 8024927: Nashorn performance regression with CompressedOops
coleenp
parents: 12835
diff changeset
5103 mov64(r12_heapbase, (int64_t)Universe::narrow_klass_base());
209aa13ab8c0 8024927: Nashorn performance regression with CompressedOops
coleenp
parents: 12835
diff changeset
5104 addq(r, r12_heapbase);
209aa13ab8c0 8024927: Nashorn performance regression with CompressedOops
coleenp
parents: 12835
diff changeset
5105 reinit_heapbase();
209aa13ab8c0 8024927: Nashorn performance regression with CompressedOops
coleenp
parents: 12835
diff changeset
5106 }
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5107 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5108
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5109 void MacroAssembler::decode_klass_not_null(Register dst, Register src) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5110 // Note: it will change flags
12226
7944aba7ba41 8015107: NPG: Use consistent naming for metaspace concepts
ehelin
parents: 12056
diff changeset
5111 assert (UseCompressedClassPointers, "should only be used for compressed headers");
12056
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
5112 if (dst == src) {
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
5113 decode_klass_not_null(dst);
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5114 } else {
12056
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
5115 // Cannot assert, unverified entry point counts instructions (see .ad file)
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
5116 // vtableStubs also counts instructions in pd_code_size_limit.
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
5117 // Also do not verify_oop as this is called by verify_oop.
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
5118 mov64(dst, (int64_t)Universe::narrow_klass_base());
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
5119 if (Universe::narrow_klass_shift() != 0) {
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
5120 assert(LogKlassAlignmentInBytes == Universe::narrow_klass_shift(), "decode alg wrong");
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
5121 assert(LogKlassAlignmentInBytes == Address::times_8, "klass not aligned on 64bits?");
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
5122 leaq(dst, Address(dst, src, Address::times_8, 0));
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
5123 } else {
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
5124 addq(dst, src);
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5125 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5126 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5127 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5128
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5129 void MacroAssembler::set_narrow_oop(Register dst, jobject obj) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5130 assert (UseCompressedOops, "should only be used for compressed headers");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5131 assert (Universe::heap() != NULL, "java heap should be initialized");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5132 assert (oop_recorder() != NULL, "this assembler needs an OopRecorder");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5133 int oop_index = oop_recorder()->find_index(obj);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5134 RelocationHolder rspec = oop_Relocation::spec(oop_index);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5135 mov_narrow_oop(dst, oop_index, rspec);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5136 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5137
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5138 void MacroAssembler::set_narrow_oop(Address dst, jobject obj) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5139 assert (UseCompressedOops, "should only be used for compressed headers");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5140 assert (Universe::heap() != NULL, "java heap should be initialized");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5141 assert (oop_recorder() != NULL, "this assembler needs an OopRecorder");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5142 int oop_index = oop_recorder()->find_index(obj);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5143 RelocationHolder rspec = oop_Relocation::spec(oop_index);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5144 mov_narrow_oop(dst, oop_index, rspec);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5145 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5146
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5147 void MacroAssembler::set_narrow_klass(Register dst, Klass* k) {
12226
7944aba7ba41 8015107: NPG: Use consistent naming for metaspace concepts
ehelin
parents: 12056
diff changeset
5148 assert (UseCompressedClassPointers, "should only be used for compressed headers");
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5149 assert (oop_recorder() != NULL, "this assembler needs an OopRecorder");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5150 int klass_index = oop_recorder()->find_index(k);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5151 RelocationHolder rspec = metadata_Relocation::spec(klass_index);
12056
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
5152 mov_narrow_oop(dst, Klass::encode_klass(k), rspec);
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5153 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5154
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5155 void MacroAssembler::set_narrow_klass(Address dst, Klass* k) {
12226
7944aba7ba41 8015107: NPG: Use consistent naming for metaspace concepts
ehelin
parents: 12056
diff changeset
5156 assert (UseCompressedClassPointers, "should only be used for compressed headers");
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5157 assert (oop_recorder() != NULL, "this assembler needs an OopRecorder");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5158 int klass_index = oop_recorder()->find_index(k);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5159 RelocationHolder rspec = metadata_Relocation::spec(klass_index);
12056
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
5160 mov_narrow_oop(dst, Klass::encode_klass(k), rspec);
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5161 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5162
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5163 void MacroAssembler::cmp_narrow_oop(Register dst, jobject obj) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5164 assert (UseCompressedOops, "should only be used for compressed headers");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5165 assert (Universe::heap() != NULL, "java heap should be initialized");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5166 assert (oop_recorder() != NULL, "this assembler needs an OopRecorder");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5167 int oop_index = oop_recorder()->find_index(obj);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5168 RelocationHolder rspec = oop_Relocation::spec(oop_index);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5169 Assembler::cmp_narrow_oop(dst, oop_index, rspec);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5170 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5171
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5172 void MacroAssembler::cmp_narrow_oop(Address dst, jobject obj) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5173 assert (UseCompressedOops, "should only be used for compressed headers");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5174 assert (Universe::heap() != NULL, "java heap should be initialized");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5175 assert (oop_recorder() != NULL, "this assembler needs an OopRecorder");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5176 int oop_index = oop_recorder()->find_index(obj);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5177 RelocationHolder rspec = oop_Relocation::spec(oop_index);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5178 Assembler::cmp_narrow_oop(dst, oop_index, rspec);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5179 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5180
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5181 void MacroAssembler::cmp_narrow_klass(Register dst, Klass* k) {
12226
7944aba7ba41 8015107: NPG: Use consistent naming for metaspace concepts
ehelin
parents: 12056
diff changeset
5182 assert (UseCompressedClassPointers, "should only be used for compressed headers");
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5183 assert (oop_recorder() != NULL, "this assembler needs an OopRecorder");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5184 int klass_index = oop_recorder()->find_index(k);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5185 RelocationHolder rspec = metadata_Relocation::spec(klass_index);
12056
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
5186 Assembler::cmp_narrow_oop(dst, Klass::encode_klass(k), rspec);
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5187 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5188
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5189 void MacroAssembler::cmp_narrow_klass(Address dst, Klass* k) {
12226
7944aba7ba41 8015107: NPG: Use consistent naming for metaspace concepts
ehelin
parents: 12056
diff changeset
5190 assert (UseCompressedClassPointers, "should only be used for compressed headers");
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5191 assert (oop_recorder() != NULL, "this assembler needs an OopRecorder");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5192 int klass_index = oop_recorder()->find_index(k);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5193 RelocationHolder rspec = metadata_Relocation::spec(klass_index);
12056
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
5194 Assembler::cmp_narrow_oop(dst, Klass::encode_klass(k), rspec);
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5195 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5196
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5197 void MacroAssembler::reinit_heapbase() {
12226
7944aba7ba41 8015107: NPG: Use consistent naming for metaspace concepts
ehelin
parents: 12056
diff changeset
5198 if (UseCompressedOops || UseCompressedClassPointers) {
12056
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
5199 if (Universe::heap() != NULL) {
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
5200 if (Universe::narrow_oop_base() == NULL) {
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
5201 MacroAssembler::xorptr(r12_heapbase, r12_heapbase);
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
5202 } else {
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
5203 mov64(r12_heapbase, (int64_t)Universe::narrow_ptrs_base());
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
5204 }
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
5205 } else {
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
5206 movptr(r12_heapbase, ExternalAddress((address)Universe::narrow_ptrs_base_addr()));
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
5207 }
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
5208 }
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
5209 }
740e263c80c6 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 11080
diff changeset
5210
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5211 #endif // _LP64
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5212
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5213
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5214 // C2 compiled method's prolog code.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5215 void MacroAssembler::verified_entry(int framesize, bool stack_bang, bool fp_mode_24b) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5216
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5217 // WARNING: Initial instruction MUST be 5 bytes or longer so that
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5218 // NativeJump::patch_verified_entry will be able to patch out the entry
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5219 // code safely. The push to verify stack depth is ok at 5 bytes,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5220 // the frame allocation can be either 3 or 6 bytes. So if we don't do
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5221 // stack bang then we must use the 6 byte frame allocation even if
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5222 // we have no frame. :-(
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5223
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5224 assert((framesize & (StackAlignmentInBytes-1)) == 0, "frame size not aligned");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5225 // Remove word for return addr
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5226 framesize -= wordSize;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5227
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5228 // Calls to C2R adapters often do not accept exceptional returns.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5229 // We require that their callers must bang for them. But be careful, because
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5230 // some VM calls (such as call site linkage) can use several kilobytes of
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5231 // stack. But the stack safety zone should account for that.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5232 // See bugs 4446381, 4468289, 4497237.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5233 if (stack_bang) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5234 generate_stack_overflow_check(framesize);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5235
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5236 // We always push rbp, so that on return to interpreter rbp, will be
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5237 // restored correctly and we can correct the stack.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5238 push(rbp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5239 // Remove word for ebp
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5240 framesize -= wordSize;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5241
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5242 // Create frame
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5243 if (framesize) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5244 subptr(rsp, framesize);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5245 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5246 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5247 // Create frame (force generation of a 4 byte immediate value)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5248 subptr_imm32(rsp, framesize);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5249
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5250 // Save RBP register now.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5251 framesize -= wordSize;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5252 movptr(Address(rsp, framesize), rbp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5253 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5254
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5255 if (VerifyStackAtCalls) { // Majik cookie to verify stack depth
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5256 framesize -= wordSize;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5257 movptr(Address(rsp, framesize), (int32_t)0xbadb100d);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5258 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5259
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5260 #ifndef _LP64
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5261 // If method sets FPU control word do it now
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5262 if (fp_mode_24b) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5263 fldcw(ExternalAddress(StubRoutines::addr_fpu_cntrl_wrd_24()));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5264 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5265 if (UseSSE >= 2 && VerifyFPU) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5266 verify_FPU(0, "FPU stack must be clean on entry");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5267 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5268 #endif
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5269
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5270 #ifdef ASSERT
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5271 if (VerifyStackAtCalls) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5272 Label L;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5273 push(rax);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5274 mov(rax, rsp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5275 andptr(rax, StackAlignmentInBytes-1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5276 cmpptr(rax, StackAlignmentInBytes-wordSize);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5277 pop(rax);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5278 jcc(Assembler::equal, L);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5279 STOP("Stack is not properly aligned!");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5280 bind(L);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5281 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5282 #endif
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5283
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5284 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5285
7474
00af3a3a8df4 8005522: use fast-string instructions on x86 for zeroing
kvn
parents: 7430
diff changeset
5286 void MacroAssembler::clear_mem(Register base, Register cnt, Register tmp) {
00af3a3a8df4 8005522: use fast-string instructions on x86 for zeroing
kvn
parents: 7430
diff changeset
5287 // cnt - number of qwords (8-byte words).
00af3a3a8df4 8005522: use fast-string instructions on x86 for zeroing
kvn
parents: 7430
diff changeset
5288 // base - start address, qword aligned.
00af3a3a8df4 8005522: use fast-string instructions on x86 for zeroing
kvn
parents: 7430
diff changeset
5289 assert(base==rdi, "base register must be edi for rep stos");
00af3a3a8df4 8005522: use fast-string instructions on x86 for zeroing
kvn
parents: 7430
diff changeset
5290 assert(tmp==rax, "tmp register must be eax for rep stos");
00af3a3a8df4 8005522: use fast-string instructions on x86 for zeroing
kvn
parents: 7430
diff changeset
5291 assert(cnt==rcx, "cnt register must be ecx for rep stos");
00af3a3a8df4 8005522: use fast-string instructions on x86 for zeroing
kvn
parents: 7430
diff changeset
5292
00af3a3a8df4 8005522: use fast-string instructions on x86 for zeroing
kvn
parents: 7430
diff changeset
5293 xorptr(tmp, tmp);
00af3a3a8df4 8005522: use fast-string instructions on x86 for zeroing
kvn
parents: 7430
diff changeset
5294 if (UseFastStosb) {
00af3a3a8df4 8005522: use fast-string instructions on x86 for zeroing
kvn
parents: 7430
diff changeset
5295 shlptr(cnt,3); // convert to number of bytes
00af3a3a8df4 8005522: use fast-string instructions on x86 for zeroing
kvn
parents: 7430
diff changeset
5296 rep_stosb();
00af3a3a8df4 8005522: use fast-string instructions on x86 for zeroing
kvn
parents: 7430
diff changeset
5297 } else {
00af3a3a8df4 8005522: use fast-string instructions on x86 for zeroing
kvn
parents: 7430
diff changeset
5298 NOT_LP64(shlptr(cnt,1);) // convert to number of dwords for 32-bit VM
00af3a3a8df4 8005522: use fast-string instructions on x86 for zeroing
kvn
parents: 7430
diff changeset
5299 rep_stos();
00af3a3a8df4 8005522: use fast-string instructions on x86 for zeroing
kvn
parents: 7430
diff changeset
5300 }
00af3a3a8df4 8005522: use fast-string instructions on x86 for zeroing
kvn
parents: 7430
diff changeset
5301 }
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5302
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5303 // IndexOf for constant substrings with size >= 8 chars
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5304 // which don't need to be loaded through stack.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5305 void MacroAssembler::string_indexofC8(Register str1, Register str2,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5306 Register cnt1, Register cnt2,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5307 int int_cnt2, Register result,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5308 XMMRegister vec, Register tmp) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5309 ShortBranchVerifier sbv(this);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5310 assert(UseSSE42Intrinsics, "SSE4.2 is required");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5311
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5312 // This method uses pcmpestri inxtruction with bound registers
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5313 // inputs:
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5314 // xmm - substring
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5315 // rax - substring length (elements count)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5316 // mem - scanned string
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5317 // rdx - string length (elements count)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5318 // 0xd - mode: 1100 (substring search) + 01 (unsigned shorts)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5319 // outputs:
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5320 // rcx - matched index in string
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5321 assert(cnt1 == rdx && cnt2 == rax && tmp == rcx, "pcmpestri");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5322
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5323 Label RELOAD_SUBSTR, SCAN_TO_SUBSTR, SCAN_SUBSTR,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5324 RET_FOUND, RET_NOT_FOUND, EXIT, FOUND_SUBSTR,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5325 MATCH_SUBSTR_HEAD, RELOAD_STR, FOUND_CANDIDATE;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5326
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5327 // Note, inline_string_indexOf() generates checks:
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5328 // if (substr.count > string.count) return -1;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5329 // if (substr.count == 0) return 0;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5330 assert(int_cnt2 >= 8, "this code isused only for cnt2 >= 8 chars");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5331
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5332 // Load substring.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5333 movdqu(vec, Address(str2, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5334 movl(cnt2, int_cnt2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5335 movptr(result, str1); // string addr
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5336
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5337 if (int_cnt2 > 8) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5338 jmpb(SCAN_TO_SUBSTR);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5339
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5340 // Reload substr for rescan, this code
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5341 // is executed only for large substrings (> 8 chars)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5342 bind(RELOAD_SUBSTR);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5343 movdqu(vec, Address(str2, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5344 negptr(cnt2); // Jumped here with negative cnt2, convert to positive
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5345
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5346 bind(RELOAD_STR);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5347 // We came here after the beginning of the substring was
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5348 // matched but the rest of it was not so we need to search
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5349 // again. Start from the next element after the previous match.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5350
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5351 // cnt2 is number of substring reminding elements and
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5352 // cnt1 is number of string reminding elements when cmp failed.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5353 // Restored cnt1 = cnt1 - cnt2 + int_cnt2
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5354 subl(cnt1, cnt2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5355 addl(cnt1, int_cnt2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5356 movl(cnt2, int_cnt2); // Now restore cnt2
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5357
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5358 decrementl(cnt1); // Shift to next element
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5359 cmpl(cnt1, cnt2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5360 jccb(Assembler::negative, RET_NOT_FOUND); // Left less then substring
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5361
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5362 addptr(result, 2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5363
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5364 } // (int_cnt2 > 8)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5365
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5366 // Scan string for start of substr in 16-byte vectors
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5367 bind(SCAN_TO_SUBSTR);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5368 pcmpestri(vec, Address(result, 0), 0x0d);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5369 jccb(Assembler::below, FOUND_CANDIDATE); // CF == 1
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5370 subl(cnt1, 8);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5371 jccb(Assembler::lessEqual, RET_NOT_FOUND); // Scanned full string
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5372 cmpl(cnt1, cnt2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5373 jccb(Assembler::negative, RET_NOT_FOUND); // Left less then substring
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5374 addptr(result, 16);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5375 jmpb(SCAN_TO_SUBSTR);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5376
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5377 // Found a potential substr
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5378 bind(FOUND_CANDIDATE);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5379 // Matched whole vector if first element matched (tmp(rcx) == 0).
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5380 if (int_cnt2 == 8) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5381 jccb(Assembler::overflow, RET_FOUND); // OF == 1
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5382 } else { // int_cnt2 > 8
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5383 jccb(Assembler::overflow, FOUND_SUBSTR);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5384 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5385 // After pcmpestri tmp(rcx) contains matched element index
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5386 // Compute start addr of substr
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5387 lea(result, Address(result, tmp, Address::times_2));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5388
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5389 // Make sure string is still long enough
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5390 subl(cnt1, tmp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5391 cmpl(cnt1, cnt2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5392 if (int_cnt2 == 8) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5393 jccb(Assembler::greaterEqual, SCAN_TO_SUBSTR);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5394 } else { // int_cnt2 > 8
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5395 jccb(Assembler::greaterEqual, MATCH_SUBSTR_HEAD);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5396 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5397 // Left less then substring.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5398
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5399 bind(RET_NOT_FOUND);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5400 movl(result, -1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5401 jmpb(EXIT);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5402
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5403 if (int_cnt2 > 8) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5404 // This code is optimized for the case when whole substring
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5405 // is matched if its head is matched.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5406 bind(MATCH_SUBSTR_HEAD);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5407 pcmpestri(vec, Address(result, 0), 0x0d);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5408 // Reload only string if does not match
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5409 jccb(Assembler::noOverflow, RELOAD_STR); // OF == 0
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5410
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5411 Label CONT_SCAN_SUBSTR;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5412 // Compare the rest of substring (> 8 chars).
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5413 bind(FOUND_SUBSTR);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5414 // First 8 chars are already matched.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5415 negptr(cnt2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5416 addptr(cnt2, 8);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5417
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5418 bind(SCAN_SUBSTR);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5419 subl(cnt1, 8);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5420 cmpl(cnt2, -8); // Do not read beyond substring
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5421 jccb(Assembler::lessEqual, CONT_SCAN_SUBSTR);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5422 // Back-up strings to avoid reading beyond substring:
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5423 // cnt1 = cnt1 - cnt2 + 8
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5424 addl(cnt1, cnt2); // cnt2 is negative
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5425 addl(cnt1, 8);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5426 movl(cnt2, 8); negptr(cnt2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5427 bind(CONT_SCAN_SUBSTR);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5428 if (int_cnt2 < (int)G) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5429 movdqu(vec, Address(str2, cnt2, Address::times_2, int_cnt2*2));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5430 pcmpestri(vec, Address(result, cnt2, Address::times_2, int_cnt2*2), 0x0d);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5431 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5432 // calculate index in register to avoid integer overflow (int_cnt2*2)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5433 movl(tmp, int_cnt2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5434 addptr(tmp, cnt2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5435 movdqu(vec, Address(str2, tmp, Address::times_2, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5436 pcmpestri(vec, Address(result, tmp, Address::times_2, 0), 0x0d);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5437 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5438 // Need to reload strings pointers if not matched whole vector
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5439 jcc(Assembler::noOverflow, RELOAD_SUBSTR); // OF == 0
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5440 addptr(cnt2, 8);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5441 jcc(Assembler::negative, SCAN_SUBSTR);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5442 // Fall through if found full substring
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5443
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5444 } // (int_cnt2 > 8)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5445
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5446 bind(RET_FOUND);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5447 // Found result if we matched full small substring.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5448 // Compute substr offset
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5449 subptr(result, str1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5450 shrl(result, 1); // index
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5451 bind(EXIT);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5452
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5453 } // string_indexofC8
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5454
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5455 // Small strings are loaded through stack if they cross page boundary.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5456 void MacroAssembler::string_indexof(Register str1, Register str2,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5457 Register cnt1, Register cnt2,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5458 int int_cnt2, Register result,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5459 XMMRegister vec, Register tmp) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5460 ShortBranchVerifier sbv(this);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5461 assert(UseSSE42Intrinsics, "SSE4.2 is required");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5462 //
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5463 // int_cnt2 is length of small (< 8 chars) constant substring
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5464 // or (-1) for non constant substring in which case its length
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5465 // is in cnt2 register.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5466 //
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5467 // Note, inline_string_indexOf() generates checks:
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5468 // if (substr.count > string.count) return -1;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5469 // if (substr.count == 0) return 0;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5470 //
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5471 assert(int_cnt2 == -1 || (0 < int_cnt2 && int_cnt2 < 8), "should be != 0");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5472
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5473 // This method uses pcmpestri inxtruction with bound registers
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5474 // inputs:
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5475 // xmm - substring
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5476 // rax - substring length (elements count)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5477 // mem - scanned string
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5478 // rdx - string length (elements count)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5479 // 0xd - mode: 1100 (substring search) + 01 (unsigned shorts)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5480 // outputs:
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5481 // rcx - matched index in string
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5482 assert(cnt1 == rdx && cnt2 == rax && tmp == rcx, "pcmpestri");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5483
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5484 Label RELOAD_SUBSTR, SCAN_TO_SUBSTR, SCAN_SUBSTR, ADJUST_STR,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5485 RET_FOUND, RET_NOT_FOUND, CLEANUP, FOUND_SUBSTR,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5486 FOUND_CANDIDATE;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5487
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5488 { //========================================================
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5489 // We don't know where these strings are located
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5490 // and we can't read beyond them. Load them through stack.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5491 Label BIG_STRINGS, CHECK_STR, COPY_SUBSTR, COPY_STR;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5492
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5493 movptr(tmp, rsp); // save old SP
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5494
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5495 if (int_cnt2 > 0) { // small (< 8 chars) constant substring
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5496 if (int_cnt2 == 1) { // One char
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5497 load_unsigned_short(result, Address(str2, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5498 movdl(vec, result); // move 32 bits
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5499 } else if (int_cnt2 == 2) { // Two chars
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5500 movdl(vec, Address(str2, 0)); // move 32 bits
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5501 } else if (int_cnt2 == 4) { // Four chars
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5502 movq(vec, Address(str2, 0)); // move 64 bits
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5503 } else { // cnt2 = { 3, 5, 6, 7 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5504 // Array header size is 12 bytes in 32-bit VM
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5505 // + 6 bytes for 3 chars == 18 bytes,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5506 // enough space to load vec and shift.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5507 assert(HeapWordSize*TypeArrayKlass::header_size() >= 12,"sanity");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5508 movdqu(vec, Address(str2, (int_cnt2*2)-16));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5509 psrldq(vec, 16-(int_cnt2*2));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5510 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5511 } else { // not constant substring
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5512 cmpl(cnt2, 8);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5513 jccb(Assembler::aboveEqual, BIG_STRINGS); // Both strings are big enough
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5514
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5515 // We can read beyond string if srt+16 does not cross page boundary
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5516 // since heaps are aligned and mapped by pages.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5517 assert(os::vm_page_size() < (int)G, "default page should be small");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5518 movl(result, str2); // We need only low 32 bits
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5519 andl(result, (os::vm_page_size()-1));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5520 cmpl(result, (os::vm_page_size()-16));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5521 jccb(Assembler::belowEqual, CHECK_STR);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5522
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5523 // Move small strings to stack to allow load 16 bytes into vec.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5524 subptr(rsp, 16);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5525 int stk_offset = wordSize-2;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5526 push(cnt2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5527
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5528 bind(COPY_SUBSTR);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5529 load_unsigned_short(result, Address(str2, cnt2, Address::times_2, -2));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5530 movw(Address(rsp, cnt2, Address::times_2, stk_offset), result);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5531 decrement(cnt2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5532 jccb(Assembler::notZero, COPY_SUBSTR);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5533
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5534 pop(cnt2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5535 movptr(str2, rsp); // New substring address
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5536 } // non constant
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5537
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5538 bind(CHECK_STR);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5539 cmpl(cnt1, 8);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5540 jccb(Assembler::aboveEqual, BIG_STRINGS);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5541
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5542 // Check cross page boundary.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5543 movl(result, str1); // We need only low 32 bits
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5544 andl(result, (os::vm_page_size()-1));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5545 cmpl(result, (os::vm_page_size()-16));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5546 jccb(Assembler::belowEqual, BIG_STRINGS);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5547
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5548 subptr(rsp, 16);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5549 int stk_offset = -2;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5550 if (int_cnt2 < 0) { // not constant
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5551 push(cnt2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5552 stk_offset += wordSize;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5553 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5554 movl(cnt2, cnt1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5555
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5556 bind(COPY_STR);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5557 load_unsigned_short(result, Address(str1, cnt2, Address::times_2, -2));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5558 movw(Address(rsp, cnt2, Address::times_2, stk_offset), result);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5559 decrement(cnt2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5560 jccb(Assembler::notZero, COPY_STR);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5561
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5562 if (int_cnt2 < 0) { // not constant
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5563 pop(cnt2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5564 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5565 movptr(str1, rsp); // New string address
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5566
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5567 bind(BIG_STRINGS);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5568 // Load substring.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5569 if (int_cnt2 < 0) { // -1
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5570 movdqu(vec, Address(str2, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5571 push(cnt2); // substr count
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5572 push(str2); // substr addr
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5573 push(str1); // string addr
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5574 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5575 // Small (< 8 chars) constant substrings are loaded already.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5576 movl(cnt2, int_cnt2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5577 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5578 push(tmp); // original SP
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5579
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5580 } // Finished loading
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5581
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5582 //========================================================
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5583 // Start search
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5584 //
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5585
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5586 movptr(result, str1); // string addr
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5587
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5588 if (int_cnt2 < 0) { // Only for non constant substring
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5589 jmpb(SCAN_TO_SUBSTR);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5590
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5591 // SP saved at sp+0
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5592 // String saved at sp+1*wordSize
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5593 // Substr saved at sp+2*wordSize
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5594 // Substr count saved at sp+3*wordSize
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5595
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5596 // Reload substr for rescan, this code
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5597 // is executed only for large substrings (> 8 chars)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5598 bind(RELOAD_SUBSTR);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5599 movptr(str2, Address(rsp, 2*wordSize));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5600 movl(cnt2, Address(rsp, 3*wordSize));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5601 movdqu(vec, Address(str2, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5602 // We came here after the beginning of the substring was
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5603 // matched but the rest of it was not so we need to search
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5604 // again. Start from the next element after the previous match.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5605 subptr(str1, result); // Restore counter
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5606 shrl(str1, 1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5607 addl(cnt1, str1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5608 decrementl(cnt1); // Shift to next element
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5609 cmpl(cnt1, cnt2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5610 jccb(Assembler::negative, RET_NOT_FOUND); // Left less then substring
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5611
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5612 addptr(result, 2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5613 } // non constant
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5614
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5615 // Scan string for start of substr in 16-byte vectors
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5616 bind(SCAN_TO_SUBSTR);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5617 assert(cnt1 == rdx && cnt2 == rax && tmp == rcx, "pcmpestri");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5618 pcmpestri(vec, Address(result, 0), 0x0d);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5619 jccb(Assembler::below, FOUND_CANDIDATE); // CF == 1
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5620 subl(cnt1, 8);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5621 jccb(Assembler::lessEqual, RET_NOT_FOUND); // Scanned full string
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5622 cmpl(cnt1, cnt2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5623 jccb(Assembler::negative, RET_NOT_FOUND); // Left less then substring
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5624 addptr(result, 16);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5625
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5626 bind(ADJUST_STR);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5627 cmpl(cnt1, 8); // Do not read beyond string
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5628 jccb(Assembler::greaterEqual, SCAN_TO_SUBSTR);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5629 // Back-up string to avoid reading beyond string.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5630 lea(result, Address(result, cnt1, Address::times_2, -16));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5631 movl(cnt1, 8);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5632 jmpb(SCAN_TO_SUBSTR);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5633
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5634 // Found a potential substr
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5635 bind(FOUND_CANDIDATE);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5636 // After pcmpestri tmp(rcx) contains matched element index
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5637
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5638 // Make sure string is still long enough
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5639 subl(cnt1, tmp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5640 cmpl(cnt1, cnt2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5641 jccb(Assembler::greaterEqual, FOUND_SUBSTR);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5642 // Left less then substring.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5643
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5644 bind(RET_NOT_FOUND);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5645 movl(result, -1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5646 jmpb(CLEANUP);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5647
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5648 bind(FOUND_SUBSTR);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5649 // Compute start addr of substr
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5650 lea(result, Address(result, tmp, Address::times_2));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5651
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5652 if (int_cnt2 > 0) { // Constant substring
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5653 // Repeat search for small substring (< 8 chars)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5654 // from new point without reloading substring.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5655 // Have to check that we don't read beyond string.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5656 cmpl(tmp, 8-int_cnt2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5657 jccb(Assembler::greater, ADJUST_STR);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5658 // Fall through if matched whole substring.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5659 } else { // non constant
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5660 assert(int_cnt2 == -1, "should be != 0");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5661
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5662 addl(tmp, cnt2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5663 // Found result if we matched whole substring.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5664 cmpl(tmp, 8);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5665 jccb(Assembler::lessEqual, RET_FOUND);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5666
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5667 // Repeat search for small substring (<= 8 chars)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5668 // from new point 'str1' without reloading substring.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5669 cmpl(cnt2, 8);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5670 // Have to check that we don't read beyond string.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5671 jccb(Assembler::lessEqual, ADJUST_STR);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5672
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5673 Label CHECK_NEXT, CONT_SCAN_SUBSTR, RET_FOUND_LONG;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5674 // Compare the rest of substring (> 8 chars).
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5675 movptr(str1, result);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5676
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5677 cmpl(tmp, cnt2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5678 // First 8 chars are already matched.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5679 jccb(Assembler::equal, CHECK_NEXT);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5680
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5681 bind(SCAN_SUBSTR);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5682 pcmpestri(vec, Address(str1, 0), 0x0d);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5683 // Need to reload strings pointers if not matched whole vector
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5684 jcc(Assembler::noOverflow, RELOAD_SUBSTR); // OF == 0
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5685
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5686 bind(CHECK_NEXT);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5687 subl(cnt2, 8);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5688 jccb(Assembler::lessEqual, RET_FOUND_LONG); // Found full substring
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5689 addptr(str1, 16);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5690 addptr(str2, 16);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5691 subl(cnt1, 8);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5692 cmpl(cnt2, 8); // Do not read beyond substring
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5693 jccb(Assembler::greaterEqual, CONT_SCAN_SUBSTR);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5694 // Back-up strings to avoid reading beyond substring.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5695 lea(str2, Address(str2, cnt2, Address::times_2, -16));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5696 lea(str1, Address(str1, cnt2, Address::times_2, -16));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5697 subl(cnt1, cnt2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5698 movl(cnt2, 8);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5699 addl(cnt1, 8);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5700 bind(CONT_SCAN_SUBSTR);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5701 movdqu(vec, Address(str2, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5702 jmpb(SCAN_SUBSTR);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5703
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5704 bind(RET_FOUND_LONG);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5705 movptr(str1, Address(rsp, wordSize));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5706 } // non constant
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5707
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5708 bind(RET_FOUND);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5709 // Compute substr offset
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5710 subptr(result, str1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5711 shrl(result, 1); // index
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5712
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5713 bind(CLEANUP);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5714 pop(rsp); // restore SP
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5715
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5716 } // string_indexof
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5717
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5718 // Compare strings.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5719 void MacroAssembler::string_compare(Register str1, Register str2,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5720 Register cnt1, Register cnt2, Register result,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5721 XMMRegister vec1) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5722 ShortBranchVerifier sbv(this);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5723 Label LENGTH_DIFF_LABEL, POP_LABEL, DONE_LABEL, WHILE_HEAD_LABEL;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5724
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5725 // Compute the minimum of the string lengths and the
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5726 // difference of the string lengths (stack).
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5727 // Do the conditional move stuff
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5728 movl(result, cnt1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5729 subl(cnt1, cnt2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5730 push(cnt1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5731 cmov32(Assembler::lessEqual, cnt2, result);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5732
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5733 // Is the minimum length zero?
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5734 testl(cnt2, cnt2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5735 jcc(Assembler::zero, LENGTH_DIFF_LABEL);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5736
7477
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5737 // Compare first characters
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5738 load_unsigned_short(result, Address(str1, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5739 load_unsigned_short(cnt1, Address(str2, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5740 subl(result, cnt1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5741 jcc(Assembler::notZero, POP_LABEL);
7477
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5742 cmpl(cnt2, 1);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5743 jcc(Assembler::equal, LENGTH_DIFF_LABEL);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5744
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5745 // Check if the strings start at the same location.
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5746 cmpptr(str1, str2);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5747 jcc(Assembler::equal, LENGTH_DIFF_LABEL);
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5748
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5749 Address::ScaleFactor scale = Address::times_2;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5750 int stride = 8;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5751
8042
91a23b11d8dc 8007708: compiler/6855215 assert(VM_Version::supports_sse4_2())
kvn
parents: 8002
diff changeset
5752 if (UseAVX >= 2 && UseSSE42Intrinsics) {
7477
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5753 Label COMPARE_WIDE_VECTORS, VECTOR_NOT_EQUAL, COMPARE_WIDE_TAIL, COMPARE_SMALL_STR;
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5754 Label COMPARE_WIDE_VECTORS_LOOP, COMPARE_16_CHARS, COMPARE_INDEX_CHAR;
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5755 Label COMPARE_TAIL_LONG;
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5756 int pcmpmask = 0x19;
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5757
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5758 // Setup to compare 16-chars (32-bytes) vectors,
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5759 // start from first character again because it has aligned address.
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5760 int stride2 = 16;
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5761 int adr_stride = stride << scale;
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5762 int adr_stride2 = stride2 << scale;
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5763
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5764 assert(result == rax && cnt2 == rdx && cnt1 == rcx, "pcmpestri");
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5765 // rax and rdx are used by pcmpestri as elements counters
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5766 movl(result, cnt2);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5767 andl(cnt2, ~(stride2-1)); // cnt2 holds the vector count
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5768 jcc(Assembler::zero, COMPARE_TAIL_LONG);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5769
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5770 // fast path : compare first 2 8-char vectors.
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5771 bind(COMPARE_16_CHARS);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5772 movdqu(vec1, Address(str1, 0));
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5773 pcmpestri(vec1, Address(str2, 0), pcmpmask);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5774 jccb(Assembler::below, COMPARE_INDEX_CHAR);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5775
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5776 movdqu(vec1, Address(str1, adr_stride));
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5777 pcmpestri(vec1, Address(str2, adr_stride), pcmpmask);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5778 jccb(Assembler::aboveEqual, COMPARE_WIDE_VECTORS);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5779 addl(cnt1, stride);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5780
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5781 // Compare the characters at index in cnt1
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5782 bind(COMPARE_INDEX_CHAR); //cnt1 has the offset of the mismatching character
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5783 load_unsigned_short(result, Address(str1, cnt1, scale));
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5784 load_unsigned_short(cnt2, Address(str2, cnt1, scale));
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5785 subl(result, cnt2);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5786 jmp(POP_LABEL);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5787
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5788 // Setup the registers to start vector comparison loop
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5789 bind(COMPARE_WIDE_VECTORS);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5790 lea(str1, Address(str1, result, scale));
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5791 lea(str2, Address(str2, result, scale));
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5792 subl(result, stride2);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5793 subl(cnt2, stride2);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5794 jccb(Assembler::zero, COMPARE_WIDE_TAIL);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5795 negptr(result);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5796
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5797 // In a loop, compare 16-chars (32-bytes) at once using (vpxor+vptest)
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5798 bind(COMPARE_WIDE_VECTORS_LOOP);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5799 vmovdqu(vec1, Address(str1, result, scale));
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5800 vpxor(vec1, Address(str2, result, scale));
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5801 vptest(vec1, vec1);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5802 jccb(Assembler::notZero, VECTOR_NOT_EQUAL);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5803 addptr(result, stride2);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5804 subl(cnt2, stride2);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5805 jccb(Assembler::notZero, COMPARE_WIDE_VECTORS_LOOP);
8873
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 8767
diff changeset
5806 // clean upper bits of YMM registers
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 8767
diff changeset
5807 vzeroupper();
7477
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5808
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5809 // compare wide vectors tail
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5810 bind(COMPARE_WIDE_TAIL);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5811 testptr(result, result);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5812 jccb(Assembler::zero, LENGTH_DIFF_LABEL);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5813
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5814 movl(result, stride2);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5815 movl(cnt2, result);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5816 negptr(result);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5817 jmpb(COMPARE_WIDE_VECTORS_LOOP);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5818
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5819 // Identifies the mismatching (higher or lower)16-bytes in the 32-byte vectors.
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5820 bind(VECTOR_NOT_EQUAL);
8873
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 8767
diff changeset
5821 // clean upper bits of YMM registers
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 8767
diff changeset
5822 vzeroupper();
7477
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5823 lea(str1, Address(str1, result, scale));
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5824 lea(str2, Address(str2, result, scale));
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5825 jmp(COMPARE_16_CHARS);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5826
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5827 // Compare tail chars, length between 1 to 15 chars
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5828 bind(COMPARE_TAIL_LONG);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5829 movl(cnt2, result);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5830 cmpl(cnt2, stride);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5831 jccb(Assembler::less, COMPARE_SMALL_STR);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5832
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5833 movdqu(vec1, Address(str1, 0));
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5834 pcmpestri(vec1, Address(str2, 0), pcmpmask);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5835 jcc(Assembler::below, COMPARE_INDEX_CHAR);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5836 subptr(cnt2, stride);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5837 jccb(Assembler::zero, LENGTH_DIFF_LABEL);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5838 lea(str1, Address(str1, result, scale));
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5839 lea(str2, Address(str2, result, scale));
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5840 negptr(cnt2);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5841 jmpb(WHILE_HEAD_LABEL);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5842
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5843 bind(COMPARE_SMALL_STR);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5844 } else if (UseSSE42Intrinsics) {
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5845 Label COMPARE_WIDE_VECTORS, VECTOR_NOT_EQUAL, COMPARE_TAIL;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5846 int pcmpmask = 0x19;
7477
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5847 // Setup to compare 8-char (16-byte) vectors,
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5848 // start from first character again because it has aligned address.
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5849 movl(result, cnt2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5850 andl(cnt2, ~(stride - 1)); // cnt2 holds the vector count
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5851 jccb(Assembler::zero, COMPARE_TAIL);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5852
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5853 lea(str1, Address(str1, result, scale));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5854 lea(str2, Address(str2, result, scale));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5855 negptr(result);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5856
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5857 // pcmpestri
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5858 // inputs:
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5859 // vec1- substring
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5860 // rax - negative string length (elements count)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5861 // mem - scaned string
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5862 // rdx - string length (elements count)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5863 // pcmpmask - cmp mode: 11000 (string compare with negated result)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5864 // + 00 (unsigned bytes) or + 01 (unsigned shorts)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5865 // outputs:
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5866 // rcx - first mismatched element index
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5867 assert(result == rax && cnt2 == rdx && cnt1 == rcx, "pcmpestri");
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5868
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5869 bind(COMPARE_WIDE_VECTORS);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5870 movdqu(vec1, Address(str1, result, scale));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5871 pcmpestri(vec1, Address(str2, result, scale), pcmpmask);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5872 // After pcmpestri cnt1(rcx) contains mismatched element index
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5873
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5874 jccb(Assembler::below, VECTOR_NOT_EQUAL); // CF==1
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5875 addptr(result, stride);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5876 subptr(cnt2, stride);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5877 jccb(Assembler::notZero, COMPARE_WIDE_VECTORS);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5878
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5879 // compare wide vectors tail
7477
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5880 testptr(result, result);
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5881 jccb(Assembler::zero, LENGTH_DIFF_LABEL);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5882
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5883 movl(cnt2, stride);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5884 movl(result, stride);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5885 negptr(result);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5886 movdqu(vec1, Address(str1, result, scale));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5887 pcmpestri(vec1, Address(str2, result, scale), pcmpmask);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5888 jccb(Assembler::aboveEqual, LENGTH_DIFF_LABEL);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5889
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5890 // Mismatched characters in the vectors
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5891 bind(VECTOR_NOT_EQUAL);
7477
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5892 addptr(cnt1, result);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5893 load_unsigned_short(result, Address(str1, cnt1, scale));
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5894 load_unsigned_short(cnt2, Address(str2, cnt1, scale));
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5895 subl(result, cnt2);
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5896 jmpb(POP_LABEL);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5897
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5898 bind(COMPARE_TAIL); // limit is zero
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5899 movl(cnt2, result);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5900 // Fallthru to tail compare
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5901 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5902 // Shift str2 and str1 to the end of the arrays, negate min
7477
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5903 lea(str1, Address(str1, cnt2, scale));
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5904 lea(str2, Address(str2, cnt2, scale));
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5905 decrementl(cnt2); // first character was compared already
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5906 negptr(cnt2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5907
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5908 // Compare the rest of the elements
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5909 bind(WHILE_HEAD_LABEL);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5910 load_unsigned_short(result, Address(str1, cnt2, scale, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5911 load_unsigned_short(cnt1, Address(str2, cnt2, scale, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5912 subl(result, cnt1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5913 jccb(Assembler::notZero, POP_LABEL);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5914 increment(cnt2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5915 jccb(Assembler::notZero, WHILE_HEAD_LABEL);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5916
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5917 // Strings are equal up to min length. Return the length difference.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5918 bind(LENGTH_DIFF_LABEL);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5919 pop(result);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5920 jmpb(DONE_LABEL);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5921
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5922 // Discard the stored length difference
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5923 bind(POP_LABEL);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5924 pop(cnt1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5925
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5926 // That's it
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5927 bind(DONE_LABEL);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5928 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5929
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5930 // Compare char[] arrays aligned to 4 bytes or substrings.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5931 void MacroAssembler::char_arrays_equals(bool is_array_equ, Register ary1, Register ary2,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5932 Register limit, Register result, Register chr,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5933 XMMRegister vec1, XMMRegister vec2) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5934 ShortBranchVerifier sbv(this);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5935 Label TRUE_LABEL, FALSE_LABEL, DONE, COMPARE_VECTORS, COMPARE_CHAR;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5936
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5937 int length_offset = arrayOopDesc::length_offset_in_bytes();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5938 int base_offset = arrayOopDesc::base_offset_in_bytes(T_CHAR);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5939
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5940 // Check the input args
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5941 cmpptr(ary1, ary2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5942 jcc(Assembler::equal, TRUE_LABEL);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5943
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5944 if (is_array_equ) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5945 // Need additional checks for arrays_equals.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5946 testptr(ary1, ary1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5947 jcc(Assembler::zero, FALSE_LABEL);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5948 testptr(ary2, ary2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5949 jcc(Assembler::zero, FALSE_LABEL);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5950
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5951 // Check the lengths
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5952 movl(limit, Address(ary1, length_offset));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5953 cmpl(limit, Address(ary2, length_offset));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5954 jcc(Assembler::notEqual, FALSE_LABEL);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5955 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5956
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5957 // count == 0
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5958 testl(limit, limit);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5959 jcc(Assembler::zero, TRUE_LABEL);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5960
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5961 if (is_array_equ) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5962 // Load array address
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5963 lea(ary1, Address(ary1, base_offset));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5964 lea(ary2, Address(ary2, base_offset));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5965 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5966
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5967 shll(limit, 1); // byte count != 0
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5968 movl(result, limit); // copy
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
5969
7477
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5970 if (UseAVX >= 2) {
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5971 // With AVX2, use 32-byte vector compare
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5972 Label COMPARE_WIDE_VECTORS, COMPARE_TAIL;
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5973
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5974 // Compare 32-byte vectors
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5975 andl(result, 0x0000001e); // tail count (in bytes)
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5976 andl(limit, 0xffffffe0); // vector count (in bytes)
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5977 jccb(Assembler::zero, COMPARE_TAIL);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5978
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5979 lea(ary1, Address(ary1, limit, Address::times_1));
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5980 lea(ary2, Address(ary2, limit, Address::times_1));
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5981 negptr(limit);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5982
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5983 bind(COMPARE_WIDE_VECTORS);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5984 vmovdqu(vec1, Address(ary1, limit, Address::times_1));
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5985 vmovdqu(vec2, Address(ary2, limit, Address::times_1));
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5986 vpxor(vec1, vec2);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5987
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5988 vptest(vec1, vec1);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5989 jccb(Assembler::notZero, FALSE_LABEL);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5990 addptr(limit, 32);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5991 jcc(Assembler::notZero, COMPARE_WIDE_VECTORS);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5992
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5993 testl(result, result);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5994 jccb(Assembler::zero, TRUE_LABEL);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5995
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5996 vmovdqu(vec1, Address(ary1, result, Address::times_1, -32));
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5997 vmovdqu(vec2, Address(ary2, result, Address::times_1, -32));
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5998 vpxor(vec1, vec2);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
5999
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
6000 vptest(vec1, vec1);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
6001 jccb(Assembler::notZero, FALSE_LABEL);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
6002 jmpb(TRUE_LABEL);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
6003
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
6004 bind(COMPARE_TAIL); // limit is zero
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
6005 movl(limit, result);
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
6006 // Fallthru to tail compare
038dd2875b94 8005419: Improve intrinsics code performance on x86 by using AVX2
kvn
parents: 7476
diff changeset
6007 } else if (UseSSE42Intrinsics) {
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6008 // With SSE4.2, use double quad vector compare
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6009 Label COMPARE_WIDE_VECTORS, COMPARE_TAIL;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6010
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6011 // Compare 16-byte vectors
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6012 andl(result, 0x0000000e); // tail count (in bytes)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6013 andl(limit, 0xfffffff0); // vector count (in bytes)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6014 jccb(Assembler::zero, COMPARE_TAIL);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6015
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6016 lea(ary1, Address(ary1, limit, Address::times_1));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6017 lea(ary2, Address(ary2, limit, Address::times_1));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6018 negptr(limit);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6019
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6020 bind(COMPARE_WIDE_VECTORS);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6021 movdqu(vec1, Address(ary1, limit, Address::times_1));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6022 movdqu(vec2, Address(ary2, limit, Address::times_1));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6023 pxor(vec1, vec2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6024
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6025 ptest(vec1, vec1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6026 jccb(Assembler::notZero, FALSE_LABEL);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6027 addptr(limit, 16);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6028 jcc(Assembler::notZero, COMPARE_WIDE_VECTORS);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6029
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6030 testl(result, result);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6031 jccb(Assembler::zero, TRUE_LABEL);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6032
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6033 movdqu(vec1, Address(ary1, result, Address::times_1, -16));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6034 movdqu(vec2, Address(ary2, result, Address::times_1, -16));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6035 pxor(vec1, vec2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6036
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6037 ptest(vec1, vec1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6038 jccb(Assembler::notZero, FALSE_LABEL);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6039 jmpb(TRUE_LABEL);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6040
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6041 bind(COMPARE_TAIL); // limit is zero
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6042 movl(limit, result);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6043 // Fallthru to tail compare
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6044 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6045
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6046 // Compare 4-byte vectors
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6047 andl(limit, 0xfffffffc); // vector count (in bytes)
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6048 jccb(Assembler::zero, COMPARE_CHAR);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6049
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6050 lea(ary1, Address(ary1, limit, Address::times_1));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6051 lea(ary2, Address(ary2, limit, Address::times_1));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6052 negptr(limit);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6053
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6054 bind(COMPARE_VECTORS);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6055 movl(chr, Address(ary1, limit, Address::times_1));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6056 cmpl(chr, Address(ary2, limit, Address::times_1));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6057 jccb(Assembler::notEqual, FALSE_LABEL);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6058 addptr(limit, 4);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6059 jcc(Assembler::notZero, COMPARE_VECTORS);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6060
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6061 // Compare trailing char (final 2 bytes), if any
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6062 bind(COMPARE_CHAR);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6063 testl(result, 0x2); // tail char
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6064 jccb(Assembler::zero, TRUE_LABEL);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6065 load_unsigned_short(chr, Address(ary1, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6066 load_unsigned_short(limit, Address(ary2, 0));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6067 cmpl(chr, limit);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6068 jccb(Assembler::notEqual, FALSE_LABEL);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6069
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6070 bind(TRUE_LABEL);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6071 movl(result, 1); // return true
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6072 jmpb(DONE);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6073
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6074 bind(FALSE_LABEL);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6075 xorl(result, result); // return false
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6076
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6077 // That's it
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6078 bind(DONE);
8873
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 8767
diff changeset
6079 if (UseAVX >= 2) {
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 8767
diff changeset
6080 // clean upper bits of YMM registers
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 8767
diff changeset
6081 vzeroupper();
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 8767
diff changeset
6082 }
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6083 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6084
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6085 void MacroAssembler::generate_fill(BasicType t, bool aligned,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6086 Register to, Register value, Register count,
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6087 Register rtmp, XMMRegister xtmp) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6088 ShortBranchVerifier sbv(this);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6089 assert_different_registers(to, value, count, rtmp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6090 Label L_exit, L_skip_align1, L_skip_align2, L_fill_byte;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6091 Label L_fill_2_bytes, L_fill_4_bytes;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6092
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6093 int shift = -1;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6094 switch (t) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6095 case T_BYTE:
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6096 shift = 2;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6097 break;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6098 case T_SHORT:
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6099 shift = 1;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6100 break;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6101 case T_INT:
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6102 shift = 0;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6103 break;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6104 default: ShouldNotReachHere();
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6105 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6106
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6107 if (t == T_BYTE) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6108 andl(value, 0xff);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6109 movl(rtmp, value);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6110 shll(rtmp, 8);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6111 orl(value, rtmp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6112 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6113 if (t == T_SHORT) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6114 andl(value, 0xffff);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6115 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6116 if (t == T_BYTE || t == T_SHORT) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6117 movl(rtmp, value);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6118 shll(rtmp, 16);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6119 orl(value, rtmp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6120 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6121
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6122 cmpl(count, 2<<shift); // Short arrays (< 8 bytes) fill by element
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6123 jcc(Assembler::below, L_fill_4_bytes); // use unsigned cmp
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6124 if (!UseUnalignedLoadStores && !aligned && (t == T_BYTE || t == T_SHORT)) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6125 // align source address at 4 bytes address boundary
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6126 if (t == T_BYTE) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6127 // One byte misalignment happens only for byte arrays
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6128 testptr(to, 1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6129 jccb(Assembler::zero, L_skip_align1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6130 movb(Address(to, 0), value);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6131 increment(to);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6132 decrement(count);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6133 BIND(L_skip_align1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6134 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6135 // Two bytes misalignment happens only for byte and short (char) arrays
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6136 testptr(to, 2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6137 jccb(Assembler::zero, L_skip_align2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6138 movw(Address(to, 0), value);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6139 addptr(to, 2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6140 subl(count, 1<<(shift-1));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6141 BIND(L_skip_align2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6142 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6143 if (UseSSE < 2) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6144 Label L_fill_32_bytes_loop, L_check_fill_8_bytes, L_fill_8_bytes_loop, L_fill_8_bytes;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6145 // Fill 32-byte chunks
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6146 subl(count, 8 << shift);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6147 jcc(Assembler::less, L_check_fill_8_bytes);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6148 align(16);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6149
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6150 BIND(L_fill_32_bytes_loop);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6151
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6152 for (int i = 0; i < 32; i += 4) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6153 movl(Address(to, i), value);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6154 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6155
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6156 addptr(to, 32);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6157 subl(count, 8 << shift);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6158 jcc(Assembler::greaterEqual, L_fill_32_bytes_loop);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6159 BIND(L_check_fill_8_bytes);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6160 addl(count, 8 << shift);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6161 jccb(Assembler::zero, L_exit);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6162 jmpb(L_fill_8_bytes);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6163
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6164 //
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6165 // length is too short, just fill qwords
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6166 //
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6167 BIND(L_fill_8_bytes_loop);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6168 movl(Address(to, 0), value);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6169 movl(Address(to, 4), value);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6170 addptr(to, 8);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6171 BIND(L_fill_8_bytes);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6172 subl(count, 1 << (shift + 1));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6173 jcc(Assembler::greaterEqual, L_fill_8_bytes_loop);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6174 // fall through to fill 4 bytes
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6175 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6176 Label L_fill_32_bytes;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6177 if (!UseUnalignedLoadStores) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6178 // align to 8 bytes, we know we are 4 byte aligned to start
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6179 testptr(to, 4);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6180 jccb(Assembler::zero, L_fill_32_bytes);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6181 movl(Address(to, 0), value);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6182 addptr(to, 4);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6183 subl(count, 1<<shift);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6184 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6185 BIND(L_fill_32_bytes);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6186 {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6187 assert( UseSSE >= 2, "supported cpu only" );
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6188 Label L_fill_32_bytes_loop, L_check_fill_8_bytes, L_fill_8_bytes_loop, L_fill_8_bytes;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6189 movdl(xtmp, value);
7475
e2e6bf86682c 8005544: Use 256bit YMM registers in arraycopy stubs on x86
kvn
parents: 7474
diff changeset
6190 if (UseAVX >= 2 && UseUnalignedLoadStores) {
e2e6bf86682c 8005544: Use 256bit YMM registers in arraycopy stubs on x86
kvn
parents: 7474
diff changeset
6191 // Fill 64-byte chunks
e2e6bf86682c 8005544: Use 256bit YMM registers in arraycopy stubs on x86
kvn
parents: 7474
diff changeset
6192 Label L_fill_64_bytes_loop, L_check_fill_32_bytes;
e2e6bf86682c 8005544: Use 256bit YMM registers in arraycopy stubs on x86
kvn
parents: 7474
diff changeset
6193 vpbroadcastd(xtmp, xtmp);
e2e6bf86682c 8005544: Use 256bit YMM registers in arraycopy stubs on x86
kvn
parents: 7474
diff changeset
6194
e2e6bf86682c 8005544: Use 256bit YMM registers in arraycopy stubs on x86
kvn
parents: 7474
diff changeset
6195 subl(count, 16 << shift);
e2e6bf86682c 8005544: Use 256bit YMM registers in arraycopy stubs on x86
kvn
parents: 7474
diff changeset
6196 jcc(Assembler::less, L_check_fill_32_bytes);
e2e6bf86682c 8005544: Use 256bit YMM registers in arraycopy stubs on x86
kvn
parents: 7474
diff changeset
6197 align(16);
e2e6bf86682c 8005544: Use 256bit YMM registers in arraycopy stubs on x86
kvn
parents: 7474
diff changeset
6198
e2e6bf86682c 8005544: Use 256bit YMM registers in arraycopy stubs on x86
kvn
parents: 7474
diff changeset
6199 BIND(L_fill_64_bytes_loop);
e2e6bf86682c 8005544: Use 256bit YMM registers in arraycopy stubs on x86
kvn
parents: 7474
diff changeset
6200 vmovdqu(Address(to, 0), xtmp);
e2e6bf86682c 8005544: Use 256bit YMM registers in arraycopy stubs on x86
kvn
parents: 7474
diff changeset
6201 vmovdqu(Address(to, 32), xtmp);
e2e6bf86682c 8005544: Use 256bit YMM registers in arraycopy stubs on x86
kvn
parents: 7474
diff changeset
6202 addptr(to, 64);
e2e6bf86682c 8005544: Use 256bit YMM registers in arraycopy stubs on x86
kvn
parents: 7474
diff changeset
6203 subl(count, 16 << shift);
e2e6bf86682c 8005544: Use 256bit YMM registers in arraycopy stubs on x86
kvn
parents: 7474
diff changeset
6204 jcc(Assembler::greaterEqual, L_fill_64_bytes_loop);
e2e6bf86682c 8005544: Use 256bit YMM registers in arraycopy stubs on x86
kvn
parents: 7474
diff changeset
6205
e2e6bf86682c 8005544: Use 256bit YMM registers in arraycopy stubs on x86
kvn
parents: 7474
diff changeset
6206 BIND(L_check_fill_32_bytes);
e2e6bf86682c 8005544: Use 256bit YMM registers in arraycopy stubs on x86
kvn
parents: 7474
diff changeset
6207 addl(count, 8 << shift);
e2e6bf86682c 8005544: Use 256bit YMM registers in arraycopy stubs on x86
kvn
parents: 7474
diff changeset
6208 jccb(Assembler::less, L_check_fill_8_bytes);
e2e6bf86682c 8005544: Use 256bit YMM registers in arraycopy stubs on x86
kvn
parents: 7474
diff changeset
6209 vmovdqu(Address(to, 0), xtmp);
e2e6bf86682c 8005544: Use 256bit YMM registers in arraycopy stubs on x86
kvn
parents: 7474
diff changeset
6210 addptr(to, 32);
e2e6bf86682c 8005544: Use 256bit YMM registers in arraycopy stubs on x86
kvn
parents: 7474
diff changeset
6211 subl(count, 8 << shift);
8873
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 8767
diff changeset
6212
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 8767
diff changeset
6213 BIND(L_check_fill_8_bytes);
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 8767
diff changeset
6214 // clean upper bits of YMM registers
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 8767
diff changeset
6215 vzeroupper();
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6216 } else {
7475
e2e6bf86682c 8005544: Use 256bit YMM registers in arraycopy stubs on x86
kvn
parents: 7474
diff changeset
6217 // Fill 32-byte chunks
e2e6bf86682c 8005544: Use 256bit YMM registers in arraycopy stubs on x86
kvn
parents: 7474
diff changeset
6218 pshufd(xtmp, xtmp, 0);
e2e6bf86682c 8005544: Use 256bit YMM registers in arraycopy stubs on x86
kvn
parents: 7474
diff changeset
6219
e2e6bf86682c 8005544: Use 256bit YMM registers in arraycopy stubs on x86
kvn
parents: 7474
diff changeset
6220 subl(count, 8 << shift);
e2e6bf86682c 8005544: Use 256bit YMM registers in arraycopy stubs on x86
kvn
parents: 7474
diff changeset
6221 jcc(Assembler::less, L_check_fill_8_bytes);
e2e6bf86682c 8005544: Use 256bit YMM registers in arraycopy stubs on x86
kvn
parents: 7474
diff changeset
6222 align(16);
e2e6bf86682c 8005544: Use 256bit YMM registers in arraycopy stubs on x86
kvn
parents: 7474
diff changeset
6223
e2e6bf86682c 8005544: Use 256bit YMM registers in arraycopy stubs on x86
kvn
parents: 7474
diff changeset
6224 BIND(L_fill_32_bytes_loop);
e2e6bf86682c 8005544: Use 256bit YMM registers in arraycopy stubs on x86
kvn
parents: 7474
diff changeset
6225
e2e6bf86682c 8005544: Use 256bit YMM registers in arraycopy stubs on x86
kvn
parents: 7474
diff changeset
6226 if (UseUnalignedLoadStores) {
e2e6bf86682c 8005544: Use 256bit YMM registers in arraycopy stubs on x86
kvn
parents: 7474
diff changeset
6227 movdqu(Address(to, 0), xtmp);
e2e6bf86682c 8005544: Use 256bit YMM registers in arraycopy stubs on x86
kvn
parents: 7474
diff changeset
6228 movdqu(Address(to, 16), xtmp);
e2e6bf86682c 8005544: Use 256bit YMM registers in arraycopy stubs on x86
kvn
parents: 7474
diff changeset
6229 } else {
e2e6bf86682c 8005544: Use 256bit YMM registers in arraycopy stubs on x86
kvn
parents: 7474
diff changeset
6230 movq(Address(to, 0), xtmp);
e2e6bf86682c 8005544: Use 256bit YMM registers in arraycopy stubs on x86
kvn
parents: 7474
diff changeset
6231 movq(Address(to, 8), xtmp);
e2e6bf86682c 8005544: Use 256bit YMM registers in arraycopy stubs on x86
kvn
parents: 7474
diff changeset
6232 movq(Address(to, 16), xtmp);
e2e6bf86682c 8005544: Use 256bit YMM registers in arraycopy stubs on x86
kvn
parents: 7474
diff changeset
6233 movq(Address(to, 24), xtmp);
e2e6bf86682c 8005544: Use 256bit YMM registers in arraycopy stubs on x86
kvn
parents: 7474
diff changeset
6234 }
e2e6bf86682c 8005544: Use 256bit YMM registers in arraycopy stubs on x86
kvn
parents: 7474
diff changeset
6235
e2e6bf86682c 8005544: Use 256bit YMM registers in arraycopy stubs on x86
kvn
parents: 7474
diff changeset
6236 addptr(to, 32);
e2e6bf86682c 8005544: Use 256bit YMM registers in arraycopy stubs on x86
kvn
parents: 7474
diff changeset
6237 subl(count, 8 << shift);
e2e6bf86682c 8005544: Use 256bit YMM registers in arraycopy stubs on x86
kvn
parents: 7474
diff changeset
6238 jcc(Assembler::greaterEqual, L_fill_32_bytes_loop);
8873
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 8767
diff changeset
6239
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 8767
diff changeset
6240 BIND(L_check_fill_8_bytes);
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6241 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6242 addl(count, 8 << shift);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6243 jccb(Assembler::zero, L_exit);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6244 jmpb(L_fill_8_bytes);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6245
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6246 //
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6247 // length is too short, just fill qwords
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6248 //
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6249 BIND(L_fill_8_bytes_loop);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6250 movq(Address(to, 0), xtmp);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6251 addptr(to, 8);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6252 BIND(L_fill_8_bytes);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6253 subl(count, 1 << (shift + 1));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6254 jcc(Assembler::greaterEqual, L_fill_8_bytes_loop);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6255 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6256 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6257 // fill trailing 4 bytes
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6258 BIND(L_fill_4_bytes);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6259 testl(count, 1<<shift);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6260 jccb(Assembler::zero, L_fill_2_bytes);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6261 movl(Address(to, 0), value);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6262 if (t == T_BYTE || t == T_SHORT) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6263 addptr(to, 4);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6264 BIND(L_fill_2_bytes);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6265 // fill trailing 2 bytes
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6266 testl(count, 1<<(shift-1));
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6267 jccb(Assembler::zero, L_fill_byte);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6268 movw(Address(to, 0), value);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6269 if (t == T_BYTE) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6270 addptr(to, 2);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6271 BIND(L_fill_byte);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6272 // fill trailing byte
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6273 testl(count, 1);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6274 jccb(Assembler::zero, L_exit);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6275 movb(Address(to, 0), value);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6276 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6277 BIND(L_fill_byte);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6278 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6279 } else {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6280 BIND(L_fill_2_bytes);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6281 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6282 BIND(L_exit);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6283 }
7637
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6284
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6285 // encode char[] to byte[] in ISO_8859_1
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6286 void MacroAssembler::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
6287 XMMRegister tmp1Reg, XMMRegister tmp2Reg,
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6288 XMMRegister tmp3Reg, XMMRegister tmp4Reg,
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6289 Register tmp5, Register result) {
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6290 // rsi: src
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6291 // rdi: dst
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6292 // rdx: len
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6293 // rcx: tmp5
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6294 // rax: result
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6295 ShortBranchVerifier sbv(this);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6296 assert_different_registers(src, dst, len, tmp5, result);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6297 Label L_done, L_copy_1_char, L_copy_1_char_exit;
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6298
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6299 // set result
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6300 xorl(result, result);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6301 // check for zero length
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6302 testl(len, len);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6303 jcc(Assembler::zero, L_done);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6304 movl(result, len);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6305
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6306 // Setup pointers
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6307 lea(src, Address(src, len, Address::times_2)); // char[]
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6308 lea(dst, Address(dst, len, Address::times_1)); // byte[]
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6309 negptr(len);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6310
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6311 if (UseSSE42Intrinsics || UseAVX >= 2) {
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6312 Label L_chars_8_check, L_copy_8_chars, L_copy_8_chars_exit;
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6313 Label L_chars_16_check, L_copy_16_chars, L_copy_16_chars_exit;
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6314
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6315 if (UseAVX >= 2) {
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6316 Label L_chars_32_check, L_copy_32_chars, L_copy_32_chars_exit;
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6317 movl(tmp5, 0xff00ff00); // create mask to test for Unicode chars in vector
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6318 movdl(tmp1Reg, tmp5);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6319 vpbroadcastd(tmp1Reg, tmp1Reg);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6320 jmpb(L_chars_32_check);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6321
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6322 bind(L_copy_32_chars);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6323 vmovdqu(tmp3Reg, Address(src, len, Address::times_2, -64));
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6324 vmovdqu(tmp4Reg, Address(src, len, Address::times_2, -32));
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6325 vpor(tmp2Reg, tmp3Reg, tmp4Reg, /* vector256 */ true);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6326 vptest(tmp2Reg, tmp1Reg); // check for Unicode chars in vector
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6327 jccb(Assembler::notZero, L_copy_32_chars_exit);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6328 vpackuswb(tmp3Reg, tmp3Reg, tmp4Reg, /* vector256 */ true);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6329 vpermq(tmp4Reg, tmp3Reg, 0xD8, /* vector256 */ true);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6330 vmovdqu(Address(dst, len, Address::times_1, -32), tmp4Reg);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6331
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6332 bind(L_chars_32_check);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6333 addptr(len, 32);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6334 jccb(Assembler::lessEqual, L_copy_32_chars);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6335
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6336 bind(L_copy_32_chars_exit);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6337 subptr(len, 16);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6338 jccb(Assembler::greater, L_copy_16_chars_exit);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6339
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6340 } else if (UseSSE42Intrinsics) {
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6341 movl(tmp5, 0xff00ff00); // create mask to test for Unicode chars in vector
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6342 movdl(tmp1Reg, tmp5);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6343 pshufd(tmp1Reg, tmp1Reg, 0);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6344 jmpb(L_chars_16_check);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6345 }
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6346
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6347 bind(L_copy_16_chars);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6348 if (UseAVX >= 2) {
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6349 vmovdqu(tmp2Reg, Address(src, len, Address::times_2, -32));
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6350 vptest(tmp2Reg, tmp1Reg);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6351 jccb(Assembler::notZero, L_copy_16_chars_exit);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6352 vpackuswb(tmp2Reg, tmp2Reg, tmp1Reg, /* vector256 */ true);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6353 vpermq(tmp3Reg, tmp2Reg, 0xD8, /* vector256 */ true);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6354 } else {
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6355 if (UseAVX > 0) {
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6356 movdqu(tmp3Reg, Address(src, len, Address::times_2, -32));
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6357 movdqu(tmp4Reg, Address(src, len, Address::times_2, -16));
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6358 vpor(tmp2Reg, tmp3Reg, tmp4Reg, /* vector256 */ false);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6359 } else {
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6360 movdqu(tmp3Reg, Address(src, len, Address::times_2, -32));
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6361 por(tmp2Reg, tmp3Reg);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6362 movdqu(tmp4Reg, Address(src, len, Address::times_2, -16));
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6363 por(tmp2Reg, tmp4Reg);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6364 }
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6365 ptest(tmp2Reg, tmp1Reg); // check for Unicode chars in vector
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6366 jccb(Assembler::notZero, L_copy_16_chars_exit);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6367 packuswb(tmp3Reg, tmp4Reg);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6368 }
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6369 movdqu(Address(dst, len, Address::times_1, -16), tmp3Reg);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6370
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6371 bind(L_chars_16_check);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6372 addptr(len, 16);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6373 jccb(Assembler::lessEqual, L_copy_16_chars);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6374
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6375 bind(L_copy_16_chars_exit);
8873
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 8767
diff changeset
6376 if (UseAVX >= 2) {
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 8767
diff changeset
6377 // clean upper bits of YMM registers
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 8767
diff changeset
6378 vzeroupper();
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 8767
diff changeset
6379 }
7637
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6380 subptr(len, 8);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6381 jccb(Assembler::greater, L_copy_8_chars_exit);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6382
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6383 bind(L_copy_8_chars);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6384 movdqu(tmp3Reg, Address(src, len, Address::times_2, -16));
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6385 ptest(tmp3Reg, tmp1Reg);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6386 jccb(Assembler::notZero, L_copy_8_chars_exit);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6387 packuswb(tmp3Reg, tmp1Reg);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6388 movq(Address(dst, len, Address::times_1, -8), tmp3Reg);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6389 addptr(len, 8);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6390 jccb(Assembler::lessEqual, L_copy_8_chars);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6391
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6392 bind(L_copy_8_chars_exit);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6393 subptr(len, 8);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6394 jccb(Assembler::zero, L_done);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6395 }
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6396
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6397 bind(L_copy_1_char);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6398 load_unsigned_short(tmp5, Address(src, len, Address::times_2, 0));
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6399 testl(tmp5, 0xff00); // check if Unicode char
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6400 jccb(Assembler::notZero, L_copy_1_char_exit);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6401 movb(Address(dst, len, Address::times_1, 0), tmp5);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6402 addptr(len, 1);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6403 jccb(Assembler::less, L_copy_1_char);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6404
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6405 bind(L_copy_1_char_exit);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6406 addptr(result, len); // len is negative count of not processed elements
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6407 bind(L_done);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6408 }
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7477
diff changeset
6409
11080
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6410 /**
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6411 * Emits code to update CRC-32 with a byte value according to constants in table
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6412 *
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6413 * @param [in,out]crc Register containing the crc.
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6414 * @param [in]val Register containing the byte to fold into the CRC.
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6415 * @param [in]table Register containing the table of crc constants.
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6416 *
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6417 * uint32_t crc;
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6418 * val = crc_table[(val ^ crc) & 0xFF];
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6419 * crc = val ^ (crc >> 8);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6420 *
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6421 */
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6422 void MacroAssembler::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
6423 xorl(val, crc);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6424 andl(val, 0xFF);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6425 shrl(crc, 8); // unsigned shift
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6426 xorl(crc, Address(table, val, Address::times_4, 0));
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6427 }
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6428
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6429 /**
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6430 * Fold 128-bit data chunk
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6431 */
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6432 void MacroAssembler::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
6433 vpclmulhdq(xtmp, xK, xcrc); // [123:64]
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6434 vpclmulldq(xcrc, xK, xcrc); // [63:0]
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6435 vpxor(xcrc, xcrc, Address(buf, offset), false /* vector256 */);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6436 pxor(xcrc, xtmp);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6437 }
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6438
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6439 void MacroAssembler::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
6440 vpclmulhdq(xtmp, xK, xcrc);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6441 vpclmulldq(xcrc, xK, xcrc);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6442 pxor(xcrc, xbuf);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6443 pxor(xcrc, xtmp);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6444 }
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6445
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6446 /**
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6447 * 8-bit folds to compute 32-bit CRC
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6448 *
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6449 * uint64_t xcrc;
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6450 * timesXtoThe32[xcrc & 0xFF] ^ (xcrc >> 8);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6451 */
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6452 void MacroAssembler::fold_8bit_crc32(XMMRegister xcrc, Register table, XMMRegister xtmp, Register tmp) {
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6453 movdl(tmp, xcrc);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6454 andl(tmp, 0xFF);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6455 movdl(xtmp, Address(table, tmp, Address::times_4, 0));
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6456 psrldq(xcrc, 1); // unsigned shift one byte
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6457 pxor(xcrc, xtmp);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6458 }
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6459
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6460 /**
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6461 * uint32_t crc;
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6462 * timesXtoThe32[crc & 0xFF] ^ (crc >> 8);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6463 */
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6464 void MacroAssembler::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
6465 movl(tmp, crc);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6466 andl(tmp, 0xFF);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6467 shrl(crc, 8);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6468 xorl(crc, Address(table, tmp, Address::times_4, 0));
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6469 }
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6470
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6471 /**
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6472 * @param crc register containing existing CRC (32-bit)
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6473 * @param buf register pointing to input byte buffer (byte*)
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6474 * @param len register containing number of bytes
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6475 * @param table register that will contain address of CRC table
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6476 * @param tmp scratch register
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6477 */
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6478 void MacroAssembler::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
6479 assert_different_registers(crc, buf, len, table, tmp, rax);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6480
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6481 Label L_tail, L_tail_restore, L_tail_loop, L_exit, L_align_loop, L_aligned;
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6482 Label L_fold_tail, L_fold_128b, L_fold_512b, L_fold_512b_loop, L_fold_tail_loop;
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6483
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6484 lea(table, ExternalAddress(StubRoutines::crc_table_addr()));
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6485 notl(crc); // ~crc
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6486 cmpl(len, 16);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6487 jcc(Assembler::less, L_tail);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6488
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6489 // Align buffer to 16 bytes
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6490 movl(tmp, buf);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6491 andl(tmp, 0xF);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6492 jccb(Assembler::zero, L_aligned);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6493 subl(tmp, 16);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6494 addl(len, tmp);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6495
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6496 align(4);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6497 BIND(L_align_loop);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6498 movsbl(rax, Address(buf, 0)); // load byte with sign extension
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6499 update_byte_crc32(crc, rax, table);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6500 increment(buf);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6501 incrementl(tmp);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6502 jccb(Assembler::less, L_align_loop);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6503
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6504 BIND(L_aligned);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6505 movl(tmp, len); // save
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6506 shrl(len, 4);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6507 jcc(Assembler::zero, L_tail_restore);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6508
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6509 // Fold crc into first bytes of vector
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6510 movdqa(xmm1, Address(buf, 0));
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6511 movdl(rax, xmm1);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6512 xorl(crc, rax);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6513 pinsrd(xmm1, crc, 0);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6514 addptr(buf, 16);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6515 subl(len, 4); // len > 0
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6516 jcc(Assembler::less, L_fold_tail);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6517
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6518 movdqa(xmm2, Address(buf, 0));
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6519 movdqa(xmm3, Address(buf, 16));
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6520 movdqa(xmm4, Address(buf, 32));
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6521 addptr(buf, 48);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6522 subl(len, 3);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6523 jcc(Assembler::lessEqual, L_fold_512b);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6524
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6525 // Fold total 512 bits of polynomial on each iteration,
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6526 // 128 bits per each of 4 parallel streams.
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6527 movdqu(xmm0, ExternalAddress(StubRoutines::x86::crc_by128_masks_addr() + 32));
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6528
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6529 align(32);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6530 BIND(L_fold_512b_loop);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6531 fold_128bit_crc32(xmm1, xmm0, xmm5, buf, 0);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6532 fold_128bit_crc32(xmm2, xmm0, xmm5, buf, 16);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6533 fold_128bit_crc32(xmm3, xmm0, xmm5, buf, 32);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6534 fold_128bit_crc32(xmm4, xmm0, xmm5, buf, 48);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6535 addptr(buf, 64);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6536 subl(len, 4);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6537 jcc(Assembler::greater, L_fold_512b_loop);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6538
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6539 // Fold 512 bits to 128 bits.
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6540 BIND(L_fold_512b);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6541 movdqu(xmm0, ExternalAddress(StubRoutines::x86::crc_by128_masks_addr() + 16));
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6542 fold_128bit_crc32(xmm1, xmm0, xmm5, xmm2);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6543 fold_128bit_crc32(xmm1, xmm0, xmm5, xmm3);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6544 fold_128bit_crc32(xmm1, xmm0, xmm5, xmm4);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6545
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6546 // Fold the rest of 128 bits data chunks
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6547 BIND(L_fold_tail);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6548 addl(len, 3);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6549 jccb(Assembler::lessEqual, L_fold_128b);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6550 movdqu(xmm0, ExternalAddress(StubRoutines::x86::crc_by128_masks_addr() + 16));
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6551
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6552 BIND(L_fold_tail_loop);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6553 fold_128bit_crc32(xmm1, xmm0, xmm5, buf, 0);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6554 addptr(buf, 16);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6555 decrementl(len);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6556 jccb(Assembler::greater, L_fold_tail_loop);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6557
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6558 // Fold 128 bits in xmm1 down into 32 bits in crc register.
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6559 BIND(L_fold_128b);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6560 movdqu(xmm0, ExternalAddress(StubRoutines::x86::crc_by128_masks_addr()));
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6561 vpclmulqdq(xmm2, xmm0, xmm1, 0x1);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6562 vpand(xmm3, xmm0, xmm2, false /* vector256 */);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6563 vpclmulqdq(xmm0, xmm0, xmm3, 0x1);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6564 psrldq(xmm1, 8);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6565 psrldq(xmm2, 4);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6566 pxor(xmm0, xmm1);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6567 pxor(xmm0, xmm2);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6568
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6569 // 8 8-bit folds to compute 32-bit CRC.
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6570 for (int j = 0; j < 4; j++) {
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6571 fold_8bit_crc32(xmm0, table, xmm1, rax);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6572 }
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6573 movdl(crc, xmm0); // mov 32 bits to general register
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6574 for (int j = 0; j < 4; j++) {
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6575 fold_8bit_crc32(crc, table, rax);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6576 }
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6577
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6578 BIND(L_tail_restore);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6579 movl(len, tmp); // restore
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6580 BIND(L_tail);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6581 andl(len, 0xf);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6582 jccb(Assembler::zero, L_exit);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6583
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6584 // Fold the rest of bytes
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6585 align(4);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6586 BIND(L_tail_loop);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6587 movsbl(rax, Address(buf, 0)); // load byte with sign extension
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6588 update_byte_crc32(crc, rax, table);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6589 increment(buf);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6590 decrementl(len);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6591 jccb(Assembler::greater, L_tail_loop);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6592
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6593 BIND(L_exit);
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6594 notl(crc); // ~c
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6595 }
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8873
diff changeset
6596
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6597 #undef BIND
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6598 #undef BLOCK_COMMENT
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6599
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6600
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6601 Assembler::Condition MacroAssembler::negate_condition(Assembler::Condition cond) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6602 switch (cond) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6603 // Note some conditions are synonyms for others
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6604 case Assembler::zero: return Assembler::notZero;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6605 case Assembler::notZero: return Assembler::zero;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6606 case Assembler::less: return Assembler::greaterEqual;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6607 case Assembler::lessEqual: return Assembler::greater;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6608 case Assembler::greater: return Assembler::lessEqual;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6609 case Assembler::greaterEqual: return Assembler::less;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6610 case Assembler::below: return Assembler::aboveEqual;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6611 case Assembler::belowEqual: return Assembler::above;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6612 case Assembler::above: return Assembler::belowEqual;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6613 case Assembler::aboveEqual: return Assembler::below;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6614 case Assembler::overflow: return Assembler::noOverflow;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6615 case Assembler::noOverflow: return Assembler::overflow;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6616 case Assembler::negative: return Assembler::positive;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6617 case Assembler::positive: return Assembler::negative;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6618 case Assembler::parity: return Assembler::noParity;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6619 case Assembler::noParity: return Assembler::parity;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6620 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6621 ShouldNotReachHere(); return Assembler::overflow;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6622 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6623
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6624 SkipIfEqual::SkipIfEqual(
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6625 MacroAssembler* masm, const bool* flag_addr, bool value) {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6626 _masm = masm;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6627 _masm->cmp8(ExternalAddress((address)flag_addr), value);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6628 _masm->jcc(Assembler::equal, _label);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6629 }
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6630
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6631 SkipIfEqual::~SkipIfEqual() {
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6632 _masm->bind(_label);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents:
diff changeset
6633 }