source: trunk/lib_ir/gen/test_llc.pytemplate.cpp

Last change on this file was 4296, checked in by linmengl, 5 years ago

add tests for long shift right and dslli

File size: 7.7 KB
Line 
1/******************
2 * Python template to auto gen llc test file.
3 * sudo easy_install Jinja2 to install the Jinja2 template system
4 * {{HeaderComment}}
5 */
6
7#include "utility.h"
8#include <ctime>
9#include <iostream>
10#include <cstdlib>
11using namespace std;
12{% set Names = FunctionNamesI1 + FunctionNamesI2 + FunctionNamesI4 + FunctionNamesI8 %}
13{% set INS_EXT_VEC_ELT_FWs = [2, 4] %}
14
15extern "C" {
16{% for name in Names %}
17  SIMD_type {{ name.c }}(SIMD_type a, SIMD_type b);
18{% endfor %}
19
20{% for fw in INS_EXT_VEC_ELT_FWs %}
21  SIMD_type insertelement_{{ fw }}(SIMD_type a, short elt, int idx);
22  short extractelement_{{ fw }}(SIMD_type a, int idx);
23{% endfor %}
24
25//long add/shift
26SIMD_type add_128(SIMD_type a, SIMD_type b);
27SIMD_type sll_128(SIMD_type a, SIMD_type b);
28
29SIMD_type add_with_carry_ir(SIMD_type a, SIMD_type b, SIMD_type carry_in, SIMD_type *carry_out, SIMD_type *sum);
30SIMD_type add_with_carry_ir_better(SIMD_type a, SIMD_type b, SIMD_type carry_in, SIMD_type *carry_out, SIMD_type *sum);
31
32{% for fw in [128]%}
33void uadd_with_overflow_i{{ fw }}(bitblock{{fw}}_t a, bitblock{{fw}}_t b, bitblock{{fw}}_t *sum, unsigned short *obit);
34{% endfor %}
35
36{% for sh in LongShiftAmount128 %}
37SIMD_type long_shift_left_{{sh}}(SIMD_type a);
38SIMD_type long_shift_right_{{sh}}(SIMD_type a);
39SIMD_type long_shift_dslli_{{sh}}(SIMD_type a, SIMD_type b);
40{% endfor %}
41}
42
43void fill_random(SIMD_type &a, SIMD_type &b)
44{
45  a = mvmd<8>::fill((int)rand() % (1 << 8));
46  b = mvmd<8>::fill((int)rand() % (1 << 8));
47}
48
49string to_string(const SIMD_type &a) {
50  return Store2String(a,1);
51}
52
53int test_long_stream_addition(const SIMD_type &a, const SIMD_type &b)
54{
55    SIMD_type c, d, e, f;
56    short x, y;
57    SIMD_type sum0, obit0, sum1, sum2, obit2;
58    unsigned short obit1;
59
60    //test uadd.with.overflow.i128
61    c = mvmd<32>::fill(0);
62    adc(a, b, c, obit0, sum0);
63    uadd_with_overflow_i128(a, b, &sum1, &obit1);
64    x = 0;
65    if (Store2String(sum0,1) != Store2String(sum1,1)) {
66      cout << "uadd_with_overflow_i128, sum error" << endl;
67      x = 1;
68    }
69    if (Store2String(mvmd<128>::fill(obit1 % 2),1) != Store2String(obit0,1)) {
70      cout << "uadd_with_overflow_i128 failed, obit error" << endl;
71      x = 1;
72    }
73    if (x) {
74      cout << "a =      " << Store2String(a, 1) << endl;
75      cout << "b =      " << Store2String(b, 1) << endl;
76      cout << "sum0 =   " << Store2String(sum0, 1) << endl;
77      cout << "sum1 =   " << Store2String(sum1, 1) << endl;
78      cout << "obit0 =  " << Store2String(obit0, 1) << endl;
79      cout << "obit1 =  " << obit1 << endl;
80      return 1;
81    }
82
83    //test a + not(a)
84    uadd_with_overflow_i128(a, simd_not(a), &sum1, &obit1);
85    if (to_string(sum1) != to_string(simd_not(simd<32>::constant<0>())) ||
86        obit1 % 2 != 0)
87    {
88      cout << "a + not(a) error: " << endl;
89      cout << "sum1 =   " << Store2String(sum1, 1) << endl;
90      cout << "obit1 =  " << obit1 << endl;
91      return 1;
92    }
93
94    //test all ones + 1
95    sum1 = simd_not(simd<32>::constant<0>());
96    uadd_with_overflow_i128(sum1, mvmd<128>::fill(1), &sum1, &obit1);
97    if (to_string(sum1) != to_string(simd<32>::constant<0>()) ||
98        obit1 % 2 != 1) {
99      cout << "all ones + 1 error: " << endl;
100      cout << "sum1 =   " << to_string(sum1) << endl;
101      cout << "obit1 =  " << obit1 << endl;
102      return 1;
103    }
104
105    //test add_with_carry in pure IR
106    y = rand() % 2;
107    c = mvmd<128>::fill(y);
108    adc(a, b, c, obit0, sum0);
109    add_with_carry_ir(a, b, c, &obit2, &sum2);
110    if (Store2String(sum0,1) != Store2String(sum2,1) ||
111        Store2String(obit0,1) != Store2String(obit2,1)) {
112      cout << "add_with_carry_ir failed." << endl;
113      cout << "a =      " << Store2String(a, 1) << endl;
114      cout << "b =      " << Store2String(b, 1) << endl;
115      cout << "sum0 =   " << Store2String(sum0, 1) << endl;
116      cout << "sum2 =   " << Store2String(sum2, 1) << endl;
117      cout << "obit0 =  " << Store2String(obit0, 1) << endl;
118      cout << "obit2 =  " << Store2String(obit2, 1) << endl;
119      return 1;
120    }
121
122    //test add_with_carry_better in pure IR
123    //add_with_carry_better is implemented with the new intrinsics.
124    y = rand() % 2;
125    c = mvmd<128>::fill(y);
126    adc(a, b, c, obit0, sum0);
127    add_with_carry_ir_better(a, b, c, &obit2, &sum2);
128    if (Store2String(sum0,1) != Store2String(sum2,1) ||
129        Store2String(obit0,1) != Store2String(obit2,1)) {
130      cout << "add_with_carry_ir_better failed." << endl;
131      cout << "a =      " << Store2String(a, 1) << endl;
132      cout << "b =      " << Store2String(b, 1) << endl;
133      cout << "sum0 =   " << Store2String(sum0, 1) << endl;
134      cout << "sum2 =   " << Store2String(sum2, 1) << endl;
135      cout << "obit0 =  " << Store2String(obit0, 1) << endl;
136      cout << "obit2 =  " << Store2String(obit2, 1) << endl;
137      return 1;
138    }
139
140    return 0;
141}
142
143int test_long_shift(const SIMD_type &a, const SIMD_type &b)
144{
145  SIMD_type c, d;
146  {% for sh in LongShiftAmount128 %}
147  d = simd<128>::slli<{{sh}}>(a);
148  c = long_shift_left_{{sh}}(a);
149  if (to_string(d) != to_string(c)) {
150    cout << "long_shift_left with sh = {{sh}} failed." << endl;
151    return 1;
152  }
153
154  d = simd<128>::srli<{{sh}}>(a);
155  c = long_shift_right_{{sh}}(a);
156  if (to_string(d) != to_string(c)) {
157    cout << "long_shift_right with sh = {{sh}} failed." << endl;
158    return 1;
159  }
160
161  c = long_shift_dslli_{{sh}}(a, b);
162  d = simd_or( simd<128>::slli<{{sh}}>(a), simd<128>::srli<{{128 - sh}}>(b) );
163  if (to_string(c) != to_string(d)) {
164    cout << "long_shift_dslli with sh = {{sh}} failed." << endl;
165    return 1;
166  }
167  {% endfor %}
168
169  return 0;
170}
171
172int main() {
173  SIMD_type a, b, c, d, e, f;
174  short x, y;
175  srand(time(0));
176
177  for (unsigned i = 0; i < 500; ++i) {
178    fill_random(a, b);
179
180    //All the binary ops
181    {% for name in Names %}
182    {% if name.flag == "" %}
183      c = {{ name.c }}(a, b);
184      d = {{ name.cxx }}(a, b);
185      if (Store2String(c,1) != Store2String(d,1)) {
186        cout << "{{ name.c }} faild." << endl;
187        cout << "A = " << Store2String(a, 1) << endl;
188        cout << "B = " << Store2String(b, 1) << endl;
189        cout << "c = " << Store2String(c, 1) << endl;
190        cout << "cxx=" << Store2String(d, 1) << endl;
191
192        return 1;
193      }
194
195    {% endif %}
196    {% endfor %}
197
198    //Shifting tests need special treatment
199    {% for name in Names %}
200    {% if name.flag == "shifting" %}
201    {% for x in range(0, name.fw) %}
202      c = {{ name.cxx }}<{{ x }}>(a);
203      f = mvmd<{{ name.fw }}>::fill({{ x }});
204      d = {{ name.c }}(a, f);
205      if (Store2String(c,1) != Store2String(d,1)) {
206        cout << "{{ name.c }} faild." << endl;
207        return 1;
208      }
209
210    {% endfor %}
211    {% endif %}
212    {% endfor %}
213
214    //insert_vector_elt and extract_
215    {% for fw in INS_EXT_VEC_ELT_FWs %}
216    {% for idx in range(0, 128 // fw) %}
217      x = extractelement_{{ fw }}(a, {{ idx }});
218      y = mvmd<{{ fw }}>::extract<{{ idx }}>(a);
219      if (x != y) {
220        cout << "extractelement_{{fw}} failed." << endl;
221        return 1;
222      }
223
224      x = rand() % 100;
225      c = insertelement_{{ fw }}(a, x, {{ idx }});
226      d = mvmd<{{ fw }}>::insert<{{ idx }}>(a, x);
227      if (Store2String(c,1) != Store2String(d,1)) {
228        cout << "insertelement_{{fw}} failed." << endl;
229        return 1;
230      }
231    {% endfor %}
232    {% endfor %}
233
234    //try i128 add and shift
235    c = simd<128>::add(a, b);
236    d = add_128(a, b);
237    if (Store2String(c,1) != Store2String(d,1)) {
238      cout << "add_128 failed." << endl;
239      return 1;
240    }
241
242    {% set imm = range(0,128) | random %}
243    c = simd<128>::slli<{{ imm }}>(a);
244    f = mvmd<128>::fill({{ imm }});
245    d = sll_128(a, f);
246    if (Store2String(c,1) != Store2String(d,1)) {
247      cout << "sll_128 failed." << endl;
248      return 1;
249    }
250
251    if (test_long_stream_addition(a, b))
252      return 1;
253
254    if (test_long_shift(a, b))
255      return 1;
256  }
257
258  return 0;
259}
260
Note: See TracBrowser for help on using the repository browser.