@@ -614,6 +614,17 @@ static Value *emitTernaryBuiltin(CodeGenFunction &CGF,
614
614
return CGF.Builder.CreateCall(F, { Src0, Src1, Src2 });
615
615
}
616
616
617
+ // Emit an intrinsic that has N operands of the same type as its result.
618
+ static Value *emitNaryBuiltin(CodeGenFunction &CGF, const CallExpr *E,
619
+ unsigned IntrinsicID) {
620
+ SmallVector<Value *, 16> Args;
621
+ for (unsigned i = 0, e = E->getNumArgs(); i != e; i++)
622
+ Args.push_back(CGF.EmitScalarExpr(E->getArg(i)));
623
+
624
+ Function *F = CGF.CGM.getIntrinsic(IntrinsicID, Args[0]->getType());
625
+ return CGF.Builder.CreateCall(F, Args);
626
+ }
627
+
617
628
// Emit an intrinsic that has 1 float or double operand, and 1 integer.
618
629
static Value *emitFPIntBuiltin(CodeGenFunction &CGF,
619
630
const CallExpr *E,
@@ -18480,21 +18491,11 @@ Value *CodeGenFunction::EmitAMDGPUBuiltinExpr(unsigned BuiltinID,
18480
18491
return Builder.CreateCall(F, Args);
18481
18492
}
18482
18493
case AMDGPU::BI__builtin_amdgcn_permlane16:
18483
- case AMDGPU::BI__builtin_amdgcn_permlanex16: {
18484
- llvm::Value *Src0 = EmitScalarExpr(E->getArg(0));
18485
- llvm::Value *Src1 = EmitScalarExpr(E->getArg(1));
18486
- llvm::Value *Src2 = EmitScalarExpr(E->getArg(2));
18487
- llvm::Value *Src3 = EmitScalarExpr(E->getArg(3));
18488
- llvm::Value *Src4 = EmitScalarExpr(E->getArg(4));
18489
- llvm::Value *Src5 = EmitScalarExpr(E->getArg(5));
18490
-
18491
- Intrinsic::ID IID = BuiltinID == AMDGPU::BI__builtin_amdgcn_permlane16
18492
- ? Intrinsic::amdgcn_permlane16
18493
- : Intrinsic::amdgcn_permlanex16;
18494
-
18495
- llvm::Function *F = CGM.getIntrinsic(IID, Src0->getType());
18496
- return Builder.CreateCall(F, {Src0, Src1, Src2, Src3, Src4, Src5});
18497
- }
18494
+ case AMDGPU::BI__builtin_amdgcn_permlanex16:
18495
+ return emitNaryBuiltin(*this, E,
18496
+ BuiltinID == AMDGPU::BI__builtin_amdgcn_permlane16
18497
+ ? Intrinsic::amdgcn_permlane16
18498
+ : Intrinsic::amdgcn_permlanex16);
18498
18499
case AMDGPU::BI__builtin_amdgcn_permlane64:
18499
18500
return emitUnaryBuiltin(*this, E, Intrinsic::amdgcn_permlane64);
18500
18501
case AMDGPU::BI__builtin_amdgcn_readlane:
0 commit comments