| 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 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 | 649 |
| 650 void Assembler::xo_form(Instr instr, Register rt, Register ra, Register rb, | 650 void Assembler::xo_form(Instr instr, Register rt, Register ra, Register rb, |
| 651 OEBit o, RCBit r) { | 651 OEBit o, RCBit r) { |
| 652 emit(instr | rt.code() * B21 | ra.code() * B16 | rb.code() * B11 | o | r); | 652 emit(instr | rt.code() * B21 | ra.code() * B16 | rb.code() * B11 | o | r); |
| 653 } | 653 } |
| 654 | 654 |
| 655 void Assembler::xx3_form(Instr instr, DoubleRegister t, DoubleRegister a, | |
| 656 DoubleRegister b) { | |
| 657 int AX = ((a.code() & 0x20) >> 5) & 0x1; | |
| 658 int BX = ((b.code() & 0x20) >> 5) & 0x1; | |
| 659 int TX = ((t.code() & 0x20) >> 5) & 0x1; | |
| 660 emit(instr | (t.code() & 0x1F) * B21 | (a.code() & 0x1F) * B16 | (b.code() | |
| 661 & 0x1F) * B11 | AX * B2 | BX * B1 | TX); | |
| 662 } | |
| 663 | |
| 664 void Assembler::md_form(Instr instr, Register ra, Register rs, int shift, | 655 void Assembler::md_form(Instr instr, Register ra, Register rs, int shift, |
| 665 int maskbit, RCBit r) { | 656 int maskbit, RCBit r) { |
| 666 int sh0_4 = shift & 0x1f; | 657 int sh0_4 = shift & 0x1f; |
| 667 int sh5 = (shift >> 5) & 0x1; | 658 int sh5 = (shift >> 5) & 0x1; |
| 668 int m0_4 = maskbit & 0x1f; | 659 int m0_4 = maskbit & 0x1f; |
| 669 int m5 = (maskbit >> 5) & 0x1; | 660 int m5 = (maskbit >> 5) & 0x1; |
| 670 | 661 |
| 671 emit(instr | rs.code() * B21 | ra.code() * B16 | sh0_4 * B11 | m0_4 * B6 | | 662 emit(instr | rs.code() * B21 | ra.code() * B16 | sh0_4 * B11 | m0_4 * B6 | |
| 672 m5 * B5 | sh5 * B1 | r); | 663 m5 * B5 | sh5 * B1 | r); |
| 673 } | 664 } |
| (...skipping 1570 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2244 | 2235 |
| 2245 | 2236 |
| 2246 void Assembler::fcfidu(const DoubleRegister frt, const DoubleRegister frb, | 2237 void Assembler::fcfidu(const DoubleRegister frt, const DoubleRegister frb, |
| 2247 RCBit rc) { | 2238 RCBit rc) { |
| 2248 emit(EXT4 | FCFIDU | frt.code() * B21 | frb.code() * B11 | rc); | 2239 emit(EXT4 | FCFIDU | frt.code() * B21 | frb.code() * B11 | rc); |
| 2249 } | 2240 } |
| 2250 | 2241 |
| 2251 | 2242 |
| 2252 void Assembler::fcfidus(const DoubleRegister frt, const DoubleRegister frb, | 2243 void Assembler::fcfidus(const DoubleRegister frt, const DoubleRegister frb, |
| 2253 RCBit rc) { | 2244 RCBit rc) { |
| 2254 emit(EXT3 | FCFIDU | frt.code() * B21 | frb.code() * B11 | rc); | 2245 emit(EXT3 | FCFIDUS | frt.code() * B21 | frb.code() * B11 | rc); |
| 2255 } | 2246 } |
| 2256 | 2247 |
| 2257 | 2248 |
| 2258 void Assembler::fcfids(const DoubleRegister frt, const DoubleRegister frb, | 2249 void Assembler::fcfids(const DoubleRegister frt, const DoubleRegister frb, |
| 2259 RCBit rc) { | 2250 RCBit rc) { |
| 2260 emit(EXT3 | FCFID | frt.code() * B21 | frb.code() * B11 | rc); | 2251 emit(EXT3 | FCFIDS | frt.code() * B21 | frb.code() * B11 | rc); |
| 2261 } | 2252 } |
| 2262 | 2253 |
| 2263 | 2254 |
| 2264 void Assembler::fctid(const DoubleRegister frt, const DoubleRegister frb, | 2255 void Assembler::fctid(const DoubleRegister frt, const DoubleRegister frb, |
| 2265 RCBit rc) { | 2256 RCBit rc) { |
| 2266 emit(EXT4 | FCTID | frt.code() * B21 | frb.code() * B11 | rc); | 2257 emit(EXT4 | FCTID | frt.code() * B21 | frb.code() * B11 | rc); |
| 2267 } | 2258 } |
| 2268 | 2259 |
| 2269 | 2260 |
| 2270 void Assembler::fctidz(const DoubleRegister frt, const DoubleRegister frb, | 2261 void Assembler::fctidz(const DoubleRegister frt, const DoubleRegister frb, |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2349 } | 2340 } |
| 2350 | 2341 |
| 2351 | 2342 |
| 2352 void Assembler::fmsub(const DoubleRegister frt, const DoubleRegister fra, | 2343 void Assembler::fmsub(const DoubleRegister frt, const DoubleRegister fra, |
| 2353 const DoubleRegister frc, const DoubleRegister frb, | 2344 const DoubleRegister frc, const DoubleRegister frb, |
| 2354 RCBit rc) { | 2345 RCBit rc) { |
| 2355 emit(EXT4 | FMSUB | frt.code() * B21 | fra.code() * B16 | frb.code() * B11 | | 2346 emit(EXT4 | FMSUB | frt.code() * B21 | fra.code() * B16 | frb.code() * B11 | |
| 2356 frc.code() * B6 | rc); | 2347 frc.code() * B6 | rc); |
| 2357 } | 2348 } |
| 2358 | 2349 |
| 2359 // Support for VSX instructions | |
| 2360 | |
| 2361 void Assembler::xsadddp(const DoubleRegister frt, const DoubleRegister fra, | |
| 2362 const DoubleRegister frb) { | |
| 2363 xx3_form(EXT6 | XSADDDP, frt, fra, frb); | |
| 2364 } | |
| 2365 void Assembler::xssubdp(const DoubleRegister frt, const DoubleRegister fra, | |
| 2366 const DoubleRegister frb) { | |
| 2367 xx3_form(EXT6 | XSSUBDP, frt, fra, frb); | |
| 2368 } | |
| 2369 void Assembler::xsdivdp(const DoubleRegister frt, const DoubleRegister fra, | |
| 2370 const DoubleRegister frb) { | |
| 2371 xx3_form(EXT6 | XSDIVDP, frt, fra, frb); | |
| 2372 } | |
| 2373 void Assembler::xsmuldp(const DoubleRegister frt, const DoubleRegister fra, | |
| 2374 const DoubleRegister frb) { | |
| 2375 xx3_form(EXT6 | XSMULDP, frt, fra, frb); | |
| 2376 } | |
| 2377 | |
| 2378 // Pseudo instructions. | 2350 // Pseudo instructions. |
| 2379 void Assembler::nop(int type) { | 2351 void Assembler::nop(int type) { |
| 2380 Register reg = r0; | 2352 Register reg = r0; |
| 2381 switch (type) { | 2353 switch (type) { |
| 2382 case NON_MARKING_NOP: | 2354 case NON_MARKING_NOP: |
| 2383 reg = r0; | 2355 reg = r0; |
| 2384 break; | 2356 break; |
| 2385 case GROUP_ENDING_NOP: | 2357 case GROUP_ENDING_NOP: |
| 2386 reg = r2; | 2358 reg = r2; |
| 2387 break; | 2359 break; |
| (...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2567 | 2539 |
| 2568 trampoline_ = Trampoline(pc_offset() - size, tracked_branch_count_); | 2540 trampoline_ = Trampoline(pc_offset() - size, tracked_branch_count_); |
| 2569 } | 2541 } |
| 2570 } | 2542 } |
| 2571 | 2543 |
| 2572 | 2544 |
| 2573 } // namespace internal | 2545 } // namespace internal |
| 2574 } // namespace v8 | 2546 } // namespace v8 |
| 2575 | 2547 |
| 2576 #endif // V8_TARGET_ARCH_PPC | 2548 #endif // V8_TARGET_ARCH_PPC |
| OLD | NEW |