Skip to content

Commit f1559b0

Browse files
committed
[DYNAREC] Improved x87 comparison (backporteed from Box64)
1 parent c9d20f6 commit f1559b0

File tree

11 files changed

+76
-24
lines changed

11 files changed

+76
-24
lines changed

src/dynarec/dynarec_arm_0f.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -475,7 +475,7 @@ uintptr_t dynarec0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst,
475475
VMOVD(d1, v0);
476476
}
477477
VCMP_F32(d1*2, s0);
478-
FCOMI(x1, x2);
478+
FCOMI(x1, x2, 0, 0, d1*2, s0, 1);
479479
break;
480480

481481
case 0x31:

src/dynarec/dynarec_arm_660f.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,7 @@ uintptr_t dynarec660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nins
282282
v0 = sse_get_reg(dyn, ninst, x1, gd, 0);
283283
GETEX(q0, 0);
284284
VCMP_F64(v0, q0);
285-
FCOMI(x1, x2);
285+
FCOMI(x1, x2, 0, 0, v0, q0, 0);
286286
break;
287287

288288
case 0x38: // SSSE3 opcodes

src/dynarec/dynarec_arm_d8.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ uintptr_t dynarecD8(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst,
100100
} else {
101101
VCMP_F64(v1, v2);
102102
}
103-
FCOM(x1, x2);
103+
FCOM(x1, x2, x3, x14, v1, v2, ST_IS_F(0));
104104
break;
105105
case 0xD8:
106106
case 0xD9:
@@ -118,7 +118,7 @@ uintptr_t dynarecD8(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst,
118118
} else {
119119
VCMP_F64(v1, v2);
120120
}
121-
FCOM(x1, x2);
121+
FCOM(x1, x2, x3, x14, v1, v2, ST_IS_F(0));
122122
X87_POP_OR_FAIL(dyn, ninst, x3);
123123
break;
124124
case 0xE0:
@@ -275,7 +275,7 @@ uintptr_t dynarecD8(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst,
275275
VCVT_F64_F32(d1, s0);
276276
VCMP_F64(v1, d1);
277277
}
278-
FCOM(x1, x2);
278+
FCOM(x1, x2, x3, x14, v1, ST_IS_F(0)?s0:d1, ST_IS_F(0));
279279
break;
280280
case 3:
281281
INST_NAME("FCOMP ST0, float[ED]");
@@ -296,7 +296,7 @@ uintptr_t dynarecD8(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst,
296296
VCVT_F64_F32(d1, s0);
297297
VCMP_F64(v1, d1);
298298
}
299-
FCOM(x1, x2);
299+
FCOM(x1, x2, x3, x14, v1, ST_IS_F(0)?s0:d1, ST_IS_F(0));
300300
X87_POP_OR_FAIL(dyn, ninst, x3);
301301
break;
302302
case 4:

src/dynarec/dynarec_arm_d9.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ uintptr_t dynarecD9(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst,
126126
} else {
127127
VCMP_F64_0(v1);
128128
}
129-
FCOM(x1, x2); // same flags...
129+
FCOM(x1, x2, 0, 0, v1, 0, ST_IS_F(0)); // same flags...
130130
break;
131131
case 0xE5:
132132
INST_NAME("FXAM");

