| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 <limits.h> // For LONG_MIN, LONG_MAX. | 5 #include <limits.h> // For LONG_MIN, LONG_MAX. |
| 6 | 6 |
| 7 #include "src/v8.h" | 7 #include "src/v8.h" |
| 8 | 8 |
| 9 #if V8_TARGET_ARCH_MIPS | 9 #if V8_TARGET_ARCH_MIPS |
| 10 | 10 |
| (...skipping 772 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 783 mflo(res); | 783 mflo(res); |
| 784 mfhi(rem); | 784 mfhi(rem); |
| 785 } else { | 785 } else { |
| 786 div(res, rs, at); | 786 div(res, rs, at); |
| 787 mod(rem, rs, at); | 787 mod(rem, rs, at); |
| 788 } | 788 } |
| 789 } | 789 } |
| 790 } | 790 } |
| 791 | 791 |
| 792 | 792 |
| 793 void MacroAssembler::Div(Register res, Register rs, const Operand& rt) { |
| 794 if (rt.is_reg()) { |
| 795 if (!IsMipsArchVariant(kMips32r6)) { |
| 796 div(rs, rt.rm()); |
| 797 mflo(res); |
| 798 } else { |
| 799 div(res, rs, rt.rm()); |
| 800 } |
| 801 } else { |
| 802 // li handles the relocation. |
| 803 DCHECK(!rs.is(at)); |
| 804 li(at, rt); |
| 805 if (!IsMipsArchVariant(kMips32r6)) { |
| 806 div(rs, at); |
| 807 mflo(res); |
| 808 } else { |
| 809 div(res, rs, at); |
| 810 } |
| 811 } |
| 812 } |
| 813 |
| 814 |
| 793 void MacroAssembler::Mod(Register rd, Register rs, const Operand& rt) { | 815 void MacroAssembler::Mod(Register rd, Register rs, const Operand& rt) { |
| 794 if (rt.is_reg()) { | 816 if (rt.is_reg()) { |
| 795 if (!IsMipsArchVariant(kMips32r6)) { | 817 if (!IsMipsArchVariant(kMips32r6)) { |
| 796 div(rs, rt.rm()); | 818 div(rs, rt.rm()); |
| 797 mfhi(rd); | 819 mfhi(rd); |
| 798 } else { | 820 } else { |
| 799 mod(rd, rs, rt.rm()); | 821 mod(rd, rs, rt.rm()); |
| 800 } | 822 } |
| 801 } else { | 823 } else { |
| 802 // li handles the relocation. | 824 // li handles the relocation. |
| 803 DCHECK(!rs.is(at)); | 825 DCHECK(!rs.is(at)); |
| 804 li(at, rt); | 826 li(at, rt); |
| 805 if (!IsMipsArchVariant(kMips32r6)) { | 827 if (!IsMipsArchVariant(kMips32r6)) { |
| 806 div(rs, at); | 828 div(rs, at); |
| 807 mfhi(rd); | 829 mfhi(rd); |
| 808 } else { | 830 } else { |
| 809 mod(rd, rs, at); | 831 mod(rd, rs, at); |
| 810 } | 832 } |
| 811 } | 833 } |
| 812 } | 834 } |
| 813 | 835 |
| 814 | 836 |
| 837 void MacroAssembler::Modu(Register rd, Register rs, const Operand& rt) { |
| 838 if (rt.is_reg()) { |
| 839 if (!IsMipsArchVariant(kMips32r6)) { |
| 840 divu(rs, rt.rm()); |
| 841 mfhi(rd); |
| 842 } else { |
| 843 modu(rd, rs, rt.rm()); |
| 844 } |
| 845 } else { |
| 846 // li handles the relocation. |
| 847 DCHECK(!rs.is(at)); |
| 848 li(at, rt); |
| 849 if (!IsMipsArchVariant(kMips32r6)) { |
| 850 divu(rs, at); |
| 851 mfhi(rd); |
| 852 } else { |
| 853 modu(rd, rs, at); |
| 854 } |
| 855 } |
| 856 } |
| 857 |
| 858 |
| 815 void MacroAssembler::Divu(Register rs, const Operand& rt) { | 859 void MacroAssembler::Divu(Register rs, const Operand& rt) { |
| 816 if (rt.is_reg()) { | 860 if (rt.is_reg()) { |
| 817 divu(rs, rt.rm()); | 861 divu(rs, rt.rm()); |
| 818 } else { | 862 } else { |
| 819 // li handles the relocation. | 863 // li handles the relocation. |
| 820 DCHECK(!rs.is(at)); | 864 DCHECK(!rs.is(at)); |
| 821 li(at, rt); | 865 li(at, rt); |
| 822 divu(rs, at); | 866 divu(rs, at); |
| 823 } | 867 } |
| 824 } | 868 } |
| 825 | 869 |
| 826 | 870 |
| 871 void MacroAssembler::Divu(Register res, Register rs, const Operand& rt) { |
| 872 if (rt.is_reg()) { |
| 873 if (!IsMipsArchVariant(kMips32r6)) { |
| 874 divu(rs, rt.rm()); |
| 875 mflo(res); |
| 876 } else { |
| 877 divu(res, rs, rt.rm()); |
| 878 } |
| 879 } else { |
| 880 // li handles the relocation. |
| 881 DCHECK(!rs.is(at)); |
| 882 li(at, rt); |
| 883 if (!IsMipsArchVariant(kMips32r6)) { |
| 884 divu(rs, at); |
| 885 mflo(res); |
| 886 } else { |
| 887 divu(res, rs, at); |
| 888 } |
| 889 } |
| 890 } |
| 891 |
| 892 |
| 827 void MacroAssembler::And(Register rd, Register rs, const Operand& rt) { | 893 void MacroAssembler::And(Register rd, Register rs, const Operand& rt) { |
| 828 if (rt.is_reg()) { | 894 if (rt.is_reg()) { |
| 829 and_(rd, rs, rt.rm()); | 895 and_(rd, rs, rt.rm()); |
| 830 } else { | 896 } else { |
| 831 if (is_uint16(rt.imm32_) && !MustUseReg(rt.rmode_)) { | 897 if (is_uint16(rt.imm32_) && !MustUseReg(rt.rmode_)) { |
| 832 andi(rd, rs, rt.imm32_); | 898 andi(rd, rs, rt.imm32_); |
| 833 } else { | 899 } else { |
| 834 // li handles the relocation. | 900 // li handles the relocation. |
| 835 DCHECK(!rs.is(at)); | 901 DCHECK(!rs.is(at)); |
| 836 li(at, rt); | 902 li(at, rt); |
| (...skipping 1060 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1897 if (r2.is(zero_reg)) { | 1963 if (r2.is(zero_reg)) { |
| 1898 blez(rs, offset); | 1964 blez(rs, offset); |
| 1899 } else { | 1965 } else { |
| 1900 slt(scratch, r2, rs); | 1966 slt(scratch, r2, rs); |
| 1901 beq(scratch, zero_reg, offset); | 1967 beq(scratch, zero_reg, offset); |
| 1902 } | 1968 } |
| 1903 break; | 1969 break; |
| 1904 // Unsigned comparison. | 1970 // Unsigned comparison. |
| 1905 case Ugreater: | 1971 case Ugreater: |
| 1906 if (r2.is(zero_reg)) { | 1972 if (r2.is(zero_reg)) { |
| 1907 bgtz(rs, offset); | 1973 bne(rs, zero_reg, offset); |
| 1908 } else { | 1974 } else { |
| 1909 sltu(scratch, r2, rs); | 1975 sltu(scratch, r2, rs); |
| 1910 bne(scratch, zero_reg, offset); | 1976 bne(scratch, zero_reg, offset); |
| 1911 } | 1977 } |
| 1912 break; | 1978 break; |
| 1913 case Ugreater_equal: | 1979 case Ugreater_equal: |
| 1914 if (r2.is(zero_reg)) { | 1980 if (r2.is(zero_reg)) { |
| 1915 bgez(rs, offset); | 1981 b(offset); |
| 1916 } else { | 1982 } else { |
| 1917 sltu(scratch, rs, r2); | 1983 sltu(scratch, rs, r2); |
| 1918 beq(scratch, zero_reg, offset); | 1984 beq(scratch, zero_reg, offset); |
| 1919 } | 1985 } |
| 1920 break; | 1986 break; |
| 1921 case Uless: | 1987 case Uless: |
| 1922 if (r2.is(zero_reg)) { | 1988 if (r2.is(zero_reg)) { |
| 1923 // No code needs to be emitted. | 1989 // No code needs to be emitted. |
| 1924 return; | 1990 return; |
| 1925 } else { | 1991 } else { |
| 1926 sltu(scratch, rs, r2); | 1992 sltu(scratch, rs, r2); |
| 1927 bne(scratch, zero_reg, offset); | 1993 bne(scratch, zero_reg, offset); |
| 1928 } | 1994 } |
| 1929 break; | 1995 break; |
| 1930 case Uless_equal: | 1996 case Uless_equal: |
| 1931 if (r2.is(zero_reg)) { | 1997 if (r2.is(zero_reg)) { |
| 1932 b(offset); | 1998 beq(rs, zero_reg, offset); |
| 1933 } else { | 1999 } else { |
| 1934 sltu(scratch, r2, rs); | 2000 sltu(scratch, r2, rs); |
| 1935 beq(scratch, zero_reg, offset); | 2001 beq(scratch, zero_reg, offset); |
| 1936 } | 2002 } |
| 1937 break; | 2003 break; |
| 1938 default: | 2004 default: |
| 1939 UNREACHABLE(); | 2005 UNREACHABLE(); |
| 1940 } | 2006 } |
| 1941 } else { | 2007 } else { |
| 1942 // Be careful to always use shifted_branch_offset only just before the | 2008 // Be careful to always use shifted_branch_offset only just before the |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2004 } else { | 2070 } else { |
| 2005 r2 = scratch; | 2071 r2 = scratch; |
| 2006 li(r2, rt); | 2072 li(r2, rt); |
| 2007 slt(scratch, r2, rs); | 2073 slt(scratch, r2, rs); |
| 2008 beq(scratch, zero_reg, offset); | 2074 beq(scratch, zero_reg, offset); |
| 2009 } | 2075 } |
| 2010 break; | 2076 break; |
| 2011 // Unsigned comparison. | 2077 // Unsigned comparison. |
| 2012 case Ugreater: | 2078 case Ugreater: |
| 2013 if (rt.imm32_ == 0) { | 2079 if (rt.imm32_ == 0) { |
| 2014 bgtz(rs, offset); | 2080 bne(rs, zero_reg, offset); |
| 2015 } else { | 2081 } else { |
| 2016 r2 = scratch; | 2082 r2 = scratch; |
| 2017 li(r2, rt); | 2083 li(r2, rt); |
| 2018 sltu(scratch, r2, rs); | 2084 sltu(scratch, r2, rs); |
| 2019 bne(scratch, zero_reg, offset); | 2085 bne(scratch, zero_reg, offset); |
| 2020 } | 2086 } |
| 2021 break; | 2087 break; |
| 2022 case Ugreater_equal: | 2088 case Ugreater_equal: |
| 2023 if (rt.imm32_ == 0) { | 2089 if (rt.imm32_ == 0) { |
| 2024 bgez(rs, offset); | 2090 b(offset); |
| 2025 } else if (is_int16(rt.imm32_)) { | 2091 } else if (is_int16(rt.imm32_)) { |
| 2026 sltiu(scratch, rs, rt.imm32_); | 2092 sltiu(scratch, rs, rt.imm32_); |
| 2027 beq(scratch, zero_reg, offset); | 2093 beq(scratch, zero_reg, offset); |
| 2028 } else { | 2094 } else { |
| 2029 r2 = scratch; | 2095 r2 = scratch; |
| 2030 li(r2, rt); | 2096 li(r2, rt); |
| 2031 sltu(scratch, rs, r2); | 2097 sltu(scratch, rs, r2); |
| 2032 beq(scratch, zero_reg, offset); | 2098 beq(scratch, zero_reg, offset); |
| 2033 } | 2099 } |
| 2034 break; | 2100 break; |
| 2035 case Uless: | 2101 case Uless: |
| 2036 if (rt.imm32_ == 0) { | 2102 if (rt.imm32_ == 0) { |
| 2037 // No code needs to be emitted. | 2103 // No code needs to be emitted. |
| 2038 return; | 2104 return; |
| 2039 } else if (is_int16(rt.imm32_)) { | 2105 } else if (is_int16(rt.imm32_)) { |
| 2040 sltiu(scratch, rs, rt.imm32_); | 2106 sltiu(scratch, rs, rt.imm32_); |
| 2041 bne(scratch, zero_reg, offset); | 2107 bne(scratch, zero_reg, offset); |
| 2042 } else { | 2108 } else { |
| 2043 r2 = scratch; | 2109 r2 = scratch; |
| 2044 li(r2, rt); | 2110 li(r2, rt); |
| 2045 sltu(scratch, rs, r2); | 2111 sltu(scratch, rs, r2); |
| 2046 bne(scratch, zero_reg, offset); | 2112 bne(scratch, zero_reg, offset); |
| 2047 } | 2113 } |
| 2048 break; | 2114 break; |
| 2049 case Uless_equal: | 2115 case Uless_equal: |
| 2050 if (rt.imm32_ == 0) { | 2116 if (rt.imm32_ == 0) { |
| 2051 b(offset); | 2117 beq(rs, zero_reg, offset); |
| 2052 } else { | 2118 } else { |
| 2053 r2 = scratch; | 2119 r2 = scratch; |
| 2054 li(r2, rt); | 2120 li(r2, rt); |
| 2055 sltu(scratch, r2, rs); | 2121 sltu(scratch, r2, rs); |
| 2056 beq(scratch, zero_reg, offset); | 2122 beq(scratch, zero_reg, offset); |
| 2057 } | 2123 } |
| 2058 break; | 2124 break; |
| 2059 default: | 2125 default: |
| 2060 UNREACHABLE(); | 2126 UNREACHABLE(); |
| 2061 } | 2127 } |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2143 } else { | 2209 } else { |
| 2144 slt(scratch, r2, rs); | 2210 slt(scratch, r2, rs); |
| 2145 offset = shifted_branch_offset(L, false); | 2211 offset = shifted_branch_offset(L, false); |
| 2146 beq(scratch, zero_reg, offset); | 2212 beq(scratch, zero_reg, offset); |
| 2147 } | 2213 } |
| 2148 break; | 2214 break; |
| 2149 // Unsigned comparison. | 2215 // Unsigned comparison. |
| 2150 case Ugreater: | 2216 case Ugreater: |
| 2151 if (r2.is(zero_reg)) { | 2217 if (r2.is(zero_reg)) { |
| 2152 offset = shifted_branch_offset(L, false); | 2218 offset = shifted_branch_offset(L, false); |
| 2153 bgtz(rs, offset); | 2219 bne(rs, zero_reg, offset); |
| 2154 } else { | 2220 } else { |
| 2155 sltu(scratch, r2, rs); | 2221 sltu(scratch, r2, rs); |
| 2156 offset = shifted_branch_offset(L, false); | 2222 offset = shifted_branch_offset(L, false); |
| 2157 bne(scratch, zero_reg, offset); | 2223 bne(scratch, zero_reg, offset); |
| 2158 } | 2224 } |
| 2159 break; | 2225 break; |
| 2160 case Ugreater_equal: | 2226 case Ugreater_equal: |
| 2161 if (r2.is(zero_reg)) { | 2227 if (r2.is(zero_reg)) { |
| 2162 offset = shifted_branch_offset(L, false); | 2228 offset = shifted_branch_offset(L, false); |
| 2163 bgez(rs, offset); | 2229 b(offset); |
| 2164 } else { | 2230 } else { |
| 2165 sltu(scratch, rs, r2); | 2231 sltu(scratch, rs, r2); |
| 2166 offset = shifted_branch_offset(L, false); | 2232 offset = shifted_branch_offset(L, false); |
| 2167 beq(scratch, zero_reg, offset); | 2233 beq(scratch, zero_reg, offset); |
| 2168 } | 2234 } |
| 2169 break; | 2235 break; |
| 2170 case Uless: | 2236 case Uless: |
| 2171 if (r2.is(zero_reg)) { | 2237 if (r2.is(zero_reg)) { |
| 2172 // No code needs to be emitted. | 2238 // No code needs to be emitted. |
| 2173 return; | 2239 return; |
| 2174 } else { | 2240 } else { |
| 2175 sltu(scratch, rs, r2); | 2241 sltu(scratch, rs, r2); |
| 2176 offset = shifted_branch_offset(L, false); | 2242 offset = shifted_branch_offset(L, false); |
| 2177 bne(scratch, zero_reg, offset); | 2243 bne(scratch, zero_reg, offset); |
| 2178 } | 2244 } |
| 2179 break; | 2245 break; |
| 2180 case Uless_equal: | 2246 case Uless_equal: |
| 2181 if (r2.is(zero_reg)) { | 2247 if (r2.is(zero_reg)) { |
| 2182 offset = shifted_branch_offset(L, false); | 2248 offset = shifted_branch_offset(L, false); |
| 2183 b(offset); | 2249 beq(rs, zero_reg, offset); |
| 2184 } else { | 2250 } else { |
| 2185 sltu(scratch, r2, rs); | 2251 sltu(scratch, r2, rs); |
| 2186 offset = shifted_branch_offset(L, false); | 2252 offset = shifted_branch_offset(L, false); |
| 2187 beq(scratch, zero_reg, offset); | 2253 beq(scratch, zero_reg, offset); |
| 2188 } | 2254 } |
| 2189 break; | 2255 break; |
| 2190 default: | 2256 default: |
| 2191 UNREACHABLE(); | 2257 UNREACHABLE(); |
| 2192 } | 2258 } |
| 2193 } else { | 2259 } else { |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2285 r2 = scratch; | 2351 r2 = scratch; |
| 2286 li(r2, rt); | 2352 li(r2, rt); |
| 2287 sltu(scratch, r2, rs); | 2353 sltu(scratch, r2, rs); |
| 2288 offset = shifted_branch_offset(L, false); | 2354 offset = shifted_branch_offset(L, false); |
| 2289 bne(scratch, zero_reg, offset); | 2355 bne(scratch, zero_reg, offset); |
| 2290 } | 2356 } |
| 2291 break; | 2357 break; |
| 2292 case Ugreater_equal: | 2358 case Ugreater_equal: |
| 2293 if (rt.imm32_ == 0) { | 2359 if (rt.imm32_ == 0) { |
| 2294 offset = shifted_branch_offset(L, false); | 2360 offset = shifted_branch_offset(L, false); |
| 2295 bgez(rs, offset); | 2361 b(offset); |
| 2296 } else if (is_int16(rt.imm32_)) { | 2362 } else if (is_int16(rt.imm32_)) { |
| 2297 sltiu(scratch, rs, rt.imm32_); | 2363 sltiu(scratch, rs, rt.imm32_); |
| 2298 offset = shifted_branch_offset(L, false); | 2364 offset = shifted_branch_offset(L, false); |
| 2299 beq(scratch, zero_reg, offset); | 2365 beq(scratch, zero_reg, offset); |
| 2300 } else { | 2366 } else { |
| 2301 DCHECK(!scratch.is(rs)); | 2367 DCHECK(!scratch.is(rs)); |
| 2302 r2 = scratch; | 2368 r2 = scratch; |
| 2303 li(r2, rt); | 2369 li(r2, rt); |
| 2304 sltu(scratch, rs, r2); | 2370 sltu(scratch, rs, r2); |
| 2305 offset = shifted_branch_offset(L, false); | 2371 offset = shifted_branch_offset(L, false); |
| (...skipping 2164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4470 | 4536 |
| 4471 void MacroAssembler::SmiToDoubleFPURegister(Register smi, | 4537 void MacroAssembler::SmiToDoubleFPURegister(Register smi, |
| 4472 FPURegister value, | 4538 FPURegister value, |
| 4473 Register scratch1) { | 4539 Register scratch1) { |
| 4474 sra(scratch1, smi, kSmiTagSize); | 4540 sra(scratch1, smi, kSmiTagSize); |
| 4475 mtc1(scratch1, value); | 4541 mtc1(scratch1, value); |
| 4476 cvt_d_w(value, value); | 4542 cvt_d_w(value, value); |
| 4477 } | 4543 } |
| 4478 | 4544 |
| 4479 | 4545 |
| 4480 void MacroAssembler::AdduAndCheckForOverflow(Register dst, | 4546 void MacroAssembler::AdduAndCheckForOverflow(Register dst, Register left, |
| 4481 Register left, | 4547 const Operand& right, |
| 4548 Register overflow_dst, |
| 4549 Register scratch) { |
| 4550 if (right.is_reg()) { |
| 4551 AdduAndCheckForOverflow(dst, left, right.rm(), overflow_dst, scratch); |
| 4552 } else { |
| 4553 if (dst.is(left)) { |
| 4554 mov(scratch, left); // Preserve left. |
| 4555 addiu(dst, left, right.immediate()); // Left is overwritten. |
| 4556 xor_(scratch, dst, scratch); // Original left. |
| 4557 // Load right since xori takes uint16 as immediate. |
| 4558 addiu(t9, zero_reg, right.immediate()); |
| 4559 xor_(overflow_dst, dst, t9); |
| 4560 and_(overflow_dst, overflow_dst, scratch); |
| 4561 } else { |
| 4562 addiu(dst, left, right.immediate()); |
| 4563 xor_(overflow_dst, dst, left); |
| 4564 // Load right since xori takes uint16 as immediate. |
| 4565 addiu(t9, zero_reg, right.immediate()); |
| 4566 xor_(scratch, dst, t9); |
| 4567 and_(overflow_dst, scratch, overflow_dst); |
| 4568 } |
| 4569 } |
| 4570 } |
| 4571 |
| 4572 |
| 4573 void MacroAssembler::AdduAndCheckForOverflow(Register dst, Register left, |
| 4482 Register right, | 4574 Register right, |
| 4483 Register overflow_dst, | 4575 Register overflow_dst, |
| 4484 Register scratch) { | 4576 Register scratch) { |
| 4485 DCHECK(!dst.is(overflow_dst)); | 4577 DCHECK(!dst.is(overflow_dst)); |
| 4486 DCHECK(!dst.is(scratch)); | 4578 DCHECK(!dst.is(scratch)); |
| 4487 DCHECK(!overflow_dst.is(scratch)); | 4579 DCHECK(!overflow_dst.is(scratch)); |
| 4488 DCHECK(!overflow_dst.is(left)); | 4580 DCHECK(!overflow_dst.is(left)); |
| 4489 DCHECK(!overflow_dst.is(right)); | 4581 DCHECK(!overflow_dst.is(right)); |
| 4490 | 4582 |
| 4491 if (left.is(right) && dst.is(left)) { | 4583 if (left.is(right) && dst.is(left)) { |
| (...skipping 20 matching lines...) Expand all Loading... |
| 4512 and_(overflow_dst, overflow_dst, scratch); | 4604 and_(overflow_dst, overflow_dst, scratch); |
| 4513 } else { | 4605 } else { |
| 4514 addu(dst, left, right); | 4606 addu(dst, left, right); |
| 4515 xor_(overflow_dst, dst, left); | 4607 xor_(overflow_dst, dst, left); |
| 4516 xor_(scratch, dst, right); | 4608 xor_(scratch, dst, right); |
| 4517 and_(overflow_dst, scratch, overflow_dst); | 4609 and_(overflow_dst, scratch, overflow_dst); |
| 4518 } | 4610 } |
| 4519 } | 4611 } |
| 4520 | 4612 |
| 4521 | 4613 |
| 4522 void MacroAssembler::SubuAndCheckForOverflow(Register dst, | 4614 void MacroAssembler::SubuAndCheckForOverflow(Register dst, Register left, |
| 4523 Register left, | 4615 const Operand& right, |
| 4616 Register overflow_dst, |
| 4617 Register scratch) { |
| 4618 if (right.is_reg()) { |
| 4619 SubuAndCheckForOverflow(dst, left, right.rm(), overflow_dst, scratch); |
| 4620 } else { |
| 4621 if (dst.is(left)) { |
| 4622 mov(scratch, left); // Preserve left. |
| 4623 addiu(dst, left, -(right.immediate())); // Left is overwritten. |
| 4624 xor_(overflow_dst, dst, scratch); // scratch is original left. |
| 4625 // Load right since xori takes uint16 as immediate. |
| 4626 addiu(t9, zero_reg, right.immediate()); |
| 4627 xor_(scratch, scratch, t9); // scratch is original left. |
| 4628 and_(overflow_dst, scratch, overflow_dst); |
| 4629 } else { |
| 4630 addiu(dst, left, -(right.immediate())); |
| 4631 xor_(overflow_dst, dst, left); |
| 4632 // Load right since xori takes uint16 as immediate. |
| 4633 addiu(t9, zero_reg, right.immediate()); |
| 4634 xor_(scratch, left, t9); |
| 4635 and_(overflow_dst, scratch, overflow_dst); |
| 4636 } |
| 4637 } |
| 4638 } |
| 4639 |
| 4640 |
| 4641 void MacroAssembler::SubuAndCheckForOverflow(Register dst, Register left, |
| 4524 Register right, | 4642 Register right, |
| 4525 Register overflow_dst, | 4643 Register overflow_dst, |
| 4526 Register scratch) { | 4644 Register scratch) { |
| 4527 DCHECK(!dst.is(overflow_dst)); | 4645 DCHECK(!dst.is(overflow_dst)); |
| 4528 DCHECK(!dst.is(scratch)); | 4646 DCHECK(!dst.is(scratch)); |
| 4529 DCHECK(!overflow_dst.is(scratch)); | 4647 DCHECK(!overflow_dst.is(scratch)); |
| 4530 DCHECK(!overflow_dst.is(left)); | 4648 DCHECK(!overflow_dst.is(left)); |
| 4531 DCHECK(!overflow_dst.is(right)); | 4649 DCHECK(!overflow_dst.is(right)); |
| 4532 DCHECK(!scratch.is(left)); | 4650 DCHECK(!scratch.is(left)); |
| 4533 DCHECK(!scratch.is(right)); | 4651 DCHECK(!scratch.is(right)); |
| (...skipping 1562 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6096 } | 6214 } |
| 6097 if (mag.shift > 0) sra(result, result, mag.shift); | 6215 if (mag.shift > 0) sra(result, result, mag.shift); |
| 6098 srl(at, dividend, 31); | 6216 srl(at, dividend, 31); |
| 6099 Addu(result, result, Operand(at)); | 6217 Addu(result, result, Operand(at)); |
| 6100 } | 6218 } |
| 6101 | 6219 |
| 6102 | 6220 |
| 6103 } } // namespace v8::internal | 6221 } } // namespace v8::internal |
| 6104 | 6222 |
| 6105 #endif // V8_TARGET_ARCH_MIPS | 6223 #endif // V8_TARGET_ARCH_MIPS |
| OLD | NEW |