Skip to content

Commit 9c69ebd

Browse files
committed
[RV64_DYNAREC] Added 66 F0 81/83 /4 opcode
1 parent ea01b56 commit 9c69ebd

File tree

1 file changed

+66
-0
lines changed

1 file changed

+66
-0
lines changed

src/dynarec/rv64/dynarec_rv64_66f0.c

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,72 @@ uintptr_t dynarec64_66F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
191191
}
192192
}
193193
break;
194+
case 4: // AND
195+
if (opcode == 0x81) {
196+
INST_NAME("LOCK AND Ew, Iw");
197+
} else {
198+
INST_NAME("LOCK AND Ew, Ib");
199+
}
200+
SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
201+
if (MODREG) {
202+
if (opcode == 0x81)
203+
u64 = F16;
204+
else
205+
u64 = (uint16_t)(int16_t)F8S;
206+
ed = TO_NAT((nextop & 7) + (rex.b << 3));
207+
MOV64x(x5, u64);
208+
ZEXTH(x6, ed);
209+
emit_and16(dyn, ninst, x6, x5, x3, x4);
210+
SRLI(ed, ed, 16);
211+
SLLI(ed, ed, 16);
212+
OR(ed, ed, x6);
213+
} else {
214+
addr = geted(dyn, addr, ninst, nextop, &wback, x2, x1, &fixedaddress, rex, LOCK_LOCK, 0, (opcode == 0x81) ? 2 : 1);
215+
if (opcode == 0x81)
216+
u64 = F16;
217+
else
218+
u64 = (uint16_t)(int16_t)F8S;
219+
MOV64x(x5, u64);
220+
221+
ANDI(x3, wback, 0b10);
222+
BNEZ_MARK(x3);
223+
224+
// lower 16 bits
225+
MARKLOCK;
226+
LR_W(x1, wback, 1, 1);
227+
SRLIW(x3, x1, 16);
228+
SLLIW(x3, x3, 16);
229+
AND(x4, x1, x5);
230+
OR(x4, x4, x3);
231+
SC_W(x3, x4, wback, 1, 1);
232+
BNEZ_MARKLOCK(x3);
233+
IFXORNAT (X_ALL | X_PEND) {
234+
SLLIW(x1, x1, 16);
235+
SRLIW(x1, x1, 16);
236+
}
237+
B_MARK3_nocond;
238+
239+
MARK;
240+
// upper 16 bits
241+
XORI(wback, wback, 0b10);
242+
MARK2;
243+
LR_W(x1, wback, 1, 1);
244+
SLLIW(x3, x1, 16);
245+
SRLIW(x3, x3, 16);
246+
SRLIW(x1, x1, 16);
247+
AND(x4, x1, x5);
248+
SLLIW(x4, x4, 16);
249+
OR(x4, x4, x3);
250+
SC_W(x3, x4, wback, 1, 1);
251+
BNEZ_MARK2(x3);
252+
253+
MARK3;
254+
// final
255+
IFXORNAT (X_ALL | X_PEND) {
256+
emit_and16(dyn, ninst, x1, x5, x3, x4);
257+
}
258+
}
259+
break;
194260
default:
195261
DEFAULT;
196262
}

0 commit comments

Comments
 (0)