| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <stdarg.h> | 5 #include <stdarg.h> |
| 6 #include <stdlib.h> | 6 #include <stdlib.h> |
| 7 #include <cmath> | 7 #include <cmath> |
| 8 | 8 |
| 9 #if V8_TARGET_ARCH_PPC | 9 #if V8_TARGET_ARCH_PPC |
| 10 | 10 |
| (...skipping 1690 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1701 uintptr_t rs_val = get_register(rs); | 1701 uintptr_t rs_val = get_register(rs); |
| 1702 uintptr_t rb_val = get_register(rb) & 0x7f; | 1702 uintptr_t rb_val = get_register(rb) & 0x7f; |
| 1703 intptr_t result = (rb_val > 63) ? 0 : rs_val >> rb_val; | 1703 intptr_t result = (rb_val > 63) ? 0 : rs_val >> rb_val; |
| 1704 set_register(ra, result); | 1704 set_register(ra, result); |
| 1705 if (instr->Bit(0)) { // RC bit set | 1705 if (instr->Bit(0)) { // RC bit set |
| 1706 SetCR0(result); | 1706 SetCR0(result); |
| 1707 } | 1707 } |
| 1708 break; | 1708 break; |
| 1709 } | 1709 } |
| 1710 #endif | 1710 #endif |
| 1711 case MODUW: { |
| 1712 int rt = instr->RTValue(); |
| 1713 int ra = instr->RAValue(); |
| 1714 int rb = instr->RBValue(); |
| 1715 uint32_t ra_val = get_register(ra); |
| 1716 uint32_t rb_val = get_register(rb); |
| 1717 uint32_t alu_out = (rb_val == 0) ? -1 : ra_val % rb_val; |
| 1718 set_register(rt, alu_out); |
| 1719 break; |
| 1720 } |
| 1721 #if V8_TARGET_ARCH_PPC64 |
| 1722 case MODUD: { |
| 1723 int rt = instr->RTValue(); |
| 1724 int ra = instr->RAValue(); |
| 1725 int rb = instr->RBValue(); |
| 1726 uint64_t ra_val = get_register(ra); |
| 1727 uint64_t rb_val = get_register(rb); |
| 1728 uint64_t alu_out = (rb_val == 0) ? -1 : ra_val % rb_val; |
| 1729 set_register(rt, alu_out); |
| 1730 break; |
| 1731 } |
| 1732 #endif |
| 1733 case MODSW: { |
| 1734 int rt = instr->RTValue(); |
| 1735 int ra = instr->RAValue(); |
| 1736 int rb = instr->RBValue(); |
| 1737 int32_t ra_val = get_register(ra); |
| 1738 int32_t rb_val = get_register(rb); |
| 1739 bool overflow = (ra_val == kMinInt && rb_val == -1); |
| 1740 // result is undefined if divisor is zero or if operation |
| 1741 // is 0x80000000 / -1. |
| 1742 int32_t alu_out = (rb_val == 0 || overflow) ? -1 : ra_val % rb_val; |
| 1743 set_register(rt, alu_out); |
| 1744 break; |
| 1745 } |
| 1746 #if V8_TARGET_ARCH_PPC64 |
| 1747 case MODSD: { |
| 1748 int rt = instr->RTValue(); |
| 1749 int ra = instr->RAValue(); |
| 1750 int rb = instr->RBValue(); |
| 1751 int64_t ra_val = get_register(ra); |
| 1752 int64_t rb_val = get_register(rb); |
| 1753 int64_t one = 1; // work-around gcc |
| 1754 int64_t kMinLongLong = (one << 63); |
| 1755 // result is undefined if divisor is zero or if operation |
| 1756 // is 0x80000000_00000000 / -1. |
| 1757 int64_t alu_out = |
| 1758 (rb_val == 0 || (ra_val == kMinLongLong && rb_val == -1)) |
| 1759 ? -1 |
| 1760 : ra_val % rb_val; |
| 1761 set_register(rt, alu_out); |
| 1762 break; |
| 1763 } |
| 1764 #endif |
| 1711 case SRAW: { | 1765 case SRAW: { |
| 1712 int rs = instr->RSValue(); | 1766 int rs = instr->RSValue(); |
| 1713 int ra = instr->RAValue(); | 1767 int ra = instr->RAValue(); |
| 1714 int rb = instr->RBValue(); | 1768 int rb = instr->RBValue(); |
| 1715 int32_t rs_val = get_register(rs); | 1769 int32_t rs_val = get_register(rs); |
| 1716 intptr_t rb_val = get_register(rb) & 0x3f; | 1770 intptr_t rb_val = get_register(rb) & 0x3f; |
| 1717 intptr_t result = (rb_val > 31) ? rs_val >> 31 : rs_val >> rb_val; | 1771 intptr_t result = (rb_val > 31) ? rs_val >> 31 : rs_val >> rb_val; |
| 1718 set_register(ra, result); | 1772 set_register(ra, result); |
| 1719 if (instr->Bit(0)) { // RC bit set | 1773 if (instr->Bit(0)) { // RC bit set |
| 1720 SetCR0(result); | 1774 SetCR0(result); |
| (...skipping 2409 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4130 uintptr_t* stack_slot = reinterpret_cast<uintptr_t*>(current_sp); | 4184 uintptr_t* stack_slot = reinterpret_cast<uintptr_t*>(current_sp); |
| 4131 uintptr_t address = *stack_slot; | 4185 uintptr_t address = *stack_slot; |
| 4132 set_register(sp, current_sp + sizeof(uintptr_t)); | 4186 set_register(sp, current_sp + sizeof(uintptr_t)); |
| 4133 return address; | 4187 return address; |
| 4134 } | 4188 } |
| 4135 } // namespace internal | 4189 } // namespace internal |
| 4136 } // namespace v8 | 4190 } // namespace v8 |
| 4137 | 4191 |
| 4138 #endif // USE_SIMULATOR | 4192 #endif // USE_SIMULATOR |
| 4139 #endif // V8_TARGET_ARCH_PPC | 4193 #endif // V8_TARGET_ARCH_PPC |
| OLD | NEW |