Browse Source

jit 0fc2/cmpps 660fc2/cmppd

Fabian 3 years ago
parent
commit
bc11d7089e
3 changed files with 35 additions and 6 deletions
  1. 2 2
      gen/x86_table.js
  2. 2 4
      src/rust/cpu/instructions_0f.rs
  3. 31 0
      src/rust/jit_instructions.rs

+ 2 - 2
gen/x86_table.js

@@ -813,8 +813,8 @@ const encodings = [
     { sse: 1, opcode: 0x660F7F, e: 1, custom: 1 },
     { sse: 1, opcode: 0xF30F7F, e: 1, custom: 1 },
 
-    { sse: 1, opcode: 0x0FC2, e: 1, imm8: 1 },
-    { sse: 1, opcode: 0x660FC2, e: 1, imm8: 1 },
+    { sse: 1, opcode: 0x0FC2, e: 1, imm8: 1, custom: 1 },
+    { sse: 1, opcode: 0x660FC2, e: 1, imm8: 1, custom: 1 },
     { sse: 1, opcode: 0xF20FC2, e: 1, imm8: 1 },
     { sse: 1, opcode: 0xF30FC2, e: 1, imm8: 1 },
 

+ 2 - 4
src/rust/cpu/instructions_0f.rs

@@ -5050,6 +5050,7 @@ pub unsafe fn instr_F30F5F_reg(r1: i32, r2: i32) { instr_F30F5F(read_xmm_f32(r1)
 pub unsafe fn instr_F30F5F_mem(addr: i32, r: i32) {
     instr_F30F5F(return_on_pagefault!(safe_read_f32(addr)), r);
 }
+#[no_mangle]
 pub unsafe fn instr_0FC2(source: reg128, r: i32, imm8: i32) {
     // cmpps xmm, xmm/m128
     let destination = read_xmm128s(r);
@@ -5065,12 +5066,11 @@ pub unsafe fn instr_0FC2(source: reg128, r: i32, imm8: i32) {
     }
     write_xmm_reg128(r, result);
 }
-#[no_mangle]
 pub unsafe fn instr_0FC2_reg(r1: i32, r2: i32, imm: i32) { instr_0FC2(read_xmm128s(r1), r2, imm); }
-#[no_mangle]
 pub unsafe fn instr_0FC2_mem(addr: i32, r: i32, imm: i32) {
     instr_0FC2(return_on_pagefault!(safe_read128s(addr)), r, imm);
 }
+#[no_mangle]
 pub unsafe fn instr_660FC2(source: reg128, r: i32, imm8: i32) {
     // cmppd xmm, xmm/m128
     let destination = read_xmm128s(r);
@@ -5084,11 +5084,9 @@ pub unsafe fn instr_660FC2(source: reg128, r: i32, imm8: i32) {
     };
     write_xmm_reg128(r, result);
 }
-#[no_mangle]
 pub unsafe fn instr_660FC2_reg(r1: i32, r2: i32, imm: i32) {
     instr_660FC2(read_xmm128s(r1), r2, imm);
 }
-#[no_mangle]
 pub unsafe fn instr_660FC2_mem(addr: i32, r: i32, imm: i32) {
     instr_660FC2(return_on_pagefault!(safe_read128s(addr)), r, imm);
 }

+ 31 - 0
src/rust/jit_instructions.rs

@@ -4589,6 +4589,37 @@ pub fn instr32_0FC7_1_mem_jit(ctx: &mut JitContext, modrm_byte: ModrmByte) {
 }
 pub fn instr32_0FC7_1_reg_jit(ctx: &mut JitContext, _r: u32) { codegen::gen_trigger_ud(ctx); }
 
+pub fn instr_0FC2_reg_jit(ctx: &mut JitContext, r1: u32, r2: u32, imm8: u32) {
+    let dest = global_pointers::get_reg_xmm_offset(r1);
+    ctx.builder.const_i32(dest as i32);
+    ctx.builder.const_i32(r2 as i32);
+    ctx.builder.const_i32(imm8 as i32);
+    ctx.builder.call_fn3("instr_0FC2");
+}
+pub fn instr_0FC2_mem_jit(ctx: &mut JitContext, modrm_byte: ModrmByte, r: u32, imm8: u32) {
+    let dest = global_pointers::sse_scratch_register as u32;
+    codegen::gen_modrm_resolve_safe_read128(ctx, modrm_byte, dest);
+    ctx.builder.const_i32(dest as i32);
+    ctx.builder.const_i32(r as i32);
+    ctx.builder.const_i32(imm8 as i32);
+    ctx.builder.call_fn3("instr_0FC2");
+}
+pub fn instr_660FC2_reg_jit(ctx: &mut JitContext, r1: u32, r2: u32, imm8: u32) {
+    let dest = global_pointers::get_reg_xmm_offset(r1);
+    ctx.builder.const_i32(dest as i32);
+    ctx.builder.const_i32(r2 as i32);
+    ctx.builder.const_i32(imm8 as i32);
+    ctx.builder.call_fn3("instr_660FC2");
+}
+pub fn instr_660FC2_mem_jit(ctx: &mut JitContext, modrm_byte: ModrmByte, r: u32, imm8: u32) {
+    let dest = global_pointers::sse_scratch_register as u32;
+    codegen::gen_modrm_resolve_safe_read128(ctx, modrm_byte, dest);
+    ctx.builder.const_i32(dest as i32);
+    ctx.builder.const_i32(r as i32);
+    ctx.builder.const_i32(imm8 as i32);
+    ctx.builder.call_fn3("instr_660FC2");
+}
+
 pub fn instr_0FC6_reg_jit(ctx: &mut JitContext, r1: u32, r2: u32, imm8: u32) {
     let dest = global_pointers::get_reg_xmm_offset(r1);
     ctx.builder.const_i32(dest as i32);