Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(26)

Side by Side Diff: src/IceTargetLoweringMIPS32.cpp

Issue 2358123002: Subzero, MIPS32: Remove duplicate functionalities (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Added new info lines Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698