Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(178)

Side by Side Diff: src/arm64/macro-assembler-arm64-inl.h

Issue 318773009: ARM64: Clean up support for explicit literal load. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef V8_ARM64_MACRO_ASSEMBLER_ARM64_INL_H_ 5 #ifndef V8_ARM64_MACRO_ASSEMBLER_ARM64_INL_H_
6 #define V8_ARM64_MACRO_ASSEMBLER_ARM64_INL_H_ 6 #define V8_ARM64_MACRO_ASSEMBLER_ARM64_INL_H_
7 7
8 #include <ctype.h> 8 #include <ctype.h>
9 9
10 #include "src/globals.h" 10 #include "src/globals.h"
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
119 ASSERT(!rd.IsZero()); 119 ASSERT(!rd.IsZero());
120 LogicalMacro(rd, rn, operand, EON); 120 LogicalMacro(rd, rn, operand, EON);
121 } 121 }
122 122
123 123
124 void MacroAssembler::Ccmp(const Register& rn, 124 void MacroAssembler::Ccmp(const Register& rn,
125 const Operand& operand, 125 const Operand& operand,
126 StatusFlags nzcv, 126 StatusFlags nzcv,
127 Condition cond) { 127 Condition cond) {
128 ASSERT(allow_macro_instructions_); 128 ASSERT(allow_macro_instructions_);
129 if (operand.IsImmediate() && (operand.immediate() < 0)) { 129 if (operand.IsImmediate() && (operand.ImmediateValue() < 0)) {
130 ConditionalCompareMacro(rn, -operand.immediate(), nzcv, cond, CCMN); 130 ConditionalCompareMacro(rn, -operand.ImmediateValue(), nzcv, cond, CCMN);
131 } else { 131 } else {
132 ConditionalCompareMacro(rn, operand, nzcv, cond, CCMP); 132 ConditionalCompareMacro(rn, operand, nzcv, cond, CCMP);
133 } 133 }
134 } 134 }
135 135
136 136
137 void MacroAssembler::Ccmn(const Register& rn, 137 void MacroAssembler::Ccmn(const Register& rn,
138 const Operand& operand, 138 const Operand& operand,
139 StatusFlags nzcv, 139 StatusFlags nzcv,
140 Condition cond) { 140 Condition cond) {
141 ASSERT(allow_macro_instructions_); 141 ASSERT(allow_macro_instructions_);
142 if (operand.IsImmediate() && (operand.immediate() < 0)) { 142 if (operand.IsImmediate() && (operand.ImmediateValue() < 0)) {
143 ConditionalCompareMacro(rn, -operand.immediate(), nzcv, cond, CCMP); 143 ConditionalCompareMacro(rn, -operand.ImmediateValue(), nzcv, cond, CCMP);
144 } else { 144 } else {
145 ConditionalCompareMacro(rn, operand, nzcv, cond, CCMN); 145 ConditionalCompareMacro(rn, operand, nzcv, cond, CCMN);
146 } 146 }
147 } 147 }
148 148
149 149
150 void MacroAssembler::Add(const Register& rd, 150 void MacroAssembler::Add(const Register& rd,
151 const Register& rn, 151 const Register& rn,
152 const Operand& operand) { 152 const Operand& operand) {
153 ASSERT(allow_macro_instructions_); 153 ASSERT(allow_macro_instructions_);
154 if (operand.IsImmediate() && (operand.immediate() < 0)) { 154 if (operand.IsImmediate() && (operand.ImmediateValue() < 0)) {
155 AddSubMacro(rd, rn, -operand.immediate(), LeaveFlags, SUB); 155 AddSubMacro(rd, rn, -operand.ImmediateValue(), LeaveFlags, SUB);
156 } else { 156 } else {
157 AddSubMacro(rd, rn, operand, LeaveFlags, ADD); 157 AddSubMacro(rd, rn, operand, LeaveFlags, ADD);
158 } 158 }
159 } 159 }
160 160
161 void MacroAssembler::Adds(const Register& rd, 161 void MacroAssembler::Adds(const Register& rd,
162 const Register& rn, 162 const Register& rn,
163 const Operand& operand) { 163 const Operand& operand) {
164 ASSERT(allow_macro_instructions_); 164 ASSERT(allow_macro_instructions_);
165 if (operand.IsImmediate() && (operand.immediate() < 0)) { 165 if (operand.IsImmediate() && (operand.ImmediateValue() < 0)) {
166 AddSubMacro(rd, rn, -operand.immediate(), SetFlags, SUB); 166 AddSubMacro(rd, rn, -operand.ImmediateValue(), SetFlags, SUB);
167 } else { 167 } else {
168 AddSubMacro(rd, rn, operand, SetFlags, ADD); 168 AddSubMacro(rd, rn, operand, SetFlags, ADD);
169 } 169 }
170 } 170 }
171 171
172 172
173 void MacroAssembler::Sub(const Register& rd, 173 void MacroAssembler::Sub(const Register& rd,
174 const Register& rn, 174 const Register& rn,
175 const Operand& operand) { 175 const Operand& operand) {
176 ASSERT(allow_macro_instructions_); 176 ASSERT(allow_macro_instructions_);
177 if (operand.IsImmediate() && (operand.immediate() < 0)) { 177 if (operand.IsImmediate() && (operand.ImmediateValue() < 0)) {
178 AddSubMacro(rd, rn, -operand.immediate(), LeaveFlags, ADD); 178 AddSubMacro(rd, rn, -operand.ImmediateValue(), LeaveFlags, ADD);
179 } else { 179 } else {
180 AddSubMacro(rd, rn, operand, LeaveFlags, SUB); 180 AddSubMacro(rd, rn, operand, LeaveFlags, SUB);
181 } 181 }
182 } 182 }
183 183
184 184
185 void MacroAssembler::Subs(const Register& rd, 185 void MacroAssembler::Subs(const Register& rd,
186 const Register& rn, 186 const Register& rn,
187 const Operand& operand) { 187 const Operand& operand) {
188 ASSERT(allow_macro_instructions_); 188 ASSERT(allow_macro_instructions_);
189 if (operand.IsImmediate() && (operand.immediate() < 0)) { 189 if (operand.IsImmediate() && (operand.ImmediateValue() < 0)) {
190 AddSubMacro(rd, rn, -operand.immediate(), SetFlags, ADD); 190 AddSubMacro(rd, rn, -operand.ImmediateValue(), SetFlags, ADD);
191 } else { 191 } else {
192 AddSubMacro(rd, rn, operand, SetFlags, SUB); 192 AddSubMacro(rd, rn, operand, SetFlags, SUB);
193 } 193 }
194 } 194 }
195 195
196 196
197 void MacroAssembler::Cmn(const Register& rn, const Operand& operand) { 197 void MacroAssembler::Cmn(const Register& rn, const Operand& operand) {
198 ASSERT(allow_macro_instructions_); 198 ASSERT(allow_macro_instructions_);
199 Adds(AppropriateZeroRegFor(rn), rn, operand); 199 Adds(AppropriateZeroRegFor(rn), rn, operand);
200 } 200 }
201 201
202 202
203 void MacroAssembler::Cmp(const Register& rn, const Operand& operand) { 203 void MacroAssembler::Cmp(const Register& rn, const Operand& operand) {
204 ASSERT(allow_macro_instructions_); 204 ASSERT(allow_macro_instructions_);
205 Subs(AppropriateZeroRegFor(rn), rn, operand); 205 Subs(AppropriateZeroRegFor(rn), rn, operand);
206 } 206 }
207 207
208 208
209 void MacroAssembler::Neg(const Register& rd, 209 void MacroAssembler::Neg(const Register& rd,
210 const Operand& operand) { 210 const Operand& operand) {
211 ASSERT(allow_macro_instructions_); 211 ASSERT(allow_macro_instructions_);
212 ASSERT(!rd.IsZero()); 212 ASSERT(!rd.IsZero());
213 if (operand.IsImmediate()) { 213 if (operand.IsImmediate()) {
214 Mov(rd, -operand.immediate()); 214 Mov(rd, -operand.ImmediateValue());
215 } else { 215 } else {
216 Sub(rd, AppropriateZeroRegFor(rd), operand); 216 Sub(rd, AppropriateZeroRegFor(rd), operand);
217 } 217 }
218 } 218 }
219 219
220 220
221 void MacroAssembler::Negs(const Register& rd, 221 void MacroAssembler::Negs(const Register& rd,
222 const Operand& operand) { 222 const Operand& operand) {
223 ASSERT(allow_macro_instructions_); 223 ASSERT(allow_macro_instructions_);
224 Subs(rd, AppropriateZeroRegFor(rd), operand); 224 Subs(rd, AppropriateZeroRegFor(rd), operand);
(...skipping 485 matching lines...) Expand 10 before | Expand all | Expand 10 after
710 Fmov(fd, static_cast<float>(imm)); 710 Fmov(fd, static_cast<float>(imm));
711 return; 711 return;
712 } 712 }
713 713
714 ASSERT(fd.Is64Bits()); 714 ASSERT(fd.Is64Bits());
715 if (IsImmFP64(imm)) { 715 if (IsImmFP64(imm)) {
716 fmov(fd, imm); 716 fmov(fd, imm);
717 } else if ((imm == 0.0) && (copysign(1.0, imm) == 1.0)) { 717 } else if ((imm == 0.0) && (copysign(1.0, imm) == 1.0)) {
718 fmov(fd, xzr); 718 fmov(fd, xzr);
719 } else { 719 } else {
720 UseScratchRegisterScope temps(this); 720 Ldr(fd, imm);
721 Register tmp = temps.AcquireX();
722 // TODO(all): Use Assembler::ldr(const FPRegister& ft, double imm).
723 Mov(tmp, double_to_rawbits(imm));
724 Fmov(fd, tmp);
725 } 721 }
726 } 722 }
727 723
728 724
729 void MacroAssembler::Fmov(FPRegister fd, float imm) { 725 void MacroAssembler::Fmov(FPRegister fd, float imm) {
730 ASSERT(allow_macro_instructions_); 726 ASSERT(allow_macro_instructions_);
731 if (fd.Is64Bits()) { 727 if (fd.Is64Bits()) {
732 Fmov(fd, static_cast<double>(imm)); 728 Fmov(fd, static_cast<double>(imm));
733 return; 729 return;
734 } 730 }
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
873 void MacroAssembler::Ldpsw(const Register& rt, 869 void MacroAssembler::Ldpsw(const Register& rt,
874 const Register& rt2, 870 const Register& rt2,
875 const MemOperand& src) { 871 const MemOperand& src) {
876 ASSERT(allow_macro_instructions_); 872 ASSERT(allow_macro_instructions_);
877 ASSERT(!rt.IsZero()); 873 ASSERT(!rt.IsZero());
878 ASSERT(!rt2.IsZero()); 874 ASSERT(!rt2.IsZero());
879 ldpsw(rt, rt2, src); 875 ldpsw(rt, rt2, src);
880 } 876 }
881 877
882 878
883 void MacroAssembler::Ldr(const FPRegister& ft, double imm) { 879 void MacroAssembler::Ldr(const CPURegister& rt, const Immediate& imm) {
884 ASSERT(allow_macro_instructions_); 880 ASSERT(allow_macro_instructions_);
885 ldr(ft, imm);
886 }
887
888
889 void MacroAssembler::Ldr(const Register& rt, uint64_t imm) {
890 ASSERT(allow_macro_instructions_);
891 ASSERT(!rt.IsZero());
892 ldr(rt, imm); 881 ldr(rt, imm);
893 } 882 }
894 883
895 884
885 void MacroAssembler::Ldr(const CPURegister& rt, double imm) {
886 ASSERT(allow_macro_instructions_);
887 ASSERT(rt.Is64Bits());
888 ldr(rt, Immediate(double_to_rawbits(imm)));
889 }
890
891
896 void MacroAssembler::Lsl(const Register& rd, 892 void MacroAssembler::Lsl(const Register& rd,
897 const Register& rn, 893 const Register& rn,
898 unsigned shift) { 894 unsigned shift) {
899 ASSERT(allow_macro_instructions_); 895 ASSERT(allow_macro_instructions_);
900 ASSERT(!rd.IsZero()); 896 ASSERT(!rd.IsZero());
901 lsl(rd, rn, shift); 897 lsl(rd, rn, shift);
902 } 898 }
903 899
904 900
905 void MacroAssembler::Lsl(const Register& rd, 901 void MacroAssembler::Lsl(const Register& rd,
(...skipping 351 matching lines...) Expand 10 before | Expand all | Expand 10 after
1257 } else { 1253 } else {
1258 // TODO(jbramley): Several callers rely on this not using scratch 1254 // TODO(jbramley): Several callers rely on this not using scratch
1259 // registers, so we use the assembler directly here. However, this means 1255 // registers, so we use the assembler directly here. However, this means
1260 // that large immediate values of 'space' cannot be handled cleanly. (Only 1256 // that large immediate values of 'space' cannot be handled cleanly. (Only
1261 // 24-bits immediates or values of 'space' that can be encoded in one 1257 // 24-bits immediates or values of 'space' that can be encoded in one
1262 // instruction are accepted.) Once we implement our flexible scratch 1258 // instruction are accepted.) Once we implement our flexible scratch
1263 // register idea, we could greatly simplify this function. 1259 // register idea, we could greatly simplify this function.
1264 InstructionAccurateScope scope(this); 1260 InstructionAccurateScope scope(this);
1265 ASSERT(space.IsImmediate()); 1261 ASSERT(space.IsImmediate());
1266 // Align to 16 bytes. 1262 // Align to 16 bytes.
1267 uint64_t imm = RoundUp(space.immediate(), 0x10); 1263 uint64_t imm = RoundUp(space.ImmediateValue(), 0x10);
1268 ASSERT(is_uint24(imm)); 1264 ASSERT(is_uint24(imm));
1269 1265
1270 Register source = StackPointer(); 1266 Register source = StackPointer();
1271 if (CpuFeatures::IsSupported(ALWAYS_ALIGN_CSP)) { 1267 if (CpuFeatures::IsSupported(ALWAYS_ALIGN_CSP)) {
1272 bic(csp, source, 0xf); 1268 bic(csp, source, 0xf);
1273 source = csp; 1269 source = csp;
1274 } 1270 }
1275 if (!is_uint12(imm)) { 1271 if (!is_uint12(imm)) {
1276 int64_t imm_top_12_bits = imm >> 12; 1272 int64_t imm_top_12_bits = imm >> 12;
1277 sub(csp, source, imm_top_12_bits << 12); 1273 sub(csp, source, imm_top_12_bits << 12);
(...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after
1626 // accesses in the now-free part of the stack. 1622 // accesses in the now-free part of the stack.
1627 SyncSystemStackPointer(); 1623 SyncSystemStackPointer();
1628 } 1624 }
1629 } 1625 }
1630 1626
1631 1627
1632 void MacroAssembler::CompareAndBranch(const Register& lhs, 1628 void MacroAssembler::CompareAndBranch(const Register& lhs,
1633 const Operand& rhs, 1629 const Operand& rhs,
1634 Condition cond, 1630 Condition cond,
1635 Label* label) { 1631 Label* label) {
1636 if (rhs.IsImmediate() && (rhs.immediate() == 0) && 1632 if (rhs.IsImmediate() && (rhs.ImmediateValue() == 0) &&
1637 ((cond == eq) || (cond == ne))) { 1633 ((cond == eq) || (cond == ne))) {
1638 if (cond == eq) { 1634 if (cond == eq) {
1639 Cbz(lhs, label); 1635 Cbz(lhs, label);
1640 } else { 1636 } else {
1641 Cbnz(lhs, label); 1637 Cbnz(lhs, label);
1642 } 1638 }
1643 } else { 1639 } else {
1644 Cmp(lhs, rhs); 1640 Cmp(lhs, rhs);
1645 B(cond, label); 1641 B(cond, label);
1646 } 1642 }
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
1701 // characters are reserved for controlling features of the instrumentation. 1697 // characters are reserved for controlling features of the instrumentation.
1702 ASSERT(isprint(marker_name[0]) && isprint(marker_name[1])); 1698 ASSERT(isprint(marker_name[0]) && isprint(marker_name[1]));
1703 1699
1704 InstructionAccurateScope scope(this, 1); 1700 InstructionAccurateScope scope(this, 1);
1705 movn(xzr, (marker_name[1] << 8) | marker_name[0]); 1701 movn(xzr, (marker_name[1] << 8) | marker_name[0]);
1706 } 1702 }
1707 1703
1708 } } // namespace v8::internal 1704 } } // namespace v8::internal
1709 1705
1710 #endif // V8_ARM64_MACRO_ASSEMBLER_ARM64_INL_H_ 1706 #endif // V8_ARM64_MACRO_ASSEMBLER_ARM64_INL_H_
OLDNEW
« src/arm64/macro-assembler-arm64.h ('K') | « src/arm64/macro-assembler-arm64.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698