brintos

brintos / llvm-project-archived public Read only

0
0
Text · 10.5 KiB · 3e59526 Raw
400 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/*   FUNCTIONS Optimized double floating point operators                */10/* ==================================================================== */11/*      c = dadd_asm(a, b)                                              */12/* ====================================================================13 14QDOUBLE dadd(QDOUBLE a,QDOUBLE b) {15      QDOUBLE c;16      lint manta = a & MANTMASK;17      int  expa  = HEXAGON_R_sxth_R(a) ;18      lint mantb = b & MANTMASK;19      int  expb  = HEXAGON_R_sxth_R(b) ;20      int  exp, expdiff, j, k, hi, lo, cn;21      lint mant;22 23        expdiff = (int) HEXAGON_P_vabsdiffh_PP(a, b);24        expdiff = HEXAGON_R_sxth_R(expdiff) ;25        if (expdiff > 63) { expdiff = 62;}26        if (expa > expb) {27          exp = expa + 1;28          expa = 1;29          expb = expdiff + 1;30        } else {31          exp = expb + 1;32          expb = 1;33          expa = expdiff + 1;34        }35        mant = (manta>>expa) + (mantb>>expb);36 37        hi = (int) (mant>>32);38        lo = (int) (mant);39 40        k =  HEXAGON_R_normamt_R(hi);41        if(hi == 0 || hi == -1) k =  31+HEXAGON_R_normamt_R(lo);42 43        mant = (mant << k);44        cn  = (mant == 0x8000000000000000LL);45        exp = exp - k + cn;46 47        if (mant ==  0 || mant == -1)  exp = 0x8001;48        c = (mant & MANTMASK) | (((lint) exp) & EXP_MASK);49      return(c);50 }51 * ==================================================================== */52        .text53        .global dadd_asm54        .type dadd_asm, @function55dadd_asm:56 57#define manta      R058#define mantexpa   R1:059#define lmanta     R1:060#define mantb      R261#define mantexpb   R3:262#define lmantb     R3:263#define expa       R464#define expb       R565#define mantexpd   R7:666#define expd       R667#define exp        R868#define c63        R969#define lmant      R1:070#define manth      R171#define mantl      R072#define zero       R7:673#define zerol      R674#define minus      R3:275#define minusl     R276#define maxneg     R977#define minmin     R11:10  // exactly 0x800000000000000000LL78#define minminh    R1179#define k          R480#define kl         R581#define ce         P082        .falign83      {84        mantexpd = VABSDIFFH(mantexpa, mantexpb) //represented as 0x08001LL85        c63 = #6286        expa = SXTH(manta)87        expb = SXTH(mantb)88      } {89        expd = SXTH(expd)90        ce = CMP.GT(expa, expb);91        if ( ce.new) exp = add(expa, #1)92        if (!ce.new) exp = add(expb, #1)93      } {94        if ( ce) expa = #195        if (!ce) expb = #196        manta.L = #097        expd = MIN(expd, c63)98      } {99        if (!ce) expa = add(expd, #1)100        if ( ce) expb = add(expd, #1)101        mantb.L = #0102        zero = #0103      } {104        lmanta = ASR(lmanta, expa)105        lmantb = ASR(lmantb, expb)106        minmin = #0107      } {108        lmant = add(lmanta, lmantb)109        minus = #-1110        minminh.H = #0x8000111      } {112        k  = NORMAMT(manth)113        kl = NORMAMT(mantl)114        p0 = cmp.eq(manth, zerol)115        p1 = cmp.eq(manth, minusl)116      } {117        p0 = OR(p0, p1)118        if(p0.new) k = add(kl, #31)119        maxneg.H = #0120      } {121        mantexpa = ASL(lmant, k)122        exp = SUB(exp, k)123        maxneg.L = #0x8001124      } {125        p0 = cmp.eq(mantexpa, zero)126        p1 = cmp.eq(mantexpa, minus)127        manta.L = #0128        exp = ZXTH(exp)129      } {130        p2 = cmp.eq(mantexpa, minmin)    //is result 0x80....0131        if(p2.new) exp = add(exp, #1)132      }133#if (__HEXAGON_ARCH__ == 60)134      {135        p0 = OR(p0, p1)136        if( p0.new) manta = OR(manta,maxneg)137        if(!p0.new) manta = OR(manta,exp)138      }139        jumpr  r31140#else141      {142        p0 = OR(p0, p1)143        if( p0.new) manta = OR(manta,maxneg)144        if(!p0.new) manta = OR(manta,exp)145        jumpr  r31146      }147#endif148/* =================================================================== *149 QDOUBLE dsub(QDOUBLE a,QDOUBLE b) {150      QDOUBLE c;151      lint manta = a & MANTMASK;152      int  expa  = HEXAGON_R_sxth_R(a) ;153      lint mantb = b & MANTMASK;154      int  expb  = HEXAGON_R_sxth_R(b) ;155      int  exp, expdiff, j, k, hi, lo, cn;156      lint mant;157 158        expdiff = (int) HEXAGON_P_vabsdiffh_PP(a, b);159        expdiff = HEXAGON_R_sxth_R(expdiff) ;160        if (expdiff > 63) { expdiff = 62;}161        if (expa > expb) {162          exp = expa + 1;163          expa = 1;164          expb = expdiff + 1;165        } else {166          exp = expb + 1;167          expb = 1;168          expa = expdiff + 1;169        }170        mant = (manta>>expa) - (mantb>>expb);171 172        hi = (int) (mant>>32);173        lo = (int) (mant);174 175        k =  HEXAGON_R_normamt_R(hi);176        if(hi == 0 || hi == -1) k =  31+HEXAGON_R_normamt_R(lo);177 178        mant = (mant << k);179        cn  = (mant == 0x8000000000000000LL);180        exp = exp - k + cn;181 182        if (mant ==  0 || mant == -1)  exp = 0x8001;183        c = (mant & MANTMASK) | (((lint) exp) & EXP_MASK);184      return(c);185 }186 * ==================================================================== */187        .text188        .global dsub_asm189        .type dsub_asm, @function190dsub_asm:191 192#define manta      R0193#define mantexpa   R1:0194#define lmanta     R1:0195#define mantb      R2196#define mantexpb   R3:2197#define lmantb     R3:2198#define expa       R4199#define expb       R5200#define mantexpd   R7:6201#define expd       R6202#define exp        R8203#define c63        R9204#define lmant      R1:0205#define manth      R1206#define mantl      R0207#define zero       R7:6208#define zerol      R6209#define minus      R3:2210#define minusl     R2211#define maxneg     R9212#define minmin     R11:10  // exactly 0x800000000000000000LL213#define minminh    R11214#define k          R4215#define kl         R5216#define ce         P0217        .falign218      {219        mantexpd = VABSDIFFH(mantexpa, mantexpb) //represented as 0x08001LL220        c63 = #62221        expa = SXTH(manta)222        expb = SXTH(mantb)223      } {224        expd = SXTH(expd)225        ce = CMP.GT(expa, expb);226        if ( ce.new) exp = add(expa, #1)227        if (!ce.new) exp = add(expb, #1)228      } {229        if ( ce) expa = #1230        if (!ce) expb = #1231        manta.L = #0232        expd = MIN(expd, c63)233      } {234        if (!ce) expa = add(expd, #1)235        if ( ce) expb = add(expd, #1)236        mantb.L = #0237        zero = #0238      } {239        lmanta = ASR(lmanta, expa)240        lmantb = ASR(lmantb, expb)241        minmin = #0242      } {243        lmant = sub(lmanta, lmantb)244        minus = #-1245        minminh.H = #0x8000246      } {247        k  = NORMAMT(manth)248        kl = NORMAMT(mantl)249        p0 = cmp.eq(manth, zerol)250        p1 = cmp.eq(manth, minusl)251      } {252        p0 = OR(p0, p1)253        if(p0.new) k = add(kl, #31)254        maxneg.H = #0255      } {256        mantexpa = ASL(lmant, k)257        exp = SUB(exp, k)258        maxneg.L = #0x8001259      } {260        p0 = cmp.eq(mantexpa, zero)261        p1 = cmp.eq(mantexpa, minus)262        manta.L = #0263        exp = ZXTH(exp)264      } {265        p2 = cmp.eq(mantexpa, minmin)    //is result 0x80....0266        if(p2.new) exp = add(exp, #1)267      }268#if (__HEXAGON_ARCH__ == 60)269      {270        p0 = OR(p0, p1)271        if( p0.new) manta = OR(manta,maxneg)272        if(!p0.new) manta = OR(manta,exp)273      }274        jumpr  r31275#else276      {277        p0 = OR(p0, p1)278        if( p0.new) manta = OR(manta,maxneg)279        if(!p0.new) manta = OR(manta,exp)280        jumpr  r31281      }282#endif283/* ==================================================================== *284 QDOUBLE dmpy(QDOUBLE a,QDOUBLE b) {285        QDOUBLE c;286        lint manta = a & MANTMASK;287        int  expa  = HEXAGON_R_sxth_R(a) ;288        lint mantb = b & MANTMASK;289        int  expb  = HEXAGON_R_sxth_R(b) ;290        int exp, k;291        lint mant;292        int          hia, hib, hi, lo;293        unsigned int loa, lob;294 295        hia = (int)(a >> 32);296        loa = HEXAGON_R_extractu_RII((int)manta, 31, 1);297        hib = (int)(b >> 32);298        lob = HEXAGON_R_extractu_RII((int)mantb, 31, 1);299 300        mant = HEXAGON_P_mpy_RR(hia, lob);301        mant = HEXAGON_P_mpyacc_RR(mant,hib, loa);302        mant = (mant >> 30) + (HEXAGON_P_mpy_RR(hia, hib)<<1);303 304        hi = (int) (mant>>32);305        lo = (int) (mant);306 307        k =  HEXAGON_R_normamt_R(hi);308        if(hi == 0 || hi == -1) k =  31+HEXAGON_R_normamt_R(lo);309        mant = mant << k;310        exp = expa + expb - k;311        if (mant ==  0 || mant == -1)  exp = 0x8001;312        c = (mant & MANTMASK) | (((lint) exp) & EXP_MASK);313        return(c);314 }315 * ==================================================================== */316        .text317        .global dmpy_asm318        .type dmpy_asm, @function319dmpy_asm:320 321#define mantal     R0322#define mantah     R1323#define mantexpa   R1:0324#define mantbl     R2325#define mantbh     R3326#define mantexpb   R3:2327#define expa       R4328#define expb       R5329#define mantexpd   R7:6330#define exp        R8331#define lmantc     R11:10332#define mantch     R11333#define mantcl     R10334#define zero0      R7:6335#define zero0l     R6336#define minus1     R3:2337#define minus1l    R2338#define maxneg     R9339#define k          R4340#define kl         R5341 342        .falign343      {344        mantbl = lsr(mantbl, #16)345        mantal = lsr(mantal, #16)346        expa = sxth(mantal)347        expb = sxth(mantbl)348      }349      {350        lmantc = mpy(mantah, mantbh)351        mantexpd = mpy(mantah, mantbl)352      }353      {354        lmantc = add(lmantc, lmantc) //<<1355        mantexpd+= mpy(mantbh, mantal)356      }357      {358        lmantc += asr(mantexpd, #15)359        exp = add(expa, expb)360        zero0 = #0361        minus1 = #-1362      }363      {364        k  = normamt(mantch)365        kl = normamt(mantcl)366        p0 = cmp.eq(mantch, zero0l)367        p1 = cmp.eq(mantch, minus1l)368      }369      {370        p0 = or(p0, p1)371        if(p0.new) k = add(kl, #31)372        maxneg.H = #0373      }374      {375        mantexpa = asl(lmantc, k)376        exp = sub(exp, k)377        maxneg.L = #0x8001378      }379      {380        p0 = cmp.eq(mantexpa, zero0)381        p1 = cmp.eq(mantexpa, minus1)382        mantal.L = #0383        exp = zxth(exp)384      }385#if (__HEXAGON_ARCH__ == 60)386      {387        p0 = or(p0, p1)388        if( p0.new) mantal = or(mantal,maxneg)389        if(!p0.new) mantal = or(mantal,exp)390      }391        jumpr  r31392#else393      {394        p0 = or(p0, p1)395        if( p0.new) mantal = or(mantal,maxneg)396        if(!p0.new) mantal = or(mantal,exp)397        jumpr  r31398      }399#endif400