src/dynarec/dynarec_arm_da.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ uintptr_t dynarecDA(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst,
128128
} else {
129129
VCMP_F64(v1, v2);
130130
}
131-
FCOM(x1, x2);
131+
FCOM(x1, x2, x3, x14, v1, v2, ST_IS_F(0));
132132
X87_POP_OR_FAIL(dyn, ninst, x3);
133133
X87_POP_OR_FAIL(dyn, ninst, x3);
134134
break;
@@ -185,7 +185,7 @@ uintptr_t dynarecDA(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst,
185185
VMOVtoV(s0, ed);
186186
VCVT_F64_S32(d0, s0);
187187
VCMP_F64(v1, d0);
188-
FCOM(x1, x2);
188+
FCOM(x1, x2, x3, x14, v1, d0, 0);
189189
break;
190190
case 3:
191191
INST_NAME("FICOMP ST0, Ed");
@@ -196,7 +196,7 @@ uintptr_t dynarecDA(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst,
196196
VMOVtoV(s0, ed);
197197
VCVT_F64_S32(d0, s0);
198198
VCMP_F64(v1, d0);
199-
FCOM(x1, x2);
199+
FCOM(x1, x2, x3, x14, v1, d0, 0);
200200
X87_POP_OR_FAIL(dyn, ninst, x3);
201201
break;
202202
case 4:

src/dynarec/dynarec_arm_db.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ uintptr_t dynarecDB(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst,
149149
} else {
150150
VCMP_F64(v1, v2);
151151
}
152-
FCOMI(x1, x2);
152+
FCOMI(x1, x2, x3, x14, v1, v2, ST_IS_F(0));
153153
break;
154154
case 0xF0:
155155
case 0xF1:
@@ -168,7 +168,7 @@ uintptr_t dynarecDB(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst,
168168
} else {
169169
VCMP_F64(v1, v2);
170170
}
171-
FCOMI(x1, x2);
171+
FCOMI(x1, x2, x3, x14, v1, v2, ST_IS_F(0));
172172
break;
173173

174174
case 0xE0:

src/dynarec/dynarec_arm_dc.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ uintptr_t dynarecDC(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst,
9696
} else {
9797
VCMP_F64(v1, v2);
9898
}
99-
FCOM(x1, x2);
99+
FCOM(x1, x2, x3, x14, v1, v2, ST_IS_F(0));
100100
break;
101101
case 0xD8:
102102
case 0xD9:
@@ -114,7 +114,7 @@ uintptr_t dynarecDC(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst,
114114
} else {
115115
VCMP_F64(v1, v2);
116116
}
117-
FCOM(x1, x2);
117+
FCOM(x1, x2, x3, x14, v1, v2, ST_IS_F(0));
118118
X87_POP_OR_FAIL(dyn, ninst, x3);
119119
break;
120120
case 0xE0:
@@ -258,7 +258,7 @@ uintptr_t dynarecDC(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst,
258258
VMOVtoV_D(d1, x2, x3);
259259
}
260260
VCMP_F64(v1, d1);
261-
FCOM(x1, x2);
261+
FCOM(x1, x2, x3, x14, v1, d1, 0);
262262
break;
263263
case 3:
264264
INST_NAME("FCOMP ST0, double[ED]");
@@ -275,7 +275,7 @@ uintptr_t dynarecDC(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst,
275275
VMOVtoV_D(d1, x2, x3);
276276
}
277277
VCMP_F64(v1, d1);
278-
FCOM(x1, x2);
278+
FCOM(x1, x2, x3, x14, v1, d1, 0);
279279
X87_POP_OR_FAIL(dyn, ninst, x3);
280280
break;
281281
case 4:

src/dynarec/dynarec_arm_dd.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ uintptr_t dynarecDD(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst,
111111
} else {
112112
VCMP_F64(v1, v2);
113113
}
114-
FCOM(x1, x2);
114+
FCOM(x1, x2, x3, x14, v1, v2, ST_IS_F(0));
115115
break;
116116
case 0xE8:
117117
case 0xE9:
@@ -129,7 +129,7 @@ uintptr_t dynarecDD(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst,
129129
} else {
130130
VCMP_F64(v1, v2);
131131
}
132-
FCOM(x1, x2);
132+
FCOM(x1, x2, x3, x14, v1, v2, ST_IS_F(0));
133133
X87_POP_OR_FAIL(dyn, ninst, x3);
134134
break;
135135

src/dynarec/dynarec_arm_de.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ uintptr_t dynarecDE(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst,
9494
} else {
9595
VCMP_F64(v1, v2);
9696
}
97-
FCOM(x1, x2);
97+
FCOM(x1, x2, x3, x14, v1, v2, ST_IS_F(0));
9898
X87_POP_OR_FAIL(dyn, ninst, x3);
9999
break;
100100

@@ -107,7 +107,7 @@ uintptr_t dynarecDE(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst,
107107
} else {
108108
VCMP_F64(v1, v2);
109109
}
110-
FCOM(x1, x2);
110+
FCOM(x1, x2, x3, x14, v1, v2, ST_IS_F(0));
111111
X87_POP_OR_FAIL(dyn, ninst, x3);
112112
X87_POP_OR_FAIL(dyn, ninst, x3);
113113
break;

src/dynarec/dynarec_arm_df.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ uintptr_t dynarecDF(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst,
9090
} else {
9191
VCMP_F64(v1, v2);
9292
}
93-
FCOMI(x1, x2);
93+
FCOMI(x1, x2, x3, x14, v1, v2, ST_IS_F(0));
9494
X87_POP_OR_FAIL(dyn, ninst, x3);
9595
break;
9696
case 0xF0:
@@ -111,7 +111,7 @@ uintptr_t dynarecDF(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst,
111111
} else {
112112
VCMP_F64(v1, v2);
113113
}
114-
FCOMI(x1, x2);
114+
FCOMI(x1, x2, x3, x14, v1, v2, ST_IS_F(0));
115115
X87_POP_OR_FAIL(dyn, ninst, x3);
116116
break;
117117

0 commit comments

Comments
 (0)