From 559c791f4d71185a5ba39cd6cde7991dc0bcd9d8 Mon Sep 17 00:00:00 2001
Message-Id: <559c791f4d71185a5ba39cd6cde7991dc0bcd9d8.1320837388.git.trast@student.ethz.ch>
From: Thomas Rast <trast@student.ethz.ch>
Date: Tue, 8 Nov 2011 21:51:05 +0100
Subject: [PATCH] Proper rounding on amd64 (memcheck part)

memcheck needs to learn that some floating point instructions grew a
rounding mode argument.  (It ignores it.)
---
 memcheck/mc_translate.c |   57 ++++++++++++++++++++++++++++-------------------
 1 files changed, 34 insertions(+), 23 deletions(-)

diff --git a/memcheck/mc_translate.c b/memcheck/mc_translate.c
index fcd79ca..be27fb2 100644
--- a/memcheck/mc_translate.c
+++ b/memcheck/mc_translate.c
@@ -2357,6 +2357,40 @@ IROp vanillaNarrowingOpOfShape ( IROp qnarrowOp )
       case Iop_SetElem32x2:
          complainIfUndefined(mce, atom2);
          return assignNew('V', mce, Ity_I64, triop(op, vatom1, atom2, vatom3));
+
+      case Iop_Sub64Fx2:
+      case Iop_Mul64Fx2:
+      case Iop_Div64Fx2:
+      case Iop_Add64Fx2:
+         return binary64Fx2(mce, vatom2, vatom3);      
+
+      case Iop_Sub64F0x2:
+      case Iop_Mul64F0x2:
+      case Iop_Div64F0x2:
+      case Iop_Add64F0x2:
+         return binary64F0x2(mce, vatom2, vatom3);      
+
+      case Iop_Sub32Fx4:
+      case Iop_Mul32Fx4:
+      case Iop_Div32Fx4:
+      case Iop_Add32Fx4:
+      case Iop_Recps32Fx4:
+      case Iop_Rsqrts32Fx4:
+         return binary32Fx4(mce, vatom2, vatom3);      
+
+      case Iop_Sub32Fx2:
+      case Iop_Mul32Fx2:
+      case Iop_Add32Fx2:
+      case Iop_Recps32Fx2:
+      case Iop_Rsqrts32Fx2:
+         return binary32Fx2(mce, vatom2, vatom3);      
+
+      case Iop_Sub32F0x4:
+      case Iop_Mul32F0x4:
+      case Iop_Div32F0x4:
+      case Iop_Add32F0x4:
+         return binary32F0x4(mce, vatom2, vatom3);      
+
       default:
          ppIROp(op);
          VG_(tool_panic)("memcheck:expr2vbits_Triop");
@@ -2789,68 +2823,45 @@ IROp vanillaNarrowingOpOfShape ( IROp qnarrowOp )
       case Iop_QNarrowBin16Sto8Ux16:
          return vectorNarrowBinV128(mce, op, vatom1, vatom2);
 
-      case Iop_Sub64Fx2:
-      case Iop_Mul64Fx2:
       case Iop_Min64Fx2:
       case Iop_Max64Fx2:
-      case Iop_Div64Fx2:
       case Iop_CmpLT64Fx2:
       case Iop_CmpLE64Fx2:
       case Iop_CmpEQ64Fx2:
       case Iop_CmpUN64Fx2:
-      case Iop_Add64Fx2:
          return binary64Fx2(mce, vatom1, vatom2);      
 
-      case Iop_Sub64F0x2:
-      case Iop_Mul64F0x2:
       case Iop_Min64F0x2:
       case Iop_Max64F0x2:
-      case Iop_Div64F0x2:
       case Iop_CmpLT64F0x2:
       case Iop_CmpLE64F0x2:
       case Iop_CmpEQ64F0x2:
       case Iop_CmpUN64F0x2:
-      case Iop_Add64F0x2:
          return binary64F0x2(mce, vatom1, vatom2);      
 
-      case Iop_Sub32Fx4:
-      case Iop_Mul32Fx4:
       case Iop_Min32Fx4:
       case Iop_Max32Fx4:
-      case Iop_Div32Fx4:
       case Iop_CmpLT32Fx4:
       case Iop_CmpLE32Fx4:
       case Iop_CmpEQ32Fx4:
       case Iop_CmpUN32Fx4:
       case Iop_CmpGT32Fx4:
       case Iop_CmpGE32Fx4:
-      case Iop_Add32Fx4:
-      case Iop_Recps32Fx4:
-      case Iop_Rsqrts32Fx4:
          return binary32Fx4(mce, vatom1, vatom2);      
 
-      case Iop_Sub32Fx2:
-      case Iop_Mul32Fx2:
       case Iop_Min32Fx2:
       case Iop_Max32Fx2:
       case Iop_CmpEQ32Fx2:
       case Iop_CmpGT32Fx2:
       case Iop_CmpGE32Fx2:
-      case Iop_Add32Fx2:
-      case Iop_Recps32Fx2:
-      case Iop_Rsqrts32Fx2:
          return binary32Fx2(mce, vatom1, vatom2);      
 
-      case Iop_Sub32F0x4:
-      case Iop_Mul32F0x4:
       case Iop_Min32F0x4:
       case Iop_Max32F0x4:
-      case Iop_Div32F0x4:
       case Iop_CmpLT32F0x4:
       case Iop_CmpLE32F0x4:
       case Iop_CmpEQ32F0x4:
       case Iop_CmpUN32F0x4:
-      case Iop_Add32F0x4:
          return binary32F0x4(mce, vatom1, vatom2);      
 
       case Iop_QShlN8Sx16:
-- 
1.7.8.rc0.302.g61121

