|
|
1.1 ! root 1: # include "cpass2.h" ! 2: #ifndef lint ! 3: static char sccsid[] = "@(#)table.c 1.1 86/02/03 Copyr 1985 Sun Micro"; ! 4: #endif ! 5: ! 6: /* ! 7: * Copyright (c) 1985 by Sun Microsystems, Inc. ! 8: */ ! 9: ! 10: # define ANYSIGNED TPOINT|TINT|TLONG|TSHORT|TCHAR ! 11: # define ANYUSIGNED TUNSIGNED|TULONG|TUSHORT|TUCHAR ! 12: # define ANYFIXED ANYSIGNED|ANYUSIGNED ! 13: # define TWORD TINT|TUNSIGNED|TPOINT|TLONG|TULONG ! 14: # define TSCALAR TCHAR|TUCHAR|TSHORT|TUSHORT|TINT|TUNSIGNED|TPOINT ! 15: ! 16: # define EA SNAME|SOREG|SCON|STARREG|STARNM|SAREG|SBREG ! 17: # define EAA SNAME|SOREG|SCON|STARREG|STARNM|SAREG ! 18: # define EB SBREG ! 19: # define ED SNAME|SOREG|SCON|SAREG /* for addressability of DOUBLEs */ ! 20: # define ES SNAME|SOREG|STARREG|STARNM|SAREG|SBREG ! 21: # define EM SNAME|SOREG|STARREG|STARNM|SCON ! 22: ! 23: struct optab table[] = { ! 24: ! 25: /* ! 26: * special-case constant assignments ! 27: */ ! 28: ! 29: ASSIGN, INAREG|FOREFF|FORCC, ! 30: (EAA)&~SAREG, TSCALAR|TFLOAT, ! 31: SZERO, TANY, ! 32: 0, RLEFT|RRIGHT|RESCC, ! 33: " clrZB AL\n", ! 34: ! 35: ASSIGN, INAREG|FOREFF|FORCC, ! 36: SAREG|STAREG, TSCALAR, ! 37: SCCON, TSCALAR, ! 38: 0, RLEFT|RRIGHT|RESCC, ! 39: " moveq AR,AL\n", ! 40: ! 41: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ! 42: ! 43: /* ! 44: * two's complement assignments, to anything but the address registers ! 45: */ ! 46: ASSIGN, INAREG|FOREFF|FORCC, ! 47: EAA, TSCALAR, ! 48: EA, TSCALAR, ! 49: 0, RLEFT|RRIGHT|RESCC, ! 50: " movZB AR,AL\n", ! 51: ! 52: /* ! 53: * two's complement assignments, to the address registers ! 54: */ ! 55: ASSIGN, INBREG|FOREFF, ! 56: SBREG|STBREG, TWORD|TSHORT, ! 57: EA, TWORD|TSHORT, ! 58: 0, RLEFT|RRIGHT, ! 59: " movZB AR,AL\n", ! 60: ! 61: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ! 62: ! 63: /* ! 64: * Floating assignments to anything but the address registers ! 65: * Note that the condition codes are not left in a valid state. ! 66: */ ! 67: ASSIGN, INAREG|FOREFF, ! 68: EAA, TFLOAT, ! 69: EA, TFLOAT, ! 70: 0, RLEFT|RRIGHT, ! 71: " movZB AR,AL\n", ! 72: ! 73: /* ! 74: * Floating assignments to the address registers. ! 75: * Note that the condition codes are not left in a valid state. ! 76: */ ! 77: ASSIGN, INBREG|FOREFF, ! 78: SBREG|STBREG, TFLOAT, ! 79: EA, TFLOAT, ! 80: 0, RLEFT|RRIGHT, ! 81: " movZB AR,AL\n", ! 82: ! 83: ASSIGN|OP68881, INBREG|FOREFF, ! 84: SBREG|STBREG, TFLOAT, ! 85: SCREG|STCREG, TFLOAT, ! 86: NAREG, RLEFT|RRIGHT|RESC1, ! 87: " fmoves AR,A1\n movl A1,AL\n", ! 88: ! 89: /* ! 90: * assignments from temp aregs to anything but the a-registers ! 91: */ ! 92: ASSIGN, INTAREG|FOREFF, ! 93: EAA, TSCALAR|TFLOAT, ! 94: STAREG, TSCALAR|TFLOAT, ! 95: 0, RRIGHT, ! 96: " movZB AR,AL\n", ! 97: ! 98: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ! 99: ! 100: /* ! 101: * Floating assignments to the fp-registers, if we have them. ! 102: */ ! 103: ! 104: ASSIGN|OP68881, INCREG|FOREFF|FORCC, ! 105: SCREG|STCREG, TFLOAT|TDOUBLE, ! 106: SFLOAT_SRCE, TFLOAT|TDOUBLE, ! 107: 0, RLEFT|RRIGHT|RESFCC, ! 108: " fmoveZF ZK,AL\n", ! 109: ! 110: ASSIGN|OP68881, INCREG|FOREFF|FORCC, ! 111: SCREG|STCREG, TFLOAT|TDOUBLE, ! 112: SCREG|STCREG, TFLOAT|TDOUBLE, ! 113: 0, RLEFT|RRIGHT|RESFCC, ! 114: " fmovex AR,AL\n", ! 115: ! 116: ASSIGN|OP68881, INCREG|FOREFF|FORCC, ! 117: SCREG|STCREG, TFLOAT|TDOUBLE, ! 118: SAREG|STAREG, TDOUBLE, ! 119: 0, RLEFT|RRIGHT|RESFCC, ! 120: " movl UR,sp@-\n\ ! 121: movl AR,sp@-\n\ ! 122: fmoved sp@+,AL\n", ! 123: ! 124: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ! 125: ! 126: /* ! 127: * Floating stores from the fp-registers, if we have them. ! 128: * Note: these do not affect the condition codes on either processor. ! 129: */ ! 130: ! 131: ASSIGN|OP68881, INCREG|FOREFF, ! 132: EM, TFLOAT|TDOUBLE, ! 133: SCREG|STCREG, TFLOAT|TDOUBLE, ! 134: 0, RLEFT|RRIGHT, ! 135: " fmoveZG AR,AL\n", ! 136: ! 137: ASSIGN|OP68881, INCREG|FOREFF, ! 138: SAREG|STAREG, TFLOAT, ! 139: SCREG|STCREG, TFLOAT|TDOUBLE, ! 140: 0, RLEFT|RRIGHT, ! 141: " fmoveZG AR,AL\n", ! 142: ! 143: ASSIGN|OP68881, INCREG|FOREFF, ! 144: SAREG|STAREG, TDOUBLE, ! 145: SCREG|STCREG, TFLOAT|TDOUBLE, ! 146: 0, RLEFT|RRIGHT, ! 147: " fmoved AR,sp@-\n\ ! 148: movl sp@+,AL\n\ ! 149: movl sp@+,UL\n", ! 150: ! 151: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ! 152: ! 153: /* ! 154: * Other floating-point assignments ! 155: */ ! 156: ! 157: ASSIGN, INAREG|FOREFF, ! 158: ED, TDOUBLE, ! 159: ED, TDOUBLE, ! 160: 0, RLEFT|RRIGHT, ! 161: " movl AR,AL\n movl UR,UL\n", ! 162: ! 163: ASSIGN|NO68881, INAREG|FOREFF, ! 164: EAA, TFLOAT, ! 165: ED, TDOUBLE, ! 166: 0, RLEFT|RRIGHT, ! 167: "Zg", ! 168: ! 169: ASSIGN, INAREG|FOREFF, ! 170: EAA, TDOUBLE, ! 171: SAREG, TDOUBLE, ! 172: 0, RLEFT|RRIGHT, ! 173: "ZD", ! 174: ! 175: ASSIGN, INAREG|FOREFF, ! 176: SAREG, TDOUBLE, ! 177: EAA, TDOUBLE, ! 178: 0, RLEFT|RRIGHT, ! 179: "ZD", ! 180: ! 181: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ! 182: ! 183: /* new, fun field ops */ ! 184: ASSIGN, INAREG|FOREFF, ! 185: SPEC_FLD, TANY, ! 186: SAREG|STAREG, TANY, ! 187: NAREG, RRIGHT, ! 188: "Za\n", /* ie: do the whole show by hand */ ! 189: ! 190: ASSIGN, INAREG|FOREFF, ! 191: SPEC_FLD, TANY, ! 192: SCON, TANY, ! 193: NAREG, RRIGHT, ! 194: "Za\n", /* ie: do the whole show by hand */ ! 195: ! 196: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ! 197: ! 198: /* put this here so UNARY MUL nodes match OPLTYPE when appropriate */ ! 199: UNARY MUL, INTAREG|INAREG|FORCC, ! 200: SBREG, TSCALAR, ! 201: SANY, TANY, ! 202: NAREG|NASR, RESC1|RESCC, ! 203: " movZB AL@,A1\n", ! 204: ! 205: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ! 206: ! 207: #ifdef FORT ! 208: GOTO, FOREFF, ! 209: SCON, TANY, ! 210: SANY, TANY, ! 211: 0, RNOP, ! 212: " jra CL\n", ! 213: ! 214: GOTO, FOREFF, ! 215: SBREG|STBREG, TANY, ! 216: SANY, TANY, ! 217: 0, RNOP, ! 218: " jmp AL@\n", ! 219: #endif ! 220: ! 221: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ! 222: ! 223: /* leaf node for effect -- evaluate and discard */ ! 224: ! 225: OPLTYPE, FOREFF, ! 226: SANY, TANY, ! 227: EA, TANY, ! 228: 0, RRIGHT, ! 229: "Z ", /* note that the "leaf" may have side effects!!*/ ! 230: ! 231: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ! 232: ! 233: /* ! 234: * tests to set condition codes, integral operands ! 235: */ ! 236: ! 237: OPLTYPE|OP68020, FORCC, ! 238: SANY, TANY, ! 239: (EA)&~SCON, TWORD|TSHORT|TUSHORT, ! 240: 0, RESCC, ! 241: " tstZB AR\n", ! 242: ! 243: OPLTYPE, FORCC, ! 244: SANY, TANY, ! 245: (EAA)&~SCON, TSCALAR, ! 246: 0, RESCC, ! 247: " tstZB AR\n", ! 248: ! 249: OPLTYPE, FORCC, ! 250: SANY, TANY, ! 251: EB, TWORD|TSHORT|TUSHORT, ! 252: 0, RESCC, ! 253: " cmpw #0,AR\n", ! 254: ! 255: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ! 256: ! 257: /* ! 258: * (68881) tests to set coprocessor condition codes, floating point operands ! 259: */ ! 260: ! 261: OPLTYPE|OP68881, FORCC, ! 262: SANY, TANY, ! 263: SFLOAT_SRCE, TFLOAT|TDOUBLE, ! 264: 0, RESFCC, ! 265: " ftestZF ZK\n", ! 266: ! 267: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ! 268: ! 269: /* ! 270: * (no 68881) tests to set condtion codes, floating point operands ! 271: */ ! 272: OPLTYPE|NO68881, FORCC, ! 273: SANY, TANY, ! 274: EA, TFLOAT, ! 275: 0, RESCC, ! 276: "Zf", ! 277: ! 278: OPLTYPE|NO68881, FORCC, ! 279: SANY, TANY, ! 280: ED, TDOUBLE, ! 281: 0, RESCC, ! 282: "Zf", ! 283: ! 284: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ! 285: ! 286: /* ! 287: * special-case loads, constant integral operands ! 288: */ ! 289: OPLTYPE, INTAREG|INAREG|FORCC, ! 290: SANY, TANY, ! 291: SZERO, TSCALAR, ! 292: NAREG|NASR, RESC1|RESCC, ! 293: " moveq #0,A1\n", ! 294: ! 295: OPLTYPE, INTAREG|INAREG|FORCC, ! 296: SANY, TANY, ! 297: SCCON, TSCALAR, ! 298: NAREG|NASR, RESC1|RESCC, ! 299: " moveq AR,A1\n", ! 300: ! 301: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ! 302: ! 303: /* ! 304: * load scalar into temp d-register ! 305: */ ! 306: OPLTYPE, INTAREG|INAREG|FORCC, ! 307: SANY, TANY&~TSTRUCT, ! 308: EA, TSCALAR, ! 309: NAREG|NASR, RESC1|RESCC, ! 310: " movZB AR,A1\n", ! 311: ! 312: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ! 313: ! 314: /* ! 315: * special-case loads, float and double operands ! 316: */ ! 317: OPLTYPE, INTAREG|INAREG, ! 318: SANY, TANY, ! 319: EAA, TDOUBLE, ! 320: NAREG, RESC1, ! 321: "ZD", ! 322: ! 323: OPLTYPE, INTAREG|INAREG, ! 324: SANY, TANY, ! 325: SOREG, TDOUBLE, ! 326: NAREG|NASL|NBREG|NBSL, RESC1, ! 327: "ZE", ! 328: ! 329: OPLTYPE, INTAREG|INAREG, ! 330: SANY, TANY, ! 331: EA, TFLOAT, ! 332: NAREG|NASR, RESC1, ! 333: " movl AR,A1\n", ! 334: ! 335: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ! 336: ! 337: /* ! 338: * (68881) loads from various places into coprocessor registers ! 339: */ ! 340: ! 341: OPLTYPE|OP68881, INTCREG|INCREG, ! 342: SANY, TANY, ! 343: SFLOAT_SRCE, TFLOAT|TDOUBLE, ! 344: NCREG, RESC1, ! 345: " fmoveZF ZK,A1\n", ! 346: ! 347: OPLTYPE|OP68881, INTCREG|INCREG, ! 348: SANY, TANY, ! 349: SAREG|STAREG, TDOUBLE, ! 350: NCREG, RESC1, ! 351: " movl UR,sp@-\n\ ! 352: movl AR,sp@-\n\ ! 353: fmoved sp@+,A1\n", ! 354: ! 355: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ! 356: ! 357: /* ! 358: * (68881) loads from coprocessor registers into data registers ! 359: */ ! 360: ! 361: OPLTYPE|OP68881, INTAREG|INAREG, ! 362: SANY, TANY, ! 363: SCREG|STCREG, TFLOAT, ! 364: NAREG, RESC1, ! 365: " fmoves AR,A1\n", ! 366: ! 367: OPLTYPE|OP68881, INTAREG|INAREG, ! 368: SANY, TANY, ! 369: SCREG|STCREG, TDOUBLE, ! 370: NAREG, RESC1, ! 371: " fmoved AR,sp@-\n\ ! 372: movl sp@+,A1\n\ ! 373: movl sp@+,U1\n", ! 374: ! 375: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ! 376: ! 377: /* ! 378: * loads into address-registers ! 379: */ ! 380: OPLTYPE, INTBREG|INBREG, ! 381: SANY, TANY, ! 382: SCON, TSCALAR, ! 383: NBREG|NBSR, RESC1, ! 384: " lea CR,A1\n", ! 385: ! 386: OPLTYPE, INTBREG|INBREG, ! 387: SANY, TANY, ! 388: EA, TWORD|TSHORT, ! 389: NBREG|NBSR, RESC1, ! 390: " movZB AR,A1\n", ! 391: ! 392: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ! 393: ! 394: /* ! 395: * stores into temp stack locations ! 396: */ ! 397: OPLTYPE, INTEMP|FORCC, ! 398: SANY, TANY, ! 399: EA, TSCALAR, ! 400: NTEMP, RESC1|RESCC, ! 401: " movZB AR,A1\n", ! 402: ! 403: OPLTYPE, INTEMP, ! 404: SANY, TANY, ! 405: EA, TFLOAT, ! 406: NTEMP, RESC1, ! 407: " movZB AR,A1\n", ! 408: ! 409: OPLTYPE, INTEMP, ! 410: SANY, TANY, ! 411: ED, TDOUBLE, ! 412: 2*NTEMP, RESC1, ! 413: " movl AR,A1\n movl UR,U1\n", ! 414: ! 415: OPLTYPE|OP68881, INTEMP, ! 416: SANY, TANY, ! 417: SCREG|STCREG, TFLOAT, ! 418: NTEMP, RESC1, ! 419: " fmoves AR,A1\n", ! 420: ! 421: OPLTYPE|OP68881, INTEMP, ! 422: SANY, TANY, ! 423: SCREG|STCREG, TDOUBLE, ! 424: 2*NTEMP, RESC1, ! 425: " fmoved AR,A1\n", ! 426: ! 427: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ! 428: ! 429: /* ! 430: * argument passing, integral types ! 431: */ ! 432: ! 433: OPLTYPE, FORARG, ! 434: SANY, TANY, ! 435: SBREG, TINT|TUNSIGNED|TPOINT, ! 436: 0, RNULL, ! 437: " pea AR@\nZP", ! 438: ! 439: OPLTYPE, FORARG, ! 440: SANY, TANY, ! 441: SCON, TSCALAR, ! 442: 0, RNULL, ! 443: " pea CR\nZP", ! 444: ! 445: OPLTYPE, FORARG, ! 446: SANY, TANY, ! 447: EA, TINT|TUNSIGNED|TPOINT, ! 448: 0, RNULL, ! 449: " movl AR,Z-\n", ! 450: ! 451: OPLTYPE, FORARG, ! 452: SANY, TANY, ! 453: EA, TSHORT, ! 454: NBREG|NBSR, RNULL, ! 455: " movw AR,A1\n movl A1,Z-\n", ! 456: ! 457: OPLTYPE, FORARG, ! 458: SANY, TANY, ! 459: EA, TUSHORT, ! 460: NAREG, RNULL, ! 461: " clrl A1\n movw AR,A1\n movl A1,Z-\n", ! 462: ! 463: OPLTYPE|NO68020, FORARG, ! 464: SANY, TANY, ! 465: EA, TCHAR, ! 466: NAREG|NASR, RNULL, ! 467: " movb AR,A1\n extw A1\n extl A1\n movl A1,Z-\n", ! 468: ! 469: OPLTYPE|OP68020, FORARG, ! 470: SANY, TANY, ! 471: EA, TCHAR, ! 472: NAREG|NASR, RNULL, ! 473: " movb AR,A1\n extbl A1\n movl A1,Z-\n", ! 474: ! 475: OPLTYPE, FORARG, ! 476: SANY, TANY, ! 477: EA, TUCHAR, ! 478: NAREG, RNULL, ! 479: " clrl A1\n movb AR,A1\n movl A1,Z-\n", ! 480: ! 481: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ! 482: ! 483: /* ! 484: * argument passing, floating types ! 485: */ ! 486: ! 487: OPLTYPE|OP68881, FORARG, ! 488: SANY, TANY, ! 489: SCREG|STCREG, TFLOAT, ! 490: 0, RNULL, ! 491: "Zf", /* can't tell from here whether to convert */ ! 492: ! 493: OPLTYPE|OP68881, FORARG, ! 494: SANY, TANY, ! 495: SCREG|STCREG, TDOUBLE, ! 496: 0, RNULL, ! 497: " fmoved AR,Z-\n", ! 498: ! 499: OPLTYPE, FORARG, ! 500: SANY, TANY, ! 501: EA, TFLOAT, ! 502: 0, RNULL, ! 503: "Zf", /* can't tell from here whether to convert */ ! 504: ! 505: OPLTYPE, FORARG, ! 506: SANY, TANY, ! 507: ED, TDOUBLE, ! 508: 0, RNULL, ! 509: " movl UR,Z-\n movl AR,Z-\n", ! 510: ! 511: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ! 512: ! 513: /* ! 514: * field extraction, for value or condition codes ! 515: */ ! 516: FLD, INAREG|INTAREG|FORCC, ! 517: SANY, TANY, ! 518: SPEC_FLD, TSCALAR, ! 519: NAREG, RESC1|RESCC, ! 520: "Zb\n", ! 521: ! 522: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ! 523: ! 524: /* ! 525: * compare integral operands, for flow control ! 526: */ ! 527: ! 528: OPLOG, FORCC, ! 529: SAREG|STAREG|SBREG|STBREG, TSCALAR, ! 530: EA, TSCALAR, ! 531: 0, RESCC, ! 532: " cmpZL AR,AL\nZI", ! 533: ! 534: OPLOG, FORCC, ! 535: (EA)&~SCON, TSCALAR, ! 536: SCON, TSCALAR, ! 537: 0, RESCC, ! 538: " cmpZL AR,AL\nZI", ! 539: ! 540: OPLOG, FORCC, ! 541: SAUTOINC, TSCALAR, ! 542: SAUTOINC, TSCALAR, ! 543: 0, RESCC, ! 544: " cmpmZL AR,AL\nZI", ! 545: ! 546: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ! 547: ! 548: /* ! 549: * (68881) compare floating operands, for flow control. ! 550: * Note that the 68881 has a separate condition code register and ! 551: * requires a different set of branch instructions. ! 552: */ ! 553: ! 554: OPLOG|OP68881, FORCC, ! 555: SFLOAT_SRCE, TFLOAT|TDOUBLE, ! 556: SFZERO, TFLOAT|TDOUBLE, ! 557: 0, RESFCC, ! 558: " ftestZG AL\nZH", ! 559: ! 560: OPLOG|OP68881, FORCC, ! 561: SCREG|STCREG, TFLOAT|TDOUBLE, ! 562: SFLOAT_SRCE, TFLOAT|TDOUBLE, ! 563: 0, RESFCC, ! 564: " fcmpZF ZK,AL\nZH", ! 565: ! 566: OPLOG|OP68881, FORCC, ! 567: SCREG|STCREG, TFLOAT|TDOUBLE, ! 568: SCREG|STCREG, TFLOAT|TDOUBLE, ! 569: 0, RESFCC, ! 570: " fcmpx AR,AL\nZH", ! 571: ! 572: OPLOG|OP68881, FORCC, ! 573: SCREG|STCREG, TFLOAT|TDOUBLE, ! 574: SAREG|STAREG, TDOUBLE, ! 575: 0, RESFCC, ! 576: " movl UR,Z-\n\ ! 577: movl AR,Z-\n\ ! 578: fcmpd sp@+,AL\nZH", ! 579: ! 580: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ! 581: ! 582: /* ! 583: * (no 68881) compare floating operands, for flow control. ! 584: */ ! 585: OPLOG|NO68881, FORCC, ! 586: SPEC_FLT, TFLOAT, ! 587: SPEC_FLT, TFLOAT, ! 588: 0, RESCC, ! 589: "ZfZI", ! 590: ! 591: OPLOG|NO68881, FORCC, ! 592: SPEC_FLT, TDOUBLE, ! 593: SPEC_DFLT, TDOUBLE, ! 594: NBREG, RESCC, ! 595: "ZfZI", ! 596: ! 597: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ! 598: ! 599: /* ! 600: * compare constant to field, for flow control ! 601: */ ! 602: OPLOG, FORCC, ! 603: SPEC_FLD, TSCALAR, ! 604: SCON, TSCALAR, ! 605: NAREG, RESCC, ! 606: "Zc\nZI", /* let ME do it */ ! 607: ! 608: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ! 609: ! 610: /* ! 611: * compare integral operands for boolean result ! 612: */ ! 613: ! 614: OPLOG, INTAREG, ! 615: SAREG|STAREG|SBREG|STBREG, TSCALAR, ! 616: EA, TSCALAR, ! 617: NAREG, RESC1, ! 618: " moveq #0,A1\n cmpZL AR,AL\n sI. A1\n negb A1\n", ! 619: ! 620: OPLOG, INTAREG, ! 621: (EA)&~SCON, TSCALAR, ! 622: SCON, TSCALAR, ! 623: NAREG, RESC1, ! 624: " moveq #0,A1\n cmpZL AR,AL\n sI. A1\n negb A1\n", ! 625: ! 626: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ! 627: ! 628: /* ! 629: * (68881) compare floating operands for boolean result ! 630: */ ! 631: ! 632: OPLOG|OP68881, INTAREG, ! 633: SFLOAT_SRCE, TFLOAT|TDOUBLE, ! 634: SFZERO, TFLOAT|TDOUBLE, ! 635: NAREG, RESC1, ! 636: " moveq #0,A1\n\ ! 637: ftestZG AL\n\ ! 638: fsI. A1\n\ ! 639: negb A1\n", ! 640: ! 641: OPLOG|OP68881, INTAREG, ! 642: SCREG|STCREG, TFLOAT|TDOUBLE, ! 643: SFLOAT_SRCE, TFLOAT|TDOUBLE, ! 644: NAREG, RESC1, ! 645: " moveq #0,A1\n\ ! 646: fcmpZF ZK,AL\n\ ! 647: fsI. A1\n\ ! 648: negb A1\n", ! 649: ! 650: OPLOG|OP68881, INTAREG, ! 651: SCREG|STCREG, TFLOAT|TDOUBLE, ! 652: SCREG|STCREG, TFLOAT|TDOUBLE, ! 653: NAREG, RESC1, ! 654: " moveq #0,A1\n\ ! 655: fcmpx AR,AL\n\ ! 656: fsI. A1\n\ ! 657: negb A1\n", ! 658: ! 659: OPLOG|OP68881, INTAREG, ! 660: SCREG|STCREG, TFLOAT|TDOUBLE, ! 661: SAREG|STAREG, TDOUBLE, ! 662: NAREG, RESC1, ! 663: " moveq #0,A1\n\ ! 664: movl UR,sp@-\n\ ! 665: movl AR,sp@-\n\ ! 666: fcmpd sp@+,AL\n\ ! 667: fsI. A1\n\ ! 668: negb A1\n", ! 669: ! 670: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ! 671: ! 672: /* ! 673: * (no 68881) compare floating operands for boolean result ! 674: */ ! 675: OPLOG|NO68881, INTAREG, ! 676: SPEC_FLT, TFLOAT, ! 677: SPEC_FLT, TFLOAT, ! 678: NAREG, RESC1, ! 679: " moveq #0,A1\nZf sfI. A1\n negb A1\n", ! 680: ! 681: OPLOG|NO68881, INTAREG, ! 682: SPEC_FLT, TDOUBLE, ! 683: SPEC_DFLT, TDOUBLE, ! 684: NBREG+NAREG, RESC1, ! 685: " moveq #0,A1\nZf sfI. A1\n negb A1\n", ! 686: ! 687: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ! 688: ! 689: /* ! 690: * compare constant to field, for boolean result ! 691: */ ! 692: OPLOG, INTAREG, ! 693: SPEC_FLD, TSCALAR, ! 694: SCON, TSCALAR, ! 695: 2*NAREG, RESC2, ! 696: " moveq #0,A2\nZc\n sI. A2\n negb A2\n", ! 697: ! 698: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ! 699: ! 700: /* ! 701: * convert floating point condition codes into boolean result ! 702: */ ! 703: FCCODES|OP68881, INTAREG|INAREG, ! 704: SANY, TANY, ! 705: SANY, TANY, ! 706: NAREG, RESC1, ! 707: " moveq #1,A1\nZN", ! 708: ! 709: /* ! 710: * convert integer condition codes into boolean result ! 711: */ ! 712: CCODES, INTAREG|INAREG, ! 713: SANY, TANY, ! 714: SANY, TANY, ! 715: NAREG, RESC1, ! 716: " moveq #1,A1\nZN", ! 717: ! 718: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ! 719: ! 720: /* ! 721: * negate scalar in temp register ! 722: */ ! 723: UNARY MINUS, INAREG|INTAREG, ! 724: STAREG, TSCALAR, ! 725: SANY, TANY, ! 726: 0, RLEFT, ! 727: " negZB AL\n", ! 728: ! 729: /* ! 730: * negate floating operand in temp data register. ! 731: */ ! 732: UNARY MINUS, INAREG|INTAREG, ! 733: STAREG, TFLOAT|TDOUBLE, ! 734: SANY, TANY, ! 735: 0, RLEFT, ! 736: "Zf", ! 737: ! 738: UNARY MINUS, INAREG|INTAREG, ! 739: EA&~STAREG, TFLOAT, ! 740: SANY, TANY, ! 741: NAREG|NASL, RESC1, ! 742: " movl AL,A1\n bchg #31,A1\n", ! 743: ! 744: UNARY MINUS, INAREG|INTAREG, ! 745: EA&~STAREG, TDOUBLE, ! 746: SANY, TANY, ! 747: NAREG|NASL, RESC1, ! 748: " movl AL,A1\n movl UL,U1\n bchg #31,A1\n", ! 749: ! 750: /* ! 751: * negate floating operand in floating point register ! 752: */ ! 753: (UNARY MINUS)|OP68881, INCREG|INTCREG, ! 754: SFLOAT_SRCE, TFLOAT|TDOUBLE, ! 755: SANY, TANY, ! 756: NCREG|NCSL, RESC1, ! 757: " fnegZF ZK,A1\n", ! 758: ! 759: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ! 760: ! 761: /* ! 762: * absolute value in temp data register ! 763: */ ! 764: FABS, INAREG|INTAREG, ! 765: STAREG, TFLOAT|TDOUBLE, ! 766: SANY, TANY, ! 767: 0, RLEFT, ! 768: " bclr #31,AL\n", ! 769: ! 770: FABS, INAREG|INTAREG, ! 771: EA&~STAREG, TFLOAT, ! 772: SANY, TANY, ! 773: NAREG|NASL, RESC1, ! 774: " movl AL,A1\n bclr #31,A1\n", ! 775: ! 776: FABS, INAREG|INTAREG, ! 777: EA&~STAREG, TDOUBLE, ! 778: SANY, TANY, ! 779: NAREG|NASL, RESC1, ! 780: " movl AL,A1\n movl UL,U1\n bclr #31,A1\n", ! 781: ! 782: /* ! 783: * floating=>integer conversion -- at present, these are ! 784: * only generated by FORTRAN and Pascal -- but see also ! 785: * SCONV below. ! 786: */ ! 787: FNINT|OP68881, INAREG|INTAREG, ! 788: STCREG, TFLOAT|TDOUBLE, ! 789: SANY, TSCALAR, ! 790: NAREG, RESC1, ! 791: "Zf", ! 792: ! 793: FNINT|NO68881, INAREG|INTAREG, ! 794: STAREG, TFLOAT|TDOUBLE, ! 795: SANY, TSCALAR, ! 796: 0, RLEFT, ! 797: "Zf", ! 798: ! 799: /* ! 800: * floating point intrinsics (sin, cos, exp, log, ...) ! 801: */ ! 802: OPINTR|OP68881, INCREG|INTCREG, ! 803: SFLOAT_SRCE, TFLOAT|TDOUBLE, ! 804: SANY, TANY, ! 805: NCREG|NCSL, RESC1, ! 806: "Zf", ! 807: ! 808: OPINTR|OP68881, INCREG|INTCREG, ! 809: SAREG|STAREG, TDOUBLE, ! 810: SANY, TANY, ! 811: NCREG|NCSL, RESC1, ! 812: "Zf", ! 813: ! 814: OPINTR|NO68881, INAREG|INTAREG, ! 815: STAREG, TFLOAT|TDOUBLE, ! 816: SANY, TANY, ! 817: 0, RLEFT, ! 818: "Zf", ! 819: ! 820: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ! 821: ! 822: /* ! 823: * one's complement of temp d-register ! 824: */ ! 825: COMPL, INTAREG|FORCC, ! 826: STAREG, TSCALAR, ! 827: SANY, TANY, ! 828: 0, RLEFT|RESCC, ! 829: " notZB AL\n", ! 830: ! 831: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ! 832: ! 833: /* ! 834: * increment/decrement operators ! 835: */ ! 836: ! 837: INCR, INTAREG|INAREG|FOREFF, ! 838: EAA, TSCALAR, ! 839: S8CON, TSCALAR, ! 840: NAREG, RESC1, ! 841: "F movZB AL,A1\n addqZB AR,AL\nZv", ! 842: ! 843: DECR, INTAREG|INAREG|FOREFF, ! 844: EAA, TSCALAR, ! 845: S8CON, TSCALAR, ! 846: NAREG, RESC1, ! 847: "F movZB AL,A1\n subqZB AR,AL\nZv", ! 848: ! 849: INCR, INTAREG|INAREG|FOREFF, ! 850: EAA, TSCALAR, ! 851: SCON, TSCALAR, ! 852: NAREG, RESC1, ! 853: "F movZB AL,A1\n addZB AR,AL\nZv", ! 854: ! 855: DECR, INTAREG|INAREG|FOREFF, ! 856: EAA, TSCALAR, ! 857: SCON, TSCALAR, ! 858: NAREG, RESC1, ! 859: "F movZB AL,A1\n subZB AR,AL\nZv", ! 860: ! 861: INCR, INTBREG|INBREG|FOREFF, ! 862: EB, TSCALAR, ! 863: S8CON, TSCALAR, ! 864: NBREG, RESC1, ! 865: "F movZB AL,A1\n addqZB AR,AL\n", ! 866: ! 867: DECR, INTBREG|INBREG|FOREFF, ! 868: EB, TSCALAR, ! 869: S8CON, TSCALAR, ! 870: NBREG, RESC1, ! 871: "F movZB AL,A1\n subqZB AR,AL\n", ! 872: ! 873: INCR, INTBREG|INBREG|FOREFF, ! 874: EB, TSCALAR, ! 875: SCON, TSCALAR, ! 876: NBREG, RESC1, ! 877: "F movZB AL,A1\n addZB AR,AL\n", ! 878: ! 879: DECR, INTBREG|INBREG|FOREFF, ! 880: EB, TSCALAR, ! 881: SCON, TSCALAR, ! 882: NBREG, RESC1, ! 883: "F movZB AL,A1\n subZB AR,AL\n", ! 884: ! 885: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ! 886: ! 887: /* ! 888: * address expressions ( base + offset [+ index] ) ! 889: */ ! 890: PLUS, INBREG|INTBREG, ! 891: SBREG, TPOINT, ! 892: SSCON, TANY, ! 893: NBREG|NBSL, RESC1, ! 894: " lea AL@(ZO),A1\n", ! 895: ! 896: PLUS, INBREG|INTBREG, ! 897: SBREG, TPOINT, ! 898: SAREG|SBREG, TWORD|TSHORT, ! 899: NBREG|NBSL, RESC1, ! 900: "Zl", ! 901: ! 902: PLUS, INBREG|INTBREG, ! 903: SBASE, TPOINT, ! 904: SXREG, TWORD|TSHORT, ! 905: NBREG|NBSL, RESC1, ! 906: " lea ZX,A1\n", ! 907: ! 908: PLUS, FORARG, ! 909: SBREG, TPOINT, ! 910: SSCON, TANY, ! 911: 0, RNULL, ! 912: " pea AL@(ZO)\nZP", ! 913: ! 914: PLUS, FORARG, ! 915: SBREG, TPOINT, ! 916: SAREG, TWORD|TSHORT, ! 917: 0, RNULL, ! 918: " pea AL@(0,AR:ZR)\nZP", ! 919: ! 920: PLUS, FORARG, ! 921: SBASE, TPOINT, ! 922: SXREG, TWORD|TSHORT, ! 923: 0, RNULL, ! 924: " pea ZX\nZP", ! 925: ! 926: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ! 927: ! 928: MINUS, INBREG|INTBREG, ! 929: SBREG, TPOINT, ! 930: SSCON, TANY, ! 931: NBREG|NBSL, RESC1, ! 932: " lea AL@(ZM),A1\n", ! 933: ! 934: MINUS, FORARG, ! 935: SBREG, TPOINT, ! 936: SSCON, TANY, ! 937: 0, RNULL, ! 938: " pea AL@(ZM)\nZP", ! 939: ! 940: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ! 941: ! 942: ASG PLUS, INAREG|FORCC, ! 943: EAA, TSCALAR, ! 944: S8CON, TSCALAR, ! 945: 0, RLEFT|RESCC, ! 946: " addqZB AR,AL\nZv", ! 947: ! 948: ASG PLUS, INBREG, ! 949: EB, TSCALAR, ! 950: S8CON, TSCALAR, ! 951: 0, RLEFT|RESCC, ! 952: " addqw AR,AL\n", ! 953: ! 954: ASG PLUS, INAREG|FORCC, ! 955: SAREG|STAREG, TSCALAR, ! 956: EAA, TSCALAR, ! 957: 0, RLEFT|RESCC, ! 958: " addZB AR,AL\nZv", ! 959: ! 960: ASG PLUS, INAREG|FORCC, ! 961: SAREG|STAREG, TWORD|TSHORT, ! 962: EB, TWORD|TSHORT, ! 963: 0, RLEFT|RESCC, ! 964: " addZB AR,AL\nZv", ! 965: ! 966: ASG PLUS, INBREG, ! 967: SBREG|STBREG, TSCALAR, ! 968: SICON, TANY, ! 969: 0, RLEFT, ! 970: " lea AL@(CR),AL\n", ! 971: ! 972: ASG PLUS, INBREG, ! 973: SBREG|STBREG, TSCALAR, ! 974: EA, TWORD|TSHORT, ! 975: 0, RLEFT, ! 976: " addZR AR,AL\n", ! 977: ! 978: ASG PLUS, INAREG|FORCC, ! 979: EAA, TSCALAR, ! 980: SAREG|STAREG, TSCALAR, ! 981: 0, RLEFT|RESCC, ! 982: " addZB AR,AL\nZv", ! 983: ! 984: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ! 985: ! 986: ASG MINUS, INAREG|FORCC, ! 987: EAA, TSCALAR, ! 988: S8CON, TSCALAR, ! 989: 0, RLEFT|RESCC, ! 990: " subqZB AR,AL\nZv", ! 991: ! 992: ASG MINUS, INBREG, ! 993: EB, TSCALAR, ! 994: S8CON, TSCALAR, ! 995: 0, RLEFT|RESCC, ! 996: " subqw AR,AL\n", ! 997: ! 998: ASG MINUS, INBREG, ! 999: SBREG|STBREG, TSCALAR, ! 1000: SICON, TANY, ! 1001: 0, RLEFT, ! 1002: " lea AL@(ZM),AL\n", ! 1003: ! 1004: ASG MINUS, INAREG|FORCC, ! 1005: SAREG|STAREG, TSCALAR, ! 1006: EAA, TSCALAR, ! 1007: 0, RLEFT|RESCC, ! 1008: " subZB AR,AL\nZv", ! 1009: ! 1010: ASG MINUS, INAREG|FORCC, ! 1011: SAREG|STAREG, TWORD|TSHORT, ! 1012: EB, TWORD|TSHORT, ! 1013: 0, RLEFT|RESCC, ! 1014: " subZB AR,AL\nZv", ! 1015: ! 1016: ASG MINUS, INBREG, ! 1017: SBREG|STBREG, TSCALAR, ! 1018: EA, TWORD|TSHORT, ! 1019: 0, RLEFT, ! 1020: " subZR AR,AL\n", ! 1021: ! 1022: ASG MINUS, INAREG|FORCC, ! 1023: EAA, TSCALAR, ! 1024: SAREG|STAREG, TSCALAR, ! 1025: 0, RLEFT|RESCC, ! 1026: " subZB AR,AL\nZv", ! 1027: ! 1028: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ! 1029: ! 1030: ASG ER, INAREG|FORCC, ! 1031: EAA, TSCALAR, ! 1032: SCON, TSCALAR, ! 1033: 0, RLEFT|RESCC, ! 1034: " eorZB AR,AL\n", ! 1035: ! 1036: ASG ER, INAREG|FORCC, ! 1037: EAA, TSCALAR, ! 1038: SAREG|STAREG, TSCALAR, ! 1039: 0, RLEFT|RESCC, ! 1040: " eorZB AR,AL\nZv", ! 1041: ! 1042: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ! 1043: ! 1044: ASG OPSIMP, INAREG|FORCC, ! 1045: SAREG|STAREG, TSCALAR, ! 1046: EAA, TSCALAR, ! 1047: 0, RLEFT|RESCC, ! 1048: " OIZB AR,AL\nZv", ! 1049: ! 1050: ASG OPSIMP, INAREG|FORCC, ! 1051: EAA, TSCALAR, ! 1052: SCON, TSCALAR, ! 1053: 0, RLEFT|RESCC, ! 1054: " OIZB AR,AL\nZv", ! 1055: ! 1056: ASG OPSIMP, INAREG|FORCC, ! 1057: EAA, TSCALAR, ! 1058: SAREG|STAREG, TSCALAR, ! 1059: 0, RLEFT|RESCC, ! 1060: " OIZB AR,AL\nZv", ! 1061: ! 1062: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ! 1063: ! 1064: /* ! 1065: * floating ASG binary operators ! 1066: */ ! 1067: ! 1068: (ASG OPFLOAT)|OP68881, INCREG|INTCREG|FOREFF, ! 1069: SCREG|STCREG, TFLOAT|TDOUBLE, ! 1070: SFLOAT_SRCE, TFLOAT|TDOUBLE, ! 1071: 0, RLEFT, ! 1072: " OFZF ZK,AL\n", ! 1073: ! 1074: (ASG OPFLOAT)|OP68881, INCREG|INTCREG|FOREFF, ! 1075: SCREG|STCREG, TFLOAT|TDOUBLE, ! 1076: SCREG|STCREG, TFLOAT|TDOUBLE, ! 1077: 0, RLEFT, ! 1078: " OFx AR,AL\n", ! 1079: ! 1080: (ASG OPFLOAT)|NO68881, INAREG|INTAREG|FOREFF, ! 1081: SPEC_FLT, TFLOAT, ! 1082: SPEC_FLT, TFLOAT, ! 1083: 0, RLEFT, ! 1084: "Zf", ! 1085: ! 1086: (ASG OPFLOAT)|NO68881, INAREG|INTAREG|FOREFF, ! 1087: SPEC_FLT, TDOUBLE, ! 1088: SPEC_DFLT, TDOUBLE, ! 1089: NBREG, RLEFT, ! 1090: "Zf", ! 1091: ! 1092: (ASG PLUS)|NO68881, INAREG|INTAREG|FOREFF, ! 1093: SPEC_FLT, TFLOAT, ! 1094: SPEC_PVT, TFLOAT, ! 1095: 0, RLEFT, ! 1096: "Zf", ! 1097: ! 1098: (ASG PLUS)|NO68881, INAREG|INTAREG|FOREFF, ! 1099: SPEC_FLT, TDOUBLE, ! 1100: SPEC_PVT, TDOUBLE, ! 1101: NBREG, RLEFT, ! 1102: "Zf", ! 1103: ! 1104: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ! 1105: ! 1106: /* ! 1107: * floating binary operators ! 1108: */ ! 1109: ! 1110: OPFLOAT|NO68881, INAREG|INTAREG, ! 1111: SPEC_FLT, TFLOAT, ! 1112: SPEC_FLT, TFLOAT, ! 1113: NAREG|NASL|NASR, RESC1, ! 1114: "Zf", ! 1115: ! 1116: OPFLOAT|NO68881, INAREG|INTAREG, ! 1117: SPEC_FLT, TDOUBLE, ! 1118: SPEC_DFLT, TDOUBLE, ! 1119: NAREG|NBREG|NASL|NASR, RESC1, ! 1120: "Zf", ! 1121: ! 1122: PLUS|NO68881, INAREG|INTAREG, ! 1123: SPEC_FLT, TFLOAT, ! 1124: SPEC_PVT, TFLOAT, ! 1125: NAREG|NASL|NASR, RESC1, ! 1126: "Zf", ! 1127: ! 1128: PLUS|NO68881, INAREG|INTAREG, ! 1129: SPEC_FLT, TDOUBLE, ! 1130: SPEC_PVT, TDOUBLE, ! 1131: NAREG|NBREG|NASL|NASR, RESC1, ! 1132: "Zf", ! 1133: ! 1134: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ! 1135: ! 1136: ASG MUL, INAREG|INTAREG|FOREFF, ! 1137: SAREG|STAREG, TCHAR, ! 1138: SCON, TANY, ! 1139: NAREG, RLEFT, ! 1140: " extw AL\nZm", ! 1141: ! 1142: ASG MUL, INAREG|INTAREG|FOREFF, ! 1143: SAREG|STAREG, TUCHAR, ! 1144: SCON, TANY, ! 1145: NAREG, RLEFT, ! 1146: " andw #255,AL\nZm", ! 1147: ! 1148: ASG MUL, INAREG|INTAREG|FOREFF, ! 1149: SAREG|STAREG, TWORD|TSHORT|TUSHORT, ! 1150: SCON, TANY, ! 1151: NAREG, RLEFT, ! 1152: "Zm", ! 1153: ! 1154: ASG MUL, INAREG|FORCC|FOREFF, ! 1155: SAREG|STAREG, TSHORT, ! 1156: EAA, TSHORT, ! 1157: 0, RLEFT|RESCC, ! 1158: " muls AR,AL\n", ! 1159: ! 1160: ASG MUL, INAREG|FORCC|FOREFF, ! 1161: SAREG|STAREG, TUSHORT, ! 1162: EAA, TUSHORT|TSHORT, ! 1163: 0, RLEFT|RESCC, ! 1164: " mulu AR,AL\n", ! 1165: ! 1166: ASG MUL, INAREG|FORCC|FOREFF, ! 1167: SAREG|STAREG, TSHORT, ! 1168: EAA, TUSHORT, ! 1169: 0, RLEFT|RESCC, ! 1170: " mulu AR,AL\n", ! 1171: ! 1172: ASG MUL, INAREG|INTAREG|FOREFF, ! 1173: SAREG|STAREG, TCHAR, ! 1174: EAA, TCHAR, ! 1175: NAREG, RLEFT, ! 1176: "\textw AL\n\tmovb AR,A1\n\textw A1\n\tmuls A1,AL\n", ! 1177: ! 1178: ASG MUL, INAREG|INTAREG|FOREFF, ! 1179: SAREG|STAREG, TUCHAR, ! 1180: EAA, TUCHAR|TCHAR, ! 1181: NAREG, RLEFT, ! 1182: "\tandw #255,AL\n\tclrw A1\n\tmovb AR,A1\n\tmuls A1,AL\n", ! 1183: ! 1184: (ASG MUL)|NO68020, INTAREG|FOREFF, ! 1185: STAREG, TPOINT|TLONG|TINT, ! 1186: STAREG, TPOINT|TLONG|TINT, ! 1187: 0, RLEFT, ! 1188: " jsr lmult\nZv", ! 1189: ! 1190: (ASG MUL)|NO68020, INTAREG|FOREFF, ! 1191: STAREG, TWORD, ! 1192: STAREG, TWORD, ! 1193: 0, RLEFT, ! 1194: " jsr ulmult\nZv", ! 1195: ! 1196: (ASG MUL)|OP68020, INAREG|INTAREG|FOREFF, ! 1197: SAREG|STAREG, TPOINT|TLONG|TINT, ! 1198: EAA, TPOINT|TLONG|TINT, ! 1199: 0, RLEFT, ! 1200: " mulsl AR,AL\nZv", ! 1201: ! 1202: (ASG MUL)|OP68020, INAREG|INTAREG|FOREFF, ! 1203: SAREG|STAREG, TWORD, ! 1204: EAA, TWORD, ! 1205: 0, RLEFT, ! 1206: " mulul AR,AL\nZv", ! 1207: ! 1208: (ASG MUL)|NO68881, INAREG|FOREFF, ! 1209: STAREG, TFLOAT, ! 1210: STAREG, TFLOAT, ! 1211: 0, RLEFT, ! 1212: "Zf", ! 1213: ! 1214: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ! 1215: ! 1216: ASG DIV, INAREG|INTAREG|FOREFF, ! 1217: SAREG|STAREG, ANYSIGNED, ! 1218: SCON, TANY, ! 1219: 0, RLEFT|RNULL, ! 1220: "Zd", ! 1221: ! 1222: ASG DIV, INAREG|INTAREG|FORCC|FOREFF, ! 1223: SAREG|STAREG, TSHORT, ! 1224: EAA, TSHORT, ! 1225: 0, RLEFT|RESCC, ! 1226: " extl AL\n divs AR,AL\n", ! 1227: ! 1228: ASG DIV, INAREG|INTAREG|FORCC|FOREFF, ! 1229: SAREG|STAREG, TUSHORT, ! 1230: EAA, TUSHORT|TSHORT, ! 1231: 0, RLEFT|RESCC, ! 1232: " andl #0xffff,AL\n divu AR,AL\n", ! 1233: ! 1234: ASG DIV, INAREG|INTAREG|FORCC|FOREFF, ! 1235: SAREG|STAREG, TSHORT, ! 1236: EAA, TUSHORT, ! 1237: 0, RLEFT|RESCC, ! 1238: " andl #0xffff,AL\n divu AR,AL\n", ! 1239: ! 1240: (ASG DIV)|NO68020, INTAREG|INAREG|FOREFF, ! 1241: SAREG|STAREG, TCHAR, ! 1242: EAA, TCHAR, ! 1243: NAREG, RLEFT, ! 1244: " extw AL\n\ ! 1245: extl AL\n\ ! 1246: movb AR,A1\n\ ! 1247: extw A1\n\ ! 1248: divs A1,AL\n", ! 1249: ! 1250: (ASG DIV)|OP68020, INTAREG|INAREG|FOREFF, ! 1251: SAREG|STAREG, TCHAR, ! 1252: EAA, TCHAR, ! 1253: NAREG, RLEFT, ! 1254: " extbl AL\n\ ! 1255: movb AR,A1\n\ ! 1256: extw A1\n\ ! 1257: divs A1,AL\n", ! 1258: ! 1259: ASG DIV, INTAREG|INAREG|FOREFF, ! 1260: SAREG|STAREG, TUCHAR, ! 1261: EAA, TUCHAR|TCHAR, ! 1262: NAREG, RLEFT, ! 1263: "\tandw #255,AL\n\tclrw A1\n\tmovb AR,A1\n\tdivs A1,AL\n", ! 1264: ! 1265: (ASG DIV)|NO68020, INTAREG|FOREFF, ! 1266: STAREG, ANYSIGNED, ! 1267: STAREG, ANYSIGNED, ! 1268: 0, RLEFT, ! 1269: " jsr ldivt\n", ! 1270: ! 1271: (ASG DIV)|NO68020, INTAREG|FOREFF, ! 1272: STAREG, TWORD, ! 1273: STAREG, TWORD, ! 1274: 0, RLEFT, ! 1275: " jsr uldivt\n", ! 1276: ! 1277: (ASG DIV)|OP68020, INAREG|INTAREG|FOREFF, ! 1278: SAREG|STAREG, ANYSIGNED, ! 1279: EAA, ANYSIGNED, ! 1280: 0, RLEFT, ! 1281: " divsl AR,AL\n", ! 1282: ! 1283: (ASG DIV)|OP68020, INAREG|INTAREG|FOREFF, ! 1284: SAREG|STAREG, TWORD, ! 1285: EAA, TWORD, ! 1286: 0, RLEFT, ! 1287: " divul AR,AL\n", ! 1288: ! 1289: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ! 1290: ! 1291: /* ! 1292: * <areg> %= <constant, not a power of 2>. ! 1293: * This case has two templates before the "Zr" case, so that we can ! 1294: * generate a div.ll instruction with the remainder returned in RESC1 ! 1295: * instead of RLEFT, thus saving a register-register move. whoop-te-doo ! 1296: */ ! 1297: ! 1298: (ASG MOD)|OP68020, INAREG|INTAREG, ! 1299: STAREG, TINT|TLONG, ! 1300: SNONPOW2, TANY, ! 1301: NAREG, RESC1, ! 1302: " divsll AR,A1:AL\n", ! 1303: ! 1304: (ASG MOD)|OP68020, INAREG|INTAREG, ! 1305: STAREG, TUNSIGNED|TULONG, ! 1306: SNONPOW2, TANY, ! 1307: NAREG, RESC1, ! 1308: " divull AR,A1:AL\n", ! 1309: ! 1310: ASG MOD, INAREG|INTAREG|FOREFF, ! 1311: SAREG|STAREG, ANYFIXED, ! 1312: SCON, TANY, ! 1313: NAREG, RLEFT|RNULL, ! 1314: "Zr", ! 1315: ! 1316: ASG MOD, INTAREG|INAREG|FOREFF, ! 1317: SAREG|STAREG, TSHORT, ! 1318: EAA, TSHORT, ! 1319: 0, RLEFT, ! 1320: " extl AL\n divs AR,AL\n swap AL\n", ! 1321: ! 1322: ASG MOD, INTAREG|INAREG|FOREFF, ! 1323: SAREG|STAREG, TUSHORT, ! 1324: EAA, TUSHORT|TSHORT, ! 1325: 0, RLEFT, ! 1326: " andl #65535,AL\n divu AR,AL\n swap AL\n", ! 1327: ! 1328: ASG MOD, INTAREG|INAREG|FOREFF, ! 1329: SAREG|STAREG, TSHORT, ! 1330: EAA, TUSHORT, ! 1331: 0, RLEFT, ! 1332: " andl #65535,AL\n divu AR,AL\n swap AL\n", ! 1333: ! 1334: ASG MOD, INTAREG|INAREG|FOREFF, ! 1335: SAREG|STAREG, TCHAR, ! 1336: EAA, TCHAR, ! 1337: NAREG, RLEFT, ! 1338: " extw AL\n\ ! 1339: movb AR,A1\n\ ! 1340: extw A1\n\ ! 1341: divs A1,AL\n\ ! 1342: swap AL\n", ! 1343: ! 1344: ASG MOD, INTAREG|INAREG|FOREFF, ! 1345: SAREG|STAREG, TUCHAR, ! 1346: EAA, TUCHAR|TCHAR, ! 1347: NAREG, RLEFT, ! 1348: "\tandw #255,AL\n\tclrw A1\n\tmovb AR,A1\n\tdivs A1,AL\n swap AL\n", ! 1349: ! 1350: (ASG MOD)|NO68020, INTAREG|FOREFF, ! 1351: STAREG, ANYSIGNED, ! 1352: STAREG, ANYSIGNED, ! 1353: 0, RLEFT, ! 1354: " jsr lmodt\n", ! 1355: ! 1356: (ASG MOD)|NO68020, INTAREG|FOREFF, ! 1357: STAREG, TWORD, ! 1358: STAREG, TWORD, ! 1359: 0, RLEFT, ! 1360: " jsr ulmodt\n", ! 1361: ! 1362: (ASG MOD)|OP68020, INAREG|INTAREG, ! 1363: STAREG, ANYSIGNED, ! 1364: EAA, ANYSIGNED, ! 1365: NAREG|NASR, RESC1, ! 1366: " divsll AR,A1:AL\n", ! 1367: ! 1368: (ASG MOD)|OP68020, INAREG|INTAREG|FOREFF, ! 1369: SAREG|STAREG, ANYSIGNED, ! 1370: EAA, ANYSIGNED, ! 1371: NAREG|NASR, RLEFT, ! 1372: " divsll AR,A1:AL\n movl A1,AL\n", ! 1373: ! 1374: (ASG MOD)|OP68020, INAREG|INTAREG, ! 1375: STAREG, TWORD, ! 1376: EAA, TWORD, ! 1377: NAREG|NASR, RESC1, ! 1378: " divull AR,A1:AL\n", ! 1379: ! 1380: (ASG MOD)|OP68020, INAREG|INTAREG|FOREFF, ! 1381: SAREG|STAREG, TWORD, ! 1382: EAA, TWORD, ! 1383: NAREG|NASR, RLEFT, ! 1384: " divull AR,A1:AL\n movl A1,AL\n", ! 1385: ! 1386: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ! 1387: ! 1388: ASG OPSHFT, FOREFF, ! 1389: SNAME|SOREG|STARREG, TSHORT, ! 1390: SONE, TSCALAR, ! 1391: 0, RLEFT, ! 1392: " aOIw AL\n", ! 1393: ! 1394: ASG OPSHFT, INAREG|FOREFF, ! 1395: SAREG, TINT|TSHORT|TCHAR, ! 1396: S8CON, TSCALAR, ! 1397: 0, RLEFT, ! 1398: " aOIZB AR,AL\n", ! 1399: ! 1400: ASG OPSHFT, INAREG|FOREFF, ! 1401: SAREG, TINT|TSHORT|TCHAR, ! 1402: SAREG, TSCALAR, ! 1403: 0, RLEFT, ! 1404: " aOIZB AR,AL\n", ! 1405: ! 1406: /* ASG OPSHFT, INAREG|FOREFF, */ ! 1407: ASG OPSHFT, FOREFF, ! 1408: SNAME|SOREG|STARREG, TUSHORT, ! 1409: SONE, TSCALAR, ! 1410: 0, RLEFT, ! 1411: " lOIw AL\n", ! 1412: ! 1413: ASG OPSHFT, INAREG|FOREFF, ! 1414: SAREG, TUNSIGNED|TUSHORT|TUCHAR, ! 1415: S8CON, TSCALAR, ! 1416: 0, RLEFT, ! 1417: " lOIZB AR,AL\n", ! 1418: ! 1419: ASG OPSHFT, INAREG|FOREFF, ! 1420: SAREG, TUNSIGNED|TUSHORT|TUCHAR, ! 1421: SAREG, TSCALAR, ! 1422: 0, RLEFT, ! 1423: " lOIZB AR,AL\n", ! 1424: ! 1425: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ! 1426: ! 1427: UNARY CALL, INTAREG, ! 1428: SBREG|SNAME|SOREG|SCON|SAREG, TANY, ! 1429: SANY, TANY, ! 1430: NAREG|NASL, RESC1, /* should be register 0 */ ! 1431: "ZC\n", ! 1432: ! 1433: CHK, INAREG, ! 1434: SAREG, TSHORT|TWORD, ! 1435: SZEROLB, TANY, ! 1436: 0, RLEFT, ! 1437: "ZV", ! 1438: ! 1439: CHK, INTAREG, ! 1440: STAREG, TSCALAR, ! 1441: SANY, TANY, ! 1442: 0, RLEFT, ! 1443: "ZV", ! 1444: ! 1445: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ! 1446: ! 1447: /* ! 1448: * conversions, from and to integer types ! 1449: */ ! 1450: SCONV, INTAREG, ! 1451: STAREG, TINT|TUNSIGNED|TPOINT, ! 1452: SANY, TINT|TUNSIGNED|TPOINT, ! 1453: 0, RLEFT, ! 1454: "", ! 1455: ! 1456: SCONV, INAREG|INTAREG, ! 1457: STAREG, TINT|TUNSIGNED|TPOINT, ! 1458: SANY, TSHORT|TCHAR|TUSHORT|TUCHAR, ! 1459: 0, RLEFT, ! 1460: "", ! 1461: ! 1462: SCONV, INAREG|INTAREG, ! 1463: SAREG, TINT|TUNSIGNED|TPOINT, ! 1464: SANY, TSHORT|TCHAR|TUSHORT|TUCHAR, ! 1465: NAREG|NASL, RESC1, ! 1466: " movZB AL,A1\n", ! 1467: ! 1468: SCONV, INAREG|INTAREG, ! 1469: STAREG, TCHAR, ! 1470: SANY, TSHORT|TUSHORT, ! 1471: 0, RLEFT, ! 1472: " extw AL\n", ! 1473: ! 1474: (SCONV)|NO68020, INAREG|INTAREG, ! 1475: STAREG, TCHAR, ! 1476: SANY, TINT|TUNSIGNED|TPOINT, ! 1477: 0, RLEFT, ! 1478: " extw AL\n extl AL\n", ! 1479: ! 1480: (SCONV)|OP68020, INAREG|INTAREG, ! 1481: STAREG, TCHAR, ! 1482: SANY, TINT|TUNSIGNED|TPOINT, ! 1483: 0, RLEFT, ! 1484: " extbl AL\n", ! 1485: ! 1486: SCONV, INAREG|INTAREG, ! 1487: STAREG, TSHORT, ! 1488: SANY, TINT|TUNSIGNED|TPOINT, ! 1489: 0, RLEFT, ! 1490: " extl AL\n", ! 1491: ! 1492: SCONV, INAREG|INTAREG, ! 1493: ES, TUCHAR, ! 1494: SANY, TSCALAR, ! 1495: NAREG|NASL, RESC1, ! 1496: "Zt", ! 1497: ! 1498: SCONV, INAREG|INTAREG, ! 1499: ES, TUSHORT, ! 1500: SANY, TWORD, ! 1501: NAREG|NASL, RESC1, ! 1502: "Zt", ! 1503: ! 1504: /* icky conversions into B registers -- for immediate use as a pointer */ ! 1505: SCONV, INBREG|INTBREG, ! 1506: STAREG, TSHORT, ! 1507: SANY, TWORD, ! 1508: NBREG, RESC1, ! 1509: " movw AL,A1\n", ! 1510: ! 1511: SCONV, INBREG|INTBREG, ! 1512: STAREG, TUSHORT, ! 1513: SANY, TWORD, ! 1514: NBREG, RESC1, ! 1515: " andl #0xffff,AL\n movl AL,A1\n", ! 1516: ! 1517: SCONV, INBREG|INTBREG, ! 1518: STAREG, TCHAR, ! 1519: SANY, TWORD, ! 1520: NBREG, RESC1, ! 1521: " extw AL\n movw AL,A1\n", ! 1522: ! 1523: SCONV, INBREG|INTBREG, ! 1524: STAREG, TUCHAR, ! 1525: SANY, TWORD, ! 1526: NBREG, RESC1, ! 1527: " andl #0xff,AL\n movl AL,A1\n", ! 1528: /* end icky */ ! 1529: ! 1530: SCONV, INAREG|INTAREG, ! 1531: SNAME|SOREG|SAREG, TINT|TUNSIGNED|TPOINT|TSHORT|TUSHORT, ! 1532: SANY, TSHORT|TUSHORT|TCHAR|TUCHAR, ! 1533: 0, RLEFT, ! 1534: "ZT", ! 1535: ! 1536: SCONV, INAREG|INTAREG, ! 1537: SBREG, TINT|TUNSIGNED|TPOINT|TSHORT|TUSHORT, ! 1538: SANY, TSHORT|TUSHORT, ! 1539: 0, RLEFT, ! 1540: "ZT", ! 1541: ! 1542: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ! 1543: ! 1544: /* ! 1545: * floating point conversions ! 1546: */ ! 1547: ! 1548: SCONV|OP68881, INCREG|INTCREG, ! 1549: EAA, ANYSIGNED|TFLOAT, ! 1550: SANY, TFLOAT|TDOUBLE, ! 1551: NCREG, RESC1, ! 1552: " fmoveZG AL,A1\n", ! 1553: ! 1554: SCONV|OP68881, INCREG|INTCREG, ! 1555: SCREG|STCREG, TFLOAT|TDOUBLE, ! 1556: SANY, TDOUBLE, ! 1557: 0, RLEFT, ! 1558: "", ! 1559: ! 1560: /* conversions into the d-registers, for function results etc */ ! 1561: ! 1562: SCONV|OP68881, INTAREG|INTAREG, ! 1563: SCREG|STCREG, TFLOAT|TDOUBLE, ! 1564: SANY, TFLOAT, ! 1565: NAREG, RESC1, ! 1566: " fmoveZ. AL,A1\n", ! 1567: ! 1568: SCONV|OP68881, INTAREG|INTAREG, ! 1569: SCREG|STCREG, TFLOAT, ! 1570: SANY, TDOUBLE, ! 1571: NAREG, RESC1, ! 1572: " fmoveZ. AL,sp@-\n\ ! 1573: movl sp@+,A1\n\ ! 1574: movl sp@+,U1\n", ! 1575: ! 1576: /* ! 1577: * conversion from float|double to integer ! 1578: */ ! 1579: SCONV|OP68881, INTAREG, ! 1580: STCREG, TDOUBLE|TFLOAT, ! 1581: SANY, TSCALAR, ! 1582: NAREG, RESC1, ! 1583: " fintrzx AL,AL\n\ ! 1584: fmovel AL,A1\n", ! 1585: ! 1586: SCONV|NO68881, INAREG|INTAREG, ! 1587: STAREG, TDOUBLE, ! 1588: SANY, TFLOAT, ! 1589: NAREG|NASL, RESC1, ! 1590: "Zg", ! 1591: ! 1592: SCONV|NO68881, INTAREG|INTAREG, ! 1593: STAREG,TFLOAT, ! 1594: SANY, TDOUBLE, ! 1595: NAREG|NASL, RESC1, ! 1596: "Zg", ! 1597: ! 1598: SCONV|NO68881, INTAREG, ! 1599: STAREG, TDOUBLE|TFLOAT, ! 1600: SANY, TSCALAR, ! 1601: NAREG|NASL, RESC1, ! 1602: "Zg", ! 1603: ! 1604: SCONV|NO68881, INTAREG, ! 1605: STAREG, TSCALAR, ! 1606: SANY, TDOUBLE|TFLOAT, ! 1607: NAREG|NASL, RESC1, ! 1608: "Zg", ! 1609: ! 1610: SCONV, INAREG, ! 1611: STAREG|SAREG, TDOUBLE, ! 1612: SANY, TDOUBLE, ! 1613: 0, RLEFT, ! 1614: "", ! 1615: ! 1616: SCONV, INAREG, ! 1617: STAREG|SAREG, TFLOAT, ! 1618: SANY, TFLOAT, ! 1619: 0, RLEFT, ! 1620: "", ! 1621: ! 1622: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ! 1623: ! 1624: /* ! 1625: * structure assignments ! 1626: */ ! 1627: ! 1628: STASG, FOREFF, ! 1629: STBREG, TANY, ! 1630: STBREG, TANY, ! 1631: NAREG, RNULL, ! 1632: "ZS", ! 1633: ! 1634: STASG, INBREG|INTBREG|FOREFF, ! 1635: SNAME|SOREG|SBREG|STBREG, TANY, ! 1636: STBREG, TANY, ! 1637: NAREG|NBREG|NBSL, RRIGHT, ! 1638: "ZS", ! 1639: ! 1640: /* never needs a temp register on the left */ ! 1641: STASG, INBREG|INTBREG|FOREFF, ! 1642: STBREG, TANY, ! 1643: SBREG|STBREG, TANY, ! 1644: NAREG|NBREG|NBSR, RRIGHT, ! 1645: "ZS", ! 1646: ! 1647: /* last resort -- uses more registers */ ! 1648: STASG, INBREG|INTBREG|FOREFF, ! 1649: SNAME|SOREG|SBREG|STBREG, TANY, ! 1650: SBREG|STBREG, TANY, ! 1651: NAREG|2*NBREG|NBSR, RRIGHT, ! 1652: "ZS", ! 1653: ! 1654: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ! 1655: ! 1656: /* ! 1657: * structure arguments ! 1658: */ ! 1659: ! 1660: STARG, FORARG, ! 1661: STBREG, TPOINT, ! 1662: SANY, TANY, ! 1663: NAREG|NBREG, RNULL, ! 1664: "ZS", ! 1665: ! 1666: STARG, FORARG, ! 1667: SNAME|SOREG, TSTRUCT, ! 1668: SANY, TANY, ! 1669: NAREG|2*NBREG, RNULL, ! 1670: "ZS", ! 1671: ! 1672: STARG, FORARG, ! 1673: SBREG|STBREG, TPOINT, ! 1674: SANY, TANY, ! 1675: NAREG|2*NBREG, RNULL, ! 1676: "ZS", ! 1677: ! 1678: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ! 1679: ! 1680: /* ! 1681: * initializations - constants only ! 1682: */ ! 1683: INIT, FOREFF, ! 1684: SCON, TANY, ! 1685: SANY, TINT|TLONG|TUNSIGNED|TULONG|TPOINT, ! 1686: 0, RNOP, ! 1687: " .long CL\n", ! 1688: ! 1689: INIT, FOREFF, ! 1690: SCON, TANY, ! 1691: SANY, TSHORT|TUSHORT, ! 1692: 0, RNOP, ! 1693: " .word CL\n", ! 1694: ! 1695: INIT, FOREFF, ! 1696: SCON, TANY, ! 1697: SANY, TCHAR|TUCHAR, ! 1698: 0, RNOP, ! 1699: " .byte CL\n", ! 1700: ! 1701: INIT, FOREFF, ! 1702: SCON, TANY, ! 1703: SANY, TFLOAT|TDOUBLE, ! 1704: 0, RNOP, ! 1705: " .long CL\n", ! 1706: ! 1707: /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ! 1708: ! 1709: /* Default actions for hard trees ... */ ! 1710: ! 1711: # define DF(x) FORREW,SANY,TANY,SANY,TANY,REWRITE,x,"" ! 1712: ! 1713: UNARY MUL, DF( UNARY MUL ), ! 1714: ! 1715: INCR, DF(INCR), ! 1716: ! 1717: DECR, DF(INCR), ! 1718: ! 1719: ASSIGN, DF(ASSIGN), ! 1720: ! 1721: STASG, DF(STASG), ! 1722: ! 1723: OPLEAF, DF(NAME), ! 1724: ! 1725: OPLOG, FORCC, ! 1726: SANY, TANY, ! 1727: SANY, TANY, ! 1728: REWRITE, BITYPE, ! 1729: "", ! 1730: ! 1731: /*OPLOG, DF(NOT),*/ ! 1732: OPLOG, DF(BITYPE), ! 1733: COMOP, DF(COMOP), ! 1734: INIT, DF(INIT), ! 1735: FLD, DF(FLD), ! 1736: GOTO,DF(GOTO), ! 1737: SCONV, DF(SCONV), ! 1738: OPUNARY, DF(UNARY MINUS), ! 1739: ASG OPANY, DF(ASG PLUS), ! 1740: OPANY, DF(BITYPE), ! 1741: FREE, FREE, FREE, FREE, FREE, FREE, FREE, FREE, "help; I'm in trouble\n" };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.