MIPS - 有没有办法将协处理器1中的标志值传送到协处理器0的整数寄存器?

时间:2015-03-10 10:34:23

标签: assembly floating-point comparison mips spim

我正在为学校项目制作编译器,我使用MIPS程序集作为我的目标代码。但这并不重要。我知道涉及浮点数的操作是在协处理器1中完成的,而c.eq.dc.le.d等比较指令的结果位于可以通过bc1t和{{1}进行测试的标志中。 }}。有没有一种方法可以在不使用bc1f$a0的分支指令的情况下将MIPS的值传送到协处理器0的寄存器(例如bc1t)。如果这是不可能的,我如何在SPIM中创建匿名标签?似乎SPIM不支持此功能。 (如果我错了,请纠正我。)

1 个答案:

答案 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