OLD | NEW |
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 337 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
348 // Check the instruction is indeed a two part load (into r12) | 348 // Check the instruction is indeed a two part load (into r12) |
349 // 3d802553 lis r12, 9555 | 349 // 3d802553 lis r12, 9555 |
350 // 618c5000 ori r12, r12, 20480 | 350 // 618c5000 ori r12, r12, 20480 |
351 return (((instr1 >> 16) == 0x3d80) && ((instr2 >> 16) == 0x618c)); | 351 return (((instr1 >> 16) == 0x3d80) && ((instr2 >> 16) == 0x618c)); |
352 } | 352 } |
353 #endif | 353 #endif |
354 | 354 |
355 | 355 |
356 bool Assembler::IsCmpRegister(Instr instr) { | 356 bool Assembler::IsCmpRegister(Instr instr) { |
357 return (((instr & kOpcodeMask) == EXT2) && | 357 return (((instr & kOpcodeMask) == EXT2) && |
358 ((instr & kExt2OpcodeMask) == CMP)); | 358 ((EXT2 | (instr & kExt2OpcodeMask)) == CMP)); |
359 } | 359 } |
360 | 360 |
361 | 361 |
362 bool Assembler::IsRlwinm(Instr instr) { | 362 bool Assembler::IsRlwinm(Instr instr) { |
363 return ((instr & kOpcodeMask) == RLWINMX); | 363 return ((instr & kOpcodeMask) == RLWINMX); |
364 } | 364 } |
365 | 365 |
366 | 366 |
367 bool Assembler::IsAndi(Instr instr) { return ((instr & kOpcodeMask) == ANDIx); } | 367 bool Assembler::IsAndi(Instr instr) { return ((instr & kOpcodeMask) == ANDIx); } |
368 | 368 |
369 | 369 |
370 #if V8_TARGET_ARCH_PPC64 | 370 #if V8_TARGET_ARCH_PPC64 |
371 bool Assembler::IsRldicl(Instr instr) { | 371 bool Assembler::IsRldicl(Instr instr) { |
372 return (((instr & kOpcodeMask) == EXT5) && | 372 return (((instr & kOpcodeMask) == EXT5) && |
373 ((instr & kExt5OpcodeMask) == RLDICL)); | 373 ((EXT5 | (instr & kExt5OpcodeMask)) == RLDICL)); |
374 } | 374 } |
375 #endif | 375 #endif |
376 | 376 |
377 | 377 |
378 bool Assembler::IsCmpImmediate(Instr instr) { | 378 bool Assembler::IsCmpImmediate(Instr instr) { |
379 return ((instr & kOpcodeMask) == CMPI); | 379 return ((instr & kOpcodeMask) == CMPI); |
380 } | 380 } |
381 | 381 |
382 | 382 |
383 bool Assembler::IsCrSet(Instr instr) { | 383 bool Assembler::IsCrSet(Instr instr) { |
384 return (((instr & kOpcodeMask) == EXT1) && | 384 return (((instr & kOpcodeMask) == EXT1) && |
385 ((instr & kExt1OpcodeMask) == CREQV)); | 385 ((EXT1 | (instr & kExt1OpcodeMask)) == CREQV)); |
386 } | 386 } |
387 | 387 |
388 | 388 |
389 Register Assembler::GetCmpImmediateRegister(Instr instr) { | 389 Register Assembler::GetCmpImmediateRegister(Instr instr) { |
390 DCHECK(IsCmpImmediate(instr)); | 390 DCHECK(IsCmpImmediate(instr)); |
391 return GetRA(instr); | 391 return GetRA(instr); |
392 } | 392 } |
393 | 393 |
394 | 394 |
395 int Assembler::GetCmpImmediateRawImmediate(Instr instr) { | 395 int Assembler::GetCmpImmediateRawImmediate(Instr instr) { |
(...skipping 22 matching lines...) Expand all Loading... |
418 kUnboundMovLabelOffsetOpcode = 0 << 26, | 418 kUnboundMovLabelOffsetOpcode = 0 << 26, |
419 kUnboundAddLabelOffsetOpcode = 1 << 26, | 419 kUnboundAddLabelOffsetOpcode = 1 << 26, |
420 kUnboundMovLabelAddrOpcode = 2 << 26, | 420 kUnboundMovLabelAddrOpcode = 2 << 26, |
421 kUnboundJumpTableEntryOpcode = 3 << 26 | 421 kUnboundJumpTableEntryOpcode = 3 << 26 |
422 }; | 422 }; |
423 | 423 |
424 | 424 |
425 int Assembler::target_at(int pos) { | 425 int Assembler::target_at(int pos) { |
426 Instr instr = instr_at(pos); | 426 Instr instr = instr_at(pos); |
427 // check which type of branch this is 16 or 26 bit offset | 427 // check which type of branch this is 16 or 26 bit offset |
428 int opcode = instr & kOpcodeMask; | 428 uint32_t opcode = instr & kOpcodeMask; |
429 int link; | 429 int link; |
430 switch (opcode) { | 430 switch (opcode) { |
431 case BX: | 431 case BX: |
432 link = SIGN_EXT_IMM26(instr & kImm26Mask); | 432 link = SIGN_EXT_IMM26(instr & kImm26Mask); |
433 link &= ~(kAAMask | kLKMask); // discard AA|LK bits if present | 433 link &= ~(kAAMask | kLKMask); // discard AA|LK bits if present |
434 break; | 434 break; |
435 case BCX: | 435 case BCX: |
436 link = SIGN_EXT_IMM16((instr & kImm16Mask)); | 436 link = SIGN_EXT_IMM16((instr & kImm16Mask)); |
437 link &= ~(kAAMask | kLKMask); // discard AA|LK bits if present | 437 link &= ~(kAAMask | kLKMask); // discard AA|LK bits if present |
438 break; | 438 break; |
439 case kUnboundMovLabelOffsetOpcode: | 439 case kUnboundMovLabelOffsetOpcode: |
440 case kUnboundAddLabelOffsetOpcode: | 440 case kUnboundAddLabelOffsetOpcode: |
441 case kUnboundMovLabelAddrOpcode: | 441 case kUnboundMovLabelAddrOpcode: |
442 case kUnboundJumpTableEntryOpcode: | 442 case kUnboundJumpTableEntryOpcode: |
443 link = SIGN_EXT_IMM26(instr & kImm26Mask); | 443 link = SIGN_EXT_IMM26(instr & kImm26Mask); |
444 link <<= 2; | 444 link <<= 2; |
445 break; | 445 break; |
446 default: | 446 default: |
447 DCHECK(false); | 447 DCHECK(false); |
448 return -1; | 448 return -1; |
449 } | 449 } |
450 | 450 |
451 if (link == 0) return kEndOfChain; | 451 if (link == 0) return kEndOfChain; |
452 return pos + link; | 452 return pos + link; |
453 } | 453 } |
454 | 454 |
455 | 455 |
456 void Assembler::target_at_put(int pos, int target_pos, bool* is_branch) { | 456 void Assembler::target_at_put(int pos, int target_pos, bool* is_branch) { |
457 Instr instr = instr_at(pos); | 457 Instr instr = instr_at(pos); |
458 int opcode = instr & kOpcodeMask; | 458 uint32_t opcode = instr & kOpcodeMask; |
459 | 459 |
460 if (is_branch != nullptr) { | 460 if (is_branch != nullptr) { |
461 *is_branch = (opcode == BX || opcode == BCX); | 461 *is_branch = (opcode == BX || opcode == BCX); |
462 } | 462 } |
463 | 463 |
464 switch (opcode) { | 464 switch (opcode) { |
465 case BX: { | 465 case BX: { |
466 int imm26 = target_pos - pos; | 466 int imm26 = target_pos - pos; |
467 CHECK(is_int26(imm26) && (imm26 & (kAAMask | kLKMask)) == 0); | 467 CHECK(is_int26(imm26) && (imm26 & (kAAMask | kLKMask)) == 0); |
468 if (imm26 == kInstrSize && !(instr & kLKMask)) { | 468 if (imm26 == kInstrSize && !(instr & kLKMask)) { |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
528 } | 528 } |
529 default: | 529 default: |
530 DCHECK(false); | 530 DCHECK(false); |
531 break; | 531 break; |
532 } | 532 } |
533 } | 533 } |
534 | 534 |
535 | 535 |
536 int Assembler::max_reach_from(int pos) { | 536 int Assembler::max_reach_from(int pos) { |
537 Instr instr = instr_at(pos); | 537 Instr instr = instr_at(pos); |
538 int opcode = instr & kOpcodeMask; | 538 uint32_t opcode = instr & kOpcodeMask; |
539 | 539 |
540 // check which type of branch this is 16 or 26 bit offset | 540 // check which type of branch this is 16 or 26 bit offset |
541 switch (opcode) { | 541 switch (opcode) { |
542 case BX: | 542 case BX: |
543 return 26; | 543 return 26; |
544 case BCX: | 544 case BCX: |
545 return 16; | 545 return 16; |
546 case kUnboundMovLabelOffsetOpcode: | 546 case kUnboundMovLabelOffsetOpcode: |
547 case kUnboundAddLabelOffsetOpcode: | 547 case kUnboundAddLabelOffsetOpcode: |
548 case kUnboundMovLabelAddrOpcode: | 548 case kUnboundMovLabelAddrOpcode: |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
639 } | 639 } |
640 emit(instr | rt.code() * B21 | ra.code() * B16 | (kImm16Mask & val)); | 640 emit(instr | rt.code() * B21 | ra.code() * B16 | (kImm16Mask & val)); |
641 } | 641 } |
642 | 642 |
643 | 643 |
644 void Assembler::x_form(Instr instr, Register ra, Register rs, Register rb, | 644 void Assembler::x_form(Instr instr, Register ra, Register rs, Register rb, |
645 RCBit r) { | 645 RCBit r) { |
646 emit(instr | rs.code() * B21 | ra.code() * B16 | rb.code() * B11 | r); | 646 emit(instr | rs.code() * B21 | ra.code() * B16 | rb.code() * B11 | r); |
647 } | 647 } |
648 | 648 |
649 | |
650 void Assembler::xo_form(Instr instr, Register rt, Register ra, Register rb, | 649 void Assembler::xo_form(Instr instr, Register rt, Register ra, Register rb, |
651 OEBit o, RCBit r) { | 650 OEBit o, RCBit r) { |
652 emit(instr | rt.code() * B21 | ra.code() * B16 | rb.code() * B11 | o | r); | 651 emit(instr | rt.code() * B21 | ra.code() * B16 | rb.code() * B11 | o | r); |
653 } | 652 } |
654 | 653 |
655 void Assembler::xx3_form(Instr instr, DoubleRegister t, DoubleRegister a, | 654 void Assembler::xx3_form(Instr instr, DoubleRegister t, DoubleRegister a, |
656 DoubleRegister b) { | 655 DoubleRegister b) { |
657 int AX = ((a.code() & 0x20) >> 5) & 0x1; | 656 int AX = ((a.code() & 0x20) >> 5) & 0x1; |
658 int BX = ((b.code() & 0x20) >> 5) & 0x1; | 657 int BX = ((b.code() & 0x20) >> 5) & 0x1; |
659 int TX = ((t.code() & 0x20) >> 5) & 0x1; | 658 int TX = ((t.code() & 0x20) >> 5) & 0x1; |
(...skipping 1584 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2244 | 2243 |
2245 | 2244 |
2246 void Assembler::fcfidu(const DoubleRegister frt, const DoubleRegister frb, | 2245 void Assembler::fcfidu(const DoubleRegister frt, const DoubleRegister frb, |
2247 RCBit rc) { | 2246 RCBit rc) { |
2248 emit(EXT4 | FCFIDU | frt.code() * B21 | frb.code() * B11 | rc); | 2247 emit(EXT4 | FCFIDU | frt.code() * B21 | frb.code() * B11 | rc); |
2249 } | 2248 } |
2250 | 2249 |
2251 | 2250 |
2252 void Assembler::fcfidus(const DoubleRegister frt, const DoubleRegister frb, | 2251 void Assembler::fcfidus(const DoubleRegister frt, const DoubleRegister frb, |
2253 RCBit rc) { | 2252 RCBit rc) { |
2254 emit(EXT3 | FCFIDU | frt.code() * B21 | frb.code() * B11 | rc); | 2253 emit(EXT3 | FCFIDUS | frt.code() * B21 | frb.code() * B11 | rc); |
2255 } | 2254 } |
2256 | 2255 |
2257 | 2256 |
2258 void Assembler::fcfids(const DoubleRegister frt, const DoubleRegister frb, | 2257 void Assembler::fcfids(const DoubleRegister frt, const DoubleRegister frb, |
2259 RCBit rc) { | 2258 RCBit rc) { |
2260 emit(EXT3 | FCFID | frt.code() * B21 | frb.code() * B11 | rc); | 2259 emit(EXT3 | FCFIDS | frt.code() * B21 | frb.code() * B11 | rc); |
2261 } | 2260 } |
2262 | 2261 |
2263 | 2262 |
2264 void Assembler::fctid(const DoubleRegister frt, const DoubleRegister frb, | 2263 void Assembler::fctid(const DoubleRegister frt, const DoubleRegister frb, |
2265 RCBit rc) { | 2264 RCBit rc) { |
2266 emit(EXT4 | FCTID | frt.code() * B21 | frb.code() * B11 | rc); | 2265 emit(EXT4 | FCTID | frt.code() * B21 | frb.code() * B11 | rc); |
2267 } | 2266 } |
2268 | 2267 |
2269 | 2268 |
2270 void Assembler::fctidz(const DoubleRegister frt, const DoubleRegister frb, | 2269 void Assembler::fctidz(const DoubleRegister frt, const DoubleRegister frb, |
(...skipping 296 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2567 | 2566 |
2568 trampoline_ = Trampoline(pc_offset() - size, tracked_branch_count_); | 2567 trampoline_ = Trampoline(pc_offset() - size, tracked_branch_count_); |
2569 } | 2568 } |
2570 } | 2569 } |
2571 | 2570 |
2572 | 2571 |
2573 } // namespace internal | 2572 } // namespace internal |
2574 } // namespace v8 | 2573 } // namespace v8 |
2575 | 2574 |
2576 #endif // V8_TARGET_ARCH_PPC | 2575 #endif // V8_TARGET_ARCH_PPC |
OLD | NEW |