OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |