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

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

Issue 6461017: ARM: Add type-feedback recording for compare... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 9 years, 10 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
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 334 matching lines...) Expand 10 before | Expand all | Expand 10 after
345 } 345 }
346 } 346 }
347 347
348 348
349 void Assembler::CodeTargetAlign() { 349 void Assembler::CodeTargetAlign() {
350 // Preferred alignment of jump targets on some ARM chips. 350 // Preferred alignment of jump targets on some ARM chips.
351 Align(8); 351 Align(8);
352 } 352 }
353 353
354 354
355 Condition Assembler::GetCondition(Instr instr) {
Alexandre 2011/02/09 13:57:16 Same as Instruction::ConditionField(). Do we want
Søren Thygesen Gjesse 2011/02/09 14:48:28 This now calls Instruction::ConditionField()
356 return static_cast<Condition>(instr & kConditionMask);
357 }
358
355 bool Assembler::IsBranch(Instr instr) { 359 bool Assembler::IsBranch(Instr instr) {
356 return (instr & (B27 | B25)) == (B27 | B25); 360 return (instr & (B27 | B25)) == (B27 | B25);
357 } 361 }
358 362
359 363
360 int Assembler::GetBranchOffset(Instr instr) { 364 int Assembler::GetBranchOffset(Instr instr) {
361 ASSERT(IsBranch(instr)); 365 ASSERT(IsBranch(instr));
362 // Take the jump offset in the lower 24 bits, sign extend it and multiply it 366 // Take the jump offset in the lower 24 bits, sign extend it and multiply it
363 // with 4 to get the offset in bytes. 367 // with 4 to get the offset in bytes.
364 return ((instr & kImm24Mask) << 8) >> 6; 368 return ((instr & kImm24Mask) << 8) >> 6;
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
421 } 425 }
422 426
423 427
424 Register Assembler::GetRd(Instr instr) { 428 Register Assembler::GetRd(Instr instr) {
425 Register reg; 429 Register reg;
426 reg.code_ = Instruction::RdValue(instr); 430 reg.code_ = Instruction::RdValue(instr);
427 return reg; 431 return reg;
428 } 432 }
429 433
430 434
435 Register Assembler::GetRn(Instr instr) {
436 Register reg;
437 reg.code_ = Instruction::RnValue(instr);
438 return reg;
439 }
440
441
442 Register Assembler::GetRm(Instr instr) {
443 Register reg;
444 reg.code_ = Instruction::RmValue(instr);
445 return reg;
446 }
447
448
431 bool Assembler::IsPush(Instr instr) { 449 bool Assembler::IsPush(Instr instr) {
432 return ((instr & ~kRdMask) == kPushRegPattern); 450 return ((instr & ~kRdMask) == kPushRegPattern);
433 } 451 }
434 452
435 453
436 bool Assembler::IsPop(Instr instr) { 454 bool Assembler::IsPop(Instr instr) {
437 return ((instr & ~kRdMask) == kPopRegPattern); 455 return ((instr & ~kRdMask) == kPopRegPattern);
438 } 456 }
439 457
440 458
(...skipping 17 matching lines...) Expand all
458 } 476 }
459 477
460 478
461 bool Assembler::IsLdrPcImmediateOffset(Instr instr) { 479 bool Assembler::IsLdrPcImmediateOffset(Instr instr) {
462 // Check the instruction is indeed a 480 // Check the instruction is indeed a
463 // ldr<cond> <Rd>, [pc +/- offset_12]. 481 // ldr<cond> <Rd>, [pc +/- offset_12].
464 return (instr & (kLdrPCMask & ~kCondMask)) == 0x051f0000; 482 return (instr & (kLdrPCMask & ~kCondMask)) == 0x051f0000;
465 } 483 }
466 484
467 485
486 bool Assembler::IsTstImmediate(Instr instr) {
487 return (instr & (B27 | B26 | I | kOpCodeMask | S | kRdMask)) ==
488 (I | TST | S);
489 }
490
491
492 bool Assembler::IsCmpRegister(Instr instr) {
493 return (instr & (B27 | B26 | I | kOpCodeMask | S | kRdMask | B4)) ==
494 (CMP | S);
495 }
496
497
498 bool Assembler::IsCmpImmediate(Instr instr) {
499 return (instr & (B27 | B26 | I | kOpCodeMask | S | kRdMask)) ==
500 (I | CMP | S);
501 }
502
503
504 Register Assembler::GetCmpImmediateRegister(Instr instr) {
505 ASSERT(IsCmpImmediate(instr));
506 return GetRn(instr);
507 }
508
509
510 int Assembler::GetCmpImmediateRawImmediate(Instr instr) {
511 ASSERT(IsCmpImmediate(instr));
512 return instr & kOff12Mask;
513 }
514
Alexandre 2011/02/09 13:57:16 Not sure, but should we move these to the Instruct
Søren Thygesen Gjesse 2011/02/09 14:48:28 I think it will be fine to have these in the Instr
468 // Labels refer to positions in the (to be) generated code. 515 // Labels refer to positions in the (to be) generated code.
469 // There are bound, linked, and unused labels. 516 // There are bound, linked, and unused labels.
470 // 517 //
471 // Bound labels refer to known positions in the already 518 // Bound labels refer to known positions in the already
472 // generated code. pos() is the position the label refers to. 519 // generated code. pos() is the position the label refers to.
473 // 520 //
474 // Linked labels refer to unknown positions in the code 521 // Linked labels refer to unknown positions in the code
475 // to be generated; pos() is the position of the last 522 // to be generated; pos() is the position of the last
476 // instruction using the label. 523 // instruction using the label.
477 524
(...skipping 567 matching lines...) Expand 10 before | Expand all | Expand 10 after
1045 void Assembler::teq(Register src1, const Operand& src2, Condition cond) { 1092 void Assembler::teq(Register src1, const Operand& src2, Condition cond) {
1046 addrmod1(cond | TEQ | S, src1, r0, src2); 1093 addrmod1(cond | TEQ | S, src1, r0, src2);
1047 } 1094 }
1048 1095
1049 1096
1050 void Assembler::cmp(Register src1, const Operand& src2, Condition cond) { 1097 void Assembler::cmp(Register src1, const Operand& src2, Condition cond) {
1051 addrmod1(cond | CMP | S, src1, r0, src2); 1098 addrmod1(cond | CMP | S, src1, r0, src2);
1052 } 1099 }
1053 1100
1054 1101
1102 void Assembler::cmp_raw_immediate(
1103 Register src, int raw_immediate, Condition cond) {
1104 ASSERT(is_uint12(raw_immediate));
1105 emit(cond | I | CMP | S | src.code() << 16 | raw_immediate);
1106 }
1107
1108
1055 void Assembler::cmn(Register src1, const Operand& src2, Condition cond) { 1109 void Assembler::cmn(Register src1, const Operand& src2, Condition cond) {
1056 addrmod1(cond | CMN | S, src1, r0, src2); 1110 addrmod1(cond | CMN | S, src1, r0, src2);
1057 } 1111 }
1058 1112
1059 1113
1060 void Assembler::orr(Register dst, Register src1, const Operand& src2, 1114 void Assembler::orr(Register dst, Register src1, const Operand& src2,
1061 SBit s, Condition cond) { 1115 SBit s, Condition cond) {
1062 addrmod1(cond | ORR | s, src1, dst, src2); 1116 addrmod1(cond | ORR | s, src1, dst, src2);
1063 } 1117 }
1064 1118
(...skipping 1291 matching lines...) Expand 10 before | Expand all | Expand 10 after
2356 2410
2357 // Pseudo instructions. 2411 // Pseudo instructions.
2358 void Assembler::nop(int type) { 2412 void Assembler::nop(int type) {
2359 // This is mov rx, rx. 2413 // This is mov rx, rx.
2360 ASSERT(0 <= type && type <= 14); // mov pc, pc is not a nop. 2414 ASSERT(0 <= type && type <= 14); // mov pc, pc is not a nop.
2361 emit(al | 13*B21 | type*B12 | type); 2415 emit(al | 13*B21 | type*B12 | type);
2362 } 2416 }
2363 2417
2364 2418
2365 bool Assembler::IsNop(Instr instr, int type) { 2419 bool Assembler::IsNop(Instr instr, int type) {
2366 // Check for mov rx, rx. 2420 // Check for mov rx, rx where x = type.
2367 ASSERT(0 <= type && type <= 14); // mov pc, pc is not a nop. 2421 ASSERT(0 <= type && type <= 14); // mov pc, pc is not a nop.
2368 return instr == (al | 13*B21 | type*B12 | type); 2422 return instr == (al | 13*B21 | type*B12 | type);
2369 } 2423 }
2370 2424
2371 2425
2372 bool Assembler::ImmediateFitsAddrMode1Instruction(int32_t imm32) { 2426 bool Assembler::ImmediateFitsAddrMode1Instruction(int32_t imm32) {
2373 uint32_t dummy1; 2427 uint32_t dummy1;
2374 uint32_t dummy2; 2428 uint32_t dummy2;
2375 return fits_shifter(imm32, &dummy1, &dummy2, NULL); 2429 return fits_shifter(imm32, &dummy1, &dummy2, NULL);
2376 } 2430 }
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after
2615 2669
2616 // Since a constant pool was just emitted, move the check offset forward by 2670 // Since a constant pool was just emitted, move the check offset forward by
2617 // the standard interval. 2671 // the standard interval.
2618 next_buffer_check_ = pc_offset() + kCheckConstInterval; 2672 next_buffer_check_ = pc_offset() + kCheckConstInterval;
2619 } 2673 }
2620 2674
2621 2675
2622 } } // namespace v8::internal 2676 } } // namespace v8::internal
2623 2677
2624 #endif // V8_TARGET_ARCH_ARM 2678 #endif // V8_TARGET_ARCH_ARM
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698