Mercurial > vec
diff utils/gengeneric.c @ 41:c6e0df09b86f default tip
*: performance improvements with old GCC, reimplement altivec
author | Paper <paper@tflc.us> |
---|---|
date | Mon, 28 Apr 2025 16:31:59 -0400 |
parents | 55cadb1fac4b |
children |
line wrap: on
line diff
--- a/utils/gengeneric.c Sun Apr 27 02:49:53 2025 -0400 +++ b/utils/gengeneric.c Mon Apr 28 16:31:59 2025 -0400 @@ -147,7 +147,7 @@ " VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_avg(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \\\n" " { \\\n" " for (int i = 0; i < size; i++) \\\n" - " vec1.generic[i] = vec_##sign##avg(vec1.generic[i], vec2.generic[i]); \\\n" + " vec1.generic[i] = vec_im##sign##avg(vec1.generic[i], vec2.generic[i]); \\\n" " \\\n" " return vec1; \\\n" " }\n" @@ -246,79 +246,6 @@ " return v##sign##int##bits##x##size##_or(a, b); \\\n" " }\n" "\n" - "#define VEC_GENERIC_DBL_SPLAT(sign, bits, size, halfsize) \\\n" - " VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_splat(vec_##sign##int##bits x) \\\n" - " { \\\n" - " v##sign##int##bits##x##size vec; \\\n" - " \\\n" - " vec.generic[0] = v##sign##int##bits##x##halfsize##_splat(x); \\\n" - " vec.generic[1] = v##sign##int##bits##x##halfsize##_splat(x); \\\n" - " \\\n" - " return vec; \\\n" - " }\n" - "\n" - "#define VEC_GENERIC_DBL_LOAD_EX(name, sign, bits, size, halfsize) \\\n" - " VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_##name(const vec_##sign##int##bits x[size]) \\\n" - " { \\\n" - " v##sign##int##bits##x##size vec; \\\n" - " \\\n" - " vec.generic[0] = v##sign##int##bits##x##halfsize##_##name(x); \\\n" - " vec.generic[1] = v##sign##int##bits##x##halfsize##_##name(x + halfsize); \\\n" - " \\\n" - " return vec; \\\n" - " }\n" - "\n" - "#define VEC_GENERIC_DBL_LOAD(sign, bits, size, halfsize) VEC_GENERIC_DBL_LOAD_EX(load, sign, bits, size, halfsize)\n" - "#define VEC_GENERIC_DBL_LOAD_ALIGNED(sign, bits, size, halfsize) VEC_GENERIC_DBL_LOAD_EX(load_aligned, sign, bits, size, halfsize)\n" - "\n" - "#define VEC_GENERIC_DBL_STORE_EX(name, sign, bits, size, halfsize) \\\n" - " VEC_FUNC_IMPL void v##sign##int##bits##x##size##_##name(v##sign##int##bits##x##size vec, vec_##sign##int##bits x[size]) \\\n" - " { \\\n" - " v##sign##int##bits##x##halfsize##_##name(vec.generic[0], x); \\\n" - " v##sign##int##bits##x##halfsize##_##name(vec.generic[1], x + halfsize); \\\n" - " }\n" - "\n" - "#define VEC_GENERIC_DBL_STORE(sign, bits, size, halfsize) VEC_GENERIC_DBL_STORE_EX(store, sign, bits, size, halfsize)\n" - "#define VEC_GENERIC_DBL_STORE_ALIGNED(sign, bits, size, halfsize) VEC_GENERIC_DBL_STORE_EX(store_aligned, sign, bits, size, halfsize)\n" - "\n" - "#define VEC_GENERIC_DBL_OP(name, sign, bits, size, halfsize, secondsign) \\\n" - " VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_##name(v##sign##int##bits##x##size vec1, v##secondsign##int##bits##x##size vec2) \\\n" - " { \\\n" - " vec1.generic[0] = v##sign##int##bits##x##halfsize##_##name(vec1.generic[0], vec2.generic[0]); \\\n" - " vec1.generic[1] = v##sign##int##bits##x##halfsize##_##name(vec1.generic[1], vec2.generic[1]); \\\n" - " \\\n" - " return vec1; \\\n" - " }\n" - "\n" - "#define VEC_GENERIC_DBL_ADD(sign, bits, size, halfsize) VEC_GENERIC_DBL_OP(add, sign, bits, size, halfsize, sign)\n" - "#define VEC_GENERIC_DBL_SUB(sign, bits, size, halfsize) VEC_GENERIC_DBL_OP(sub, sign, bits, size, halfsize, sign)\n" - "#define VEC_GENERIC_DBL_MUL(sign, bits, size, halfsize) VEC_GENERIC_DBL_OP(mul, sign, bits, size, halfsize, sign)\n" - "#define VEC_GENERIC_DBL_DIV(sign, bits, size, halfsize) VEC_GENERIC_DBL_OP(div, sign, bits, size, halfsize, sign)\n" - "#define VEC_GENERIC_DBL_MOD(sign, bits, size, halfsize) VEC_GENERIC_DBL_OP(mod, sign, bits, size, halfsize, sign)\n" - "#define VEC_GENERIC_DBL_AVG(sign, bits, size, halfsize) VEC_GENERIC_DBL_OP(avg, sign, bits, size, halfsize, sign)\n" - "#define VEC_GENERIC_DBL_LSHIFT(sign, bits, size, halfsize) VEC_GENERIC_DBL_OP(lshift, sign, bits, size, halfsize, u)\n" - "#define VEC_GENERIC_DBL_RSHIFT(sign, bits, size, halfsize) VEC_GENERIC_DBL_OP(rshift, sign, bits, size, halfsize, u)\n" - "#define VEC_GENERIC_DBL_LRSHIFT(sign, bits, size, halfsize) VEC_GENERIC_DBL_OP(lrshift, sign, bits, size, halfsize, u)\n" - "#define VEC_GENERIC_DBL_AND(sign, bits, size, halfsize) VEC_GENERIC_DBL_OP(and, sign, bits, size, halfsize, sign)\n" - "#define VEC_GENERIC_DBL_OR(sign, bits, size, halfsize) VEC_GENERIC_DBL_OP(or, sign, bits, size, halfsize, sign)\n" - "#define VEC_GENERIC_DBL_XOR(sign, bits, size, halfsize) VEC_GENERIC_DBL_OP(xor, sign, bits, size, halfsize, sign)\n" - "#define VEC_GENERIC_DBL_MIN(sign, bits, size, halfsize) VEC_GENERIC_DBL_OP(min, sign, bits, size, halfsize, sign)\n" - "#define VEC_GENERIC_DBL_MAX(sign, bits, size, halfsize) VEC_GENERIC_DBL_OP(max, sign, bits, size, halfsize, sign)\n" - "#define VEC_GENERIC_DBL_CMPLT(sign, bits, size, halfsize) VEC_GENERIC_DBL_OP(cmplt, sign, bits, size, halfsize, sign)\n" - "#define VEC_GENERIC_DBL_CMPLE(sign, bits, size, halfsize) VEC_GENERIC_DBL_OP(cmple, sign, bits, size, halfsize, sign)\n" - "#define VEC_GENERIC_DBL_CMPEQ(sign, bits, size, halfsize) VEC_GENERIC_DBL_OP(cmpeq, sign, bits, size, halfsize, sign)\n" - "#define VEC_GENERIC_DBL_CMPGE(sign, bits, size, halfsize) VEC_GENERIC_DBL_OP(cmpge, sign, bits, size, halfsize, sign)\n" - "#define VEC_GENERIC_DBL_CMPGT(sign, bits, size, halfsize) VEC_GENERIC_DBL_OP(cmpgt, sign, bits, size, halfsize, sign)\n" - "\n" - "#define VEC_GENERIC_DBL_NOT(sign, bits, size, halfsize) \\\n" - " VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_not(v##sign##int##bits##x##size vec) \\\n" - " { \\\n" - " vec.generic[0] = v##sign##int##bits##x##halfsize##_not(vec.generic[0]); \\\n" - " vec.generic[1] = v##sign##int##bits##x##halfsize##_not(vec.generic[1]); \\\n" - " \\\n" - " return vec; \\\n" - " }\n" - "\n" "/* ------------------------------------------------------------------------ */\n" "/* PREPROCESSOR HELL INCOMING */\n"; @@ -337,16 +264,6 @@ (is_signed ? "" : "U"), bits, size, op, op, (is_signed ? "/* nothing */" : "u"), bits, size, (is_signed ? "" : "U"), bits, size, op); } -static void print_generic_dbl_op(const char *op, int is_signed, int bits, int size) -{ - printf( - "#ifndef V%sINT%dx%d_%s_DEFINED\n" - "VEC_GENERIC_DBL_%s(%s, %d, %d, %d)\n" - "# define V%sINT%dx%d_%s_DEFINED\n" - "#endif\n\n", - (is_signed ? "" : "U"), bits, size, op, op, (is_signed ? "/* nothing */" : "u"), bits, size, size / 2, (is_signed ? "" : "U"), bits, size, op); -} - typedef void (*print_op_spec)(const char *op, int is_signed, int bits, int size); static inline void print_ops(int is_signed, int bits, int size, print_op_spec print_op) @@ -396,29 +313,15 @@ } defs[] = { /* -- 8-bit */ {8, 2, print_generic_op}, - {8, 4, print_generic_dbl_op}, - {8, 8, print_generic_dbl_op}, - {8, 16, print_generic_dbl_op}, - {8, 32, print_generic_dbl_op}, - {8, 64, print_generic_dbl_op}, /* -- 16-bit */ {16, 2, print_generic_op}, - {16, 4, print_generic_dbl_op}, - {16, 8, print_generic_dbl_op}, - {16, 16, print_generic_dbl_op}, - {16, 32, print_generic_dbl_op}, /* -- 32-bit */ {32, 2, print_generic_op}, - {32, 4, print_generic_dbl_op}, - {32, 8, print_generic_dbl_op}, - {32, 16, print_generic_dbl_op}, /* -- 64-bit */ {64, 2, print_generic_op}, - {64, 4, print_generic_dbl_op}, - {64, 8, print_generic_dbl_op}, }; int i;