@@ -21,6 +21,18 @@ def definition_dir() -> Path:
21
21
return kdist .get ('riscv-semantics.func-test' )
22
22
23
23
24
+ def _test_function (definition_dir : path , app : Pattern , res : Pattern ) -> None :
25
+ # Given
26
+ init = config (app )
27
+ expected = config (res )
28
+
29
+ # When
30
+ actual = llvm_interpret (definition_dir , init )
31
+
32
+ # Then
33
+ assert actual == expected
34
+
35
+
24
36
def config (kitem : Pattern ) -> App :
25
37
return generated_top (
26
38
(
@@ -59,20 +71,13 @@ def reg(x: int) -> App:
59
71
ids = [test_id for test_id , * _ in DISASSEMBLE_TEST_DATA ],
60
72
)
61
73
def test_disassemble (definition_dir : Path , test_id : str , code : bytes , sort : SortApp , pattern : Pattern ) -> None :
62
- # Given
63
- n = int .from_bytes (code , byteorder = 'big' )
64
- init = config (inj (SortApp ('SortInstruction' ), SORT_K_ITEM , disassemble (n )))
65
- expected = config (inj (sort , SORT_K_ITEM , pattern ))
66
-
67
- # When
68
- actual = llvm_interpret (definition_dir , init )
69
-
70
- # Then
71
- assert actual == expected
72
-
74
+ def disassemble (n : int ) -> App :
75
+ return App ('Lbldisassemble' , (), (int_dv (n ),))
73
76
74
- def disassemble (n : int ) -> App :
75
- return App ('Lbldisassemble' , (), (int_dv (n ),))
77
+ n = int .from_bytes (code , byteorder = 'big' )
78
+ app = inj (SortApp ('SortInstruction' ), SORT_K_ITEM , disassemble (n ))
79
+ res = inj (sort , SORT_K_ITEM , pattern )
80
+ _test_function (definition_dir = definition_dir , app = app , res = res )
76
81
77
82
78
83
def is_32bit (x : int ) -> bool :
@@ -104,19 +109,62 @@ def signed(x: int) -> int:
104
109
assert all (is_32bit (op1 ) and is_32bit (op2 ) for op1 , op2 in MUL_TEST_DATA )
105
110
106
111
112
+ def _test_mul (
113
+ definition_dir : Path ,
114
+ symbol : str ,
115
+ op1 : int ,
116
+ op2 : int ,
117
+ res : int ,
118
+ ) -> None :
119
+ def w (x : int ) -> App :
120
+ return App ('LblW' , (), (int_dv (x ),))
121
+
122
+ _test_function (
123
+ definition_dir = definition_dir ,
124
+ app = inj (SortApp ('SortWord' ), SORT_K_ITEM , App (symbol , (), (w (op1 ), w (op2 )))),
125
+ res = inj (SortApp ('SortWord' ), SORT_K_ITEM , w (res ))
126
+ )
127
+
128
+
107
129
@pytest .mark .parametrize ('op1,op2' , MUL_TEST_DATA , ids = count ())
108
130
def test_mul (definition_dir : Path , op1 : int , op2 : int ) -> None :
109
- # Given
110
- init = config (inj (SortApp ('SortWord' ), SORT_K_ITEM , App ('LblmulWord' , (), (w (op1 ), w (op2 )))))
111
- res = chop (op1 * op2 )
112
- expected = config (inj (SortApp ('SortWord' ), SORT_K_ITEM , w (res )))
131
+ _test_mul (
132
+ definition_dir = definition_dir ,
133
+ symbol = 'LblmulWord' ,
134
+ op1 = op1 ,
135
+ op2 = op2 ,
136
+ res = chop (op1 * op2 ),
137
+ )
113
138
114
- # When
115
- actual = llvm_interpret (definition_dir , init )
116
139
117
- # Then
118
- assert actual == expected
140
+ @pytest .mark .parametrize ('op1,op2' , MUL_TEST_DATA , ids = count ())
141
+ def test_mulh (definition_dir : Path , op1 : int , op2 : int ) -> None :
142
+ _test_mul (
143
+ definition_dir = definition_dir ,
144
+ symbol = 'LblmulhWord' ,
145
+ op1 = op1 ,
146
+ op2 = op2 ,
147
+ res = chop ((signed (op1 ) * signed (op2 )) >> 32 ),
148
+ )
119
149
120
150
121
- def w (x : int ) -> App :
122
- return App ('LblW' , (), (int_dv (x ),))
151
+ @pytest .mark .parametrize ('op1,op2' , MUL_TEST_DATA , ids = count ())
152
+ def test_mulhu (definition_dir : Path , op1 : int , op2 : int ) -> None :
153
+ _test_mul (
154
+ definition_dir = definition_dir ,
155
+ symbol = 'LblmulhuWord' ,
156
+ op1 = op1 ,
157
+ op2 = op2 ,
158
+ res = chop ((op1 * op2 ) >> 32 ),
159
+ )
160
+
161
+
162
+ @pytest .mark .parametrize ('op1,op2' , MUL_TEST_DATA , ids = count ())
163
+ def test_mulhsu (definition_dir : Path , op1 : int , op2 : int ) -> None :
164
+ _test_mul (
165
+ definition_dir = definition_dir ,
166
+ symbol = 'LblmulhsuWord' ,
167
+ op1 = op1 ,
168
+ op2 = op2 ,
169
+ res = chop ((signed (op1 ) * op2 ) >> 32 ),
170
+ )
0 commit comments