brintos

brintos / llvm-project-archived public Read only

0
0
Text · 8.6 KiB · cf623f9 Raw
345 lines · plain
1//===----------------------Hexagon builtin routine ------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8/* ==================================================================== *9 10fast2_QLDOUBLE fast2_ldadd(fast2_QLDOUBLE a,fast2_QLDOUBLE b) {11      fast2_QLDOUBLE c;12      lint manta = a & MANTMASK;13      int  expa  = Q6_R_sxth_R(a) ;14      lint mantb = b & MANTMASK;15      int  expb  = Q6_R_sxth_R(b) ;16      int  exp, expdiff, j, k, hi, lo, cn;17      lint mant;18 19        expdiff = (int) Q6_P_vabsdiffh_PP(a, b);20        expdiff = Q6_R_sxth_R(expdiff) ;21        if (expdiff > 63) { expdiff = 62;}22        if (expa > expb) {23          exp = expa + 1;24          expa = 1;25          expb = expdiff + 1;26        } else {27          exp = expb + 1;28          expb = 1;29          expa = expdiff + 1;30        }31        mant = (manta>>expa) + (mantb>>expb);32 33        hi = (int) (mant>>32);34        lo = (int) (mant);35 36        k =  Q6_R_normamt_R(hi);37        if(hi == 0 || hi == -1) k = 31+Q6_R_normamt_R(lo);38 39        mant = (mant << k);40        cn  = (mant == 0x8000000000000000LL);41        exp = exp - k + cn;42 43        if (mant ==  0 || mant == -1)  exp = 0x8001;44        c = (mant & MANTMASK) | (((lint) exp) & EXP_MASK);45      return(c);46 }47 * ==================================================================== */48        .text49        .global fast2_ldadd_asm50        .type fast2_ldadd_asm, @function51fast2_ldadd_asm:52#define manta      R1:053#define lmanta     R1:054#define mantb      R3:255#define lmantb     R3:256#define expa       R457#define expb       R558#define expd       R659#define exp        R860#define c63        R961#define lmant      R1:062#define k          R463#define ce         P064#define zero       R3:265        .falign66      {67        expa = memw(r29+#8)68        expb = memw(r29+#24)69        r7 = r070      }71      {72        expd = sub(expa, expb):sat73        ce = CMP.GT(expa, expb);74        if ( ce.new) exp = add(expa, #1)75        if (!ce.new) exp = add(expb, #1)76      } {77        expd = abs(expd):sat78        if ( ce) expa = #179        if (!ce) expb = #180        c63 = #6281      } {82        expd = MIN(expd, c63)83        manta = memd(r29+#0)84        mantb = memd(r29+#16)85      } {86        if (!ce) expa = add(expd, #1)87        if ( ce) expb = add(expd, #1)88      } {89        lmanta = ASR(lmanta, expa)90        lmantb = ASR(lmantb, expb)91      } {92        lmant = add(lmanta, lmantb)93        zero = #094      } {95        k  = clb(lmant)96        c63.L =#0x000197      } {98        exp -= add(k, #-1)  //exp =  exp - (k-1)99        k = add(k, #-1)100        p0 = cmp.gt(k, #58)101        c63.H =#0x8000102      } {103        if(!p0)memw(r7+#8) = exp104        lmant = ASL(lmant, k)105        if(p0) jump .Ldenorma106      } {107        memd(r7+#0) = lmant108        jumpr  r31109      }110.Ldenorma:111        memd(r7+#0) = zero112      {113        memw(r7+#8) = c63114        jumpr  r31115      }116/* =================================================================== *117 fast2_QLDOUBLE fast2_ldsub(fast2_QLDOUBLE a,fast2_QLDOUBLE b) {118      fast2_QLDOUBLE c;119      lint manta = a & MANTMASK;120      int  expa  = Q6_R_sxth_R(a) ;121      lint mantb = b & MANTMASK;122      int  expb  = Q6_R_sxth_R(b) ;123      int  exp, expdiff, j, k;124      lint mant;125 126        expdiff = (int) Q6_P_vabsdiffh_PP(a, b);127        expdiff = Q6_R_sxth_R(expdiff) ;128        if (expdiff > 63) { expdiff = 62;}129        if (expa > expb) {130          exp = expa + 1;131          expa = 1;132          expb = expdiff + 1;133        } else {134          exp = expb + 1;135          expb = 1;136          expa = expdiff + 1;137        }138        mant = (manta>>expa) - (mantb>>expb);139        k =  Q6_R_clb_P(mant)-1;140        mant = (mant << k);141        exp = exp - k;142        if (mant ==  0 || mant == -1)  exp = 0x8001;143        c = (mant & MANTMASK) | (((lint) exp) & EXP_MASK);144      return(c);145 }146 * ==================================================================== */147        .text148        .global fast2_ldsub_asm149        .type fast2_ldsub_asm, @function150fast2_ldsub_asm:151#define manta      R1:0152#define lmanta     R1:0153#define mantb      R3:2154#define lmantb     R3:2155#define expa       R4156#define expb       R5157#define expd       R6158#define exp        R8159#define c63        R9160#define lmant      R1:0161#define k          R4162#define ce         P0163#define zero       R3:2164        .falign165      {166        expa = memw(r29+#8)167        expb = memw(r29+#24)168        r7 = r0169      }170      {171        expd = sub(expa, expb):sat172        ce = CMP.GT(expa, expb);173        if ( ce.new) exp = add(expa, #1)174        if (!ce.new) exp = add(expb, #1)175      } {176        expd = abs(expd):sat177        if ( ce) expa = #1178        if (!ce) expb = #1179        c63 = #62180      } {181        expd = min(expd, c63)182        manta = memd(r29+#0)183        mantb = memd(r29+#16)184      } {185        if (!ce) expa = add(expd, #1)186        if ( ce) expb = add(expd, #1)187      } {188        lmanta = ASR(lmanta, expa)189        lmantb = ASR(lmantb, expb)190      } {191        lmant = sub(lmanta, lmantb)192        zero = #0193      } {194        k  = clb(lmant)195        c63.L =#0x0001196      } {197        exp -= add(k, #-1)  //exp =  exp - (k+1)198        k = add(k, #-1)199        p0 = cmp.gt(k, #58)200        c63.H =#0x8000201      } {202        if(!p0)memw(r7+#8) = exp203        lmant = asl(lmant, k)204        if(p0) jump .Ldenorma_s205      } {206        memd(r7+#0) = lmant207        jumpr  r31208      }209.Ldenorma_s:210        memd(r7+#0) = zero211      {212        memw(r7+#8) = c63213        jumpr  r31214      }215 216/* ==================================================================== *217 fast2_QLDOUBLE fast2_ldmpy(fast2_QLDOUBLE a,fast2_QLDOUBLE b) {218        fast2_QLDOUBLE c;219        lint manta = a & MANTMASK;220        int  expa  = Q6_R_sxth_R(a) ;221        lint mantb = b & MANTMASK;222        int  expb  = Q6_R_sxth_R(b) ;223        int exp, k;224        lint mant;225        int          hia, hib, hi, lo;226        unsigned int loa, lob;227 228        hia = (int)(a >> 32);229        loa = Q6_R_extractu_RII((int)manta, 31, 1);230        hib = (int)(b >> 32);231        lob = Q6_R_extractu_RII((int)mantb, 31, 1);232 233        mant = Q6_P_mpy_RR(hia, lob);234        mant = Q6_P_mpyacc_RR(mant,hib, loa);235        mant = (mant >> 30) + (Q6_P_mpy_RR(hia, hib)<<1);236 237        hi = (int) (mant>>32);238 239        k =  Q6_R_normamt_R(hi);240        mant = mant << k;241        exp = expa + expb - k;242        if (mant ==  0 || mant == -1)  exp = 0x8001;243        c = (mant & MANTMASK) | (((lint) exp) & EXP_MASK);244        return(c);245 }246 * ==================================================================== */247        .text248        .global fast2_ldmpy_asm249        .type fast2_ldmpy_asm, @function250fast2_ldmpy_asm:251 252#define mantxl_    R9253#define mantxl     R14254#define mantxh     R15255#define mantx      R15:14256#define mantbl     R2257#define mantbl_    R8258#define mantbh     R3259#define mantb      R3:2260#define expa       R4261#define expb       R5262#define c8001      R8263#define mantd      R7:6264#define lmantc     R11:10265#define kp         R9266#define min        R13:12267#define minh       R13268#define max        R13:12269#define maxh       R13270#define ret        R0271 272        .falign273      {274        mantx = memd(r29+#0)275        mantb = memd(r29+#16)276        min = #0277      }278      {279        mantbl_= extractu(mantbl, #31, #1)280        mantxl_= extractu(mantxl, #31, #1)281        minh.H = #0x8000282      }283      {284        lmantc = mpy(mantxh, mantbh)285        mantd = mpy(mantxh, mantbl_)286        expa = memw(r29+#8)287        expb = memw(r29+#24)288      }289      {290        lmantc = add(lmantc, lmantc)291        mantd += mpy(mantbh, mantxl_)292      }293      {294        mantd = asr(mantd, #30)295        c8001.L =  #0x0001296        p1 = cmp.eq(mantx, mantb)297      }298      {299        mantd = add(mantd, lmantc)300        expa= add(expa, expb)301        p2 = cmp.eq(mantb, min)302      }303      {304        kp  = clb(mantd)305        c8001.H =  #0x8000306        p1 = and(p1, p2)307      }308      {309        expa-= add(kp, #-1)310        kp = add(kp, #-1)311        if(p1) jump .Lsat312      }313      {314        mantd = asl(mantd, kp)315        memw(ret+#8) = expa316	p0 = cmp.gt(kp, #58)317        if(p0.new) jump:NT .Ldenorm   //rarely happens318      }319      {320        memd(ret+#0) = mantd321        jumpr  r31322      }323.Lsat:324      {325        max = #0326        expa+= add(kp, #1)327      }328      {329        maxh.H = #0x4000330        memw(ret+#8) = expa331      }332      {333        memd(ret+#0) = max334        jumpr  r31335      }336.Ldenorm:337      {338        memw(ret+#8) = c8001339        mantx = #0340      }341      {342        memd(ret+#0) = mantx343        jumpr  r31344      }345