1; 2; Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc. 3; Contributed by Red Hat, Inc and Ubicom, Inc. 4; 5; This file is part of GNU CC. 6; 7; GNU CC is free software; you can redistribute it and/or modify 8; it under the terms of the GNU General Public License as published by 9; the Free Software Foundation; either version 2, or (at your option) 10; any later version. 11; 12; In addition to the permissions in the GNU General Public License, the 13; Free Software Foundation gives you unlimited permission to link the 14; compiled version of this file with other programs, and to distribute 15; those programs without any restriction coming from the use of this 16; file. (The General Public License restrictions do apply in other 17; respects; for example, they cover modification of the file, and 18; distribution when not linked into another program.) 19; 20; GNU CC is distributed in the hope that it will be useful, 21; but WITHOUT ANY WARRANTY; without even the implied warranty of 22; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 23; GNU General Public License for more details. 24; 25; You should have received a copy of the GNU General Public License 26; along with GNU CC; see the file COPYING. If not, write to 27; the Free Software Foundation, 59 Temple Place - Suite 330, 28; Boston, MA 02111-1307, USA. */ 29 30/******************************************************* 31 load byte from arbitrary memory 32 address passed in first bank register, result in W 33 34*******************************************************/ 35 .macro movb to, from 36 mov w, \from 37 mov \to, w 38 .endm 39 40 41#if defined (L_indcall) 42/* __indcall - given register containing an address, call the function 43 * at that address. 44 */ 45 46 .sect .pram.libgcc,"ax" 47 .global __indcall 48 .func _indcall,__indcall 49 50__indcall: 51 page 1f 52 call 1f 531: pop callh ; Get the call target 54 pop calll 55 ret ; Transfer to new function 56 57 .endfunc 58#endif 59 60 61#if defined (L_mulhi3) 62 .sect .pram.libgcc,"ax" 63 .global __mulhi3 64 .func _mulhi3, __mulhi3 65 66__mulhi3: 67 mov w, 2(SP) ; First upper half partial product 68 mulu w, 3(SP) 69 mov 3(SP), w 70 mov w, 1(SP) ; Second upper half partial product 71 mulu w, 4(SP) 72 add 3(SP), w 73 mov w, 2(SP) ; Lower half partial product 74 mulu w, 4(SP) 75 mov 4(SP), w 76 mov w, MULH 77 add 3(SP), w 78 79 mov w, #2 ; Adjust the stack leaving the result to 80 add spl, w ; be popped off later. 81 ret 82 83 .endfunc 84 85#endif /* defined (L_mulhi3) */ 86 87#if defined (L_mulsi3) 88/******************************************************* 89 Multiplication 32 x 32 90*******************************************************/ 91 92 .sect .text.libgcc,"ax" 93 .global __mulsi3 94 .func _mulsi3, __mulsi3 95 96__mulsi3: 97 clr $80 ; Assume zero result 98 clr $81 99 clr $82 100 clr $83 101 1022: mov w, 1(sp) 103 or w, 2(sp) 104 or w, 3(sp) 105 or w, 4(sp) 106 snz ; Any more significant bits to multiply? 107 page 3f 108 jmp 3f 109 110 sb 4(sp), 0 ; Check LSB of multiplier 111 page 1f ; zero => scale multiplicand & multiplier 112 jmp 1f 113 114 mov w, 8(sp) ; Accumulate product 115 add $83, w 116 mov w, 7(sp) 117 addc $82, w 118 mov w, 6(sp) 119 addc $81, w 120 mov w, 5(sp) 121 addc $80, w 1221: clrb status, 0 ; scale multiplier down 123 rr 1(sp) 124 rr 2(sp) 125 rr 3(sp) 126 rr 4(sp) 127 clrb status, 0 128 rl 8(sp) 129 rl 7(sp) 130 rl 6(sp) 131 rl 5(sp) 132 page 2b 133 jmp 2b 134 1353: mov w, #8 136 add spl ,w 137 ret 138 139 .endfunc 140 141#endif /* defined (L_mulsi3) */ 142 143#if defined (L_muldi3) 144/******************************************************* 145 Multiplication 64 x 64 146*******************************************************/ 147 148 .sect .text.libgcc,"ax" 149 .global __muldi3 150 .func _muldi3, __muldi3 151 152__muldi3: 153 clr $80 ; Assume zero result 154 clr $81 155 clr $82 156 clr $83 157 clr $84 158 clr $85 159 clr $86 160 clr $87 161 1622: mov w, 1(sp) 163 or w, 2(sp) 164 or w, 3(sp) 165 or w, 4(sp) 166 or w, 5(sp) 167 or w, 6(sp) 168 or w, 7(sp) 169 or w, 8(sp) 170 snz ; Any more significant bits to multiply? 171 page 3f 172 jmp 3f 173 174 sb 8(sp), 0 ; Check LSB of multiplier 175 page 1f ; zero => scale multiplicand & multiplier 176 jmp 1f 177 178 mov w, 16(sp) ; Accumulate product 179 add $87, w 180 mov w, 15(sp) 181 addc $86, w 182 mov w, 14(sp) 183 addc $85, w 184 mov w, 13(sp) 185 addc $84, w 186 mov w, 12(sp) 187 addc $83, w 188 mov w, 11(sp) 189 addc $82, w 190 mov w, 10(sp) 191 addc $81, w 192 mov w, 9(sp) 193 addc $80, w 194 1951: clrb status, 0 ; scale multiplier down 196 rr 1(sp) 197 rr 2(sp) 198 rr 3(sp) 199 rr 4(sp) 200 rr 5(sp) 201 rr 6(sp) 202 rr 7(sp) 203 rr 8(sp) 204 clrb status, 0 205 rl 16(sp) 206 rl 15(sp) 207 rl 14(sp) 208 rl 13(sp) 209 rl 12(sp) 210 rl 11(sp) 211 rl 10(sp) 212 rl 9(sp) 213 page 2b 214 jmp 2b 215 2163: mov w, #16 217 add spl, w 218 ret 219 220 .endfunc 221 222#endif /* defined (L_muldi3) */ 223 224#if defined (L_divmodhi4) 225#define arg1h 1(SP) 226#define arg1l 2(SP) 227#define arg2h 3(SP) 228#define arg2l 4(SP) 229#define resl $81 230#define resh $80 231#define reml $83 232#define remh $82 233#define tmp_var $84 234#define cnt $85 235#define arg1_sign $86 236#define res_sign $87 237 238 .sect .text.libgcc,"ax" 239 .global __divmodhi4 240 .func _divmodhi4, __divmodhi4 241 242__divmodhi4: 243 mov w,arg2h 244 mov res_sign,w 245 mov w,arg1h 246 mov arg1_sign,w 247 xor res_sign,w 248 249 sb arg1h,7 250 page 1f 251 jmp 1f 252 253 not arg1h 254 not arg1l 255 incsnz arg1l 256 inc arg1h 257 2581: sb arg2h, 7 259 page 1f 260 jmp 1f 261 262 not arg2h 263 not arg2l 264 incsnz arg2l 265 inc arg2h 266 2671: page __udivmodhi4 ; Do the unsigned div/mod 268 call __udivmodhi4 269 270 sb arg1_sign, 7 271 page 1f 272 jmp 1f 273 274 not reml 275 not remh 276 incsnz reml 277 inc remh 278 2791: sb res_sign, 7 280 ret 281 282 not resl 283 not resh 284 incsnz resl 285 inc resh 286 ret 287 288 .endfunc 289 290#undef arg1h 291#undef arg1l 292#undef arg2h 293#undef arg2l 294#undef resl 295#undef resh 296#undef reml 297#undef remh 298#undef tmp_var 299#undef cnt 300#undef arg1_sign 301#undef res_sign 302 303#endif /* defined (L_divmodhi4) */ 304 305#if defined (L_udivmodhi4) 306 307#define arg1h 1(SP) 308#define arg1l 2(SP) 309#define arg2h 3(SP) 310#define arg2l 4(SP) 311#define resl $81 312#define resh $80 313#define reml $83 314#define remh $82 315#define tmp_var $84 316#define cnt $85 317 318 .sect .text.libgcc,"ax" 319 .global __udivmodhi4 320 .func _udivmodhi4, __udivmodhi4 321 322__udivmodhi4: 323 clr reml 324 clr remh 325 mov w, #17 326 mov cnt,w 327 clrb status, 0 328 page 1f 329 jmp 1f 330 3312: rl reml 332 rl remh 333 mov w, arg2l 334 sub w, reml 335 mov tmp_var, w 336 mov w, arg2h 337 subc w, remh 338 sc 339 page 1f 340 jmp 1f 341 mov remh, w 342 mov w, tmp_var 343 mov reml, w 344 3451: rl arg1l 346 rl arg1h 347 decsz cnt 348 page 2b 349 jmp 2b 350 351 pop resh 352 pop resl 353 mov w, #2 354 add spl, w 355 ret 356 357 .endfunc 358 359#undef arg1h 360#undef arg1l 361#undef arg2h 362#undef arg2l 363#undef resl 364#undef resh 365#undef reml 366#undef remh 367#undef tmp_var 368#undef cnt 369 370#endif /* defined (L_udivmodhi4) */ 371 372#if defined (L_divmodsi4) 373 374#define arg1a 1(SP) 375#define arg1b 2(SP) 376#define arg1c 3(SP) 377#define arg1d 4(SP) 378 379#define arg2a 5(SP) 380#define arg2b 6(SP) 381#define arg2c 7(SP) 382#define arg2d 8(SP) 383 384#define resa $80 385#define resb $81 386#define resc $82 387#define resd $83 388 389#define rema $84 390#define remb $85 391#define remc $86 392#define remd $87 393 394#define tmp_var $88 395#define tmp_var1 $89 396#define tmp_var2 $8a 397#define cnt $8b 398#define arg1_sign $8c 399#define res_sign $8d 400 401 .sect .text.libgcc,"ax" 402 .global __divmodsi4 403 .func _divmodsi4, __divmodsi4 404 405__divmodsi4: 406 mov w, arg2a 407 mov res_sign, w 408 mov w, arg1a 409 mov arg1_sign, w 410 xor res_sign, w 411 412 sb arg1a, 7 413 page 1f 414 jmp 1f 415 416 not arg1d 417 not arg1c 418 not arg1b 419 not arg1a 420 incsnz arg1d 421 incsz arg1c 422 page 1f 423 jmp 1f 424 incsnz arg1b 425 inc arg1a 426 4271: sb arg2a, 7 428 page 1f 429 jmp 1f 430 431 not arg2d 432 not arg2c 433 not arg2b 434 not arg2a 435 incsnz arg2d 436 incsz arg2c 437 page 1f 438 jmp 1f 439 incsnz arg2b 440 inc arg2a 441 4421: page __udivmodsi4 ; Do the unsigned div/mod. 443 call __udivmodsi4 444 445 sb arg1_sign, 7 446 page 1f 447 jmp 1f 448 449 not remd 450 not remc 451 not remb 452 not rema 453 incsnz remd 454 incsz remc 455 page 1f 456 jmp 1f 457 incsnz remb 458 inc rema 459 4601: sb res_sign, 7 461 ret 462 463 not resd 464 not resc 465 not resb 466 not resa 467 incsnz resd 468 incsz resc 469 ret 470 incsnz resb 471 inc resa 472 ret 473 474 .endfunc 475 476#undef arg1a 477#undef arg1b 478#undef arg1c 479#undef arg1d 480 481#undef arg2a 482#undef arg2b 483#undef arg2c 484#undef arg2d 485 486#undef resa 487#undef resb 488#undef resc 489#undef resd 490 491#undef rema 492#undef remb 493#undef remc 494#undef remd 495 496#undef tmp_var 497#undef tmp_var1 498#undef tmp_var2 499#undef cnt 500#undef arg1_sign 501#undef res_sign 502 503#endif /* defined (L_divmodsi4) */ 504 505#if defined (L_udivmodsi4) 506#define arg1a 1(SP) 507#define arg1b 2(SP) 508#define arg1c 3(SP) 509#define arg1d 4(SP) 510 511#define arg2a 5(SP) 512#define arg2b 6(SP) 513#define arg2c 7(SP) 514#define arg2d 8(SP) 515 516#define resa $80 517#define resb $81 518#define resc $82 519#define resd $83 520 521#define rema $84 522#define remb $85 523#define remc $86 524#define remd $87 525 526#define tmp_var $88 527#define tmp_var1 $89 528#define tmp_var2 $8a 529#define cnt $8b 530 531 .sect .text.libgcc,"ax" 532 .global __udivmodsi4 533 .func _udivmodsi4, __udivmodsi4 534 535__udivmodsi4: 536 clr remd 537 clr remc 538 clr remb 539 clr rema 540 mov w, #33 541 mov cnt, w 542 clrb status, 0 543 page 1f 544 jmp 1f 545 5462: rl remd 547 rl remc 548 rl remb 549 rl rema 550 mov w, arg2d 551 sub w, remd 552 mov tmp_var, w 553 mov w, arg2c 554 subc w, remc 555 mov tmp_var1, w 556 mov w, arg2b 557 subc w, remb 558 mov tmp_var2, w 559 mov w, arg2a 560 subc w, rema 561 sc 562 page 1f 563 jmp 1f 564 565 mov rema, w 566 mov w, tmp_var2 567 mov remb, w 568 mov w, tmp_var1 569 mov remc, w 570 mov w, tmp_var 571 mov remd, w 572 5731: rl arg1d 574 rl arg1c 575 rl arg1b 576 rl arg1a 577 decsz cnt 578 page 2b 579 jmp 2b 580 581 pop resa 582 pop resb 583 pop resc 584 pop resd 585 mov w, #4 586 add spl, w 587 ret 588 589 .endfunc 590 591#undef arg1a 592#undef arg1b 593#undef arg1c 594#undef arg1d 595 596#undef arg2a 597#undef arg2b 598#undef arg2c 599#undef arg2d 600 601#undef resa 602#undef resb 603#undef resc 604#undef resd 605 606#undef rema 607#undef remb 608#undef remc 609#undef remd 610 611#undef tmp_var 612#undef tmp_var1 613#undef tmp_var2 614#undef cnt 615 616#endif /* defined (L_udivmodsi4) */ 617 618#if defined (L_divmoddi4) 619 620#define arg1s 1(SP) 621#define arg1t 2(SP) 622#define arg1u 3(SP) 623#define arg1v 4(SP) 624#define arg1w 5(SP) 625#define arg1x 6(SP) 626#define arg1y 7(SP) 627#define arg1z 8(SP) 628 629#define arg2s 9(SP) 630#define arg2t 10(SP) 631#define arg2u 11(SP) 632#define arg2v 12(SP) 633#define arg2w 13(SP) 634#define arg2x 14(SP) 635#define arg2y 15(SP) 636#define arg2z 16(SP) 637 638#define ress $80 639#define rest $81 640#define resu $82 641#define resv $83 642#define resw $84 643#define resx $85 644#define resy $86 645#define resz $87 646 647#define rems $88 648#define remt $89 649#define remu $8a 650#define remv $8b 651#define remw $8c 652#define remx $8d 653#define remy $8e 654#define remz $8f 655 656#define tmp_var $90 657#define tmp_var1 $91 658#define tmp_var2 $92 659#define tmp_var3 $93 660#define tmp_var4 $94 661#define tmp_var5 $95 662#define tmp_var6 $96 663#define cnt $97 664 665 .sect .text.libgcc,"ax" 666 .global __divmoddi4 667 .func _divmoddi4, __divmoddi4 668 669__divmoddi4: 670 rl w, arg2s ; Use MULH to track sign bits. 671 rl MULH 672 rl w, arg1s 673 rl WREG 674 xor MULH, w 675 rl w, arg1s 676 rl MULH 677 678 sb arg1s, 7 679 page 1f 680 jmp 1f 681 682 not arg1s 683 not arg1t 684 not arg1u 685 not arg1v 686 not arg1w 687 not arg1x 688 not arg1y 689 not arg1z 690 incsnz arg1z 691 incsz arg1y 692 page 1f 693 jmp 1f 694 incsnz arg1x 695 incsz arg1w 696 page 1f 697 jmp 1f 698 incsnz arg1v 699 incsz arg1u 700 page 1f 701 jmp 1f 702 incsnz arg1t 703 inc arg1s 704 7051: sb arg2s, 7 706 page 1f 707 jmp 1f 708 709 not arg2s 710 not arg2t 711 not arg2u 712 not arg2v 713 not arg2w 714 not arg2x 715 not arg2y 716 not arg2z 717 incsnz arg2z 718 incsz arg2y 719 page 1f 720 jmp 1f 721 incsnz arg2x 722 incsz arg2w 723 page 1f 724 jmp 1f 725 incsnz arg2v 726 incsz arg2u 727 page 1f 728 jmp 1f 729 incsnz arg2t 730 inc arg2s 731 7321: page __udivmoddi4 ; Do the unsigned div/mod. 733 call __udivmoddi4 734 735 sb MULH, 0 ; Look at the save sign bit for arg 1. 736 page 1f 737 jmp 1f 738 739 not rems 740 not remt 741 not remu 742 not remv 743 not remw 744 not remx 745 not remy 746 not remz 747 incsnz remz 748 incsz remy 749 page 1f 750 jmp 1f 751 incsnz remx 752 incsz remw 753 page 1f 754 jmp 1f 755 incsnz remv 756 incsz remu 757 page 1f 758 jmp 1f 759 incsnz remt 760 inc rems 761 7621: sb MULH, 1 763 ret 764 765 not ress 766 not rest 767 not resu 768 not resv 769 not resw 770 not resx 771 not resy 772 not resz 773 incsnz resz 774 incsz resy 775 ret 776 incsnz resx 777 incsz resw 778 ret 779 incsnz resv 780 incsz resu 781 ret 782 incsnz rest 783 inc ress 784 ret 785 786 .endfunc 787 788#undef arg1s 789#undef arg1t 790#undef arg1u 791#undef arg1v 792#undef arg1w 793#undef arg1x 794#undef arg1y 795#undef arg1z 796 797#undef arg2s 798#undef arg2t 799#undef arg2u 800#undef arg2v 801#undef arg2w 802#undef arg2x 803#undef arg2y 804#undef arg2z 805 806#undef ress 807#undef rest 808#undef resu 809#undef resv 810#undef resw 811#undef resx 812#undef resy 813#undef resz 814 815#undef rems 816#undef remt 817#undef remu 818#undef remv 819#undef remw 820#undef remx 821#undef remy 822#undef remz 823 824#undef tmp_var 825#undef tmp_var1 826#undef tmp_var2 827#undef tmp_var3 828#undef tmp_var4 829#undef tmp_var5 830#undef tmp_var6 831#undef cnt 832 833#endif /* defined (L_divmoddi4) */ 834 835#if defined (L_udivmoddi4) 836#define arg1s 1(SP) 837#define arg1t 2(SP) 838#define arg1u 3(SP) 839#define arg1v 4(SP) 840#define arg1w 5(SP) 841#define arg1x 6(SP) 842#define arg1y 7(SP) 843#define arg1z 8(SP) 844 845#define arg2s 9(SP) 846#define arg2t 10(SP) 847#define arg2u 11(SP) 848#define arg2v 12(SP) 849#define arg2w 13(SP) 850#define arg2x 14(SP) 851#define arg2y 15(SP) 852#define arg2z 16(SP) 853 854#define ress $80 855#define rest $81 856#define resu $82 857#define resv $83 858#define resw $84 859#define resx $85 860#define resy $86 861#define resz $87 862 863#define rems $88 864#define remt $89 865#define remu $8a 866#define remv $8b 867#define remw $8c 868#define remx $8d 869#define remy $8e 870#define remz $8f 871 872#define tmp_var $90 873#define tmp_var1 $91 874#define tmp_var2 $92 875#define tmp_var3 $93 876#define tmp_var4 $94 877#define tmp_var5 $95 878#define tmp_var6 $96 879#define cnt $97 880 881 .sect .text.libgcc,"ax" 882 .global __udivmoddi4 883 .func _udivmoddi4, __udivmoddi4 884 885__udivmoddi4: 886 clr rems 887 clr remt 888 clr remu 889 clr remv 890 clr remw 891 clr remx 892 clr remy 893 clr remz 894 mov w, #65 895 mov cnt, w 896 clrb status, 0 897 page 1f 898 jmp 1f 899 9002: rl remz 901 rl remy 902 rl remx 903 rl remw 904 rl remv 905 rl remu 906 rl remt 907 rl rems 908 mov w, arg2z 909 sub w, remz 910 mov tmp_var, w 911 mov w, arg2y 912 subc w, remy 913 mov tmp_var1, w 914 mov w, arg2x 915 subc w, remx 916 mov tmp_var2, w 917 mov w, arg2w 918 subc w, remw 919 mov tmp_var3, w 920 mov w, arg2v 921 subc w, remv 922 mov tmp_var4, w 923 mov w, arg2u 924 subc w, remu 925 mov tmp_var5, w 926 mov w, arg2t 927 subc w, remt 928 mov tmp_var6, w 929 mov w, arg2s 930 subc w, rems 931 sc 932 page 1f 933 jmp 1f 934 935 mov rems, w 936 mov w, tmp_var6 937 mov remt, w 938 mov w, tmp_var5 939 mov remu, w 940 mov w, tmp_var4 941 mov remv, w 942 mov w, tmp_var3 943 mov remw, w 944 mov w, tmp_var2 945 mov remx, w 946 mov w, tmp_var1 947 mov remy, w 948 mov w, tmp_var 949 mov remz, w 950 9511: rl arg1z 952 rl arg1y 953 rl arg1x 954 rl arg1w 955 rl arg1v 956 rl arg1u 957 rl arg1t 958 rl arg1s 959 decsz cnt 960 page 2b 961 jmp 2b 962 963 pop ress 964 pop rest 965 pop resu 966 pop resv 967 pop resw 968 pop resx 969 pop resy 970 pop resz 971 mov w, #8 972 add spl, w 973 ret 974 975 .endfunc 976 977#undef arg1s 978#undef arg1t 979#undef arg1u 980#undef arg1v 981#undef arg1w 982#undef arg1x 983#undef arg1y 984#undef arg1z 985 986#undef arg2s 987#undef arg2t 988#undef arg2u 989#undef arg2v 990#undef arg2w 991#undef arg2x 992#undef arg2y 993#undef arg2z 994 995#undef ress 996#undef rest 997#undef resu 998#undef resv 999#undef resw 1000#undef resx 1001#undef resy 1002#undef resz 1003 1004#undef rems 1005#undef remt 1006#undef remu 1007#undef remv 1008#undef remw 1009#undef remx 1010#undef remy 1011#undef remz 1012 1013#undef tmp_var 1014#undef tmp_var1 1015#undef tmp_var2 1016#undef tmp_var3 1017#undef tmp_var4 1018#undef tmp_var5 1019#undef tmp_var6 1020#undef cnt 1021 1022#endif /* defined (L_udivmoddi4) */ 1023 1024#define LT #0 1025#define EQ #1 1026#define GT #2 1027 1028#if defined(L_cmphi2) 1029#define arg1l 2(sp) 1030#define arg1h 1(sp) 1031#define arg2l 4(sp) 1032#define arg2h 3(sp) 1033 1034 .sect .text.libgcc,"ax" 1035 .global __cmphi2 1036 .global __cmp_ret 1037 .global __cmpqi_ret 1038 .func _cmphi2, __cmphi2 1039 1040__cmphi2: 1041 mov w,arg1l 1042 sub w,arg2l 1043 snz 1044 page 2f 1045 jmp 2f 1046 mov w,arg1h 10471: 1048 subc w,arg2h 1049 clr arg2l 1050 rl arg2l 1051 snb arg1h,7 1052 setb arg2l,2 1053 snb arg2h,7 1054 setb arg2l,1 1055 mov w,#3 1056 1057__cmp_ret: 1058 add spl,w ; sign1 1059 pop wreg ; sign2 1060 1061__cmpqi_ret: 1062 add pcl,w ; carry of arg1 - arg2 1063 retw GT ; [000] arg1 > arg2 1064 retw LT ; [001] arg1 < arg2 1065 retw GT ; [010] arg1 > arg2 1066 retw GT ; [011] arg1 > arg2 1067 retw LT ; [100] arg1 < arg2 1068 retw LT ; [101] arg1 < arg2 1069 retw GT ; [110] arg1 > arg2 1070 retw LT ; [111] arg1 < arg2 10712: 1072 mov w,arg1h 1073 cse w,arg2h 1074 page 1b 1075 jmp 1b 1076 mov w,#4 1077 add spl,w 1078 retw EQ 1079 1080 .endfunc 1081#undef arg1l 1082#undef arg1h 1083#undef arg2l 1084#undef arg2h 1085#endif /* L_cmphi2 */ 1086 1087#if defined(L_cmpqi2) 1088#define arg1 1(sp) 1089#define arg2 2(sp) 1090 1091 .sect .text.libgcc,"ax" 1092 .global __cmpqi2 1093 .func _cmpqi2, __cmpqi2 1094 1095__cmpqi2: 1096 mov w, arg1 1097 sub w, arg2 1098 snz 1099 page 2f 1100 jmp 2f 1101 1102 clr wreg 1103 rl wreg 1104 snb arg1, 7 1105 setb wreg, 2 1106 snb arg2, 7 1107 setb wreg, 1 1108 inc spl 1109 inc spl 1110 page __cmpqi_ret 1111 jmp __cmpqi_ret 1112 11132: mov w, #2 1114 add spl, w 1115 retw EQ 1116 1117 .endfunc 1118#undef arg1l 1119#undef arg2l 1120#endif /* L_cmpqi2 */ 1121 1122#if defined(L_cmpsi2) 1123#define arg1d 4(sp) 1124#define arg1c 3(sp) 1125#define arg1b 2(sp) 1126#define arg1a 1(sp) 1127#define arg2d 8(sp) 1128#define arg2c 7(sp) 1129#define arg2b 6(sp) 1130#define arg2a 5(sp) 1131 1132 .sect .text.libgcc,"ax" 1133 .global __cmpsi2 1134 .func _cmpsi2, __cmpsi2 1135 1136__cmpsi2: 1137 mov w, arg1d 1138 sub w, arg2d 1139 snz 1140 page 2f 1141 jmp 2f 1142 11431: mov w, arg1c 1144 subc w, arg2c 1145 mov w, arg1b 1146 subc w, arg2b 1147 mov w, arg1a 1148 subc w, arg2a 1149 1150 clr arg2d 1151 rl arg2d 1152 snb arg1a, 7 1153 setb arg2d, 2 1154 snb arg2a, 7 1155 setb arg2d, 1 1156 mov w, #7 1157 page __cmp_ret 1158 jmp __cmp_ret 1159 11602: mov w, arg1c 1161 cse w, arg2c 1162 page 1b 1163 jmp 1b 1164 1165 mov w, arg1b 1166 cse w, arg2b 1167 page 1b 1168 jmp 1b 1169 1170 mov w, arg1a 1171 cse w, arg2a 1172 page 1b 1173 jmp 1b 1174 1175 mov w, #8 1176 add spl, w 1177 retw EQ 1178 1179 .endfunc 1180 1181#undef arg1d 1182#undef arg1c 1183#undef arg1b 1184#undef arg1a 1185#undef arg2d 1186#undef arg2c 1187#undef arg2b 1188#undef arg2a 1189#endif /* L_cmpsi2 */ 1190 1191#if defined(L_cmpdi2) 1192#define arg1z 8(sp) 1193#define arg1y 7(sp) 1194#define arg1x 6(sp) 1195#define arg1w 5(sp) 1196#define arg1v 4(sp) 1197#define arg1u 3(sp) 1198#define arg1t 2(sp) 1199#define arg1s 1(sp) 1200 1201#define arg2z 16(sp) 1202#define arg2y 15(sp) 1203#define arg2x 14(sp) 1204#define arg2w 13(sp) 1205#define arg2v 12(sp) 1206#define arg2u 11(sp) 1207#define arg2t 10(sp) 1208#define arg2s 9(sp) 1209 1210 .sect .text.libgcc,"ax" 1211 .global __cmpdi2 1212 .func _cmpdi2, __cmpdi2 1213 1214__cmpdi2: 1215 mov w, arg1z 1216 sub w, arg2z 1217 snz 1218 page 2f 1219 jmp 2f 1220 12211: mov w, arg1y 1222 subc w, arg2y 1223 mov w, arg1x 1224 subc w, arg2x 1225 mov w, arg1w 1226 subc w, arg2w 1227 mov w, arg1v 1228 subc w, arg2v 1229 mov w, arg1u 1230 subc w, arg2u 1231 mov w, arg1t 1232 subc w, arg2t 1233 mov w, arg1s 1234 subc w, arg2s 1235 clr arg2z 1236 rl arg2z 1237 snb arg1s, 7 1238 setb arg2z, 2 1239 snb arg2s, 7 1240 setb arg2z, 1 1241 mov w, #15 1242 page __cmp_ret 1243 jmp __cmp_ret 1244 12452: mov w, arg1y 1246 cse w, arg2y 1247 page 1b 1248 jmp 1b 1249 1250 mov w, arg1x 1251 cse w, arg2x 1252 page 1b 1253 jmp 1b 1254 1255 mov w, arg1w 1256 cse w, arg2w 1257 page 1b 1258 jmp 1b 1259 1260 mov w, arg1v 1261 cse w, arg2v 1262 page 1b 1263 jmp 1b 1264 1265 mov w, arg1u 1266 cse w, arg2u 1267 page 1b 1268 jmp 1b 1269 1270 mov w, arg1t 1271 cse w, arg2t 1272 page 1b 1273 jmp 1b 1274 1275 mov w, arg1s 1276 cse w, arg2s 1277 page 1b 1278 jmp 1b 1279 1280 mov w, #16 1281 add spl, w 1282 retw EQ 1283 1284 .endfunc 1285 1286#undef arg1z 1287#undef arg1y 1288#undef arg1x 1289#undef arg1w 1290#undef arg1v 1291#undef arg1u 1292#undef arg1t 1293#undef arg1s 1294#undef arg2z 1295#undef arg2y 1296#undef arg2x 1297#undef arg2w 1298#undef arg2v 1299#undef arg2u 1300#undef arg2t 1301#undef arg2s 1302 1303#endif /* L_cmpdi2 */ 1304 1305#if defined(L_cmpdi2_dp) 1306 .sect .text.libgcc,"ax" 1307 .global __cmpdi2_dp 1308 .func _cmpdi2_dp, __cmpdi2_dp 1309 1310__cmpdi2_dp: 1311 push 7(dp) 1312 push 6(dp) 1313 push 5(dp) 1314 push 4(dp) 1315 push 3(dp) 1316 push 2(dp) 1317 push 1(dp) 1318 push (dp) 1319 page __cmpdi2 1320 jmp __cmpdi2 1321 1322 .endfunc 1323#endif /* L_cmpdi2_dp */ 1324 1325#if defined(L_fp_pop_args_ret) 1326 .sect .pram.libgcc,"ax" 1327 .global __fp_pop_args_ret 1328 .global __pop_args_ret 1329 .global __pop2_args_ret 1330 .func __fp_pop2_args_ret, __fp_pop2_args_ret 1331 1332__fp_pop2_args_ret: 1333 mov w, #2 1334__fp_pop_args_ret: 1335 pop 0xfd 1336 pop 0xfe 1337__pop_args_ret: 1338 pop callh 1339 pop calll 1340 add spl, w 1341 ret 1342 1343 .endfunc 1344#endif /* L_fp_pop_args_ret */ 1345 1346#if defined(L__pop2_args_ret) 1347 .sect .pram.libgcc,"ax" 1348 .global __pop2_args_ret 1349 .func __pop2_args_ret, __pop2_args_ret 1350 1351__pop2_args_ret: 1352 mov w, #2 1353 pop callh 1354 pop calll 1355 add spl, w 1356 ret 1357 1358 .endfunc 1359#endif /* L__pop2_args_ret */ 1360 1361#if defined(L_leaf_fp_pop_args_ret) 1362 .sect .pram.libgcc,"ax" 1363 .global __leaf_fp_pop_args_ret, __leaf_fp_pop2_args_ret 1364 .func __leaf_fp2_pop_args_ret, __leaf_fp_pop2_args_ret 1365 1366__leaf_fp_pop2_args_ret: 1367 mov w, #2 1368__leaf_fp_pop_args_ret: 1369 pop 0xfd 1370 pop 0xfe 1371 add spl, w 1372 ret 1373 1374 .endfunc 1375#endif /* L_leaf_fp_pop_args_ret */ 1376 1377#if defined(L_movstrhi_countqi) 1378 .sect .pram.libgcc,"ax" 1379 .global __movstrhi_countqi 1380 .func _movstrhi_countqi, __movstrhi_countqi 1381 1382__movstrhi_countqi: 1383 push dph ; Save our pointer regs 1384 push dpl 1385 push iph 1386 push ipl 1387 1388 mov w, 5(SP) ; Get our dest pointer 1389 mov dph, w 1390 mov w, 6(SP) 1391 mov dpl, w 1392 mov w, 7(SP) ; And our source pointer 1393 mov iph, w 1394 mov w, 8(SP) 1395 mov ipl, w 1396 13971: push (IP) ; *dest++ = *src++ 1398 pop 0(DP) 1399 inc ipl 1400 inc dpl 1401 decsz 9(SP) ; Loop until completed 1402 page 1b 1403 jmp 1b 1404 1405 pop ipl ; Restore our pointer regs 1406 pop iph 1407 pop dpl 1408 pop dph 1409 1410 mov w, #5 ; Tidy up our stack args 1411 add spl, w 1412 ret 1413 1414 .endfunc 1415#endif 1416 1417#if defined(L_movstrhi_counthi) 1418 .sect .text.libgcc,"ax" 1419 .global __movstrhi_counthi 1420 .func _movstrhi_counthi, __movstrhi_counthi 1421 1422__movstrhi_counthi: 1423 push dph ; Save our pointer regs 1424 push dpl 1425 push iph 1426 push ipl 1427 1428 mov w, 5(SP) ; Get our dest pointer 1429 mov dph, w 1430 mov w, 6(SP) 1431 mov dpl, w 1432 mov w, 7(SP) ; And our source pointer 1433 mov iph, w 1434 mov w, 8(SP) 1435 mov ipl, w 1436 1437 test 10(SP) ; If we have a nonzero LSB then adjust the 1438 sz ; MSB of the loop count to allow us to use 1439 inc 9(SP) ; skip tricks! 1440 14411: push (IP) ; *dest++ = *src++ 1442 pop 0(DP) 1443 inc ipl 1444 inc dpl 1445 decsnz 10(SP) ; Loop until completed - note the skip trick 1446 decsz 9(SP) ; on the MSB! 1447 page 1b 1448 jmp 1b 1449 1450 pop ipl ; Restore our pointer regs 1451 pop iph 1452 pop dpl 1453 pop dph 1454 1455 mov w, #6 ; Tidy up our stacked args. 1456 add spl, w 1457 ret 1458 1459 .endfunc 1460#endif 1461 1462#if defined(L_exit) 1463 .sect .text.libgcc,"ax" 1464 .global __exit 1465 .global _exit 1466 .func _exit, __exit 1467 .weak __exit 1468 .weak _exit 1469 1470_exit: 1471__exit: 1472 pop $88 1473 pop wreg 1474 or w, $88 1475 push wreg 1476 push #0 1477 push #1 1478 system ; Exit wreg 1479 page __exit ; Never return 1480 jmp __exit 1481 1482 .endfunc 1483#endif 1484 1485#if defined(Labort) 1486 .sect .text.libgcc,"ax" 1487 .global _abort 1488 .func abort, _abort 1489 1490_abort: 1491 push #1 1492 push #0 1493 push #1 1494 system ; Exit 1 1495 ret 1496 1497 .endfunc 1498#endif 1499 1500#if defined(Lwrite) 1501 /* Dummy entrypoint to suppress problems with glue code. */ 1502 .sect .text.libgcc,"ax" 1503 .global _write 1504 .func write, _write 1505;; 1506;; write (fil,buf,len) - say that write succeeds.... 1507;; 1508_write: 1509 movb $80, 5(SP) 1510 movb $81, 6(SP) ; Return length written 1511 mov w, #6 1512 add spl, w 1513 ret 1514 1515 .endfunc 1516#endif 1517