add FPADD, FPSUB, FPMUL, FPDIV quick hacked functions
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Fri, 14 May 2021 17:49:10 +0000 (18:49 +0100)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Fri, 14 May 2021 17:49:10 +0000 (18:49 +0100)
src/openpower/decoder/helpers.py

index aa2b58e1b9416058bc3f75d234d91cde70042336..de5eb92815bc2c258d6a62e3fff6bd7ec9535f84 100644 (file)
@@ -1,4 +1,5 @@
 import unittest
+import struct
 from openpower.decoder.selectable_int import (SelectableInt, onebit,
                                               selectconcat)
 from nmutil.divmod import trunc_divs, trunc_rems
@@ -215,6 +216,37 @@ def SINGLE(FRS):
 
     return WORD
 
+def fp64toselectable(frt):
+    """convert FP number to 64 bit SelectableInt
+    """
+    b = struct.pack(">d", frt)
+    val = int.from_bytes(b, byteorder='big', signed=False)
+    return SelectableInt(val, 64)
+
+
+def FPADD(FRA, FRB):
+    result = float(FRA) + float(FRB)
+    cvt = fp64toselectable(result)
+    print ("FPADD", FRA, FRB, result, cvt)
+
+
+def FPSUB(FRA, FRB):
+    result = float(FRA) - float(FRB)
+    cvt = fp64toselectable(result)
+    print ("FPSUB", FRA, FRB, result, cvt)
+
+
+def FPMUL(FRA, FRB):
+    result = float(FRA) * float(FRB)
+    cvt = fp64toselectable(result)
+    print ("FPMUL", FRA, FRB, result, cvt)
+
+
+def FPDIV(FRA, FRB):
+    result = float(FRA) / float(FRB)
+    cvt = fp64toselectable(result)
+    print ("FPMUL", FRA, FRB, result, cvt)
+
 
 # For these tests I tried to find power instructions that would let me
 # isolate each of these helper operations. So for instance, when I was
@@ -283,6 +315,12 @@ class HelperTests(unittest.TestCase):
         # extswsli reg, 3, 0
         self.assertHex(EXTS64(value_c), 0xffffffff80000000)
 
+    def test_FPADD(self):
+        value_a = SelectableInt(0x4014000000000000, 64)  # 5.0
+        value_b = SelectableInt(0x403B4CCCCCCCCCCD, 64)  # 27.3
+        result = FPADD(value_a, value_b)
+        self.assertHex(0x4040266666666666, result)
+
     def assertHex(self, a, b):
         a_val = a
         if isinstance(a, SelectableInt):