1 /* Id: table.c,v 1.19 2008/05/16 02:20:36 gmcgarry Exp */ 2 /* $NetBSD: table.c,v 1.1.1.2 2010/06/03 18:57:11 plunky Exp $ */ 3 /*- 4 * Copyright (c) 2007 Gregory McGarry <g.mcgarry@ieee.org> 5 * 6 * Permission to use, copy, modify, and distribute this software for any 7 * purpose with or without fee is hereby granted, provided that the above 8 * copyright notice and this permission notice appear in all copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17 */ 18 19 /* 20 * A template has five logical sections: 21 * 22 * 1) subtree (operator); goal to achieve (cookie) 23 * 2) left node descendent of operator (node class; type) 24 * 3) right node descendent of operator (node class; type) 25 * 4) resource requirements (number of scratch registers); 26 * subtree rewriting rule 27 * 5) emitted instructions 28 */ 29 30 #include "pass2.h" 31 32 #define TUWORD TUNSIGNED|TULONG 33 #define TSWORD TINT|TLONG 34 #define TWORD TUWORD|TSWORD 35 36 struct optab table[] = { 37 /* First entry must be an empty entry */ 38 { -1, FOREFF, SANY, TANY, SANY, TANY, 0, 0, "", }, 39 40 /* PCONVs are not necessary */ 41 { PCONV, INAREG, 42 SAREG, TWORD|TPOINT, 43 SAREG, TWORD|TPOINT, 44 0, RLEFT, 45 COM "pointer conversion\n", }, 46 47 48 /* 49 * Conversions of integral types 50 * 51 * For each deunsigned type, they look something like this: 52 * 53 * signed -> bigger signed - nothing to do 54 * signed -> bigger unsigned - clear the top bits (of source type) 55 * 56 * signed -> smaller signed - sign-extend the bits (to dest type) 57 * signed -> smaller unsigned - clear the top bits (of dest type) 58 * unsigned -> smaller signed - sign-extend top bits (to dest type) 59 * unsigned -> smaller unsigned - clear the top bits (of dest type) 60 * 61 * unsigned -> bigger - nothing to do 62 */ 63 64 { SCONV, INAREG, 65 SAREG, TCHAR, 66 SAREG, TSWORD|TSHORT, 67 0, RLEFT, 68 COM "convert char to short/int\n", }, 69 70 { SCONV, INAREG, 71 SAREG, TCHAR, 72 SAREG, TUWORD|TUSHORT|TUCHAR, 73 NAREG|NASL, RESC1, 74 " and A1,AL,#255" COM "convert char to uchar/ushort/uint\n", }, 75 76 { SCONV, INAREG | FEATURE_EXTEND, 77 SAREG, TUCHAR, 78 SAREG, TCHAR, 79 NAREG|NASL, RESC1, 80 " sxtb A1,AL" COM "convert uchar to char\n", }, 81 82 { SCONV, INAREG, 83 SAREG, TUCHAR, 84 SAREG, TCHAR, 85 NAREG|NASL, RESC1, 86 " mov A1,AL,asl #24" COM "convert uchar to char\n" 87 " mov A1,A1,asr #24\n", }, 88 89 { SCONV, INAREG, 90 SAREG, TUCHAR, 91 SAREG, TWORD|TSHORT|TUSHORT, 92 0, RLEFT, 93 COM "convert uchar to (u)short/(u)int\n", }, 94 95 { SCONV, INAREG, 96 SAREG, TSHORT, 97 SAREG, TSWORD, 98 0, RLEFT, 99 COM "convert short to int\n", }, 100 101 { SCONV, INAREG | FEATURE_EXTEND, 102 SAREG, TSHORT, 103 SAREG, TUWORD|TUSHORT, 104 NAREG|NASL, RESC1, 105 " uxth A1,AL" COM "convert short to uint\n", }, 106 107 { SCONV, INAREG, 108 SAREG, TSHORT, 109 SAREG, TUWORD|TUSHORT, 110 NAREG|NASL, RESC1, 111 " mov A1,AL,asl #16" COM "convert short to uint\n" 112 " mov A1,AL,lsr #16\n", }, 113 114 { SCONV, INAREG | FEATURE_EXTEND, 115 SAREG, TUSHORT, 116 SAREG, TSHORT, 117 NAREG|NASL, RESC1, 118 " sxth A1,AL" COM "convert ushort to short\n", }, 119 120 { SCONV, INAREG, 121 SAREG, TUSHORT, 122 SAREG, TSHORT, 123 NAREG|NASL, RESC1, 124 " mov A1,AL,asl #16" COM "convert ushort to short\n" 125 " mov A1,A1,asr #16\n", }, 126 127 { SCONV, INAREG | FEATURE_EXTEND, 128 SAREG, TSHORT|TUSHORT, 129 SAREG, TCHAR, 130 NAREG|NASL, RESC1, 131 " sxtb A1,AL" COM "convert (u)short to char\n", }, 132 133 { SCONV, INAREG, 134 SAREG, TSHORT|TUSHORT, 135 SAREG, TCHAR, 136 NAREG|NASL, RESC1, 137 " mov A1,AL,asl #24" COM "convert (u)short to char\n" 138 " mov A1,A1,asr #24\n", }, 139 140 { SCONV, INAREG, 141 SAREG, TSHORT|TUSHORT, 142 SAREG, TCHAR, 143 NAREG|NASL, RESC1, 144 " sxtb A1,AL" COM "convert (u)short to char\n", }, 145 146 { SCONV, INAREG, 147 SAREG, TSHORT|TUSHORT, 148 SAREG, TUCHAR, 149 NAREG|NASL, RESC1, 150 " and A1,AL,#255" COM "convert (u)short to uchar\n", }, 151 152 { SCONV, INAREG, 153 SAREG, TUSHORT, 154 SAREG, TWORD, 155 0, RLEFT, 156 COM "convert ushort to (u)int\n", }, 157 158 { SCONV, INAREG | FEATURE_EXTEND, 159 SAREG, TWORD, 160 SAREG, TCHAR, 161 NAREG|NASL, RESC1, 162 " sxtb A1,AL" COM "convert (u)int to char\n", }, 163 164 { SCONV, INAREG, 165 SAREG, TWORD, 166 SAREG, TCHAR, 167 NAREG|NASL, RESC1, 168 " mov A1,AL,asl #24" COM "convert (u)int to char\n" 169 " mov A1,A1,asr #24\n", }, 170 171 { SCONV, INAREG | FEATURE_EXTEND, 172 SAREG, TWORD, 173 SAREG, TSHORT, 174 NAREG|NASL, RESC1, 175 " sxth A1,AL" COM "convert (u)int to short\n", }, 176 177 { SCONV, INAREG, 178 SAREG, TWORD, 179 SAREG, TSHORT, 180 NAREG|NASL, RESC1, 181 " mov A1,AL,asl #16" COM "convert (u)int to short\n" 182 " mov A1,A1,asr #16\n", }, 183 184 { SCONV, INAREG, 185 SAREG, TWORD, 186 SAREG, TUCHAR, 187 NAREG|NASL, RESC1, 188 " and A1,AL,#255" COM "convert uchar to char\n", }, 189 190 { SCONV, INAREG | FEATURE_EXTEND, 191 SAREG, TWORD, 192 SAREG, TUSHORT, 193 NAREG|NASL, RESC1, 194 " uxth A1,AL" COM "convert int to ushort\n", }, 195 196 { SCONV, INAREG, 197 SAREG, TWORD, 198 SAREG, TUSHORT, 199 NAREG|NASL, RESC1, 200 " mov A1,AL,asl #16" COM "convert int to ushort\n" 201 " mov A1,AL,lsr #16\n", }, 202 203 { SCONV, INAREG, 204 SAREG, TPOINT|TWORD, 205 SAREG, TWORD|TPOINT, 206 0, RLEFT, 207 COM "convert between pointers and words\n", }, 208 209 { SCONV, INBREG, 210 SBREG, TLONGLONG|TULONGLONG, 211 SBREG, TLONGLONG|TULONGLONG, 212 0, RLEFT, 213 COM "convert (u)longlong to (u)longlong\n", }, 214 215 /* convert (u)char/(u)short/(u)int to longlong */ 216 { SCONV, INBREG, 217 SAREG, TCHAR|TUCHAR|TSHORT|TUSHORT|TWORD, 218 SBREG, TLONGLONG|TULONGLONG, 219 NBREG|NBSL, RESC1, 220 " mov A1,AL" COM "convert (u)char/(u)short/(u)int to (u)longlong\n" 221 " mov U1,AL,asr #31\n", }, 222 223 { SCONV, INAREG | FEATURE_EXTEND, 224 SBREG, TLONGLONG|TULONGLONG, 225 SAREG, TCHAR, 226 NAREG, RESC1, 227 " sxtb A1,AL" COM "convert (u)longlong to char\n", }, 228 229 { SCONV, INAREG, 230 SBREG, TLONGLONG|TULONGLONG, 231 SAREG, TCHAR, 232 NAREG, RESC1, 233 " mov A1,AL,asl #24" COM "convert (u)longlong to char\n" 234 " mov A1,A1,asr #24\n", }, 235 236 { SCONV, INAREG | FEATURE_EXTEND, 237 SBREG, TLONGLONG|TULONGLONG, 238 SAREG, TSHORT, 239 NAREG, RESC1, 240 " sxth A1,AL" COM "convert (u)longlong to short\n", }, 241 242 { SCONV, INAREG, 243 SBREG, TLONGLONG|TULONGLONG, 244 SAREG, TSHORT, 245 NAREG, RESC1, 246 " mov A1,AL,asl #16" COM "convert (u)longlong to short\n" 247 " mov A1,A1,asr #16\n", }, 248 249 { SCONV, INAREG, 250 SBREG, TLONGLONG|TULONGLONG, 251 SAREG, TWORD, 252 NAREG, RESC1, 253 " mov A1,AL" COM "convert (u)longlong to (u)int\n", }, 254 255 { SCONV, INAREG, 256 SBREG, TLONGLONG|TULONGLONG, 257 SAREG, TUCHAR, 258 NAREG, RESC1, 259 " and A1,AL,#255" COM "convert (u)longlong to uchar\n", }, 260 261 { SCONV, INAREG | FEATURE_EXTEND, 262 SBREG, TLONGLONG|TULONGLONG, 263 SAREG, TUSHORT, 264 NAREG, RESC1, 265 " uxth A1,AL" COM "convert (u)longlong to ushort\n", }, 266 267 { SCONV, INAREG, 268 SBREG, TLONGLONG|TULONGLONG, 269 SAREG, TUSHORT, 270 NAREG, RESC1, 271 " mov A1,AL,asl #16" COM "convert (u)longlong to ushort\n" 272 " mov A1,A1,lsr #16\n", }, 273 274 /* conversions on load from memory */ 275 276 /* char */ 277 { SCONV, INAREG, 278 SOREG, TCHAR, 279 SAREG, TWORD, 280 NASL|NAREG, RESC1, 281 " ldrsb A1,AL" COM "convert char to int/long\n", }, 282 283 /* uchar */ 284 { SCONV, INAREG, 285 SOREG, TUCHAR, 286 SAREG, TWORD, 287 NASL|NAREG, RESC1, 288 " ldrb A1,AL" COM "convert uchar to int/long\n", }, 289 290 /* short */ 291 { SCONV, INAREG | FEATURE_HALFWORDS, 292 SOREG, TSHORT, 293 SAREG, TWORD, 294 NASL|NAREG, RESC1, 295 " ldrsh A1,AL" COM "convert short to int/long\n", }, 296 297 /* ushort */ 298 { SCONV, INAREG | FEATURE_HALFWORDS, 299 SOREG, TSHORT, 300 SAREG, TWORD, 301 NASL|NAREG, RESC1, 302 " ldrh A1,AL" COM "convert ushort to int/long\n", }, 303 304 /* short */ 305 { SCONV, INAREG, 306 SOREG, TSHORT|TUSHORT, 307 SAREG, TWORD, 308 2*NAREG|NASL, RESC1, 309 "ZH", }, 310 311 { SCONV, INAREG | FEATURE_FPA, 312 SCREG, TFLOAT, 313 SAREG, TWORD, 314 NAREG, RESC1, 315 " fix AL,AR" COM "convert float to int\n", }, 316 317 { SCONV, INAREG | FEATURE_VFP, 318 SCREG, TFLOAT, 319 SAREG, TSWORD, 320 NAREG, RESC1, 321 " ftosis AL,AR" COM "convert float to int\n", }, 322 323 { SCONV, INAREG | FEATURE_VFP, 324 SCREG, TFLOAT, 325 SAREG, TSWORD, 326 NAREG, RESC1, 327 " ftouis AL,AR" COM "convert float to int\n", }, 328 329 { SCONV, INAREG, 330 SAREG, TFLOAT, 331 SAREG, TWORD, 332 NSPECIAL|NAREG, RESC1, 333 "ZF", }, 334 335 { SCONV, INBREG | FEATURE_FPA, 336 SCREG, TFLOAT, 337 SBREG, TULONGLONG|TLONGLONG, 338 NBREG, RESC1, 339 COM "unimplemented\n", }, 340 341 { SCONV, INBREG | FEATURE_VFP, 342 SCREG, TFLOAT, 343 SBREG, TULONGLONG|TLONGLONG, 344 NBREG, RESC1, 345 COM "unimplemented\n", }, 346 347 { SCONV, INBREG, 348 SAREG, TFLOAT, 349 SBREG, TULONGLONG|TLONGLONG, 350 NSPECIAL|NBREG, RESC1, 351 "ZF", }, 352 353 { SCONV, INAREG | FEATURE_FPA, 354 SCREG, TDOUBLE|TLDOUBLE, 355 SAREG, TWORD, 356 NAREG, RESC1, 357 " fix AL,AR" COM "convert double/ldouble to int\n", }, 358 359 { SCONV, INAREG | FEATURE_VFP, 360 SCREG, TDOUBLE|TLDOUBLE, 361 SAREG, TSWORD, 362 NAREG, RESC1, 363 " ftosid AL,AR" COM "convert double/ldouble to int\n", }, 364 365 { SCONV, INAREG | FEATURE_VFP, 366 SCREG, TDOUBLE|TLDOUBLE, 367 SAREG, TUWORD, 368 NAREG, RESC1, 369 " ftouid AL,AR" COM "convert double/ldouble to int\n", }, 370 371 { SCONV, INAREG, 372 SBREG, TDOUBLE|TLDOUBLE, 373 SAREG, TWORD, 374 NSPECIAL|NAREG, RESC1, 375 "ZF", }, 376 377 { SCONV, INBREG | FEATURE_FPA, 378 SCREG, TDOUBLE|TLDOUBLE, 379 SBREG, TLONGLONG|TULONGLONG, 380 NBREG, RESC1, 381 COM "unimplemented\n", }, 382 383 { SCONV, INBREG | FEATURE_VFP, 384 SCREG, TDOUBLE|TLDOUBLE, 385 SBREG, TULONGLONG|TLONGLONG, 386 NBREG, RESC1, 387 COM "unimplemented\n", }, 388 389 { SCONV, INBREG, 390 SBREG, TDOUBLE|TLDOUBLE, 391 SBREG, TULONGLONG|TLONGLONG, 392 NSPECIAL|NBREG, RESC1, 393 "ZF", }, 394 395 { SCONV, INCREG | FEATURE_FPA, 396 SAREG, TWORD, 397 SCREG, TFLOAT, 398 NCREG, RESC1, 399 " flts AL,AR" COM "convert int to float\n" }, 400 401 { SCONV, INCREG | FEATURE_VFP, 402 SAREG, TSWORD, 403 SCREG, TFLOAT, 404 NCREG, RESC1, 405 " fsitos AL,AR" COM "convert int to float\n" }, 406 407 { SCONV, INCREG | FEATURE_VFP, 408 SAREG, TUWORD, 409 SCREG, TFLOAT, 410 NCREG, RESC1, 411 " fuitos AL,AR" COM "convert int to float\n" }, 412 413 { SCONV, INAREG, 414 SAREG, TWORD, 415 SAREG, TFLOAT, 416 NSPECIAL|NAREG, RESC1, 417 "ZF", }, 418 419 { SCONV, INCREG | FEATURE_FPA, 420 SBREG, TULONGLONG|TLONGLONG, 421 SCREG, TFLOAT, 422 NCREG, RESC1, 423 COM "unimplemented\n", }, 424 425 { SCONV, INCREG | FEATURE_VFP, 426 SBREG, TULONGLONG|TLONGLONG, 427 SCREG, TFLOAT, 428 NCREG, RESC1, 429 COM "unimplemented\n", }, 430 431 { SCONV, INAREG, 432 SBREG, TULONGLONG|TLONGLONG, 433 SAREG, TFLOAT, 434 NAREG, RESC1, 435 COM "unimplemented\n", }, 436 437 { SCONV, INCREG | FEATURE_FPA, 438 SAREG, TWORD, 439 SCREG, TDOUBLE, 440 NCREG, RESC1, 441 " fltd AL,AR" COM "convert int to double\n" }, 442 443 { SCONV, INCREG | FEATURE_VFP, 444 SAREG, TSWORD, 445 SCREG, TDOUBLE, 446 NCREG, RESC1, 447 " fsitod AL,AR" COM "convert int to double\n" }, 448 449 { SCONV, INCREG | FEATURE_VFP, 450 SAREG, TUWORD, 451 SCREG, TDOUBLE, 452 NCREG, RESC1, 453 " fuitod AL,AR" COM "convert int to double\n" }, 454 455 { SCONV, INBREG, 456 SAREG, TWORD, 457 SBREG, TDOUBLE, 458 NSPECIAL|NBREG, RESC1, 459 "ZF", }, 460 461 { SCONV, INCREG | FEATURE_FPA, 462 SBREG, TLONGLONG|TULONGLONG, 463 SCREG, TDOUBLE, 464 NCREG, RESC1, 465 COM "unimplemented\n", }, 466 467 { SCONV, INCREG | FEATURE_VFP, 468 SBREG, TLONGLONG|TULONGLONG, 469 SCREG, TDOUBLE, 470 NCREG, RESC1, 471 COM "unimplemented\n", }, 472 473 { SCONV, INBREG, 474 SBREG, TLONGLONG|TULONGLONG, 475 SBREG, TDOUBLE, 476 NSPECIAL|NBREG, RESC1, 477 "ZF", }, 478 479 { SCONV, INCREG | FEATURE_FPA, 480 SAREG, TWORD, 481 SCREG, TLDOUBLE, 482 NCREG, RESC1, 483 " flte AL,AR" COM "convert int to ldouble\n" }, 484 485 { SCONV, INCREG | FEATURE_VFP, 486 SAREG, TSWORD, 487 SCREG, TLDOUBLE, 488 NCREG, RESC1, 489 " fsitod AL,AR" COM "convert int to ldouble\n" }, 490 491 { SCONV, INCREG | FEATURE_VFP, 492 SAREG, TUWORD, 493 SCREG, TLDOUBLE, 494 NCREG, RESC1, 495 " fuitod AL,AR" COM "convert uint to ldouble\n" }, 496 497 { SCONV, INBREG, 498 SAREG, TWORD, 499 SBREG, TLDOUBLE, 500 NSPECIAL|NBREG, RESC1, 501 "ZF", }, 502 503 { SCONV, INCREG | FEATURE_FPA, 504 SBREG, TLONGLONG|TULONGLONG, 505 SCREG, TLDOUBLE, 506 NCREG, RESC1, 507 COM "unimplemented\n", }, 508 509 { SCONV, INCREG | FEATURE_VFP, 510 SBREG, TLONGLONG|TULONGLONG, 511 SCREG, TLDOUBLE, 512 NCREG, RESC1, 513 COM "unimplemented\n", }, 514 515 { SCONV, INBREG, 516 SBREG, TLONGLONG|TULONGLONG, 517 SBREG, TLDOUBLE, 518 NSPECIAL|NBREG, RESC1, 519 "ZF", }, 520 521 { SCONV, INCREG | FEATURE_FPA, 522 SCREG, TDOUBLE|TLDOUBLE, 523 SCREG, TFLOAT, 524 NCREG, RESC1, 525 COM "unimplemented\n", }, 526 527 { SCONV, INCREG | FEATURE_VFP, 528 SCREG, TDOUBLE|TLDOUBLE, 529 SCREG, TFLOAT, 530 NCREG, RESC1, 531 " fcvtds AL,AR" COM "convert float to double\n" }, 532 533 { SCONV, INAREG, 534 SBREG, TDOUBLE|TLDOUBLE, 535 SAREG, TFLOAT, 536 NSPECIAL|NAREG, RESC1, 537 "ZF", }, 538 539 { SCONV, INCREG | FEATURE_FPA, 540 SCREG, TFLOAT, 541 SCREG, TDOUBLE|TLDOUBLE, 542 NCREG, RESC1, 543 COM "unimplemented\n", }, 544 545 { SCONV, INCREG | FEATURE_VFP, 546 SCREG, TFLOAT, 547 SCREG, TDOUBLE|TLDOUBLE, 548 NCREG, RESC1, 549 " fcvtsd AL,AR" COM "convert float to double\n" }, 550 551 { SCONV, INBREG, 552 SAREG, TFLOAT, 553 SBREG, TDOUBLE|TLDOUBLE, 554 NSPECIAL|NBREG, RESC1, 555 "ZF", }, 556 557 { SCONV, INCREG | FEATURE_FPA, 558 SCREG, TDOUBLE|TLDOUBLE, 559 SCREG, TDOUBLE|TLDOUBLE, 560 0, RLEFT, 561 COM "convert (l)double to (l)double", }, 562 563 { SCONV, INCREG | FEATURE_VFP, 564 SCREG, TDOUBLE|TLDOUBLE, 565 SCREG, TDOUBLE|TLDOUBLE, 566 0, RLEFT, 567 COM "convert (l)double to (l)double", }, 568 569 { SCONV, INBREG, 570 SBREG, TDOUBLE|TLDOUBLE, 571 SBREG, TDOUBLE|TLDOUBLE, 572 0, RLEFT, 573 COM "convert (l)double to (l)double", }, 574 575 /* 576 * Subroutine calls. 577 */ 578 579 { CALL, FOREFF, 580 SCON|SNAME, TANY, 581 SANY, TANY, 582 0, 0, 583 " bl CL" COM "call (args, no result) to scon/sname (CL)\n" 584 "ZC", }, 585 586 { UCALL, FOREFF, 587 SCON|SNAME, TANY, 588 SANY, TANY, 589 0, 0, 590 " bl CL" COM "call (no args, no result) to scon/sname (CL)\n", }, 591 592 { CALL, INAREG, 593 SCON|SNAME, TANY, 594 SAREG, TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR, 595 NAREG|NASL, RESC1, /* should be 0 */ 596 " bl CL" COM "call (args, result in r0) to scon/sname (CL)\n" 597 "ZC", }, 598 599 { CALL, INBREG, 600 SCON|SNAME, TANY, 601 SBREG, TLONGLONG|TULONGLONG, 602 NBREG|NBSL, RESC1, /* should be 0 */ 603 " bl CL" COM "call (args, result in r0:r1) to scon/sname (CL)\n" 604 "ZC", }, 605 606 { CALL, INCREG | FEATURE_FPA, 607 SCON|SNAME, TANY, 608 SCREG, TFLOAT, 609 NCREG|NCSL, RESC1, /* should be 0 */ 610 " bl CL" COM "call (args, result r0) to scon/sname (CL)\n" 611 "ZC", }, 612 613 { CALL, INCREG | FEATURE_FPA, 614 SCON|SNAME, TANY, 615 SCREG, TDOUBLE|TLDOUBLE, 616 NCREG|NCSL, RESC1, /* should be 0 */ 617 " bl CL" COM "call (args, result in r0:r1) to scon/sname (CL)\n" 618 "ZC", }, 619 620 { CALL, INAREG, 621 SCON|SNAME, TANY, 622 SAREG, TFLOAT, 623 NAREG|NASL, RESC1, /* should be 0 */ 624 " bl CL" COM "call (args, result r0) to scon/sname (CL)\n" 625 "ZC", }, 626 627 { CALL, INBREG, 628 SCON|SNAME, TANY, 629 SBREG, TDOUBLE|TLDOUBLE, 630 NBREG|NBSL, RESC1, /* should be 0 */ 631 " bl CL" COM "call (args, result in r0:r1) to scon/sname (CL)\n" 632 "ZC", }, 633 634 { UCALL, INAREG, 635 SCON|SNAME, TANY, 636 SAREG, TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR, 637 NAREG|NASL, RESC1, /* should be 0 */ 638 " bl CL" COM "call (no args, result in r0) to scon/sname (CL)\n", }, 639 640 { UCALL, INBREG, 641 SCON|SNAME, TANY, 642 SBREG, TLONGLONG|TULONGLONG, 643 NBREG|NBSL, RESC1, /* should be 0 */ 644 " bl CL" COM "call (no args, result in r0:r1) to scon/sname (CL)\n", }, 645 646 { UCALL, INCREG | FEATURE_FPA, 647 SCON|SNAME, TANY, 648 SCREG, TFLOAT, 649 NCREG|NCSL, RESC1, /* should be 0 */ 650 " bl CL" COM "call (no args, result in r0) to scon/sname (CL)\n", }, 651 652 { UCALL, INCREG | FEATURE_FPA, 653 SCON|SNAME, TANY, 654 SCREG, TDOUBLE|TLDOUBLE, 655 NCREG|NCSL, RESC1, /* should be 0 */ 656 " bl CL" COM "call (no args, result in r0:r1) to scon/sname (CL)\n", }, 657 658 { CALL, FOREFF, 659 SAREG, TANY, 660 SANY, TANY, 661 0, 0, 662 " mov lr,pc\n" 663 " mov pc,AL\n" 664 "ZC", }, 665 666 { UCALL, FOREFF, 667 SAREG, TANY, 668 SANY, TANY, 669 0, 0, 670 " mov lr,pc\n" 671 " mov pc,AL\n", }, 672 673 { CALL, INAREG, 674 SAREG, TANY, 675 SANY, TANY, 676 NAREG, RESC1, 677 " mov lr,pc\n" 678 " mov pc,AL\n" 679 "ZC", }, 680 681 { UCALL, INAREG, 682 SAREG, TANY, 683 SANY, TANY, 684 NAREG, RESC1, 685 " mov lr,pc\n" 686 " mov pc,AL\n", }, 687 688 { CALL, INBREG, 689 SAREG, TANY, 690 SANY, TANY, 691 NBREG, RESC1, 692 " mov lr,pc\n" 693 " mov pc,AL\n" 694 "ZC", }, 695 696 { UCALL, INBREG, 697 SAREG, TANY, 698 SANY, TANY, 699 NBREG, RESC1, 700 " mov lr,pc\n" 701 " mov pc,AL\n", }, 702 703 /* struct return */ 704 { USTCALL, FOREFF, 705 SCON, TANY, 706 SANY, TANY, 707 0, 0, 708 " bl CL\n", }, 709 710 { USTCALL, INAREG, 711 SCON, TANY, 712 SANY, TANY, 713 NAREG|NASL, RESC1, /* should be 0 */ 714 " bl CL\n", }, 715 716 { USTCALL, INAREG, 717 SNAME|SAREG, TANY, 718 SANY, TANY, 719 NAREG|NASL, RESC1, /* should be 0 */ 720 " mov lr,pc\n" 721 " mov pc,AL\n", }, 722 723 { STCALL, FOREFF, 724 SCON, TANY, 725 SANY, TANY, 726 0, 0, 727 " bl CL\n" 728 "ZC", }, 729 730 { STCALL, INAREG, 731 SCON, TANY, 732 SANY, TANY, 733 NAREG|NASL, RESC1, /* should be 0 */ 734 " bl CL\n" 735 "ZC", }, 736 737 { STCALL, INAREG, 738 SNAME|SAREG, TANY, 739 SANY, TANY, 740 NAREG|NASL, RESC1, /* should be 0 */ 741 " mov lr,pc\n" 742 " mov pc,AL\n" 743 "ZC", }, 744 745 /* 746 * The next rules handle all binop-style operators. 747 */ 748 749 { PLUS, INAREG, 750 SAREG, TWORD|TPOINT, 751 SCCON, TANY, 752 NAREG, RESC1, 753 " add A1,AL,AR" COM "addition of constant\n", }, 754 755 { PLUS, INBREG, 756 SBREG, TLONGLONG|TULONGLONG, 757 SSCON, TANY, 758 NBREG|NBSL, RESC1, 759 " adds A1,AL,AR" COM "64-bit addition of constant\n" 760 " adc U1,UL,UR\n", }, 761 762 { PLUS, INAREG, 763 SAREG, TWORD|TPOINT, 764 SAREG, TWORD|TPOINT, 765 NAREG|NASL, RESC1, 766 " add A1,AL,AR" COM "addition\n", }, 767 768 { PLUS, INBREG, 769 SBREG, TLONGLONG|TULONGLONG, 770 SBREG, TLONGLONG|TULONGLONG, 771 NBREG|NBSL, RESC1, 772 " adds A1,AL,AR" COM "64-bit addition\n" 773 " adc U1,UL,UR\n", }, 774 775 { PLUS, INCREG | FEATURE_FPA, 776 SCREG, TFLOAT, 777 SCREG, TFLOAT, 778 NCREG, RESC1, 779 " adfs A1,AL,AR" COM "float add\n", }, 780 781 { PLUS, INCREG | FEATURE_VFP, 782 SCREG, TFLOAT, 783 SCREG, TFLOAT, 784 NCREG, RESC1, 785 " fadds A1,AL,AR" COM "float add\n", }, 786 787 { PLUS, INAREG, 788 SAREG, TFLOAT, 789 SAREG, TFLOAT, 790 NSPECIAL|NAREG, RESC1, 791 "ZF", }, 792 793 { PLUS, INCREG | FEATURE_FPA, 794 SCREG, TDOUBLE, 795 SCREG, TDOUBLE, 796 NCREG, RESC1, 797 " adfd A1,AL,AR" COM "double add\n", }, 798 799 { PLUS, INCREG | FEATURE_VFP, 800 SCREG, TDOUBLE, 801 SCREG, TDOUBLE, 802 NCREG, RESC1, 803 " faddd A1,AL,AR" COM "double add\n", }, 804 805 { PLUS, INBREG, 806 SBREG, TDOUBLE, 807 SBREG, TDOUBLE, 808 NSPECIAL|NBREG, RESC1, 809 "ZF", }, 810 811 { PLUS, INCREG | FEATURE_FPA, 812 SCREG, TLDOUBLE, 813 SCREG, TLDOUBLE, 814 NCREG, RESC1, 815 " adfe A1,AL,AR" COM "ldouble add\n", }, 816 817 { PLUS, INCREG | FEATURE_VFP, 818 SCREG, TLDOUBLE, 819 SCREG, TLDOUBLE, 820 NCREG, RESC1, 821 " faddd A1,AL,AR" COM "ldouble add\n", }, 822 823 { PLUS, INBREG, 824 SBREG, TLDOUBLE, 825 SBREG, TLDOUBLE, 826 NSPECIAL|NBREG, RESC1, 827 "ZF", }, 828 829 { MINUS, INAREG, 830 SAREG, TWORD|TPOINT, 831 SCCON, TANY, 832 NAREG|NASL, RESC1, 833 " sub A1,AL,AR" COM "subtraction of constant\n", }, 834 835 { MINUS, INAREG, 836 SAREG, TWORD|TPOINT, 837 SAREG, TWORD|TPOINT, 838 NAREG|NASL, RESC1, 839 " sub A1,AL,AR" COM "subtraction\n", }, 840 841 { MINUS, INBREG, 842 SBREG, TLONGLONG|TULONGLONG, 843 SCCON, TANY, 844 NBREG|NBSL, RESC1, 845 " subs A1,AL,AR" COM "64-bit subtraction of constant\n" 846 " rsc U1,UL,AR\n", }, 847 848 { MINUS, INBREG, 849 SBREG, TLONGLONG|TULONGLONG, 850 SBREG, TLONGLONG|TULONGLONG, 851 NBREG|NBSL, RESC1, 852 " subs A1,AL,AR" COM "64-bit subtraction\n" 853 " sbc U1,UL,AR\n", }, 854 855 { MINUS, INCREG | FEATURE_FPA, 856 SCREG, TFLOAT, 857 SCREG, TFLOAT, 858 NCREG, RESC1, 859 " sufs A1,AL,AR" COM "float subtraction\n", }, 860 861 { MINUS, INCREG | FEATURE_VFP, 862 SCREG, TFLOAT, 863 SCREG, TFLOAT, 864 NCREG, RESC1, 865 " fsubs A1,AL,AR" COM "float subtraction\n", }, 866 867 { MINUS, INAREG, 868 SAREG, TFLOAT, 869 SAREG, TFLOAT, 870 NSPECIAL|NAREG, RESC1, 871 "ZF", }, 872 873 { MINUS, INCREG | FEATURE_FPA, 874 SCREG, TDOUBLE, 875 SCREG, TDOUBLE, 876 NCREG, RESC1, 877 " sufd A1,AL,AR" COM "double subtraction\n", }, 878 879 { MINUS, INCREG | FEATURE_VFP, 880 SCREG, TDOUBLE, 881 SCREG, TDOUBLE, 882 NCREG, RESC1, 883 " fsubd A1,AL,AR" COM "double subtraction\n", }, 884 885 { MINUS, INBREG, 886 SBREG, TDOUBLE, 887 SBREG, TDOUBLE, 888 NSPECIAL|NBREG, RESC1, 889 "ZF", }, 890 891 { MINUS, INCREG | FEATURE_FPA, 892 SCREG, TLDOUBLE, 893 SCREG, TLDOUBLE, 894 NCREG, RESC1, 895 " sufe A1,AL,AR" COM "ldouble subtraction\n", }, 896 897 { MINUS, INCREG | FEATURE_VFP, 898 SCREG, TLDOUBLE, 899 SCREG, TLDOUBLE, 900 NCREG, RESC1, 901 " fsubd A1,AL,AR" COM "double subtraction\n", }, 902 903 { MINUS, INBREG, 904 SBREG, TLDOUBLE, 905 SBREG, TLDOUBLE, 906 NSPECIAL|NBREG, RESC1, 907 "ZF", }, 908 909 /* 910 * The next rules handle all shift operators. 911 */ 912 913 { LS, INAREG, 914 SAREG, TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR, 915 SAREG, TANY, 916 NAREG|NASL, RESC1, 917 " mov A1,AL,asl AR" COM "left shift\n", }, 918 919 { LS, INAREG, 920 SAREG, TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR, 921 SCCON, TANY, 922 NAREG|NASL, RESC1, 923 " mov A1,AL,asl AR" COM "left shift by constant\n", }, 924 925 { LS, INBREG, 926 SBREG, TLONGLONG|TULONGLONG, 927 SCON, TANY, 928 NBREG, RESC1, 929 "ZO" }, 930 931 { LS, INBREG, 932 SBREG, TLONGLONG|TULONGLONG, 933 SAREG, TANY, 934 NSPECIAL|NBREG, RESC1, 935 "ZE" }, 936 937 { RS, INAREG, 938 SAREG, TSWORD|TSHORT|TCHAR, 939 SAREG, TANY, 940 NAREG|NASL, RESC1, 941 " mov A1,AL,asr AR" COM "right shift\n", }, 942 943 { RS, INAREG, 944 SAREG, TUWORD|TUSHORT|TUCHAR, 945 SAREG, TANY, 946 NAREG|NASL, RESC1, 947 " mov A1,AL,lsr AR" COM "right shift\n", }, 948 949 { RS, INAREG, 950 SAREG, TSWORD|TSHORT|TCHAR, 951 SCCON, TANY, 952 NAREG|NASL, RESC1, 953 " mov A1,AL,asr AR" COM "right shift by constant\n", }, 954 955 { RS, INAREG, 956 SAREG, TUWORD|TUSHORT|TUCHAR, 957 SCCON, TANY, 958 NAREG|NASL, RESC1, 959 " mov A1,AL,lsr AR" COM "right shift by constant\n", }, 960 961 { RS, INBREG, 962 SBREG, TLONGLONG|TULONGLONG, 963 SCON, TANY, 964 NBREG, RESC1, 965 "ZO" }, 966 967 { RS, INBREG, 968 SBREG, TLONGLONG|TULONGLONG, 969 SAREG, TANY, 970 NSPECIAL|NBREG, RESC1, 971 "ZE" }, 972 973 974 /* 975 * The next rules takes care of assignments. "=". 976 */ 977 978 { ASSIGN, FOREFF|INAREG, 979 SOREG|SNAME, TWORD|TPOINT, 980 SAREG, TWORD|TPOINT, 981 0, RDEST, 982 " str AR,AL" COM "assign word\n", }, 983 984 { ASSIGN, FOREFF|INBREG, 985 SOREG|SNAME, TLONGLONG|TULONGLONG, 986 SBREG, TLONGLONG|TULONGLONG, 987 0, RDEST, 988 " str AR,AL" COM "assign 64-bit value\n" 989 " str UR,UL\n", }, 990 991 /* XXX don't know if this works */ 992 { ASSIGN, FOREFF|INBREG, 993 SAREG, TPTRTO|TLONGLONG|TULONGLONG, 994 SBREG, TLONGLONG|TULONGLONG, 995 0, RDEST, 996 " stmdb AL,{AR-UR}" COM "assign 64-bit value\n", }, 997 998 { ASSIGN, FOREFF|INAREG, 999 SOREG|SNAME, TCHAR|TUCHAR, 1000 SAREG, TCHAR|TUCHAR, 1001 0, RDEST, 1002 " strb AR,AL" COM "assign (u)char\n", }, 1003 1004 { ASSIGN, FOREFF|INAREG | FEATURE_HALFWORDS, 1005 SOREG|SNAME, TSHORT|TUSHORT, 1006 SAREG, TSHORT|TUSHORT, 1007 0, RDEST, 1008 " strh AR,AL" COM "assign (u)short\n", }, 1009 1010 { ASSIGN, FOREFF|INAREG, 1011 SOREG|SNAME, TSHORT|TUSHORT, 1012 SAREG, TSHORT|TUSHORT, 1013 NAREG|NASL, RDEST, 1014 "ZH", }, 1015 1016 { ASSIGN, FOREFF|INCREG | FEATURE_FPA, 1017 SOREG|SNAME, TFLOAT, 1018 SCREG, TFLOAT, 1019 0, RDEST, 1020 " stfs AR,AL" COM "assign float\n", }, 1021 1022 { ASSIGN, FOREFF|INCREG | FEATURE_VFP, 1023 SOREG|SNAME, TFLOAT, 1024 SCREG, TFLOAT, 1025 0, RDEST, 1026 COM "unimplemented\n", }, 1027 1028 { ASSIGN, FOREFF|INAREG, 1029 SOREG|SNAME, TFLOAT, 1030 SAREG, TFLOAT, 1031 0, RDEST, 1032 " str AR,AL" COM "assign float (soft-float)\n", }, 1033 1034 { ASSIGN, FOREFF|INCREG | FEATURE_FPA, 1035 SOREG|SNAME, TDOUBLE, 1036 SCREG, TDOUBLE, 1037 0, RDEST, 1038 " stfd AR,AL" COM "assign double\n", }, 1039 1040 { ASSIGN, FOREFF|INCREG | FEATURE_VFP, 1041 SOREG|SNAME, TDOUBLE, 1042 SCREG, TDOUBLE, 1043 0, RDEST, 1044 COM "unimplemented\n", }, 1045 1046 { ASSIGN, FOREFF|INBREG, 1047 SOREG|SNAME, TDOUBLE, 1048 SBREG, TDOUBLE, 1049 0, RDEST, 1050 " str AR,AL" COM "assign double (soft-float)\n" 1051 " str UR,UL\n", }, 1052 1053 { ASSIGN, FOREFF|INCREG | FEATURE_FPA, 1054 SOREG|SNAME, TLDOUBLE, 1055 SCREG, TLDOUBLE, 1056 0, RDEST, 1057 " stfe AR,AL" COM "assign ldouble\n", }, 1058 1059 { ASSIGN, FOREFF|INCREG | FEATURE_VFP, 1060 SOREG|SNAME, TLDOUBLE, 1061 SCREG, TLDOUBLE, 1062 0, RDEST, 1063 COM "not implemented", }, 1064 1065 { ASSIGN, FOREFF|INBREG, 1066 SOREG|SNAME, TLDOUBLE, 1067 SBREG, TLDOUBLE, 1068 0, RDEST, 1069 " str AR,AL" COM "assign ldouble (soft-float)\n" 1070 " str UR,UL\n", }, 1071 1072 /* assign register to register */ 1073 { ASSIGN, FOREFF|INAREG, 1074 SAREG, TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR, 1075 SAREG, TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR, 1076 0, RDEST, 1077 " mov AL,AR" COM "assign AR to AL\n", }, 1078 1079 { ASSIGN, FOREFF|INBREG, 1080 SBREG, TLONGLONG|TULONGLONG, 1081 SBREG, TLONGLONG|TULONGLONG, 1082 0, RDEST, 1083 " mov AL,AR" COM "assign UR:AR to UL:AL\n" 1084 " mov UL,UR\n", }, 1085 1086 { ASSIGN, FOREFF|INCREG | FEATURE_FPA, 1087 SCREG, TFLOAT, 1088 SCREG, TFLOAT, 1089 0, RDEST, 1090 " mvf AL,AR" COM "assign float reg to float reg\n", }, 1091 1092 { ASSIGN, FOREFF|INCREG | FEATURE_VFP, 1093 SCREG, TFLOAT, 1094 SCREG, TFLOAT, 1095 0, RDEST, 1096 " fcpys AL,AR" COM "assign float reg to float reg\n", }, 1097 1098 { ASSIGN, FOREFF|INAREG, 1099 SAREG, TFLOAT, 1100 SAREG, TFLOAT, 1101 0, RDEST, 1102 " mov AL,AR" COM "assign float reg to float reg\n", }, 1103 1104 { ASSIGN, FOREFF|INCREG | FEATURE_FPA, 1105 SCREG, TDOUBLE|TLDOUBLE, 1106 SCREG, TDOUBLE|TLDOUBLE, 1107 0, RDEST, 1108 " mvf AL,AR" COM "assign float reg to float reg\n", }, 1109 1110 { ASSIGN, FOREFF|INCREG | FEATURE_VFP, 1111 SCREG, TDOUBLE|TLDOUBLE, 1112 SCREG, TDOUBLE|TLDOUBLE, 1113 0, RDEST, 1114 " fcpyd AL,AR" COM "assign float reg to float reg\n", }, 1115 1116 { ASSIGN, FOREFF|INBREG, 1117 SBREG, TDOUBLE|TLDOUBLE, 1118 SBREG, TDOUBLE|TLDOUBLE, 1119 0, RDEST, 1120 " mov AL,AR" COM "assign (l)double reg to (l)double reg\n" 1121 " mov UL,UR\n", }, 1122 1123 { ASSIGN, FOREFF|INAREG, 1124 SFLD, TANY, 1125 SOREG|SNAME, TANY, 1126 3*NAREG, RDEST, 1127 " ldr A1,AR" COM "bit-field assignment\n" 1128 " ldr A2,AL\n" 1129 " ldr A3,=M\n" 1130 " mov A1,A1,asl H\n" 1131 " and A1,A1,A3\n" 1132 " bic A2,A2,A3\n" 1133 " orr A3,A2,A1\n" 1134 " str A3,AL\n" 1135 "F ldr AD,AR\n" 1136 "FZB", }, 1137 1138 { ASSIGN, FOREFF|INAREG, 1139 SFLD, TANY, 1140 SAREG, TANY, 1141 3*NAREG, RDEST, 1142 " ldr A2,AL" COM "bit-field assignment\n" 1143 " ldr A3,=M\n" 1144 " mov A1,AR,asl H\n" 1145 " and A1,A1,A3\n" 1146 " bic A2,A2,A3\n" 1147 " orr A3,A2,A1\n" 1148 " str A3,AL\n" 1149 "F mov AD,AR\n" 1150 "FZB", }, 1151 1152 { STASG, INAREG|FOREFF, 1153 SOREG|SNAME, TANY, 1154 SAREG, TPTRTO|TANY, 1155 NSPECIAL, RRIGHT, 1156 "ZQ", }, 1157 1158 /* 1159 * DIV/MOD/MUL 1160 */ 1161 1162 { DIV, INAREG, 1163 SAREG, TWORD, 1164 SAREG, TWORD, 1165 NSPECIAL|NAREG|NASL, RESC1, 1166 "ZE", }, 1167 1168 { DIV, INBREG, 1169 SBREG, TLONGLONG|TULONGLONG, 1170 SBREG, TLONGLONG|TULONGLONG, 1171 NSPECIAL|NBREG|NBSL, RESC1, 1172 "ZE", }, 1173 1174 { DIV, INCREG | FEATURE_FPA, 1175 SCREG, TFLOAT, 1176 SCREG, TFLOAT, 1177 NCREG, RESC1, 1178 " dvfs A1,AL,AL" COM "fast (float) divide\n", }, 1179 1180 { DIV, INCREG | FEATURE_VFP, 1181 SCREG, TFLOAT, 1182 SCREG, TFLOAT, 1183 NCREG, RESC1, 1184 " fdivs A1,AL,AL" COM "fast (float) divide\n", }, 1185 1186 { DIV, INAREG, 1187 SAREG, TFLOAT, 1188 SAREG, TFLOAT, 1189 NSPECIAL|NAREG, RESC1, 1190 "ZF", }, 1191 1192 { DIV, INCREG | FEATURE_FPA, 1193 SCREG, TDOUBLE, 1194 SCREG, TDOUBLE, 1195 NCREG, RESC1, 1196 " dvfd A1,AL,AL" COM "double divide\n", }, 1197 1198 { DIV, INCREG | FEATURE_VFP, 1199 SCREG, TDOUBLE, 1200 SCREG, TDOUBLE, 1201 NCREG, RESC1, 1202 " fdivd A1,AL,AL" COM "double divide\n", }, 1203 1204 { DIV, INBREG, 1205 SBREG, TDOUBLE, 1206 SBREG, TDOUBLE, 1207 NSPECIAL|NBREG, RESC1, 1208 "ZF", }, 1209 1210 { DIV, INCREG | FEATURE_FPA, 1211 SCREG, TLDOUBLE, 1212 SCREG, TLDOUBLE, 1213 NCREG, RESC1, 1214 " dvfe A1,AL,AR" COM "long double load\n", }, 1215 1216 { DIV, INCREG | FEATURE_VFP, 1217 SCREG, TLDOUBLE, 1218 SCREG, TLDOUBLE, 1219 NCREG, RESC1, 1220 " fdivd A1,AL,AL" COM "double divide\n", }, 1221 1222 { DIV, INBREG, 1223 SBREG, TLDOUBLE, 1224 SBREG, TLDOUBLE, 1225 NSPECIAL|NBREG, RESC1, 1226 "ZF", }, 1227 1228 { MOD, INAREG, 1229 SAREG, TWORD, 1230 SAREG, TWORD, 1231 NSPECIAL|NAREG, RESC1, 1232 "ZE", }, 1233 1234 { MOD, INBREG, 1235 SBREG, TLONGLONG|TULONGLONG, 1236 SBREG, TLONGLONG|TULONGLONG, 1237 NSPECIAL|NBREG, RESC1, 1238 "ZE", }, 1239 1240 { MUL, INAREG | FEATURE_MUL, 1241 SAREG, TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR, 1242 SAREG, TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR, 1243 NAREG, RESC1, 1244 " mul A1,AL,AR\n", }, 1245 1246 { MUL, INAREG, 1247 SAREG, TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR, 1248 SAREG, TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR, 1249 NSPECIAL|NAREG, RESC1, 1250 "ZE", }, 1251 1252 { MUL, INBREG | FEATURE_MULL, 1253 SAREG, TUWORD|TPOINT|TUSHORT|TUCHAR, 1254 SAREG, TUWORD|TPOINT|TUSHORT|TUCHAR, 1255 NBREG, RESC1, 1256 " smull U1,A1,AL,AR\n", }, 1257 1258 { MUL, INBREG | FEATURE_MUL, 1259 SAREG, TUWORD|TPOINT|TUSHORT|TUCHAR, 1260 SAREG, TUWORD|TPOINT|TUSHORT|TUCHAR, 1261 NBREG, RESC1, 1262 " mul A1,AL,AR\n" 1263 " mov U1,A1,asr #31\n", }, 1264 1265 { MUL, INBREG, 1266 SAREG, TUWORD|TPOINT|TUSHORT|TUCHAR, 1267 SAREG, TUWORD|TPOINT|TUSHORT|TUCHAR, 1268 NSPECIAL|NBREG, RESC1, 1269 "ZE", }, 1270 1271 { MUL, INBREG | FEATURE_MULL, 1272 SAREG, TSWORD|TSHORT|TCHAR, 1273 SAREG, TSWORD|TSHORT|TCHAR, 1274 NBREG, RESC1, 1275 " umull U1,A1,AL,AR\n", }, 1276 1277 { MUL, INBREG | FEATURE_MUL, 1278 SAREG, TSWORD|TSHORT|TCHAR, 1279 SAREG, TSWORD|TSHORT|TCHAR, 1280 NBREG, RESC1, 1281 " mul A1,AL,AR\n" 1282 " mov U1,#0\n", }, 1283 1284 { MUL, INBREG, 1285 SAREG, TSWORD|TSHORT|TCHAR, 1286 SAREG, TSWORD|TSHORT|TCHAR, 1287 NSPECIAL|NBREG, RESC1, 1288 "ZE", }, 1289 1290 { MUL, INBREG | FEATURE_MULL, 1291 SBREG, TLONGLONG|TULONGLONG, 1292 SBREG, TLONGLONG|TULONGLONG, 1293 NBREG, RESC1, 1294 " umull U1,A1,AL,AR\n", }, 1295 1296 { MUL, INBREG | FEATURE_MUL, 1297 SBREG, TLONGLONG|TULONGLONG, 1298 SBREG, TLONGLONG|TULONGLONG, 1299 NBREG, RESC1, 1300 " mul A1,AL,AR\n" 1301 " mov U1,A1,asr #31\n", }, 1302 1303 { MUL, INBREG, 1304 SBREG, TLONGLONG|TULONGLONG, 1305 SBREG, TLONGLONG|TULONGLONG, 1306 NSPECIAL|NBREG, RESC1, 1307 "ZE", }, 1308 1309 { MUL, INCREG | FEATURE_FPA, 1310 SCREG, TFLOAT, 1311 SCREG, TFLOAT, 1312 NCREG, RESC1, 1313 " fmls A1,AL,AL" COM "fast (float) multiply\n", }, 1314 1315 { MUL, INCREG | FEATURE_VFP, 1316 SCREG, TFLOAT, 1317 SCREG, TFLOAT, 1318 NCREG, RESC1, 1319 " fmuls A1,AL,AL" COM "float multiply\n", }, 1320 1321 { MUL, INAREG, 1322 SAREG, TFLOAT, 1323 SAREG, TFLOAT, 1324 NSPECIAL|NAREG, RESC1, 1325 "ZF", }, 1326 1327 { MUL, INCREG | FEATURE_FPA, 1328 SCREG, TDOUBLE|TLDOUBLE, 1329 SCREG, TDOUBLE|TLDOUBLE, 1330 NCREG, RESC1, 1331 " mufd A1,AL,AL" COM "fast (l)double multiply\n", }, 1332 1333 { MUL, INCREG | FEATURE_VFP, 1334 SCREG, TDOUBLE|TLDOUBLE, 1335 SCREG, TDOUBLE|TLDOUBLE, 1336 NCREG, RESC1, 1337 " muld A1,AL,AL" COM "(l)double multiply\n", }, 1338 1339 { MUL, INBREG, 1340 SBREG, TDOUBLE|TLDOUBLE, 1341 SBREG, TDOUBLE|TLDOUBLE, 1342 NSPECIAL|NBREG, RESC1, 1343 "ZF", }, 1344 1345 /* 1346 * Indirection operators. 1347 */ 1348 1349 { UMUL, INAREG, 1350 SANY, TANY, 1351 SOREG|SNAME, TWORD|TPOINT, 1352 NAREG, RESC1, 1353 " ldr A1,AL" COM "word load\n", }, 1354 1355 { UMUL, INAREG, 1356 SANY, TANY, 1357 SOREG|SNAME, TCHAR, 1358 NAREG, RESC1, 1359 " ldrsb A1,AL" COM "char load\n", }, 1360 1361 { UMUL, INAREG, 1362 SANY, TANY, 1363 SOREG|SNAME, TUCHAR, 1364 NAREG, RESC1, 1365 " ldrb A1,AL" COM "uchar load\n", }, 1366 1367 { UMUL, INAREG | FEATURE_HALFWORDS, 1368 SANY, TANY, 1369 SOREG|SNAME, TUSHORT, 1370 NAREG, RESC1, 1371 " ldrh A1,AL" COM "short load\n", }, 1372 1373 { UMUL, INAREG | FEATURE_HALFWORDS, 1374 SANY, TANY, 1375 SOREG|SNAME, TSHORT, 1376 NAREG, RESC1, 1377 " ldrsh A1,AL" COM "short load\n", }, 1378 1379 { UMUL, INAREG, 1380 SANY, TANY, 1381 SOREG|SNAME, TSHORT|TUSHORT, 1382 2*NAREG|NASL, RESC1, 1383 "ZH", }, 1384 1385 { UMUL, INBREG, 1386 SANY, TANY, 1387 SOREG|SNAME, TLONGLONG|TULONGLONG, 1388 NBREG, RESC1, 1389 " ldr A1,AL" COM "64-bit load\n" 1390 " ldr U1,UL\n", }, 1391 1392 { UMUL, INCREG | FEATURE_FPA, 1393 SANY, TANY, 1394 SOREG|SNAME, TFLOAT, 1395 NCREG, RESC1, 1396 " ldfs A1,AL" COM "float load\n", }, 1397 1398 { UMUL, INCREG | FEATURE_VFP, 1399 SANY, TANY, 1400 SOREG|SNAME, TFLOAT, 1401 NCREG, RESC1, 1402 COM "not implemented\n", }, 1403 1404 { UMUL, INAREG, 1405 SANY, TANY, 1406 SOREG|SNAME, TFLOAT, 1407 NAREG, RESC1, 1408 " ldr A1,AL" COM "float load\n", }, 1409 1410 { UMUL, INCREG | FEATURE_FPA, 1411 SANY, TANY, 1412 SOREG|SNAME, TDOUBLE, 1413 NCREG, RESC1, 1414 " ldfd A1,AL" COM "double load\n", }, 1415 1416 { UMUL, INCREG | FEATURE_VFP, 1417 SANY, TANY, 1418 SOREG|SNAME, TDOUBLE, 1419 NCREG, RESC1, 1420 COM "not implemented\n", }, 1421 1422 { UMUL, INBREG, 1423 SANY, TANY, 1424 SOREG|SNAME, TDOUBLE, 1425 NBREG, RESC1, 1426 " ldr A1,AL" COM "double load\n" 1427 " ldr U1,UL\n", }, 1428 1429 { UMUL, INCREG | FEATURE_FPA, 1430 SANY, TANY, 1431 SOREG|SNAME, TLDOUBLE, 1432 NCREG, RESC1, 1433 " ldfe A1,AL" COM "long double load\n", }, 1434 1435 { UMUL, INCREG | FEATURE_VFP, 1436 SANY, TANY, 1437 SOREG|SNAME, TLDOUBLE, 1438 NCREG, RESC1, 1439 COM "not implemented\n", }, 1440 1441 { UMUL, INBREG, 1442 SANY, TANY, 1443 SOREG|SNAME, TLDOUBLE, 1444 NBREG, RESC1, 1445 " ldr A1,AL" COM "long double load (soft-float)\n" 1446 " ldr U1,UL\n", }, 1447 1448 /* 1449 * Logical/branching operators 1450 */ 1451 1452 /* compare with register */ 1453 { OPLOG, FORCC, 1454 SAREG, TSWORD|TSHORT|TCHAR, 1455 SAREG, TSWORD|TSHORT|TCHAR, 1456 0, RESCC, 1457 " cmp AL,AR" COM "AR-AL (sets flags)\n", }, 1458 1459 /* compare with register */ 1460 { OPLOG, FORCC, 1461 SAREG, TUWORD|TPOINT|TUSHORT|TUCHAR, 1462 SAREG, TUWORD|TPOINT|TUSHORT|TUCHAR, 1463 0, RESCC, 1464 " cmp AL,AR" COM "AR-AL (sets flags)\n", }, 1465 1466 /* compare with register */ 1467 { OPLOG, FORCC, 1468 SBREG, TLONGLONG|TULONGLONG, 1469 SBREG, TLONGLONG|TULONGLONG, 1470 0, RESCC, 1471 "ZD", }, 1472 1473 { OPLOG, FORCC | FEATURE_FPA, 1474 SCREG, TFLOAT, 1475 SCREG, TFLOAT, 1476 NSPECIAL, RESCC, 1477 " cmfs AL,AR" COM "float compare\n", }, 1478 1479 { OPLOG, FORCC | FEATURE_VFP, 1480 SCREG, TFLOAT, 1481 SCREG, TFLOAT, 1482 0, RESCC, 1483 " fcmps AL,AR" COM "float compare\n", }, 1484 1485 { OPLOG, FORCC, 1486 SAREG, TFLOAT, 1487 SAREG, TFLOAT, 1488 NSPECIAL, RESCC, 1489 "ZF", }, 1490 1491 { OPLOG, FORCC | FEATURE_FPA, 1492 SCREG, TDOUBLE, 1493 SCREG, TDOUBLE, 1494 NSPECIAL, RESCC, 1495 " cmfd AL,AR" COM "double compare\n", }, 1496 1497 { OPLOG, FORCC | FEATURE_VFP, 1498 SCREG, TDOUBLE, 1499 SCREG, TDOUBLE, 1500 0, RESCC, 1501 " fcmpd AL,AR" COM "double compare\n", }, 1502 1503 { OPLOG, FORCC, 1504 SBREG, TDOUBLE, 1505 SBREG, TDOUBLE, 1506 NSPECIAL, RESCC, 1507 "ZF", }, 1508 1509 { OPLOG, FORCC | FEATURE_FPA, 1510 SCREG, TLDOUBLE, 1511 SCREG, TLDOUBLE, 1512 NSPECIAL, RESCC, 1513 " cmfe AL,AR" COM "ldouble compare\n", }, 1514 1515 { OPLOG, FORCC | FEATURE_VFP, 1516 SCREG, TLDOUBLE, 1517 SCREG, TLDOUBLE, 1518 0, RESCC, 1519 " fcmpd AL,AR" COM "double compare\n", }, 1520 1521 { OPLOG, FORCC, 1522 SBREG, TLDOUBLE, 1523 SBREG, TLDOUBLE, 1524 NSPECIAL, RESCC, 1525 "ZF", }, 1526 1527 /* AND/OR/ER */ 1528 { AND, INBREG, 1529 SBREG, TLONGLONG|TULONGLONG, 1530 SBREG, TLONGLONG|TULONGLONG, 1531 NBREG|NBSL, RESC1|RESCC, 1532 " and A1,AL,AR" COM "64-bit and\n" 1533 " and U1,UL,UR\n", }, 1534 1535 { OR, INBREG, 1536 SBREG, TLONGLONG|TULONGLONG, 1537 SBREG, TLONGLONG|TULONGLONG, 1538 NBREG|NBSL, RESC1, 1539 " orr A1,AL,AR" COM "64-bit or\n" 1540 " orr U1,UL,UR\n" }, 1541 1542 { ER, INBREG, 1543 SBREG, TLONGLONG|TULONGLONG, 1544 SBREG, TLONGLONG|TULONGLONG, 1545 NBREG|NBSL, RESC1, 1546 " eor A1,AL,AR" COM "64-bit xor\n" 1547 " eor U1,UL,UR\n" }, 1548 1549 { OPSIMP, INAREG, 1550 SAREG, TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR, 1551 SAREG, TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR, 1552 NAREG|NASL, RESC1|RESCC, 1553 " O A1,AL,AR\n", }, 1554 1555 { OPSIMP, INAREG|FORCC, 1556 SAREG, TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR, 1557 SAREG, TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR, 1558 NAREG|NASL, RESC1, 1559 " Os A1,AL,AR\n", }, 1560 1561 1562 /* 1563 * Jumps. 1564 */ 1565 { GOTO, FOREFF, 1566 SCON, TANY, 1567 SANY, TANY, 1568 0, RNOP, 1569 " b LL\n", }, 1570 1571 #if 0 1572 { GOTO, FOREFF, 1573 SAREG, TANY, 1574 SANY, TANY, 1575 0, RNOP, 1576 " mov pc,AL\n", }, 1577 #endif 1578 1579 /* 1580 * Convert LTYPE to reg. 1581 */ 1582 1583 { OPLTYPE, INAREG, 1584 SANY, TANY, 1585 SOREG|SNAME, TWORD|TPOINT, 1586 NAREG, RESC1, 1587 " ldr A1,AL" COM "load word from memory\n", }, 1588 1589 { OPLTYPE, INBREG, 1590 SANY, TANY, 1591 SOREG|SNAME, TLONGLONG|TULONGLONG, 1592 NBREG, RESC1, 1593 " ldr A1,AL" COM "load long long from memory\n" 1594 " ldr U1,UL\n", }, 1595 1596 { OPLTYPE, INAREG, 1597 SANY, TANY, 1598 SOREG|SNAME, TCHAR, 1599 NAREG, RESC1, 1600 " ldrsb A1,AL" COM "load char from memory\n" }, 1601 1602 { OPLTYPE, INAREG, 1603 SANY, TANY, 1604 SOREG|SNAME, TUCHAR, 1605 NAREG, RESC1, 1606 " ldrb A1,AL" COM "load uchar from memory\n", }, 1607 1608 { OPLTYPE, INAREG | FEATURE_HALFWORDS, 1609 SANY, TANY, 1610 SOREG|SNAME, TSHORT, 1611 NAREG, RESC1, 1612 " ldrsh A1,AL" COM "load short from memory\n", }, 1613 1614 { OPLTYPE, INAREG | FEATURE_HALFWORDS, 1615 SANY, TANY, 1616 SOREG|SNAME, TUSHORT, 1617 NAREG, RESC1, 1618 " ldrh A1,AL" COM "load ushort from memory\n", }, 1619 1620 { OPLTYPE, INAREG, 1621 SANY, TANY, 1622 SOREG|SNAME, TSHORT|TUSHORT, 1623 2*NAREG, RESC1, 1624 "ZH", }, 1625 1626 #if 0 1627 { OPLTYPE, INAREG, 1628 SANY, TANY, 1629 SCON, TPOINT, 1630 NAREG, RESC1, 1631 " ldr A1,AL" COM "load integer constant\n", }, 1632 #endif 1633 1634 { OPLTYPE, INAREG, 1635 SANY, TANY, 1636 SCON, TANY, 1637 NAREG, RESC1, 1638 "ZI", }, 1639 1640 { OPLTYPE, INBREG, 1641 SANY, TANY, 1642 SCON, TANY, 1643 NBREG, RESC1, 1644 "ZJ", }, 1645 1646 { OPLTYPE, INAREG, 1647 SANY, TANY, 1648 SAREG, TANY, 1649 NAREG, RESC1, 1650 " mov A1,AL" COM "load AL into A1\n" }, 1651 1652 { OPLTYPE, INBREG, 1653 SANY, TANY, 1654 SBREG, TLONGLONG|TULONGLONG, 1655 NBREG, RESC1, 1656 " mov A1,AL" COM "load UL:AL into U1:A1\n" 1657 " mov U1,UL\n", }, 1658 1659 { OPLTYPE, INCREG | FEATURE_FPA, 1660 SANY, TANY, 1661 SOREG|SNAME, TFLOAT, 1662 NCREG, RESC1, 1663 " ldfs A1,AL" COM "load float\n", }, 1664 1665 { OPLTYPE, INCREG | FEATURE_VFP, 1666 SANY, TANY, 1667 SOREG|SNAME, TFLOAT, 1668 NCREG, RESC1, 1669 COM "not implemented\n", }, 1670 1671 { OPLTYPE, INAREG, 1672 SANY, TANY, 1673 SOREG|SNAME, TFLOAT, 1674 NAREG, RESC1, 1675 " ldr A1,AL" COM "load float (soft-float)\n", }, 1676 1677 { OPLTYPE, INCREG | FEATURE_FPA, 1678 SANY, TANY, 1679 SOREG|SNAME, TDOUBLE, 1680 NCREG, RESC1, 1681 " ldfd A1,AL" COM "load double\n", }, 1682 1683 { OPLTYPE, INCREG | FEATURE_VFP, 1684 SANY, TANY, 1685 SOREG|SNAME, TDOUBLE, 1686 NCREG, RESC1, 1687 COM "not implemented\n" }, 1688 1689 { OPLTYPE, INBREG, 1690 SANY, TANY, 1691 SOREG|SNAME, TDOUBLE, 1692 NBREG, RESC1, 1693 " ldr A1,AL" COM "load double (soft-float)\n" 1694 " ldr U1,UL\n", }, 1695 1696 { OPLTYPE, INCREG | FEATURE_FPA, 1697 SANY, TANY, 1698 SOREG|SNAME, TLDOUBLE, 1699 NCREG, RESC1, 1700 " ldfe A1,AL" COM "load ldouble\n", }, 1701 1702 { OPLTYPE, INCREG | FEATURE_VFP, 1703 SANY, TANY, 1704 SOREG|SNAME, TLDOUBLE, 1705 NCREG, RESC1, 1706 COM "not implemented\n", }, 1707 1708 { OPLTYPE, INBREG, 1709 SANY, TANY, 1710 SOREG|SNAME, TLDOUBLE, 1711 NBREG, RESC1, 1712 " ldr A1,AL" COM "load ldouble (soft-float)\n" 1713 " ldr U1,UL\n", }, 1714 1715 /* 1716 * Negate a word. 1717 */ 1718 1719 { UMINUS, INAREG, 1720 SAREG, TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR, 1721 SAREG, TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR, 1722 NAREG|NASL, RESC1, 1723 " rsb A1,AL,#0" COM "negation\n", }, 1724 1725 { UMINUS, INBREG, 1726 SBREG, TLONGLONG|TULONGLONG, 1727 SBREG, TLONGLONG|TULONGLONG, 1728 NBREG|NBSL, RESC1, 1729 " rsbs A1,AL,#0" COM "64-bit negation\n" 1730 " rsc U1,UL,#0\n", }, 1731 1732 { UMINUS, INCREG | FEATURE_FPA, 1733 SCREG, TFLOAT, 1734 SCREG, TFLOAT, 1735 NCREG, RESC1, 1736 " mvfs A1,AL" COM "float negation\n", }, 1737 1738 { UMINUS, INCREG | FEATURE_VFP, 1739 SCREG, TFLOAT, 1740 SCREG, TFLOAT, 1741 NCREG, RESC1, 1742 " negs A1,AL" COM "float negation\n", }, 1743 1744 { UMINUS, INAREG, 1745 SAREG, TFLOAT, 1746 SAREG, TFLOAT, 1747 NSPECIAL|NAREG, RESC1, 1748 "ZF", }, 1749 1750 { UMINUS, INCREG | FEATURE_FPA, 1751 SCREG, TDOUBLE, 1752 SCREG, TDOUBLE, 1753 NCREG, RESC1, 1754 " mvfd A1,AL" COM "double negation\n", }, 1755 1756 { UMINUS, INCREG | FEATURE_VFP, 1757 SCREG, TDOUBLE, 1758 SCREG, TDOUBLE, 1759 NCREG, RESC1, 1760 " negd A1,AL" COM "double negation\n", }, 1761 1762 { UMINUS, INBREG, 1763 SBREG, TDOUBLE, 1764 SBREG, TDOUBLE, 1765 NSPECIAL|NBREG, RESC1, 1766 "ZF", }, 1767 1768 { UMINUS, INCREG | FEATURE_FPA, 1769 SCREG, TLDOUBLE, 1770 SCREG, TLDOUBLE, 1771 NCREG, RESC1, 1772 " mvfe A1,AL" COM "ldouble negation\n", }, 1773 1774 { UMINUS, INCREG | FEATURE_VFP, 1775 SCREG, TLDOUBLE, 1776 SCREG, TLDOUBLE, 1777 NCREG, RESC1, 1778 " negd A1,AL" COM "ldouble negation\n", }, 1779 1780 { UMINUS, INBREG, 1781 SBREG, TLDOUBLE, 1782 SBREG, TLDOUBLE, 1783 NSPECIAL|NBREG, RESC1, 1784 "ZF", }, 1785 1786 { COMPL, INAREG, 1787 SAREG, TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR, 1788 SANY, TANY, 1789 NAREG|NASL, RESC1, 1790 " mvn A1,AL" COM "complement\n", }, 1791 1792 { COMPL, INBREG, 1793 SBREG, TLONGLONG|TULONGLONG, 1794 SANY, TANY, 1795 NBREG|NBSL, RESC1, 1796 " mvn A1,AL" COM "64-bit complement\n" 1797 " mvn U1,UL\n", }, 1798 1799 /* 1800 * Arguments to functions. 1801 */ 1802 1803 { FUNARG, FOREFF, 1804 SAREG, TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR, 1805 SANY, TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR, 1806 0, 0, 1807 " stmfd sp!,{AL}" COM "save function arg to stack\n", }, 1808 1809 { FUNARG, FOREFF, 1810 SBREG, TLONGLONG|TULONGLONG, 1811 SANY, TLONGLONG|TULONGLONG, 1812 0, 0, 1813 " stmfd sp!,{AL,UL}" COM "save function arg to stack (endianness problem here?)\n", }, 1814 1815 { FUNARG, FOREFF, 1816 SCREG, TFLOAT, 1817 SANY, TFLOAT, 1818 0, 0, 1819 " stmfd sp!,{AL}" COM "save function arg to stack\n", }, 1820 1821 { FUNARG, FOREFF, 1822 SCREG, TDOUBLE|TLDOUBLE, 1823 SANY, TDOUBLE|TLDOUBLE, 1824 0, 0, 1825 " stmfd sp!,{AL,UL}" COM "save function arg to stack (endianness problem here?)\n", }, 1826 1827 # define DF(x) FORREW,SANY,TANY,SANY,TANY,REWRITE,x,"" 1828 1829 { UMUL, DF( UMUL ), }, 1830 1831 { ASSIGN, DF(ASSIGN), }, 1832 1833 { STASG, DF(STASG), }, 1834 1835 { FLD, DF(FLD), }, 1836 1837 { OPLEAF, DF(NAME), }, 1838 1839 /* { INIT, DF(INIT), }, */ 1840 1841 { OPUNARY, DF(UMINUS), }, 1842 1843 { OPANY, DF(BITYPE), }, 1844 1845 { FREE, FREE, FREE, FREE, FREE, FREE, FREE, FREE, "help; I'm in trouble\n" }, 1846 }; 1847 1848 int tablesize = sizeof(table)/sizeof(table[0]); 1849