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

Last change on this file since 4138 was 4138, checked in by linmengl, 4 years ago

add some more lib files; add tests for long stream addition.

File size: 4.0 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
29int sign_mask_64(SIMD_type a);
30
31{% for fw in [128]%}
32void uadd_with_overflow_i{{ fw }}(bitblock{{fw}}_t a, bitblock{{fw}}_t b, bitblock{{fw}}_t *sum, short *obit);
33{% endfor %}
34}
35
36void fill_random(SIMD_type &a, SIMD_type &b)
37{
38  a = mvmd<8>::fill((int)rand() % (1 << 8));
39  b = mvmd<8>::fill((int)rand() % (1 << 8));
40}
41
42int main() {
43  SIMD_type a, b, c, d, e, f;
44  short x, y;
45  srand(time(0));
46
47  for (unsigned i = 0; i < 50; ++i) {
48    fill_random(a, b);
49
50    //All the binary ops
51    {% for name in Names %}
52    {% if name.flag == "" %}
53      c = {{ name.c }}(a, b);
54      d = {{ name.cxx }}(a, b);
55      if (Store2String(c,1) != Store2String(d,1)) {
56        cout << "{{ name.c }} faild." << endl;
57        cout << "A = " << Store2String(a, 1) << endl;
58        cout << "B = " << Store2String(b, 1) << endl;
59        cout << "c = " << Store2String(c, 1) << endl;
60        cout << "cxx=" << Store2String(d, 1) << endl;
61
62        return 1;
63      }
64
65    {% endif %}
66    {% endfor %}
67
68    //Shifting tests need special treatment
69    {% for name in Names %}
70    {% if name.flag == "shifting" %}
71    {% for x in range(0, name.fw) %}
72      c = {{ name.cxx }}<{{ x }}>(a);
73      f = mvmd<{{ name.fw }}>::fill({{ x }});
74      d = {{ name.c }}(a, f);
75      if (Store2String(c,1) != Store2String(d,1)) {
76        cout << "{{ name.c }} faild." << endl;
77        return 1;
78      }
79
80    {% endfor %}
81    {% endif %}
82    {% endfor %}
83
84    //insert_vector_elt and extract_
85    {% for fw in INS_EXT_VEC_ELT_FWs %}
86    {% for idx in range(0, 128 // fw) %}
87      x = extractelement_{{ fw }}(a, {{ idx }});
88      y = mvmd<{{ fw }}>::extract<{{ idx }}>(a);
89      if (x != y) {
90        cout << "extractelement_{{fw}} failed." << endl;
91        return 1;
92      }
93
94      x = rand() % 100;
95      c = insertelement_{{ fw }}(a, x, {{ idx }});
96      d = mvmd<{{ fw }}>::insert<{{ idx }}>(a, x);
97      if (Store2String(c,1) != Store2String(d,1)) {
98        cout << "insertelement_{{fw}} failed." << endl;
99        return 1;
100      }
101    {% endfor %}
102    {% endfor %}
103
104    //try i128 add and shift
105    c = simd<128>::add(a, b);
106    d = add_128(a, b);
107    if (Store2String(c,1) != Store2String(d,1)) {
108      cout << "add_128 failed." << endl;
109      return 1;
110    }
111
112    {% set imm = range(0,128) | random %}
113    c = simd<128>::slli<{{ imm }}>(a);
114    f = mvmd<128>::fill({{ imm }});
115    d = sll_128(a, f);
116    if (Store2String(c,1) != Store2String(d,1)) {
117      cout << "sll_128 failed." << endl;
118      return 1;
119    }
120
121    //i128 long stream addition
122    c = mvmd<32>::fill(0);
123    SIMD_type sum0, obit0, sum1;
124    short obit1;
125    adc(a, b, c, obit0, sum0);
126    uadd_with_overflow_i128(a, b, &sum1, &obit1);
127    x = 0;
128    if (Store2String(sum0,1) != Store2String(sum1,1)) {
129      cout << "uadd_with_overflow_i128, sum error" << endl;
130      x = 1;
131    }
132    if (Store2String(mvmd<128>::fill(obit1),1) != Store2String(obit0,1)) {
133      cout << "uadd_with_overflow_i128 failed, obit error" << endl;
134      x = 1;
135    }
136    if (x) {
137      cout << "a =      " << Store2String(a, 1) << endl;
138      cout << "b =      " << Store2String(b, 1) << endl;
139      cout << "sum0 =   " << Store2String(sum0, 1) << endl;
140      cout << "sum1 =   " << Store2String(sum1, 1) << endl;
141      cout << "obit0 =  " << Store2String(obit0, 1) << endl;
142      cout << "obit1 =  " << obit1 << endl;
143      return 1;
144    }
145
146  }
147
148  return 0;
149}
150
Note: See TracBrowser for help on using the repository browser.