|
55 | 55 | #include "llvm/IR/IntrinsicsR600.h" |
56 | 56 | #include "llvm/IR/IntrinsicsRISCV.h" |
57 | 57 | #include "llvm/IR/IntrinsicsS390.h" |
| 58 | +#include "llvm/IR/IntrinsicsSPIRV.h" |
58 | 59 | #include "llvm/IR/IntrinsicsWebAssembly.h" |
59 | 60 | #include "llvm/IR/IntrinsicsX86.h" |
60 | 61 | #include "llvm/IR/MDBuilder.h" |
|
67 | 68 | #include "llvm/TargetParser/AArch64TargetParser.h" |
68 | 69 | #include "llvm/TargetParser/RISCVISAInfo.h" |
69 | 70 | #include "llvm/TargetParser/RISCVTargetParser.h" |
| 71 | +#include "llvm/TargetParser/Triple.h" |
70 | 72 | #include "llvm/TargetParser/X86TargetParser.h" |
71 | 73 | #include <optional> |
72 | 74 | #include <utility> |
@@ -6719,6 +6721,8 @@ static Value *EmitTargetArchBuiltinExpr(CodeGenFunction *CGF, |
6719 | 6721 | case llvm::Triple::riscv32: |
6720 | 6722 | case llvm::Triple::riscv64: |
6721 | 6723 | return CGF->EmitRISCVBuiltinExpr(BuiltinID, E, ReturnValue); |
| 6724 | + case llvm::Triple::spirv: |
| 6725 | + return CGF->EmitSPIRVBuiltinExpr(BuiltinID, E); |
6722 | 6726 | case llvm::Triple::spirv64: |
6723 | 6727 | if (CGF->getTarget().getTriple().getOS() != llvm::Triple::OSType::AMDHSA) |
6724 | 6728 | return nullptr; |
@@ -19097,20 +19101,6 @@ Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID, |
19097 | 19101 | /*ReturnType=*/Op0->getType(), CGM.getHLSLRuntime().getCrossIntrinsic(), |
19098 | 19102 | ArrayRef<Value *>{Op0, Op1}, nullptr, "hlsl.cross"); |
19099 | 19103 | } |
19100 | | - case SPIRV::BI__builtin_hlsl_distance: { |
19101 | | - Value *X = EmitScalarExpr(E->getArg(0)); |
19102 | | - Value *Y = EmitScalarExpr(E->getArg(1)); |
19103 | | - assert(E->getArg(0)->getType()->hasFloatingRepresentation() && |
19104 | | - E->getArg(1)->getType()->hasFloatingRepresentation() && |
19105 | | - "Distance operands must have a float representation"); |
19106 | | - assert(E->getArg(0)->getType()->isVectorType() && |
19107 | | - E->getArg(1)->getType()->isVectorType() && |
19108 | | - "Distance operands must be a vector"); |
19109 | | - return Builder.CreateIntrinsic( |
19110 | | - /*ReturnType=*/X->getType()->getScalarType(), |
19111 | | - CGM.getHLSLRuntime().getDistanceIntrinsic(), ArrayRef<Value *>{X, Y}, |
19112 | | - nullptr, "hlsl.distance"); |
19113 | | - } |
19114 | 19104 | case Builtin::BI__builtin_hlsl_dot: { |
19115 | 19105 | Value *Op0 = EmitScalarExpr(E->getArg(0)); |
19116 | 19106 | Value *Op1 = EmitScalarExpr(E->getArg(1)); |
@@ -19188,17 +19178,6 @@ Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID, |
19188 | 19178 | /*ReturnType=*/X->getType(), CGM.getHLSLRuntime().getLerpIntrinsic(), |
19189 | 19179 | ArrayRef<Value *>{X, Y, S}, nullptr, "hlsl.lerp"); |
19190 | 19180 | } |
19191 | | - case SPIRV::BI__builtin_hlsl_length: { |
19192 | | - Value *X = EmitScalarExpr(E->getArg(0)); |
19193 | | - assert(E->getArg(0)->getType()->hasFloatingRepresentation() && |
19194 | | - "length operand must have a float representation"); |
19195 | | - assert(E->getArg(0)->getType()->isVectorType() && |
19196 | | - "length operand must be a vector"); |
19197 | | - return Builder.CreateIntrinsic( |
19198 | | - /*ReturnType=*/X->getType()->getScalarType(), |
19199 | | - CGM.getHLSLRuntime().getLengthIntrinsic(), ArrayRef<Value *>{X}, |
19200 | | - nullptr, "hlsl.length"); |
19201 | | - } |
19202 | 19181 | case Builtin::BI__builtin_hlsl_normalize: { |
19203 | 19182 | Value *X = EmitScalarExpr(E->getArg(0)); |
19204 | 19183 |
|
@@ -19483,6 +19462,36 @@ void CodeGenFunction::AddAMDGPUFenceAddressSpaceMMRA(llvm::Instruction *Inst, |
19483 | 19462 | Inst->setMetadata(LLVMContext::MD_mmra, MMRAMetadata::getMD(Ctx, MMRAs)); |
19484 | 19463 | } |
19485 | 19464 |
|
| 19465 | +Value *CodeGenFunction::EmitSPIRVBuiltinExpr(unsigned BuiltinID, |
| 19466 | + const CallExpr *E) { |
| 19467 | + switch (BuiltinID) { |
| 19468 | + case SPIRV::BI__builtin_spirv_distance: { |
| 19469 | + Value *X = EmitScalarExpr(E->getArg(0)); |
| 19470 | + Value *Y = EmitScalarExpr(E->getArg(1)); |
| 19471 | + assert(E->getArg(0)->getType()->hasFloatingRepresentation() && |
| 19472 | + E->getArg(1)->getType()->hasFloatingRepresentation() && |
| 19473 | + "Distance operands must have a float representation"); |
| 19474 | + assert(E->getArg(0)->getType()->isVectorType() && |
| 19475 | + E->getArg(1)->getType()->isVectorType() && |
| 19476 | + "Distance operands must be a vector"); |
| 19477 | + return Builder.CreateIntrinsic( |
| 19478 | + /*ReturnType=*/X->getType()->getScalarType(), Intrinsic::spv_distance, |
| 19479 | + ArrayRef<Value *>{X, Y}, nullptr, "hlsl.distance"); |
| 19480 | + } |
| 19481 | + case SPIRV::BI__builtin_spirv_length: { |
| 19482 | + Value *X = EmitScalarExpr(E->getArg(0)); |
| 19483 | + assert(E->getArg(0)->getType()->hasFloatingRepresentation() && |
| 19484 | + "length operand must have a float representation"); |
| 19485 | + assert(E->getArg(0)->getType()->isVectorType() && |
| 19486 | + "length operand must be a vector"); |
| 19487 | + return Builder.CreateIntrinsic( |
| 19488 | + /*ReturnType=*/X->getType()->getScalarType(), Intrinsic::spv_length, |
| 19489 | + ArrayRef<Value *>{X}, nullptr, "hlsl.length"); |
| 19490 | + } |
| 19491 | + } |
| 19492 | + return nullptr; |
| 19493 | +} |
| 19494 | + |
19486 | 19495 | Value *CodeGenFunction::EmitAMDGPUBuiltinExpr(unsigned BuiltinID, |
19487 | 19496 | const CallExpr *E) { |
19488 | 19497 | llvm::AtomicOrdering AO = llvm::AtomicOrdering::SequentiallyConsistent; |
|
0 commit comments