ack/util/int/do_conv.c

381 lines
6.4 KiB
C
Raw Normal View History

2019-03-17 14:42:00 +00:00
/** @file
1988-06-22 16:57:09 +00:00
* Sources of the "CONVERT" group instructions
*/
1994-06-24 11:31:16 +00:00
/* $Id$ */
1988-06-22 16:57:09 +00:00
2019-03-17 14:42:00 +00:00
#include "em_abs.h"
1988-06-22 16:57:09 +00:00
#include "nofloat.h"
#include "global.h"
#include "log.h"
#include "mem.h"
#include "trap.h"
#include "text.h"
#include "fra.h"
#include "warn.h"
2019-03-17 14:42:00 +00:00
#include "stack.h"
1988-06-22 16:57:09 +00:00
2019-03-17 14:42:00 +00:00
void DoCII(void)
1988-06-22 16:57:09 +00:00
{
/* CII -: Convert integer to integer (*) */
1989-11-22 13:38:37 +00:00
register int newsize = swpop();
1988-06-22 16:57:09 +00:00
register long s;
LOG(("@C6 DoCII()"));
1988-06-22 16:57:09 +00:00
spoilFRA();
1989-11-22 13:38:37 +00:00
switch ((int)(10 * swpop() + newsize)) {
1988-06-22 16:57:09 +00:00
case 12:
if (wsize == 4) {
wtrap(WILLCONV, EILLINS);
}
npush(spop(1L), 2L);
return;
case 14:
npush(spop(1L), 4L);
return;
case 22:
if (wsize == 4) {
wtrap(WILLCONV, EILLINS);
}
return;
case 24:
npush(spop(2L), 4L);
return;
case 42:
if (wsize == 4) {
wtrap(WILLCONV, EILLINS);
}
s = spop(4L);
if (must_test && !(IgnMask&BIT(ECONV))) {
if (s < I_MINS2 || s > I_MAXS2)
trap(ECONV);
}
npush(s, 2L);
return;
case 44:
return;
default:
wtrap(WILLCONV, EILLINS);
}
}
2019-03-17 14:42:00 +00:00
void DoCUI(void)
1988-06-22 16:57:09 +00:00
{
/* CUI -: Convert unsigned to integer (*) */
1989-11-22 13:38:37 +00:00
register int newsize = swpop();
1988-06-22 16:57:09 +00:00
register unsigned long u;
LOG(("@C6 DoCUI()"));
1988-06-22 16:57:09 +00:00
spoilFRA();
1989-11-22 13:38:37 +00:00
switch ((int)(10 * swpop() + newsize)) {
1988-06-22 16:57:09 +00:00
case 22:
if (wsize == 4) {
wtrap(WILLCONV, EILLINS);
}
u = upop(2L);
if (must_test && !(IgnMask&BIT(ECONV))) {
if (u > I_MAXS2)
trap(ECONV);
}
npush((long) u, 2L);
return;
case 24:
if (wsize == 4) {
wtrap(WILLCONV, EILLINS);
}
npush((long) upop(2L), 4L);
return;
case 42:
if (wsize == 4) {
wtrap(WILLCONV, EILLINS);
}
u = upop(4L);
if (must_test && !(IgnMask&BIT(ECONV))) {
if (u > I_MAXS2)
trap(ECONV);
}
npush((long) u, 2L);
return;
case 44:
u = upop(4L);
if (must_test && !(IgnMask&BIT(ECONV))) {
if (u > I_MAXS4)
trap(ECONV);
}
npush((long) u, 4L);
return;
default:
wtrap(WILLCONV, EILLINS);
}
}
2019-03-17 14:42:00 +00:00
void DoCFI(void)
1988-06-22 16:57:09 +00:00
{
/* CFI -: Convert floating to integer (*) */
#ifndef NOFLOAT
1989-11-22 13:38:37 +00:00
register int newsize = swpop();
1988-06-22 16:57:09 +00:00
double f;
LOG(("@C6 DoCFI()"));
1988-06-22 16:57:09 +00:00
spoilFRA();
1989-11-22 13:38:37 +00:00
switch ((int)(10 * swpop() + newsize)) {
1988-06-22 16:57:09 +00:00
case 42:
if (wsize == 4) {
wtrap(WILLCONV, EILLINS);
}
f = fpop(4L);
if (must_test && !(IgnMask&BIT(ECONV))) {
if (f <= (FL_MINS2 - 1.0) || f > FL_MAXS2)
trap(ECONV);
}
npush((long) f, 2L);
return;
case 44:
f = fpop(4L);
if (must_test && !(IgnMask&BIT(ECONV))) {
if (f <= (FL_MINS4 - 1.0) || f > FL_MAXS4)
trap(ECONV);
}
npush((long) f, 4L);
return;
case 82:
if (wsize == 4) {
wtrap(WILLCONV, EILLINS);
}
f = fpop(8L);
if (must_test && !(IgnMask&BIT(ECONV))) {
if (f <= (FL_MINS2 - 1.0) || f > FL_MAXS2)
trap(ECONV);
}
npush((long) f, 2L);
return;
case 84:
f = fpop(8L);
if (must_test && !(IgnMask&BIT(ECONV))) {
if (f <= (FL_MINS4 - 1.0) || f > FL_MAXS4)
trap(ECONV);
}
npush((long) f, 4L);
return;
default:
wtrap(WILLCONV, EILLINS);
}
#else /* NOFLOAT */
1988-06-22 16:57:09 +00:00
nofloat();
#endif /* NOFLOAT */
1988-06-22 16:57:09 +00:00
}
2019-03-17 14:42:00 +00:00
void DoCIF(void)
1988-06-22 16:57:09 +00:00
{
/* CIF -: Convert integer to floating (*) */
#ifndef NOFLOAT
1989-11-22 13:38:37 +00:00
register int newsize = swpop();
1988-06-22 16:57:09 +00:00
LOG(("@C6 DoCIF()"));
1988-06-22 16:57:09 +00:00
spoilFRA();
1989-11-22 13:38:37 +00:00
switch ((int)(10 * swpop() + newsize)) {
1988-06-22 16:57:09 +00:00
case 24:
if (wsize == 4) {
wtrap(WILLCONV, EILLINS);
}
fpush((double) spop(2L), 4L);
return;
case 28:
if (wsize == 4) {
wtrap(WILLCONV, EILLINS);
}
fpush((double) spop(2L), 8L);
return;
case 44:
fpush((double) spop(4L), 4L);
return;
case 48:
fpush((double) spop(4L), 8L);
return;
default:
wtrap(WILLCONV, EILLINS);
}
#else /* NOFLOAT */
1988-06-22 16:57:09 +00:00
nofloat();
#endif /* NOFLOAT */
1988-06-22 16:57:09 +00:00
}
2019-03-17 14:42:00 +00:00
void DoCUF(void)
1988-06-22 16:57:09 +00:00
{
/* CUF -: Convert unsigned to floating (*) */
#ifndef NOFLOAT
1989-11-22 13:38:37 +00:00
register int newsize = swpop();
1988-06-22 16:57:09 +00:00
register unsigned long u;
LOG(("@C6 DoCUF()"));
1988-06-22 16:57:09 +00:00
spoilFRA();
1989-11-22 13:38:37 +00:00
switch ((int)(10 * swpop() + newsize)) {
1988-06-22 16:57:09 +00:00
case 24:
if (wsize == 4) {
wtrap(WILLCONV, EILLINS);
}
fpush((double) upop(2L), 4L);
return;
case 28:
if (wsize == 4) {
wtrap(WILLCONV, EILLINS);
}
fpush((double) upop(2L), 8L);
return;
case 44:
if ((u = upop(4L)) > I_MAXS4) {
u -= I_MAXS4;
u -= 1;
fpush(((double) u) - (double)(-I_MAXS4-1), 4L);
}
else fpush((double) u, 4L);
return;
case 48:
if ((u = upop(4L)) > I_MAXS4) {
u -= I_MAXS4;
u -= 1;
fpush(((double) u) - (double)(-I_MAXS4-1), 8L);
}
else fpush((double) u, 8L);
return;
default:
wtrap(WILLCONV, EILLINS);
}
#else /* NOFLOAT */
1988-06-22 16:57:09 +00:00
nofloat();
#endif /* NOFLOAT */
1988-06-22 16:57:09 +00:00
}
2019-03-17 14:42:00 +00:00
void DoCFF(void)
1988-06-22 16:57:09 +00:00
{
/* CFF -: Convert floating to floating (*) */
#ifndef NOFLOAT
1989-11-22 13:38:37 +00:00
register int newsize = swpop();
1988-06-22 16:57:09 +00:00
LOG(("@C6 DoCFF()"));
1988-06-22 16:57:09 +00:00
spoilFRA();
1989-11-22 13:38:37 +00:00
switch ((int)(10 * swpop() + newsize)) {
1988-06-22 16:57:09 +00:00
case 44:
return;
case 48:
fpush(fpop(4L), 8L);
return;
case 88:
return;
case 84:
fpush(fpop(8L), 4L);
return;
default:
wtrap(WILLCONV, EILLINS);
}
#else /* NOFLOAT */
1988-06-22 16:57:09 +00:00
nofloat();
#endif /* NOFLOAT */
1988-06-22 16:57:09 +00:00
}
2019-03-17 14:42:00 +00:00
void DoCIU(void)
1988-06-22 16:57:09 +00:00
{
/* CIU -: Convert integer to unsigned */
1989-11-22 13:38:37 +00:00
register int newsize = swpop();
1988-06-22 16:57:09 +00:00
register long u;
LOG(("@C6 DoCIU()"));
1988-06-22 16:57:09 +00:00
spoilFRA();
1989-11-22 13:38:37 +00:00
switch ((int)(10 * swpop() + newsize)) {
1988-06-22 16:57:09 +00:00
case 22:
if (wsize == 4) {
wtrap(WILLCONV, EILLINS);
}
return;
case 24:
if (wsize == 4) {
wtrap(WILLCONV, EILLINS);
}
npush((long) upop(2L), 4L);
return;
case 42:
if (wsize == 4) {
wtrap(WILLCONV, EILLINS);
}
u = upop(4L);
npush(u, 2L);
return;
case 44:
return;
default:
wtrap(WILLCONV, EILLINS);
}
}
2019-03-17 14:42:00 +00:00
void DoCUU(void)
1988-06-22 16:57:09 +00:00
{
/* CUU -: Convert unsigned to unsigned */
1989-11-22 13:38:37 +00:00
register int newsize = swpop();
1988-06-22 16:57:09 +00:00
LOG(("@C6 DoCUU()"));
1988-06-22 16:57:09 +00:00
spoilFRA();
1989-11-22 13:38:37 +00:00
switch ((int)(10 * swpop() + newsize)) {
1988-06-22 16:57:09 +00:00
case 22:
if (wsize == 4) {
wtrap(WILLCONV, EILLINS);
}
return;
case 24:
if (wsize == 4) {
wtrap(WILLCONV, EILLINS);
}
npush((long) upop(2L), 4L);
return;
case 42:
if (wsize == 4) {
wtrap(WILLCONV, EILLINS);
}
npush((long) upop(4L), 2L);
return;
case 44:
return;
default:
wtrap(WILLCONV, EILLINS);
}
}
2019-03-17 14:42:00 +00:00
void DoCFU(void)
1988-06-22 16:57:09 +00:00
{
/* CFU -: Convert floating to unsigned */
#ifndef NOFLOAT
1989-11-22 13:38:37 +00:00
register int newsize = swpop();
1988-06-22 16:57:09 +00:00
double f;
LOG(("@C6 DoCFU()"));
1988-06-22 16:57:09 +00:00
spoilFRA();
1989-11-22 13:38:37 +00:00
switch ((int)(10 * swpop() + newsize)) {
1988-06-22 16:57:09 +00:00
case 42:
if (wsize == 4) {
wtrap(WILLCONV, EILLINS);
}
f = fpop(4L);
2011-06-15 08:56:58 +00:00
npush((unsigned long) f, 2L);
1988-06-22 16:57:09 +00:00
return;
case 44:
f = fpop(4L);
2011-06-15 08:56:58 +00:00
npush((unsigned long) f, 4L);
1988-06-22 16:57:09 +00:00
return;
case 82:
if (wsize == 4) {
wtrap(WILLCONV, EILLINS);
}
f = fpop(8L);
2011-06-15 08:56:58 +00:00
npush((unsigned long) f, 2L);
1988-06-22 16:57:09 +00:00
return;
case 84:
f = fpop(8L);
2011-06-15 08:56:58 +00:00
npush((unsigned long) f, 4L);
1988-06-22 16:57:09 +00:00
return;
default:
wtrap(WILLCONV, EILLINS);
}
#else /* NOFLOAT */
1988-06-22 16:57:09 +00:00
nofloat();
#endif /* NOFLOAT */
1988-06-22 16:57:09 +00:00
}