<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Jul 28, 2015 at 8:40 AM, Benjamin Kramer <span dir="ltr"><<a href="mailto:benny.kra@googlemail.com" target="_blank">benny.kra@googlemail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: d0k<br>
Date: Tue Jul 28 10:40:11 2015<br>
New Revision: 243425<br>
<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Frev-3D243425-26view-3Drev&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=fAfxUvTI5nYTg-fLdv9idrFaq6E_yNX63K2CeEoCyiU&s=--q7aQvarMN3JOOTHN-Sw5lv4B2Ao6qvyzA1H8yWx3o&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=243425&view=rev</a><br>
Log:<br>
[CodeGen] Clean up CGBuiltin a bit.<br>
<br>
- Use cached LLVM types<br>
- Turn SmallVectors into Arrays/ArrayRef if the size is static<br>
- Use ConstantInt::get's implicit splatting for vector types<br>
<br>
No functionality change intended.<br>
<br>
Modified:<br>
cfe/trunk/lib/CodeGen/CGBuiltin.cpp<br>
<br>
Modified: cfe/trunk/lib/CodeGen/CGBuiltin.cpp<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_lib_CodeGen_CGBuiltin.cpp-3Frev-3D243425-26r1-3D243424-26r2-3D243425-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=fAfxUvTI5nYTg-fLdv9idrFaq6E_yNX63K2CeEoCyiU&s=axRYnEgWrAXjeB2Pf7Q9RZkXAFk5OiCnFdpvJ_Sise0&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGBuiltin.cpp?rev=243425&r1=243424&r2=243425&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/CodeGen/CGBuiltin.cpp (original)<br>
+++ cfe/trunk/lib/CodeGen/CGBuiltin.cpp Tue Jul 28 10:40:11 2015<br>
@@ -1940,10 +1940,7 @@ Value *CodeGenFunction::EmitNeonCall(Fun<br>
Value *CodeGenFunction::EmitNeonShiftVector(Value *V, llvm::Type *Ty,<br>
bool neg) {<br>
int SV = cast<ConstantInt>(V)->getSExtValue();<br>
-<br>
- llvm::VectorType *VTy = cast<llvm::VectorType>(Ty);<br>
- llvm::Constant *C = ConstantInt::get(VTy->getElementType(), neg ? -SV : SV);<br>
- return llvm::ConstantVector::getSplat(VTy->getNumElements(), C);<br>
+ return ConstantInt::get(Ty, neg ? -SV : SV);<br>
}<br>
<br>
// \brief Right-shift a vector by a constant.<br>
@@ -1962,8 +1959,7 @@ Value *CodeGenFunction::EmitNeonRShiftIm<br>
if (ShiftAmt == EltSize) {<br>
if (usgn) {<br>
// Right-shifting an unsigned value by its size yields 0.<br>
- llvm::Constant *Zero = ConstantInt::get(VTy->getElementType(), 0);<br>
- return llvm::ConstantVector::getSplat(VTy->getNumElements(), Zero);<br>
+ return llvm::ConstantAggregateZero::get(VTy);<br>
} else {<br>
// Right-shifting a signed value by its size is equivalent<br>
// to a shift of size-1.<br>
@@ -2782,9 +2778,8 @@ Value *CodeGenFunction::EmitCommonNeonBu<br>
Ops[0] = Builder.CreateAdd(Ops[0], Ops[1], "vaddhn");<br>
<br>
// %high = lshr <4 x i32> %sum, <i32 16, i32 16, i32 16, i32 16><br>
- Constant *ShiftAmt = ConstantInt::get(SrcTy->getElementType(),<br>
- SrcTy->getScalarSizeInBits() / 2);<br>
- ShiftAmt = ConstantVector::getSplat(VTy->getNumElements(), ShiftAmt);<br>
+ Constant *ShiftAmt =<br>
+ ConstantInt::get(SrcTy, SrcTy->getScalarSizeInBits() / 2);<br>
Ops[0] = Builder.CreateLShr(Ops[0], ShiftAmt, "vaddhn");<br>
<br>
// %res = trunc <4 x i32> %high to <4 x i16><br>
@@ -3019,14 +3014,10 @@ Value *CodeGenFunction::EmitCommonNeonBu<br>
case NEON::BI__builtin_neon_vqdmlal_v:<br>
case NEON::BI__builtin_neon_vqdmlsl_v: {<br>
SmallVector<Value *, 2> MulOps(Ops.begin() + 1, Ops.end());<br>
- Value *Mul = EmitNeonCall(CGM.getIntrinsic(LLVMIntrinsic, Ty),<br>
- MulOps, "vqdmlal");<br>
-<br>
- SmallVector<Value *, 2> AccumOps;<br>
- AccumOps.push_back(Ops[0]);<br>
- AccumOps.push_back(Mul);<br>
- return EmitNeonCall(CGM.getIntrinsic(AltLLVMIntrinsic, Ty),<br>
- AccumOps, NameHint);<br>
+ Ops[1] =<br>
+ EmitNeonCall(CGM.getIntrinsic(LLVMIntrinsic, Ty), MulOps, "vqdmlal");<br>
+ Ops.resize(2);<br>
+ return EmitNeonCall(CGM.getIntrinsic(AltLLVMIntrinsic, Ty), Ops, NameHint);<br>
}<br>
case NEON::BI__builtin_neon_vqshl_n_v:<br>
case NEON::BI__builtin_neon_vqshlq_n_v:<br>
@@ -3101,9 +3092,8 @@ Value *CodeGenFunction::EmitCommonNeonBu<br>
Ops[0] = Builder.CreateSub(Ops[0], Ops[1], "vsubhn");<br>
<br>
// %high = lshr <4 x i32> %sum, <i32 16, i32 16, i32 16, i32 16><br>
- Constant *ShiftAmt = ConstantInt::get(SrcTy->getElementType(),<br>
- SrcTy->getScalarSizeInBits() / 2);<br>
- ShiftAmt = ConstantVector::getSplat(VTy->getNumElements(), ShiftAmt);<br>
+ Constant *ShiftAmt =<br>
+ ConstantInt::get(SrcTy, SrcTy->getScalarSizeInBits() / 2);<br>
Ops[0] = Builder.CreateLShr(Ops[0], ShiftAmt, "vsubhn");<br>
<br>
// %res = trunc <4 x i32> %high to <4 x i16><br>
@@ -3252,33 +3242,37 @@ static Value *packTBLDVectorList(CodeGen<br>
}<br>
<br>
Value *CodeGenFunction::GetValueForARMHint(unsigned BuiltinID) {<br>
+ unsigned Value;<br>
switch (BuiltinID) {<br>
default:<br>
return nullptr;<br>
case ARM::BI__builtin_arm_nop:<br>
- return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_hint),<br>
- llvm::ConstantInt::get(Int32Ty, 0));<br>
+ Value = 0;<br>
+ break;<br>
case ARM::BI__builtin_arm_yield:<br>
case ARM::BI__yield:<br>
- return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_hint),<br>
- llvm::ConstantInt::get(Int32Ty, 1));<br>
+ Value = 1;<br>
+ break;<br>
case ARM::BI__builtin_arm_wfe:<br>
case ARM::BI__wfe:<br>
- return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_hint),<br>
- llvm::ConstantInt::get(Int32Ty, 2));<br>
+ Value = 2;<br>
+ break;<br>
case ARM::BI__builtin_arm_wfi:<br>
case ARM::BI__wfi:<br>
- return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_hint),<br>
- llvm::ConstantInt::get(Int32Ty, 3));<br>
+ Value = 3;<br>
+ break;<br>
case ARM::BI__builtin_arm_sev:<br>
case ARM::BI__sev:<br>
- return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_hint),<br>
- llvm::ConstantInt::get(Int32Ty, 4));<br>
+ Value = 4;<br>
+ break;<br>
case ARM::BI__builtin_arm_sevl:<br>
case ARM::BI__sevl:<br>
- return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_hint),<br>
- llvm::ConstantInt::get(Int32Ty, 5));<br>
+ Value = 5;<br>
+ break;<br>
}<br>
+<br>
+ return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_hint),<br>
+ llvm::ConstantInt::get(Int32Ty, Value));<br>
}<br>
<br>
// Generates the IR for the read/write special register builtin,<br>
@@ -3428,9 +3422,9 @@ Value *CodeGenFunction::EmitARMBuiltinEx<br>
if (BuiltinID == ARM::BI__clear_cache) {<br>
assert(E->getNumArgs() == 2 && "__clear_cache takes 2 arguments");<br>
const FunctionDecl *FD = E->getDirectCallee();<br>
- SmallVector<Value*, 2> Ops;<br>
+ Value *Ops[2];<br>
for (unsigned i = 0; i < 2; i++)<br>
- Ops.push_back(EmitScalarExpr(E->getArg(i)));<br>
+ Ops[i] = EmitScalarExpr(E->getArg(i));<br>
llvm::Type *Ty = CGM.getTypes().ConvertType(FD->getType());<br>
llvm::FunctionType *FTy = cast<llvm::FunctionType>(Ty);<br>
StringRef Name = FD->getName();<br>
@@ -3809,7 +3803,7 @@ Value *CodeGenFunction::EmitARMBuiltinEx<br>
if (VTy->getElementType()->isIntegerTy(64)) {<br>
// Extract the other lane.<br>
Ops[1] = Builder.CreateBitCast(Ops[1], Ty);<br>
- int Lane = cast<ConstantInt>(Ops[2])->getZExtValue();<br>
+ uint32_t Lane = cast<ConstantInt>(Ops[2])->getZExtValue();<br>
Value *SV = llvm::ConstantVector::get(ConstantInt::get(Int32Ty, 1-Lane));<br>
Ops[1] = Builder.CreateShuffleVector(Ops[1], Ops[1], SV);<br>
// Load the value as a one-element vector.<br>
@@ -3817,10 +3811,8 @@ Value *CodeGenFunction::EmitARMBuiltinEx<br>
Function *F = CGM.getIntrinsic(Intrinsic::arm_neon_vld1, Ty);<br>
Value *Ld = Builder.CreateCall(F, {Ops[0], Align});<br>
// Combine them.<br>
- SmallVector<Constant*, 2> Indices;<br>
- Indices.push_back(ConstantInt::get(Int32Ty, 1-Lane));<br>
- Indices.push_back(ConstantInt::get(Int32Ty, Lane));<br>
- SV = llvm::ConstantVector::get(Indices);<br>
+ uint32_t Indices[] = {1 - Lane, Lane};<br>
+ SV = llvm::ConstantDataVector::get(getLLVMContext(), Indices);<br>
return Builder.CreateShuffleVector(Ops[1], Ld, SV, "vld1q_lane");<br>
}<br>
// fall through<br>
@@ -4029,52 +4021,41 @@ static Value *EmitAArch64TblBuiltinExpr(<br>
<br>
// Determine the type of this overloaded NEON intrinsic.<br>
NeonTypeFlags Type(Result.getZExtValue());<br>
- llvm::VectorType *VTy = GetNeonType(&CGF, Type);<br>
- llvm::Type *Ty = VTy;<br>
+ llvm::VectorType *Ty = GetNeonType(&CGF, Type);<br>
if (!Ty)<br>
return nullptr;<br>
<br>
- unsigned nElts = VTy->getNumElements();<br>
-<br>
CodeGen::CGBuilderTy &Builder = CGF.Builder;<br>
<br>
// AArch64 scalar builtins are not overloaded, they do not have an extra<br>
// argument that specifies the vector type, need to handle each case.<br>
- SmallVector<Value *, 2> TblOps;<br>
switch (BuiltinID) {<br>
case NEON::BI__builtin_neon_vtbl1_v: {<br>
- TblOps.push_back(Ops[0]);<br>
- return packTBLDVectorList(CGF, TblOps, nullptr, Ops[1], Ty,<br>
- Intrinsic::aarch64_neon_tbl1, "vtbl1");<br>
+ return packTBLDVectorList(CGF, makeArrayRef(Ops).slice(0, 1), </blockquote><div><br></div><div>Does this slice the first element off Ops and pass it as an ArrayRef? Would it work to just write this argument as "Ops[0]" (ArrayRef has an implicit ctor from a T&)?<br><br>I suppose there's some symmetry with the later cases in this switch, though.<br><br>Would it make sense to declare an ArrayRef to Ops before the switch, since it seems makeArrayRef(Ops) is called in each of the cases?</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">nullptr,<br>
+ Ops[1], Ty, Intrinsic::aarch64_neon_tbl1,<br>
+ "vtbl1");<br>
}<br>
case NEON::BI__builtin_neon_vtbl2_v: {<br>
- TblOps.push_back(Ops[0]);<br>
- TblOps.push_back(Ops[1]);<br>
- return packTBLDVectorList(CGF, TblOps, nullptr, Ops[2], Ty,<br>
- Intrinsic::aarch64_neon_tbl1, "vtbl1");<br>
+ return packTBLDVectorList(CGF, makeArrayRef(Ops).slice(0, 2), nullptr,<br>
+ Ops[2], Ty, Intrinsic::aarch64_neon_tbl1,<br>
+ "vtbl1");<br>
}<br>
case NEON::BI__builtin_neon_vtbl3_v: {<br>
- TblOps.push_back(Ops[0]);<br>
- TblOps.push_back(Ops[1]);<br>
- TblOps.push_back(Ops[2]);<br>
- return packTBLDVectorList(CGF, TblOps, nullptr, Ops[3], Ty,<br>
- Intrinsic::aarch64_neon_tbl2, "vtbl2");<br>
+ return packTBLDVectorList(CGF, makeArrayRef(Ops).slice(0, 3), nullptr,<br>
+ Ops[3], Ty, Intrinsic::aarch64_neon_tbl2,<br>
+ "vtbl2");<br>
}<br>
case NEON::BI__builtin_neon_vtbl4_v: {<br>
- TblOps.push_back(Ops[0]);<br>
- TblOps.push_back(Ops[1]);<br>
- TblOps.push_back(Ops[2]);<br>
- TblOps.push_back(Ops[3]);<br>
- return packTBLDVectorList(CGF, TblOps, nullptr, Ops[4], Ty,<br>
- Intrinsic::aarch64_neon_tbl2, "vtbl2");<br>
+ return packTBLDVectorList(CGF, makeArrayRef(Ops).slice(0, 4), nullptr,<br>
+ Ops[4], Ty, Intrinsic::aarch64_neon_tbl2,<br>
+ "vtbl2");<br>
}<br>
case NEON::BI__builtin_neon_vtbx1_v: {<br>
- TblOps.push_back(Ops[1]);<br>
- Value *TblRes = packTBLDVectorList(CGF, TblOps, nullptr, Ops[2], Ty,<br>
- Intrinsic::aarch64_neon_tbl1, "vtbl1");<br>
+ Value *TblRes =<br>
+ packTBLDVectorList(CGF, makeArrayRef(Ops).slice(1, 1), nullptr, Ops[2],<br>
+ Ty, Intrinsic::aarch64_neon_tbl1, "vtbl1");<br>
<br>
- llvm::Constant *Eight = ConstantInt::get(VTy->getElementType(), 8);<br>
- Value* EightV = llvm::ConstantVector::getSplat(nElts, Eight);<br>
+ llvm::Constant *EightV = ConstantInt::get(Ty, 8);<br>
Value *CmpRes = Builder.CreateICmp(ICmpInst::ICMP_UGE, Ops[2], EightV);<br>
CmpRes = Builder.CreateSExt(CmpRes, Ty);<br>
<br>
@@ -4083,20 +4064,16 @@ static Value *EmitAArch64TblBuiltinExpr(<br>
return Builder.CreateOr(EltsFromInput, EltsFromTbl, "vtbx");<br>
}<br>
case NEON::BI__builtin_neon_vtbx2_v: {<br>
- TblOps.push_back(Ops[1]);<br>
- TblOps.push_back(Ops[2]);<br>
- return packTBLDVectorList(CGF, TblOps, Ops[0], Ops[3], Ty,<br>
- Intrinsic::aarch64_neon_tbx1, "vtbx1");<br>
+ return packTBLDVectorList(CGF, makeArrayRef(Ops).slice(1, 2), Ops[0],<br>
+ Ops[3], Ty, Intrinsic::aarch64_neon_tbx1,<br>
+ "vtbx1");<br>
}<br>
case NEON::BI__builtin_neon_vtbx3_v: {<br>
- TblOps.push_back(Ops[1]);<br>
- TblOps.push_back(Ops[2]);<br>
- TblOps.push_back(Ops[3]);<br>
- Value *TblRes = packTBLDVectorList(CGF, TblOps, nullptr, Ops[4], Ty,<br>
- Intrinsic::aarch64_neon_tbl2, "vtbl2");<br>
+ Value *TblRes =<br>
+ packTBLDVectorList(CGF, makeArrayRef(Ops).slice(1, 3), nullptr, Ops[4],<br>
+ Ty, Intrinsic::aarch64_neon_tbl2, "vtbl2");<br>
<br>
- llvm::Constant *TwentyFour = ConstantInt::get(VTy->getElementType(), 24);<br>
- Value* TwentyFourV = llvm::ConstantVector::getSplat(nElts, TwentyFour);<br>
+ llvm::Constant *TwentyFourV = ConstantInt::get(Ty, 24);<br>
Value *CmpRes = Builder.CreateICmp(ICmpInst::ICMP_UGE, Ops[4],<br>
TwentyFourV);<br>
CmpRes = Builder.CreateSExt(CmpRes, Ty);<br>
@@ -4106,12 +4083,9 @@ static Value *EmitAArch64TblBuiltinExpr(<br>
return Builder.CreateOr(EltsFromInput, EltsFromTbl, "vtbx");<br>
}<br>
case NEON::BI__builtin_neon_vtbx4_v: {<br>
- TblOps.push_back(Ops[1]);<br>
- TblOps.push_back(Ops[2]);<br>
- TblOps.push_back(Ops[3]);<br>
- TblOps.push_back(Ops[4]);<br>
- return packTBLDVectorList(CGF, TblOps, Ops[0], Ops[5], Ty,<br>
- Intrinsic::aarch64_neon_tbx2, "vtbx2");<br>
+ return packTBLDVectorList(CGF, makeArrayRef(Ops).slice(1, 4), Ops[0],<br>
+ Ops[5], Ty, Intrinsic::aarch64_neon_tbx2,<br>
+ "vtbx2");<br>
}<br>
case NEON::BI__builtin_neon_vqtbl1_v:<br>
case NEON::BI__builtin_neon_vqtbl1q_v:<br>
@@ -4236,9 +4210,9 @@ Value *CodeGenFunction::EmitAArch64Built<br>
if (BuiltinID == AArch64::BI__clear_cache) {<br>
assert(E->getNumArgs() == 2 && "__clear_cache takes 2 arguments");<br>
const FunctionDecl *FD = E->getDirectCallee();<br>
- SmallVector<Value*, 2> Ops;<br>
+ Value *Ops[2];<br>
for (unsigned i = 0; i < 2; i++)<br>
- Ops.push_back(EmitScalarExpr(E->getArg(i)));<br>
+ Ops[i] = EmitScalarExpr(E->getArg(i));<br>
llvm::Type *Ty = CGM.getTypes().ConvertType(FD->getType());<br>
llvm::FunctionType *FTy = cast<llvm::FunctionType>(Ty);<br>
StringRef Name = FD->getName();<br>
@@ -4496,8 +4470,7 @@ Value *CodeGenFunction::EmitAArch64Built<br>
return Builder.CreateSIToFP(Ops[0], FTy);<br>
}<br>
case NEON::BI__builtin_neon_vpaddd_s64: {<br>
- llvm::Type *Ty =<br>
- llvm::VectorType::get(llvm::Type::getInt64Ty(getLLVMContext()), 2);<br>
+ llvm::Type *Ty = llvm::VectorType::get(Int64Ty, 2);<br>
Value *Vec = EmitScalarExpr(E->getArg(0));<br>
// The vector is v2f64, so make sure it's bitcast to that.<br>
Vec = Builder.CreateBitCast(Vec, Ty, "v2i64");<br>
@@ -4571,12 +4544,11 @@ Value *CodeGenFunction::EmitAArch64Built<br>
ICmpInst::FCMP_OLT, ICmpInst::ICMP_SLT, "vcltz");<br>
<br>
case NEON::BI__builtin_neon_vceqzd_u64: {<br>
- llvm::Type *Ty = llvm::Type::getInt64Ty(getLLVMContext());<br>
Ops.push_back(EmitScalarExpr(E->getArg(0)));<br>
- Ops[0] = Builder.CreateBitCast(Ops[0], Ty);<br>
- Ops[0] = Builder.CreateICmp(llvm::ICmpInst::ICMP_EQ, Ops[0],<br>
- llvm::Constant::getNullValue(Ty));<br>
- return Builder.CreateSExt(Ops[0], Ty, "vceqzd");<br>
+ Ops[0] = Builder.CreateBitCast(Ops[0], Int64Ty);<br>
+ Ops[0] =<br>
+ Builder.CreateICmpEQ(Ops[0], llvm::Constant::getNullValue(Int64Ty));<br>
+ return Builder.CreateSExt(Ops[0], Int64Ty, "vceqzd");<br>
}<br>
case NEON::BI__builtin_neon_vceqd_f64:<br>
case NEON::BI__builtin_neon_vcled_f64:<br>
@@ -4650,14 +4622,13 @@ Value *CodeGenFunction::EmitAArch64Built<br>
}<br>
case NEON::BI__builtin_neon_vtstd_s64:<br>
case NEON::BI__builtin_neon_vtstd_u64: {<br>
- llvm::Type *Ty = llvm::Type::getInt64Ty(getLLVMContext());<br>
Ops.push_back(EmitScalarExpr(E->getArg(1)));<br>
- Ops[0] = Builder.CreateBitCast(Ops[0], Ty);<br>
- Ops[1] = Builder.CreateBitCast(Ops[1], Ty);<br>
+ Ops[0] = Builder.CreateBitCast(Ops[0], Int64Ty);<br>
+ Ops[1] = Builder.CreateBitCast(Ops[1], Int64Ty);<br>
Ops[0] = Builder.CreateAnd(Ops[0], Ops[1]);<br>
Ops[0] = Builder.CreateICmp(ICmpInst::ICMP_NE, Ops[0],<br>
- llvm::Constant::getNullValue(Ty));<br>
- return Builder.CreateSExt(Ops[0], Ty, "vtstd");<br>
+ llvm::Constant::getNullValue(Int64Ty));<br>
+ return Builder.CreateSExt(Ops[0], Int64Ty, "vtstd");<br>
}<br>
case NEON::BI__builtin_neon_vset_lane_i8:<br>
case NEON::BI__builtin_neon_vset_lane_i16:<br>
@@ -4686,33 +4657,27 @@ Value *CodeGenFunction::EmitAArch64Built<br>
<br>
case NEON::BI__builtin_neon_vget_lane_i8:<br>
case NEON::BI__builtin_neon_vdupb_lane_i8:<br>
- Ops[0] = Builder.CreateBitCast(Ops[0],<br>
- llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 8), 8));<br>
+ Ops[0] = Builder.CreateBitCast(Ops[0], llvm::VectorType::get(Int8Ty, 8));<br>
return Builder.CreateExtractElement(Ops[0], EmitScalarExpr(E->getArg(1)),<br>
"vget_lane");<br>
case NEON::BI__builtin_neon_vgetq_lane_i8:<br>
case NEON::BI__builtin_neon_vdupb_laneq_i8:<br>
- Ops[0] = Builder.CreateBitCast(Ops[0],<br>
- llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 8), 16));<br>
+ Ops[0] = Builder.CreateBitCast(Ops[0], llvm::VectorType::get(Int8Ty, 16));<br>
return Builder.CreateExtractElement(Ops[0], EmitScalarExpr(E->getArg(1)),<br>
"vgetq_lane");<br>
case NEON::BI__builtin_neon_vget_lane_i16:<br>
case NEON::BI__builtin_neon_vduph_lane_i16:<br>
- Ops[0] = Builder.CreateBitCast(Ops[0],<br>
- llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 16), 4));<br>
+ Ops[0] = Builder.CreateBitCast(Ops[0], llvm::VectorType::get(Int16Ty, 4));<br>
return Builder.CreateExtractElement(Ops[0], EmitScalarExpr(E->getArg(1)),<br>
"vget_lane");<br>
case NEON::BI__builtin_neon_vgetq_lane_i16:<br>
case NEON::BI__builtin_neon_vduph_laneq_i16:<br>
- Ops[0] = Builder.CreateBitCast(Ops[0],<br>
- llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 16), 8));<br>
+ Ops[0] = Builder.CreateBitCast(Ops[0], llvm::VectorType::get(Int16Ty, 8));<br>
return Builder.CreateExtractElement(Ops[0], EmitScalarExpr(E->getArg(1)),<br>
"vgetq_lane");<br>
case NEON::BI__builtin_neon_vget_lane_i32:<br>
case NEON::BI__builtin_neon_vdups_lane_i32:<br>
- Ops[0] = Builder.CreateBitCast(<br>
- Ops[0],<br>
- llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 32), 2));<br>
+ Ops[0] = Builder.CreateBitCast(Ops[0], llvm::VectorType::get(Int32Ty, 2));<br>
return Builder.CreateExtractElement(Ops[0], EmitScalarExpr(E->getArg(1)),<br>
"vget_lane");<br>
case NEON::BI__builtin_neon_vdups_lane_f32:<br>
@@ -4722,14 +4687,12 @@ Value *CodeGenFunction::EmitAArch64Built<br>
"vdups_lane");<br>
case NEON::BI__builtin_neon_vgetq_lane_i32:<br>
case NEON::BI__builtin_neon_vdups_laneq_i32:<br>
- Ops[0] = Builder.CreateBitCast(Ops[0],<br>
- llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 32), 4));<br>
+ Ops[0] = Builder.CreateBitCast(Ops[0], llvm::VectorType::get(Int32Ty, 4));<br>
return Builder.CreateExtractElement(Ops[0], EmitScalarExpr(E->getArg(1)),<br>
"vgetq_lane");<br>
case NEON::BI__builtin_neon_vget_lane_i64:<br>
case NEON::BI__builtin_neon_vdupd_lane_i64:<br>
- Ops[0] = Builder.CreateBitCast(Ops[0],<br>
- llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 64), 1));<br>
+ Ops[0] = Builder.CreateBitCast(Ops[0], llvm::VectorType::get(Int64Ty, 1));<br>
return Builder.CreateExtractElement(Ops[0], EmitScalarExpr(E->getArg(1)),<br>
"vget_lane");<br>
case NEON::BI__builtin_neon_vdupd_lane_f64:<br>
@@ -4739,8 +4702,7 @@ Value *CodeGenFunction::EmitAArch64Built<br>
"vdupd_lane");<br>
case NEON::BI__builtin_neon_vgetq_lane_i64:<br>
case NEON::BI__builtin_neon_vdupd_laneq_i64:<br>
- Ops[0] = Builder.CreateBitCast(Ops[0],<br>
- llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 64), 2));<br>
+ Ops[0] = Builder.CreateBitCast(Ops[0], llvm::VectorType::get(Int64Ty, 2));<br>
return Builder.CreateExtractElement(Ops[0], EmitScalarExpr(E->getArg(1)),<br>
"vgetq_lane");<br>
case NEON::BI__builtin_neon_vget_lane_f32:<br>
@@ -5343,232 +5305,192 @@ Value *CodeGenFunction::EmitAArch64Built<br>
// FALLTHROUGH<br>
case NEON::BI__builtin_neon_vaddv_s8: {<br>
Int = usgn ? Intrinsic::aarch64_neon_uaddv : Intrinsic::aarch64_neon_saddv;<br>
- Ty = llvm::IntegerType::get(getLLVMContext(), 32);<br>
- VTy =<br>
- llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 8), 8);<br>
+ Ty = Int32Ty;<br>
+ VTy = llvm::VectorType::get(Int8Ty, 8);<br>
llvm::Type *Tys[2] = { Ty, VTy };<br>
Ops.push_back(EmitScalarExpr(E->getArg(0)));<br>
Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddv");<br>
- return Builder.CreateTrunc(Ops[0],<br>
- llvm::IntegerType::get(getLLVMContext(), 8));<br>
+ return Builder.CreateTrunc(Ops[0], Int8Ty);<br>
}<br>
case NEON::BI__builtin_neon_vaddv_u16:<br>
usgn = true;<br>
// FALLTHROUGH<br>
case NEON::BI__builtin_neon_vaddv_s16: {<br>
Int = usgn ? Intrinsic::aarch64_neon_uaddv : Intrinsic::aarch64_neon_saddv;<br>
- Ty = llvm::IntegerType::get(getLLVMContext(), 32);<br>
- VTy =<br>
- llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 16), 4);<br>
+ Ty = Int32Ty;<br>
+ VTy = llvm::VectorType::get(Int16Ty, 4);<br>
llvm::Type *Tys[2] = { Ty, VTy };<br>
Ops.push_back(EmitScalarExpr(E->getArg(0)));<br>
Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddv");<br>
- return Builder.CreateTrunc(Ops[0],<br>
- llvm::IntegerType::get(getLLVMContext(), 16));<br>
+ return Builder.CreateTrunc(Ops[0], Int16Ty);<br>
}<br>
case NEON::BI__builtin_neon_vaddvq_u8:<br>
usgn = true;<br>
// FALLTHROUGH<br>
case NEON::BI__builtin_neon_vaddvq_s8: {<br>
Int = usgn ? Intrinsic::aarch64_neon_uaddv : Intrinsic::aarch64_neon_saddv;<br>
- Ty = llvm::IntegerType::get(getLLVMContext(), 32);<br>
- VTy =<br>
- llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 8), 16);<br>
+ Ty = Int32Ty;<br>
+ VTy = llvm::VectorType::get(Int8Ty, 16);<br>
llvm::Type *Tys[2] = { Ty, VTy };<br>
Ops.push_back(EmitScalarExpr(E->getArg(0)));<br>
Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddv");<br>
- return Builder.CreateTrunc(Ops[0],<br>
- llvm::IntegerType::get(getLLVMContext(), 8));<br>
+ return Builder.CreateTrunc(Ops[0], Int8Ty);<br>
}<br>
case NEON::BI__builtin_neon_vaddvq_u16:<br>
usgn = true;<br>
// FALLTHROUGH<br>
case NEON::BI__builtin_neon_vaddvq_s16: {<br>
Int = usgn ? Intrinsic::aarch64_neon_uaddv : Intrinsic::aarch64_neon_saddv;<br>
- Ty = llvm::IntegerType::get(getLLVMContext(), 32);<br>
- VTy =<br>
- llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 16), 8);<br>
+ Ty = Int32Ty;<br>
+ VTy = llvm::VectorType::get(Int16Ty, 8);<br>
llvm::Type *Tys[2] = { Ty, VTy };<br>
Ops.push_back(EmitScalarExpr(E->getArg(0)));<br>
Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddv");<br>
- return Builder.CreateTrunc(Ops[0],<br>
- llvm::IntegerType::get(getLLVMContext(), 16));<br>
+ return Builder.CreateTrunc(Ops[0], Int16Ty);<br>
}<br>
case NEON::BI__builtin_neon_vmaxv_u8: {<br>
Int = Intrinsic::aarch64_neon_umaxv;<br>
- Ty = llvm::IntegerType::get(getLLVMContext(), 32);<br>
- VTy =<br>
- llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 8), 8);<br>
+ Ty = Int32Ty;<br>
+ VTy = llvm::VectorType::get(Int8Ty, 8);<br>
llvm::Type *Tys[2] = { Ty, VTy };<br>
Ops.push_back(EmitScalarExpr(E->getArg(0)));<br>
Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vmaxv");<br>
- return Builder.CreateTrunc(Ops[0],<br>
- llvm::IntegerType::get(getLLVMContext(), 8));<br>
+ return Builder.CreateTrunc(Ops[0], Int8Ty);<br>
}<br>
case NEON::BI__builtin_neon_vmaxv_u16: {<br>
Int = Intrinsic::aarch64_neon_umaxv;<br>
- Ty = llvm::IntegerType::get(getLLVMContext(), 32);<br>
- VTy =<br>
- llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 16), 4);<br>
+ Ty = Int32Ty;<br>
+ VTy = llvm::VectorType::get(Int16Ty, 4);<br>
llvm::Type *Tys[2] = { Ty, VTy };<br>
Ops.push_back(EmitScalarExpr(E->getArg(0)));<br>
Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vmaxv");<br>
- return Builder.CreateTrunc(Ops[0],<br>
- llvm::IntegerType::get(getLLVMContext(), 16));<br>
+ return Builder.CreateTrunc(Ops[0], Int16Ty);<br>
}<br>
case NEON::BI__builtin_neon_vmaxvq_u8: {<br>
Int = Intrinsic::aarch64_neon_umaxv;<br>
- Ty = llvm::IntegerType::get(getLLVMContext(), 32);<br>
- VTy =<br>
- llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 8), 16);<br>
+ Ty = Int32Ty;<br>
+ VTy = llvm::VectorType::get(Int8Ty, 16);<br>
llvm::Type *Tys[2] = { Ty, VTy };<br>
Ops.push_back(EmitScalarExpr(E->getArg(0)));<br>
Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vmaxv");<br>
- return Builder.CreateTrunc(Ops[0],<br>
- llvm::IntegerType::get(getLLVMContext(), 8));<br>
+ return Builder.CreateTrunc(Ops[0], Int8Ty);<br>
}<br>
case NEON::BI__builtin_neon_vmaxvq_u16: {<br>
Int = Intrinsic::aarch64_neon_umaxv;<br>
- Ty = llvm::IntegerType::get(getLLVMContext(), 32);<br>
- VTy =<br>
- llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 16), 8);<br>
+ Ty = Int32Ty;<br>
+ VTy = llvm::VectorType::get(Int16Ty, 8);<br>
llvm::Type *Tys[2] = { Ty, VTy };<br>
Ops.push_back(EmitScalarExpr(E->getArg(0)));<br>
Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vmaxv");<br>
- return Builder.CreateTrunc(Ops[0],<br>
- llvm::IntegerType::get(getLLVMContext(), 16));<br>
+ return Builder.CreateTrunc(Ops[0], Int16Ty);<br>
}<br>
case NEON::BI__builtin_neon_vmaxv_s8: {<br>
Int = Intrinsic::aarch64_neon_smaxv;<br>
- Ty = llvm::IntegerType::get(getLLVMContext(), 32);<br>
- VTy =<br>
- llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 8), 8);<br>
+ Ty = Int32Ty;<br>
+ VTy = llvm::VectorType::get(Int8Ty, 8);<br>
llvm::Type *Tys[2] = { Ty, VTy };<br>
Ops.push_back(EmitScalarExpr(E->getArg(0)));<br>
Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vmaxv");<br>
- return Builder.CreateTrunc(Ops[0],<br>
- llvm::IntegerType::get(getLLVMContext(), 8));<br>
+ return Builder.CreateTrunc(Ops[0], Int8Ty);<br>
}<br>
case NEON::BI__builtin_neon_vmaxv_s16: {<br>
Int = Intrinsic::aarch64_neon_smaxv;<br>
- Ty = llvm::IntegerType::get(getLLVMContext(), 32);<br>
- VTy =<br>
- llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 16), 4);<br>
+ Ty = Int32Ty;<br>
+ VTy = llvm::VectorType::get(Int16Ty, 4);<br>
llvm::Type *Tys[2] = { Ty, VTy };<br>
Ops.push_back(EmitScalarExpr(E->getArg(0)));<br>
Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vmaxv");<br>
- return Builder.CreateTrunc(Ops[0],<br>
- llvm::IntegerType::get(getLLVMContext(), 16));<br>
+ return Builder.CreateTrunc(Ops[0], Int16Ty);<br>
}<br>
case NEON::BI__builtin_neon_vmaxvq_s8: {<br>
Int = Intrinsic::aarch64_neon_smaxv;<br>
- Ty = llvm::IntegerType::get(getLLVMContext(), 32);<br>
- VTy =<br>
- llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 8), 16);<br>
+ Ty = Int32Ty;<br>
+ VTy = llvm::VectorType::get(Int8Ty, 16);<br>
llvm::Type *Tys[2] = { Ty, VTy };<br>
Ops.push_back(EmitScalarExpr(E->getArg(0)));<br>
Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vmaxv");<br>
- return Builder.CreateTrunc(Ops[0],<br>
- llvm::IntegerType::get(getLLVMContext(), 8));<br>
+ return Builder.CreateTrunc(Ops[0], Int8Ty);<br>
}<br>
case NEON::BI__builtin_neon_vmaxvq_s16: {<br>
Int = Intrinsic::aarch64_neon_smaxv;<br>
- Ty = llvm::IntegerType::get(getLLVMContext(), 32);<br>
- VTy =<br>
- llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 16), 8);<br>
+ Ty = Int32Ty;<br>
+ VTy = llvm::VectorType::get(Int16Ty, 8);<br>
llvm::Type *Tys[2] = { Ty, VTy };<br>
Ops.push_back(EmitScalarExpr(E->getArg(0)));<br>
Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vmaxv");<br>
- return Builder.CreateTrunc(Ops[0],<br>
- llvm::IntegerType::get(getLLVMContext(), 16));<br>
+ return Builder.CreateTrunc(Ops[0], Int16Ty);<br>
}<br>
case NEON::BI__builtin_neon_vminv_u8: {<br>
Int = Intrinsic::aarch64_neon_uminv;<br>
- Ty = llvm::IntegerType::get(getLLVMContext(), 32);<br>
- VTy =<br>
- llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 8), 8);<br>
+ Ty = Int32Ty;<br>
+ VTy = llvm::VectorType::get(Int8Ty, 8);<br>
llvm::Type *Tys[2] = { Ty, VTy };<br>
Ops.push_back(EmitScalarExpr(E->getArg(0)));<br>
Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vminv");<br>
- return Builder.CreateTrunc(Ops[0],<br>
- llvm::IntegerType::get(getLLVMContext(), 8));<br>
+ return Builder.CreateTrunc(Ops[0], Int8Ty);<br>
}<br>
case NEON::BI__builtin_neon_vminv_u16: {<br>
Int = Intrinsic::aarch64_neon_uminv;<br>
- Ty = llvm::IntegerType::get(getLLVMContext(), 32);<br>
- VTy =<br>
- llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 16), 4);<br>
+ Ty = Int32Ty;<br>
+ VTy = llvm::VectorType::get(Int16Ty, 4);<br>
llvm::Type *Tys[2] = { Ty, VTy };<br>
Ops.push_back(EmitScalarExpr(E->getArg(0)));<br>
Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vminv");<br>
- return Builder.CreateTrunc(Ops[0],<br>
- llvm::IntegerType::get(getLLVMContext(), 16));<br>
+ return Builder.CreateTrunc(Ops[0], Int16Ty);<br>
}<br>
case NEON::BI__builtin_neon_vminvq_u8: {<br>
Int = Intrinsic::aarch64_neon_uminv;<br>
- Ty = llvm::IntegerType::get(getLLVMContext(), 32);<br>
- VTy =<br>
- llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 8), 16);<br>
+ Ty = Int32Ty;<br>
+ VTy = llvm::VectorType::get(Int8Ty, 16);<br>
llvm::Type *Tys[2] = { Ty, VTy };<br>
Ops.push_back(EmitScalarExpr(E->getArg(0)));<br>
Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vminv");<br>
- return Builder.CreateTrunc(Ops[0],<br>
- llvm::IntegerType::get(getLLVMContext(), 8));<br>
+ return Builder.CreateTrunc(Ops[0], Int8Ty);<br>
}<br>
case NEON::BI__builtin_neon_vminvq_u16: {<br>
Int = Intrinsic::aarch64_neon_uminv;<br>
- Ty = llvm::IntegerType::get(getLLVMContext(), 32);<br>
- VTy =<br>
- llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 16), 8);<br>
+ Ty = Int32Ty;<br>
+ VTy = llvm::VectorType::get(Int16Ty, 8);<br>
llvm::Type *Tys[2] = { Ty, VTy };<br>
Ops.push_back(EmitScalarExpr(E->getArg(0)));<br>
Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vminv");<br>
- return Builder.CreateTrunc(Ops[0],<br>
- llvm::IntegerType::get(getLLVMContext(), 16));<br>
+ return Builder.CreateTrunc(Ops[0], Int16Ty);<br>
}<br>
case NEON::BI__builtin_neon_vminv_s8: {<br>
Int = Intrinsic::aarch64_neon_sminv;<br>
- Ty = llvm::IntegerType::get(getLLVMContext(), 32);<br>
- VTy =<br>
- llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 8), 8);<br>
+ Ty = Int32Ty;<br>
+ VTy = llvm::VectorType::get(Int8Ty, 8);<br>
llvm::Type *Tys[2] = { Ty, VTy };<br>
Ops.push_back(EmitScalarExpr(E->getArg(0)));<br>
Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vminv");<br>
- return Builder.CreateTrunc(Ops[0],<br>
- llvm::IntegerType::get(getLLVMContext(), 8));<br>
+ return Builder.CreateTrunc(Ops[0], Int8Ty);<br>
}<br>
case NEON::BI__builtin_neon_vminv_s16: {<br>
Int = Intrinsic::aarch64_neon_sminv;<br>
- Ty = llvm::IntegerType::get(getLLVMContext(), 32);<br>
- VTy =<br>
- llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 16), 4);<br>
+ Ty = Int32Ty;<br>
+ VTy = llvm::VectorType::get(Int16Ty, 4);<br>
llvm::Type *Tys[2] = { Ty, VTy };<br>
Ops.push_back(EmitScalarExpr(E->getArg(0)));<br>
Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vminv");<br>
- return Builder.CreateTrunc(Ops[0],<br>
- llvm::IntegerType::get(getLLVMContext(), 16));<br>
+ return Builder.CreateTrunc(Ops[0], Int16Ty);<br>
}<br>
case NEON::BI__builtin_neon_vminvq_s8: {<br>
Int = Intrinsic::aarch64_neon_sminv;<br>
- Ty = llvm::IntegerType::get(getLLVMContext(), 32);<br>
- VTy =<br>
- llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 8), 16);<br>
+ Ty = Int32Ty;<br>
+ VTy = llvm::VectorType::get(Int8Ty, 16);<br>
llvm::Type *Tys[2] = { Ty, VTy };<br>
Ops.push_back(EmitScalarExpr(E->getArg(0)));<br>
Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vminv");<br>
- return Builder.CreateTrunc(Ops[0],<br>
- llvm::IntegerType::get(getLLVMContext(), 8));<br>
+ return Builder.CreateTrunc(Ops[0], Int8Ty);<br>
}<br>
case NEON::BI__builtin_neon_vminvq_s16: {<br>
Int = Intrinsic::aarch64_neon_sminv;<br>
- Ty = llvm::IntegerType::get(getLLVMContext(), 32);<br>
- VTy =<br>
- llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 16), 8);<br>
+ Ty = Int32Ty;<br>
+ VTy = llvm::VectorType::get(Int16Ty, 8);<br>
llvm::Type *Tys[2] = { Ty, VTy };<br>
Ops.push_back(EmitScalarExpr(E->getArg(0)));<br>
Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vminv");<br>
- return Builder.CreateTrunc(Ops[0],<br>
- llvm::IntegerType::get(getLLVMContext(), 16));<br>
+ return Builder.CreateTrunc(Ops[0], Int16Ty);<br>
}<br>
case NEON::BI__builtin_neon_vmul_n_f64: {<br>
Ops[0] = Builder.CreateBitCast(Ops[0], DoubleTy);<br>
@@ -5577,80 +5499,68 @@ Value *CodeGenFunction::EmitAArch64Built<br>
}<br>
case NEON::BI__builtin_neon_vaddlv_u8: {<br>
Int = Intrinsic::aarch64_neon_uaddlv;<br>
- Ty = llvm::IntegerType::get(getLLVMContext(), 32);<br>
- VTy =<br>
- llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 8), 8);<br>
+ Ty = Int32Ty;<br>
+ VTy = llvm::VectorType::get(Int8Ty, 8);<br>
llvm::Type *Tys[2] = { Ty, VTy };<br>
Ops.push_back(EmitScalarExpr(E->getArg(0)));<br>
Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddlv");<br>
- return Builder.CreateTrunc(Ops[0],<br>
- llvm::IntegerType::get(getLLVMContext(), 16));<br>
+ return Builder.CreateTrunc(Ops[0], Int16Ty);<br>
}<br>
case NEON::BI__builtin_neon_vaddlv_u16: {<br>
Int = Intrinsic::aarch64_neon_uaddlv;<br>
- Ty = llvm::IntegerType::get(getLLVMContext(), 32);<br>
- VTy =<br>
- llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 16), 4);<br>
+ Ty = Int32Ty;<br>
+ VTy = llvm::VectorType::get(Int16Ty, 4);<br>
llvm::Type *Tys[2] = { Ty, VTy };<br>
Ops.push_back(EmitScalarExpr(E->getArg(0)));<br>
return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddlv");<br>
}<br>
case NEON::BI__builtin_neon_vaddlvq_u8: {<br>
Int = Intrinsic::aarch64_neon_uaddlv;<br>
- Ty = llvm::IntegerType::get(getLLVMContext(), 32);<br>
- VTy =<br>
- llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 8), 16);<br>
+ Ty = Int32Ty;<br>
+ VTy = llvm::VectorType::get(Int8Ty, 16);<br>
llvm::Type *Tys[2] = { Ty, VTy };<br>
Ops.push_back(EmitScalarExpr(E->getArg(0)));<br>
Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddlv");<br>
- return Builder.CreateTrunc(Ops[0],<br>
- llvm::IntegerType::get(getLLVMContext(), 16));<br>
+ return Builder.CreateTrunc(Ops[0], Int16Ty);<br>
}<br>
case NEON::BI__builtin_neon_vaddlvq_u16: {<br>
Int = Intrinsic::aarch64_neon_uaddlv;<br>
- Ty = llvm::IntegerType::get(getLLVMContext(), 32);<br>
- VTy =<br>
- llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 16), 8);<br>
+ Ty = Int32Ty;<br>
+ VTy = llvm::VectorType::get(Int16Ty, 8);<br>
llvm::Type *Tys[2] = { Ty, VTy };<br>
Ops.push_back(EmitScalarExpr(E->getArg(0)));<br>
return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddlv");<br>
}<br>
case NEON::BI__builtin_neon_vaddlv_s8: {<br>
Int = Intrinsic::aarch64_neon_saddlv;<br>
- Ty = llvm::IntegerType::get(getLLVMContext(), 32);<br>
- VTy =<br>
- llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 8), 8);<br>
+ Ty = Int32Ty;<br>
+ VTy = llvm::VectorType::get(Int8Ty, 8);<br>
llvm::Type *Tys[2] = { Ty, VTy };<br>
Ops.push_back(EmitScalarExpr(E->getArg(0)));<br>
Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddlv");<br>
- return Builder.CreateTrunc(Ops[0],<br>
- llvm::IntegerType::get(getLLVMContext(), 16));<br>
+ return Builder.CreateTrunc(Ops[0], Int16Ty);<br>
}<br>
case NEON::BI__builtin_neon_vaddlv_s16: {<br>
Int = Intrinsic::aarch64_neon_saddlv;<br>
- Ty = llvm::IntegerType::get(getLLVMContext(), 32);<br>
- VTy =<br>
- llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 16), 4);<br>
+ Ty = Int32Ty;<br>
+ VTy = llvm::VectorType::get(Int16Ty, 4);<br>
llvm::Type *Tys[2] = { Ty, VTy };<br>
Ops.push_back(EmitScalarExpr(E->getArg(0)));<br>
return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddlv");<br>
}<br>
case NEON::BI__builtin_neon_vaddlvq_s8: {<br>
Int = Intrinsic::aarch64_neon_saddlv;<br>
- Ty = llvm::IntegerType::get(getLLVMContext(), 32);<br>
- VTy =<br>
- llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 8), 16);<br>
+ Ty = Int32Ty;<br>
+ VTy = llvm::VectorType::get(Int8Ty, 16);<br>
llvm::Type *Tys[2] = { Ty, VTy };<br>
Ops.push_back(EmitScalarExpr(E->getArg(0)));<br>
Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddlv");<br>
- return Builder.CreateTrunc(Ops[0],<br>
- llvm::IntegerType::get(getLLVMContext(), 16));<br>
+ return Builder.CreateTrunc(Ops[0], Int16Ty);<br>
}<br>
case NEON::BI__builtin_neon_vaddlvq_s16: {<br>
Int = Intrinsic::aarch64_neon_saddlv;<br>
- Ty = llvm::IntegerType::get(getLLVMContext(), 32);<br>
- VTy =<br>
- llvm::VectorType::get(llvm::IntegerType::get(getLLVMContext(), 16), 8);<br>
+ Ty = Int32Ty;<br>
+ VTy = llvm::VectorType::get(Int16Ty, 8);<br>
llvm::Type *Tys[2] = { Ty, VTy };<br>
Ops.push_back(EmitScalarExpr(E->getArg(0)));<br>
return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddlv");<br>
@@ -5738,9 +5648,8 @@ Value *CodeGenFunction::EmitAArch64Built<br>
Int = Intrinsic::aarch64_neon_st1x4;<br>
break;<br>
}<br>
- SmallVector<Value *, 4> IntOps(Ops.begin()+1, Ops.end());<br>
- IntOps.push_back(Ops[0]);<br>
- return EmitNeonCall(CGM.getIntrinsic(Int, Tys), IntOps, "");<br>
+ std::rotate(Ops.begin(), Ops.begin() + 1, Ops.end());<br>
+ return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "");<br>
}<br>
case NEON::BI__builtin_neon_vld1_v:<br>
case NEON::BI__builtin_neon_vld1q_v:<br>
@@ -5851,8 +5760,7 @@ Value *CodeGenFunction::EmitAArch64Built<br>
Ops.erase(Ops.begin()+1);<br>
Ops[1] = Builder.CreateBitCast(Ops[1], Ty);<br>
Ops[2] = Builder.CreateBitCast(Ops[2], Ty);<br>
- Ops[3] = Builder.CreateZExt(Ops[3],<br>
- llvm::IntegerType::get(getLLVMContext(), 64));<br>
+ Ops[3] = Builder.CreateZExt(Ops[3], Int64Ty);<br>
Ops[1] = Builder.CreateCall(F, makeArrayRef(Ops).slice(1), "vld2_lane");<br>
Ty = llvm::PointerType::getUnqual(Ops[1]->getType());<br>
Ops[0] = Builder.CreateBitCast(Ops[0], Ty);<br>
@@ -5867,8 +5775,7 @@ Value *CodeGenFunction::EmitAArch64Built<br>
Ops[1] = Builder.CreateBitCast(Ops[1], Ty);<br>
Ops[2] = Builder.CreateBitCast(Ops[2], Ty);<br>
Ops[3] = Builder.CreateBitCast(Ops[3], Ty);<br>
- Ops[4] = Builder.CreateZExt(Ops[4],<br>
- llvm::IntegerType::get(getLLVMContext(), 64));<br>
+ Ops[4] = Builder.CreateZExt(Ops[4], Int64Ty);<br>
Ops[1] = Builder.CreateCall(F, makeArrayRef(Ops).slice(1), "vld3_lane");<br>
Ty = llvm::PointerType::getUnqual(Ops[1]->getType());<br>
Ops[0] = Builder.CreateBitCast(Ops[0], Ty);<br>
@@ -5884,8 +5791,7 @@ Value *CodeGenFunction::EmitAArch64Built<br>
Ops[2] = Builder.CreateBitCast(Ops[2], Ty);<br>
Ops[3] = Builder.CreateBitCast(Ops[3], Ty);<br>
Ops[4] = Builder.CreateBitCast(Ops[4], Ty);<br>
- Ops[5] = Builder.CreateZExt(Ops[5],<br>
- llvm::IntegerType::get(getLLVMContext(), 64));<br>
+ Ops[5] = Builder.CreateZExt(Ops[5], Int64Ty);<br>
Ops[1] = Builder.CreateCall(F, makeArrayRef(Ops).slice(1), "vld4_lane");<br>
Ty = llvm::PointerType::getUnqual(Ops[1]->getType());<br>
Ops[0] = Builder.CreateBitCast(Ops[0], Ty);<br>
@@ -5903,8 +5809,7 @@ Value *CodeGenFunction::EmitAArch64Built<br>
case NEON::BI__builtin_neon_vst2q_lane_v: {<br>
Ops.push_back(Ops[0]);<br>
Ops.erase(Ops.begin());<br>
- Ops[2] = Builder.CreateZExt(Ops[2],<br>
- llvm::IntegerType::get(getLLVMContext(), 64));<br>
+ Ops[2] = Builder.CreateZExt(Ops[2], Int64Ty);<br>
llvm::Type *Tys[2] = { VTy, Ops[3]->getType() };<br>
return EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_st2lane, Tys),<br>
Ops, "");<br>
@@ -5921,8 +5826,7 @@ Value *CodeGenFunction::EmitAArch64Built<br>
case NEON::BI__builtin_neon_vst3q_lane_v: {<br>
Ops.push_back(Ops[0]);<br>
Ops.erase(Ops.begin());<br>
- Ops[3] = Builder.CreateZExt(Ops[3],<br>
- llvm::IntegerType::get(getLLVMContext(), 64));<br>
+ Ops[3] = Builder.CreateZExt(Ops[3], Int64Ty);<br>
llvm::Type *Tys[2] = { VTy, Ops[4]->getType() };<br>
return EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_st3lane, Tys),<br>
Ops, "");<br>
@@ -5939,8 +5843,7 @@ Value *CodeGenFunction::EmitAArch64Built<br>
case NEON::BI__builtin_neon_vst4q_lane_v: {<br>
Ops.push_back(Ops[0]);<br>
Ops.erase(Ops.begin());<br>
- Ops[4] = Builder.CreateZExt(Ops[4],<br>
- llvm::IntegerType::get(getLLVMContext(), 64));<br>
+ Ops[4] = Builder.CreateZExt(Ops[4], Int64Ty);<br>
llvm::Type *Tys[2] = { VTy, Ops[5]->getType() };<br>
return EmitNeonCall(CGM.getIntrinsic(Intrinsic::aarch64_neon_st4lane, Tys),<br>
Ops, "");<br>
@@ -6247,18 +6150,19 @@ Value *CodeGenFunction::EmitX86BuiltinEx<br>
Ops[0] = llvm::Constant::getNullValue(Ops[0]->getType());<br>
}<br>
<br>
- SmallVector<llvm::Constant*, 32> Indices;<br>
+ uint32_t Indices[32];<br>
// 256-bit palignr operates on 128-bit lanes so we need to handle that<br>
for (unsigned l = 0; l != NumElts; l += NumLaneElts) {<br>
for (unsigned i = 0; i != NumLaneElts; ++i) {<br>
unsigned Idx = ShiftVal + i;<br>
if (Idx >= NumLaneElts)<br>
Idx += NumElts - NumLaneElts; // End of lane, switch operand.<br>
- Indices.push_back(llvm::ConstantInt::get(Int32Ty, Idx + l));<br>
+ Indices[l + i] = Idx + l;<br>
}<br>
}<br>
<br>
- Value* SV = llvm::ConstantVector::get(Indices);<br>
+ Value *SV = llvm::ConstantDataVector::get(getLLVMContext(),<br>
+ makeArrayRef(Indices, NumElts));<br>
return Builder.CreateShuffleVector(Ops[1], Ops[0], SV, "palignr");<br>
}<br>
case X86::BI__builtin_ia32_pslldqi256: {<br>
@@ -6269,13 +6173,13 @@ Value *CodeGenFunction::EmitX86BuiltinEx<br>
if (shiftVal >= 16)<br>
return llvm::Constant::getNullValue(ConvertType(E->getType()));<br>
<br>
- SmallVector<llvm::Constant*, 32> Indices;<br>
+ uint32_t Indices[32];<br>
// 256-bit pslldq operates on 128-bit lanes so we need to handle that<br>
for (unsigned l = 0; l != 32; l += 16) {<br>
for (unsigned i = 0; i != 16; ++i) {<br>
unsigned Idx = 32 + i - shiftVal;<br>
if (Idx < 32) Idx -= 16; // end of lane, switch operand.<br>
- Indices.push_back(llvm::ConstantInt::get(Int32Ty, Idx + l));<br>
+ Indices[l + i] = Idx + l;<br>
}<br>
}<br>
<br>
@@ -6283,7 +6187,7 @@ Value *CodeGenFunction::EmitX86BuiltinEx<br>
Ops[0] = Builder.CreateBitCast(Ops[0], VecTy, "cast");<br>
Value *Zero = llvm::Constant::getNullValue(VecTy);<br>
<br>
- Value *SV = llvm::ConstantVector::get(Indices);<br>
+ Value *SV = llvm::ConstantDataVector::get(getLLVMContext(), Indices);<br>
SV = Builder.CreateShuffleVector(Zero, Ops[0], SV, "pslldq");<br>
llvm::Type *ResultType = ConvertType(E->getType());<br>
return Builder.CreateBitCast(SV, ResultType, "cast");<br>
@@ -6296,13 +6200,13 @@ Value *CodeGenFunction::EmitX86BuiltinEx<br>
if (shiftVal >= 16)<br>
return llvm::Constant::getNullValue(ConvertType(E->getType()));<br>
<br>
- SmallVector<llvm::Constant*, 32> Indices;<br>
+ uint32_t Indices[32];<br>
// 256-bit psrldq operates on 128-bit lanes so we need to handle that<br>
for (unsigned l = 0; l != 32; l += 16) {<br>
for (unsigned i = 0; i != 16; ++i) {<br>
unsigned Idx = i + shiftVal;<br>
if (Idx >= 16) Idx += 16; // end of lane, switch operand.<br>
- Indices.push_back(llvm::ConstantInt::get(Int32Ty, Idx + l));<br>
+ Indices[l + i] = Idx + l;<br>
}<br>
}<br>
<br>
@@ -6310,7 +6214,7 @@ Value *CodeGenFunction::EmitX86BuiltinEx<br>
Ops[0] = Builder.CreateBitCast(Ops[0], VecTy, "cast");<br>
Value *Zero = llvm::Constant::getNullValue(VecTy);<br>
<br>
- Value *SV = llvm::ConstantVector::get(Indices);<br>
+ Value *SV = llvm::ConstantDataVector::get(getLLVMContext(), Indices);<br>
SV = Builder.CreateShuffleVector(Ops[0], Zero, SV, "psrldq");<br>
llvm::Type *ResultType = ConvertType(E->getType());<br>
return Builder.CreateBitCast(SV, ResultType, "cast");<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div></div>