Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(381)

Side by Side Diff: src/assembler-ia32.cc

Issue 3186: Refactor the enum RelocMode changing the naming scheme from lower case to... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 12 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/assembler-ia32.h ('k') | src/assembler-ia32-inl.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
144 ASSERT(NextField::is_valid(Assembler::kMaximalBufferSize)); 144 ASSERT(NextField::is_valid(Assembler::kMaximalBufferSize));
145 data_ = NextField::encode(next) | TypeField::encode(type); 145 data_ = NextField::encode(next) | TypeField::encode(type);
146 } 146 }
147 147
148 148
149 // ----------------------------------------------------------------------------- 149 // -----------------------------------------------------------------------------
150 // Implementation of RelocInfo 150 // Implementation of RelocInfo
151 151
152 152
153 const int RelocInfo::kApplyMask = 153 const int RelocInfo::kApplyMask =
154 RelocInfo::kCodeTargetMask | 1 << runtime_entry | 154 RelocInfo::kCodeTargetMask | 1 << RelocInfo::RUNTIME_ENTRY |
155 1 << js_return | 1 << internal_reference; 155 1 << RelocInfo::JS_RETURN | 1 << RelocInfo::INTERNAL_REFERENCE;
156 156
157 157
158 void RelocInfo::patch_code(byte* instructions, int instruction_count) { 158 void RelocInfo::patch_code(byte* instructions, int instruction_count) {
159 // Patch the code at the current address with the supplied instructions. 159 // Patch the code at the current address with the supplied instructions.
160 for (int i = 0; i < instruction_count; i++) { 160 for (int i = 0; i < instruction_count; i++) {
161 *(pc_ + i) = *(instructions + i); 161 *(pc_ + i) = *(instructions + i);
162 } 162 }
163 } 163 }
164 164
165 165
166 // Patch the code at the current PC with a call to the target address. 166 // Patch the code at the current PC with a call to the target address.
167 // Additional guard int3 instructions can be added if required. 167 // Additional guard int3 instructions can be added if required.
168 void RelocInfo::patch_code_with_call(Address target, int guard_bytes) { 168 void RelocInfo::patch_code_with_call(Address target, int guard_bytes) {
169 // Call instruction takes up 5 bytes and int3 takes up one byte. 169 // Call instruction takes up 5 bytes and int3 takes up one byte.
170 int code_size = 5 + guard_bytes; 170 int code_size = 5 + guard_bytes;
171 171
172 // Patch the code. 172 // Patch the code.
173 CodePatcher patcher(pc_, code_size); 173 CodePatcher patcher(pc_, code_size);
174 patcher.masm()->call(target, no_reloc); 174 patcher.masm()->call(target, RelocInfo::NONE);
175 175
176 // Add the requested number of int3 instructions after the call. 176 // Add the requested number of int3 instructions after the call.
177 for (int i = 0; i < guard_bytes; i++) { 177 for (int i = 0; i < guard_bytes; i++) {
178 patcher.masm()->int3(); 178 patcher.masm()->int3();
179 } 179 }
180 } 180 }
181 181
182 182
183 // ----------------------------------------------------------------------------- 183 // -----------------------------------------------------------------------------
184 // Implementation of Operand 184 // Implementation of Operand
185 185
186 Operand::Operand(Register base, int32_t disp, RelocMode rmode) { 186 Operand::Operand(Register base, int32_t disp, RelocInfo::Mode rmode) {
187 // [base + disp/r] 187 // [base + disp/r]
188 if (disp == 0 && rmode == no_reloc && !base.is(ebp)) { 188 if (disp == 0 && rmode == RelocInfo::NONE && !base.is(ebp)) {
189 // [base] 189 // [base]
190 set_modrm(0, base); 190 set_modrm(0, base);
191 if (base.is(esp)) set_sib(times_1, esp, base); 191 if (base.is(esp)) set_sib(times_1, esp, base);
192 } else if (is_int8(disp) && rmode == no_reloc) { 192 } else if (is_int8(disp) && rmode == RelocInfo::NONE) {
193 // [base + disp8] 193 // [base + disp8]
194 set_modrm(1, base); 194 set_modrm(1, base);
195 if (base.is(esp)) set_sib(times_1, esp, base); 195 if (base.is(esp)) set_sib(times_1, esp, base);
196 set_disp8(disp); 196 set_disp8(disp);
197 } else { 197 } else {
198 // [base + disp/r] 198 // [base + disp/r]
199 set_modrm(2, base); 199 set_modrm(2, base);
200 if (base.is(esp)) set_sib(times_1, esp, base); 200 if (base.is(esp)) set_sib(times_1, esp, base);
201 set_dispr(disp, rmode); 201 set_dispr(disp, rmode);
202 } 202 }
203 } 203 }
204 204
205 205
206 Operand::Operand(Register base, 206 Operand::Operand(Register base,
207 Register index, 207 Register index,
208 ScaleFactor scale, 208 ScaleFactor scale,
209 int32_t disp, 209 int32_t disp,
210 RelocMode rmode) { 210 RelocInfo::Mode rmode) {
211 ASSERT(!index.is(esp)); // illegal addressing mode 211 ASSERT(!index.is(esp)); // illegal addressing mode
212 // [base + index*scale + disp/r] 212 // [base + index*scale + disp/r]
213 if (disp == 0 && rmode == no_reloc && !base.is(ebp)) { 213 if (disp == 0 && rmode == RelocInfo::NONE && !base.is(ebp)) {
214 // [base + index*scale] 214 // [base + index*scale]
215 set_modrm(0, esp); 215 set_modrm(0, esp);
216 set_sib(scale, index, base); 216 set_sib(scale, index, base);
217 } else if (is_int8(disp) && rmode == no_reloc) { 217 } else if (is_int8(disp) && rmode == RelocInfo::NONE) {
218 // [base + index*scale + disp8] 218 // [base + index*scale + disp8]
219 set_modrm(1, esp); 219 set_modrm(1, esp);
220 set_sib(scale, index, base); 220 set_sib(scale, index, base);
221 set_disp8(disp); 221 set_disp8(disp);
222 } else { 222 } else {
223 // [base + index*scale + disp/r] 223 // [base + index*scale + disp/r]
224 set_modrm(2, esp); 224 set_modrm(2, esp);
225 set_sib(scale, index, base); 225 set_sib(scale, index, base);
226 set_dispr(disp, rmode); 226 set_dispr(disp, rmode);
227 } 227 }
228 } 228 }
229 229
230 230
231 Operand::Operand(Register index, 231 Operand::Operand(Register index,
232 ScaleFactor scale, 232 ScaleFactor scale,
233 int32_t disp, 233 int32_t disp,
234 RelocMode rmode) { 234 RelocInfo::Mode rmode) {
235 ASSERT(!index.is(esp)); // illegal addressing mode 235 ASSERT(!index.is(esp)); // illegal addressing mode
236 // [index*scale + disp/r] 236 // [index*scale + disp/r]
237 set_modrm(0, esp); 237 set_modrm(0, esp);
238 set_sib(scale, index, ebp); 238 set_sib(scale, index, ebp);
239 set_dispr(disp, rmode); 239 set_dispr(disp, rmode);
240 } 240 }
241 241
242 242
243 void Operand::set_sib(ScaleFactor scale, Register index, Register base) { 243 void Operand::set_sib(ScaleFactor scale, Register index, Register base) {
244 ASSERT(len_ == 1); 244 ASSERT(len_ == 1);
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
310 memset(buffer_, 0xCC, buffer_size); // int3 310 memset(buffer_, 0xCC, buffer_size); // int3
311 } 311 }
312 312
313 // setup buffer pointers 313 // setup buffer pointers
314 ASSERT(buffer_ != NULL); 314 ASSERT(buffer_ != NULL);
315 pc_ = buffer_; 315 pc_ = buffer_;
316 reloc_info_writer.Reposition(buffer_ + buffer_size, pc_); 316 reloc_info_writer.Reposition(buffer_ + buffer_size, pc_);
317 317
318 last_pc_ = NULL; 318 last_pc_ = NULL;
319 last_bound_pos_ = 0; 319 last_bound_pos_ = 0;
320 last_position_ = kNoPosition; 320 last_position_ = RelocInfo::kNoPosition;
321 last_statement_position_ = kNoPosition; 321 last_statement_position_ = RelocInfo::kNoPosition;
322 } 322 }
323 323
324 324
325 Assembler::~Assembler() { 325 Assembler::~Assembler() {
326 if (own_buffer_) { 326 if (own_buffer_) {
327 if (spare_buffer_ == NULL && buffer_size_ == kMinimalBufferSize) { 327 if (spare_buffer_ == NULL && buffer_size_ == kMinimalBufferSize) {
328 spare_buffer_ = buffer_; 328 spare_buffer_ = buffer_;
329 } else { 329 } else {
330 DeleteArray(buffer_); 330 DeleteArray(buffer_);
331 } 331 }
(...skipping 672 matching lines...) Expand 10 before | Expand all | Expand 10 after
1004 EMIT(0x29); 1004 EMIT(0x29);
1005 emit_operand(dst, src); 1005 emit_operand(dst, src);
1006 } 1006 }
1007 1007
1008 1008
1009 void Assembler::test(Register reg, const Immediate& imm) { 1009 void Assembler::test(Register reg, const Immediate& imm) {
1010 EnsureSpace ensure_space(this); 1010 EnsureSpace ensure_space(this);
1011 last_pc_ = pc_; 1011 last_pc_ = pc_;
1012 // Only use test against byte for registers that have a byte 1012 // Only use test against byte for registers that have a byte
1013 // variant: eax, ebx, ecx, and edx. 1013 // variant: eax, ebx, ecx, and edx.
1014 if (imm.rmode_ == no_reloc && is_uint8(imm.x_) && reg.code() < 4) { 1014 if (imm.rmode_ == RelocInfo::NONE && is_uint8(imm.x_) && reg.code() < 4) {
1015 uint8_t imm8 = imm.x_; 1015 uint8_t imm8 = imm.x_;
1016 if (reg.is(eax)) { 1016 if (reg.is(eax)) {
1017 EMIT(0xA8); 1017 EMIT(0xA8);
1018 EMIT(imm8); 1018 EMIT(imm8);
1019 } else { 1019 } else {
1020 emit_arith_b(0xF6, 0xC0, reg, imm8); 1020 emit_arith_b(0xF6, 0xC0, reg, imm8);
1021 } 1021 }
1022 } else { 1022 } else {
1023 // This is not using emit_arith because test doesn't support 1023 // This is not using emit_arith because test doesn't support
1024 // sign-extension of 8-bit operands. 1024 // sign-extension of 8-bit operands.
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after
1283 EMIT(0xE8); 1283 EMIT(0xE8);
1284 emit(offs - long_size); 1284 emit(offs - long_size);
1285 } else { 1285 } else {
1286 // 1110 1000 #32-bit disp 1286 // 1110 1000 #32-bit disp
1287 EMIT(0xE8); 1287 EMIT(0xE8);
1288 emit_disp(L, Displacement::OTHER); 1288 emit_disp(L, Displacement::OTHER);
1289 } 1289 }
1290 } 1290 }
1291 1291
1292 1292
1293 void Assembler::call(byte* entry, RelocMode rmode) { 1293 void Assembler::call(byte* entry, RelocInfo::Mode rmode) {
1294 EnsureSpace ensure_space(this); 1294 EnsureSpace ensure_space(this);
1295 last_pc_ = pc_; 1295 last_pc_ = pc_;
1296 ASSERT(!is_code_target(rmode)); 1296 ASSERT(!RelocInfo::IsCodeTarget(rmode));
1297 EMIT(0xE8); 1297 EMIT(0xE8);
1298 emit(entry - (pc_ + sizeof(int32_t)), rmode); 1298 emit(entry - (pc_ + sizeof(int32_t)), rmode);
1299 } 1299 }
1300 1300
1301 1301
1302 void Assembler::call(const Operand& adr) { 1302 void Assembler::call(const Operand& adr) {
1303 EnsureSpace ensure_space(this); 1303 EnsureSpace ensure_space(this);
1304 last_pc_ = pc_; 1304 last_pc_ = pc_;
1305 EMIT(0xFF); 1305 EMIT(0xFF);
1306 emit_operand(edx, adr); 1306 emit_operand(edx, adr);
1307 } 1307 }
1308 1308
1309 1309
1310 void Assembler::call(Handle<Code> code, RelocMode rmode) { 1310 void Assembler::call(Handle<Code> code, RelocInfo::Mode rmode) {
1311 WriteRecordedPositions(); 1311 WriteRecordedPositions();
1312 EnsureSpace ensure_space(this); 1312 EnsureSpace ensure_space(this);
1313 last_pc_ = pc_; 1313 last_pc_ = pc_;
1314 ASSERT(is_code_target(rmode)); 1314 ASSERT(RelocInfo::IsCodeTarget(rmode));
1315 EMIT(0xE8); 1315 EMIT(0xE8);
1316 emit(reinterpret_cast<intptr_t>(code.location()), rmode); 1316 emit(reinterpret_cast<intptr_t>(code.location()), rmode);
1317 } 1317 }
1318 1318
1319 1319
1320 void Assembler::jmp(Label* L) { 1320 void Assembler::jmp(Label* L) {
1321 EnsureSpace ensure_space(this); 1321 EnsureSpace ensure_space(this);
1322 last_pc_ = pc_; 1322 last_pc_ = pc_;
1323 if (L->is_bound()) { 1323 if (L->is_bound()) {
1324 const int short_size = 2; 1324 const int short_size = 2;
(...skipping 20 matching lines...) Expand all
1345 } 1345 }
1346 link_to(L, &unbound_label_); 1346 link_to(L, &unbound_label_);
1347 } 1347 }
1348 // 1110 1001 #32-bit disp 1348 // 1110 1001 #32-bit disp
1349 EMIT(0xE9); 1349 EMIT(0xE9);
1350 emit_disp(L, Displacement::UNCONDITIONAL_JUMP); 1350 emit_disp(L, Displacement::UNCONDITIONAL_JUMP);
1351 } 1351 }
1352 } 1352 }
1353 1353
1354 1354
1355 void Assembler::jmp(byte* entry, RelocMode rmode) { 1355 void Assembler::jmp(byte* entry, RelocInfo::Mode rmode) {
1356 EnsureSpace ensure_space(this); 1356 EnsureSpace ensure_space(this);
1357 last_pc_ = pc_; 1357 last_pc_ = pc_;
1358 ASSERT(!is_code_target(rmode)); 1358 ASSERT(!RelocInfo::IsCodeTarget(rmode));
1359 EMIT(0xE9); 1359 EMIT(0xE9);
1360 emit(entry - (pc_ + sizeof(int32_t)), rmode); 1360 emit(entry - (pc_ + sizeof(int32_t)), rmode);
1361 } 1361 }
1362 1362
1363 1363
1364 void Assembler::jmp(const Operand& adr) { 1364 void Assembler::jmp(const Operand& adr) {
1365 EnsureSpace ensure_space(this); 1365 EnsureSpace ensure_space(this);
1366 last_pc_ = pc_; 1366 last_pc_ = pc_;
1367 EMIT(0xFF); 1367 EMIT(0xFF);
1368 emit_operand(esp, adr); 1368 emit_operand(esp, adr);
1369 } 1369 }
1370 1370
1371 1371
1372 void Assembler::jmp(Handle<Code> code, RelocMode rmode) { 1372 void Assembler::jmp(Handle<Code> code, RelocInfo::Mode rmode) {
1373 EnsureSpace ensure_space(this); 1373 EnsureSpace ensure_space(this);
1374 last_pc_ = pc_; 1374 last_pc_ = pc_;
1375 ASSERT(is_code_target(rmode)); 1375 ASSERT(RelocInfo::IsCodeTarget(rmode));
1376 EMIT(0xE9); 1376 EMIT(0xE9);
1377 emit(reinterpret_cast<intptr_t>(code.location()), rmode); 1377 emit(reinterpret_cast<intptr_t>(code.location()), rmode);
1378 } 1378 }
1379 1379
1380 1380
1381 1381
1382 void Assembler::j(Condition cc, Label* L, Hint hint) { 1382 void Assembler::j(Condition cc, Label* L, Hint hint) {
1383 EnsureSpace ensure_space(this); 1383 EnsureSpace ensure_space(this);
1384 last_pc_ = pc_; 1384 last_pc_ = pc_;
1385 ASSERT(0 <= cc && cc < 16); 1385 ASSERT(0 <= cc && cc < 16);
(...skipping 17 matching lines...) Expand all
1403 // 0000 1111 1000 tttn #32-bit disp 1403 // 0000 1111 1000 tttn #32-bit disp
1404 // Note: could eliminate cond. jumps to this jump if condition 1404 // Note: could eliminate cond. jumps to this jump if condition
1405 // is the same however, seems to be rather unlikely case. 1405 // is the same however, seems to be rather unlikely case.
1406 EMIT(0x0F); 1406 EMIT(0x0F);
1407 EMIT(0x80 | cc); 1407 EMIT(0x80 | cc);
1408 emit_disp(L, Displacement::OTHER); 1408 emit_disp(L, Displacement::OTHER);
1409 } 1409 }
1410 } 1410 }
1411 1411
1412 1412
1413 void Assembler::j(Condition cc, byte* entry, RelocMode rmode, Hint hint) { 1413 void Assembler::j(Condition cc, byte* entry, RelocInfo::Mode rmode, Hint hint) {
1414 EnsureSpace ensure_space(this); 1414 EnsureSpace ensure_space(this);
1415 last_pc_ = pc_; 1415 last_pc_ = pc_;
1416 ASSERT((0 <= cc) && (cc < 16)); 1416 ASSERT((0 <= cc) && (cc < 16));
1417 if (FLAG_emit_branch_hints && hint != no_hint) EMIT(hint); 1417 if (FLAG_emit_branch_hints && hint != no_hint) EMIT(hint);
1418 // 0000 1111 1000 tttn #32-bit disp 1418 // 0000 1111 1000 tttn #32-bit disp
1419 EMIT(0x0F); 1419 EMIT(0x0F);
1420 EMIT(0x80 | cc); 1420 EMIT(0x80 | cc);
1421 emit(entry - (pc_ + sizeof(int32_t)), rmode); 1421 emit(entry - (pc_ + sizeof(int32_t)), rmode);
1422 } 1422 }
1423 1423
1424 1424
1425 void Assembler::j(Condition cc, Handle<Code> code, Hint hint) { 1425 void Assembler::j(Condition cc, Handle<Code> code, Hint hint) {
1426 EnsureSpace ensure_space(this); 1426 EnsureSpace ensure_space(this);
1427 last_pc_ = pc_; 1427 last_pc_ = pc_;
1428 if (FLAG_emit_branch_hints && hint != no_hint) EMIT(hint); 1428 if (FLAG_emit_branch_hints && hint != no_hint) EMIT(hint);
1429 // 0000 1111 1000 tttn #32-bit disp 1429 // 0000 1111 1000 tttn #32-bit disp
1430 EMIT(0x0F); 1430 EMIT(0x0F);
1431 EMIT(0x80 | cc); 1431 EMIT(0x80 | cc);
1432 emit(reinterpret_cast<intptr_t>(code.location()), code_target); 1432 emit(reinterpret_cast<intptr_t>(code.location()), RelocInfo::CODE_TARGET);
1433 } 1433 }
1434 1434
1435 1435
1436 // FPU instructions 1436 // FPU instructions
1437 1437
1438 1438
1439 void Assembler::fld(int i) { 1439 void Assembler::fld(int i) {
1440 EnsureSpace ensure_space(this); 1440 EnsureSpace ensure_space(this);
1441 last_pc_ = pc_; 1441 last_pc_ = pc_;
1442 emit_farith(0xD9, 0xC0, i); 1442 emit_farith(0xD9, 0xC0, i);
(...skipping 399 matching lines...) Expand 10 before | Expand all | Expand 10 after
1842 1842
1843 1843
1844 void Assembler::Print() { 1844 void Assembler::Print() {
1845 Disassembler::Decode(stdout, buffer_, pc_); 1845 Disassembler::Decode(stdout, buffer_, pc_);
1846 } 1846 }
1847 1847
1848 1848
1849 void Assembler::RecordJSReturn() { 1849 void Assembler::RecordJSReturn() {
1850 WriteRecordedPositions(); 1850 WriteRecordedPositions();
1851 EnsureSpace ensure_space(this); 1851 EnsureSpace ensure_space(this);
1852 RecordRelocInfo(js_return); 1852 RecordRelocInfo(RelocInfo::JS_RETURN);
1853 } 1853 }
1854 1854
1855 1855
1856 void Assembler::RecordComment(const char* msg) { 1856 void Assembler::RecordComment(const char* msg) {
1857 if (FLAG_debug_code) { 1857 if (FLAG_debug_code) {
1858 EnsureSpace ensure_space(this); 1858 EnsureSpace ensure_space(this);
1859 RecordRelocInfo(comment, reinterpret_cast<intptr_t>(msg)); 1859 RecordRelocInfo(RelocInfo::COMMENT, reinterpret_cast<intptr_t>(msg));
1860 } 1860 }
1861 } 1861 }
1862 1862
1863 1863
1864 void Assembler::RecordPosition(int pos) { 1864 void Assembler::RecordPosition(int pos) {
1865 if (pos == kNoPosition) return; 1865 if (pos == RelocInfo::kNoPosition) return;
1866 ASSERT(pos >= 0); 1866 ASSERT(pos >= 0);
1867 last_position_ = pos; 1867 last_position_ = pos;
1868 } 1868 }
1869 1869
1870 1870
1871 void Assembler::RecordStatementPosition(int pos) { 1871 void Assembler::RecordStatementPosition(int pos) {
1872 if (pos == kNoPosition) return; 1872 if (pos == RelocInfo::kNoPosition) return;
1873 ASSERT(pos >= 0); 1873 ASSERT(pos >= 0);
1874 last_statement_position_ = pos; 1874 last_statement_position_ = pos;
1875 } 1875 }
1876 1876
1877 1877
1878 void Assembler::WriteRecordedPositions() { 1878 void Assembler::WriteRecordedPositions() {
1879 if (last_statement_position_ != kNoPosition) { 1879 if (last_statement_position_ != RelocInfo::kNoPosition) {
1880 EnsureSpace ensure_space(this); 1880 EnsureSpace ensure_space(this);
1881 RecordRelocInfo(statement_position, last_statement_position_); 1881 RecordRelocInfo(RelocInfo::STATEMENT_POSITION, last_statement_position_);
1882 } 1882 }
1883 if ((last_position_ != kNoPosition) && 1883 if ((last_position_ != RelocInfo::kNoPosition) &&
1884 (last_position_ != last_statement_position_)) { 1884 (last_position_ != last_statement_position_)) {
1885 EnsureSpace ensure_space(this); 1885 EnsureSpace ensure_space(this);
1886 RecordRelocInfo(position, last_position_); 1886 RecordRelocInfo(RelocInfo::POSITION, last_position_);
1887 } 1887 }
1888 last_statement_position_ = kNoPosition; 1888 last_statement_position_ = RelocInfo::kNoPosition;
1889 last_position_ = kNoPosition; 1889 last_position_ = RelocInfo::kNoPosition;
1890 } 1890 }
1891 1891
1892 1892
1893 void Assembler::GrowBuffer() { 1893 void Assembler::GrowBuffer() {
1894 ASSERT(overflow()); // should not call this otherwise 1894 ASSERT(overflow()); // should not call this otherwise
1895 if (!own_buffer_) FATAL("external code buffer is too small"); 1895 if (!own_buffer_) FATAL("external code buffer is too small");
1896 1896
1897 // compute new buffer size 1897 // compute new buffer size
1898 CodeDesc desc; // the new buffer 1898 CodeDesc desc; // the new buffer
1899 if (buffer_size_ < 4*KB) { 1899 if (buffer_size_ < 4*KB) {
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
1936 buffer_size_ = desc.buffer_size; 1936 buffer_size_ = desc.buffer_size;
1937 pc_ += pc_delta; 1937 pc_ += pc_delta;
1938 if (last_pc_ != NULL) { 1938 if (last_pc_ != NULL) {
1939 last_pc_ += pc_delta; 1939 last_pc_ += pc_delta;
1940 } 1940 }
1941 reloc_info_writer.Reposition(reloc_info_writer.pos() + rc_delta, 1941 reloc_info_writer.Reposition(reloc_info_writer.pos() + rc_delta,
1942 reloc_info_writer.last_pc() + pc_delta); 1942 reloc_info_writer.last_pc() + pc_delta);
1943 1943
1944 // relocate runtime entries 1944 // relocate runtime entries
1945 for (RelocIterator it(desc); !it.done(); it.next()) { 1945 for (RelocIterator it(desc); !it.done(); it.next()) {
1946 RelocMode rmode = it.rinfo()->rmode(); 1946 RelocInfo::Mode rmode = it.rinfo()->rmode();
1947 if (rmode == runtime_entry) { 1947 if (rmode == RelocInfo::RUNTIME_ENTRY) {
1948 int32_t* p = reinterpret_cast<int32_t*>(it.rinfo()->pc()); 1948 int32_t* p = reinterpret_cast<int32_t*>(it.rinfo()->pc());
1949 *p -= pc_delta; // relocate entry 1949 *p -= pc_delta; // relocate entry
1950 } else if (rmode == internal_reference) { 1950 } else if (rmode == RelocInfo::INTERNAL_REFERENCE) {
1951 int32_t* p = reinterpret_cast<int32_t*>(it.rinfo()->pc()); 1951 int32_t* p = reinterpret_cast<int32_t*>(it.rinfo()->pc());
1952 if (*p != 0) { // 0 means uninitialized. 1952 if (*p != 0) { // 0 means uninitialized.
1953 *p += pc_delta; 1953 *p += pc_delta;
1954 } 1954 }
1955 } 1955 }
1956 } 1956 }
1957 1957
1958 ASSERT(!overflow()); 1958 ASSERT(!overflow());
1959 } 1959 }
1960 1960
(...skipping 23 matching lines...) Expand all
1984 emit_operand(ireg, dst); 1984 emit_operand(ireg, dst);
1985 emit(x); 1985 emit(x);
1986 } 1986 }
1987 } 1987 }
1988 1988
1989 1989
1990 void Assembler::emit_operand(Register reg, const Operand& adr) { 1990 void Assembler::emit_operand(Register reg, const Operand& adr) {
1991 adr.set_reg(reg); 1991 adr.set_reg(reg);
1992 memmove(pc_, adr.buf_, adr.len_); 1992 memmove(pc_, adr.buf_, adr.len_);
1993 pc_ += adr.len_; 1993 pc_ += adr.len_;
1994 if (adr.len_ >= sizeof(int32_t) && adr.rmode_ != no_reloc) { 1994 if (adr.len_ >= sizeof(int32_t) && adr.rmode_ != RelocInfo::NONE) {
1995 pc_ -= sizeof(int32_t); // pc_ must be *at* disp32 1995 pc_ -= sizeof(int32_t); // pc_ must be *at* disp32
1996 RecordRelocInfo(adr.rmode_); 1996 RecordRelocInfo(adr.rmode_);
1997 pc_ += sizeof(int32_t); 1997 pc_ += sizeof(int32_t);
1998 } 1998 }
1999 } 1999 }
2000 2000
2001 2001
2002 void Assembler::emit_operand(const Operand& adr, Register reg) { 2002 void Assembler::emit_operand(const Operand& adr, Register reg) {
2003 adr.set_reg(reg); 2003 adr.set_reg(reg);
2004 memmove(pc_, adr.buf_, adr.len_); 2004 memmove(pc_, adr.buf_, adr.len_);
2005 pc_ += adr.len_; 2005 pc_ += adr.len_;
2006 if (adr.len_ >= sizeof(int32_t) && adr.rmode_ != no_reloc) { 2006 if (adr.len_ >= sizeof(int32_t) && adr.rmode_ != RelocInfo::NONE) {
2007 pc_ -= sizeof(int32_t); // pc_ must be *at* disp32 2007 pc_ -= sizeof(int32_t); // pc_ must be *at* disp32
2008 RecordRelocInfo(adr.rmode_); 2008 RecordRelocInfo(adr.rmode_);
2009 pc_ += sizeof(int32_t); 2009 pc_ += sizeof(int32_t);
2010 } 2010 }
2011 } 2011 }
2012 2012
2013 2013
2014 void Assembler::emit_farith(int b1, int b2, int i) { 2014 void Assembler::emit_farith(int b1, int b2, int i) {
2015 ASSERT(is_uint8(b1) && is_uint8(b2)); // wrong opcode 2015 ASSERT(is_uint8(b1) && is_uint8(b2)); // wrong opcode
2016 ASSERT(0 <= i && i < 8); // illegal stack offset 2016 ASSERT(0 <= i && i < 8); // illegal stack offset
2017 EMIT(b1); 2017 EMIT(b1);
2018 EMIT(b2 + i); 2018 EMIT(b2 + i);
2019 } 2019 }
2020 2020
2021 2021
2022 void Assembler::dd(uint32_t data, RelocMode reloc_info) { 2022 void Assembler::dd(uint32_t data, RelocInfo::Mode reloc_info) {
2023 EnsureSpace ensure_space(this); 2023 EnsureSpace ensure_space(this);
2024 emit(data, reloc_info); 2024 emit(data, reloc_info);
2025 } 2025 }
2026 2026
2027 2027
2028 void Assembler::RecordRelocInfo(RelocMode rmode, intptr_t data) { 2028 void Assembler::RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data) {
2029 ASSERT(rmode != no_reloc); 2029 ASSERT(rmode != RelocInfo::NONE);
2030 // Don't record external references unless the heap will be serialized. 2030 // Don't record external references unless the heap will be serialized.
2031 if (rmode == external_reference && 2031 if (rmode == RelocInfo::EXTERNAL_REFERENCE &&
2032 !Serializer::enabled() && 2032 !Serializer::enabled() &&
2033 !FLAG_debug_code) { 2033 !FLAG_debug_code) {
2034 return; 2034 return;
2035 } 2035 }
2036 RelocInfo rinfo(pc_, rmode, data); 2036 RelocInfo rinfo(pc_, rmode, data);
2037 reloc_info_writer.Write(&rinfo); 2037 reloc_info_writer.Write(&rinfo);
2038 } 2038 }
2039 2039
2040 void Assembler::WriteInternalReference(int position, const Label& bound_label) { 2040 void Assembler::WriteInternalReference(int position, const Label& bound_label) {
2041 ASSERT(bound_label.is_bound()); 2041 ASSERT(bound_label.is_bound());
2042 ASSERT(0 <= position); 2042 ASSERT(0 <= position);
2043 ASSERT(position + static_cast<int>(sizeof(uint32_t)) <= pc_offset()); 2043 ASSERT(position + static_cast<int>(sizeof(uint32_t)) <= pc_offset());
2044 ASSERT(long_at(position) == 0); // only initialize once! 2044 ASSERT(long_at(position) == 0); // only initialize once!
2045 2045
2046 uint32_t label_loc = reinterpret_cast<uint32_t>(addr_at(bound_label.pos())); 2046 uint32_t label_loc = reinterpret_cast<uint32_t>(addr_at(bound_label.pos()));
2047 long_at_put(position, label_loc); 2047 long_at_put(position, label_loc);
2048 } 2048 }
2049 2049
2050 } } // namespace v8::internal 2050 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/assembler-ia32.h ('k') | src/assembler-ia32-inl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698