Browse Source

jit more mmx instructions (0F6*)

Fabian 3 years ago
parent
commit
835396386e
2 changed files with 98 additions and 12 deletions
  1. 12 12
      gen/x86_table.js
  2. 86 0
      src/rust/jit_instructions.rs

+ 12 - 12
gen/x86_table.js

@@ -720,30 +720,30 @@ const encodings = [
     { sse: 1, opcode: 0xF30F5F, e: 1, },
 
     { sse: 1, opcode: 0x660F60, e: 1, custom: 1 },
-    { sse: 1, opcode: 0x0F60, e: 1 },
+    { sse: 1, opcode: 0x0F60, e: 1, custom: 1 },
     { sse: 1, opcode: 0x660F61, e: 1, custom: 1 },
-    { sse: 1, opcode: 0x0F61, e: 1 },
+    { sse: 1, opcode: 0x0F61, e: 1, custom: 1 },
     { sse: 1, opcode: 0x660F62, e: 1, custom: 1 },
-    { sse: 1, opcode: 0x0F62, e: 1 },
+    { sse: 1, opcode: 0x0F62, e: 1, custom: 1 },
     { sse: 1, opcode: 0x660F63, e: 1, custom: 1 },
-    { sse: 1, opcode: 0x0F63, e: 1 },
+    { sse: 1, opcode: 0x0F63, e: 1, custom: 1 },
     { sse: 1, opcode: 0x660F64, e: 1, custom: 1 },
-    { sse: 1, opcode: 0x0F64, e: 1 },
+    { sse: 1, opcode: 0x0F64, e: 1, custom: 1 },
     { sse: 1, opcode: 0x660F65, e: 1, custom: 1 },
-    { sse: 1, opcode: 0x0F65, e: 1 },
+    { sse: 1, opcode: 0x0F65, e: 1, custom: 1 },
     { sse: 1, opcode: 0x660F66, e: 1, custom: 1 },
-    { sse: 1, opcode: 0x0F66, e: 1 },
+    { sse: 1, opcode: 0x0F66, e: 1, custom: 1 },
     { sse: 1, opcode: 0x660F67, e: 1, custom: 1 },
-    { sse: 1, opcode: 0x0F67, e: 1 },
+    { sse: 1, opcode: 0x0F67, e: 1, custom: 1 },
 
     { sse: 1, opcode: 0x660F68, e: 1, custom: 1 },
-    { sse: 1, opcode: 0x0F68, e: 1 },
+    { sse: 1, opcode: 0x0F68, e: 1, custom: 1 },
     { sse: 1, opcode: 0x660F69, e: 1, custom: 1 },
-    { sse: 1, opcode: 0x0F69, e: 1 },
+    { sse: 1, opcode: 0x0F69, e: 1, custom: 1 },
     { sse: 1, opcode: 0x660F6A, e: 1, custom: 1 },
-    { sse: 1, opcode: 0x0F6A, e: 1 },
+    { sse: 1, opcode: 0x0F6A, e: 1, custom: 1 },
     { sse: 1, opcode: 0x660F6B, e: 1, custom: 1 },
-    { sse: 1, opcode: 0x0F6B, e: 1 },
+    { sse: 1, opcode: 0x0F6B, e: 1, custom: 1 },
     { sse: 1, opcode: 0x660F6C, e: 1, custom: 1 },
     { sse: 1, opcode: 0x0F6C, e: 1, block_boundary: 1, }, // ud
     { sse: 1, opcode: 0x660F6D, e: 1, custom: 1 },

+ 86 - 0
src/rust/jit_instructions.rs

@@ -134,6 +134,18 @@ pub fn sse_mov_xmm_xmm(ctx: &mut JitContext, r1: u32, r2: u32) {
     ctx.builder.store_aligned_i64(0);
 }
 
+pub fn mmx_read64_mm_mem32(ctx: &mut JitContext, name: &str, modrm_byte: ModrmByte, r: u32) {
+    codegen::gen_modrm_resolve_safe_read32(ctx, modrm_byte);
+    ctx.builder.const_i32(r as i32);
+    ctx.builder.call_fn2(name)
+}
+pub fn mmx_read64_mm_mm32(ctx: &mut JitContext, name: &str, r1: u32, r2: u32) {
+    ctx.builder
+        .const_i32(global_pointers::get_reg_mmx_offset(r1) as i32);
+    ctx.builder.load_aligned_i32(0);
+    ctx.builder.const_i32(r2 as i32);
+    ctx.builder.call_fn2(name);
+}
 pub fn mmx_read64_mm_mem(ctx: &mut JitContext, name: &str, modrm_byte: ModrmByte, r: u32) {
     codegen::gen_modrm_resolve_safe_read64(ctx, modrm_byte);
     ctx.builder.const_i32(r as i32);
@@ -4435,6 +4447,80 @@ pub fn instr_660F2B_reg_jit(ctx: &mut JitContext, _r1: u32, _r2: u32) {
     codegen::gen_trigger_ud(ctx);
 }
 
+pub fn instr_0F60_mem_jit(ctx: &mut JitContext, modrm_byte: ModrmByte, r: u32) {
+    mmx_read64_mm_mem32(ctx, "instr_0F60", modrm_byte, r);
+}
+pub fn instr_0F60_reg_jit(ctx: &mut JitContext, r1: u32, r2: u32) {
+    mmx_read64_mm_mm32(ctx, "instr_0F60", r1, r2);
+}
+pub fn instr_0F61_mem_jit(ctx: &mut JitContext, modrm_byte: ModrmByte, r: u32) {
+    mmx_read64_mm_mem32(ctx, "instr_0F61", modrm_byte, r);
+}
+pub fn instr_0F61_reg_jit(ctx: &mut JitContext, r1: u32, r2: u32) {
+    mmx_read64_mm_mm32(ctx, "instr_0F61", r1, r2);
+}
+pub fn instr_0F62_mem_jit(ctx: &mut JitContext, modrm_byte: ModrmByte, r: u32) {
+    mmx_read64_mm_mem32(ctx, "instr_0F62", modrm_byte, r);
+}
+pub fn instr_0F62_reg_jit(ctx: &mut JitContext, r1: u32, r2: u32) {
+    mmx_read64_mm_mm32(ctx, "instr_0F62", r1, r2);
+}
+
+pub fn instr_0F63_mem_jit(ctx: &mut JitContext, modrm_byte: ModrmByte, r: u32) {
+    mmx_read64_mm_mem(ctx, "instr_0F63", modrm_byte, r);
+}
+pub fn instr_0F63_reg_jit(ctx: &mut JitContext, r1: u32, r2: u32) {
+    mmx_read64_mm_mm(ctx, "instr_0F63", r1, r2);
+}
+pub fn instr_0F64_mem_jit(ctx: &mut JitContext, modrm_byte: ModrmByte, r: u32) {
+    mmx_read64_mm_mem(ctx, "instr_0F64", modrm_byte, r);
+}
+pub fn instr_0F64_reg_jit(ctx: &mut JitContext, r1: u32, r2: u32) {
+    mmx_read64_mm_mm(ctx, "instr_0F64", r1, r2);
+}
+pub fn instr_0F65_mem_jit(ctx: &mut JitContext, modrm_byte: ModrmByte, r: u32) {
+    mmx_read64_mm_mem(ctx, "instr_0F65", modrm_byte, r);
+}
+pub fn instr_0F65_reg_jit(ctx: &mut JitContext, r1: u32, r2: u32) {
+    mmx_read64_mm_mm(ctx, "instr_0F65", r1, r2);
+}
+pub fn instr_0F66_mem_jit(ctx: &mut JitContext, modrm_byte: ModrmByte, r: u32) {
+    mmx_read64_mm_mem(ctx, "instr_0F66", modrm_byte, r);
+}
+pub fn instr_0F66_reg_jit(ctx: &mut JitContext, r1: u32, r2: u32) {
+    mmx_read64_mm_mm(ctx, "instr_0F66", r1, r2);
+}
+pub fn instr_0F67_mem_jit(ctx: &mut JitContext, modrm_byte: ModrmByte, r: u32) {
+    mmx_read64_mm_mem(ctx, "instr_0F67", modrm_byte, r);
+}
+pub fn instr_0F67_reg_jit(ctx: &mut JitContext, r1: u32, r2: u32) {
+    mmx_read64_mm_mm(ctx, "instr_0F67", r1, r2);
+}
+pub fn instr_0F68_mem_jit(ctx: &mut JitContext, modrm_byte: ModrmByte, r: u32) {
+    mmx_read64_mm_mem(ctx, "instr_0F68", modrm_byte, r);
+}
+pub fn instr_0F68_reg_jit(ctx: &mut JitContext, r1: u32, r2: u32) {
+    mmx_read64_mm_mm(ctx, "instr_0F68", r1, r2);
+}
+pub fn instr_0F69_mem_jit(ctx: &mut JitContext, modrm_byte: ModrmByte, r: u32) {
+    mmx_read64_mm_mem(ctx, "instr_0F69", modrm_byte, r);
+}
+pub fn instr_0F69_reg_jit(ctx: &mut JitContext, r1: u32, r2: u32) {
+    mmx_read64_mm_mm(ctx, "instr_0F69", r1, r2);
+}
+pub fn instr_0F6A_mem_jit(ctx: &mut JitContext, modrm_byte: ModrmByte, r: u32) {
+    mmx_read64_mm_mem(ctx, "instr_0F6A", modrm_byte, r);
+}
+pub fn instr_0F6A_reg_jit(ctx: &mut JitContext, r1: u32, r2: u32) {
+    mmx_read64_mm_mm(ctx, "instr_0F6A", r1, r2);
+}
+pub fn instr_0F6B_mem_jit(ctx: &mut JitContext, modrm_byte: ModrmByte, r: u32) {
+    mmx_read64_mm_mem(ctx, "instr_0F6B", modrm_byte, r);
+}
+pub fn instr_0F6B_reg_jit(ctx: &mut JitContext, r1: u32, r2: u32) {
+    mmx_read64_mm_mm(ctx, "instr_0F6B", r1, r2);
+}
+
 pub fn instr_660F60_mem_jit(ctx: &mut JitContext, modrm_byte: ModrmByte, r: u32) {
     // Note: Only requires 64-bit read, but is allowed to do 128-bit read
     sse_read128_xmm_mem(ctx, "instr_660F60", modrm_byte, r);