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