BFMOP4S (non-widening)

BFloat16 quarter-tile outer product, subtracting

This instruction generates four independent quarter-tile BFloat16 outer products from the sub-matrices in the half-vectors of the one or two first and second source vectors and subtracts the results from the corresponding elements of a 16-bit element ZA tile.

Each of the quarter-tile outer products is generated by multiplying the SVLH÷2 × 1 sub-matrix of BFloat16 values held in the half-vectors of the first source vectors by the 1 × SVLH÷2 sub-matrix of BFloat16 values held in the half-vectors of the second source vectors.

The resulting quarter-tile SVLH÷2 × SVLH÷2 BFloat16 outer products are destructively subtracted from the destination ZA tile. This is equivalent to performing a single multiply-subtract from each of the destination tile elements.

This instruction follows SME2 ZA-targeting non-widening BFloat16 numerical behaviors.

This instruction is unpredicated.

It has encodings from 4 classes: Single and multiple vectors , Single vectors , Multiple and single vectors and Multiple vectors

Single and multiple vectors
(FEAT_SME_MOP4 && FEAT_SME_B16B16)

313029282726252423222120191817161514131211109876543210
100000010011Zm00000000Zn01100ZAda
MNS

Encoding

BFMOP4S <ZAda>.H, <Zn>.H, { <Zm1>.H-<Zm2>.H }

Decode for this encoding

if !IsFeatureImplemented(FEAT_SME_MOP4) || !IsFeatureImplemented(FEAT_SME_B16B16) then EndOfDecode(Decode_UNDEF); end; let n : integer = UInt('0'::Zn::'0'); let m : integer = UInt('1'::Zm::'0'); let nreg : integer{} = 1; let mreg : integer = 2; let da : integer = UInt(ZAda); let sub_op : boolean = TRUE;

Single vectors
(FEAT_SME_MOP4 && FEAT_SME_B16B16)

313029282726252423222120191817161514131211109876543210
100000010010Zm00000000Zn01100ZAda
MNS

Encoding

BFMOP4S <ZAda>.H, <Zn>.H, <Zm>.H

Decode for this encoding

if !IsFeatureImplemented(FEAT_SME_MOP4) || !IsFeatureImplemented(FEAT_SME_B16B16) then EndOfDecode(Decode_UNDEF); end; let n : integer = UInt('0'::Zn::'0'); let m : integer = UInt('1'::Zm::'0'); let nreg : integer{} = 1; let mreg : integer = 1; let da : integer = UInt(ZAda); let sub_op : boolean = TRUE;

Multiple and single vectors
(FEAT_SME_MOP4 && FEAT_SME_B16B16)

313029282726252423222120191817161514131211109876543210
100000010010Zm00000001Zn01100ZAda
MNS

Encoding

BFMOP4S <ZAda>.H, { <Zn1>.H-<Zn2>.H }, <Zm>.H

Decode for this encoding

if !IsFeatureImplemented(FEAT_SME_MOP4) || !IsFeatureImplemented(FEAT_SME_B16B16) then EndOfDecode(Decode_UNDEF); end; let n : integer = UInt('0'::Zn::'0'); let m : integer = UInt('1'::Zm::'0'); let nreg : integer{} = 2; let mreg : integer = 1; let da : integer = UInt(ZAda); let sub_op : boolean = TRUE;

Multiple vectors
(FEAT_SME_MOP4 && FEAT_SME_B16B16)

313029282726252423222120191817161514131211109876543210
100000010011Zm00000001Zn01100ZAda
MNS

Encoding

BFMOP4S <ZAda>.H, { <Zn1>.H-<Zn2>.H }, { <Zm1>.H-<Zm2>.H }

Decode for this encoding

if !IsFeatureImplemented(FEAT_SME_MOP4) || !IsFeatureImplemented(FEAT_SME_B16B16) then EndOfDecode(Decode_UNDEF); end; let n : integer = UInt('0'::Zn::'0'); let m : integer = UInt('1'::Zm::'0'); let nreg : integer{} = 2; let mreg : integer = 2; let da : integer = UInt(ZAda); let sub_op : boolean = TRUE;

Assembler Symbols

<ZAda>

Is the name of the ZA tile ZA0-ZA1, encoded in the "ZAda" field.

<Zn>

Is the name of the first source scalable vector register, registers in the range Z0-Z15, encoded as "Zn" times 2.

<Zm1>

Is the name of the first scalable vector register of the second source multi-vector group, in the range Z16-Z31, encoded as "Zm" times 2 plus 16.

<Zm2>

Is the name of the second scalable vector register of the second source multi-vector group, in the range Z16-Z31, encoded as "Zm" times 2 plus 17.

<Zm>

Is the name of the second source scalable vector register, registers in the range Z16-Z31, encoded as "Zm" times 2 plus 16.

<Zn1>

Is the name of the first scalable vector register of the first source multi-vector group, in the range Z0-Z15, encoded as "Zn" times 2.

<Zn2>

Is the name of the second scalable vector register of the first source multi-vector group, in the range Z0-Z15, encoded as "Zn" times 2 plus 1.


2025-09_diff_tag 2025-11-28 16:29:05

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