1/* Id: table.c,v 1.18 2016/01/05 12:23:22 ragge Exp */ 2/* $NetBSD: table.c,v 1.1.1.4 2016/02/09 20:28:23 plunky Exp $ */ 3/* 4 * Copyright (c) 2003 Anders Magnusson (ragge@ludd.luth.se). 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. The name of the author may not be used to endorse or promote products 16 * derived from this software without specific prior written permission 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 20 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 21 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 23 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 */ 29 30/* 31 * MIPS port by Jan Enoksson (janeno-1@student.ltu.se) and 32 * Simon Olsson (simols-1@student.ltu.se) 2005. 33 * 34 * It appears that the target machine was big endian. The original 35 * code contained many endian aspects which are now handled in 36 * machine-independent code. 37 * 38 * On MIPS, the assembler does an amazing amount of work for us. 39 * We don't have to worry about PIC, nor about finding the address 40 * of SNAMES. Whenever possible, we defer the work to the assembler. 41 */ 42 43#include "pass2.h" 44 45#define TUWORD TUNSIGNED|TULONG 46#define TSWORD TINT|TLONG 47#define TWORD TUWORD|TSWORD 48 49struct optab table[] = { 50/* First entry must be an empty entry */ 51{ -1, FOREFF, SANY, TANY, SANY, TANY, 0, 0, "", }, 52 53/* PCONVs are usually not necessary */ 54{ PCONV, INAREG, 55 SAREG, TWORD|TPOINT, 56 SAREG, TWORD|TPOINT, 57 0, RLEFT, 58 " # convert between word and pointer", }, 59 60/* 61 * Conversions of integral types (register-register) 62 * 63 * For each deunsigned type, they look something like this: 64 * 65 * signed -> bigger signed - nothing to do 66 * unsigned -> bigger - nothing to do 67 * 68 * signed -> bigger unsigned - clear the top bits (of source type) 69 * signed -> smaller signed - sign-extend the bits (to dest type) 70 * signed -> smaller unsigned - clear the top bits (of dest type) 71 * unsigned -> smaller signed - sign-extend top bits (to dest type) 72 * unsigned -> smaller unsigned - clear the top bits (of dest type) 73 * 74 */ 75 76/* convert between int and ptr */ 77{ SCONV, INAREG, 78 SAREG, TPOINT|TWORD, 79 SAREG, TWORD|TPOINT, 80 0, RLEFT, 81 "", }, 82 83/* convert between LL and uLL */ 84{ SCONV, INBREG, 85 SBREG, TLONGLONG|TULONGLONG, 86 SBREG, TULONGLONG|TLONGLONG, 87 0, RLEFT, 88 "", }, 89 90/* (u)char to (u)char/(u)short/(u)int */ 91{ SCONV, INAREG, 92 SAREG, TCHAR|TUCHAR, 93 SAREG, TCHAR|TUCHAR|TWORD|TSHORT|TUSHORT, 94 0, RLEFT, 95 "", }, 96 97/* (u)short to (u)int */ 98{ SCONV, INAREG, 99 SAREG, TSHORT|TUSHORT, 100 SAREG, TWORD|TSHORT|TUSHORT, 101 0, RLEFT, 102 "", }, 103 104/* (u)int to (u)int */ 105{ SCONV, INAREG, 106 SAREG, TWORD, 107 SAREG, TWORD, 108 0, RLEFT, 109 "", }, 110 111/* (u)int/(u)short to char */ 112{ SCONV, INAREG, 113 SAREG, TWORD|TSHORT|TUSHORT, 114 SAREG, TCHAR, 115 NAREG|NASL, RESC1, 116 " sll A1,AL,24\n" 117 " sra A1,A1,24\n", }, 118 119/* (u)int/(u)short to uchar */ 120{ SCONV, INAREG, 121 SAREG, TWORD|TSHORT|TUSHORT, 122 SAREG, TUCHAR, 123 NAREG|NASL, RESC1, 124 " andi A1,AL,255\n", }, 125 126/* (u)int to short */ 127{ SCONV, INAREG, 128 SAREG, TWORD, 129 SAREG, TSHORT, 130 NAREG|NASL, RESC1, 131 " sll A1,AL,16\n" 132 " sra A1,A1,16\n", }, 133 134/* (u)int to ushort */ 135{ SCONV, INAREG, 136 SAREG, TWORD, 137 SAREG, TUSHORT, 138 NAREG|NASL, RESC1, 139 " andi A1,AL,65535\n", }, 140 141/* longlong casts below */ 142{ SCONV, INBREG, 143 SAREG, TSWORD|TSHORT|TCHAR, 144 SBREG, TLONGLONG, 145 NBREG, RESC1, 146 " move A1,AL # convert int/short/char to longlong\n" 147 " sra U1,AL,31\n", }, 148 149{ SCONV, INBREG, 150 SAREG, TSWORD|TSHORT|TCHAR, 151 SBREG, TULONGLONG, 152 NBREG, RESC1, 153 " move A1,AL # convert int/short/char to ulonglong\n" 154 " move U1,$zero\n", }, 155 156{ SCONV, INBREG, 157 SAREG, TWORD|TUSHORT|TSHORT|TUCHAR|TCHAR, 158 SBREG, TLONGLONG|TULONGLONG, 159 NBREG, RESC1, 160 " move A1,AL # convert (u)int/(u)short/(u)char to ulonglong\n" 161 " move U1,$zero\n", }, 162 163{ SCONV, INAREG, 164 SBREG, TLONGLONG|TULONGLONG, 165 SAREG, TWORD, 166 NAREG, RESC1, 167 " move A1,AL # convert (u)longlong to int\n", }, 168 169{ SCONV, INAREG, 170 SBREG, TLONGLONG|TULONGLONG, 171 SAREG, TSHORT, 172 NAREG, RESC1, 173 " sll A1,AL,16 # convert (u)longlong to short\n" 174 " sra A1,A1,16\n", }, 175 176{ SCONV, INAREG, 177 SBREG, TLONGLONG|TULONGLONG, 178 SAREG, TCHAR, 179 NAREG, RESC1, 180 " sll A1,AL,24 # convert (u)longlong to char\n" 181 " sra A1,A1,24\n", }, 182 183{ SCONV, INAREG, 184 SBREG, TLONGLONG|TULONGLONG, 185 SAREG, TUSHORT, 186 NAREG, RESC1, 187 " andi A1,AL,65535 # convert (u)longlong to ushort\n", }, 188 189{ SCONV, INAREG, 190 SBREG, TLONGLONG|TULONGLONG, 191 SAREG, TUCHAR, 192 NAREG, RESC1, 193 " andi A1,AL,255 # convert (u)longlong to uchar\n", }, 194 195{ SCONV, INCREG, 196 SCREG, TFLOAT, 197 SCREG, TDOUBLE|TLDOUBLE, 198 NCREG, RESC1, 199 " cvt.d.s A1,AL # convert float to (l)double\n", }, 200 201{ SCONV, INCREG, 202 SCREG, TDOUBLE|TLDOUBLE, 203 SCREG, TFLOAT, 204 NCREG, RESC1, 205 " cvt.s.d A1,AL # convert (l)double to float\n", }, 206 207{ SCONV, INCREG, 208 SAREG, TWORD, 209 SCREG, TFLOAT, 210 NCREG, RESC1, 211 " mtc1 AL,A1 # convert (u)int to float\n" 212 " nop\n" 213 " cvt.s.w A1,A1\n", }, 214 215{ SCONV, INCREG, 216 SOREG, TWORD, 217 SCREG, TFLOAT, 218 NCREG, RESC1, 219 " l.s A1,AL # convert (u)int to float\n" 220 " nop\n" 221 " cvt.s.w A1,A1\n", }, 222 223{ SCONV, INCREG, 224 SAREG, TWORD, 225 SCREG, TDOUBLE|TLDOUBLE, 226 NCREG, RESC1, 227 " mtc1 AL,A1 # convert (u)int to (l)double\n" 228 " nop\n" 229 " cvt.d.w A1,A1\n", }, 230 231{ SCONV, INCREG, 232 SOREG, TWORD, 233 SCREG, TDOUBLE|TLDOUBLE, 234 NCREG, RESC1, 235 " l.d A1,AL # convert (u)int to (l)double\n" 236 " nop\n" 237 " cvt.d.w A1,A1\n", }, 238 239{ SCONV, INAREG, 240 SCREG, TFLOAT, 241 SAREG, TWORD, 242 NCREG|NAREG, RESC1, 243 " cvt.w.s A2,AL # convert float to (u)int\n" 244 " mfc1 A1,A2\n" 245 " nop\n", }, 246 247{ SCONV, FOREFF, 248 SCREG, TFLOAT, 249 SOREG, TWORD, 250 NCREG, RDEST, 251 " cvt.w.s A1,AL # convert float to (u)int\n" 252 " s.s A1,AR\n" 253 " nop\n", }, 254 255{ SCONV, INAREG, 256 SCREG, TDOUBLE|TLDOUBLE, 257 SAREG, TWORD, 258 NCREG|NAREG, RESC1, 259 " cvt.w.d A2,AL # convert (l)double to (u)int\n" 260 " mfc1 A1,A2\n" 261 " nop\n", }, 262 263{ SCONV, INCREG, 264 SCREG, TDOUBLE|TLDOUBLE, 265 SCREG, TDOUBLE|TLDOUBLE, 266 0, RLEFT, 267 " # convert between double and ldouble\n", }, 268 269{ SCONV, INCREG, 270 SBREG, TLONGLONG|TULONGLONG, 271 SCREG, TFLOAT, 272 NSPECIAL|NCREG, RESC1, 273 "ZF", }, 274 275{ SCONV, INCREG, 276 SBREG, TLONGLONG|TULONGLONG, 277 SCREG, TDOUBLE|TLDOUBLE, 278 NSPECIAL|NCREG, RESC1, 279 "ZF", }, 280 281{ SCONV, INBREG, 282 SCREG, TDOUBLE|TLDOUBLE, 283 SBREG, TLONGLONG|TULONGLONG, 284 NSPECIAL|NBREG, RESC1, 285 "ZF", }, 286 287{ SCONV, INBREG, 288 SCREG, TFLOAT, 289 SBREG, TLONGLONG|TULONGLONG, 290 NSPECIAL|NBREG, RESC1, 291 "ZF", }, 292 293/* 294 * Multiplication and division 295 */ 296 297{ MUL, INAREG, 298 SAREG, TUWORD|TUSHORT|TUCHAR, 299 SAREG, TUWORD|TUSHORT|TUCHAR, 300 NAREG|NASR|NASL, RESC1, 301 " multu AL,AR # unsigned multiply\n" 302 " nop\n" 303 " nop\n" 304 " mflo A1\n" }, 305 306/* this previous will match on unsigned/unsigned multiplication first */ 307{ MUL, INAREG, 308 SAREG, TWORD|TUSHORT|TSHORT|TUCHAR|TCHAR, 309 SAREG, TWORD|TUSHORT|TSHORT|TUCHAR|TCHAR, 310 NAREG|NASR|NASL, RESC1, 311 " mult AL,AR # signed multiply\n" 312 " nop\n" 313 " nop\n" 314 " mflo A1\n", }, 315 316{ MUL, INBREG, 317 SBREG, TLONGLONG|TULONGLONG, 318 SBREG, TLONGLONG|TULONGLONG, 319 2*NBREG, RESC1, 320 " multu AL,AR\n" 321 " mfhi U1\n" 322 " mflo A1\n" 323 " mult AL,UR\n" 324 " mflo A2\n" 325 " nop\n" 326 " nop\n" 327 " addu A2,U1,A2\n" 328 " mult UL,AR\n" 329 " mflo U2\n" 330 " nop\n" 331 " nop\n" 332 " addu U1,A2,U2\n", }, 333 334{ MUL, INCREG, 335 SCREG, TFLOAT, 336 SCREG, TFLOAT, 337 NCREG, RESC1, 338 " mul.s A1,AL,AR # floating-point multiply\n", }, 339 340{ MUL, INCREG, 341 SCREG, TDOUBLE|TLDOUBLE, 342 SCREG, TDOUBLE|TLDOUBLE, 343 NCREG, RESC1, 344 " mul.d A1,AL,AR # double-floating-point multiply\n", }, 345 346{ DIV, INAREG, 347 SAREG, TUWORD|TUSHORT|TUCHAR, 348 SAREG, TUWORD|TUSHORT|TUCHAR, 349 NAREG|NASR|NASL, RESC1, 350 " divu AL,AR # unsigned division\n" 351 " mflo A1\n" 352 " nop\n" 353 " nop\n", }, 354 355/* the previous rule will match unsigned/unsigned first */ 356{ DIV, INAREG, 357 SAREG, TWORD|TUSHORT|TSHORT|TUCHAR|TCHAR, 358 SAREG, TWORD|TUSHORT|TSHORT|TUCHAR|TCHAR, 359 NAREG|NASR|NASL, RESC1, 360 " div AL,AR # signed division\n" 361 " mflo A1\n" 362 " nop\n" 363 " nop\n", }, 364 365{ DIV, INBREG, 366 SBREG, TLONGLONG|TULONGLONG, 367 SBREG, TLONGLONG|TULONGLONG, 368 NSPECIAL|NBREG, RESC1, 369 "ZE", }, 370 371{ DIV, INCREG, 372 SCREG, TFLOAT, 373 SCREG, TFLOAT, 374 NCREG, RESC1, 375 " div.s A1,AL,AR # floating-point division\n", }, 376 377{ DIV, INCREG, 378 SCREG, TDOUBLE|TLDOUBLE, 379 SCREG, TDOUBLE|TLDOUBLE, 380 NCREG, RESC1, 381 " div.d A1,AL,AR # double-floating-point division\n", }, 382 383{ MOD, INAREG, 384 SAREG, TUWORD|TUSHORT|TUCHAR, 385 SAREG, TUWORD|TUSHORT|TUCHAR, 386 NAREG, RESC1, 387 " divu AL,AR # signed modulo\n" 388 " mfhi A1\n" 389 " nop\n" 390 " nop\n", }, 391 392/* the previous rule will match unsigned%unsigned first */ 393{ MOD, INAREG, 394 SAREG, TWORD|TUSHORT|TSHORT|TUCHAR|TCHAR, 395 SAREG, TWORD|TUSHORT|TSHORT|TUCHAR|TCHAR, 396 NAREG, RESC1, 397 " div AL,AR # signed modulo\n" 398 " mfhi A1\n" 399 " nop\n" 400 " nop\n", }, 401 402{ MOD, INBREG, 403 SBREG, TLONGLONG|TULONGLONG, 404 SBREG, TLONGLONG|TULONGLONG, 405 NSPECIAL|NBREG, RESC1, 406 "ZE", }, 407 408/* 409 * Templates for unsigned values needs to come before OPSIMP 410 */ 411 412{ PLUS, INBREG, 413 SBREG, TULONGLONG|TLONGLONG, 414 SBREG, TULONGLONG|TLONGLONG, 415 2*NBREG, RESC1, 416 " addu A1,AL,AR # 64-bit addition\n" 417 " sltu A2,A1,AR\n" 418 " addu U1,UL,UR\n" 419 " addu U1,U1,A2\n", }, 420 421{ PLUS, INAREG, 422 SAREG, TSWORD|TSHORT|TCHAR, 423 SSCON, TANY, 424 NAREG|NASL, RESC1, 425 " addi A1,AL,AR\n", }, 426 427{ PLUS, INAREG, 428 SAREG, TUWORD|TPOINT|TUSHORT|TUCHAR, 429 SSCON, TANY, 430 NAREG|NASL, RESC1, 431 " addiu A1,AL,AR\n", }, 432 433{ PLUS, INAREG, 434 SAREG, TUWORD|TPOINT|TUSHORT|TUCHAR, 435 SAREG, TUWORD|TUSHORT|TUCHAR, 436 NAREG|NASL, RESC1, 437 " addu A1,AL,AR\n", }, 438 439{ PLUS, INAREG, 440 SAREG, TSWORD|TSHORT|TCHAR, 441 SAREG, TSWORD|TSHORT|TCHAR, 442 NAREG|NASL, RESC1, 443 " add A1,AL,AR\n", }, 444 445{ PLUS, INCREG, 446 SCREG, TFLOAT, 447 SCREG, TFLOAT, 448 NCREG|NCSL, RESC1, 449 " add.s A1,AL,AR\n", }, 450 451{ PLUS, INCREG, 452 SCREG, TDOUBLE|TLDOUBLE, 453 SCREG, TDOUBLE|TLDOUBLE, 454 NCREG|NCSL, RESC1, 455 " add.d A1,AL,AR\n", }, 456 457{ MINUS, INBREG, 458 SBREG, TLONGLONG|TULONGLONG, 459 SBREG, TLONGLONG|TULONGLONG, 460 2*NBREG, RESC1, 461 " sltu A2,AL,AR # 64-bit subtraction\n" 462 " subu A1,AL,AR\n" 463 " subu U1,UL,UR\n" 464 " subu U1,U1,A2\n", }, 465 466{ MINUS, INAREG, 467 SAREG, TUWORD|TPOINT|TUSHORT|TUCHAR, 468 SSCON, TANY, 469 NAREG|NASL, RESC1, 470 " subu A1,AL,AR\n", }, 471 472{ MINUS, INAREG, 473 SAREG, TSWORD|TSHORT|TCHAR, 474 SSCON, TANY, 475 NAREG|NASL, RESC1, 476 " sub A1,AL,AR\n", }, 477 478{ MINUS, INAREG, 479 SAREG, TSWORD|TSHORT|TCHAR, 480 SAREG, TSWORD|TSHORT|TCHAR, 481 NAREG|NASL, RESC1, 482 " sub A1,AL,AR\n", }, 483 484{ MINUS, INCREG, 485 SCREG, TFLOAT, 486 SCREG, TFLOAT, 487 NCREG|NCSL, RESC1, 488 " sub.s A1,AL,AR\n", }, 489 490{ MINUS, INCREG, 491 SCREG, TDOUBLE|TLDOUBLE, 492 SCREG, TDOUBLE|TLDOUBLE, 493 NCREG|NCSL, RESC1, 494 " sub.d A1,AL,AR\n", }, 495 496{ UMINUS, INAREG, 497 SAREG, TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR, 498 SANY, TANY, 499 NAREG|NASL, RESC1, 500 " neg A1,AL\n", }, 501 502{ UMINUS, INBREG, 503 SBREG, TLONGLONG|TULONGLONG, 504 SANY, TANY, 505 NBREG|NAREG|NBSL, RESC2, 506 " subu A1,$zero,AL\n" 507 " subu U1,$zero,UL\n" 508 " sltu A2,$zero,A1\n" 509 " subu U1,U1,A2\n", }, 510 511{ UMINUS, INCREG, 512 SCREG, TFLOAT, 513 SCREG, TFLOAT, 514 NCREG|NCSL, RESC1, 515 " neg.s A1,AL\n", }, 516 517{ UMINUS, INCREG, 518 SCREG, TDOUBLE|TLDOUBLE, 519 SCREG, TDOUBLE|TLDOUBLE, 520 NCREG|NCSL, RESC1, 521 " neg.d A1,AL\n", }, 522 523/* Simple 'op rd, rs, rt' or 'op rt, rs, imm' operations */ 524 525{ OPSIMP, INBREG, 526 SBREG, TLONGLONG|TULONGLONG, 527 SBREG, TLONGLONG|TULONGLONG, 528 NBREG|NBSR|NBSL, RESC1, 529 " O A1,AL,AR\n" 530 " O U1,UL,UR\n", }, 531 532{ OPSIMP, INAREG, 533 SAREG, TWORD|TPOINT|TSHORT|TUSHORT|TUCHAR|TCHAR, 534 SAREG, TWORD|TPOINT|TSHORT|TUSHORT|TUCHAR|TCHAR, 535 NAREG|NASR|NASL, RESC1, 536 " O A1,AL,AR\n", }, 537 538{ OPSIMP, INAREG, 539 SAREG, TWORD|TPOINT|TSHORT|TUSHORT|TUCHAR|TCHAR, 540 SPCON, TANY, 541 NAREG|NASL, RESC1, 542 " Oi A1,AL,AR\n", }, 543 544/* 545 * Shift instructions 546 */ 547 548{ RS, INAREG, 549 SAREG, TSWORD|TSHORT|TCHAR, 550 SCON, TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR, 551 NAREG|NASL, RESC1, 552 " sra A1,AL,AR # shift right by constant\n", }, 553 554{ RS, INAREG, 555 SAREG, TUWORD|TUSHORT|TUCHAR, 556 SCON, TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR, 557 NAREG|NASL, RESC1, 558 " srl A1,AL,AR # shift right by constant\n", }, 559 560{ LS, INAREG, 561 SAREG, TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR, 562 SCON, TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR, 563 NAREG|NASL, RESC1, 564 " sll A1,AL,AR # shift left by constant\n", }, 565 566{ RS, INAREG, 567 SAREG, TSWORD|TSHORT|TCHAR, 568 SAREG, TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR, 569 NAREG|NASL, RESC1, 570 " srav A1,AL,AR # shift right by register\n", }, 571 572{ RS, INAREG, 573 SAREG, TUWORD|TUSHORT|TUCHAR, 574 SAREG, TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR, 575 NAREG|NASL, RESC1, 576 " srlv A1,AL,AR # shift right by register\n", }, 577 578{ LS, INAREG, 579 SAREG, TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR, 580 SAREG, TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR, 581 NAREG|NASL, RESC1, 582 " sllv A1,AL,AR # shift left by register\n", }, 583 584{ RS, INBREG, 585 SBREG, TLONGLONG|TULONGLONG, 586 SCON, TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR, 587 NBREG, RESC1, 588 "ZO", }, 589 590{ LS, INBREG, 591 SBREG, TLONGLONG|TULONGLONG, 592 SCON, TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR, 593 NBREG, RESC1, 594 "ZO", }, 595 596{ RS, INBREG, 597 SBREG, TLONGLONG|TULONGLONG, 598 SAREG, TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR, 599 NSPECIAL|NBREG, RESC1, 600 "ZE", }, 601 602{ LS, INBREG, 603 SBREG, TLONGLONG|TULONGLONG, 604 SAREG, TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR, 605 NSPECIAL|NBREG, RESC1, 606 "ZE", }, 607 608/* 609 * Rule for unary one's complement 610 */ 611 612{ COMPL, INAREG, 613 SAREG, TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR, 614 SANY, TANY, 615 NAREG|NASL, RESC1, 616 " nor A1,$zero,AL # complement\n", }, 617 618{ COMPL, INBREG, 619 SBREG, TLONGLONG|TULONGLONG, 620 SANY, TANY, 621 NBREG|NBSL, RESC1, 622 " nor A1,$zero,AL # complement\n" 623 " nor U1,$zero,UL\n", }, 624 625/* 626 * The next rules takes care of assignments. "=". 627 */ 628 629{ ASSIGN, FOREFF|INAREG, 630 SOREG|SNAME, TWORD|TPOINT, 631 SAREG, TWORD|TPOINT, 632 0, RDEST, 633 " sw AR,AL # store (u)int/(u)long\n" 634 " nop\n", }, 635 636{ ASSIGN, FOREFF|INAREG, 637 SOREG|SNAME, TSHORT|TUSHORT, 638 SAREG, TSHORT|TUSHORT, 639 0, RDEST, 640 " sh AR,AL # store (u)short\n" 641 " nop\n", }, 642 643{ ASSIGN, FOREFF|INAREG, 644 SOREG|SNAME, TCHAR|TUCHAR, 645 SAREG, TCHAR|TUCHAR, 646 0, RDEST, 647 " sb AR,AL # store (u)char\n" 648 " nop\n", }, 649 650{ ASSIGN, FOREFF|INBREG, 651 SOREG|SNAME, TLONGLONG|TULONGLONG, 652 SBREG, TLONGLONG|TULONGLONG, 653 0, RDEST, 654 " sw UR,UL # store (u)longlong\n" 655 " nop\n" 656 " sw AR,AL\n" 657 " nop\n", }, 658 659{ ASSIGN, FOREFF|INBREG, 660 SBREG, TLONGLONG|TULONGLONG, 661 SBREG, TLONGLONG|TULONGLONG, 662 0, RDEST, 663 " move UL,UR # register move\n" 664 " move AL,AR\n", }, 665 666{ ASSIGN, FOREFF|INAREG, 667 SAREG, TANY, 668 SAREG, TANY, 669 0, RDEST, 670 " move AL,AR # register move\n", }, 671 672{ ASSIGN, FOREFF|INCREG, 673 SCREG, TFLOAT, 674 SCREG, TFLOAT, 675 0, RDEST, 676 " mov.s AL,AR # register move\n", }, 677 678{ ASSIGN, FOREFF|INCREG, 679 SCREG, TDOUBLE|TLDOUBLE, 680 SCREG, TDOUBLE|TLDOUBLE, 681 0, RDEST, 682 " mov.d AL,AR # register move\n", }, 683 684{ ASSIGN, FOREFF|INCREG, 685 SNAME|SOREG, TFLOAT, 686 SCREG, TFLOAT, 687 0, RDEST, 688 " s.s AR,AL # store floating-point reg to oreg/sname\n" 689 " nop\n", }, 690 691{ ASSIGN, FOREFF|INCREG, 692 SNAME|SOREG, TDOUBLE|TLDOUBLE, 693 SCREG, TDOUBLE|TLDOUBLE, 694 0, RDEST, 695 " s.d AR,AL # store double floating-point reg to oreg/sname\n" 696 " nop\n", }, 697 698{ ASSIGN, FOREFF|INAREG, 699 SFLD, TANY, 700 SOREG|SNAME, TANY, 701 3*NAREG, RDEST, 702 " lw A1,AR # bit-field assignment\n" 703 " li A3,M\n" 704 " lw A2,AL\n" 705 " sll A1,A1,H\n" 706 " and A1,A1,A3\n" 707 " nor A3,$zero,A3\n" 708 " and A2,A2,A3\n" 709 " or A2,A2,A1\n" 710 " sw A2,AL\n" 711 "F lw AD,AR\n" 712 "F nop\n" 713 "F sll AD,AD,32-S\n" 714 "F sra AD,AD,32-S\n", }, 715 716/* XXX we can optimise this away */ 717{ ASSIGN, FOREFF|INAREG, 718 SFLD, TANY, 719 SCON, TANY, 720 3*NAREG, RDEST, 721 " li A1,AR # bit-field assignment\n" 722 " lw A2,AL\n" 723 " li A3,M\n" 724 " sll A1,A1,H\n" 725 " and A1,A1,A3\n" 726 " nor A3,$zero,A3\n" 727 " and A2,A2,A3\n" 728 " or A2,A2,A1\n" 729 " sw A2,AL\n" 730 "F li AD,AR\n" 731 "F sll AD,AD,32-S\n" 732 "F sra AD,AD,32-S\n", }, 733 734{ ASSIGN, FOREFF|INAREG, 735 SFLD, TANY, 736 SAREG, TANY, 737 3*NAREG, RDEST, 738 " move A1,AR # bit-field assignment\n" 739 " lw A2,AL\n" 740 " li A3,M\n" 741 " sll A1,A1,H\n" 742 " and A1,A1,A3\n" 743 " nor A3,$zero,A3\n" 744 " and A2,A2,A3\n" 745 " or A2,A2,A1\n" 746 " sw A2,AL\n" 747 "F move AR,AD\n" 748 "F sll AD,AD,32-S\n" 749 "F sra AD,AD,32-S\n", }, 750 751{ STASG, INAREG|FOREFF, 752 SOREG|SNAME, TANY, 753 SAREG, TPTRTO|TANY, 754 NSPECIAL, RDEST, 755 "ZQ", }, 756 757/* 758 * Compare instructions 759 */ 760 761{ EQ, FORCC, 762 SAREG, TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR, 763 SAREG, TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR, 764 0, RESCC, 765 " beq AL,AR,LC\n" 766 " nop\n", }, 767 768{ NE, FORCC, 769 SAREG, TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR, 770 SAREG, TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR, 771 0, RESCC, 772 " bne AL,AR,LC\n" 773 " nop\n", }, 774 775{ OPLOG, FORCC, 776 SAREG, TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR, 777 SZERO, TANY, 778 0, RESCC, 779 " O AL,LC\n" 780 " nop\n", }, 781 782{ OPLOG, FORCC, 783 SAREG, TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR, 784 SAREG, TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR, 785 NAREG|NASL, RESCC, 786 " sub A1,AL,AR\n" 787 " O A1,LC\n" 788 " nop\n", }, 789 790{ OPLOG, FORCC, 791 SAREG, TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR, 792 SSCON, TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR, 793 NAREG|NASL, RESCC, 794 " sub A1,AL,AR\n" 795 " O A1,LC\n" 796 " nop\n", }, 797 798{ OPLOG, FORCC, 799 SBREG, TLONGLONG|TULONGLONG, 800 SBREG, TLONGLONG|TULONGLONG, 801 NAREG, RESCC, 802 "ZD", }, 803 804{ OPLOG, FORCC, 805 SCREG, TFLOAT|TDOUBLE|TLDOUBLE, 806 SCREG, TFLOAT|TDOUBLE|TLDOUBLE, 807 0, RESCC, 808 "ZG", }, 809 810/* 811 * Convert LTYPE to reg. 812 */ 813 814{ OPLTYPE, INAREG, 815 SANY, TANY, 816 SOREG|SNAME, TCHAR, 817 NAREG, RESC1, 818 " lb A1,AL # load char to reg\n" 819 " nop\n", }, 820 821{ OPLTYPE, INAREG, 822 SANY, TANY, 823 SOREG|SNAME, TUCHAR, 824 NAREG, RESC1, 825 " lbu A1,AL # load uchar to reg\n" 826 " nop\n", }, 827 828{ OPLTYPE, INAREG, 829 SANY, TANY, 830 SOREG|SNAME, TSHORT, 831 NAREG, RESC1, 832 " lh A1,AL # load short to reg\n" 833 " nop\n", }, 834 835{ OPLTYPE, INAREG, 836 SANY, TANY, 837 SOREG|SNAME, TUSHORT, 838 NAREG, RESC1, 839 " lhu A1,AL # load ushort to reg\n" 840 " nop\n", }, 841 842{ OPLTYPE, INAREG, 843 SANY, TANY, 844 SOREG|SNAME, TWORD|TPOINT, 845 NAREG, RESC1, 846 " lw A1,AL # load (u)int/(u)long to reg\n" 847 " nop\n", }, 848 849{ OPLTYPE, INBREG, 850 SANY, TANY, 851 SOREG|SNAME, TLONGLONG|TULONGLONG, 852 NBREG, RESC1, 853 " lw U1,UL # load (u)longlong to reg\n" 854 " nop\n" 855 " lw A1,AL\n" 856 " nop\n", }, 857 858{ OPLTYPE, INAREG, 859 SANY, TANY, 860 SCON, TPOINT, 861 NAREG, RESC1, 862 " la A1,AL # load constant address to reg\n", }, 863 864{ OPLTYPE, INAREG, 865 SANY, TANY, 866 SZERO, TANY, 867 NAREG, RESC1, 868 " move A1,$zero # load 0 to reg\n", }, 869 870{ OPLTYPE, INAREG, 871 SANY, TANY, 872 SCON, TANY, 873 NAREG, RESC1, 874 " li A1,AL # load constant to reg\n", }, 875 876{ OPLTYPE, INBREG, 877 SANY, TANY, 878 SZERO, TANY, 879 NBREG, RESC1, 880 " move A1,$zero # load 0 to reg\n" 881 " move U1,$zero\n", }, 882 883{ OPLTYPE, INBREG, 884 SANY, TANY, 885 SCON, TANY, 886 NBREG, RESC1, 887 " li A1,AL # load constant to reg\n" 888 " li U1,UL\n", }, 889 890{ OPLTYPE, INAREG, 891 SANY, TANY, 892 SANY, TANY, 893 NAREG, RESC1, 894 " move A1,AL\n", }, 895 896{ OPLTYPE, INCREG, 897 SANY, TANY, 898 SZERO, TFLOAT, 899 NCREG, RESC1, 900 " mtc1 $zero,A1 # load 0 to float reg\n" 901 " nop\n", }, 902 903{ OPLTYPE, INCREG, 904 SANY, TANY, 905 SZERO, TDOUBLE|TLDOUBLE, 906 NCREG, RESC1, 907 " mtc1 $zero,A1 # load 0 to (l)double reg\n" 908 " mtc1 $zero,U1\n" 909 " nop\n", }, 910 911{ OPLTYPE, INCREG, 912 SANY, TANY, 913 SOREG|SNAME, TFLOAT, 914 NCREG, RESC1, 915 " l.s A1,AL # load into floating-point reg\n" 916 " nop\n", }, 917 918{ OPLTYPE, INCREG, 919 SANY, TANY, 920 OREG|SNAME, TDOUBLE|TLDOUBLE, 921 NCREG, RESC1, 922 " l.d A1,AL # load into double floating-point reg\n" 923 " nop\n", }, 924 925/* 926 * Jumps. 927 */ 928{ GOTO, FOREFF, 929 SCON, TANY, 930 SANY, TANY, 931 0, RNOP, 932 " j LL # goto label\n" 933 " nop\n" 934 " nop\n", }, 935 936/* 937 * Subroutine calls. 938 */ 939 940{ CALL, FOREFF, 941 SCON, TANY, 942 SANY, TANY, 943 0, 0, 944 " subu $sp,$sp,16 # call (args, no result) to scon/sname\n" 945 " jal CL\n" 946 " nop\n" 947 "ZC", }, 948 949{ UCALL, FOREFF, 950 SCON, TANY, 951 SANY, TANY, 952 0, 0, 953 " jal CL # call (no args, no result) to scon/sname\n" 954 " nop\n", }, 955 956{ CALL, INAREG, 957 SCON, TANY, 958 SAREG, TANY, 959 NAREG, RESC1, /* should be 0 */ 960 " subu $sp,$sp,16 # call (args, result in v0) to scon/sname\n" 961 " jal CL\n" 962 " nop\n" 963 "ZC", }, 964 965{ UCALL, INAREG, 966 SCON, TANY, 967 SAREG, TANY, 968 NAREG, RESC1, /* should be 0 */ 969 " jal CL # call (no args, result in v0) to scon/sname\n" 970 " nop\n", 971 }, 972 973{ CALL, INBREG, 974 SCON, TANY, 975 SBREG, TANY, 976 NBREG, RESC1, /* should be 0 */ 977 " subu $sp,$sp,16 # call (args, result in v0:v1) to scon/sname\n" 978 " jal CL\n" 979 " nop\n" 980 "ZC", }, 981 982{ UCALL, INBREG, 983 SCON, TANY, 984 SBREG, TANY, 985 NBREG, RESC1, /* should be 0 */ 986 " jal CL # call (no args, result in v0:v1) to scon/sname\n" 987 " nop\n", 988 }, 989 990{ CALL, INCREG, 991 SCON, TANY, 992 SCREG, TANY, 993 NCREG, RESC1, /* should be 0 */ 994 " subu $sp,$sp,16 # call (args, result in f0:f1) to scon/sname\n" 995 " jal CL\n" 996 " nop\n" 997 "ZC", }, 998 999{ UCALL, INCREG, 1000 SCON, TANY, 1001 SCREG, TANY, 1002 NCREG, RESC1, /* should be 0 */ 1003 " jal CL # call (no args, result in v0:v1) to scon/sname\n" 1004 " nop\n", 1005 }, 1006 1007{ CALL, FOREFF, 1008 SAREG, TANY, 1009 SANY, TANY, 1010 0, 0, 1011 " subu $sp,$sp,16 # call (args, no result) to reg\n" 1012 " move $25,AL\n" 1013 " jal $25\n" 1014 " nop\n" 1015 "ZC", }, 1016 1017{ UCALL, FOREFF, 1018 SAREG, TANY, 1019 SANY, TANY, 1020 0, 0, 1021 " move $25,AL\n" 1022 " jal $25 # call (no args, no result) to reg\n" 1023 " nop\n", }, 1024 1025{ CALL, INAREG, 1026 SAREG, TANY, 1027 SAREG, TANY, 1028 NAREG, RESC1, /* should be 0 */ 1029 " subu $sp,$sp,16 # call (args, result) to reg\n" 1030 " move $25,AL\n" 1031 " jal $25\n" 1032 " nop\n" 1033 "ZC", }, 1034 1035{ UCALL, INAREG, 1036 SAREG, TANY, 1037 SAREG, TANY, 1038 NAREG, RESC1, /* should be 0 */ 1039 " move $25,AL\n" 1040 " jal $25 # call (no args, result) to reg\n" 1041 " nop\n", }, 1042 1043{ CALL, INBREG, 1044 SAREG, TANY, 1045 SBREG, TANY, 1046 NBREG, RESC1, /* should be 0 */ 1047 " subu $sp,$sp,16 # call (args, result) to reg\n" 1048 " move $25,AL\n" 1049 " jal $25\n" 1050 " nop\n" 1051 "ZC", }, 1052 1053{ UCALL, INBREG, 1054 SAREG, TANY, 1055 SBREG, TANY, 1056 NBREG, RESC1, /* should be 0 */ 1057 " move $25,AL\n" 1058 " jal $25 # call (no args, result) to reg\n" 1059 " nop\n", }, 1060 1061{ CALL, INCREG, 1062 SAREG, TANY, 1063 SCREG, TANY, 1064 NCREG, RESC1, /* should be 0 */ 1065 " subu $sp,$sp,16 # call (args, result) to reg\n" 1066 " move $25,AL\n" 1067 " jal $25\n" 1068 " nop\n" 1069 "ZC", }, 1070 1071{ UCALL, INCREG, 1072 SCREG, TANY, 1073 SCREG, TANY, 1074 NCREG, RESC1, /* should be 0 */ 1075 " move $25,AL\n" 1076 " jal $25 # call (no args, result) to reg\n" 1077 " nop\n", }, 1078 1079 1080/* struct return */ 1081{ USTCALL, FOREFF, 1082 SCON|SNAME, TANY, 1083 SANY, TANY, 1084 0, 0, 1085 " jal CL\n" 1086 " nop\n", }, 1087 1088{ USTCALL, FOREFF, 1089 SAREG, TANY, 1090 SANY, TANY, 1091 0, 0, 1092 " move $25,AL\n" 1093 " jal $25\n" 1094 " nop\n", }, 1095 1096{ USTCALL, INAREG, 1097 SCON|SNAME, TANY, 1098 SANY, TANY, 1099 NAREG|NASL, RESC1, 1100 " jal CL\n" 1101 " nop\n", }, 1102 1103{ USTCALL, INAREG, 1104 SAREG, TANY, 1105 SANY, TANY, 1106 NAREG|NASL, RESC1, 1107 " move $25,AL\n" 1108 " jal $25\n" 1109 " nop\n", }, 1110 1111{ STCALL, FOREFF, 1112 SCON|SNAME, TANY, 1113 SANY, TANY, 1114 0, 0, 1115 " subu $sp,$sp,16\n" 1116 " jal CL\n" 1117 " nop\n" 1118 "ZC", }, 1119 1120{ STCALL, FOREFF, 1121 SAREG, TANY, 1122 SANY, TANY, 1123 0, 0, 1124 " subu $sp,$sp,16\n" 1125 " move $25,AL\n" 1126 " jal $25\n" 1127 " nop\n" 1128 "ZC", }, 1129 1130{ STCALL, INAREG, 1131 SCON|SNAME, TANY, 1132 SANY, TANY, 1133 NAREG|NASL, RESC1, 1134 " subu $sp,$sp,16\n" 1135 " jal CL\n" 1136 " nop\n" 1137 "ZC", }, 1138 1139{ STCALL, INAREG, 1140 SAREG, TANY, 1141 SANY, TANY, 1142 0, 0, 1143 " subu $sp,$sp,16\n" 1144 " move $25,AL\n" 1145 " jal $25\n" 1146 " nop\n" 1147 "ZC", }, 1148 1149 1150/* 1151 * Function arguments 1152 */ 1153 1154#if 0 1155 1156/* intentionally write out the register for (u)short/(u)char */ 1157{ FUNARG, FOREFF, 1158 SAREG, TWORD|TPOINT|TUSHORT|TSHORT|TUCHAR|TCHAR, 1159 SANY, TWORD|TPOINT|TUSHORT|TSHORT|TUCHAR|TCHAR, 1160 0, 0, 1161 " subu $sp,$sp,4 # save function arg to stack\n" 1162 " sw AL,($sp)\n" 1163 " #nop\n", }, 1164 1165{ FUNARG, FOREFF, 1166 SBREG, TLONGLONG|TULONGLONG, 1167 SANY, TLONGLONG|TULONGLONG, 1168 0, 0, 1169 " addi $sp,$sp,-8 # save function arg to stack (endian problem here?\n" 1170 " sw UL,4($sp)\n" 1171 " sw AL,($sp)\n" 1172 " #nop\n", }, 1173 1174{ FUNARG, FOREFF, 1175 SCREG, TFLOAT, 1176 SANY, TFLOAT, 1177 0, 0, 1178 " addi $sp,$sp,-4 # save function arg to stack\n" 1179 " s.s AL,($sp)\n" 1180 " #nop\n", }, 1181 1182{ FUNARG, FOREFF, 1183 SCREG, TDOUBLE|TLDOUBLE, 1184 SANY, TDOUBLE|TLDOUBLE, 1185 0, 0, 1186 " addi $sp,$sp,-8 # save function arg to stack\n" 1187 " s.d AL,($sp)\n" 1188 " #nop\n", }, 1189 1190#endif 1191 1192{ STARG, FOREFF, 1193 SAREG, TANY, 1194 SANY, TSTRUCT, 1195 NSPECIAL, 0, 1196 "ZH", }, 1197 1198/* 1199 * Indirection operators. 1200 */ 1201{ UMUL, INAREG, 1202 SANY, TPOINT|TWORD, 1203 SOREG, TPOINT|TWORD, 1204 NAREG, RESC1, 1205 " lw A1,AL # word load\n" 1206 " nop\n", }, 1207 1208{ UMUL, INAREG, 1209 SANY, TSHORT|TUSHORT, 1210 SOREG, TSHORT|TUSHORT, 1211 NAREG, RESC1, 1212 " lh A1,AL # (u)short load\n" 1213 " nop\n", }, 1214 1215{ UMUL, INAREG, 1216 SANY, TCHAR|TUCHAR, 1217 SOREG, TCHAR|TUCHAR, 1218 NAREG, RESC1, 1219 " lb A1,AL # (u)char load\n" 1220 " nop\n", }, 1221 1222{ UMUL, INBREG, 1223 SANY, TLONGLONG|TULONGLONG, 1224 SOREG, TLONGLONG|TULONGLONG, 1225 NBREG, RESC1, 1226 " lw A1,AL # (u)longlong load - endian problem here?\n" 1227 " nop\n" 1228 " lw U1,UL\n" 1229 " nop\n", }, 1230 1231{ UMUL, INCREG, 1232 SANY, TFLOAT, 1233 SOREG, TFLOAT, 1234 NCREG, RESC1, 1235 " l.s A1,AL # float load\n" 1236 " nop\n", }, 1237 1238{ UMUL, INCREG, 1239 SANY, TDOUBLE|TLDOUBLE, 1240 SOREG, TDOUBLE|TLDOUBLE, 1241 NCREG, RESC1, 1242 " l.d A1,AL # float load\n" 1243 " nop\n", }, 1244 1245#if 0 1246{ UMUL, INCREG, 1247 SANY, TDOUBLE|TLDOUBLE, 1248 SAREG, TPOINT, 1249 NCREG, RESC1, 1250 " l.d A1,(AL)\n" 1251 " nop\n", }, 1252 1253{ UMUL, INAREG, 1254 SANY, TPOINT|TWORD, 1255 SNAME, TPOINT|TWORD, 1256 NAREG, RESC1, 1257 " la A1,AL # sname word load\n" 1258 " lw A1,(A1)\n" 1259 " nop\n", }, 1260 1261{ UMUL, INAREG, 1262 SANY, TSHORT|TUSHORT, 1263 SNAME, TSHORT|TUSHORT, 1264 NAREG, RESC1, 1265 " la A1,AL # sname (u)short load\n" 1266 " lh A1,(A1)\n" 1267 " nop\n", }, 1268 1269{ UMUL, INAREG, 1270 SANY, TCHAR|TUCHAR, 1271 SNAME, TCHAR|TUCHAR, 1272 NAREG, RESC1, 1273 " la A1,AL # sname (u)char load\n" 1274 " lb A1,(A1)\n" 1275 " nop\n", }, 1276 1277{ UMUL, INBREG, 1278 SANY, TLONGLONG|TULONGLONG, 1279 SNAME, TLONGLONG|TULONGLONG, 1280 NBREG|NAREG, RESC1, 1281 " la A2,AL # sname (u)long long load - endian problems here?\n" 1282 " lw A1,(A1)\n" 1283 " nop\n" 1284 " lw U1,4(A1)\n" 1285 " nop\n", }, 1286#endif 1287 1288{ UMUL, INAREG, 1289 SANY, TPOINT|TWORD, 1290 SAREG, TPOINT|TWORD, 1291 NAREG, RESC1, 1292 " lw A1,(AL) # word load\n" 1293 " nop\n", }, 1294 1295#if 0 1296{ UMUL, INAREG, 1297 SANY, TSHORT|TUSHORT, 1298 SAREG, TPTRTO|TSHORT|TUSHORT, 1299 NAREG, RESC1, 1300 " lh A1,(AL) # (u)short load\n" 1301 " nop\n", }, 1302 1303{ UMUL, INAREG, 1304 SANY, TCHAR|TUCHAR, 1305 SAREG, TPTRTO|TCHAR|TUCHAR, 1306 NAREG|NASL, RESC1, 1307 " lb A1,(AL) # (u)char load\n" 1308 " nop\n", }, 1309 1310{ UMUL, INBREG, 1311 SANY, TLONGLONG|TULONGLONG, 1312 SAREG, TPTRTO|TLONGLONG|TULONGLONG, 1313 NBREG, RESC1, 1314 " lw A1,(AL) # (u)long long load - endianness problems?\n" 1315 " nop\n" 1316 " lw U1,4(AL)" 1317 " nop\n", }, 1318#endif 1319 1320#define DF(x) FORREW,SANY,TANY,SANY,TANY,REWRITE,x,"" 1321 1322{ FLD, DF(FLD), }, 1323 1324{ FREE, FREE, FREE, FREE, FREE, FREE, FREE, FREE, "help; I'm in trouble\n" }, 1325}; 1326 1327int tablesize = sizeof(table)/sizeof(table[0]); 1328