summaryrefslogtreecommitdiff
path: root/source/slang/core.meta.slang
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2024-07-25 15:00:14 -0700
committerGitHub <noreply@github.com>2024-07-25 15:00:14 -0700
commitc9d89a40775a055873adf82cfb0ee1cb6bdcb93c (patch)
tree2438f353e87b30febe966ca23976793637c018d2 /source/slang/core.meta.slang
parent1343ab79fcd0ff9e5ffebbcf95414e51ab19e9cd (diff)
Overhaul IR lowering of pointer types. (#4710)
* Overhaul IR lowering of pointer types. * Propagate address space in IRBuilder. * Fixup. * Fix. * Fix. * Change how Ptr type is printed to text. * Fix.
Diffstat (limited to 'source/slang/core.meta.slang')
-rw-r--r--source/slang/core.meta.slang95
1 files changed, 49 insertions, 46 deletions
diff --git a/source/slang/core.meta.slang b/source/slang/core.meta.slang
index 45b3435eb..c75d4735b 100644
--- a/source/slang/core.meta.slang
+++ b/source/slang/core.meta.slang
@@ -679,14 +679,14 @@ struct __none_t
{
};
-__generic<T>
+__generic<T, let addrSpace : uint64_t = $( (uint64_t)AddressSpace::UserPointer)ULL>
__magic_type(PtrType)
__intrinsic_type($(kIROp_PtrType))
struct Ptr
{
__generic<U>
__intrinsic_op($(kIROp_BitCast))
- __init(Ptr<U> ptr);
+ __init(Ptr<U, addrSpace> ptr);
__intrinsic_op($(kIROp_CastIntToPtr))
__init(uint64_t val);
@@ -703,53 +703,47 @@ struct Ptr
};
__intrinsic_op($(kIROp_Load))
-T __load<T>(Ptr<T> ptr);
+T __load<T, let addrSpace : uint64_t>(Ptr<T, addrSpace> ptr);
__intrinsic_op($(kIROp_Store))
-void __store<T>(Ptr<T> ptr, T val);
-
-__intrinsic_op($(kIROp_GetElementPtr))
-Ptr<T> __getElementPtr<T>(Ptr<T> ptr, int index);
+void __store<T, let addrSpace : uint64_t>(Ptr<T, addrSpace> ptr, T val);
__intrinsic_op($(kIROp_GetElementPtr))
-Ptr<T> __getElementPtr<T>(Ptr<T> ptr, int64_t index);
+Ptr<T, addrSpace> __getElementPtr<T, let addrSpace : uint64_t, TIndex : __BuiltinIntegerType>(Ptr<T, addrSpace> ptr, TIndex index);
__intrinsic_op($(kIROp_GetOffsetPtr))
-Ptr<T> __getOffsetPtr<T>(Ptr<T> ptr, int index);
+Ptr<T, addrSpace> __getOffsetPtr<T, let addrSpace : uint64_t, TIndex : __BuiltinIntegerType>(Ptr<T, addrSpace> ptr, TIndex index);
-__intrinsic_op($(kIROp_GetOffsetPtr))
-Ptr<T> __getOffsetPtr<T>(Ptr<T> ptr, int64_t index);
-
-__generic<T>
+__generic<T, let addrSpace : uint64_t>
__intrinsic_op($(kIROp_Less))
-bool operator<(Ptr<T> p1, Ptr<T> p2);
+bool operator <(Ptr<T, addrSpace> p1, Ptr<T, addrSpace> p2);
-__generic<T>
+__generic<T, let addrSpace : uint64_t>
__intrinsic_op($(kIROp_Leq))
-bool operator<=(Ptr<T> p1, Ptr<T> p2);
+bool operator <=(Ptr<T, addrSpace> p1, Ptr<T, addrSpace> p2);
-__generic<T>
+__generic<T, let addrSpace : uint64_t>
__intrinsic_op($(kIROp_Greater))
-bool operator>(Ptr<T> p1, Ptr<T> p2);
+bool operator>(Ptr<T, addrSpace> p1, Ptr<T, addrSpace> p2);
-__generic<T>
+__generic<T, let addrSpace : uint64_t>
__intrinsic_op($(kIROp_Geq))
-bool operator>=(Ptr<T> p1, Ptr<T> p2);
+bool operator >=(Ptr<T, addrSpace> p1, Ptr<T, addrSpace> p2);
-__generic<T>
+__generic<T, let addrSpace : uint64_t>
__intrinsic_op($(kIROp_Neq))
-bool operator!=(Ptr<T> p1, Ptr<T> p2);
+bool operator !=(Ptr<T, addrSpace> p1, Ptr<T, addrSpace> p2);
-__generic<T>
+__generic<T, let addrSpace : uint64_t>
__intrinsic_op($(kIROp_Eql))
-bool operator==(Ptr<T> p1, Ptr<T> p2);
+bool operator ==(Ptr<T, addrSpace> p1, Ptr<T, addrSpace> p2);
extension bool : IRangedValue
{
- __generic<T>
+ __generic<T, let addrSpace : uint64_t>
__implicit_conversion($(kConversionCost_PtrToBool))
__intrinsic_op($(kIROp_CastPtrToBool))
- __init(Ptr<T> ptr);
+ __init(Ptr<T, addrSpace> ptr);
__generic<T : __EnumType>
__implicit_conversion($(kConversionCost_IntegerTruncate))
@@ -765,9 +759,9 @@ extension bool : IRangedValue
extension uint64_t : IRangedValue
{
- __generic<T>
+ __generic<T, let addrSpace : uint64_t>
__intrinsic_op($(kIROp_CastPtrToInt))
- __init(Ptr<T> ptr);
+ __init(Ptr<T, addrSpace> ptr);
static const uint64_t maxValue = 0xFFFFFFFFFFFFFFFFULL;
static const uint64_t minValue = 0;
@@ -775,9 +769,9 @@ extension uint64_t : IRangedValue
extension int64_t : IRangedValue
{
- __generic<T>
+ __generic<T, let addrSpace : uint64_t>
__intrinsic_op($(kIROp_CastPtrToInt))
- __init(Ptr<T> ptr);
+ __init(Ptr<T, addrSpace> ptr);
static const int64_t maxValue = 0x7FFFFFFFFFFFFFFFLL;
static const int64_t minValue = -0x8000000000000000LL;
@@ -785,9 +779,9 @@ extension int64_t : IRangedValue
extension intptr_t : IRangedValue
{
- __generic<T>
+ __generic<T, let addrSpace : uint64_t>
__intrinsic_op($(kIROp_CastPtrToInt))
- __init(Ptr<T> ptr);
+ __init(Ptr<T, addrSpace> ptr);
static const intptr_t maxValue = $(SLANG_PROCESSOR_X86_64?"0x7FFFFFFFFFFFFFFFz":"0x7FFFFFFFz");
static const intptr_t minValue = $(SLANG_PROCESSOR_X86_64?"0x8000000000000000z":"0x80000000z");
static const int size = $(SLANG_PROCESSOR_X86_64?"8":"4");
@@ -795,9 +789,9 @@ extension intptr_t : IRangedValue
extension uintptr_t : IRangedValue
{
- __generic<T>
+ __generic<T, let addrSpace : uint64_t>
__intrinsic_op($(kIROp_CastPtrToInt))
- __init(Ptr<T> ptr);
+ __init(Ptr<T, addrSpace> ptr);
static const uintptr_t maxValue = $(SLANG_PROCESSOR_X86_64?"0xFFFFFFFFFFFFFFFFz":"0xFFFFFFFFz");
static const uintptr_t minValue = 0z;
static const int size = $(SLANG_PROCESSOR_X86_64?"8":"4");
@@ -827,6 +821,8 @@ __intrinsic_type($(kIROp_ConstRefType))
struct ConstRef
{};
+typealias __Addr<T> = Ptr<T, $( (uint64_t)AddressSpace::Generic)ULL>;
+
__generic<T>
__magic_type(OptionalType)
__intrinsic_type($(kIROp_OptionalType))
@@ -969,10 +965,10 @@ extension Ptr<void>
[__unsafeForceInlineEarly]
__init(NativeString nativeStr) { this = nativeStr.getBuffer(); }
- __generic<T>
+ __generic<T, let addrSpace : uint64_t>
__intrinsic_op(0)
__implicit_conversion($(kConversionCost_PtrToVoidPtr))
- __init(Ptr<T> ptr);
+ __init(Ptr<T, addrSpace> ptr);
__generic<T>
__intrinsic_op(0)
@@ -1628,21 +1624,28 @@ for (auto op : intrinsicUnaryOps)
}}}}
-__generic<T>
+__generic<T, let addrSpace : uint64_t>
__intrinsic_op(0)
-__prefix Ref<T> operator*(Ptr<T> value);
+[require(cpp_cuda_spirv)]
+__prefix Ref<T> operator*(Ptr<T, addrSpace> value);
__generic<T>
__intrinsic_op(0)
-__prefix Ptr<T> operator&(__ref T value);
+[require(cpp_cuda_spirv)]
+__prefix Ptr<T, $( (uint64_t)AddressSpace::UserPointer)ULL> operator&(__ref T value);
__generic<T>
+__intrinsic_op(0)
+[require(cpp_cuda_spirv)]
+__Addr<T> __get_addr( __ref T value);
+
+__generic<T, let addrSpace : uint64_t>
__intrinsic_op($(kIROp_GetOffsetPtr))
-Ptr<T> operator+(Ptr<T> value, int64_t offset);
+Ptr<T, addrSpace> operator+(Ptr<T, addrSpace> value, int64_t offset);
-__generic<T>
+__generic<T, let addrSpace : uint64_t>
[__unsafeForceInlineEarly]
-Ptr<T> operator-(Ptr<T> value, int64_t offset)
+Ptr<T, addrSpace> operator -(Ptr<T, addrSpace> value, int64_t offset)
{
return __getOffsetPtr(value, -offset);
}
@@ -1707,9 +1710,9 @@ matrix<T,R,C> operator$(op.name)(in out matrix<T,R,C,L> value)
{$(fixity.bodyPrefix) value = value $(op.binOp) T(1); return $(fixity.returnVal); }
$(fixity.qual)
-__generic<T>
+__generic<T, let addrSpace : uint64_t>
[__unsafeForceInlineEarly]
-Ptr<T> operator$(op.name)(in out Ptr<T> value)
+Ptr<T, addrSpace> operator$(op.name)(in out Ptr<T, addrSpace> value)
{$(fixity.bodyPrefix) value = value $(op.binOp) 1; return $(fixity.returnVal); }
${{{{
@@ -2500,8 +2503,8 @@ __intrinsic_op($(kIROp_TreatAsDynamicUniform))
T asDynamicUniform<T>(T v);
__generic<T>
-__intrinsic_op($(kIROp_GetLegalizedSPIRVGlobalParamAddr))
-Ptr<T> __getLegalizedSPIRVGlobalParamAddr(T val);
+__intrinsic_op( $(kIROp_GetLegalizedSPIRVGlobalParamAddr))
+__Addr<T> __getLegalizedSPIRVGlobalParamAddr(T val);
__intrinsic_op($(kIROp_RequireComputeDerivative))
void __requireComputeDerivative();