This change implements: #70072 - `hlsl_intrinsics.h` - add the `exp` api - `DXIL.td` - add the llvm intrinsic to DXIL opcode lowering mapping. - This change reuses llvm's existing intrinsic `__builtin_elementwise_exp` \ `int_exp` & `__builtin_elementwise_exp2` \ `int_exp2` - This PR is part 1 of 2. - Part 2 requires an intrinsic to instructions lowering. Part2 will expand `int_exp` to ``` A = Builder.CreateFMul(log2eConst, val); int_exp2(A) ``` just like we do in [TranslateExp](https://github.com/microsoft/DirectXShaderCompiler/blob/main/lib/HLSL/HLOperationLower.cpp#L2220C1-L2236C2)
32 lines
1.1 KiB
LLVM
32 lines
1.1 KiB
LLVM
; RUN: opt -S -dxil-op-lower < %s | FileCheck %s
|
|
|
|
; Make sure dxil operation function calls for exp2 are generated for float and half.
|
|
; CHECK:call float @dx.op.unary.f32(i32 21, float %{{.*}})
|
|
; CHECK:call half @dx.op.unary.f16(i32 21, half %{{.*}})
|
|
|
|
target datalayout = "e-m:e-p:32:32-i1:32-i8:8-i16:16-i32:32-i64:64-f16:16-f32:32-f64:64-n8:16:32:64"
|
|
target triple = "dxil-pc-shadermodel6.7-library"
|
|
|
|
; Function Attrs: noinline nounwind optnone
|
|
define noundef float @exp2_float(float noundef %a) #0 {
|
|
entry:
|
|
%a.addr = alloca float, align 4
|
|
store float %a, ptr %a.addr, align 4
|
|
%0 = load float, ptr %a.addr, align 4
|
|
%elt.exp2 = call float @llvm.exp2.f32(float %0)
|
|
ret float %elt.exp2
|
|
}
|
|
|
|
; Function Attrs: nocallback nofree nosync nounwind readnone speculatable willreturn
|
|
declare float @llvm.exp2.f32(float) #1
|
|
|
|
; Function Attrs: noinline nounwind optnone
|
|
define noundef half @exp2_half(half noundef %a) #0 {
|
|
entry:
|
|
%a.addr = alloca half, align 2
|
|
store half %a, ptr %a.addr, align 2
|
|
%0 = load half, ptr %a.addr, align 2
|
|
%elt.exp2 = call half @llvm.exp2.f16(half %0)
|
|
ret half %elt.exp2
|
|
}
|