annotate utils/gengcc.c @ 40:55cadb1fac4b

*: add mod operation, add GCC vector backend need to test it with old gcc though. :)
author Paper <paper@tflc.us>
date Sun, 27 Apr 2025 02:49:53 -0400
parents
children c6e0df09b86f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
40
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
1 /**
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
2 * vec - a tiny SIMD vector library in C99
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
3 *
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
4 * Copyright (c) 2024-2025 Paper
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
5 *
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
7 * of this software and associated documentation files (the "Software"), to deal
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
8 * in the Software without restriction, including without limitation the rights
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
10 * copies of the Software, and to permit persons to whom the Software is
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
11 * furnished to do so, subject to the following conditions:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
12 *
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
13 * The above copyright notice and this permission notice shall be included in all
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
14 * copies or substantial portions of the Software.
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
15 *
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
22 * SOFTWARE.
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
23 **/
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
24
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
25 /* Use this file to generate include/vec/impl/generic.h !!
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
26 *
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
27 * `gcc -o gengeneric gengeneric.c` */
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
28
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
29 #include <stdio.h>
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
30 #include <stdlib.h>
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
31 #include <string.h>
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
32 #include <ctype.h>
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
33
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
34 #define ARRAY_SIZE(x) (sizeof(x)/sizeof((x)[0]))
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
35
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
36 /* ------------------------------------------------------------------------ */
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
37
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
38 enum op {
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
39 /* return vector, take in a integer */
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
40 OP_SPLAT = 0,
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
41
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
42 /* return vector, take in an array */
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
43 OP_LOAD_ALIGNED,
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
44 OP_LOAD,
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
45
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
46 /* void, take in vector and array */
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
47 OP_STORE_ALIGNED,
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
48 OP_STORE,
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
49
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
50 /* return vector, takes in two vectors */
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
51 OP_ADD,
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
52 OP_SUB,
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
53 OP_MUL,
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
54 OP_AND,
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
55 OP_OR,
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
56 OP_XOR,
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
57 OP_CMPLT,
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
58 OP_CMPEQ,
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
59 OP_CMPGT,
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
60 OP_CMPLE,
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
61 OP_CMPGE,
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
62 OP_MIN,
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
63 OP_MAX,
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
64 OP_AVG,
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
65
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
66 /* return vector, takes in a vector and an explicitly unsigned vector */
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
67 OP_LSHIFT,
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
68 OP_RSHIFT,
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
69 OP_LRSHIFT,
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
70
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
71 /* return vector, takes in a vector */
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
72 OP_NOT,
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
73
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
74 OP_FINAL_,
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
75
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
76 /* operations that have some sort of "caveat" should go here, until
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
77 * they are fixed or removed */
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
78
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
79 OP_DIV, /* this one causes a floating point exception on my machine.
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
80 * possibly we could change the behavior of divide-by-zero
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
81 * with some gcc pragma ? --paper */
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
82 OP_MOD, /* ditto with the above */
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
83 };
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
84
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
85 /* convert op -> string */
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
86 static struct {
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
87 const char *u;
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
88 const char *l;
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
89 } op_names[] = {
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
90 [OP_SPLAT] = {"SPLAT", "splat"},
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
91 [OP_LOAD_ALIGNED] = {"LOAD_ALIGNED", "load_aligned"},
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
92 [OP_LOAD] = {"LOAD", "load"},
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
93 [OP_STORE_ALIGNED] = {"STORE_ALIGNED", "store_aligned"},
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
94 [OP_STORE] = {"STORE", "store"},
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
95 [OP_ADD] = {"ADD", "add"},
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
96 [OP_SUB] = {"SUB", "sub"},
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
97 [OP_MUL] = {"MUL", "mul"},
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
98 /*[OP_DIV] = {"DIV", "div"},*/
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
99 [OP_AVG] = {"AVG", "avg"},
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
100 [OP_AND] = {"AND", "and"},
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
101 [OP_OR] = {"OR", "or"},
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
102 [OP_XOR] = {"XOR", "xor"},
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
103 [OP_NOT] = {"NOT", "not"},
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
104 [OP_CMPLT] = {"CMPLT", "cmplt"},
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
105 [OP_CMPEQ] = {"CMPEQ", "cmpeq"},
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
106 [OP_CMPGT] = {"CMPGT", "cmpgt"},
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
107 [OP_CMPLE] = {"CMPLE", "cmple"},
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
108 [OP_CMPGE] = {"CMPGE", "cmpge"},
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
109 [OP_MIN] = {"MIN", "min"},
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
110 [OP_MAX] = {"MAX", "max"},
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
111 [OP_RSHIFT] = {"RSHIFT", "rshift"},
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
112 [OP_LRSHIFT] = {"LRSHIFT", "lrshift"},
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
113 [OP_LSHIFT] = {"LSHIFT", "lshift"},
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
114 };
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
115
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
116 #define UPSIGN(x) ((x) ? "" : "U")
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
117 #define LOSIGN(x) ((x) ? "" : "u")
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
118
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
119 static void print_gcc_op(enum op op, int is_signed, int bits, int size)
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
120 {
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
121 int i;
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
122
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
123 printf("#ifndef V%sINT%dx%d_%s_DEFINED\n", UPSIGN(is_signed), bits, size, op_names[op].u);
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
124
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
125 printf("VEC_FUNC_IMPL ");
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
126
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
127 /* first; the return value */
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
128 switch (op) {
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
129 case OP_SPLAT:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
130 case OP_LOAD_ALIGNED:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
131 case OP_LOAD:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
132 case OP_ADD:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
133 case OP_SUB:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
134 case OP_MUL:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
135 case OP_DIV:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
136 case OP_AND:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
137 case OP_OR:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
138 case OP_XOR:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
139 case OP_CMPLT:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
140 case OP_CMPEQ:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
141 case OP_CMPGT:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
142 case OP_CMPLE:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
143 case OP_CMPGE:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
144 case OP_MIN:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
145 case OP_MAX:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
146 case OP_AVG:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
147 case OP_RSHIFT:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
148 case OP_LRSHIFT:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
149 case OP_LSHIFT:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
150 case OP_NOT:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
151 printf("v%sint%dx%d", LOSIGN(is_signed), bits, size);
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
152 break;
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
153 case OP_STORE_ALIGNED:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
154 case OP_STORE:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
155 printf("void");
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
156 break;
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
157 }
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
158
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
159 /* whitespace and function name */
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
160 printf(" v%sint%dx%d_%s(", LOSIGN(is_signed), bits, size, op_names[op].l);
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
161
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
162 /* parameters */
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
163 switch (op) {
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
164 case OP_SPLAT:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
165 printf("vec_%sint%d x", LOSIGN(is_signed), bits);
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
166 break;
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
167 case OP_LOAD_ALIGNED:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
168 case OP_LOAD:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
169 printf("const vec_%sint%d x[%d]", LOSIGN(is_signed), bits, size);
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
170 break;
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
171 case OP_STORE_ALIGNED:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
172 case OP_STORE:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
173 printf("v%sint%dx%d vec, vec_%sint%d arr[%d]", LOSIGN(is_signed), bits, size, LOSIGN(is_signed), bits, size);
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
174 break;
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
175 case OP_ADD:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
176 case OP_SUB:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
177 case OP_MUL:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
178 case OP_DIV:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
179 case OP_AND:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
180 case OP_OR:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
181 case OP_XOR:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
182 case OP_CMPLT:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
183 case OP_CMPEQ:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
184 case OP_CMPGT:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
185 case OP_CMPLE:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
186 case OP_CMPGE:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
187 case OP_MIN:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
188 case OP_MAX:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
189 case OP_AVG:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
190 printf("v%sint%dx%d vec1, v%sint%dx%d vec2", LOSIGN(is_signed), bits, size, LOSIGN(is_signed), bits, size);
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
191 break;
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
192 case OP_RSHIFT:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
193 case OP_LRSHIFT:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
194 case OP_LSHIFT:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
195 printf("v%sint%dx%d vec1, vuint%dx%d vec2", LOSIGN(is_signed), bits, size, bits, size);
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
196 break;
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
197 case OP_NOT:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
198 printf("v%sint%dx%d vec", LOSIGN(is_signed), bits, size);
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
199 break;
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
200 }
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
201
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
202 puts(")\n{");
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
203
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
204 switch (op) {
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
205 case OP_SPLAT:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
206 printf("\tv%sint%dx%d vec;\n", LOSIGN(is_signed), bits, size);
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
207 printf("\tvec.gcc = (__typeof__(vec.gcc)){");
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
208 for (i = 0; i < size; i++)
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
209 printf("x,");
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
210 printf("};\n");
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
211 printf("\treturn vec;\n");
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
212 break;
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
213 case OP_LOAD_ALIGNED:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
214 printf("\tv%sint%dx%d vec;\n", LOSIGN(is_signed), bits, size);
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
215 puts("\tvec.gcc = *(__typeof__(vec.gcc) *)x;");
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
216 printf("\treturn vec;\n");
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
217 break;
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
218 case OP_LOAD:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
219 printf("\tv%sint%dx%d vec;\n", LOSIGN(is_signed), bits, size);
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
220 puts("\tmemcpy(&vec, x, sizeof(vec));");
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
221 printf("\treturn vec;\n");
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
222 break;
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
223 case OP_STORE_ALIGNED:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
224 puts("\t*(__typeof__(vec.gcc) *)arr = vec.gcc;");
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
225 break;
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
226 case OP_STORE:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
227 puts("\tmemcpy(arr, &vec, sizeof(vec));");
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
228 break;
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
229 case OP_ADD:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
230 case OP_SUB:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
231 case OP_MUL:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
232 case OP_DIV:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
233 case OP_AND:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
234 case OP_OR:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
235 case OP_XOR:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
236 case OP_CMPLT:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
237 case OP_CMPEQ:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
238 case OP_CMPGT:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
239 case OP_CMPLE:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
240 case OP_CMPGE: {
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
241 const char *op_builtins[OP_CMPGE - OP_ADD + 1] = {"+", "-", "*", /*"/", */"&", "|", "^", "<", "==", ">", "<=", ">="};
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
242
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
243 printf("\tvec1.gcc = (vec1.gcc %s vec2.gcc);\n", op_builtins[op - OP_ADD]);
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
244 printf("\treturn vec1;\n");
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
245 break;
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
246 }
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
247
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
248 case OP_LSHIFT:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
249 case OP_RSHIFT: {
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
250 const char *op_builtins[OP_RSHIFT - OP_LSHIFT + 1] = {"<<", ">>"};
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
251
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
252 printf("\tvec1.gcc = (vec1.gcc %s vec2.gcc);\n", op_builtins[op - OP_LSHIFT]);
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
253 printf("\treturn vec1;\n");
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
254 break;
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
255 }
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
256
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
257 case OP_LRSHIFT: {
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
258 /* sigh */
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
259 printf("\tvec1.gcc = (__typeof__(vec1.gcc))((vec_uint%d __attribute__((__vector_size__(%d))))vec1.gcc >> vec2.gcc);\n", bits, bits * size / 8);
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
260 printf("\treturn vec1;\n");
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
261 break;
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
262 }
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
263 case OP_MIN:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
264 case OP_MAX: {
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
265 const char *op_builtins[OP_MAX - OP_MIN + 1] = {"<", ">"};
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
266
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
267 printf("\tv%sint%dx%d mask;\n", LOSIGN(is_signed), bits, size);
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
268 printf("\tmask.gcc = (vec1.gcc %s vec2.gcc);\n", op_builtins[op - OP_MIN]);
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
269 printf("\tvec1.gcc = (vec1.gcc & mask.gcc) | (vec2.gcc & ~mask.gcc);\n");
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
270 printf("\treturn vec1;\n");
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
271 break;
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
272 }
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
273 case OP_AVG:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
274 if (is_signed) {
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
275 printf("\tvint%dx%d ones = vint%dx%d_splat(1);\n", bits, size, bits, size);
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
276 printf("\t__typeof__(vec1.gcc) x_d_rem = (vec1.gcc % 2);\n");
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
277 printf("\t__typeof__(vec1.gcc) y_d_rem = (vec2.gcc % 2);\n");
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
278 printf("\t__typeof__(vec1.gcc) rem_d_quot = ((x_d_rem + y_d_rem) / 2);\n");
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
279 printf("\t__typeof__(vec1.gcc) rem_d_rem = ((x_d_rem + y_d_rem) % 2);\n");
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
280 puts("");
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
281 printf("\tvec1.gcc = ((vec1.gcc / 2) + (vec2.gcc / 2)) + (rem_d_quot) + ((rem_d_rem == 1) & ones.gcc);\n");
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
282 } else {
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
283 printf("\tvec1.gcc = (vec1.gcc >> 1) + (vec2.gcc >> 1) + ((vec1.gcc | vec2.gcc) & 1);\n");
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
284 }
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
285
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
286 printf("\treturn vec1;\n");
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
287 break;
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
288 case OP_NOT:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
289 printf("\tvec.gcc = ~vec.gcc;\n");
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
290 printf("\treturn vec;\n");
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
291 break;
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
292 default:
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
293 printf("#error implement this operation");
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
294 break;
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
295 }
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
296
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
297 /* end function definition */
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
298 puts("}");
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
299
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
300 printf("# define V%sINT%dx%d_%s_DEFINED\n", UPSIGN(is_signed), bits, size, op_names[op].u);
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
301 puts("#endif");
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
302 }
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
303
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
304 static inline void print_ops(int is_signed, int bits, int size)
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
305 {
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
306 int i;
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
307
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
308 printf("\n\n/* v%sint%dx%d */\n\n", (is_signed ? "u" : ""), bits, size);
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
309
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
310 for (i = 0; i < OP_FINAL_; i++)
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
311 print_gcc_op(i, is_signed, bits, size);
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
312 }
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
313
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
314 static const char *header =
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
315 "/**\n"
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
316 " * vec - a tiny SIMD vector library in C99\n"
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
317 " * \n"
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
318 " * Copyright (c) 2024-2025 Paper\n"
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
319 " * \n"
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
320 " * Permission is hereby granted, free of charge, to any person obtaining a copy\n"
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
321 " * of this software and associated documentation files (the \"Software\"), to deal\n"
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
322 " * in the Software without restriction, including without limitation the rights\n"
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
323 " * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n"
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
324 " * copies of the Software, and to permit persons to whom the Software is\n"
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
325 " * furnished to do so, subject to the following conditions:\n"
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
326 " * \n"
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
327 " * The above copyright notice and this permission notice shall be included in all\n"
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
328 " * copies or substantial portions of the Software.\n"
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
329 " * \n"
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
330 " * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n"
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
331 " * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n"
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
332 " * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n"
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
333 " * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n"
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
334 " * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n"
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
335 " * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n"
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
336 " * SOFTWARE.\n"
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
337 "**/\n"
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
338 "\n"
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
339 "/* This file is automatically generated! Do not edit it directly!\n"
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
340 " * Edit the code that generates it in utils/gengcc.c --paper */\n"
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
341 "\n"
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
342 "#ifndef VEC_IMPL_GCC_H_\n"
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
343 "#define VEC_IMPL_GCC_H_\n"
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
344 "\n";
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
345
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
346 static const char *footer =
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
347 "#endif /* VEC_IMPL_GCC_H_ */\n";
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
348
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
349 int main(void)
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
350 {
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
351 static struct {
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
352 int bits, size;
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
353 } defs[] = {
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
354 /* -- 8-bit */
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
355 {8, 2},
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
356 {8, 4},
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
357 {8, 8},
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
358 {8, 16},
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
359 {8, 32},
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
360 {8, 64},
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
361
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
362 /* -- 16-bit */
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
363 {16, 2},
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
364 {16, 4},
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
365 {16, 8},
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
366 {16, 16},
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
367 {16, 32},
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
368
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
369 /* -- 32-bit */
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
370 {32, 2},
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
371 {32, 4},
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
372 {32, 8},
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
373 {32, 16},
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
374
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
375 /* -- 64-bit */
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
376 {64, 2},
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
377 {64, 4},
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
378 {64, 8},
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
379 };
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
380 int i;
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
381
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
382 puts(header);
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
383
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
384 for (i = 0; i < ARRAY_SIZE(defs); i++) {
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
385 print_ops(1, defs[i].bits, defs[i].size);
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
386 print_ops(0, defs[i].bits, defs[i].size);
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
387 }
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
388
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
389 puts(footer);
55cadb1fac4b *: add mod operation, add GCC vector backend
Paper <paper@tflc.us>
parents:
diff changeset
390 }