1
0
Files
irix-657m-src/irix/kern/ml/dshiftv.c
2022-09-29 17:59:04 +03:00

259 lines
7.6 KiB
C

/**************************************************************************/
/* */
/* Copyright (C) 1989, Silicon Graphics, Inc. */
/* */
/* These coded instructions, statements, and computer programs contain */
/* unpublished proprietary information of Silicon Graphics, Inc., and */
/* are protected by Federal copyright law. They may not be disclosed */
/* to third parties or copied or duplicated in any form, in whole or */
/* in part, without the prior written consent of Silicon Graphics, Inc. */
/* */
/**************************************************************************/
/*
* The r4000 2.2 chip has a bug in double-word variable shifts.
* These routines will convert variable shifts to immediate shifts,
* which do work. It is expected that these routines will only be
* called in the 64-bit OS, which means they will be compiled into
* double-word immediate shifts.
*/
#include <sgidefs.h>
__int64_t ___dsrav( __int64_t opnd, __int64_t shamt )
{
/* get the low-order 6-bits for the shift amount */
switch ( shamt & 0x3f ) {
case 0: return opnd >> 0;
case 1: return opnd >> 1;
case 2: return opnd >> 2;
case 3: return opnd >> 3;
case 4: return opnd >> 4;
case 5: return opnd >> 5;
case 6: return opnd >> 6;
case 7: return opnd >> 7;
case 8: return opnd >> 8;
case 9: return opnd >> 9;
case 10: return opnd >> 10;
case 11: return opnd >> 11;
case 12: return opnd >> 12;
case 13: return opnd >> 13;
case 14: return opnd >> 14;
case 15: return opnd >> 15;
case 16: return opnd >> 16;
case 17: return opnd >> 17;
case 18: return opnd >> 18;
case 19: return opnd >> 19;
case 20: return opnd >> 20;
case 21: return opnd >> 21;
case 22: return opnd >> 22;
case 23: return opnd >> 23;
case 24: return opnd >> 24;
case 25: return opnd >> 25;
case 26: return opnd >> 26;
case 27: return opnd >> 27;
case 28: return opnd >> 28;
case 29: return opnd >> 29;
case 30: return opnd >> 30;
case 31: return opnd >> 31;
case 32: return opnd >> 32;
case 33: return opnd >> 33;
case 34: return opnd >> 34;
case 35: return opnd >> 35;
case 36: return opnd >> 36;
case 37: return opnd >> 37;
case 38: return opnd >> 38;
case 39: return opnd >> 39;
case 40: return opnd >> 40;
case 41: return opnd >> 41;
case 42: return opnd >> 42;
case 43: return opnd >> 43;
case 44: return opnd >> 44;
case 45: return opnd >> 45;
case 46: return opnd >> 46;
case 47: return opnd >> 47;
case 48: return opnd >> 48;
case 49: return opnd >> 49;
case 50: return opnd >> 50;
case 51: return opnd >> 51;
case 52: return opnd >> 52;
case 53: return opnd >> 53;
case 54: return opnd >> 54;
case 55: return opnd >> 55;
case 56: return opnd >> 56;
case 57: return opnd >> 57;
case 58: return opnd >> 58;
case 59: return opnd >> 59;
case 60: return opnd >> 60;
case 61: return opnd >> 61;
case 62: return opnd >> 62;
case 63: return opnd >> 63;
}
/* will never reach here, but return something nonetheless */
return 0;
}
__uint64_t ___dsrlv( __uint64_t opnd, __int64_t shamt )
{
/* get the low-order 6-bits for the shift amount */
switch ( shamt & 0x3f ) {
case 0: return opnd >> 0;
case 1: return opnd >> 1;
case 2: return opnd >> 2;
case 3: return opnd >> 3;
case 4: return opnd >> 4;
case 5: return opnd >> 5;
case 6: return opnd >> 6;
case 7: return opnd >> 7;
case 8: return opnd >> 8;
case 9: return opnd >> 9;
case 10: return opnd >> 10;
case 11: return opnd >> 11;
case 12: return opnd >> 12;
case 13: return opnd >> 13;
case 14: return opnd >> 14;
case 15: return opnd >> 15;
case 16: return opnd >> 16;
case 17: return opnd >> 17;
case 18: return opnd >> 18;
case 19: return opnd >> 19;
case 20: return opnd >> 20;
case 21: return opnd >> 21;
case 22: return opnd >> 22;
case 23: return opnd >> 23;
case 24: return opnd >> 24;
case 25: return opnd >> 25;
case 26: return opnd >> 26;
case 27: return opnd >> 27;
case 28: return opnd >> 28;
case 29: return opnd >> 29;
case 30: return opnd >> 30;
case 31: return opnd >> 31;
case 32: return opnd >> 32;
case 33: return opnd >> 33;
case 34: return opnd >> 34;
case 35: return opnd >> 35;
case 36: return opnd >> 36;
case 37: return opnd >> 37;
case 38: return opnd >> 38;
case 39: return opnd >> 39;
case 40: return opnd >> 40;
case 41: return opnd >> 41;
case 42: return opnd >> 42;
case 43: return opnd >> 43;
case 44: return opnd >> 44;
case 45: return opnd >> 45;
case 46: return opnd >> 46;
case 47: return opnd >> 47;
case 48: return opnd >> 48;
case 49: return opnd >> 49;
case 50: return opnd >> 50;
case 51: return opnd >> 51;
case 52: return opnd >> 52;
case 53: return opnd >> 53;
case 54: return opnd >> 54;
case 55: return opnd >> 55;
case 56: return opnd >> 56;
case 57: return opnd >> 57;
case 58: return opnd >> 58;
case 59: return opnd >> 59;
case 60: return opnd >> 60;
case 61: return opnd >> 61;
case 62: return opnd >> 62;
case 63: return opnd >> 63;
}
/* will never reach here, but return something nonetheless */
return 0;
}
__int64_t ___dsllv( __int64_t opnd, __int64_t shamt )
{
/* get the low-order 6-bits for the shift amount */
switch ( shamt & 0x3f ) {
case 0: return opnd << 0;
case 1: return opnd << 1;
case 2: return opnd << 2;
case 3: return opnd << 3;
case 4: return opnd << 4;
case 5: return opnd << 5;
case 6: return opnd << 6;
case 7: return opnd << 7;
case 8: return opnd << 8;
case 9: return opnd << 9;
case 10: return opnd << 10;
case 11: return opnd << 11;
case 12: return opnd << 12;
case 13: return opnd << 13;
case 14: return opnd << 14;
case 15: return opnd << 15;
case 16: return opnd << 16;
case 17: return opnd << 17;
case 18: return opnd << 18;
case 19: return opnd << 19;
case 20: return opnd << 20;
case 21: return opnd << 21;
case 22: return opnd << 22;
case 23: return opnd << 23;
case 24: return opnd << 24;
case 25: return opnd << 25;
case 26: return opnd << 26;
case 27: return opnd << 27;
case 28: return opnd << 28;
case 29: return opnd << 29;
case 30: return opnd << 30;
case 31: return opnd << 31;
case 32: return opnd << 32;
case 33: return opnd << 33;
case 34: return opnd << 34;
case 35: return opnd << 35;
case 36: return opnd << 36;
case 37: return opnd << 37;
case 38: return opnd << 38;
case 39: return opnd << 39;
case 40: return opnd << 40;
case 41: return opnd << 41;
case 42: return opnd << 42;
case 43: return opnd << 43;
case 44: return opnd << 44;
case 45: return opnd << 45;
case 46: return opnd << 46;
case 47: return opnd << 47;
case 48: return opnd << 48;
case 49: return opnd << 49;
case 50: return opnd << 50;
case 51: return opnd << 51;
case 52: return opnd << 52;
case 53: return opnd << 53;
case 54: return opnd << 54;
case 55: return opnd << 55;
case 56: return opnd << 56;
case 57: return opnd << 57;
case 58: return opnd << 58;
case 59: return opnd << 59;
case 60: return opnd << 60;
case 61: return opnd << 61;
case 62: return opnd << 62;
case 63: return opnd << 63;
}
/* will never reach here, but return something nonetheless */
return 0;
}