PUNPKHI, PUNPKLO

Unpack and widen half of predicate

This instruction unpacks elements from the lowest or highest half of the source predicate and places them in elements of twice their size within the destination predicate. This instruction is unpredicated.

It has encodings from 2 classes: High half and Low half

High half
(FEAT_SVE || FEAT_SME)

313029282726252423222120191817161514131211109876543210
00000101001100010100000Pn0Pd
H

Encoding

PUNPKHI <Pd>.H, <Pn>.B

Decode for this encoding

if !IsFeatureImplemented(FEAT_SVE) && !IsFeatureImplemented(FEAT_SME) then EndOfDecode(Decode_UNDEF); end; let esize : integer{} = 16; let n : integer = UInt(Pn); let d : integer = UInt(Pd); let hi : boolean = TRUE;

Low half
(FEAT_SVE || FEAT_SME)

313029282726252423222120191817161514131211109876543210
00000101001100000100000Pn0Pd
H

Encoding

PUNPKLO <Pd>.H, <Pn>.B

Decode for this encoding

if !IsFeatureImplemented(FEAT_SVE) && !IsFeatureImplemented(FEAT_SME) then EndOfDecode(Decode_UNDEF); end; let esize : integer{} = 16; let n : integer = UInt(Pn); let d : integer = UInt(Pd); let hi : boolean = FALSE;

Assembler Symbols

<Pd>

Is the name of the destination scalable predicate register, encoded in the "Pd" field.

<Pn>

Is the name of the source scalable predicate register, encoded in the "Pn" field.

Operation

CheckSVEEnabled(); let VL : integer{} = CurrentVL(); let PL : integer{} = VL DIV 8; let elements : integer = VL DIV esize; let operand : bits(PL) = P{}(n); var result : bits(PL); let psize : integer{} = esize DIV 8; for e = 0 to elements-1 do let pbit : bit = PredicateElement{PL}(operand, if hi then e + elements else e, esize DIV 2); result[e*:psize] = ZeroExtend{psize}(pbit); end; P{PL}(d) = result;


2026-03_rel 2026-03-26 20:48:11

Copyright © 2010-2026 Arm Limited or its affiliates. All rights reserved. This document is Non-Confidential.