Skip to content

Commit 16a0216

Browse files
implementing __hlsl_bit_cast_32
1 parent 529c8dc commit 16a0216

File tree

6 files changed

+54
-51
lines changed

6 files changed

+54
-51
lines changed

clang/include/clang/Basic/Builtins.td

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,6 @@ class MSInt32_64Template : Template<["msint32_t", "int64_t"],
5353
class FloatDoubleTemplate : Template<["float", "double"],
5454
["f", ""]>;
5555

56-
class HLSLFloatAndIntTemplate : Template<
57-
["unsigned int", "int", "float"],
58-
["", "si", "f"]>;
5956
// FIXME: These assume that char -> i8, short -> i16, int -> i32,
6057
// long long -> i64.
6158
class SyncBuiltinsTemplate :
@@ -4754,12 +4751,6 @@ def HLSLRcp : LangBuiltin<"HLSL_LANG"> {
47544751
let Prototype = "void(...)";
47554752
}
47564753

4757-
def HLSLAsUint : LangBuiltin<"HLSL_LANG">, HLSLFloatAndIntTemplate {
4758-
let Spellings = ["__builtin_hlsl_elementwise_asuint"];
4759-
let Attributes = [NoThrow, Const];
4760-
let Prototype = "unsigned int (T)";
4761-
}
4762-
47634754
def HLSLRSqrt : LangBuiltin<"HLSL_LANG"> {
47644755
let Spellings = ["__builtin_hlsl_elementwise_rsqrt"];
47654756
let Attributes = [NoThrow, Const];
@@ -4772,6 +4763,12 @@ def HLSLSaturate : LangBuiltin<"HLSL_LANG"> {
47724763
let Prototype = "void(...)";
47734764
}
47744765

4766+
def HLSLBitCast32 : LangBuiltin<"HLSL_LANG"> {
4767+
let Spellings = ["__builtin_hlsl_bit_cast_32"];
4768+
let Attributes = [NoThrow, Const];
4769+
let Prototype = "void(...)";
4770+
}
4771+
47754772
def HLSLSelect : LangBuiltin<"HLSL_LANG"> {
47764773
let Spellings = ["__builtin_hlsl_select"];
47774774
let Attributes = [NoThrow, Const];

clang/lib/CodeGen/CGBuiltin.cpp

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18866,10 +18866,20 @@ case Builtin::BI__builtin_hlsl_elementwise_isinf: {
1886618866
llvm::FunctionType::get(IntTy, {}, false), "__hlsl_wave_get_lane_index",
1886718867
{}, false, true));
1886818868
}
18869-
case Builtin::BI__builtin_hlsl_elementwise_asuint: {
18869+
case Builtin::BI__builtin_hlsl_wave_is_first_lane: {
18870+
Intrinsic::ID ID = CGM.getHLSLRuntime().getWaveIsFirstLaneIntrinsic();
18871+
return EmitRuntimeCall(Intrinsic::getDeclaration(&CGM.getModule(), ID));
18872+
}
18873+
case Builtin::BI__builtin_hlsl_bit_cast_32: {
1887018874
Value *Op = EmitScalarExpr(E->getArg(0));
1887118875

18872-
llvm::Type *DestTy = llvm::Type::getInt32Ty(this->getLLVMContext());
18876+
llvm::Type *DestTy = ConvertType(E->getCallReturnType(getContext()));
18877+
18878+
if (DestTy->isVectorTy()) {
18879+
const VectorType *VecTy =
18880+
E->getCallReturnType(getContext())->getAs<VectorType>();
18881+
DestTy = ConvertType(VecTy->getElementType());
18882+
}
1887318883

1887418884
if (Op->getType()->isVectorTy()) {
1887518885
const VectorType *VecTy = E->getArg(0)->getType()->getAs<VectorType>();
@@ -18879,10 +18889,6 @@ case Builtin::BI__builtin_hlsl_elementwise_isinf: {
1887918889

1888018890
return Builder.CreateBitCast(Op, DestTy);
1888118891
}
18882-
case Builtin::BI__builtin_hlsl_wave_is_first_lane: {
18883-
Intrinsic::ID ID = CGM.getHLSLRuntime().getWaveIsFirstLaneIntrinsic();
18884-
return EmitRuntimeCall(Intrinsic::getDeclaration(&CGM.getModule(), ID));
18885-
}
1888618892
case Builtin::BI__builtin_hlsl_elementwise_sign: {
1888718893
Value *Op0 = EmitScalarExpr(E->getArg(0));
1888818894
llvm::Type *Xty = Op0->getType();

clang/lib/Headers/hlsl/hlsl_intrinsics.h

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -395,32 +395,32 @@ float4 asin(float4);
395395
/// \brief Interprets the bit pattern of x as an unsigned integer.
396396
/// \param Val The input value.
397397

398-
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_asuint)
399-
uint asuint(float);
400-
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_asuint)
401-
uint2 asuint(float2);
402-
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_asuint)
403-
uint3 asuint(float3);
404-
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_asuint)
405-
uint4 asuint(float4);
398+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_bit_cast_32)
399+
uint asuint(int);
400+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_bit_cast_32)
401+
uint2 asuint(int2);
402+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_bit_cast_32)
403+
uint3 asuint(int3);
404+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_bit_cast_32)
405+
uint4 asuint(int4);
406406

407-
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_asuint)
407+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_bit_cast_32)
408408
uint asuint(uint);
409-
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_asuint)
409+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_bit_cast_32)
410410
uint2 asuint(uint2);
411-
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_asuint)
411+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_bit_cast_32)
412412
uint3 asuint(uint3);
413-
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_asuint)
413+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_bit_cast_32)
414414
uint4 asuint(uint4);
415415

