about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2023-03-31 20:06:22 +0800
committerGitHub <noreply@github.com>2023-03-31 14:06:22 +0200
commit27b1e28f6332c1a1bf79ed2777313f14812e09f9 (patch)
treedd4b3e250d60bad7e1bda708b06d3fc91ad293de /src
parent4431ef7736587e490c6c122038f4203bb729b8e6 (diff)
downloadbox64-27b1e28f6332c1a1bf79ed2777313f14812e09f9.tar.gz
box64-27b1e28f6332c1a1bf79ed2777313f14812e09f9.zip
[RV64_DYNAREC] Added more opcodes (#656)
* [RV64_DYNAREC] Added a TODO

* [RV64_DYNAREC] Added F3 0F 5D MINSS opcode

* [RV64_DYNAREC] Added F3 0F 5F MAXSS opcode
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/rv64/dynarec_rv64_f0.c2
-rw-r--r--src/dynarec/rv64/dynarec_rv64_f30f.c30
2 files changed, 32 insertions, 0 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_f0.c b/src/dynarec/rv64/dynarec_rv64_f0.c
index c6dff5d9..446d830f 100644
--- a/src/dynarec/rv64/dynarec_rv64_f0.c
+++ b/src/dynarec/rv64/dynarec_rv64_f0.c
@@ -61,6 +61,8 @@ uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 case 0xC1:
                     switch(rep) {
                         case 0:
+                            // TODO: Take care of unligned memory access.
+                            // https://github.com/ptitSeb/box64/pull/604
                             INST_NAME("LOCK XADD Gd, Ed");
                             SETFLAGS(X_ALL, SF_SET_PENDING);
                             nextop = F8;
diff --git a/src/dynarec/rv64/dynarec_rv64_f30f.c b/src/dynarec/rv64/dynarec_rv64_f30f.c
index 41c3d62d..53e1daa9 100644
--- a/src/dynarec/rv64/dynarec_rv64_f30f.c
+++ b/src/dynarec/rv64/dynarec_rv64_f30f.c
@@ -126,6 +126,21 @@ uintptr_t dynarec64_F30F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
             GETEXSS(d0, 0);
             FSUBS(v0, v0, d0);
             break;
+        case 0x5D:
+            INST_NAME("MINSS Gx, Ex");
+            nextop = F8;
+            GETGXSS(d0);
+            GETEXSS(d1, 0);
+            FEQS(x2, d0, d0);
+            FEQS(x3, d1, d1);
+            AND(x2, x2, x3);
+            BEQ_MARK(x2, xZR);
+            FLTS(x2, d1, d0);
+            BEQ_MARK2(x2, xZR);
+            MARK;
+            FMVS(d0, d1);
+            MARK2;
+            break;
         case 0x5E:
             INST_NAME("DIVSS Gx, Ex");
             nextop = F8;
@@ -133,6 +148,21 @@ uintptr_t dynarec64_F30F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
             GETEXSS(d0, 0);
             FDIVS(v0, v0, d0);
             break;
+        case 0x5F:
+            INST_NAME("MAXSS Gx, Ex");
+            nextop = F8;
+            GETGXSS(d0);
+            GETEXSS(d1, 0);
+            FEQS(x2, d0, d0);
+            FEQS(x3, d1, d1);
+            AND(x2, x2, x3);
+            BEQ_MARK(x2, xZR);
+            FLTS(x2, d0, d1);
+            BEQ_MARK2(x2, xZR);
+            MARK;
+            FMVS(d0, d1);
+            MARK2;
+            break;
         case 0x7E:
             INST_NAME("MOVQ Gx, Ex");
             nextop = F8;