OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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_ |
OLD | NEW |