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 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
72 } | 72 } |
73 #endif | 73 #endif |
74 if (cpu.part() == base::CPU::PPC_POWER6 || | 74 if (cpu.part() == base::CPU::PPC_POWER6 || |
75 cpu.part() == base::CPU::PPC_POWER7 || | 75 cpu.part() == base::CPU::PPC_POWER7 || |
76 cpu.part() == base::CPU::PPC_POWER8) { | 76 cpu.part() == base::CPU::PPC_POWER8) { |
77 supported_ |= (1u << LWSYNC); | 77 supported_ |= (1u << LWSYNC); |
78 } | 78 } |
79 if (cpu.part() == base::CPU::PPC_POWER7 || | 79 if (cpu.part() == base::CPU::PPC_POWER7 || |
80 cpu.part() == base::CPU::PPC_POWER8) { | 80 cpu.part() == base::CPU::PPC_POWER8) { |
81 supported_ |= (1u << ISELECT); | 81 supported_ |= (1u << ISELECT); |
| 82 supported_ |= (1u << VSX); |
82 } | 83 } |
83 #if V8_OS_LINUX | 84 #if V8_OS_LINUX |
84 if (!(cpu.part() == base::CPU::PPC_G5 || cpu.part() == base::CPU::PPC_G4)) { | 85 if (!(cpu.part() == base::CPU::PPC_G5 || cpu.part() == base::CPU::PPC_G4)) { |
85 // Assume support | 86 // Assume support |
86 supported_ |= (1u << FPU); | 87 supported_ |= (1u << FPU); |
87 } | 88 } |
88 if (cpu.icache_line_size() != base::CPU::UNKNOWN_CACHE_LINE_SIZE) { | 89 if (cpu.icache_line_size() != base::CPU::UNKNOWN_CACHE_LINE_SIZE) { |
89 icache_line_size_ = cpu.icache_line_size(); | 90 icache_line_size_ = cpu.icache_line_size(); |
90 } | 91 } |
91 #elif V8_OS_AIX | 92 #elif V8_OS_AIX |
92 // Assume support FP support and default cache line size | 93 // Assume support FP support and default cache line size |
93 supported_ |= (1u << FPU); | 94 supported_ |= (1u << FPU); |
94 #endif | 95 #endif |
95 #else // Simulator | 96 #else // Simulator |
96 supported_ |= (1u << FPU); | 97 supported_ |= (1u << FPU); |
97 supported_ |= (1u << LWSYNC); | 98 supported_ |= (1u << LWSYNC); |
98 supported_ |= (1u << ISELECT); | 99 supported_ |= (1u << ISELECT); |
| 100 supported_ |= (1u << VSX); |
99 #if V8_TARGET_ARCH_PPC64 | 101 #if V8_TARGET_ARCH_PPC64 |
100 supported_ |= (1u << FPR_GPR_MOV); | 102 supported_ |= (1u << FPR_GPR_MOV); |
101 #endif | 103 #endif |
102 #endif | 104 #endif |
103 } | 105 } |
104 | 106 |
105 | 107 |
106 void CpuFeatures::PrintTarget() { | 108 void CpuFeatures::PrintTarget() { |
107 const char* ppc_arch = NULL; | 109 const char* ppc_arch = NULL; |
108 | 110 |
(...skipping 525 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
634 RCBit r) { | 636 RCBit r) { |
635 emit(instr | rs.code() * B21 | ra.code() * B16 | rb.code() * B11 | r); | 637 emit(instr | rs.code() * B21 | ra.code() * B16 | rb.code() * B11 | r); |
636 } | 638 } |
637 | 639 |
638 | 640 |
639 void Assembler::xo_form(Instr instr, Register rt, Register ra, Register rb, | 641 void Assembler::xo_form(Instr instr, Register rt, Register ra, Register rb, |
640 OEBit o, RCBit r) { | 642 OEBit o, RCBit r) { |
641 emit(instr | rt.code() * B21 | ra.code() * B16 | rb.code() * B11 | o | r); | 643 emit(instr | rt.code() * B21 | ra.code() * B16 | rb.code() * B11 | o | r); |
642 } | 644 } |
643 | 645 |
| 646 void Assembler::xx3_form(Instr instr, DoubleRegister t, DoubleRegister a, |
| 647 DoubleRegister b) { |
| 648 int AX = ((a.code() & 0x20) >> 5) & 0x1; |
| 649 int BX = ((b.code() & 0x20) >> 5) & 0x1; |
| 650 int TX = ((t.code() & 0x20) >> 5) & 0x1; |
| 651 emit(instr | (t.code() & 0x1F) * B21 | (a.code() & 0x1F) * B16 | (b.code() |
| 652 & 0x1F) * B11 | AX * B2 | BX * B1 | TX); |
| 653 } |
644 | 654 |
645 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, |
646 int maskbit, RCBit r) { | 656 int maskbit, RCBit r) { |
647 int sh0_4 = shift & 0x1f; | 657 int sh0_4 = shift & 0x1f; |
648 int sh5 = (shift >> 5) & 0x1; | 658 int sh5 = (shift >> 5) & 0x1; |
649 int m0_4 = maskbit & 0x1f; | 659 int m0_4 = maskbit & 0x1f; |
650 int m5 = (maskbit >> 5) & 0x1; | 660 int m5 = (maskbit >> 5) & 0x1; |
651 | 661 |
652 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 | |
653 m5 * B5 | sh5 * B1 | r); | 663 m5 * B5 | sh5 * B1 | r); |
(...skipping 1661 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2315 } | 2325 } |
2316 | 2326 |
2317 | 2327 |
2318 void Assembler::fmsub(const DoubleRegister frt, const DoubleRegister fra, | 2328 void Assembler::fmsub(const DoubleRegister frt, const DoubleRegister fra, |
2319 const DoubleRegister frc, const DoubleRegister frb, | 2329 const DoubleRegister frc, const DoubleRegister frb, |
2320 RCBit rc) { | 2330 RCBit rc) { |
2321 emit(EXT4 | FMSUB | frt.code() * B21 | fra.code() * B16 | frb.code() * B11 | | 2331 emit(EXT4 | FMSUB | frt.code() * B21 | fra.code() * B16 | frb.code() * B11 | |
2322 frc.code() * B6 | rc); | 2332 frc.code() * B6 | rc); |
2323 } | 2333 } |
2324 | 2334 |
| 2335 // Support for VSX instructions |
| 2336 |
| 2337 void Assembler::xsadddp(const DoubleRegister frt, const DoubleRegister fra, |
| 2338 const DoubleRegister frb) { |
| 2339 xx3_form(EXT6 | XSADDDP, frt, fra, frb); |
| 2340 } |
| 2341 void Assembler::xssubdp(const DoubleRegister frt, const DoubleRegister fra, |
| 2342 const DoubleRegister frb) { |
| 2343 xx3_form(EXT6 | XSSUBDP, frt, fra, frb); |
| 2344 } |
| 2345 void Assembler::xsdivdp(const DoubleRegister frt, const DoubleRegister fra, |
| 2346 const DoubleRegister frb) { |
| 2347 xx3_form(EXT6 | XSDIVDP, frt, fra, frb); |
| 2348 } |
| 2349 void Assembler::xsmuldp(const DoubleRegister frt, const DoubleRegister fra, |
| 2350 const DoubleRegister frb) { |
| 2351 xx3_form(EXT6 | XSMULDP, frt, fra, frb); |
| 2352 } |
2325 | 2353 |
2326 // Pseudo instructions. | 2354 // Pseudo instructions. |
2327 void Assembler::nop(int type) { | 2355 void Assembler::nop(int type) { |
2328 Register reg = r0; | 2356 Register reg = r0; |
2329 switch (type) { | 2357 switch (type) { |
2330 case NON_MARKING_NOP: | 2358 case NON_MARKING_NOP: |
2331 reg = r0; | 2359 reg = r0; |
2332 break; | 2360 break; |
2333 case GROUP_ENDING_NOP: | 2361 case GROUP_ENDING_NOP: |
2334 reg = r2; | 2362 reg = r2; |
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2515 | 2543 |
2516 trampoline_ = Trampoline(pc_offset() - size, tracked_branch_count_); | 2544 trampoline_ = Trampoline(pc_offset() - size, tracked_branch_count_); |
2517 } | 2545 } |
2518 } | 2546 } |
2519 | 2547 |
2520 | 2548 |
2521 } // namespace internal | 2549 } // namespace internal |
2522 } // namespace v8 | 2550 } // namespace v8 |
2523 | 2551 |
2524 #endif // V8_TARGET_ARCH_PPC | 2552 #endif // V8_TARGET_ARCH_PPC |
OLD | NEW |