mediaop.isa (6800:335f8b406bb9) mediaop.isa (6801:353726c415f4)
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)) {
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 (ext & 0x1)
454 if (signedOp())
455 picked = (ULL(1) << (destBits - 1));
456 else
457 picked = 0;
458 }
459 } else {
460 if (overflow != 0) {
455 picked = (ULL(1) << (destBits - 1));
456 else
457 picked = 0;
458 }
459 } else {
460 if (overflow != 0) {
461 if (ext & 0x1)
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)) {
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 (ext & 0x1)
482 if (signedOp())
483 picked = (ULL(1) << (destBits - 1));
484 else
485 picked = 0;
486 }
487 } else {
488 if (overflow != 0) {
483 picked = (ULL(1) << (destBits - 1));
484 else
485 picked = 0;
486 }
487 } else {
488 if (overflow != 0) {
489 if (ext & 0x1)
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
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 (ext & 0x2) {
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
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 (ext & 0x2) {
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) {
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 (findCarry(sizeBits, resBits, arg1Bits, arg2Bits))
953 resBits = mask(sizeBits);
954 } else if (ext & 0x4) {
955 int arg1Sign = bits(arg1Bits, sizeBits - 1);
956 int arg2Sign = bits(arg2Bits, sizeBits - 1);
957 int resSign = bits(resBits, sizeBits - 1);
958 if ((arg1Sign == arg2Sign) && (arg1Sign != resSign)) {
959 if (resSign == 0)
960 resBits = (ULL(1) << (sizeBits - 1));
961 else
962 resBits = mask(sizeBits - 1);
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);
963 }
964 }
965
966 result = insertBits(result, hiIndex, loIndex, resBits);
967 }
968 FpDestReg.uqw = result;
969 '''
970

--- 8 unchanged lines hidden (view full) ---

979 for (int i = 0; i < items; i++) {
980 int hiIndex = (i + 1) * sizeBits - 1;
981 int loIndex = (i + 0) * sizeBits;
982 uint64_t arg1Bits = bits(FpSrcReg1.uqw, hiIndex, loIndex);
983 uint64_t arg2Bits = bits(FpSrcReg2.uqw, hiIndex, loIndex);
984 uint64_t resBits = arg1Bits - arg2Bits;
985
986 if (ext & 0x2) {
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) {
987 if (arg2Bits > arg1Bits) {
988 resBits = 0;
989 } else if (!findCarry(sizeBits, resBits,
990 arg1Bits, ~arg2Bits)) {
991 resBits = mask(sizeBits);
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 }
992 }
1006 }
993 } else if (ext & 0x4) {
994 int arg1Sign = bits(arg1Bits, sizeBits - 1);
995 int arg2Sign = !bits(arg2Bits, sizeBits - 1);
996 int resSign = bits(resBits, sizeBits - 1);
997 if ((arg1Sign == arg2Sign) && (arg1Sign != resSign)) {
998 if (resSign == 0)
999 resBits = (ULL(1) << (sizeBits - 1));
1000 else
1001 resBits = mask(sizeBits - 1);
1002 }
1003 }
1004
1005 result = insertBits(result, hiIndex, loIndex, resBits);
1006 }
1007 FpDestReg.uqw = result;
1008 '''
1009
1010 class Mmuli(MediaOp):

--- 14 unchanged lines hidden (view full) ---

1025 offset = i * (destBits - srcBits) + srcBits;
1026 }
1027 int srcHiIndex = (i + 1) * srcBits - 1 + offset;
1028 int srcLoIndex = (i + 0) * srcBits + offset;
1029 uint64_t arg1Bits = bits(FpSrcReg1.uqw, srcHiIndex, srcLoIndex);
1030 uint64_t arg2Bits = bits(FpSrcReg2.uqw, srcHiIndex, srcLoIndex);
1031 uint64_t resBits;
1032
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
1033 if (ext & 0x2) {
1037 if (signedOp()) {
1034 int64_t arg1 = arg1Bits |
1035 (0 - (arg1Bits & (ULL(1) << (srcBits - 1))));
1036 int64_t arg2 = arg2Bits |
1037 (0 - (arg2Bits & (ULL(1) << (srcBits - 1))));
1038 resBits = (uint64_t)(arg1 * arg2);
1039 } else {
1040 resBits = arg1Bits * arg2Bits;
1041 }

--- 514 unchanged lines hidden ---
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 ---