(no commit message)
[libreriscv.git] / simple_v_extension / specification / ld.x.mdwn
1 [[!tag oldstandards]]
2
3 # LD.X and LD.Swizzle
4
5 See <http://bugs.libre-riscv.org/show_bug.cgi?id=139>
6
7 SV is based on vectorisation of scalar opcodes. LD and ST from scalar RISCV can be extended by either rd or rs1 being vectorised, however a third "immediate element strided" multiples do not fit.
8
9 In addition, Vulkan requires swizzled LD/ST covering:
10
11 * identity (no swizzle)
12 * constant 0
13 * 1 or 1.0 depending on Op type
14 * x, y, z, or w.
15
16 See <https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkComponentSwizzle.html>
17
18 Note that the swizzle has to be on selecting the src that will go into a sequentially indexed dest:
19
20 for i in range(4):
21 srcidx = swizzle[i]
22 srcaddr = base + srcidx * elwidth
23 regs[rd+i] = mem[srcaddr]
24
25 Swizzling on the dest would not work because xxyz would try to set the same dest twice.