| 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 |