1 //===----------------------Hexagon builtin routine ------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
9 /* ==================================================================== *
11 fast2_QLDOUBLE fast2_ldadd(fast2_QLDOUBLE a,fast2_QLDOUBLE b) {
13 lint manta = a & MANTMASK;
14 int expa = Q6_R_sxth_R(a) ;
15 lint mantb = b & MANTMASK;
16 int expb = Q6_R_sxth_R(b) ;
17 int exp, expdiff, j, k, hi, lo, cn;
20 expdiff = (int) Q6_P_vabsdiffh_PP(a, b);
21 expdiff = Q6_R_sxth_R(expdiff) ;
22 if (expdiff > 63) { expdiff = 62;}
32 mant = (manta>>expa) + (mantb>>expb);
34 hi = (int) (mant>>32);
37 k = Q6_R_normamt_R(hi);
38 if(hi == 0 || hi == -1) k = 31+Q6_R_normamt_R(lo);
41 cn = (mant == 0x8000000000000000LL);
44 if (mant == 0 || mant == -1) exp = 0x8001;
45 c = (mant & MANTMASK) | (((lint) exp) & EXP_MASK);
48 * ==================================================================== */
50 .global fast2_ldadd_asm
51 .type fast2_ldadd_asm, @function
73 expd = sub(expa, expb):sat
74 ce = CMP.GT(expa, expb);
75 if ( ce.new) exp = add(expa, #1)
76 if (!ce.new) exp = add(expb, #1)
87 if (!ce) expa = add(expd, #1)
88 if ( ce) expb = add(expd, #1)
90 lmanta = ASR(lmanta, expa)
91 lmantb = ASR(lmantb, expb)
93 lmant = add(lmanta, lmantb)
99 exp -= add(k, #-1) //exp = exp - (k-1)
104 if(!p0)memw(r7+#8) = exp
105 lmant = ASL(lmant, k)
106 if(p0) jump .Ldenorma
117 /* =================================================================== *
118 fast2_QLDOUBLE fast2_ldsub(fast2_QLDOUBLE a,fast2_QLDOUBLE b) {
120 lint manta = a & MANTMASK;
121 int expa = Q6_R_sxth_R(a) ;
122 lint mantb = b & MANTMASK;
123 int expb = Q6_R_sxth_R(b) ;
124 int exp, expdiff, j, k;
127 expdiff = (int) Q6_P_vabsdiffh_PP(a, b);
128 expdiff = Q6_R_sxth_R(expdiff) ;
129 if (expdiff > 63) { expdiff = 62;}
139 mant = (manta>>expa) - (mantb>>expb);
140 k = Q6_R_clb_P(mant)-1;
143 if (mant == 0 || mant == -1) exp = 0x8001;
144 c = (mant & MANTMASK) | (((lint) exp) & EXP_MASK);
147 * ==================================================================== */
149 .global fast2_ldsub_asm
150 .type fast2_ldsub_asm, @function
172 expd = sub(expa, expb):sat
173 ce = CMP.GT(expa, expb);
174 if ( ce.new) exp = add(expa, #1)
175 if (!ce.new) exp = add(expb, #1)
182 expd = min(expd, c63)
184 mantb = memd(r29+#16)
186 if (!ce) expa = add(expd, #1)
187 if ( ce) expb = add(expd, #1)
189 lmanta = ASR(lmanta, expa)
190 lmantb = ASR(lmantb, expb)
192 lmant = sub(lmanta, lmantb)
198 exp -= add(k, #-1) //exp = exp - (k+1)
203 if(!p0)memw(r7+#8) = exp
204 lmant = asl(lmant, k)
205 if(p0) jump .Ldenorma_s
217 /* ==================================================================== *
218 fast2_QLDOUBLE fast2_ldmpy(fast2_QLDOUBLE a,fast2_QLDOUBLE b) {
220 lint manta = a & MANTMASK;
221 int expa = Q6_R_sxth_R(a) ;
222 lint mantb = b & MANTMASK;
223 int expb = Q6_R_sxth_R(b) ;
226 int hia, hib, hi, lo;
227 unsigned int loa, lob;
229 hia = (int)(a >> 32);
230 loa = Q6_R_extractu_RII((int)manta, 31, 1);
231 hib = (int)(b >> 32);
232 lob = Q6_R_extractu_RII((int)mantb, 31, 1);
234 mant = Q6_P_mpy_RR(hia, lob);
235 mant = Q6_P_mpyacc_RR(mant,hib, loa);
236 mant = (mant >> 30) + (Q6_P_mpy_RR(hia, hib)<<1);
238 hi = (int) (mant>>32);
240 k = Q6_R_normamt_R(hi);
242 exp = expa + expb - k;
243 if (mant == 0 || mant == -1) exp = 0x8001;
244 c = (mant & MANTMASK) | (((lint) exp) & EXP_MASK);
247 * ==================================================================== */
249 .global fast2_ldmpy_asm
250 .type fast2_ldmpy_asm, @function
265 #define lmantc R11:10
276 mantb = memd(r29+#16)
280 mantbl_= extractu(mantbl, #31, #1)
281 mantxl_= extractu(mantxl, #31, #1)
285 lmantc = mpy(mantxh, mantbh)
286 mantd = mpy(mantxh, mantbl_)
291 lmantc = add(lmantc, lmantc)
292 mantd += mpy(mantbh, mantxl_)
295 mantd = asr(mantd, #30)
297 p1 = cmp.eq(mantx, mantb)
300 mantd = add(mantd, lmantc)
301 expa= add(expa, expb)
302 p2 = cmp.eq(mantb, min)
315 mantd = asl(mantd, kp)
318 if(p0.new) jump:NT .Ldenorm //rarely happens