基于CEVA DSP BX2的架构分析(六)-加载和存储单元(一)

目录

6 加载和存储单元

6.1 概述

6.2 加载和存储单元

6.3 寻址模式

6.3.1 间接寻址模式

6.3.2 索引寻址模式

​​​​​​​6.3.3 直接寻址模式

​​​​​​​6.3.4 堆栈寻址模式

​​​​​​​6.3.4 IBA相对寻址


6 加载和存储单元

6.1 概述

加载和存储单元(LSU)执行以下操作:

  • 生成数据的地址
  • 执行数据内存加载和存储操作
  • 打开并打包加载和存储的数据
  • 将其写入/读取处理器的内部寄存器

LSU包括两个名为LS0和LS1的加载和存储单元。LS0用于从存储器加载数据,LS1用于将数据存储到存储器中。

LS0和LS1单元支持以下主要机制:

  • 根据一种寻址模式生成32位地址的线性地址。该地址指向数据存储器空间中的字节位置。
  • SPU、LSU和PCU单元的读取带宽为128位,写入带宽为128比特。这使得LS0和LS1都可以通过字节对齐来读取和写入其最大带宽。
  • 有两种类型的地址寄存器编辑:线性编辑和模数编辑。每个LSU都可以编辑通用寄存器或堆栈指针。
  • 多循环操作。某些操作可以加载或存储超过128位。在这种情况下,单个指令在多个周期内执行。

LS0和LS1单元连接到通用通用寄存器文件(GRF)。GRF包含32位寄存器、通用寄存器、步进寄存器和堆栈指针寄存器。

所有LSU指令都可以使用其中一个断言(predicate)寄存器进行条件运算。SPU包含可以影响断言(predicate)寄存器的专用指令。LSU指令只支持标量预测,这意味着整个指令要么被执行,要么不被执行。

图6-1.LSU框图

以下部分描述LSU及其支持的寻址机制。

6.2 加载和存储单元

LSU包含两个独立的加载和存储单元:LS0从存储器加载数据,LS1将数据存储到存储器。每个单元支持两个主要机制:

  • 地址生成
  • 指针编辑

地址生成机制根据指令中指定的寻址模式计算单个32位地址。然后,将地址连同读/写选通和访问宽度一起提供给数据存储器。地址指向字节位置。

由于每个单元可以生成单个地址,因此可以同时生成总共两个地址:一个用于从存储器加载数据,另一个用于将数据存储到存储器。

LS0和LS1单元支持一组用于访问数据存储器的指令,如中所述。表6-1

表6-1. 内存访问指令

说明书

LS0/LS1

描述

ld

LS0

将内存操作数从数据内存加载到SPU、LSU或PCU寄存器中

st

LS1

将SPU、LSU或PCU寄存器或其部分存储到数据存储器中

pop

LS0

将操作数从软件堆栈弹出到SPU、LSU或PCU寄存器

push

LS1

将SPU、LSU或PCU寄存器推入软件堆栈

LS0和LS1单元通过Little Endian方法访问内存,这意味着LSB存储在最低地址中。

以下部分描述了LS0和LS1单元支持的不同寻址模式,以及有关支持的访问类型和指针修改机制的详细信息。

注:规格适用于LS0和LS1单元。

6.3 寻址模式

每个LSU支持以下寻址模式:

  • 间接,6.3.1, 间接 寻址 模式
  • 索引,6.3.2, 索引 寻址 模式
  • 直接,6.3.3, 直接 寻址 模式
  • 堆栈,6.3.4, 堆栈 寻址 模式

由于LS0和LS1是独立的单元,因此它们中使用的寻址模式可以不同。寻址模式在指令中使用专用语法指定。该语法在每个寻址模式的相关部分中进行了描述。

6.3.1 间接寻址模式

在间接寻址模式下,GRF寄存器包含32位地址。间接寻址模式使用线性模式方法,这意味着地址是指针的内容。指针寄存器可以事后修改。

示例 6-1 演示了间接寻址模式。

例6-1.线性模式下的间接寻址

mov #0x1004,r4.ui; r4 contains the address 0x1004.

nop

nop

ld (r4.ui).s+, r0.i ; Loads short from address 0x1004 into r0.

 

​​​​​​​6.3.2 索引寻址模式

在索引寻址模式中,地址是基址寄存器和偏移量的总和。基址寄存器可以是32个GRF寄存器和堆栈指针中的任何一个。偏移可以是以下之一:

  • GRF寄存器
  • 高达16位的有符号立即数

