Changeset 38975 in webkit for trunk/JavaScriptCore
- Timestamp:
- Dec 3, 2008, 4:10:53 PM (16 years ago)
- Location:
- trunk/JavaScriptCore
- Files:
-
- 16 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/ChangeLog
r38971 r38975 1 2008-12-03 Sam Weinig <[email protected]> 2 3 Reviewed by Geoffrey Garen. 4 5 Remove shared AssemblerBuffer 1MB buffer and instead give AssemblerBuffer 6 an 256 byte inline capacity. 7 8 1% progression on Sunspider. 9 10 * assembler/AssemblerBuffer.h: 11 (JSC::AssemblerBuffer::AssemblerBuffer): 12 (JSC::AssemblerBuffer::~AssemblerBuffer): 13 (JSC::AssemblerBuffer::grow): 14 * assembler/MacroAssembler.h: 15 (JSC::MacroAssembler::MacroAssembler): 16 * assembler/X86Assembler.h: 17 (JSC::X86Assembler::X86Assembler): 18 * interpreter/Interpreter.cpp: 19 (JSC::Interpreter::Interpreter): 20 * interpreter/Interpreter.h: 21 * jit/JIT.cpp: 22 (JSC::JIT::JIT): 23 * parser/Nodes.cpp: 24 (JSC::RegExpNode::emitBytecode): 25 * runtime/RegExp.cpp: 26 (JSC::RegExp::RegExp): 27 (JSC::RegExp::create): 28 * runtime/RegExp.h: 29 * runtime/RegExpConstructor.cpp: 30 (JSC::constructRegExp): 31 * runtime/RegExpPrototype.cpp: 32 (JSC::regExpProtoFuncCompile): 33 * runtime/StringPrototype.cpp: 34 (JSC::stringProtoFuncMatch): 35 (JSC::stringProtoFuncSearch): 36 * wrec/WREC.cpp: 37 (JSC::WREC::Generator::compileRegExp): 38 * wrec/WRECGenerator.h: 39 (JSC::WREC::Generator::Generator): 40 * wrec/WRECParser.h: 41 (JSC::WREC::Parser::Parser): 42 1 43 2008-12-03 Geoffrey Garen <[email protected]> 2 44 -
trunk/JavaScriptCore/assembler/AssemblerBuffer.h
r38545 r38975 38 38 39 39 class AssemblerBuffer { 40 static const int inlineCapacity = 256; 40 41 public: 41 AssemblerBuffer( int capacity)42 : m_buffer( static_cast<char*>(fastMalloc(capacity)))43 , m_capacity( capacity)42 AssemblerBuffer() 43 : m_buffer(m_inlineBuffer) 44 , m_capacity(inlineCapacity) 44 45 , m_size(0) 45 46 { … … 48 49 ~AssemblerBuffer() 49 50 { 50 fastFree(m_buffer); 51 if (m_buffer != m_inlineBuffer) 52 fastFree(m_buffer); 51 53 } 52 54 … … 113 115 } 114 116 115 AssemblerBuffer* reset()116 {117 m_size = 0;118 return this;119 }120 121 117 void* executableCopy() 122 118 { … … 136 132 { 137 133 m_capacity += m_capacity / 2; 138 m_buffer = static_cast<char*>(fastRealloc(m_buffer, m_capacity)); 134 135 if (m_buffer == m_inlineBuffer) { 136 char* newBuffer = static_cast<char*>(fastMalloc(m_capacity)); 137 m_buffer = static_cast<char*>(memcpy(newBuffer, m_buffer, m_size)); 138 } else 139 m_buffer = static_cast<char*>(fastRealloc(m_buffer, m_capacity)); 139 140 } 140 141 142 char m_inlineBuffer[inlineCapacity]; 141 143 char* m_buffer; 142 144 int m_capacity; -
trunk/JavaScriptCore/assembler/MacroAssembler.h
r38971 r38975 50 50 }; 51 51 52 MacroAssembler(AssemblerBuffer* assemblerBuffer) 53 : m_assembler(assemblerBuffer) 52 MacroAssembler() 54 53 { 55 54 } -
trunk/JavaScriptCore/assembler/X86Assembler.h
r38971 r38975 206 206 static const int maxInstructionSize = 16; 207 207 208 X86Assembler(AssemblerBuffer* m_buffer) 209 : m_buffer(m_buffer) 210 { 211 m_buffer->reset(); 208 X86Assembler() 209 { 212 210 } 213 211 214 212 void int3() 215 213 { 216 m_buffer ->putByte(OP_INT3);214 m_buffer.putByte(OP_INT3); 217 215 } 218 216 … … 220 218 void pushq_r(RegisterID reg) 221 219 { 222 m_buffer ->putByte(OP_PUSH_EAX + reg);220 m_buffer.putByte(OP_PUSH_EAX + reg); 223 221 } 224 222 225 223 void popq_r(RegisterID reg) 226 224 { 227 m_buffer ->putByte(OP_POP_EAX + reg);225 m_buffer.putByte(OP_POP_EAX + reg); 228 226 } 229 227 #else 230 228 void pushl_r(RegisterID reg) 231 229 { 232 m_buffer ->putByte(OP_PUSH_EAX + reg);230 m_buffer.putByte(OP_PUSH_EAX + reg); 233 231 } 234 232 235 233 void pushl_m(int offset, RegisterID base) 236 234 { 237 m_buffer ->putByte(OP_GROUP5_Ev);235 m_buffer.putByte(OP_GROUP5_Ev); 238 236 modRm_opm(GROUP5_OP_PUSH, base, offset); 239 237 } … … 241 239 void pushl_i32(int imm) 242 240 { 243 m_buffer ->putByte(OP_PUSH_Iz);244 m_buffer ->putInt(imm);241 m_buffer.putByte(OP_PUSH_Iz); 242 m_buffer.putInt(imm); 245 243 } 246 244 247 245 void popl_r(RegisterID reg) 248 246 { 249 m_buffer ->putByte(OP_POP_EAX + reg);247 m_buffer.putByte(OP_POP_EAX + reg); 250 248 } 251 249 252 250 void popl_m(int offset, RegisterID base) 253 251 { 254 m_buffer ->putByte(OP_GROUP1A_Ev);252 m_buffer.putByte(OP_GROUP1A_Ev); 255 253 modRm_opm(GROUP1A_OP_POP, base, offset); 256 254 } … … 259 257 void movl_rr(RegisterID src, RegisterID dst) 260 258 { 261 m_buffer ->putByte(OP_MOV_EvGv);259 m_buffer.putByte(OP_MOV_EvGv); 262 260 modRm_rr(src, dst); 263 261 } … … 266 264 void movq_rr(RegisterID src, RegisterID dst) 267 265 { 268 m_buffer ->putByte(REX_W);269 m_buffer ->putByte(OP_MOV_EvGv);266 m_buffer.putByte(REX_W); 267 m_buffer.putByte(OP_MOV_EvGv); 270 268 modRm_rr(src, dst); 271 269 } … … 274 272 void addl_rr(RegisterID src, RegisterID dst) 275 273 { 276 m_buffer ->putByte(OP_ADD_EvGv);274 m_buffer.putByte(OP_ADD_EvGv); 277 275 modRm_rr(src, dst); 278 276 } … … 281 279 void addl_i8m(int imm, void* addr) 282 280 { 283 m_buffer ->putByte(OP_GROUP1_EvIb);281 m_buffer.putByte(OP_GROUP1_EvIb); 284 282 modRm_opm(GROUP1_OP_ADD, addr); 285 m_buffer ->putByte(imm);283 m_buffer.putByte(imm); 286 284 } 287 285 #endif … … 289 287 void addl_i8r(int imm, RegisterID dst) 290 288 { 291 m_buffer ->putByte(OP_GROUP1_EvIb);289 m_buffer.putByte(OP_GROUP1_EvIb); 292 290 modRm_opr(GROUP1_OP_ADD, dst); 293 m_buffer ->putByte(imm);291 m_buffer.putByte(imm); 294 292 } 295 293 296 294 void addl_i32r(int imm, RegisterID dst) 297 295 { 298 m_buffer ->putByte(OP_GROUP1_EvIz);296 m_buffer.putByte(OP_GROUP1_EvIz); 299 297 modRm_opr(GROUP1_OP_ADD, dst); 300 m_buffer ->putInt(imm);298 m_buffer.putInt(imm); 301 299 } 302 300 … … 304 302 void addq_i8r(int imm, RegisterID dst) 305 303 { 306 m_buffer ->putByte(REX_W);307 m_buffer ->putByte(OP_GROUP1_EvIb);304 m_buffer.putByte(REX_W); 305 m_buffer.putByte(OP_GROUP1_EvIb); 308 306 modRm_opr(GROUP1_OP_ADD, dst); 309 m_buffer ->putByte(imm);307 m_buffer.putByte(imm); 310 308 } 311 309 312 310 void addq_i32r(int imm, RegisterID dst) 313 311 { 314 m_buffer ->putByte(REX_W);315 m_buffer ->putByte(OP_GROUP1_EvIz);312 m_buffer.putByte(REX_W); 313 m_buffer.putByte(OP_GROUP1_EvIz); 316 314 modRm_opr(GROUP1_OP_ADD, dst); 317 m_buffer ->putInt(imm);315 m_buffer.putInt(imm); 318 316 } 319 317 #endif … … 321 319 void addl_mr(int offset, RegisterID base, RegisterID dst) 322 320 { 323 m_buffer ->putByte(OP_ADD_GvEv);321 m_buffer.putByte(OP_ADD_GvEv); 324 322 modRm_rm(dst, base, offset); 325 323 } … … 327 325 void andl_rr(RegisterID src, RegisterID dst) 328 326 { 329 m_buffer ->putByte(OP_AND_EvGv);327 m_buffer.putByte(OP_AND_EvGv); 330 328 modRm_rr(src, dst); 331 329 } … … 333 331 void andl_i32r(int imm, RegisterID dst) 334 332 { 335 m_buffer ->putByte(OP_GROUP1_EvIz);333 m_buffer.putByte(OP_GROUP1_EvIz); 336 334 modRm_opr(GROUP1_OP_AND, dst); 337 m_buffer ->putInt(imm);335 m_buffer.putInt(imm); 338 336 } 339 337 340 338 void cmpl_i8r(int imm, RegisterID dst) 341 339 { 342 m_buffer ->putByte(OP_GROUP1_EvIb);340 m_buffer.putByte(OP_GROUP1_EvIb); 343 341 modRm_opr(GROUP1_OP_CMP, dst); 344 m_buffer ->putByte(imm);342 m_buffer.putByte(imm); 345 343 } 346 344 347 345 void cmpl_rr(RegisterID src, RegisterID dst) 348 346 { 349 m_buffer ->putByte(OP_CMP_EvGv);347 m_buffer.putByte(OP_CMP_EvGv); 350 348 modRm_rr(src, dst); 351 349 } … … 353 351 void cmpl_rm(RegisterID src, int offset, RegisterID base) 354 352 { 355 m_buffer ->putByte(OP_CMP_EvGv);353 m_buffer.putByte(OP_CMP_EvGv); 356 354 modRm_rm(src, base, offset); 357 355 } … … 359 357 void cmpl_mr(int offset, RegisterID base, RegisterID dst) 360 358 { 361 m_buffer ->putByte(OP_CMP_GvEv);359 m_buffer.putByte(OP_CMP_GvEv); 362 360 modRm_rm(dst, base, offset); 363 361 } … … 365 363 void cmpl_i32r(int imm, RegisterID dst) 366 364 { 367 m_buffer ->putByte(OP_GROUP1_EvIz);365 m_buffer.putByte(OP_GROUP1_EvIz); 368 366 modRm_opr(GROUP1_OP_CMP, dst); 369 m_buffer ->putInt(imm);367 m_buffer.putInt(imm); 370 368 } 371 369 372 370 void cmpl_i32m(int imm, RegisterID dst) 373 371 { 374 m_buffer ->putByte(OP_GROUP1_EvIz);372 m_buffer.putByte(OP_GROUP1_EvIz); 375 373 modRm_opm(GROUP1_OP_CMP, dst); 376 m_buffer ->putInt(imm);374 m_buffer.putInt(imm); 377 375 } 378 376 379 377 void cmpl_i32m(int imm, int offset, RegisterID dst) 380 378 { 381 m_buffer ->putByte(OP_GROUP1_EvIz);379 m_buffer.putByte(OP_GROUP1_EvIz); 382 380 modRm_opm(GROUP1_OP_CMP, dst, offset); 383 m_buffer ->putInt(imm);381 m_buffer.putInt(imm); 384 382 } 385 383 … … 387 385 void cmpl_i32m(int imm, void* addr) 388 386 { 389 m_buffer ->putByte(OP_GROUP1_EvIz);387 m_buffer.putByte(OP_GROUP1_EvIz); 390 388 modRm_opm(GROUP1_OP_CMP, addr); 391 m_buffer ->putInt(imm);389 m_buffer.putInt(imm); 392 390 } 393 391 #endif … … 395 393 void cmpl_i8m(int imm, int offset, RegisterID base, RegisterID index, int scale) 396 394 { 397 m_buffer ->putByte(OP_GROUP1_EvIb);395 m_buffer.putByte(OP_GROUP1_EvIb); 398 396 modRm_opmsib(GROUP1_OP_CMP, base, index, scale, offset); 399 m_buffer ->putByte(imm);397 m_buffer.putByte(imm); 400 398 } 401 399 402 400 void cmpw_rm(RegisterID src, RegisterID base, RegisterID index, int scale) 403 401 { 404 m_buffer ->putByte(PRE_OPERAND_SIZE);405 m_buffer ->putByte(OP_CMP_EvGv);402 m_buffer.putByte(PRE_OPERAND_SIZE); 403 m_buffer.putByte(OP_CMP_EvGv); 406 404 modRm_rmsib(src, base, index, scale); 407 405 } … … 409 407 void cmpw_rm(RegisterID src, int offset, RegisterID base, RegisterID index, int scale) 410 408 { 411 m_buffer ->putByte(PRE_OPERAND_SIZE);412 m_buffer ->putByte(OP_CMP_EvGv);409 m_buffer.putByte(PRE_OPERAND_SIZE); 410 m_buffer.putByte(OP_CMP_EvGv); 413 411 modRm_rmsib(src, base, index, scale, offset); 414 412 } … … 416 414 void sete_r(RegisterID dst) 417 415 { 418 m_buffer ->putByte(OP_2BYTE_ESCAPE);419 m_buffer ->putByte(OP_SETE);420 m_buffer ->putByte(MODRM(3, 0, dst));416 m_buffer.putByte(OP_2BYTE_ESCAPE); 417 m_buffer.putByte(OP_SETE); 418 m_buffer.putByte(MODRM(3, 0, dst)); 421 419 } 422 420 … … 428 426 void setne_r(RegisterID dst) 429 427 { 430 m_buffer ->putByte(OP_2BYTE_ESCAPE);431 m_buffer ->putByte(OP_SETNE);432 m_buffer ->putByte(MODRM(3, 0, dst));428 m_buffer.putByte(OP_2BYTE_ESCAPE); 429 m_buffer.putByte(OP_SETNE); 430 m_buffer.putByte(MODRM(3, 0, dst)); 433 431 } 434 432 … … 440 438 void orl_rr(RegisterID src, RegisterID dst) 441 439 { 442 m_buffer ->putByte(OP_OR_EvGv);440 m_buffer.putByte(OP_OR_EvGv); 443 441 modRm_rr(src, dst); 444 442 } … … 446 444 void orl_mr(int offset, RegisterID base, RegisterID dst) 447 445 { 448 m_buffer ->putByte(OP_OR_GvEv);446 m_buffer.putByte(OP_OR_GvEv); 449 447 modRm_rm(dst, base, offset); 450 448 } … … 452 450 void orl_i8r(int imm, RegisterID dst) 453 451 { 454 m_buffer ->putByte(OP_GROUP1_EvIb);452 m_buffer.putByte(OP_GROUP1_EvIb); 455 453 modRm_opr(GROUP1_OP_OR, dst); 456 m_buffer ->putByte(imm);454 m_buffer.putByte(imm); 457 455 } 458 456 … … 466 464 void subl_rr(RegisterID src, RegisterID dst) 467 465 { 468 m_buffer ->putByte(OP_SUB_EvGv);466 m_buffer.putByte(OP_SUB_EvGv); 469 467 modRm_rr(src, dst); 470 468 } … … 472 470 void subl_i8r(int imm, RegisterID dst) 473 471 { 474 m_buffer ->putByte(OP_GROUP1_EvIb);472 m_buffer.putByte(OP_GROUP1_EvIb); 475 473 modRm_opr(GROUP1_OP_SUB, dst); 476 m_buffer ->putByte(imm);474 m_buffer.putByte(imm); 477 475 } 478 476 … … 480 478 void subl_i8m(int imm, void* addr) 481 479 { 482 m_buffer ->putByte(OP_GROUP1_EvIb);480 m_buffer.putByte(OP_GROUP1_EvIb); 483 481 modRm_opm(GROUP1_OP_SUB, addr); 484 m_buffer ->putByte(imm);482 m_buffer.putByte(imm); 485 483 } 486 484 #endif … … 488 486 void subl_i32r(int imm, RegisterID dst) 489 487 { 490 m_buffer ->putByte(OP_GROUP1_EvIz);488 m_buffer.putByte(OP_GROUP1_EvIz); 491 489 modRm_opr(GROUP1_OP_SUB, dst); 492 m_buffer ->putInt(imm);490 m_buffer.putInt(imm); 493 491 } 494 492 495 493 void subl_mr(int offset, RegisterID base, RegisterID dst) 496 494 { 497 m_buffer ->putByte(OP_SUB_GvEv);495 m_buffer.putByte(OP_SUB_GvEv); 498 496 modRm_rm(dst, base, offset); 499 497 } … … 501 499 void testl_i32r(int imm, RegisterID dst) 502 500 { 503 m_buffer ->ensureSpace(maxInstructionSize);504 m_buffer ->putByteUnchecked(OP_GROUP3_EvIz);501 m_buffer.ensureSpace(maxInstructionSize); 502 m_buffer.putByteUnchecked(OP_GROUP3_EvIz); 505 503 modRm_opr_Unchecked(GROUP3_OP_TEST, dst); 506 m_buffer ->putIntUnchecked(imm);504 m_buffer.putIntUnchecked(imm); 507 505 } 508 506 509 507 void testl_i32m(int imm, RegisterID dst) 510 508 { 511 m_buffer ->putByte(OP_GROUP3_EvIz);509 m_buffer.putByte(OP_GROUP3_EvIz); 512 510 modRm_opm(GROUP3_OP_TEST, dst); 513 m_buffer ->putInt(imm);511 m_buffer.putInt(imm); 514 512 } 515 513 516 514 void testl_i32m(int imm, int offset, RegisterID dst) 517 515 { 518 m_buffer ->putByte(OP_GROUP3_EvIz);516 m_buffer.putByte(OP_GROUP3_EvIz); 519 517 modRm_opm(GROUP3_OP_TEST, dst, offset); 520 m_buffer ->putInt(imm);518 m_buffer.putInt(imm); 521 519 } 522 520 523 521 void testl_rr(RegisterID src, RegisterID dst) 524 522 { 525 m_buffer ->putByte(OP_TEST_EvGv);523 m_buffer.putByte(OP_TEST_EvGv); 526 524 modRm_rr(src, dst); 527 525 } … … 529 527 void xorl_i8r(int imm, RegisterID dst) 530 528 { 531 m_buffer ->putByte(OP_GROUP1_EvIb);529 m_buffer.putByte(OP_GROUP1_EvIb); 532 530 modRm_opr(GROUP1_OP_XOR, dst); 533 m_buffer ->putByte(imm);531 m_buffer.putByte(imm); 534 532 } 535 533 536 534 void xorl_rr(RegisterID src, RegisterID dst) 537 535 { 538 m_buffer ->putByte(OP_XOR_EvGv);536 m_buffer.putByte(OP_XOR_EvGv); 539 537 modRm_rr(src, dst); 540 538 } … … 543 541 { 544 542 if (imm == 1) { 545 m_buffer ->putByte(OP_GROUP2_Ev1);543 m_buffer.putByte(OP_GROUP2_Ev1); 546 544 modRm_opr(GROUP2_OP_SAR, dst); 547 545 } else { 548 m_buffer ->putByte(OP_GROUP2_EvIb);546 m_buffer.putByte(OP_GROUP2_EvIb); 549 547 modRm_opr(GROUP2_OP_SAR, dst); 550 m_buffer ->putByte(imm);548 m_buffer.putByte(imm); 551 549 } 552 550 } … … 554 552 void sarl_CLr(RegisterID dst) 555 553 { 556 m_buffer ->putByte(OP_GROUP2_EvCL);554 m_buffer.putByte(OP_GROUP2_EvCL); 557 555 modRm_opr(GROUP2_OP_SAR, dst); 558 556 } … … 561 559 { 562 560 if (imm == 1) { 563 m_buffer ->putByte(OP_GROUP2_Ev1);561 m_buffer.putByte(OP_GROUP2_Ev1); 564 562 modRm_opr(GROUP2_OP_SHL, dst); 565 563 } else { 566 m_buffer ->putByte(OP_GROUP2_EvIb);564 m_buffer.putByte(OP_GROUP2_EvIb); 567 565 modRm_opr(GROUP2_OP_SHL, dst); 568 m_buffer ->putByte(imm);566 m_buffer.putByte(imm); 569 567 } 570 568 } … … 572 570 void shll_CLr(RegisterID dst) 573 571 { 574 m_buffer ->putByte(OP_GROUP2_EvCL);572 m_buffer.putByte(OP_GROUP2_EvCL); 575 573 modRm_opr(GROUP2_OP_SHL, dst); 576 574 } … … 578 576 void imull_rr(RegisterID src, RegisterID dst) 579 577 { 580 m_buffer ->putByte(OP_2BYTE_ESCAPE);581 m_buffer ->putByte(OP2_IMUL_GvEv);578 m_buffer.putByte(OP_2BYTE_ESCAPE); 579 m_buffer.putByte(OP2_IMUL_GvEv); 582 580 modRm_rr(dst, src); 583 581 } … … 585 583 void imull_i32r(RegisterID src, int32_t value, RegisterID dst) 586 584 { 587 m_buffer ->putByte(OP_IMUL_GvEvIz);585 m_buffer.putByte(OP_IMUL_GvEvIz); 588 586 modRm_rr(dst, src); 589 m_buffer ->putInt(value);587 m_buffer.putInt(value); 590 588 } 591 589 592 590 void idivl_r(RegisterID dst) 593 591 { 594 m_buffer ->putByte(OP_GROUP3_Ev);592 m_buffer.putByte(OP_GROUP3_Ev); 595 593 modRm_opr(GROUP3_OP_IDIV, dst); 596 594 } … … 598 596 void cdq() 599 597 { 600 m_buffer ->putByte(OP_CDQ);598 m_buffer.putByte(OP_CDQ); 601 599 } 602 600 603 601 void movl_mr(RegisterID base, RegisterID dst) 604 602 { 605 m_buffer ->putByte(OP_MOV_GvEv);603 m_buffer.putByte(OP_MOV_GvEv); 606 604 modRm_rm(dst, base); 607 605 } … … 609 607 void movl_mr(int offset, RegisterID base, RegisterID dst) 610 608 { 611 m_buffer ->ensureSpace(maxInstructionSize);612 m_buffer ->putByteUnchecked(OP_MOV_GvEv);609 m_buffer.ensureSpace(maxInstructionSize); 610 m_buffer.putByteUnchecked(OP_MOV_GvEv); 613 611 modRm_rm_Unchecked(dst, base, offset); 614 612 } … … 617 615 void movq_mr(RegisterID base, RegisterID dst) 618 616 { 619 m_buffer ->putByte(REX_W);620 m_buffer ->putByte(OP_MOV_GvEv);617 m_buffer.putByte(REX_W); 618 m_buffer.putByte(OP_MOV_GvEv); 621 619 modRm_rm(dst, base); 622 620 } … … 624 622 void movq_mr(int offset, RegisterID base, RegisterID dst) 625 623 { 626 m_buffer ->ensureSpace(maxInstructionSize);627 m_buffer ->putByteUnchecked(REX_W);628 m_buffer ->putByteUnchecked(OP_MOV_GvEv);624 m_buffer.ensureSpace(maxInstructionSize); 625 m_buffer.putByteUnchecked(REX_W); 626 m_buffer.putByteUnchecked(OP_MOV_GvEv); 629 627 modRm_rm_Unchecked(dst, base, offset); 630 628 } … … 634 632 void movl_mr(void* addr, RegisterID dst) 635 633 { 636 m_buffer ->putByte(OP_MOV_GvEv);634 m_buffer.putByte(OP_MOV_GvEv); 637 635 modRm_rm(dst, addr); 638 636 } … … 641 639 void movl_mr(int offset, RegisterID base, RegisterID index, int scale, RegisterID dst) 642 640 { 643 m_buffer ->putByte(OP_MOV_GvEv);641 m_buffer.putByte(OP_MOV_GvEv); 644 642 modRm_rmsib(dst, base, index, scale, offset); 645 643 } … … 647 645 void movzbl_rr(RegisterID src, RegisterID dst) 648 646 { 649 m_buffer ->putByte(OP_2BYTE_ESCAPE);650 m_buffer ->putByte(OP2_MOVZX_GvEb);647 m_buffer.putByte(OP_2BYTE_ESCAPE); 648 m_buffer.putByte(OP2_MOVZX_GvEb); 651 649 modRm_rr(dst, src); 652 650 } … … 654 652 void movzwl_mr(int offset, RegisterID base, RegisterID dst) 655 653 { 656 m_buffer ->putByte(OP_2BYTE_ESCAPE);657 m_buffer ->putByte(OP2_MOVZX_GvEw);654 m_buffer.putByte(OP_2BYTE_ESCAPE); 655 m_buffer.putByte(OP2_MOVZX_GvEw); 658 656 modRm_rm(dst, base, offset); 659 657 } … … 661 659 void movzwl_mr(RegisterID base, RegisterID index, int scale, RegisterID dst) 662 660 { 663 m_buffer ->putByte(OP_2BYTE_ESCAPE);664 m_buffer ->putByte(OP2_MOVZX_GvEw);661 m_buffer.putByte(OP_2BYTE_ESCAPE); 662 m_buffer.putByte(OP2_MOVZX_GvEw); 665 663 modRm_rmsib(dst, base, index, scale); 666 664 } … … 668 666 void movzwl_mr(int offset, RegisterID base, RegisterID index, int scale, RegisterID dst) 669 667 { 670 m_buffer ->putByte(OP_2BYTE_ESCAPE);671 m_buffer ->putByte(OP2_MOVZX_GvEw);668 m_buffer.putByte(OP_2BYTE_ESCAPE); 669 m_buffer.putByte(OP2_MOVZX_GvEw); 672 670 modRm_rmsib(dst, base, index, scale, offset); 673 671 } … … 675 673 void movl_rm(RegisterID src, RegisterID base) 676 674 { 677 m_buffer ->putByte(OP_MOV_EvGv);675 m_buffer.putByte(OP_MOV_EvGv); 678 676 modRm_rm(src, base); 679 677 } … … 681 679 void movl_rm(RegisterID src, int offset, RegisterID base) 682 680 { 683 m_buffer ->ensureSpace(maxInstructionSize);684 m_buffer ->putByteUnchecked(OP_MOV_EvGv);681 m_buffer.ensureSpace(maxInstructionSize); 682 m_buffer.putByteUnchecked(OP_MOV_EvGv); 685 683 modRm_rm_Unchecked(src, base, offset); 686 684 } … … 689 687 void movq_rm(RegisterID src, RegisterID base) 690 688 { 691 m_buffer ->putByte(REX_W);692 m_buffer ->putByte(OP_MOV_EvGv);689 m_buffer.putByte(REX_W); 690 m_buffer.putByte(OP_MOV_EvGv); 693 691 modRm_rm(src, base); 694 692 } … … 696 694 void movq_rm(RegisterID src, int offset, RegisterID base) 697 695 { 698 m_buffer ->ensureSpace(maxInstructionSize);699 m_buffer ->putByteUnchecked(REX_W);700 m_buffer ->putByteUnchecked(OP_MOV_EvGv);696 m_buffer.ensureSpace(maxInstructionSize); 697 m_buffer.putByteUnchecked(REX_W); 698 m_buffer.putByteUnchecked(OP_MOV_EvGv); 701 699 modRm_rm_Unchecked(src, base, offset); 702 700 } … … 705 703 void movl_rm(RegisterID src, int offset, RegisterID base, RegisterID index, int scale) 706 704 { 707 m_buffer ->putByte(OP_MOV_EvGv);705 m_buffer.putByte(OP_MOV_EvGv); 708 706 modRm_rmsib(src, base, index, scale, offset); 709 707 } … … 711 709 void movl_i32r(int imm, RegisterID dst) 712 710 { 713 m_buffer ->putByte(OP_GROUP11_EvIz);711 m_buffer.putByte(OP_GROUP11_EvIz); 714 712 modRm_opr(GROUP11_MOV, dst); 715 m_buffer ->putInt(imm);713 m_buffer.putInt(imm); 716 714 } 717 715 718 716 void movl_i32m(int imm, int offset, RegisterID base) 719 717 { 720 m_buffer ->ensureSpace(maxInstructionSize);721 m_buffer ->putByteUnchecked(OP_GROUP11_EvIz);718 m_buffer.ensureSpace(maxInstructionSize); 719 m_buffer.putByteUnchecked(OP_GROUP11_EvIz); 722 720 modRm_opm_Unchecked(GROUP11_MOV, base, offset); 723 m_buffer ->putIntUnchecked(imm);721 m_buffer.putIntUnchecked(imm); 724 722 } 725 723 … … 727 725 void movl_i32m(int imm, void* addr) 728 726 { 729 m_buffer ->putByte(OP_GROUP11_EvIz);727 m_buffer.putByte(OP_GROUP11_EvIz); 730 728 modRm_opm(GROUP11_MOV, addr); 731 m_buffer ->putInt(imm);729 m_buffer.putInt(imm); 732 730 } 733 731 #endif … … 735 733 void leal_mr(int offset, RegisterID base, RegisterID dst) 736 734 { 737 m_buffer ->putByte(OP_LEA);735 m_buffer.putByte(OP_LEA); 738 736 modRm_rm(dst, base, offset); 739 737 } … … 741 739 void leal_mr(int offset, RegisterID index, int scale, RegisterID dst) 742 740 { 743 m_buffer ->putByte(OP_LEA);741 m_buffer.putByte(OP_LEA); 744 742 modRm_rmsib(dst, X86::noBase, index, scale, offset); 745 743 } … … 747 745 void ret() 748 746 { 749 m_buffer ->putByte(OP_RET);747 m_buffer.putByte(OP_RET); 750 748 } 751 749 752 750 void jmp_r(RegisterID dst) 753 751 { 754 m_buffer ->putByte(OP_GROUP5_Ev);752 m_buffer.putByte(OP_GROUP5_Ev); 755 753 modRm_opr(GROUP5_OP_JMPN, dst); 756 754 } … … 758 756 void jmp_m(int offset, RegisterID base) 759 757 { 760 m_buffer ->putByte(OP_GROUP5_Ev);758 m_buffer.putByte(OP_GROUP5_Ev); 761 759 modRm_opm(GROUP5_OP_JMPN, base, offset); 762 760 } … … 764 762 void movsd_mr(int offset, RegisterID base, XMMRegisterID dst) 765 763 { 766 m_buffer ->putByte(PRE_SSE_F2);767 m_buffer ->putByte(OP_2BYTE_ESCAPE);768 m_buffer ->putByte(OP2_MOVSD_VsdWsd);764 m_buffer.putByte(PRE_SSE_F2); 765 m_buffer.putByte(OP_2BYTE_ESCAPE); 766 m_buffer.putByte(OP2_MOVSD_VsdWsd); 769 767 modRm_rm((RegisterID)dst, base, offset); 770 768 } … … 772 770 void movsd_rm(XMMRegisterID src, int offset, RegisterID base) 773 771 { 774 m_buffer ->putByte(PRE_SSE_F2);775 m_buffer ->putByte(OP_2BYTE_ESCAPE);776 m_buffer ->putByte(OP2_MOVSD_WsdVsd);772 m_buffer.putByte(PRE_SSE_F2); 773 m_buffer.putByte(OP_2BYTE_ESCAPE); 774 m_buffer.putByte(OP2_MOVSD_WsdVsd); 777 775 modRm_rm((RegisterID)src, base, offset); 778 776 } … … 780 778 void movd_rr(XMMRegisterID src, RegisterID dst) 781 779 { 782 m_buffer ->putByte(PRE_SSE_66);783 m_buffer ->putByte(OP_2BYTE_ESCAPE);784 m_buffer ->putByte(OP2_MOVD_EdVd);780 m_buffer.putByte(PRE_SSE_66); 781 m_buffer.putByte(OP_2BYTE_ESCAPE); 782 m_buffer.putByte(OP2_MOVD_EdVd); 785 783 modRm_rr((RegisterID)src, dst); 786 784 } … … 788 786 void cvtsi2sd_rr(RegisterID src, XMMRegisterID dst) 789 787 { 790 m_buffer ->putByte(PRE_SSE_F2);791 m_buffer ->putByte(OP_2BYTE_ESCAPE);792 m_buffer ->putByte(OP2_CVTSI2SD_VsdEd);788 m_buffer.putByte(PRE_SSE_F2); 789 m_buffer.putByte(OP_2BYTE_ESCAPE); 790 m_buffer.putByte(OP2_CVTSI2SD_VsdEd); 793 791 modRm_rr((RegisterID)dst, src); 794 792 } … … 796 794 void cvttsd2si_rr(XMMRegisterID src, RegisterID dst) 797 795 { 798 m_buffer ->putByte(PRE_SSE_F2);799 m_buffer ->putByte(OP_2BYTE_ESCAPE);800 m_buffer ->putByte(OP2_CVTTSD2SI_GdWsd);796 m_buffer.putByte(PRE_SSE_F2); 797 m_buffer.putByte(OP_2BYTE_ESCAPE); 798 m_buffer.putByte(OP2_CVTTSD2SI_GdWsd); 801 799 modRm_rr(dst, (RegisterID)src); 802 800 } … … 804 802 void addsd_mr(int offset, RegisterID base, XMMRegisterID dst) 805 803 { 806 m_buffer ->putByte(PRE_SSE_F2);807 m_buffer ->putByte(OP_2BYTE_ESCAPE);808 m_buffer ->putByte(OP2_ADDSD_VsdWsd);804 m_buffer.putByte(PRE_SSE_F2); 805 m_buffer.putByte(OP_2BYTE_ESCAPE); 806 m_buffer.putByte(OP2_ADDSD_VsdWsd); 809 807 modRm_rm((RegisterID)dst, base, offset); 810 808 } … … 812 810 void subsd_mr(int offset, RegisterID base, XMMRegisterID dst) 813 811 { 814 m_buffer ->putByte(PRE_SSE_F2);815 m_buffer ->putByte(OP_2BYTE_ESCAPE);816 m_buffer ->putByte(OP2_SUBSD_VsdWsd);812 m_buffer.putByte(PRE_SSE_F2); 813 m_buffer.putByte(OP_2BYTE_ESCAPE); 814 m_buffer.putByte(OP2_SUBSD_VsdWsd); 817 815 modRm_rm((RegisterID)dst, base, offset); 818 816 } … … 820 818 void mulsd_mr(int offset, RegisterID base, XMMRegisterID dst) 821 819 { 822 m_buffer ->putByte(PRE_SSE_F2);823 m_buffer ->putByte(OP_2BYTE_ESCAPE);824 m_buffer ->putByte(OP2_MULSD_VsdWsd);820 m_buffer.putByte(PRE_SSE_F2); 821 m_buffer.putByte(OP_2BYTE_ESCAPE); 822 m_buffer.putByte(OP2_MULSD_VsdWsd); 825 823 modRm_rm((RegisterID)dst, base, offset); 826 824 } … … 828 826 void addsd_rr(XMMRegisterID src, XMMRegisterID dst) 829 827 { 830 m_buffer ->putByte(PRE_SSE_F2);831 m_buffer ->putByte(OP_2BYTE_ESCAPE);832 m_buffer ->putByte(OP2_ADDSD_VsdWsd);828 m_buffer.putByte(PRE_SSE_F2); 829 m_buffer.putByte(OP_2BYTE_ESCAPE); 830 m_buffer.putByte(OP2_ADDSD_VsdWsd); 833 831 modRm_rr((RegisterID)dst, (RegisterID)src); 834 832 } … … 836 834 void subsd_rr(XMMRegisterID src, XMMRegisterID dst) 837 835 { 838 m_buffer ->putByte(PRE_SSE_F2);839 m_buffer ->putByte(OP_2BYTE_ESCAPE);840 m_buffer ->putByte(OP2_SUBSD_VsdWsd);836 m_buffer.putByte(PRE_SSE_F2); 837 m_buffer.putByte(OP_2BYTE_ESCAPE); 838 m_buffer.putByte(OP2_SUBSD_VsdWsd); 841 839 modRm_rr((RegisterID)dst, (RegisterID)src); 842 840 } … … 844 842 void mulsd_rr(XMMRegisterID src, XMMRegisterID dst) 845 843 { 846 m_buffer ->putByte(PRE_SSE_F2);847 m_buffer ->putByte(OP_2BYTE_ESCAPE);848 m_buffer ->putByte(OP2_MULSD_VsdWsd);844 m_buffer.putByte(PRE_SSE_F2); 845 m_buffer.putByte(OP_2BYTE_ESCAPE); 846 m_buffer.putByte(OP2_MULSD_VsdWsd); 849 847 modRm_rr((RegisterID)dst, (RegisterID)src); 850 848 } … … 852 850 void ucomis_rr(XMMRegisterID src, XMMRegisterID dst) 853 851 { 854 m_buffer ->putByte(PRE_SSE_66);855 m_buffer ->putByte(OP_2BYTE_ESCAPE);856 m_buffer ->putByte(OP2_UCOMISD_VsdWsd);852 m_buffer.putByte(PRE_SSE_66); 853 m_buffer.putByte(OP_2BYTE_ESCAPE); 854 m_buffer.putByte(OP2_UCOMISD_VsdWsd); 857 855 modRm_rr((RegisterID)dst, (RegisterID)src); 858 856 } … … 860 858 void pextrw_irr(int whichWord, XMMRegisterID src, RegisterID dst) 861 859 { 862 m_buffer ->putByte(PRE_SSE_66);863 m_buffer ->putByte(OP_2BYTE_ESCAPE);864 m_buffer ->putByte(OP2_PEXTRW_GdUdIb);860 m_buffer.putByte(PRE_SSE_66); 861 m_buffer.putByte(OP_2BYTE_ESCAPE); 862 m_buffer.putByte(OP2_PEXTRW_GdUdIb); 865 863 modRm_rr(dst, (RegisterID)src); 866 m_buffer ->putByte(whichWord);864 m_buffer.putByte(whichWord); 867 865 } 868 866 869 867 JmpSrc call() 870 868 { 871 m_buffer ->putByte(OP_CALL_rel32);872 m_buffer ->putInt(0); // FIXME: make this point to a global label, linked later.873 return JmpSrc(m_buffer ->size());869 m_buffer.putByte(OP_CALL_rel32); 870 m_buffer.putInt(0); // FIXME: make this point to a global label, linked later. 871 return JmpSrc(m_buffer.size()); 874 872 } 875 873 876 874 JmpSrc call(RegisterID dst) 877 875 { 878 m_buffer ->putByte(OP_GROUP5_Ev);876 m_buffer.putByte(OP_GROUP5_Ev); 879 877 modRm_opr(GROUP5_OP_CALLN, dst); 880 return JmpSrc(m_buffer ->size());878 return JmpSrc(m_buffer.size()); 881 879 } 882 880 883 881 JmpDst label() 884 882 { 885 return JmpDst(m_buffer ->size());883 return JmpDst(m_buffer.size()); 886 884 } 887 885 888 886 JmpDst align(int alignment) 889 887 { 890 while (!m_buffer ->isAligned(alignment))891 m_buffer ->putByte(OP_HLT);888 while (!m_buffer.isAligned(alignment)) 889 m_buffer.putByte(OP_HLT); 892 890 893 891 return label(); … … 896 894 JmpSrc jmp() 897 895 { 898 m_buffer ->putByte(OP_JMP_rel32);899 m_buffer ->putInt(0);900 return JmpSrc(m_buffer ->size());896 m_buffer.putByte(OP_JMP_rel32); 897 m_buffer.putInt(0); 898 return JmpSrc(m_buffer.size()); 901 899 } 902 900 903 901 JmpSrc jne() 904 902 { 905 m_buffer ->putByte(OP_2BYTE_ESCAPE);906 m_buffer ->putByte(OP2_JNE_rel32);907 m_buffer ->putInt(0);908 return JmpSrc(m_buffer ->size());903 m_buffer.putByte(OP_2BYTE_ESCAPE); 904 m_buffer.putByte(OP2_JNE_rel32); 905 m_buffer.putInt(0); 906 return JmpSrc(m_buffer.size()); 909 907 } 910 908 … … 916 914 JmpSrc je() 917 915 { 918 m_buffer ->ensureSpace(maxInstructionSize);919 m_buffer ->putByteUnchecked(OP_2BYTE_ESCAPE);920 m_buffer ->putByteUnchecked(OP2_JE_rel32);921 m_buffer ->putIntUnchecked(0);922 return JmpSrc(m_buffer ->size());916 m_buffer.ensureSpace(maxInstructionSize); 917 m_buffer.putByteUnchecked(OP_2BYTE_ESCAPE); 918 m_buffer.putByteUnchecked(OP2_JE_rel32); 919 m_buffer.putIntUnchecked(0); 920 return JmpSrc(m_buffer.size()); 923 921 } 924 922 925 923 JmpSrc jl() 926 924 { 927 m_buffer ->putByte(OP_2BYTE_ESCAPE);928 m_buffer ->putByte(OP2_JL_rel32);929 m_buffer ->putInt(0);930 return JmpSrc(m_buffer ->size());925 m_buffer.putByte(OP_2BYTE_ESCAPE); 926 m_buffer.putByte(OP2_JL_rel32); 927 m_buffer.putInt(0); 928 return JmpSrc(m_buffer.size()); 931 929 } 932 930 933 931 JmpSrc jb() 934 932 { 935 m_buffer ->putByte(OP_2BYTE_ESCAPE);936 m_buffer ->putByte(OP2_JB_rel32);937 m_buffer ->putInt(0);938 return JmpSrc(m_buffer ->size());933 m_buffer.putByte(OP_2BYTE_ESCAPE); 934 m_buffer.putByte(OP2_JB_rel32); 935 m_buffer.putInt(0); 936 return JmpSrc(m_buffer.size()); 939 937 } 940 938 941 939 JmpSrc jle() 942 940 { 943 m_buffer ->putByte(OP_2BYTE_ESCAPE);944 m_buffer ->putByte(OP2_JLE_rel32);945 m_buffer ->putInt(0);946 return JmpSrc(m_buffer ->size());941 m_buffer.putByte(OP_2BYTE_ESCAPE); 942 m_buffer.putByte(OP2_JLE_rel32); 943 m_buffer.putInt(0); 944 return JmpSrc(m_buffer.size()); 947 945 } 948 946 949 947 JmpSrc jbe() 950 948 { 951 m_buffer ->putByte(OP_2BYTE_ESCAPE);952 m_buffer ->putByte(OP2_JBE_rel32);953 m_buffer ->putInt(0);954 return JmpSrc(m_buffer ->size());949 m_buffer.putByte(OP_2BYTE_ESCAPE); 950 m_buffer.putByte(OP2_JBE_rel32); 951 m_buffer.putInt(0); 952 return JmpSrc(m_buffer.size()); 955 953 } 956 954 957 955 JmpSrc jge() 958 956 { 959 m_buffer ->putByte(OP_2BYTE_ESCAPE);960 m_buffer ->putByte(OP2_JGE_rel32);961 m_buffer ->putInt(0);962 return JmpSrc(m_buffer ->size());957 m_buffer.putByte(OP_2BYTE_ESCAPE); 958 m_buffer.putByte(OP2_JGE_rel32); 959 m_buffer.putInt(0); 960 return JmpSrc(m_buffer.size()); 963 961 } 964 962 965 963 JmpSrc jg() 966 964 { 967 m_buffer ->putByte(OP_2BYTE_ESCAPE);968 m_buffer ->putByte(OP2_JG_rel32);969 m_buffer ->putInt(0);970 return JmpSrc(m_buffer ->size());965 m_buffer.putByte(OP_2BYTE_ESCAPE); 966 m_buffer.putByte(OP2_JG_rel32); 967 m_buffer.putInt(0); 968 return JmpSrc(m_buffer.size()); 971 969 } 972 970 973 971 JmpSrc ja() 974 972 { 975 m_buffer ->putByte(OP_2BYTE_ESCAPE);976 m_buffer ->putByte(OP2_JA_rel32);977 m_buffer ->putInt(0);978 return JmpSrc(m_buffer ->size());973 m_buffer.putByte(OP_2BYTE_ESCAPE); 974 m_buffer.putByte(OP2_JA_rel32); 975 m_buffer.putInt(0); 976 return JmpSrc(m_buffer.size()); 979 977 } 980 978 981 979 JmpSrc jae() 982 980 { 983 m_buffer ->putByte(OP_2BYTE_ESCAPE);984 m_buffer ->putByte(OP2_JAE_rel32);985 m_buffer ->putInt(0);986 return JmpSrc(m_buffer ->size());981 m_buffer.putByte(OP_2BYTE_ESCAPE); 982 m_buffer.putByte(OP2_JAE_rel32); 983 m_buffer.putInt(0); 984 return JmpSrc(m_buffer.size()); 987 985 } 988 986 989 987 JmpSrc jo() 990 988 { 991 m_buffer ->putByte(OP_2BYTE_ESCAPE);992 m_buffer ->putByte(OP2_JO_rel32);993 m_buffer ->putInt(0);994 return JmpSrc(m_buffer ->size());989 m_buffer.putByte(OP_2BYTE_ESCAPE); 990 m_buffer.putByte(OP2_JO_rel32); 991 m_buffer.putInt(0); 992 return JmpSrc(m_buffer.size()); 995 993 } 996 994 997 995 JmpSrc jp() 998 996 { 999 m_buffer ->putByte(OP_2BYTE_ESCAPE);1000 m_buffer ->putByte(OP2_JP_rel32);1001 m_buffer ->putInt(0);1002 return JmpSrc(m_buffer ->size());997 m_buffer.putByte(OP_2BYTE_ESCAPE); 998 m_buffer.putByte(OP2_JP_rel32); 999 m_buffer.putInt(0); 1000 return JmpSrc(m_buffer.size()); 1003 1001 } 1004 1002 1005 1003 JmpSrc js() 1006 1004 { 1007 m_buffer ->putByte(OP_2BYTE_ESCAPE);1008 m_buffer ->putByte(OP2_JS_rel32);1009 m_buffer ->putInt(0);1010 return JmpSrc(m_buffer ->size());1005 m_buffer.putByte(OP_2BYTE_ESCAPE); 1006 m_buffer.putByte(OP2_JS_rel32); 1007 m_buffer.putInt(0); 1008 return JmpSrc(m_buffer.size()); 1011 1009 } 1012 1010 1013 1011 void predictNotTaken() 1014 1012 { 1015 m_buffer ->putByte(PRE_PREDICT_BRANCH_NOT_TAKEN);1013 m_buffer.putByte(PRE_PREDICT_BRANCH_NOT_TAKEN); 1016 1014 } 1017 1015 … … 1021 1019 ASSERT(from.m_offset != -1); 1022 1020 1023 reinterpret_cast<int*>(reinterpret_cast<ptrdiff_t>(m_buffer ->data()) + from.m_offset)[-1] = to.m_offset - from.m_offset;1021 reinterpret_cast<int*>(reinterpret_cast<ptrdiff_t>(m_buffer.data()) + from.m_offset)[-1] = to.m_offset - from.m_offset; 1024 1022 } 1025 1023 … … 1081 1079 void* executableCopy() 1082 1080 { 1083 void* copy = m_buffer ->executableCopy();1081 void* copy = m_buffer.executableCopy(); 1084 1082 ASSERT(copy); 1085 1083 return copy; … … 1111 1109 void modRm_rr(RegisterID reg, RegisterID rm) 1112 1110 { 1113 m_buffer ->ensureSpace(maxInstructionSize);1111 m_buffer.ensureSpace(maxInstructionSize); 1114 1112 modRm_rr_Unchecked(reg, rm); 1115 1113 } … … 1117 1115 void modRm_rr_Unchecked(RegisterID reg, RegisterID rm) 1118 1116 { 1119 m_buffer ->putByteUnchecked(MODRM(3, reg, rm));1117 m_buffer.putByteUnchecked(MODRM(3, reg, rm)); 1120 1118 } 1121 1119 … … 1123 1121 void modRm_rm(RegisterID reg, void* addr) 1124 1122 { 1125 m_buffer ->putByte(MODRM(0, reg, X86::noBase));1126 m_buffer ->putInt((int)addr);1123 m_buffer.putByte(MODRM(0, reg, X86::noBase)); 1124 m_buffer.putInt((int)addr); 1127 1125 } 1128 1126 #endif … … 1131 1129 { 1132 1130 if (base == X86::esp) { 1133 m_buffer ->putByte(MODRM(0, reg, X86::hasSib));1134 m_buffer ->putByte(SIB(0, X86::noScale, X86::esp));1131 m_buffer.putByte(MODRM(0, reg, X86::hasSib)); 1132 m_buffer.putByte(SIB(0, X86::noScale, X86::esp)); 1135 1133 } else 1136 m_buffer ->putByte(MODRM(0, reg, base));1134 m_buffer.putByte(MODRM(0, reg, base)); 1137 1135 } 1138 1136 … … 1141 1139 if (base == X86::esp) { 1142 1140 if (CAN_SIGN_EXTEND_8_32(offset)) { 1143 m_buffer ->putByteUnchecked(MODRM(1, reg, X86::hasSib));1144 m_buffer ->putByteUnchecked(SIB(0, X86::noScale, X86::esp));1145 m_buffer ->putByteUnchecked(offset);1141 m_buffer.putByteUnchecked(MODRM(1, reg, X86::hasSib)); 1142 m_buffer.putByteUnchecked(SIB(0, X86::noScale, X86::esp)); 1143 m_buffer.putByteUnchecked(offset); 1146 1144 } else { 1147 m_buffer ->putByteUnchecked(MODRM(2, reg, X86::hasSib));1148 m_buffer ->putByteUnchecked(SIB(0, X86::noScale, X86::esp));1149 m_buffer ->putIntUnchecked(offset);1145 m_buffer.putByteUnchecked(MODRM(2, reg, X86::hasSib)); 1146 m_buffer.putByteUnchecked(SIB(0, X86::noScale, X86::esp)); 1147 m_buffer.putIntUnchecked(offset); 1150 1148 } 1151 1149 } else { 1152 1150 if (CAN_SIGN_EXTEND_8_32(offset)) { 1153 m_buffer ->putByteUnchecked(MODRM(1, reg, base));1154 m_buffer ->putByteUnchecked(offset);1151 m_buffer.putByteUnchecked(MODRM(1, reg, base)); 1152 m_buffer.putByteUnchecked(offset); 1155 1153 } else { 1156 m_buffer ->putByteUnchecked(MODRM(2, reg, base));1157 m_buffer ->putIntUnchecked(offset);1154 m_buffer.putByteUnchecked(MODRM(2, reg, base)); 1155 m_buffer.putIntUnchecked(offset); 1158 1156 } 1159 1157 } … … 1162 1160 void modRm_rm(RegisterID reg, RegisterID base, int offset) 1163 1161 { 1164 m_buffer ->ensureSpace(maxInstructionSize);1162 m_buffer.ensureSpace(maxInstructionSize); 1165 1163 modRm_rm_Unchecked(reg, base, offset); 1166 1164 } … … 1172 1170 shift++; 1173 1171 1174 m_buffer ->putByte(MODRM(0, reg, X86::hasSib));1175 m_buffer ->putByte(SIB(shift, index, base));1172 m_buffer.putByte(MODRM(0, reg, X86::hasSib)); 1173 m_buffer.putByte(SIB(shift, index, base)); 1176 1174 } 1177 1175 … … 1183 1181 1184 1182 if (CAN_SIGN_EXTEND_8_32(offset)) { 1185 m_buffer ->putByte(MODRM(1, reg, X86::hasSib));1186 m_buffer ->putByte(SIB(shift, index, base));1187 m_buffer ->putByte(offset);1183 m_buffer.putByte(MODRM(1, reg, X86::hasSib)); 1184 m_buffer.putByte(SIB(shift, index, base)); 1185 m_buffer.putByte(offset); 1188 1186 } else { 1189 m_buffer ->putByte(MODRM(2, reg, X86::hasSib));1190 m_buffer ->putByte(SIB(shift, index, base));1191 m_buffer ->putInt(offset);1187 m_buffer.putByte(MODRM(2, reg, X86::hasSib)); 1188 m_buffer.putByte(SIB(shift, index, base)); 1189 m_buffer.putInt(offset); 1192 1190 } 1193 1191 } … … 1195 1193 void modRm_opr(OpcodeID opcodeID, RegisterID rm) 1196 1194 { 1197 m_buffer ->ensureSpace(maxInstructionSize);1195 m_buffer.ensureSpace(maxInstructionSize); 1198 1196 modRm_opr_Unchecked(opcodeID, rm); 1199 1197 } … … 1231 1229 } 1232 1230 1233 AssemblerBuffer *m_buffer;1231 AssemblerBuffer m_buffer; 1234 1232 }; 1235 1233 -
trunk/JavaScriptCore/interpreter/Interpreter.cpp
r38917 r38975 611 611 , m_ctiVirtualCallLink(0) 612 612 , m_ctiVirtualCall(0) 613 #endif614 #if ENABLE(ASSEMBLER)615 , m_assemblerBuffer(new AssemblerBuffer(1024 * 1024))616 613 #endif 617 614 , m_reentryDepth(0) -
trunk/JavaScriptCore/interpreter/Interpreter.h
r38917 r38975 280 280 #endif // ENABLE(JIT) 281 281 282 #if ENABLE(ASSEMBLER)283 AssemblerBuffer* assemblerBuffer() const { return m_assemblerBuffer.get(); }284 #endif285 286 282 // Default number of ticks before a timeout check should be done. 287 283 static const int initialTickCountThreshold = 1024; … … 345 341 #endif 346 342 347 #if ENABLE(ASSEMBLER)348 OwnPtr<AssemblerBuffer> m_assemblerBuffer;349 #endif350 351 343 int m_reentryDepth; 352 344 unsigned m_timeoutTime; -
trunk/JavaScriptCore/jit/JIT.cpp
r38971 r38975 590 590 591 591 JIT::JIT(JSGlobalData* globalData, CodeBlock* codeBlock) 592 : m_assembler(globalData->interpreter->assemblerBuffer()) 593 , m_interpreter(globalData->interpreter) 592 : m_interpreter(globalData->interpreter) 594 593 , m_globalData(globalData) 595 594 , m_codeBlock(codeBlock) -
trunk/JavaScriptCore/parser/Nodes.cpp
r38930 r38975 313 313 RegisterID* RegExpNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) 314 314 { 315 RefPtr<RegExp> regExp = RegExp::create( generator.globalData(),m_pattern, m_flags);315 RefPtr<RegExp> regExp = RegExp::create(m_pattern, m_flags); 316 316 if (!regExp->isValid()) 317 317 return emitThrowError(generator, SyntaxError, ("Invalid regular expression: " + UString(regExp->errorMessage())).UTF8String().c_str()); -
trunk/JavaScriptCore/runtime/RegExp.cpp
r38839 r38975 38 38 #endif 39 39 40 inline RegExp::RegExp( JSGlobalData* globalData,const UString& pattern)40 inline RegExp::RegExp(const UString& pattern) 41 41 : m_pattern(pattern) 42 42 , m_flagBits(0) … … 46 46 { 47 47 #if ENABLE(WREC) 48 m_wrecFunction = Generator::compileRegExp( globalData->interpreter,pattern, &m_numSubpatterns, &m_constructionError);48 m_wrecFunction = Generator::compileRegExp(pattern, &m_numSubpatterns, &m_constructionError); 49 49 if (m_wrecFunction) 50 50 return; 51 51 // Fall through to non-WREC case. 52 #else53 UNUSED_PARAM(globalData);54 52 #endif 55 53 m_regExp = jsRegExpCompile(reinterpret_cast<const UChar*>(pattern.data()), pattern.size(), … … 57 55 } 58 56 59 PassRefPtr<RegExp> RegExp::create( JSGlobalData* globalData,const UString& pattern)57 PassRefPtr<RegExp> RegExp::create(const UString& pattern) 60 58 { 61 return adoptRef(new RegExp( globalData,pattern));59 return adoptRef(new RegExp(pattern)); 62 60 } 63 61 64 inline RegExp::RegExp( JSGlobalData* globalData,const UString& pattern, const UString& flags)62 inline RegExp::RegExp(const UString& pattern, const UString& flags) 65 63 : m_pattern(pattern) 66 64 , m_flags(flags) … … 89 87 90 88 #if ENABLE(WREC) 91 m_wrecFunction = Generator::compileRegExp( globalData->interpreter,pattern, &m_numSubpatterns, &m_constructionError, (m_flagBits & IgnoreCase), (m_flagBits & Multiline));89 m_wrecFunction = Generator::compileRegExp(pattern, &m_numSubpatterns, &m_constructionError, (m_flagBits & IgnoreCase), (m_flagBits & Multiline)); 92 90 if (m_wrecFunction) 93 91 return; 94 92 // Fall through to non-WREC case. 95 #else96 UNUSED_PARAM(globalData);97 93 #endif 98 94 m_regExp = jsRegExpCompile(reinterpret_cast<const UChar*>(pattern.data()), pattern.size(), … … 100 96 } 101 97 102 PassRefPtr<RegExp> RegExp::create( JSGlobalData* globalData,const UString& pattern, const UString& flags)98 PassRefPtr<RegExp> RegExp::create(const UString& pattern, const UString& flags) 103 99 { 104 return adoptRef(new RegExp( globalData,pattern, flags));100 return adoptRef(new RegExp(pattern, flags)); 105 101 } 106 102 -
trunk/JavaScriptCore/runtime/RegExp.h
r38603 r38975 35 35 class RegExp : public RefCounted<RegExp> { 36 36 public: 37 static PassRefPtr<RegExp> create( JSGlobalData*,const UString& pattern);38 static PassRefPtr<RegExp> create( JSGlobalData*,const UString& pattern, const UString& flags);37 static PassRefPtr<RegExp> create(const UString& pattern); 38 static PassRefPtr<RegExp> create(const UString& pattern, const UString& flags); 39 39 ~RegExp(); 40 40 … … 53 53 54 54 private: 55 RegExp( JSGlobalData*,const UString& pattern);56 RegExp( JSGlobalData*,const UString& pattern, const UString& flags);55 RegExp(const UString& pattern); 56 RegExp(const UString& pattern, const UString& flags); 57 57 58 58 void compile(); -
trunk/JavaScriptCore/runtime/RegExpConstructor.cpp
r38440 r38975 332 332 UString flags = arg1->isUndefined() ? UString("") : arg1->toString(exec); 333 333 334 RefPtr<RegExp> regExp = RegExp::create( &exec->globalData(),pattern, flags);334 RefPtr<RegExp> regExp = RegExp::create(pattern, flags); 335 335 if (!regExp->isValid()) 336 336 return throwError(exec, SyntaxError, UString("Invalid regular expression: ").append(regExp->errorMessage())); -
trunk/JavaScriptCore/runtime/RegExpPrototype.cpp
r38440 r38975 86 86 UString pattern = args.isEmpty() ? UString("") : arg0->toString(exec); 87 87 UString flags = arg1->isUndefined() ? UString("") : arg1->toString(exec); 88 regExp = RegExp::create( &exec->globalData(),pattern, flags);88 regExp = RegExp::create(pattern, flags); 89 89 } 90 90 -
trunk/JavaScriptCore/runtime/StringPrototype.cpp
r38603 r38975 413 413 * replaced with the result of the expression new RegExp(regexp). 414 414 */ 415 reg = RegExp::create( &exec->globalData(),a0->toString(exec));415 reg = RegExp::create(a0->toString(exec)); 416 416 } 417 417 RegExpConstructor* regExpConstructor = exec->lexicalGlobalObject()->regExpConstructor(); … … 463 463 * replaced with the result of the expression new RegExp(regexp). 464 464 */ 465 reg = RegExp::create( &exec->globalData(),a0->toString(exec));465 reg = RegExp::create(a0->toString(exec)); 466 466 } 467 467 RegExpConstructor* regExpConstructor = exec->lexicalGlobalObject()->regExpConstructor(); -
trunk/JavaScriptCore/wrec/WREC.cpp
r38929 r38975 42 42 static const int MaxPatternSize = (1 << 16); 43 43 44 CompiledRegExp Generator::compileRegExp( Interpreter* interpreter,const UString& pattern, unsigned* numSubpatterns_ptr, const char** error_ptr, bool ignoreCase, bool multiline)44 CompiledRegExp Generator::compileRegExp(const UString& pattern, unsigned* numSubpatterns_ptr, const char** error_ptr, bool ignoreCase, bool multiline) 45 45 { 46 46 if (pattern.size() > MaxPatternSize) { … … 49 49 } 50 50 51 Parser parser(pattern, ignoreCase, multiline , interpreter->assemblerBuffer());51 Parser parser(pattern, ignoreCase, multiline); 52 52 Generator& generator = parser.generator(); 53 53 MacroAssembler::JumpList failures; -
trunk/JavaScriptCore/wrec/WRECGenerator.h
r38891 r38975 50 50 using MacroAssembler::Label; 51 51 52 static CompiledRegExp compileRegExp(Interpreter*, const UString& pattern, unsigned* numSubpatterns_ptr, const char** error_ptr, bool ignoreCase = false, bool multiline = false); 53 54 Generator(Parser& parser, AssemblerBuffer* assemblerBuffer) 55 : MacroAssembler(assemblerBuffer) 56 , m_parser(parser) 52 static CompiledRegExp compileRegExp(const UString& pattern, unsigned* numSubpatterns_ptr, const char** error_ptr, bool ignoreCase = false, bool multiline = false); 53 54 Generator(Parser& parser) 55 : m_parser(parser) 57 56 { 58 57 } -
trunk/JavaScriptCore/wrec/WRECParser.h
r38891 r38975 56 56 }; 57 57 58 Parser(const UString& pattern, bool ignoreCase, bool multiline , AssemblerBuffer* assemblerBuffer)59 : m_generator(*this , assemblerBuffer)58 Parser(const UString& pattern, bool ignoreCase, bool multiline) 59 : m_generator(*this) 60 60 , m_data(pattern.data()) 61 61 , m_size(pattern.size())
Note:
See TracChangeset
for help on using the changeset viewer.