/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- * * The contents of this file are subject to the Netscape Public * License Version 1.1 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.mozilla.org/NPL/ * * Software distributed under the License is distributed on an "AS * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or * implied. See the License for the specific language governing * rights and limitations under the License. * * The Original Code is mozilla.org code. * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are * Copyright (C) 1998 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): */ .SPACE $PRIVATE$ .SUBSPA $DATA$ .align 4 .EXPORT HPPAremI,DATA HPPAremI: .long _remI .EXPORT HPPAremU,DATA HPPAremU: .long _remU .EXPORT HPPAdivI,DATA HPPAdivI: .long _divI .EXPORT HPPAdivU,DATA HPPAdivU: .long _divU .EXPORT HPPASpecialCodeBegin,DATA HPPASpecialCodeBegin: .long _begin .EXPORT HPPASpecialCodeEnd,DATA HPPASpecialCodeEnd: .long _end .SPACE $TEXT$ .SUBSPA $CODE$ .align 4 _begin: _remI: addit,= 0,%arg1,%r0 add,>= %r0,%arg0,%ret1 sub %r0,%ret1,%ret1 sub %r0,%arg1,%r1 ds %r0,%r1,%r0 copy %r0,%r1 add %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 movb,>=,n %r1,%ret1,L5 add,< %arg1,%r0,%r0 add,tr %r1,%arg1,%ret1 sub %r1,%arg1,%ret1 L5: add,>= %arg0,%r0,%r0 sub %r0,%ret1,%ret1 bv %r0(%r31) nop .align 4 _remU: comibf,<,n 0x0,%arg1,_remU_special_case sub %r0,%arg1,%ret1 ds %r0,%ret1,%r0 add %arg0,%arg0,%r1 ds %r0,%arg1,%ret1 addc %r1,%r1,%r1 ds %ret1,%arg1,%ret1 addc %r1,%r1,%r1 ds %ret1,%arg1,%ret1 addc %r1,%r1,%r1 ds %ret1,%arg1,%ret1 addc %r1,%r1,%r1 ds %ret1,%arg1,%ret1 addc %r1,%r1,%r1 ds %ret1,%arg1,%ret1 addc %r1,%r1,%r1 ds %ret1,%arg1,%ret1 addc %r1,%r1,%r1 ds %ret1,%arg1,%ret1 addc %r1,%r1,%r1 ds %ret1,%arg1,%ret1 addc %r1,%r1,%r1 ds %ret1,%arg1,%ret1 addc %r1,%r1,%r1 ds %ret1,%arg1,%ret1 addc %r1,%r1,%r1 ds %ret1,%arg1,%ret1 addc %r1,%r1,%r1 ds %ret1,%arg1,%ret1 addc %r1,%r1,%r1 ds %ret1,%arg1,%ret1 addc %r1,%r1,%r1 ds %ret1,%arg1,%ret1 addc %r1,%r1,%r1 ds %ret1,%arg1,%ret1 addc %r1,%r1,%r1 ds %ret1,%arg1,%ret1 addc %r1,%r1,%r1 ds %ret1,%arg1,%ret1 addc %r1,%r1,%r1 ds %ret1,%arg1,%ret1 addc %r1,%r1,%r1 ds %ret1,%arg1,%ret1 addc %r1,%r1,%r1 ds %ret1,%arg1,%ret1 addc %r1,%r1,%r1 ds %ret1,%arg1,%ret1 addc %r1,%r1,%r1 ds %ret1,%arg1,%ret1 addc %r1,%r1,%r1 ds %ret1,%arg1,%ret1 addc %r1,%r1,%r1 ds %ret1,%arg1,%ret1 addc %r1,%r1,%r1 ds %ret1,%arg1,%ret1 addc %r1,%r1,%r1 ds %ret1,%arg1,%ret1 addc %r1,%r1,%r1 ds %ret1,%arg1,%ret1 addc %r1,%r1,%r1 ds %ret1,%arg1,%ret1 addc %r1,%r1,%r1 ds %ret1,%arg1,%ret1 addc %r1,%r1,%r1 ds %ret1,%arg1,%ret1 addc %r1,%r1,%r1 ds %ret1,%arg1,%ret1 comiclr,<= 0,%ret1,%r0 add %ret1,%arg1,%ret1 bv,n %r0(%r31) nop _remU_special_case: addit,= 0,%arg1,%r0 sub,>>= %arg0,%arg1,%ret1 copy %arg0,%ret1 bv,n %r0(%r31) nop .align 4 _divI: comibf,<<,n 0xf,%arg1,_divI_small_divisor add,>= %r0,%arg0,%ret1 _divI_normal: sub %r0,%ret1,%ret1 sub %r0,%arg1,%r1 ds %r0,%r1,%r0 add %ret1,%ret1,%ret1 ds %r0,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 xor,>= %arg0,%arg1,%r0 sub %r0,%ret1,%ret1 bv,n %r0(%r31) nop _divI_small_divisor: blr,n %arg1,%r0 nop addit,= 0,%arg1,%r0 nop bv %r0(%r31) copy %arg0,%ret1 b,n _divI_2 nop b,n _divI_3 nop b,n _divI_4 nop b,n _divI_5 nop b,n _divI_6 nop b,n _divI_7 nop b,n _divI_8 nop b,n _divI_9 nop b,n _divI_10 nop b _divI_normal add,>= %r0,%arg0,%ret1 b,n _divI_12 nop b _divI_normal add,>= %r0,%arg0,%ret1 b,n _divI_14 nop b,n _divI_15 nop .align 4 _divU: comibf,< 0xf,%arg1,_divU_special_divisor sub %r0,%arg1,%r1 ds %r0,%r1,%r0 _divU_normal: add %arg0,%arg0,%ret1 ds %r0,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 addc %ret1,%ret1,%ret1 ds %r1,%arg1,%r1 bv %r0(%r31) addc %ret1,%ret1,%ret1 _divU_special_divisor: comibf,<= 0,%arg1,_divU_big_divisor nop blr %arg1,%r0 nop _divU_small_divisor: addit,= 0,%arg1,%r0 nop bv %r0(%r31) copy %arg0,%ret1 bv %r0(%r31) extru %arg0,30,31,%ret1 b,n _divU_3 nop bv %r0(%r31) extru %arg0,29,30,%ret1 b,n _divU_5 nop b,n _divU_6 nop b,n _divU_7 nop bv %r0(%r31) extru %arg0,28,29,%ret1 b,n _divU_9 nop b,n _divU_10 nop b _divU_normal ds %r0,%r1,%r0 b,n _divU_12 nop b _divU_normal ds %r0,%r1,%r0 b,n _divU_14 nop b,n _divU_15 nop _divU_big_divisor: sub %arg0,%arg1,%r0 bv %r0(%r31) addc %r0,%r0,%ret1 _divI_2: comclr,>= %arg0,%r0,%r0 addi 1,%arg0,%arg0 bv %r0(%r31) extrs %arg0,30,31,%ret1 _divI_4: comclr,>= %arg0,%r0,%r0 addi 3,%arg0,%arg0 bv %r0(%r31) extrs %arg0,29,30,%ret1 _divI_8: comclr,>= %arg0,%r0,%r0 addi 7,%arg0,%arg0 bv %r0(%r31) extrs %arg0,28,29,%ret1 _divI_3: comb,<,n %arg0,%r0,_divI_neg3 addi 1,%arg0,%arg0 extru %arg0,1,2,%ret1 sh2add %arg0,%arg0,%arg0 b _divI_pos addc %ret1,%r0,%ret1 _divI_neg3: subi 1,%arg0,%arg0 extru %arg0,1,2,%ret1 sh2add %arg0,%arg0,%arg0 b _divI_neg addc %ret1,%r0,%ret1 _divU_3: addi 1,%arg0,%arg0 addc %r0,%r0,%ret1 shd %ret1,%arg0,30,%arg1 sh2add %arg0,%arg0,%arg0 b _divI_pos addc %ret1,%arg1,%ret1 _divI_5: comb,<,n %arg0,%r0,_divI_neg5 addi 3,%arg0,%arg1 sh1add %arg0,%arg1,%arg0 b _divI_pos addc %r0,%r0,%ret1 _divI_neg5: sub %r0,%arg0,%arg0 addi 1,%arg0,%arg0 shd %r0,%arg0,31,%ret1 sh1add %arg0,%arg0,%arg0 b _divI_neg addc %ret1,%r0,%ret1 _divU_5: addi 1,%arg0,%arg0 addc %r0,%r0,%ret1 shd %ret1,%arg0,31,%arg1 sh1add %arg0,%arg0,%arg0 b _divI_pos addc %arg1,%ret1,%ret1 _divI_6: comb,<,n %arg0,%r0,_divI_neg6 extru %arg0,30,31,%arg0 addi 5,%arg0,%arg1 sh2add %arg0,%arg1,%arg0 b _divI_pos addc %r0,%r0,%ret1 _divI_neg6: subi 2,%arg0,%arg0 extru %arg0,30,31,%arg0 shd %r0,%arg0,30,%ret1 sh2add %arg0,%arg0,%arg0 b _divI_neg addc %ret1,%r0,%ret1 _divU_6: extru %arg0,30,31,%arg0 addi 1,%arg0,%arg0 shd %r0,%arg0,30,%ret1 sh2add %arg0,%arg0,%arg0 b _divI_pos addc %ret1,%r0,%ret1 _divI_10: comb,< %arg0,%r0,_divI_neg10 copy %r0,%ret1 extru %arg0,30,31,%arg0 addibf 1,%arg0,_divI_pos sh1add %arg0,%arg0,%arg0 _divI_neg10: subi 2,%arg0,%arg0 extru %arg0,30,31,%arg0 sh1add %arg0,%arg0,%arg0 _divI_neg: shd %ret1,%arg0,28,%arg1 shd %arg0,%r0,28,%r1 add %arg0,%r1,%arg0 addc %ret1,%arg1,%ret1 shd %ret1,%arg0,24,%arg1 shd %arg0,%r0,24,%r1 add %arg0,%r1,%arg0 addc %ret1,%arg1,%ret1 shd %ret1,%arg0,16,%arg1 shd %arg0,%r0,16,%r1 add %arg0,%r1,%arg0 addc %ret1,%arg1,%ret1 bv %r0(%r31) sub %r0,%ret1,%ret1 _divU_10: extru %arg0,30,31,%arg0 addi 3,%arg0,%arg1 sh1add %arg0,%arg1,%arg0 addc %r0,%r0,%ret1 _divI_pos: shd %ret1,%arg0,28,%arg1 _divI_pos_for_15: shd %arg0,%r0,28,%r1 add %arg0,%r1,%arg0 addc %ret1,%arg1,%ret1 shd %ret1,%arg0,24,%arg1 shd %arg0,%r0,24,%r1 add %arg0,%r1,%arg0 addc %ret1,%arg1,%ret1 shd %ret1,%arg0,16,%arg1 shd %arg0,%r0,16,%r1 add %arg0,%r1,%arg0 bv %r0(%r31) addc %ret1,%arg1,%ret1 _divI_12: comb,< %arg0,%r0,_divI_neg12 copy %r0,%ret1 extru %arg0,29,30,%arg0 addibf 1,%arg0,_divI_pos sh2add %arg0,%arg0,%arg0 _divI_neg12: subi 4,%arg0,%arg0 extru %arg0,29,30,%arg0 b _divI_neg sh2add %arg0,%arg0,%arg0 _divU_12: extru %arg0,29,30,%arg0 addi 5,%arg0,%arg1 sh2add %arg0,%arg1,%arg0 b _divI_pos addc %r0,%r0,%ret1 _divI_15: comb,< %arg0,%r0,_divI_neg15 copy %r0,%ret1 addibf 1,%arg0,_divI_pos_for_15 shd %ret1,%arg0,28,%arg1 _divI_neg15: b _divI_neg subi 1,%arg0,%arg0 _divU_15: addi 1,%arg0,%arg0 b _divI_pos addc %r0,%r0,%ret1 _divI_7: comb,<,n %arg0,%r0,_divI_neg7 _divI_7a: addi 1,%arg0,%arg0 shd %r0,%arg0,29,%ret1 sh3add %arg0,%arg0,%arg0 addc %ret1,%r0,%ret1 _divI_pos7: shd %ret1,%arg0,26,%arg1 shd %arg0,%r0,26,%r1 add %arg0,%r1,%arg0 addc %ret1,%arg1,%ret1 shd %ret1,%arg0,20,%arg1 shd %arg0,%r0,20,%r1 add %arg0,%r1,%arg0 addc %ret1,%arg1,%arg1 copy %r0,%ret1 shd,= %arg1,%arg0,24,%arg1 L1: addbf %arg1,%ret1,L2 extru %arg0,31,24,%arg0 bv,n %r0(%r31) L2: addbf %arg1,%arg0,L1 extru,= %arg0,7,8,%arg1 _divI_neg7: subi 1,%arg0,%arg0 _divI_neg7a: shd %r0,%arg0,29,%ret1 sh3add %arg0,%arg0,%arg0 addc %ret1,%r0,%ret1 _divI_neg7_shift: shd %ret1,%arg0,26,%arg1 shd %arg0,%r0,26,%r1 add %arg0,%r1,%arg0 addc %ret1,%arg1,%ret1 shd %ret1,%arg0,20,%arg1 shd %arg0,%r0,20,%r1 add %arg0,%r1,%arg0 addc %ret1,%arg1,%arg1 copy %r0,%ret1 shd,= %arg1,%arg0,24,%arg1 L3: addbf %arg1,%ret1,L4 extru %arg0,31,24,%arg0 bv %r0(%r31) sub %r0,%ret1,%ret1 L4: addbf %arg1,%arg0,L3 extru,= %arg0,7,8,%arg1 _divU_7: addi 1,%arg0,%arg0 addc %r0,%r0,%ret1 shd %ret1,%arg0,29,%arg1 sh3add %arg0,%arg0,%arg0 b _divI_pos7 addc %arg1,%ret1,%ret1 _divI_9: comb,<,n %arg0,%r0,_divI_neg9 addi 1,%arg0,%arg0 shd %r0,%arg0,29,%arg1 shd %arg0,%r0,29,%r1 sub %r1,%arg0,%arg0 b _divI_pos7 subb %arg1,%r0,%ret1 _divI_neg9: subi 1,%arg0,%arg0 shd %r0,%arg0,29,%arg1 shd %arg0,%r0,29,%r1 sub %r1,%arg0,%arg0 b _divI_neg7_shift subb %arg1,%r0,%ret1 _divU_9: addi 1,%arg0,%arg0 addc %r0,%r0,%ret1 shd %ret1,%arg0,29,%arg1 shd %arg0,%r0,29,%r1 sub %r1,%arg0,%arg0 b _divI_pos7 subb %arg1,%ret1,%ret1 _divI_14: comb,<,n %arg0,%r0,_divI_neg14 _divU_14: b _divI_7a extru %arg0,30,31,%arg0 _divI_neg14: subi 2,%arg0,%arg0 b _divI_neg7a extru %arg0,30,31,%arg0 _end: