about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2023-05-05 14:15:02 +0800
committerGitHub <noreply@github.com>2023-05-05 08:15:02 +0200
commitad9fc59d19c13f19ca88bef3861ce99f752a085e (patch)
tree78e0c10b0c7de7eee29231fa8c200b7915ed1613 /src
parent0e14d42dcfc308fe011066c01394d72cbc8ee009 (diff)
downloadbox64-ad9fc59d19c13f19ca88bef3861ce99f752a085e.tar.gz
box64-ad9fc59d19c13f19ca88bef3861ce99f752a085e.zip
[RV64_DYNAREC] Added some AES opcodes (#761)
* Added 66 0F 3A DF AESKEYGENASSIST opcode

* Added 66 0F 38 DC AESENC opcode

* Added 66 0F 38 DD AESENCLAST opcode

* Added 66 0F 38 DE AESDEC opcode

* Added 66 0F 38 DF AESDECLAST opcode
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/rv64/dynarec_rv64_660f.c67
1 files changed, 67 insertions, 0 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_660f.c b/src/dynarec/rv64/dynarec_rv64_660f.c
index 742a1209..2e79019b 100644
--- a/src/dynarec/rv64/dynarec_rv64_660f.c
+++ b/src/dynarec/rv64/dynarec_rv64_660f.c
@@ -336,6 +336,51 @@ uintptr_t dynarec64_660F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
                         SH(x4, gback, i*2);
                     }
                     break;
+                case 0xDC:
+                    INST_NAME("AESENC Gx, Ex");  // AES-NI
+                    nextop = F8;
+                    GETG;
+                    sse_forget_reg(dyn, ninst, gd);
+                    MOV32w(x1, gd);
+                    CALL(native_aese, -1);
+                    GETGX(x1);
+                    GETEX(x2, 0);
+                    SSE_LOOP_Q(x3, x4, XOR(x3, x3, x4));
+                    break;
+                case 0xDD:
+                    INST_NAME("AESENCLAST Gx, Ex");  // AES-NI
+                    nextop = F8;
+                    GETG;
+                    sse_forget_reg(dyn, ninst, gd);
+                    MOV32w(x1, gd);
+                    CALL(native_aeselast, -1);
+                    GETGX(x1);
+                    GETEX(x2, 0);
+                    SSE_LOOP_Q(x3, x4, XOR(x3, x3, x4));
+                    break;
+                case 0xDE:
+                    INST_NAME("AESDEC Gx, Ex");  // AES-NI
+                    nextop = F8;
+                    GETG;
+                    sse_forget_reg(dyn, ninst, gd);
+                    MOV32w(x1, gd);
+                    CALL(native_aesd, -1);
+                    GETGX(x1);
+                    GETEX(x2, 0);
+                    SSE_LOOP_Q(x3, x4, XOR(x3, x3, x4));
+                    break;
+
+                case 0xDF:
+                    INST_NAME("AESDECLAST Gx, Ex");  // AES-NI
+                    nextop = F8;
+                    GETG;
+                    sse_forget_reg(dyn, ninst, gd);
+                    MOV32w(x1, gd);
+                    CALL(native_aesdlast, -1);
+                    GETGX(x1);
+                    GETEX(x2, 0);
+                    SSE_LOOP_Q(x3, x4, XOR(x3, x3, x4));
+                    break;
                 default:
                     DEFAULT;
             }
@@ -516,6 +561,28 @@ uintptr_t dynarec64_660F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
                     MOV32w(x4, u8);
                     CALL(native_pclmul, -1);
                     break;
+                case 0xDF:
+                    INST_NAME("AESKEYGENASSIST Gx, Ex, Ib");  // AES-NI
+                    nextop = F8;
+                    GETG;
+                    sse_forget_reg(dyn, ninst, gd);
+                    MOV32w(x1, gd); // gx
+                    if(MODREG) {
+                        ed = (nextop&7)+(rex.b<<3); 
+                        sse_forget_reg(dyn, ninst, ed);
+                        MOV32w(x2, ed);
+                        MOV32w(x3, 0);  //p = NULL
+                    } else {
+                        MOV32w(x2, 0);
+                        addr = geted(dyn, addr, ninst, nextop, &ed, x3, x2, &fixedaddress, rex, NULL, 0, 1);
+                        if(ed!=x3) {
+                            MV(x3, ed);
+                        }
+                    }
+                    u8 = F8;
+                    MOV32w(x4, u8);
+                    CALL(native_aeskeygenassist, -1);
+                    break;
             default:
                     DEFAULT;
             }