我正在为学校项目制作编译器,我使用MIPS程序集作为我的目标代码。但这并不重要。我知道涉及浮点数的操作是在协处理器1中完成的,而c.eq.d
和c.le.d
等比较指令的结果位于可以通过bc1t
和{{1}进行测试的标志中。 }}。有没有一种方法可以在不使用bc1f
和$a0
的分支指令的情况下将MIPS的值传送到协处理器0的寄存器(例如bc1t
)。如果这是不可能的,我如何在SPIM中创建匿名标签?似乎SPIM不支持此功能。 (如果我错了,请纠正我。)
答案 0 :(得分:1)
您可以使用MOVF
(或MOVT
)根据单个FP条件代码在GPR中放置值:
MOVF rd, rs, cc
To test an FP condition code then conditionally move a GPR
If the floating point condition code specified by CC is zero, then the contents of GPR rs are placed into GPR rd.
或者,如果您想同时使用所有条件代码,则可以使用CFC1
:
CFC1 rt, fs
Copy the 32-bit word from FP (coprocessor 1) control register fs into GPR rt.
if fs = 0 then
temp <- FIR
elseif fs = 25 then
temp <- 0^24 || FCSR31..25 || FCSR23
elseif fs = 26 then
temp <- 0^14 || FCSR17..12 || 0^5 || FCSR6..2 || 0^2
elseif fs = 28 then
temp <- 0^20 || FCSR11.7 || 0^4 || FCSR24 || FCSR1..0
elseif fs = 31 then
temp <- FCSR
else
temp <- UNPREDICTABLE
endif
GPR[rt] <- temp
您想要的位数是23和25..31,因此$f25
或$f31
应该适合用作fs
。