https://sourceware.org/cgit/valgrind/commit/?id=644d68e9501dd5679194dd5c8e0d3ce24764a1d8
commit 644d68e9501dd5679194dd5c8e0d3ce24764a1d8
Author: Florian Krohm <fl...@ei...>
Date: Wed Jul 9 20:15:46 2025 +0000
Fix operand / result types of Iop_DivU128[E], Iop_ModU128 and their signed counterparts
In libvex_ir.h these IROps are described to operate on Ity_I128 operands and produce a like typed result. This contradicts the specification in ir_defs.c
(function typeOfprimop) which claims Ity_V128 for operands and result.
Above IROps are used exclusively by ppc for the following opcodes:
Iop_DivU128 --> vdivuq Vector Divide Unsigned Quadword
Iop_DivS128 --> vdivsq Vector Divide Signed Quadword
Iop_DivU128E --> vdiveuq Vector Divide Extended Unsigned Quadword
Iop_DivS128E --> vdivesq Vector Divide Extended Signed Quadword
Iop_ModU128 --> vmoduq Vector Modulo Unsigned Quadword
Iop_ModS128 --> vmodsq Vector Modulo Signed Quadword
Reading the ISA document, it is clear, that those opcodes perform an
integer division / modulo operation. Technically, they work on vector
registers, presumably because vector registers are the only resource
wide enough to store a quadword. Perhaps that is where the confusion
comes from.
So Ity_I128 it is.
Diff:
---
VEX/priv/ir_defs.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/VEX/priv/ir_defs.c b/VEX/priv/ir_defs.c
index 9e7fbf920e..ba61758d74 100644
--- a/VEX/priv/ir_defs.c
+++ b/VEX/priv/ir_defs.c
@@ -3694,10 +3694,12 @@ void typeOfPrimop ( IROp op,
case Iop_MulI128by10E:
case Iop_MulI128by10ECarry:
case Iop_PwExtUSMulQAdd8x16:
- case Iop_DivU128: case Iop_DivS128:
+ BINARY(Ity_V128,Ity_V128, Ity_V128);
+
+ case Iop_DivU128: case Iop_DivS128:
case Iop_DivU128E: case Iop_DivS128E:
case Iop_ModU128: case Iop_ModS128:
- BINARY(Ity_V128,Ity_V128, Ity_V128);
+ BINARY(Ity_I128,Ity_I128, Ity_I128);
case Iop_2xMultU64Add128CarryOut:
case Iop_Perm8x16x2:
|