1/// Copyright (c) 2009 The Regents of The University of Michigan 2// All rights reserved. 3// 4// Redistribution and use in source and binary forms, with or without 5// modification, are permitted provided that the following conditions are 6// met: redistributions of source code must retain the above copyright 7// notice, this list of conditions and the following disclaimer; 8// redistributions in binary form must reproduce the above copyright --- 437 unchanged lines hidden (view full) --- 446 bits(FpSrcReg1.uqw, (i + 1) * srcBits - 1, 447 (i + 0) * srcBits); 448 unsigned signBit = bits(picked, srcBits - 1); 449 uint64_t overflow = bits(picked, srcBits - 1, destBits - 1); 450 451 // Handle saturation. 452 if (signBit) { 453 if (overflow != mask(destBits - srcBits + 1)) { |
454 if (signedOp()) |
455 picked = (ULL(1) << (destBits - 1)); 456 else 457 picked = 0; 458 } 459 } else { 460 if (overflow != 0) { |
461 if (signedOp()) |
462 picked = mask(destBits - 1); 463 else 464 picked = mask(destBits); 465 } 466 } 467 result = insertBits(result, 468 (i + 1) * destBits - 1, 469 (i + 0) * destBits, --- 4 unchanged lines hidden (view full) --- 474 bits(FpSrcReg2.uqw, (i - items + 1) * srcBits - 1, 475 (i - items + 0) * srcBits); 476 unsigned signBit = bits(picked, srcBits - 1); 477 uint64_t overflow = bits(picked, srcBits - 1, destBits - 1); 478 479 // Handle saturation. 480 if (signBit) { 481 if (overflow != mask(destBits - srcBits + 1)) { |
482 if (signedOp()) |
483 picked = (ULL(1) << (destBits - 1)); 484 else 485 picked = 0; 486 } 487 } else { 488 if (overflow != 0) { |
489 if (signedOp()) |
490 picked = mask(destBits - 1); 491 else 492 picked = mask(destBits); 493 } 494 } 495 result = insertBits(result, 496 (i + 1) * destBits - 1, 497 (i + 0) * destBits, --- 145 unchanged lines hidden (view full) --- 643 uint64_t arg1Bits = bits(FpSrcReg1.uqw, hiIndex, loIndex); 644 int64_t arg1 = arg1Bits | 645 (0 - (arg1Bits & (ULL(1) << (sizeBits - 1)))); 646 uint64_t arg2Bits = bits(FpSrcReg2.uqw, hiIndex, loIndex); 647 int64_t arg2 = arg2Bits | 648 (0 - (arg2Bits & (ULL(1) << (sizeBits - 1)))); 649 uint64_t resBits; 650 |
651 if (signedOp()) { |
652 if (arg1 < arg2) { 653 resBits = arg1Bits; 654 } else { 655 resBits = arg2Bits; 656 } 657 } else { 658 if (arg1Bits < arg2Bits) { 659 resBits = arg1Bits; --- 21 unchanged lines hidden (view full) --- 681 uint64_t arg1Bits = bits(FpSrcReg1.uqw, hiIndex, loIndex); 682 int64_t arg1 = arg1Bits | 683 (0 - (arg1Bits & (ULL(1) << (sizeBits - 1)))); 684 uint64_t arg2Bits = bits(FpSrcReg2.uqw, hiIndex, loIndex); 685 int64_t arg2 = arg2Bits | 686 (0 - (arg2Bits & (ULL(1) << (sizeBits - 1)))); 687 uint64_t resBits; 688 |
689 if (signedOp()) { |
690 if (arg1 > arg2) { 691 resBits = arg1Bits; 692 } else { 693 resBits = arg2Bits; 694 } 695 } else { 696 if (arg1Bits > arg2Bits) { 697 resBits = arg1Bits; --- 246 unchanged lines hidden (view full) --- 944 for (int i = 0; i < items; i++) { 945 int hiIndex = (i + 1) * sizeBits - 1; 946 int loIndex = (i + 0) * sizeBits; 947 uint64_t arg1Bits = bits(FpSrcReg1.uqw, hiIndex, loIndex); 948 uint64_t arg2Bits = bits(FpSrcReg2.uqw, hiIndex, loIndex); 949 uint64_t resBits = arg1Bits + arg2Bits; 950 951 if (ext & 0x2) { |
952 if (signedOp()) { 953 int arg1Sign = bits(arg1Bits, sizeBits - 1); 954 int arg2Sign = bits(arg2Bits, sizeBits - 1); 955 int resSign = bits(resBits, sizeBits - 1); 956 if ((arg1Sign == arg2Sign) && (arg1Sign != resSign)) { 957 if (resSign == 0) 958 resBits = (ULL(1) << (sizeBits - 1)); 959 else 960 resBits = mask(sizeBits - 1); 961 } 962 } else { 963 if (findCarry(sizeBits, resBits, arg1Bits, arg2Bits)) 964 resBits = mask(sizeBits); |
965 } 966 } 967 968 result = insertBits(result, hiIndex, loIndex, resBits); 969 } 970 FpDestReg.uqw = result; 971 ''' 972 --- 8 unchanged lines hidden (view full) --- 981 for (int i = 0; i < items; i++) { 982 int hiIndex = (i + 1) * sizeBits - 1; 983 int loIndex = (i + 0) * sizeBits; 984 uint64_t arg1Bits = bits(FpSrcReg1.uqw, hiIndex, loIndex); 985 uint64_t arg2Bits = bits(FpSrcReg2.uqw, hiIndex, loIndex); 986 uint64_t resBits = arg1Bits - arg2Bits; 987 988 if (ext & 0x2) { |
989 if (signedOp()) { 990 int arg1Sign = bits(arg1Bits, sizeBits - 1); 991 int arg2Sign = !bits(arg2Bits, sizeBits - 1); 992 int resSign = bits(resBits, sizeBits - 1); 993 if ((arg1Sign == arg2Sign) && (arg1Sign != resSign)) { 994 if (resSign == 0) 995 resBits = (ULL(1) << (sizeBits - 1)); 996 else 997 resBits = mask(sizeBits - 1); 998 } 999 } else { 1000 if (arg2Bits > arg1Bits) { 1001 resBits = 0; 1002 } else if (!findCarry(sizeBits, resBits, 1003 arg1Bits, ~arg2Bits)) { 1004 resBits = mask(sizeBits); 1005 } |
1006 } |
1007 } 1008 1009 result = insertBits(result, hiIndex, loIndex, resBits); 1010 } 1011 FpDestReg.uqw = result; 1012 ''' 1013 1014 class Mmuli(MediaOp): --- 14 unchanged lines hidden (view full) --- 1029 offset = i * (destBits - srcBits) + srcBits; 1030 } 1031 int srcHiIndex = (i + 1) * srcBits - 1 + offset; 1032 int srcLoIndex = (i + 0) * srcBits + offset; 1033 uint64_t arg1Bits = bits(FpSrcReg1.uqw, srcHiIndex, srcLoIndex); 1034 uint64_t arg2Bits = bits(FpSrcReg2.uqw, srcHiIndex, srcLoIndex); 1035 uint64_t resBits; 1036 |
1037 if (signedOp()) { |
1038 int64_t arg1 = arg1Bits | 1039 (0 - (arg1Bits & (ULL(1) << (srcBits - 1)))); 1040 int64_t arg2 = arg2Bits | 1041 (0 - (arg2Bits & (ULL(1) << (srcBits - 1)))); 1042 resBits = (uint64_t)(arg1 * arg2); 1043 } else { 1044 resBits = arg1Bits * arg2Bits; 1045 } --- 514 unchanged lines hidden --- |