================ @@ -267,45 +267,38 @@ Examples: @llvm.dx.handle.fromHeap.tdx.RawBuffer_v4f32_1_0( i32 2, i1 false) -Buffer Loads and Stores ------------------------ - -*relevant types: Buffers* - -We need to treat buffer loads and stores from "dx.TypedBuffer" and -"dx.RawBuffer" separately. For TypedBuffer, we have ``llvm.dx.typedBufferLoad`` -and ``llvm.dx.typedBufferStore``, which load and store 16-byte "rows" of data -via a simple index. For RawBuffer, we have ``llvm.dx.rawBufferPtr``, which -return a pointer that can be indexed, loaded, and stored to as needed. - -The typed load and store operations always operate on exactly 16 bytes of data, -so there are only a few valid overloads. For types that are 32-bits or smaller, -we operate on 4-element vectors, such as ``<4 x i32>``, ``<4 x float>``, or -``<4 x half>``. Note that in 16-bit cases each 16-bit value occupies 32-bits of -storage. For 64-bit types we operate on 2-element vectors - ``<2 x double>`` or -``<2 x i64>``. When a type like `Buffer<float>` is used at the HLSL level, it -is expected that this will operate on a single float in each 16 byte row - that -is, a load would use the ``<4 x float>`` variant and then extract the first -element. - -.. note:: In DXC, trying to operate on a ``Buffer<double4>`` crashes the - compiler. We should probably just reject this in the frontend. - -The TypedBuffer intrinsics are lowered to the `bufferLoad`_ and `bufferStore`_ -operations, and the operations on the memory accessed by RawBufferPtr are -lowered to `rawBufferLoad`_ and `rawBufferStore`_. Note that if we want to -support DXIL versions prior to 1.2 we'll need to lower the RawBuffer loads and -stores to the non-raw operations as well. - -.. note:: TODO: We need to account for `CheckAccessFullyMapped`_ here. - - In DXIL the load operations always return an ``i32`` status value, but this - isn't very ergonomic when it isn't used. We can (1) bite the bullet and have - the loads return `{%ret_type, %i32}` all the time, (2) create a variant or - update the signature iff the status is used, or (3) hide this in a sideband - channel somewhere. I'm leaning towards (2), but could probably be convinced - that the ugliness of (1) is worth the simplicity. - +16-byte Loads, Samples, and Gathers +----------------------------------- + +*relevant types: TypedBuffer, CBuffer, and Textures* + +TypedBuffer, CBuffer, and Texture loads, as well as samples and gathers, can +return 1 to 4 elements from the given resource, to a maximum of 16 bytes of +data. DXIL's modeling of this is influenced by DirectX and DXBC's history and +it generally treats these operations as returning 4 32-bit values. For 16-bit +elements the values are 16-bit values, and for 64-bit values the operations +return 4 32-bit integers and combine them with further operations. ---------------- bogner wrote:
Updated to say that it emits code to construct a double https://github.com/llvm/llvm-project/pull/104252 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits