| OLD | NEW |
| 1 // Copyright (c) 1994-2006 Sun Microsystems Inc. | 1 // Copyright (c) 1994-2006 Sun Microsystems Inc. |
| 2 // All Rights Reserved. | 2 // All Rights Reserved. |
| 3 // | 3 // |
| 4 // Redistribution and use in source and binary forms, with or without | 4 // Redistribution and use in source and binary forms, with or without |
| 5 // modification, are permitted provided that the following conditions | 5 // modification, are permitted provided that the following conditions |
| 6 // are met: | 6 // are met: |
| 7 // | 7 // |
| 8 // - Redistributions of source code must retain the above copyright notice, | 8 // - Redistributions of source code must retain the above copyright notice, |
| 9 // this list of conditions and the following disclaimer. | 9 // this list of conditions and the following disclaimer. |
| 10 // | 10 // |
| (...skipping 629 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 640 // | 640 // |
| 641 // If the provided buffer is NULL, the assembler allocates and grows its own | 641 // If the provided buffer is NULL, the assembler allocates and grows its own |
| 642 // buffer, and buffer_size determines the initial buffer size. The buffer is | 642 // buffer, and buffer_size determines the initial buffer size. The buffer is |
| 643 // owned by the assembler and deallocated upon destruction of the assembler. | 643 // owned by the assembler and deallocated upon destruction of the assembler. |
| 644 // | 644 // |
| 645 // If the provided buffer is not NULL, the assembler uses the provided buffer | 645 // If the provided buffer is not NULL, the assembler uses the provided buffer |
| 646 // for code generation and assumes its size to be buffer_size. If the buffer | 646 // for code generation and assumes its size to be buffer_size. If the buffer |
| 647 // is too small, a fatal error occurs. No deallocation of the buffer is done | 647 // is too small, a fatal error occurs. No deallocation of the buffer is done |
| 648 // upon destruction of the assembler. | 648 // upon destruction of the assembler. |
| 649 Assembler(Isolate* isolate, void* buffer, int buffer_size); | 649 Assembler(Isolate* isolate, void* buffer, int buffer_size); |
| 650 ~Assembler(); | 650 virtual ~Assembler(); |
| 651 | 651 |
| 652 // GetCode emits any pending (non-emitted) code and fills the descriptor | 652 // GetCode emits any pending (non-emitted) code and fills the descriptor |
| 653 // desc. GetCode() is idempotent; it returns the same result if no other | 653 // desc. GetCode() is idempotent; it returns the same result if no other |
| 654 // Assembler functions are invoked in between GetCode() calls. | 654 // Assembler functions are invoked in between GetCode() calls. |
| 655 void GetCode(CodeDesc* desc); | 655 void GetCode(CodeDesc* desc); |
| 656 | 656 |
| 657 // Label operations & relative jumps (PPUM Appendix D) | 657 // Label operations & relative jumps (PPUM Appendix D) |
| 658 // | 658 // |
| 659 // Takes a branch opcode (cc) and a label (L) and generates | 659 // Takes a branch opcode (cc) and a label (L) and generates |
| 660 // either a backward branch or a forward branch and links it | 660 // either a backward branch or a forward branch and links it |
| (...skipping 608 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1269 // the marker and branch over the data. | 1269 // the marker and branch over the data. |
| 1270 void RecordConstPool(int size); | 1270 void RecordConstPool(int size); |
| 1271 | 1271 |
| 1272 // Writes a single byte or word of data in the code stream. Used | 1272 // Writes a single byte or word of data in the code stream. Used |
| 1273 // for inline tables, e.g., jump-tables. The constant pool should be | 1273 // for inline tables, e.g., jump-tables. The constant pool should be |
| 1274 // emitted before any use of db and dd to ensure that constant pools | 1274 // emitted before any use of db and dd to ensure that constant pools |
| 1275 // are not emitted as part of the tables generated. | 1275 // are not emitted as part of the tables generated. |
| 1276 void db(uint8_t data); | 1276 void db(uint8_t data); |
| 1277 void dd(uint32_t data); | 1277 void dd(uint32_t data); |
| 1278 | 1278 |
| 1279 int pc_offset() const { return pc_ - buffer_; } | |
| 1280 | |
| 1281 PositionsRecorder* positions_recorder() { return &positions_recorder_; } | 1279 PositionsRecorder* positions_recorder() { return &positions_recorder_; } |
| 1282 | 1280 |
| 1283 // Read/patch instructions | 1281 // Read/patch instructions |
| 1284 Instr instr_at(int pos) { return *reinterpret_cast<Instr*>(buffer_ + pos); } | 1282 Instr instr_at(int pos) { return *reinterpret_cast<Instr*>(buffer_ + pos); } |
| 1285 void instr_at_put(int pos, Instr instr) { | 1283 void instr_at_put(int pos, Instr instr) { |
| 1286 *reinterpret_cast<Instr*>(buffer_ + pos) = instr; | 1284 *reinterpret_cast<Instr*>(buffer_ + pos) = instr; |
| 1287 } | 1285 } |
| 1288 static Instr instr_at(byte* pc) { return *reinterpret_cast<Instr*>(pc); } | 1286 static Instr instr_at(byte* pc) { return *reinterpret_cast<Instr*>(pc); } |
| 1289 static void instr_at_put(byte* pc, Instr instr) { | 1287 static void instr_at_put(byte* pc, Instr instr) { |
| 1290 *reinterpret_cast<Instr*>(pc) = instr; | 1288 *reinterpret_cast<Instr*>(pc) = instr; |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1373 next_buffer_check_ = no_const_pool_before_; | 1371 next_buffer_check_ = no_const_pool_before_; |
| 1374 } | 1372 } |
| 1375 } | 1373 } |
| 1376 | 1374 |
| 1377 bool is_const_pool_blocked() const { | 1375 bool is_const_pool_blocked() const { |
| 1378 return (const_pool_blocked_nesting_ > 0) || | 1376 return (const_pool_blocked_nesting_ > 0) || |
| 1379 (pc_offset() < no_const_pool_before_); | 1377 (pc_offset() < no_const_pool_before_); |
| 1380 } | 1378 } |
| 1381 | 1379 |
| 1382 private: | 1380 private: |
| 1383 // Code buffer: | |
| 1384 // The buffer into which code and relocation info are generated. | |
| 1385 byte* buffer_; | |
| 1386 int buffer_size_; | |
| 1387 // True if the assembler owns the buffer, false if buffer is external. | |
| 1388 bool own_buffer_; | |
| 1389 | |
| 1390 int next_buffer_check_; // pc offset of next buffer check | 1381 int next_buffer_check_; // pc offset of next buffer check |
| 1391 | 1382 |
| 1392 // Code generation | 1383 // Code generation |
| 1393 // The relocation writer's position is at least kGap bytes below the end of | 1384 // The relocation writer's position is at least kGap bytes below the end of |
| 1394 // the generated instructions. This is so that multi-instruction sequences do | 1385 // the generated instructions. This is so that multi-instruction sequences do |
| 1395 // not have to check for overflow. The same is true for writes of large | 1386 // not have to check for overflow. The same is true for writes of large |
| 1396 // relocation info entries. | 1387 // relocation info entries. |
| 1397 static const int kGap = 32; | 1388 static const int kGap = 32; |
| 1398 byte* pc_; // the program counter; moves forward | |
| 1399 | 1389 |
| 1400 // Constant pool generation | 1390 // Constant pool generation |
| 1401 // Pools are emitted in the instruction stream, preferably after unconditional | 1391 // Pools are emitted in the instruction stream, preferably after unconditional |
| 1402 // jumps or after returns from functions (in dead code locations). | 1392 // jumps or after returns from functions (in dead code locations). |
| 1403 // If a long code sequence does not contain unconditional jumps, it is | 1393 // If a long code sequence does not contain unconditional jumps, it is |
| 1404 // necessary to emit the constant pool before the pool gets too far from the | 1394 // necessary to emit the constant pool before the pool gets too far from the |
| 1405 // location it is accessed from. In this case, we emit a jump over the emitted | 1395 // location it is accessed from. In this case, we emit a jump over the emitted |
| 1406 // constant pool. | 1396 // constant pool. |
| 1407 // Constants in the pool may be addresses of functions that gets relocated; | 1397 // Constants in the pool may be addresses of functions that gets relocated; |
| 1408 // if so, a relocation info entry is associated to the constant pool entry. | 1398 // if so, a relocation info entry is associated to the constant pool entry. |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1498 public: | 1488 public: |
| 1499 explicit EnsureSpace(Assembler* assembler) { | 1489 explicit EnsureSpace(Assembler* assembler) { |
| 1500 assembler->CheckBuffer(); | 1490 assembler->CheckBuffer(); |
| 1501 } | 1491 } |
| 1502 }; | 1492 }; |
| 1503 | 1493 |
| 1504 | 1494 |
| 1505 } } // namespace v8::internal | 1495 } } // namespace v8::internal |
| 1506 | 1496 |
| 1507 #endif // V8_ARM_ASSEMBLER_ARM_H_ | 1497 #endif // V8_ARM_ASSEMBLER_ARM_H_ |
| OLD | NEW |