CN1117316C - 采用多个向量寄存器组的单指令多数据处理方法及其装置 - Google Patents
采用多个向量寄存器组的单指令多数据处理方法及其装置 Download PDFInfo
- Publication number
- CN1117316C CN1117316C CN97117403A CN97117403A CN1117316C CN 1117316 C CN1117316 C CN 1117316C CN 97117403 A CN97117403 A CN 97117403A CN 97117403 A CN97117403 A CN 97117403A CN 1117316 C CN1117316 C CN 1117316C
- Authority
- CN
- China
- Prior art keywords
- vector
- register
- instruction
- processor
- group
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Lifetime
Links
- 239000013598 vector Substances 0.000 title claims abstract description 510
- 238000012545 processing Methods 0.000 title claims description 16
- 238000003860 storage Methods 0.000 claims description 49
- 238000000034 method Methods 0.000 claims description 37
- 230000008569 process Effects 0.000 claims description 21
- 230000015572 biosynthetic process Effects 0.000 claims description 4
- 238000004364 calculation method Methods 0.000 abstract description 2
- 239000008186 active pharmaceutical agent Substances 0.000 description 81
- 239000000872 buffer Substances 0.000 description 65
- 238000007667 floating Methods 0.000 description 39
- 230000000295 complement effect Effects 0.000 description 30
- 230000008859 change Effects 0.000 description 22
- 238000012546 transfer Methods 0.000 description 21
- 230000008901 benefit Effects 0.000 description 15
- 238000006243 chemical reaction Methods 0.000 description 15
- 238000010586 diagram Methods 0.000 description 14
- 230000008878 coupling Effects 0.000 description 13
- 238000010168 coupling process Methods 0.000 description 13
- 238000005859 coupling reaction Methods 0.000 description 13
- 229920006395 saturated elastomer Polymers 0.000 description 12
- 230000006870 function Effects 0.000 description 11
- 230000000694 effects Effects 0.000 description 10
- BVRIUXYMUSKBHG-UHFFFAOYSA-N 4-[[4-(dimethylamino)phenyl]diazenyl]aniline Chemical compound C1=CC(N(C)C)=CC=C1N=NC1=CC=C(N)C=C1 BVRIUXYMUSKBHG-UHFFFAOYSA-N 0.000 description 9
- 230000002547 anomalous effect Effects 0.000 description 9
- 230000033228 biological regulation Effects 0.000 description 9
- 125000004122 cyclic group Chemical group 0.000 description 9
- 238000012216 screening Methods 0.000 description 9
- 230000005540 biological transmission Effects 0.000 description 7
- 238000013507 mapping Methods 0.000 description 7
- 101000641224 Homo sapiens Vimentin-type intermediate filament-associated coiled-coil protein Proteins 0.000 description 6
- 102100034331 Vimentin-type intermediate filament-associated coiled-coil protein Human genes 0.000 description 6
- 238000006073 displacement reaction Methods 0.000 description 6
- 230000000717 retained effect Effects 0.000 description 6
- 230000000903 blocking effect Effects 0.000 description 5
- 239000013256 coordination polymer Substances 0.000 description 5
- 239000000284 extract Substances 0.000 description 5
- 238000003825 pressing Methods 0.000 description 5
- 230000001360 synchronised effect Effects 0.000 description 5
- 230000004048 modification Effects 0.000 description 4
- 238000012986 modification Methods 0.000 description 4
- GOLXNESZZPUPJE-UHFFFAOYSA-N spiromesifen Chemical compound CC1=CC(C)=CC(C)=C1C(C(O1)=O)=C(OC(=O)CC(C)(C)C)C11CCCC1 GOLXNESZZPUPJE-UHFFFAOYSA-N 0.000 description 4
- 101100243442 Arabidopsis thaliana PER4 gene Proteins 0.000 description 3
- 101100189940 Arabidopsis thaliana PER5 gene Proteins 0.000 description 3
- 101100463459 Arabidopsis thaliana PER6 gene Proteins 0.000 description 3
- 101000579484 Homo sapiens Period circadian protein homolog 1 Proteins 0.000 description 3
- 101001073216 Homo sapiens Period circadian protein homolog 2 Proteins 0.000 description 3
- 101000601274 Homo sapiens Period circadian protein homolog 3 Proteins 0.000 description 3
- 101001126582 Homo sapiens Post-GPI attachment to proteins factor 3 Proteins 0.000 description 3
- 101100519625 Komagataella pastoris PEX2 gene Proteins 0.000 description 3
- 102100028293 Period circadian protein homolog 1 Human genes 0.000 description 3
- 102100035787 Period circadian protein homolog 2 Human genes 0.000 description 3
- 102100037630 Period circadian protein homolog 3 Human genes 0.000 description 3
- 101100178280 Rattus norvegicus Homer1 gene Proteins 0.000 description 3
- 230000002159 abnormal effect Effects 0.000 description 3
- 238000001514 detection method Methods 0.000 description 3
- 230000013011 mating Effects 0.000 description 3
- 238000012360 testing method Methods 0.000 description 3
- 101100136148 Arabidopsis thaliana PER11 gene Proteins 0.000 description 2
- 101100136149 Arabidopsis thaliana PER12 gene Proteins 0.000 description 2
- 101100136150 Arabidopsis thaliana PER13 gene Proteins 0.000 description 2
- 101100136151 Arabidopsis thaliana PER14 gene Proteins 0.000 description 2
- 101100136152 Arabidopsis thaliana PER15 gene Proteins 0.000 description 2
- 101100463465 Arabidopsis thaliana PER7 gene Proteins 0.000 description 2
- 101100463466 Arabidopsis thaliana PER8 gene Proteins 0.000 description 2
- 101100519531 Arabidopsis thaliana PER9 gene Proteins 0.000 description 2
- 101001126533 Arabidopsis thaliana Peroxisome biogenesis factor 10 Proteins 0.000 description 2
- 101100478290 Arabidopsis thaliana SR30 gene Proteins 0.000 description 2
- 101100407810 Pichia angusta PEX10 gene Proteins 0.000 description 2
- 101100297149 Pichia angusta PEX3 gene Proteins 0.000 description 2
- 240000001987 Pyrus communis Species 0.000 description 2
- 101100212791 Saccharomyces cerevisiae (strain ATCC 204508 / S288c) YBL068W-A gene Proteins 0.000 description 2
- 101100160255 Saccharomyces cerevisiae (strain ATCC 204508 / S288c) YLR154C-H gene Proteins 0.000 description 2
- 238000005266 casting Methods 0.000 description 2
- 238000009826 distribution Methods 0.000 description 2
- 230000001343 mnemonic effect Effects 0.000 description 2
- UOTMYNBWXDUBNX-UHFFFAOYSA-N 1-[(3,4-dimethoxyphenyl)methyl]-6,7-dimethoxyisoquinolin-2-ium;chloride Chemical compound Cl.C1=C(OC)C(OC)=CC=C1CC1=NC=CC2=CC(OC)=C(OC)C=C12 UOTMYNBWXDUBNX-UHFFFAOYSA-N 0.000 description 1
- 101100298412 Arabidopsis thaliana PCMP-H73 gene Proteins 0.000 description 1
- 101100365087 Arabidopsis thaliana SCRA gene Proteins 0.000 description 1
- 241000776471 DPANN group Species 0.000 description 1
- 102100030148 Integrator complex subunit 8 Human genes 0.000 description 1
- 101710092891 Integrator complex subunit 8 Proteins 0.000 description 1
- 102100030206 Integrator complex subunit 9 Human genes 0.000 description 1
- 101710092893 Integrator complex subunit 9 Proteins 0.000 description 1
- 101001074199 Rattus norvegicus Glycerol kinase Proteins 0.000 description 1
- 101100438139 Vulpes vulpes CABYR gene Proteins 0.000 description 1
- 230000005856 abnormality Effects 0.000 description 1
- 238000009825 accumulation Methods 0.000 description 1
- IFLVGRRVGPXYON-UHFFFAOYSA-N adci Chemical compound C12=CC=CC=C2C2(C(=O)N)C3=CC=CC=C3CC1N2 IFLVGRRVGPXYON-UHFFFAOYSA-N 0.000 description 1
- 230000003466 anti-cipated effect Effects 0.000 description 1
- 239000007795 chemical reaction product Substances 0.000 description 1
- 238000004891 communication Methods 0.000 description 1
- 230000003111 delayed effect Effects 0.000 description 1
- 238000002405 diagnostic procedure Methods 0.000 description 1
- 230000004069 differentiation Effects 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 238000002040 inelastic incoherent neutron scattering Methods 0.000 description 1
- 230000014759 maintenance of location Effects 0.000 description 1
- 239000003550 marker Substances 0.000 description 1
- 230000000873 masking effect Effects 0.000 description 1
- 239000000203 mixture Substances 0.000 description 1
- NRBNGHCYDWUVLC-UHFFFAOYSA-N mtep Chemical compound S1C(C)=NC(C#CC=2C=NC=CC=2)=C1 NRBNGHCYDWUVLC-UHFFFAOYSA-N 0.000 description 1
- 238000011022 operating instruction Methods 0.000 description 1
- 230000008520 organization Effects 0.000 description 1
- 238000012856 packing Methods 0.000 description 1
- 101150096366 pep7 gene Proteins 0.000 description 1
- 238000004321 preservation Methods 0.000 description 1
- 239000000047 product Substances 0.000 description 1
- 230000003252 repetitive effect Effects 0.000 description 1
- 238000000926 separation method Methods 0.000 description 1
- 238000004088 simulation Methods 0.000 description 1
- 101150116173 ver-1 gene Proteins 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F15/00—Digital computers in general; Data processing equipment in general
- G06F15/16—Combinations of two or more digital computers each having at least an arithmetic unit, a program unit and a register, e.g. for a simultaneous processing of several programs
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30003—Arrangements for executing specific machine instructions
- G06F9/30007—Arrangements for executing specific machine instructions to perform operations on data operands
- G06F9/30025—Format conversion instructions, e.g. Floating-Point to Integer, decimal conversion
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F15/00—Digital computers in general; Data processing equipment in general
- G06F15/76—Architectures of general purpose stored program computers
- G06F15/80—Architectures of general purpose stored program computers comprising an array of processing units with common control, e.g. single instruction multiple data processors
- G06F15/8053—Vector processors
- G06F15/8076—Details on data register access
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30003—Arrangements for executing specific machine instructions
- G06F9/30007—Arrangements for executing specific machine instructions to perform operations on data operands
- G06F9/30036—Instructions to perform operations on packed data, e.g. vector, tile or matrix operations
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30098—Register arrangements
- G06F9/30105—Register structure
- G06F9/30109—Register structure having multiple operands in a single register
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30098—Register arrangements
- G06F9/30105—Register structure
- G06F9/30112—Register structure comprising data of variable length
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30098—Register arrangements
- G06F9/3012—Organisation of register space, e.g. banked or distributed register file
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30098—Register arrangements
- G06F9/3012—Organisation of register space, e.g. banked or distributed register file
- G06F9/3013—Organisation of register space, e.g. banked or distributed register file according to data content, e.g. floating-point registers, address registers
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30145—Instruction analysis, e.g. decoding, instruction word fields
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30145—Instruction analysis, e.g. decoding, instruction word fields
- G06F9/3016—Decoding the operand specifier, e.g. specifier format
- G06F9/30167—Decoding the operand specifier, e.g. specifier format of immediate specifier, e.g. constants
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30181—Instruction operation extension or modification
- G06F9/30189—Instruction operation extension or modification according to execution mode, e.g. mode flag
Abstract
一种具有合适价格、高计算能力、及熟悉的编程环境的多媒体信号处理器,其中向量处理器包括由可存储多个数据元素的向量寄存器构成的两个组、及具有表示缺省组的字段的控制寄存器。所述向量处理器的指令集包括:使用识别位于所述缺省组内的向量寄存器所用的寄存器号的指令;使用识别包含第一组中的寄存器及第二组中的寄存器的双倍长度向量寄存器所用的寄存器号的指令;以及包含访问某个组中的向量寄存器所用的组位及寄存器号的指令。
Description
发明领域
本发明涉及数字信号处理技术,特别涉及用于多媒体功能(如视频和音频编码和解码)的对每个指令的多个数据元素进行并行处理的方法及其装置。
背景技术
用于多媒体应用(例如实时视频编码和解码)的可编程数字信号处理器(DSPs)需要相当强的处理能力,以便在有限时间内处理大量的数据。数字信号处理器的几种结构是众所周知的。大多数微处理器采用的通用结构一般需要高工作频率,以提供具有足以进行实时视频编码或解码的计算能力的DSP。这使这种DSP价格昂贵。
超长指令字(VLIW)处理器是具有很多功能单元的一种DSP,这些功能单元中的大部分执行不同的、相对简单的任务。VLIW DSP的单个指令可以是128字节或更长,并具有多个独立的被独立的功能单元并行执行的部分。VLIWDSPs具有很强的计算能力,因为许多功能单元能并行工作。VLIW DSPs还具有相对低的成本,因为每个功能单元相对小而简单。
VLIW DSPs存在的一个问题是在处理输入/输出控制、同主计算机通信及其它不宜于用VLIW DSP的多个功能单元并行执行的功能方面效率低下。另外,VLIW的软件不同于传统的软件且开发困难,因为缺乏编程工具和熟悉VLIW软件结构的程序员。因此,能提供合理成本、高计算能力和熟悉的编程环境的DSP是多媒体应用所寻求的。
题为“Multiprocessor Operation in a Multimedia Signal Processorand Methods and apparatus for Processing Video Data”的美国专利申请序号08/697102的专利申请全面地说明了图1中高速缓存子系统130和示例性的设备的工作。题为“Eficient Context Saving and Restoring inMultiprocessors”的美国专利申请序号为08/699280的专利申请,说明了现场切换的一示例性的系统。
发明内容
本发明的目的是提供一种单指令多数据处理方法及其装置。
根据本发明一个方面,提供一种向量处理器,其特征在于,在所述向量处理器中配有:向量寄存器的第一组、向量寄存器的第二组、包含缺省组字段的控制寄存器、以及向量寄存器的所述第一及第二组所用的选择电路;所述第一组内的各个向量寄存器分配有与分配给所述第一组内的其他向量寄存器的寄存器号相区别的寄存器号;所述第二组内的各个向量寄存器分配有与分配给所述第二组内的其他向量寄存器的寄存器号相区别、且与分配给所述第一组内相应的向量寄存器的寄存器号相同的寄存器号;所述选择电路以第一模式工作,并可访问根据从所述向量处理器执行的指令所得到的寄存器号和通过来自所述缺省组字段的数值的组合来识别的向量寄存器。
根据本发明的另一方面,提供一种操作向量处理器的方法,其特征在于,所述方法包括以下步骤:对第一组内的向量寄存器分配寄存器号,使得分配给第一组内的各个向量寄存器的寄存器号与分配给所述第一组内的其他向量寄存器的寄存器号相区别的步骤;对第二组内的向量寄存器分配寄存器号,使得分配给第二组内的各个向量寄存器的寄存器号与分配给所述第二组内的其他向量寄存器的寄存器号相区别,且与分配给所述第一组内相应的向量寄存器的寄存器号相同的步骤;形成包含寄存器号的指令的步骤;以包含下述过程的方式执行所述指令的步骤,所述过程是指访问分配有所述指令包含的寄存器号、并由所述向量处理器的控制寄存器的字段所指示的组内的向量寄存器的过程。
向量处理器还实现新颖的指令,如四平均(average quad)、混洗、去混洗、成对方式最大(pair-wise maximum)和交换(exchange)以及饱和。这些指令执行的操作在多媒体功能(例如视频编码和解码)中是常见的,并代替在其它指令集中实现同样功能所需的2个或更多个指令。因而,向量处理器指令集改进了多媒体应用中程序的效率和速度。
附图说明
以下结合附图详细说明本发明的优选实施例,其中,
图1是根据本发明一实施例的多媒体处理器的方框图。
图2是图1的多媒体处理器的向量处理器的方框图。
图3是图2的向量处理器的取指单元的方框图。
图4是图2的向量处理器的取指单元的方框图。
图5A、5B和5C示出了图2的向量处理器的寄存器到寄存器指令、加载指令及存储指令所用的执行流水线的步骤。
图6A是图2的向量处理器的执行数据通路的方框图。
图6B是图6A执行数据通路的寄存器文件(register file)的方框图。
图6C是图6A执行数据通路的并行处理逻辑单元的方框图。
图7是图2的向量处理器的加载/存储单元的方框图。
图8是本发明一实施例的向量处理器指令集的格式。
在不同图中所用的相同参考符号表示相似的或相同的项。
具体实施方式
图1示出了本发明一实施例的多媒体信号处理器(MSP)100的实施例的方块图。多媒体处理器100包括通用处理器110和向量处理器120组成的处理核心105。处理核心105通过高速缓冲存储器(以下称为高速缓存)子系统130连到多媒体处理器100的剩余部分,高速缓存子系统包括SRAM160和190,ROM170及高速缓存控制器180。高速缓存控制器180可将SRAM160配置为处理器110的指令高速缓存162和数据高速缓存164,而将SRAM190配置为向量处理器120的指令高速缓存192和数据高速缓存194。
片内ROM170包含处理器110和120的数据和指令,并能配置为高速缓存。在本实施例中,ROM170包括:复位和初始化过程;自测试诊断过程;中断和异常处理程序;及声霸卡仿真子例程;V.34调制解调器信号处理子例程;一般电话功能;2-D和3-D图形子例程序;以及用于音频和视频标准如MPEG-1,MPEG-2,H.261,H.263,G.728和G.723的子例程序。
高速缓存子系统130把处理器110和120连接到两个系统总线140和150,并作为处理器110和120及耦合到总线140和150的设备的高速缓存和切换站(switching station)。系统总线150用比总线140更高的时钟频率工作,并连接到存储器控制器158、局部总线接口156、DMA控制器154和设备接口152,它们分别为外部局部存储器、主计算机的局部总线、直接存储器存取和各种模数、数模转换器提供接口。系统定时器142、UART(Universlasynchronous receiver transceiver,通用异步收发信机)144、位流处理器146及中断控制器148连接到总线140。前面提到的题为“MultiprocessorOperation in a Multimedia Signal Processor and Methods and apparatusfor Processing Video Data”的专利申请更全面地说明了高速缓存子系统130和示例性的设备的工作,处理器110和120通过高缓存子系统130及总线140和150访问所述设备。
处理器110和120执行独立的程序线程,并且在结构上也是不同的,以便更有效地执行赋予它们的特定任务。处理器110主要用于控制功能,例如实时操作系统的执行及类似的不需要大量重复计算的功能。因此,处理器110不需要强计算能力,能用传统的通用处理器结构实现。向量处理器120主要实现数学计算(number crunching)这种包含对多媒体处理中常见的数据块的重复操作。为了有强计算能力和相对简单的编程,向量处理器120具有SIMD(Sngle instruction multiple data,单指令多数据)结构;在本实施例中,在向量处理器120中大部分数据通路为288位或576位宽,以支持向量数据操作。此外,向量处理器120的指令集包括尤其适用于多媒体问题的指令。
在本实施例中,处理器110是32位RISC处理器,工作在40MHz上,符合ARM7处理器的结构,所述ARM7处理器包含有ARM7标准定义的寄存器集。有关ARM7 RISC处理顺的结构和指令集在“ARM7DM Data Sheet(ARM7DM产品说明书)”Document Number(文件号):ARM DDI0010G中作了说明,这可从Advance RISC Machines Ltd.公司得到。ARM7DM Data Sheet全部包括在这里作为参考。附录A说明了本实施例的ARM7指令集的扩展。
向量处理器120既操作向量又操作标量。在本实施例中,向量数据处理器120包括以80MHz工作的流水线式RISC引擎(engine)。向量处理器120的寄存器包括32位标量寄存器、32位专用寄存器、两组288位向量寄存器及两组双倍长度(即576位)向量累加器寄存器。附录C说明了本实施例的向量处理器120的寄存器集。在本实施例中,处理器120包括32个标量寄存器,这些标量寄存器通过范围从0到31的5位寄存器号在指令中被标识。还有64个288位的向量寄存器,这些寄存器组成两个组,每组有32个向量寄存器。每个向量寄存器可用1位组号(0到1)和5位范围从0到31的向量寄存器号来标识。大部分指令只访问当前组中的向量寄存器,如存储在向量处理器120的控制寄存器VCSR的缺省组位CBANK所表示。第2个控制位VEC64表示是否寄存器号缺省表示由来自每个组的一个寄存器组成的双倍长度向量寄存器。指令的句法区别标识向量寄存器的寄存器号和标识标量寄存器的寄存器号。
每个向量寄存器可被分成长度可编程的多个数据元素,表1示出了在一个288位向量寄存器中支持的数据元素的数据类型。
表1:
附录D进一步提供了本发明的实施例中支持的数据长度和类型的说明。
数据类型 | 数据长度 | 解释 |
int8 | 8位(字节) | -128和127之间8位2的补码 |
int9 | 9位(字节9) | -256和255之间9位2的补码 |
int16 | 16位(半字) | -32,768和32,767之间16位2的补码 |
int32 | 32位(字) | -2147483648和2147483647之间32位2的补码。 |
float | 32位(字) | 32位IEEE754单精度格式 |
对int9数据类型,9位字节被连续地组合在288位向量寄存器中,而对其它的数据类型,在288位向量寄存器中每个第9位不使用。288位向量寄存器能放32个8或9位整型数据元素、16个16位整型数据元素、或8个32位整型或浮点元素。此外,2个向量寄存器可被结合以双倍长度向量组装数据元素。在本发明的实施例中,将控制和状态寄存器VCSR中的控制位VEC64置位,把向量处理器120置于方式VEC64,这里双倍长度(576位)是向量寄存器的缺省长度。
多媒体处理器100还包括一套处理器110和120都可以访问的32位扩展寄存器115。附录B说明了本发明的实施例中扩展寄存器集和它们的功能。扩展寄存器和向量处理器120的标量和专用寄存器,在某些情况下可供处理器110访问。2个专用“用户”扩展寄存器具有2个读端口,允许处理器110和120同时读寄存器。其它扩展寄存器不能同时被访问。
向量处理器120有两个交替的状态VP_RUN和VP_IDLE,指示向量处理器120是处于工作还是处于空闲状态。当向量处理器120处于状态VP_IDLE时,处理器110能读或写向量处理器120的标量和专用寄存器。但向量处理器120处于状态VP_RUN时处理器110读或写向量处理器120的一寄存器的结果未予定义。
对处理器110的ARM7指令集的扩展包括访问扩展寄存器和向量处理器120的标量或专用寄存器的指令。指令MFER和MFEP分别把扩展寄存器和向量处理器120的标量或专用寄存器中的数据移到处理器110中的通用寄存器中,指令MTER和MTEP分别把处理器110中通用寄存器的数据移到扩展寄存器和向量处理器120的标量或专用寄存器中。TESTSET指令读扩展寄存器并把扩展寄存器的位30置成1。指令TESTSET通过将位30置位,向处理器120发生信号说明处理器110已读出(或使用)产生的结果,方便了使用者/生产者同步。处理器110的其它指令如STARTVP和INTVP控制向量处理器120的工作状态。
处理器110起主处理器的作用以控制向量处理器120的操作。用处理器110和120之间控制的不对称划分简化了处理器110和120进行同步的问题。当向量处理器120处于VP_IDLE状态时,处理器110通过把指令地址写到向量处理器120的程序计数器中,来初始化向量处理器120。然后,处理器110执行STARTVP指令,把向量处理器120改变成状态VP_RUN。在状态VP_RUN下,向量处理器120通过高速缓存子系统130取指,并同继续执行它自己程序的处理器110并行地执行那些指令。在启动后,向量处理器120继续执行,直到遇到一个异常、执行满足适当条件的VCJOIN或VCINT指令、或被处理器110中断。向量处理器120通过把结果写到扩展寄存器、把结果写到处理器110和120共享的地址空间、或当向量处理器120重新进入状态VP_IDLE时把结果留在处理器110访问的标量或专用寄存器中,可将程序执行的结果传送到处理器110。
向量处理器120并不处理它自己的异常。在执行引起异常的指令时,向量处理器120进入状态VP_IDLE,并通过直通线发出一个中断求给处理器110。向量处理器120保持在状态VP_IDLE,直到处理器110执行另一个STARTVP指令。处理器110负责读向量处理器120的寄存器VISRC以决定异常的性质,可能通过重新初始化向量处理器120来处理异常,然后,根据需要引导向量处理器120恢复执行。
通过处理器110执行的INTVP指令中断向量处理器120,使向量处理器120进入空闲状态VP_IDLE。指令INTVP可以例如用在多任务系统中,把向量处理器从执行的一个任务如视频译码切换到另一个任务如声卡仿真。
向量处理器指令VCINT和VCJOIN是流控制指令,如果指令指示的条件满足,这些指令将停止向量处理器120的执行,使向量处理器120置于状态VP_IDLE,并向处理器110发中断请求,除非这个请求被屏蔽。向量处理器120的程序计数器(专用寄存器VPC)指出VCINT或VCJOIN指令后的指令地址。处理器110能检查向量处理器120的中断源寄存器VISRC,确定是否是VCINT或VCJOIN指令引起中断请求。因为向量处理器120有大量数据总线,及在保存和恢复它的寄存器上更有效,所以通过向量处理器120执行的软件在现场切换(context switching)期间应该保存和恢复寄存器。上面提到的题为“Efficient Context Saving and Restoring in Multiprocessors”的专利申请,说明了现场切换的一示例性的系统。
图2示出了向量处理器120的实施例的主要功能框图。向量处理器120包括一个取指单元(IFU)210、一个解码器220、一个调度器230、一个执行数据通路240及一个加载/存储单元(LSU)250。IFU210取指并处理流控制指令(如分支)。指令译码器220根据从IFU210到达的顺序,每周期译码一条指令,并把从指令中译码出的字段值写到调度器230中的FIFO。调度器230根据执行操作步骤的需要,选择发送给执行控制寄存器的字段值。发送选择取决于操作数依赖性(dependency)和处理资源如执行数据通路240或装入/存储单元250的可用性。执行数据通路240执行操作向量或标准数据的逻辑/算术指令。装入/存储单元250执行访问向量处理器120的地址空间的装入/存储指令。
图3示出了IFU210的一实施例的框图。IFU包括一个指令缓冲器,该缓冲器分成主指令缓冲器310和辅助指令缓冲器312。主缓冲器310包含8条连续指令,其中包括对应于当前程序计数的指令。辅助缓冲器312中包含紧接着缓冲器310中的指令的8条指令。IFU210亦包括一个分支目标缓冲器314,它包含8个连续指令,其中包括缓冲器310或312中下一个流控制指令的目标。在本实施例中,向量处理器120使用RISC型指令集,其中每条指令为32位长,缓冲器310、312、312或314是8×32位缓冲器,并通过256位指令总线连到高速缓存子系统130。IFU210可在一个时钟周期内,把高速缓存子系统130中8条指令装载到缓冲器310、312或314中任何一个中。寄存器340、342和344分别指示缓冲器310、312或314中装入指令的基地址。
多路选择器332从主指令缓冲器310中选择当前的指令。如果当前指令不是流控制指令,而且存储在指令寄存器330中的指令进展到执行的译码阶段,则当前指令被存到指令寄存器330,向程序计数被增量。在程序计数增量后,选择缓冲器310中最后一条指令,则下一组8条指令被装载到缓冲器310。如果缓冲器312包含所要的8条指令,则缓冲器312和寄存器342的内容立即移到缓冲器310和寄存器340,又有8条指令从高速缓存系统130预取指送到辅助缓冲器312。加法器350根据寄存器342中的基地址和由多路选择器352选择的偏移量,确定下一组指令的地址。由加法器350得到的结果地址被存储在寄存器342中,这是在该地址从寄存器342移到寄存器340时或以后进行的。计算出的地址随同8条指令的请求也送到高速缓存子系统130中。如果上次对高速缓存控制系统130的调用,在缓冲器310请求时,还没有向缓冲器312提供下面8条指令,则上次请求的指令,从高速缓存子系统130接收到时,立即存储到缓冲器310中。
如果当前指令是流控制指令,IFU210通过对流控制指令条件的计算及在流控制指令之后更新程序计数来处理该指令。如果因为前面可能改变条件的指令没有完成,而条件不能确定时,使IFU210停顿。如果没有发生分支,程序计数器被增量,下面的指令如上所述被选择。如果发生分支且分支目标缓冲器314包含该分支的目标,则缓冲器314和寄存器344的内容被移到缓冲器310和寄存器340,以使IFU210能继续为译码器220提供指令而不需等待来自高速缓存子系统130中的指令。
为了为分支目标缓冲器314预取指令,扫描器320扫描缓冲器310和312以定位跟着当前程序计数的下一个流控制指令。如果在缓冲器310或312中找到流控制指令,扫描器320确定从包含该指令的缓冲器310或312的基地址,到一组对准的(aligned)包括流控制指令目标地址的8条指令的偏移量。多路选择器352和354为加法器350提供流控制指令的偏移量和来自寄存器340或342的基地址,由加法器350为缓冲器314产生一个新的基地址。新的基地址被传到高速缓存子系统130,再则其为分支目标缓冲器314提供8条指令。
在处理流控制指令如“减量和条件转移”指令VD1CBR、VD2CBR和VD3CBR,及“改变控制寄存器”指令VCHGCR时,IFU210能改变除程序计数外的寄存器的值。当IFU210找到一非流控制指令的指令时,该指令送到指令寄存器330,并从那里到译码器220。
如图4所示,译码器220通过把控制值写到调度器230的FIFO缓冲器410的各个字段来译码一指令。FIFO缓冲器410包括4行触发器,其中每一行可包含5个信息字段,用以控制一条指令的执行。行0到3分别保持最早到最新的指令的信息,当较早的信息随着指令完成而被去除时,在FIFO缓冲器410中的信息下移到更低的行。调度器230通过选择必需的指令字段装载到包含执行寄存器421到427的控制管道420来给执行阶段发出一指令。大部分指令能被调度,以便不按次序发出和执行。尤其是有关逻辑/算术操作和加载/存储操作的次序是任意的,除非在加载/存储操作和逻辑/算术操作之间有操作数依赖性。FIFO缓冲器410中字段值的比较指示是否有操作依赖性存在。
图5A举例说明一个指令的6阶段执行流水线,该指令实现了寄存器到寄存器的操作,而不用访问向量处理器120的地址空间。在指令取指阶段511中,IFU210如上所述取指一指令。取指阶段需要1个时钟周期,除非由于流水线延迟、未解决的分支条件或在提供预取指令的高速缓存子系统130中的延迟,使IFU210停顿。在译码阶段512,译码器220译码来自IFU210的指令,并将该指令的信息写到调度器230。译码阶段512亦需要一个时钟周期,除非对新的操作,FIFO410中无可得到的行。在FIFO410的第一周期期间,能发出操作到控制管道420,但是会由于较早的操作的发出被延迟。
执行数据通道240实现寄存器到寄存器的操作,并为加载/存储操作提供数据和地址。图6A示出了执行数据通路240一实施例的框图,并同执行阶段514、515和516一起被说明。执行寄存器412提供标识寄存器文件610中两个寄存器的信号,寄存器文件610在读阶段514期间的一个时钟周期内被读。寄存器文件610包括32个标量寄存器和64个向量寄存器。图6B是寄存器文件610的框图。寄存器文件610具有2个读端口和2个写端口,以便在每个时钟周期提供2个读和2个写。每个端口包括选择电路612、614、616或618以及288位的数据总线613、615、617或619。选择电路如电路612、614、616和618在本技术领域是熟知的,并且使用地址信号WRADDR1、WRADDR2、RDADDR1或RDADDR2,这是译码器220从一般是从指令里提供的5位寄存器号、一个来自指令或控制状态寄存器VCSR的一个组位、及指示寄存器是向量寄存器还是标量寄存器的指令句法中得到的。数据读的路径可以是通过多路选择器656到加载/存储单元250,或者通过多路选择器622和624,通过乘法器620算术逻辑单元630、累加器640。大部分操作读2个寄存器,并且读阶段514在一个周期内完成。然而,某些指令,如乘和加指令VMAD及操作双倍长度向量的指令需要多于2个寄存器的数据,致使读阶段514需超过一个时钟周期。
在执行阶段515,乘法器620、算述逻辑单元630及累加器640处理前面从寄存器文件610读出的数据。如果为了读必要的数据要求多个周期,执行阶段515可与读阶段514重叠。执行阶段515的持续时间取决于处理数据元素的类型(整型或浮点型)和数量(读周期数据)。来自执行寄存器422、423和425的信号控制插入数据到算术逻辑单元630、累加器640、和乘法器620以便在执行阶段实现第一步操作。来自执行寄存器432、433和435的信号控制在执行阶段515实现第二步操作。
图6C示出了乘法器620和ALU630一实施例的框图。乘法器620是一个整数乘法器,它包括8个独立的36×36位乘法器626。每个乘法器626包括通过控制电路连结在一起的4个9×9位乘法器。对8位和9位数据元素宽度,来自调度器230的控制信号断开4个9×9位乘法器的相互连结,以使每个乘法器626实现4个乘法,乘法器620在一个周期内实现32个独立的乘法。对16位数据元素,控制电路把9×9位乘法器对连接在一起操作。乘法器620实现16个并行乘法。对32位整型数据元素类型,8个乘法器626每个时钟周期实现8个并行乘法。乘法的结果对9位数据元素宽度提供576位结果,对其它数据长度提供512位结果。
ALU630能在2个时钟周期中处理来自乘法器620的576位或512位结果。ALU630包括8个独立的36位ALUs636,每个ALL636包括用于浮点加和乘的一个32×32位浮点部件。附加电路实现整数移位、算术和逻辑功能。对于整数操作,每个ALU636包括能独立进行8位和9位操作的4个单元,对16位和32位整型数据元素,每2个或4个能够组成一组连在一起。
累加器640累加结果,并包括2个576位寄存器,以便实现中间结果的较高精度。
在写阶段516,来自执行阶段的结果存储在寄存器文件610。在一个时钟周期内,能写2个寄存器,输入多路选择器602和605选择要被写的2个数据值。一次操作的写阶段516的持续时间取决于作为操作结果要被写的数据量和来自LSU250的竞争,LSU250可能正在通过对寄存器文件610进行写来完成装载指令。来自执行寄存器426和427的信号选择把来自逻辑单元630、累加器640和乘法器620的数据写入的寄存器。
图5B示出执行装载指令的执行流水线520。对于执行流水线520的指令取指阶段511、译码阶段512和发出阶段513与所说明的寄存器到寄存器的操作是相同的。读阶段514也同上面的说明相同,只是执行数据通路240用来自寄存器文件610的数据以确定调用高速缓存子系统130的地址。在地址阶段525,多路选择器652、654和656选择地址,该地址被提供给执行阶段526和527的加载/存储单元250。在加载/存储单元250处理操作的同时,在阶段526和527期间,加载操作的信息保持在FIFO410中。
图7示出了加载/存储单元250的一个实施例。在阶段256期间调用高速缓存子系统130,以请求阶段525所确定的地址的数据。本实施例使用基于事务的(transaction based)高速缓存调用,其中包括处理器110和120的多个设备可通过高速缓存子系统130存取局部地址空间。在调用高速缓存子系统130之后的几个周期中,被请求的数据可能得不到,但在其它调用挂起时,加载/存储单元250能调用高速缓存子系统。因此,加载/存储单元250不致停顿。高速缓存子系统130提供被请求的数据所需的时钟周期数取决于数据高速缓存194的命中或未命中(hit or miss)。
在驱动阶段527,高速缓存子系统130为加载/存储单元250确认(assert)一个数据信号。高速缓存子系统130可在每个周期给加载/存储单元250提供256位(32个字节)的数据,字节对准器710在相应9位存储位置对准32个字节的每个字节,以提供288位的值。288位的格式对例如MPEG编码和解码的多媒体应用是方便的,它们有时用9位数据元素。288位值写入读数据缓冲器720。对写阶段528,调度器230把FIFO缓冲器410的字段4传送到执行寄存器426或427,将数据缓冲器720的288位的值写入寄存器文件610。
图5C示出了执行存储指令所用的执行流水线530。执行流水线530的取指阶段511、译码阶段512和发出阶段513同前面说明的相同。读阶段514亦同前面说明的相同,只是读阶段读要存储的数据和地址计算所用的数据。要被存储的数据被写入加载/存储单元250中的写数据缓冲器730。多路选择器740把9位字节格式的数据转换成传统的8位字节的格式。从缓冲器730来的转换过的数据和来自地址计算阶段525的相关地址,在SRAM阶段536期间被并行地送到高速缓存子系统130。
在向量处理器的实施例中,每个指令是32位长并具有图8中所示的9种格式中的一种格式,且标记为REAR、REAI、RRRM5、RRRR、RI、CT、RRRM9、RRRM9*、和RRRM9**。附录E说明了向量处理器120的指令集。
当确定一个有效地址时,使用标量寄存器的某些加载、存储和高速缓存操作具有REAR格式。REAR格式指令用位29-31是000b来标识且有3个操作数通过3个寄存器号标识,2个寄存器号SRb和SRi为标量寄存器,寄存器号Rn可以是标量或向量寄存器,这取决于位D。组位B或者为寄存器Rn标识一个组,或者如果缺省向量寄存器大小是双倍长度时指示是否向量寄存器Rn是双倍长度。操作码字段Opc标识对操作数实行的操作,而字段TT指示传送类型为加载或存贮。典型的REAR格式指令是指令VL,它从标量寄存器SRb和SRi内容相加确定的地址来加载寄存器Rn。如果位A被置位,所计算的地址被存储在标量寄存器SRb中。
REAI格式指令同REAR指令相同,只是来自字段IMM的8位立即值被用来代替标量寄存器SRi的内容。REAR和REAI格式无数据元素长度字段。
RRRM5格式用于具有2个源操作数和一个目的操作数的指令。这些指令具有3个寄存器操作数或2个寄存器操作数及1个5位立即值。在附录E中所示的字段D、S和M的编码确定是否第一个源操作数Ra是标量或向量寄存器;是否第2个源操作数Rb/IM5是标量寄存器、向量寄存器或5位立即值;及是否目的寄存器Rd是标量或向量寄存器。
RRRR格式用于具有4个寄存器操作数的指令。寄存器号Ra和Rb指示源寄存器。寄存器号Rd指示目的寄存器,而寄存器号Rc指示源或目的寄存器,这取决于字段Opc。全部操作数是向量寄存器,除非位S被置位指示寄存器Rb是标量寄存器。字段DS指示向量寄存器的数据元素长度。字段Opc选择32位数据元素的数据类型。
RI格式指令给寄存器加载一个立即值。字段IMM包括可多达18位的立即值。寄存器号Rd指示目的寄存器,该目的寄存器是当前组内的向量寄存器或标量寄存器,这取决于位D。字段DS和F分别指示数据元素的长度和类型。对32位整型数据元素,18位立即值在加载到寄存器Rd以前作符号扩展。对浮点数据元素,位18、位17到10及位9到0分别表示32位浮点值的符号、指数和尾数。
CT格式用于流控制指令,它包括操作码字段Opc、条件字段Cond、和23位的立即值IMM。当条件字段指示条件为真时,则发生分支。可能的条件码是“always(无条件)”、“less than(小于)”、“equal(等于)”、“Less thanor equal(小于或等于)”、“greater than(大于)”、“not equal(不等于)”、“greater than or equal(大于或等于)”和“overflow(溢出)”。状态和控制寄存器VCSR中的位GT、EQ、LT和SO用于评价条件。
格式RRRM9提供3个寄存器操作数或2个寄存器操作数及1个9位立即值。位D、S和M的组合指示哪些操作数是向量寄存器、标量寄存器或9位立即值。字段DS指示数据元素长度。RRRM9*和RRRM9**格式是RRRM9格式的特殊情况,并且用操作码字段Opc来区别。RRRM9*格式用条件码Cond和ID字段替代源寄存器号Ra。RRRM9**格式用条件码Cond和位K代替立即值的各最高有效位。RRRM9*和RRRM9**的进一步说明在附录E中给出,涉及到条件转移指令VCMOV、元素屏蔽条件转移CMOVM及比较和设置屏蔽指令CMPV。
虽然结合具体的实施例对本发明作出了说明,但这些说明仅仅是本发明应用的一个例子,不应该当成是一种限制,此外所公开的实施例特点的各种修改和组合仍属于本发明的范围。
附录A
在示范性实施例中,处理器110是按照ARM7处理器标准的通用处理器。在ARM7中对寄存器的说明参考ARM结构文件或ARM7数据表(文件号ARM DDI 0020C,1994年12月发行)。
为了与向量处理器120相互配合,110处理器:起动和停止向量处理器;测试向量处理器状态,包括同步状态;从向量处理器120中的标量/专用寄存器把数据传到处理器110的通用寄存器中;以及把通用寄存器中的数据传到向量处理器的标量/专用寄存器。在通用寄存器和向量处理器的向量寄存器之间,没有直接的传送装置,这些传送需要存贮器作为中介体。
表A.1说明了为了向量处理器的交互作用而扩展的ARM7指令集。表A.1:扩展的ARM7指令集
指令 | 结果 |
STARTVP | 该指令使向量处理器进入VP-RUN状态,若向量处理器已经进入VP-RUN状态则无影响。STARTVP作为ARM7结构中处理器数据操作(CDP)类来执行,无结果返回到ARM7,ARM7继续其执行。 |
INTVP | 该指令使向量处理器进入VP-IDEL状态,若向量处理器已经进入VP-IDEL状态则无影响。INTVP作为ARM7结构中处理器数据操作(CDP)类来执行,无结果返回到ARM7,ARM7继续其执行。 |
TESTSET | 该指令读用户扩展寄存器,并把寄存器位30置成1,以使在向量和ARM7处理器之间提供生产者/消费者类型的同步。在ARM7结构中,TESTSET作为处理器寄存器传输(MRC)类来执行。ARM7被阻塞,直到指令被执行为止(寄存器被传送)。 |
MFER | 从扩展寄存器转移到ARM通用寄存器,在ARM7结构中,MFER作为处理器寄存器传送(MRC)类来执行。ARM7被阻塞,直到指令被执行为止(寄存器被传送)。 |
指令 | 结果 |
MFVP | 从向量处理器的标量/专用寄存器转移到ARM7通用寄存器。不同于其它ARM7指令,该指令只在向量处理器处于VP-IDLE状态时执行。否则其结果未定义。在ARM7结构中,MFVP作为处理器寄存器传送(MRC)类来执行。ARM7被阻塞,直到指令被执行为止(寄存器被传送)。 |
MTER | 从ARM7通用寄存器转移到扩展寄存器,在ARM7结构中,MTER作为协处理器寄存器传送(MCR)类来执行。ARM7被阻塞,直到该指令被执行为止(寄存器被传送)。 |
MTVP | 从ARM7通用寄存器转移到向量处理器的标量/专用寄存器,不同于其它ARM7指令,该指令仅在向量处理器处于VP_IDLE状态时执行。否则其结果未定义。在ARM7结构中,MTVP作为协处理器寄存器传送(MCR)类未执行。ARM7被阻塞,直到该指令被执行为止(寄存器被传送)。 |
CACHE | 提供ARM7数据高速缓存的软件管理 |
PFTCH | 预取一个高速缓存行,送到ARM7数据高速缓存。 |
WBACK | 把ARM7数据高速缓存来的一高速缓存行回写到存贮器中。 |
表A.2列出了ARM7的异常,在执行故障指令之前,检测和报告这些异常。异常向量地址以十六进制表示法给出。表A.2:ARM7异常
异常向量 | 说明 |
0x00000000 | ARM7复位 |
0x00000004 | ARM7未定义指令异常 |
0x00000004 | 向量处理器不可得到异常 |
0x00000008 | ARM7软件中断 |
0x0000000C | ARM7单步异常 |
0x0000000C | ARM7指令地址断点异常 |
0x00000010 | ARM7数据地址断点异常 |
0x00000010 | ARM7非法数据地址异常 |
0x00000018 | ARM7保护违章异常 |
下面说明对ARM7指令集扩充的句法。关于术语的说明和指令的格式参考ARM结构文件或ARM7数据表(文件号ARMDDI0020C,1994年12月发表)。
ARM结构为协处理器接口提供3种指令格式:
1.协处理器数据操作(CDP)
2.协处理器数据传送(LDC,STC)
3.协处理器寄存器传送(MRC,MCR)
MSP结构的扩展使用全部二种格式。
为操作使用的协处理器数据操作格式(CDP)不需返回给ARM7。CDP格式
30 25 20 15 10 5 0CDP格式字段具有下列约定:
字段 | 意义 |
Cond | 条件字段,该字段指定指令执行条件 |
Opc | 协处理器操作码 |
CRn | 协处理器操作数寄存器 |
CRd | 协处理器目的寄存器 |
CP# | 协处理器号;下面的协处理器号是当前使用的:1111-ARM7数据高速缓存0111-向量处理器,扩展的寄存器 |
CP | 协处理器信息 |
CPm | 协处理器操作数寄存器 |
协处理器数据传送格式(LDC,STC)用于直接地加载或存贮向量处理器的寄存器子集到存贮器。ARM7处理器负责提供字地址,而向量处理器提供或接收数据,并且控制传送的字数。更详细内容参考ARM7数据表。LDC,STC格式
格式字段具有下列约定:
字段 | 意义 |
Cond | 条件字段,该字段指定指令执行条件 |
P | Pre/Post标志位 |
U | Up/Down位 |
N | 传送长度,由于CRd字段没有足够的位数,位N作为一部分源或目的寄存器标识符使用。 |
W | 回写位 |
L | 加载/存贮位 |
Rn | 基址寄存器 |
CRn | 协处理器源/目的寄存器 |
CP# | 协处理器号,下列协处理器号是当前使用的:1111-ARM7数据高速缓存0111-向量处理器,扩展的寄存器 |
Offset | 无符号8位立即偏移量 |
协处理器寄存器传送格式(MRC,MCR)用于直接地在ARM7和向量处理器之间传送信息。该格式用于在ARM7寄存器和向量处理器的标量或专用寄存器之间的转移。MRC,MCR格式
30 25 20 15 10 5 0该格式字段具有下列约定:
扩展的ARM指令说明
字段 | 意义 |
Cond | 条件字段,该字段指定指令执行的条件 |
Opc | 协处理器操作码 |
L | 加载/存贮位L=0移到向量处理器L=1移自向量处理器 |
CRn:Crm | 协处理器源/目的寄存器。仅CRn<1:0>:CRm<3:0>被使用 |
Rd | ARM源/目的寄存器 |
CP# | 协处理器号,下列协处理器号是当前使用的:1111=ARM7数据高速缓存0111=向量处理器,扩展的寄存器 |
CP | 协处理器信息 |
扩展的ARM指令按字母顺序予以说明。CACHE 高速缓存操作格式
30 25 20 15 10 5 0汇编器句法
STC{cond}p15,cOpc,<Address>
CACHE{cond}Opc,<Address>
其中Cond={eq,he,cs,cc,mi,pl,vs,vc,hi,Is,ge,It,ge,le,ai,nv}和Opc={0,1, 3}。注意,因为LDC/STC格式的CRn字段用于指定Opc。在第一种句法中Opcode的十进制表示必须由字母“C”打头(即用CO代表0)。关于地址方式句法参考ARM7数据表。说明只有在Cond为真时,执行该指令。Opc<3:0>指示如下操作:
操作
Opc<3:0> | 意义 |
0000 | 回写和作废由EA指定的改动过的高速缓存行。如果匹配的行包含未改动过的数据,该行被作废,不予回写。如果找不着包含EA的高速缓存行,数据高速缓存保持原封不动。 |
0001 | 回写和作废由EA牵引指定的改动过的高速缓存行。如果匹配行包含未改动的数据,该行被作废不予回写。 |
0010 | 用于PFTCH和WBACK指令 |
0011 | 作废由EA指定的高速缓存行。即使该行被改动过,该高速缓存行亦被作废(不回写)。这是一种特权操作,如果试图在用户方式下使用,它将引起ARM7保护违章 |
其它 | 保留 |
参考ARM7数据表,EA如何计算。异常
ARM7保护违章。INTVP 中断向量处理器格式 30 25 20 15 10 5 0汇编器句法
CDP{cond}p7,1,c0,c0,co
INTVP{cond}
其中cond={eq,ne,cs,cc,mi,pl,vs,vc,hi,Is,ge,It,gt,le,al,ns}。说明
该指令仅在Cond为真时执行。该指令发信号使向量处理器停止。ARM7不必等待向量处理器停止,继续执行下一指令。
应使用MFER忙等待循环以便看看向量处理器是否在该指令执行后已停止。如果向量处理器已经在VP-IDLE状态,则该指令不起作用。位19:12、7:15和3:0被保留。异常
向量处理器不可得到。MFER 自扩展寄存器转移格式
MRC{cond}p7,2,Rd,cP,cER,0
MFER{cond}Rd,RNAME
其中Cond={eg,he,cs,cc,mi,pl,rs,vc,hi,ls,ge,lt,gt,le,al,nv},Rd={r0,...r15},P={0,1},ER={0,...15}而RNAME指的是结构上指定的寄存器助记符(即,PERO或CSR)。说明
该指令仅在Cond为真时执行。ARM7寄存器Rd根据以P:ER<3:0>指定的扩展寄存器ER转移,如下表所示。参考章节1.2扩展寄存器的说明。
ER<3:0> | P=0 | P=1 |
0000 | UER0 | PER0 |
0001 | UER1 | PER1 |
0010 | UER2 | PER2 |
0011 | UER3 | PER3 |
0100 | UER4 | PER4 |
0101 | UER5 | PER5 |
0110 | UER6 | PER6 |
0111 | UER7 | PER7 |
1000 | UER8 | PER8 |
1001 | UER9 | PER9 |
ER<3:0> | P=0 | P=1 |
1010 | UER10 | PER10 |
1011 | UER11 | PER11 |
1100 | UER12 | PER12 |
1101 | UER13 | PER13 |
1110 | UER14 | PER14 |
1111 | UER15 | PER15 |
位19:17及7:5被保留异常
当试图在用户方式中访问PERx时,保护违章。MFVP 自向量处理器转移格式汇编器句法
MRC{cond}p7,1,Rd,Cm,CRm,0
MFVP{cond}Rd,RNAME
其中Cond={eq,ne,cs,cc,mi,pl,vs,vc,hi,ls,ge,lt,gt,le,al,nv},Rd={r0,...r15},CRn={c0,...c15},CRm={c0,....c15}而RNAME指的是结构上指定的寄存器助记符(即,SPO或VCS)说明
该指令只在Cond为真时执行。ARM7寄存器Rd根据向量处理器的标量/专用寄存器CRn<1:0>:CRm<3:0>转移。参考章节3.2.3中寄存器传送向量处理器寄存器号的分配。
位7.5及CRn<3:2>被保留。
向量处理器寄存器映射显示在下面。参考向量处理器专用寄存器(SP0-SP15)的表15。
CRM<3:0> | CRn<1:0>=00 | CRn<1:0>=01 | CRn<1:0>=10 | CRn<1:0>=111 |
0000 | SR0 | SR16 | SP0 | RASR0 |
0001 | SR1 | SR17 | SP0 | RASR1 |
0010 | SR2 | SR18 | SP0 | RASR2 |
0011 | SR3 | SR19 | SP0 | RASR3 |
0100 | SR4 | SR20 | SP0 | RASR4 |
0101 | SR5 | SR21 | SP0 | RASR5 |
0110 | SR6 | SR22 | SP0 | RASR6 |
0111 | SR7 | SR23 | SP0 | RASR7 |
1000 | SR8 | SR24 | SP0 | RASR8 |
1001 | SR9 | SR25 | SP0 | RASR9 |
1010 | SR10 | SR26 | SP0 | RASR10 |
1011 | SR11 | SR27 | SP0 | RASR11 |
1100 | SR12 | SR28 | SP0 | RASR12 |
1101 | SR13 | SR29 | SP0 | RASR13 |
1110 | SR14 | SR30 | SP0 | RASR14 |
1111 | SR15 | SR31 | SP0 | RASR15 |
SR0经常读出32位零,并忽略对它的写入。异常
向量处理器不可得到。MTER 转移到扩展寄存器格式
MRC{cond} p7,2,Rd,cP,cER,0
MFVP{cond} Rd,RNAME
这里Cond={eq,he,cs,cc,mi,pl,rs,vc,hi,ls,ge,lt,gt,le,al,nv},Rd={r0,...r15},P={0,1},ER={0,....15}。RNAME指的是结构上指定的寄存器助记符(即,PERO或CSR)。说明
该指令只在条件为真时执行。ARM7寄存器Rd根据以P:ER<3:0>指定的扩展寄存器ER转移。如下表所示
ER<3:0> | P=0 | P=1 |
0000 | UER0 | PER0 |
0001 | UER1 | PER1 |
0010 | UER2 | PER2 |
0011 | UER3 | PER3 |
0100 | UER4 | PER4 |
0101 | UER5 | PER5 |
0110 | UER6 | PER6 |
0111 | UER7 | PER7 |
1000 | UER8 | PER8 |
1001 | UER9 | PER9 |
1010 | UER10 | PER10 |
1011 | UER11 | PER11 |
1100 | UER12 | PER12 |
1101 | UER13 | PER13 |
1110 | UER14 | PER14 |
1111 | UER15 | PER15 |
位19:17和7:5备用异常
MRC{cond}p7,1,Rd,Crn,CRm,0
MFVP{cond}Rd,RNAME
这里Cond={eq,ne,cs,cc,mi,pl,vs,vc,hi,ls,ge,lt,gt,le,al,nv},Rd={r0,...r15},CRn={c0,....c15},CRm={c0,....c15}。RNAME指的是结构上指定的寄存器助记符(即,SPO或VCS)。说明
该指令只在Cond为真时执行。ARM7寄存器Rd根据向量处理器的标量/专用寄存器CRn<1:0>:CRm<3:0>转移。
位7:5及CRn<3:2>保留。
向量处理器寄存器映射如下所示
异常
CRM<3:0> | CRn<1:0>=00 | CRn<1:0>=01 | CRn<1:0>=10 | CRn<1:0>=111 |
0000 | SR0 | SR16 | SP0 | RASR0 |
0001 | SR1 | SR17 | SP0 | RASR1 |
0010 | SR2 | SR18 | SP0 | RASR2 |
0011 | SR3 | SR19 | SP0 | RASR3 |
0100 | SR4 | SR20 | SP0 | RASR4 |
0101 | SR5 | SR21 | SP0 | RASR5 |
0110 | SR6 | SR22 | SP0 | RASR6 |
0111 | SR7 | SR23 | SP0 | RASR7 |
1000 | SR8 | SR24 | SP0 | RASR8 |
1001 | SR9 | SR25 | SP0 | RASR9 |
1010 | SR10 | SR26 | SP0 | RASR10 |
1011 | SR11 | SR27 | SP0 | RASR11 |
1100 | SR12 | SR28 | SP0 | RASR12 |
1101 | SR13 | SR29 | SP0 | RASR13 |
1110 | SR14 | SR30 | SP0 | RASR14 |
1111 | SR15 | SR31 | SP0 | RASR15 |
向量处理器不可得到。PFTCH 预取格式
30 25 20 15 10 5
0汇编器句法
LDC{cond} p15,2,<Address>
PFTCH{cond}<Address>
这里Cond={eq,he,cs,cc,mi,pl,rs,vc,hi,Is,ge,lt,ge,lt,le,al,nv},参考地址方式句法的ARM7数据表。说明
该指令仅在Cond为真时执行。由EA指定的高速缓存行被预取到ARM7数据高速缓存中。操作
关于EA如何被计算,参考ARM7数据表。异常:无STARTVP 启动向量处理器格式
30 25 20 15 10 5
0汇编器句法
CDP{cond}p7,0,cO,cO,cO
STARTVP{cond}
其中cond={eq,he,cs,cc,mi,pl,vs,vc,hi,Is,ge,it,gt,le,al,nv}。说明
该指令仅在cond为真时执行。该指令向向量处理器发信号,启动执行和自动地清除VISRC<vjp>和VISRC<vip>。ARM7不等待向量处理器启动执行,继续执行下一指令。
向量处理器的状态,在这个指令执行以前必须要初始化成所要的状态。如果向量处理器已经在VP-RUN状态,则该指令无作用。
位19:12,7:5及3:0保留。异常
向量处理器不可得到。TESTSET 测试和设置格式
30 25 20 15 10 5
0汇编器句法
MRC{cond}p7,0,Rd,cO,cER,0
TESTSET {cond} Rd,RNAME
这里cond={eq,he,cs,cc,mi,pl,rs,re,hi,ls,ge,It,gt,le,al,nv}。Rd={r0....r15},ER={0,.....15},RNAME指结构上指定的寄存器助记符(即,VER1或VASYNC)。说明
该指令只在cond为真时执行,该指令把UERX的内容返回到RD中,并设定UERX<30>为1。如果ARM7寄存器15指定为目的寄存器则UERx<30>在CPSR的Z位返回,以便能实现短的忙等待循环。
当前,只有UER1被规定随同读指令工作。
位19:17及7:5保留。异常:无
附录B
多媒体处理器100的结构定义了处理器110用MFER和MTER指令访问的扩展寄存器,扩展寄存器包括特许扩展寄存器和用户扩展寄存器。
特许扩展寄存器主要用于控制多媒体信号处理器的操作。它们被示于表B.1表B.1:特许扩展寄存器
号 | 助记符 | 说明 |
PER0 | CTR | 控制寄存器 |
PER1 | PVR | 处理器类型寄存器 |
PER2 | VIMSK | 向量中断屏蔽寄存器 |
PER3 | AIABR | ARM7指令地址断点寄存器 |
PER4 | ADABR | ARM7数据地址断点寄存器 |
PER5 | SPREG | 高速暂存寄存器 |
PER6 | STR | 状态寄存器 |
控制寄存器控制MSP100的操作,CTR中的所有位在复位时被清除,寄存器的定义如表B.2所示。表B.2:CTR的定义
位 | 助记符 | 说明 |
31-13 | 保留位永远作为0读出 | |
12 | VDCI | 向量数据高速缓存无效位。置位时,使全部向量处理器数据高速缓存变成无效。因高速缓存无效操作通常会与正常高速缓存操作冲突,所以只能支持一个无效码序列。 |
11 | VDE | 向量数据高速缓存使能位。当清除时,禁止向量处理器数据高速缓存 |
10 | VICI | 向量指令高速缓存无效位。当置位时使全部向量处理器指令高速缓存变成无效。因高速缓存无效操作通常会与正常高速缓存操作冲突。所以只能支持一个无效码序列。 |
9 | VICE | 向量指令高速缓存使能位。当清除时,禁止向量处理器指令高速缓存。 |
位 | 记忆符 | 说明 |
8 | ADCI | ARM7数据高速缓存无效位。当置位时,使全部ARM7数据高速缓存变成无效。因高速缓存无效操作通常会同正常高速缓存操作冲突,所以只支持一个无效码序列。 |
7 | ADCE | ARM7数据高速缓存使能位。当清除时禁止ARM7数据高速缓存。 |
6 | AICI | ARM7指令高速缓存无效位。当置位时,使全部ARM7指令高速缓存变成无效。因高速缓存无效操作通常会同正常高速缓存操作冲突,所以只支持一个无效码序列。 |
5 | AICE | ARM7指令高速缓存使能位。当清除时,禁止ARM7指令高速缓存 |
4 | APSE | ARM7处理器单步使能位。当置位时,使ARM7处理器在执行一条指令后,发生ARM7处理器单步异常。单步功能只在用户或管理方式下得到。 |
3 | SPAE | 高速暂存存取使能位。当设定时,允许ARM7处理从高速暂存加载或存到高速暂存。当清除时,试图加载或存贮到高速暂存以产生ARM7无效数据地址异常 |
2 | VPSE | 向量处理器单步使能位。当设定时,使向量处理器在执行一条指令后,发生向量处理器单步异常。 |
1 | VPPE | 向量处理器流水线使能位。当清除时,配置向量处理器以便在非流水线方式下操作。此时在向量处理器执行流水线中,只有一条指令是活动的。 |
0 | VPAE | 向量处理器访问使能位。当设定时如上所述使ARM7处理执行扩展的ARM7指令。当清除时,阻止ARM7处理执行扩展ARM7指令。凡这样的企图会产生向量处理器不可得到的异常 |
状态寄存器指示MSP100的状态。字段STR中的所有位在复位时被清除,寄存器的定义如表B.3所示。表B.3 STR定义
位 | 助记符 | 说明 |
31:23 | 保留位-永远读作0 | |
22 | ADAB | 当ARM7数据地址断点匹配发生时,ARM7数据地址断点异常位被设置,通过数据异常中断报告该异常。 |
21 | AIDA | 当ARM7加载或存贮指令试图访问未决定的地址或MSP具体方案未完成时,或当试图访问一个不允许的高速暂存器时,产生ARM7无效数据地址异常。这种异常可通过数据终止中断来报告。 |
20 | AIAB | 当ARM7指令地址断点匹配出现时,ARM7指令地址断点异常位被设定。该异常通过预取终止中断来报告。 |
19 | AIIA | ARM7无效指令地址异常。该例外通过预取终止中断来报告。 |
18 | ASTP | ARM7单步异常。该异常通过预取终止中断来报告。 |
17 | APV | ARM7保护违例。该异常通过IRQ中断来报告 |
16 | VPUA | 向量处理器不可得到异常,该异常通过协处理器不可得到中断来报告 |
15-0 | 保留-永远读作0 |
处理器类型(Version)寄存器标识处理器的多媒体信号处理器系列的具体处理器的类型。
向量处理器中断屏蔽寄存器VIMSK控制对处理器110的向量处理器异常的报告。当随着VISRC寄存器中相应的位而设定时,VIMSK中的每一位对中断ARM7产生异常。它并不影响如何检测向量处理器的异常,但影响是否异常将中断ARM7。在VIMSK中的所有位在复位时被清除。寄存器的定义如表B.4所示表B.4:VIMSK的定义
位 | 助记符 | 说明 |
31 | DABE | 数据地址断点中断使能 |
30 | IABE | 指令地址断点中断使能 |
29 | SSTPE | 单步中断使能 |
28-14 | 保留-永远读作0。 | |
13 | FOVE | 浮点溢出中断使能 |
12 | FINVE | 浮点非法操作数中断使能 |
11 | FDIVE | 浮点被零除中断使能 |
10 | IOVE | 整数溢出中断使能 |
9 | IDIVE | 整数被除零中断使能 |
8-7 | 保留-永远读作0 | |
6 | VIE | VCINT中断使能 |
5 | VJE | VCJOIN中断使能 |
4-1 | 保留-永远读作0 | |
0 | CSE | 上下文转换使能 |
ARM7指令地址断点寄存器辅助调试ARM7程序。寄存器的定义如表B.5所示。表B.5:AIABR的定义
位 | 助记符 | 说明 |
31-2 | IADR | ARM7指令地址 |
1 | 保留,永远读成0 | |
0 | IABE | 指令地址断点能使,在复位时清除。如果置位,当“ARM7指令访问地址”匹配AIABR<31:2>,及VCSR<AIAB>被清除时,发生ARM7指令地址断点异常,VCSR<AIAB>置位以表示异常。当匹配发生时,若VCSR<AIAB>已置位,则该VCSR<AIAB>被清除,匹配被忽视。在指令执行前报告异常。 |
“ARM7数据地址断点寄存器”辅助调试ARM7程序。寄存器的定义如表B.6所示。表B.6:ADABR定义
位 | 助记符 | 说明 |
31-2 | DADR | ARM数据地址。在复位时无定义 |
1 | SABE | 存贮“地址断点使能”,在复位时清除。如果置位,当ARM7存贮访问地址的高30位匹配ADABR<31:2>且VCSR<ADAB>被清除时,发生“ARM7数据地址断点”异常。VCSR<ADAB>置位表示异常。当匹配发生时,如果VCSR<ADAB>已经设置,则此VCSR<ADAB>被清除,匹配被忽略。在存贮指令执行之前,异常被报告。 |
0 | LABE | 加载地址断点使能。在复位时清除。如果置位,当ARM7加载访问地址的高30位匹配ADABR<31:2>且VCSR<ADAB>被清除时发生“ARM7数据地址断点”异常。VCSR<ADAB>被置位以表示异常。当匹配发生时如果VCSR<ADAB>已经置位,此VCSR<ADAB>被清除,匹配被忽略。在加载指令之前报告异常。 |
“高速暂存寄存器”配置在高速缓存子系统130中使用SRAM形成的高速暂存的地址和尺寸。寄存器定义示于表B.7表B.7:SPREG的定义
位 | 助记符 | 说明 |
31-11 | SPBASE | “高速暂存基址”指示高速暂存的起始地址的高21位。根据MSP_BASE寄存器中的值,这值必须有4M字节的偏移 |
10-2 | 保留 | |
1-0 | SPSIZE | 高速暂存的尺寸00->0K(用4K向量处理器数据高速缓存)01->2K(用2K向量处理器数据高速缓存)10->3K(用1K向量处理器数据高速缓存)11->4K(不用向量处理器数据高速缓存) |
用户扩展寄存器主要用于处理器110和120的同步。用户扩展寄存器当前被定义的只有一位,映射到位30,并且例如“MFERR15、UERx”的指令将位的值返回成为Z标志。位UERx<31>和UERx<29:0>总是被读作0。用户扩展寄存器在表B.8中被说明。表B.8:用户扩展寄存器
号 | 助记符 | 说明 |
UER0 | VPSTATE | 向量寄存器状态标志。当置位时,位30表示向量处理器在VP_RUN状态,并执行指令。当清除时,表示向量处理器处在VP_IDLE状态,并已经停止VPC寻址下一条指令以便执行。VPSTATE<30>在复位时被清除。 |
UER1 | VASYNC | 向量和ARM7同步标志。位30提供向量和ARM7处理器120及110之间的生产者/消费者类型同步。向量处理器120能用VMOV指令设置或清除这标志。该标志亦可以通过ARM7用MFER或MTER指令的处理被设置或清除。此外,标志能用TESTSET指令读出或置位。 |
表B.9显示了在加电复位时扩展寄存器的状态。表B.9:扩展寄存器加电状态
寄存器 | 复位状态 |
CTR | 0 |
PVR | TBD |
VIMSK | 0 |
AIABR | AIABR<0>=0,其它均未定义 |
ADABR | ADABR<0>=0,其它均未定义 |
STR | 0 |
VPSTATE | VPSTATE<30>=0,其它均未定义 |
VASYNE | VASYNC<3>=0,其它均未定义 |
附录C
向量处理器120的结构状态包括32个32位标量寄存器;32个288位向量寄存器的2个组;一对576位向量累加寄存器;一组32位专用寄存器。标量、向量及累加器寄存器拟供通用编程用,并支持许多不同数据类型。
下面的标记用于这里及以后各部分:VR表示向量寄存器;VRi表示第i个向量寄存器(零偏移);VR[i]表示在向量寄存器VR中第i个数据元素;VR<a:b>表示在向量寄存器中位a到b,而VR[i]<a:b>表示在向量寄存器VR中第i个数据元素的位a到b。
对于一个向量寄存器中的多个元素,向量结构有一个额外数据类型和数据长度的尺寸。由于向量寄存器有固定尺寸,它能保持的数据元素数取决于元素的长度。MSP结构定义了如表C.1所示的5种元素长度。表C.1:数据元素的长度
长度名字 | 长度(位) |
布尔 | 1 |
字节 | 8 |
字节9 | 9 |
半字 | 16 |
字 | 32 |
MSP结构,根据指令中指定的数据类型和长度来解释向量数据。通常,大部分算术指令中字节、字节9、半字和字元素长度支持2的补码(整数)格式。此外,对大部分算术指令,字元素长度支持IEEE754单精度格式。
一个程序员可以任何所要的方式解释数据,只要指令序列产生有意义的结果。例如,程序员可自由用字节9来存贮8位无符号数,相当于可自由把8位无符号数存到字节数据元素中,并用提供的2的补码的算术指令去操作它们,只要程序能处理“假”溢出结果。
有32个标量寄存器,称为SR0到SR31。标量寄存器为32位长并能容纳任何一种所定义长度的一个数据元素。标量寄存器SR0是一个特殊寄存器。寄存器SR0总是读出32位零。并无视对SR0寄存器的写入。字节、字节9和半字数据类型被存储在标量寄存器的最低有效位中,而那些最高有效位具有未定义的值。
由于寄存器没有数据类型指示器,程序员必须知道每条指令所用的寄存器的数据类型。这不同于认为32位寄存器包含32位值的其它结构。MSP结构规定数据类型A的结果仅正确地修改为数据类型A所定义的位。例如,字节9加的结果,只能修改32位目标标量寄存器的低9位。较高的23位值没有定义。除非用指令另外指出。
64个向量寄存器被构成2个组,每个组32个寄存器。组0包含起始32个寄存器,组体1包括其次的32个寄存器。这两个组中一个设置为当前组,另一个设置或替代组。全部向量指令通过缺省值使用当前组中的寄存器,除了加载/存贮和寄存器传送指令,它们能访问替代组中的向量寄存器。在“向量控制”和“状态寄存器VCSR”中的CBANK位可用来设置组0或者1成为当前组(另外一个成为替代组)。在当前组中的向量寄存器被指定为VR0到VR31,而在替代组中指定为VRA0到VRA31。
另外,这两个组从概念上能合并提供32个双倍尺寸的向量寄存器,每个寄存器576位。在控制寄存器VCSR中VEC64位指定这种方式。在VEC64模式中,不分当前组和替代组,而向量寄存器表示二个组中一对相应的288位向量寄存器,也就是
VRi<575:0>=VR1i<287:0>:VR0i<287:0>
这里VR0i和VR1i分别表示在组1和0中寄存器号为VRi的向量寄存器。双倍宽的向量寄存器被称为VR0到VR31。
向量寄存器能容纳字节、字节9、半字或字长度的多个元素,如表C.2所示。表C.2:每个向量寄存器的元素数
不支持在一个寄存器中混合多种元素长度。除字节9元素外只用288位中的256位。尤其是每个第9位不用。在字节、半字和字长度中不用的32位被保留。程序员对它们的值应不作任何假设。
元素长度名字 | 元素长度(位) | 元素最大数 | 所用的总位数 |
字节9 | 9 | 32 | 288 |
字节 | 8 | 32 | 256 |
半字 | 16 | 16 | 256 |
字 | 32 | 8 | 256 |
向量累加器寄存器要为比目的寄存器中的结果具有更高精度的中间结果提供存贮。向量累加器寄存器由4个288位寄存器组成,其为VAC1H、VAC1L、VAC0H和VAC0L。VAC0H:VAC0L对通过缺省由3条指令使用。只在VEC64模式中,VCL1H:VAC1L对用于模拟64字节9向量操作。即使在VEC32方式中设置组1为当前组,仍使用此VAC0H:VAC0L对。
为产生同在源矢量寄存器中有相同元素数的扩展精度的结果,通过一对寄存器来保存扩展精度元素,如表C.3所示。表C.3:向量累加器格式
元素长度 | 逻辑视区 | VAC格式 |
字节9 | VAC[i]<17:0> | VAC0H[i]<8>:VAC0L<i><8:0>用于i=0..31以及VAC1H[i-32]<8:0>:VAC1L[i-32]<8:0>用于i=32..63 |
字节 | VAC[i]<15:0> | VAC0H[i]<7:0>:VAC0L<i><7:0>用于i=0..31以及VAC1H[i-32]<7:0>:VAC1L[i-32]<7:0>用于i=32..63 |
半字 | VAC[i]<31:0> | VAC0H[i]<15:0>:VAC0L<i><15:0>用于i=0..15以及VAC1H[i-16]<15:0>:VAC1L[i-16]用于i=16..31 |
字 | VAC[i]<63:0> | VAC0H[i]<31:0>:VAC0L<i><31:0>用于i=0..7以及VAC1H[i-8]<31:0>:VAC1L[i-8]<31:0>用于i=8..15 |
仅在VEC64模式才用VAC1H:VAC1L对,在这时的元素数,字节9(和字节)、半字和字分别为64、32或16。
有33个专用寄存器不能直接从存贮器装载或直接存入存贮器。16个专用寄存器被称为RASR0到RASR15,形成一内部返回地址栈并由子例程调用和返回指令而使用。另外17个32位的专用寄存器示于表C.4表C.4:专用寄存器
号 | 助记符 | 说明 |
SP0 | VCSR | 向量控制和状态寄存器 |
SP1 | VPC | 向量程序计数器 |
SP2 | VEPC | 向量异常程序计数器 |
SP3 | VISRC | 向量中断源寄存器 |
SP4 | VIINS | 向量中断指令寄存器 |
SP5 | VCR1 | 向量计数寄存器1 |
SP6 | VCR2 | 向量计数寄存器2 |
SP7 | VCR3 | 向量计数寄存器3 |
SP8 | VGMR0 | 向量总屏蔽寄存器0 |
SP9 | VGMR1 | 向量总屏蔽寄存器1 |
SP10 | VOR0 | 向量溢出寄存器0 |
SP11 | VOR1 | 向量溢出寄存器1 |
SP12 | VIABR | 向量数据地址断点寄存器 |
SP13 | VDABR | 向量指令地址断点寄存器 |
SP14 | VMMR0 | 向量转移屏蔽寄存器0 |
SP15 | VMMR1 | 向量转移屏蔽寄存器1 |
SP16 | VASYNC | 向量和ARM7同步寄存器 |
向量控制和状态寄存器VCSR的定义示于表C.5表C.5:VCSR的定义
位 | 助记符 | 说明 |
31:18 | 保留 | |
17:13 | VSP<4:0> | 返回地址栈指针。VSP通过转移到子例程和从子例程指令返回来使用以跟踪内部返回地址的栈顶。在返回地址栈中只有16个入口,VSP<4>用于检测栈溢出条件。 |
12 | SO | 汇总溢出状态标志。当算术操作结果溢出时,该位被置位。该位在一旦设置后是不变的,直到给这位写0 |
时才清除。 | ||
位 | 助记符 | 说明 |
11 | GT | 大于状态标志。当SRa>SRb时,用VSUBS指令设置该位。 |
10 | EQ | 等于状态标志。当SRa=SRb时,用VSUBS指令设置该位。 |
9 | LT | 小于状态标志。当SRa<SRb时用VSUBS指令设置该位 |
8 | SMM | 选择转移屏蔽。当该位设置时,VMMR0/1对成为算术操作的元素屏蔽。 |
7 | CEM | 补码元素屏蔽。当该位设置时,无论那个配置成算术操作的元素屏蔽,元素屏蔽被定义成VGMR0/1或VMMR0/1的1的补码。该位并不改变VGMR0/1或VMMR0/1的内容,它只改变这些寄存器的使用。SMM:CEM编码规定:00-用VGMR0/1作为除VCMOVM外的所有元素屏蔽。01-用VGMR0/1作为除VCMOVM外的所有元素屏蔽。10-用VMMR0/1作为除VCMOVM外的所有元素屏蔽。11-用VMMR0/1作为除VCMOVM外的所有元素屏蔽。 |
6 | OED | 溢出异常禁止。当该位置位时,处理器120检测到溢出条件后仍继续执行。 |
5 | ISAT | 整型数饱和方式。OED:ISAT位的组合规定为:00 无OED:ISAT位饱和规定:00 不饱和,当发生溢出异常时报告。X1 饱和,不引起溢出 |
位 | 助记符 | 说明 |
10不饱和,当发生溢出异常时不报告。 | ||
4:3 | RMODE | IEEE754浮点操作舍入方式。00舍入方向负穷大01舍入方向零10舍入方向最接近值11舍入方向正无穷大 |
2 | FSAT | 浮点饱和方式位(快IEEE方式) |
1 | CBANK | 当前组位。当置位时表示组1为当前组。当清除时表示组0为当前组,当VEC64位置位时,CBANK忽略。 |
0 | VEC64 | 64字节9向量模式位。当置位时规定向量寄存器和累加器有576位。缺省模式规定32字节9长度,其被称为VEC32模式。 |
向量程序计数器寄存器VPC是由向量处理器120执行的下一指令的地址。ARM7处理器110在发出STARTVP指令以启动向量处理器120操作之前应当装载寄存器VPC。
向量异常程序计数器VEPC指出最可能引起最新异常的指令地址。MSP100不支持精确异常,因此,用了“最可能”一词。
向量中断源寄存器VISRC对ARM7处理器110指出中断源。适当的位通过硬件在异常检测到时被设置。在向量处理器120重新开始执行之前软件必须清除寄存器VISRC。在寄存器VISRC中的任何位置位均引起向量处理器120进入状态VP_IDLE。若相应的中断使能位在VIMSK中被设置,给处理器110的中断就被发出。表C.6定义了寄存器VISRC的内容。C.6:VISRC定义
位 | 记忆符 | 说明 |
31 | DAB | 数据地址断点异常 |
30 | IAB | 指令地址断点异常 |
29 | SSTP | 单步异常 |
28-18 | 保留 | |
17 | IIA | 无效指令地址异常 |
16 | IINS | 无效指令异常 |
15 | IDA | 无效数据地址异常 |
14 | UDA | 非对齐数据访问异常 |
13 | FOV | 浮点溢出异常 |
12 | FINV | 浮点无效操作数异常 |
11 | FDIV | 浮点被零除异常 |
10 | IOV | 整数溢出异常 |
9 | IDIV | 整数被零除异常 |
8 | RASO | 返回地址栈上溢异常 |
7 | RASU | 返回地址栈下溢异常 |
6 | VIP | VCINT异常挂起,执行STARTVP指令清除该位 |
5 | VJP | VCJOIN异常挂起,执行STARTVP指令清除该位 |
4-0 | VPEV | 向量处理器异常向量 |
向量中断指令寄存器VIINS,当VCINT或VCJOIN指令被执行以中断ARM7处理器110时,VCINT或VCJOIN指令被更新。
向量计数寄存器VCR1、VCR2和VCR3是用于“减量和分支”指令VD1CBR、VD2CBR及VD3CBR,并用执行的循环计数来被初始化。当执行VD1CBR指令时,寄存器VCR1被减1。如果计数值不为零,并且在指令内所指条件匹配VFLAG,则发生分支。否则,不发生分支。寄存器VCR1在任何情况下都可减1。寄存器VCR2和VCR3以相同方式被使用。
向量全屏蔽寄存器VGMR0表示在VEC32模式中将被影响的目的向量寄存器的元素和在VEC64模式中处在VR<287:0>内的元素。在VGMR0中的每一位控制向量目的寄存器中9个位的更新。具体讲,VGMR0<i>控制VEC32模式中VRd<9i+8:9i>的更新和VEC64模式中VR0d<9i+8:9i>的更新。注意,VR0d指的是在VEC64模式中组0内的目的寄存器,而VRd指的是当前组中的目的寄存器。在VEC32模式中,它既中是组0,也可为组1。向量全屏蔽寄存器VGMR0用于将VCMOVM指令以外的所有指令的执行中。
向量全屏蔽寄存器VGMR1表示在VEC64模式中将被影响的VR<575:288>内的元素。在寄存器VGMR1中的每位控制组1中向量目的寄存器中9个位的更新。具体讲VGMR1<i>控制VR1<9i+8:9i>的更新。寄存器VGMR1在VEC32模式中不使用,但在VEC64模式中,影响除VCMOVM指令外的所有指令的执行。
向量溢出寄存器VOR0表示在VEC32模式中的元素和VEC64模式中VR<287:0>内的元素,它们包括一向量算术运算后的溢出结果。该寄存器并不受标量算术运算的修改。位VOR0<i>设置表示字节和字节9的第i个元素、半字的第<i,idiv2>个元素、或字数据类型操作的第(i,idiv4)个元素包括溢出结果。例如,位1和位3可能分别被设置以表示第一个半字和字元素的溢出。在VOR0中位的映射不同于在VGMR0或VGMR1中位的映射。
向量溢出寄存器VOR1用来表示在VEC64模式中VR<575:288>内的元素,它们包括在向量算术运算后的溢出结果。寄存器VOR1在VEC32模式中并不用,也不由标量算术运算来修改。设置的位VOR1<i>表示字节或字节9的第i个元素、半字的第(i,idiv2)个元素、或字数据类型操作的第(i idiv4)个元素包括溢出结果。例如,位1和位3可能分别被设置以表示在VR<575:288>中第一个半字或字元素的溢出。在VOR1中位的映射不同于在VGMR0或VGMR1中位的映射。
向量指令地址断点寄存器VIABR辅助调试向量程序。寄存器的定义如表C.7所示。表C.7:VIABR的定义
位 | 助记符 | 说明 |
31-2 | IADR | 向量指令地址,在复位时不定义 |
1 | 保留位 | |
0 | IABE | 指令地址断点使能。在复位时不定义。如果置位,当向量指令访问地址同VIABR<31:2>匹配时发生“向量指令地址断点”异常,设置位VISRC<IAB>以表示异常。该异常在指令执行前报告。 |
向量数据地址断点寄存器VDABR辅助调试向量程序。寄存器的定义如表C.8表示。表C.8:VDABR的定义
位 | 助记符 | 说明 |
31-2 | DADR | 向量数据地址。在复位时不定义 |
1 | SABE | 存贮地址断点使能。复位时不定义。如果置位,当向量存储访问地址同VDABR<31:2>匹配时,发生“向量数据地址断点”异常。位VISRC<DAB>被置位以表示异常。在存贮指令执行之前报告异常。 |
0 | LABE | 加载地址断点使能。在复位时清除。如果置位,当向量加载访问地址同VDABR<31:2>匹配时发生“向量数据地址断点”异常。VISRC<DAB>被置位以表示异常。在加载指令执行之前报告异常。 |
向量转移屏蔽寄存器VMMR0在所有时间内供VCMOVM指令用,同时当VCSR<SMM>=1时供所有指令用。寄存器MMR0表示在VEC32模式中会受到影响的目的向量寄存器的元素,以及在VEC64模式中VRL<287:0>内元素。在VMMR0中的每个位控制向量目的寄存器中9个位的更新。具体说VMMR0<i>在VEC32模式中控制VRd<9i+8:9i>的更新,在VEC64模式中控制VR0d<9i+8:9i>的更新。在VEC64模式中VR0d表示在组0中的目的寄存器,VRd指在当前组中的目的寄存器,在VEC32模式中VRd既可在组0中也可在组1中。
向量转移屏蔽寄存器VMMR1在所有时间内供VCMOVM指令用,同时当VCSR<SMM>=1时供所有指令用。寄存器VMMR1表示在VEC64模式中会受影响的VR<575:288>中的元素,VMMR1中的每位控制在组1中向量目的寄存器中9个位的更新。具体说VGMR1<i>控制VR1d<9i+8:9i>的更新。寄存器VGMR1在VEC32模式中不使用。
向量和ARM7同步寄存器VASYNC提供在处理器110和120之间生产者/消费者型式的同步。当前,只定义了位30。当向量处理器120在VP_RUN或VP_IDLE时,ARM7处理器可用MFER、MTER和TESTSET指令访问寄存器VASYNC。寄存器VASYNC不能通过TVP或MFVP指令被ARM7处理器所访问。因为这些指令不能访问超出开始的16个向量处理器的专用寄存器。向量处理能通过VMOV指令访问寄存器VASYNC。
表C.9显示加电复位时的向量处理器的状态。表C.9:向量处理器加电复位状态
寄存器 | 复位状态 |
SR0 | 0 |
所有其它寄存器 | 无定义 |
在向量处理器能够执行指令之前,通过ARM7处理器110初始化专用寄存器。
附录D
每条指令隐含或规定了源和目的操作数的数据类型。某些指令具有同等地适用于多于一种数据类型的语义。某些指令具有的语义,对源采用一种数据类型,而对结果产生不同数据类型。本附录说明了示范性实施例支持的数据类型。在本申请中表1中说明了所支持的数据类型int8、int9、int16、int32和浮点数。不支持无符号的整型格式,对无符号的整型值在使用之前首先必须转换成2的补码格式。程序员可自由使用算术指令连同无符号整型或选择任何其它格式,只要合适地处理溢出。这种结构只定义了2的补码整型数和32位浮点数据类型的溢出。这些结构并不检测8、9、16或32位运算的执行,该运算是检测无符号溢出所必须的。表D.1显示了加载操作所支持的数据长度D.1:加载操作支持的数据长度
存贮器中数据长度 | 寄存器中数据长度 | 加载操作 |
8-bit | 9-bit | 加载8位,符号扩展到9位(用于加载8位2的补码) |
8-bit | 9-bit | 加载8位,零扩展到9位(用于加载无符号的8位) |
16-bit | 16-bit | 加载16位,(用于加载16位无符号或2的补码) |
32-bit | 32-bit | 加载32位,(用于加载32位无符号、2的补码整型数或32位浮点) |
这种结构规定存贮器地址按数据类型边界对齐。也就是对字节无对齐要求;对半字,对齐条件是半字边界;对字,对齐条件是字边界。
表D.2显示了存贮操作所支持的数据长度表D.2:存贮操作所支持的数据长度
寄存器中数据长度 | 存贮器中数据长度 | 存贮操作 |
8-bit | 8-bit | 存贮8位(存贮8位无符号或2的补码) |
9-bit | 8-bit | 截到低8位,存贮8位(存贮9位具 |
有无符号的值在0-255之间的2的补码) | ||
16-bit | 16-bit | 存贮16位(存贮16位无符号或2的补码)。 |
32-bit | 32-bit | 存贮32位 |
因为多于一种数据类型被映射到不论是标量或矢量的寄存器。所以在目的寄存器中对某些数据类型可能有些位没有定义的结果。事实上,除了在向量目的寄存器中字节9数据长度的操作和在标量目的寄存器中字数据长度操作之外,在目的寄存器中有些位,它们的值并不因操作而被定义。对这些位,结构规定他们的值是未定义的,表D.3显示了对每种数据长度未被定义的位。表D.3:数据长度的未定义位
数据长度 | 向量目的寄存器 | 标量目的寄存器 |
字节 | VR<9i+8>,for i=0 to 31 | SR<31:8> |
字节9 | none | SR<31:9> |
半字 | VR<9i+8>,for i=0 to 31 | SR<31:16> |
字 | VR<9i+8>,for i=0 to 31 | none |
程序员在编程时必须知道源和目的寄存器或存贮器的数据类型。数据类型从一种元素长度转换成另一种潜在地造成以不同元素数存贮在向量寄存器中。例如从半字到字数据类型的向量寄存器的转换需要2个向量寄存器去存贮同样数目的被转换元素。相反,从在向量寄存器中具有用户定义格式的字数据类型转换成半字格式,在向量寄存器的一半中产生相同数目元素,而剩余位在另一半中。在这两种情况下,数据类型转换产生一种具有被转换元素配置的结构,这些元素的长度不同于源元素的长度。
作为一个原理,MSP结构并不提供隐含地改变元素数量作为结果操作,这种结构意味着程序员必须知道改变目的寄存器中元素数的后果。此结构只提供从一种数据类型转换成同样长度的另一种数据类型的操作。并且当从一种数据类型转或另一种不同长度的数据类型时,需要程序员为数据长度的差异作出调整。
在附录E中所述的专用指令如VSHFLL和VUNSHFLL使第一种数据长度的向量转换成第2种数据长度的向量简单化。在向量寄存器VRa中,从较小的元素长度(如int8)转换成较大元素长度,(如int16)的2补码数据类型所包括的基本步骤为:
1.使用字节数据类型,将VRa中的元素与另一向量VRb混洗成为2个向量VRc:VRd。在VRa中的元素转移倍宽寄存器VRc:VRd中int16数据元素的较低字节处。而其值不相关的VRb的元素转移到VRc:VRd的高字节处。该操作有效地把VRa元素的一半移到VRc中,另一半移到VRd中。这时,每个元素的长度,从字节加倍成半字。
2.对VRc:VRd中的元素算术移位移8位,并对它作符号扩展
在向量寄存器VRa中将2的补码数从较大元素长度(int16)转成较小长度(如int8)所包括的基本步骤为:
1.检查确认int16数据类型中的每个元素能以字节长度来表示。如果需要,在两端饱和该元素,以适合较小长度。
2.将VRa中的元素同另一向量VRb去混洗,转移到2个向量VRc:VRd中,在VRa:VRb中,每个元素的高半部转移到VRc,低半部转移到VRd中,这样在VRd的低半部中有效地集合了VRa中所有元素的低半部元素。
为了下列数据类型转换提供一些特殊指令:int32转成单精度浮点;单精度浮点转成定点(X.Y表示法);单精度浮点转成int32;int8转成int9;int9转成int16;及int16转成int9。
为了提供向量程序设计的灵活性,大部分向量指令使用元素屏蔽以及只操作在向量寄存器内所选定的元素。“向量全屏蔽寄存器”VGMR0和VGMR1标识的元素是通过向量指令在目的寄存器和向量累加器中要被修改的元素。对字节和字节9数据长度的操作,在VGMR0(或VGMR1)中32位中的每位标识要被操作的一个元素,位VGMR0<i>置位表示字节长度的元素i将被作用。这里的i是0到31。对半字数据长度操作来讲,在VGMR0(或VGMR1)中32位中的每二位标识要被操作的一个元素。位VGMR0<2i:2i+I>置位表示元素i将受作用,i为0到15。如果在半字数据长度操作中VGMR0的一对中只有一位被置位,则只有相应字节中的那些位被修改。对字数据长度操作,在VGMR0(或VGMR1)中每4位一组置位标识一元素被操作。位VGMR0<4i:4i+3>置位表示元素i将受作用,i是0到7。如果在VGMR0中不是4位一组的所有位为字数据长度操作而置位,则只是对应字节的那些位被修改。
VGMR0和VGMR1的设置可用VCMPV指令将向量寄存器同向量或标量寄存器比较或向量寄存器同立即值比较确定,该指令根据所规定的数据长度适合地设置屏蔽。因为标量寄存器被定义成只包含一个数据元素,所以标量操作(即目的寄存器是标量)不会受元素屏蔽影响。
为了向量编程的灵活性,大部分MSP指令支持向量和标量操作的3种形式,它们为:
1.向量=向量 操作 向量
2.向量=向量 操作 标量
3.向量=标量 操作 标量
情况2中标量寄存器规定作为B操作数,在标量寄存器中的单个元素复制成为了匹配向量A操作数中元素数所需的数量。复制的元素同被指定标量操作数中的元素具有相同值。标量操作数以立即操作数形式可来自标量寄存器或指令。在立即操作数的情况下,如果规定数据类型用的数据长度比可得到的立即字段长度大,则采用适当的符号扩展。
在许多多媒体应用中,特别注意源立即数和最后结果的精度。另外,整数乘指令产生能存贮在2个向量寄存器中的“双精度”中间结果。
通常,MSP结构支持8、9、16和32位元素的2的补码的整型格式和32位元素IEEE754单精度格式。定义的溢出,表示结果超出用规定数据类型所能表示的最大正值或最大负值范围。当发生溢出时,写到目的寄存器中的值不是有效数,所定义的下溢只用于浮点操作。
除非另有说明,所有浮点操作用位VCSR<RMODE>指定的4种舍入方式之一。某些指令用熟知的舍去零(偶舍入)的舍入方式。这些指令是明显指出的。
在许多多媒体应用中,饱和是一种重要功能。MSP结构支持所有4种整型和浮点操作饱和。在寄存器VCSR中位ISAT指定整型饱和方式。浮点饱和方式,亦称快速IEEE方式,它用VCSR中FSAT位来指定。当使能饱和方式时,超过最大正或大负值的结果分别设置成最大正或最大负值。在这种情况下,不发生溢出,溢出位不能被设置。
表D.4列出精确异常,这些异常在执行故障指定之前被检测和报告。异常向量地址用16进制表示表D.4:精确异常
异常向量 | 说明 |
0x00000018 | 向量处理器指令地址断点异常 |
0x00000018 | 向量处理器数据地址断点异常 |
0x00000018 | 向量处理器无效指令异常 |
0x00000018 | 向量处理器单步异常 |
0x00000018 | 向量处理器返回地址栈上溢异常 |
0x00000018 | 向量处理器返回地址栈下溢异常 |
0x00000018 | 向量处理器VCINT异常 |
0x00000018 | 向量处理器VCJOIN异常 |
表D.5列出不精确异常,这些异常在执行了某些在程序中处于故障指令之后的指令后,被检测和报告。表D.5:非精确异常
异常向量 | 说明 |
0x00000018 | 向量处理器无效指令地址异常 |
0x00000018 | 向量处理器无效数据地址异常 |
0x00000018 | 向量处理器不对齐数据存取异常 |
0x00000018 | 向量处理器整数上溢异常 |
0x00000018 | 向量处理器浮点上溢异常 |
0x00000018 | 向量处理器浮点无效操作数异常 |
0x00000018 | 向量处理器浮点数被0除异常 |
0x00000018 | 向量处理器整数被0除异常 |
附录E
本向量处理器指令包括示于表E.1中的十一个分类
表E.1 | 向量指令类汇总 |
类 | 说明 |
控制流 | 本类所含的指令用于控制包括转移和ARM7接口指令的程序流。 |
逻辑(按位方式,屏蔽) | 本类包括按位方式的逻辑指令。虽然(按位方式,屏蔽)数据类型是布尔类,但逻辑指令使用元素屏蔽以修改结果,从而要求数据类型。 |
移位和循环移位(按元素方式,屏蔽) | 本类所含的指令用于每个元素中的移位和循环位的屏蔽。本类区分元素的长度,并且受元素屏蔽的影响。 |
算术(按元素方式,屏蔽) | 本类包括按元素方式的算术指令。(按元素方式,屏蔽)就是说第i个元素结果是源中的第i个元素计算得到的,本类区分元素的类型,并受元素屏蔽的影响。 |
多媒体(按元素方式,屏蔽) | 本类所含的指令用于优化多媒体(按元素方式,屏蔽)的应用,本类区分元素类型,并受元素屏蔽影响。 |
数据类型转换(按元素方式,无屏蔽) | 本类包含的指令用于转换元素从一种(元素方式,无屏蔽)数据类型到另一种。本类的指令支持指定的数据类型集,并且不经过元素屏蔽,因为此结构不支持寄存器中多于一种的数据类型。 |
元素间算术 | 本类包括的指令用于从向量的不同位置取两个元素以产生算术结果。 |
元素间转移 | 本类包括的指令用于从向量的不同位置取两个元素以重新排列元素。 |
加载/存储 | 本类包括的指令用于加载或存储寄存器。这些指令不受元素屏蔽的影响。 |
高速缓存操作 | 本类所含指令用于控制指令和数据高速缓存。这些指令不受元素屏蔽的影响。 |
寄存器转移 | 本类包含的指令用于在两个寄存器间转移数据。这些指令通常不受元素屏蔽的影响,但某些可以选用元素屏蔽。 |
表E.2列出流控制指令。表E.2:流控指令
助记符 | 说明 |
VCBR | 条件分支 |
VCBRI | 间接条件分支 |
VD1CBR | 减量VCR1和条件分支 |
VD2CBR | 减量VCR2和条件分支 |
VD3CBR | 减量VCR3和条件分支 |
VCJSR | 条件转子例程 |
VCJSRI | 间接条件转子例程 |
VCRSR | 从程序条件返回 |
VCINT | 条件中断ARM7 |
VCJOIN | 条件与ARM7汇合 |
VCCS | 条件上下文切换 |
VCBARR | 条件屏障 |
VCHGCR | 改变控制寄存器(VCSR) |
逻辑类支持布尔数据类型,并受元素屏蔽影响。表E.3列出流控指令。表E.3:逻辑指令
助记符 | 说明 |
VNOT | NOT--B |
VAND | AND-(A&B) |
VCAND | 补码AND-(-A&B) |
VANDC | AND补码-(A&-B) |
VNAND | NAND--(A&B) |
VOR | OR-(A|R) |
VCOR | 补码OR-(-A|R) |
VORC | OR补码-(A|-R) |
VNOR | NOR--(A|R) |
VXOR | 异或-(A^R ) |
VXNOR | 异或非--(A^R) |
移位/循环转移类指令对int8、int9、int16和int32数据类型操作(非浮点数据类型),并受元素屏蔽的影响。表E.4列出了移位/循环移位类指令。表E.4:移位和循环移位类
助记符 | 说明 |
VDIV2N | 除2的幂 |
VLSL | 逻辑左移 |
VLSR | 逻辑右移 |
VROL | 循环左移 |
VROR | 循环右移 |
通常,算术类指令支持int8、int9、int16和int32和浮点数据类型,并受元素屏蔽的影响。对于不支持的数据类型的专门限制,参考下面每条指令的详细说明。VCMPV指令是不受元素屏蔽的影响,因其工作于元素屏蔽情况。表E.5列出算术类指令。表E.5:算术类
助记符 | 说明 |
VASR | 算术右移 |
VADD | 加 |
VAVG | 平均 |
VSUB | 减 |
VASUB | 减绝对值 |
VMUL | 乘 |
VMULA | 累加器乘 |
VMULAF | 乘累加器小数 |
VMULF | 乘小数 |
VMULFR | 乘小数和并舍入 |
VMULL | 乘低位 |
VMAD | 乘和加 |
VMADL | 乘和加低位 |
VADAC | 加和累加 |
助记符 | 说明 |
VADACL | 加和累加低位 |
VMAC | 乘和累加 |
VMACF | 乘和累加小数 |
VMACL | 乘和累加低位 |
VMAS | 乘和从累加器减 |
VMASF | 乘和从累加器小数减 |
VMASL | 乘和从累加器低位减 |
VSATU | 饱和到上限 |
VSATL | 饱和到下限 |
VSUBS | 减标量和置条件 |
VCMPV | 比较向量和置屏蔽 |
VDIVI | 除初始化, |
VDIVS | 除 |
VASL | 算术右移 |
VASA | 累加器算术移一位 |
MPEG指令是专门适合于MPEG编码和解码的一类指令,但可以以不同的方式使用。MPEG指令不支持int8、int9、int16和int32数据类型,并受元素屏蔽的影响。表E.6列出了MPEG指令。表E.6:MPEG类
助记符 | 说明 |
VAAS3 | 加和加(-1,0,1)符号 |
VASS3 | 加和减(-1,0,1)符号 |
VEXTSGN2 | 抽取(-1,1)符号 |
VEXTSGN3 | 抽取(-1,0,1)符号 |
VXORALL | 异或全部元素的最低有效位。 |
每种数据类型转换指令支持特定的数据类型,并且不受元素屏蔽的影响,因为此结构不支持寄存器中多于一种的数据类型。表E.7列出了数据类型转换指令。表E.7:数据类型转换类
助记符 | 说明 |
VCVTIF | 转换整数到浮点数 |
VCVTFF | 转换浮点到定点数 |
VROUND | 舍入浮点到整数(支持4个IEEE舍入模式) |
VCNTLZ | 计数前导0 |
VCVTB9 | 转换字节9数据类型 |
内部元素算术类指令支持int8、int9、int16和int32和浮点数据类型。表E.8列出了内部元素算术类指令。表E.8:内部元素算术类
助记符 | 说明 |
VADDH | 两相邻元素加 |
VAVGH | 两相邻元素平均 |
VAVGQ | 四元素平均 |
VMAXE | 最大交换奇/偶元素 |
元素间转移类指令支持字节、字节9、半字和字数据长度,表E.9列出了元素间转移类指令。表E.9:元素间转移类
加载/存储指令除支持字节、半字和字数据长度外还特别支持字节9有关的数据长度操作,并受元素屏蔽的影响。表E.10列出了加载/存储类指令。表E.10:加载/存储类
助记符 | 说明 |
VESL | 元素左移一位 |
VESR | 元素右移一位 |
VSHFL | 偶/奇元素混洗 |
VSHFL | 偶/奇元素混洗 |
VSHFLH | 高偶/奇元素混洗 |
VSHFLL | 低偶/奇元素混洗 |
VUNSHFL | 偶/奇元素去混洗 |
VUNSHFLH | 高偶/奇元素去混洗 |
VUNSHFLL | 低偶/奇元素去混洗 |
助记符 | 说明 |
VL | 加载 |
VLD | 加载双字 |
VLQ | 加载四字 |
VLCB | 从环形缓存器加载 |
VLR | 逆元素序列加载 |
VLWS | 跨距加载 |
VST | 存储 |
VSTD | 存储双字 |
VSTQ | 存储四字 |
VSTCB | 存储到环形缓存器 |
VSTR | 逆元素序列存储 |
VSTWS | 跨距存储 |
大多数寄存器转移指令支持itt8、int9、int16和int32和浮点数类型,并不受元素屏蔽的影响,只有VCMOVM指令是受元素屏蔽的影响。表E.11列出寄存器转移类指令。表E.11:寄存器转移类
表E.12列出控制高速缓存子系统130的高速缓冲操作类指令。表E.12:高速缓存操作类
指令说明述语
助记符 | 说明 |
VLI | 立即数加载 |
VMOV | 转移 |
VCMOV | 条件转移 |
VCMOVM | 带元素屏蔽的条件转移 |
VEXTRT | 抽取一元素 |
VINSERT | 插入一元素 |
助记符 | 说明 |
VCACHE | 对数据或指令高速缓存的高速缓存操作 |
VPFTCH | 预取到数据高速缓存 |
VWBACK | 从数据高速缓存回写 |
为简化指令集的说明,在整个附录中采用了专门的术语。例如,指令操作数是字节、字节9、半字或字长度的带符号2的补码的整型数,除非另行注释。术语“寄存器”用于指通用(标量或向量)寄存器,其它类型的寄存器被清楚地说明。按汇编语言句法,尾标b、b9、h和w表示数据长度(字节、字节9、半字和字)以及整型数据类型(int8、int9、int16和int32)。另外,用于描述指令操作数、操作、以及汇编语言句法的术语和符号如下。Rd 目的寄存器(向量、标量或专用)Ra,Rb 源寄存器a和b(向量、标量或专用)Rc 源或目的寄存器c(向量或标量)Rs 存储数据源寄存器(向量或标量)S 32-bit标量或专用寄存器VR 当前组向量寄存器VRA 替代组向量寄存器VR0 0组向量寄存器VR1 1组向量寄存器VRd 向量目的寄存器(缺省为当前组,除非VRA被指定)VRa,VRb 向量源寄存器a和bVRC 向量源或目的寄存器CVRS 向量存储数据源寄存器VAC0H 向量累加器寄存器0高VAC0L 向量累加器寄存器0低VAC1H 向量累加器寄存器1高VAC1L 向量累加器寄存器1低SRd 标量目的寄存器SRa,SRb 标量源寄存器a和bSRb+ 以有效地址更新基址寄存器SRs 标量存储数据源寄存器SP 专用寄存器VR[i] 向量寄存器VR中的第i个元素VR[i]<a:b> 向量寄存器VR中第i个元素的a到b位VR[i]<msb> 向量寄存器VR中第i元素的最高有效位EA 存储器访问的有效地址MEM 存储器BYTE[EA] 存储器地址EA中的一个字节HALF[EA] 存储器地址EA中的半个字,地址EA+1为位<15:8>。WORD[EA] 存储器地址EA中的一个字,地址EA+3为位<31:24>。NumElem 为给出数据类型而指明的元素数目。在VEC32模式,对字
节和字节9、半字或字数据长度分别为32、16或8;在
VEC64模式,对字节和字节9、半字或字数据长度分别为
64、32或16。对标量操作NumElem是0。EMASK[i] 表示对第i元素的元素屏蔽。对字节和字节9、半字或字数
据长度,在VGMR0/1、~VGMR0/1、VMMR0/1或~
VMMR0/1中分别代表1、2或4个位。为标量操作,即使
EMASK[i]=0,也认为元素屏蔽被设置。MMASK[i] 表示对第i元素的元素屏蔽。在字节和字节9、半字或字数
据长度,在VMMR0或VMMR1中分别代表1、2或4个
位。VCSR 向量控制和状态寄存器VCSR<x> 表示VCSR中一个位或多个位。“x”是字段名VPC 向量处理器程序计数器VECSIZE 向量寄存器长度,在VEC32模式是32,在VEC64模式是
64。SPAD 暂存器
C编程结构用于描述流控操作。异常部分注明如下:= 赋值
连接{X‖Y} X或Y之间选择(不是逻辑或)sex 对指定的数据长度的符号扩展sex_dp 对指定的数据长度双精度数符号扩展sign》 (算术)右移符号扩展zex 对指定的数据长度的零扩展zero》 (逻辑)右移零扩展《 左移(填入零)trnc7 截去前面的7位(从半字)trnc1 截去前面的1位(从字节9)% 取模操作|expression| 取表达式的绝对值/ 除(对于浮点数据类型采用四种IEEE舍入模式之一)// 除(采用零舍入模式的舍入)Saturate( ) 对整数类型饱和到最大负值或最大正值,不产生溢出;对
于浮点数据类型,饱和可到正无穷大、正零、负零、或负
或无穷大。
通用指令格式显示在图8中并说明如下。REAR格式由load、store和cache操作指令使用,而REAR格式中的字段具有下面表E.13给出的意义。表E.13:REAR格式
位17:15被保留且应为零,以确保结构将来要扩展的兼容性。B:D和TT字段的某些编码未定义,编程者不应使用这些编码,因为结构没有规定当这样一种编码被使用的预期结果。表E.14示出VEC32和VEC64模式都支持的标量加载操作(在TT字段作为LT被编码)。表E.14在VEC32和VEC64模式下REAR加载操作
字段 | 意义 |
OPC<4:0> | 操作码 |
B | Rn寄存器的组标识符 |
D | 目的/源标量寄存器。当设置时,Rn<4:0>指出标量寄存器。在VEC32模式下,对B:D编码的合法值是:00Rn是当前组的向量寄存器01Rn是标量寄存器(在当前组中)10Rn是在替代组中的向量寄存器11未定义 |
在VEC64模式下,对B:D编码的合法值是:00在向量寄存器Rn中只有4、8、16或32个字节被使用01Rn是标量寄存器10向量寄存器Rn的全部64个字节被使用11未定义 | |
TT<1:0> | 传送类型,指示具体的加载或存储操作。见下面的LT和ST编码表。 |
C | 高速缓存关闭。设置该位以旁路加载时的数据高速缓存。这个位用加载和存储指令的cache-off助记符设置(连接OFF到助记符) |
A | 地址更新,设置此位用有效地址更新SRb。有效地址按SRb+SRi计算。 |
Rn<4:0> | 目的/源寄存器号 |
SRb<4:0> | 标量基址寄存器号 |
SRi<4:0> | 标量变址寄存器号 |
D:LT | 助记符 | 意义 |
100 | .bs9 | 加载8位成为字节9长度,符号扩展 |
101 | .h | 加载16位成为半字长度 |
110 | .bz9 | 加载8位成为字节9长度,零扩展 |
111 | .W | 加载32位成为字长度 |
表E.15显示VEC32模式支持的向量加载操作(在TT字段作为LT被编码),这时VCSR<0>位被清除。表E.15:VEC32模式下REAR加载操作
B位用于指示当前或替代组。
D:LT | 助记符 | 意义 |
000 | .4 | 从存储器加载4个字节进入寄存器较低的4个字节9,并保持剩下的字节9不改变。4个字节9的每个第9位根据相应的第8位作符号扩展。 |
001 | .8 | 从存储器加载8个字节进入寄存器较低的8个字节9,并保持剩下的字节9不改变。8个字节9的每个第9位根据相应的第8位作符号扩展。 |
010 | .16 | 从存储器加载16个字节进入寄存器较低的16个字节9,并保持剩下的字节9不改变。16个字节9的每个第9位根据相应的第8位作符号扩展。 |
011 | .32 | 从存储器加载32个字节进入寄存器较低的32个字节9,并保持剩下的字节9不改变。32个字节9的每个第9位根据相应的第8位作符号扩展。 |
表E.16给出VEC64模式下支持的向量加载操作(在TT字段作为LT被编码)。此时VCSR<0>位被设置。表E.16:VEC32模式下REAR的加载操作
位B用于指示64字节向量操作,因为在VEC64模式中不存在当有组和替代组的概念。
B:D:LT | 助记符 | 意义 |
0000 | .4 | 从存储器加载4个字节进入寄存器较低的4个字节9,并保持剩下的字节9不改变。4个字节9的每个第9位,根据相应的第8位作符号扩展。 |
0001 | .8 | 从存储器加载8个字节进入寄存器较低的8个字节9,并保持剩下的字节9不改变。8个字节9的每个第9位根据相应的第8位作符号扩展。 |
0010 | .16 | 从存储器加载16个字节进入寄存器较低的16个字节9,并保持剩下的字节9不改变。16个字节9的每个第9位根据相应的第8位作符号扩展。 |
B:D:LT | 助记符 | 意义 |
0011 | .32 | 从存储器加载32个字节进入寄存器较低的32个字节9,并保持剩下的字节9不改变。32个字节9的每个第9位根据相应的第8位作符号扩展。 |
1000 | 未定义 | |
1001 | 未定义 | |
1010 | 未定义 | |
1011 | .64 | 从存储器加载64个字节进入寄存器较低的64个字节9,并保持剩下的字节9不改变。64个字节9的每个第9位根据相应的第8位作符号扩展。 |
表E.17列出了VEC32和VEC64模式均支持的标量存储操作(在TT字段作为ST被编码)。表E.17:REAR的标量存储操作
D:ST | 助记符 | 意义 |
100 | .b | 存储字节或字节9长度成为8位(从字节9截断1位) |
101 | .h | 存储半字长度成为16位 |
110 | 未定义 | |
111 | .w | 存储字长度成为32位 |
表E.18列出VEC32模式支持的向量存储操作(在TT字段作为ST被编码),此时VCSR<0>位被清除。表E.18:VEC32模式下REAR的向量存储操作
D:ST | 助记符 | 意义 |
000 | .4 | 从寄存器存储4个字节到存储器,寄存器中4个字节9的每个第9位被忽略。 |
001 | .8 | 从寄存器存储8个字节到存储器,寄存器中8个字节9的每个第9位被忽略。 |
010 | .1b | 从寄存器存储16个字节到存储器,寄存器中16个字节9的每个第9位被忽略。 |
011 | .32 | 从寄存器存储32个字节到存储器,寄存器中32个字节9的每个第9位被忽略。 |
表E.19列出VEC64模式支持的向量存储操作(在TT字段作为ST被编码),这时VCSR<0>位被设置。表E.19:在VEC32模式下REAR向量存储操作
位B用于指出64字节向量操作,因为在VEC64模式中不存在当前组和替代组的概念。REAI格式由加载、存储和高速缓存操作指令使用,表E.20显示了REAI格式下各字段的意义。表E.20:REAI格式
REAR和REAI格式用于传送类型的相同编码。对进一步的编码细节参看REAR格式。RRRM5格式提供了三个寄存器或二个寄存器及一5位的立即操作数。表E.21定义了RRRM5格式的字段。表E.21:RRRM5格式
位19:15保留并且必须为零,以确保将来要扩展的兼容性。
B:D:ST | 助记符 | 意义 |
0000 | .4 | 从寄存器存储4个字节到存储器,寄存器中4个字节9的每个第9位被忽略。 |
0001 | .8 | 从寄存器存储8个字节到存储器,寄存器中8个字节9的每个第9位被忽略。 |
0010 | .16 | 从寄存器存储16个字节到存储器,寄存器中16个字节9的每个第9位被忽略。 |
0011 | .32 | 从寄存器存储32个字节到存储器,寄存器中32个字节9的每个第9位被忽略。 |
1000 | 未定义 | |
1001 | 未定义 | |
1010 | 未定义 | |
1011 | .64 | 从寄存器存储64个字节到存储器,寄存器中64个字节9的每个第9位被忽略。 |
字段 | 意义 |
OPC<4:0> | 操作码 |
B | Rn寄存器的组标识符。当在VEC32模式下设置时,Rn<4:0>表示在替代组中向量寄存器号;当在VEC64模式下设置时,表示全向量(64字节)操作。 |
D | 目的/源标量寄存器。当设置时,Rn<4:0>表示一标量寄存器。在VEC32模式下B:D编码的合法值是: |
00 Rn是当前组的向量寄存器01 Rn是标量寄存器(在当前组中)10 Rn是替代组的向量寄存器11 未定义在VEC64模式下B:D编码的合法值是:00 仅在向量寄存器Rn中的4、8、16或32个字节被使用01 Rn是标量寄存器10 向量寄存器Rn中整个64个字节被使用11 未定义 | |
TT<1:0> | 传送类型,表示具体的加载或存储操作。见下面的LT和ST编码表。 |
C | 高速缓存关闭,设置该位以旁路加载时的数据高速缓存。这个位用加载和存储指令的Cache-off助记符设置(连接OFF到助记符)。 |
A | 地址更新,设置此位用有效地址更新SRb。有效地址按SRb+IMM<7:0>计算。 |
Rn<4:0> | 目的/源寄存器号 |
SRb<4:0> | 标量基址寄存器号 |
IMM<7:0> | 一个8位的立即数偏移量,按二的补码数字说明。 |
字段 | 意义 |
OP<4:0> | 操作码 |
D | 目的标量寄存器。当设置时,Rd<4:1>指示标量寄存器;当清除时,Rd<4:0>指示向量寄存器。 |
S | 标量Rb寄存器。当设置时指出Rb<4:0>是标量寄存器;当清除时,Rb<4:0>是向量寄存器。 |
SD<1:0> | 数据宽度,其编码为:00字节(用于int8数据类型)01字节9(用于int9数据类型)10半字(用于int16数据类型)11字(用于int32或浮点数据类型) |
M | D:S位的修改符,见后面D:S:M编码表。 |
Rd<4:0> | 目标D寄存器号 |
Ra<4:0> | 源A寄存器号 |
Rb<4:0>或IM5<4:0> | 源B寄存器号或5位的立即数,取决于D:S:M编码,5位的立即数看成无符号数。 |
全部向量寄存器的操作数指的是当前组(既可是0组也可是1组)除非另做陈述。表E.22列出当DS<1:0>是00、01或10时的D:S:M编码。表E.22:DS不等于11时RRRM5的D:S:M编码
编码 | Rd | Ra | Rb/IM5 | 注释 |
000 | VRd | VRa | VRb | 三个向量寄存器操作数 |
001 | 未定义 | |||
010 | VRd | VRa | SRb | B操作数是标量寄存器 |
011 | VRd | VRa | IM5 | B操作数是5位的立即数 |
100 | 未定义 | |||
101 | 未定义 | |||
110 | SRd | SRa | SRb | 三个标量寄存器操作数 |
111 | SRd | SRa | IM5 | B操作数是5位的立即数 |
当DS<1:0>是11时D:S:M编码具有下面的意义:表E.23:DS等于11时,RRRM5的D:S:M编码
RRRR格式提供四种寄存器操作数,表E.24显示了RRRR格式下的字段。表E.24:RRRR格式
全部向量寄存器操作数指的是当前组(既可以是0组也可以是1组),除非另做陈述。RI格式仅由加载立即数指令使用。表E.25指明RI格式下的字段。表E.25:RI格式
字段F:DS<1:0>的某些编码未定义。编程者应不用这些编码,因为此结构没有给定当使用这种编码时的预期后果。加载进入Rd的值取决于数据的类型,如表E.26所示。表E.26:RI格式下的加载值
CT格式包含的字段示于表E.27。表E.27:CT格式
转移条件使用VCSR[GT:EQ:LT]字段。溢出条件使用VCSR[SO]位,当设置时,它优先于GT、EQ和LT位。VCCS和VCBARR则以不同于以上所说的来解释Cond<2:0>字段,参考它的指令说明细节。
D:S:M | Rd | Ra | Rb/IM5 | 注释 |
000 | VRd | VRa | VRb | 三个向量寄存器操作数(int32) |
001 | VRd | VRa | VRb | 三个向量寄存器操作数(float) |
010 | VRd | VRa | SRb | B操作数是一标量寄存器(int32) |
011 | VRd | VRa | IM5 | B操作数是5位的立即数(int32) |
100 | VRd | VRa | SRb | B操作数是一标量寄存器(float) |
101 | SRb | SRa | SRb | 三个标量寄存器操作数(float) |
110 | SRd | SRa | SRb | 三个标量寄存器操作数(int32) |
111 | SRd | SRa | IM5 | B操作数是5位的立即数(int32) |
字段 | 意义 |
Op<4:0> | 操作码 |
S | 标量Rb寄存器。当设置时指出Rb<4:0>是一标量寄存器;当清除时,Rb<4:0>是一向量寄存器。 |
DS<1:0> | 数据长度,其编码为:00字节(用于int8数据类型)01字节9(用于int9数据类型)10半字(用于int16数据类型)11字(用于int32数据类型) |
Rc<4:0> | 源/目的C寄存器号 |
Rd<4:0> | 目的D寄存器号 |
Ra<4:0> | 源A寄存器号 |
Rb<4:0> | 源B寄存器号 |
字段 | 意义 |
D | 目的标量寄存器。当设置时,Rd<4:0>表示一标量寄存器;当清除时,Rd<4:0>表示当前组中一向量寄存器。 |
F | 浮点数据类型。当设置时表明为浮点数据类型,并且要求DS<1:0>为11。 |
DS<1:0> | 数据长度,其编码为:00字节(用于int8数据类型)01字节9(用于int9数据类型)10半字(用于int16数据类型) |
11字(用于int32或浮点数据类型) | |
Rd<4:0> | 目的D寄存器号 |
IMM<18:0> | 一19位的立即数值 |
格式 | 数据类型 | 寄存器操作数 |
.b | 字节(8位) | Rd<7:0>:=Imm<7:0> |
.b9 | 字节(9位) | Rd<8:0>:=Imm<8:0> |
.h | 半字(16位) | Rd<15:0>:=Imm<15:0> |
.w | 字(32位) | Rd<31:0>:=符号扩展的IMM<18:0> |
.f | 浮点(32位) | Rd<31>:=Imm<18>(符号)Rd<30:23>:=Imm<17:0>(指数)Rd<22:13>:=Imm<9:0>(尾数)Rd<12:0>:=0 |
字段 | 意义 |
Opc<3:0> | 操作码 |
Cond<2:0> | 转移条件:000 无条件001 小于010 等于011 小于或等于100 大于101 不等于110 大于或等于111 溢出 |
IMM<22:0> | 23位的立即数字偏移量,按二的补码数说明。 |
RRRM9格式指明三个寄存器或二个寄存器及一9位的立即操作数。表E.28给出RRRM9格式的字段。表E.28:RRRM9格式
位19:15位被保留,当D:S:M编码没有指定一立即操作数,而且必须为0以确保将来的兼容性。
字段 | 意义 |
Opc<5:0> | 操作码 |
D | 目的标量寄存器。当设置时,Rd<4:0>表示一标量寄存器;当清除时,Rd<4:0>表示一向量寄存器。 |
S | 标量Rb寄存器。当设置时指示Rb<4:0>是一标量寄存器;当清除时,Rb<4:0>是一向量寄存器。 |
DS<1:0> | 数据宽度,其编码为:00字节(用于int8数据类型)01字节9(用于int9数据类型)10半字(用于int16数据类型) |
11字(用于int32或浮点数据类型) | |
M | 对D:S位的修改符,见后面的D:S:M编码表。 |
Rd<4:0> | 目的寄存器号 |
Ra<4:0> | 源A寄存器号 |
Rb<4:0>或IM5<4:0> | 源B寄存器号或一5位立即数,取决于D:S:M编码。 |
IM9<3:0> | 与IM5<4:0>一起提供一9位立即数,取决于D:S:M编码。 |
全部向量寄存器操作数指的是当前组(既可是0组也可以是1组)除非另做陈述。D:S:M编码同RRRM5格式的表E.22和E.23所示的那些是相同的,除了根据DS<1:0>编码从立即数字段抽取的立即数外,见表E.29所示。表E.29:RRRM9格式的立即数值
DS | 匹配的数据类型 | B操作数 |
00 | int8 | Source B<7:0>:=IM9<2:0>:IM5<4:0> |
01 | int9 | Source B<8:0>:=IM9<3:0>:IM5<4:0> |
10 | int16 | Source B<15:0>:=sex(IM9<3:0>:IM5<4:0>) |
11 | int32 | Source B<31:0>:=sex(IM9<3:0>:IM5<4:0>) |
浮点数据类型不能得到立即数格式。
下面是按字母数字排列的MSP向量指令。注意:
1.除非另外注明,指令是受元素屏蔽的影响。CT格式指令不受元素屏蔽影响。由加载、存储和高速缓存指令组成的REAR和REAI格式指令也不受元素屏蔽影响。
2.浮点数据类型下不能得到9位的立即操作数。
3.在操作说明中只给出了向量形式。对标量操作,假定只有一个,即第0个元素被定义。
4.对RRRRM5和RRRM9格式,下面的编码用于整型数据类型(b、b9、h、w):
D:S:M | 000 | 010 | 011 | 110 | 111 |
DS | 00 | 01 | 10 | 11 |
5.对RRRM5和RRRM9格式,下面的编码用于浮点数据类型:
D:S:M | 001 | 100 | n/a | 101 | n/a |
DS | 11 |
6.对于全部可能引起溢出的指令,当VCSR<ISAT>位被设置时,饱和到int8、int9、int16、int32的最大或最小限制被采用。相应地,当VCSR<FSAT>位设置时,浮点结果饱和到-无穷大、-0、+0或+无穷大。
7.按句法规则,.n可以用来代替.b9以表示字节9数据长度。
VAAS3.dt VRd,VRa,VRb
VAAS3.dt VRd,VRa,SRb
VAAS3.dt SRd,SRa,SRb
其中dt={b,b9,h,w}。支持的模式
说明
D:S:M | V<-V @ V | V<-V @ S | S<-S@S | ||
DS | int8(b) | int9(b9) | int16(h) | int32(w) |
向量/标量寄存器Ra的内容被加到Rb以产生一中间结果,该中间结果再附加上Ra的符号;并且最终结果存储在向量/标量寄存器Rd中。操作
for(i=0;i<NumElem && EMASK[i];i++){
if(Ra[i]>0) extsgn3=1;
else if(Ra[i]<0) extsgn3=-1;
else extsgn3=0;
Rd[i]=Ra[i]+Rb[i]+extsgn3;
}异常
溢出。VADAC 加和累加格式汇编器句法
VADAC.dt VRc,VRd,VRa,VRb
VADAC.dt SRc,SRd,SRa,SRb
其中dt={b,b9,h,w}。支持的模式
说明
S | VR | SR | ||
DS | int8(b) | int9(b9) | int16(h) | int32(w) |
将Ra和Rb操作数的每个元素与向量累加器的每个双精度元素相加。将每个元素的双精度和存储到向量累加器和目的寄存器Ra及Rd。Ra和Rb使用指定的数据类型,而VAC使用合适的双精度数据类型(16、18、32和64位分别对应int8、int9、int16和int32)。每个双精度元素的高位存储在VACH和Rc。如果Rc=Rd,Rc中的结果未定义。操作
for(i=0;i<NumElem && EMASK[i];i++){
Aop[i]={VRa[i]‖SRa}:
Bop[i]={VRb[i]‖SRb}:
VACH[i]:VACL[i]=sex(Aop[i]+Bop[i])+VACH[i]:VACL[i];
Rc[i]=VACH[i];
Rd[i]=VACL[i];
}VADACL 加和累加低位格式汇编器句法
VADACL.dt VRd,VRa,VRb
VADACL.dt VRd,VRa,SRb
VADACL.dt VRd,VRa,#IMM
VADACL.dt SRd,SRa,SRb
VADACL.dt SRd,SRa,#IMM
其中dt={b,b9,h,w}。支持的模式
说明
D:S:M | V<-V@V | V<-V@S | V<-V@I | S<-S@S | S<-S@I |
DS | int8(b) | int9(b9) | int16(h) | int32(w) |
将Ra和Rb/立即操作数的每个元素与向量累加器的每个扩展精度元素相加,将扩展精度的和存入向量累加器;将较低精度返回到目的寄存器Rd。Ra和Rb/立即数使用指定的数据类型,而VAC用适当的双精度数据类型(16、18、32和64位分别对应int8、int9、int16和int32)。每个扩展精度元素的高位存储在VACH中。操作
for(i=0;i<NumElem && EMASK[i];i++){
Bop[i]={VRb[i]‖SRb‖sex(IMM<8:0>)};
VACH[i]:VACL[i]=sex(Ra[i]+Bop[i])+VACH[i]:VACL[i]:
Rd[i]=VACL[i];
}VADD加格式汇编器句法
VADD.dt VRd,VRa,VRb
VADD.dt VRd,VRa,SRb
VADD.dt VRd,VRa,#IMM
VADD.dt SRd,SRa,SRb
VADD.dt SRd,SRa,#IMM
其中dt={b,b9,h,w,f}。支持的模式
说明
D:S:M | V<-V@V | V<-V@S | V<-V@I | S<-S@S | S<-S@I |
DS | int8(b) | int9(b9) | int16(h) | int32(w) | float(f) |
加Ra及Rb/立即操作数,并将其和返回到目的寄存器Rd。操作
for(i=0;i<NumElem && EMASK[i];i++){
Bop[i]=[VRb[i]‖SRb‖sex(IMM<8:0>)};
Rd[i]=Ra[i]+Bop[i];
}异常
VADDH.dt VRd,VRa,VRb
VADDH.dt VRd,VRa,SRb
for(i=0;i<NumElem-1;i++){
Rd[i]=Ra[i]+Ra[i+1];
}
Rd[NumElem-1]=Ra[NumElem-1]+{VRb[0]‖SRb];异常
溢出、浮点无效操作数。编程注解
本指令不受元素屏蔽影响。VAND与格式汇编器句法
VAND.dt VRd,VRa,VRb
VAND.dt VRd,VRa,SRb
VAND.dt VRd,VRa,#IMM
VAND.dt SRd,SRa,SRb
VAND.dt SRd,SRa,#IMM
其中dt={b,b9,h,w}。注意.w和.f指定相同的操作。支持的模式
说明
D:S:M | V<-V@V | V<-V@S | V<-V@I | S<-S@S | S<-S@I |
DS | int8(b) | int9(b9) | int16(h) | int32(w) |
对Ra和Rb/立即操作数进行逻辑与,并将结果返回到目的寄存器Rd,操作
for(i=0;i<NumElem && EMASK[i];i++){
Bop[i]={VRb[i]‖SRb‖sex(IMM<8:0>)};
Rd[i]<k>=Ra[i]<k>&Bop[i]<k>.k=for all bits in elementi;
}异常
无。VANDC与补码格式汇编器句法
VANDC.dt VRd,VRa,VRb
VANDC.dt VRd,VRa,SRb
VANDC.dt VRd,VRa,#IMM
VANDC.dt SRd,SRa,SRb
VANDC.dt SRd,SRa,#IMM
其中dt={b,b9,h,w}。注意.w和.f指定同样的操作。支持的模式
说明
D:S:M | V<-V@V | V<-V@S | V<-V@I | S<-S@S | S<-S@I |
DS | int8(b) | int9(b9) | int16(h) | int32(w) |
对Ra和Rb/立即操数的补码进行逻辑与,并将结果返回到目的寄存器Rd。操作
for(i=0;i<NumElem && EMASK[i];i++){
Bop[i]={VRb[i]‖SRb‖sex(IMM<8:0>)};
Rd[i]<k>=Ra[i]<k>&-Bop[i]<k>.k=for all bits in element i:
}异常
VASAL.dt
VASAR.dt
其中dt={b,b9,h,w},而R指出向左或向右移位方向。支持的模式
说明
R | left | right | ||
DS | int8(b) | int9(b9) | int16(h) | int32(w) |
向量累加器寄存器的每个数据元素左移一位的位置,且从右端以零填充(若R=0),或者带符号扩展右移一位的位置(若R=1)。其结果存储在向量累加器中。操作
for(i=0;i<NumElem && EMASK[i]:i++){
if(R=1)
VAC0H[i]:VAC0L[i]=VAC0H[i]:VAC0L[i]sign>>1;
else
VAC0H[i]:VAC0L[i]=VAC0H[i]:VAC0L[i]<<1;
}异常
VASL.dt VRd,VRa,SRb
VASL.dt VRd,VRa,#IMM
VASL.dt SRd,SRa,SRb
VASL.dt SRd,SRa,#IMM
其中dt={b,b9,h,w}。支持的模式
说明
D:S:M | V<-V@S | V<-V@I | S<-S@S | S<-S@I | |
DS | int8(b) | int9(b9) | int16(h) | int32(w) |
向量/标量寄存器Ra的每个数据元素左移,从右端以零填充,移位量由标量寄存器Rb或IMM字段给出,其结果存放在向量/标量寄存器Rd中。对引起溢出的那些元素,其结果根据其符号包含和到最大正值或最大负值。移位量定义为无符号整数。操作
shift_amount={SRb%32‖IMM<4:0>};
for(i=0;i<NumElem && EMASK[i];i++){
Rd[i]=saturate(Ra[i]<<shift_amount);
}异常
无。编程注解
注意shift_amount是从SRb或IMM<4:0>取得的5位数。对bytebyte9,halfword数据类型,编程者负责正确指定移位量,此移位量小于或等于数据长度的位数。如果移位量大于指定的数据长度,元素将由零来填充。VASR算术右移格式汇编器句法
VASR.dt VRd,VRa,SRb
VASR.dt VRd,VRa,#IMM
VASR.dt SRd,SRa,SRb
VASR.dt SRd,SRa,#IMM
其中dt={b,b9,h,w}。支持的模式
说明
D:S:M | V<-V@S | V<-V@I | S<-S@S | S<-S@I | |
DS | int8(b) | int9(b9) | int16(h) | int32(w) |
向量/标量寄存器Ra的每个数据元素被算术右移,最高有效位位置有符号扩展,移位量在标量寄存器Rb或IMM字段的最低有效位中给出,其结果存储在向量/标量寄存器Rd中。移位量规定为无符号整数。操作
shift_amount={SRb%32‖IMM<4:0>};
for(i=0;i<NumElem && EMASK[i];i++){
Rd[i]=Ra[i]sign>>shift_amount;
}异常
无。编程注解
注意shift-amount是从SRb或IMM<4:0>取得的5位数。对于byte,byte9,halfword数据类型,编程者负责正确地指定移位量,此移位量小于或等于数据长度的位数。如果移位量大于指定的数据长度,元素将由符号位填充。VASS3加及减(-1,0,1)符号格式汇编器句法
VASS3.dt VRd,VRa,VRb
VASS3.dt VRd,VRa,SRb
VASS3.dt SRd,SRa,SRb
其中dt={b,b9,h,w}。支持的模式
说明
D:S:M | V<-V@V | V<-V@S | S<-S@S | ||
DS | int8(b) | int9(b9) | int16(h) | int32(w) |
向量/标量寄存器Ra的内容被加到Rb以产生一中间结果,然后将Ra的符号从此中间结果中去掉;最终结果存储在向量/标量寄存器Rd中。操作
for(i=0;i<NumElem && EMASK[i];i++){
if(Ra[i]>0) extsgn3=1;
else if(Ra[i]<0) extsgn3=-1;
else extsgn3=0;
Rd[i]=Ra[i]+Rb[i]-extsgn3;
}异常
VASUB.dt VRd,VRa,VRb
VASUB.dt VRd,VRa,SRb
VASUB.dt VRd,VRa,#IMM
VASUB.dt SRd,SRa,SRb
VASUB.dt SRd,SRa,#IMM
其中dt={b,b9,h,w}。支持的模式
说明
D:S:M | V<-V@V | V<-V@S | V<-V@I | S<-S@S | S<S@I |
DS | int8(b) | int9(b9) | int16(h) | int32(w) | float(f) |
向量/标量寄存器Rb或IMM字段的内容从向量/标量寄存器Ra的内容中减去,其绝对值结果存储在向量/标量寄存器Rd中。操作
for(i=0;i<NumElem && EMASK[i];i++){
Bop[i]=[Rb[i]‖SRb‖sex(IMM<8:0>)};
Rd[i]={Ra[i]-Bop[i]};
}异常
溢出,浮点无效操作数。编程注解
如果减的结果是最大负数,则在绝对值操作后将发生溢出。如果允许饱和模式,此取绝对值操作的结果将是最大正数。VAVG 两元素平均格式汇编器句法
VAVG.dt VRd,VRa,VRb
VAVG.dt VRd,VRa,SRb
VAVG.dt SRd,SRa,SRb
其中dt={b,b9,h,w,f}。对整型数据类型使用VAVGT以指定“截断”舍入模式。支持的模式
说明
D:S:M | V<-V@V | V<-V@S | S<-S@S | ||
DS | int8(b) | int9(b9) | int16(h) | int32(w) | float(f) |
向量/标量寄存器Ra的内容加到向量/标量寄存器Rb的内容上以产生一中间结果;接着中间结果被2除,并将最终结果存储在向量/标量寄存器Rd中。对整型数据类型,如果T=1舍入模式是截断,而如果T=0(缺省),则舍去零。对浮点数据类型,舍入模式由VCSR<RMODE>指定。操作
for(i=0;i<NumElem && EMASK[i];i++){
Bop[i]=(Rb[i]‖SRb‖sex(IMM<8:0>)};
Rd[i]=(Ra[i]+Bop[i])//2;
}异常
VAVGH.dt VRd,VRa,VRb
VAVGH.dt VRd,VRa,SRb
其中dt={b,b9,h,w,f}。对整型数据类型使用VAVGHT以指定“截断”舍入模式。支持的模式
说明
D:S:M | V<-V@V | V<-V@S | |||
DS | int8(b) | int9(b9) | int16(h) | int32(w) | float(f) |
for(i=0;i<NumElem-1;i++){
Rd[i]=(Ra[i]+Ra[i+1])//2;
}
Rd[NumElem-1]=(Ra[NumElem-1]+(VRb[0]‖SRb})//2;异常
无。编程注解
VAVGQ.dt VRd,VRa,VRb
其中dt={b,b9,h,w}。对整型数据类型使用VAVGQT以指示“截断”舍入模式。支持的模式
说明
D:S:M | V<-V@V | |||
DS | int8(b) | int9(b9) | int16(h) | int32 (w) |
在VEC64模式下不支持本指令。
for(i=0;i<NumElem-1;i++){
Rd[i]=(Ra[i]+Rb[i]+Ra[i+1]+Rb[i+1])//4;
}异常
无。VCACHE Cache操作格式汇编器句法
VCACHE.fc SRd,SRi
VCACHE.fc SRb,#IMM
VCACHE.fc SRb+,SRi
VCACHE.fc SRb+,#IMM
其中fc={0,1}。说明
本指令供向量数据Cache的软件管理使用。当数据Cache的部分或全部被象暂时存储器那样配置,此指令对暂时存储器无影响。
支持下列选项:
操作异常
FC<2:0> | 意义 |
000 | 回写并使其标签与EA匹配的改动过的Cache行无效。如果匹配行包含未改动过的数据,则使此行无效而不回写。如果发现没有Cache行包含EA,则数据Cache保留不被触动。 |
001 | 回写并使由EA的索引指定的改动过的Cache行无效。如果匹配行包含未改动过的数据,使此行无效而不回写。 |
其它 | 未定义 |
无。编程注解
VCAND.dt VRd,VRa,VRb
VCAND.dt VRd,VRa,SRb
VCAND.dt VRd,VRa,#IMM
VCAND.dt SRd,SRa,SRb
VCAND.dt SRd,SRa,#IMM
其中dt=(b,b9,h,w)。注意.w和.f指明同样操作。支持的模式
说明
D:S:M | V<-V@V | V<-V@S | V<-V@I | S<-S@S | S<-S@I |
DS | int8(b) | int9(b9) | iht16(h) | int32(w) |
对Ra和Rb/立即操作数的补码进行逻辑与,并将其结果返回到目的寄存器Rd。操作
for(i=0;i<NumElem && EMASK[i];i++){
Bop[i]={VRb[i]‖SRb‖sex(IMM<8:0>)};
Rd[i]<k>=-Ra[i]<k> & Bop[i]<k>,k=for all bits in element i;
}异常
VCBARR. cond
其中cond={0-7}。每个条件将在后面给出助记符。说明
只要此条件保持有效,拖延本指令以及全部后面的指令(出现在程序序列后面的那些)。Cond<2:0>字段的解释不同于在CT格式下的其它条件指令。
当前定义下列条件:
操作
Cond<2:0> | 意义 |
000 | 在执行较后的任何指令之前,等待全部早先的指令(程序序列中较早出现的)以结束执行。 |
其它 | 未定义 |
while(Cond=true)
stall all later instructoins;异常
无。编程注解
此指令为软件而提供以强制指令的连串执行。此指令可被用于强迫精确报告不明确的异常事件。例如,如果该指令被立即用在可引起异常事件的算术指令以后,则此异常事件将以对该指令寻址的程序计数器报告。VCBR 条件转移格式汇编器句法
VCBR.cond #Offset
其中cond={un,lt,eq,le,le,ne,ge,ov}。说明
如果Cond为真,则转移,这不是延迟转移。操作
If((Cond=VCSR[SO,GT,EQ,LT])|(Cond=un))
VPC=VPC+sex(Offset<22:0>*4);
elseVPC=VPC+4;异常
无效的指令地址。VCBRI 间接条件转移格式汇编器句法
VCBRI.cond SRb
其中cond={un,lt,q,le,gt,ne,ge,ov}。说明
如果Cond为真,则间接转移。这不是延迟转移。操作
If((Cond=VCSR[SO,GT,EQ,LT])|(Cond=un))
VPC=SRb<31:2>:b’00;elseVPC=VPC+4;异常
VCCS #Offset说明
如果VIMSK<cse>为真,则跳转到现场转换子程序。这不是延迟转移。
如果VIMSK<cse>为真,则将VPC+4(返回地址)保存到返回地址堆栈。如果非真,从VPC+4继续执行。操作
If(VIMSK<cse>=1){ if(VSP<4>>15){ VISRC<RASO>=1; signal ARM7 with RASO exception; VP_STATE=VP_IDLE; }else{ RSTACK[VSP<3:0>]=VPC+4; VSP<4:0>=VSP<4:0>+1; VPC=VPC+sex(Offset<22:0>*4); } }else VPC=VPC+4;
异常
VCHGCR Mode说明
此指令改变向量处理器的操作模式
Mode中每位指定如下:
操作异常
方式 | 意义 |
bitl:0 | 这两位控制VCSR<CBANK>位。编码指定:00-不改变01-清除VCSR<CBANK>位10-设置VCSR<CBANK>位11-触发VCSR<CBANK>位 |
bits3:2 | 这两位控制VCSR<SMM>位。编码指定:00-不改变01-清除VCSR<SMM>位10-设置VCSR<SMM>位11-触发VCSR<SMM>位 |
bit5:4 | 这两位控制VCSR<CEM>位。编码指定:00-不改变01-清除VCSR<CEM>位10-设置VCSR<CEM>位11-触发VCSR<CEM>位 |
其它 | 未定义 |
无。编程注解
本指令为硬件提供,以比VMOV指令更为有效的方式改变VCSR中的控制位。VCINT 条件中断ARM7格式汇编器句法
VCINT.cond #ICODE
其中cond={un,lt,eq,le,gt,ne,ge,ov}。说明
如果Cond为真,当允许时,停止执行并中断ARM7。操作
If((Cond=VCSR[SO.GT.EQ.LT])|(Cond=un)){
VISRC<vip>= 1;
VIINS=[VCINT.cond#ICODE instruction];
VEPC=VPC;
if(VIMSK<vie>=1)signal ARM7 interrupt;
VP_STATE=VP_IDLE;
}
else VPC=VPC+4;异常
VCJOIN.cond #Offset
其中cond={un,lt,eq,le,gt,ne,ge,ov}。说明
如果Cond为真,当允许时,停止执行并中断ARM7。操作
If((Cond=VCSR[SO.GT.EQ.LT])|(Cond=un)){
VISRC<vjp>=-1;
VIINS=[VCJOIN.cond #Offset instruction];
VEPC=VPC;
if(VIMSK<vje>=1)signal ARM7 interrupt;
VP_STATE=VP_IDLE;
}
else VPC=VPC+4;异常
VCJOIN中断。VCJSR 条件跳转到子程序格式汇编器句法
VCJSR.cond #Offset
其中cond={un,lt,eq,le,gt,ne,ge,ov}。说明
如果Cond为真,则跳转到子程序。这不是延迟转移。
如果Cond为真,将VPC+4(返回地址)保存到返回地址堆栈。如果非真,则从VPC+4继续执行。操作
If((Cond=VCSR[SO.GT.EQ.LT)|(Cond=un)){ if(VSP<4>>15){ VISRC<RASO>=1; signal ARM7 with RASO exception; VP_STATE=VP_IDLE; }else{ RSTACK[VSP<3:0>]=VPC+4; VSP<4:0>=VSP<4:0>+1; VPC=VPC+sex(Offset<22:0>*4); } }else VPC=VPC+4;
异常
VCJSRI.cond SRb
其中cond={un,lt,eq,le,gt,ne,ge,ov}。说明
如果Cond为真,则间接跳转到子程序。这不是延迟转移。
如果Cond为真,则将VPC+4(返回地址)保存到返回地址堆栈。如果非真,从VPC+4继续执行。操作
If((Cond=VCSR[SO.GT.EQ.LT])|(Cond=un)){ if(VSP<4:0>15){ VISRC<RASO>=1; signal ARM7 with RASO exception; VP_STATE=VP_IDLE ; }else{ RSTACK[VSP<3:0>}=VPC+4; VSP<4:0>=VSP<4:0>+1; VPC=SRb<31:2>:b’00; } |else VPC=VPC+4:
异常
返回地址堆栈溢出。VCMOV 条件转移格式汇编器句法
VCMOV.dt Rd,Rb,cond
VCMOV.dt Rd,#IMM,cond
其中dt={b,b9,h,w,f},cond={un,lt,eq,le,gt,ne,ge,ov}。注意.f和.w指定相同的操作,除非f数据类型不支持9位的立即操作数。支持的模式
说明
D:S:M | V<-V | V<-S | V<-I | S<-S | S<-I |
DS | int8(b) | int9(b9) | int16(h) | int32(w) |
如果Cond为真,寄存器Rb的内容转移到寄存器Rd.ID<1:0>进一步指定源和目的寄存器:
VR 当前组向量寄存器
SR 标量寄存器
SY 同步寄存器
VAC 向量累加器寄存器(对VAC寄存器编码参照VMOV说明)
操作
D:S:M | ID<1:0>=00 | ID<1:0>=01 | ID<1:0>=10 | ID<1:0>=11 |
V<-V | VR<-VR | VR<-VAC | VAC<-VR | |
V<-S | VR<-SR | VAC<-SR | ||
V<-I | VR<-I | |||
S<-S | SR<-SR | |||
S<-I | SR<-I |
If((Cond=VCSR[SOV,GT,EQ,LT])|(Cond=un))
for(i=0;i<NumElem;i++)
Rd[i]={Rb[i]‖SRb‖sex(IMM<8:0>)};异常
无。编程注解
本指令不受元素屏蔽的影响,VCMOVM受元素屏蔽影响。
VCMOVM.dt Rd,Rb,cond
VCMOVM.dt Rd,#IMM,cond
其中dt={b,b9,h,w,f},cond={un,lt,eq,le,gt,ne,ge,ov}。注意.f和.w指定相同的操作,除非.f数据类型不支持9位的立即操作数。支持的模式
说明
D:S:M | V<-V | V<-S | V<-I | ||
DS | int8(b) | int9(b9) | int16(h) | int32(w) |
如果Cond为真,则寄存器Rb的内容转移到寄存器Rd。ID<1:0>进一步指定源和目的寄存器:
VR 当前组向量寄存器
SR 标量寄存器
VAC 向量累加器寄存器(对VAC寄存器编码参照VMOV说明)
操作
D:S:M | ID<1:0>=00 | ID-<1:0>=01 | ID<1:0>=10 | ID<1:0>=11 |
V<-V | VR<-VR | VR<-VAC | VAC<-VR | |
V<-S | VR<-SR | VAC<-SR | ||
V<-I | V<-I | |||
S<-S | ||||
S<-I |
If((Cond=VCSR[SO,GT,EQ,LT])|(Cond=un))
for(i=0;i<NumElem && MMASK[i];i++)
Rd[i]={Rb[i]‖SRb‖sex(IMM<8:0>)};异常
无。编程注解
本指令受VMMR元素屏蔽的影响,VCMOV不受元素屏蔽影响。
VCMPV.dt VRa,VRb,cond,mask
VCMPV.dt VRa,SRb,cond,mask
其中dt={b,b9,h,w,f},cond={lt,eq,le,gt,ne,ge,},mask={VGMR,VMMR}。如果指定不屏蔽,则VGMR被假定。支持的模式
说明
D:S:M | M<-V@V | M<-V@S | |||
DS | int8(b) | int9(b9) | int16(h) | int32(w) | float(t) |
向量寄存器VRa和VRb的内容通过执行减法操作(VRa[i]-VRb[i])进行元素方式的比较,如果比较的结果与VCMPV指令的Cond字段相匹配,则VGMR(如K=0)或VMMR(如K=1)寄存器中相位的#i位被设置。例如,如果Cond字段小于(LT),则当VRa[i]<VRb[i]时设置VGMR[i](或VMMR[i])位。操作
for(i=0;i<NumElem;i++){
Bop[i]={Rb[i]‖SRb‖sex(IMM<8:0>)}:
relationship[i]=Ra[i]?Bop[i];
if(K=1)
MMASK[i]=(relationship[i]=Cond)?Truc:False;
else
EMASK[i]=(relationship[i]=Cond)?True:False;
}异常
无。编程注解
此指令不受元素屏蔽的影响。VCNTLZ 前导零的计数格式汇编器句法
VCNTLZ.dt VRd,VRb
VCNTLZ.dt SRd,SRb
其中dt={b,b9,h,w}。支持的模式
说明
S | V<-V | S<-S | ||
DS | int8(b) | int9(b9) | int16(h) | int32(w) |
对Rb中每个元素进行前导零数目的计数;将计数值返回到Rd中。操作
for(i=0;i<NumElem && EMASK[i];i++){
Rd[i]=number of leading zeroes (Rb[i]);
}异常
无。编程注解
如果元素中全部位为零,则结果等于元素的长度(8、9、16或32分别对应byte、byte9、halfword或word)。
VCOR.dt VRd,VRa,VRb
VCOR.dt VRd,VRa,SRb
VCOR.dt VRd,VRa,#IMM
VCOR.dt SRd,SRa,SRb
VCOR.dt SRd,SRa,#IMM
其中dt={b,b9,h,w}。注意.w和.f指定相同的操作。支持的模式
说明
D:S:M | V<-V@V | V<-V@S | V<-V@I | S<-S@S | S<-S@I |
DS | int8(b) | int9(b9) | int16(h) | int32(w) |
对Ra和Rb/立即操作数的补码作逻辑或,并将结果返回到目的寄存器Rd。操作
for(i=0;i<NumElem && EMASK[i];i++){
Bop[i]={VRb[i]‖SRb‖sex(IMM<8:0>)};
Rd[i]<k>=-Ra[i]<k>|Bop[i]<k>.k=for all bits in elementi;
}异常
无。VCRSR 从子程序条件返回格式汇编器句法
VCRSR.cond
其中cond={un,lt,eq,le,gt,ne,ge,ov}。说明
如果Cond为真,则从子程返回。这不是延迟转移
如果Cond为真,则从保存在返回地址堆栈中的返回地址继续执行。如果非真,则从VPC+4继续执行。操作
If((Cond=VCSR[SO.GT.EQ.LT)|(Cond=un)){ if(VSP<4:0>=0){ VISRC<RASU>=1; signal ARM7 with RASU exception; VP_STATE=VP_IDLE; }elst{ VSP<4:0>=VSP<4:0>-1; VPC=RSTACK[VSP<3:0>]; VPC<1:0>=b’00; } }else VPC=VPC+4;
异常
VCVTB9.md VRd,VRb
VCVTB9.md SRd,SRb
其中md={bb9,b9h,hb9}。支持模式
说明
S | V<-V | S<-S | ||
MD | bb9 | b9h | hb9 |
Rb中的每个元素从byte转换到byte9(bb9),从byte9转换到halfword(b9h)或从halfword转换到byte9(hb9)。操作
if(md<1:0>=0){ //bb9 for byte to byte9 conversion VRd=VRb; VRd<9i+8>=VRb<9i+7>.i=0 to 31(or 63 in VEC64 mode)} else if(md<1:0>=2){ //b9h for byte9 to halfword conversion VRd=VRb; VRd<18i+16:18i+9>=VRb<18i+8>.i=0 to 15(or 31 in VEC64 mode)} else if(md<1:0>=3) //hb9 for halfword to byte9 conversion VRd<18i+8>=VRb<18i+9>.i=0 to 15(or 31 in VEC64 mode) else VRd=undefined;
异常
无。
编程注解
在与b9h模式一同使用该指令之前,要求编程者用shuffle(混洗)操作调整向量寄存器中所减少的元素数目。与hb9模式一同使用该指令之后,要求编程者用unshuffle操作调整目的向量寄存器中所增加的元素数目。此指令不受元素屏蔽的影响。VCVTFF 浮点到定点的转换格式汇编器句法
VCVTFF VRd,VRa,SRb
VCVTFF VRd,VRa,#IMM
VCVTFF SRd,SRa,SRb
VCVTFF SRd,SRa,#IMM支持的模式
说明
D:S:M | V<-V,S | V<-V,I | S<-S,S | S<-S,I |
向量/标量寄存器Ra的内容从32位浮点转换成格式<X,Y>的定点实数,其中Y的长度由Rb(模32)或IMM字段指定,而X的长度由(32-Y的长度)指定。X表示整数部分,Y表示小数部分。结果存放在向量/标量寄存器Rd中。操作
Y_size={SRb%32‖IMM<4:0>};
for(i=0;i<NumElem;i++){
Rd[i]=convert to<32-Y_size.Y_size>format(Ra[i]);
}异常
溢出。编程注解
VCVTIF VRd,VRb
VCVTIF VRd,SRb
VCVTIF SRd,SRb支持的模式
说明
D:S:M | V<-V | V<-S | S<-S |
向量/标量寄存器Rb的内容从int32转换为浮点数据类型,结果存放在向量/标量寄存器Rd中。操作
for(i=0;i<NumElem:i++){
Rd[i]=convert to floating point format(Rb[i]);
}异常
无。编程注解
VD1CBR.cond #Offset
其中cond={un,lt,eq,le,gt,ne,ge,ov}。说明
如果Cond为真,VCR1减1并转移。这不是延迟转移。操作
VCR1=VCR1-1;
If(VCR1>0)&((Cond=VCSR[SO,GT,EQ,LT])|(Cond=un)))
VPC=VPC+sex(Offset<22:0>*4);
else VPC=VPC+4;异常
无效的指令地址。编程注解
VD2CBR.cond #Offset
其中cond={un,lt,eq,le,gt,ne,ge,ov}。说明
如果Cond为真,VCR2减1并转移。这不是延迟转移。操作
VCR2=VCR2-1;
If(VCR2>0)&((Cond=VCSR[SO,GT,EQ,LT])|(Cond=un)))
VPC=VPC+sex(Offset<22:0>*4);
else VPC=VPC+4;异常
无效的指令地址。编程注解
注意VCR2是在转移条件被检查之前减1的。当VCR2为0时执行此指令,将循环计数有效设置到232-1。VD3CBR VCR3减1及条件转移格式汇编器句法
VD3CBR.cond #Offset
其中cond={un,lt,eq,le,gt,ne,ge,ov}。说明
当Cond为真,VCR3减1并转移。这不是延迟转移。操作
VCR3=VCR3-1;
If(VCR3>0)&((Cond=VCSR[SO,GT,EQ,LT])|(Cond=un)))
VPC=VPC+sex(Offset<22:0>*4);
else VPC=VPC+4;异常
无效的指令地址。编程注解
注意VCR3是在转移条件被检查之前减1的。当VCR3为0时执行此指令,将循环计数有效设置到232-1。VDIV2N 被2 n 除格式汇编器句法
VDIV2N.dt VRd,VRa,SRb
VDIV2N.dt VRd,VRa,#IMM
VDIV2N.dt SRd,SRa,SRb
VDIV2N.dt SRd,SRa,#IMM
其中dt={b,b9,h,w}。支持的模式
说明
D:S:M | V<-V@S | V<-V@I | S<-S@S | S<-S@I | |
DS | int8(b) | int9(b9) | int16(h) | int32(w) |
向量/标量寄存器Ra的内容被2n除,这里n是标量寄存器Rb或2MM的正整数内容,最终结果存放在向量/标量寄存器Rd中。此指令使用截断(向零舍入)作为舍入模式。操作
N={SRb%32‖IMM<4:0>};
for(i=0;i<NumElem && EMASK[i];i++){
Rd[i]=Ra[i]/2N;
}异常
无。编程注解
注意N是从SRb或IMM<4:0>取得的5位数。对byte、byte9、halfword数据类型,编程者负责正确指定数据长度中小于或等于精度级的N值。如果它大于指定数据长度的精度,元素将用符号位填充。本指令用向零舍入的舍入模式。VDIV2N.F 浮点被2 n 除格式汇编器句法
VDIV2N.f VRd,VRa,SRb
VDIV2N.f VRd,VRa,#IMM
VDIV2N.f SRd,SRa,SRb
VDIV2N.f SRd,SRa,#IMM支持的模式
说明
D:S:M | V<-V@S | V<-V@I | S<-S@S | S<-S@I |
向量/标量寄存器Ra的内容被2n除,这里n是标量寄存器Rb或IMM的正整数内容,最终结果存放在向量/标量寄存器Rd中。操作
N={SRb%32‖IMM<4:0>};
for(i=0;i<NumElem && EMASK[i];i++){
Rd[i]=Ra[i]/2N;
}异常
无。编程注解
VDIVI.ds VRb
VDIVI.ds SRb
其中ds={b,b9,h,w}。支持的模式
说明
S | VRb | SRb | ||
DS | int8(b) | int9(b9) | int16(h) | int32(w) |
执行不恢复的带符号整数除的初始化步骤。被除数是累加器中双精度带符号整数。如果被除数是单精度数,它必须被符号扩展到双精度,并存放在VAC0H和VAC0L中。除数是Rb中的单精度带符号整数。
如果被除数的符号与除数的符号相同,则从累加器高位中减去Rb。如不同,则Rb被加到累加器高位上。操作
for(i=0;i<NumElem && EMASK[i];i++){
Bop[i]={VRb[i]‖SRb}
if(VAC0H[i]<msb>=Bop[i]<msb>)
VAC0H[i]=VAC0H[i]-Bop[i];
else
VAC0H[i]=VAC0H[i]+Bop[i];
}异常
无。编程注解
在除法步骤之前,编程者负责检查溢出或被零除的情况。VDIVS 不完全的除步骤格式汇编器句法
VDIVS.ds VRb
VDIVS.ds SRb
其中ds={b,b9,h,w}。支持的模式
说明
S | VRb | SRb | ||
DS | int8(b) | int9(b9) | int16(h) | int32(w) |
执行一不恢复的带符号除的选代步骤。本指令要求被执行的次数与同数据的长度相同(例如,对int8为8次,int9为9次,int16为16,int32数据类型为32)。VDIVI指令必须在除步骤之前被使用一次,在累加器中产生初始部分的余数。除数是Rb中的单精度带符号整数。每个步骤提取一个商数位并移到累加器的最低有效位。
如果累加器中部分余数的符号与Rb中除数的符号相同,则从累加器高位中减去Rb。如果不同,Rb被加到累加器高位上。
如果累加器中得出的部分余数(加或减的结果)的符号与除数的符号相同,则商位为1。如果不相同,则商位为0。累加器左移一位的位置并用商位填入。
在除步骤的结尾,余数是在累加器高位中,而商在累加器低位中。此商是1的补码形式。操作VESL 元素左移一位格式汇编器句法
VESL.dt SRc,VRd,VRa,SRb
其中dt={b,b9,h,w,f}。注意.w和.f指定相同的操作。支持的模式
说明
S | SRb | |||
DS | int8(b) | int9(b9) | int16(h) | int32(w) |
将向量寄存器Ra中的元素左移一个位置,从标量寄存器Rb填入。正被移出的最左元素返回到标量寄存器Rc,其它元素返回到向量寄存器Rd。操作
VRd[0]=SRb;
for(i=o;i<NumElem-1;i++)
VRd[i]=VRa[i-1];
SRc=VRa[NumElem-1];异常
无。编程注解
VESL.dt SRc,VRd,VRa,SRb
其中dt={b,b9,h,w,f}。注意.w和.f指定相同的操作。支持的模式
说明
S | SRb | |||
DS | int8(b) | int9(b9) | int16(h) | int32(w) |
将向量寄存器Ra的元素右移一个位置,从标量寄存器Rb填入。正被移出的最右元素返回到标量寄存器Rc,其它元素返回到向量寄存器Rd。操作
SRc=VRa[0];
for(i=o;i<NumElem-2;i++)
VRd[i]=VRa[i+1];
VRd[NumElem-1]=SRb;异常
无。编程注解
此指令不受元素屏蔽的影响。VEXTRT 抽取一元素格式汇编器句法
VEXTRT.dt SRd,VRa,SRb
VEXTRT.dt SRd,VRa,#IMM
其中dt={b,b9,h,w,f}。注意.w和.f指定相同的操作。支持的模式
说明
D:S:M | S<-S | S<-I | |||
DS | int8(b) | int9(b9) | int16(h) | int32(w) |
从Ra向量寄存器抽取一元素并将其存入标量寄存器Rd,该寄存器的索引由标量寄存器Rb或IMM字段指出。操作
index32={SRb%32‖IMM<4:0>};
index64={SRb%64‖IMM<5:0>};
index=(VCSR<vec64>)?index64:index32;
SRd=VRa[index];异常
无。编程注解
VEXTSGN2.dt VRd,VRa
VEXTSGN2.dt SRd,SRa
其中dt={b,b9,h,w}。支持的模式
说明
S | V<-V | S<-S | ||
DS | int8(b) | int9(b9) | int16(h) | int32(w) |
计算向量/标量寄存器Ra元素方式内容的符号值,将结果存放到向量/标量寄存器Rd中。操作
for(i=0;i<NumElem && EMASK[i];i++){
Rd[i]=(Ra[i]<0)?-1:1;
}异常
无。VEXTSGN3 抽取(1,0,-1)符号格式汇编器句法
VEXTSGN3.dt VRd,VRa
VEXTSGN3.dt SRd,SRa
其中dt={b,b9,h,w}。支持的模式
说明
S | V<-V | S<-S | ||
DS | int8(b) | int9(b9) | int16(h) | int32(w) |
计算向量/标量寄存器Ra元素方式内容的符号值,将结果存放到向量/标量寄存器Rd中。操作
for(i=0;i<NumElem && EMASK[i];i++){
if(Ra[i]>0) Rd[i]=1;
else if(Ra[i]<0) Rd[i]=-1;
else Rd[i]=0;
}异常
无。VINSRT 插入一元素格式汇编器句法
VINSRT.dt VRd,SRa,SRb
VINSRT.dt VRd,SRa,#IMM
其中dt={b,b9,h,w,f}。注意.w和.f指定相同的操作。支持的模式
D:S:M | V<-S | V<-I | |||
DS | int8(b) | int9(b9) | int16(h) | int32(w) |
将标量寄存器Ra中的元素按标量寄存器Rb或IMM字段指定的索引插入到向量寄存器Rd中。操作
index32={SRb%32‖IMM<4:0>};
index64={SRb%64‖IMM<5:0>};
index=(VCSR<vec64>)?index64:index32;
VRd[index]=SRa;异常
无。编程注解
本指令不受元素屏蔽的影响。VL 加载格式汇编器句法
VL.lt Rd,SRb,SRi
VL.lt Rd,SRb,#IMM
VL.lt Rd,SRb+,SRi
VL.lt Rd,SRb+,#IMM
其中lt={b,bz9,bs9,h,w,4,8,16,32,64},Rd={VRd,VRAd,SRd}。注意.b和.bs9指定相同的操作,.64和VRAd不能一起被指定。对cache-off加载使用VLOFF。操作
加载当前或替代组中的一向量寄存器或者一标量寄存器。操作
EA=SRb+{SRi‖sex(IMM<7:0>)};
if(A=1)SRb=EA;
Rd=见下表:
异常
LT | 加载操作 |
.b | SRd<7:0>=BYTE[EA] |
.bz9 | SRd<8:0>=zex BYTE[EA] |
.bs9 | SRd<8:0>=sex BYTE[EA] |
.h | SRd<15:0>=HALF[EA] |
.w | SRd<31:0>=WORD[EA] |
.4 | VRd<9i+8:9i>=sex BYTE[EA+i].i=0 to 3 |
.8 | VRd<9i+8:9i>=sex BYTE[EA+i].i=0 to 7 |
.16 | VRd<9i+8:9i>=sex BYTE[EA+i].i=0 to 15 |
.32 | VRd<9i+8:9i>=sex BYTE[EA+i].i=0 to 31 |
.64 | VR0d<9i+8:9i>=sex BYTE[EA+i].i=0 to 31VR1d<9i+8:9i>=sex BYTE[EA+32+i].i=0 to 31 |
无效的数据地址,不对齐的访问。编程注解
此指令不受元素屏蔽的影响。VLCB 从循环缓冲器加载格式汇编器句法
VLCB.lt Rd,SRb,SRi
VLCB.lt Rd,SRb,#IMM
VLCB.lt Rd,SRb+,SRi
VLCB.lt Rd,SRb+,#IMM
其中lt={b,bz9,bs9,h,w,4,8,16,32,64},Rd={VRd,VRAd,SRd}。注意.b和.bs9指定相同的操作,.64和VRAd不能被一起指定。对cache-off加载使用VLCBOFF。说明
从由SRb+1中的BEGIN指针和SRb+2中的END指针所限定的循环缓冲器加载一向量或标量寄存器。
在加载以及地址更新操作之前,如有效地址大于END地址,则有效地址被调整。另外,对.h和.w标量加载,循环缓冲器边界必须分别与halfword和word边界对齐。操作
EA=SRb+{SRi‖sex(IMM<7:0>)};
BEGIN=SRb+1;
END=SRb+2;
cbsize=END-BEGIN;
if(EA>END)EA=BEGIN+(EA-END);
if(A=1)SRb=EA;
Rd=见以下的表:
LT | 加载操作 |
.bz9 | SRd<8:0>=zex BYTE[EA] |
.bs9 | SRd<8:0>=sex BYTE[EA] |
.h | SRd<15:0>=HALF[EA] |
.w | SRd<31:0>=WORD[EA] |
.4 | VRd<9i+8:9i>=sex BYTE[(EA+i>END)?EA+i-cbsize:EA+i].i=0 to 3 |
.8 | VRd<9i+8:9i>=sex BYTE{(EA+i>END)?EA+i-cbsize:EA+i].i=0 to 7 |
LT | 加载操作 |
.16 | VRd<9i+8:9i>=sex BYTE[(EA+i>END)?EA+i-cbsize:EA+i].i=0 to 15 |
.32 | VRd<9i+8:9i>=sex BYTE[(EA+i>END)?EA+i-cbsize:EA+i].i=0 to 31 |
64 | VR0d<9i+8:9i>=sex BYTE[(EA+i>END)?EA+i-cbsize:EA+i].i=0 to 31VR1d<9i+8:9i>=sex BYTE[(EA+32+i>END)?EA+32+i-cbsize:EA+32+i].i=0 to 31 |
异常
无效的数据地址,不对齐的访问。编程注解
此指令不受元素屏蔽的影响。
编程者必须对此指令确定下面的条件以按所期望工作:
BEGIN<EA<2*END-BEGIN
即,EA>BEGIN以及EA-END<END-BEGIN。VLD 双加载格式汇编器句法
VLD.lt Rd,SRb,SRi
VLD.lt Rd,SRb,#IMM
VLD.lt Rd,SRb+,SRi
VLD.lt Rd,SRb+,#IMM
其中lt={b,bz9,bs9,h,w,4,8,16,32,64},Rd={VRd,VRAd,SRd}。注意.b和.bs9指定相同的操作,.64和VRAd不能被一起指定。对cache-off加载使用VLDOFF。说明
加载当前或替代组中的两个向量寄存器或两个标量寄存器。操作
EA=SRb+{SRi‖Sex(IMM<7:0>)};
if(A=1)SRb=EA;
Rd:Rd+1=见下表:
异常
LT | 加载操作 |
.bz9 | SRd<8:0>=zex BYTE[EA]SRd+1<8:0>=zex BYTE[EA+1] |
.bs9 | SRd<8:0>=zex BYTE[EA]SRd+1<8:0>=zex BYTE[EA+1] |
.h | SRd<15:0>=HALF[EA]SRd+1<15:0>=HALF[EA+2] |
.w | SRd<31:0>=WORD[EA]SRd+1<31:0>=WORD[EA+4] |
.4 | VRd<9i+8:9i>=sex BYTE[EA+i].i=0 to 3VRd+1<9i+8:9i>=sex BYTE[EA+4+i].i=0 to 3 |
.8 | VRd<9i+8:9i>=sex BYTE[EA+i].i=0 to 7VRd+1<9i+8:9i>=sex BYTE[EA+8+i].i=0 to 7 |
LT | 加载操作 |
.16 | VRd<9i+8:9i>=sex BYTE[EA+i].i=0 to 15VRd+1<9i+8:9i>=sex BYTE[EA+16+i].i=0 to 15 |
.32 | VRd<9i+8:9i>=sex BYTE[EA+i].i=0 to 31VRd+1<9i+8:9i>=sex BYTE[EA+32+i].i=0 to 31 |
.64 | VR0d<9i+8:9i>=sex BYTE[EA+i].i=0 to 31VR1d<9i+8:9i>=sex BYTE[EA+32+i].i=0 to 31VR0d+1<9i+8:9i>=sex BYTE[EA+64+i].i=0 to 31VR1d+1<9i+8:9i>=sex BYTE[EA+96+i].i=0 to 31 |
无效的数据地址,不对齐的访问。编程注解
此指令不受元素屏蔽的影响。VLI.加载立即数格式汇编器句法
VLI.dt VRd,#IMM
VLI.dt SRd,#IMM
其中dt={b,b9,h,w,f}.说明
向标量或向量寄存器加载立即值。
对标量寄存器加载,根据数据类型加载byte、byte9、halfword或word。对byte、byte9和halfword数据类型,未受影响的那些byte(byte9)不被改变。操作
Rd=见下表:
异常
DT | 标量加载 | 向量加载 |
.i8 | SRd<7:0>=IMM<7:0> | VRd=32 int8 elements |
.i9 | SRd<8:0>=IMM<8:0> | VRd=32 int9 elements |
.i16 | SRd<15:0>=IMM<15:0> | VRd=16 int16 elements |
.i32 | SRd<31:0>=sex IMM<18:0> | VRd=8 int32 elements |
f | SRd<31>=IMM<18>(sign)SRd<30:23>=IMM<17:10>(exponent)SRd<22:13>=IMM<9:0>(mantissa)SRd<12:0>=zeroes | VRd=8 float elements |
无。VLQ 四加载格式汇编器句法
VLQ.lt Rd,SRb,SRi
VLQ.lt Rd,SRb,#IMM
VLQ.lt Rd,SRb+,SRi
VLQ.lt Rd,SRb+,#IMM
其中lt={b,bz9,bs9,h,w,4,8,16,32,64},Rd={VRd,VRAd,SRd}。注意.b和.bs9指定相同的操作,.64和VRAd不能被一起指定。对Cache-off加载利用VLQOFF。说明
在当前或替代组中加载四个向量寄存器或四个标量寄存器。操作
EA=SRb+{SRi‖Sex(IMM<7:0>)];
if(A=1)SRb=EA;;
Rd:Rd+1:Rd+2:Rd+3=见下表:
异常
LT | 加载操作 |
.bz9 | SRd<8:0>=zex BYTE[EA]SRd+1<8:0>=zex BYTE[EA+1]SRd+2<8:0>=zex BYTE[EA+2]SRd+3<8:0>=zex BYTE[EA+3] |
.bs9 | SRd<8:0>=zex BYTE[EA]SRd+1<8:0>=zex BYTE[EA+1]SRd+2<8:0>=zex BYTE[EA+2]SRd+3<8:0>=zex BYTE[EA+3] |
.h | SRd<15:0>=HALF[EA]SRd+1<15:0>=HALF[EA+2]SRd+2<15:0>=HALF[EA+4]SRd+3<15:0>=HALF[EA+6] |
LT | 加载操作 |
.w | SRd<31:0>=WORD[EA]SRd+1<31:0>=WORD[EA+4]SRd+2<31:0>=WORD[EA+8]sRd+3<31:0>=WORD[EA+12] |
.4 | VRd<9i+8:9i>=sex BYTE[EA+i].i=0 to 3VRd+1<9i+8:9i>=sex BYTE[EA+4+i].i=0 to 3VRd+2<9i+8:9i>=sex BYTE[EA+8+i].i=0 to 3VRd+3<9i+8:9i>=sex BYTE[EA+12+i].i=0 to 3 |
.8 | VRd<9i+8:9i>=sex BYTE[EA+i].i=0 to 7VRd+1<9i+8:9i>=sex BYTE[EA+8+i].i=0 to 7VRd+2<9i+8:9i>=sex BYTE[EA+16+i].i=0 to 7VRd+3<9i+8:9i>=sex BYTE[EA+24+i].i=0 to 7 |
.16 | VRd<9i+8:9i>=sex BYTE[EA+i].i=0 to 15VRd+1<9i+8:9i>=sex BYTE[EA+16+i].i=0 to 15VRd+2<9i+8:9i>=sex BYTE[EA+32+i].i=0 to 15VRd+3<9i+8:9i>=sex BYTE[EA+48+i].i=0 to 15 |
.32 | VRd<9i+8:9i>=sex BYTE[EA+i].i=0 to 31VRd+1<9i+8:9i>=sex BYTE[EA+32+i].i=0 to 31VRd+2<9i+8:9i>=sex BYTE[EA+64+i].i=0 to 31VRd+3<9i+8:9i>=sex BYTE[EA+96+i].i=0 to 31 |
.64 | VR0d<9i+8:9i>=sex BYTE[EA+i].i=0 to 31VR1d<9i+8:9i>=sex BYTE[EA+32+i].i=0 to 31VR0d+1<9i+8:9i>=sex BYTE[EA+64+i].i=0 to 31VR1d+1<9i+8:9i>=sex BYTE[EA+96+i].i=0 to 31VR0d+2<9i+8:9i>=sex BYTE[EA+128+i].i=0 to 31VR1d+2<9i+8:9i>=sex BYTE[EA+160+i].i=0 to 31VR0d+3<9i+8:9i>=sex BYTE[EA+192+i].i=0 to 31VR1d+3<9i+8:9i>=sex BYTE[EA+224+i].i=0 to 31 |
无效的数据地址,不对齐的访问。编程注解
VLR.lt Rd,SRb,SRi
VLR.lt Rd,SRb,#IMM
VLR.lt Rd,SRb+,SRi
VLR.lt Rd,SRb+,#IMM
其中lt={4,8,16,32,64},Rd={VRd,VRAd}。注意.64和VRAd不能被一起指定。对Cache-off加载利用VLROFF。说明
按逆元素序列加载一向量寄存器。此指令不支持标量目的寄存器。操作
EA=SRb+{SRi‖sex(IMM<7:0>)];
if(A=1)SRb=EA;
Rd=见下表:
异常
LT | 加载操作 |
.4 | VRd[31-i]<8:0>=sex BYTE[EA+i].i=0 to 3 |
.8 | VRd[31-i]<8:0>=sex BYTE[EA+i].i=0 to 7 |
.16 | VRd[31-i]<8:0>=sex BYTE[EA+i].i=0 to 15 |
.32 | VRd[31-i]<8:0>=sex BYTE[EA+i].i=0 to 31 |
.64 | VR0d[31-i]<8:0>=sex BYTE[EA+32+i].i=0 to 31VR1d[31-i]<8:0>=sex BYTE[EA+i].i=0 to 31 |
无效的数据地址地址,不对齐的访问。编程注解
此指令不受元素屏蔽的影响。VLSL 逻辑左移格式汇编器句法
VLSL.dt VRd,VRa,SRb
VLSL.dt VRd,VRa,#IMM
VLSL.dt SRd,SRa,SRb
VLSL.dt SRd,SRa,#IMM
其中dt={b,b9,h,w}。支持的模式
说明
D:S:M | V<-V@S | V<-V@I | S<-S@S | S<-S@I | |
DS | int8(b) | int9(b9) | int16(h) | int32(w) |
向量/标量寄存器Ra的每个元素向左逻辑移位,最低有效位(LSB)位置以零填入,移位量在标量寄存器Rb或IMM字段中给定,结果存放在向量/标量寄存器Rd中。操作
shift_amount={SRb%32‖IMM<4:0>};
for(i=0;i<NumElem && EMASK[i];i++){
Rd[i]=Ra[i]<<shift_amount:
}异常
无。编程注解
注意shift-amount是从SRb或IMM<4:0>中取得的5位数,对于byte,byte9,halfword数据类型,编程者负责正确指定小于或等于数据长度的位数的移位量。如果该移位量大于指定的数据长度,元素将以零来填充。VLSR 逻辑右移格式汇编器句法
VLSR.dt VRd,VRa,SRb
VLSR.dt VRd,VRa,#IMM
VLSR.dt SRd,SRa,SRb
VLSR.dt SRd,SRa,#IMM
其中dt={b,b9,h,w}。支持的模式
说明
D:S:M | V<-V@S | V<-V@I | S<-S@S | S<-S@I | |
DS | int8(b) | int9(b9) | int16(h) | int32(w) |
向量/标量寄存器Ra的每个元素向右逻辑移位,最高有效位(MSB)位置以零填入,移位量在标量寄存器Rb或IMM字段中给定,结果存放在向量/标量寄存器Rd中。操作
shift_amount={SRb%32‖IMM<4:0>};
for(i=0;i<NumElem && EMASK[i];i++){
Rd[i]=Ra[i]zero>>shift_amount;
}异常
无。编程注解
注意shift-amount是从SRb或IMM<4:0>中取得的5位数,对于byte,byte9,halfword数据类型,编程者负责正确指定小于或等于数据长度的位数的移位量。如果该移位量大于指定的数据长度,元素将以零来填充。VLWS 跨距加载格式汇编器句法
VLWS.dt Rd,SRb,SRi
VLWS.dt Rd,SRb,#IMM
VLWS.dt Rd,SRb+,SRi
VLWS.dt Rd,SRb+,#IMM
其中dt={4,8,16,32},Rd={VRd,VRAd}。注意,.64模式不被支持,用VL替代。对Cache-off加载使用VLWSOFF。说明
从有效地址开始,用标量寄存器SRb+1作为跨距控制寄存器,从存储器加载32字节到向量寄存器VRd。
LT指定block size、对每个块加载的连续字节数。SRb+1指定stride分隔两个连续块的起始的字节数。
stride必须等于或大于block size。EA必须是对准的数据长度。stride和block size必须是多种数据长度。操作
EA=SRb+{SRi‖sex(IMM<7:0>)};
if(A=1)SRb=EA;
Block-size={4‖8‖16‖32};
Stride=SRb+1<31:0>;
for(i=0;i<VECSIZE/Block-size;i++)
for(j=0;j<Block-size;j++)
VRd[i*Block-size+j]<8:0>=sex BYTE{EA+i*Stride+j};异常
VMAC.dt VRa,VRb
VMAC.dt VRa,SRb
VMAC.dt VRa,#IMM
VMAC.dt SRa,SRb
VMAC.dt SRa,#IMM
其中dt={b,h,w,f}。支持的模式
说明
D:S:M | V<-V@V | V<-V@S | V<-V@I | S<-S@S | S<-S@I |
DS | int8(b) | int16(h) | int32(w) | float(f) |
Ra的每个元素与Rb中的每个元素相乘以产生一双精度的中间结果;将此中间结果的每个双精度元素与向量累加器的每个双精度元素相加,将每个元素的双精度和存入向量累加器中。
Ra和Rb使用指定的数据类型,而VAC使用合适的双精度数据类型(16、32和64位分别对应int8、int16和int32)。每个双精度元素的高位部分存放在VACH中。
对浮点数据类型,全部操作数和结果都是单精度的。操作
for(i=0;i<NumElem && EMASK[i];i++){
Aop[i]={VRa[i]‖SRa}:
Bop[i]={VRb[i]‖SRb};
if(dt=float)VACL[i]=Aop[i]*Bop[i]+VACL[i];
else VACH[i]:VACL[i]=Aop[i]*Bop[i]+VACH[i]:VACL[i];
}异常
溢出,浮点无效的操作数。编程注解
VMACF.dt VRa,VRb
VMACF.dt VRa,SRb
VMACF.dt VRd,#IMM
VMACF.dt SRa,SRb
VMACF.dt SRa,#IMM
其中dt={b,h,w}。支持的模式
说明
D:S:M | V<-V@V | V<-V@S | V<-V@I | S<-S@S | S<-S@I |
DS | int8(b) | int16(h) | int32(w) |
VRa的每个元素与Rb中的每个元素相乘以产生一双精度的中间结果;将此双精度中间结果左移一位;将移位后的中间结果的每个双精度元素与向量累加器的每个双精度元素相加;每个元素的双精度和存放到向量累加器中。
VRa和Rb使用指定的数据类型,而VAC使用合适的双精度数据类型(16、32和64位分别对应int8、int16和int32)。每个双精度元素的高位部分存放在VACH中。操作
for(i=0;i<NumElem && EMASK[i];i++){
Bop[i]={VRb[i]‖SRb‖sex(IMM<8:0>)};
VACH[i]:VACL[i]=((VRa[i]*Bop[i])<<1)+VACH[i]:VACL[i];
}异常
溢出。编程注解
VMACL.dt VRd,VRa,VRb
VMACL.dt VRd,VRa,SRb
VMACL dt VRd,VRa,#IMM
VMACL.dt SRd,SRa,SRb
VMACL.dt SRd,SRa,#IMM
其中dt={b,h,w,f}。支持的模式
说明
D:S:M | V<-V@V | V<-V@S | V<-V@I | S<-S@S | S<-S@I |
DS | int8(b) | int16(h) | int32(w) | float(f) |
将VRa的每个元素与Rb中的每个元素相乘以产生一双精度的中间结果;将此中间结果的每个双精度元素与向量累加器的每个双精度元素相加;将每个元素的双精度和存放到向量累加器;将较低位部分返回到目的寄存器VRd。
VRa和Rb使用指定的数据类型,而VAC使用合适的双精度数据类型(16、32和64位分别对应int8、int16和int32)。每个双精度元素的位部分存放在VACH中。
对浮点数据类型,全部操作数和结果都是单精度的。操作
for(i=0;i<NumElem && EMASK[i];i++){
Bop[i]={VRb[i]‖SRb};
if(dt=float)VACL[i]=VRa[i]*Bop[i]+VACL[i];
else VACH[i]:VACL[i]=VRa[i]*Bop[i]+VACH[i]:VACL[i];
VRd[i]=VACL[i];
}异常
溢出,浮点无效的操作数。编程注解
VMAD.dt VRc,VRd,VRa,VRb
VMAD.dt SRc,SRd,SRa,SRb
其中dt=(b,h,w)。支持的模式
说明
S | VR | SR | ||
DS | int8(b) | int16(h) | int32(w) |
将Ra的每个元素与Rb中的每个元素相乘以产生一双精度的中间结果;使此中间结果的每个双精度元素与Rc的每个元素相加;将每个元素的双精度和存放到目的寄存器Rd+1:Rd。操作
for(i=0;i<NumElem && EMASK[i];i++){
Aop[i]={VRa[i]‖SRa];
Bop[i]={VRb[i]‖SRb};
Cop[i]={VRc[i]‖SRc};
Rd+1[i]:Rd[i]=Aop[i]*Bop[i]+sex_dp(Cop[i]);
}异常
VMADL.dt VRc,VRd,VRa,VRb
VMADL.dt SRc,SRd,SRa,SRb
其中dt={b,h,w,f}。支持的模式
说明
S | VR | SR | ||
DS | int8(b) | float(f) | int16(h) | int32(w) |
将Ra的每个元素与Rb中的每个元素相乘以产生一双精度的中间结果;将此中间结果的每个双精度元素与Rc的每个元素相加;将每个元素的双精度和的低位部分返回到目的寄存器Rd。
对浮点数据类型,全部操作数和结果都是单精度的。操作
for(i=0;i<NumElem && EMASK[i];i++){
Aop[i]={VRa[i]‖SRa};
Bop[i]={VRb[i]‖SRb};
Cop[i]={VRc[i]‖SRc};
if(dt=float)Lo[i]=Aop[i]*Bop[i]+Cop[i];
else Hi[i]:Lo[i]=Aop[i]*Bop[i]+sex_dp(Cop[i]);
Rd[i]=Lo[i];
}异常
溢出,浮点无效的操作数。VMAS 从累加器乘和减格式汇编器句法
VMAS.dt VRa,VRb
VMAS.dt VRa,SRb
VMAS.dt VRa,#IMM
VMAS.dt SRa,SRb
VMAS.dt SRa,#IMM
其中dt={b,h,w,f}。支持的模式
说明
D:S:M | V<-V@V | V<-V@S | V<-V@I | S<-S@S | S<-S@I |
DS | int8(b) | int16(h) | int32(w) | float(f) |
将Ra的每个元素Rb中的每个元素相乘以产生一双精度的中间结果;从向量累加器的每个双精度元素中减去中间结果的每个双精度元素;将每个元素的双精度和存放到向量累加器。
Ra和Rb使用指定的数据类型,而VAC使用合适的双精度数据类型(16、32和64位分别对应int8、int16和int32)。每个双精度元素的高位部分存放在VACH中。
对浮点数据类型,全部操作数和结果都是单精度的。操作
for(i=0;i<NumElem && EMASK[i];i++){
Bop[i]={VRb[i]‖SRb};
if(dt=float)VACL[i]=VACL[i]-VRa[i]*Bop[i];
else VACH[i]:VACL[i]=VACH[i]:VACL[i]-VRa[i]*Bop[i];
}异常
溢出,浮点无效的操作数。编程注解
VMASF.dt VRa,VRb
VMASF.dt VRa,SRb
VMASF.dt VRa,#IMM
VMASF.dt SRa,SRb
VMASF.dt SRa,#IMM
其中dt={b,h,w}.支持的模式
说明
D:S:M | V<-V@V | V<-V@S | V<-V@I | S<-S@S | S<-S@I |
DS | int8(b) | int16(h) | int32(w) |
将VRa的每个元素与Rb中的每个元素相乘以产生一双精度的中间结果;将双精度的中间结果左移一位;从向量累加器的每个双精度元素减去被移位的中间结果的每个双精度元素;将每个元素的双精度和存储到向量累加器。
VRa和Rb使用指定的数据类型,而VAC使用合适的双精度数据类型(16、32和64位分别对并int8、int16和int32)。每个双精度元素的高位部分存放在VACH中。操作
for(i=0;i<NumElem && EMASK[i];i++){
Bop[i]={VRb[i]‖SRb‖sex(IMM<8:0>)};
VACH[i]:VACL[i]=VACH[i]:VACL[i]-VRa[i]*Bop[i];
}异常
溢出。编程注解
VMASL.dt VRd,VRa,VRb
VMASL.dt VRd,VRa,SRb
VMASL.dt VRd,VRa,#IMM
VMASL.dt SRd,SRa,SRb
VMASL.dt SRd,SRa,#IMM
其中dt={b,h,w,f}。支持的模式
说明
D:S:M | V<-V@V | V<-V@S | V<-V@I | S<-S@S | S<-S@I |
DS | int8(b) | int16(h) | int32(w) | float(f) |
将VRa的每个元素与Rb中的每个元素相乘以产生一双精度的中间结果;从向量累加器的每个双精度元素减去中间结果的每个双精度元素;将每个元素的双精度和存放到向量累加器;将低位部分存放到目的寄存器VRd。
RVa和Rb使用指定的数据类型,而VAC使用合适的双精度数据类型(16,32和64分别对应int8,int16和int32)。每个双精度元素的高位部分存放在VACH中。
对浮点数据类型,全部操作数和结果都是单精度的。操作
for(i=0;i<NumElem && EMASK[i];i++){
Bop[i]={VRb[i]‖SRb};
if(dt=float)VACL[i]=VACL[i]-VRA[i]*Bop[i];
else VACH[i]:VACL[i]=VACH[i]:VACL[i]-VRa[i]*Bop[i]:
VRd[i]=VACL[i];
}异常
溢出,浮点无效的操作数。编程注解
VMAXE.dt VRd,VRb
其中dt={b,b9,h,w,f}。支持的模式
说明
D:S:M | V<-V | ||||
DS | int8(b) | int9(b9) | int16(h) | int32(w) | float(f) |
VRa应当等于VRb。当VRa与VRb不同时,结果未定义。
向量寄存器Rb的每个偶/奇数据元素被成对比较,并且每个数据元素对的较大值存储到偶数位置,每个数据元素对的较小值存储到向量寄存器Rd的奇数位置。操作
for(i=0;i<NumElem && EMASK[i];i=i+2){
VRd[i]=(VRb[i]>VRb[i+1])?VRb[i]:VRb[i+1];
VRd[i+1]=(VRb[i]>VRb[i+1])?VRb[i+1]:VRb[i];
}异常
VMOV.dt Rd,Rb
其中dt={b,b9,h,w,f}。Rd和Rb指示结构上规定的寄存器名。
注意.w和.f指示相同的操作。支持的模式说明
寄存器Rb的内容转移到寄存器Rd。Group字段指定源和目的寄存器组。寄存器组的标记办法是:
VR 当前组向量寄存器
VRA 替代组向量寄存器
SR 标量寄存器
SP 专用寄存器
RASR 返回地址堆栈寄存器
VAC向量累加寄存器(参见下面的VAC寄存器编码表)
组<3:0> | 源组 | 目的组 | 注释 |
0000 | 保留 | ||
0001 | VR | VRA | |
0010 | VRA | VR | |
0011 | VRA | VRA | |
0100 | 保留 | ||
0101 | 保留 | ||
0110 | VRA | VAC | |
0111 | VAC | VRA | |
1000 | 保留 | ||
1001 | SR | VRA | |
1010 | 保留 | ||
1011 | 保留 | ||
1100 | SR | SP | |
1101 | SP | SR | |
1110 | SR | RASR | |
1111 | RASR | SR |
注意用此指令不能将向量寄存器传送到标量寄存器。VEXTRT指令是为此而提供的。
对VAC寄存器编码使用下表:
操作
R<2:0> | 寄存器 | 注释 |
000 | 未定义 | |
001 | VAC0L | |
010 | VAC0H | |
011 | VAC0 | 指定VAC0H:VAC0L两者。如指定为源,VRd+1:VRd寄存器对被更新。VRd必须是偶数寄存器。 |
100 | 未定义 | |
101 | VAC1L | |
110 | VAC1H | |
111 | VAC1 | 指定VAC1H:VAC1L两者。如指定为源,VRd+1:VRd寄存器对被更新。VRd必须是偶数寄存器。 |
其它 | 未定义 |
Rd=Rb异常
在VCSR或VISRC中设置异常事件状态位将引起相应的异常事件。编程注解
此指令不受元素屏蔽的影响。注意,用在VEC64模式下不存在替代组的概念,在VEC64模式下,本指令不能用于从替代组的寄存器或向替代组的寄存器转移。VMUL 乘格式汇编器句法
VMUL.dt VRc,VRd,VRa,VRb
VMUL.dt SRc,SRd,SRa,SRb
其中dt={b,h,w}。支持的模式
说明
S | VR | SR | ||
DS | int8(b) | int16(h) | int32(w) |
将Ra的每个元素与Rb中的每个元素相乘以产生一双精度的结果;将每个元素的双精度和返回到目的寄存器Rc:Rd。
Ra和Rb使用指定的数据类型,而Rc:Rd使用合适的双精度数据类型(16、32和64位分别对应int8、int16和int32)。每个双精度元素的高位部分存放在Rc中。操作
for(i=0;i<NumElem && EMASK[i];i++){
Aop[i]=[VRa[i]‖SRa};
Bop[i]={VRb[i]‖SRb};
Hi[i]:Lo[i]=Aop[i]*Bop[i]:
Rc[i]=Hi[i];
Rd[i]=Lo[i];
}异常
无。编程注解
VMULA.dt VRa,VRb
VMULA.dt VRa,SRb
VMULA.dt VRa,#IMM
VMULA.dt SRa,SRb
VMULA.dt SRa,#IMM
其中dt=(b,h,w,f}。支持的模式
说明
D:S:M | V@V | V@S | V@I | S@S | S@I |
DS | int8(b) | int16(h) | int32(w) | float(l) |
将VRa的每个元素与Rb中的每个元素相乘以产生一双精度的结果;将此结果写到累加器。
浮点数据类型,全部操作数和结果都是单精度的。操作
for(i=0;i<NumElem && EMASK[i];i++){
Bop[i]={VRb[i]‖SRb};
if(dt==float)VACL[i]=VRa[i]*Bop[i];
else VACH[i]:VACL[i]=VRa[i]*Bop[i];
}异常
无。编程注解
VMULAF.dt VRa,VRb
VMULAF.dt VRa,SRb
VMULAF.dt VRa,#IMM
VMULAF dt SRa,SRb
VMULAF.dt SRa,#IMM
其中dt={b,h,w}。支持的模式
说明
D:S:M | V@V | V@S | V@I | S@S | S@I |
DS | int8(b) | int16(h) | int32(w) |
将VRa的每个元素与Rb中每个元素相乘以产生一以双精度的中间结果;此双精度中间结果左移一位;结果写到累加器。操作
for(i=0;i<NumElem && EMASK[i];i++){
Bop[i]={VRb[i]‖SRb‖sex(IMM<8:0>)};
VACH[i]:VACL[i]=(VRa[i]*Bop[i])<<1;
}异常
无。编程注解
此指令不支持int9数据类型,用int16数据类型替代。VMULF 乘小数格式汇编器句法
VMULF.dt VRd,VRa,VRb
VMULF.dt VRd,VRa,SRb
VMULF.dt VRd,VRa,#IMM
VMULF.dt SRd,SRa,SRb
VMULF.dt SRd,SRa,#IMM
其中dt={b,h,w}。支持的模式
说明
D:S:M | V<-V@V | V<-V@S | V<-V@I | S<-S@S | S<-S@I |
DS | int8(b) | int16(h) | int32(w) |
将VRa的每个元素与Rb中的每个元素相乘以产生一双精度的中间结果;此双精度中间结果左移一位;将结果的高位部分返回到目的寄存器VRd+1,低位部分返回到目的寄存器VRd。VRd必须是一偶数寄存器。操作
for(i=0;i<NumElem && EMASK[i];i++){
Bop[i]={VRb[i]‖SRb‖sex(TMM<8:0>)};
Hi[i]:Lo[i](VRa[i]*Bop[i])<<1;
VRd+1[i]=Hi[i];
VRd[i]=Lo[i]:
}异常
无。编程注解
此指令不支持int9数据类型,用int16数据类型替代。VMULFR 乘小数并舍入格式汇编器句法
VMULFR.dt VRd,VRa,VRb
VMULFR.dt VRd,VRa,SRb
VMULFR.dt VRd,VRa,#IMM
VMULFR.dt SRd,SRa,SRb
VMULFR.dt SRd,SRa,#IMM
其中dt={b,h,w}。支持的模式
说明
D:S:M | V<-V@V | V<-V@S | V<-V@I | S<-S@S | S<-S@I |
DS | int8(b) | int16(h) | int32(w) |
将VRa的每个元素与Rb中每个元素相乘以产生一双精度的中间结果;此双精度中间结果左移一位;将此被移位的中间结果舍入到高位部分;高位部分返回到目的寄存器VRd。操作
for(i=0;i<NumElem && EMASK[i];i++){
Bop[i]={VRb[i]‖SRb‖sex(IMM<8:0>)};
Hi[i]:Lo[i]=(VRa[i]*Bop[i])<<1;
if(Lo[i]<msb>==1) Hi[i]=Hi[i]+1;
VRd[i]=Hi[i];
}异常
无。编程注解
此指令不支持int9数据类型,用int16数据类型替代。VMULL 乘低位格式汇编器句法
VMULL.dt VRd,VRa,VRb
VMULL.dt VRd,VRa,SRb
VMULL.dt VRd,VRa,#IMM
VMULL.dt SRd,SRa,SRb
VMULL.dt SRd,SRa,#IMM
其中dt={b,h,w,f}。支持的模式
说明
D:S:M | V<-V@V | V<-V@S | V<-V@I | S<-S@S | S<-S@I |
DS | int8(b) | int16(h) | int32(w) | float(f) |
将VRa的每个元素与Rb中每个元素相乘以产生一双精度的结果;结果的低位部分返回到目的寄存器VRd。
对浮点数据类型,全部操作数和结果都是单精度的。操作
for(i=0;i<NumElem && EMASK[i];i++){
Bop[i]={VRb[i]‖SRb];
if(dt=float)Lo[i]=VRa[i]*Bop[i];
else Hi[i];Lo[i]=VRa[i]*Bop[i];
VRd[i]=Lo[i];
}异常
溢出,浮点无效的操作数。编程注解
此指令不支持int9数据类型。代之以使用int16数据类型。VNAND 与非格式汇编器句法
VNAND.dt VRd,VRa,VRb
VNAND.dt VRd,VRa,SRb
VNAND.dt VRd,VRa,#IMM
VNAND.dt SRd,SRa,SRb
VNAND.dt SRd,SRa,#IMM
其中dt={b,b9,h,w}。注意.w和.f指定相同的操作。支持的模式
说明
D:S:M | V<-V@V | V<-V@S | V<-V@I | S<-S@S | S<-S@I |
DS | int8(b) | int9(b9) | int16(h) | int32(w) |
对Ra中每个元素的每一位与Rb/立即操作数中的相应位进行逻辑NAND,结果返回到Rd中。操作
for(i=0;i<NumElem && EMASK[i];i++){
Bop[i]={VRb[i]‖SRb‖sex(IMM<8:0>)}:
Rd[i]<k>=-(Ra[i]<k>&Bop[i]<k>).for k=all bits in element i;
}异常
VNOR.dt VRd,VRa,VRb
VNOR.dt VRd,VRa,SRb
VNOR.dt VRd,VRa,#IMM
VNOR.dt SRd,SRa,SRb
VNOR.dt SRd,SRa,#IMM
其中dt={b,b9,h,w}。注意.w和.f指定相同的操作。支持的模式
说明
D:S:M | V<-V@V | V<-V@S | V<-V@1 | S<-S@S | S<-S@1 |
DS | int8(b) | int9(b9) | int16(h) | int32(w) |
对Ra中每个元素的每一位与Rb/立即操作数中的相应位作逻辑NOR;结果返回到Rd中。操作
for(i=0;i<NumElem && EMASK[i];i++){
Bop[i]={VRb[i]‖SRb‖sex(IMM<8:0>)};
Rd[i]<k>=-(Ra[i]<k>|Bop[i]<k>).for k=all bits in element i;
}异常
VOR.dt VRd,VRa,VRb
VOR.dt VRd,VRa,SRb
VOR.dt VRd,VRa,#IMM
VOR.dt SRd,SRa,SRb
VOR.dt SRd,SRa,#IMM
其中dt={b,b9,h,w}。注意.w和.f指定相同的操作。支持的模式
说明
D:S:M | V<-V@V | V<-V@S | V<-V@I | S<-S@S | S<-S@I |
DS | int8(b) | int9(b9) | int16(h) | int32(w) |
对Ra中每个元素的每一位与Rb/立即操作数中的相应位进行逻辑OR结果返回到Rd中。操作
for(i=0;i<NumElem && EMASK[i];i++){
Bop[i]={VRb[i]‖SRb‖sex(IMM<8:0>)};
Rd[i]<k>=Ra[i]<k>|Bop[i]<k>.for k=all bits in element i;
}异常
VORC.dt VRd,VRa,VRb
VORC.dt VRd,VRa,SRb
VORC.dt VRd,VRa,#IMM
VORC.dt SRd,SRa,SRb
VORC.dt SRd,SRa,#IMM
其中dt={b,b9,h,w}。注意.w和.f指定相同的操作。支持的模式
说明
D:S:M | V<-V@V | V<-V@S | V<-V@I | S<-S@S | S<-S@I |
DS | int8(b) | int9(b9) | int16(h) | int32(w) |
对Ra中每个元素的每一位与Rb/立即操作数中相应位的补码进行逻辑OR;结果返回到Rd中。操作
for(i=0;i<NumElem && EMASK[i];i++){
Bop[i]={VRb[i]‖SRb‖sex(IMM<8:0>)};
Rd[i]<k>=Ra[i]<k>|-Bop[i]<k>.for k=all bits in element i;
}异常
VPFTCH.ln SRb,SRi
VPFTCH.ln SRb,#IMM
VPFTCH.ln SRb+,SRi
VPFTCH.ln SRb+,#IMM
其中ln={ 1,2,4,8}。说明
从有效地址开始预取多个向量数据Cache行。Cache行的数目被指定如下:
LN<1:0>=00:预取1个64字节的Cache行
LN<1:0>=01:预取2个64字节的Cache行
LN<1:0>=10:预取4个64字节的Cache行
LN<1:0>=11:预取8个64字节的Cache行
如果有效地址不落在64字节的边界上,则首先截断以便与64字节的边界对齐。操作异常
无效的数据地址异常事件。编程注解
EA<31:0>指出局部存储器中的一个字节地址。VPFTCHSP 预取到暂时存储器格式汇编器句法
VPFTCHSP.ln SRp,SRb,SRi
VPFTCHSP.ln SRp,SRb,#IMM
VPFTCHSP.ln SRp,SRb+,SRi
VPFTCHSP.ln SRP,SRb+,#IMM
其中ln={1,2,4,8}。注意VPFTCH和VPFTCHSP具有同样的操作码。说明
从存储器向暂时存储器传送多个64字节的块。有效地址给出存储器的起始地址,而SRp提供暂时存储器的起始地址。64字节块的数目指定如下:
LN<1:0>=00:传送1个64字节的块
LN<1:0>=01:传送2个64字节的块
LN<1:0>=10:传送4个64字节的块
LN<1:0>=11:传送8个64字节的块
如果有效地址不落在64字节的边界上,首先截断以使与64字节的边界对齐。如果SRp中的暂时存储器指针地址不落在64字节的边界上,它也截断以与64字节的边界对齐。对齐的暂时存储器指针地址以传送字节数增加。操作
EA=SRb+{SRi‖sex(IMM<7:0>)}:
if(A=1)SRb=EA;
Num_bytes={64‖128‖256‖512]:
Mem_adrs=EA<31:6>:6b’000000:
SRp=SRp<31:6>:6b’000000;
for(i=0;i<Num_bytes;i++)
SPAD[SRp++]=MEM[Mem_adrs+i];异常
VROL.dt VRd,VRa,SRb
VROL.dt VRd,VRa,#IMM
VROL.dt SRd,SRa,SRb
VROL.dt SRd,SRa,#IMM
其中dt={b,b9,h,w}。支持的模式
说明
D:S:M | V<-V@S | V<-V@I | S<-S@S | S<-S@I | |
DS | int8(b) | int9(b9) | int16(h) | int32(w) |
向量/标量寄存器Ra的每个数据元素循环左移,左移的位数在标量寄存器Rb或IMM字段中给出,结果存入向量/标量寄存器Rd。操作
rotate_amount={SRb%32‖IMM<4:0>};
for(i=0;i<NumElem&&EMASK[i];i++){
Rd[i]=Ra[i]rotate_left rotate_amount;
}异常
无。编程注解
注意rotate-anount从SRb或IMM<4:0>中取得的5位数。对byte、byte9、halfword数据类型,编程者负责正确指定小于或等于数据长度的位数的循环移位总量。如果移位总量大于指定的数据长度,则结果是未定义的。
VROR.dt VRd,SRa,SRb
VROR.dt VRd,SRa,#IMM
VROR.dt SRd,SRa,SRb
VROR.dt SRd,SRa,#IMM
其中dt={b,b9,h,w}。支持的模式
说明
D:S:M | V<-V@S | V<-V@I | S<-S@S | S<-S@I | |
DS | int8(b) | int9(b9) | int16(h) | int32(w) |
向量/标量寄存器Ra的每个数据元素循环右移,右移的位数在标量寄存器Rb或IMM字段中给出,结果存入向量/标量寄存器Rd。操作
rotate_amount={SRb%32‖IMM<4:0>};
for(i=0;i<NumElem && EMASK[i];i++){
Rd[i]=Ra[i]rotate_right rotate_amount;
}异常
无。编程注解
注意rotate-amount是从SRb或IMM<4:0>中取得的5位的数。对byte、byte9、halfword数据类型,编程者负责正确指定小于或等于数据长度的位数的循环移位总量。如果该移位总量大于指定的数据长度,则结果是未定义的。
注意循环右移n位相当于循环左移ElemSize-n位,这里ElemSize表示给定数据长度的位数。VROUND 将浮点数舍成整型数格式汇编器句法
VROUND.rm VRd,VRb
VROUND.rm SRd,SRb
其中rm={ninf,zero,near,pinf}。支持的模式
说明
D:S:M | V<-V | S<-S |
向量/标量寄存器Rb的浮点数据格式的内容舍入成为最接近的32位整数(Word),该结果存放在向量/标量寄存器Rd中。舍入模式在RM中规定。
操作
RM<1:0> | 模式 | 意义 |
00 | ninf | 向-∞舍入 |
01 | zero | 向零舍入 |
10 | near | 向最接近的偶数舍入 |
11 | pinf | 向+∞舍入 |
for(i=0;i<NumElem;i++){
Rd[i]=Convert to int32(Rb[i]);
}异常
无。编程注解
此指令不受元素屏蔽的影响。VSATL 饱和到低限格式汇编器句法
VSATL.dt VRd,VRa,VRb
VSATL.dt VRd,VRa,SRb
VSATL.dt VRd、VRa,#IMM
VSATL.dt SRd,SRa,SRb
VSATL.dt SRd,SRa,#IMM
其中dt={b,b9,h,w}。注意9位立即数不支持.f数据类型。支持的模式
说明
D:S:M | V<-V@V | V<-V@S | V<-V@I | S<-S@S | S<-S@I |
DS | int8(b) | int9(b9) | int16(h) | int32(w) | float(f) |
向量/标量寄存器Ra的每个数据元素与它在向量/标量寄存器Rb或IMM字段中的对应低限对比检查。如果数据元素的值小于此低限,则被设置成等于低限,且最终结果存入向量/标量寄存器Rd。操作
for(i=0;i<NumElem && EMASK[i];i++){
Bop[i]={VRb[i]‖SRb‖sex(IMM<8:0>)};
Rd[i]=(Ra[i]<Bop[i])?Bop[i]:Ra[i];
}异常
无。VSATU 饱和到高限格式汇编器句法
VSATU.dt VRd,SRa,SRb
VSATU.dt VRd,SRa,SRb
VSATU.dt VRd,SRa,#IMM
VSATU.dt SRd,SRa,SRb
VSATU.dt SRd,SRa,#IMM
其中dt={b,b9,h,w,f}。注意9位立即数不支持.f数据类型。支持的模式
说明
D:S:M | V<-V@V | V<-V@S | V<-V@I | S<-S@S | S<-S@I |
DS | int8(b) | int9(b9) | int16(h) | int32(w) | float(f) |
向量/标量寄存器Ra的每个数据元素与它在向量/标量寄存器Rb或IMM字段中的对应高限对比检查。如果数据元素的值大于此高限,则被设置成等于高限,且最终结果存入向量/标量寄存器Rd。操作
for(i=0;i<NumElem && EMASK[i];i++){
Bop[i]={VRb[i]‖SRb‖sex(IMM<8:0>)};
Rd[i]=(Ra[i]>Bop[i])?Bop[i]:Ra[i];
}异常
VSHFL.dt VRc,VRd,VRa,VRb
VSHFL.dt VRc,VRd,VRa,SRb
其中dt={b,b9,h,w,f}。注意.w和.f指定相同的操作。支持的模式
说明
S | VRb | SRb | ||
DS | int8(b) | int9(b9) | int16(h) | int32(w) |
无。编程注解
此指令不使用元素屏蔽。VSHFLH 混洗高位格式汇编器句法
VSHFLH.dt VRd,VRa,VRb
VSHFLH.dt VRd,VRa,SRb
其中dt={b,b9,h,w,f]。注意.w和.f指定相同的操作。支持的模式
说明
S | VRb | SRb | ||
DS | int8(b) | int9(b9) | int16(h) | int32(w) |
向量寄存器Ra的内容与Rb混洗,结果的高位部分存放在向量寄存器Rd,如下图所示:操作异常
无。编程注解
VSHFLL.dt VRd,VRa,VRb
VSHFLL.dt VRd,VRa,SRb
其中dt={b,b9,h,w,f}。注意.w和.f指定同样的操作。支持的模式
说明
S | VRb | SRb | ||
DS | int8(b) | int9(b9) | int16(h) | int32(w) |
向量寄存器Ra的内容与Rb混洗,结果的低位部分存放在向量寄存器Rd,如下图所示:操作异常
无。编程注解
VST.st Rs,SRb,SRi
VST.st Rs,SRb,#IMM
VST.st Rs,SRb+,SRi
VST.st Rs,SRb+,#IMM
其中st={b,b9t,h,w,4,8,16,32,64},Rs={VRs,VRAs,SRs}。注意.b和.b9t指示相同的操作,.64和VRAs不能被一起指定。对Cache-off存储使用VSTOFF。说明
存储一向量或标量寄存器。操作
EA=SRb+{SRi‖Sex(IMM<7:0>)};
if(A=1)SRb=EA;
MEM[EA]=见下表:
异常
ST | 存储操作 |
.b | BYTE[EA]=SRs<7:0> |
.h | HALF[EA]=SRs<15:0> |
.w | WORD[EA]=SRs<31:0> |
.4 | BYTE[EA+i]=VRs<9i+7:9i>.i=0 to 3 |
.8 | BYTE[EA+i]=VRs<9i+7:9i>.i=0 to 7 |
.16 | BYTE[EA+i]=VRs<9i+7:9i>.i=0 to 15 |
.32 | BYTE[EA+i]=VRs<9i+7:9i>.i=0 to 31 |
.64 | BYTE[EA+i]=VR0s<9i+7:9i>.i=0 to 31BYTE[EA+32+i]=VR1s<9i+7:9i>.i=0 to 31 |
无效的数据地址,不对齐的访问。编程注解
此指令不受元素屏蔽的影响。VSTCB 存储到循环缓冲器格式汇编器句法
VSTCB.st Rs,SRb,SRi
VSTCB.st Rs,SRb,#IMM
VSTCB.st Rs,SRb+,SRi
VSTCB.st Rs,SRb+,#IMM
其中st={b,b9t,h,w,4,8,16,32,64},Rs={VRs,VRAs,SRs}。注意.b和.b9t指示相同的操作,.64和VRAs不能被一起指定。对Cache-off使用VSTCBOFF。说明
从循环缓冲器存储到向量或标量寄存器,循环缓冲器的边界由SRb+1中的BEGIN指针和SRb+2中的END指针确定。
在存储及地址更新操作之前,如果有效地址大于END地址,则它将被调整。此外,对.h和.w标量加载循环缓冲器的边界必须分别与halfword和word的边界对齐。操作
EA=SRb+{SRi‖sex(IMM<7:0>)};
BEGIN=SRb+1;
END=SRb+2;
cbsize=END-BEGIN;
if(EA>END)EA=BEGIN+(EA-END);
if(A=1)SRb=EA;
MEM[EA]=见下表:
异常
ST | 存储操作 |
.b | BYTE[EA]=SRs<7:0>; |
.h | HALF[EA]=SRs<15:0>; |
.w | WORD[EA]=SRs<31:0>; |
.4 | BYTE[(EA+i>END)?EA+i-cbsize:EA+i]=VRs<9i+7:9i>.i=0 to 3 |
.8 | BYTE[(EA+i>END)?EA+i-cbsize:EA+i]=VRs<9i+7:9i>.i=0 to 7 |
.16 | BYTE[(EA+i>END)?EA+i-cbsize:EA+i]=VRs<9i+7:9i>.i=0 to 15 |
.32 | BYTE[(EA+i>END)?EA+i-cbsize:EA+i]=VRs<9i+7:9i>.i=0 to 31 |
.64 | BYTE[(EA+i>END)?EA+i-cbsize:EA+i]=VR0s<9i+7:9i>.i=0 to 31BYTE[(EA+32+i>END)?EA+32+i-cbsize:EA+32+i]=VR1s<9i+7:9i>.i=0 to 31 |
无效的数据地址,未对齐的访问。编程注解
此指令不受元素屏蔽的影响。
编程者必须确定下面的条件以使此指令按所希望的工作:
BEGIN<EA<2*END-BEGIN
即,EA>BEGIN以及EA-END<END-BEGINVSTD 双存储格式汇编器句法
VSTD.st Rs,SRb,SRi
VSTD.st Rs,SRb,#IMM
VSTD.st Rs,SRb+,SRi
VSTD.st Rs,SRb+,#IMM
其中st={b,b9t,h,w,4,8,16,32,64},Rs={VRs,VRAs,SRs}。注意.b和.b9t指定相同的操作,.64和VRAs不能被一起指定。对Cache-off存储使用VSTDOFF。说明
存储来自从当前或替代组的两个向量寄存器或两个标量寄存器。操作
EA=SRb+{SRi‖sex(IMM<7:0>)};
if(A=1)SRb=EA;
MEM[EA]=见下表:
异常
ST | 存储操作 |
.b | BYTE[EA]=SRs<7:0>BYTE[EA+1]=SRs+1<7:0> |
.h | HALF[EA]=SRs<15:0>HALF[EA+2]=SRs+1<15:0> |
w | WORD[EA]=SRs<31:0>WORD[EA+4]=SRs+1<31:0> |
.4 | BYTE[EA+i]=VRs<9i+7:9i>.i=0 to 3BYTE[EA+4+i]=VRs+1<9i+7:9i>.i=0 to 3 |
.8 | BYTE[EA+i]=VRs<9i+7:9i>.i=0 to 7BYTE[EA+8+i]=VRs+1<9i+7:9i>.i=0 to 7 |
16 | BYTE[EA+i]=VRs<9i+7:9i>.i=0 to 15BYTE[EA+16+i]=VRs+1<9i+7:9i>.i=0 to 15 |
ST | 存储操作 |
.32 | BYTE[EA+i]=VRs<9i+7:9i>.i=0 to 31BYTE[EA+32+i]=VRs+1<9i+7:9i>.i=0 to 31 |
.64 | BYTE[EA+i]=VR0s<9i+7:9i>.i=0 to 31BYTE[EA+32+i]=VR1s<9i+7:9i>.i=0 to 31BYTE[EA+64+i]=VR0s+1<9i+7:9i>.i=0 to 31BYTE[EA+96+i]=VR1s+1<9i+7:9i>.i=0 to 31 |
无效的数据地址,未对齐的访问.编程注解
VSTQ.st Rs,SRb,SRi
VSTQ.st Rs,SRb,#IMM
VSTQ.st Rs,SRb+,SRi
VSTQ.st Rs,SRb+,#IMM
其中st={b,b9t,h,w,4,8,16,32,64},Rs={VRs,VRAs,SRs}。注意.b和.b9t指定相同的操作,.64和VRAs不能被一起指定。对Cache-off存储使用VSTQOFF。说明
存储来自当前或替代组的四个向量寄存器或四个标量寄存器。操作
EA=SRb+{SRi‖sex(IMM<7:0>)};
if(A=1)SRb=EA;
MEM[EA]=见下表:
异常
ST | 存储操作 |
.b | BYTE[EA]=SRs<7:0>BYTE[EA+1]=SRs+1<7:0>BYTE[EA+2]=SRs+2<7:0>BYTE[EA+3]=SRs+3<7:0> |
.h | HALF[EA]=SRs<15:0>HALF[EA+2]=SRs+1<15:0>HALF[EA+4]=SRs+2<15:0>HALF[EA+6]=SRs+3<15:0> |
.w | WORD[EA]=SRs<31:0>WORD[EA+4]=SRs+1<31:0>WORD[EA+8]=SRs+2<31:0>WORD[EA+12]=SRs+3<31:0> |
ST | 存储操作 |
.4 | BYTE[EA+i]=VRs<9i+7:9i>.i=0 to 3BYTE[EA+4+i]=VRs+1<9i+7:9i>.i=0 to 3BYTE[EA+8+i]=VRs+2<9i+7:9i>.i=0 to 3BYTE[EA+12+i]=VRs+3<9i+7:9i>.i=0 to 3 |
.8 | BYTE[EA+i]=VRs<9i+7:9i>.i=0 to 7BYTE[EA+8+i]=VRs+1<9i+7:9i>.i=0 to 7BYTE[EA+16+i]=VRs+2<9i+7:9i>.i=0 to 7BYTE[EA+24+i]=VRs+3<9i+7:9i>.i=0 to 7 |
.16 | BYTE[EA+i]=VRs<9i+7:9i>.i=0 to 15BYTE[EA+16+i]=VRs+1<9i+7:9i>.i=0 to 15BYTE[EA+32+i]=VRs+2<9i+7:9i>.i=0 to 15BYTE[EA+48+i]=VRs+3<9i+7:9i>.i=0 to 15 |
.32 | BYTE[EA+i]=VRs<9i+7:9i>.i=0 to 31BYTE[EA+32+i]=VRs+1<9i+7:9i>.i=0 to 31BYTE[EA+64+i]=VRs+2<9i+7:9i>.i=0 to 31BYTE[EA+96+i]=VRs+3<9i+7:9i>.i=0 to 31 |
.64 | BYTE[EA+i]=VR0s<9i+7:9i>.i=0 to 31BYTE[EA+32+i]=VR1s<9i+7:9i>.i=0 to 31BYTE[EA+64+i]=VR0s+1<9i+7:9i>.i=0 to 31BYTE[EA+96+i]=VR1s+1<9i+7:9i>.i=0 to 31BYTE[EA+128+i]=VR0s+2<9i+7:9i>.i=0 to 31BYTE[EA+160+i]=VR1s+2<9i+7:9i>.i=0 to 31BYTE[EA+192+i]=VR0s+3<9i+7:9i>.i=0 to 31BYTE[EA+224+i]=VR1s+3<9i+7:9i>.i=0 to 31 |
无效的数据地址,未对齐的访问。编程注解
此指令不受元素屏蔽的影响。VSTR 反向存储格式汇编器句法
VSTR.st Rs,SRb,SRi
VSTR.st Rs,SRb,#IMM
VSTR.st Rs,SRb+,SRi
VSTR.st Rs,SRb+,#IMM
其中st={4,8,16,32,64},Rs={VRs,VRAs}。注意.64和VRAs不能被一起指定。对Cache-off存储使用VSTROFF。说明
按逆元素顺序存储向量寄存器。本指令不支持标量数据源寄存器。操作
EA=SRb+{SRi‖sex(IMM<7:0>)};
if(A=1)SRb=EA;
MEM[EA]=见下表:
异常
ST | 存储操作 |
.b | BYTE[EA+i]=VRs[31-i]<7:0>.for i=0 to 31. |
.b | HALF[EA+i]=VRs[15-i]<15:0>.for i=0 to 15. |
.w | WORD[EA+i]=VRs[7-i]<31:0>.for i=0 to 7. |
.4 | BYTE[EA+i]=VRs[31-i]<7:0>.i=0 to 3 |
.8 | BYTE[EA+i]=VRs[31-i]<7:0>.i=0 to 7 |
.16 | BYTE[EA+i]=VRs[31-i]<7:0>.i=0 to 15 |
.32 | BYTE[EA+i]=VRs[31-i]<7:0>.i=0 to 31 |
.64 | BYTE[EA+32+i]=VR0s[31-i]<7:0>.i=0 to 31BYTE[EA+i]=VR1s[31-i]<7:0>.i=0 to 31 |
无效的数据地址,未对齐的访问。编程注解
VSTWS.st Rs,SRb,SRi
VSTWS.st Rs,SRb,#IMM
VSTWS.st Rs,SRb+,SRi
VSTWS.st Rs,SRb+,#IMM
其中st={8,16,32},Rs={VRs,VRAs}。注意不支持.64模式,用VST替代。对Cache-off存储使用VSTWSOFF。说明
从有效地址开始,用标量寄存器SRb+1作为跨距控制寄存器,从向量寄存器VRs向存储器存储32个字节。
ST指示block size、从每个块存储的连续字节数。SRb+1指示stride、分隔两个连续块的起始的字节数。
Stride必须等于或大于block size。EA必须对齐数据长度。stride和block size必须是多数据长度。操作
EA=SRb+{SRi‖sex(IMM<7:0>)};
if(A=1)SRb=EA;
Block-size={4‖8‖16‖32};
Stride=SRb+1<31:0>;
for(i=0;i<VECSIZE/Block-size;i++)
for(j=0;j<Block-size;j++)
BYTE[EA+I*Stride+j]=VRs{i*Block-size+j}<7:0>:异常
VSUB.dt VRd,VRa,VRb
VSUB.dt VRd,VRa,SRb
VSUB.dt VRd,VRa,#IMM
VSUB.dt SRd,SRa,SRb
VSUB.dt SRd,SRa,#IMM
其中dt={b,b9,h,w,f}。支持的模式说明
从向量/标量寄存器Ra的内容中减去向量/标量寄存器Rb的内容,其结果存放在向量/标量寄存器Rd中。操作
for(i=0;i<NumElem && EMASK[i];i++){
Bop[i]=[Rb[i]‖SRb‖sex(IMM<8:0>)};
Rd[i]=Ra[i]-Bop[i];
}异常
溢出,浮点无效的操作数。VSUBS 减及置位格式汇编器句法
VSUBS.dt SRd,SRa,SRb
VSUBS.dt SRd,SRa,#IMM
其中dt={b,b9,h,w,f}。支持的模式
说明
D:S:M | S<-S@S | S<-S@1 | |||
DS | int8(b) | int9(b9) | int16(h) | int32(w) | float(f) |
从SRa减去SRb;结果存入SRd,并且设置VCSR中的VFLAG位。操作
Bop={SRb‖sex(IMM<8:0>)};
SRd=SRa-Bop;
VCSR<lt,eq,gt>=status(SRa-Bop);异常
VUNSHFL.dt VRc,VRd,VRa,VRb
VUNSHFL.dt VRc,VRd,VRa,SRb
其中dt={b,b9,h,w,f}。注意.w和.f指示相同的操作。支持的模式
说明
S | VRb | SRb | ||
DS | int8(b) | int9(b9) | int16(h) | int32(w) |
无。编程注解
本指令不使用元素屏蔽。VUNSHFLH 去混洗高位格式汇编器句法
VUNSHFLH.dt VRd,VRa,VRb
VUNSHFLH.dt VRd,VRa,SRb
其中dt={b,b9,h,w,f}。注意.w和.f指示相同的操作。支持的模式
说明
S | VRb | SRb | ||
DS | int8(b) | int9(b9) | int16(h) | int32(w) |
无。编程注解
本指令不使用元素屏蔽。VUNSHFLL 去混洗低位格式汇编器句法
VUNSHFLL.dt VRd,VRa,VRb
VUNSHFLL.dt VRd,VRa,SRb
其中dt={b,b9,h,w,f}。注意.w和.f指定相同的操作。支持的模式
说明
S | VRb | SRb | ||
DS | int8(b) | int9(bg) | int16(h) | int32(w) |
向量寄存器VRa的内容与Rb被去混洗;结果的低位部分返回到向量寄存器VRd,如下所示:操作异常
无。编程注解
VWBACK.ln SRb,SRi
VWBACK.ln SRb,#IMM
VWBACK.ln SRb+,SRi
VWBACK.ln SRb+,#IMM
其中ln={1,2,4,8}。说明
其索引被向量数据Cache中的EA指定的(与其标签同EA匹配的那些相反)Cache行,如其包含修改过的数据,则被更新到存储器中。如果多于一个Cache行被指定,当它们包含修改过的数据时,后面相继的Cache行被更新到存储器。Cache行的数目指定如下:
LN<1:0>=00:写1个64字节的Cache行
LN<1:0>=01:写2个64字节的Cache行
LN<1:0>=10:写4个64字节的Cache行
LN<1:0>=11:写8个64字节的Cache行
如果有效地址不落在64字节的边界上,则它首先截断以与64字节的边界对齐。操作异常
无效的数据地址异常事件。编程注解
EA<31:0>指出局部存储器中的字节地址。VWBACKSP 从暂时存储器回写格式汇编器句法
VWBACKSP.ln SRp,SRb,SRi
VWBACKSP.ln SRp,SRb,#IMM
VWBACKSP.ln SRp,SRb+,SRi
VWBACKSP.ln SRp,SRb+,#IMM
其中ln={1,2,4,8}。注意VWBACK和VWBACKSP使用相同的操作码。说明
从暂时存储器向存储器传送多个64字节的块。有效地址给出存储器的起始地址,SRp给出暂时存储器的起始地址。64字节块的数目指定如下:
LN<1:0>=00:传送1个64字节的块
LN<1:0>=01:传送2个64字节的块
LN<1:0>=10:传送4个64字节的块
LN<1:0>=11:传送8个64字节的块
如果有效地址不落在64字节的边界上,则它首先截断以与64字节的边界对齐。如果SRp中的暂时存储器的指针地址不落在64字节的边界,也要截断并以及和64字节的边界对齐。对齐的暂时存储器的指针地址以传送的字节数增加。操作
EA=SRb+{SRi‖sex(IMM<7:0>)};
if(A=1)SRb=EA;
Num_bytes={64‖128‖256‖S12};
Mem_adrs=EA<31:6>:6b’000000;
SRp=SRp<31:6>:6b’000000;
for(i=0;i<Num_bytes;i++)
SPAD[SRp++]=MEM[Mem_adrs+i];异常
VXNOR.dt VRd,VRa,VRb
VXNOR.dt VRd,VRa,SRb
VXNOR.dt VRd,VRa,#IMM
VXNOR.dt SRd,SRa,SRb
VXNOR.dt SRd,SRa,#IMM
其中dt={b,b9,h,w}。支持的模式
说明
D:S:M | V<-V@V | V<-V@S | V<-V@I | S<-S@S | S<-S@I |
DS | int8(b) | int9(b9) | int16(h) | int32(w) |
向量/标量寄存器Ra的内容与向量/标量寄存器Rb的内容进行逻辑异或非,结果存入向量/标量寄存器Rd中。操作
for(i=0;i<NumElem && EMASK[i];i++){
Bop[i]={VRb[i]‖SRb‖sex(IMM<8:0>)};
Rd[i]<k>=-(Ra[i]<k>^Bop[i]<k>),for k=all bits in element i;
}异常
VXOR.dt VRd,VRa,VRb
VXOR.dt VRd,VRa,SRb
VXOR.dt VRd,VRa,#IMM
VXOR.dt SRd,SRa,SRb
VXOR.dt SRd,SRa,#IMM
其中dt={b,b9,h,w}。支持的模式
说明
D:S:M | V<-V@V | V<-V@S | V<-V@I | S<-S@S | S<-S@I |
DS | int8(b) | int9(b9) | int16(h) | int32(w) |
向量/标量寄存器Ra的内容与向量/标量寄存器Rb的内容进行逻辑异或,结果存入向量/标量寄存器Rd。操作
for(i=0;i<NumElem && EMASK[i];i++){
Bop[i]={VRb[i]‖SRb‖sex(IMM<8:0>)};
Rd[i]<k>=Ra[i]<k>^Bop[i]<k>.for k=all bits in element i;
}异常
无。VXORALL 异或全部元素格式汇编器句法
VXORALL.dt SRd,VRb
其中dt={b,b9,h,w}。注意.b和.b9指定相同的操作。支持的模式
说明
DS | int8(b) | int9(b9) | int16(h) | int32(w) |
VRb中每个元素的最低有效位一起被异或,1位的结果返回到SRd的最低有效位上。此指令不受元素屏蔽的影响。操作异常
无。
Claims (8)
1.一种向量处理器,其特征在于,在所述向量处理器中配有:向量寄存器的第一组、向量寄存器的第二组、包含缺省组字段的控制寄存器、以及向量寄存器的所述第一及第二组所用的选择电路;
所述第一组内的各个向量寄存器分配有与分配给所述第一组内的其他向量寄存器的寄存器号相区别的寄存器号;
所述第二组内的各个向量寄存器分配有与分配给所述第二组内的其他向量寄存器的寄存器号相区别、且与分配给所述第一组内相应的向量寄存器的寄存器号相同的寄存器号;
所述选择电路以第一模式工作,并可访问根据从所述向量处理器执行的指令所得到的寄存器号和通过来自所述缺省组字段的数值的组合来识别的向量寄存器。
2.如权利要求1所述的向量处理器,其特征在于,所述选择电路以第二模式工作,并可访问来自所述第一组的第一向量寄存器和来自所述第二组的第二向量寄存器;
所述第一及第二向量寄存器分配有从所述向量处理器执行的指令中得到的寄存器号,第一及第二寄存器的组合用于存储比所述每向量寄存器能存储的向量值更大的向量值。
3.如权利要求2所述的向量处理器,其特征在于,所述选择电路以第三模式工作,并可访问根据从所述向量处理器执行的指令得到的寄存器号和组值的组合来识别的向量寄存器。
4.如权利要求1所述的向量处理器,其特征在于,所述选择电路以第二模式工作,并可访问根据从所述向量处理器执行的指令得到的寄存器号和组值的组合来识别的向量寄存器。
5.如权利要求4所述的向量处理器,其特征在于,所述选择电路对于表示对向量进行的逻辑运算的指令可以以第一模式工作,而对于加载/存储运算则可以以第二模式工作。
6.一种操作向量处理器的方法,其特征在于,所述方法包括以下步骤:
对第一组内的向量寄存器分配寄存器号,使得分配给第一组内的各个向量寄存器的寄存器号与分配给所述第一组内的其他向量寄存器的寄存器号相区别的步骤;
对第二组内的向量寄存器分配寄存器号,使得分配给第二组内的各个向量寄存器的寄存器号与分配给所述第二组内的其他向量寄存器的寄存器号相区别,且与分配给所述第一组内相应的向量寄存器的寄存器号相同的步骤;
形成包含寄存器号的指令的步骤;
以包含下述过程的方式执行所述指令的步骤,所述过程是指访问分配有所述指令包含的寄存器号、并由所述向量处理器的控制寄存器的字段所指示的组内的向量寄存器的过程。
7.如权利要求6所述的操作向量处理器的方法,其特征在于,还包括以下步骤:
形成包含寄存器号的第二指令的步骤;
以包含下述两个过程的方式执行所述第二指令的步骤,所述两个过程分别是指访问分配有寄存器号并存在于所述第一组内的向量寄存器的过程、及访问分配有寄存器号并存在于所述第二组内的向量寄存器的过程。
8.如权利要求7所述的操作向量处理器的方法,其特征在于,访问第一及第二向量寄存器的所述过程包含处理单一向量的过程,所述单一向量包括存储在所述第一向量寄存器内的第一组数据元素及存储在所述第二向量寄存器内的第二组数据元素。
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US08/697,086 US5838984A (en) | 1996-08-19 | 1996-08-19 | Single-instruction-multiple-data processing using multiple banks of vector registers |
US697086 | 1996-08-19 | ||
US697,086 | 1996-08-19 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN1174353A CN1174353A (zh) | 1998-02-25 |
CN1117316C true CN1117316C (zh) | 2003-08-06 |
Family
ID=24799731
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN97117403A Expired - Lifetime CN1117316C (zh) | 1996-08-19 | 1997-08-19 | 采用多个向量寄存器组的单指令多数据处理方法及其装置 |
Country Status (7)
Country | Link |
---|---|
US (1) | US5838984A (zh) |
JP (1) | JP3983857B2 (zh) |
KR (1) | KR100236527B1 (zh) |
CN (1) | CN1117316C (zh) |
DE (1) | DE19735348B4 (zh) |
FR (1) | FR2752965B1 (zh) |
TW (1) | TW345650B (zh) |
Families Citing this family (132)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6643765B1 (en) | 1995-08-16 | 2003-11-04 | Microunity Systems Engineering, Inc. | Programmable processor with group floating point operations |
US5961631A (en) * | 1997-07-16 | 1999-10-05 | Arm Limited | Data processing apparatus and method for pre-fetching an instruction in to an instruction cache |
US5864703A (en) | 1997-10-09 | 1999-01-26 | Mips Technologies, Inc. | Method for providing extended precision in SIMD vector arithmetic operations |
US7197625B1 (en) * | 1997-10-09 | 2007-03-27 | Mips Technologies, Inc. | Alignment and ordering of vector elements for single instruction multiple data processing |
US6230259B1 (en) | 1997-10-31 | 2001-05-08 | Advanced Micro Devices, Inc. | Transparent extended state save |
US6157996A (en) * | 1997-11-13 | 2000-12-05 | Advanced Micro Devices, Inc. | Processor programably configurable to execute enhanced variable byte length instructions including predicated execution, three operand addressing, and increased register space |
US6334176B1 (en) * | 1998-04-17 | 2001-12-25 | Motorola, Inc. | Method and apparatus for generating an alignment control vector |
US6282634B1 (en) * | 1998-05-27 | 2001-08-28 | Arm Limited | Apparatus and method for processing data having a mixed vector/scalar register file |
US6862563B1 (en) | 1998-10-14 | 2005-03-01 | Arc International | Method and apparatus for managing the configuration and functionality of a semiconductor design |
US20060168431A1 (en) * | 1998-10-14 | 2006-07-27 | Peter Warnes | Method and apparatus for jump delay slot control in a pipelined processor |
US7308559B2 (en) * | 2000-02-29 | 2007-12-11 | International Business Machines Corporation | Digital signal processor with cascaded SIMD organization |
AU2001243463A1 (en) | 2000-03-10 | 2001-09-24 | Arc International Plc | Memory interface and method of interfacing between functional entities |
JP3940542B2 (ja) * | 2000-03-13 | 2007-07-04 | 株式会社ルネサステクノロジ | データプロセッサ及びデータ処理システム |
JP2001283413A (ja) * | 2000-03-29 | 2001-10-12 | Tdk Corp | スピンバルブ膜の製造方法 |
US6857061B1 (en) * | 2000-04-07 | 2005-02-15 | Nintendo Co., Ltd. | Method and apparatus for obtaining a scalar value directly from a vector register |
US6877084B1 (en) | 2000-08-09 | 2005-04-05 | Advanced Micro Devices, Inc. | Central processing unit (CPU) accessing an extended register set in an extended register mode |
US6981132B2 (en) | 2000-08-09 | 2005-12-27 | Advanced Micro Devices, Inc. | Uniform register addressing using prefix byte |
US7155601B2 (en) * | 2001-02-14 | 2006-12-26 | Intel Corporation | Multi-element operand sub-portion shuffle instruction execution |
US7599981B2 (en) * | 2001-02-21 | 2009-10-06 | Mips Technologies, Inc. | Binary polynomial multiplier |
US7162621B2 (en) | 2001-02-21 | 2007-01-09 | Mips Technologies, Inc. | Virtual instruction expansion based on template and parameter selector information specifying sign-extension or concentration |
US7181484B2 (en) * | 2001-02-21 | 2007-02-20 | Mips Technologies, Inc. | Extended-precision accumulation of multiplier output |
US7711763B2 (en) | 2001-02-21 | 2010-05-04 | Mips Technologies, Inc. | Microprocessor instructions for performing polynomial arithmetic operations |
US7039060B2 (en) * | 2001-03-07 | 2006-05-02 | Mips Tech Inc | System and method for extracting fields from packets having fields spread over more than one register |
US7861071B2 (en) * | 2001-06-11 | 2010-12-28 | Broadcom Corporation | Conditional branch instruction capable of testing a plurality of indicators in a predicate register |
US6986025B2 (en) * | 2001-06-11 | 2006-01-10 | Broadcom Corporation | Conditional execution per lane |
US7127593B2 (en) * | 2001-06-11 | 2006-10-24 | Broadcom Corporation | Conditional execution with multiple destination stores |
US7631025B2 (en) * | 2001-10-29 | 2009-12-08 | Intel Corporation | Method and apparatus for rearranging data between multiple registers |
US20040054877A1 (en) | 2001-10-29 | 2004-03-18 | Macy William W. | Method and apparatus for shuffling data |
US7739319B2 (en) * | 2001-10-29 | 2010-06-15 | Intel Corporation | Method and apparatus for parallel table lookup using SIMD instructions |
US7818356B2 (en) | 2001-10-29 | 2010-10-19 | Intel Corporation | Bitstream buffer manipulation with a SIMD merge instruction |
US7685212B2 (en) * | 2001-10-29 | 2010-03-23 | Intel Corporation | Fast full search motion estimation with SIMD merge instruction |
US7624138B2 (en) | 2001-10-29 | 2009-11-24 | Intel Corporation | Method and apparatus for efficient integer transform |
US7725521B2 (en) * | 2001-10-29 | 2010-05-25 | Intel Corporation | Method and apparatus for computing matrix transformations |
US20100274988A1 (en) * | 2002-02-04 | 2010-10-28 | Mimar Tibet | Flexible vector modes of operation for SIMD processor |
US20030231660A1 (en) * | 2002-06-14 | 2003-12-18 | Bapiraju Vinnakota | Bit-manipulation instructions for packet processing |
US7793084B1 (en) | 2002-07-22 | 2010-09-07 | Mimar Tibet | Efficient handling of vector high-level language conditional constructs in a SIMD processor |
US7392368B2 (en) * | 2002-08-09 | 2008-06-24 | Marvell International Ltd. | Cross multiply and add instruction and multiply and subtract instruction SIMD execution on real and imaginary components of a plurality of complex data elements |
WO2004015563A1 (en) * | 2002-08-09 | 2004-02-19 | Intel Corporation | Multimedia coprocessor control mechanism including alignment or broadcast instructions |
US6986023B2 (en) | 2002-08-09 | 2006-01-10 | Intel Corporation | Conditional execution of coprocessor instruction based on main processor arithmetic flags |
GB2394571B (en) * | 2002-10-23 | 2005-08-10 | Motorola Inc | Arrangement system and method for vector permutation in single-instruction multiple-data microprocessors |
JP2004302647A (ja) * | 2003-03-28 | 2004-10-28 | Seiko Epson Corp | ベクトルプロセッサおよびレジスタのアドレス指定方法 |
US20040215924A1 (en) * | 2003-04-28 | 2004-10-28 | Collard Jean-Francois C. | Analyzing stored data |
US7610466B2 (en) * | 2003-09-05 | 2009-10-27 | Freescale Semiconductor, Inc. | Data processing system using independent memory and register operand size specifiers and method thereof |
US7315932B2 (en) | 2003-09-08 | 2008-01-01 | Moyer William C | Data processing system having instruction specifiers for SIMD register operands and method thereof |
US7275148B2 (en) * | 2003-09-08 | 2007-09-25 | Freescale Semiconductor, Inc. | Data processing system using multiple addressing modes for SIMD operations and method thereof |
GB2409067B (en) * | 2003-12-09 | 2006-12-13 | Advanced Risc Mach Ltd | Endianess compensation within a SIMD data processing system |
GB2409060B (en) * | 2003-12-09 | 2006-08-09 | Advanced Risc Mach Ltd | Moving data between registers of different register data stores |
GB2409059B (en) * | 2003-12-09 | 2006-09-27 | Advanced Risc Mach Ltd | A data processing apparatus and method for moving data between registers and memory |
GB2411973B (en) * | 2003-12-09 | 2006-09-27 | Advanced Risc Mach Ltd | Constant generation in SMD processing |
GB2411974C (en) * | 2003-12-09 | 2009-09-23 | Advanced Risc Mach Ltd | Data shift operations |
GB2409063B (en) * | 2003-12-09 | 2006-07-12 | Advanced Risc Mach Ltd | Vector by scalar operations |
GB2409068A (en) * | 2003-12-09 | 2005-06-15 | Advanced Risc Mach Ltd | Data element size control within parallel lanes of processing |
GB2411975B (en) * | 2003-12-09 | 2006-10-04 | Advanced Risc Mach Ltd | Data processing apparatus and method for performing arithmetic operations in SIMD data processing |
GB2409062C (en) * | 2003-12-09 | 2007-12-11 | Advanced Risc Mach Ltd | Aliasing data processing registers |
GB2409065B (en) * | 2003-12-09 | 2006-10-25 | Advanced Risc Mach Ltd | Multiplexing operations in SIMD processing |
GB2409064B (en) * | 2003-12-09 | 2006-09-13 | Advanced Risc Mach Ltd | A data processing apparatus and method for performing in parallel a data processing operation on data elements |
GB2409061B (en) * | 2003-12-09 | 2006-09-13 | Advanced Risc Mach Ltd | Table lookup operation within a data processing system |
GB2411976B (en) * | 2003-12-09 | 2006-07-19 | Advanced Risc Mach Ltd | A data processing apparatus and method for moving data between registers and memory |
GB2409066B (en) * | 2003-12-09 | 2006-09-27 | Advanced Risc Mach Ltd | A data processing apparatus and method for moving data between registers and memory |
GB2410097B (en) * | 2004-01-13 | 2006-11-01 | Advanced Risc Mach Ltd | A data processing apparatus and method for performing data processing operations on floating point data elements |
GB2411978B (en) * | 2004-03-10 | 2007-04-04 | Advanced Risc Mach Ltd | Inserting bits within a data word |
US7873812B1 (en) | 2004-04-05 | 2011-01-18 | Tibet MIMAR | Method and system for efficient matrix multiplication in a SIMD processor architecture |
US7302627B1 (en) * | 2004-04-05 | 2007-11-27 | Mimar Tibet | Apparatus for efficient LFSR calculation in a SIMD processor |
US7493481B1 (en) * | 2004-05-17 | 2009-02-17 | Netxen, Inc. | Direct hardware processing of internal data structure fields |
US9557994B2 (en) | 2004-07-13 | 2017-01-31 | Arm Limited | Data processing apparatus and method for performing N-way interleaving and de-interleaving operations where N is an odd plural number |
US20060070042A1 (en) * | 2004-09-24 | 2006-03-30 | Muratori Richard D | Automatic clocking in shared-memory co-simulation |
US20060179265A1 (en) * | 2005-02-08 | 2006-08-10 | Flood Rachel M | Systems and methods for executing x-form instructions |
US20060218377A1 (en) * | 2005-03-24 | 2006-09-28 | Stexar Corporation | Instruction with dual-use source providing both an operand value and a control value |
US7933405B2 (en) * | 2005-04-08 | 2011-04-26 | Icera Inc. | Data access and permute unit |
US7421566B2 (en) | 2005-08-12 | 2008-09-02 | International Business Machines Corporation | Implementing instruction set architectures with non-contiguous register file specifiers |
US20070038984A1 (en) | 2005-08-12 | 2007-02-15 | Gschwind Michael K | Methods for generating code for an architecture encoding an extended register specification |
US7734897B2 (en) * | 2005-12-21 | 2010-06-08 | Arm Limited | Allocation of memory access operations to memory access capable pipelines in a superscalar data processing apparatus and method having a plurality of execution threads |
US20070283129A1 (en) * | 2005-12-28 | 2007-12-06 | Stephan Jourdan | Vector length tracking mechanism |
US7565514B2 (en) * | 2006-04-28 | 2009-07-21 | Freescale Semiconductor, Inc. | Parallel condition code generation for SIMD operations |
US7958181B2 (en) | 2006-09-21 | 2011-06-07 | Intel Corporation | Method and apparatus for performing logical compare operations |
US9223751B2 (en) * | 2006-09-22 | 2015-12-29 | Intel Corporation | Performing rounding operations responsive to an instruction |
US8127113B1 (en) | 2006-12-01 | 2012-02-28 | Synopsys, Inc. | Generating hardware accelerators and processor offloads |
JPWO2008087779A1 (ja) * | 2007-01-19 | 2010-05-06 | 日本電気株式会社 | アレイ型プロセッサおよびデータ処理システム |
US20080229062A1 (en) * | 2007-03-12 | 2008-09-18 | Lorenzo Di Gregorio | Method of sharing registers in a processor and processor |
US8156307B2 (en) * | 2007-08-20 | 2012-04-10 | Convey Computer | Multi-processor system having at least one processor that comprises a dynamically reconfigurable instruction set |
US9015399B2 (en) | 2007-08-20 | 2015-04-21 | Convey Computer | Multiple data channel memory module architecture |
US8122229B2 (en) * | 2007-09-12 | 2012-02-21 | Convey Computer | Dispatch mechanism for dispatching instructions from a host processor to a co-processor |
US8561037B2 (en) | 2007-08-29 | 2013-10-15 | Convey Computer | Compiler for generating an executable comprising instructions for a plurality of different instruction sets |
US8095735B2 (en) * | 2008-08-05 | 2012-01-10 | Convey Computer | Memory interleave for heterogeneous computing |
US9710384B2 (en) * | 2008-01-04 | 2017-07-18 | Micron Technology, Inc. | Microprocessor architecture having alternative memory access paths |
CN101377735B (zh) * | 2007-08-28 | 2011-09-28 | 凌阳科技股份有限公司 | 于多模处理器中以串行位决定指令长度的装置及方法 |
US8078836B2 (en) | 2007-12-30 | 2011-12-13 | Intel Corporation | Vector shuffle instructions operating on multiple lanes each having a plurality of data elements using a common set of per-lane control bits |
US8205066B2 (en) * | 2008-10-31 | 2012-06-19 | Convey Computer | Dynamically configured coprocessor for different extended instruction set personality specific to application program with shared memory storing instructions invisibly dispatched from host processor |
US20100115233A1 (en) * | 2008-10-31 | 2010-05-06 | Convey Computer | Dynamically-selectable vector register partitioning |
US8423745B1 (en) | 2009-11-16 | 2013-04-16 | Convey Computer | Systems and methods for mapping a neighborhood of data to general registers of a processing element |
US8434074B2 (en) * | 2010-02-24 | 2013-04-30 | Intel Corporation | Register allocation with SIMD architecture using write masks |
KR20110103256A (ko) * | 2010-03-12 | 2011-09-20 | 삼성전자주식회사 | 다중 입출력 오퍼레이션 지원 프로세서 및 그 방법 |
US20120185670A1 (en) * | 2011-01-14 | 2012-07-19 | Toll Bret L | Scalar integer instructions capable of execution with three registers |
US9128701B2 (en) * | 2011-04-07 | 2015-09-08 | Via Technologies, Inc. | Generating constant for microinstructions from modified immediate field during instruction translation |
KR20120134549A (ko) | 2011-06-02 | 2012-12-12 | 삼성전자주식회사 | Simd 프로세서를 이용한 병렬 연산 처리 장치 및 방법 |
KR101572770B1 (ko) | 2011-09-26 | 2015-11-27 | 인텔 코포레이션 | 벡터 로드-op/저장-op에 스트라이드 기능을 제공하는 명령어 및 로직 |
KR101783312B1 (ko) * | 2011-11-15 | 2017-10-10 | 삼성전자주식회사 | 클러스터 간의 통신으로 인한 오버헤드를 최소화하는 장치 및 방법 |
WO2013085491A1 (en) * | 2011-12-06 | 2013-06-13 | Intel Corporation | System, apparatus and method for translating vector instructions |
CN108681465B (zh) * | 2011-12-22 | 2022-08-02 | 英特尔公司 | 用于产生整数序列的处理器、处理器核及系统 |
CN107102844B (zh) * | 2011-12-23 | 2021-06-08 | 英特尔公司 | 超级乘加(超级madd)指令 |
WO2013095634A1 (en) * | 2011-12-23 | 2013-06-27 | Intel Corporation | Systems, apparatuses, and methods for performing a horizontal partial sum in response to a single instruction |
US9792115B2 (en) | 2011-12-23 | 2017-10-17 | Intel Corporation | Super multiply add (super MADD) instructions with three scalar terms |
CN104040482B (zh) * | 2011-12-28 | 2018-02-16 | 英特尔公司 | 用于在打包数据元素上执行增量解码的系统、装置和方法 |
CN104025025B (zh) | 2011-12-28 | 2018-08-28 | 英特尔公司 | 用于对打包数据元素执行增量编码的系统、装置和方法 |
WO2013101232A1 (en) * | 2011-12-30 | 2013-07-04 | Intel Corporation | Packed rotate processors, methods, systems, and instructions |
US10289412B2 (en) * | 2012-02-09 | 2019-05-14 | Qualcomm Incorporated | Floating point constant generation instruction |
US9268564B2 (en) * | 2012-05-30 | 2016-02-23 | Intel Corporation | Vector and scalar based modular exponentiation |
US10430190B2 (en) | 2012-06-07 | 2019-10-01 | Micron Technology, Inc. | Systems and methods for selectively controlling multithreaded execution of executable code segments |
CN102819692A (zh) * | 2012-08-10 | 2012-12-12 | 上海交通大学 | 基于fpga的rna二级结构预测装置、系统及其实现方法 |
CN102930008B (zh) * | 2012-10-29 | 2015-10-07 | 无锡江南计算技术研究所 | 向量查表方法 |
US9639371B2 (en) * | 2013-01-29 | 2017-05-02 | Advanced Micro Devices, Inc. | Solution to divergent branches in a SIMD core using hardware pointers |
CN104375803B (zh) * | 2013-08-13 | 2017-10-24 | 华为技术有限公司 | 一种数据处理的方法及装置 |
CN104461939A (zh) * | 2014-12-16 | 2015-03-25 | 清华大学 | 扩展处理器寄存器堆容量的方法 |
US10296489B2 (en) * | 2014-12-27 | 2019-05-21 | Intel Corporation | Method and apparatus for performing a vector bit shuffle |
US10296334B2 (en) * | 2014-12-27 | 2019-05-21 | Intel Corporation | Method and apparatus for performing a vector bit gather |
US10503502B2 (en) | 2015-09-25 | 2019-12-10 | Intel Corporation | Data element rearrangement, processors, methods, systems, and instructions |
GB2543303B (en) * | 2015-10-14 | 2017-12-27 | Advanced Risc Mach Ltd | Vector data transfer instruction |
US9733899B2 (en) * | 2015-11-12 | 2017-08-15 | Arm Limited | Lane position information for processing of vector |
US10152321B2 (en) * | 2015-12-18 | 2018-12-11 | Intel Corporation | Instructions and logic for blend and permute operation sequences |
US20170177350A1 (en) * | 2015-12-18 | 2017-06-22 | Intel Corporation | Instructions and Logic for Set-Multiple-Vector-Elements Operations |
CN107315563B (zh) * | 2016-04-26 | 2020-08-07 | 中科寒武纪科技股份有限公司 | 一种用于执行向量比较运算的装置和方法 |
CN107315568B (zh) * | 2016-04-26 | 2020-08-07 | 中科寒武纪科技股份有限公司 | 一种用于执行向量逻辑运算的装置 |
CN108009976A (zh) * | 2016-10-27 | 2018-05-08 | 超威半导体公司 | 用于图形处理单元(gpu)计算的超级单指令多数据(超级simd) |
US10216479B2 (en) * | 2016-12-06 | 2019-02-26 | Arm Limited | Apparatus and method for performing arithmetic operations to accumulate floating-point numbers |
EP3747167B1 (en) * | 2018-02-19 | 2022-08-31 | Huawei Technologies Co., Ltd. | Multi-cloud vpc routing and registration |
JP7296574B2 (ja) * | 2019-03-04 | 2023-06-23 | パナソニックIpマネジメント株式会社 | プロセッサ及びプロセッサの制御方法 |
US11132198B2 (en) | 2019-08-29 | 2021-09-28 | International Business Machines Corporation | Instruction handling for accumulation of register results in a microprocessor |
CN110727412B (zh) * | 2019-09-14 | 2022-01-07 | 无锡江南计算技术研究所 | 一种基于掩码的混合浮点乘法低功耗控制方法及装置 |
US11551148B2 (en) * | 2020-04-29 | 2023-01-10 | Marvell Asia Pte Ltd | System and method for INT9 quantization |
CN112230995B (zh) * | 2020-10-13 | 2024-04-09 | 广东省新一代通信与网络创新研究院 | 一种指令的生成方法、装置以及电子设备 |
CN113064841B (zh) * | 2021-01-04 | 2023-06-06 | 统信软件技术有限公司 | 一种数据存储方法、处理方法、计算设备及可读存储介质 |
CN115794671B (zh) * | 2023-02-07 | 2023-04-14 | 成都申威科技有限责任公司 | 一种兼容向量数据的访存系统及方法 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US4791555A (en) * | 1983-10-24 | 1988-12-13 | International Business Machines Corporation | Vector processing unit |
US5115393A (en) * | 1988-09-14 | 1992-05-19 | Hitachi, Ltd. | Vector processor performing data operations in one half of a total time period of write operation and the read operation |
EP0646877A2 (en) * | 1993-10-05 | 1995-04-05 | Fujitsu Limited | Computer system and method for processing vector data |
Family Cites Families (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPS59160267A (ja) * | 1983-03-02 | 1984-09-10 | Hitachi Ltd | ベクトル処理装置 |
JPH0648486B2 (ja) * | 1986-10-08 | 1994-06-22 | 日本電気株式会社 | ベクトルデ−タ処理装置 |
JP2679994B2 (ja) * | 1987-08-14 | 1997-11-19 | 株式会社日立製作所 | ベクトル処理装置 |
US5226142A (en) * | 1990-11-21 | 1993-07-06 | Ross Technology, Inc. | High performance register file with overlapping windows |
US5493687A (en) * | 1991-07-08 | 1996-02-20 | Seiko Epson Corporation | RISC microprocessor architecture implementing multiple typed register sets |
US5438669A (en) * | 1991-11-20 | 1995-08-01 | Hitachi, Ltd. | Data processor with improved loop handling utilizing improved register allocation |
JP2823767B2 (ja) * | 1992-02-03 | 1998-11-11 | 松下電器産業株式会社 | レジスタファイル |
JPH06274528A (ja) * | 1993-03-18 | 1994-09-30 | Fujitsu Ltd | ベクトル演算処理装置 |
JP2883784B2 (ja) * | 1993-04-27 | 1999-04-19 | 株式会社東芝 | マイクロコンピュータ |
WO1995032466A1 (en) * | 1994-05-19 | 1995-11-30 | Vlsi Technology, Inc. | Flexible register mapping scheme |
-
1996
- 1996-08-19 US US08/697,086 patent/US5838984A/en not_active Expired - Lifetime
-
1997
- 1997-04-07 KR KR1019970012770A patent/KR100236527B1/ko not_active IP Right Cessation
- 1997-08-14 DE DE19735348A patent/DE19735348B4/de not_active Expired - Lifetime
- 1997-08-18 FR FR9710436A patent/FR2752965B1/fr not_active Expired - Lifetime
- 1997-08-19 CN CN97117403A patent/CN1117316C/zh not_active Expired - Lifetime
- 1997-08-19 TW TW086111968A patent/TW345650B/zh not_active IP Right Cessation
- 1997-08-19 JP JP23766597A patent/JP3983857B2/ja not_active Expired - Fee Related
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US4791555A (en) * | 1983-10-24 | 1988-12-13 | International Business Machines Corporation | Vector processing unit |
US5115393A (en) * | 1988-09-14 | 1992-05-19 | Hitachi, Ltd. | Vector processor performing data operations in one half of a total time period of write operation and the read operation |
EP0646877A2 (en) * | 1993-10-05 | 1995-04-05 | Fujitsu Limited | Computer system and method for processing vector data |
Also Published As
Publication number | Publication date |
---|---|
DE19735348B4 (de) | 2006-10-05 |
CN1174353A (zh) | 1998-02-25 |
KR19980018072A (ko) | 1998-06-05 |
US5838984A (en) | 1998-11-17 |
JP3983857B2 (ja) | 2007-09-26 |
FR2752965A1 (fr) | 1998-03-06 |
TW345650B (en) | 1998-11-21 |
DE19735348A1 (de) | 1998-03-12 |
JPH10116268A (ja) | 1998-05-06 |
FR2752965B1 (fr) | 2004-09-24 |
KR100236527B1 (ko) | 1999-12-15 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN1117316C (zh) | 采用多个向量寄存器组的单指令多数据处理方法及其装置 | |
CN1112635C (zh) | 多媒体信号处理器中的单指令多数据处理方法及其装置 | |
CN1103961C (zh) | 协处理器的数据访问控制装置和方法 | |
CN1135468C (zh) | 对存储设备中信号数据字执行数字信号处理的方法和装置 | |
CN1246772C (zh) | 处理器 | |
CN1625731A (zh) | 具有多种长度指令集体系结构的可配置数据处理器 | |
CN1080906C (zh) | 一种数据处理系统及其方法 | |
CN1149469C (zh) | 支持分组数据的处理器 | |
CN1194292C (zh) | 具有改良的指令集体系结构的微处理器 | |
CN1656495A (zh) | 标量/矢量处理器 | |
CN1584824A (zh) | 一种基于cisc结构的微处理器构架及指令实现方式 | |
CN1173931A (zh) | 处理器的定制的基本操作的方法与设备 | |
CN1226323A (zh) | 数据处理装置寄存器 | |
CN1103959C (zh) | 数据处理装置和操作数据处理装置的方法 | |
CN1152300C (zh) | 多媒体信号处理器中的单指令多数据处理方法及其装置 | |
CN1269052C (zh) | 支持缩小代码长度的常量还原型处理器 | |
CN1862485A (zh) | 数字信号处理器 | |
CN1279435C (zh) | 数字信号处理器 | |
CN1104679C (zh) | 数据处理装置和数据处理方法 | |
CN1254740C (zh) | 使用协处理器的数据处理 | |
CN1226325A (zh) | 数据处理系统中的输入操作数控制 | |
CN1226324A (zh) | 数据处理系统寄存器控制 | |
CN1223934C (zh) | 处理超长指令控制体系的方法 | |
CN1133452A (zh) | 宏指令集对称式并行体系结构微处理器 | |
CN1898641A (zh) | 微控制器指令集 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CX01 | Expiry of patent term | ||
CX01 | Expiry of patent term |
Granted publication date: 20030806 |