1function codegen_binop
2%CODEGEN_BINOP create functions for all binary operators
3%
4% This function creates all files of the form GB_binop__*.[ch], including 260
5% functions (GB_binop__*.c) and one include file, GB_binop__include.h.
6
7% SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2021, All Rights Reserved.
8% SPDX-License-Identifier: Apache-2.0
9
10fprintf ('\nbinary operators:\n') ;
11
12f = fopen ('Generated/GB_binop__include.h', 'w') ;
13fprintf (f, '//------------------------------------------------------------------------------\n') ;
14fprintf (f, '// GB_binop__include.h: definitions for GB_binop__*.c\n') ;
15fprintf (f, '//------------------------------------------------------------------------------\n') ;
16fprintf (f, '\n') ;
17fprintf (f, '// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2021, All Rights Reserved.\n') ;
18fprintf (f, '// SPDX-License-Identifier: Apache-2.0\n\n') ;
19fprintf (f, '// This file has been automatically generated from Generator/GB_binop.h') ;
20fprintf (f, '\n\n') ;
21fclose (f) ;
22
23% The ANY operator is not used as a binary operator in the generated functions.
24% It can be used as the binary op in eWiseAdd, eWiseMult, etc, but has been
25% renamed to SECOND before calling the generated function.
26
27codegen_binop_template ('first',        ...
28    'xarg',                             ... % bool
29    'xarg',                             ... % int, uint
30    'xarg',                             ... % float
31    'xarg',                             ... % double
32    'xarg',                             ... % GxB_FC32_t
33    'xarg') ;                           ... % GxB_FC64_t
34
35codegen_binop_template ('second',       ...
36    'yarg',                             ... % bool
37    'yarg',                             ... % int, uint
38    'yarg',                             ... % float
39    'yarg',                             ... % double
40    'yarg',                             ... % GxB_FC32_t
41    'yarg') ;                           ... % GxB_FC64_t
42
43codegen_binop_template ('pair',         ...
44    '1',                                ... % bool
45    '1',                                ... % int, uint
46    '1',                                ... % float
47    '1',                                ... % double
48    'GxB_CMPLXF(1,0)',                  ... % GxB_FC32_t
49    'GxB_CMPLX(1,0)') ;                 ... % GxB_FC64_t
50
51codegen_binop_template ('min',          ...
52    [ ],                                ... % bool
53    'GB_IMIN (xarg, yarg)',             ... % int, uint
54    'fminf (xarg, yarg)',               ... % float
55    'fmin (xarg, yarg)',                ... % double
56    [ ],                                ... % GxB_FC32_t
57    [ ]) ;                              ... % GxB_FC64_t
58
59codegen_binop_template ('max',          ...
60    [ ],                                ... % bool
61    'GB_IMAX (xarg, yarg)',             ... % int, uint
62    'fmaxf (xarg, yarg)',               ... % float
63    'fmax (xarg, yarg)',                ... % double
64    [ ],                                ... % GxB_FC32_t
65    [ ]) ;                              ... % GxB_FC64_t
66
67codegen_binop_template ('plus',         ...
68    [ ],                                ... % bool
69    '(xarg + yarg)',                    ... % int, uint
70    '(xarg + yarg)',                    ... % float
71    '(xarg + yarg)',                    ... % double
72    'GB_FC32_add (xarg, yarg)',         ... % GxB_FC32_t
73    'GB_FC64_add (xarg, yarg)') ;       ... % GxB_FC64_t
74
75codegen_binop_template ('minus',        ...
76    [ ],                                ... % bool
77    '(xarg - yarg)',                    ... % int, uint
78    '(xarg - yarg)',                    ... % float
79    '(xarg - yarg)',                    ... % double
80    'GB_FC32_minus (xarg, yarg)',       ... % GxB_FC32_t
81    'GB_FC64_minus (xarg, yarg)') ;     ... % GxB_FC64_t
82
83codegen_binop_template ('rminus',       ...
84    [ ],                                ... % bool
85    '(yarg - xarg)',                    ... % int, uint
86    '(yarg - xarg)',                    ... % float
87    '(yarg - xarg)',                    ... % double
88    'GB_FC32_minus (yarg, xarg)',       ... % GxB_FC32_t
89    'GB_FC64_minus (yarg, xarg)') ;     ... % GxB_FC64_t
90
91codegen_binop_template ('times',        ...
92    [ ],                                ... % bool
93    '(xarg * yarg)',                    ... % int, uint
94    '(xarg * yarg)',                    ... % float
95    '(xarg * yarg)',                    ... % double
96    'GB_FC32_mul (xarg, yarg)',         ... % GxB_FC32_t
97    'GB_FC64_mul (xarg, yarg)') ;       ... % GxB_FC64_t
98
99codegen_binop_template ('div',          ...
100    [ ],                                ... % bool
101    'GB_IDIV (xarg, yarg)',             ... % int, uint
102    '(xarg / yarg)',                    ... % float
103    '(xarg / yarg)',                    ... % double
104    'GB_FC32_div (xarg, yarg)',         ... % GxB_FC32_t
105    'GB_FC64_div (xarg, yarg)') ;       ... % GxB_FC64_t
106
107codegen_binop_template ('rdiv',         ...
108    [ ],                                ... % bool
109    'GB_IDIV (yarg, xarg)',             ... % int, uint
110    '(yarg / xarg)',                    ... % float
111    '(yarg / xarg)',                    ... % double
112    'GB_FC32_div (yarg, xarg)',         ... % GxB_FC32_t
113    'GB_FC64_div (yarg, xarg)') ;       ... % GxB_FC64_t
114
115codegen_binop_template ('iseq',         ...
116    [ ],                                ... % bool
117    '(xarg == yarg)',                   ... % int, uint
118    '(xarg == yarg)',                   ... % float
119    '(xarg == yarg)',                   ... % double
120    'GB_FC32_iseq (xarg, yarg)',        ... % GxB_FC32_t
121    'GB_FC64_iseq (xarg, yarg)') ;      ... % GxB_FC64_t
122
123codegen_binop_template ('isne',         ...
124    [ ],                                ... % bool
125    '(xarg != yarg)',                   ... % int, uint
126    '(xarg != yarg)',                   ... % float
127    '(xarg != yarg)',                   ... % double
128    'GB_FC32_isne (xarg, yarg)',        ... % GxB_FC32_t
129    'GB_FC64_isne (xarg, yarg)') ;      ... % GxB_FC64_t
130
131codegen_binop_template ('isgt',         ...
132    [ ],                                ... % bool
133    '(xarg > yarg)',                    ... % int, uint
134    '(xarg > yarg)',                    ... % float
135    '(xarg > yarg)',                    ... % double
136    [ ],                                ... % GxB_FC32_t
137    [ ]) ;                              ... % GxB_FC64_t
138
139codegen_binop_template ('islt',         ...
140    [ ],                                ... % bool
141    '(xarg < yarg)',                    ... % int, uint
142    '(xarg < yarg)',                    ... % float
143    '(xarg < yarg)',                    ... % double
144    [ ],                                ... % GxB_FC32_t
145    [ ]) ;                              ... % GxB_FC64_t
146
147codegen_binop_template ('isge',         ...
148    [ ],                                ... % bool
149    '(xarg >= yarg)',                   ... % int, uint
150    '(xarg >= yarg)',                   ... % float
151    '(xarg >= yarg)',                   ... % double
152    [ ],                                ... % GxB_FC32_t
153    [ ]) ;                              ... % GxB_FC64_t
154
155codegen_binop_template ('isle',         ...
156    [ ],                                ... % bool
157    '(xarg <= yarg)',                   ... % int, uint
158    '(xarg <= yarg)',                   ... % float
159    '(xarg <= yarg)',                   ... % double
160    [ ],                                ... % GxB_FC32_t
161    [ ]) ;                              ... % GxB_FC64_t
162
163codegen_binop_template ('eq',           ...
164    '(xarg == yarg)',                   ... % bool
165    '(xarg == yarg)',                   ... % int, uint
166    '(xarg == yarg)',                   ... % float
167    '(xarg == yarg)',                   ... % double
168    'GB_FC32_eq (xarg, yarg)',          ... % GxB_FC32_t
169    'GB_FC64_eq (xarg, yarg)') ;        ... % GxB_FC64_t
170
171codegen_binop_template ('ne',           ...
172    [ ],                                ... % bool
173    '(xarg != yarg)',                   ... % int, uint
174    '(xarg != yarg)',                   ... % float
175    '(xarg != yarg)',                   ... % double
176    'GB_FC32_ne (xarg, yarg)',          ... % GxB_FC32_t
177    'GB_FC64_ne (xarg, yarg)') ;        ... % GxB_FC64_t
178
179codegen_binop_template ('gt',           ...
180    '(xarg > yarg)',                    ... % bool
181    '(xarg > yarg)',                    ... % int, uint
182    '(xarg > yarg)',                    ... % float
183    '(xarg > yarg)',                    ... % double
184    [ ],                                ... % GxB_FC32_t
185    [ ]) ;                              ... % GxB_FC64_t
186
187codegen_binop_template ('lt',           ...
188    '(xarg < yarg)',                    ... % bool
189    '(xarg < yarg)',                    ... % int, uint
190    '(xarg < yarg)',                    ... % float
191    '(xarg < yarg)',                    ... % double
192    [ ],                                ... % GxB_FC32_t
193    [ ]) ;                              ... % GxB_FC64_t
194
195codegen_binop_template ('ge',           ...
196    '(xarg >= yarg)',                   ... % bool
197    '(xarg >= yarg)',                   ... % int, uint
198    '(xarg >= yarg)',                   ... % float
199    '(xarg >= yarg)',                   ... % double
200    [ ],                                ... % GxB_FC32_t
201    [ ]) ;                              ... % GxB_FC64_t
202
203codegen_binop_template ('le',           ...
204    '(xarg <= yarg)',                   ... % bool
205    '(xarg <= yarg)',                   ... % int, uint
206    '(xarg <= yarg)',                   ... % float
207    '(xarg <= yarg)',                   ... % double
208    [ ],                                ... % GxB_FC32_t
209    [ ]) ;                              ... % GxB_FC64_t
210
211codegen_binop_template ('lor',          ...
212    '(xarg || yarg)',                   ... % bool
213    '((xarg != 0) || (yarg != 0))',     ... % int, uint
214    '((xarg != 0) || (yarg != 0))',     ... % float
215    '((xarg != 0) || (yarg != 0))',     ... % double
216    [ ],                                ... % GxB_FC32_t
217    [ ]) ;                              ... % GxB_FC64_t
218
219codegen_binop_template ('land',         ...
220    '(xarg && yarg)',                   ... % bool
221    '((xarg != 0) && (yarg != 0))',     ... % int, uint
222    '((xarg != 0) && (yarg != 0))',     ... % float
223    '((xarg != 0) && (yarg != 0))',     ... % double
224    [ ],                                ... % GxB_FC32_t
225    [ ]) ;                              ... % GxB_FC64_t
226
227codegen_binop_template ('lxor',         ...
228    '(xarg != yarg)',                   ... % bool
229    '((xarg != 0) != (yarg != 0))',     ... % int, uint
230    '((xarg != 0) != (yarg != 0))',     ... % float
231    '((xarg != 0) != (yarg != 0))',     ... % double
232    [ ],                                ... % GxB_FC32_t
233    [ ]) ;                              ... % GxB_FC64_t
234
235codegen_binop_template ('atan2',        ...
236    [ ],                                ... % bool
237    [ ],                                ... % int, uint
238    'atan2f (xarg, yarg)',              ... % float
239    'atan2 (xarg, yarg)',               ... % double
240    [ ],                                ... % GxB_FC32_t
241    [ ]) ;                              ... % GxB_FC64_t
242
243codegen_binop_template ('hypot',        ...
244    [ ],                                ... % bool
245    [ ],                                ... % int, uint
246    'hypotf (xarg, yarg)',              ... % float
247    'hypot (xarg, yarg)',               ... % double
248    [ ],                                ... % GxB_FC32_t
249    [ ]) ;                              ... % GxB_FC64_t
250
251codegen_binop_template ('fmod',         ...
252    [ ],                                ... % bool
253    [ ],                                ... % int, uint
254    'fmodf (xarg, yarg)',               ... % float
255    'fmod (xarg, yarg)',                ... % double
256    [ ],                                ... % GxB_FC32_t
257    [ ]) ;                              ... % GxB_FC64_t
258
259codegen_binop_template ('remainder',    ...
260    [ ],                                ... % bool
261    [ ],                                ... % int, uint
262    'remainderf (xarg, yarg)',          ... % float
263    'remainder (xarg, yarg)',           ... % double
264    [ ],                                ... % GxB_FC32_t
265    [ ]) ;                              ... % GxB_FC64_t
266
267codegen_binop_template ('copysign',     ...
268    [ ],                                ... % bool
269    [ ],                                ... % int, uint
270    'copysignf (xarg, yarg)',           ... % float
271    'copysign (xarg, yarg)',            ... % double
272    [ ],                                ... % GxB_FC32_t
273    [ ]) ;                              ... % GxB_FC64_t
274
275codegen_binop_template ('ldexp',        ...
276    [ ],                                ... % bool
277    [ ],                                ... % int, uint
278    'ldexpf (xarg, yarg)',              ... % float
279    'ldexp (xarg, yarg)',               ... % double
280    [ ],                                ... % GxB_FC32_t
281    [ ]) ;                              ... % GxB_FC64_t
282
283codegen_binop_template ('cmplx',        ...
284    [ ],                                ... % bool
285    [ ],                                ... % int, uint
286    'GxB_CMPLXF (xarg, yarg)',          ... % float  (z is GxB_FC32_t)
287    'GxB_CMPLX (xarg, yarg)',           ... % double (z is GxB_FC64_t)
288    [ ],                                ... % GxB_FC32_t
289    [ ]) ;                              ... % GxB_FC64_t
290
291codegen_binop_template ('bor',          ...
292    [ ],                                ... % bool
293    '(xarg) | (yarg)',                  ... % int, uint
294    [ ],                                ... % float
295    [ ],                                ... % double
296    [ ],                                ... % GxB_FC32_t
297    [ ]) ;                              ... % GxB_FC64_t
298
299codegen_binop_template ('band',         ...
300    [ ],                                ... % bool
301    '(xarg) & (yarg)',                  ... % int, uint
302    [ ],                                ... % float
303    [ ],                                ... % double
304    [ ],                                ... % GxB_FC32_t
305    [ ]) ;                              ... % GxB_FC64_t
306
307codegen_binop_template ('bxor',         ...
308    [ ],                                ... % bool
309    '(xarg) ^ (yarg)',                  ... % int, uint
310    [ ],                                ... % float
311    [ ],                                ... % double
312    [ ],                                ... % GxB_FC32_t
313    [ ]) ;                              ... % GxB_FC64_t
314
315codegen_binop_template ('bxnor',        ...
316    [ ],                                ... % bool
317    '~((xarg) ^ (yarg))',               ... % int, uint
318    [ ],                                ... % float
319    [ ],                                ... % double
320    [ ],                                ... % GxB_FC32_t
321    [ ]) ;                              ... % GxB_FC64_t
322
323% bget
324fprintf ('\nbget     ') ;
325codegen_binop_method ('bget', 'GB_BITGET (xarg, yarg, int8_t, 8)'   , 'int8_t'  ) ;
326codegen_binop_method ('bget', 'GB_BITGET (xarg, yarg, int16_t, 16)' , 'int16_t' ) ;
327codegen_binop_method ('bget', 'GB_BITGET (xarg, yarg, int32_t, 32)' , 'int32_t' ) ;
328codegen_binop_method ('bget', 'GB_BITGET (xarg, yarg, int64_t, 64)' , 'int64_t' ) ;
329codegen_binop_method ('bget', 'GB_BITGET (xarg, yarg, uint8_t, 8)'  , 'uint8_t' ) ;
330codegen_binop_method ('bget', 'GB_BITGET (xarg, yarg, uint16_t, 16)', 'uint16_t') ;
331codegen_binop_method ('bget', 'GB_BITGET (xarg, yarg, uint32_t, 32)', 'uint32_t') ;
332codegen_binop_method ('bget', 'GB_BITGET (xarg, yarg, uint64_t, 64)', 'uint64_t') ;
333
334% bset
335fprintf ('\nbset     ') ;
336codegen_binop_method ('bset', 'GB_BITSET (xarg, yarg, int8_t, 8)'   , 'int8_t'  ) ;
337codegen_binop_method ('bset', 'GB_BITSET (xarg, yarg, int16_t, 16)' , 'int16_t' ) ;
338codegen_binop_method ('bset', 'GB_BITSET (xarg, yarg, int32_t, 32)' , 'int32_t' ) ;
339codegen_binop_method ('bset', 'GB_BITSET (xarg, yarg, int64_t, 64)' , 'int64_t' ) ;
340codegen_binop_method ('bset', 'GB_BITSET (xarg, yarg, uint8_t, 8)'  , 'uint8_t' ) ;
341codegen_binop_method ('bset', 'GB_BITSET (xarg, yarg, uint16_t, 16)', 'uint16_t') ;
342codegen_binop_method ('bset', 'GB_BITSET (xarg, yarg, uint32_t, 32)', 'uint32_t') ;
343codegen_binop_method ('bset', 'GB_BITSET (xarg, yarg, uint64_t, 64)', 'uint64_t') ;
344
345% bclr
346fprintf ('\nbclr     ') ;
347codegen_binop_method ('bclr', 'GB_BITCLR (xarg, yarg, int8_t, 8)'   , 'int8_t'  ) ;
348codegen_binop_method ('bclr', 'GB_BITCLR (xarg, yarg, int16_t, 16)' , 'int16_t' ) ;
349codegen_binop_method ('bclr', 'GB_BITCLR (xarg, yarg, int32_t, 32)' , 'int32_t' ) ;
350codegen_binop_method ('bclr', 'GB_BITCLR (xarg, yarg, int64_t, 64)' , 'int64_t' ) ;
351codegen_binop_method ('bclr', 'GB_BITCLR (xarg, yarg, uint8_t, 8)'  , 'uint8_t' ) ;
352codegen_binop_method ('bclr', 'GB_BITCLR (xarg, yarg, uint16_t, 16)', 'uint16_t') ;
353codegen_binop_method ('bclr', 'GB_BITCLR (xarg, yarg, uint32_t, 32)', 'uint32_t') ;
354codegen_binop_method ('bclr', 'GB_BITCLR (xarg, yarg, uint64_t, 64)', 'uint64_t') ;
355
356% bshift
357fprintf ('\nbshift   ') ;
358codegen_binop_method ('bshift', 'GB_bitshift_int8 (xarg, yarg)'  , 'int8_t'  ) ;
359codegen_binop_method ('bshift', 'GB_bitshift_int16 (xarg, yarg)' , 'int16_t' ) ;
360codegen_binop_method ('bshift', 'GB_bitshift_int32 (xarg, yarg)' , 'int32_t' ) ;
361codegen_binop_method ('bshift', 'GB_bitshift_int64 (xarg, yarg)' , 'int64_t' ) ;
362codegen_binop_method ('bshift', 'GB_bitshift_uint8 (xarg, yarg)' , 'uint8_t' ) ;
363codegen_binop_method ('bshift', 'GB_bitshift_uint16 (xarg, yarg)', 'uint16_t') ;
364codegen_binop_method ('bshift', 'GB_bitshift_uint32 (xarg, yarg)', 'uint32_t') ;
365codegen_binop_method ('bshift', 'GB_bitshift_uint64 (xarg, yarg)', 'uint64_t') ;
366
367% pow
368fprintf ('\npow      ') ;
369codegen_binop_method ('pow', 'GB_pow_int8 (xarg, yarg)'  , 'int8_t'    ) ;
370codegen_binop_method ('pow', 'GB_pow_int16 (xarg, yarg)' , 'int16_t'   ) ;
371codegen_binop_method ('pow', 'GB_pow_int32 (xarg, yarg)' , 'int32_t'   ) ;
372codegen_binop_method ('pow', 'GB_pow_int64 (xarg, yarg)' , 'int64_t'   ) ;
373codegen_binop_method ('pow', 'GB_pow_uint8 (xarg, yarg)' , 'uint8_t'   ) ;
374codegen_binop_method ('pow', 'GB_pow_uint16 (xarg, yarg)', 'uint16_t'  ) ;
375codegen_binop_method ('pow', 'GB_pow_uint32 (xarg, yarg)', 'uint32_t'  ) ;
376codegen_binop_method ('pow', 'GB_pow_uint64 (xarg, yarg)', 'uint64_t'  ) ;
377codegen_binop_method ('pow', 'GB_powf (xarg, yarg)'      , 'float'     ) ;
378codegen_binop_method ('pow', 'GB_pow (xarg, yarg)'       , 'double'    ) ;
379codegen_binop_method ('pow', 'GB_cpowf (xarg, yarg)'     , 'GxB_FC32_t') ;
380codegen_binop_method ('pow', 'GB_cpow (xarg, yarg)'      , 'GxB_FC64_t') ;
381
382fprintf ('\n') ;
383
384