mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
210 lines
5.0 KiB
210 lines
5.0 KiB
#include "insignia.h"
|
|
#include "host_def.h"
|
|
|
|
/*[
|
|
* Name: j_c_lang.c
|
|
*
|
|
* Derived From: (original)
|
|
*
|
|
* Author: Simon Frost
|
|
*
|
|
* Created On: December 1993
|
|
*
|
|
* Sccs ID: @(#)j_c_lang.c 1.3 07/28/94
|
|
*
|
|
* Purpose: Suppory routines for C rule translated J code.
|
|
* This file must be linked in with any such code.
|
|
*
|
|
* Design document:
|
|
* None.
|
|
*
|
|
* Test document:
|
|
* None.
|
|
*
|
|
* (c) Copyright Insignia Solutions Ltd., 1993. All rights reserved
|
|
]*/
|
|
|
|
/* variables to represent register usage */
|
|
IUH r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10,r11,r12,r13,r14,r15,
|
|
r16,r17,r18,r19,r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30,r31;
|
|
IUH rnull ; /* holder for NULL args */
|
|
|
|
#define NUM_HBITS (sizeof(IUH)*8)
|
|
#define MAX_BITPOS (NUM_HBITS - 1)
|
|
|
|
|
|
/*(
|
|
=============================== mask =============================
|
|
PURPOSE: Build bit mask for use in Jcode operations.
|
|
INPUT: bitpos : IUH starting bit position. (0 LSB, MSB at other end)
|
|
len : IUH no of bits in mask.
|
|
OUTPUT: Return IUH bitmask.
|
|
=========================================================================
|
|
)*/
|
|
GLOBAL IUH
|
|
mask IFN2(IUH, bitpos, IUH, len)
|
|
{
|
|
IUH movebit, res;
|
|
|
|
if (len == 0)
|
|
return(0);
|
|
|
|
if (bitpos > MAX_BITPOS || bitpos < 0)
|
|
{
|
|
printf("mask: bitpos %d out of range\n", bitpos);
|
|
return(0);
|
|
}
|
|
|
|
if (len > NUM_HBITS - bitpos)
|
|
{
|
|
printf("mask: len %d too great for starting bitpos %d\n", len, bitpos);
|
|
return(0);
|
|
}
|
|
|
|
/* set first bit for mask */
|
|
movebit = (IUH)1 << bitpos;
|
|
res = movebit;
|
|
/* now fill in bits to left */
|
|
while(--len)
|
|
{
|
|
movebit <<= 1;
|
|
res |= movebit;
|
|
}
|
|
return(res);
|
|
}
|
|
|
|
/*(
|
|
=============================== rorl =============================
|
|
PURPOSE: Rotate a long (IUH) right.
|
|
INPUT: src : IUH initial value.
|
|
rots : IUH no of bit places to rotate.
|
|
OUTPUT: Return IUH rotated result.
|
|
=========================================================================
|
|
)*/
|
|
GLOBAL IUH
|
|
rorl IFN2(IUH, src, IUH, rots)
|
|
{
|
|
IUH temp, res;
|
|
|
|
rots %= 32;
|
|
temp = src & mask(rots - 1, rots);
|
|
res = (src >> rots) | (temp << (32 - rots));
|
|
return(res);
|
|
}
|
|
|
|
/*(
|
|
=============================== rorw =============================
|
|
PURPOSE: Rotate the bottom word of an IUH right.
|
|
INPUT: src : IUH initial value.
|
|
rots : IUH no of bit places to rotate.
|
|
OUTPUT: Return IUH rotated result.
|
|
=========================================================================
|
|
)*/
|
|
GLOBAL IUH
|
|
rorw IFN2(IUH, src, IUH, rots)
|
|
{
|
|
IUH temp, res;
|
|
|
|
/* make copy of word and into two halves of temp & do one shift */
|
|
rots %= 16;
|
|
|
|
temp = src & 0xffff;
|
|
temp |= temp << 16;
|
|
temp >>= rots;
|
|
res = src & (IUH)-65536; /* 0xffff0000 or 64 bit equiv */
|
|
res |= temp & 0xffff;
|
|
return(res);
|
|
}
|
|
|
|
/*(
|
|
=============================== rorb =============================
|
|
PURPOSE: Rotate the bottom byte of an IUH right.
|
|
INPUT: src : IUH initial value.
|
|
rots : IUH no of bit places to rotate.
|
|
OUTPUT: Return IUH rotated result.
|
|
=========================================================================
|
|
)*/
|
|
GLOBAL IUH
|
|
rorb IFN2(IUH, src, IUH, rots)
|
|
{
|
|
IUH res;
|
|
IU16 temp;
|
|
|
|
/* make copy of byte and into two halves of temp & do one shift */
|
|
rots %= 8;
|
|
|
|
temp = src & 0xff;
|
|
temp |= temp << 8;
|
|
temp >>= rots;
|
|
res = src & (IUH)-256; /* 0xffffff00 or 64 bit equiv */
|
|
res |= temp & 0xff;
|
|
return(res);
|
|
}
|
|
|
|
/*(
|
|
=============================== roll =============================
|
|
PURPOSE: Rotate a long (IUH) left.
|
|
INPUT: src : IUH initial value.
|
|
rots : IUH no of bit places to rotate.
|
|
OUTPUT: Return IUH rotated result.
|
|
=========================================================================
|
|
)*/
|
|
GLOBAL IUH
|
|
roll IFN2(IUH, src, IUH, rots)
|
|
{
|
|
IUH temp, res;
|
|
|
|
rots %= 32;
|
|
temp = src & mask(31, rots);
|
|
res = (src << rots) | (temp >> (32 - rots));
|
|
return(res);
|
|
}
|
|
|
|
/*(
|
|
=============================== rolw =============================
|
|
PURPOSE: Rotate the bottom word of an IUH left.
|
|
INPUT: src : IUH initial value.
|
|
rots : IUH no of bit places to rotate.
|
|
OUTPUT: Return IUH rotated result.
|
|
=========================================================================
|
|
)*/
|
|
GLOBAL IUH
|
|
rolw IFN2(IUH, src, IUH, rots)
|
|
{
|
|
IUH temp, res;
|
|
|
|
/* make copy of word and into two halves of temp & do one shift */
|
|
rots %= 16;
|
|
|
|
temp = src & 0xffff;
|
|
temp |= temp << 16;
|
|
temp <<= rots;
|
|
res = src & (IUH)-65536; /* 0xffff0000 or 64 bit equiv */
|
|
res |= temp >> 16;
|
|
return(res);
|
|
}
|
|
|
|
/*(
|
|
=============================== rolb =============================
|
|
PURPOSE: Rotate the bottom byte of an IUH left.
|
|
INPUT: src : IUH initial value.
|
|
rots : IUH no of bit places to rotate.
|
|
OUTPUT: Return IUH rotated result.
|
|
=========================================================================
|
|
)*/
|
|
GLOBAL IUH
|
|
rolb IFN2(IUH, src, IUH, rots)
|
|
{
|
|
IUH res;
|
|
IU16 temp;
|
|
|
|
/* make copy of byte and into two halves of temp & do one shift */
|
|
rots %= 8;
|
|
|
|
temp = src & 0xff;
|
|
temp |= temp << 8;
|
|
temp <<= rots;
|
|
res = src & (IUH)-256; /* 0xffffff00 or 64 bit equiv */
|
|
res |= temp >> 8;
|
|
return(res);
|
|
}
|