-from openpower.sv.trans.svp64 import SVP64Asm
+from openpower.insndb.asm import SVP64Asm
import random
from openpower.test.common import TestAccumulatorBase
from openpower.endian import bigendian
class AVTestCase(TestAccumulatorBase):
def case_0_maxs(self):
- lst = ["maxs 3, 1, 2"]
+ lst = ["minmax 3, 1, 2, 3"]
lst = list(SVP64Asm(lst, bigendian))
initial_regs = [0] * 32
self.add_case(Program(lst, bigendian), initial_regs, expected=e)
def case_1_maxs(self):
- lst = ["maxs 3, 1, 2"]
+ lst = ["minmax 3, 1, 2, 3"]
lst = list(SVP64Asm(lst, bigendian))
initial_regs = [0] * 32
self.add_case(Program(lst, bigendian), initial_regs, expected=e)
def case_2_maxs_(self):
- lst = [f"maxs. 3, 1, 2"]
+ lst = [f"minmax. 3, 1, 2, 3"]
lst = list(SVP64Asm(lst, bigendian))
initial_regs = [0] * 32
self.add_case(Program(lst, bigendian), initial_regs, expected=e)
def case_3_maxs_(self):
- lst = [f"maxs. 3, 1, 2"]
+ lst = [f"minmax. 3, 1, 2, 3"]
lst = list(SVP64Asm(lst, bigendian))
initial_regs = [0] * 32
e.intregs[1] = 0xc523e996a8ff6215
e.intregs[2] = 0
e.intregs[3] = 0
- e.crregs[0] = 0x2 # RT is zero
+ e.crregs[0] = 0x8 # RB greater (arithmeticslly)
self.add_case(Program(lst, bigendian), initial_regs, expected=e)
def case_4_maxs_(self):
- lst = [f"maxs. 3, 1, 2"]
+ lst = [f"minmax. 3, 1, 2, 3"]
lst = list(SVP64Asm(lst, bigendian))
initial_regs = [0] * 32
def case_5_maxs_(self):
"""max negative number compared against +ve number
"""
- lst = [f"maxs. 3, 1, 2"]
+ lst = [f"minmax. 3, 1, 2, 3"]
lst = list(SVP64Asm(lst, bigendian))
initial_regs = [0] * 32
e.crregs[0] = 0x4 # RT is +ve
self.add_case(Program(lst, bigendian), initial_regs, expected=e)
+ def case_6_maxs_(self):
+ lst = [f"minmax. 3, 1, 2, 3"]
+ lst = list(SVP64Asm(lst, bigendian))
+
+ initial_regs = [0] * 32
+ initial_regs[1] = 0x8000_0000_0000_0000
+ initial_regs[2] = 0x8000_0000_0000_0000
+ e = ExpectedState(pc=4)
+ e.intregs[1] = 0x8000_0000_0000_0000
+ e.intregs[2] = 0x8000_0000_0000_0000
+ e.intregs[3] = 0x8000_0000_0000_0000
+ e.crregs[0] = 0x2 # values are equal
+ self.add_case(Program(lst, bigendian), initial_regs, expected=e)
+
def case_0_mins(self):
- lst = ["mins 3, 1, 2"]
+ lst = ["minmax 3, 1, 2, 2"]
lst = list(SVP64Asm(lst, bigendian))
initial_regs = [0] * 32
self.add_case(Program(lst, bigendian), initial_regs, expected=e)
def case_2_mins_(self):
- lst = [f"mins. 3, 1, 2"]
+ lst = [f"minmax. 3, 1, 2, 2"]
lst = list(SVP64Asm(lst, bigendian))
initial_regs = [0] * 32
def case_5_mins_(self):
"""min negative number compared against +ve number
"""
- lst = [f"mins. 3, 1, 2"]
+ lst = [f"minmax. 3, 1, 2, 2"]
lst = list(SVP64Asm(lst, bigendian))
initial_regs = [0] * 32
e.intregs[1] = 1
e.intregs[2] = 0x8000_0000_0000_0000
e.intregs[3] = 0x8000_0000_0000_0000
- e.crregs[0] = 0x8 # RT is -ve
+ e.crregs[0] = 0x4 # r1 >s r2
self.add_case(Program(lst, bigendian), initial_regs, expected=e)
def case_0_maxu(self):
- lst = ["maxu 3, 1, 2"]
+ lst = ["minmax 3, 1, 2, 1"]
lst = list(SVP64Asm(lst, bigendian))
initial_regs = [0] * 32
def case_5_minu_(self):
"""min +ve numbers
"""
- lst = [f"minu. 3, 1, 2"]
+ lst = [f"minmax. 3, 1, 2, 0"]
lst = list(SVP64Asm(lst, bigendian))
initial_regs = [0] * 32
e.intregs[1] = 1
e.intregs[2] = 0x8000_0000_0000_0000
e.intregs[3] = min(e.intregs[1], e.intregs[2])
- e.crregs[0] = 0x4
+ e.crregs[0] = 0x8 # r1 <u r2
self.add_case(Program(lst, bigendian), initial_regs, expected=e)
def case_0_avgadd(self):
NOTE: the numbering above for bm[] is in *MSB0* order.
"""
- lst = ["bmask 3, 1, 2, 3, 0", # OR : RA | (RA-1)
- "bmask 4, 1, 2, 11, 0", # AND : RA & (RA-1)
- "bmask 5, 1, 2, 19, 0", # XOR : RA ^ (RA-1)
+ lst = ["bmask 3, 1, 2, 3, 0", # OR : RA | (RA-1) 00 01 1
+ "bmask 4, 1, 2, 11, 0", # AND : RA & (RA-1) 01 01 1
+ "bmask 5, 1, 2, 19, 0", # XOR : RA ^ (RA-1) 10 01 1
"bmask 6, 1, 2, 27, 0", # 0 : 0
]
lst = list(SVP64Asm(lst, bigendian))
last_pc = len(lst)*4
reg_a = 0b10010100
reg_b = 0b11000011
- reg_t0 = 0b10010111
- reg_t1 = 0b10010000
- reg_t2 = 0b00000111
+ reg_t0 = 0b11000011
+ reg_t1 = 0b00000000
+ reg_t2 = 0b11000011
reg_t3 = 0b00000000
initial_regs = [0] * 32
e.intregs[5] = reg_t2
e.intregs[6] = reg_t3
self.add_case(Program(lst, bigendian), initial_regs, expected=e)
+
+ def case_2_bmask(self):
+ """
+ SBF = 0b01010 # set before first
+ SOF = 0b01001 # set only first
+ SIF = 0b10000 # set including first 10011 also works no idea why yet
+ """
+ #SIF
+ lst = ["bmask 3, 1, 2, 16, 0",]
+ # "bmask 6, 4, 5, 16, 0",
+ # "bmask 9, 7, 8, 16, 0",
+ # "bmask 12, 10, 11, 16, 0",
+ #]
+ lst = list(SVP64Asm(lst, bigendian))
+ last_pc = len(lst)*4
+
+ initial_regs = [0] * 32
+ e = ExpectedState(pc=last_pc)
+
+ m = 0b11000011
+ v3 = 0b10010100 # vmsif.m v2, v3
+ v2 = 0b11000011 # v2
+ initial_regs[1] = v3
+ initial_regs[2] = m
+ e.intregs[1] = v3
+ e.intregs[2] = m
+ e.intregs[3] = v2
+
+ self.add_case(Program(lst, bigendian), initial_regs, expected=e)
+
+ def case_3_bmask(self):
+ """
+ SBF = 0b01010 # set before first
+ SOF = 0b01001 # set only first
+ SIF = 0b10000 # set including first 10011 also works no idea why yet
+ """
+ #SOF
+ lst = ["bmask 3, 1, 2, 9, 0",]
+ lst = list(SVP64Asm(lst, bigendian))
+ last_pc = len(lst)*4
+
+ initial_regs = [0] * 32
+ e = ExpectedState(pc=last_pc)
+
+ m = 0b11000011
+ v3 = 0b11010100 # vmsof.m v2, v3
+ v2 = 0b01000000 # v2
+ initial_regs[1] = v3
+ initial_regs[2] = m
+ e.intregs[1] = v3
+ e.intregs[2] = m
+ e.intregs[3] = v2
+ self.add_case(Program(lst, bigendian), initial_regs, expected=e)