Add edge case for FCMP with 0 immediate. (#8)
* Add edge case for FCMP with 0 immediate. * Update emit_a64_floating_point.cpp
This commit is contained in:
parent
8691f52aaa
commit
571c73a8f3
@ -183,13 +183,21 @@ static ARM64Reg SetFpscrNzcvFromFlags(BlockOfCode& code, EmitContext& ctx) {
|
||||
void EmitA64::EmitFPCompare32(EmitContext& ctx, IR::Inst* inst) {
|
||||
auto args = ctx.reg_alloc.GetArgumentInfo(inst);
|
||||
ARM64Reg reg_a = EncodeRegToSingle(ctx.reg_alloc.UseFpr(args[0]));
|
||||
ARM64Reg reg_b = EncodeRegToSingle(ctx.reg_alloc.UseFpr(args[1]));
|
||||
bool exc_on_qnan = args[2].GetImmediateU1();
|
||||
|
||||
if (exc_on_qnan) {
|
||||
code.fp_emitter.FCMPE(reg_a, reg_b);
|
||||
if (args[1].IsImmediate() && args[1].GetImmediateU64() == 0) {
|
||||
if (exc_on_qnan) {
|
||||
code.fp_emitter.FCMPE(reg_a);
|
||||
} else {
|
||||
code.fp_emitter.FCMP(reg_a);
|
||||
}
|
||||
} else {
|
||||
code.fp_emitter.FCMP(reg_a, reg_b);
|
||||
ARM64Reg reg_b = EncodeRegToSingle(ctx.reg_alloc.UseFpr(args[1]));
|
||||
if (exc_on_qnan) {
|
||||
code.fp_emitter.FCMPE(reg_a, reg_b);
|
||||
} else {
|
||||
code.fp_emitter.FCMP(reg_a, reg_b);
|
||||
}
|
||||
}
|
||||
|
||||
ARM64Reg nzcv = SetFpscrNzcvFromFlags(code, ctx);
|
||||
@ -199,13 +207,21 @@ void EmitA64::EmitFPCompare32(EmitContext& ctx, IR::Inst* inst) {
|
||||
void EmitA64::EmitFPCompare64(EmitContext& ctx, IR::Inst* inst) {
|
||||
auto args = ctx.reg_alloc.GetArgumentInfo(inst);
|
||||
const ARM64Reg reg_a = EncodeRegToDouble(ctx.reg_alloc.UseFpr(args[0]));
|
||||
const ARM64Reg reg_b = EncodeRegToDouble(ctx.reg_alloc.UseFpr(args[1]));
|
||||
bool exc_on_qnan = args[2].GetImmediateU1();
|
||||
|
||||
if (exc_on_qnan) {
|
||||
code.fp_emitter.FCMPE(reg_a, reg_b);
|
||||
if (args[1].IsImmediate() && args[1].GetImmediateU64() == 0) {
|
||||
if (exc_on_qnan) {
|
||||
code.fp_emitter.FCMPE(reg_a);
|
||||
} else {
|
||||
code.fp_emitter.FCMP(reg_a);
|
||||
}
|
||||
} else {
|
||||
code.fp_emitter.FCMP(reg_a, reg_b);
|
||||
const ARM64Reg reg_b = EncodeRegToDouble(ctx.reg_alloc.UseFpr(args[1]));
|
||||
if (exc_on_qnan) {
|
||||
code.fp_emitter.FCMPE(reg_a, reg_b);
|
||||
} else {
|
||||
code.fp_emitter.FCMP(reg_a, reg_b);
|
||||
}
|
||||
}
|
||||
|
||||
ARM64Reg nzcv = SetFpscrNzcvFromFlags(code, ctx);
|
||||
|
Loading…
x
Reference in New Issue
Block a user