Mercurial > vec
annotate gen/gengcc.c @ 45:7955bed1d169 default tip
*: add preliminary floating point support
no x86 intrinsics just yet, but I did add altivec since it's
(arguably) the simplest :)
author | Paper <paper@tflc.us> |
---|---|
date | Wed, 30 Apr 2025 18:36:38 -0400 |
parents | |
children |
rev | line source |
---|---|
45
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
1 /** |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
2 * vec - a tiny SIMD vector library in C99 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
3 * |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
4 * Copyright (c) 2024-2025 Paper |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
5 * |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
6 * Permission is hereby granted, free of charge, to any person obtaining a copy |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
7 * of this software and associated documentation files (the "Software"), to deal |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
8 * in the Software without restriction, including without limitation the rights |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
10 * copies of the Software, and to permit persons to whom the Software is |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
11 * furnished to do so, subject to the following conditions: |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
12 * |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
13 * The above copyright notice and this permission notice shall be included in all |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
14 * copies or substantial portions of the Software. |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
15 * |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
22 * SOFTWARE. |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
23 **/ |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
24 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
25 #include "genlib.h" |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
26 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
27 #define ARRAY_SIZE(x) (sizeof(x)/sizeof((x)[0])) |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
28 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
29 static int gcc_minmax_only_integer(int op, int type, int bits, int size) |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
30 { |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
31 return (type == TYPE_INT || type == TYPE_UINT); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
32 } |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
33 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
34 /* ------------------------------------------------------------------------ */ |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
35 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
36 static void pp_gcc_prereq_4_3_0(int op, int type, int bits, int size) |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
37 { |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
38 printf("VEC_GNUC_ATLEAST(4, 3, 0)"); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
39 } |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
40 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
41 static void gcc_print_easy_op(int op, int type, int bits, int size) |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
42 { |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
43 static const char *op_builtins[] = { |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
44 [OP_ADD] = "+", |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
45 [OP_SUB] = "-", |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
46 [OP_MUL] = "*", |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
47 [OP_DIV] = "/", |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
48 [OP_MOD] = "%", |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
49 [OP_AND] = "&", |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
50 [OP_OR] = "|", |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
51 [OP_XOR] = "^", |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
52 [OP_CMPLT] = "<", |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
53 [OP_CMPLE] = "<=", |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
54 [OP_CMPEQ] = "==", |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
55 [OP_CMPGE] = ">=", |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
56 [OP_CMPGT] = ">", |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
57 }; |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
58 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
59 printf("\tvec1.gcc = (vec1.gcc %s vec2.gcc);\n", op_builtins[op]); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
60 printf("\treturn vec1;\n"); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
61 } |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
62 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
63 static void gcc_print_splat(int op, int type, int bits, int size) |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
64 { |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
65 int i; |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
66 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
67 printf("\t"); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
68 gen_print_vtype(type, bits, size); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
69 printf(" vec;\n"); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
70 for (i = 0; i < size; i++) |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
71 printf("\tvec.gcc[%d] = x;\n", i); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
72 printf("\treturn vec;\n"); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
73 } |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
74 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
75 static void gcc_print_load_aligned(int op, int type, int bits, int size) |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
76 { |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
77 printf("\t"); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
78 gen_print_vtype(type, bits, size); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
79 printf(" vec;\n"); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
80 puts("\tvec.gcc = *(__typeof__(vec.gcc) *)x;"); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
81 printf("\treturn vec;\n"); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
82 } |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
83 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
84 static void gcc_print_load(int op, int type, int bits, int size) |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
85 { |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
86 printf("\t"); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
87 gen_print_vtype(type, bits, size); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
88 printf(" vec;\n"); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
89 puts("\tmemcpy(&vec, x, sizeof(vec));"); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
90 printf("\treturn vec;\n"); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
91 } |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
92 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
93 static void gcc_print_store_aligned(int op, int type, int bits, int size) |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
94 { |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
95 puts("\t*(__typeof__(vec.gcc) *)x = vec.gcc;"); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
96 } |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
97 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
98 static void gcc_print_store(int op, int type, int bits, int size) |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
99 { |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
100 puts("\tmemcpy(x, &vec, sizeof(vec));"); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
101 } |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
102 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
103 static void gcc_print_rorlshift(int op, int type, int bits, int size) |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
104 { |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
105 static const char *op_builtins[] = { |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
106 [OP_LSHIFT] = "<<", |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
107 [OP_RSHIFT] = ">>", |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
108 }; |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
109 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
110 printf("\tvec1.gcc = (vec1.gcc %s vec2.gcc);\n", op_builtins[op]); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
111 printf("\treturn vec1;\n"); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
112 } |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
113 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
114 static void gcc_print_lrshift(int op, int type, int bits, int size) |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
115 { |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
116 printf("\tvec1.gcc = (__typeof__(vec1.gcc))((vec_uint%d __attribute__((__vector_size__(%d))))vec1.gcc >> vec2.gcc);\n", bits, bits * size / 8); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
117 printf("\treturn vec1;\n"); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
118 } |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
119 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
120 static void gcc_print_minmax(int op, int type, int bits, int size) |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
121 { |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
122 static const char *op_builtins[] = { |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
123 [OP_MIN] = "<", |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
124 [OP_MAX] = ">" |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
125 }; |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
126 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
127 switch (type) { |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
128 case TYPE_INT: |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
129 case TYPE_UINT: |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
130 /* yay */ |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
131 printf("\t"); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
132 gen_print_vtype(type, bits, size); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
133 printf(" mask;\n"); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
134 printf("\tmask.gcc = (vec1.gcc %s vec2.gcc);\n", op_builtins[op]); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
135 printf("\tvec1.gcc = (vec1.gcc & mask.gcc) | (vec2.gcc & ~mask.gcc);\n"); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
136 printf("\treturn vec1;\n"); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
137 break; |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
138 default: |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
139 /* hm? */ |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
140 break; |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
141 } |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
142 } |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
143 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
144 static void gcc_print_avg(int op, int type, int bits, int size) |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
145 { |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
146 switch (type) { |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
147 case TYPE_INT: |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
148 printf("\tvint%dx%d ones = vint%dx%d_splat(1);\n", bits, size, bits, size); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
149 puts("\t__typeof__(vec1.gcc) x_d_rem = (vec1.gcc % 2);"); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
150 puts("\t__typeof__(vec1.gcc) y_d_rem = (vec2.gcc % 2);"); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
151 puts("\t__typeof__(vec1.gcc) rem_d_quot = ((x_d_rem + y_d_rem) / 2);"); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
152 puts("\t__typeof__(vec1.gcc) rem_d_rem = ((x_d_rem + y_d_rem) % 2);"); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
153 puts(""); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
154 printf("\tvec1.gcc = ((vec1.gcc / 2) + (vec2.gcc / 2)) + (rem_d_quot) + ((rem_d_rem == 1) & ones.gcc);\n"); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
155 break; |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
156 case TYPE_UINT: |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
157 printf("\tvec1.gcc = (vec1.gcc >> 1) + (vec2.gcc >> 1) + ((vec1.gcc | vec2.gcc) & 1);\n"); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
158 break; |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
159 case TYPE_FLOAT: |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
160 printf("\tvec1.gcc = (vec1.gcc + vec2.gcc) / 2;\n"); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
161 break; |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
162 } |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
163 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
164 printf("\treturn vec1;\n"); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
165 } |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
166 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
167 static void gcc_print_not(int op, int type, int bits, int size) |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
168 { |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
169 printf("\tvec.gcc = ~vec.gcc;\n"); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
170 printf("\treturn vec;\n"); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
171 } |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
172 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
173 /* ------------------------------------------------------------------------ */ |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
174 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
175 static struct op_impl op_impl[OP_FINAL_] = { |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
176 [OP_SPLAT] = {NULL, NULL, gcc_print_splat}, |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
177 [OP_LOAD_ALIGNED] = {NULL, NULL, gcc_print_load_aligned}, |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
178 [OP_LOAD] = {NULL, NULL, gcc_print_load}, |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
179 [OP_STORE_ALIGNED] = {NULL, NULL, gcc_print_store_aligned}, |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
180 [OP_STORE] = {NULL, NULL, gcc_print_store}, |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
181 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
182 /* arithmetic */ |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
183 [OP_ADD] = {NULL, NULL, gcc_print_easy_op}, |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
184 [OP_SUB] = {NULL, NULL, gcc_print_easy_op}, |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
185 [OP_MUL] = {NULL, NULL, gcc_print_easy_op}, |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
186 #if 0 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
187 /* no defined divide by zero behavior */ |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
188 [OP_DIV] = {NULL, NULL, gcc_print_easy_op}, |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
189 [OP_MOD] = {NULL, NULL, gcc_print_easy_op}, |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
190 #endif |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
191 [OP_AVG] = {NULL, pp_gcc_prereq_4_3_0, gcc_print_avg}, |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
192 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
193 /* bitwise */ |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
194 [OP_AND] = {NULL, NULL, gcc_print_easy_op}, |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
195 [OP_OR] = {NULL, NULL, gcc_print_easy_op}, |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
196 [OP_XOR] = {NULL, NULL, gcc_print_easy_op}, |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
197 [OP_NOT] = {NULL, NULL, gcc_print_not}, |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
198 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
199 /* min/max */ |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
200 [OP_MIN] = {gcc_minmax_only_integer, pp_gcc_prereq_4_3_0, gcc_print_minmax}, |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
201 [OP_MAX] = {gcc_minmax_only_integer, pp_gcc_prereq_4_3_0, gcc_print_minmax}, |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
202 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
203 /* bitshift */ |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
204 [OP_LSHIFT] = {NULL, pp_gcc_prereq_4_3_0, gcc_print_rorlshift}, |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
205 [OP_LRSHIFT] = {NULL, pp_gcc_prereq_4_3_0, gcc_print_lrshift}, |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
206 [OP_RSHIFT] = {NULL, pp_gcc_prereq_4_3_0, gcc_print_rorlshift}, |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
207 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
208 /* comparison */ |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
209 [OP_CMPLT] = {NULL, pp_gcc_prereq_4_3_0, gcc_print_easy_op}, |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
210 [OP_CMPLE] = {NULL, pp_gcc_prereq_4_3_0, gcc_print_easy_op}, |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
211 [OP_CMPEQ] = {NULL, pp_gcc_prereq_4_3_0, gcc_print_easy_op}, |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
212 [OP_CMPGE] = {NULL, pp_gcc_prereq_4_3_0, gcc_print_easy_op}, |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
213 [OP_CMPGT] = {NULL, pp_gcc_prereq_4_3_0, gcc_print_easy_op}, |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
214 }; |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
215 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
216 int main(void) |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
217 { |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
218 gen(op_impl, "gcc"); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
219 } |