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_ASSEMBLER_ARM64_H_ | 5 #ifndef V8_ARM64_ASSEMBLER_ARM64_H_ |
6 #define V8_ARM64_ASSEMBLER_ARM64_H_ | 6 #define V8_ARM64_ASSEMBLER_ARM64_H_ |
7 | 7 |
8 #include <deque> | 8 #include <deque> |
9 #include <list> | 9 #include <list> |
10 #include <map> | 10 #include <map> |
(...skipping 1477 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1488 void ldp(const CPURegister& rt, const CPURegister& rt2, | 1488 void ldp(const CPURegister& rt, const CPURegister& rt2, |
1489 const MemOperand& src); | 1489 const MemOperand& src); |
1490 | 1490 |
1491 // Store integer or FP register pair. | 1491 // Store integer or FP register pair. |
1492 void stp(const CPURegister& rt, const CPURegister& rt2, | 1492 void stp(const CPURegister& rt, const CPURegister& rt2, |
1493 const MemOperand& dst); | 1493 const MemOperand& dst); |
1494 | 1494 |
1495 // Load word pair with sign extension. | 1495 // Load word pair with sign extension. |
1496 void ldpsw(const Register& rt, const Register& rt2, const MemOperand& src); | 1496 void ldpsw(const Register& rt, const Register& rt2, const MemOperand& src); |
1497 | 1497 |
1498 // Load integer or FP register pair, non-temporal. | |
1499 void ldnp(const CPURegister& rt, const CPURegister& rt2, | |
1500 const MemOperand& src); | |
1501 | |
1502 // Store integer or FP register pair, non-temporal. | |
1503 void stnp(const CPURegister& rt, const CPURegister& rt2, | |
1504 const MemOperand& dst); | |
1505 | |
1506 // Load literal to register from a pc relative address. | 1498 // Load literal to register from a pc relative address. |
1507 void ldr_pcrel(const CPURegister& rt, int imm19); | 1499 void ldr_pcrel(const CPURegister& rt, int imm19); |
1508 | 1500 |
1509 // Load literal to register. | 1501 // Load literal to register. |
1510 void ldr(const CPURegister& rt, const Immediate& imm); | 1502 void ldr(const CPURegister& rt, const Immediate& imm); |
1511 | 1503 |
1512 // Move instructions. The default shift of -1 indicates that the move | 1504 // Move instructions. The default shift of -1 indicates that the move |
1513 // instruction will calculate an appropriate 16-bit immediate and left shift | 1505 // instruction will calculate an appropriate 16-bit immediate and left shift |
1514 // that is equal to the 64-bit immediate argument. If an explicit left shift | 1506 // that is equal to the 64-bit immediate argument. If an explicit left shift |
1515 // is specified (0, 16, 32 or 48), the immediate must be a 16-bit value. | 1507 // is specified (0, 16, 32 or 48), the immediate must be a 16-bit value. |
(...skipping 487 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2003 | 1995 |
2004 // Find an appropriate LoadStoreOp or LoadStorePairOp for the specified | 1996 // Find an appropriate LoadStoreOp or LoadStorePairOp for the specified |
2005 // registers. Only simple loads are supported; sign- and zero-extension (such | 1997 // registers. Only simple loads are supported; sign- and zero-extension (such |
2006 // as in LDPSW_x or LDRB_w) are not supported. | 1998 // as in LDPSW_x or LDRB_w) are not supported. |
2007 static inline LoadStoreOp LoadOpFor(const CPURegister& rt); | 1999 static inline LoadStoreOp LoadOpFor(const CPURegister& rt); |
2008 static inline LoadStorePairOp LoadPairOpFor(const CPURegister& rt, | 2000 static inline LoadStorePairOp LoadPairOpFor(const CPURegister& rt, |
2009 const CPURegister& rt2); | 2001 const CPURegister& rt2); |
2010 static inline LoadStoreOp StoreOpFor(const CPURegister& rt); | 2002 static inline LoadStoreOp StoreOpFor(const CPURegister& rt); |
2011 static inline LoadStorePairOp StorePairOpFor(const CPURegister& rt, | 2003 static inline LoadStorePairOp StorePairOpFor(const CPURegister& rt, |
2012 const CPURegister& rt2); | 2004 const CPURegister& rt2); |
2013 static inline LoadStorePairNonTemporalOp LoadPairNonTemporalOpFor( | |
2014 const CPURegister& rt, const CPURegister& rt2); | |
2015 static inline LoadStorePairNonTemporalOp StorePairNonTemporalOpFor( | |
2016 const CPURegister& rt, const CPURegister& rt2); | |
2017 static inline LoadLiteralOp LoadLiteralOpFor(const CPURegister& rt); | 2005 static inline LoadLiteralOp LoadLiteralOpFor(const CPURegister& rt); |
2018 | 2006 |
2019 // Remove the specified branch from the unbound label link chain. | 2007 // Remove the specified branch from the unbound label link chain. |
2020 // If available, a veneer for this label can be used for other branches in the | 2008 // If available, a veneer for this label can be used for other branches in the |
2021 // chain if the link chain cannot be fixed up without this branch. | 2009 // chain if the link chain cannot be fixed up without this branch. |
2022 void RemoveBranchFromLabelLinkChain(Instruction* branch, | 2010 void RemoveBranchFromLabelLinkChain(Instruction* branch, |
2023 Label* label, | 2011 Label* label, |
2024 Instruction* label_veneer = NULL); | 2012 Instruction* label_veneer = NULL); |
2025 | 2013 |
2026 private: | 2014 private: |
2027 // Instruction helpers. | 2015 // Instruction helpers. |
2028 void MoveWide(const Register& rd, | 2016 void MoveWide(const Register& rd, |
2029 uint64_t imm, | 2017 uint64_t imm, |
2030 int shift, | 2018 int shift, |
2031 MoveWideImmediateOp mov_op); | 2019 MoveWideImmediateOp mov_op); |
2032 void DataProcShiftedRegister(const Register& rd, | 2020 void DataProcShiftedRegister(const Register& rd, |
2033 const Register& rn, | 2021 const Register& rn, |
2034 const Operand& operand, | 2022 const Operand& operand, |
2035 FlagsUpdate S, | 2023 FlagsUpdate S, |
2036 Instr op); | 2024 Instr op); |
2037 void DataProcExtendedRegister(const Register& rd, | 2025 void DataProcExtendedRegister(const Register& rd, |
2038 const Register& rn, | 2026 const Register& rn, |
2039 const Operand& operand, | 2027 const Operand& operand, |
2040 FlagsUpdate S, | 2028 FlagsUpdate S, |
2041 Instr op); | 2029 Instr op); |
2042 void LoadStorePairNonTemporal(const CPURegister& rt, | |
2043 const CPURegister& rt2, | |
2044 const MemOperand& addr, | |
2045 LoadStorePairNonTemporalOp op); | |
2046 void ConditionalSelect(const Register& rd, | 2030 void ConditionalSelect(const Register& rd, |
2047 const Register& rn, | 2031 const Register& rn, |
2048 const Register& rm, | 2032 const Register& rm, |
2049 Condition cond, | 2033 Condition cond, |
2050 ConditionalSelectOp op); | 2034 ConditionalSelectOp op); |
2051 void DataProcessing1Source(const Register& rd, | 2035 void DataProcessing1Source(const Register& rd, |
2052 const Register& rn, | 2036 const Register& rn, |
2053 DataProcessing1SourceOp op); | 2037 DataProcessing1SourceOp op); |
2054 void DataProcessing3Source(const Register& rd, | 2038 void DataProcessing3Source(const Register& rd, |
2055 const Register& rn, | 2039 const Register& rn, |
(...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2311 class EnsureSpace BASE_EMBEDDED { | 2295 class EnsureSpace BASE_EMBEDDED { |
2312 public: | 2296 public: |
2313 explicit EnsureSpace(Assembler* assembler) { | 2297 explicit EnsureSpace(Assembler* assembler) { |
2314 assembler->CheckBufferSpace(); | 2298 assembler->CheckBufferSpace(); |
2315 } | 2299 } |
2316 }; | 2300 }; |
2317 | 2301 |
2318 } } // namespace v8::internal | 2302 } } // namespace v8::internal |
2319 | 2303 |
2320 #endif // V8_ARM64_ASSEMBLER_ARM64_H_ | 2304 #endif // V8_ARM64_ASSEMBLER_ARM64_H_ |
OLD | NEW |