尽管偏移量被添加到基址寄存器,但基址寄存器保持不变。

偏移量包含许多字节,并且不会根据访问类型自动缩放。

当寄存器指定偏移量时,可以对其进行后期修改。有关修改后选项的更多详细信息,请参阅第6.4节,指针修改机制。

索引寻址模式的语法在表 6-2列出。

表6-2.索引寻址模式语法

寻址模式

语法

Indexed

Offset is a register

(rM.ui + rN.[u]i)

Offset is a signed 16-bit immediate value

(rM + #immN16)

下面的示例演示索引寻址模式的使用。

例6-2.以指针作为偏移量索引

mov #0x004,r0.ui; Initializes the base register r0.

mov #0x100,r3.i; Initializes the offset pointer r3.

nop

nop

st r7.i,(r0.ui+r3.i).i; An integer is stored at address 0x104.

; r0 is kept unchanged.

; r3 is post-modified and its value after

; the store instruction execution is 0x104.

例6-3.以立即数作为偏移量索引

mov #0x010,r1.ui; Initializes the base register r1.

nop

nop

ld (#300+r1.ui).s, r7.i ; Loads a short integer from address 0x310.

 ; r1 is kept unchanged.

​​​​​​​6.3.3 直接寻址模式

在直接寻址模式下,整个32位地址在指令中显式指定。当地址是32位无符号立即数时,直接寻址模式在指令中由语法[#address]指定。示例 6-4 演示此寻址模式的用法。

实施例6-4.直接寻址

st r0.i,r4.i,(#0x1000A234).s2; Two words are stored at address

; 0x1000_A234.

​​​​​​​6.3.4 堆栈寻址模式

GRF包含一个32位堆栈指针寄存器,称为sp,它指向压入软件堆栈的最后一个值。该软件堆栈可以驻留在数据空间中的任何位置。

由于堆栈是从高内存地址填充到低内存地址的,因此当新操作数被推送到堆栈上时,堆栈指针在生成内存写入地址之前递减。以相同的方式,当操作数从堆栈中弹出时,堆栈指针在生成内存读取地址后递增。堆栈指针用于pop、push、ld和st指令。每个指令都对软件堆栈和堆栈指针执行专用操作。通常,堆栈指针会根据指令中定义的访问宽度自动修改。下表列出了根据各种指令进行的堆栈指针修改。

表6-3. 堆栈指针修改

说明书

堆栈指针修改

pop{ch1}

sp+1

pop{sh1}

sp+2

pop{1}

sp+4

pop{ch2}

sp+2

pop{sh2}

sp+4

pop{in2}

sp+8

pop{ch4}

sp+4

pop{sh4}

sp+8

pop{in4}

sp+16

push{ch1}

sp-1

push{sh1}

sp-2

push{1}

sp-4

push{ch2}

sp-2

push{sh2}

sp-4

push{in2}

sp-8

push{ch4}

sp-4

push{sh4}

sp-8

push{in4}

sp-16

push指令可以在堆栈中存储多个操作数。指令中的第一个(最左侧)操作数是堆栈中要推入的第一个操作数,如例6-5中所示。

实施例6-5. push指令

Assuming that the following instruction is executed:

push{sh4} r7.i, r13.i, r4.i, r10.i

And assuming:

r7=0x0000ABCD, r13= 0x00005678

r4= 0x00001234, r10 = 0x0000DCBA

The following figure shows the stack before and after the push instructions:

操作数按它们在推送指令中出现的顺序(即从左到右)存储在堆栈中,这意味着r10在堆栈中被推到最后。堆栈指针递减八个字节。数据存储为Little Endian,这意味着LSB存储在最低地址。

pop指令还可以加载多个操作数。指令中的第一个(最左侧)操作数是第一个要加载的操作数。此规则也适用于并行弹出指令,如例6-6中所示。

实施例6-6. pop指令

Assuming that the following instruction is executed:

pop{in1} r17.i

The following figure shows the stack before and after the pop{i1} instruction:

内存操作数加载到r17寄存器中,堆栈指针递增四个字节。数据从内存中弹出为Little Endian,这意味着LSB被弹出到r17的最低字节。

在pop{i1}指令之后,r17的内容是0xABCD1234。

​​​​​​​6.3.4 IBA相对寻址

特殊LD指令基于与IBA寄存器的偏移量从存储器加载32位(如第3.4.3节,即时基址寄存器中所述)。IBA寄存器指向数据存储器中的一个部分,该部分保存应用程序使用的32位立即数表。通过内存访问这些值比将它们直接编码为具有32位立即数操作数的mov指令更具代码效率。

有效使用此指令的能力基于软件工具支持的编译后流,其中收集整个应用程序中使用的32位立即数符号,并根据其使用频率进行排序。结果列表被加载到数据存储器中的一个部分,其中最频繁的值首先列出。这使得可以使用更短的ld变量来访问它们(最短的变量是16位长)。

​​​​​​​6.3.5 mpush/mpop指令

以下多周期指令用于在跳转到函数后从函数返回之前最小化存储和恢复寄存器所需的代码占用:

  • mpush:执行一系列推送事务的单个指令。它实现编译器通常在函数序言中使用的操作,并将被调用方保存的寄存器保存在堆栈中。

mpush指令还可以选择执行frmalloc操作并存储PRDR寄存器。

  • mpop:执行一系列弹出事务的单个指令。它实现编译器通常在函数的尾声中使用的操作,并在从函数返回之前从堆栈中还原被调用方保存的寄存器。

mpop指令还可以选择性地执行与mpop的一系列pop操作并行执行的ret。

mpop指令还可以选择执行frmrestore操作并还原PRDR寄存器。

因为编译器约定被调用方保存的寄存器是r9-r23,所以mpush指令开始从r9向前推。帧寄存器(r8)通过隐含的frmalloc和frmrestore指令存储和恢复。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/374331.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构与算法】之排序系列-20240205

这里写目录标题 一、1346. 检查整数及其两倍数是否存在二、1365. 有多少小于当前数字的数字三、1460. 通过翻转子数组使两个数组相等四、1491. 去掉最低工资和最高工资后的工资平均值五、1502. 判断能否形成等差数列 一、1346. 检查整数及其两倍数是否存在 简单 给你一个整数数…

2024/2/5总结

微信小程序 监听对象中所有属性的变化 如果某个对象中需要被监听的属性太多,为了方便,可以使用 通配符 ** 来监听 对象中所有属性的变化 什么是纯数字字段 概念:纯数字字段指的是那些不用于界面渲染的 data 字段。 好处:提升界面…

EasyExcel下载带下拉框和批注模板

EasyExcel下载带下拉框和批注模板 一、 代码实现 controller下载入口 /***下载excel模板* author youlu* date 2023/8/14 17:31* param response* param request* return void*/PostMapping("/downloadTemplate")public void downloadExcel(HttpServletResponse r…

python下字符串操作

目录 一:连接字符串 二:字符串切片 三:字符串查找 四:字符串替换 五:字符串大小写转换 六:字符串分割 七:字符串去除空格和特殊字符 八:字符串长度 九:检查字符…

【CSS】css如何实现字体大小小于12px?

【CSS】css如何实现字体大小小于12px? 问题解决方案transform: scale(0.5)(常用)SVG 矢量图设置text 问题 文字需要显示为12px,但是小于12px的,浏览器是显示不来的 解决方案 transform: scale(0.5)(常用&#xff0…

比较迭代次数最小的结构

( A, B )---6*30*2---( 1, 0 )( 0, 1 ) 让网络的输入有6个节点,训练集AB各由6张二值化的图片组成,让B全是0, 所以差值结构的尺寸为6*6,在这6*6的范围中迭代次数最小的结构是什么? 迭代次数 迭代次数 - - - 12842…

OpenWrt之有线中继无缝漫游mesh组网详解

文章目录 前言什么是MeshMesh的优点检查OpenWrt的设置选项设置WIFI设置KVRNAS ID设置教程 移动域 / Mobility Domain设置教程 重关联截止时间 / Reassociation Deadline设置教程 FT协议 / Fast Transition / FT protocol设置教程 本地生成 PMK / Generate PMK locally设置教程 …

java设计模式之中介者模式

中介者模式(Mediator Pattern) 基本介绍 中介者模式,用一个中介对象来封装一系列的对象交互。中介者使各个对象不需要显式地相互引用,从而使其解耦松散。而且可以独立地改变它们之间的交互。中介者模式属于行为型模式。比如MVC模…

vue3+echarts:Vue中使用echarts从后端获取数据并赋值显示

//由于前后端交互,所以使用axios发送请求 const Count ref(null); //设备种类数值 const Name ref(null); //设备种类名称 //设备种类 饼图 const pieChart () > {const getpieChart echarts.init(document.getElementById("deviceKind"));// 创建图标getpieC…

Windows11安装运行Linux(Ubuntu)

一、安装windows支持 输入windows打开界面 选择虚拟机监控程序平台、适用于linux的子系统、虚拟机平台 在 Windows 系统中,"虚拟机平台"和"虚拟机监控程序平台"是两个与虚拟化相关的功能,但它们各自有着不同的作用和用途。 虚拟机…

【FPGA】高云FPGA之IP核的使用->PLL锁相环

FPGA开发流程 1、设计定义2、设计输入3、分析和综合4、功能仿真5、布局布线6、时序仿真7、IO分配以及配置文件(bit流文件)的生成8、配置(烧录)FPGA9、在线调试 1、设计定义 使用高云内置IP核实现多路不同时钟输出 输入时钟50M由晶…

【PostgreSQL内核学习(二十六) —— (共享数据缓冲区)】

共享数据缓冲区 概述共享数据缓冲区管理共享缓冲区管理的核心功能包括: 共享数据缓冲区的组织结构初始化共享缓冲池BufferDesc 结构体InitBufferPool 函数 如何确定请求的数据页面是否在缓冲区中?BufferTag 结构体RelFileNode 结构体ForkNumber 结构体Re…

高速接口PCB布局指南(二)通用高速信号布线

高速接口PCB布局指南(二)通用高速信号布线 1.PCB材料编织2.高速信号布线长度3.高速信号布线长度匹配4.高速信号参考平面 tips:资料主要来自网络,仅供学习使用。 1.PCB材料编织 在常见的 PCB 材料上为差分信号布线时,…

【Iceberg学习二】Branch和Tag在Iceberg中的应用

Iceberg 表元数据保持一个快照日志,记录了对表所做的更改。快照在 Iceberg 中至关重要,因为它们是读者隔离和时间旅行查询的基础。为了控制元数据大小和存储成本,Iceberg 提供了快照生命周期管理程序,如 expire_snapshots&#xf…

知识图谱问答:构建人机自然交互的桥梁

目录 前言1 基本概念1.1 图灵测试1.2 特定领域的问答系统1.3 知识图谱问答1.4 典型应用与系统 2 智能问答系统分类2.1 问句类型分类2.2 系统来源分类 3 实现知识图谱问答主要技术方法3.1 基于问句模板的方法3.2 基于语义解析的方法3.3 基于检索排序的方法3.4 基于深度学习的方法…

代码随想录算法训练营第十二天 | 239. 滑动窗口最大值,347.前 K 个高频元素 [栈与队列篇]

代码随想录算法训练营第十二天 LeetCode 239. 滑动窗口最大值题目描述思路参考代码总结 LeetCode 347.前 K 个高频元素题目描述思路参考代码 LeetCode 239. 滑动窗口最大值 题目链接:239. 滑动窗口最大值 文章讲解:代码随想录#239. 滑动窗口最大值 视频讲…

现货黄金突破2050美元 后续还会涨吗?

一两个月以前,受美联储降息预期影响,现货黄金价格一度强势上涨,并且刷新历史新高。随后,市场不断消化降息预期,金价逐步回落,盘中一度下探2000大关。在今年的一季度,行情再度发生变化&#xff0…

华为5G沸沸扬扬!那你知道三防平板网络是什么类型呢!

近日,华为在5G的事件在热搜上可是着实的火了一把啊!让小编想起一款来自亿道信息EM-I22K-5G的一款三防平板产品,你知道是什么网络类型的呢? EM-I22K-5G 不知道?没关系呀!小编可以为你普及亿道信息EM-I22K-5G…

寒假作业-day5

TCP和UDP区别 TCP ----稳定 1、提供面向连接的,可靠的数据传输服务; 2、传输过程中,数据无误、数据无丢失、数据无失序、数据无重复; 3、数据传输效率低,耗费资源多; 4、数据收发是不同步的; UD…

软件价值8-站点连通性检查

站点连通性检查,即看网站是否能访问得通,实用价值不大,不过用来作软件应用入门还不错。 代码: import urllib.request import tkinter as tkdef test_connectivity():window tk.Tk()window.geometry(600x400)window.resizable(F…