Skip to content

Commit

Permalink
backend:修复了条件码取反的错误,更改了浮点数的条件码的情况以支持NaN的比较,增加了大量的注释,删去了项目中的冗余信息
Browse files Browse the repository at this point in the history
  • Loading branch information
youngk1019 committed Jul 5, 2023
1 parent 792f752 commit 221429e
Show file tree
Hide file tree
Showing 24 changed files with 412 additions and 533 deletions.
8 changes: 7 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,15 @@ test-data/personal
.idea
*.iml

# Vscode Projects
.vscode

# Test script log
ssyc.log
ssyc.*.log

# Personal data
.vscode/java.code-snippets
.vscode/java.code-snippets

# MacOS
.DS_store
11 changes: 0 additions & 11 deletions .vscode/extensions.json

This file was deleted.

16 changes: 0 additions & 16 deletions .vscode/launch.json

This file was deleted.

49 changes: 0 additions & 49 deletions .vscode/settings.json

This file was deleted.

32 changes: 0 additions & 32 deletions .vscode/tasks.json

This file was deleted.

72 changes: 7 additions & 65 deletions docs/backend.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,78 +52,14 @@ Operand
cond: Any, Ge, Gt, Eq, Ne, Le, Lt
> 表示改指令在什么情况下执行(目前只有Branch跳转指令、MOV指令和BranchToCond优化涉及)
> (对于比赛用例的中, 出现了浮点数Nan的比较, 因而应该将Le改用LsLt改用Mi, 目前本项目还是保留为Le, Lt)
> (对于比赛用例的中, 出现了浮点数Nan的比较, 因而应该将Le改用Ls,Lt改用Mi,而Ge改用Pl,Gt改用Hi不需要添加)
operands:表示该指令所拥有的操作数
> 并不是所有的指令都拥有操作数 比如Return和Branch指令 每个指令所拥有的操作数个数也不一定相同,比如Binary就有三个操作数 而Ternay则有四个操作数
Shift: Arm汇编中的第2个操作数
> 表示的是对于,用于在计算时实现移位操作
### 指令接口

对于指令的构造函数而言,如果第一次参数时ArmBlock则表示将该指令自动插入到该ArmBlock的尾部

对于每个指令而言,可以通过

```java
getRegUse()
```
获得使用寄存器

```java
getRegDef()
```
获得定值寄存器

使用寄存器和定值寄存器保证是一个寄存器类型,而不会是一个立即数或者是地址,这个概念来源于Live Interval计算(活跃区间计算)

对于未进行寄存器分配时的操作数,也有可能是物理寄存器,这是因为在函数传参和返回时会涉及到固定的物理寄存器

对于每个指令而言,有三个接口可以替换操作数

```java
replaceOperand(Operand oldOp, Operand op)
```
将指令中所有的操作数为操作数oladOp替换为操作数op

```java
replaceDefOperand(Operand oldOp, Operand op)
```
将指令中所有的使用操作数为操作数oladOp替换为操作数op

```java
replaceUseOperand(Operand oldOp, Operand op)
```
将指令中所有的定值操作数为操作数oladOp替换为操作数op

因为替换是把所有同类型的操作数都进行替换(可能会出现指令ADD VR1 VR2 VR2,为相同的虚拟寄存器的情况),因此如果不希望全部替换则可以只替换使用操作数的部分和定值操作数的部分(理论上对于使用操作数为同一个操作数时,同时替换肯定是最优解?)

### 寄存器接口

对于创建一个物理寄存器 可以直接通过
```java
IPhyReg.R(0), IPhyReg.SP, new IPhyReg(0), new IPhyReg(13)
```
其中第一个和第三个等价 第二个和第四个等价

目前可以使用的寄存器:

通用寄存器: r0-r12 r14(lr)

向量寄存器: s0-s31

IVirtualReg 应该分配通用寄存器
FVirtualReg 应该分配向量寄存器

对于寄存器有接口:
```java
Set<ArmInst> getInstSet()
```
其可以返回该寄存器在哪些指令当中使用了,每次该寄存器被替换了则会在这个Set中自动删除

但实际上这个只对虚拟寄存器是有效的,因为逻辑上相同的虚拟寄存器也是同一个实例,但对于物理寄存器而言,逻辑上相同的物理寄存器并不一定是同一个实例。

### 栈结构

对于在 Linux ARM 上, 栈向低地址方向增长, 高地址是栈顶
Expand Down Expand Up @@ -252,6 +188,12 @@ StackAddr用于表示一个基址或者一个CAlloc的在栈上的地址,当

$$\mid x \mid = 2^x \pm 2^y / 0 \quad (x \geq y)$$

对于立即数模,只会对`2^n``0`的特殊情况进行优化

立即数模其本身等价于 x % y == x - (x / y) * y

其中模转换成的乘法和除法也可以继续使用立即数乘除法优化

### 窥孔优化

目前采用的策略包括:
Expand Down
43 changes: 0 additions & 43 deletions local-test/find_exit_code.py

This file was deleted.

Loading

0 comments on commit 221429e

Please sign in to comment.