162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0+ WITH GCC-exception-2.0 262306a36Sopenharmony_ci 362306a36Sopenharmony_ci Copyright (C) 1994, 1995, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 462306a36Sopenharmony_ci 2004, 2005, 2006 562306a36Sopenharmony_ci Free Software Foundation, Inc. 662306a36Sopenharmony_ci*/ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci!! libgcc routines for the Renesas / SuperH SH CPUs. 962306a36Sopenharmony_ci!! Contributed by Steve Chamberlain. 1062306a36Sopenharmony_ci!! sac@cygnus.com 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci!! ashiftrt_r4_x, ___ashrsi3, ___ashlsi3, ___lshrsi3 routines 1362306a36Sopenharmony_ci!! recoded in assembly by Toshiyasu Morita 1462306a36Sopenharmony_ci!! tm@netcom.com 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci/* SH2 optimizations for ___ashrsi3, ___ashlsi3, ___lshrsi3 and 1762306a36Sopenharmony_ci ELF local label prefixes by J"orn Rennecke 1862306a36Sopenharmony_ci amylaar@cygnus.com */ 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci/* This code used shld, thus is not suitable for SH1 / SH2. */ 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci/* Signed / unsigned division without use of FPU, optimized for SH4. 2362306a36Sopenharmony_ci Uses a lookup table for divisors in the range -128 .. +128, and 2462306a36Sopenharmony_ci div1 with case distinction for larger divisors in three more ranges. 2562306a36Sopenharmony_ci The code is lumped together with the table to allow the use of mova. */ 2662306a36Sopenharmony_ci#ifdef CONFIG_CPU_LITTLE_ENDIAN 2762306a36Sopenharmony_ci#define L_LSB 0 2862306a36Sopenharmony_ci#define L_LSWMSB 1 2962306a36Sopenharmony_ci#define L_MSWLSB 2 3062306a36Sopenharmony_ci#else 3162306a36Sopenharmony_ci#define L_LSB 3 3262306a36Sopenharmony_ci#define L_LSWMSB 2 3362306a36Sopenharmony_ci#define L_MSWLSB 1 3462306a36Sopenharmony_ci#endif 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci .balign 4 3762306a36Sopenharmony_ci .global __udivsi3_i4i 3862306a36Sopenharmony_ci .global __udivsi3_i4 3962306a36Sopenharmony_ci .set __udivsi3_i4, __udivsi3_i4i 4062306a36Sopenharmony_ci .type __udivsi3_i4i, @function 4162306a36Sopenharmony_ci__udivsi3_i4i: 4262306a36Sopenharmony_ci mov.w c128_w, r1 4362306a36Sopenharmony_ci div0u 4462306a36Sopenharmony_ci mov r4,r0 4562306a36Sopenharmony_ci shlr8 r0 4662306a36Sopenharmony_ci cmp/hi r1,r5 4762306a36Sopenharmony_ci extu.w r5,r1 4862306a36Sopenharmony_ci bf udiv_le128 4962306a36Sopenharmony_ci cmp/eq r5,r1 5062306a36Sopenharmony_ci bf udiv_ge64k 5162306a36Sopenharmony_ci shlr r0 5262306a36Sopenharmony_ci mov r5,r1 5362306a36Sopenharmony_ci shll16 r5 5462306a36Sopenharmony_ci mov.l r4,@-r15 5562306a36Sopenharmony_ci div1 r5,r0 5662306a36Sopenharmony_ci mov.l r1,@-r15 5762306a36Sopenharmony_ci div1 r5,r0 5862306a36Sopenharmony_ci div1 r5,r0 5962306a36Sopenharmony_ci bra udiv_25 6062306a36Sopenharmony_ci div1 r5,r0 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_cidiv_le128: 6362306a36Sopenharmony_ci mova div_table_ix,r0 6462306a36Sopenharmony_ci bra div_le128_2 6562306a36Sopenharmony_ci mov.b @(r0,r5),r1 6662306a36Sopenharmony_ciudiv_le128: 6762306a36Sopenharmony_ci mov.l r4,@-r15 6862306a36Sopenharmony_ci mova div_table_ix,r0 6962306a36Sopenharmony_ci mov.b @(r0,r5),r1 7062306a36Sopenharmony_ci mov.l r5,@-r15 7162306a36Sopenharmony_cidiv_le128_2: 7262306a36Sopenharmony_ci mova div_table_inv,r0 7362306a36Sopenharmony_ci mov.l @(r0,r1),r1 7462306a36Sopenharmony_ci mov r5,r0 7562306a36Sopenharmony_ci tst #0xfe,r0 7662306a36Sopenharmony_ci mova div_table_clz,r0 7762306a36Sopenharmony_ci dmulu.l r1,r4 7862306a36Sopenharmony_ci mov.b @(r0,r5),r1 7962306a36Sopenharmony_ci bt/s div_by_1 8062306a36Sopenharmony_ci mov r4,r0 8162306a36Sopenharmony_ci mov.l @r15+,r5 8262306a36Sopenharmony_ci sts mach,r0 8362306a36Sopenharmony_ci /* clrt */ 8462306a36Sopenharmony_ci addc r4,r0 8562306a36Sopenharmony_ci mov.l @r15+,r4 8662306a36Sopenharmony_ci rotcr r0 8762306a36Sopenharmony_ci rts 8862306a36Sopenharmony_ci shld r1,r0 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_cidiv_by_1_neg: 9162306a36Sopenharmony_ci neg r4,r0 9262306a36Sopenharmony_cidiv_by_1: 9362306a36Sopenharmony_ci mov.l @r15+,r5 9462306a36Sopenharmony_ci rts 9562306a36Sopenharmony_ci mov.l @r15+,r4 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_cidiv_ge64k: 9862306a36Sopenharmony_ci bt/s div_r8 9962306a36Sopenharmony_ci div0u 10062306a36Sopenharmony_ci shll8 r5 10162306a36Sopenharmony_ci bra div_ge64k_2 10262306a36Sopenharmony_ci div1 r5,r0 10362306a36Sopenharmony_ciudiv_ge64k: 10462306a36Sopenharmony_ci cmp/hi r0,r5 10562306a36Sopenharmony_ci mov r5,r1 10662306a36Sopenharmony_ci bt udiv_r8 10762306a36Sopenharmony_ci shll8 r5 10862306a36Sopenharmony_ci mov.l r4,@-r15 10962306a36Sopenharmony_ci div1 r5,r0 11062306a36Sopenharmony_ci mov.l r1,@-r15 11162306a36Sopenharmony_cidiv_ge64k_2: 11262306a36Sopenharmony_ci div1 r5,r0 11362306a36Sopenharmony_ci mov.l zero_l,r1 11462306a36Sopenharmony_ci .rept 4 11562306a36Sopenharmony_ci div1 r5,r0 11662306a36Sopenharmony_ci .endr 11762306a36Sopenharmony_ci mov.l r1,@-r15 11862306a36Sopenharmony_ci div1 r5,r0 11962306a36Sopenharmony_ci mov.w m256_w,r1 12062306a36Sopenharmony_ci div1 r5,r0 12162306a36Sopenharmony_ci mov.b r0,@(L_LSWMSB,r15) 12262306a36Sopenharmony_ci xor r4,r0 12362306a36Sopenharmony_ci and r1,r0 12462306a36Sopenharmony_ci bra div_ge64k_end 12562306a36Sopenharmony_ci xor r4,r0 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_cidiv_r8: 12862306a36Sopenharmony_ci shll16 r4 12962306a36Sopenharmony_ci bra div_r8_2 13062306a36Sopenharmony_ci shll8 r4 13162306a36Sopenharmony_ciudiv_r8: 13262306a36Sopenharmony_ci mov.l r4,@-r15 13362306a36Sopenharmony_ci shll16 r4 13462306a36Sopenharmony_ci clrt 13562306a36Sopenharmony_ci shll8 r4 13662306a36Sopenharmony_ci mov.l r5,@-r15 13762306a36Sopenharmony_cidiv_r8_2: 13862306a36Sopenharmony_ci rotcl r4 13962306a36Sopenharmony_ci mov r0,r1 14062306a36Sopenharmony_ci div1 r5,r1 14162306a36Sopenharmony_ci mov r4,r0 14262306a36Sopenharmony_ci rotcl r0 14362306a36Sopenharmony_ci mov r5,r4 14462306a36Sopenharmony_ci div1 r5,r1 14562306a36Sopenharmony_ci .rept 5 14662306a36Sopenharmony_ci rotcl r0; div1 r5,r1 14762306a36Sopenharmony_ci .endr 14862306a36Sopenharmony_ci rotcl r0 14962306a36Sopenharmony_ci mov.l @r15+,r5 15062306a36Sopenharmony_ci div1 r4,r1 15162306a36Sopenharmony_ci mov.l @r15+,r4 15262306a36Sopenharmony_ci rts 15362306a36Sopenharmony_ci rotcl r0 15462306a36Sopenharmony_ci 15562306a36Sopenharmony_ci .global __sdivsi3_i4i 15662306a36Sopenharmony_ci .global __sdivsi3_i4 15762306a36Sopenharmony_ci .global __sdivsi3 15862306a36Sopenharmony_ci .set __sdivsi3_i4, __sdivsi3_i4i 15962306a36Sopenharmony_ci .set __sdivsi3, __sdivsi3_i4i 16062306a36Sopenharmony_ci .type __sdivsi3_i4i, @function 16162306a36Sopenharmony_ci /* This is link-compatible with a __sdivsi3 call, 16262306a36Sopenharmony_ci but we effectively clobber only r1. */ 16362306a36Sopenharmony_ci__sdivsi3_i4i: 16462306a36Sopenharmony_ci mov.l r4,@-r15 16562306a36Sopenharmony_ci cmp/pz r5 16662306a36Sopenharmony_ci mov.w c128_w, r1 16762306a36Sopenharmony_ci bt/s pos_divisor 16862306a36Sopenharmony_ci cmp/pz r4 16962306a36Sopenharmony_ci mov.l r5,@-r15 17062306a36Sopenharmony_ci neg r5,r5 17162306a36Sopenharmony_ci bt/s neg_result 17262306a36Sopenharmony_ci cmp/hi r1,r5 17362306a36Sopenharmony_ci neg r4,r4 17462306a36Sopenharmony_cipos_result: 17562306a36Sopenharmony_ci extu.w r5,r0 17662306a36Sopenharmony_ci bf div_le128 17762306a36Sopenharmony_ci cmp/eq r5,r0 17862306a36Sopenharmony_ci mov r4,r0 17962306a36Sopenharmony_ci shlr8 r0 18062306a36Sopenharmony_ci bf/s div_ge64k 18162306a36Sopenharmony_ci cmp/hi r0,r5 18262306a36Sopenharmony_ci div0u 18362306a36Sopenharmony_ci shll16 r5 18462306a36Sopenharmony_ci div1 r5,r0 18562306a36Sopenharmony_ci div1 r5,r0 18662306a36Sopenharmony_ci div1 r5,r0 18762306a36Sopenharmony_ciudiv_25: 18862306a36Sopenharmony_ci mov.l zero_l,r1 18962306a36Sopenharmony_ci div1 r5,r0 19062306a36Sopenharmony_ci div1 r5,r0 19162306a36Sopenharmony_ci mov.l r1,@-r15 19262306a36Sopenharmony_ci .rept 3 19362306a36Sopenharmony_ci div1 r5,r0 19462306a36Sopenharmony_ci .endr 19562306a36Sopenharmony_ci mov.b r0,@(L_MSWLSB,r15) 19662306a36Sopenharmony_ci xtrct r4,r0 19762306a36Sopenharmony_ci swap.w r0,r0 19862306a36Sopenharmony_ci .rept 8 19962306a36Sopenharmony_ci div1 r5,r0 20062306a36Sopenharmony_ci .endr 20162306a36Sopenharmony_ci mov.b r0,@(L_LSWMSB,r15) 20262306a36Sopenharmony_cidiv_ge64k_end: 20362306a36Sopenharmony_ci .rept 8 20462306a36Sopenharmony_ci div1 r5,r0 20562306a36Sopenharmony_ci .endr 20662306a36Sopenharmony_ci mov.l @r15+,r4 ! zero-extension and swap using LS unit. 20762306a36Sopenharmony_ci extu.b r0,r0 20862306a36Sopenharmony_ci mov.l @r15+,r5 20962306a36Sopenharmony_ci or r4,r0 21062306a36Sopenharmony_ci mov.l @r15+,r4 21162306a36Sopenharmony_ci rts 21262306a36Sopenharmony_ci rotcl r0 21362306a36Sopenharmony_ci 21462306a36Sopenharmony_cidiv_le128_neg: 21562306a36Sopenharmony_ci tst #0xfe,r0 21662306a36Sopenharmony_ci mova div_table_ix,r0 21762306a36Sopenharmony_ci mov.b @(r0,r5),r1 21862306a36Sopenharmony_ci mova div_table_inv,r0 21962306a36Sopenharmony_ci bt/s div_by_1_neg 22062306a36Sopenharmony_ci mov.l @(r0,r1),r1 22162306a36Sopenharmony_ci mova div_table_clz,r0 22262306a36Sopenharmony_ci dmulu.l r1,r4 22362306a36Sopenharmony_ci mov.b @(r0,r5),r1 22462306a36Sopenharmony_ci mov.l @r15+,r5 22562306a36Sopenharmony_ci sts mach,r0 22662306a36Sopenharmony_ci /* clrt */ 22762306a36Sopenharmony_ci addc r4,r0 22862306a36Sopenharmony_ci mov.l @r15+,r4 22962306a36Sopenharmony_ci rotcr r0 23062306a36Sopenharmony_ci shld r1,r0 23162306a36Sopenharmony_ci rts 23262306a36Sopenharmony_ci neg r0,r0 23362306a36Sopenharmony_ci 23462306a36Sopenharmony_cipos_divisor: 23562306a36Sopenharmony_ci mov.l r5,@-r15 23662306a36Sopenharmony_ci bt/s pos_result 23762306a36Sopenharmony_ci cmp/hi r1,r5 23862306a36Sopenharmony_ci neg r4,r4 23962306a36Sopenharmony_cineg_result: 24062306a36Sopenharmony_ci extu.w r5,r0 24162306a36Sopenharmony_ci bf div_le128_neg 24262306a36Sopenharmony_ci cmp/eq r5,r0 24362306a36Sopenharmony_ci mov r4,r0 24462306a36Sopenharmony_ci shlr8 r0 24562306a36Sopenharmony_ci bf/s div_ge64k_neg 24662306a36Sopenharmony_ci cmp/hi r0,r5 24762306a36Sopenharmony_ci div0u 24862306a36Sopenharmony_ci mov.l zero_l,r1 24962306a36Sopenharmony_ci shll16 r5 25062306a36Sopenharmony_ci div1 r5,r0 25162306a36Sopenharmony_ci mov.l r1,@-r15 25262306a36Sopenharmony_ci .rept 7 25362306a36Sopenharmony_ci div1 r5,r0 25462306a36Sopenharmony_ci .endr 25562306a36Sopenharmony_ci mov.b r0,@(L_MSWLSB,r15) 25662306a36Sopenharmony_ci xtrct r4,r0 25762306a36Sopenharmony_ci swap.w r0,r0 25862306a36Sopenharmony_ci .rept 8 25962306a36Sopenharmony_ci div1 r5,r0 26062306a36Sopenharmony_ci .endr 26162306a36Sopenharmony_ci mov.b r0,@(L_LSWMSB,r15) 26262306a36Sopenharmony_cidiv_ge64k_neg_end: 26362306a36Sopenharmony_ci .rept 8 26462306a36Sopenharmony_ci div1 r5,r0 26562306a36Sopenharmony_ci .endr 26662306a36Sopenharmony_ci mov.l @r15+,r4 ! zero-extension and swap using LS unit. 26762306a36Sopenharmony_ci extu.b r0,r1 26862306a36Sopenharmony_ci mov.l @r15+,r5 26962306a36Sopenharmony_ci or r4,r1 27062306a36Sopenharmony_cidiv_r8_neg_end: 27162306a36Sopenharmony_ci mov.l @r15+,r4 27262306a36Sopenharmony_ci rotcl r1 27362306a36Sopenharmony_ci rts 27462306a36Sopenharmony_ci neg r1,r0 27562306a36Sopenharmony_ci 27662306a36Sopenharmony_cidiv_ge64k_neg: 27762306a36Sopenharmony_ci bt/s div_r8_neg 27862306a36Sopenharmony_ci div0u 27962306a36Sopenharmony_ci shll8 r5 28062306a36Sopenharmony_ci mov.l zero_l,r1 28162306a36Sopenharmony_ci .rept 6 28262306a36Sopenharmony_ci div1 r5,r0 28362306a36Sopenharmony_ci .endr 28462306a36Sopenharmony_ci mov.l r1,@-r15 28562306a36Sopenharmony_ci div1 r5,r0 28662306a36Sopenharmony_ci mov.w m256_w,r1 28762306a36Sopenharmony_ci div1 r5,r0 28862306a36Sopenharmony_ci mov.b r0,@(L_LSWMSB,r15) 28962306a36Sopenharmony_ci xor r4,r0 29062306a36Sopenharmony_ci and r1,r0 29162306a36Sopenharmony_ci bra div_ge64k_neg_end 29262306a36Sopenharmony_ci xor r4,r0 29362306a36Sopenharmony_ci 29462306a36Sopenharmony_cic128_w: 29562306a36Sopenharmony_ci .word 128 29662306a36Sopenharmony_ci 29762306a36Sopenharmony_cidiv_r8_neg: 29862306a36Sopenharmony_ci clrt 29962306a36Sopenharmony_ci shll16 r4 30062306a36Sopenharmony_ci mov r4,r1 30162306a36Sopenharmony_ci shll8 r1 30262306a36Sopenharmony_ci mov r5,r4 30362306a36Sopenharmony_ci .rept 7 30462306a36Sopenharmony_ci rotcl r1; div1 r5,r0 30562306a36Sopenharmony_ci .endr 30662306a36Sopenharmony_ci mov.l @r15+,r5 30762306a36Sopenharmony_ci rotcl r1 30862306a36Sopenharmony_ci bra div_r8_neg_end 30962306a36Sopenharmony_ci div1 r4,r0 31062306a36Sopenharmony_ci 31162306a36Sopenharmony_cim256_w: 31262306a36Sopenharmony_ci .word 0xff00 31362306a36Sopenharmony_ci/* This table has been generated by divtab-sh4.c. */ 31462306a36Sopenharmony_ci .balign 4 31562306a36Sopenharmony_cidiv_table_clz: 31662306a36Sopenharmony_ci .byte 0 31762306a36Sopenharmony_ci .byte 1 31862306a36Sopenharmony_ci .byte 0 31962306a36Sopenharmony_ci .byte -1 32062306a36Sopenharmony_ci .byte -1 32162306a36Sopenharmony_ci .byte -2 32262306a36Sopenharmony_ci .byte -2 32362306a36Sopenharmony_ci .byte -2 32462306a36Sopenharmony_ci .byte -2 32562306a36Sopenharmony_ci .byte -3 32662306a36Sopenharmony_ci .byte -3 32762306a36Sopenharmony_ci .byte -3 32862306a36Sopenharmony_ci .byte -3 32962306a36Sopenharmony_ci .byte -3 33062306a36Sopenharmony_ci .byte -3 33162306a36Sopenharmony_ci .byte -3 33262306a36Sopenharmony_ci .byte -3 33362306a36Sopenharmony_ci .byte -4 33462306a36Sopenharmony_ci .byte -4 33562306a36Sopenharmony_ci .byte -4 33662306a36Sopenharmony_ci .byte -4 33762306a36Sopenharmony_ci .byte -4 33862306a36Sopenharmony_ci .byte -4 33962306a36Sopenharmony_ci .byte -4 34062306a36Sopenharmony_ci .byte -4 34162306a36Sopenharmony_ci .byte -4 34262306a36Sopenharmony_ci .byte -4 34362306a36Sopenharmony_ci .byte -4 34462306a36Sopenharmony_ci .byte -4 34562306a36Sopenharmony_ci .byte -4 34662306a36Sopenharmony_ci .byte -4 34762306a36Sopenharmony_ci .byte -4 34862306a36Sopenharmony_ci .byte -4 34962306a36Sopenharmony_ci .byte -5 35062306a36Sopenharmony_ci .byte -5 35162306a36Sopenharmony_ci .byte -5 35262306a36Sopenharmony_ci .byte -5 35362306a36Sopenharmony_ci .byte -5 35462306a36Sopenharmony_ci .byte -5 35562306a36Sopenharmony_ci .byte -5 35662306a36Sopenharmony_ci .byte -5 35762306a36Sopenharmony_ci .byte -5 35862306a36Sopenharmony_ci .byte -5 35962306a36Sopenharmony_ci .byte -5 36062306a36Sopenharmony_ci .byte -5 36162306a36Sopenharmony_ci .byte -5 36262306a36Sopenharmony_ci .byte -5 36362306a36Sopenharmony_ci .byte -5 36462306a36Sopenharmony_ci .byte -5 36562306a36Sopenharmony_ci .byte -5 36662306a36Sopenharmony_ci .byte -5 36762306a36Sopenharmony_ci .byte -5 36862306a36Sopenharmony_ci .byte -5 36962306a36Sopenharmony_ci .byte -5 37062306a36Sopenharmony_ci .byte -5 37162306a36Sopenharmony_ci .byte -5 37262306a36Sopenharmony_ci .byte -5 37362306a36Sopenharmony_ci .byte -5 37462306a36Sopenharmony_ci .byte -5 37562306a36Sopenharmony_ci .byte -5 37662306a36Sopenharmony_ci .byte -5 37762306a36Sopenharmony_ci .byte -5 37862306a36Sopenharmony_ci .byte -5 37962306a36Sopenharmony_ci .byte -5 38062306a36Sopenharmony_ci .byte -5 38162306a36Sopenharmony_ci .byte -6 38262306a36Sopenharmony_ci .byte -6 38362306a36Sopenharmony_ci .byte -6 38462306a36Sopenharmony_ci .byte -6 38562306a36Sopenharmony_ci .byte -6 38662306a36Sopenharmony_ci .byte -6 38762306a36Sopenharmony_ci .byte -6 38862306a36Sopenharmony_ci .byte -6 38962306a36Sopenharmony_ci .byte -6 39062306a36Sopenharmony_ci .byte -6 39162306a36Sopenharmony_ci .byte -6 39262306a36Sopenharmony_ci .byte -6 39362306a36Sopenharmony_ci .byte -6 39462306a36Sopenharmony_ci .byte -6 39562306a36Sopenharmony_ci .byte -6 39662306a36Sopenharmony_ci .byte -6 39762306a36Sopenharmony_ci .byte -6 39862306a36Sopenharmony_ci .byte -6 39962306a36Sopenharmony_ci .byte -6 40062306a36Sopenharmony_ci .byte -6 40162306a36Sopenharmony_ci .byte -6 40262306a36Sopenharmony_ci .byte -6 40362306a36Sopenharmony_ci .byte -6 40462306a36Sopenharmony_ci .byte -6 40562306a36Sopenharmony_ci .byte -6 40662306a36Sopenharmony_ci .byte -6 40762306a36Sopenharmony_ci .byte -6 40862306a36Sopenharmony_ci .byte -6 40962306a36Sopenharmony_ci .byte -6 41062306a36Sopenharmony_ci .byte -6 41162306a36Sopenharmony_ci .byte -6 41262306a36Sopenharmony_ci .byte -6 41362306a36Sopenharmony_ci .byte -6 41462306a36Sopenharmony_ci .byte -6 41562306a36Sopenharmony_ci .byte -6 41662306a36Sopenharmony_ci .byte -6 41762306a36Sopenharmony_ci .byte -6 41862306a36Sopenharmony_ci .byte -6 41962306a36Sopenharmony_ci .byte -6 42062306a36Sopenharmony_ci .byte -6 42162306a36Sopenharmony_ci .byte -6 42262306a36Sopenharmony_ci .byte -6 42362306a36Sopenharmony_ci .byte -6 42462306a36Sopenharmony_ci .byte -6 42562306a36Sopenharmony_ci .byte -6 42662306a36Sopenharmony_ci .byte -6 42762306a36Sopenharmony_ci .byte -6 42862306a36Sopenharmony_ci .byte -6 42962306a36Sopenharmony_ci .byte -6 43062306a36Sopenharmony_ci .byte -6 43162306a36Sopenharmony_ci .byte -6 43262306a36Sopenharmony_ci .byte -6 43362306a36Sopenharmony_ci .byte -6 43462306a36Sopenharmony_ci .byte -6 43562306a36Sopenharmony_ci .byte -6 43662306a36Sopenharmony_ci .byte -6 43762306a36Sopenharmony_ci .byte -6 43862306a36Sopenharmony_ci .byte -6 43962306a36Sopenharmony_ci .byte -6 44062306a36Sopenharmony_ci .byte -6 44162306a36Sopenharmony_ci .byte -6 44262306a36Sopenharmony_ci .byte -6 44362306a36Sopenharmony_ci .byte -6 44462306a36Sopenharmony_ci/* Lookup table translating positive divisor to index into table of 44562306a36Sopenharmony_ci normalized inverse. N.B. the '0' entry is also the last entry of the 44662306a36Sopenharmony_ci previous table, and causes an unaligned access for division by zero. */ 44762306a36Sopenharmony_cidiv_table_ix: 44862306a36Sopenharmony_ci .byte -6 44962306a36Sopenharmony_ci .byte -128 45062306a36Sopenharmony_ci .byte -128 45162306a36Sopenharmony_ci .byte 0 45262306a36Sopenharmony_ci .byte -128 45362306a36Sopenharmony_ci .byte -64 45462306a36Sopenharmony_ci .byte 0 45562306a36Sopenharmony_ci .byte 64 45662306a36Sopenharmony_ci .byte -128 45762306a36Sopenharmony_ci .byte -96 45862306a36Sopenharmony_ci .byte -64 45962306a36Sopenharmony_ci .byte -32 46062306a36Sopenharmony_ci .byte 0 46162306a36Sopenharmony_ci .byte 32 46262306a36Sopenharmony_ci .byte 64 46362306a36Sopenharmony_ci .byte 96 46462306a36Sopenharmony_ci .byte -128 46562306a36Sopenharmony_ci .byte -112 46662306a36Sopenharmony_ci .byte -96 46762306a36Sopenharmony_ci .byte -80 46862306a36Sopenharmony_ci .byte -64 46962306a36Sopenharmony_ci .byte -48 47062306a36Sopenharmony_ci .byte -32 47162306a36Sopenharmony_ci .byte -16 47262306a36Sopenharmony_ci .byte 0 47362306a36Sopenharmony_ci .byte 16 47462306a36Sopenharmony_ci .byte 32 47562306a36Sopenharmony_ci .byte 48 47662306a36Sopenharmony_ci .byte 64 47762306a36Sopenharmony_ci .byte 80 47862306a36Sopenharmony_ci .byte 96 47962306a36Sopenharmony_ci .byte 112 48062306a36Sopenharmony_ci .byte -128 48162306a36Sopenharmony_ci .byte -120 48262306a36Sopenharmony_ci .byte -112 48362306a36Sopenharmony_ci .byte -104 48462306a36Sopenharmony_ci .byte -96 48562306a36Sopenharmony_ci .byte -88 48662306a36Sopenharmony_ci .byte -80 48762306a36Sopenharmony_ci .byte -72 48862306a36Sopenharmony_ci .byte -64 48962306a36Sopenharmony_ci .byte -56 49062306a36Sopenharmony_ci .byte -48 49162306a36Sopenharmony_ci .byte -40 49262306a36Sopenharmony_ci .byte -32 49362306a36Sopenharmony_ci .byte -24 49462306a36Sopenharmony_ci .byte -16 49562306a36Sopenharmony_ci .byte -8 49662306a36Sopenharmony_ci .byte 0 49762306a36Sopenharmony_ci .byte 8 49862306a36Sopenharmony_ci .byte 16 49962306a36Sopenharmony_ci .byte 24 50062306a36Sopenharmony_ci .byte 32 50162306a36Sopenharmony_ci .byte 40 50262306a36Sopenharmony_ci .byte 48 50362306a36Sopenharmony_ci .byte 56 50462306a36Sopenharmony_ci .byte 64 50562306a36Sopenharmony_ci .byte 72 50662306a36Sopenharmony_ci .byte 80 50762306a36Sopenharmony_ci .byte 88 50862306a36Sopenharmony_ci .byte 96 50962306a36Sopenharmony_ci .byte 104 51062306a36Sopenharmony_ci .byte 112 51162306a36Sopenharmony_ci .byte 120 51262306a36Sopenharmony_ci .byte -128 51362306a36Sopenharmony_ci .byte -124 51462306a36Sopenharmony_ci .byte -120 51562306a36Sopenharmony_ci .byte -116 51662306a36Sopenharmony_ci .byte -112 51762306a36Sopenharmony_ci .byte -108 51862306a36Sopenharmony_ci .byte -104 51962306a36Sopenharmony_ci .byte -100 52062306a36Sopenharmony_ci .byte -96 52162306a36Sopenharmony_ci .byte -92 52262306a36Sopenharmony_ci .byte -88 52362306a36Sopenharmony_ci .byte -84 52462306a36Sopenharmony_ci .byte -80 52562306a36Sopenharmony_ci .byte -76 52662306a36Sopenharmony_ci .byte -72 52762306a36Sopenharmony_ci .byte -68 52862306a36Sopenharmony_ci .byte -64 52962306a36Sopenharmony_ci .byte -60 53062306a36Sopenharmony_ci .byte -56 53162306a36Sopenharmony_ci .byte -52 53262306a36Sopenharmony_ci .byte -48 53362306a36Sopenharmony_ci .byte -44 53462306a36Sopenharmony_ci .byte -40 53562306a36Sopenharmony_ci .byte -36 53662306a36Sopenharmony_ci .byte -32 53762306a36Sopenharmony_ci .byte -28 53862306a36Sopenharmony_ci .byte -24 53962306a36Sopenharmony_ci .byte -20 54062306a36Sopenharmony_ci .byte -16 54162306a36Sopenharmony_ci .byte -12 54262306a36Sopenharmony_ci .byte -8 54362306a36Sopenharmony_ci .byte -4 54462306a36Sopenharmony_ci .byte 0 54562306a36Sopenharmony_ci .byte 4 54662306a36Sopenharmony_ci .byte 8 54762306a36Sopenharmony_ci .byte 12 54862306a36Sopenharmony_ci .byte 16 54962306a36Sopenharmony_ci .byte 20 55062306a36Sopenharmony_ci .byte 24 55162306a36Sopenharmony_ci .byte 28 55262306a36Sopenharmony_ci .byte 32 55362306a36Sopenharmony_ci .byte 36 55462306a36Sopenharmony_ci .byte 40 55562306a36Sopenharmony_ci .byte 44 55662306a36Sopenharmony_ci .byte 48 55762306a36Sopenharmony_ci .byte 52 55862306a36Sopenharmony_ci .byte 56 55962306a36Sopenharmony_ci .byte 60 56062306a36Sopenharmony_ci .byte 64 56162306a36Sopenharmony_ci .byte 68 56262306a36Sopenharmony_ci .byte 72 56362306a36Sopenharmony_ci .byte 76 56462306a36Sopenharmony_ci .byte 80 56562306a36Sopenharmony_ci .byte 84 56662306a36Sopenharmony_ci .byte 88 56762306a36Sopenharmony_ci .byte 92 56862306a36Sopenharmony_ci .byte 96 56962306a36Sopenharmony_ci .byte 100 57062306a36Sopenharmony_ci .byte 104 57162306a36Sopenharmony_ci .byte 108 57262306a36Sopenharmony_ci .byte 112 57362306a36Sopenharmony_ci .byte 116 57462306a36Sopenharmony_ci .byte 120 57562306a36Sopenharmony_ci .byte 124 57662306a36Sopenharmony_ci .byte -128 57762306a36Sopenharmony_ci/* 1/64 .. 1/127, normalized. There is an implicit leading 1 in bit 32. */ 57862306a36Sopenharmony_ci .balign 4 57962306a36Sopenharmony_cizero_l: 58062306a36Sopenharmony_ci .long 0x0 58162306a36Sopenharmony_ci .long 0xF81F81F9 58262306a36Sopenharmony_ci .long 0xF07C1F08 58362306a36Sopenharmony_ci .long 0xE9131AC0 58462306a36Sopenharmony_ci .long 0xE1E1E1E2 58562306a36Sopenharmony_ci .long 0xDAE6076C 58662306a36Sopenharmony_ci .long 0xD41D41D5 58762306a36Sopenharmony_ci .long 0xCD856891 58862306a36Sopenharmony_ci .long 0xC71C71C8 58962306a36Sopenharmony_ci .long 0xC0E07039 59062306a36Sopenharmony_ci .long 0xBACF914D 59162306a36Sopenharmony_ci .long 0xB4E81B4F 59262306a36Sopenharmony_ci .long 0xAF286BCB 59362306a36Sopenharmony_ci .long 0xA98EF607 59462306a36Sopenharmony_ci .long 0xA41A41A5 59562306a36Sopenharmony_ci .long 0x9EC8E952 59662306a36Sopenharmony_ci .long 0x9999999A 59762306a36Sopenharmony_ci .long 0x948B0FCE 59862306a36Sopenharmony_ci .long 0x8F9C18FA 59962306a36Sopenharmony_ci .long 0x8ACB90F7 60062306a36Sopenharmony_ci .long 0x86186187 60162306a36Sopenharmony_ci .long 0x81818182 60262306a36Sopenharmony_ci .long 0x7D05F418 60362306a36Sopenharmony_ci .long 0x78A4C818 60462306a36Sopenharmony_ci .long 0x745D1746 60562306a36Sopenharmony_ci .long 0x702E05C1 60662306a36Sopenharmony_ci .long 0x6C16C16D 60762306a36Sopenharmony_ci .long 0x68168169 60862306a36Sopenharmony_ci .long 0x642C8591 60962306a36Sopenharmony_ci .long 0x60581606 61062306a36Sopenharmony_ci .long 0x5C9882BA 61162306a36Sopenharmony_ci .long 0x58ED2309 61262306a36Sopenharmony_cidiv_table_inv: 61362306a36Sopenharmony_ci .long 0x55555556 61462306a36Sopenharmony_ci .long 0x51D07EAF 61562306a36Sopenharmony_ci .long 0x4E5E0A73 61662306a36Sopenharmony_ci .long 0x4AFD6A06 61762306a36Sopenharmony_ci .long 0x47AE147B 61862306a36Sopenharmony_ci .long 0x446F8657 61962306a36Sopenharmony_ci .long 0x41414142 62062306a36Sopenharmony_ci .long 0x3E22CBCF 62162306a36Sopenharmony_ci .long 0x3B13B13C 62262306a36Sopenharmony_ci .long 0x38138139 62362306a36Sopenharmony_ci .long 0x3521CFB3 62462306a36Sopenharmony_ci .long 0x323E34A3 62562306a36Sopenharmony_ci .long 0x2F684BDB 62662306a36Sopenharmony_ci .long 0x2C9FB4D9 62762306a36Sopenharmony_ci .long 0x29E4129F 62862306a36Sopenharmony_ci .long 0x27350B89 62962306a36Sopenharmony_ci .long 0x24924925 63062306a36Sopenharmony_ci .long 0x21FB7813 63162306a36Sopenharmony_ci .long 0x1F7047DD 63262306a36Sopenharmony_ci .long 0x1CF06ADB 63362306a36Sopenharmony_ci .long 0x1A7B9612 63462306a36Sopenharmony_ci .long 0x18118119 63562306a36Sopenharmony_ci .long 0x15B1E5F8 63662306a36Sopenharmony_ci .long 0x135C8114 63762306a36Sopenharmony_ci .long 0x11111112 63862306a36Sopenharmony_ci .long 0xECF56BF 63962306a36Sopenharmony_ci .long 0xC9714FC 64062306a36Sopenharmony_ci .long 0xA6810A7 64162306a36Sopenharmony_ci .long 0x8421085 64262306a36Sopenharmony_ci .long 0x624DD30 64362306a36Sopenharmony_ci .long 0x4104105 64462306a36Sopenharmony_ci .long 0x2040811 64562306a36Sopenharmony_ci /* maximum error: 0.987342 scaled: 0.921875*/ 646