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"); |
