123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383 |
- /*
- * Sources of the "CONVERT" group instructions
- */
- /* $Id$ */
- #include <em_abs.h>
- #include "nofloat.h"
- #include "global.h"
- #include "log.h"
- #include "mem.h"
- #include "trap.h"
- #include "text.h"
- #include "fra.h"
- #include "warn.h"
- #ifndef NOFLOAT
- extern double fpop();
- #endif /* NOFLOAT */
- DoCII()
- {
- /* CII -: Convert integer to integer (*) */
- register int newsize = swpop();
- register long s;
- LOG(("@C6 DoCII()"));
- spoilFRA();
- switch ((int)(10 * swpop() + newsize)) {
- 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);
- }
- }
- DoCUI()
- {
- /* CUI -: Convert unsigned to integer (*) */
- register int newsize = swpop();
- register unsigned long u;
- LOG(("@C6 DoCUI()"));
- spoilFRA();
- switch ((int)(10 * swpop() + newsize)) {
- 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);
- }
- }
- DoCFI()
- {
- /* CFI -: Convert floating to integer (*) */
- #ifndef NOFLOAT
- register int newsize = swpop();
- double f;
- LOG(("@C6 DoCFI()"));
- spoilFRA();
- switch ((int)(10 * swpop() + newsize)) {
- 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 */
- nofloat();
- #endif /* NOFLOAT */
- }
- DoCIF()
- {
- /* CIF -: Convert integer to floating (*) */
- #ifndef NOFLOAT
- register int newsize = swpop();
- LOG(("@C6 DoCIF()"));
- spoilFRA();
- switch ((int)(10 * swpop() + newsize)) {
- 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 */
- nofloat();
- #endif /* NOFLOAT */
- }
- DoCUF()
- {
- /* CUF -: Convert unsigned to floating (*) */
- #ifndef NOFLOAT
- register int newsize = swpop();
- register unsigned long u;
- LOG(("@C6 DoCUF()"));
- spoilFRA();
- switch ((int)(10 * swpop() + newsize)) {
- 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 */
- nofloat();
- #endif /* NOFLOAT */
- }
- DoCFF()
- {
- /* CFF -: Convert floating to floating (*) */
- #ifndef NOFLOAT
- register int newsize = swpop();
- LOG(("@C6 DoCFF()"));
- spoilFRA();
- switch ((int)(10 * swpop() + newsize)) {
- 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 */
- nofloat();
- #endif /* NOFLOAT */
- }
- DoCIU()
- {
- /* CIU -: Convert integer to unsigned */
- register int newsize = swpop();
- register long u;
- LOG(("@C6 DoCIU()"));
- spoilFRA();
- switch ((int)(10 * swpop() + newsize)) {
- 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);
- }
- }
- DoCUU()
- {
- /* CUU -: Convert unsigned to unsigned */
- register int newsize = swpop();
- LOG(("@C6 DoCUU()"));
- spoilFRA();
- switch ((int)(10 * swpop() + newsize)) {
- 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);
- }
- }
- DoCFU()
- {
- /* CFU -: Convert floating to unsigned */
- #ifndef NOFLOAT
- register int newsize = swpop();
- double f;
- LOG(("@C6 DoCFU()"));
- spoilFRA();
- switch ((int)(10 * swpop() + newsize)) {
- case 42:
- if (wsize == 4) {
- wtrap(WILLCONV, EILLINS);
- }
- f = fpop(4L);
- npush((long) f, 2L);
- return;
- case 44:
- f = fpop(4L);
- npush((long) f, 4L);
- return;
- case 82:
- if (wsize == 4) {
- wtrap(WILLCONV, EILLINS);
- }
- f = fpop(8L);
- npush((long) f, 2L);
- return;
- case 84:
- f = fpop(8L);
- npush((long) f, 4L);
- return;
- default:
- wtrap(WILLCONV, EILLINS);
- }
- #else /* NOFLOAT */
- nofloat();
- #endif /* NOFLOAT */
- }
|