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

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

check in test code for @llvm.uadd.with.overflow.carryin

File size: 6.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
37void fill_random(SIMD_type &a, SIMD_type &b)
38{
39  a = mvmd<8>::fill((int)rand() % (1 << 8));
40  b = mvmd<8>::fill((int)rand() % (1 << 8));
41}
42
43string to_string(const SIMD_type &a) {
44  return Store2String(a,1);
45}
46
47int test_long_stream_addition(const SIMD_type &a, const SIMD_type &b)
48{
49    SIMD_type c, d, e, f;
50    short x, y;
51    SIMD_type sum0, obit0, sum1, sum2, obit2;
52    unsigned short obit1;
53
54    //test uadd.with.overflow.i128
55    c = mvmd<32>::fill(0);
56    adc(a, b, c, obit0, sum0);
57    uadd_with_overflow_i128(a, b, &sum1, &obit1);
58    x = 0;
59    if (Store2String(sum0,1) != Store2String(sum1,1)) {
60      cout << "uadd_with_overflow_i128, sum error" << endl;
61      x = 1;
62    }
63    if (Store2String(mvmd<128>::fill(obit1 % 2),1) != Store2String(obit0,1)) {
64      cout << "uadd_with_overflow_i128 failed, obit error" << endl;
65      x = 1;
66    }
67    if (x) {
68      cout << "a =      " << Store2String(a, 1) << endl;
69      cout << "b =      " << Store2String(b, 1) << endl;
70      cout << "sum0 =   " << Store2String(sum0, 1) << endl;
71      cout << "sum1 =   " << Store2String(sum1, 1) << endl;
72      cout << "obit0 =  " << Store2String(obit0, 1) << endl;
73      cout << "obit1 =  " << obit1 << endl;
74      return 1;
75    }
76
77    //test a + not(a)
78    uadd_with_overflow_i128(a, simd_not(a), &sum1, &obit1);
79    if (to_string(sum1) != to_string(simd_not(simd<32>::constant<0>())) ||
80        obit1 % 2 != 0)
81    {
82      cout << "a + not(a) error: " << endl;
83      cout << "sum1 =   " << Store2String(sum1, 1) << endl;
84      cout << "obit1 =  " << obit1 << endl;
85      return 1;
86    }
87
88    //test all ones + 1
89    sum1 = simd_not(simd<32>::constant<0>());
90    uadd_with_overflow_i128(sum1, mvmd<128>::fill(1), &sum1, &obit1);
91    if (to_string(sum1) != to_string(simd<32>::constant<0>()) ||
92        obit1 % 2 != 1) {
93      cout << "all ones + 1 error: " << endl;
94      cout << "sum1 =   " << to_string(sum1) << endl;
95      cout << "obit1 =  " << obit1 << endl;
96      return 1;
97    }
98
99    //test add_with_carry in pure IR
100    y = rand() % 2;
101    c = mvmd<128>::fill(y);
102    adc(a, b, c, obit0, sum0);
103    add_with_carry_ir(a, b, c, &obit2, &sum2);
104    if (Store2String(sum0,1) != Store2String(sum2,1) ||
105        Store2String(obit0,1) != Store2String(obit2,1)) {
106      cout << "add_with_carry_ir failed." << endl;
107      cout << "a =      " << Store2String(a, 1) << endl;
108      cout << "b =      " << Store2String(b, 1) << endl;
109      cout << "sum0 =   " << Store2String(sum0, 1) << endl;
110      cout << "sum2 =   " << Store2String(sum2, 1) << endl;
111      cout << "obit0 =  " << Store2String(obit0, 1) << endl;
112      cout << "obit2 =  " << Store2String(obit2, 1) << endl;
113      return 1;
114    }
115
116    //test add_with_carry_better in pure IR
117    //add_with_carry_better is implemented with the new intrinsics.
118    y = rand() % 2;
119    c = mvmd<128>::fill(y);
120    adc(a, b, c, obit0, sum0);
121    add_with_carry_ir_better(a, b, c, &obit2, &sum2);
122    if (Store2String(sum0,1) != Store2String(sum2,1) ||
123        Store2String(obit0,1) != Store2String(obit2,1)) {
124      cout << "add_with_carry_ir_better failed." << endl;
125      cout << "a =      " << Store2String(a, 1) << endl;
126      cout << "b =      " << Store2String(b, 1) << endl;
127      cout << "sum0 =   " << Store2String(sum0, 1) << endl;
128      cout << "sum2 =   " << Store2String(sum2, 1) << endl;
129      cout << "obit0 =  " << Store2String(obit0, 1) << endl;
130      cout << "obit2 =  " << Store2String(obit2, 1) << endl;
131      return 1;
132    }
133
134    return 0;
135}
136
137int main() {
138  SIMD_type a, b, c, d, e, f;
139  short x, y;
140  srand(time(0));
141
142  for (unsigned i = 0; i < 500; ++i) {
143    fill_random(a, b);
144
145    //All the binary ops
146    {% for name in Names %}
147    {% if name.flag == "" %}
148      c = {{ name.c }}(a, b);
149      d = {{ name.cxx }}(a, b);
150      if (Store2String(c,1) != Store2String(d,1)) {
151        cout << "{{ name.c }} faild." << endl;
152        cout << "A = " << Store2String(a, 1) << endl;
153        cout << "B = " << Store2String(b, 1) << endl;
154        cout << "c = " << Store2String(c, 1) << endl;
155        cout << "cxx=" << Store2String(d, 1) << endl;
156
157        return 1;
158      }
159
160    {% endif %}
161    {% endfor %}
162
163    //Shifting tests need special treatment
164    {% for name in Names %}
165    {% if name.flag == "shifting" %}
166    {% for x in range(0, name.fw) %}
167      c = {{ name.cxx }}<{{ x }}>(a);
168      f = mvmd<{{ name.fw }}>::fill({{ x }});
169      d = {{ name.c }}(a, f);
170      if (Store2String(c,1) != Store2String(d,1)) {
171        cout << "{{ name.c }} faild." << endl;
172        return 1;
173      }
174
175    {% endfor %}
176    {% endif %}
177    {% endfor %}
178
179    //insert_vector_elt and extract_
180    {% for fw in INS_EXT_VEC_ELT_FWs %}
181    {% for idx in range(0, 128 // fw) %}
182      x = extractelement_{{ fw }}(a, {{ idx }});
183      y = mvmd<{{ fw }}>::extract<{{ idx }}>(a);
184      if (x != y) {
185        cout << "extractelement_{{fw}} failed." << endl;
186        return 1;
187      }
188
189      x = rand() % 100;
190      c = insertelement_{{ fw }}(a, x, {{ idx }});
191      d = mvmd<{{ fw }}>::insert<{{ idx }}>(a, x);
192      if (Store2String(c,1) != Store2String(d,1)) {
193        cout << "insertelement_{{fw}} failed." << endl;
194        return 1;
195      }
196    {% endfor %}
197    {% endfor %}
198
199    //try i128 add and shift
200    c = simd<128>::add(a, b);
201    d = add_128(a, b);
202    if (Store2String(c,1) != Store2String(d,1)) {
203      cout << "add_128 failed." << endl;
204      return 1;
205    }
206
207    {% set imm = range(0,128) | random %}
208    c = simd<128>::slli<{{ imm }}>(a);
209    f = mvmd<128>::fill({{ imm }});
210    d = sll_128(a, f);
211    if (Store2String(c,1) != Store2String(d,1)) {
212      cout << "sll_128 failed." << endl;
213      return 1;
214    }
215
216    if (test_long_stream_addition(a, b))
217      return 1;
218  }
219
220  return 0;
221}
222
Note: See TracBrowser for help on using the repository browser.