Mercurial > vec
annotate gen/genaltivec.c @ 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 |
rev | line source |
---|---|
45
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
1 /** |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
2 * vec - a tiny SIMD vector library in C99 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
3 * |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
4 * Copyright (c) 2024-2025 Paper |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
5 * |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
6 * Permission is hereby granted, free of charge, to any person obtaining a copy |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
7 * of this software and associated documentation files (the "Software"), to deal |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
8 * in the Software without restriction, including without limitation the rights |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
10 * copies of the Software, and to permit persons to whom the Software is |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
11 * furnished to do so, subject to the following conditions: |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
12 * |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
13 * The above copyright notice and this permission notice shall be included in all |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
14 * copies or substantial portions of the Software. |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
15 * |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
22 * SOFTWARE. |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
23 **/ |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
24 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
25 #include "genlib.h" |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
26 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
27 #define ARRAY_SIZE(x) (sizeof(x)/sizeof((x)[0])) |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
28 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
29 /* ------------------------------------------------------------------------ */ |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
30 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
31 /* #define USE_VSX_EXTENSIONS */ |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
32 /* #define USE_POWER8_EXTENSIONS */ |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
33 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
34 static int altivec_check(int op, int type, int bits, int size) |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
35 { |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
36 switch (bits) { |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
37 case 8: |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
38 case 16: |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
39 case 32: |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
40 #ifdef USE_VSX_EXTENSIONS |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
41 case 64: |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
42 # ifndef USE_POWER8_EXTENSIONS |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
43 /* VSX has double, but not int64 */ |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
44 if ((bits == 64) && (type != TYPE_FLOAT)) |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
45 return 0; |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
46 # endif |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
47 #endif |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
48 if (bits * size == 128) |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
49 return 1; |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
50 default: |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
51 break; |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
52 } |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
53 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
54 return 0; |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
55 } |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
56 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
57 static int altivec_check_int(int op, int type, int bits, int size) |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
58 { |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
59 return (altivec_check(op, type, bits, size) && type != TYPE_FLOAT); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
60 } |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
61 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
62 static int altivec_check_float(int op, int type, int bits, int size) |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
63 { |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
64 return (altivec_check(op, type, bits, size) && type == TYPE_FLOAT); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
65 } |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
66 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
67 static void altivec_ppcheck(int op, int type, int bits, int size) |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
68 { |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
69 /* old gcc had a broken partial implementation |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
70 * (why even bother adding it at all?) */ |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
71 switch (op) { |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
72 case OP_MUL: printf("defined(vec_mul)"); break; |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
73 case OP_SPLAT: printf("defined(vec_splats)"); break; |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
74 } |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
75 } |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
76 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
77 static void altivec_splat(int op, int type, int bits, int size) |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
78 { |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
79 printf("\t"); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
80 gen_print_vtype(type, bits, size); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
81 printf(" vec;\n"); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
82 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
83 puts("\tvec.altivec = vec_splats(x);"); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
84 puts("\treturn vec;"); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
85 } |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
86 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
87 static void altivec_load(int op, int type, int bits, int size) |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
88 { |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
89 printf("\t"); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
90 gen_print_vtype(type, bits, size); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
91 printf(" vec;\n"); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
92 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
93 puts("\tvec.altivec = vec_perm(vec_ld(0, x), vec_ld(16, x), vec_lvsl(0, x));"); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
94 puts("\treturn vec;"); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
95 } |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
96 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
97 static void altivec_load_aligned(int op, int type, int bits, int size) |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
98 { |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
99 printf("\t"); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
100 gen_print_vtype(type, bits, size); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
101 printf(" vec;\n"); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
102 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
103 puts("\tvec.altivec = vec_ld(0, x);"); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
104 puts("\treturn vec;"); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
105 } |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
106 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
107 static void altivec_store_aligned(int op, int type, int bits, int size) |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
108 { |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
109 puts("\tvec_st(vec.altivec, 0, x);"); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
110 } |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
111 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
112 /* no store? */ |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
113 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
114 static void altivec_print_native_type(int type, int bits) |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
115 { |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
116 /* WITH DIRECTION AND MAGNITUDE! */ |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
117 printf("vector "); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
118 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
119 switch (type) { |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
120 case TYPE_INT: |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
121 printf("signed "); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
122 break; |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
123 case TYPE_UINT: |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
124 printf("unsigned "); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
125 break; |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
126 case TYPE_FLOAT: |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
127 /* nothing */ |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
128 break; |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
129 } |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
130 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
131 switch (type) { |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
132 case TYPE_INT: |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
133 case TYPE_UINT: |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
134 switch (bits) { |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
135 case 8: printf("char"); break; |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
136 case 16: printf("short"); break; |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
137 case 32: printf("int"); break; |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
138 case 64: printf("long long"); break; |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
139 default: break; |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
140 } |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
141 break; |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
142 case TYPE_FLOAT: |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
143 switch (bits) { |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
144 case 32: printf("float"); break; |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
145 case 64: printf("double"); break; |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
146 default: break; |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
147 } |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
148 } |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
149 } |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
150 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
151 static void altivec_2op(int op, int type, int bits, int size) |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
152 { |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
153 static const char *op_altivec[] = { |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
154 [OP_ADD] = "add", |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
155 [OP_SUB] = "sub", |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
156 [OP_MUL] = "mul", |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
157 [OP_DIV] = "div", |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
158 [OP_MOD] = "mod", |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
159 [OP_AND] = "and", |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
160 [OP_OR] = "or", |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
161 [OP_XOR] = "xor", |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
162 [OP_CMPLT] = "cmplt", |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
163 [OP_CMPEQ] = "cmpeq", |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
164 [OP_CMPGT] = "cmpgt", |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
165 [OP_CMPLE] = "cmple", |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
166 [OP_CMPGE] = "cmpge", |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
167 [OP_MIN] = "min", |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
168 [OP_MAX] = "max", |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
169 [OP_AVG] = "avg", |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
170 [OP_LSHIFT] = "sl", |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
171 [OP_LRSHIFT] = "sr", |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
172 }; |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
173 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
174 printf("\t"); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
175 gen_print_vtype(type, bits, size); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
176 printf(" vec;\n"); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
177 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
178 if (op == OP_RSHIFT) { |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
179 printf("\tvec.altivec = vec_sr%s(vec1.altivec, vec2.altivec);\n", (type == TYPE_INT) ? "a" : ""); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
180 } else { |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
181 printf("\tvec.altivec = ("); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
182 altivec_print_native_type(type, bits); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
183 printf(")vec_%s(vec1.altivec, vec2.altivec);\n", op_altivec[op]); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
184 } |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
185 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
186 puts("\treturn vec;"); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
187 } |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
188 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
189 /* ------------------------------------------------------------------------ */ |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
190 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
191 static struct op_impl op_impl[OP_FINAL_] = { |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
192 [OP_SPLAT] = {altivec_check, NULL, altivec_splat}, |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
193 [OP_LOAD_ALIGNED] = {altivec_check, NULL, altivec_load_aligned}, |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
194 [OP_LOAD] = {altivec_check, NULL, altivec_load}, |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
195 [OP_STORE_ALIGNED] = {altivec_check, NULL, altivec_store_aligned}, |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
196 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
197 /* arithmetic */ |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
198 [OP_ADD] = {altivec_check, NULL, altivec_2op}, |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
199 [OP_SUB] = {altivec_check, NULL, altivec_2op}, |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
200 [OP_MUL] = {altivec_check, NULL, altivec_2op}, |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
201 #ifdef USE_VSX_EXTENSIONS |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
202 /* GCC fails to compile integer division, so limit to floats */ |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
203 [OP_DIV] = {altivec_check_float, NULL, altivec_2op}, |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
204 #endif |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
205 #if 0 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
206 /* This is Power10. I don't have any Power10 hardware :) |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
207 * (well, I also don't have any VSX hardware. whatever) */ |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
208 [OP_MOD] = {altivec_check_int, NULL, altivec_2op}, |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
209 #endif |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
210 [OP_AVG] = {altivec_check_int, NULL, altivec_2op}, |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
211 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
212 /* bitwise */ |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
213 [OP_AND] = {altivec_check, NULL, altivec_2op}, |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
214 [OP_OR] = {altivec_check, NULL, altivec_2op}, |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
215 [OP_XOR] = {altivec_check, NULL, altivec_2op}, |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
216 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
217 /* min/max */ |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
218 [OP_MIN] = {altivec_check, NULL, altivec_2op}, |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
219 [OP_MAX] = {altivec_check, NULL, altivec_2op}, |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
220 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
221 /* bitshift */ |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
222 [OP_LSHIFT] = {altivec_check, NULL, altivec_2op}, |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
223 [OP_LRSHIFT] = {altivec_check, NULL, altivec_2op}, |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
224 [OP_RSHIFT] = {altivec_check, NULL, altivec_2op}, |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
225 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
226 /* comparison */ |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
227 [OP_CMPLT] = {altivec_check, NULL, altivec_2op}, |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
228 #ifdef USE_VSX_EXTENSIONS |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
229 [OP_CMPLE] = {altivec_check, NULL, altivec_2op}, |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
230 #endif |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
231 [OP_CMPEQ] = {altivec_check, NULL, altivec_2op}, |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
232 #ifdef USE_VSX_EXTENSIONS |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
233 [OP_CMPGE] = {altivec_check, NULL, altivec_2op}, |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
234 #endif |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
235 [OP_CMPGT] = {altivec_check, NULL, altivec_2op}, |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
236 }; |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
237 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
238 |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
239 int main(void) |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
240 { |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
241 gen(op_impl, |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
242 #ifdef USE_POWER8_EXTENSIONS |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
243 "power8" |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
244 #elif defined(USE_VSX_EXTENSIONS) |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
245 "vsx" |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
246 #else |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
247 "altivec" |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
248 #endif |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
249 ); |
7955bed1d169
*: add preliminary floating point support
Paper <paper@tflc.us>
parents:
diff
changeset
|
250 } |