diff options
| author | Yong He <yonghe@outlook.com> | 2024-07-25 15:00:14 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-07-25 15:00:14 -0700 |
| commit | c9d89a40775a055873adf82cfb0ee1cb6bdcb93c (patch) | |
| tree | 2438f353e87b30febe966ca23976793637c018d2 /source/slang/core.meta.slang | |
| parent | 1343ab79fcd0ff9e5ffebbcf95414e51ab19e9cd (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.slang | 95 |
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(); |
