Pristine Ack-5.5
[Ack-5.5.git] / mach / vax4 / ce / mach.c
1 #define CODE_EXPANDER
2 #include <system.h>
3 #include <out.h>
4 #include "mach.h"
5 #include "back.h"
6
7 #ifdef DEBUG
8 arg_error( s, arg)
9 char *s;
10 int arg;
11 {
12         fprint( STDERR, "arg_error %s %d\n", s, arg);
13 }
14 #endif
15
16 con_float(str, argval)
17         char *str;
18         int argval;
19 {
20         double f;
21         double atof();
22         int i;
23         int j;
24         double frexp();
25         float fl;
26         char *p;
27
28         if (argval!= 4 && argval!= 8)   {
29                 arg_error("fcon", argval);
30                 argval = 8;
31         }
32         f = atof(str);
33         if (f == 0) {
34                 if (argval == 8) gen4((FOUR_BYTES) 0);
35                 gen4((FOUR_BYTES) 0);
36                 return;
37         }
38         if (argval == 4) {
39                 /* careful: avoid overflow */
40                 fl = frexp(f, &i);
41                 fl = frexp(fl,&j);
42                 if (i+j > 127) {
43                         /* overflow situation */
44                         gen1(0377);
45                         gen1(f<0?0377:0177);
46                         gen1(0377);
47                         gen1(0377);
48                         return;
49                 }
50                 if (i+j < -127) {
51                         /* underflow situation */
52                         gen1(0200);
53                         gen1(f<0?0200:0);
54                         gen1(0);
55                         gen1(0);
56                         return;
57                 }
58                 fl = f;
59                 p = (char *) &fl;
60         }
61         else {
62                 p = (char *) &f;
63         }
64         gen1(*p++&0377);
65         for (i = argval-1; i; i--) {
66                 gen1(*p++&0377);
67         }
68 }
69
70 __as_indexed(val, num)
71 {
72         if (fit_byte(val)) {
73                 text1( 0xa0 | num);
74                 text1( val);
75         } else if (fit_word(val)) {
76                 text1( 0xc0 | num);
77                 text2( val);
78         } else {
79                 text1( 0xe0 | num);
80                 text4( val);
81         }
82 }
83
84 __as_const(val)
85 {
86         if (fit_6bits(val)) {
87                 text1(val);
88         }
89         else {
90                 text1(0x8f);
91                 text4(val);
92         }
93 }