| OLD | NEW |
| 1 // Copyright 2009 the V8 project authors. All rights reserved. | 1 // Copyright 2009 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 257 | 257 |
| 258 // ----------------------------------------------------------------------------- | 258 // ----------------------------------------------------------------------------- |
| 259 // Implementation of Assembler | 259 // Implementation of Assembler |
| 260 | 260 |
| 261 #ifdef GENERATED_CODE_COVERAGE | 261 #ifdef GENERATED_CODE_COVERAGE |
| 262 static void InitCoverageLog(); | 262 static void InitCoverageLog(); |
| 263 #endif | 263 #endif |
| 264 | 264 |
| 265 byte* Assembler::spare_buffer_ = NULL; | 265 byte* Assembler::spare_buffer_ = NULL; |
| 266 | 266 |
| 267 Assembler::Assembler(void* buffer, int buffer_size) { | 267 Assembler::Assembler(void* buffer, int buffer_size) |
| 268 : code_targets_(100) { |
| 268 if (buffer == NULL) { | 269 if (buffer == NULL) { |
| 269 // do our own buffer management | 270 // do our own buffer management |
| 270 if (buffer_size <= kMinimalBufferSize) { | 271 if (buffer_size <= kMinimalBufferSize) { |
| 271 buffer_size = kMinimalBufferSize; | 272 buffer_size = kMinimalBufferSize; |
| 272 | 273 |
| 273 if (spare_buffer_ != NULL) { | 274 if (spare_buffer_ != NULL) { |
| 274 buffer = spare_buffer_; | 275 buffer = spare_buffer_; |
| 275 spare_buffer_ = NULL; | 276 spare_buffer_ = NULL; |
| 276 } | 277 } |
| 277 } | 278 } |
| (...skipping 477 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 755 L->link_to(pc_offset() - sizeof(int32_t)); | 756 L->link_to(pc_offset() - sizeof(int32_t)); |
| 756 } else { | 757 } else { |
| 757 ASSERT(L->is_unused()); | 758 ASSERT(L->is_unused()); |
| 758 int32_t current = pc_offset(); | 759 int32_t current = pc_offset(); |
| 759 emitl(current); | 760 emitl(current); |
| 760 L->link_to(current); | 761 L->link_to(current); |
| 761 } | 762 } |
| 762 } | 763 } |
| 763 | 764 |
| 764 | 765 |
| 766 void Assembler::call(Handle<Code> target, RelocInfo::Mode rmode) { |
| 767 EnsureSpace ensure_space(this); |
| 768 last_pc_ = pc_; |
| 769 // 1110 1000 #32-bit disp |
| 770 emit(0xE8); |
| 771 emit_code_target(target, rmode); |
| 772 } |
| 773 |
| 774 |
| 765 void Assembler::call(Register adr) { | 775 void Assembler::call(Register adr) { |
| 766 EnsureSpace ensure_space(this); | 776 EnsureSpace ensure_space(this); |
| 767 last_pc_ = pc_; | 777 last_pc_ = pc_; |
| 768 // Opcode: FF /2 r64 | 778 // Opcode: FF /2 r64 |
| 769 if (adr.high_bit()) { | 779 if (adr.high_bit()) { |
| 770 emit_rex_64(adr); | 780 emit_rex_64(adr); |
| 771 } | 781 } |
| 772 emit(0xFF); | 782 emit(0xFF); |
| 773 emit_modrm(0x2, adr); | 783 emit_modrm(0x2, adr); |
| 774 } | 784 } |
| (...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1055 ASSERT(L->is_unused()); | 1065 ASSERT(L->is_unused()); |
| 1056 emit(0x0F); | 1066 emit(0x0F); |
| 1057 emit(0x80 | cc); | 1067 emit(0x80 | cc); |
| 1058 int32_t current = pc_offset(); | 1068 int32_t current = pc_offset(); |
| 1059 emitl(current); | 1069 emitl(current); |
| 1060 L->link_to(current); | 1070 L->link_to(current); |
| 1061 } | 1071 } |
| 1062 } | 1072 } |
| 1063 | 1073 |
| 1064 | 1074 |
| 1075 void Assembler::j(Condition cc, |
| 1076 Handle<Code> target, |
| 1077 RelocInfo::Mode rmode) { |
| 1078 EnsureSpace ensure_space(this); |
| 1079 last_pc_ = pc_; |
| 1080 ASSERT(is_uint4(cc)); |
| 1081 // 0000 1111 1000 tttn #32-bit disp |
| 1082 emit(0x0F); |
| 1083 emit(0x80 | cc); |
| 1084 emit_code_target(target, rmode); |
| 1085 } |
| 1086 |
| 1087 |
| 1065 void Assembler::jmp(Label* L) { | 1088 void Assembler::jmp(Label* L) { |
| 1066 EnsureSpace ensure_space(this); | 1089 EnsureSpace ensure_space(this); |
| 1067 last_pc_ = pc_; | 1090 last_pc_ = pc_; |
| 1068 if (L->is_bound()) { | 1091 if (L->is_bound()) { |
| 1069 int offs = L->pos() - pc_offset() - 1; | 1092 int offs = L->pos() - pc_offset() - 1; |
| 1070 ASSERT(offs <= 0); | 1093 ASSERT(offs <= 0); |
| 1071 if (is_int8(offs - sizeof(int8_t))) { | 1094 if (is_int8(offs - sizeof(int8_t))) { |
| 1072 // 1110 1011 #8-bit disp | 1095 // 1110 1011 #8-bit disp |
| 1073 emit(0xEB); | 1096 emit(0xEB); |
| 1074 emit((offs - sizeof(int8_t)) & 0xFF); | 1097 emit((offs - sizeof(int8_t)) & 0xFF); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1086 // 1110 1001 #32-bit disp | 1109 // 1110 1001 #32-bit disp |
| 1087 ASSERT(L->is_unused()); | 1110 ASSERT(L->is_unused()); |
| 1088 emit(0xE9); | 1111 emit(0xE9); |
| 1089 int32_t current = pc_offset(); | 1112 int32_t current = pc_offset(); |
| 1090 emitl(current); | 1113 emitl(current); |
| 1091 L->link_to(current); | 1114 L->link_to(current); |
| 1092 } | 1115 } |
| 1093 } | 1116 } |
| 1094 | 1117 |
| 1095 | 1118 |
| 1119 void Assembler::jmp(Handle<Code> target, RelocInfo::Mode rmode) { |
| 1120 EnsureSpace ensure_space(this); |
| 1121 last_pc_ = pc_; |
| 1122 // 1110 1001 #32-bit disp |
| 1123 emit(0xE9); |
| 1124 emit_code_target(target, rmode); |
| 1125 } |
| 1126 |
| 1127 |
| 1096 void Assembler::jmp(Register target) { | 1128 void Assembler::jmp(Register target) { |
| 1097 EnsureSpace ensure_space(this); | 1129 EnsureSpace ensure_space(this); |
| 1098 last_pc_ = pc_; | 1130 last_pc_ = pc_; |
| 1099 // Opcode FF/4 r64 | 1131 // Opcode FF/4 r64 |
| 1100 if (target.high_bit()) { | 1132 if (target.high_bit()) { |
| 1101 emit_rex_64(target); | 1133 emit_rex_64(target); |
| 1102 } | 1134 } |
| 1103 emit(0xFF); | 1135 emit(0xFF); |
| 1104 emit_modrm(0x4, target); | 1136 emit_modrm(0x4, target); |
| 1105 } | 1137 } |
| (...skipping 1274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2380 // also different from the written statement position. | 2412 // also different from the written statement position. |
| 2381 if (current_position_ != written_position_ && | 2413 if (current_position_ != written_position_ && |
| 2382 current_position_ != written_statement_position_) { | 2414 current_position_ != written_statement_position_) { |
| 2383 EnsureSpace ensure_space(this); | 2415 EnsureSpace ensure_space(this); |
| 2384 RecordRelocInfo(RelocInfo::POSITION, current_position_); | 2416 RecordRelocInfo(RelocInfo::POSITION, current_position_); |
| 2385 written_position_ = current_position_; | 2417 written_position_ = current_position_; |
| 2386 } | 2418 } |
| 2387 } | 2419 } |
| 2388 | 2420 |
| 2389 | 2421 |
| 2390 const int RelocInfo::kApplyMask = 1 << RelocInfo::INTERNAL_REFERENCE; | 2422 const int RelocInfo::kApplyMask = RelocInfo::kCodeTargetMask | |
| 2391 | 2423 1 << RelocInfo::INTERNAL_REFERENCE | |
| 2424 1 << RelocInfo::JS_RETURN; |
| 2392 | 2425 |
| 2393 } } // namespace v8::internal | 2426 } } // namespace v8::internal |
| OLD | NEW |