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

Side by Side Diff: src/IceTargetLoweringARM32.cpp

Issue 1878943009: Subzero. ARM32. Vector casts. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Adds vcvt assembler lit tests. Created 4 years, 8 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
OLDNEW
1 //===- subzero/src/IceTargetLoweringARM32.cpp - ARM32 lowering ------------===// 1 //===- subzero/src/IceTargetLoweringARM32.cpp - ARM32 lowering ------------===//
2 // 2 //
3 // The Subzero Code Generator 3 // The Subzero Code Generator
4 // 4 //
5 // This file is distributed under the University of Illinois Open Source 5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details. 6 // License. See LICENSE.TXT for details.
7 // 7 //
8 //===----------------------------------------------------------------------===// 8 //===----------------------------------------------------------------------===//
9 /// 9 ///
10 /// \file 10 /// \file
(...skipping 581 matching lines...) Expand 10 before | Expand all | Expand 10 after
592 llvm::report_fatal_error("Control flow should never have reached here."); 592 llvm::report_fatal_error("Control flow should never have reached here.");
593 } 593 }
594 case Inst::Cast: { 594 case Inst::Cast: {
595 Variable *Dest = Instr->getDest(); 595 Variable *Dest = Instr->getDest();
596 Operand *Src0 = Instr->getSrc(0); 596 Operand *Src0 = Instr->getSrc(0);
597 const Type DestTy = Dest->getType(); 597 const Type DestTy = Dest->getType();
598 const Type SrcTy = Src0->getType(); 598 const Type SrcTy = Src0->getType();
599 auto *CastInstr = llvm::cast<InstCast>(Instr); 599 auto *CastInstr = llvm::cast<InstCast>(Instr);
600 const InstCast::OpKind CastKind = CastInstr->getCastKind(); 600 const InstCast::OpKind CastKind = CastInstr->getCastKind();
601 601
602 if (isVectorType(DestTy) && CastKind != InstCast::Bitcast) {
603 // Bitcasting is done with function calls (e.g., v8i1 -> i8), or regular
604 // vmov (e.g., v4i32 -> v4f32)
605 scalarizeInstruction(
606 Dest, [this, CastKind](Variable *Dest, Variable *Src) {
607 return Context.insert<InstCast>(CastKind, Dest, Src);
608 }, Src0);
609 CastInstr->setDeleted();
610 return;
611 }
612
613 switch (CastKind) { 602 switch (CastKind) {
614 default: 603 default:
615 return; 604 return;
616 case InstCast::Fptosi: 605 case InstCast::Fptosi:
617 case InstCast::Fptoui: { 606 case InstCast::Fptoui: {
618 if (DestTy != IceType_i64) { 607 if (DestTy != IceType_i64) {
619 return; 608 return;
620 } 609 }
621 const bool DestIsSigned = CastKind == InstCast::Fptosi; 610 const bool DestIsSigned = CastKind == InstCast::Fptosi;
622 const bool Src0IsF32 = isFloat32Asserting32Or64(SrcTy); 611 const bool Src0IsF32 = isFloat32Asserting32Or64(SrcTy);
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
691 InstCall *Call = makeHelperCall(HelperID, CallDest, MaxSrcs); 680 InstCall *Call = makeHelperCall(HelperID, CallDest, MaxSrcs);
692 Call->addArg(Src0); 681 Call->addArg(Src0);
693 Context.insert(Call); 682 Context.insert(Call);
694 // The PNaCl ABI disallows i8/i16 return types, so truncate the helper 683 // The PNaCl ABI disallows i8/i16 return types, so truncate the helper
695 // call result to the appropriate type as necessary. 684 // call result to the appropriate type as necessary.
696 if (CallDest->getType() != Dest->getType()) 685 if (CallDest->getType() != Dest->getType())
697 Context.insert<InstCast>(InstCast::Trunc, Dest, CallDest); 686 Context.insert<InstCast>(InstCast::Trunc, Dest, CallDest);
698 Instr->setDeleted(); 687 Instr->setDeleted();
699 return; 688 return;
700 } 689 }
690 case InstCast::Trunc: {
691 if (DestTy == SrcTy) {
692 return;
693 }
694 if (!isVectorType(SrcTy)) {
695 return;
696 }
697 assert(typeNumElements(DestTy) == typeNumElements(SrcTy));
698 assert(typeElementType(DestTy) == IceType_i1);
699 assert(isVectorIntegerType(SrcTy));
700 return;
701 }
702 case InstCast::Sext:
703 case InstCast::Zext: {
704 if (DestTy == SrcTy) {
705 return;
706 }
707 if (!isVectorType(DestTy)) {
708 return;
709 }
710 assert(typeNumElements(DestTy) == typeNumElements(SrcTy));
711 assert(typeElementType(SrcTy) == IceType_i1);
712 assert(isVectorIntegerType(DestTy));
713 return;
714 }
701 } 715 }
702 llvm::report_fatal_error("Control flow should never have reached here."); 716 llvm::report_fatal_error("Control flow should never have reached here.");
703 } 717 }
704 case Inst::IntrinsicCall: { 718 case Inst::IntrinsicCall: {
705 Variable *Dest = Instr->getDest(); 719 Variable *Dest = Instr->getDest();
706 auto *IntrinsicCall = llvm::cast<InstIntrinsicCall>(Instr); 720 auto *IntrinsicCall = llvm::cast<InstIntrinsicCall>(Instr);
707 Intrinsics::IntrinsicID ID = IntrinsicCall->getIntrinsicInfo().ID; 721 Intrinsics::IntrinsicID ID = IntrinsicCall->getIntrinsicInfo().ID;
708 switch (ID) { 722 switch (ID) {
709 default: 723 default:
710 return; 724 return;
(...skipping 3169 matching lines...) Expand 10 before | Expand all | Expand 10 after
3880 void configureBitcastTemporary(Variable64On32 *Var) { 3894 void configureBitcastTemporary(Variable64On32 *Var) {
3881 Var->setMustNotHaveReg(); 3895 Var->setMustNotHaveReg();
3882 Var->getHi()->setMustHaveReg(); 3896 Var->getHi()->setMustHaveReg();
3883 Var->getLo()->setMustHaveReg(); 3897 Var->getLo()->setMustHaveReg();
3884 } 3898 }
3885 } // end of anonymous namespace 3899 } // end of anonymous namespace
3886 3900
3887 void TargetARM32::lowerCast(const InstCast *Instr) { 3901 void TargetARM32::lowerCast(const InstCast *Instr) {
3888 InstCast::OpKind CastKind = Instr->getCastKind(); 3902 InstCast::OpKind CastKind = Instr->getCastKind();
3889 Variable *Dest = Instr->getDest(); 3903 Variable *Dest = Instr->getDest();
3904 const Type DestTy = Dest->getType();
3890 Operand *Src0 = legalizeUndef(Instr->getSrc(0)); 3905 Operand *Src0 = legalizeUndef(Instr->getSrc(0));
3891 switch (CastKind) { 3906 switch (CastKind) {
3892 default: 3907 default:
3893 Func->setError("Cast type not supported"); 3908 Func->setError("Cast type not supported");
3894 return; 3909 return;
3895 case InstCast::Sext: { 3910 case InstCast::Sext: {
3896 if (isVectorType(Dest->getType())) { 3911 if (isVectorType(DestTy)) {
3897 UnimplementedLoweringError(this, Instr); 3912 Variable *T0 = makeReg(DestTy);
3898 } else if (Dest->getType() == IceType_i64) { 3913 Variable *T1 = makeReg(DestTy);
3914 ConstantInteger32 *ShAmt = nullptr;
3915 switch (DestTy) {
3916 default:
3917 llvm::report_fatal_error("Unexpected type in vector sext.");
3918 case IceType_v16i8:
3919 ShAmt = llvm::cast<ConstantInteger32>(Ctx->getConstantInt32(7));
3920 break;
3921 case IceType_v8i16:
3922 ShAmt = llvm::cast<ConstantInteger32>(Ctx->getConstantInt32(15));
3923 break;
3924 case IceType_v4i32:
3925 ShAmt = llvm::cast<ConstantInteger32>(Ctx->getConstantInt32(31));
3926 break;
3927 }
3928 auto *Src0R = legalizeToReg(Src0);
3929 _vshl(T0, Src0R, ShAmt);
3930 _vshr(T1, T0, ShAmt)->setSignType(InstARM32::FS_Signed);
3931 _mov(Dest, T1);
3932 } else if (DestTy == IceType_i64) {
3899 // t1=sxtb src; t2= mov t1 asr #31; dst.lo=t1; dst.hi=t2 3933 // t1=sxtb src; t2= mov t1 asr #31; dst.lo=t1; dst.hi=t2
3900 Constant *ShiftAmt = Ctx->getConstantInt32(31); 3934 Constant *ShiftAmt = Ctx->getConstantInt32(31);
3901 auto *DestLo = llvm::cast<Variable>(loOperand(Dest)); 3935 auto *DestLo = llvm::cast<Variable>(loOperand(Dest));
3902 auto *DestHi = llvm::cast<Variable>(hiOperand(Dest)); 3936 auto *DestHi = llvm::cast<Variable>(hiOperand(Dest));
3903 Variable *T_Lo = makeReg(DestLo->getType()); 3937 Variable *T_Lo = makeReg(DestLo->getType());
3904 if (Src0->getType() == IceType_i32) { 3938 if (Src0->getType() == IceType_i32) {
3905 Operand *Src0RF = legalize(Src0, Legal_Reg | Legal_Flex); 3939 Operand *Src0RF = legalize(Src0, Legal_Reg | Legal_Flex);
3906 _mov(T_Lo, Src0RF); 3940 _mov(T_Lo, Src0RF);
3907 } else if (Src0->getType() != IceType_i1) { 3941 } else if (Src0->getType() != IceType_i1) {
3908 Variable *Src0R = legalizeToReg(Src0); 3942 Variable *Src0R = legalizeToReg(Src0);
3909 _sxt(T_Lo, Src0R); 3943 _sxt(T_Lo, Src0R);
3910 } else { 3944 } else {
3911 Operand *_0 = Ctx->getConstantZero(IceType_i32); 3945 Operand *_0 = Ctx->getConstantZero(IceType_i32);
3912 Operand *_m1 = Ctx->getConstantInt32(-1); 3946 Operand *_m1 = Ctx->getConstantInt32(-1);
3913 lowerInt1ForSelect(T_Lo, Src0, _m1, _0); 3947 lowerInt1ForSelect(T_Lo, Src0, _m1, _0);
3914 } 3948 }
3915 _mov(DestLo, T_Lo); 3949 _mov(DestLo, T_Lo);
3916 Variable *T_Hi = makeReg(DestHi->getType()); 3950 Variable *T_Hi = makeReg(DestHi->getType());
3917 if (Src0->getType() != IceType_i1) { 3951 if (Src0->getType() != IceType_i1) {
3918 _mov(T_Hi, OperandARM32FlexReg::create(Func, IceType_i32, T_Lo, 3952 _mov(T_Hi, OperandARM32FlexReg::create(Func, IceType_i32, T_Lo,
3919 OperandARM32::ASR, ShiftAmt)); 3953 OperandARM32::ASR, ShiftAmt));
3920 } else { 3954 } else {
3921 // For i1, the asr instruction is already done above. 3955 // For i1, the asr instruction is already done above.
3922 _mov(T_Hi, T_Lo); 3956 _mov(T_Hi, T_Lo);
3923 } 3957 }
3924 _mov(DestHi, T_Hi); 3958 _mov(DestHi, T_Hi);
3925 } else if (Src0->getType() != IceType_i1) { 3959 } else if (Src0->getType() != IceType_i1) {
3926 // t1 = sxt src; dst = t1 3960 // t1 = sxt src; dst = t1
3927 Variable *Src0R = legalizeToReg(Src0); 3961 Variable *Src0R = legalizeToReg(Src0);
3928 Variable *T = makeReg(Dest->getType()); 3962 Variable *T = makeReg(DestTy);
3929 _sxt(T, Src0R); 3963 _sxt(T, Src0R);
3930 _mov(Dest, T); 3964 _mov(Dest, T);
3931 } else { 3965 } else {
3932 Constant *_0 = Ctx->getConstantZero(IceType_i32); 3966 Constant *_0 = Ctx->getConstantZero(IceType_i32);
3933 Operand *_m1 = Ctx->getConstantInt(Dest->getType(), -1); 3967 Operand *_m1 = Ctx->getConstantInt(DestTy, -1);
3934 Variable *T = makeReg(Dest->getType()); 3968 Variable *T = makeReg(DestTy);
3935 lowerInt1ForSelect(T, Src0, _m1, _0); 3969 lowerInt1ForSelect(T, Src0, _m1, _0);
3936 _mov(Dest, T); 3970 _mov(Dest, T);
3937 } 3971 }
3938 break; 3972 break;
3939 } 3973 }
3940 case InstCast::Zext: { 3974 case InstCast::Zext: {
3941 if (isVectorType(Dest->getType())) { 3975 if (isVectorType(DestTy)) {
3942 UnimplementedLoweringError(this, Instr); 3976 auto *Mask = makeReg(DestTy);
3943 } else if (Dest->getType() == IceType_i64) { 3977 auto *_1 = Ctx->getConstantInt32(1);
3978 auto *T = makeReg(DestTy);
3979 auto *Src0R = legalizeToReg(Src0);
3980 _mov(Mask, _1);
3981 _vand(T, Src0R, Mask);
3982 _mov(Dest, T);
3983 } else if (DestTy == IceType_i64) {
3944 // t1=uxtb src; dst.lo=t1; dst.hi=0 3984 // t1=uxtb src; dst.lo=t1; dst.hi=0
3945 Operand *_0 = 3985 Operand *_0 =
3946 legalize(Ctx->getConstantZero(IceType_i32), Legal_Reg | Legal_Flex); 3986 legalize(Ctx->getConstantZero(IceType_i32), Legal_Reg | Legal_Flex);
3947 auto *DestLo = llvm::cast<Variable>(loOperand(Dest)); 3987 auto *DestLo = llvm::cast<Variable>(loOperand(Dest));
3948 auto *DestHi = llvm::cast<Variable>(hiOperand(Dest)); 3988 auto *DestHi = llvm::cast<Variable>(hiOperand(Dest));
3949 Variable *T_Lo = makeReg(DestLo->getType()); 3989 Variable *T_Lo = makeReg(DestLo->getType());
3950 3990
3951 switch (Src0->getType()) { 3991 switch (Src0->getType()) {
3952 default: { 3992 default: {
3953 assert(Src0->getType() != IceType_i64); 3993 assert(Src0->getType() != IceType_i64);
(...skipping 11 matching lines...) Expand all
3965 } 4005 }
3966 } break; 4006 } break;
3967 } 4007 }
3968 4008
3969 _mov(DestLo, T_Lo); 4009 _mov(DestLo, T_Lo);
3970 4010
3971 Variable *T_Hi = makeReg(DestLo->getType()); 4011 Variable *T_Hi = makeReg(DestLo->getType());
3972 _mov(T_Hi, _0); 4012 _mov(T_Hi, _0);
3973 _mov(DestHi, T_Hi); 4013 _mov(DestHi, T_Hi);
3974 } else if (Src0->getType() == IceType_i1) { 4014 } else if (Src0->getType() == IceType_i1) {
3975 Variable *T = makeReg(Dest->getType()); 4015 Variable *T = makeReg(DestTy);
3976 4016
3977 SafeBoolChain Safe = lowerInt1(T, Src0); 4017 SafeBoolChain Safe = lowerInt1(T, Src0);
3978 if (Safe == SBC_No) { 4018 if (Safe == SBC_No) {
3979 Operand *_1 = legalize(Ctx->getConstantInt1(1), Legal_Reg | Legal_Flex); 4019 Operand *_1 = legalize(Ctx->getConstantInt1(1), Legal_Reg | Legal_Flex);
3980 _and(T, T, _1); 4020 _and(T, T, _1);
3981 } 4021 }
3982 4022
3983 _mov(Dest, T); 4023 _mov(Dest, T);
3984 } else { 4024 } else {
3985 // t1 = uxt src; dst = t1 4025 // t1 = uxt src; dst = t1
3986 Variable *Src0R = legalizeToReg(Src0); 4026 Variable *Src0R = legalizeToReg(Src0);
3987 Variable *T = makeReg(Dest->getType()); 4027 Variable *T = makeReg(DestTy);
3988 _uxt(T, Src0R); 4028 _uxt(T, Src0R);
3989 _mov(Dest, T); 4029 _mov(Dest, T);
3990 } 4030 }
3991 break; 4031 break;
3992 } 4032 }
3993 case InstCast::Trunc: { 4033 case InstCast::Trunc: {
3994 if (isVectorType(Dest->getType())) { 4034 if (isVectorType(DestTy)) {
3995 UnimplementedLoweringError(this, Instr); 4035 auto *T = makeReg(DestTy);
4036 auto *Src0R = legalizeToReg(Src0);
4037 _mov(T, Src0R);
4038 _mov(Dest, T);
3996 } else { 4039 } else {
3997 if (Src0->getType() == IceType_i64) 4040 if (Src0->getType() == IceType_i64)
3998 Src0 = loOperand(Src0); 4041 Src0 = loOperand(Src0);
3999 Operand *Src0RF = legalize(Src0, Legal_Reg | Legal_Flex); 4042 Operand *Src0RF = legalize(Src0, Legal_Reg | Legal_Flex);
4000 // t1 = trunc Src0RF; Dest = t1 4043 // t1 = trunc Src0RF; Dest = t1
4001 Variable *T = makeReg(Dest->getType()); 4044 Variable *T = makeReg(DestTy);
4002 _mov(T, Src0RF); 4045 _mov(T, Src0RF);
4003 if (Dest->getType() == IceType_i1) 4046 if (DestTy == IceType_i1)
4004 _and(T, T, Ctx->getConstantInt1(1)); 4047 _and(T, T, Ctx->getConstantInt1(1));
4005 _mov(Dest, T); 4048 _mov(Dest, T);
4006 } 4049 }
4007 break; 4050 break;
4008 } 4051 }
4009 case InstCast::Fptrunc: 4052 case InstCast::Fptrunc:
4010 case InstCast::Fpext: { 4053 case InstCast::Fpext: {
4011 // fptrunc: dest.f32 = fptrunc src0.fp64 4054 // fptrunc: dest.f32 = fptrunc src0.fp64
4012 // fpext: dest.f64 = fptrunc src0.fp32 4055 // fpext: dest.f64 = fptrunc src0.fp32
4013 const bool IsTrunc = CastKind == InstCast::Fptrunc; 4056 const bool IsTrunc = CastKind == InstCast::Fptrunc;
4014 if (isVectorType(Dest->getType())) { 4057 assert(!isVectorType(DestTy));
4015 UnimplementedLoweringError(this, Instr); 4058 assert(DestTy == (IsTrunc ? IceType_f32 : IceType_f64));
4016 break;
4017 }
4018 assert(Dest->getType() == (IsTrunc ? IceType_f32 : IceType_f64));
4019 assert(Src0->getType() == (IsTrunc ? IceType_f64 : IceType_f32)); 4059 assert(Src0->getType() == (IsTrunc ? IceType_f64 : IceType_f32));
4020 Variable *Src0R = legalizeToReg(Src0); 4060 Variable *Src0R = legalizeToReg(Src0);
4021 Variable *T = makeReg(Dest->getType()); 4061 Variable *T = makeReg(DestTy);
4022 _vcvt(T, Src0R, IsTrunc ? InstARM32Vcvt::D2s : InstARM32Vcvt::S2d); 4062 _vcvt(T, Src0R, IsTrunc ? InstARM32Vcvt::D2s : InstARM32Vcvt::S2d);
4023 _mov(Dest, T); 4063 _mov(Dest, T);
4024 break; 4064 break;
4025 } 4065 }
4026 case InstCast::Fptosi: 4066 case InstCast::Fptosi:
4027 case InstCast::Fptoui: { 4067 case InstCast::Fptoui: {
4028 if (isVectorType(Dest->getType())) { 4068 const bool DestIsSigned = CastKind == InstCast::Fptosi;
4029 UnimplementedLoweringError(this, Instr); 4069 Variable *Src0R = legalizeToReg(Src0);
4070
4071 if (isVectorType(DestTy)) {
4072 assert(typeElementType(Src0->getType()) == IceType_f32);
4073 auto *T = makeReg(DestTy);
4074 _vcvt(T, Src0R,
4075 DestIsSigned ? InstARM32Vcvt::Vs2si : InstARM32Vcvt::Vs2ui);
4076 _mov(Dest, T);
4030 break; 4077 break;
4031 } 4078 }
4032 4079
4033 const bool DestIsSigned = CastKind == InstCast::Fptosi;
4034 const bool Src0IsF32 = isFloat32Asserting32Or64(Src0->getType()); 4080 const bool Src0IsF32 = isFloat32Asserting32Or64(Src0->getType());
4035 if (llvm::isa<Variable64On32>(Dest)) { 4081 if (llvm::isa<Variable64On32>(Dest)) {
4036 llvm::report_fatal_error("fp-to-i64 should have been pre-lowered."); 4082 llvm::report_fatal_error("fp-to-i64 should have been pre-lowered.");
4037 } 4083 }
4038 // fptosi: 4084 // fptosi:
4039 // t1.fp = vcvt src0.fp 4085 // t1.fp = vcvt src0.fp
4040 // t2.i32 = vmov t1.fp 4086 // t2.i32 = vmov t1.fp
4041 // dest.int = conv t2.i32 @ Truncates the result if needed. 4087 // dest.int = conv t2.i32 @ Truncates the result if needed.
4042 // fptoui: 4088 // fptoui:
4043 // t1.fp = vcvt src0.fp 4089 // t1.fp = vcvt src0.fp
4044 // t2.u32 = vmov t1.fp 4090 // t2.u32 = vmov t1.fp
4045 // dest.uint = conv t2.u32 @ Truncates the result if needed. 4091 // dest.uint = conv t2.u32 @ Truncates the result if needed.
4046 Variable *Src0R = legalizeToReg(Src0);
4047 Variable *T_fp = makeReg(IceType_f32); 4092 Variable *T_fp = makeReg(IceType_f32);
4048 const InstARM32Vcvt::VcvtVariant Conversion = 4093 const InstARM32Vcvt::VcvtVariant Conversion =
4049 Src0IsF32 ? (DestIsSigned ? InstARM32Vcvt::S2si : InstARM32Vcvt::S2ui) 4094 Src0IsF32 ? (DestIsSigned ? InstARM32Vcvt::S2si : InstARM32Vcvt::S2ui)
4050 : (DestIsSigned ? InstARM32Vcvt::D2si : InstARM32Vcvt::D2ui); 4095 : (DestIsSigned ? InstARM32Vcvt::D2si : InstARM32Vcvt::D2ui);
4051 _vcvt(T_fp, Src0R, Conversion); 4096 _vcvt(T_fp, Src0R, Conversion);
4052 Variable *T = makeReg(IceType_i32); 4097 Variable *T = makeReg(IceType_i32);
4053 _mov(T, T_fp); 4098 _mov(T, T_fp);
4054 if (Dest->getType() != IceType_i32) { 4099 if (DestTy != IceType_i32) {
4055 Variable *T_1 = makeReg(Dest->getType()); 4100 Variable *T_1 = makeReg(DestTy);
4056 lowerCast(InstCast::create(Func, InstCast::Trunc, T_1, T)); 4101 lowerCast(InstCast::create(Func, InstCast::Trunc, T_1, T));
4057 T = T_1; 4102 T = T_1;
4058 } 4103 }
4059 _mov(Dest, T); 4104 _mov(Dest, T);
4060 break; 4105 break;
4061 } 4106 }
4062 case InstCast::Sitofp: 4107 case InstCast::Sitofp:
4063 case InstCast::Uitofp: { 4108 case InstCast::Uitofp: {
4064 if (isVectorType(Dest->getType())) { 4109 const bool SourceIsSigned = CastKind == InstCast::Sitofp;
4065 UnimplementedLoweringError(this, Instr); 4110
4111 if (isVectorType(DestTy)) {
4112 assert(typeElementType(DestTy) == IceType_f32);
4113 auto *T = makeReg(DestTy);
4114 Variable *Src0R = legalizeToReg(Src0);
4115 _vcvt(T, Src0R,
4116 SourceIsSigned ? InstARM32Vcvt::Vsi2s : InstARM32Vcvt::Vui2s);
4117 _mov(Dest, T);
4066 break; 4118 break;
4067 } 4119 }
4068 const bool SourceIsSigned = CastKind == InstCast::Sitofp; 4120
4069 const bool DestIsF32 = isFloat32Asserting32Or64(Dest->getType()); 4121 const bool DestIsF32 = isFloat32Asserting32Or64(DestTy);
4070 if (Src0->getType() == IceType_i64) { 4122 if (Src0->getType() == IceType_i64) {
4071 llvm::report_fatal_error("i64-to-fp should have been pre-lowered."); 4123 llvm::report_fatal_error("i64-to-fp should have been pre-lowered.");
4072 } 4124 }
4073 // sitofp: 4125 // sitofp:
4074 // t1.i32 = sext src.int @ sign-extends src0 if needed. 4126 // t1.i32 = sext src.int @ sign-extends src0 if needed.
4075 // t2.fp32 = vmov t1.i32 4127 // t2.fp32 = vmov t1.i32
4076 // t3.fp = vcvt.{fp}.s32 @ fp is either f32 or f64 4128 // t3.fp = vcvt.{fp}.s32 @ fp is either f32 or f64
4077 // uitofp: 4129 // uitofp:
4078 // t1.i32 = zext src.int @ zero-extends src0 if needed. 4130 // t1.i32 = zext src.int @ zero-extends src0 if needed.
4079 // t2.fp32 = vmov t1.i32 4131 // t2.fp32 = vmov t1.i32
4080 // t3.fp = vcvt.{fp}.s32 @ fp is either f32 or f64 4132 // t3.fp = vcvt.{fp}.s32 @ fp is either f32 or f64
4081 if (Src0->getType() != IceType_i32) { 4133 if (Src0->getType() != IceType_i32) {
4082 Variable *Src0R_32 = makeReg(IceType_i32); 4134 Variable *Src0R_32 = makeReg(IceType_i32);
4083 lowerCast(InstCast::create(Func, SourceIsSigned ? InstCast::Sext 4135 lowerCast(InstCast::create(Func, SourceIsSigned ? InstCast::Sext
4084 : InstCast::Zext, 4136 : InstCast::Zext,
4085 Src0R_32, Src0)); 4137 Src0R_32, Src0));
4086 Src0 = Src0R_32; 4138 Src0 = Src0R_32;
4087 } 4139 }
4088 Variable *Src0R = legalizeToReg(Src0); 4140 Variable *Src0R = legalizeToReg(Src0);
4089 Variable *Src0R_f32 = makeReg(IceType_f32); 4141 Variable *Src0R_f32 = makeReg(IceType_f32);
4090 _mov(Src0R_f32, Src0R); 4142 _mov(Src0R_f32, Src0R);
4091 Src0R = Src0R_f32; 4143 Src0R = Src0R_f32;
4092 Variable *T = makeReg(Dest->getType()); 4144 Variable *T = makeReg(DestTy);
4093 const InstARM32Vcvt::VcvtVariant Conversion = 4145 const InstARM32Vcvt::VcvtVariant Conversion =
4094 DestIsF32 4146 DestIsF32
4095 ? (SourceIsSigned ? InstARM32Vcvt::Si2s : InstARM32Vcvt::Ui2s) 4147 ? (SourceIsSigned ? InstARM32Vcvt::Si2s : InstARM32Vcvt::Ui2s)
4096 : (SourceIsSigned ? InstARM32Vcvt::Si2d : InstARM32Vcvt::Ui2d); 4148 : (SourceIsSigned ? InstARM32Vcvt::Si2d : InstARM32Vcvt::Ui2d);
4097 _vcvt(T, Src0R, Conversion); 4149 _vcvt(T, Src0R, Conversion);
4098 _mov(Dest, T); 4150 _mov(Dest, T);
4099 break; 4151 break;
4100 } 4152 }
4101 case InstCast::Bitcast: { 4153 case InstCast::Bitcast: {
4102 Operand *Src0 = Instr->getSrc(0); 4154 Operand *Src0 = Instr->getSrc(0);
4103 if (Dest->getType() == Src0->getType()) { 4155 if (DestTy == Src0->getType()) {
4104 auto *Assign = InstAssign::create(Func, Dest, Src0); 4156 auto *Assign = InstAssign::create(Func, Dest, Src0);
4105 lowerAssign(Assign); 4157 lowerAssign(Assign);
4106 return; 4158 return;
4107 } 4159 }
4108 Type DestType = Dest->getType(); 4160 switch (DestTy) {
4109 switch (DestType) {
4110 case IceType_NUM: 4161 case IceType_NUM:
4111 case IceType_void: 4162 case IceType_void:
4112 llvm::report_fatal_error("Unexpected bitcast."); 4163 llvm::report_fatal_error("Unexpected bitcast.");
4113 case IceType_i1: 4164 case IceType_i1:
4114 UnimplementedLoweringError(this, Instr); 4165 UnimplementedLoweringError(this, Instr);
4115 break; 4166 break;
4116 case IceType_i8: 4167 case IceType_i8:
4117 assert(Src0->getType() == IceType_v8i1); 4168 assert(Src0->getType() == IceType_v8i1);
4118 llvm::report_fatal_error( 4169 llvm::report_fatal_error(
4119 "i8 to v8i1 conversion should have been prelowered."); 4170 "i8 to v8i1 conversion should have been prelowered.");
4120 break; 4171 break;
4121 case IceType_i16: 4172 case IceType_i16:
4122 assert(Src0->getType() == IceType_v16i1); 4173 assert(Src0->getType() == IceType_v16i1);
4123 llvm::report_fatal_error( 4174 llvm::report_fatal_error(
4124 "i16 to v16i1 conversion should have been prelowered."); 4175 "i16 to v16i1 conversion should have been prelowered.");
4125 break; 4176 break;
4126 case IceType_i32: 4177 case IceType_i32:
4127 case IceType_f32: { 4178 case IceType_f32: {
4128 Variable *Src0R = legalizeToReg(Src0); 4179 Variable *Src0R = legalizeToReg(Src0);
4129 Variable *T = makeReg(DestType); 4180 Variable *T = makeReg(DestTy);
4130 _mov(T, Src0R); 4181 _mov(T, Src0R);
4131 lowerAssign(InstAssign::create(Func, Dest, T)); 4182 lowerAssign(InstAssign::create(Func, Dest, T));
4132 break; 4183 break;
4133 } 4184 }
4134 case IceType_i64: { 4185 case IceType_i64: {
4135 // t0, t1 <- src0 4186 // t0, t1 <- src0
4136 // dest[31..0] = t0 4187 // dest[31..0] = t0
4137 // dest[63..32] = t1 4188 // dest[63..32] = t1
4138 assert(Src0->getType() == IceType_f64); 4189 assert(Src0->getType() == IceType_f64);
4139 auto *T = llvm::cast<Variable64On32>(Func->makeVariable(IceType_i64)); 4190 auto *T = llvm::cast<Variable64On32>(Func->makeVariable(IceType_i64));
4140 T->initHiLo(Func); 4191 T->initHiLo(Func);
4141 configureBitcastTemporary(T); 4192 configureBitcastTemporary(T);
4142 Variable *Src0R = legalizeToReg(Src0); 4193 Variable *Src0R = legalizeToReg(Src0);
4143 _mov(T, Src0R); 4194 _mov(T, Src0R);
4144 Context.insert<InstFakeUse>(T->getHi()); 4195 Context.insert<InstFakeUse>(T->getHi());
4145 Context.insert<InstFakeUse>(T->getLo()); 4196 Context.insert<InstFakeUse>(T->getLo());
4146 lowerAssign(InstAssign::create(Func, Dest, T)); 4197 lowerAssign(InstAssign::create(Func, Dest, T));
4147 break; 4198 break;
4148 } 4199 }
4149 case IceType_f64: { 4200 case IceType_f64: {
4150 // T0 <- lo(src) 4201 // T0 <- lo(src)
4151 // T1 <- hi(src) 4202 // T1 <- hi(src)
4152 // vmov T2, T0, T1 4203 // vmov T2, T0, T1
4153 // Dest <- T2 4204 // Dest <- T2
4154 assert(Src0->getType() == IceType_i64); 4205 assert(Src0->getType() == IceType_i64);
4155 Variable *T = makeReg(DestType); 4206 Variable *T = makeReg(DestTy);
4156 auto *Src64 = llvm::cast<Variable64On32>(Func->makeVariable(IceType_i64)); 4207 auto *Src64 = llvm::cast<Variable64On32>(Func->makeVariable(IceType_i64));
4157 Src64->initHiLo(Func); 4208 Src64->initHiLo(Func);
4158 configureBitcastTemporary(Src64); 4209 configureBitcastTemporary(Src64);
4159 lowerAssign(InstAssign::create(Func, Src64, Src0)); 4210 lowerAssign(InstAssign::create(Func, Src64, Src0));
4160 _mov(T, Src64); 4211 _mov(T, Src64);
4161 lowerAssign(InstAssign::create(Func, Dest, T)); 4212 lowerAssign(InstAssign::create(Func, Dest, T));
4162 break; 4213 break;
4163 } 4214 }
4164 case IceType_v8i1: 4215 case IceType_v8i1:
4165 assert(Src0->getType() == IceType_i8); 4216 assert(Src0->getType() == IceType_i8);
4166 llvm::report_fatal_error( 4217 llvm::report_fatal_error(
4167 "v8i1 to i8 conversion should have been prelowered."); 4218 "v8i1 to i8 conversion should have been prelowered.");
4168 break; 4219 break;
4169 case IceType_v16i1: 4220 case IceType_v16i1:
4170 assert(Src0->getType() == IceType_i16); 4221 assert(Src0->getType() == IceType_i16);
4171 llvm::report_fatal_error( 4222 llvm::report_fatal_error(
4172 "v16i1 to i16 conversion should have been prelowered."); 4223 "v16i1 to i16 conversion should have been prelowered.");
4173 break; 4224 break;
4174 case IceType_v4i1: 4225 case IceType_v4i1:
4175 case IceType_v8i16: 4226 case IceType_v8i16:
4176 case IceType_v16i8: 4227 case IceType_v16i8:
4177 case IceType_v4f32: 4228 case IceType_v4f32:
4178 case IceType_v4i32: { 4229 case IceType_v4i32: {
4179 assert(typeWidthInBytes(DestType) == typeWidthInBytes(Src0->getType())); 4230 assert(typeWidthInBytes(DestTy) == typeWidthInBytes(Src0->getType()));
4180 assert(isVectorType(DestType) == isVectorType(Src0->getType())); 4231 assert(isVectorType(DestTy) == isVectorType(Src0->getType()));
4181 Variable *T = makeReg(DestType); 4232 Variable *T = makeReg(DestTy);
4182 _mov(T, Src0); 4233 _mov(T, Src0);
4183 _mov(Dest, T); 4234 _mov(Dest, T);
4184 break; 4235 break;
4185 } 4236 }
4186 } 4237 }
4187 break; 4238 break;
4188 } 4239 }
4189 } 4240 }
4190 } 4241 }
4191 4242
(...skipping 2742 matching lines...) Expand 10 before | Expand all | Expand 10 after
6934 // However, for compatibility with current NaCl LLVM, don't claim that. 6985 // However, for compatibility with current NaCl LLVM, don't claim that.
6935 Str << ".eabi_attribute 14, 3 @ Tag_ABI_PCS_R9_use: Not used\n"; 6986 Str << ".eabi_attribute 14, 3 @ Tag_ABI_PCS_R9_use: Not used\n";
6936 } 6987 }
6937 6988
6938 SmallBitVector TargetARM32::TypeToRegisterSet[RegARM32::RCARM32_NUM]; 6989 SmallBitVector TargetARM32::TypeToRegisterSet[RegARM32::RCARM32_NUM];
6939 SmallBitVector TargetARM32::TypeToRegisterSetUnfiltered[RegARM32::RCARM32_NUM]; 6990 SmallBitVector TargetARM32::TypeToRegisterSetUnfiltered[RegARM32::RCARM32_NUM];
6940 SmallBitVector TargetARM32::RegisterAliases[RegARM32::Reg_NUM]; 6991 SmallBitVector TargetARM32::RegisterAliases[RegARM32::Reg_NUM];
6941 6992
6942 } // end of namespace ARM32 6993 } // end of namespace ARM32
6943 } // end of namespace Ice 6994 } // end of namespace Ice
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698