Pristine Ack-5.5
[Ack-5.5.git] / util / int / do_incdec.c
1 /*
2  * Sources of the "INCREMENT/DECREMENT/ZERO" group instructions
3  */
4
5 /* $Id: do_incdec.c,v 2.7 1994/06/24 10:46:26 ceriel Exp $ */
6
7 #include        <em_abs.h>
8 #include        "global.h"
9 #include        "log.h"
10 #include        "nofloat.h"
11 #include        "trap.h"
12 #include        "mem.h"
13 #include        "text.h"
14 #include        "fra.h"
15 #include        "warn.h"
16
17 PRIVATE long inc(), dec();
18
19 DoINC()
20 {
21         /* INC -: Increment word on top of stack by 1 (*) */
22         LOG(("@Z6 DoINC()"));
23         spoilFRA();
24         wpush(inc(swpop()));
25 }
26
27 DoINL(l)
28         register long l;
29 {
30         /* INL l: Increment local or parameter (*) */
31         register ptr p;
32
33         LOG(("@Z6 DoINL(%ld)", l));
34         spoilFRA();
35         p = loc_addr(arg_l(l));
36         st_stw(p, inc(st_ldsw(p)));
37 }
38
39 DoINE(arg)
40         register long arg;
41 {
42         /* INE g: Increment external (*) */
43         register ptr p = i2p(arg);
44
45         LOG(("@Z6 DoINE(%lu)", p));
46         spoilFRA();
47         p = arg_g(p);
48         dt_stw(p, inc(dt_ldsw(p)));
49 }
50
51 DoDEC()
52 {
53         /* DEC -: Decrement word on top of stack by 1 (*) */
54         LOG(("@Z6 DoDEC()"));
55         spoilFRA();
56         wpush(dec(swpop()));
57 }
58
59 DoDEL(l)
60         register long l;
61 {
62         /* DEL l: Decrement local or parameter (*) */
63         register ptr p;
64
65         LOG(("@Z6 DoDEL(%ld)", l));
66         spoilFRA();
67         l = arg_l(l);
68         p = loc_addr(l);
69         st_stw(p, dec(st_ldsw(p)));
70 }
71
72 DoDEE(arg)
73         register long arg;
74 {
75         /* DEE g: Decrement external (*) */
76         register ptr p = i2p(arg);
77
78         LOG(("@Z6 DoDEE(%lu)", p));
79         spoilFRA();
80         p = arg_g(p);
81         dt_stw(p, dec(dt_ldsw(p)));
82 }
83
84 DoZRL(l)
85         register long l;
86 {
87         /* ZRL l: Zero local or parameter */
88
89         LOG(("@Z6 DoZRL(%ld)", l));
90         spoilFRA();
91         l = arg_l(l);
92         st_stw(loc_addr(l), 0L);
93 }
94
95 DoZRE(arg)
96         register long arg;
97 {
98         /* ZRE g: Zero external */
99         register ptr p = i2p(arg);
100
101         LOG(("@Z6 DoZRE(%lu)", p));
102         spoilFRA();
103         dt_stw(arg_g(p), 0L);
104 }
105
106 DoZRF(l)
107         register size l;
108 {
109         /* ZRF w: Load a floating zero of size w */
110 #ifndef NOFLOAT
111         LOG(("@Z6 DoZRF(%ld)", l));
112         spoilFRA();
113         fpush(0.0, arg_wf(l));
114 #else   /* NOFLOAT */
115         arg = arg;
116         nofloat();
117 #endif  /* NOFLOAT */
118 }
119
120 DoZER(l)
121         register size l;
122 {
123         /* ZER w: Load w zero bytes */
124         register size i;
125
126         LOG(("@Z6 DoZER(%ld)", l));
127         spoilFRA();
128         npush(0L, arg_w(l));
129
130 /*
131         for (i = arg_w(l); i; i -= wsize)
132                 wpush(0L);
133 */
134 }
135
136 PRIVATE long inc(l)
137         long l;
138 {
139         if (must_test && !(IgnMask&BIT(EIOVFL))) {
140                 if (l == i_maxsw)
141                         trap(EIOVFL);
142         }
143         return (l + 1);
144 }
145
146 PRIVATE long dec(l)
147         long l;
148 {
149         if (must_test && !(IgnMask&BIT(EIOVFL))) {
150                 if (l == i_minsw)
151                         trap(EIOVFL);
152         }
153         return (l - 1);
154 }
155