correct write-after-write hazard test (expected values)
[openpower-isa.git] / src / openpower / test / general / overlap_hazards.py
1 import random
2 from openpower.test.common import TestAccumulatorBase
3 from openpower.endian import bigendian
4 from openpower.simulator.program import Program
5 from openpower.decoder.selectable_int import SelectableInt
6 from openpower.decoder.power_enums import XER_bits
7 from openpower.decoder.isa.caller import special_sprs
8 from openpower.test.state import ExpectedState
9 import unittest
10
11
12 class HazardTestCase(TestAccumulatorBase):
13
14 def case_div_add_overlap(self):
15 lst = ["divd 3, 1, 2",
16 "add 5, 3, 4"]
17 initial_regs = [0] * 32
18 initial_regs[1] = 6
19 initial_regs[2] = 2
20 initial_regs[4] = 4
21 e = ExpectedState(pc=8)
22 e.intregs[1] = 6
23 e.intregs[2] = 2
24 e.intregs[3] = 3 # 6 divided by 2 == 3
25 e.intregs[4] = 4
26 e.intregs[5] = 7 # 3 plus 4 == 7
27 self.add_case(Program(lst, bigendian), initial_regs, expected=e)
28
29 def case_div_add_overlap2(self):
30 lst = ["divd 3, 1, 2",
31 "mullw 5, 7, 6", # 2*4=8, overwritten later by add
32 "divd 4, 5, 6",
33 "add 5, 3, 4"]
34 initial_regs = [0] * 32
35 initial_regs[1] = 6
36 initial_regs[2] = 2
37 initial_regs[6] = 2
38 initial_regs[7] = 4
39 e = ExpectedState(pc=16)
40 e.intregs[1] = 6
41 e.intregs[2] = 2
42 e.intregs[3] = 3 # 6 divided by 2 == 3
43 e.intregs[4] = 4 # 8 divided by 2 == 4
44 e.intregs[5] = 7 # 3 plus 4 == 7
45 e.intregs[6] = 2
46 e.intregs[7] = 4
47 self.add_case(Program(lst, bigendian), initial_regs, expected=e)
48
49 def case_div_add_overlap_write_after_write_1(self):
50 lst = ["divd 3, 1, 2",
51 "add 3, 7, 6", # 2+4=6, overwrites divd
52 "add 5, 3, 2" # 3+6=8
53 ]
54 initial_regs = [0] * 32
55 initial_regs[1] = 6
56 initial_regs[2] = 2
57 initial_regs[6] = 2
58 initial_regs[7] = 4
59 e = ExpectedState(pc=12)
60 e.intregs[1] = 6
61 e.intregs[2] = 2
62 e.intregs[3] = 6 # 2 plus 4 == 6, overwriting div
63 e.intregs[5] = 8 # 3 plus 6 == 8
64 e.intregs[6] = 2
65 e.intregs[7] = 4
66 self.add_case(Program(lst, bigendian), initial_regs, expected=e)
67
68 def cse_div_add_overlap_3(self):
69 lst = ["divd 3, 1, 2",
70 "mullw 5, 7, 6", # 2*4=6, overwritten later by add
71 "addi 9, 5, 2", # add 2 to 6 = 8
72 "divd 4, 9, 6",
73 "add 5, 3, 4"]
74 initial_regs = [0] * 32
75 initial_regs[1] = 6
76 initial_regs[2] = 2
77 initial_regs[6] = 2
78 initial_regs[7] = 4
79 e = ExpectedState(pc=20)
80 e.intregs[1] = 6
81 e.intregs[2] = 2
82 e.intregs[3] = 3 # 6 divided by 2 == 3
83 e.intregs[4] = 4 # 8 divided by 2 == 4
84 e.intregs[5] = 7 # 3 plus 4 == 7
85 e.intregs[6] = 2
86 e.intregs[7] = 4
87 self.add_case(Program(lst, bigendian), initial_regs, expected=e)