diff --git a/src/mir/Lowering.cpp b/src/mir/Lowering.cpp index c0d6f93..0817fbb 100644 --- a/src/mir/Lowering.cpp +++ b/src/mir/Lowering.cpp @@ -154,16 +154,16 @@ void EmitValueToReg(const ir::Value* value, PhysReg target, slot = function.CreateFrameIndex(4); // 将 imm 写入栈槽(与 ConstantFloat 相同方式) if (isLegalMovImm(imm)) { - block.Append(Opcode::MovImm, {Operand::Reg(PhysReg::W8), Operand::Imm(static_cast(imm))}); + block.Append(Opcode::MovImm, {Operand::Reg(PhysReg::W10), Operand::Imm(static_cast(imm))}); } else { uint16_t low = imm & 0xFFFF; uint16_t high = (imm >> 16) & 0xFFFF; - block.Append(Opcode::MovImm, {Operand::Reg(PhysReg::W8), Operand::Imm(low)}); + block.Append(Opcode::MovImm, {Operand::Reg(PhysReg::W10), Operand::Imm(low)}); if (high != 0) { - block.Append(Opcode::Movk, {Operand::Reg(PhysReg::W8), Operand::Imm(high), Operand::Imm(16)}); + block.Append(Opcode::Movk, {Operand::Reg(PhysReg::W10), Operand::Imm(high), Operand::Imm(16)}); } } - block.Append(Opcode::StoreStack, {Operand::Reg(PhysReg::W8), Operand::FrameIndex(slot)}); + block.Append(Opcode::StoreStack, {Operand::Reg(PhysReg::W10), Operand::FrameIndex(slot)}); const_cast(slots).emplace(value, slot); } else { slot = it->second; @@ -209,16 +209,16 @@ void EmitValueToReg(const ir::Value* value, PhysReg target, // 同样需要对 int_val 进行大立即数分解 if (isLegalMovImm(int_val)) { - block.Append(Opcode::MovImm, {Operand::Reg(PhysReg::W8), Operand::Imm(static_cast(int_val))}); + block.Append(Opcode::MovImm, {Operand::Reg(PhysReg::W10), Operand::Imm(static_cast(int_val))}); } else { uint16_t low = int_val & 0xFFFF; uint16_t high = (int_val >> 16) & 0xFFFF; - block.Append(Opcode::MovImm, {Operand::Reg(PhysReg::W8), Operand::Imm(low)}); + block.Append(Opcode::MovImm, {Operand::Reg(PhysReg::W10), Operand::Imm(low)}); if (high != 0) { - block.Append(Opcode::Movk, {Operand::Reg(PhysReg::W8), Operand::Imm(high), Operand::Imm(16)}); + block.Append(Opcode::Movk, {Operand::Reg(PhysReg::W10), Operand::Imm(high), Operand::Imm(16)}); } } - block.Append(Opcode::StoreStack, {Operand::Reg(PhysReg::W8), Operand::FrameIndex(slot)}); + block.Append(Opcode::StoreStack, {Operand::Reg(PhysReg::W10), Operand::FrameIndex(slot)}); const_cast(slots).emplace(value, slot); } else { slot = it->second; @@ -239,8 +239,8 @@ void EmitValueToReg(const ir::Value* value, PhysReg target, if (it == slots.end()) { slot = function.CreateFrameIndex(4); // 写入 0 - block.Append(Opcode::MovImm, {Operand::Reg(PhysReg::W8), Operand::Imm(0)}); - block.Append(Opcode::StoreStack, {Operand::Reg(PhysReg::W8), Operand::FrameIndex(slot)}); + block.Append(Opcode::MovImm, {Operand::Reg(PhysReg::W10), Operand::Imm(0)}); + block.Append(Opcode::StoreStack, {Operand::Reg(PhysReg::W10), Operand::FrameIndex(slot)}); const_cast(slots).emplace(value, slot); } else { slot = it->second; @@ -768,8 +768,13 @@ void LowerInstruction(const ir::Instruction& inst, MachineFunction& function, std::string end_label = ".L_fcset_end_" + std::to_string(reinterpret_cast(&fcmp)); // 5. 处理 NaN 情况 - block.Append(Opcode::BCond, {Operand::Cond(CondCode::VS), Operand::Label(end_label)}); - + if (isOrdered) { + // 有序比较:如果无序 (V=1) → 直接结束(结果为 0) + block.Append(Opcode::BCond, {Operand::Cond(CondCode::VS), Operand::Label(end_label)}); + } else { + // 无序比较:如果无序 (V=1) → 结果置 1 + block.Append(Opcode::BCond, {Operand::Cond(CondCode::VS), Operand::Label(set1_label)}); + } // 6. 正常条件跳转 block.Append(Opcode::BCond, {Operand::Cond(cc), Operand::Label(set1_label)});