|
|
1 //! @file a68g-optimiser.h 2 //! @author J. Marcel van der Veer 3 4 //! @section Copyright 5 //! 6 //! This file is part of Algol68G - an Algol 68 compiler-interpreter. 7 //! Copyright 2001-2026 J. Marcel van der Veer [algol68g@algol68genie.nl]. 8 9 //! @section License 10 //! 11 //! This program is free software; you can redistribute it and/or modify it 12 //! under the terms of the GNU General Public License as published by the 13 //! Free Software Foundation; either version 3 of the License, or 14 //! (at your option) any later version. 15 //! 16 //! This program is distributed in the hope that it will be useful, but 17 //! WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 18 //! or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 19 //! more details. You should have received a copy of the GNU General Public 20 //! License along with this program. If not, see [http://www.gnu.org/licenses/]. 21 22 //! @section Synopsis 23 //! 24 //! Definitions for the plugin compiler. 25 26 #if !defined (__A68G_OPTIMISER_H__) 27 #define __A68G_OPTIMISER_H__ 28 29 BOOL_T constant_unit (NODE_T *); 30 BOOL_T folder_mode (MOID_T *); 31 void build_script (void); 32 void load_script (void); 33 void plugin_driver_clean (int); 34 void plugin_driver_code (void); 35 void plugin_driver_compile (void); 36 void plugin_driver_emit (FILE_T); 37 void plugin_driver_genie (void); 38 void push_unit (NODE_T *); 39 void rewrite_script_source (void); 40 41 // Library for code generator 42 43 INT_T a68g_add_int (INT_T, INT_T); 44 INT_T a68g_sub_int (INT_T, INT_T); 45 INT_T a68g_mul_int (INT_T, INT_T); 46 INT_T a68g_over_int (INT_T, INT_T); 47 INT_T a68g_mod_int (INT_T, INT_T); 48 REAL_T a68g_div_int (INT_T, INT_T); 49 50 void a68g_ln_complex (A68G_REAL *, A68G_REAL *); 51 void a68g_sqrt_complex (A68G_REAL *, A68G_REAL *); 52 void a68g_sin_complex (A68G_REAL *, A68G_REAL *); 53 void a68g_cos_complex (A68G_REAL *, A68G_REAL *); 54 void a68g_tan_complex (A68G_REAL *, A68G_REAL *); 55 void a68g_asin_complex (A68G_REAL *, A68G_REAL *); 56 void a68g_acos_complex (A68G_REAL *, A68G_REAL *); 57 void a68g_atan_complex (A68G_REAL *, A68G_REAL *); 58 void a68g_sinh_complex (A68G_REAL *, A68G_REAL *); 59 void a68g_cosh_complex (A68G_REAL *, A68G_REAL *); 60 void a68g_tanh_complex (A68G_REAL *, A68G_REAL *); 61 void a68g_asinh_real_complex (A68G_REAL *, A68G_REAL *); 62 void a68g_acosh_real_complex (A68G_REAL *, A68G_REAL *); 63 void a68g_atanh_real_complex (A68G_REAL *, A68G_REAL *); 64 65 // Operators that are inlined in compiled code 66 67 #define a68g_eq_complex(x, y) (RE (x) == RE (y) && IM (x) == IM (y)) 68 #define a68g_ne_complex(x, y) (! a68g_eq_complex (x, y)) 69 #define a68g_plusab_int(i, j) (VALUE ((A68G_INT *) ADDRESS (i)) += (j), (i)) 70 #define a68g_min_realusab_int(i, j) (VALUE ((A68G_INT *) ADDRESS (i)) -= (j), (i)) 71 #define a68g_timesab_int(i, j) (VALUE ((A68G_INT *) ADDRESS (i)) *= (j), (i)) 72 #define a68g_overab_int(i, j) (VALUE ((A68G_INT *) ADDRESS (i)) /= (j), (i)) 73 #define a68g_entier(x) ((int) floor (x)) 74 #define a68g_plusab_real(i, j) (VALUE ((A68G_REAL *) ADDRESS (i)) += (j), (i)) 75 #define a68g_min_realusab_real(i, j) (VALUE ((A68G_REAL *) ADDRESS (i)) -= (j), (i)) 76 #define a68g_timesab_real(i, j) (VALUE ((A68G_REAL *) ADDRESS (i)) *= (j), (i)) 77 #define a68g_divab_real(i, j) (VALUE ((A68G_REAL *) ADDRESS (i)) /= (j), (i)) 78 #define a68g_re_complex(z) (RE (z)) 79 #define a68g_im_complex(z) (IM (z)) 80 #define a68g_abs_real_complex(z) a68g_hypot_real (RE (z), IM (z)) 81 #define a68g_arg_complex(z) atan2 (IM (z), RE (z)) 82 83 #define a68g_i_complex(z, re, im) {\ 84 STATUS_RE (z) = INIT_MASK;\ 85 STATUS_IM (z) = INIT_MASK;\ 86 RE (z) = re;\ 87 IM (z) = im;} 88 89 #define a68g_min_realus_complex(z, x) {\ 90 STATUS_RE (z) = INIT_MASK;\ 91 STATUS_IM (z) = INIT_MASK;\ 92 RE (z) = -RE (x);\ 93 IM (z) = -IM (x);} 94 95 #define a68g_conj_complex(z, x) {\ 96 STATUS_RE (z) = INIT_MASK;\ 97 STATUS_IM (z) = INIT_MASK;\ 98 RE (z) = RE (x);\ 99 IM (z) = -IM (x);} 100 101 #define a68g_add_complex(z, x, y) {\ 102 STATUS_RE (z) = INIT_MASK;\ 103 STATUS_IM (z) = INIT_MASK;\ 104 RE (z) = RE (x) + RE (y);\ 105 IM (z) = IM (x) + IM (y);} 106 107 #define a68g_sub_complex(z, x, y) {\ 108 STATUS_RE (z) = INIT_MASK;\ 109 STATUS_IM (z) = INIT_MASK;\ 110 RE (z) = RE (x) - RE (y);\ 111 IM (z) = IM (x) - IM (y);} 112 113 #define a68g_mul_complex(z, x, y) {\ 114 STATUS_RE (z) = INIT_MASK;\ 115 STATUS_IM (z) = INIT_MASK;\ 116 RE (z) = RE (x) * RE (y) - IM (x) * IM (y);\ 117 IM (z) = IM (x) * RE (y) + RE (x) * IM (y);} 118 119 #endif
© 2001-2026 J.M. van der Veer
jmvdveer@algol68genie.nl