1 /////////////////////////////////////////////////////////////// 2 // Copyright 2020 John Maddock. Distributed under the Boost 3 // Software License, Version 1.0. (See accompanying file 4 // LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt 5 6 #ifndef BOOST_MATH_SKELETON_BACKEND_HPP 7 #define BOOST_MATH_SKELETON_BACKEND_HPP 8 9 #include <boost/multiprecision/number.hpp> 10 #include <boost/container_hash/hash.hpp> 11 12 namespace boost { 13 namespace multiprecision { 14 namespace backends { 15 16 /* 17 This header defines one type - skeleton_backend - which declares the minimal 18 interface to qualify as a backend for class number. In addition you'll find 19 optional interfaces declared commented out - you can enable these or not as 20 needed. 21 22 The process of writing a new backend for class number then reduces to a search 23 and replace to change the name of this class to something meaningful, followed 24 by "filling in the blanks" of each of the methods. 25 26 NOTE: all of the methods shown below are simple declarations, be sure to make them 27 inline, constexpr and/or noexcept as appropriate - as these annotations propogate 28 upwards to operations on number<>'s. 29 30 If the backend is to be itself a template, thn you will have rather more editing to 31 do to add all the "template<...>" prefixes to the functions. 32 33 */ 34 35 36 struct skeleton_backend 37 { 38 // 39 // Each backend need to declare 3 type lists which declare the types 40 // with which this can interoperate. These lists must at least contain 41 // the widest type in each category - so "long long" must be the final 42 // type in the signed_types list for example. Any narrower types if not 43 // present in the list will get promoted to the next wider type that is 44 // in the list whenever mixed arithmetic involving that type is encountered. 45 // 46 typedef mpl::list</*signed char, short, int, long,*/ long long> signed_types; 47 typedef mpl::list</* unsigned char, unsigned short, unsigned, unsigned long,*/ unsigned long long> unsigned_types; 48 typedef mpl::list</*float, double,*/ long double> float_types; 49 // 50 // This typedef is only required if this is a floating point type, it is the type 51 // which holds the exponent: 52 // 53 typedef int exponent_type; 54 55 // We must have a default constructor: 56 skeleton_backend(); 57 skeleton_backend(const skeleton_backend& o); 58 #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES 59 skeleton_backend(skeleton_backend&& o); 60 #endif 61 62 // Optional constructors, we can make this type slightly more efficient 63 // by providing constructors from any type we can handle natively. 64 // These will also cause number<> to be implicitly constructible 65 // from these types unless we make such constructors explicit. 66 // 67 // skeleton_backend(int o); // If there's an efficient initialisation from int for example. 68 69 // 70 // In the absense of converting constructors, operator= takes the strain. 71 // In addition to the usual suspects, there must be one operator= for each type 72 // listed in signed_types, unsigned_types, and float_types plus a string constructor. 73 // 74 skeleton_backend& operator=(const skeleton_backend& o); 75 #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES 76 skeleton_backend& operator=(skeleton_backend&& o); 77 #endif 78 skeleton_backend& operator=(unsigned long long i); 79 skeleton_backend& operator=(long long i); 80 skeleton_backend& operator=(long double i); 81 skeleton_backend& operator=(const char* s); 82 83 void swap(skeleton_backend& o); 84 std::string str(std::streamsize digits, std::ios_base::fmtflags f) const; 85 void negate(); 86 int compare(const skeleton_backend& o) const; 87 // 88 // Comparison with arithmetic types, default just constructs a temporary: 89 // 90 template <class A> compareboost::multiprecision::backends::skeleton_backend91 typename enable_if<is_arithmetic<A>, int>::type compare(A i) const 92 { 93 skeleton_backend t; 94 t = i; // Note: construct directly from i if supported. 95 return compare(t); 96 } 97 }; 98 99 // 100 // Required non-members: 101 // 102 void eval_add(skeleton_backend& a, const skeleton_backend& b); 103 void eval_subtract(skeleton_backend& a, const skeleton_backend& b); 104 void eval_multiply(skeleton_backend& a, const skeleton_backend& b); 105 void eval_divide(skeleton_backend& a, const skeleton_backend& b); 106 // 107 // Required only for integer types: 108 // 109 void eval_modulus(skeleton_backend& a, const skeleton_backend& b); 110 void eval_bitwise_and(skeleton_backend& a, const skeleton_backend& b); 111 void eval_bitwise_or(skeleton_backend& a, const skeleton_backend& b); 112 void eval_bitwise_xor(skeleton_backend& a, const skeleton_backend& b); 113 void eval_complement(skeleton_backend& a, const skeleton_backend& b); 114 void eval_left_shift(skeleton_backend& a, unsigned shift); 115 void eval_right_shift(skeleton_backend& a, unsigned shift); 116 // 117 // Conversions: must include at least unsigned long long, long long and long double. 118 // Everything else is entirely optional: 119 // 120 void eval_convert_to(unsigned long long* result, const skeleton_backend& backend); 121 void eval_convert_to(long long* result, const skeleton_backend& backend); 122 void eval_convert_to(long double* result, const skeleton_backend& backend); 123 124 //void eval_convert_to(unsigned long* result, const skeleton_backend& backend); 125 //void eval_convert_to(unsigned* result, const skeleton_backend& backend); 126 //void eval_convert_to(unsigned short* result, const skeleton_backend& backend); 127 //void eval_convert_to(unsigned char* result, const skeleton_backend& backend); 128 129 //void eval_convert_to(char* result, const skeleton_backend& backend); 130 131 //void eval_convert_to(long* result, const skeleton_backend& backend); 132 //void eval_convert_to(int* result, const skeleton_backend& backend); 133 //void eval_convert_to(short* result, const skeleton_backend& backend); 134 //void eval_convert_to(signed char* result, const skeleton_backend& backend); 135 136 //void eval_convert_to(double* result, const skeleton_backend& backend); 137 //void eval_convert_to(float* result, const skeleton_backend& backend); 138 139 // 140 // Operations which are required *only* if we have a floating point type: 141 // 142 void eval_frexp(skeleton_backend& result, const skeleton_backend& arg, skeleton_backend::exponent_type* p_exponent); 143 void eval_frexp(skeleton_backend& result, const skeleton_backend& arg, int* p_exponent); // throws a runtime_error if the exponent is too large for an int 144 void eval_ldexp(skeleton_backend& result, const skeleton_backend& arg, skeleton_backend::exponent_type exponent); 145 void eval_ldexp(skeleton_backend& result, const skeleton_backend& arg, int exponent); 146 void eval_floor(skeleton_backend& result, const skeleton_backend& arg); 147 void eval_ceil(skeleton_backend& result, const skeleton_backend& arg); 148 void eval_sqrt(skeleton_backend& result, const skeleton_backend& arg); 149 // 150 // Operations defined *only* if we have a complex number type, type 151 // skeleton_real_type is assumed to be the real number type matching 152 // this type. 153 // 154 void eval_conj(skeleton_backend& result, const skeleton_backend& arg); 155 void eval_proj(skeleton_backend& result, const skeleton_backend& arg); 156 //void eval_real(skeleton_real_type& result, const skeleton_backend& arg); 157 //void eval_set_real(skeleton_real_type& result, const skeleton_backend& arg); 158 //void eval_imag(skeleton_real_type& result, const skeleton_backend& arg); 159 //void eval_set_real(skeleton_type& result, const skeleton_real_type& arg); 160 //void eval_set_imag(skeleton_type& result, const skeleton_real_type& arg); 161 162 // 163 // Hashing support, not strictly required, but it is used in our tests: 164 // 165 std::size_t hash_value(const skeleton_backend& arg); 166 // 167 // We're now into strictly optional requirements, everything that follows is 168 // nice to have, but can be synthesised from the operators above if required. 169 // Typically these operations are here to improve performance and reduce the 170 // number of temporaries created. 171 // 172 // assign_components: required number types with 2 seperate components (rationals and complex numbers). 173 // Type skeleton_component_type is whatever the corresponding backend type for the components is: 174 // 175 //void assign_conponents(skeleton_backend& result, skeleton_component_type const& a, skeleton_component_type const& b); 176 // 177 // Again for arithmetic types, overload for whatever arithmetic types are directly supported: 178 // 179 //void assign_conponents(skeleton_backend& result, double a, double b); 180 // 181 // Optional comparison operators: 182 // 183 #if 0 184 185 bool eval_is_zero(const skeleton_backend& arg); 186 int eval_get_sign(const skeleton_backend& arg); 187 188 bool eval_eq(const skeleton_backend& a, const skeleton_backend& b); 189 bool eval_eq(const skeleton_backend& a, unsigned long long b); 190 bool eval_eq(const skeleton_backend& a, unsigned long b); 191 bool eval_eq(const skeleton_backend& a, unsigned b); 192 bool eval_eq(const skeleton_backend& a, unsigned short b); 193 bool eval_eq(const skeleton_backend& a, unsigned char b); 194 bool eval_eq(const skeleton_backend& a, long long b); 195 bool eval_eq(const skeleton_backend& a, long b); 196 bool eval_eq(const skeleton_backend& a, int b); 197 bool eval_eq(const skeleton_backend& a, short b); 198 bool eval_eq(const skeleton_backend& a, signed char b); 199 bool eval_eq(const skeleton_backend& a, char b); 200 bool eval_eq(const skeleton_backend& a, long double b); 201 bool eval_eq(const skeleton_backend& a, double b); 202 bool eval_eq(const skeleton_backend& a, float b); 203 204 bool eval_eq(unsigned long long a, const skeleton_backend& b); 205 bool eval_eq(unsigned long a, const skeleton_backend& b); 206 bool eval_eq(unsigned a, const skeleton_backend& b); 207 bool eval_eq(unsigned short a, const skeleton_backend& b); 208 bool eval_eq(unsigned char a, const skeleton_backend& b); 209 bool eval_eq(long long a, const skeleton_backend& b); 210 bool eval_eq(long a, const skeleton_backend& b); 211 bool eval_eq(int a, const skeleton_backend& b); 212 bool eval_eq(short a, const skeleton_backend& b); 213 bool eval_eq(signed char a, const skeleton_backend& b); 214 bool eval_eq(char a, const skeleton_backend& b); 215 bool eval_eq(long double a, const skeleton_backend& b); 216 bool eval_eq(double a, const skeleton_backend& b); 217 bool eval_eq(float a, const skeleton_backend& b); 218 219 bool eval_lt(const skeleton_backend& a, const skeleton_backend& b); 220 bool eval_lt(const skeleton_backend& a, unsigned long long b); 221 bool eval_lt(const skeleton_backend& a, unsigned long b); 222 bool eval_lt(const skeleton_backend& a, unsigned b); 223 bool eval_lt(const skeleton_backend& a, unsigned short b); 224 bool eval_lt(const skeleton_backend& a, unsigned char b); 225 bool eval_lt(const skeleton_backend& a, long long b); 226 bool eval_lt(const skeleton_backend& a, long b); 227 bool eval_lt(const skeleton_backend& a, int b); 228 bool eval_lt(const skeleton_backend& a, short b); 229 bool eval_lt(const skeleton_backend& a, signed char b); 230 bool eval_lt(const skeleton_backend& a, char b); 231 bool eval_lt(const skeleton_backend& a, long double b); 232 bool eval_lt(const skeleton_backend& a, double b); 233 bool eval_lt(const skeleton_backend& a, float b); 234 235 bool eval_lt(unsigned long long a, const skeleton_backend& b); 236 bool eval_lt(unsigned long a, const skeleton_backend& b); 237 bool eval_lt(unsigned a, const skeleton_backend& b); 238 bool eval_lt(unsigned short a, const skeleton_backend& b); 239 bool eval_lt(unsigned char a, const skeleton_backend& b); 240 bool eval_lt(long long a, const skeleton_backend& b); 241 bool eval_lt(long a, const skeleton_backend& b); 242 bool eval_lt(int a, const skeleton_backend& b); 243 bool eval_lt(short a, const skeleton_backend& b); 244 bool eval_lt(signed char a, const skeleton_backend& b); 245 bool eval_lt(char a, const skeleton_backend& b); 246 bool eval_lt(long double a, const skeleton_backend& b); 247 bool eval_lt(double a, const skeleton_backend& b); 248 bool eval_lt(float a, const skeleton_backend& b); 249 250 bool eval_gt(const skeleton_backend& a, const skeleton_backend& b); 251 bool eval_gt(const skeleton_backend& a, unsigned long long b); 252 bool eval_gt(const skeleton_backend& a, unsigned long b); 253 bool eval_gt(const skeleton_backend& a, unsigned b); 254 bool eval_gt(const skeleton_backend& a, unsigned short b); 255 bool eval_gt(const skeleton_backend& a, unsigned char b); 256 bool eval_gt(const skeleton_backend& a, long long b); 257 bool eval_gt(const skeleton_backend& a, long b); 258 bool eval_gt(const skeleton_backend& a, int b); 259 bool eval_gt(const skeleton_backend& a, short b); 260 bool eval_gt(const skeleton_backend& a, signed char b); 261 bool eval_gt(const skeleton_backend& a, char b); 262 bool eval_gt(const skeleton_backend& a, long double b); 263 bool eval_gt(const skeleton_backend& a, double b); 264 bool eval_gt(const skeleton_backend& a, float b); 265 266 bool eval_gt(unsigned long long a, const skeleton_backend& b); 267 bool eval_gt(unsigned long a, const skeleton_backend& b); 268 bool eval_gt(unsigned a, const skeleton_backend& b); 269 bool eval_gt(unsigned short a, const skeleton_backend& b); 270 bool eval_gt(unsigned char a, const skeleton_backend& b); 271 bool eval_gt(long long a, const skeleton_backend& b); 272 bool eval_gt(long a, const skeleton_backend& b); 273 bool eval_gt(int a, const skeleton_backend& b); 274 bool eval_gt(short a, const skeleton_backend& b); 275 bool eval_gt(signed char a, const skeleton_backend& b); 276 bool eval_gt(char a, const skeleton_backend& b); 277 bool eval_gt(long double a, const skeleton_backend& b); 278 bool eval_gt(double a, const skeleton_backend& b); 279 bool eval_gt(float a, const skeleton_backend& b); 280 #endif 281 282 // 283 // Arithmetic operations, starting with addition: 284 // 285 #if 0 286 void eval_add(skeleton_backend& result, unsigned long long arg); 287 void eval_add(skeleton_backend& result, unsigned long arg); 288 void eval_add(skeleton_backend& result, unsigned arg); 289 void eval_add(skeleton_backend& result, unsigned short arg); 290 void eval_add(skeleton_backend& result, unsigned char arg); 291 void eval_add(skeleton_backend& result, char arg); 292 void eval_add(skeleton_backend& result, long long arg); 293 void eval_add(skeleton_backend& result, long arg); 294 void eval_add(skeleton_backend& result, int arg); 295 void eval_add(skeleton_backend& result, short arg); 296 void eval_add(skeleton_backend& result, signed char arg); 297 void eval_add(skeleton_backend& result, long double arg); 298 void eval_add(skeleton_backend& result, double arg); 299 void eval_add(skeleton_backend& result, float arg); 300 301 void eval_add(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b); 302 void eval_add(skeleton_backend& result, const skeleton_backend& a, unsigned long long b); 303 void eval_add(skeleton_backend& result, const skeleton_backend& a, unsigned long b); 304 void eval_add(skeleton_backend& result, const skeleton_backend& a, unsigned b); 305 void eval_add(skeleton_backend& result, const skeleton_backend& a, unsigned short b); 306 void eval_add(skeleton_backend& result, const skeleton_backend& a, unsigned char b); 307 void eval_add(skeleton_backend& result, const skeleton_backend& a, long long b); 308 void eval_add(skeleton_backend& result, const skeleton_backend& a, long b); 309 void eval_add(skeleton_backend& result, const skeleton_backend& a, int b); 310 void eval_add(skeleton_backend& result, const skeleton_backend& a, short b); 311 void eval_add(skeleton_backend& result, const skeleton_backend& a, signed char b); 312 void eval_add(skeleton_backend& result, const skeleton_backend& a, char b); 313 void eval_add(skeleton_backend& result, const skeleton_backend& a, long double b); 314 void eval_add(skeleton_backend& result, const skeleton_backend& a, double b); 315 void eval_add(skeleton_backend& result, const skeleton_backend& a, float b); 316 317 void eval_add(skeleton_backend& result, unsigned long long b, const skeleton_backend& a); 318 void eval_add(skeleton_backend& result, unsigned long b, const skeleton_backend& a); 319 void eval_add(skeleton_backend& result, unsigned b, const skeleton_backend& a); 320 void eval_add(skeleton_backend& result, unsigned short b, const skeleton_backend& a); 321 void eval_add(skeleton_backend& result, unsigned char b, const skeleton_backend& a); 322 void eval_add(skeleton_backend& result, long long b, const skeleton_backend& a); 323 void eval_add(skeleton_backend& result, long b, const skeleton_backend& a); 324 void eval_add(skeleton_backend& result, int b, const skeleton_backend& a); 325 void eval_add(skeleton_backend& result, short b, const skeleton_backend& a); 326 void eval_add(skeleton_backend& result, signed char b, const skeleton_backend& a); 327 void eval_add(skeleton_backend& result, char b, const skeleton_backend& a); 328 void eval_add(skeleton_backend& result, long double b, const skeleton_backend& a); 329 void eval_add(skeleton_backend& result, double b, const skeleton_backend& a); 330 void eval_add(skeleton_backend& result, float b, const skeleton_backend& a); 331 #endif 332 333 // 334 // Subtraction: 335 // 336 #if 0 337 void eval_subtract(skeleton_backend& result, unsigned long long arg); 338 void eval_subtract(skeleton_backend& result, unsigned long arg); 339 void eval_subtract(skeleton_backend& result, unsigned arg); 340 void eval_subtract(skeleton_backend& result, unsigned short arg); 341 void eval_subtract(skeleton_backend& result, unsigned char arg); 342 void eval_subtract(skeleton_backend& result, char arg); 343 void eval_subtract(skeleton_backend& result, long long arg); 344 void eval_subtract(skeleton_backend& result, long arg); 345 void eval_subtract(skeleton_backend& result, int arg); 346 void eval_subtract(skeleton_backend& result, short arg); 347 void eval_subtract(skeleton_backend& result, signed char arg); 348 void eval_subtract(skeleton_backend& result, long double arg); 349 void eval_subtract(skeleton_backend& result, double arg); 350 void eval_subtract(skeleton_backend& result, float arg); 351 352 void eval_subtract(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b); 353 void eval_subtract(skeleton_backend& result, const skeleton_backend& a, unsigned long long b); 354 void eval_subtract(skeleton_backend& result, const skeleton_backend& a, unsigned long b); 355 void eval_subtract(skeleton_backend& result, const skeleton_backend& a, unsigned b); 356 void eval_subtract(skeleton_backend& result, const skeleton_backend& a, unsigned short b); 357 void eval_subtract(skeleton_backend& result, const skeleton_backend& a, unsigned char b); 358 void eval_subtract(skeleton_backend& result, const skeleton_backend& a, long long b); 359 void eval_subtract(skeleton_backend& result, const skeleton_backend& a, long b); 360 void eval_subtract(skeleton_backend& result, const skeleton_backend& a, int b); 361 void eval_subtract(skeleton_backend& result, const skeleton_backend& a, short b); 362 void eval_subtract(skeleton_backend& result, const skeleton_backend& a, signed char b); 363 void eval_subtract(skeleton_backend& result, const skeleton_backend& a, char b); 364 void eval_subtract(skeleton_backend& result, const skeleton_backend& a, long double b); 365 void eval_subtract(skeleton_backend& result, const skeleton_backend& a, double b); 366 void eval_subtract(skeleton_backend& result, const skeleton_backend& a, float b); 367 368 void eval_subtract(skeleton_backend& result, unsigned long long b, const skeleton_backend& a); 369 void eval_subtract(skeleton_backend& result, unsigned long b, const skeleton_backend& a); 370 void eval_subtract(skeleton_backend& result, unsigned b, const skeleton_backend& a); 371 void eval_subtract(skeleton_backend& result, unsigned short b, const skeleton_backend& a); 372 void eval_subtract(skeleton_backend& result, unsigned char b, const skeleton_backend& a); 373 void eval_subtract(skeleton_backend& result, long long b, const skeleton_backend& a); 374 void eval_subtract(skeleton_backend& result, long b, const skeleton_backend& a); 375 void eval_subtract(skeleton_backend& result, int b, const skeleton_backend& a); 376 void eval_subtract(skeleton_backend& result, short b, const skeleton_backend& a); 377 void eval_subtract(skeleton_backend& result, signed char b, const skeleton_backend& a); 378 void eval_subtract(skeleton_backend& result, char b, const skeleton_backend& a); 379 void eval_subtract(skeleton_backend& result, long double b, const skeleton_backend& a); 380 void eval_subtract(skeleton_backend& result, double b, const skeleton_backend& a); 381 void eval_subtract(skeleton_backend& result, float b, const skeleton_backend& a); 382 #endif 383 384 // 385 // Multiplication: 386 // 387 #if 0 388 void eval_multiply(skeleton_backend& result, unsigned long long arg); 389 void eval_multiply(skeleton_backend& result, unsigned long arg); 390 void eval_multiply(skeleton_backend& result, unsigned arg); 391 void eval_multiply(skeleton_backend& result, unsigned short arg); 392 void eval_multiply(skeleton_backend& result, unsigned char arg); 393 void eval_multiply(skeleton_backend& result, char arg); 394 void eval_multiply(skeleton_backend& result, long long arg); 395 void eval_multiply(skeleton_backend& result, long arg); 396 void eval_multiply(skeleton_backend& result, int arg); 397 void eval_multiply(skeleton_backend& result, short arg); 398 void eval_multiply(skeleton_backend& result, signed char arg); 399 void eval_multiply(skeleton_backend& result, long double arg); 400 void eval_multiply(skeleton_backend& result, double arg); 401 void eval_multiply(skeleton_backend& result, float arg); 402 403 void eval_multiply(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b); 404 void eval_multiply(skeleton_backend& result, const skeleton_backend& a, unsigned long long b); 405 void eval_multiply(skeleton_backend& result, const skeleton_backend& a, unsigned long b); 406 void eval_multiply(skeleton_backend& result, const skeleton_backend& a, unsigned b); 407 void eval_multiply(skeleton_backend& result, const skeleton_backend& a, unsigned short b); 408 void eval_multiply(skeleton_backend& result, const skeleton_backend& a, unsigned char b); 409 void eval_multiply(skeleton_backend& result, const skeleton_backend& a, long long b); 410 void eval_multiply(skeleton_backend& result, const skeleton_backend& a, long b); 411 void eval_multiply(skeleton_backend& result, const skeleton_backend& a, int b); 412 void eval_multiply(skeleton_backend& result, const skeleton_backend& a, short b); 413 void eval_multiply(skeleton_backend& result, const skeleton_backend& a, signed char b); 414 void eval_multiply(skeleton_backend& result, const skeleton_backend& a, char b); 415 void eval_multiply(skeleton_backend& result, const skeleton_backend& a, long double b); 416 void eval_multiply(skeleton_backend& result, const skeleton_backend& a, double b); 417 void eval_multiply(skeleton_backend& result, const skeleton_backend& a, float b); 418 419 void eval_multiply(skeleton_backend& result, unsigned long long b, const skeleton_backend& a); 420 void eval_multiply(skeleton_backend& result, unsigned long b, const skeleton_backend& a); 421 void eval_multiply(skeleton_backend& result, unsigned b, const skeleton_backend& a); 422 void eval_multiply(skeleton_backend& result, unsigned short b, const skeleton_backend& a); 423 void eval_multiply(skeleton_backend& result, unsigned char b, const skeleton_backend& a); 424 void eval_multiply(skeleton_backend& result, long long b, const skeleton_backend& a); 425 void eval_multiply(skeleton_backend& result, long b, const skeleton_backend& a); 426 void eval_multiply(skeleton_backend& result, int b, const skeleton_backend& a); 427 void eval_multiply(skeleton_backend& result, short b, const skeleton_backend& a); 428 void eval_multiply(skeleton_backend& result, signed char b, const skeleton_backend& a); 429 void eval_multiply(skeleton_backend& result, char b, const skeleton_backend& a); 430 void eval_multiply(skeleton_backend& result, long double b, const skeleton_backend& a); 431 void eval_multiply(skeleton_backend& result, double b, const skeleton_backend& a); 432 void eval_multiply(skeleton_backend& result, float b, const skeleton_backend& a); 433 #endif 434 435 // 436 // Division: 437 // 438 #if 0 439 void eval_divide(skeleton_backend& result, unsigned long long arg); 440 void eval_divide(skeleton_backend& result, unsigned long arg); 441 void eval_divide(skeleton_backend& result, unsigned arg); 442 void eval_divide(skeleton_backend& result, unsigned short arg); 443 void eval_divide(skeleton_backend& result, unsigned char arg); 444 void eval_divide(skeleton_backend& result, char arg); 445 void eval_divide(skeleton_backend& result, long long arg); 446 void eval_divide(skeleton_backend& result, long arg); 447 void eval_divide(skeleton_backend& result, int arg); 448 void eval_divide(skeleton_backend& result, short arg); 449 void eval_divide(skeleton_backend& result, signed char arg); 450 void eval_divide(skeleton_backend& result, long double arg); 451 void eval_divide(skeleton_backend& result, double arg); 452 void eval_divide(skeleton_backend& result, float arg); 453 454 void eval_divide(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b); 455 void eval_divide(skeleton_backend& result, const skeleton_backend& a, unsigned long long b); 456 void eval_divide(skeleton_backend& result, const skeleton_backend& a, unsigned long b); 457 void eval_divide(skeleton_backend& result, const skeleton_backend& a, unsigned b); 458 void eval_divide(skeleton_backend& result, const skeleton_backend& a, unsigned short b); 459 void eval_divide(skeleton_backend& result, const skeleton_backend& a, unsigned char b); 460 void eval_divide(skeleton_backend& result, const skeleton_backend& a, long long b); 461 void eval_divide(skeleton_backend& result, const skeleton_backend& a, long b); 462 void eval_divide(skeleton_backend& result, const skeleton_backend& a, int b); 463 void eval_divide(skeleton_backend& result, const skeleton_backend& a, short b); 464 void eval_divide(skeleton_backend& result, const skeleton_backend& a, signed char b); 465 void eval_divide(skeleton_backend& result, const skeleton_backend& a, char b); 466 void eval_divide(skeleton_backend& result, const skeleton_backend& a, long double b); 467 void eval_divide(skeleton_backend& result, const skeleton_backend& a, double b); 468 void eval_divide(skeleton_backend& result, const skeleton_backend& a, float b); 469 470 void eval_divide(skeleton_backend& result, unsigned long long b, const skeleton_backend& a); 471 void eval_divide(skeleton_backend& result, unsigned long b, const skeleton_backend& a); 472 void eval_divide(skeleton_backend& result, unsigned b, const skeleton_backend& a); 473 void eval_divide(skeleton_backend& result, unsigned short b, const skeleton_backend& a); 474 void eval_divide(skeleton_backend& result, unsigned char b, const skeleton_backend& a); 475 void eval_divide(skeleton_backend& result, long long b, const skeleton_backend& a); 476 void eval_divide(skeleton_backend& result, long b, const skeleton_backend& a); 477 void eval_divide(skeleton_backend& result, int b, const skeleton_backend& a); 478 void eval_divide(skeleton_backend& result, short b, const skeleton_backend& a); 479 void eval_divide(skeleton_backend& result, signed char b, const skeleton_backend& a); 480 void eval_divide(skeleton_backend& result, char b, const skeleton_backend& a); 481 void eval_divide(skeleton_backend& result, long double b, const skeleton_backend& a); 482 void eval_divide(skeleton_backend& result, double b, const skeleton_backend& a); 483 void eval_divide(skeleton_backend& result, float b, const skeleton_backend& a); 484 #endif 485 // 486 // Multiply and add/subtract as one: 487 // 488 #if 0 489 void eval_multiply_add(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b); 490 void eval_multiply_add(skeleton_backend& result, const skeleton_backend& a, unsigned long long b); 491 void eval_multiply_add(skeleton_backend& result, const skeleton_backend& a, unsigned long b); 492 void eval_multiply_add(skeleton_backend& result, const skeleton_backend& a, unsigned b); 493 void eval_multiply_add(skeleton_backend& result, const skeleton_backend& a, unsigned short b); 494 void eval_multiply_add(skeleton_backend& result, const skeleton_backend& a, unsigned char b); 495 void eval_multiply_add(skeleton_backend& result, const skeleton_backend& a, long long b); 496 void eval_multiply_add(skeleton_backend& result, const skeleton_backend& a, long b); 497 void eval_multiply_add(skeleton_backend& result, const skeleton_backend& a, int b); 498 void eval_multiply_add(skeleton_backend& result, const skeleton_backend& a, short b); 499 void eval_multiply_add(skeleton_backend& result, const skeleton_backend& a, signed char b); 500 void eval_multiply_add(skeleton_backend& result, const skeleton_backend& a, char b); 501 void eval_multiply_add(skeleton_backend& result, const skeleton_backend& a, long double b); 502 void eval_multiply_add(skeleton_backend& result, const skeleton_backend& a, double b); 503 void eval_multiply_add(skeleton_backend& result, const skeleton_backend& a, float b); 504 505 void eval_multiply_add(skeleton_backend& result, unsigned long long b, const skeleton_backend& a); 506 void eval_multiply_add(skeleton_backend& result, unsigned long b, const skeleton_backend& a); 507 void eval_multiply_add(skeleton_backend& result, unsigned b, const skeleton_backend& a); 508 void eval_multiply_add(skeleton_backend& result, unsigned short b, const skeleton_backend& a); 509 void eval_multiply_add(skeleton_backend& result, unsigned char b, const skeleton_backend& a); 510 void eval_multiply_add(skeleton_backend& result, long long b, const skeleton_backend& a); 511 void eval_multiply_add(skeleton_backend& result, long b, const skeleton_backend& a); 512 void eval_multiply_add(skeleton_backend& result, int b, const skeleton_backend& a); 513 void eval_multiply_add(skeleton_backend& result, short b, const skeleton_backend& a); 514 void eval_multiply_add(skeleton_backend& result, signed char b, const skeleton_backend& a); 515 void eval_multiply_add(skeleton_backend& result, char b, const skeleton_backend& a); 516 void eval_multiply_add(skeleton_backend& result, long double b, const skeleton_backend& a); 517 void eval_multiply_add(skeleton_backend& result, double b, const skeleton_backend& a); 518 void eval_multiply_add(skeleton_backend& result, float b, const skeleton_backend& a); 519 520 void eval_multiply_subtract(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b); 521 void eval_multiply_subtract(skeleton_backend& result, const skeleton_backend& a, unsigned long long b); 522 void eval_multiply_subtract(skeleton_backend& result, const skeleton_backend& a, unsigned long b); 523 void eval_multiply_subtract(skeleton_backend& result, const skeleton_backend& a, unsigned b); 524 void eval_multiply_subtract(skeleton_backend& result, const skeleton_backend& a, unsigned short b); 525 void eval_multiply_subtract(skeleton_backend& result, const skeleton_backend& a, unsigned char b); 526 void eval_multiply_subtract(skeleton_backend& result, const skeleton_backend& a, long long b); 527 void eval_multiply_subtract(skeleton_backend& result, const skeleton_backend& a, long b); 528 void eval_multiply_subtract(skeleton_backend& result, const skeleton_backend& a, int b); 529 void eval_multiply_subtract(skeleton_backend& result, const skeleton_backend& a, short b); 530 void eval_multiply_subtract(skeleton_backend& result, const skeleton_backend& a, signed char b); 531 void eval_multiply_subtract(skeleton_backend& result, const skeleton_backend& a, char b); 532 void eval_multiply_subtract(skeleton_backend& result, const skeleton_backend& a, long double b); 533 void eval_multiply_subtract(skeleton_backend& result, const skeleton_backend& a, double b); 534 void eval_multiply_subtract(skeleton_backend& result, const skeleton_backend& a, float b); 535 536 void eval_multiply_subtract(skeleton_backend& result, unsigned long long b, const skeleton_backend& a); 537 void eval_multiply_subtract(skeleton_backend& result, unsigned long b, const skeleton_backend& a); 538 void eval_multiply_subtract(skeleton_backend& result, unsigned b, const skeleton_backend& a); 539 void eval_multiply_subtract(skeleton_backend& result, unsigned short b, const skeleton_backend& a); 540 void eval_multiply_subtract(skeleton_backend& result, unsigned char b, const skeleton_backend& a); 541 void eval_multiply_subtract(skeleton_backend& result, long long b, const skeleton_backend& a); 542 void eval_multiply_subtract(skeleton_backend& result, long b, const skeleton_backend& a); 543 void eval_multiply_subtract(skeleton_backend& result, int b, const skeleton_backend& a); 544 void eval_multiply_subtract(skeleton_backend& result, short b, const skeleton_backend& a); 545 void eval_multiply_subtract(skeleton_backend& result, signed char b, const skeleton_backend& a); 546 void eval_multiply_subtract(skeleton_backend& result, char b, const skeleton_backend& a); 547 void eval_multiply_subtract(skeleton_backend& result, long double b, const skeleton_backend& a); 548 void eval_multiply_subtract(skeleton_backend& result, double b, const skeleton_backend& a); 549 void eval_multiply_subtract(skeleton_backend& result, float b, const skeleton_backend& a); 550 #endif 551 // 552 // Increment and decrement: 553 // 554 //void eval_increment(skeleton_backend& arg); 555 //void eval_decrement(skeleton_backend& arg); 556 // 557 // abs/fabs: 558 // 559 // void eval_abs(skeleton_backend& result, const skeleton_backend& arg); 560 // void eval_fabs(skeleton_backend& result, const skeleton_backend& arg); 561 // 562 563 564 // 565 // Now operations on Integer types, starting with modulus: 566 // 567 #if 0 568 void eval_modulus(skeleton_backend& result, unsigned long long arg); 569 void eval_modulus(skeleton_backend& result, unsigned long arg); 570 void eval_modulus(skeleton_backend& result, unsigned arg); 571 void eval_modulus(skeleton_backend& result, unsigned short arg); 572 void eval_modulus(skeleton_backend& result, unsigned char arg); 573 void eval_modulus(skeleton_backend& result, char arg); 574 void eval_modulus(skeleton_backend& result, long long arg); 575 void eval_modulus(skeleton_backend& result, long arg); 576 void eval_modulus(skeleton_backend& result, int arg); 577 void eval_modulus(skeleton_backend& result, short arg); 578 void eval_modulus(skeleton_backend& result, signed char arg); 579 void eval_modulus(skeleton_backend& result, long double arg); 580 void eval_modulus(skeleton_backend& result, double arg); 581 void eval_modulus(skeleton_backend& result, float arg); 582 583 void eval_modulus(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b); 584 void eval_modulus(skeleton_backend& result, const skeleton_backend& a, unsigned long long b); 585 void eval_modulus(skeleton_backend& result, const skeleton_backend& a, unsigned long b); 586 void eval_modulus(skeleton_backend& result, const skeleton_backend& a, unsigned b); 587 void eval_modulus(skeleton_backend& result, const skeleton_backend& a, unsigned short b); 588 void eval_modulus(skeleton_backend& result, const skeleton_backend& a, unsigned char b); 589 void eval_modulus(skeleton_backend& result, const skeleton_backend& a, long long b); 590 void eval_modulus(skeleton_backend& result, const skeleton_backend& a, long b); 591 void eval_modulus(skeleton_backend& result, const skeleton_backend& a, int b); 592 void eval_modulus(skeleton_backend& result, const skeleton_backend& a, short b); 593 void eval_modulus(skeleton_backend& result, const skeleton_backend& a, signed char b); 594 void eval_modulus(skeleton_backend& result, const skeleton_backend& a, char b); 595 void eval_modulus(skeleton_backend& result, const skeleton_backend& a, long double b); 596 void eval_modulus(skeleton_backend& result, const skeleton_backend& a, double b); 597 void eval_modulus(skeleton_backend& result, const skeleton_backend& a, float b); 598 599 void eval_modulus(skeleton_backend& result, unsigned long long b, const skeleton_backend& a); 600 void eval_modulus(skeleton_backend& result, unsigned long b, const skeleton_backend& a); 601 void eval_modulus(skeleton_backend& result, unsigned b, const skeleton_backend& a); 602 void eval_modulus(skeleton_backend& result, unsigned short b, const skeleton_backend& a); 603 void eval_modulus(skeleton_backend& result, unsigned char b, const skeleton_backend& a); 604 void eval_modulus(skeleton_backend& result, long long b, const skeleton_backend& a); 605 void eval_modulus(skeleton_backend& result, long b, const skeleton_backend& a); 606 void eval_modulus(skeleton_backend& result, int b, const skeleton_backend& a); 607 void eval_modulus(skeleton_backend& result, short b, const skeleton_backend& a); 608 void eval_modulus(skeleton_backend& result, signed char b, const skeleton_backend& a); 609 void eval_modulus(skeleton_backend& result, char b, const skeleton_backend& a); 610 void eval_modulus(skeleton_backend& result, long double b, const skeleton_backend& a); 611 void eval_modulus(skeleton_backend& result, double b, const skeleton_backend& a); 612 void eval_modulus(skeleton_backend& result, float b, const skeleton_backend& a); 613 #endif 614 // 615 // bitwise AND: 616 // 617 #if 0 618 void eval_bitwise_and(skeleton_backend& result, unsigned long long arg); 619 void eval_bitwise_and(skeleton_backend& result, unsigned long arg); 620 void eval_bitwise_and(skeleton_backend& result, unsigned arg); 621 void eval_bitwise_and(skeleton_backend& result, unsigned short arg); 622 void eval_bitwise_and(skeleton_backend& result, unsigned char arg); 623 void eval_bitwise_and(skeleton_backend& result, char arg); 624 void eval_bitwise_and(skeleton_backend& result, long long arg); 625 void eval_bitwise_and(skeleton_backend& result, long arg); 626 void eval_bitwise_and(skeleton_backend& result, int arg); 627 void eval_bitwise_and(skeleton_backend& result, short arg); 628 void eval_bitwise_and(skeleton_backend& result, signed char arg); 629 void eval_bitwise_and(skeleton_backend& result, long double arg); 630 void eval_bitwise_and(skeleton_backend& result, double arg); 631 void eval_bitwise_and(skeleton_backend& result, float arg); 632 633 void eval_bitwise_and(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b); 634 void eval_bitwise_and(skeleton_backend& result, const skeleton_backend& a, unsigned long long b); 635 void eval_bitwise_and(skeleton_backend& result, const skeleton_backend& a, unsigned long b); 636 void eval_bitwise_and(skeleton_backend& result, const skeleton_backend& a, unsigned b); 637 void eval_bitwise_and(skeleton_backend& result, const skeleton_backend& a, unsigned short b); 638 void eval_bitwise_and(skeleton_backend& result, const skeleton_backend& a, unsigned char b); 639 void eval_bitwise_and(skeleton_backend& result, const skeleton_backend& a, long long b); 640 void eval_bitwise_and(skeleton_backend& result, const skeleton_backend& a, long b); 641 void eval_bitwise_and(skeleton_backend& result, const skeleton_backend& a, int b); 642 void eval_bitwise_and(skeleton_backend& result, const skeleton_backend& a, short b); 643 void eval_bitwise_and(skeleton_backend& result, const skeleton_backend& a, signed char b); 644 void eval_bitwise_and(skeleton_backend& result, const skeleton_backend& a, char b); 645 void eval_bitwise_and(skeleton_backend& result, const skeleton_backend& a, long double b); 646 void eval_bitwise_and(skeleton_backend& result, const skeleton_backend& a, double b); 647 void eval_bitwise_and(skeleton_backend& result, const skeleton_backend& a, float b); 648 649 void eval_bitwise_and(skeleton_backend& result, unsigned long long b, const skeleton_backend& a); 650 void eval_bitwise_and(skeleton_backend& result, unsigned long b, const skeleton_backend& a); 651 void eval_bitwise_and(skeleton_backend& result, unsigned b, const skeleton_backend& a); 652 void eval_bitwise_and(skeleton_backend& result, unsigned short b, const skeleton_backend& a); 653 void eval_bitwise_and(skeleton_backend& result, unsigned char b, const skeleton_backend& a); 654 void eval_bitwise_and(skeleton_backend& result, long long b, const skeleton_backend& a); 655 void eval_bitwise_and(skeleton_backend& result, long b, const skeleton_backend& a); 656 void eval_bitwise_and(skeleton_backend& result, int b, const skeleton_backend& a); 657 void eval_bitwise_and(skeleton_backend& result, short b, const skeleton_backend& a); 658 void eval_bitwise_and(skeleton_backend& result, signed char b, const skeleton_backend& a); 659 void eval_bitwise_and(skeleton_backend& result, char b, const skeleton_backend& a); 660 void eval_bitwise_and(skeleton_backend& result, long double b, const skeleton_backend& a); 661 void eval_bitwise_and(skeleton_backend& result, double b, const skeleton_backend& a); 662 void eval_bitwise_and(skeleton_backend& result, float b, const skeleton_backend& a); 663 #endif 664 // 665 // bitwise OR: 666 // 667 #if 0 668 void eval_bitwise_or(skeleton_backend& result, unsigned long long arg); 669 void eval_bitwise_or(skeleton_backend& result, unsigned long arg); 670 void eval_bitwise_or(skeleton_backend& result, unsigned arg); 671 void eval_bitwise_or(skeleton_backend& result, unsigned short arg); 672 void eval_bitwise_or(skeleton_backend& result, unsigned char arg); 673 void eval_bitwise_or(skeleton_backend& result, char arg); 674 void eval_bitwise_or(skeleton_backend& result, long long arg); 675 void eval_bitwise_or(skeleton_backend& result, long arg); 676 void eval_bitwise_or(skeleton_backend& result, int arg); 677 void eval_bitwise_or(skeleton_backend& result, short arg); 678 void eval_bitwise_or(skeleton_backend& result, signed char arg); 679 void eval_bitwise_or(skeleton_backend& result, long double arg); 680 void eval_bitwise_or(skeleton_backend& result, double arg); 681 void eval_bitwise_or(skeleton_backend& result, float arg); 682 683 void eval_bitwise_or(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b); 684 void eval_bitwise_or(skeleton_backend& result, const skeleton_backend& a, unsigned long long b); 685 void eval_bitwise_or(skeleton_backend& result, const skeleton_backend& a, unsigned long b); 686 void eval_bitwise_or(skeleton_backend& result, const skeleton_backend& a, unsigned b); 687 void eval_bitwise_or(skeleton_backend& result, const skeleton_backend& a, unsigned short b); 688 void eval_bitwise_or(skeleton_backend& result, const skeleton_backend& a, unsigned char b); 689 void eval_bitwise_or(skeleton_backend& result, const skeleton_backend& a, long long b); 690 void eval_bitwise_or(skeleton_backend& result, const skeleton_backend& a, long b); 691 void eval_bitwise_or(skeleton_backend& result, const skeleton_backend& a, int b); 692 void eval_bitwise_or(skeleton_backend& result, const skeleton_backend& a, short b); 693 void eval_bitwise_or(skeleton_backend& result, const skeleton_backend& a, signed char b); 694 void eval_bitwise_or(skeleton_backend& result, const skeleton_backend& a, char b); 695 void eval_bitwise_or(skeleton_backend& result, const skeleton_backend& a, long double b); 696 void eval_bitwise_or(skeleton_backend& result, const skeleton_backend& a, double b); 697 void eval_bitwise_or(skeleton_backend& result, const skeleton_backend& a, float b); 698 699 void eval_bitwise_or(skeleton_backend& result, unsigned long long b, const skeleton_backend& a); 700 void eval_bitwise_or(skeleton_backend& result, unsigned long b, const skeleton_backend& a); 701 void eval_bitwise_or(skeleton_backend& result, unsigned b, const skeleton_backend& a); 702 void eval_bitwise_or(skeleton_backend& result, unsigned short b, const skeleton_backend& a); 703 void eval_bitwise_or(skeleton_backend& result, unsigned char b, const skeleton_backend& a); 704 void eval_bitwise_or(skeleton_backend& result, long long b, const skeleton_backend& a); 705 void eval_bitwise_or(skeleton_backend& result, long b, const skeleton_backend& a); 706 void eval_bitwise_or(skeleton_backend& result, int b, const skeleton_backend& a); 707 void eval_bitwise_or(skeleton_backend& result, short b, const skeleton_backend& a); 708 void eval_bitwise_or(skeleton_backend& result, signed char b, const skeleton_backend& a); 709 void eval_bitwise_or(skeleton_backend& result, char b, const skeleton_backend& a); 710 void eval_bitwise_or(skeleton_backend& result, long double b, const skeleton_backend& a); 711 void eval_bitwise_or(skeleton_backend& result, double b, const skeleton_backend& a); 712 void eval_bitwise_or(skeleton_backend& result, float b, const skeleton_backend& a); 713 #endif 714 // 715 // bitwise XOR: 716 // 717 #if 0 718 void eval_bitwise_xor(skeleton_backend& result, unsigned long long arg); 719 void eval_bitwise_xor(skeleton_backend& result, unsigned long arg); 720 void eval_bitwise_xor(skeleton_backend& result, unsigned arg); 721 void eval_bitwise_xor(skeleton_backend& result, unsigned short arg); 722 void eval_bitwise_xor(skeleton_backend& result, unsigned char arg); 723 void eval_bitwise_xor(skeleton_backend& result, char arg); 724 void eval_bitwise_xor(skeleton_backend& result, long long arg); 725 void eval_bitwise_xor(skeleton_backend& result, long arg); 726 void eval_bitwise_xor(skeleton_backend& result, int arg); 727 void eval_bitwise_xor(skeleton_backend& result, short arg); 728 void eval_bitwise_xor(skeleton_backend& result, signed char arg); 729 void eval_bitwise_xor(skeleton_backend& result, long double arg); 730 void eval_bitwise_xor(skeleton_backend& result, double arg); 731 void eval_bitwise_xor(skeleton_backend& result, float arg); 732 733 void eval_bitwise_xor(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b); 734 void eval_bitwise_xor(skeleton_backend& result, const skeleton_backend& a, unsigned long long b); 735 void eval_bitwise_xor(skeleton_backend& result, const skeleton_backend& a, unsigned long b); 736 void eval_bitwise_xor(skeleton_backend& result, const skeleton_backend& a, unsigned b); 737 void eval_bitwise_xor(skeleton_backend& result, const skeleton_backend& a, unsigned short b); 738 void eval_bitwise_xor(skeleton_backend& result, const skeleton_backend& a, unsigned char b); 739 void eval_bitwise_xor(skeleton_backend& result, const skeleton_backend& a, long long b); 740 void eval_bitwise_xor(skeleton_backend& result, const skeleton_backend& a, long b); 741 void eval_bitwise_xor(skeleton_backend& result, const skeleton_backend& a, int b); 742 void eval_bitwise_xor(skeleton_backend& result, const skeleton_backend& a, short b); 743 void eval_bitwise_xor(skeleton_backend& result, const skeleton_backend& a, signed char b); 744 void eval_bitwise_xor(skeleton_backend& result, const skeleton_backend& a, char b); 745 void eval_bitwise_xor(skeleton_backend& result, const skeleton_backend& a, long double b); 746 void eval_bitwise_xor(skeleton_backend& result, const skeleton_backend& a, double b); 747 void eval_bitwise_xor(skeleton_backend& result, const skeleton_backend& a, float b); 748 749 void eval_bitwise_xor(skeleton_backend& result, unsigned long long b, const skeleton_backend& a); 750 void eval_bitwise_xor(skeleton_backend& result, unsigned long b, const skeleton_backend& a); 751 void eval_bitwise_xor(skeleton_backend& result, unsigned b, const skeleton_backend& a); 752 void eval_bitwise_xor(skeleton_backend& result, unsigned short b, const skeleton_backend& a); 753 void eval_bitwise_xor(skeleton_backend& result, unsigned char b, const skeleton_backend& a); 754 void eval_bitwise_xor(skeleton_backend& result, long long b, const skeleton_backend& a); 755 void eval_bitwise_xor(skeleton_backend& result, long b, const skeleton_backend& a); 756 void eval_bitwise_xor(skeleton_backend& result, int b, const skeleton_backend& a); 757 void eval_bitwise_xor(skeleton_backend& result, short b, const skeleton_backend& a); 758 void eval_bitwise_xor(skeleton_backend& result, signed char b, const skeleton_backend& a); 759 void eval_bitwise_xor(skeleton_backend& result, char b, const skeleton_backend& a); 760 void eval_bitwise_xor(skeleton_backend& result, long double b, const skeleton_backend& a); 761 void eval_bitwise_xor(skeleton_backend& result, double b, const skeleton_backend& a); 762 void eval_bitwise_xor(skeleton_backend& result, float b, const skeleton_backend& a); 763 #endif 764 // 765 // left and right shift: 766 // 767 //void eval_left_shift(skeleton_backend& result, const skeleton_backend& arg, std::size_t shift); 768 //void eval_right_shift(skeleton_backend& result, const skeleton_backend& arg, std::size_t shift); 769 // 770 // Quotient and remainder: 771 // 772 // void eval_qr(const skeleton_backend& numerator, const skeleton_backend& denominator, skeleton_backend& quotient, skeleteon_backend& remainder); 773 // 774 // Misc integer ops: 775 // 776 // unsigned long long eval_integer_modulus(const skeleton_backend& arg, unsigned long long modulus); 777 // unsigned long eval_integer_modulus(const skeleton_backend& arg, unsigned long modulus); 778 // unsigned eval_integer_modulus(const skeleton_backend& arg, unsigned modulus); 779 // unsigned short eval_integer_modulus(const skeleton_backend& arg, unsigned short modulus); 780 // unsigned char eval_integer_modulus(const skeleton_backend& arg, unsigned char modulus); 781 // 782 // std::size_t eval_lsb(const skeleton_backend& arg); 783 // std::size_t eval_msb(const skeleton_backend& arg); 784 // bool eval_bit_test(const skeleton_backend& arg, std::size_t bit); 785 // void eval_bit_set(const skeleton_backend& arg, std::size_t bit); 786 // void eval_bit_unset(const skeleton_backend& arg, std::size_t bit); 787 // void eval_bit_flip(const skeleton_backend& arg, std::size_t bit); 788 // 789 // GCD/LCD: 790 // 791 #if 0 792 void eval_gcd(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b); 793 void eval_gcd(skeleton_backend& result, const skeleton_backend& a, unsigned long long b); 794 void eval_gcd(skeleton_backend& result, const skeleton_backend& a, unsigned long b); 795 void eval_gcd(skeleton_backend& result, const skeleton_backend& a, unsigned b); 796 void eval_gcd(skeleton_backend& result, const skeleton_backend& a, unsigned short b); 797 void eval_gcd(skeleton_backend& result, const skeleton_backend& a, unsigned char b); 798 void eval_gcd(skeleton_backend& result, const skeleton_backend& a, long long b); 799 void eval_gcd(skeleton_backend& result, const skeleton_backend& a, long b); 800 void eval_gcd(skeleton_backend& result, const skeleton_backend& a, int b); 801 void eval_gcd(skeleton_backend& result, const skeleton_backend& a, short b); 802 void eval_gcd(skeleton_backend& result, const skeleton_backend& a, signed char b); 803 void eval_gcd(skeleton_backend& result, const skeleton_backend& a, char b); 804 void eval_gcd(skeleton_backend& result, unsigned long long a, const skeleton_backend& b); 805 void eval_gcd(skeleton_backend& result, unsigned long a, const skeleton_backend& b); 806 void eval_gcd(skeleton_backend& result, unsigned a, const skeleton_backend& b); 807 void eval_gcd(skeleton_backend& result, unsigned short a, const skeleton_backend& b); 808 void eval_gcd(skeleton_backend& result, unsigned char a, const skeleton_backend& b); 809 void eval_gcd(skeleton_backend& result, long long a, const skeleton_backend& b); 810 void eval_gcd(skeleton_backend& result, long a, const skeleton_backend& b); 811 void eval_gcd(skeleton_backend& result, int a, const skeleton_backend& b); 812 void eval_gcd(skeleton_backend& result, short a, const skeleton_backend& b); 813 void eval_gcd(skeleton_backend& result, signed char a, const skeleton_backend& b); 814 void eval_gcd(skeleton_backend& result, char a, const skeleton_backend& b); 815 816 void eval_lcm(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b); 817 void eval_lcm(skeleton_backend& result, const skeleton_backend& a, unsigned long long b); 818 void eval_lcm(skeleton_backend& result, const skeleton_backend& a, unsigned long b); 819 void eval_lcm(skeleton_backend& result, const skeleton_backend& a, unsigned b); 820 void eval_lcm(skeleton_backend& result, const skeleton_backend& a, unsigned short b); 821 void eval_lcm(skeleton_backend& result, const skeleton_backend& a, unsigned char b); 822 void eval_lcm(skeleton_backend& result, const skeleton_backend& a, long long b); 823 void eval_lcm(skeleton_backend& result, const skeleton_backend& a, long b); 824 void eval_lcm(skeleton_backend& result, const skeleton_backend& a, int b); 825 void eval_lcm(skeleton_backend& result, const skeleton_backend& a, short b); 826 void eval_lcm(skeleton_backend& result, const skeleton_backend& a, signed char b); 827 void eval_lcm(skeleton_backend& result, const skeleton_backend& a, char b); 828 void eval_lcm(skeleton_backend& result, unsigned long long a, const skeleton_backend& b); 829 void eval_lcm(skeleton_backend& result, unsigned long a, const skeleton_backend& b); 830 void eval_lcm(skeleton_backend& result, unsigned a, const skeleton_backend& b); 831 void eval_lcm(skeleton_backend& result, unsigned short a, const skeleton_backend& b); 832 void eval_lcm(skeleton_backend& result, unsigned char a, const skeleton_backend& b); 833 void eval_lcm(skeleton_backend& result, long long a, const skeleton_backend& b); 834 void eval_lcm(skeleton_backend& result, long a, const skeleton_backend& b); 835 void eval_lcm(skeleton_backend& result, int a, const skeleton_backend& b); 836 void eval_lcm(skeleton_backend& result, short a, const skeleton_backend& b); 837 void eval_lcm(skeleton_backend& result, signed char a, const skeleton_backend& b); 838 void eval_lcm(skeleton_backend& result, char a, const skeleton_backend& b); 839 #endif 840 // 841 // Modular exponentiation: 842 // 843 #if 0 844 void eval_powm(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b, const skeleton_backend& c); // a^b % c 845 void eval_powm(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b, unsigned long long c); 846 void eval_powm(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b, unsigned long c); 847 void eval_powm(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b, unsigned c); 848 void eval_powm(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b, unsigned short c); 849 void eval_powm(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b, unsigned char c); 850 void eval_powm(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b, long long c); 851 void eval_powm(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b, long c); 852 void eval_powm(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b, int c); 853 void eval_powm(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b, short c); 854 void eval_powm(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b, signed char c); 855 856 void eval_powm(skeleton_backend& result, const skeleton_backend& a, unsigned long long b, const skeleton_backend& c); 857 void eval_powm(skeleton_backend& result, const skeleton_backend& a, unsigned long b, const skeleton_backend& c); 858 void eval_powm(skeleton_backend& result, const skeleton_backend& a, unsigned b, const skeleton_backend& c); 859 void eval_powm(skeleton_backend& result, const skeleton_backend& a, unsigned short b, const skeleton_backend& c); 860 void eval_powm(skeleton_backend& result, const skeleton_backend& a, unsigned char b, const skeleton_backend& c); 861 void eval_powm(skeleton_backend& result, const skeleton_backend& a, long long b, const skeleton_backend& c); 862 void eval_powm(skeleton_backend& result, const skeleton_backend& a, long b, const skeleton_backend& c); 863 void eval_powm(skeleton_backend& result, const skeleton_backend& a, int b, const skeleton_backend& c); 864 void eval_powm(skeleton_backend& result, const skeleton_backend& a, short b, const skeleton_backend& c); 865 void eval_powm(skeleton_backend& result, const skeleton_backend& a, signed char b, const skeleton_backend& c); 866 867 void eval_powm(skeleton_backend& result, const skeleton_backend& a, unsigned long long b, unsigned long long c); 868 void eval_powm(skeleton_backend& result, const skeleton_backend& a, unsigned long b, unsigned long c); 869 void eval_powm(skeleton_backend& result, const skeleton_backend& a, unsigned b, unsigned c); 870 void eval_powm(skeleton_backend& result, const skeleton_backend& a, unsigned short b, unsigned short c); 871 void eval_powm(skeleton_backend& result, const skeleton_backend& a, unsigned char b, unsigned char c); 872 void eval_powm(skeleton_backend& result, const skeleton_backend& a, long long b, long long c); 873 void eval_powm(skeleton_backend& result, const skeleton_backend& a, long b, long c); 874 void eval_powm(skeleton_backend& result, const skeleton_backend& a, int b, int c); 875 void eval_powm(skeleton_backend& result, const skeleton_backend& a, short b, short c); 876 void eval_powm(skeleton_backend& result, const skeleton_backend& a, signed char b, signed char c); 877 #endif 878 // 879 // Integer sqrt: 880 // 881 // void eval_integer_sqrt(skeleton_backend& result, const skeleton_backend& arg, skeleton_backend& remainder); 882 883 /********************************************************************************************* 884 885 FLOATING POINT FUNCTIONS 886 887 ***********************************************************************************************/ 888 889 #if 0 890 891 int eval_fpclassify(const skeleton_backend& arg); 892 void eval_trunc(skeleton_backend& result, const skeleton_backend& arg); 893 void eval_round(skeleton_backend& result, const skeleton_backend& arg); 894 void eval_exp(skeleton_backend& result, const skeleton_backend& arg); 895 void eval_exp2(skeleton_backend& result, const skeleton_backend& arg); 896 void eval_log(skeleton_backend& result, const skeleton_backend& arg); 897 void eval_log10(skeleton_backend& result, const skeleton_backend& arg); 898 void eval_sin(skeleton_backend& result, const skeleton_backend& arg); 899 void eval_cos(skeleton_backend& result, const skeleton_backend& arg); 900 void eval_tan(skeleton_backend& result, const skeleton_backend& arg); 901 void eval_asin(skeleton_backend& result, const skeleton_backend& arg); 902 void eval_acos(skeleton_backend& result, const skeleton_backend& arg); 903 void eval_atan(skeleton_backend& result, const skeleton_backend& arg); 904 void eval_sinh(skeleton_backend& result, const skeleton_backend& arg); 905 void eval_cosh(skeleton_backend& result, const skeleton_backend& arg); 906 void eval_tanh(skeleton_backend& result, const skeleton_backend& arg); 907 void eval_asinh(skeleton_backend& result, const skeleton_backend& arg); 908 void eval_acosh(skeleton_backend& result, const skeleton_backend& arg); 909 void eval_atanh(skeleton_backend& result, const skeleton_backend& arg); 910 void eval_fmod(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b); 911 void eval_modf(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b); 912 void eval_pow(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b); 913 void eval_atan2(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b); 914 void eval_scalbn(skeleton_backend& result, const skeleton_backend& arg, skeleton_backend::exponent_type e); 915 void eval_scalbln(skeleton_backend& result, const skeleton_backend& arg, skeleton_backend::exponent_type e); 916 skeleton_type::exponent_type eval_ilogb(const skeleton_backend& arg); 917 918 void eval_remquo(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b, int* p_n); 919 void eval_remquo(skeleton_backend& result, const skeleton_backend& a, unsigned long long b, int* p_n); 920 void eval_remquo(skeleton_backend& result, const skeleton_backend& a, unsigned long b, int* p_n); 921 void eval_remquo(skeleton_backend& result, const skeleton_backend& a, unsigned b, int* p_n); 922 void eval_remquo(skeleton_backend& result, const skeleton_backend& a, unsigned short b, int* p_n); 923 void eval_remquo(skeleton_backend& result, const skeleton_backend& a, unsigned char b, int* p_n); 924 void eval_remquo(skeleton_backend& result, const skeleton_backend& a, long long b, int* p_n); 925 void eval_remquo(skeleton_backend& result, const skeleton_backend& a, long b, int* p_n); 926 void eval_remquo(skeleton_backend& result, const skeleton_backend& a, int b, int* p_n); 927 void eval_remquo(skeleton_backend& result, const skeleton_backend& a, short b, int* p_n); 928 void eval_remquo(skeleton_backend& result, const skeleton_backend& a, signed char b, int* p_n); 929 void eval_remquo(skeleton_backend& result, const skeleton_backend& a, long double b, int* p_n); 930 void eval_remquo(skeleton_backend& result, const skeleton_backend& a, double b, int* p_n); 931 void eval_remquo(skeleton_backend& result, const skeleton_backend& a, float b, int* p_n); 932 void eval_remquo(skeleton_backend& result, unsigned long long a, const skeleton_backend& b, int* p_n); 933 void eval_remquo(skeleton_backend& result, unsigned long a, const skeleton_backend& b, int* p_n); 934 void eval_remquo(skeleton_backend& result, unsigned a, const skeleton_backend& b, int* p_n); 935 void eval_remquo(skeleton_backend& result, unsigned short a, const skeleton_backend& b, int* p_n); 936 void eval_remquo(skeleton_backend& result, unsigned char a, const skeleton_backend& b, int* p_n); 937 void eval_remquo(skeleton_backend& result, long long a, const skeleton_backend& b, int* p_n); 938 void eval_remquo(skeleton_backend& result, long a, const skeleton_backend& b, int* p_n); 939 void eval_remquo(skeleton_backend& result, int a, const skeleton_backend& b, int* p_n); 940 void eval_remquo(skeleton_backend& result, short a, const skeleton_backend& b, int* p_n); 941 void eval_remquo(skeleton_backend& result, signed char a, const skeleton_backend& b, int* p_n); 942 943 void eval_remainder(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b); 944 void eval_remainder(skeleton_backend& result, const skeleton_backend& a, unsigned long long b); 945 void eval_remainder(skeleton_backend& result, const skeleton_backend& a, unsigned long b); 946 void eval_remainder(skeleton_backend& result, const skeleton_backend& a, unsigned b); 947 void eval_remainder(skeleton_backend& result, const skeleton_backend& a, unsigned short b); 948 void eval_remainder(skeleton_backend& result, const skeleton_backend& a, unsigned char b); 949 void eval_remainder(skeleton_backend& result, const skeleton_backend& a, long long b); 950 void eval_remainder(skeleton_backend& result, const skeleton_backend& a, long b); 951 void eval_remainder(skeleton_backend& result, const skeleton_backend& a, int b); 952 void eval_remainder(skeleton_backend& result, const skeleton_backend& a, short b); 953 void eval_remainder(skeleton_backend& result, const skeleton_backend& a, signed char b); 954 void eval_remainder(skeleton_backend& result, const skeleton_backend& a, long double b); 955 void eval_remainder(skeleton_backend& result, const skeleton_backend& a, double b); 956 void eval_remainder(skeleton_backend& result, const skeleton_backend& a, float b); 957 void eval_remainder(skeleton_backend& result, unsigned long long a, const skeleton_backend& b); 958 void eval_remainder(skeleton_backend& result, unsigned long a, const skeleton_backend& b); 959 void eval_remainder(skeleton_backend& result, unsigned a, const skeleton_backend& b); 960 void eval_remainder(skeleton_backend& result, unsigned short a, const skeleton_backend& b); 961 void eval_remainder(skeleton_backend& result, unsigned char a, const skeleton_backend& b); 962 void eval_remainder(skeleton_backend& result, long long a, const skeleton_backend& b); 963 void eval_remainder(skeleton_backend& result, long a, const skeleton_backend& b); 964 void eval_remainder(skeleton_backend& result, int a, const skeleton_backend& b); 965 void eval_remainder(skeleton_backend& result, short a, const skeleton_backend& b); 966 void eval_remainder(skeleton_backend& result, signed char a, const skeleton_backend& b); 967 968 void eval_fdim(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b); 969 void eval_fdim(skeleton_backend& result, const skeleton_backend& a, unsigned long long b); 970 void eval_fdim(skeleton_backend& result, const skeleton_backend& a, unsigned long b); 971 void eval_fdim(skeleton_backend& result, const skeleton_backend& a, unsigned b); 972 void eval_fdim(skeleton_backend& result, const skeleton_backend& a, unsigned short b); 973 void eval_fdim(skeleton_backend& result, const skeleton_backend& a, unsigned char b); 974 void eval_fdim(skeleton_backend& result, const skeleton_backend& a, long long b); 975 void eval_fdim(skeleton_backend& result, const skeleton_backend& a, long b); 976 void eval_fdim(skeleton_backend& result, const skeleton_backend& a, int b); 977 void eval_fdim(skeleton_backend& result, const skeleton_backend& a, short b); 978 void eval_fdim(skeleton_backend& result, const skeleton_backend& a, signed char b); 979 void eval_fdim(skeleton_backend& result, const skeleton_backend& a, long double b); 980 void eval_fdim(skeleton_backend& result, const skeleton_backend& a, double b); 981 void eval_fdim(skeleton_backend& result, const skeleton_backend& a, float b); 982 void eval_fdim(skeleton_backend& result, unsigned long long a, const skeleton_backend& b); 983 void eval_fdim(skeleton_backend& result, unsigned long a, const skeleton_backend& b); 984 void eval_fdim(skeleton_backend& result, unsigned a, const skeleton_backend& b); 985 void eval_fdim(skeleton_backend& result, unsigned short a, const skeleton_backend& b); 986 void eval_fdim(skeleton_backend& result, unsigned char a, const skeleton_backend& b); 987 void eval_fdim(skeleton_backend& result, long long a, const skeleton_backend& b); 988 void eval_fdim(skeleton_backend& result, long a, const skeleton_backend& b); 989 void eval_fdim(skeleton_backend& result, int a, const skeleton_backend& b); 990 void eval_fdim(skeleton_backend& result, short a, const skeleton_backend& b); 991 void eval_fdim(skeleton_backend& result, signed char a, const skeleton_backend& b); 992 993 void eval_fmax(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b); 994 void eval_fmax(skeleton_backend& result, const skeleton_backend& a, unsigned long long b); 995 void eval_fmax(skeleton_backend& result, const skeleton_backend& a, unsigned long b); 996 void eval_fmax(skeleton_backend& result, const skeleton_backend& a, unsigned b); 997 void eval_fmax(skeleton_backend& result, const skeleton_backend& a, unsigned short b); 998 void eval_fmax(skeleton_backend& result, const skeleton_backend& a, unsigned char b); 999 void eval_fmax(skeleton_backend& result, const skeleton_backend& a, long long b); 1000 void eval_fmax(skeleton_backend& result, const skeleton_backend& a, long b); 1001 void eval_fmax(skeleton_backend& result, const skeleton_backend& a, int b); 1002 void eval_fmax(skeleton_backend& result, const skeleton_backend& a, short b); 1003 void eval_fmax(skeleton_backend& result, const skeleton_backend& a, signed char b); 1004 void eval_fmax(skeleton_backend& result, const skeleton_backend& a, long double b); 1005 void eval_fmax(skeleton_backend& result, const skeleton_backend& a, double b); 1006 void eval_fmax(skeleton_backend& result, const skeleton_backend& a, float b); 1007 void eval_fmax(skeleton_backend& result, unsigned long long a, const skeleton_backend& b); 1008 void eval_fmax(skeleton_backend& result, unsigned long a, const skeleton_backend& b); 1009 void eval_fmax(skeleton_backend& result, unsigned a, const skeleton_backend& b); 1010 void eval_fmax(skeleton_backend& result, unsigned short a, const skeleton_backend& b); 1011 void eval_fmax(skeleton_backend& result, unsigned char a, const skeleton_backend& b); 1012 void eval_fmax(skeleton_backend& result, long long a, const skeleton_backend& b); 1013 void eval_fmax(skeleton_backend& result, long a, const skeleton_backend& b); 1014 void eval_fmax(skeleton_backend& result, int a, const skeleton_backend& b); 1015 void eval_fmax(skeleton_backend& result, short a, const skeleton_backend& b); 1016 void eval_fmax(skeleton_backend& result, signed char a, const skeleton_backend& b); 1017 1018 void eval_fmin(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b); 1019 void eval_fmin(skeleton_backend& result, const skeleton_backend& a, unsigned long long b); 1020 void eval_fmin(skeleton_backend& result, const skeleton_backend& a, unsigned long b); 1021 void eval_fmin(skeleton_backend& result, const skeleton_backend& a, unsigned b); 1022 void eval_fmin(skeleton_backend& result, const skeleton_backend& a, unsigned short b); 1023 void eval_fmin(skeleton_backend& result, const skeleton_backend& a, unsigned char b); 1024 void eval_fmin(skeleton_backend& result, const skeleton_backend& a, long long b); 1025 void eval_fmin(skeleton_backend& result, const skeleton_backend& a, long b); 1026 void eval_fmin(skeleton_backend& result, const skeleton_backend& a, int b); 1027 void eval_fmin(skeleton_backend& result, const skeleton_backend& a, short b); 1028 void eval_fmin(skeleton_backend& result, const skeleton_backend& a, signed char b); 1029 void eval_fmin(skeleton_backend& result, const skeleton_backend& a, long double b); 1030 void eval_fmin(skeleton_backend& result, const skeleton_backend& a, double b); 1031 void eval_fmin(skeleton_backend& result, const skeleton_backend& a, float b); 1032 void eval_fmin(skeleton_backend& result, unsigned long long a, const skeleton_backend& b); 1033 void eval_fmin(skeleton_backend& result, unsigned long a, const skeleton_backend& b); 1034 void eval_fmin(skeleton_backend& result, unsigned a, const skeleton_backend& b); 1035 void eval_fmin(skeleton_backend& result, unsigned short a, const skeleton_backend& b); 1036 void eval_fmin(skeleton_backend& result, unsigned char a, const skeleton_backend& b); 1037 void eval_fmin(skeleton_backend& result, long long a, const skeleton_backend& b); 1038 void eval_fmin(skeleton_backend& result, long a, const skeleton_backend& b); 1039 void eval_fmin(skeleton_backend& result, int a, const skeleton_backend& b); 1040 void eval_fmin(skeleton_backend& result, short a, const skeleton_backend& b); 1041 void eval_fmin(skeleton_backend& result, signed char a, const skeleton_backend& b); 1042 1043 void eval_hypot(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b); 1044 void eval_hypot(skeleton_backend& result, const skeleton_backend& a, unsigned long long b); 1045 void eval_hypot(skeleton_backend& result, const skeleton_backend& a, unsigned long b); 1046 void eval_hypot(skeleton_backend& result, const skeleton_backend& a, unsigned b); 1047 void eval_hypot(skeleton_backend& result, const skeleton_backend& a, unsigned short b); 1048 void eval_hypot(skeleton_backend& result, const skeleton_backend& a, unsigned char b); 1049 void eval_hypot(skeleton_backend& result, const skeleton_backend& a, long long b); 1050 void eval_hypot(skeleton_backend& result, const skeleton_backend& a, long b); 1051 void eval_hypot(skeleton_backend& result, const skeleton_backend& a, int b); 1052 void eval_hypot(skeleton_backend& result, const skeleton_backend& a, short b); 1053 void eval_hypot(skeleton_backend& result, const skeleton_backend& a, signed char b); 1054 void eval_hypot(skeleton_backend& result, const skeleton_backend& a, long double b); 1055 void eval_hypot(skeleton_backend& result, const skeleton_backend& a, double b); 1056 void eval_hypot(skeleton_backend& result, const skeleton_backend& a, float b); 1057 void eval_hypot(skeleton_backend& result, unsigned long long a, const skeleton_backend& b); 1058 void eval_hypot(skeleton_backend& result, unsigned long a, const skeleton_backend& b); 1059 void eval_hypot(skeleton_backend& result, unsigned a, const skeleton_backend& b); 1060 void eval_hypot(skeleton_backend& result, unsigned short a, const skeleton_backend& b); 1061 void eval_hypot(skeleton_backend& result, unsigned char a, const skeleton_backend& b); 1062 void eval_hypot(skeleton_backend& result, long long a, const skeleton_backend& b); 1063 void eval_hypot(skeleton_backend& result, long a, const skeleton_backend& b); 1064 void eval_hypot(skeleton_backend& result, int a, const skeleton_backend& b); 1065 void eval_hypot(skeleton_backend& result, short a, const skeleton_backend& b); 1066 void eval_hypot(skeleton_backend& result, signed char a, const skeleton_backend& b); 1067 1068 void eval_logb(skeleton_backend& result, const skeleton_backend& arg); 1069 void eval_nearbtint(skeleton_backend& result, const skeleton_backend& arg); 1070 void eval_rint(skeleton_backend& result, const skeleton_backend& arg); 1071 void eval_log2(skeleton_backend& result, const skeleton_backend& arg); 1072 #endif 1073 1074 1075 } // namespace backends 1076 1077 // 1078 // Import the backend into this namespace: 1079 // 1080 using boost::multiprecision::backends::skeleton_backend; 1081 // 1082 // Typedef whatever number's make use of this backend: 1083 // 1084 typedef number<skeleton_backend, et_off> skeleton_number; 1085 // 1086 // Define a category for this number type, one of: 1087 // 1088 // number_kind_integer 1089 // number_kind_floating_point 1090 // number_kind_rational 1091 // number_kind_fixed_point 1092 // number_kind_complex 1093 // 1094 template<> 1095 struct number_category<skeleton_backend > : public mpl::int_<number_kind_floating_point> 1096 {}; 1097 1098 // 1099 // These 2 traits classes are required for complex types only: 1100 // 1101 /* 1102 template <expression_template_option ExpressionTemplates> 1103 struct component_type<number<skeleton_backend, ExpressionTemplates> > 1104 { 1105 typedef number<skeleton_real_type, ExpressionTemplates> type; 1106 }; 1107 1108 template <expression_template_option ExpressionTemplates> 1109 struct complex_result_from_scalar<number<skeleton_real_type, ExpressionTemplates> > 1110 { 1111 typedef number<skeleton_backend, ExpressionTemplates> type; 1112 }; 1113 */ 1114 1115 /************************************************************** 1116 1117 OVERLOADABLE FUNCTIONS - FLOATING POINT TYPES ONLY 1118 1119 ****************************************************************/ 1120 1121 #if 0 1122 1123 template <boost::multiprecision::expression_template_option ExpressionTemplates> 1124 int sign(const number<skeleton_backend, ExpressionTemplates>& arg); 1125 template <boost::multiprecision::expression_template_option ExpressionTemplates> 1126 int signbit(const number<skeleton_backend, ExpressionTemplates>& arg); 1127 template <boost::multiprecision::expression_template_option ExpressionTemplates> 1128 number<skeleton_backend, ExpressionTemplates> changesign(const number<skeleton_backend, ExpressionTemplates>& arg); 1129 template <boost::multiprecision::expression_template_option ExpressionTemplates> 1130 number<skeleton_backend, ExpressionTemplates> copysign(const number<skeleton_backend, ExpressionTemplates>& a, const number<skeleton_backend, ExpressionTemplates>& b); 1131 1132 template <boost::multiprecision::expression_template_option ExpressionTemplates> 1133 number<skeleton_backend, ExpressionTemplates> cbrt(const number<skeleton_backend, ExpressionTemplates>& arg); 1134 template <boost::multiprecision::expression_template_option ExpressionTemplates> 1135 number<skeleton_backend, ExpressionTemplates> erf(const number<skeleton_backend, ExpressionTemplates>& arg); 1136 template <boost::multiprecision::expression_template_option ExpressionTemplates> 1137 number<skeleton_backend, ExpressionTemplates> erfc(const number<skeleton_backend, ExpressionTemplates>& arg); 1138 template <boost::multiprecision::expression_template_option ExpressionTemplates> 1139 number<skeleton_backend, ExpressionTemplates> expm1(const number<skeleton_backend, ExpressionTemplates>& arg); 1140 template <boost::multiprecision::expression_template_option ExpressionTemplates> 1141 number<skeleton_backend, ExpressionTemplates> log1p(const number<skeleton_backend, ExpressionTemplates>& arg); 1142 template <boost::multiprecision::expression_template_option ExpressionTemplates> 1143 number<skeleton_backend, ExpressionTemplates> tgamma(const number<skeleton_backend, ExpressionTemplates>& arg); 1144 template <boost::multiprecision::expression_template_option ExpressionTemplates> 1145 number<skeleton_backend, ExpressionTemplates> lgamma(const number<skeleton_backend, ExpressionTemplates>& arg); 1146 1147 template <boost::multiprecision::expression_template_option ExpressionTemplates> 1148 long lrint(const number<skeleton_backend, ExpressionTemplates>& arg); 1149 template <boost::multiprecision::expression_template_option ExpressionTemplates> 1150 long long llrint(const number<skeleton_backend, ExpressionTemplates>& arg); 1151 1152 template <boost::multiprecision::expression_template_option ExpressionTemplates> 1153 number<skeleton_backend, ExpressionTemplates> nextafter(const number<skeleton_backend, ExpressionTemplates>& a, const number<skeleton_backend, ExpressionTemplates>& b); 1154 template <boost::multiprecision::expression_template_option ExpressionTemplates> 1155 number<skeleton_backend, ExpressionTemplates> nexttoward(const number<skeleton_backend, ExpressionTemplates>& a, const number<skeleton_backend, ExpressionTemplates>& b); 1156 1157 #endif 1158 1159 }} // namespace boost::multiprecision 1160 1161 /********************************************************************************** 1162 1163 FLOATING POINT ONLY 1164 Nice to have stuff for better integration with Boost.Math. 1165 1166 ***********************************************************************************/ 1167 1168 namespace boost { 1169 namespace math { 1170 namespace tools { 1171 1172 #if 0 1173 1174 template <> 1175 int digits<boost::multiprecision::number<boost::multiprecision::skeleton_number> >(); 1176 1177 template <> 1178 boost::multiprecision::mpfr_float max_value<boost::multiprecision::skeleton_number>(); 1179 1180 template <> 1181 boost::multiprecision::mpfr_float min_value<boost::multiprecision::skeleton_number>(); 1182 1183 #endif 1184 1185 } // namespace tools 1186 1187 namespace constants { 1188 namespace detail { 1189 1190 #if 0 1191 template <boost::multiprecision::expression_template_option ExpressionTemplates> 1192 struct constant_pi<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> > 1193 { 1194 typedef boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> result_type; 1195 // 1196 // Fixed N-digit precision, return reference to internal/cached object: 1197 // 1198 template <int N> 1199 static inline const result_type& get(const boost::integral_constant<int, N>&); 1200 // 1201 // Variable precision, returns fresh result each time (unless precision is unchanged from last call): 1202 // 1203 static inline const result_type get(const boost::integral_constant<int, 0>&); 1204 }; 1205 // 1206 // Plus any other constants supported natively by this type.... 1207 // 1208 #endif 1209 1210 } // namespace detail 1211 } // namespace constants 1212 1213 }} // namespace boost::math 1214 1215 1216 namespace std { 1217 1218 template <boost::multiprecision::expression_template_option ExpressionTemplates> 1219 class numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> > 1220 { 1221 typedef boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> number_type; 1222 1223 public: 1224 BOOST_STATIC_CONSTEXPR bool is_specialized = true; 1225 static number_type(min)(); 1226 static number_type(max)(); 1227 static number_type lowest(); 1228 BOOST_STATIC_CONSTEXPR int digits = 0; 1229 BOOST_STATIC_CONSTEXPR int digits10 = 0; 1230 BOOST_STATIC_CONSTEXPR int max_digits10 = 0; 1231 BOOST_STATIC_CONSTEXPR bool is_signed = false; 1232 BOOST_STATIC_CONSTEXPR bool is_integer = false; 1233 BOOST_STATIC_CONSTEXPR bool is_exact = false; 1234 BOOST_STATIC_CONSTEXPR int radix = 2; 1235 static number_type epsilon(); 1236 static number_type round_error(); 1237 BOOST_STATIC_CONSTEXPR int min_exponent = 0; 1238 BOOST_STATIC_CONSTEXPR int min_exponent10 = 0; 1239 BOOST_STATIC_CONSTEXPR int max_exponent = 0; 1240 BOOST_STATIC_CONSTEXPR int max_exponent10 = 0; 1241 BOOST_STATIC_CONSTEXPR bool has_infinity = false; 1242 BOOST_STATIC_CONSTEXPR bool has_quiet_NaN = false; 1243 BOOST_STATIC_CONSTEXPR bool has_signaling_NaN = false; 1244 BOOST_STATIC_CONSTEXPR float_denorm_style has_denorm = denorm_absent; 1245 BOOST_STATIC_CONSTEXPR bool has_denorm_loss = false; 1246 static number_type infinity(); 1247 static number_type quiet_NaN(); 1248 static number_type signaling_NaN(); 1249 static number_type denorm_min(); 1250 BOOST_STATIC_CONSTEXPR bool is_iec559 = false; 1251 BOOST_STATIC_CONSTEXPR bool is_bounded = false; 1252 BOOST_STATIC_CONSTEXPR bool is_modulo = false; 1253 BOOST_STATIC_CONSTEXPR bool traps = false; 1254 BOOST_STATIC_CONSTEXPR bool tinyness_before = false; 1255 BOOST_STATIC_CONSTEXPR float_round_style round_style = round_toward_zero; 1256 }; 1257 1258 #ifndef BOOST_NO_INCLASS_MEMBER_INITIALIZATION 1259 1260 template <boost::multiprecision::expression_template_option ExpressionTemplates> 1261 BOOST_CONSTEXPR_OR_CONST int numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::digits; 1262 template <boost::multiprecision::expression_template_option ExpressionTemplates> 1263 BOOST_CONSTEXPR_OR_CONST int numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::digits10; 1264 template <boost::multiprecision::expression_template_option ExpressionTemplates> 1265 BOOST_CONSTEXPR_OR_CONST int numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::max_digits10; 1266 template <boost::multiprecision::expression_template_option ExpressionTemplates> 1267 BOOST_CONSTEXPR_OR_CONST bool numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::is_signed; 1268 template <boost::multiprecision::expression_template_option ExpressionTemplates> 1269 BOOST_CONSTEXPR_OR_CONST bool numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::is_integer; 1270 template <boost::multiprecision::expression_template_option ExpressionTemplates> 1271 BOOST_CONSTEXPR_OR_CONST bool numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::is_exact; 1272 template <boost::multiprecision::expression_template_option ExpressionTemplates> 1273 BOOST_CONSTEXPR_OR_CONST int numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::radix; 1274 template <boost::multiprecision::expression_template_option ExpressionTemplates> 1275 BOOST_CONSTEXPR_OR_CONST int numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::min_exponent; 1276 template <boost::multiprecision::expression_template_option ExpressionTemplates> 1277 BOOST_CONSTEXPR_OR_CONST int numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::min_exponent10; 1278 template <boost::multiprecision::expression_template_option ExpressionTemplates> 1279 BOOST_CONSTEXPR_OR_CONST int numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::max_exponent; 1280 template <boost::multiprecision::expression_template_option ExpressionTemplates> 1281 BOOST_CONSTEXPR_OR_CONST int numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::max_exponent10; 1282 template <boost::multiprecision::expression_template_option ExpressionTemplates> 1283 BOOST_CONSTEXPR_OR_CONST bool numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::has_infinity; 1284 template <boost::multiprecision::expression_template_option ExpressionTemplates> 1285 BOOST_CONSTEXPR_OR_CONST bool numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::has_quiet_NaN; 1286 template <boost::multiprecision::expression_template_option ExpressionTemplates> 1287 BOOST_CONSTEXPR_OR_CONST bool numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::has_signaling_NaN; 1288 template <boost::multiprecision::expression_template_option ExpressionTemplates> 1289 BOOST_CONSTEXPR_OR_CONST float_denorm_style numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::has_denorm; 1290 template <boost::multiprecision::expression_template_option ExpressionTemplates> 1291 BOOST_CONSTEXPR_OR_CONST bool numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::has_denorm_loss; 1292 template <boost::multiprecision::expression_template_option ExpressionTemplates> 1293 BOOST_CONSTEXPR_OR_CONST bool numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::is_iec559; 1294 template <boost::multiprecision::expression_template_option ExpressionTemplates> 1295 BOOST_CONSTEXPR_OR_CONST bool numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::is_bounded; 1296 template <boost::multiprecision::expression_template_option ExpressionTemplates> 1297 BOOST_CONSTEXPR_OR_CONST bool numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::is_modulo; 1298 template <boost::multiprecision::expression_template_option ExpressionTemplates> 1299 BOOST_CONSTEXPR_OR_CONST bool numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::traps; 1300 template <boost::multiprecision::expression_template_option ExpressionTemplates> 1301 BOOST_CONSTEXPR_OR_CONST bool numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::tinyness_before; 1302 template <boost::multiprecision::expression_template_option ExpressionTemplates> 1303 BOOST_CONSTEXPR_OR_CONST float_round_style numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::round_style; 1304 1305 #endif 1306 1307 } // namespace std 1308 1309 #endif 1310