Implement an abstraction to specify precise overload types supported by DXIL ops. These overload types are typically a subset of LLVM intrinsics. Implement the corresponding changes in DXILEmitter backend. Add tests to verify expected errors for unsupported overload types at code generation time. Add tests to check for correct overload error output.
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 frac are generated for float and half.
|
|
; CHECK:call float @dx.op.unary.f32(i32 22, float %{{.*}})
|
|
; CHECK:call half @dx.op.unary.f16(i32 22, 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 @frac_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
|
|
%dx.frac = call float @llvm.dx.frac.f32(float %0)
|
|
ret float %dx.frac
|
|
}
|
|
|
|
; Function Attrs: nocallback nofree nosync nounwind readnone speculatable willreturn
|
|
declare float @llvm.dx.frac.f32(float) #1
|
|
|
|
; Function Attrs: noinline nounwind optnone
|
|
define noundef half @frac_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
|
|
%dx.frac = call half @llvm.dx.frac.f16(half %0)
|
|
ret half %dx.frac
|
|
}
|