ld4d
Load 4-element Structure (Double)
Pseudocode Operation
No pseudocode available.
Encoding
Related
More in SVE
Reference
Instruction Forms
| Encoding | Instruction | ISA | Bit pattern | ||
|---|---|---|---|---|---|
| 0xA5E0E000 | LD4D { <Zt1>.D, <Zt2>.D, <Zt3>.D, <Zt4>.D }, <Pg>/Z, [<Xn|SP>{, #<imm>, MUL VL}] | A64 | 1010010 | 1 | 1 | 11 | 0 | imm4 | 111 | Pg | Rn | Zt | ||
| 0xA5E0C000 | LD4D { <Zt1>.D, <Zt2>.D, <Zt3>.D, <Zt4>.D }, <Pg>/Z, [<Xn|SP>, <Xm>, LSL #3] | A64 | 1010010 | 1 | 1 | 11 | Rm | 110 | Pg | Rn | Zt |
Description
Contiguous load four-doubleword structures, each to the same element number in four vector registers from the memory address generated by a 64-bit scalar base and an immediate index which is a multiple of 4 in the range -32 to 28 that is multiplied by the vector's in-memory size, irrespective of predication, Each predicate element applies to the same element number in each of the four vector registers, or equivalently to the four consecutive doublewords in memory which make up each structure. Inactive elements will not cause a read from Device memory or signal a fault, and the corresponding element is set to zero in each of the four destination vector registers.
Operation
CheckSVEEnabled();
constant integer VL = CurrentVL;
constant integer PL = VL DIV 8;
constant integer elements = VL DIV esize;
bits(64) base;
bits(PL) mask = P[g, PL];
constant integer mbytes = esize DIV 8;
array [0..3] of bits(VL) values;
boolean contiguous = TRUE;
boolean nontemporal = FALSE;
boolean tagchecked = n != 31;
AccessDescriptor accdesc = CreateAccDescSVE(MemOp_LOAD, nontemporal, contiguous, tagchecked);
if !AnyActiveElement(mask, esize) then
if n == 31 && ConstrainUnpredictableBool(Unpredictable_CHECKSPNONEACTIVE) then
CheckSPAlignment();
else
if n == 31 then CheckSPAlignment();
base = if n == 31 then SP[] else X[n, 64];
for e = 0 to elements-1
for r = 0 to nreg-1
if ActivePredicateElement(mask, e, esize) then
integer eoff = (offset * elements * nreg) + (e * nreg) + r;
bits(64) addr = GenerateAddress(base, eoff * mbytes, accdesc);
Elem[values[r], e, esize] = Mem[addr, mbytes, accdesc];
else
Elem[values[r], e, esize] = Zeros(esize);
for r = 0 to nreg-1
Z[(t+r) MOD 32, VL] = values[r];