]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Add a bunch of easy SSE insns.
authorJulian Seward <jseward@acm.org>
Fri, 3 Dec 2004 20:08:31 +0000 (20:08 +0000)
committerJulian Seward <jseward@acm.org>
Fri, 3 Dec 2004 20:08:31 +0000 (20:08 +0000)
git-svn-id: svn://svn.valgrind.org/vex/trunk@614

VEX/priv/guest-x86/toIR.c
VEX/priv/host-x86/hdefs.c
VEX/priv/host-x86/hdefs.h
VEX/priv/host-x86/isel.c
VEX/priv/ir/irdefs.c

index 203d3a8269b0c5478d8dcd6f3f4affacbf386e81..2baa1fa91bae7086a71fc2d5eaaec323f9afb713 100644 (file)
@@ -7351,6 +7351,47 @@ static DisResult disInstr ( /*IN*/  Bool    resteerOK,
       goto decode_success;
    }
 
+   /* 0F 5E = DIVPS -- div 32Fx4 from R/M to R */
+   if (insn[0] == 0x0F && insn[1] == 0x5E) {
+      vassert(sz == 4);
+      delta = dis_SSE_E_to_G( sorb, delta+2, "divps", Iop_Div32Fx4 );
+      goto decode_success;
+   }
+
+   /* F3 0F 5E = DIVSS -- div 32F0x4 from R/M to R */
+   if (insn[0] == 0xF3 && insn[1] == 0x0F && insn[2] == 0x5E) {
+      vassert(sz == 4);
+      delta = dis_SSE_E_to_G( sorb, delta+3, "divss", Iop_Div32F0x4 );
+      goto decode_success;
+   }
+
+   /* 0F 5F = MAXPS -- max 32Fx4 from R/M to R */
+   if (insn[0] == 0x0F && insn[1] == 0x5F) {
+      vassert(sz == 4);
+      delta = dis_SSE_E_to_G( sorb, delta+2, "maxps", Iop_Max32Fx4 );
+      goto decode_success;
+   }
+
+   /* F3 0F 5F = MAXSS -- max 32F0x4 from R/M to R */
+   if (insn[0] == 0xF3 && insn[1] == 0x0F && insn[2] == 0x5F) {
+      vassert(sz == 4);
+      delta = dis_SSE_E_to_G( sorb, delta+3, "maxss", Iop_Max32F0x4 );
+      goto decode_success;
+   }
+
+   /* 0F 5D = MINPS -- min 32Fx4 from R/M to R */
+   if (insn[0] == 0x0F && insn[1] == 0x5D) {
+      vassert(sz == 4);
+      delta = dis_SSE_E_to_G( sorb, delta+2, "minps", Iop_Min32Fx4 );
+      goto decode_success;
+   }
+
+   /* F3 0F 5D = MINSS -- min 32F0x4 from R/M to R */
+   if (insn[0] == 0xF3 && insn[1] == 0x0F && insn[2] == 0x5D) {
+      vassert(sz == 4);
+      delta = dis_SSE_E_to_G( sorb, delta+3, "minss", Iop_Min32F0x4 );
+      goto decode_success;
+   }
 
 //-- 
 //--    /* FXSAVE/FXRSTOR m32 -- load/store the FPU/MMX/SSE state. */
