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 "src/ast/scopes.h" | 5 #include "src/ast/scopes.h" |
6 #include "src/compiler/code-generator.h" | 6 #include "src/compiler/code-generator.h" |
7 #include "src/compiler/code-generator-impl.h" | 7 #include "src/compiler/code-generator-impl.h" |
8 #include "src/compiler/gap-resolver.h" | 8 #include "src/compiler/gap-resolver.h" |
9 #include "src/compiler/node-matchers.h" | 9 #include "src/compiler/node-matchers.h" |
10 #include "src/compiler/osr.h" | 10 #include "src/compiler/osr.h" |
(...skipping 833 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
844 break; | 844 break; |
845 case kMips64Dsub: | 845 case kMips64Dsub: |
846 __ Dsubu(i.OutputRegister(), i.InputRegister(0), i.InputOperand(1)); | 846 __ Dsubu(i.OutputRegister(), i.InputRegister(0), i.InputOperand(1)); |
847 break; | 847 break; |
848 case kMips64DsubOvf: | 848 case kMips64DsubOvf: |
849 // Pseudo-instruction used for overflow/branch. No opcode emitted here. | 849 // Pseudo-instruction used for overflow/branch. No opcode emitted here. |
850 break; | 850 break; |
851 case kMips64Mul: | 851 case kMips64Mul: |
852 __ Mul(i.OutputRegister(), i.InputRegister(0), i.InputOperand(1)); | 852 __ Mul(i.OutputRegister(), i.InputRegister(0), i.InputOperand(1)); |
853 break; | 853 break; |
| 854 case kMips64MulOvf: |
| 855 // Pseudo-instruction used for overflow/branch. No opcode emitted here. |
| 856 break; |
854 case kMips64MulHigh: | 857 case kMips64MulHigh: |
855 __ Mulh(i.OutputRegister(), i.InputRegister(0), i.InputOperand(1)); | 858 __ Mulh(i.OutputRegister(), i.InputRegister(0), i.InputOperand(1)); |
856 break; | 859 break; |
857 case kMips64MulHighU: | 860 case kMips64MulHighU: |
858 __ Mulhu(i.OutputRegister(), i.InputRegister(0), i.InputOperand(1)); | 861 __ Mulhu(i.OutputRegister(), i.InputRegister(0), i.InputOperand(1)); |
859 break; | 862 break; |
860 case kMips64DMulHigh: | 863 case kMips64DMulHigh: |
861 __ Dmulh(i.OutputRegister(), i.InputRegister(0), i.InputOperand(1)); | 864 __ Dmulh(i.OutputRegister(), i.InputRegister(0), i.InputOperand(1)); |
862 break; | 865 break; |
863 case kMips64Div: | 866 case kMips64Div: |
(...skipping 1005 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1869 i.InputOperand(1), tlabel, flabel); | 1872 i.InputOperand(1), tlabel, flabel); |
1870 break; | 1873 break; |
1871 case kNotOverflow: | 1874 case kNotOverflow: |
1872 __ DsubBranchOvf(i.OutputRegister(), i.InputRegister(0), | 1875 __ DsubBranchOvf(i.OutputRegister(), i.InputRegister(0), |
1873 i.InputOperand(1), flabel, tlabel); | 1876 i.InputOperand(1), flabel, tlabel); |
1874 break; | 1877 break; |
1875 default: | 1878 default: |
1876 UNSUPPORTED_COND(kMips64DsubOvf, branch->condition); | 1879 UNSUPPORTED_COND(kMips64DsubOvf, branch->condition); |
1877 break; | 1880 break; |
1878 } | 1881 } |
| 1882 } else if (instr->arch_opcode() == kMips64MulOvf) { |
| 1883 switch (branch->condition) { |
| 1884 case kOverflow: { |
| 1885 __ MulBranchOvf(i.OutputRegister(), i.InputRegister(0), |
| 1886 i.InputOperand(1), tlabel, flabel, kScratchReg); |
| 1887 } break; |
| 1888 case kNotOverflow: { |
| 1889 __ MulBranchOvf(i.OutputRegister(), i.InputRegister(0), |
| 1890 i.InputOperand(1), flabel, tlabel, kScratchReg); |
| 1891 } break; |
| 1892 default: |
| 1893 UNSUPPORTED_COND(kMips64MulOvf, branch->condition); |
| 1894 break; |
| 1895 } |
1879 } else if (instr->arch_opcode() == kMips64Cmp) { | 1896 } else if (instr->arch_opcode() == kMips64Cmp) { |
1880 cc = FlagsConditionToConditionCmp(branch->condition); | 1897 cc = FlagsConditionToConditionCmp(branch->condition); |
1881 __ Branch(tlabel, cc, i.InputRegister(0), i.InputOperand(1)); | 1898 __ Branch(tlabel, cc, i.InputRegister(0), i.InputOperand(1)); |
1882 } else if (instr->arch_opcode() == kMips64CmpS) { | 1899 } else if (instr->arch_opcode() == kMips64CmpS) { |
1883 if (!convertCondition(branch->condition, cc)) { | 1900 if (!convertCondition(branch->condition, cc)) { |
1884 UNSUPPORTED_COND(kMips64CmpS, branch->condition); | 1901 UNSUPPORTED_COND(kMips64CmpS, branch->condition); |
1885 } | 1902 } |
1886 FPURegister left = i.InputOrZeroSingleRegister(0); | 1903 FPURegister left = i.InputOrZeroSingleRegister(0); |
1887 FPURegister right = i.InputOrZeroSingleRegister(1); | 1904 FPURegister right = i.InputOrZeroSingleRegister(1); |
1888 if ((left.is(kDoubleRegZero) || right.is(kDoubleRegZero)) && | 1905 if ((left.is(kDoubleRegZero) || right.is(kDoubleRegZero)) && |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1944 instr->arch_opcode() == kMips64Dsub) { | 1961 instr->arch_opcode() == kMips64Dsub) { |
1945 cc = FlagsConditionToConditionOvf(condition); | 1962 cc = FlagsConditionToConditionOvf(condition); |
1946 // Check for overflow creates 1 or 0 for result. | 1963 // Check for overflow creates 1 or 0 for result. |
1947 __ dsrl32(kScratchReg, i.OutputRegister(), 31); | 1964 __ dsrl32(kScratchReg, i.OutputRegister(), 31); |
1948 __ srl(at, i.OutputRegister(), 31); | 1965 __ srl(at, i.OutputRegister(), 31); |
1949 __ xor_(result, kScratchReg, at); | 1966 __ xor_(result, kScratchReg, at); |
1950 if (cc == eq) // Toggle result for not overflow. | 1967 if (cc == eq) // Toggle result for not overflow. |
1951 __ xori(result, result, 1); | 1968 __ xori(result, result, 1); |
1952 return; | 1969 return; |
1953 } else if (instr->arch_opcode() == kMips64DaddOvf || | 1970 } else if (instr->arch_opcode() == kMips64DaddOvf || |
1954 instr->arch_opcode() == kMips64DsubOvf) { | 1971 instr->arch_opcode() == kMips64DsubOvf || |
| 1972 instr->arch_opcode() == kMips64MulOvf) { |
1955 Label flabel, tlabel; | 1973 Label flabel, tlabel; |
1956 switch (instr->arch_opcode()) { | 1974 switch (instr->arch_opcode()) { |
1957 case kMips64DaddOvf: | 1975 case kMips64DaddOvf: |
1958 __ DaddBranchNoOvf(i.OutputRegister(), i.InputRegister(0), | 1976 __ DaddBranchNoOvf(i.OutputRegister(), i.InputRegister(0), |
1959 i.InputOperand(1), &flabel); | 1977 i.InputOperand(1), &flabel); |
1960 | 1978 |
1961 break; | 1979 break; |
1962 case kMips64DsubOvf: | 1980 case kMips64DsubOvf: |
1963 __ DsubBranchNoOvf(i.OutputRegister(), i.InputRegister(0), | 1981 __ DsubBranchNoOvf(i.OutputRegister(), i.InputRegister(0), |
1964 i.InputOperand(1), &flabel); | 1982 i.InputOperand(1), &flabel); |
1965 break; | 1983 break; |
| 1984 case kMips64MulOvf: |
| 1985 __ MulBranchNoOvf(i.OutputRegister(), i.InputRegister(0), |
| 1986 i.InputOperand(1), &flabel, kScratchReg); |
| 1987 break; |
1966 default: | 1988 default: |
1967 UNREACHABLE(); | 1989 UNREACHABLE(); |
1968 break; | 1990 break; |
1969 } | 1991 } |
1970 __ li(result, 1); | 1992 __ li(result, 1); |
1971 __ Branch(&tlabel); | 1993 __ Branch(&tlabel); |
1972 __ bind(&flabel); | 1994 __ bind(&flabel); |
1973 __ li(result, 0); | 1995 __ li(result, 0); |
1974 __ bind(&tlabel); | 1996 __ bind(&tlabel); |
1975 } else if (instr->arch_opcode() == kMips64Cmp) { | 1997 } else if (instr->arch_opcode() == kMips64Cmp) { |
(...skipping 446 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2422 padding_size -= v8::internal::Assembler::kInstrSize; | 2444 padding_size -= v8::internal::Assembler::kInstrSize; |
2423 } | 2445 } |
2424 } | 2446 } |
2425 } | 2447 } |
2426 | 2448 |
2427 #undef __ | 2449 #undef __ |
2428 | 2450 |
2429 } // namespace compiler | 2451 } // namespace compiler |
2430 } // namespace internal | 2452 } // namespace internal |
2431 } // namespace v8 | 2453 } // namespace v8 |
OLD | NEW |