Mercurial > vec
comparison gen/gengeneric.c @ 46:31cee67540b5
f32/f64: add floor, ceil, round, and trunc operations
we also need saturated add sub mul etc
author | Paper <paper@tflc.us> |
---|---|
date | Sat, 09 Aug 2025 15:55:59 -0400 |
parents | 7955bed1d169 |
children |
comparison
equal
deleted
inserted
replaced
45:7955bed1d169 | 46:31cee67540b5 |
---|---|
128 "\tvec1.generic[%d] = x.s;\n", | 128 "\tvec1.generic[%d] = x.s;\n", |
129 i, ops[op], i, i); | 129 i, ops[op], i, i); |
130 break; | 130 break; |
131 } | 131 } |
132 case OP_RSHIFT: | 132 case OP_RSHIFT: |
133 /* ehhhh this feels weird ... */ | |
133 for (i = 0; i < size; i++) | 134 for (i = 0; i < size; i++) |
134 printf("vec1.generic[%d] = ((~vec1.generic[%d]) >> vec2.generic[%d]);\n", i, i, i); | 135 printf("vec1.generic[%d] = ((~vec1.generic[%d]) >> vec2.generic[%d]);\n", i, i, i); |
135 break; | 136 break; |
136 } | 137 } |
137 break; | 138 break; |
149 }; | 150 }; |
150 int i; | 151 int i; |
151 | 152 |
152 if (op == OP_MOD && type == TYPE_FLOAT) { | 153 if (op == OP_MOD && type == TYPE_FLOAT) { |
153 for (i = 0; i < size; i++) | 154 for (i = 0; i < size; i++) |
154 printf("\tvec1.generic[%d] = (vec2.generic[%d] ? fmod(vec1.generic[%d], vec2.generic[%d]) : 0);\n", i, i, i, i); | 155 printf("\tvec1.generic[%d] = (vec2.generic[%d] ? fmod%s(vec1.generic[%d], vec2.generic[%d]) : 0);\n", i, i, (bits == 32) ? "f" : "", i, i); |
155 } else { | 156 } else { |
156 for (i = 0; i < size; i++) | 157 for (i = 0; i < size; i++) |
157 printf("\tvec1.generic[%d] = (vec2.generic[%d] ? (vec1.generic[%d] %s vec2.generic[%d]) : 0);\n", i, i, i, ops[op], i); | 158 printf("\tvec1.generic[%d] = (vec2.generic[%d] ? (vec1.generic[%d] %s vec2.generic[%d]) : 0);\n", i, i, i, ops[op], i); |
158 } | 159 } |
159 | 160 |
222 } | 223 } |
223 | 224 |
224 static void op_store_pbody(int op, int type, int bits, int size) | 225 static void op_store_pbody(int op, int type, int bits, int size) |
225 { | 226 { |
226 printf("\tmemcpy(x, vec.generic, %d);\n", (bits / 8) * size); | 227 printf("\tmemcpy(x, vec.generic, %d);\n", (bits / 8) * size); |
228 } | |
229 | |
230 static void op_fmath_pbody(int op, int type, int bits, int size) | |
231 { | |
232 static const char *ops[OP_FINAL_] = { | |
233 [OP_FLOOR] = "floor", | |
234 [OP_CEIL] = "ceil", | |
235 [OP_ROUND] = "round", | |
236 [OP_TRUNC] = "trunc", | |
237 }; | |
238 int i; | |
239 | |
240 for (i = 0; i < size; i++) | |
241 printf("\tvec.generic[%d] = %s%s(vec.generic[%d]);\n", i, ops[op], (bits == 32) ? "f" : "", i); | |
242 | |
243 puts("\treturn vec;"); | |
227 } | 244 } |
228 | 245 |
229 /* ------------------------------------------------------------------------ */ | 246 /* ------------------------------------------------------------------------ */ |
230 | 247 |
231 static struct op_impl op_impl[OP_FINAL_] = { | 248 static struct op_impl op_impl[OP_FINAL_] = { |
262 [OP_CMPLT] = {NULL, NULL, op_cmp_pbody}, | 279 [OP_CMPLT] = {NULL, NULL, op_cmp_pbody}, |
263 [OP_CMPLE] = {NULL, NULL, op_cmp_pbody}, | 280 [OP_CMPLE] = {NULL, NULL, op_cmp_pbody}, |
264 [OP_CMPEQ] = {NULL, NULL, op_cmp_pbody}, | 281 [OP_CMPEQ] = {NULL, NULL, op_cmp_pbody}, |
265 [OP_CMPGE] = {NULL, NULL, op_cmp_pbody}, | 282 [OP_CMPGE] = {NULL, NULL, op_cmp_pbody}, |
266 [OP_CMPGT] = {NULL, NULL, op_cmp_pbody}, | 283 [OP_CMPGT] = {NULL, NULL, op_cmp_pbody}, |
284 | |
285 [OP_FLOOR] = {NULL, NULL, op_fmath_pbody}, | |
286 [OP_ROUND] = {NULL, NULL, op_fmath_pbody}, | |
287 [OP_CEIL] = {NULL, NULL, op_fmath_pbody}, | |
288 [OP_TRUNC] = {NULL, NULL, op_fmath_pbody}, | |
267 }; | 289 }; |
268 | 290 |
269 int main(void) | 291 int main(void) |
270 { | 292 { |
271 gen(op_impl, "generic"); | 293 gen(op_impl, "generic"); |