index 21fecf094270624e1b0e5dd088dd4eef38e981f5..fef64e5fc9624f35a59beaa8780aae5edffa9b6f 100644 (file)
@@ -508,6 +508,9 @@ HChar* showX86SseOp ( X86SseOp op ) {
       case Xsse_ADDF:   return "add";
       case Xsse_SUBF:   return "sub";
       case Xsse_MULF:   return "mul";
+      case Xsse_DIVF:   return "div";
+      case Xsse_MAXF:   return "max";
+      case Xsse_MINF:   return "min";
       case Xsse_CMPEQF: return "cmpFeq";
       case Xsse_CMPLTF: return "cmpFlt";
       case Xsse_CMPLEF: return "cmpFle";
@@ -2363,6 +2366,9 @@ Int emit_X86Instr ( UChar* buf, Int nbuf, X86Instr* i )
       *p++ = 0x0F;
       switch (i->Xin.Sse32Fx4.op) {
          case Xsse_ADDF:   *p++ = 0x58; break;
+         case Xsse_DIVF:   *p++ = 0x5E; break;
+         case Xsse_MAXF:   *p++ = 0x5F; break;
+         case Xsse_MINF:   *p++ = 0x5D; break;
          case Xsse_CMPEQF: *p++ = 0xC2; xtra = 0x100; break;
          case Xsse_CMPLTF: *p++ = 0xC2; xtra = 0x101; break;
          case Xsse_CMPLEF: *p++ = 0xC2; xtra = 0x102; break;
@@ -2380,6 +2386,9 @@ Int emit_X86Instr ( UChar* buf, Int nbuf, X86Instr* i )
       *p++ = 0x0F;
       switch (i->Xin.Sse32FLo.op) {
          case Xsse_ADDF:   *p++ = 0x58; break;
+         case Xsse_DIVF:   *p++ = 0x5E; break;
+         case Xsse_MAXF:   *p++ = 0x5F; break;
+         case Xsse_MINF:   *p++ = 0x5D; break;
          case Xsse_CMPEQF: *p++ = 0xC2; xtra = 0x100; break;
          case Xsse_CMPLTF: *p++ = 0xC2; xtra = 0x101; break;
          case Xsse_CMPLEF: *p++ = 0xC2; xtra = 0x102; break;
index ef6f6e0dd2e92105b1c6dd672fe44c3e24f8fed2..c1ba6c2fa438d93d1374eb9331759be9b2ce69de 100644 (file)
@@ -308,7 +308,8 @@ typedef
    enum {
       Xsse_INVALID,
       Xsse_MOV, Xsse_AND, Xsse_OR, Xsse_XOR, Xsse_ANDN,
-      Xsse_ADDF, Xsse_SUBF, Xsse_MULF,
+      Xsse_ADDF, Xsse_SUBF, Xsse_MULF, Xsse_DIVF,
+      Xsse_MAXF, Xsse_MINF,
       Xsse_CMPEQF, Xsse_CMPLTF, Xsse_CMPLEF, Xsse_CMPUNF
    }
    X86SseOp;
index fdb2ed371f1886ae8a16450f4cbd7c2f98dc75ca..d05d00a8765d2684816392615e752aae5b9be454 100644 (file)
@@ -2490,6 +2490,9 @@ static HReg iselVecExpr_wrk ( ISelEnv* env, IRExpr* e )
       case Iop_CmpLT32Fx4: op = Xsse_CMPLTF; goto do_32Fx4;
       case Iop_CmpLE32Fx4: op = Xsse_CMPLEF; goto do_32Fx4;
       case Iop_Add32Fx4:   op = Xsse_ADDF;   goto do_32Fx4;
+      case Iop_Div32Fx4:   op = Xsse_DIVF;   goto do_32Fx4;
+      case Iop_Max32Fx4:   op = Xsse_MAXF;   goto do_32Fx4;
+      case Iop_Min32Fx4:   op = Xsse_MINF;   goto do_32Fx4;
       do_32Fx4:
       {
          HReg argL = iselVecExpr(env, e->Iex.Binop.arg1);
@@ -2504,6 +2507,9 @@ static HReg iselVecExpr_wrk ( ISelEnv* env, IRExpr* e )
       case Iop_CmpLT32F0x4: op = Xsse_CMPLTF; goto do_32F0x4;
       case Iop_CmpLE32F0x4: op = Xsse_CMPLEF; goto do_32F0x4;
       case Iop_Add32F0x4:   op = Xsse_ADDF;   goto do_32F0x4;
+      case Iop_Div32F0x4:   op = Xsse_DIVF;   goto do_32F0x4;
+      case Iop_Max32F0x4:   op = Xsse_MAXF;   goto do_32F0x4;
+      case Iop_Min32F0x4:   op = Xsse_MINF;   goto do_32F0x4;
       do_32F0x4: {
          HReg argL = iselVecExpr(env, e->Iex.Binop.arg1);
          HReg argR = iselVecExpr(env, e->Iex.Binop.arg2);
index 6fee77c75100973a9830ec097ad4f1dc449ca6b0..2939053cc8e7626b49ce1370f744d059f627bcf1 100644 (file)
@@ -227,6 +227,15 @@ void ppIROp ( IROp op )
       case Iop_Add32Fx4:  vex_printf("Add32Fx4"); return;
       case Iop_Add32F0x4: vex_printf("Add32F0x4"); return;
 
+      case Iop_Div32Fx4:  vex_printf("Div32Fx4"); return;
+      case Iop_Div32F0x4: vex_printf("Div32F0x4"); return;
+
+      case Iop_Max32Fx4:  vex_printf("Max32Fx4"); return;
+      case Iop_Max32F0x4: vex_printf("Max32F0x4"); return;
+
+      case Iop_Min32Fx4:  vex_printf("Min32Fx4"); return;
+      case Iop_Min32F0x4: vex_printf("Min32F0x4"); return;
+
       case Iop_CmpEQ32Fx4: vex_printf("CmpEQ32Fx4"); return;
       case Iop_CmpLT32Fx4: vex_printf("CmpLT32Fx4"); return;
       case Iop_CmpLE32Fx4: vex_printf("CmpLE32Fx4"); return;
@@ -1101,6 +1110,9 @@ void typeOfPrimop ( IROp op, IRType* t_dst, IRType* t_arg1, IRType* t_arg2 )
       case Iop_CmpEQ32F0x4: case Iop_CmpLT32F0x4:
       case Iop_CmpLE32F0x4: case Iop_CmpUN32F0x4:
       case Iop_Add32Fx4: case Iop_Add32F0x4:
+      case Iop_Div32Fx4: case Iop_Div32F0x4:
+      case Iop_Max32Fx4: case Iop_Max32F0x4:
+      case Iop_Min32Fx4: case Iop_Min32F0x4:
       case Iop_And128: case Iop_Or128: case Iop_Xor128:
          BINARY(Ity_V128, Ity_V128,Ity_V128);