OLD | NEW |
1 // | 1 // |
2 // The Subzero Code Generator | 2 // The Subzero Code Generator |
3 // | 3 // |
4 // This file is distributed under the University of Illinois Open Source | 4 // This file is distributed under the University of Illinois Open Source |
5 // License. See LICENSE.TXT for details. | 5 // License. See LICENSE.TXT for details. |
6 // | 6 // |
7 //===----------------------------------------------------------------------===// | 7 //===----------------------------------------------------------------------===// |
8 /// | 8 /// |
9 /// \file | 9 /// \file |
10 /// \brief Implements the TargetLoweringMIPS32 class, which consists almost | 10 /// \brief Implements the TargetLoweringMIPS32 class, which consists almost |
(...skipping 1821 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1832 Operand *Src0 = legalizeUndef(Instr->getSrc(0)); | 1832 Operand *Src0 = legalizeUndef(Instr->getSrc(0)); |
1833 Operand *Src1 = legalizeUndef(Instr->getSrc(1)); | 1833 Operand *Src1 = legalizeUndef(Instr->getSrc(1)); |
1834 if (DestTy == IceType_i64) { | 1834 if (DestTy == IceType_i64) { |
1835 lowerInt64Arithmetic(Instr, Instr->getDest(), Src0, Src1); | 1835 lowerInt64Arithmetic(Instr, Instr->getDest(), Src0, Src1); |
1836 return; | 1836 return; |
1837 } | 1837 } |
1838 if (isVectorType(Dest->getType())) { | 1838 if (isVectorType(Dest->getType())) { |
1839 UnimplementedLoweringError(this, Instr); | 1839 UnimplementedLoweringError(this, Instr); |
1840 return; | 1840 return; |
1841 } | 1841 } |
1842 switch (Instr->getOp()) { | |
1843 default: | |
1844 break; | |
1845 case InstArithmetic::Frem: | |
1846 UnimplementedLoweringError(this, Instr); | |
1847 return; | |
1848 } | |
1849 | 1842 |
1850 // At this point Dest->getType() is non-i64 scalar | |
1851 | |
1852 Variable *T = makeReg(Dest->getType()); | 1843 Variable *T = makeReg(Dest->getType()); |
1853 Variable *Src0R = legalizeToReg(Src0); | 1844 Variable *Src0R = legalizeToReg(Src0); |
1854 Variable *Src1R = legalizeToReg(Src1); | 1845 Variable *Src1R = legalizeToReg(Src1); |
1855 constexpr uint32_t DivideByZeroTrapCode = 7; | 1846 constexpr uint32_t DivideByZeroTrapCode = 7; |
1856 | 1847 |
1857 switch (Instr->getOp()) { | 1848 switch (Instr->getOp()) { |
1858 case InstArithmetic::_num: | 1849 case InstArithmetic::_num: |
1859 break; | 1850 break; |
1860 case InstArithmetic::Add: | 1851 case InstArithmetic::Add: |
1861 _addu(T, Src0R, Src1R); | 1852 _addu(T, Src0R, Src1R); |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1972 _mov(Dest, T); | 1963 _mov(Dest, T); |
1973 return; | 1964 return; |
1974 } | 1965 } |
1975 if (DestTy == IceType_f64) { | 1966 if (DestTy == IceType_f64) { |
1976 _div_d(T, Src0R, Src1R); | 1967 _div_d(T, Src0R, Src1R); |
1977 _mov(Dest, T); | 1968 _mov(Dest, T); |
1978 return; | 1969 return; |
1979 } | 1970 } |
1980 break; | 1971 break; |
1981 case InstArithmetic::Frem: | 1972 case InstArithmetic::Frem: |
| 1973 llvm::report_fatal_error("frem should have been prelowered."); |
1982 break; | 1974 break; |
1983 } | 1975 } |
1984 UnimplementedLoweringError(this, Instr); | 1976 UnimplementedLoweringError(this, Instr); |
1985 } | 1977 } |
1986 | 1978 |
1987 void TargetMIPS32::lowerAssign(const InstAssign *Instr) { | 1979 void TargetMIPS32::lowerAssign(const InstAssign *Instr) { |
1988 Variable *Dest = Instr->getDest(); | 1980 Variable *Dest = Instr->getDest(); |
1989 | 1981 |
1990 if (Dest->isRematerializable()) { | 1982 if (Dest->isRematerializable()) { |
1991 Context.insert<InstFakeDef>(Dest); | 1983 Context.insert<InstFakeDef>(Dest); |
(...skipping 416 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2408 case InstCast::Fpext: { | 2400 case InstCast::Fpext: { |
2409 assert(Dest->getType() == IceType_f64); | 2401 assert(Dest->getType() == IceType_f64); |
2410 assert(Src0->getType() == IceType_f32); | 2402 assert(Src0->getType() == IceType_f32); |
2411 auto *DestR = legalizeToReg(Dest); | 2403 auto *DestR = legalizeToReg(Dest); |
2412 auto *Src0R = legalizeToReg(Src0); | 2404 auto *Src0R = legalizeToReg(Src0); |
2413 _cvt_d_s(DestR, Src0R); | 2405 _cvt_d_s(DestR, Src0R); |
2414 _mov(Dest, DestR); | 2406 _mov(Dest, DestR); |
2415 break; | 2407 break; |
2416 } | 2408 } |
2417 case InstCast::Fptosi: { | 2409 case InstCast::Fptosi: { |
| 2410 if (llvm::isa<Variable64On32>(Dest)) { |
| 2411 llvm::report_fatal_error("fp-to-i64 should have been prelowered."); |
| 2412 return; |
| 2413 } |
2418 if (Src0Ty == IceType_f32 && DestTy == IceType_i32) { | 2414 if (Src0Ty == IceType_f32 && DestTy == IceType_i32) { |
2419 Variable *Src0R = legalizeToReg(Src0); | 2415 Variable *Src0R = legalizeToReg(Src0); |
2420 Variable *FTmp = makeReg(IceType_f32); | 2416 Variable *FTmp = makeReg(IceType_f32); |
2421 _trunc_w_s(FTmp, Src0R); | 2417 _trunc_w_s(FTmp, Src0R); |
2422 _mov(Dest, FTmp); | 2418 _mov(Dest, FTmp); |
2423 } else { | 2419 } else { |
2424 UnimplementedLoweringError(this, Instr); | 2420 UnimplementedLoweringError(this, Instr); |
2425 } | 2421 } |
2426 break; | 2422 break; |
2427 } | 2423 } |
2428 case InstCast::Fptoui: | 2424 case InstCast::Fptoui: |
| 2425 if (llvm::isa<Variable64On32>(Dest)) { |
| 2426 llvm::report_fatal_error("fp-to-i64 should have been prelowered."); |
| 2427 return; |
| 2428 } |
2429 UnimplementedLoweringError(this, Instr); | 2429 UnimplementedLoweringError(this, Instr); |
2430 break; | 2430 break; |
2431 case InstCast::Sitofp: { | 2431 case InstCast::Sitofp: { |
| 2432 if (llvm::isa<Variable64On32>(Dest)) { |
| 2433 llvm::report_fatal_error("i64-to-fp should have been prelowered."); |
| 2434 return; |
| 2435 } |
2432 if (Src0Ty == IceType_i32 && DestTy == IceType_f32) { | 2436 if (Src0Ty == IceType_i32 && DestTy == IceType_f32) { |
2433 Variable *Src0R = legalizeToReg(Src0); | 2437 Variable *Src0R = legalizeToReg(Src0); |
2434 Variable *FTmp1 = makeReg(IceType_f32); | 2438 Variable *FTmp1 = makeReg(IceType_f32); |
2435 Variable *FTmp2 = makeReg(IceType_f32); | 2439 Variable *FTmp2 = makeReg(IceType_f32); |
2436 _mov(FTmp1, Src0R); | 2440 _mov(FTmp1, Src0R); |
2437 _cvt_s_w(FTmp2, FTmp1); | 2441 _cvt_s_w(FTmp2, FTmp1); |
2438 _mov(Dest, FTmp2); | 2442 _mov(Dest, FTmp2); |
2439 } else { | 2443 } else { |
2440 UnimplementedLoweringError(this, Instr); | 2444 UnimplementedLoweringError(this, Instr); |
2441 } | 2445 } |
2442 break; | 2446 break; |
2443 } | 2447 } |
2444 case InstCast::Uitofp: { | 2448 case InstCast::Uitofp: { |
| 2449 if (llvm::isa<Variable64On32>(Dest)) { |
| 2450 llvm::report_fatal_error("i64-to-fp should have been prelowered."); |
| 2451 return; |
| 2452 } |
2445 UnimplementedLoweringError(this, Instr); | 2453 UnimplementedLoweringError(this, Instr); |
2446 break; | 2454 break; |
2447 } | 2455 } |
2448 case InstCast::Bitcast: { | 2456 case InstCast::Bitcast: { |
2449 UnimplementedLoweringError(this, Instr); | 2457 switch (DestTy) { |
| 2458 case IceType_NUM: |
| 2459 case IceType_void: |
| 2460 llvm::report_fatal_error("Unexpected bitcast."); |
| 2461 case IceType_i1: |
| 2462 UnimplementedLoweringError(this, Instr); |
| 2463 break; |
| 2464 case IceType_i8: |
| 2465 assert(Src0->getType() == IceType_v8i1); |
| 2466 llvm::report_fatal_error( |
| 2467 "i8 to v8i1 conversion should have been prelowered."); |
| 2468 break; |
| 2469 case IceType_i16: |
| 2470 assert(Src0->getType() == IceType_v16i1); |
| 2471 llvm::report_fatal_error( |
| 2472 "i16 to v16i1 conversion should have been prelowered."); |
| 2473 break; |
| 2474 case IceType_v8i1: |
| 2475 assert(Src0->getType() == IceType_i8); |
| 2476 llvm::report_fatal_error( |
| 2477 "v8i1 to i8 conversion should have been prelowered."); |
| 2478 break; |
| 2479 case IceType_v16i1: |
| 2480 assert(Src0->getType() == IceType_i16); |
| 2481 llvm::report_fatal_error( |
| 2482 "v16i1 to i16 conversion should have been prelowered."); |
| 2483 break; |
| 2484 default: |
| 2485 UnimplementedLoweringError(this, Instr); |
| 2486 } |
2450 break; | 2487 break; |
2451 } | 2488 } |
2452 } | 2489 } |
2453 } | 2490 } |
2454 | 2491 |
2455 void TargetMIPS32::lowerExtractElement(const InstExtractElement *Instr) { | 2492 void TargetMIPS32::lowerExtractElement(const InstExtractElement *Instr) { |
2456 UnimplementedLoweringError(this, Instr); | 2493 UnimplementedLoweringError(this, Instr); |
2457 } | 2494 } |
2458 | 2495 |
2459 void TargetMIPS32::lowerFcmp(const InstFcmp *Instr) { | 2496 void TargetMIPS32::lowerFcmp(const InstFcmp *Instr) { |
(...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2798 return; | 2835 return; |
2799 case Intrinsics::AtomicStore: { | 2836 case Intrinsics::AtomicStore: { |
2800 UnimplementedLoweringError(this, Instr); | 2837 UnimplementedLoweringError(this, Instr); |
2801 return; | 2838 return; |
2802 } | 2839 } |
2803 case Intrinsics::Bswap: { | 2840 case Intrinsics::Bswap: { |
2804 UnimplementedLoweringError(this, Instr); | 2841 UnimplementedLoweringError(this, Instr); |
2805 return; | 2842 return; |
2806 } | 2843 } |
2807 case Intrinsics::Ctpop: { | 2844 case Intrinsics::Ctpop: { |
2808 UnimplementedLoweringError(this, Instr); | 2845 llvm::report_fatal_error("Ctpop should have been prelowered."); |
2809 return; | 2846 return; |
2810 } | 2847 } |
2811 case Intrinsics::Ctlz: { | 2848 case Intrinsics::Ctlz: { |
2812 UnimplementedLoweringError(this, Instr); | 2849 UnimplementedLoweringError(this, Instr); |
2813 return; | 2850 return; |
2814 } | 2851 } |
2815 case Intrinsics::Cttz: { | 2852 case Intrinsics::Cttz: { |
2816 UnimplementedLoweringError(this, Instr); | 2853 UnimplementedLoweringError(this, Instr); |
2817 return; | 2854 return; |
2818 } | 2855 } |
2819 case Intrinsics::Fabs: { | 2856 case Intrinsics::Fabs: { |
2820 if (isScalarFloatingType(DestTy)) { | 2857 if (isScalarFloatingType(DestTy)) { |
2821 Variable *T = makeReg(DestTy); | 2858 Variable *T = makeReg(DestTy); |
2822 if (DestTy == IceType_f32) { | 2859 if (DestTy == IceType_f32) { |
2823 _abs_s(T, legalizeToReg(Instr->getArg(0))); | 2860 _abs_s(T, legalizeToReg(Instr->getArg(0))); |
2824 } else { | 2861 } else { |
2825 _abs_d(T, legalizeToReg(Instr->getArg(0))); | 2862 _abs_d(T, legalizeToReg(Instr->getArg(0))); |
2826 } | 2863 } |
2827 _mov(Dest, T); | 2864 _mov(Dest, T); |
2828 } | 2865 } |
2829 return; | 2866 return; |
2830 } | 2867 } |
2831 case Intrinsics::Longjmp: { | 2868 case Intrinsics::Longjmp: { |
2832 InstCall *Call = makeHelperCall(RuntimeHelper::H_call_longjmp, nullptr, 2); | 2869 llvm::report_fatal_error("longjmp should have been prelowered."); |
2833 Call->addArg(Instr->getArg(0)); | |
2834 Call->addArg(Instr->getArg(1)); | |
2835 lowerCall(Call); | |
2836 return; | 2870 return; |
2837 } | 2871 } |
2838 case Intrinsics::Memcpy: { | 2872 case Intrinsics::Memcpy: { |
2839 // In the future, we could potentially emit an inline memcpy/memset, etc. | 2873 llvm::report_fatal_error("memcpy should have been prelowered."); |
2840 // for intrinsic calls w/ a known length. | |
2841 InstCall *Call = makeHelperCall(RuntimeHelper::H_call_memcpy, nullptr, 3); | |
2842 Call->addArg(Instr->getArg(0)); | |
2843 Call->addArg(Instr->getArg(1)); | |
2844 Call->addArg(Instr->getArg(2)); | |
2845 lowerCall(Call); | |
2846 return; | 2874 return; |
2847 } | 2875 } |
2848 case Intrinsics::Memmove: { | 2876 case Intrinsics::Memmove: { |
2849 InstCall *Call = makeHelperCall(RuntimeHelper::H_call_memmove, nullptr, 3); | 2877 llvm::report_fatal_error("memmove should have been prelowered."); |
2850 Call->addArg(Instr->getArg(0)); | |
2851 Call->addArg(Instr->getArg(1)); | |
2852 Call->addArg(Instr->getArg(2)); | |
2853 lowerCall(Call); | |
2854 return; | 2878 return; |
2855 } | 2879 } |
2856 case Intrinsics::Memset: { | 2880 case Intrinsics::Memset: { |
2857 // The value operand needs to be extended to a stack slot size because the | 2881 llvm::report_fatal_error("memset should have been prelowered."); |
2858 // PNaCl ABI requires arguments to be at least 32 bits wide. | |
2859 Operand *ValOp = Instr->getArg(1); | |
2860 assert(ValOp->getType() == IceType_i8); | |
2861 Variable *ValExt = Func->makeVariable(stackSlotType()); | |
2862 lowerCast(InstCast::create(Func, InstCast::Zext, ValExt, ValOp)); | |
2863 InstCall *Call = makeHelperCall(RuntimeHelper::H_call_memset, nullptr, 3); | |
2864 Call->addArg(Instr->getArg(0)); | |
2865 Call->addArg(ValExt); | |
2866 Call->addArg(Instr->getArg(2)); | |
2867 lowerCall(Call); | |
2868 return; | 2882 return; |
2869 } | 2883 } |
2870 case Intrinsics::NaClReadTP: { | 2884 case Intrinsics::NaClReadTP: { |
2871 if (getFlags().getUseSandboxing()) { | 2885 if (getFlags().getUseSandboxing()) { |
2872 UnimplementedLoweringError(this, Instr); | 2886 UnimplementedLoweringError(this, Instr); |
2873 } else { | 2887 } else { |
2874 InstCall *Call = | 2888 InstCall *Call = |
2875 makeHelperCall(RuntimeHelper::H_call_read_tp, Instr->getDest(), 0); | 2889 makeHelperCall(RuntimeHelper::H_call_read_tp, Instr->getDest(), 0); |
2876 lowerCall(Call); | 2890 lowerCall(Call); |
2877 } | 2891 } |
2878 return; | 2892 return; |
2879 } | 2893 } |
2880 case Intrinsics::Setjmp: { | 2894 case Intrinsics::Setjmp: { |
2881 InstCall *Call = | 2895 llvm::report_fatal_error("setjmp should have been prelowered."); |
2882 makeHelperCall(RuntimeHelper::H_call_setjmp, Instr->getDest(), 1); | |
2883 Call->addArg(Instr->getArg(0)); | |
2884 lowerCall(Call); | |
2885 return; | 2896 return; |
2886 } | 2897 } |
2887 case Intrinsics::Sqrt: { | 2898 case Intrinsics::Sqrt: { |
2888 if (isScalarFloatingType(DestTy)) { | 2899 if (isScalarFloatingType(DestTy)) { |
2889 Variable *T = makeReg(DestTy); | 2900 Variable *T = makeReg(DestTy); |
2890 if (DestTy == IceType_f32) { | 2901 if (DestTy == IceType_f32) { |
2891 _sqrt_s(T, legalizeToReg(Instr->getArg(0))); | 2902 _sqrt_s(T, legalizeToReg(Instr->getArg(0))); |
2892 } else { | 2903 } else { |
2893 _sqrt_d(T, legalizeToReg(Instr->getArg(0))); | 2904 _sqrt_d(T, legalizeToReg(Instr->getArg(0))); |
2894 } | 2905 } |
(...skipping 835 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3730 Str << "\t.set\t" | 3741 Str << "\t.set\t" |
3731 << "nomips16\n"; | 3742 << "nomips16\n"; |
3732 } | 3743 } |
3733 | 3744 |
3734 SmallBitVector TargetMIPS32::TypeToRegisterSet[RCMIPS32_NUM]; | 3745 SmallBitVector TargetMIPS32::TypeToRegisterSet[RCMIPS32_NUM]; |
3735 SmallBitVector TargetMIPS32::TypeToRegisterSetUnfiltered[RCMIPS32_NUM]; | 3746 SmallBitVector TargetMIPS32::TypeToRegisterSetUnfiltered[RCMIPS32_NUM]; |
3736 SmallBitVector TargetMIPS32::RegisterAliases[RegMIPS32::Reg_NUM]; | 3747 SmallBitVector TargetMIPS32::RegisterAliases[RegMIPS32::Reg_NUM]; |
3737 | 3748 |
3738 } // end of namespace MIPS32 | 3749 } // end of namespace MIPS32 |
3739 } // end of namespace Ice | 3750 } // end of namespace Ice |
OLD | NEW |