comparison gen/genlib.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
109 printf(" x[%d]", size); 109 printf(" x[%d]", size);
110 110
111 (void)op; 111 (void)op;
112 } 112 }
113 113
114 struct op_info ops[] = { 114 struct op_info ops[OP_FINAL_] = {
115 [OP_SPLAT] = {"SPLAT", "splat", vret, vsplatparam}, 115 [OP_SPLAT] = {"SPLAT", "splat", vret, vsplatparam},
116 [OP_LOAD_ALIGNED] = {"LOAD_ALIGNED", "load_aligned", vret, vloadparam}, 116 [OP_LOAD_ALIGNED] = {"LOAD_ALIGNED", "load_aligned", vret, vloadparam},
117 [OP_LOAD] = {"LOAD", "load", vret, vloadparam}, 117 [OP_LOAD] = {"LOAD", "load", vret, vloadparam},
118 [OP_STORE_ALIGNED] = {"STORE_ALIGNED", "store_aligned", nret, vstoreparam}, 118 [OP_STORE_ALIGNED] = {"STORE_ALIGNED", "store_aligned", nret, vstoreparam},
119 [OP_STORE] = {"STORE", "store", nret, vstoreparam}, 119 [OP_STORE] = {"STORE", "store", nret, vstoreparam},
135 [OP_MIN] = {"MIN", "min", vret, vtwoparam}, 135 [OP_MIN] = {"MIN", "min", vret, vtwoparam},
136 [OP_MAX] = {"MAX", "max", vret, vtwoparam}, 136 [OP_MAX] = {"MAX", "max", vret, vtwoparam},
137 [OP_RSHIFT] = {"RSHIFT", "rshift", vret, vshiftparam}, 137 [OP_RSHIFT] = {"RSHIFT", "rshift", vret, vshiftparam},
138 [OP_LRSHIFT] = {"LRSHIFT", "lrshift", vret, vshiftparam}, 138 [OP_LRSHIFT] = {"LRSHIFT", "lrshift", vret, vshiftparam},
139 [OP_LSHIFT] = {"LSHIFT", "lshift", vret, vshiftparam}, 139 [OP_LSHIFT] = {"LSHIFT", "lshift", vret, vshiftparam},
140
141 /* floating-point specific operations */
142 [OP_FLOOR] = {"FLOOR", "floor", vret, voneparam},
143 [OP_CEIL] = {"CEIL", "ceil", vret, voneparam},
144 [OP_ROUND] = {"ROUND", "round", vret, voneparam},
145 [OP_TRUNC] = {"TRUNC", "trunc", vret, voneparam},
140 }; 146 };
141 147
142 struct op_info *gen_op_info(int op) 148 struct op_info *gen_op_info(int op)
143 { 149 {
144 return &ops[op]; 150 return &ops[op];
166 case OP_LRSHIFT: 172 case OP_LRSHIFT:
167 /* these operations make no sense for floating point */ 173 /* these operations make no sense for floating point */
168 if (type == TYPE_FLOAT) 174 if (type == TYPE_FLOAT)
169 return 0; 175 return 0;
170 break; 176 break;
177 case OP_FLOOR:
178 case OP_CEIL:
179 case OP_ROUND:
180 /* likewise, these operations make no sense for integer types */
181 if (type != TYPE_FLOAT)
182 return 0;
183 break;
171 } 184 }
172 185
173 return 1; 186 return 1;
174 } 187 }
175 188
176 /* XXX: would it be faster to unroll literally everything instead of defining everything,
177 * and then unpacking it all? */
178 static const char *header_tmpl = 189 static const char *header_tmpl =
179 "/**\n" 190 "/**\n"
180 " * vec - a tiny SIMD vector library in C99\n" 191 " * vec - a tiny SIMD vector library in C99\n"
181 " * \n" 192 " * \n"
182 " * Copyright (c) 2024-2025 Paper\n" 193 " * Copyright (c) 2024-2025 Paper\n"