From a192ec97949f186183cb33c6ce60c5e8202fef2b Mon Sep 17 00:00:00 2001 From: Florian Krohm Date: Sat, 12 Jan 2013 22:02:07 +0000 Subject: [PATCH] Add 12 IROps for converting betwen DFP values and signed/unsigned integers. Patch by Maran Pakkirisamy (maranp@linux.vnet.ibm.com). Part of fixing BZ 307113. git-svn-id: svn://svn.valgrind.org/vex/trunk@2631 --- VEX/priv/ir_defs.c | 40 ++++++++++++++++++++++++++++++++++++++++ VEX/pub/libvex_ir.h | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+) diff --git a/VEX/priv/ir_defs.c b/VEX/priv/ir_defs.c index 010ced6b4d..8b9ea4e253 100644 --- a/VEX/priv/ir_defs.c +++ b/VEX/priv/ir_defs.c @@ -965,12 +965,24 @@ void ppIROp ( IROp op ) case Iop_DivD64: vex_printf("DivD64"); return; case Iop_ShlD64: vex_printf("ShlD64"); return; case Iop_ShrD64: vex_printf("ShrD64"); return; + case Iop_D64toI32S: vex_printf("D64toI32S"); return; + case Iop_D64toI32U: vex_printf("D64toI32U"); return; case Iop_D64toI64S: vex_printf("D64toI64S"); return; + case Iop_D64toI64U: vex_printf("D64toI64U"); return; + case Iop_I32StoD64: vex_printf("I32StoD64"); return; + case Iop_I32UtoD64: vex_printf("I32UtoD64"); return; case Iop_I64StoD64: vex_printf("I64StoD64"); return; + case Iop_I64UtoD64: vex_printf("I64UtoD64"); return; + case Iop_I32StoD128: vex_printf("I32StoD128"); return; + case Iop_I32UtoD128: vex_printf("I32UtoD128"); return; case Iop_I64StoD128: vex_printf("I64StoD128"); return; + case Iop_I64UtoD128: vex_printf("I64UtoD128"); return; case Iop_D64toD128: vex_printf("D64toD128"); return; case Iop_D128toD64: vex_printf("D128toD64"); return; + case Iop_D128toI32S: vex_printf("D128toI32S"); return; + case Iop_D128toI32U: vex_printf("D128toI32U"); return; case Iop_D128toI64S: vex_printf("D128toI64S"); return; + case Iop_D128toI64U: vex_printf("D128toI64U"); return; case Iop_AddD128: vex_printf("AddD128"); return; case Iop_SubD128: vex_printf("SubD128"); return; case Iop_MulD128: vex_printf("MulD128"); return; @@ -2779,9 +2791,16 @@ void typeOfPrimop ( IROp op, case Iop_RoundD128toInt: BINARY(ity_RMode,Ity_D128, Ity_D128); + case Iop_I32StoD128: + case Iop_I32UtoD128: + UNARY(Ity_I32, Ity_D128); + case Iop_I64StoD128: /* I64 bit pattern stored in Float register */ UNARY(Ity_D64, Ity_D128); + case Iop_I64UtoD128: + UNARY(Ity_I64, Ity_D128); + case Iop_DPBtoBCD: case Iop_BCDtoDPB: UNARY(Ity_I64, Ity_I64); @@ -2793,6 +2812,13 @@ void typeOfPrimop ( IROp op, case Iop_D128toI64S: BINARY(ity_RMode, Ity_D128, Ity_D64); + case Iop_D128toI64U: + BINARY(ity_RMode, Ity_D128, Ity_I64); + + case Iop_D128toI32S: + case Iop_D128toI32U: + BINARY(ity_RMode, Ity_D128, Ity_I32); + case Iop_D64HLtoD128: BINARY(Ity_D64, Ity_D64, Ity_D128); @@ -2803,12 +2829,26 @@ void typeOfPrimop ( IROp op, case Iop_D64toD32: BINARY(ity_RMode, Ity_D64, Ity_D32); + case Iop_D64toI32S: + case Iop_D64toI32U: + BINARY(ity_RMode, Ity_D64, Ity_I32); + case Iop_D64toI64S: BINARY(ity_RMode, Ity_D64, Ity_D64); + case Iop_D64toI64U: + BINARY(ity_RMode, Ity_D64, Ity_I64); + + case Iop_I32StoD64: + case Iop_I32UtoD64: + UNARY(Ity_I32, Ity_D64); + case Iop_I64StoD64: /* I64 bit pattern stored in Float register */ BINARY(ity_RMode, Ity_D64, Ity_D64); + case Iop_I64UtoD64: + BINARY(ity_RMode, Ity_I64, Ity_D64); + case Iop_CmpD64: case Iop_CmpExpD64: BINARY(Ity_D64,Ity_D64, Ity_I32); diff --git a/VEX/pub/libvex_ir.h b/VEX/pub/libvex_ir.h index fd12ee29a1..1a34ca311d 100644 --- a/VEX/pub/libvex_ir.h +++ b/VEX/pub/libvex_ir.h @@ -1039,24 +1039,60 @@ typedef /* D64 -> D128 */ Iop_D64toD128, + /* I32S -> D128 */ + Iop_I32StoD128, + + /* I32U -> D128 */ + Iop_I32UtoD128, + /* I64S -> D128 */ Iop_I64StoD128, + /* I64U -> D128 */ + Iop_I64UtoD128, + /* IRRoundingModeDFP(I32) x D64 -> D32 */ Iop_D64toD32, /* IRRoundingModeDFP(I32) x D128 -> D64 */ Iop_D128toD64, + /* I32S -> D64 */ + Iop_I32StoD64, + + /* I32U -> D64 */ + Iop_I32UtoD64, + /* IRRoundingModeDFP(I32) x I64 -> D64 */ Iop_I64StoD64, + /* IRRoundingModeDFP(I32) x I64 -> D64 */ + Iop_I64UtoD64, + + /* IRRoundingModeDFP(I32) x D64 -> I32 */ + Iop_D64toI32S, + + /* IRRoundingModeDFP(I32) x D64 -> I32 */ + Iop_D64toI32U, + /* IRRoundingModeDFP(I32) x D64 -> I64 */ Iop_D64toI64S, + /* IRRoundingModeDFP(I32) x D64 -> I64 */ + Iop_D64toI64U, + + /* IRRoundingModeDFP(I32) x D128 -> I32 */ + Iop_D128toI32S, + + /* IRRoundingModeDFP(I32) x D128 -> I32 */ + Iop_D128toI32U, + /* IRRoundingModeDFP(I32) x D128 -> I64 */ Iop_D128toI64S, + /* IRRoundingModeDFP(I32) x D128 -> I64 */ + Iop_D128toI64U, + /* ROUNDING INSTRUCTIONS * IRRoundingMode(I32) x D64 -> D64 * The D64 operand, if a finite number, is rounded to an integer value. -- 2.47.2