[v4,2/5] sim: cgen: add MUL2OFSI and MUL1OFSI macros (needed for OR1K l.mul[u])
Commit Message
From: Peter Gavin <pgavin@gmail.com>
sim/common/ChangeLog:
2012-03-14 Peter Gavin <pgavin@gmail.com>
* cgen-ops.h (MUL2OFSI): New macro, 1's complement.
(MUL1OFSI): New macro, 2's complement.
---
sim/common/cgen-ops.h | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
Comments
> --- a/sim/common/cgen-ops.h
> +++ b/sim/common/cgen-ops.h
> @@ -631,6 +631,22 @@ SUBOFQI (QI a, QI b, BI c)
> return res;
> }
>
> +SEMOPS_INLINE BI
> +MUL2OFSI (SI a, SI b)
> +{
> + DI tmp = MULDI (EXTSIDI(a), EXTSIDI(b));
> + BI res = tmp < -0x80000000LL || tmp > 0x7fffffffLL;
> + return res;
> +}
> +
> +SEMOPS_INLINE BI
> +MUL1OFSI (USI a, USI b)
> +{
> + UDI tmp = MULDI (ZEXTSIDI(a), ZEXTSIDI(b));
> + BI res = (tmp > 0xFFFFFFFFULL);
> + return res;
> +}
What are these functions expected to return? They seem to return 1 when
the result would overflow 32-bits, but just to be sure.
Simon
On Tue, Sep 5, 2017 at 5:32 AM, Simon Marchi <simon.marchi@polymtl.ca> wrote:
>> --- a/sim/common/cgen-ops.h
>> +++ b/sim/common/cgen-ops.h
>> @@ -631,6 +631,22 @@ SUBOFQI (QI a, QI b, BI c)
>> return res;
>> }
>>
>> +SEMOPS_INLINE BI
>> +MUL2OFSI (SI a, SI b)
>> +{
>> + DI tmp = MULDI (EXTSIDI(a), EXTSIDI(b));
>> + BI res = tmp < -0x80000000LL || tmp > 0x7fffffffLL;
>> + return res;
>> +}
>> +
>> +SEMOPS_INLINE BI
>> +MUL1OFSI (USI a, USI b)
>> +{
>> + UDI tmp = MULDI (ZEXTSIDI(a), ZEXTSIDI(b));
>> + BI res = (tmp > 0xFFFFFFFFULL);
>> + return res;
>> +}
>
>
> What are these functions expected to return? They seem to return 1 when the
> result would overflow 32-bits, but just to be sure.
They do just return 1 when there is overflow.
They are used in:
cpu/or1korbis.cpu
To calculate the overflow and carry flags.
; 2's complement overflow
(set sys-sr-ov (mul-o2flag WI rA (ext WI simm16)))
; 1's complement overflow
(set sys-sr-cy (mul-o1flag UWI rA (ext UWI simm16)))
Thanks for pointing this out though the ChangeLog says "New macro, 1's
complement." I think it should mention "New macro, 1's complement
_overflow_."
@@ -631,6 +631,22 @@ SUBOFQI (QI a, QI b, BI c)
return res;
}
+SEMOPS_INLINE BI
+MUL2OFSI (SI a, SI b)
+{
+ DI tmp = MULDI (EXTSIDI(a), EXTSIDI(b));
+ BI res = tmp < -0x80000000LL || tmp > 0x7fffffffLL;
+ return res;
+}
+
+SEMOPS_INLINE BI
+MUL1OFSI (USI a, USI b)
+{
+ UDI tmp = MULDI (ZEXTSIDI(a), ZEXTSIDI(b));
+ BI res = (tmp > 0xFFFFFFFFULL);
+ return res;
+}
+
#else
SI ADDCSI (SI, SI, BI);
@@ -651,6 +667,8 @@ UBI ADDOFQI (QI, QI, BI);
QI SUBCQI (QI, QI, BI);
UBI SUBCFQI (QI, QI, BI);
UBI SUBOFQI (QI, QI, BI);
+BI MUL1OFSI (SI a, SI b);
+BI MUL2OFSI (SI a, SI b);
#endif