Z23-Form
-* shadd RT,RA,RB,sm (Rc=0)
-* shadd. RT,RA,RB,sm (Rc=1)
+* sadd RT,RA,RB,SH (Rc=0)
+* sadd. RT,RA,RB,SH (Rc=1)
Pseudo-code:
n <- (RB)
- m <- ((0b0 || sm) + 1)
+ m <- ((0b0 || SH) + 1)
RT <- (n[m:XLEN-1] || [0]*m) + (RA)
Special Registers Altered:
Z23-Form
-* shaddw RT,RA,RB,sm (Rc=0)
-* shaddw. RT,RA,RB,sm (Rc=1)
+* saddw RT,RA,RB,SH (Rc=0)
+* saddw. RT,RA,RB,SH (Rc=1)
Pseudo-code:
n <- ([0]*(XLEN/2)) || (RB)[XLEN/2:XLEN-1]
if (RB)[XLEN/2] = 1 then
n[0:XLEN/2-1] <- [1]*(XLEN/2)
- m <- ((0b0 || sm) + 1)
+ m <- ((0b0 || SH) + 1)
RT <- (n[m:XLEN-1] || [0]*m) + (RA)
Special Registers Altered:
Z23-Form
-* shadduw RT,RA,RB,sm (Rc=0)
-* shadduw. RT,RA,RB,sm (Rc=1)
+* sadduw RT,RA,RB,SH (Rc=0)
+* sadduw. RT,RA,RB,SH (Rc=1)
Pseudo-code:
n <- ([0]*(XLEN/2)) || (RB)[XLEN/2:XLEN-1]
- m <- ((0b0 || sm) + 1)
+ m <- ((0b0 || SH) + 1)
RT <- (n[m:XLEN-1] || [0]*m) + (RA)
Special Registers Altered:
30/6=fmrgew,NORMAL,,1P,EXTRA3,NO,d:FRT,s:FRA,s:FRB,0,FRA,FRB,0,FRT,0,0,0
rlwnm,NORMAL,,1P,EXTRA3,NO,d:RA;d:CR0,s:RB,s:RS,0,0,RB,RS,RA,0,CR0,0
minmax,NORMAL,,1P,EXTRA3,NO,d:RT;d:CR0,s:RA,s:RB,0,RA_OR_ZERO,RB,0,RT,0,CR0,0
-shadd,NORMAL,,1P,EXTRA3,NO,d:RT;d:CR0,s:RA,s:RB,0,RA,RB,0,RT,0,CR0,0
-shaddw,NORMAL,,1P,EXTRA3,NO,d:RT;d:CR0,s:RA,s:RB,0,RA,RB,0,RT,0,CR0,0
-shadduw,NORMAL,,1P,EXTRA3,NO,d:RT;d:CR0,s:RA,s:RB,0,RA,RB,0,RT,0,CR0,0
+sadd,NORMAL,,1P,EXTRA3,NO,d:RT;d:CR0,s:RA,s:RB,0,RA,RB,0,RT,0,CR0,0
+saddw,NORMAL,,1P,EXTRA3,NO,d:RT;d:CR0,s:RA,s:RB,0,RA,RB,0,RT,0,CR0,0
+sadduw,NORMAL,,1P,EXTRA3,NO,d:RT;d:CR0,s:RA,s:RB,0,RA,RB,0,RT,0,CR0,0
cprop,NORMAL,,1P,EXTRA3,NO,d:RT;d:CR0,s:RA,s:RB,0,RA,RB,0,RT,0,CR0,0
absds,NORMAL,,1P,EXTRA3,NO,d:RT;d:CR0,s:RA,s:RB,0,RA,RB,0,RT,0,CR0,0
absdu,NORMAL,,1P,EXTRA3,NO,d:RT;d:CR0,s:RA,s:RB,0,RA,RB,0,RT,0,CR0,0
100--011001,VL,OP_SVSHAPE,NONE,NONE,NONE,NONE,NONE,NONE,0,0,ZERO,0,NONE,0,0,0,0,0,0,NONE,0,0,svshape2,SVM2,,1,unofficial until submitted and approved/renumbered by the opf isa wg
# A/V bitmanip
1101001110-,ALU,OP_AVGADD,RA,RB,NONE,RT,NONE,CR0,0,0,ZERO,0,NONE,0,0,0,0,0,0,RC_ONLY,0,0,avgadd,X,,1,unofficial until submitted and approved/renumbered by the opf isa wg
---01101110-,ALU,OP_SHADD,RA,RB,NONE,RT,NONE,CR0,0,0,ZERO,0,NONE,0,0,0,0,0,0,RC_ONLY,0,0,shadd,Z23,,1,unofficial until submitted and approved/renumbered by the opf isa wg
---10101110-,ALU,OP_SHADD,RA,RB,NONE,RT,NONE,CR0,0,0,ZERO,0,NONE,0,0,0,0,0,0,RC_ONLY,0,0,shaddw,Z23,,1,unofficial until submitted and approved/renumbered by the opf isa wg
---11101110-,ALU,OP_SHADD,RA,RB,NONE,RT,NONE,CR0,0,0,ZERO,0,NONE,0,0,0,0,0,0,RC_ONLY,0,0,shadduw,Z23,,1,unofficial until submitted and approved/renumbered by the opf isa wg
+--01101110-,ALU,OP_SHADD,RA,RB,NONE,RT,NONE,CR0,0,0,ZERO,0,NONE,0,0,0,0,0,0,RC_ONLY,0,0,sadd,Z23,,1,unofficial until submitted and approved/renumbered by the opf isa wg
+--10101110-,ALU,OP_SHADD,RA,RB,NONE,RT,NONE,CR0,0,0,ZERO,0,NONE,0,0,0,0,0,0,RC_ONLY,0,0,saddw,Z23,,1,unofficial until submitted and approved/renumbered by the opf isa wg
+--11101110-,ALU,OP_SHADD,RA,RB,NONE,RT,NONE,CR0,0,0,ZERO,0,NONE,0,0,0,0,0,0,RC_ONLY,0,0,sadduw,Z23,,1,unofficial until submitted and approved/renumbered by the opf isa wg
1011110110-,ALU,OP_ABSDIFF,RA,RB,NONE,RT,NONE,CR0,0,0,ZERO,0,NONE,0,0,0,0,0,0,RC_ONLY,0,0,absdu,X,,1,unofficial until submitted and approved/renumbered by the opf isa wg
1001110110-,ALU,OP_ABSDIFF,RA,RB,NONE,RT,NONE,CR0,0,0,ZERO,0,NONE,0,0,0,0,0,0,RC_ONLY,0,0,absds,X,,1,unofficial until submitted and approved/renumbered by the opf isa wg
1111110110-,ALU,OP_ABSADD,RA,RB,RT,RT,NONE,CR0,0,0,ZERO,0,NONE,0,0,0,0,0,0,RC_ONLY,0,0,absdacu,X,,1,unofficial until submitted and approved/renumbered by the opf isa wg
'absdu', 'absds', 'absdacs', 'absdacu', 'avgadd',
'fmvis', 'fishmv', 'pcdec', "maddedu", "divmod2du",
"dsld", "dsrd", "maddedus",
- "shadd", "shaddw", "shadduw",
+ "sadd", "saddw", "sadduw",
"fcvttg", "fcvttgo", "fcvttgs", "fcvttgso",
"fmvtg", "fmvtgs",
"fcvtfg", "fcvtfgs",
--- /dev/null
+""" bigint tests
+"""
+
+import unittest
+
+from openpower.test.bigint.shadd_cases import ShiftAddCases
+from openpower.test.runner import TestRunnerBase
+
+# writing the test_caller invocation this way makes it work with pytest
+
+
+class TestShAdd(TestRunnerBase):
+ def __init__(self, test):
+ assert test == 'test'
+ super().__init__(ShiftAddCases().test_data)
+
+ def test(self):
+ # dummy function to make unittest try to test this class
+ pass
+
+
+if __name__ == "__main__":
+ unittest.main()
"svshape2", # https://libre-soc.org/openpower/sv/remap/discussion TODO
"svstep", # https://libre-soc.org/openpower/sv/setvl
"sim_cfg",
- "shadd", "shaddw", "shadduw",
+ "sadd", "saddw", "sadduw",
"slbia", "sld", "slw", "srad", "sradi",
"sraw", "srawi", "srd", "srw",
"stb", "stbcix", "stbcx", "stbu", "stbux", "stbx",
]
self._do_tst(expected)
- def test_31_shadd_shaddw_shadduw(self):
- expected = [
- "shadd 31,0,0,0",
- "shadd 0,31,0,0",
- "shadd 0,0,31,0",
- "shadd 0,0,0,3",
- "shadd. 31,0,0,0",
- "shadd. 0,31,0,0",
- "shadd. 0,0,31,0",
- "shadd. 0,0,0,3",
- "shaddw 31,0,0,0",
- "shaddw 0,31,0,0",
- "shaddw 0,0,31,0",
- "shaddw 0,0,0,3",
- "shaddw. 31,0,0,0",
- "shaddw. 0,31,0,0",
- "shaddw. 0,0,31,0",
- "shaddw. 0,0,0,3",
- "shadduw 31,0,0,0",
- "shadduw 0,31,0,0",
- "shadduw 0,0,31,0",
- "shadduw 0,0,0,3",
- "shadduw. 31,0,0,0",
- "shadduw. 0,31,0,0",
- "shadduw. 0,0,31,0",
- "shadduw. 0,0,0,3",
+ def test_31_sadd_saddw_sadduw(self):
+ expected = [
+ "sadd 31,0,0,0",
+ "sadd 0,31,0,0",
+ "sadd 0,0,31,0",
+ "sadd 0,0,0,3",
+ "sadd. 31,0,0,0",
+ "sadd. 0,31,0,0",
+ "sadd. 0,0,31,0",
+ "sadd. 0,0,0,3",
+ "saddw 31,0,0,0",
+ "saddw 0,31,0,0",
+ "saddw 0,0,31,0",
+ "saddw 0,0,0,3",
+ "saddw. 31,0,0,0",
+ "saddw. 0,31,0,0",
+ "saddw. 0,0,31,0",
+ "saddw. 0,0,0,3",
+ "sadduw 31,0,0,0",
+ "sadduw 0,31,0,0",
+ "sadduw 0,0,31,0",
+ "sadduw 0,0,0,3",
+ "sadduw. 31,0,0,0",
+ "sadduw. 0,31,0,0",
+ "sadduw. 0,0,31,0",
+ "sadduw. 0,0,0,3",
]
self._do_tst(expected)
e.intregs[6] = v % 2 ** 64
self.add_case(prog, gprs, expected=e)
- def case_shadd(self):
- for sm in range(4):
- with self.subTest(sm=sm):
- insn = ("shadd 3,4,5,%d" % sm)
- prog = Program(list(SVP64Asm([insn])), False)
- gprs = [0] * 32
- gprs[3] = 0x01234567890abcde
- RA = gprs[4] = 0xf00dcafedeadbeef
- RB = gprs[5] = 0xabadbabedefec8ed
- RT = ((((RB << (sm+1)) & _MASK64) + RA) & _MASK64)
- e = ExpectedState(pc=4, int_regs=gprs)
- e.intregs[3] = RT
- self.add_case(prog, gprs, expected=e)
-
- def case_shaddw(self):
- for sm in range(4):
- with self.subTest(sm=sm):
- insn = ("shaddw 3,4,5,%d" % sm)
- prog = Program(list(SVP64Asm([insn])), False)
- gprs = [0] * 32
- gprs[3] = 0x01234567890abcde
- RA = gprs[4] = 0xf00dcafedeadbeef
- RB = gprs[5] = 0xabadbabedefec8ed
- RB_i32 = RB & _MASK32
- if RB_i32 >> 31:
- RB_i32 -= 1 << 32
- RT = ((((RB_i32 << (sm+1)) & _MASK64) + RA) & _MASK64)
- e = ExpectedState(pc=4, int_regs=gprs)
- e.intregs[3] = RT
- self.add_case(prog, gprs, expected=e)
-
- def case_shadduw(self):
- for sm in range(4):
- with self.subTest(sm=sm):
- insn = ("shadduw 3,4,5,%d" % sm)
- prog = Program(list(SVP64Asm([insn])), False)
- gprs = [0] * 32
- gprs[3] = 0x01234567890abcde
- RA = gprs[4] = 0xf00dcafedeadbeef
- RB = gprs[5] = 0xabadbabedefec8ed
- RT = (((((RB & _MASK32) << (sm+1)) & _MASK64) + RA) & _MASK64)
- e = ExpectedState(pc=4, int_regs=gprs)
- e.intregs[3] = RT
- self.add_case(prog, gprs, expected=e)
class SVP64BigIntCases(TestAccumulatorBase):
--- /dev/null
+from openpower.test.common import TestAccumulatorBase, skip_case
+from openpower.sv.trans.svp64 import SVP64Asm
+from openpower.test.state import ExpectedState
+from openpower.simulator.program import Program
+from openpower.decoder.isa.caller import SVP64State
+from openpower.decoder.helpers import exts
+
+
+_MASK32 = ((2 ** 32) - 1)
+_MASK64 = ((2 ** 64) - 1)
+
+
+class ShiftAddCases(TestAccumulatorBase):
+
+ def case_sadd(self):
+ for SH in range(4):
+ with self.subTest(SH=SH):
+ insn = ("sadd 3,4,5,%d" % SH)
+ prog = Program(list(SVP64Asm([insn])), False)
+ gprs = [0] * 32
+ gprs[3] = 0x01234567890abcde
+ RA = gprs[4] = 0xf00dcafedeadbeef
+ RB = gprs[5] = 0xabadbabedefec8ed
+ RT = ((((RB << (SH+1)) & _MASK64) + RA) & _MASK64)
+ e = ExpectedState(pc=4, int_regs=gprs)
+ e.intregs[3] = RT
+ self.add_case(prog, gprs, expected=e)
+
+ def case_saddw(self):
+ for SH in range(4):
+ with self.subTest(SH=SH):
+ insn = ("saddw 3,4,5,%d" % SH)
+ prog = Program(list(SVP64Asm([insn])), False)
+ gprs = [0] * 32
+ gprs[3] = 0x01234567890abcde
+ RA = gprs[4] = 0xf00dcafedeadbeef
+ RB = gprs[5] = 0xabadbabedefec8ed
+ RB_i32 = RB & _MASK32
+ if RB_i32 >> 31:
+ RB_i32 -= 1 << 32
+ RT = ((((RB_i32 << (SH+1)) & _MASK64) + RA) & _MASK64)
+ e = ExpectedState(pc=4, int_regs=gprs)
+ e.intregs[3] = RT
+ self.add_case(prog, gprs, expected=e)
+
+ def case_sadduw(self):
+ for SH in range(4):
+ with self.subTest(SH=SH):
+ insn = ("sadduw 3,4,5,%d" % SH)
+ prog = Program(list(SVP64Asm([insn])), False)
+ gprs = [0] * 32
+ gprs[3] = 0x01234567890abcde
+ RA = gprs[4] = 0xf00dcafedeadbeef
+ RB = gprs[5] = 0xabadbabedefec8ed
+ RT = (((((RB & _MASK32) << (SH+1)) & _MASK64) + RA) & _MASK64)
+ e = ExpectedState(pc=4, int_regs=gprs)
+ e.intregs[3] = RT
+ self.add_case(prog, gprs, expected=e)
+