416-
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_asuint)
417-
uint asuint(int);
418-
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_asuint)
419-
uint2 asuint(int2);
420-
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_asuint)
421-
uint3 asuint(int3);
422-
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_asuint)
423-
uint4 asuint(int4);
416+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_bit_cast_32)
417+
uint asuint(float);
418+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_bit_cast_32)
419+
uint2 asuint(float2);
420+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_bit_cast_32)
421+
uint3 asuint(float3);
422+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_bit_cast_32)
423+
uint4 asuint(float4);
424424

425425
//===----------------------------------------------------------------------===//
426426
// atan builtins

clang/lib/Sema/SemaHLSL.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
//===----------------------------------------------------------------------===//
1010

1111
#include "clang/Sema/SemaHLSL.h"
12+
#include "clang/AST/ASTContext.h"
1213
#include "clang/AST/Decl.h"
1314
#include "clang/AST/DeclBase.h"
1415
#include "clang/AST/DeclCXX.h"
@@ -1765,13 +1766,12 @@ bool SemaHLSL::CheckBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) {
17651766
return true;
17661767
break;
17671768
}
1768-
case Builtin::BI__builtin_hlsl_elementwise_asuint: {
1769+
case Builtin::BI__builtin_hlsl_bit_cast_32: {
17691770
if (SemaRef.checkArgCount(TheCall, 1))
17701771
return true;
17711772

17721773
if (CheckNotFloatAndInt(&SemaRef, TheCall))
17731774
return true;
1774-
17751775
break;
17761776
}
17771777
case Builtin::BI__builtin_elementwise_acos:

clang/test/CodeGenHLSL/builtins/asuint.hlsl

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,39 +3,39 @@
33
// CHECK: define {{.*}}test_uint{{.*}}(i32 {{.*}} [[VAL:%.*]]){{.*}}
44
// CHECK-NOT: bitcast
55
// CHECK: ret i32 [[VAL]]
6-
export uint test_uint(uint p0) {
6+
uint test_uint(uint p0) {
77
return asuint(p0);
88
}
99

1010
// CHECK: define {{.*}}test_int{{.*}}(i32 {{.*}} [[VAL:%.*]]){{.*}}
1111
// CHECK-NOT: bitcast
1212
// CHECK: ret i32 [[VAL]]
13-
export uint test_int(int p0) {
13+
uint test_int(int p0) {
1414
return asuint(p0);
1515
}
1616

1717
// CHECK: define {{.*}}test_float{{.*}}(float {{.*}} [[VAL:%.*]]){{.*}}
1818
// CHECK: bitcast float [[VAL]] to i32
19-
export uint test_float(float p0) {
19+
uint test_float(float p0) {
2020
return asuint(p0);
2121
}
2222

2323
// CHECK: define {{.*}}test_vector_uint{{.*}}(<4 x i32> {{.*}} [[VAL:%.*]]){{.*}}
2424
// CHECK-NOT: bitcast
2525
// CHECK: ret <4 x i32> [[VAL]]
26-
export uint4 test_vector_uint(uint4 p0) {
26+
uint4 test_vector_uint(uint4 p0) {
2727
return asuint(p0);
2828
}
2929

3030
// CHECK: define {{.*}}test_vector_int{{.*}}(<4 x i32> {{.*}} [[VAL:%.*]]){{.*}}
3131
// CHECK-NOT: bitcast
3232
// CHECK: ret <4 x i32> [[VAL]]
33-
export uint4 test_vector_int(int4 p0) {
33+
uint4 test_vector_int(int4 p0) {
3434
return asuint(p0);
3535
}
3636

3737
// CHECK: define {{.*}}test_vector_float{{.*}}(<4 x float> {{.*}} [[VAL:%.*]]){{.*}}
3838
// CHECK: bitcast <4 x float> [[VAL]] to <4 x i32>
39-
export uint4 test_vector_float(float4 p0) {
39+
uint4 test_vector_float(float4 p0) {
4040
return asuint(p0);
4141
}
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
// RUN: %clang_cc1 -finclude-default-header -triple dxil-pc-shadermodel6.6-library %s -fnative-half-type -emit-llvm-only -disable-llvm-passes -verify -verify-ignore-unexpected
22

33

4-
export uint4 test_asuint_too_many_arg(float p0, float p1) {
5-
return __builtin_hlsl_elementwise_asuint(p0, p1);
4+
uint4 test_asuint_too_many_arg(float p0, float p1) {
5+
return __builtin_hlsl_bit_cast_32(p0, p1);
66
// expected-error@-1 {{too many arguments to function call, expected 1, have 2}}
77
}
88

9-
10-
export uint fn(double p1) {
11-
return asuint(p1);
9+
uint test_asuint_double(double p1) {
10+
return __builtin_hlsl_bit_cast_32(p1);
1211
// expected-error@-1 {{passing 'double' to parameter of incompatible type 'float'}}
1312
}
1413

15-
export uint fn(half p1) {
16-
return asuint(p1);
17-
// expected-error@-1 {{passing 'half' to parameter of incompatible type 'float'}}
14+
15+
uint test_asuint_half(half p1) {
16+
return __builtin_hlsl_bit_cast_32(p1);
17+
// expected-error@-1 {{passing 'double' to parameter of incompatible type 'float'}}
1818
}

0 commit comments

Comments
 (0)