18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci#include "libgcc.h" 38c2ecf20Sopenharmony_ci 48c2ecf20Sopenharmony_ci; numerator in A0/A1 58c2ecf20Sopenharmony_ci; denominator in A2/A3 68c2ecf20Sopenharmony_ci .global __modsi3 78c2ecf20Sopenharmony_ci__modsi3: 88c2ecf20Sopenharmony_ci PUSHP S2P 98c2ecf20Sopenharmony_ci bsr modnorm 108c2ecf20Sopenharmony_ci bsr __divsi3 118c2ecf20Sopenharmony_ci mov.l er3,er0 128c2ecf20Sopenharmony_ci bra exitdiv 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ci .global __umodsi3 158c2ecf20Sopenharmony_ci__umodsi3: 168c2ecf20Sopenharmony_ci bsr __udivsi3 178c2ecf20Sopenharmony_ci mov.l er3,er0 188c2ecf20Sopenharmony_ci rts 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_ci .global __divsi3 218c2ecf20Sopenharmony_ci__divsi3: 228c2ecf20Sopenharmony_ci PUSHP S2P 238c2ecf20Sopenharmony_ci jsr divnorm 248c2ecf20Sopenharmony_ci bsr __udivsi3 258c2ecf20Sopenharmony_ci 268c2ecf20Sopenharmony_ci ; examine what the sign should be 278c2ecf20Sopenharmony_ciexitdiv: 288c2ecf20Sopenharmony_ci btst #3,S2L 298c2ecf20Sopenharmony_ci beq reti 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_ci ; should be -ve 328c2ecf20Sopenharmony_ci neg.l A0P 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_cireti: 358c2ecf20Sopenharmony_ci POPP S2P 368c2ecf20Sopenharmony_ci rts 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_cidivnorm: 398c2ecf20Sopenharmony_ci mov.l A0P,A0P ; is the numerator -ve 408c2ecf20Sopenharmony_ci stc ccr,S2L ; keep the sign in bit 3 of S2L 418c2ecf20Sopenharmony_ci bge postive 428c2ecf20Sopenharmony_ci 438c2ecf20Sopenharmony_ci neg.l A0P ; negate arg 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_cipostive: 468c2ecf20Sopenharmony_ci mov.l A1P,A1P ; is the denominator -ve 478c2ecf20Sopenharmony_ci bge postive2 488c2ecf20Sopenharmony_ci 498c2ecf20Sopenharmony_ci neg.l A1P ; negate arg 508c2ecf20Sopenharmony_ci xor.b #0x08,S2L ; toggle the result sign 518c2ecf20Sopenharmony_ci 528c2ecf20Sopenharmony_cipostive2: 538c2ecf20Sopenharmony_ci rts 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_ci;; Basically the same, except that the sign of the divisor determines 568c2ecf20Sopenharmony_ci;; the sign. 578c2ecf20Sopenharmony_cimodnorm: 588c2ecf20Sopenharmony_ci mov.l A0P,A0P ; is the numerator -ve 598c2ecf20Sopenharmony_ci stc ccr,S2L ; keep the sign in bit 3 of S2L 608c2ecf20Sopenharmony_ci bge mpostive 618c2ecf20Sopenharmony_ci 628c2ecf20Sopenharmony_ci neg.l A0P ; negate arg 638c2ecf20Sopenharmony_ci 648c2ecf20Sopenharmony_cimpostive: 658c2ecf20Sopenharmony_ci mov.l A1P,A1P ; is the denominator -ve 668c2ecf20Sopenharmony_ci bge mpostive2 678c2ecf20Sopenharmony_ci 688c2ecf20Sopenharmony_ci neg.l A1P ; negate arg 698c2ecf20Sopenharmony_ci 708c2ecf20Sopenharmony_cimpostive2: 718c2ecf20Sopenharmony_ci rts 728c2ecf20Sopenharmony_ci 738c2ecf20Sopenharmony_ci .end 74