| 1 | #define def_wi(i) \ |
| 2 | name _w##i \ |
| 3 | _w##i: \ |
| 4 | prolog \ |
| 5 | arg $arg##i \ |
| 6 | getarg##i %r0 $arg##i \ |
| 7 | retr %r0 \ |
| 8 | epilog |
| 9 | #define def_wf(f) \ |
| 10 | name _w##f \ |
| 11 | _w##f: \ |
| 12 | prolog \ |
| 13 | arg##f $arg##f \ |
| 14 | getarg##f %f0 $arg##f \ |
| 15 | truncr##f %r0 %f0 \ |
| 16 | retr %r0 \ |
| 17 | epilog |
| 18 | #define def_fi(f, i) \ |
| 19 | name f##i \ |
| 20 | f##i: \ |
| 21 | prolog \ |
| 22 | arg $arg##i \ |
| 23 | getarg##i %r0 $arg##i \ |
| 24 | extr##f %f0 %r0 \ |
| 25 | retr##f %f0 \ |
| 26 | epilog |
| 27 | #define def_f(f) \ |
| 28 | name f##f \ |
| 29 | f##f: \ |
| 30 | prolog \ |
| 31 | arg##f $arg##f \ |
| 32 | getarg##f %f0 $arg##f \ |
| 33 | retr##f %f0 \ |
| 34 | epilog |
| 35 | #define def_ff(f, g) \ |
| 36 | name f##g \ |
| 37 | name f##g \ |
| 38 | f##g: \ |
| 39 | prolog \ |
| 40 | arg##g $arg##g \ |
| 41 | getarg##g %f0 $arg##g \ |
| 42 | extr##g##f %f0 %f0 \ |
| 43 | retr##f %f0 \ |
| 44 | epilog |
| 45 | |
| 46 | .data 32 |
| 47 | fstr: |
| 48 | .c "forward" |
| 49 | bstr: |
| 50 | .c "backward" |
| 51 | |
| 52 | .code |
| 53 | jmpi main |
| 54 | |
| 55 | def_wi(_c) |
| 56 | def_wi(_uc) |
| 57 | def_wi(_s) |
| 58 | def_wi(_us) |
| 59 | #if __WORDSIZE == 64 |
| 60 | def_wi(_i) |
| 61 | def_wi(_ui) |
| 62 | #endif |
| 63 | def_wf(_f) |
| 64 | def_wf(_d) |
| 65 | def_fi(_f, _c) |
| 66 | def_fi(_f, _uc) |
| 67 | def_fi(_f, _s) |
| 68 | def_fi(_f, _us) |
| 69 | def_fi(_f, _i) |
| 70 | #if __WORDSIZE == 64 |
| 71 | def_fi(_f, _ui) |
| 72 | def_fi(_f, _l) |
| 73 | #endif |
| 74 | def_fi(_d, _c) |
| 75 | def_fi(_d, _uc) |
| 76 | def_fi(_d, _s) |
| 77 | def_fi(_d, _us) |
| 78 | def_fi(_d, _i) |
| 79 | #if __WORDSIZE == 64 |
| 80 | def_fi(_d, _ui) |
| 81 | def_fi(_d, _l) |
| 82 | #endif |
| 83 | def_f(_f) |
| 84 | def_f(_d) |
| 85 | def_ff(_f, _d) |
| 86 | def_ff(_d, _f) |
| 87 | |
| 88 | name main |
| 89 | main: |
| 90 | prolog |
| 91 | |
| 92 | #define _call_w(n, i, a, r) \ |
| 93 | prepare \ |
| 94 | pushargi a \ |
| 95 | finishi _w##i \ |
| 96 | retval %r0 \ |
| 97 | extr##i %r0 %r0 \ |
| 98 | beqi _w##i##_##n %r0 r \ |
| 99 | calli @abort \ |
| 100 | _w##i##_##n: |
| 101 | #define call_w(n, i, a, r) _call_w(n, i, a, r) |
| 102 | #define _call_wf(n, f, a, r) \ |
| 103 | prepare \ |
| 104 | pushargi##f a \ |
| 105 | finishi _w##f \ |
| 106 | retval %r0 \ |
| 107 | extr##f %f0 %r0 \ |
| 108 | beqi##f _w##f##_##n %f0 r \ |
| 109 | calli @abort \ |
| 110 | _w##f##_##n: |
| 111 | #define call_wf(n, f, a, r) _call_wf(n, f, a, r) |
| 112 | #define _call_fi(n, f, i, a, r) \ |
| 113 | prepare \ |
| 114 | pushargi a \ |
| 115 | finishi f##i \ |
| 116 | retval##f %f0 \ |
| 117 | beqi##f f##i##n %f0 r \ |
| 118 | calli @abort \ |
| 119 | f##i##n: |
| 120 | #define call_fi(n, f, i, a, r) _call_fi(n, f, i, a, r) |
| 121 | #define _call_f(n, f, a, r) \ |
| 122 | prepare \ |
| 123 | pushargi##f a \ |
| 124 | finishi f##f \ |
| 125 | retval##f %f0 \ |
| 126 | beqi##f f##f##n %f0 r \ |
| 127 | calli @abort \ |
| 128 | f##f##n: |
| 129 | #define call_f(n, f, a, r) _call_f(n, f, a, r) |
| 130 | #define _call_ff(n, f, g, a, r) \ |
| 131 | prepare \ |
| 132 | pushargi##g a \ |
| 133 | finishi f##g \ |
| 134 | retval##f %f0 \ |
| 135 | beqi##f f##g##n %f0 r \ |
| 136 | calli @abort \ |
| 137 | f##g##n: |
| 138 | #define call_ff(n, f, g, a, r) _call_ff(n, f, g, a, r) |
| 139 | |
| 140 | #define c7f 0x7f |
| 141 | #define c80 0x80 |
| 142 | #define c81 0x81 |
| 143 | #define cff 0xff |
| 144 | #define s7f 0x7fff |
| 145 | #define s80 0x8000 |
| 146 | #define s81 0x8001 |
| 147 | #define i7f 0x7fffffff |
| 148 | #define i80 0x80000000 |
| 149 | #define i81 0x80000001 |
| 150 | #define iff 0xffffffff |
| 151 | #define l7f 0x7fffffffffffffff |
| 152 | #define l80 0x8000000000000000 |
| 153 | #define l81 0x8000000000000001 |
| 154 | #define f7f 127.0 |
| 155 | #define f80 -128.0 |
| 156 | #define f81 -127.0 |
| 157 | #define uf80 128.0 |
| 158 | #define uf81 127.0 |
| 159 | #if __WORDSIZE == 32 |
| 160 | # define wc80 0xffffff80 |
| 161 | # define wc81 0xffffff81 |
| 162 | # define ws80 0xffff8000 |
| 163 | # define ws81 0xffff8001 |
| 164 | #else |
| 165 | # define wc80 0xffffffffffffff80 |
| 166 | # define wc81 0xffffffffffffff81 |
| 167 | # define ws80 0xffffffffffff8000 |
| 168 | # define ws81 0xffffffffffff8001 |
| 169 | # define wi80 0xffffffff80000000 |
| 170 | # define wi81 0xffffffff80000001 |
| 171 | #endif |
| 172 | |
| 173 | call_w(__LINE__, _c, c7f, c7f) |
| 174 | call_w(__LINE__, _c, c80, wc80) |
| 175 | call_w(__LINE__, _c, c81, wc81) |
| 176 | call_w(__LINE__, _uc, c7f, c7f) |
| 177 | call_w(__LINE__, _uc, c80, c80) |
| 178 | call_w(__LINE__, _uc, c81, c81) |
| 179 | call_w(__LINE__, _s, s7f, s7f) |
| 180 | call_w(__LINE__, _s, s80, ws80) |
| 181 | call_w(__LINE__, _s, s81, ws81) |
| 182 | call_w(__LINE__, _us, s7f, s7f) |
| 183 | call_w(__LINE__, _us, s80, s80) |
| 184 | call_w(__LINE__, _us, s81, s81) |
| 185 | #if __WORDSIZE == 64 |
| 186 | call_w(__LINE__, _i, i7f, i7f) |
| 187 | call_w(__LINE__, _i, i80, wi80) |
| 188 | call_w(__LINE__, _i, i81, wi81) |
| 189 | call_w(__LINE__, _ui, i7f, i7f) |
| 190 | call_w(__LINE__, _ui, i80, i80) |
| 191 | call_w(__LINE__, _ui, i81, i81) |
| 192 | #endif |
| 193 | call_wf(__LINE__, _f, c7f, f7f) |
| 194 | call_wf(__LINE__, _f, wc80, f80) |
| 195 | call_wf(__LINE__, _f, wc81, f81) |
| 196 | call_wf(__LINE__, _d, c7f, f7f) |
| 197 | call_wf(__LINE__, _d, wc80, f80) |
| 198 | call_wf(__LINE__, _d, wc81, f81) |
| 199 | call_fi(__LINE__, _f, _c, c7f, f7f) |
| 200 | call_fi(__LINE__, _f, _c, c80, f80) |
| 201 | call_fi(__LINE__, _f, _uc, c7f, f7f) |
| 202 | call_fi(__LINE__, _f, _uc, c80, uf80) |
| 203 | call_fi(__LINE__, _f, _s, c7f, f7f) |
| 204 | call_fi(__LINE__, _f, _s, c80, uf80) |
| 205 | call_fi(__LINE__, _f, _us, c7f, f7f) |
| 206 | call_fi(__LINE__, _f, _us, c80, uf80) |
| 207 | call_fi(__LINE__, _f, _i, c7f, f7f) |
| 208 | call_fi(__LINE__, _f, _i, c80, uf80) |
| 209 | #if __WORDSIZE == 64 |
| 210 | call_fi(__LINE__, _f, _ui, c7f, f7f) |
| 211 | call_fi(__LINE__, _f, _ui, c80, uf80) |
| 212 | call_fi(__LINE__, _f, _l, c7f, f7f) |
| 213 | call_fi(__LINE__, _f, _l, c80, uf80) |
| 214 | #endif |
| 215 | call_fi(__LINE__, _d, _c, c7f, f7f) |
| 216 | call_fi(__LINE__, _d, _c, c80, f80) |
| 217 | call_fi(__LINE__, _d, _uc, c7f, f7f) |
| 218 | call_fi(__LINE__, _d, _uc, c80, uf80) |
| 219 | call_fi(__LINE__, _d, _s, c7f, f7f) |
| 220 | call_fi(__LINE__, _d, _s, c80, uf80) |
| 221 | call_fi(__LINE__, _d, _us, c7f, f7f) |
| 222 | call_fi(__LINE__, _d, _us, c80, uf80) |
| 223 | call_fi(__LINE__, _d, _i, c7f, f7f) |
| 224 | call_fi(__LINE__, _d, _i, c80, uf80) |
| 225 | #if __WORDSIZE == 64 |
| 226 | call_fi(__LINE__, _d, _ui, c7f, f7f) |
| 227 | call_fi(__LINE__, _d, _ui, c80, uf80) |
| 228 | call_fi(__LINE__, _d, _l, c7f, f7f) |
| 229 | call_fi(__LINE__, _d, _l, c80, uf80) |
| 230 | #endif |
| 231 | call_f(__LINE__, _f, f7f, f7f) |
| 232 | call_f(__LINE__, _d, f7f, f7f) |
| 233 | call_ff(__LINE__, _f, _d, f80, f80) |
| 234 | call_ff(__LINE__, _d, _f, f81, f81) |
| 235 | |
| 236 | movi %r0 forward |
| 237 | callr %r0 |
| 238 | |
| 239 | calli iforward |
| 240 | |
| 241 | ret |
| 242 | epilog |
| 243 | |
| 244 | name backward |
| 245 | backward: |
| 246 | prolog |
| 247 | prepare |
| 248 | pushargi bstr |
| 249 | finishi @puts |
| 250 | ret |
| 251 | epilog |
| 252 | |
| 253 | name forward |
| 254 | forward: |
| 255 | prolog |
| 256 | prepare |
| 257 | pushargi fstr |
| 258 | finishi @puts |
| 259 | movi %r0 backward |
| 260 | callr %r0 |
| 261 | ret |
| 262 | epilog |
| 263 | |
| 264 | name iforward |
| 265 | iforward: |
| 266 | prolog |
| 267 | prepare |
| 268 | pushargi fstr |
| 269 | finishi @puts |
| 270 | calli backward |
| 271 | ret |
| 272 | epilog |