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

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

tests for i128 add/shift

File size: 3.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 <iostream>
9#include <cstdlib>
10using namespace std;
11{% set Names = FunctionNamesI1 + FunctionNamesI2 + FunctionNamesI4 + FunctionNamesI8 %}
12{% set INS_EXT_VEC_ELT_FWs = [2, 4] %}
13
14extern "C" {
15{% for name in Names %}
16  SIMD_type {{ name.c }}(SIMD_type a, SIMD_type b);
17{% endfor %}
18
19{% for fw in INS_EXT_VEC_ELT_FWs %}
20  SIMD_type insertelement_{{ fw }}(SIMD_type a, short elt, int idx);
21  short extractelement_{{ fw }}(SIMD_type a, int idx);
22{% endfor %}
23
24//long add/shift
25SIMD_type add_128(SIMD_type a, SIMD_type b);
26SIMD_type sll_128(SIMD_type a, SIMD_type b);
27}
28
29void fill_random(SIMD_type &a, SIMD_type &b)
30{
31  a = mvmd<32>::fill((int)rand() % 10000);
32  b = mvmd<32>::fill((int)rand() % 10000);
33}
34
35int main() {
36  SIMD_type a, b, c, d, f;
37  short x, y;
38
39  for (unsigned i = 0; i < 50; ++i) {
40    fill_random(a, b);
41
42    //All the binary ops
43    {% for name in Names %}
44    {% if name.flag == "" %}
45      c = {{ name.c }}(a, b);
46      d = {{ name.cxx }}(a, b);
47      if (Store2String(c,1) != Store2String(d,1)) {
48        cout << "{{ name.c }} faild." << endl;
49        cout << "A = " << Store2String(a, 1) << endl;
50        cout << "B = " << Store2String(b, 1) << endl;
51        cout << "c = " << Store2String(c, 1) << endl;
52        cout << "cxx=" << Store2String(d, 1) << endl;
53
54        return 1;
55      }
56
57    {% endif %}
58    {% endfor %}
59
60    //Shifting tests need special treatment
61    {% for name in Names %}
62    {% if name.flag == "shifting" %}
63    {% for x in range(0, name.fw) %}
64      c = {{ name.cxx }}<{{ x }}>(a);
65      f = mvmd<{{ name.fw }}>::fill({{ x }});
66      d = {{ name.c }}(a, f);
67      if (Store2String(c,1) != Store2String(d,1)) {
68        cout << "{{ name.c }} faild." << endl;
69        return 1;
70      }
71
72    {% endfor %}
73    {% endif %}
74    {% endfor %}
75
76    //insert_vector_elt and extract_
77    {% for fw in INS_EXT_VEC_ELT_FWs %}
78    {% for idx in range(0, 128 // fw) %}
79      x = extractelement_{{ fw }}(a, {{ idx }});
80      y = mvmd<{{ fw }}>::extract<{{ idx }}>(a);
81      if (x != y) {
82        cout << "extractelement_{{fw}} failed." << endl;
83        return 1;
84      }
85
86      x = rand() % 100;
87      c = insertelement_{{ fw }}(a, x, {{ idx }});
88      d = mvmd<{{ fw }}>::insert<{{ idx }}>(a, x);
89      if (Store2String(c,1) != Store2String(d,1)) {
90        cout << "insertelement_{{fw}} failed." << endl;
91        return 1;
92      }
93    {% endfor %}
94    {% endfor %}
95
96    //try i128 add and shift
97    c = simd<128>::add(a, b);
98    d = add_128(a, b);
99    if (Store2String(c,1) != Store2String(d,1)) {
100      cout << "add_128 failed." << endl;
101      return 1;
102    }
103
104    {% set imm = range(0,128) | random %}
105    c = simd<128>::slli<{{ imm }}>(a);
106    f = mvmd<128>::fill({{ imm }});
107    d = sll_128(a, f);
108    if (Store2String(c,1) != Store2String(d,1)) {
109      cout << "sll_128 failed." << endl;
110      return 1;
111    }
112  }
113
114  return 0;
115}
116
Note: See TracBrowser for help on using the repository browser.