about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2024-09-17 15:35:15 +0800
committerGitHub <noreply@github.com>2024-09-17 09:35:15 +0200
commitf674953b875fd5423a3c5a02aaaa4f428f32cc41 (patch)
tree2f8a5263803293e03c9775a4b01cbe89a514dc9b /src
parentb8798c580f570c9b75bcaddc285d0a449e2c67a0 (diff)
downloadbox64-f674953b875fd5423a3c5a02aaaa4f428f32cc41.tar.gz
box64-f674953b875fd5423a3c5a02aaaa4f428f32cc41.zip
[RV64_DYNAREC] Added more 66 0F opcodes for vector (#1831)
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/rv64/dynarec_rv64_660f_vector.c90
1 files changed, 90 insertions, 0 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_660f_vector.c b/src/dynarec/rv64/dynarec_rv64_660f_vector.c
index 5618e0b2..27384f5e 100644
--- a/src/dynarec/rv64/dynarec_rv64_660f_vector.c
+++ b/src/dynarec/rv64/dynarec_rv64_660f_vector.c
@@ -381,10 +381,100 @@ uintptr_t dynarec64_660F_vector(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t i
                     SET_ELEMENT_WIDTH(x1, VECTOR_SEW64, 1);
                     VMV_V_V(q0, v0);
                     break;
+                case 0x39:
+                    INST_NAME("PMINSD Gx, Ex");
+                    nextop = F8;
+                    SET_ELEMENT_WIDTH(x1, VECTOR_SEW32, 1);
+                    GETGX_vector(q0, 1, VECTOR_SEW32);
+                    GETEX_vector(q1, 0, 0, VECTOR_SEW32);
+                    VMIN_VV(q0, q0, q1, VECTOR_UNMASKED);
+                    break;
+                case 0x3D:
+                    INST_NAME("PMAXSD Gx, Ex");
+                    nextop = F8;
+                    SET_ELEMENT_WIDTH(x1, VECTOR_SEW32, 1);
+                    GETGX_vector(q0, 1, VECTOR_SEW32);
+                    GETEX_vector(q1, 0, 0, VECTOR_SEW32);
+                    VMAX_VV(q0, q0, q1, VECTOR_UNMASKED);
+                    break;
                 default:
                     DEFAULT_VECTOR;
             }
             break;
+        case 0x3A: // these are some more SSSE3+ opcodes
+            opcode = F8;
+            switch (opcode) {
+                case 0x0E:
+                    INST_NAME("PBLENDW Gx, Ex, Ib");
+                    nextop = F8;
+                    SET_ELEMENT_WIDTH(x1, VECTOR_SEW16, 1);
+                    GETGX_vector(q0, 1, VECTOR_SEW16);
+                    GETEX_vector(q1, 0, 0, VECTOR_SEW16);
+                    u8 = F8;
+                    ADDI(x4, xZR, u8);
+                    VMV_V_X(VMASK, x4);
+                    VADD_VI(q0, 0, q1, VECTOR_MASKED);
+                    break;
+                case 0x0F:
+                    INST_NAME("PALIGNR Gx, Ex, Ib");
+                    nextop = F8;
+                    SET_ELEMENT_WIDTH(x1, VECTOR_SEW8, 1);
+                    GETGX_vector(q0, 1, VECTOR_SEW8);
+                    GETEX_vector(q1, 0, 0, VECTOR_SEW8);
+                    u8 = F8;
+                    if (u8 > 31) {
+                        VXOR_VV(q0, q0, q0, VECTOR_UNMASKED);
+                    } else if (u8 > 16) {
+                        v0 = fpu_get_scratch(dyn);
+                        VXOR_VV(q0, q0, q0, VECTOR_UNMASKED);
+                        VSLIDEDOWN_VI(v0, u8 - 16, q0, VECTOR_UNMASKED);
+                        VMV_V_V(q0, v0);
+                    } else if (u8 == 16) {
+                        // nop
+                    } else if (u8 > 0) {
+                        v0 = fpu_get_scratch(dyn);
+                        v1 = fpu_get_scratch(dyn);
+                        VXOR_VV(v0, v0, v0, VECTOR_UNMASKED);
+                        VXOR_VV(v1, v1, v1, VECTOR_UNMASKED);
+                        VSLIDEUP_VI(v0, 16 - u8, q0, VECTOR_UNMASKED);
+                        VSLIDEDOWN_VI(v1, u8, q1, VECTOR_UNMASKED);
+                        VOR_VV(q0, v0, v1, VECTOR_UNMASKED);
+                    } else {
+                        if (q0 != q1) VMV_V_V(q0, q1);
+                    }
+                    break;
+                default: DEFAULT_VECTOR;
+            }
+            break;
+        case 0x50:
+            INST_NAME("PMOVMSKD Gd, Ex");
+            nextop = F8;
+            SET_ELEMENT_WIDTH(x1, VECTOR_SEW64, 1);
+            GETGD;
+            GETEX_vector(q0, 0, 0, VECTOR_SEW64);
+            v0 = fpu_get_scratch(dyn);
+            ADDI(x4, xZR, 63);
+            VSRL_VX(v0, x4, q0, VECTOR_UNMASKED);
+            VMSNE_VX(VMASK, xZR, v0, VECTOR_UNMASKED);
+            VMV_X_S(gd, VMASK);
+            ANDI(gd, gd, 0b11);
+            break;
+        case 0x51:
+            INST_NAME("SQRTPD Gx, Ex");
+            nextop = F8;
+            SET_ELEMENT_WIDTH(x1, VECTOR_SEW64, 1);
+            GETGX_vector(q0, 1, VECTOR_SEW64);
+            GETEX_vector(q1, 0, 0, VECTOR_SEW64);
+            if (!box64_dynarec_fastnan) {
+                v0 = fpu_get_scratch(dyn);
+                VXOR_VV(v0, v0, v0, VECTOR_UNMASKED);
+                VMFLT_VV(VMASK, v0, q1, VECTOR_UNMASKED);
+            }
+            VFSQRT_V(q0, q1, VECTOR_UNMASKED);
+            if (!box64_dynarec_fastnan) {
+                VFSGNJN_VV(q0, q0, q0, VECTOR_MASKED);
+            }
+            break;
         case 0x61:
             INST_NAME("PUNPCKLWD Gx, Ex");
             nextop = F8;