1#if __WORDSIZE == 64 2# define I7f 0x7fffffffffffffff 3# define I80 0x8000000000000000 4# define I81 0x8000000000000001 5# define Iff 0xffffffffffffffff 6#else 7# define I7f 0x7fffffff 8# define I80 0x80000000 9# define I81 0x80000001 10# define Iff 0xffffffff 11#endif 12 13.data 12 14ok: 15.c "ok\n" 16. $($NaN = 0.0 / 0.0) 17 18#define BOP(N, Ls, Rs, Lu, Ru, R0, R1) \ 19 movi %R0 Ls \ 20 movi %R1 Rs \ 21 b##N##r N##r_##R0##_##R1 %R0 %R1 \ 22 calli @abort \ 23N##r_##R0##_##R1: \ 24 b##N##i N##i_##R0##_##R1 %R0 Rs \ 25 calli @abort \ 26N##i_##R0##_##R1: \ 27 movi %R0 Lu \ 28 movi %R1 Ru \ 29 b##N##r_u N##r_u_##R0##_##R1 %R0 %R1 \ 30 calli @abort \ 31N##r_u_##R0##_##R1: \ 32 b##N##i_u N##i_u_##R0##_##R1 %R0 Ru \ 33 calli @abort \ 34N##i_u_##R0##_##R1: \ 35 movi %R0 Ls \ 36 movi %R1 Rs \ 37 N##r %R0 %R0 %R1 \ 38 beqi _##N##r_##R0##_##R1 %R0 1 \ 39 calli @abort \ 40_##N##r_##R0##_##R1: \ 41 movi %R0 Ls \ 42 N##i %R1 %R0 Rs \ 43 beqi _##N##i_##R0##_##R1 %R1 1 \ 44 calli @abort \ 45_##N##i_##R0##_##R1: \ 46 movi %R0 Lu \ 47 movi %R1 Ru \ 48 N##r_u %R0 %R0 %R1 \ 49 beqi _##N##r_u_##R0##_##R1 %R0 1 \ 50 calli @abort \ 51_##N##r_u_##R0##_##R1: \ 52 movi %R0 Lu \ 53 N##i_u %R1 %R0 Ru \ 54 beqi _##N##i_u_##R0##_##R1 %R1 1 \ 55 calli @abort \ 56_##N##i_u_##R0##_##R1: 57 58#define EB(N, L, R, R0, R1) \ 59 movi %R0 L \ 60 movi %R1 R \ 61 b##N##r N##r_##R0##_##R1 %R0 %R1 \ 62 calli @abort \ 63N##r_##R0##_##R1: \ 64 b##N##i N##i_##R0##_##R1 %R0 R \ 65 calli @abort \ 66N##i_##R0##_##R1: \ 67 movi %R0 L \ 68 movi %R1 R \ 69 N##r %R0 %R0 %R1 \ 70 beqi _##N##r_##R0##_##R1 %R0 1 \ 71 calli @abort \ 72_##N##r_##R0##_##R1: \ 73 movi %R0 L \ 74 N##i %R1 %R0 R \ 75 beqi _##N##i_##R0##_##R1 %R1 1 \ 76 calli @abort \ 77_##N##i_##R0##_##R1: 78 79#define XEB(N, L, R, R0, R1) \ 80 movi %R0 L \ 81 movi %R1 R \ 82 b##N##r N##r_##R0##_##R1 %R0 %R1 \ 83 calli @abort \ 84N##r_##R0##_##R1: \ 85 b##N##i N##i_##R0##_##R1 %R0 R \ 86 calli @abort \ 87N##i_##R0##_##R1: 88 89#define XBOP(N, Ls, Rs, Lu, Ru, R0, R1) \ 90 movi %R0 Ls \ 91 movi %R1 Rs \ 92 b##N##r N##r_##R0##_##R1 %R0 %R1 \ 93 calli @abort \ 94N##r_##R0##_##R1: \ 95 movi %R0 Ls \ 96 b##N##i N##i_##R0##_##R1 %R0 Rs \ 97 calli @abort \ 98N##i_##R0##_##R1: \ 99 movi %R0 Lu \ 100 movi %R1 Ru \ 101 b##N##r_u N##r_u_##R0##_##R1 %R0 %R1 \ 102 calli @abort \ 103N##r_u_##R0##_##R1: \ 104 movi %R0 Lu \ 105 b##N##i_u N##i_u_##R0##_##R1 %R0 Ru \ 106 calli @abort \ 107N##i_u_##R0##_##R1: 108 109#define BOPI(N, Ls, Rs, Lu, Ru) \ 110 BOP(N, Ls, Rs, Lu, Ru, v0, v1) \ 111 BOP(N, Ls, Rs, Lu, Ru, v0, v2) \ 112 BOP(N, Ls, Rs, Lu, Ru, v0, r0) \ 113 BOP(N, Ls, Rs, Lu, Ru, v0, r1) \ 114 BOP(N, Ls, Rs, Lu, Ru, v0, r2) \ 115 BOP(N, Ls, Rs, Lu, Ru, v1, v0) \ 116 BOP(N, Ls, Rs, Lu, Ru, v1, v2) \ 117 BOP(N, Ls, Rs, Lu, Ru, v1, r0) \ 118 BOP(N, Ls, Rs, Lu, Ru, v1, r1) \ 119 BOP(N, Ls, Rs, Lu, Ru, v1, r2) \ 120 BOP(N, Ls, Rs, Lu, Ru, v2, v0) \ 121 BOP(N, Ls, Rs, Lu, Ru, v2, v1) \ 122 BOP(N, Ls, Rs, Lu, Ru, v2, r0) \ 123 BOP(N, Ls, Rs, Lu, Ru, v2, r1) \ 124 BOP(N, Ls, Rs, Lu, Ru, v2, r2) \ 125 BOP(N, Ls, Rs, Lu, Ru, r0, v0) \ 126 BOP(N, Ls, Rs, Lu, Ru, r0, v1) \ 127 BOP(N, Ls, Rs, Lu, Ru, r0, v2) \ 128 BOP(N, Ls, Rs, Lu, Ru, r0, r1) \ 129 BOP(N, Ls, Rs, Lu, Ru, r0, r2) \ 130 BOP(N, Ls, Rs, Lu, Ru, r1, v0) \ 131 BOP(N, Ls, Rs, Lu, Ru, r1, v1) \ 132 BOP(N, Ls, Rs, Lu, Ru, r1, v2) \ 133 BOP(N, Ls, Rs, Lu, Ru, r1, r0) \ 134 BOP(N, Ls, Rs, Lu, Ru, r1, r2) \ 135 BOP(N, Ls, Rs, Lu, Ru, r2, v0) \ 136 BOP(N, Ls, Rs, Lu, Ru, r2, v1) \ 137 BOP(N, Ls, Rs, Lu, Ru, r2, v2) \ 138 BOP(N, Ls, Rs, Lu, Ru, r2, r0) \ 139 BOP(N, Ls, Rs, Lu, Ru, r2, r1) 140 141#define EBI(N, L, R) \ 142 EB(N, L, R, v0, v1) \ 143 EB(N, L, R, v0, v2) \ 144 EB(N, L, R, v0, r0) \ 145 EB(N, L, R, v0, r1) \ 146 EB(N, L, R, v0, r2) \ 147 EB(N, L, R, v1, v0) \ 148 EB(N, L, R, v1, v2) \ 149 EB(N, L, R, v1, r0) \ 150 EB(N, L, R, v1, r1) \ 151 EB(N, L, R, v1, r2) \ 152 EB(N, L, R, v2, v0) \ 153 EB(N, L, R, v2, v1) \ 154 EB(N, L, R, v2, r0) \ 155 EB(N, L, R, v2, r1) \ 156 EB(N, L, R, v2, r2) \ 157 EB(N, L, R, r0, v0) \ 158 EB(N, L, R, r0, v1) \ 159 EB(N, L, R, r0, v2) \ 160 EB(N, L, R, r0, r1) \ 161 EB(N, L, R, r0, r2) \ 162 EB(N, L, R, r1, v0) \ 163 EB(N, L, R, r1, v1) \ 164 EB(N, L, R, r1, v2) \ 165 EB(N, L, R, r1, r0) \ 166 EB(N, L, R, r1, r2) \ 167 EB(N, L, R, r2, v0) \ 168 EB(N, L, R, r2, v1) \ 169 EB(N, L, R, r2, v2) \ 170 EB(N, L, R, r2, r0) \ 171 EB(N, L, R, r2, r1) 172 173 174#define XEBI(N, L, R) \ 175 XEB(N, L, R, v0, v1) \ 176 XEB(N, L, R, v0, v2) \ 177 XEB(N, L, R, v0, r0) \ 178 XEB(N, L, R, v0, r1) \ 179 XEB(N, L, R, v0, r2) \ 180 XEB(N, L, R, v1, v0) \ 181 XEB(N, L, R, v1, v2) \ 182 XEB(N, L, R, v1, r0) \ 183 XEB(N, L, R, v1, r1) \ 184 XEB(N, L, R, v1, r2) \ 185 XEB(N, L, R, v2, v0) \ 186 XEB(N, L, R, v2, v1) \ 187 XEB(N, L, R, v2, r0) \ 188 XEB(N, L, R, v2, r1) \ 189 XEB(N, L, R, v2, r2) \ 190 XEB(N, L, R, r0, v0) \ 191 XEB(N, L, R, r0, v1) \ 192 XEB(N, L, R, r0, v2) \ 193 XEB(N, L, R, r0, r1) \ 194 XEB(N, L, R, r0, r2) \ 195 XEB(N, L, R, r1, v0) \ 196 XEB(N, L, R, r1, v1) \ 197 XEB(N, L, R, r1, v2) \ 198 XEB(N, L, R, r1, r0) \ 199 XEB(N, L, R, r1, r2) \ 200 XEB(N, L, R, r2, v0) \ 201 XEB(N, L, R, r2, v1) \ 202 XEB(N, L, R, r2, v2) \ 203 XEB(N, L, R, r2, r0) \ 204 XEB(N, L, R, r2, r1) 205 206#define XBOPI(N, Ls, Rs, Lu, Ru) \ 207 XBOP(N, Ls, Rs, Lu, Ru, v0, v1) \ 208 XBOP(N, Ls, Rs, Lu, Ru, v0, v2) \ 209 XBOP(N, Ls, Rs, Lu, Ru, v0, r0) \ 210 XBOP(N, Ls, Rs, Lu, Ru, v0, r1) \ 211 XBOP(N, Ls, Rs, Lu, Ru, v0, r2) \ 212 XBOP(N, Ls, Rs, Lu, Ru, v1, v0) \ 213 XBOP(N, Ls, Rs, Lu, Ru, v1, v2) \ 214 XBOP(N, Ls, Rs, Lu, Ru, v1, r0) \ 215 XBOP(N, Ls, Rs, Lu, Ru, v1, r1) \ 216 XBOP(N, Ls, Rs, Lu, Ru, v1, r2) \ 217 XBOP(N, Ls, Rs, Lu, Ru, v2, v0) \ 218 XBOP(N, Ls, Rs, Lu, Ru, v2, v1) \ 219 XBOP(N, Ls, Rs, Lu, Ru, v2, r0) \ 220 XBOP(N, Ls, Rs, Lu, Ru, v2, r1) \ 221 XBOP(N, Ls, Rs, Lu, Ru, v2, r2) \ 222 XBOP(N, Ls, Rs, Lu, Ru, r0, v0) \ 223 XBOP(N, Ls, Rs, Lu, Ru, r0, v1) \ 224 XBOP(N, Ls, Rs, Lu, Ru, r0, v2) \ 225 XBOP(N, Ls, Rs, Lu, Ru, r0, r1) \ 226 XBOP(N, Ls, Rs, Lu, Ru, r0, r2) \ 227 XBOP(N, Ls, Rs, Lu, Ru, r1, v0) \ 228 XBOP(N, Ls, Rs, Lu, Ru, r1, v1) \ 229 XBOP(N, Ls, Rs, Lu, Ru, r1, v2) \ 230 XBOP(N, Ls, Rs, Lu, Ru, r1, r0) \ 231 XBOP(N, Ls, Rs, Lu, Ru, r1, r2) \ 232 XBOP(N, Ls, Rs, Lu, Ru, r2, v0) \ 233 XBOP(N, Ls, Rs, Lu, Ru, r2, v1) \ 234 XBOP(N, Ls, Rs, Lu, Ru, r2, v2) \ 235 XBOP(N, Ls, Rs, Lu, Ru, r2, r0) \ 236 XBOP(N, Ls, Rs, Lu, Ru, r2, r1) 237 238#define TBOPF(N, T, L, R) \ 239 movi_##T %f0 L \ 240 movi_##T %f1 R \ 241 b##N##r##_##T N##r_##T %f0 %f1 \ 242 calli @abort \ 243N##r_##T: \ 244 b##N##i##_##T N##i_##T %f0 R \ 245 calli @abort \ 246N##i_##T: \ 247 movi_##T %f1 $NaN \ 248 b##N##r##_##T N##r_##T##_##u %f0 %f1 \ 249 jmpi N##r_##T##_##u0 \ 250N##r_##T##_##u: \ 251 calli @abort \ 252N##r##_##T##_##u0: \ 253 b##N##i##_##T N##i_##T##_##u %f0 $NaN \ 254 jmpi N##i_##T##_##u0 \ 255N##i##_##T##_##u: \ 256 calli @abort \ 257N##i##_##T##_##u0: 258#define BOPF(N, L, R) \ 259 TBOPF(N, f, L, R) \ 260 TBOPF(N, d, L, R) 261 262#define TUBOPF(N, T, L, R) \ 263 movi_##T %f0 L \ 264 movi_##T %f1 R \ 265 b##N##r##_##T N##r_##T %f0 %f1 \ 266 calli @abort \ 267N##r_##T: \ 268 b##N##i##_##T N##i_##T %f0 R \ 269 calli @abort \ 270N##i_##T: \ 271 movi_##T %f1 $NaN \ 272 b##N##r##_##T N##r_##T##_##u %f0 %f1 \ 273 calli @abort \ 274N##r_##T##_##u: \ 275 b##N##i##_##T N##i_##T##_##u %f0 $NaN \ 276 calli @abort \ 277N##i##_##T##_##u: 278 279#define UBOPF(N, L, R) \ 280 TUBOPF(N, f, L, R) \ 281 TUBOPF(N, d, L, R) 282 283.code 284 prolog 285 286 movi %r0 -1 287 movi %r1 1 288 bltr xltr_r0_r1 %r0 %r1 289 calli @abort 290xltr_r0_r1: 291 blti xlti_r0_r1 %r0 1 292 calli @abort 293xlti_r0_r1: 294 movi %r0 1 295 movi %r1 -1 296 bltr_u xltru_r0_r1 %r0 %r1 297 calli @abort 298xltru_r0_r1: 299 blti_u xltiu_r0_r1 %r0 -1 300 calli @abort 301xltiu_r0_r1: 302 movi %r0 -1 303 movi %r1 -1 304 bler xler_r0_r1 %r0 %r1 305 calli @abort 306xler_r0_r1: 307 blti xlei_r0_r1 %r0 1 308 calli @abort 309xlei_r0_r1: 310 movi %r0 1 311 movi %r1 -1 312 bltr_u xlteu_r0_r1 %r0 %r1 313 calli @abort 314xlteu_r0_r1: 315 blei_u xleiu_r0_r1 %r0 -1 316 calli @abort 317xleiu_r0_r1: 318 movi %r0 32 319 movi %r1 32 320 beqr xeqr_r0_r1 %r0 %r1 321 calli @abort 322xeqr_r0_r1: 323 beqi xeqi_r0_r1 %r0 32 324 calli @abort 325xeqi_r0_r1: 326 movi %r0 -2 327 movi %r1 -2 328 bger xger_r0_r1 %r0 %r1 329 calli @abort 330xger_r0_r1: 331 bgei xgei_r0_r1 %r0 -2 332 calli @abort 333xgei_r0_r1: 334 movi %r0 2 335 movi %r1 2 336 bger_u xgeru_r0_r1 %r0 %r1 337 calli @abort 338xgeru_r0_r1: 339 bgei_u xgeiu_r0_r1 %r0 2 340 calli @abort 341xgeiu_r0_r1: 342 movi %r0 2 343 movi %r1 -2 344 bgtr xgtr_r0_r1 %r0 %r1 345 calli @abort 346xgtr_r0_r1: 347 bgti xgti_r0_r1 %r0 -2 348 calli @abort 349xgti_r0_r1: 350 movi %r0 -2 351 movi %r1 2 352 bgtr_u xgtru_r0_r1 %r0 %r1 353 calli @abort 354xgtru_r0_r1: 355 bgti_u xgtiu_r0_r1 %r0 2 356 calli @abort 357xgtiu_r0_r1: 358 movi %r0 -3 359 movi %r1 3 360 bner xner_r0_r1 %r0 %r1 361 calli @abort 362xner_r0_r1: 363 bnei xnei_r0_r1 %r0 3 364 calli @abort 365xnei_r0_r1: 366 movi %r0 1 367 movi %r1 3 368 bmsr xmsr_r0_r1 %r0 %r1 369 calli @abort 370xmsr_r0_r1: 371 bmsi xmsi_r0_r1 %r0 3 372 calli @abort 373xmsi_r0_r1: 374 movi %r0 1 375 movi %r1 2 376 bmcr xmcr_r0_r1 %r0 %r1 377 calli @abort 378xmcr_r0_r1: 379 bmci xmci_r0_r1 %r0 2 380 calli @abort 381xmci_r0_r1: 382 movi %r0 I7f 383 movi %r1 1 384 boaddr xoaddr_r0_r1 %r0 %r1 385 calli @abort 386xoaddr_r0_r1: 387 movi %r0 Iff 388 movi %r1 1 389 boaddr_u xoaddr_u_r0_r1 %r0 %r1 390 calli @abort 391xoaddr_u_r0_r1: 392 movi %r0 I7f 393 boaddi xoaddi_r0_r1 %r0 1 394 calli @abort 395xoaddi_r0_r1: 396 movi %r0 Iff 397 boaddi_u xoaddi_u_r0_r1 %r0 1 398 calli @abort 399xoaddi_u_r0_r1: 400 movi %r0 I80 401 movi %r1 1 402 bxaddr xxaddr_r0_r1 %r0 %r1 403 calli @abort 404xxaddr_r0_r1: 405 movi %r0 I80 406 bxaddi xxaddi_r0_r1 %r0 1 407 calli @abort 408xxaddi_r0_r1: 409 movi %r0 I7f 410 movi %r1 1 411 bxaddr_u xxaddr_u_r0_r1 %r0 %r1 412 calli @abort 413xxaddr_u_r0_r1: 414 movi %r0 I7f 415 bxaddi_u xxaddi_u_r0_r1 %r0 1 416 calli @abort 417xxaddi_u_r0_r1: 418 movi %r0 I80 419 movi %r1 1 420 bosubr xosubr_r0_r1 %r0 %r1 421 calli @abort 422xosubr_r0_r1: 423 movi %r0 0 424 movi %r1 1 425 bosubr_u xosubr_u_r0_r1 %r0 %r1 426 calli @abort 427xosubr_u_r0_r1: 428 movi %r0 I80 429 bosubi xosubi_r0_r1 %r0 1 430 calli @abort 431xosubi_r0_r1: 432 movi %r0 0 433 bosubi_u xosubi_u_r0_r1 %r0 1 434 calli @abort 435xosubi_u_r0_r1: 436 movi %r0 I81 437 movi %r1 1 438 bxsubr xxsubr_r0_r1 %r0 %r1 439 calli @abort 440xxsubr_r0_r1: 441 movi %r0 I81 442 bxsubi xxsubi_r0_r1 %r0 1 443 calli @abort 444xxsubi_r0_r1: 445 movi %r0 I80 446 movi %r1 1 447 bxsubr_u xxsubr_u_r0_r1 %r0 %r1 448 calli @abort 449xxsubr_u_r0_r1: 450 movi %r0 I80 451 bxsubi_u xxsubi_u_r0_r1 %r0 1 452 calli @abort 453xxsubi_u_r0_r1: 454 movi_f %f0 1 455 movi_f %f1 2 456 bltr_f xltr_f_f0_f1 %f0 %f1 457 calli @abort 458xltr_f_f0_f1: 459 blti_f xlti_f_f0_f1 %f0 2 460 calli @abort 461xlti_f_f0_f1: 462 movi_f %f0 -1 463 movi_f %f1 -1 464 bler_f xler_f_f0_f1 %f0 %f1 465 calli @abort 466xler_f_f0_f1: 467 blei_f xlei_f_f0_f1 %f0 -1 468 calli @abort 469xlei_f_f0_f1: 470 movi_f %f0 -2 471 movi_f %f1 -2 472 beqr_f xeqr_f_f0_f1 %f0 %f1 473 calli @abort 474xeqr_f_f0_f1: 475 beqi_f xeqi_f_f0_f1 %f0 -2 476 calli @abort 477xeqi_f_f0_f1: 478 movi_f %f0 -3 479 movi_f %f1 -3 480 bger_f xger_f_f0_f1 %f0 %f1 481 calli @abort 482xger_f_f0_f1: 483 bgei_f xgei_f_f0_f1 %f0 -3 484 calli @abort 485xgei_f_f0_f1: 486 movi_f %f0 2 487 movi_f %f1 1 488 bgtr_f xgtr_f_f0_f1 %f0 %f1 489 calli @abort 490xgtr_f_f0_f1: 491 bgti_f xgti_f_f0_f1 %f0 1 492 calli @abort 493xgti_f_f0_f1: 494 movi_f %f0 0 495 movi_f %f1 2 496 bner_f xner_f_f0_f1 %f0 %f1 497 calli @abort 498xner_f_f0_f1: 499 bnei_f xnei_f_f0_f1 %f0 2 500 calli @abort 501xnei_f_f0_f1: 502 503 BOPI(lt, -1, 1, 1, -1) 504 BOPI(le, -1, -1, 1, 1) 505 EBI(eq, 32, 32) 506 BOPI(ge, -2, -2, 2, 2) 507 BOPI(gt, 2, -2, -2, 2) 508 EBI(ne, 3, -3) 509 XEBI(ms, 1, 3) 510 XEBI(mc, 1, 2) 511 XBOPI(oadd, I7f, 1, Iff, 1) 512 XBOPI(xadd, I80, 1, I7f, 1) 513 XBOPI(osub, I80, 1, 0, 1) 514 XBOPI(xsub, I81, 1, I80, 1) 515 BOPF(lt, 1, 2) 516 BOPF(le, 2, 2) 517 BOPF(eq, 3, 3) 518 BOPF(ge, 3, 3) 519 BOPF(gt, 4, 3) 520 UBOPF(ne, 4, 3) 521 UBOPF(unlt, 1, 2) 522 UBOPF(unle, 2, 2) 523 UBOPF(uneq, 3, 3) 524 UBOPF(unge, 3, 3) 525 UBOPF(ungt, 4, 3) 526 BOPF(ltgt, 4, 3) 527 movi_f %f0 5 528 movi_f %f1 5 529 bordr_f ordr_f %f0 %f1 530 calli @abort 531ordr_f: 532 bordi_f ordi_f %f0 1 533 calli @abort 534ordi_f: 535 bordi_f ordi_f_u %f0 $NaN 536 jmpi ordi_f_u0 537ordi_f_u: 538 calli @abort 539ordi_f_u0: 540 movi_f %f0 5 541 movi_f %f1 5 542 bunordr_f unordr_f %f0 %f1 543 jmpi unordr_f_0 544unordr_f: 545 calli @abort 546unordr_f_0: 547 bunordi_f unordi_f %f0 1 548 jmpi unordi_f_0 549unordi_f: 550 calli @abort 551unordi_f_0: 552 bunordi_f unordi_f_1 %f0 $NaN 553 calli @abort 554unordi_f_1: 555 556 // just to know did not crash or abort 557 prepare 558 pushargi ok 559 ellipsis 560 finishi @printf 561 562 ret 563 epilog 564