vfp.hh (8865:508635b3e666) | vfp.hh (10037:5cac77888310) |
---|---|
1/* | 1/* |
2 * Copyright (c) 2010 ARM Limited | 2 * Copyright (c) 2010-2013 ARM Limited |
3 * All rights reserved 4 * 5 * The license below extends only to copyright in the software and shall 6 * not be construed as granting a license to any other intellectual 7 * property including but not limited to intellectual property relating 8 * to a hardware implementation of the functionality of the software 9 * licensed hereunder. You may use the software subject to the license 10 * terms below provided that you ensure that this notice is replicated --- 88 unchanged lines hidden (view full) --- 99 FeRoundUpward = FE_UPWARD 100}; 101 102enum VfpRoundingMode 103{ 104 VfpRoundNearest = 0, 105 VfpRoundUpward = 1, 106 VfpRoundDown = 2, | 3 * All rights reserved 4 * 5 * The license below extends only to copyright in the software and shall 6 * not be construed as granting a license to any other intellectual 7 * property including but not limited to intellectual property relating 8 * to a hardware implementation of the functionality of the software 9 * licensed hereunder. You may use the software subject to the license 10 * terms below provided that you ensure that this notice is replicated --- 88 unchanged lines hidden (view full) --- 99 FeRoundUpward = FE_UPWARD 100}; 101 102enum VfpRoundingMode 103{ 104 VfpRoundNearest = 0, 105 VfpRoundUpward = 1, 106 VfpRoundDown = 2, |
107 VfpRoundZero = 3 | 107 VfpRoundZero = 3, 108 VfpRoundAway = 4 |
108}; 109 110static inline float bitsToFp(uint64_t, float); 111static inline double bitsToFp(uint64_t, double); 112static inline uint32_t fpToBits(float); 113static inline uint64_t fpToBits(double); 114 115template <class fpType> --- 91 unchanged lines hidden (view full) --- 207 const uint64_t qnan = 208 single ? 0x7fc00000 : ULL(0x7ff8000000000000); 209 return std::isnan(val) && ((fpToBits(val) & qnan) != qnan); 210} 211 212typedef int VfpSavedState; 213 214VfpSavedState prepFpState(uint32_t rMode); | 109}; 110 111static inline float bitsToFp(uint64_t, float); 112static inline double bitsToFp(uint64_t, double); 113static inline uint32_t fpToBits(float); 114static inline uint64_t fpToBits(double); 115 116template <class fpType> --- 91 unchanged lines hidden (view full) --- 208 const uint64_t qnan = 209 single ? 0x7fc00000 : ULL(0x7ff8000000000000); 210 return std::isnan(val) && ((fpToBits(val) & qnan) != qnan); 211} 212 213typedef int VfpSavedState; 214 215VfpSavedState prepFpState(uint32_t rMode); |
215void finishVfp(FPSCR &fpscr, VfpSavedState state, bool flush); | 216void finishVfp(FPSCR &fpscr, VfpSavedState state, bool flush, FPSCR mask = FpscrExcMask); |
216 217template <class fpType> 218fpType fixDest(FPSCR fpscr, fpType val, fpType op1); 219 220template <class fpType> 221fpType fixDest(FPSCR fpscr, fpType val, fpType op1, fpType op2); 222 223template <class fpType> 224fpType fixDivDest(FPSCR fpscr, fpType val, fpType op1, fpType op2); 225 226float fixFpDFpSDest(FPSCR fpscr, double val); 227double fixFpSFpDDest(FPSCR fpscr, float val); 228 229uint16_t vcvtFpSFpH(FPSCR &fpscr, bool flush, bool defaultNan, 230 uint32_t rMode, bool ahp, float op); | 217 218template <class fpType> 219fpType fixDest(FPSCR fpscr, fpType val, fpType op1); 220 221template <class fpType> 222fpType fixDest(FPSCR fpscr, fpType val, fpType op1, fpType op2); 223 224template <class fpType> 225fpType fixDivDest(FPSCR fpscr, fpType val, fpType op1, fpType op2); 226 227float fixFpDFpSDest(FPSCR fpscr, double val); 228double fixFpSFpDDest(FPSCR fpscr, float val); 229 230uint16_t vcvtFpSFpH(FPSCR &fpscr, bool flush, bool defaultNan, 231 uint32_t rMode, bool ahp, float op); |
231float vcvtFpHFpS(FPSCR &fpscr, bool defaultNan, bool ahp, uint16_t op); | 232uint16_t vcvtFpDFpH(FPSCR &fpscr, bool flush, bool defaultNan, 233 uint32_t rMode, bool ahp, double op); |
232 | 234 |
235float vcvtFpHFpS(FPSCR &fpscr, bool defaultNan, bool ahp, uint16_t op); 236double vcvtFpHFpD(FPSCR &fpscr, bool defaultNan, bool ahp, uint16_t op); 237 |
|
233static inline double 234makeDouble(uint32_t low, uint32_t high) 235{ 236 double junk = 0.0; 237 return bitsToFp((uint64_t)low | ((uint64_t)high << 32), junk); 238} 239 240static inline uint32_t 241lowFromDouble(double val) 242{ 243 return fpToBits(val); 244} 245 246static inline uint32_t 247highFromDouble(double val) 248{ 249 return fpToBits(val) >> 32; 250} 251 | 238static inline double 239makeDouble(uint32_t low, uint32_t high) 240{ 241 double junk = 0.0; 242 return bitsToFp((uint64_t)low | ((uint64_t)high << 32), junk); 243} 244 245static inline uint32_t 246lowFromDouble(double val) 247{ 248 return fpToBits(val); 249} 250 251static inline uint32_t 252highFromDouble(double val) 253{ 254 return fpToBits(val) >> 32; 255} 256 |
252uint64_t vfpFpSToFixed(float val, bool isSigned, bool half, 253 uint8_t imm, bool rzero = true); | 257static inline void 258setFPExceptions(int exceptions) { 259 feclearexcept(FeAllExceptions); 260 feraiseexcept(exceptions); 261} 262 263template <typename T> 264uint64_t 265vfpFpToFixed(T val, bool isSigned, uint8_t width, uint8_t imm, bool 266 useRmode = true, VfpRoundingMode roundMode = VfpRoundZero, 267 bool aarch64 = false) 268{ 269 int rmode; 270 bool roundAwayFix = false; 271 272 if (!useRmode) { 273 rmode = fegetround(); 274 } else { 275 switch (roundMode) 276 { 277 case VfpRoundNearest: 278 rmode = FeRoundNearest; 279 break; 280 case VfpRoundUpward: 281 rmode = FeRoundUpward; 282 break; 283 case VfpRoundDown: 284 rmode = FeRoundDown; 285 break; 286 case VfpRoundZero: 287 rmode = FeRoundZero; 288 break; 289 case VfpRoundAway: 290 // There is no equivalent rounding mode, use round down and we'll 291 // fix it later 292 rmode = FeRoundDown; 293 roundAwayFix = true; 294 break; 295 default: 296 panic("Unsupported roundMode %d\n", roundMode); 297 } 298 } 299 __asm__ __volatile__("" : "=m" (rmode) : "m" (rmode)); 300 fesetround(FeRoundNearest); 301 val = val * pow(2.0, imm); 302 __asm__ __volatile__("" : "=m" (val) : "m" (val)); 303 fesetround(rmode); 304 feclearexcept(FeAllExceptions); 305 __asm__ __volatile__("" : "=m" (val) : "m" (val)); 306 T origVal = val; 307 val = rint(val); 308 __asm__ __volatile__("" : "=m" (val) : "m" (val)); 309 310 int exceptions = fetestexcept(FeAllExceptions); 311 312 int fpType = std::fpclassify(val); 313 if (fpType == FP_SUBNORMAL || fpType == FP_NAN) { 314 if (fpType == FP_NAN) { 315 exceptions |= FeInvalid; 316 } 317 val = 0.0; 318 } else if (origVal != val) { 319 switch (rmode) { 320 case FeRoundNearest: 321 if (origVal - val > 0.5) 322 val += 1.0; 323 else if (val - origVal > 0.5) 324 val -= 1.0; 325 break; 326 case FeRoundDown: 327 if (roundAwayFix) { 328 // The ordering on the subtraction looks a bit odd in that we 329 // don't do the obvious origVal - val, instead we do 330 // -(val - origVal). This is required to get the corruct bit 331 // exact behaviour when very close to the 0.5 threshold. 332 volatile T error = val; 333 error -= origVal; 334 error = -error; 335 if ( (error > 0.5) || 336 ((error == 0.5) && (val >= 0)) ) 337 val += 1.0; 338 } else { 339 if (origVal < val) 340 val -= 1.0; 341 } 342 break; 343 case FeRoundUpward: 344 if (origVal > val) 345 val += 1.0; 346 break; 347 } 348 exceptions |= FeInexact; 349 } 350 351 __asm__ __volatile__("" : "=m" (val) : "m" (val)); 352 353 if (isSigned) { 354 bool outOfRange = false; 355 int64_t result = (int64_t) val; 356 uint64_t finalVal; 357 358 if (!aarch64) { 359 if (width == 16) { 360 finalVal = (int16_t)val; 361 } else if (width == 32) { 362 finalVal =(int32_t)val; 363 } else if (width == 64) { 364 finalVal = result; 365 } else { 366 panic("Unsupported width %d\n", width); 367 } 368 369 // check if value is in range 370 int64_t minVal = ~mask(width-1); 371 if ((double)val < minVal) { 372 outOfRange = true; 373 finalVal = minVal; 374 } 375 int64_t maxVal = mask(width-1); 376 if ((double)val > maxVal) { 377 outOfRange = true; 378 finalVal = maxVal; 379 } 380 } else { 381 bool isNeg = val < 0; 382 finalVal = result & mask(width); 383 // If the result is supposed to be less than 64 bits check that the 384 // upper bits that got thrown away are just sign extension bits 385 if (width != 64) { 386 outOfRange = ((uint64_t) result >> (width - 1)) != 387 (isNeg ? mask(64-width+1) : 0); 388 } 389 // Check if the original floating point value doesn't matches the 390 // integer version we are also out of range. So create a saturated 391 // result. 392 if (isNeg) { 393 outOfRange |= val < result; 394 if (outOfRange) { 395 finalVal = 1LL << (width-1); 396 } 397 } else { 398 outOfRange |= val > result; 399 if (outOfRange) { 400 finalVal = mask(width-1); 401 } 402 } 403 } 404 405 // Raise an exception if the value was out of range 406 if (outOfRange) { 407 exceptions |= FeInvalid; 408 exceptions &= ~FeInexact; 409 } 410 setFPExceptions(exceptions); 411 return finalVal; 412 } else { 413 if ((double)val < 0) { 414 exceptions |= FeInvalid; 415 exceptions &= ~FeInexact; 416 setFPExceptions(exceptions); 417 return 0; 418 } 419 420 uint64_t result = ((uint64_t) val) & mask(width); 421 if (val > result) { 422 exceptions |= FeInvalid; 423 exceptions &= ~FeInexact; 424 setFPExceptions(exceptions); 425 return mask(width); 426 } 427 428 setFPExceptions(exceptions); 429 return result; 430 } 431}; 432 433 |
254float vfpUFixedToFpS(bool flush, bool defaultNan, | 434float vfpUFixedToFpS(bool flush, bool defaultNan, |
255 uint32_t val, bool half, uint8_t imm); | 435 uint64_t val, uint8_t width, uint8_t imm); |
256float vfpSFixedToFpS(bool flush, bool defaultNan, | 436float vfpSFixedToFpS(bool flush, bool defaultNan, |
257 int32_t val, bool half, uint8_t imm); | 437 int64_t val, uint8_t width, uint8_t imm); |
258 | 438 |
259uint64_t vfpFpDToFixed(double val, bool isSigned, bool half, 260 uint8_t imm, bool rzero = true); | |
261double vfpUFixedToFpD(bool flush, bool defaultNan, | 439double vfpUFixedToFpD(bool flush, bool defaultNan, |
262 uint32_t val, bool half, uint8_t imm); | 440 uint64_t val, uint8_t width, uint8_t imm); |
263double vfpSFixedToFpD(bool flush, bool defaultNan, | 441double vfpSFixedToFpD(bool flush, bool defaultNan, |
264 int32_t val, bool half, uint8_t imm); | 442 int64_t val, uint8_t width, uint8_t imm); |
265 266float fprSqrtEstimate(FPSCR &fpscr, float op); 267uint32_t unsignedRSqrtEstimate(uint32_t op); 268 269float fpRecipEstimate(FPSCR &fpscr, float op); 270uint32_t unsignedRecipEstimate(uint32_t op); 271 272class VfpMacroOp : public PredMacroOp --- 14 unchanged lines hidden (view full) --- 287 {} 288 289 IntRegIndex addStride(IntRegIndex idx, unsigned stride); 290 void nextIdxs(IntRegIndex &dest, IntRegIndex &op1, IntRegIndex &op2); 291 void nextIdxs(IntRegIndex &dest, IntRegIndex &op1); 292 void nextIdxs(IntRegIndex &dest); 293}; 294 | 443 444float fprSqrtEstimate(FPSCR &fpscr, float op); 445uint32_t unsignedRSqrtEstimate(uint32_t op); 446 447float fpRecipEstimate(FPSCR &fpscr, float op); 448uint32_t unsignedRecipEstimate(uint32_t op); 449 450class VfpMacroOp : public PredMacroOp --- 14 unchanged lines hidden (view full) --- 465 {} 466 467 IntRegIndex addStride(IntRegIndex idx, unsigned stride); 468 void nextIdxs(IntRegIndex &dest, IntRegIndex &op1, IntRegIndex &op2); 469 void nextIdxs(IntRegIndex &dest, IntRegIndex &op1); 470 void nextIdxs(IntRegIndex &dest); 471}; 472 |
473template <typename T> 474static inline T 475fpAdd(T a, T b) 476{ 477 return a + b; 478}; 479 480template <typename T> 481static inline T 482fpSub(T a, T b) 483{ 484 return a - b; 485}; 486 |
|
295static inline float 296fpAddS(float a, float b) 297{ 298 return a + b; 299} 300 301static inline double 302fpAddD(double a, double b) --- 20 unchanged lines hidden (view full) --- 323} 324 325static inline double 326fpDivD(double a, double b) 327{ 328 return a / b; 329} 330 | 487static inline float 488fpAddS(float a, float b) 489{ 490 return a + b; 491} 492 493static inline double 494fpAddD(double a, double b) --- 20 unchanged lines hidden (view full) --- 515} 516 517static inline double 518fpDivD(double a, double b) 519{ 520 return a / b; 521} 522 |
523template <typename T> 524static inline T 525fpDiv(T a, T b) 526{ 527 return a / b; 528}; 529 530template <typename T> 531static inline T 532fpMulX(T a, T b) 533{ 534 uint64_t opData; 535 uint32_t sign1; 536 uint32_t sign2; 537 const bool single = (sizeof(T) == sizeof(float)); 538 if (single) { 539 opData = (fpToBits(a)); 540 sign1 = opData>>31; 541 opData = (fpToBits(b)); 542 sign2 = opData>>31; 543 } else { 544 opData = (fpToBits(a)); 545 sign1 = opData>>63; 546 opData = (fpToBits(b)); 547 sign2 = opData>>63; 548 } 549 bool inf1 = (std::fpclassify(a) == FP_INFINITE); 550 bool inf2 = (std::fpclassify(b) == FP_INFINITE); 551 bool zero1 = (std::fpclassify(a) == FP_ZERO); 552 bool zero2 = (std::fpclassify(b) == FP_ZERO); 553 if ((inf1 && zero2) || (zero1 && inf2)) { 554 if(sign1 ^ sign2) 555 return (T)(-2.0); 556 else 557 return (T)(2.0); 558 } else { 559 return (a * b); 560 } 561}; 562 563 564template <typename T> 565static inline T 566fpMul(T a, T b) 567{ 568 return a * b; 569}; 570 |
|
331static inline float 332fpMulS(float a, float b) 333{ 334 return a * b; 335} 336 337static inline double 338fpMulD(double a, double b) 339{ 340 return a * b; 341} 342 | 571static inline float 572fpMulS(float a, float b) 573{ 574 return a * b; 575} 576 577static inline double 578fpMulD(double a, double b) 579{ 580 return a * b; 581} 582 |
343static inline float 344fpMaxS(float a, float b) | 583template <typename T> 584static inline T 585// @todo remove this when all calls to it have been replaced with the new fplib implementation 586fpMulAdd(T op1, T op2, T addend) |
345{ | 587{ |
588 T result; 589 590 if (sizeof(T) == sizeof(float)) 591 result = fmaf(op1, op2, addend); 592 else 593 result = fma(op1, op2, addend); 594 595 // ARM doesn't generate signed nan's from this opperation, so fix up the result 596 if (std::isnan(result) && !std::isnan(op1) && 597 !std::isnan(op2) && !std::isnan(addend)) 598 { 599 uint64_t bitMask = ULL(0x1) << ((sizeof(T) * 8) - 1); 600 result = bitsToFp(fpToBits(result) & ~bitMask, op1); 601 } 602 return result; 603} 604 605template <typename T> 606static inline T 607fpRIntX(T a, FPSCR &fpscr) 608{ 609 T rVal; 610 611 rVal = rint(a); 612 if (rVal != a && !std::isnan(a)) 613 fpscr.ixc = 1; 614 return (rVal); 615}; 616 617template <typename T> 618static inline T 619fpMaxNum(T a, T b) 620{ 621 const bool single = (sizeof(T) == sizeof(float)); 622 const uint64_t qnan = single ? 0x7fc00000 : ULL(0x7ff8000000000000); 623 624 if (std::isnan(a)) 625 return ((fpToBits(a) & qnan) == qnan) ? b : a; 626 if (std::isnan(b)) 627 return ((fpToBits(b) & qnan) == qnan) ? a : b; |
|
346 // Handle comparisons of +0 and -0. 347 if (!std::signbit(a) && std::signbit(b)) 348 return a; | 628 // Handle comparisons of +0 and -0. 629 if (!std::signbit(a) && std::signbit(b)) 630 return a; |
349 return fmaxf(a, b); 350} | 631 return fmax(a, b); 632}; |
351 | 633 |
352static inline float 353fpMinS(float a, float b) | 634template <typename T> 635static inline T 636fpMax(T a, T b) |
354{ | 637{ |
638 if (std::isnan(a)) 639 return a; 640 if (std::isnan(b)) 641 return b; 642 return fpMaxNum<T>(a, b); 643}; 644 645template <typename T> 646static inline T 647fpMinNum(T a, T b) 648{ 649 const bool single = (sizeof(T) == sizeof(float)); 650 const uint64_t qnan = single ? 0x7fc00000 : ULL(0x7ff8000000000000); 651 652 if (std::isnan(a)) 653 return ((fpToBits(a) & qnan) == qnan) ? b : a; 654 if (std::isnan(b)) 655 return ((fpToBits(b) & qnan) == qnan) ? a : b; |
|
355 // Handle comparisons of +0 and -0. 356 if (std::signbit(a) && !std::signbit(b)) 357 return a; | 656 // Handle comparisons of +0 and -0. 657 if (std::signbit(a) && !std::signbit(b)) 658 return a; |
358 return fminf(a, b); 359} | 659 return fmin(a, b); 660}; |
360 | 661 |
662template <typename T> 663static inline T 664fpMin(T a, T b) 665{ 666 if (std::isnan(a)) 667 return a; 668 if (std::isnan(b)) 669 return b; 670 return fpMinNum<T>(a, b); 671}; 672 673template <typename T> 674static inline T 675fpRSqrts(T a, T b) 676{ 677 int fpClassA = std::fpclassify(a); 678 int fpClassB = std::fpclassify(b); 679 T aXb; 680 int fpClassAxB; 681 682 if ((fpClassA == FP_ZERO && fpClassB == FP_INFINITE) || 683 (fpClassA == FP_INFINITE && fpClassB == FP_ZERO)) { 684 return 1.5; 685 } 686 aXb = a*b; 687 fpClassAxB = std::fpclassify(aXb); 688 if(fpClassAxB == FP_SUBNORMAL) { 689 feraiseexcept(FeUnderflow); 690 return 1.5; 691 } 692 return (3.0 - (a * b)) / 2.0; 693}; 694 695template <typename T> 696static inline T 697fpRecps(T a, T b) 698{ 699 int fpClassA = std::fpclassify(a); 700 int fpClassB = std::fpclassify(b); 701 T aXb; 702 int fpClassAxB; 703 704 if ((fpClassA == FP_ZERO && fpClassB == FP_INFINITE) || 705 (fpClassA == FP_INFINITE && fpClassB == FP_ZERO)) { 706 return 2.0; 707 } 708 aXb = a*b; 709 fpClassAxB = std::fpclassify(aXb); 710 if(fpClassAxB == FP_SUBNORMAL) { 711 feraiseexcept(FeUnderflow); 712 return 2.0; 713 } 714 return 2.0 - (a * b); 715}; 716 717 |
|
361static inline float 362fpRSqrtsS(float a, float b) 363{ 364 int fpClassA = std::fpclassify(a); 365 int fpClassB = std::fpclassify(b); 366 float aXb; 367 int fpClassAxB; 368 --- 26 unchanged lines hidden (view full) --- 395 fpClassAxB = std::fpclassify(aXb); 396 if(fpClassAxB == FP_SUBNORMAL) { 397 feraiseexcept(FeUnderflow); 398 return 2.0; 399 } 400 return 2.0 - (a * b); 401} 402 | 718static inline float 719fpRSqrtsS(float a, float b) 720{ 721 int fpClassA = std::fpclassify(a); 722 int fpClassB = std::fpclassify(b); 723 float aXb; 724 int fpClassAxB; 725 --- 26 unchanged lines hidden (view full) --- 752 fpClassAxB = std::fpclassify(aXb); 753 if(fpClassAxB == FP_SUBNORMAL) { 754 feraiseexcept(FeUnderflow); 755 return 2.0; 756 } 757 return 2.0 - (a * b); 758} 759 |
760template <typename T> 761static inline T 762roundNEven(T a) { 763 T val; 764 765 val = round(a); 766 if (a - val == 0.5) { 767 if ( (((int) a) & 1) == 0 ) val += 1.0; 768 } 769 else if (a - val == -0.5) { 770 if ( (((int) a) & 1) == 0 ) val -= 1.0; 771 } 772 return val; 773} 774 775 776 |
|
403class FpOp : public PredOp 404{ 405 protected: 406 FpOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass) : 407 PredOp(mnem, _machInst, __opClass) 408 {} 409 410 virtual float --- 41 unchanged lines hidden (view full) --- 452 453 template <class fpType> 454 fpType 455 processNans(FPSCR &fpscr, bool &done, bool defaultNan, 456 fpType op1, fpType op2) const; 457 458 template <class fpType> 459 fpType | 777class FpOp : public PredOp 778{ 779 protected: 780 FpOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass) : 781 PredOp(mnem, _machInst, __opClass) 782 {} 783 784 virtual float --- 41 unchanged lines hidden (view full) --- 826 827 template <class fpType> 828 fpType 829 processNans(FPSCR &fpscr, bool &done, bool defaultNan, 830 fpType op1, fpType op2) const; 831 832 template <class fpType> 833 fpType |
834 ternaryOp(FPSCR &fpscr, fpType op1, fpType op2, fpType op3, 835 fpType (*func)(fpType, fpType, fpType), 836 bool flush, bool defaultNan, uint32_t rMode) const; 837 838 template <class fpType> 839 fpType |
|
460 binaryOp(FPSCR &fpscr, fpType op1, fpType op2, 461 fpType (*func)(fpType, fpType), 462 bool flush, bool defaultNan, uint32_t rMode) const; 463 464 template <class fpType> 465 fpType 466 unaryOp(FPSCR &fpscr, fpType op1, 467 fpType (*func)(fpType), --- 5 unchanged lines hidden (view full) --- 473 if (flags[IsLastMicroop]) { 474 pcState.uEnd(); 475 } else if (flags[IsMicroop]) { 476 pcState.uAdvance(); 477 } else { 478 pcState.advance(); 479 } 480 } | 840 binaryOp(FPSCR &fpscr, fpType op1, fpType op2, 841 fpType (*func)(fpType, fpType), 842 bool flush, bool defaultNan, uint32_t rMode) const; 843 844 template <class fpType> 845 fpType 846 unaryOp(FPSCR &fpscr, fpType op1, 847 fpType (*func)(fpType), --- 5 unchanged lines hidden (view full) --- 853 if (flags[IsLastMicroop]) { 854 pcState.uEnd(); 855 } else if (flags[IsMicroop]) { 856 pcState.uAdvance(); 857 } else { 858 pcState.advance(); 859 } 860 } |
861 862 float 863 fpSqrt (FPSCR fpscr,float x) const 864 { 865 866 return unaryOp(fpscr,x,sqrtf,fpscr.fz,fpscr.rMode); 867 868 } 869 870 double 871 fpSqrt (FPSCR fpscr,double x) const 872 { 873 874 return unaryOp(fpscr,x,sqrt,fpscr.fz,fpscr.rMode); 875 876 } |
|
481}; 482 | 877}; 878 |
879class FpCondCompRegOp : public FpOp 880{ 881 protected: 882 IntRegIndex op1, op2; 883 ConditionCode condCode; 884 uint8_t defCc; 885 886 FpCondCompRegOp(const char *mnem, ExtMachInst _machInst, 887 OpClass __opClass, IntRegIndex _op1, IntRegIndex _op2, 888 ConditionCode _condCode, uint8_t _defCc) : 889 FpOp(mnem, _machInst, __opClass), 890 op1(_op1), op2(_op2), condCode(_condCode), defCc(_defCc) 891 {} 892 893 std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const; 894}; 895 896class FpCondSelOp : public FpOp 897{ 898 protected: 899 IntRegIndex dest, op1, op2; 900 ConditionCode condCode; 901 902 FpCondSelOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass, 903 IntRegIndex _dest, IntRegIndex _op1, IntRegIndex _op2, 904 ConditionCode _condCode) : 905 FpOp(mnem, _machInst, __opClass), 906 dest(_dest), op1(_op1), op2(_op2), condCode(_condCode) 907 {} 908 909 std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const; 910}; 911 |
|
483class FpRegRegOp : public FpOp 484{ 485 protected: 486 IntRegIndex dest; 487 IntRegIndex op1; 488 489 FpRegRegOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass, 490 IntRegIndex _dest, IntRegIndex _op1, --- 54 unchanged lines hidden (view full) --- 545 FpOp(mnem, _machInst, __opClass), dest(_dest), op1(_op1), op2(_op2) 546 { 547 setVfpMicroFlags(mode, flags); 548 } 549 550 std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const; 551}; 552 | 912class FpRegRegOp : public FpOp 913{ 914 protected: 915 IntRegIndex dest; 916 IntRegIndex op1; 917 918 FpRegRegOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass, 919 IntRegIndex _dest, IntRegIndex _op1, --- 54 unchanged lines hidden (view full) --- 974 FpOp(mnem, _machInst, __opClass), dest(_dest), op1(_op1), op2(_op2) 975 { 976 setVfpMicroFlags(mode, flags); 977 } 978 979 std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const; 980}; 981 |
982class FpRegRegRegRegOp : public FpOp 983{ 984 protected: 985 IntRegIndex dest; 986 IntRegIndex op1; 987 IntRegIndex op2; 988 IntRegIndex op3; 989 990 FpRegRegRegRegOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass, 991 IntRegIndex _dest, IntRegIndex _op1, IntRegIndex _op2, 992 IntRegIndex _op3, VfpMicroMode mode = VfpNotAMicroop) : 993 FpOp(mnem, _machInst, __opClass), dest(_dest), op1(_op1), op2(_op2), 994 op3(_op3) 995 { 996 setVfpMicroFlags(mode, flags); 997 } 998 999 std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const; 1000}; 1001 |
|
553class FpRegRegRegImmOp : public FpOp 554{ 555 protected: 556 IntRegIndex dest; 557 IntRegIndex op1; 558 IntRegIndex op2; 559 uint64_t imm; 560 --- 16 unchanged lines hidden --- | 1002class FpRegRegRegImmOp : public FpOp 1003{ 1004 protected: 1005 IntRegIndex dest; 1006 IntRegIndex op1; 1007 IntRegIndex op2; 1008 uint64_t imm; 1009 --- 16 unchanged lines hidden --- |