Mercurial > vec
diff gen/genlib.h @ 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gen/genlib.h Wed Apr 30 18:36:38 2025 -0400 @@ -0,0 +1,108 @@ +/** + * vec - a tiny SIMD vector library in C99 + * + * Copyright (c) 2024-2025 Paper + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. +**/ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +enum { + OP_SPLAT, + OP_LOAD_ALIGNED, + OP_LOAD, + OP_STORE_ALIGNED, + OP_STORE, + OP_ADD, + OP_SUB, + OP_MUL, + OP_DIV, + OP_MOD, + OP_AVG, + OP_AND, + OP_OR, + OP_XOR, + OP_NOT, + OP_CMPLT, + OP_CMPEQ, + OP_CMPGT, + OP_CMPLE, /* these are after the other ones to make */ + OP_CMPGE, /* implementing them as simple as NOT(CMPLT|CMPGT) */ + OP_MIN, + OP_MAX, + OP_RSHIFT, + OP_LRSHIFT, + OP_LSHIFT, + + /* use this for array sizes and the like */ + OP_FINAL_, +}; + +enum { + TYPE_INT, /* signed int */ + TYPE_UINT, /* unsigned int */ + TYPE_FLOAT, /* IEEE float */ +}; + +struct op_info { + const char *u; + const char *l; + + /* print return type to stdout */ + void (*pret)(int op, int type, int bits, int size); + + /* print params type to stdout */ + void (*pparam)(int op, int type, int bits, int size); +}; + +struct strs { + const char *l; + const char *u; +}; + +extern struct strs type_str[]; + +struct op_info *gen_op_info(int op); + +struct op_impl { + /* return 1 if it's implemented for a specific set of + * inputs :) + * + * if this function is not implemented, and `pbody` + * is not NULL, then it is assumed that there are + * no restrictions on what type, bits, or size can + * be used. beware! */ + int (*check)(int op, int type, int bits, int size); + + /* prints any additional preprocessor checks needed + * should start with a conditional, usually && */ + void (*ppcheck)(int op, int type, int bits, int size); + + /* sherman? + * (this prints the actual body of the function...) */ + void (*pbody)(int op, int type, int bits, int size); +}; + +int gen(struct op_impl op_impl[OP_FINAL_], const char *name); + +void gen_print_vtype(int type, int bits, int size); +void gen_print_stype(int type, int bits);