Bitwise exclusive-OR and rotate right by immediate
Bitwise exclusive-OR the corresponding elements of the first and second source vectors, then rotate each result element right by an immediate amount. The final results are destructively placed in the corresponding elements of the destination and first source vector. This instruction is unpredicated.
Variants: FEAT_SVE2 || FEAT_SME (FEAT_SVE2 || FEAT_SME)
31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | |||||||||||||||||
tszh | tszl | imm3 | Zm | Zdn |
---|
XAR <Zdn>.<T>, <Zdn>.<T>, <Zm>.<T>, #<const>
if !IsFeatureImplemented(FEAT_SVE2) && !IsFeatureImplemented(FEAT_SME) then EndOfDecode(Decode_UNDEF); constant bits(4) tsize = tszh:tszl; if tsize == '0000' then EndOfDecode(Decode_UNDEF); constant integer esize = 8 << HighestSetBit(tsize); constant integer m = UInt(Zm); constant integer dn = UInt(Zdn); constant integer rot = (2 * esize) - UInt(tsize:imm3);
CheckSVEEnabled(); constant integer VL = CurrentVL; constant integer elements = VL DIV esize; constant bits(VL) operand1 = Z[dn, VL]; constant bits(VL) operand2 = Z[m, VL]; bits(VL) result; for e = 0 to elements-1 constant bits(esize) element1 = Elem[operand1, e, esize]; constant bits(esize) element2 = Elem[operand2, e, esize]; Elem[result, e, esize] = ROR(element1 EOR element2, rot); Z[dn, VL] = result;
If PSTATE.DIT is 1: