Pristine Ack-5.5
[Ack-5.5.git] / mach / mantra / int / mloop4
1 .sect .text
2 .sect .rom
3 .sect .data
4 .sect .bss
5 .sect .text
6 !----------------------------------------------------------------------------
7 !               CLEARS , INCREMENTS , DECREMENTS
8 !-----------------------------------------------------------------------------
9
10 inc_z:          move.l  sp,a0
11 4:
12 #if test
13                 comp    und,(a0)
14                 bne     3f      ;       bsr     e_iund
15 3:
16 #endif
17                 ad      #1,(a0)
18 #if test
19                 bvs     9f
20 #endif
21                 jmp     (a4)
22 #ifdef lword
23 inl__1W:        move.l  a2,a0   ;       sub.l   #4,a0   ;       bra 4b
24 inl__2W:        move.l  a2,a0   ;       sub.l   #8,a0   ;       bra 4b
25 inl__3W:        move.l  a2,a0   ;       sub.l   #12,a0  ;       bra 4b
26 #else
27 inl__1W:        move.l  a2,a0   ;       sub.l   #2,a0   ;       bra 4b
28 inl__2W:        move.l  a2,a0   ;       sub.l   #4,a0   ;       bra 4b
29 inl__3W:        move.l  a2,a0   ;       sub.l   #6,a0   ;       bra 4b
30 #endif
31 inl_w_1:        move.l  #-1,d0  ;       move.b  (a3)+,d0
32 2:              asl.l   wmu,d0
33 1:              move.l  a2,a0   ;       add.l   d0,a0   ;       bra 4b
34 inl_pw:         adroff          ;       move.w  (a5),d0
35 6:              asl.l   wmu,d0  ;       add.l   #0+l0,d0
36                 bra     1b 
37 inl_qpw:        move.l  (sp)+,d0 ;      bra     6b
38 inl_nw:         adroff          ;       move.w  (a5),d0 
39                 ext.l   d0      ;       bra     2b
40 inl_qnw:        move.l  (sp)+,d0 ;      bra     2b
41 ine_lw:         adroff          ;       move.w  (a5),d0 ;       bra 5f
42 ine_qw:         move.l  (sp)+,d0 ;      bra     5f
43 ine_w0:         clr.w   d0      ;       move.b  (a3)+,d0
44 5:              asl.l   wmu,d0  ;       move.l  d0,a0
45                 add.l   a6,a0   ;       bra     4b
46
47 !---------------------------------------------------------------------------
48
49 dec_z:          move.l  sp,a0
50 4:
51 #if test                        
52                 locptr
53                 heaptr
54                 extptr
55 7:              bra     e_badptr
56 6:
57                 comp    und,(a0)        ;bne    3f
58                 bsr     e_iund
59 3:
60 #endif
61                 subt    #1,(a0)
62 #if test
63                 bvs     9f
64 #endif
65                 jmp     (a4)
66 del_w_1:        move.l  #-1,d0  ;       move.b  (a3)+,d0
67 1:              asl.l   wmu,d0
68 2:              move.l  a2,a0   ;       add.l   d0,a0   ;       bra 4b
69 del_pw:         adroff          ;       move.w  (a5),d0
70 5:              asl.l   wmu,d0  ;       add.l   #0+l0,d0        ;       bra 2b
71 del_qpw:        move.l  (sp)+,d0 ;      bra     5b
72 del_nw:         adroff          ;       move.w  (a5),d0
73                 ext.l   d0      ;       bra     1f
74 del_qnw:        move.l  (sp)+,d0 ;      bra     1f
75 dee_w0:         clr.w   d0      ;       move.b  (a3)+,d0
76 0:              asl.l   wmu,d0  ;       move.l  d0,a0
77                 add.l   a6,a0   ;       bra     4b
78 dee_lw:         adroff          ;       move.w  (a5),d0 ;       bra 0b
79 dee_qw:         move.l  (sp)+,d0 ;      bra     0b
80
81 #if test
82 9:              bsr     e_iovfl         !error routine for integer overflow
83                 jmp     (a4)
84 #endif
85
86 !----------------------------------------------------------------------------
87
88 zrl__1W:        cl      l_1(a2) ;       jmp     (a4)
89 zrl__2W:        cl      l_2(a2) ;       jmp     (a4)
90 zrl_w_1:        move.l  #-1,d0  ;       move.b  (a3)+,d0
91 1:              asl.l   wmu,d0  ;       add.l   a2,d0
92                 move.l  d0,a0   
93 #if test
94                 locptr
95 7:              bra     e_badptr
96 6:
97 #endif
98                 cl      (a0)
99                 jmp     (a4)
100 zrl_nw:         adroff          ;       move.w  (a5),d0 
101                 ext.l   d0      ;       bra     1b
102 zrl_qnw:        move.l  (sp)+,d0 ;      bra     1b
103 zrl_pw:         adroff          ;       move.w  (a5),d0
104 2:              asl.l   wmu,d0  ;       add.l   a2,d0
105                 move.l  d0,a0   ;       cl      l0(a0)
106                 jmp     (a4)
107 zrl_qpw:        move.l  (sp)+,d0 ;      bra     2b
108 zre_lw:         adroff          ;       move.w  (a5),d0 ;       bra 7f
109 zre_qw:         move.l  (sp)+,d0 ;      bra     7f
110 zre_w0:         clr.w   d0      ;       move.b  (a3)+,d0
111 7:              asl.l   wmu,d0  ;       add.l   a6,d0
112                 move.l  d0,a0   
113 #if test
114                 extptr
115 7:              bra     e_badptr
116 6:
117 #endif
118                 cl      (a0)
119                 jmp     (a4)
120 zrf_l:          adroff          ;       move.w  (a5),d0 ;       bra 8f
121 zrf_z:          mov     (sp)+,d0
122 8:              move.l  d7,d1
123 3:              asr.w   #1,d0   ;       dbcs    d1,3b
124                 bcs     e_oddz  ;       sub.w   #1,d0
125 0:              cl      -(sp)   ;       dbra    d0,0b
126                 jmp     (a4)
127 zer_s0:         clr.w   d0      ;       move.b  (a3)+,d0        ; bra 8b
128 zer_l:          adroff          ;       move.w  (a5),d0 ;       bra 8b
129 zer_z:          mov     (sp),d0 ;       bra     8b
130 ! The test on illegal argument takes some time , specially in 4byte case.
131
132 !-----------------------------------------------------------------------
133 !               LOGICAL GROUP 
134 !-------------------------------------------------------------------------
135
136 and_1W:         mov     (sp)+,d1
137                 an      d1,(sp)
138                 jmp     (a4)
139 and_l:          adroff          ;       move.w  (a5),d0 ;       bra 1f
140 and_z:          mov     (sp)+,d0
141 1:              ble     e_oddz  ;       move.l  d0,a0
142                 move.l  d7,d2
143 2:              asr.l   #1,d0   ;       dbcs    d2,2b   ;       bcs e_oddz
144                 add.l   sp,a0   ;       sub.l   #1,d0
145 3:              mov     (sp)+,d1;       an      d1,(a0)+
146                 dbra    d0,3b   ;       jmp     (a4)
147
148 !------------------------------------------------------------------------------
149
150 ior_1W:         mov     (sp)+,d1;       inor    d1,(sp)
151                 jmp     (a4)
152 ior_s0:         clr.w   d0      ;       move.b  (a3)+,d0;       bra 4f
153 ior_l:          adroff          ;       move.w  (a5),d0 ;       bra 4f
154 ior_z:          mov     (sp)+,d0
155 4:              ble     e_oddz  ;       move.l  d0,a0
156                 move.l  d7,d2
157 5:              asr.l   #1,d0   ;       dbcs    d2,5b   ;       bcs e_oddz
158                 add.l   sp,a0   ;       sub.l   #1,d0
159                 move.l  d6,d1
160 3:              mov     (sp)+,d1
161                 inor    d1,(a0)+;       dbra    d0,3b
162                 jmp     (a4)
163
164 !----------------------------------------------------------------------------
165
166 xor_l:          adroff          ;       move.w  (a5),d0 ;       bra 6f
167 xor_z:          mov     (sp)+,d0
168 6:              ble     e_oddz  ;       move.l  d0,a0
169                 move.l  d7,d2
170 8:              asr.l   #1,d0   ;       dbcs    d2,8b   ;       bcs e_oddz
171                 add.l   sp,a0   ;       sub.l   #1,d0
172 7:              mov     (sp)+,d1
173                 exor    d1,(a0)+;       dbra    d0,7b
174                 jmp     (a4)
175
176 !----------------------------------------------------------------------------
177
178 com_l:          adroff          ;       move.w  (a5),d0 ;       bra 0f
179 com_z:          mov     (sp)+,d0
180 0:              ble     e_oddz  ;       move.l  d7,d2
181 1:              asr.l   #1,d0   ;       dbcs    d2,1b   ;       bcs e_oddz
182                 move.l  sp,a0   ;       sub.l   #1,d0
183 2:              nt      (a0)+   ;       dbra    d0,2b
184                 jmp     (a4)
185
186 !---------------------------------------------------------------------------
187
188 rol_l:          adroff          ;       move.w  (a5),d0 ;       bra 3f
189 rol_z:          mov     (sp)+,d0
190 3:              ble     e_oddz  ;       move.l  d7,d2
191 4:              asr.l   #1,d0   ;       dbcs    d2,4b
192                 bcs e_oddz
193                 sub.l   #1,d0
194                 mov     (sp)+,d1
195                 bmi     2f
196 0:              move.l  sp,a0           !d0 = #words-1 , d1 = shift count
197 5:              mov     (a0),d2 ;       rotl    d1,d2
198                 mov     d2,(a0)+;       dbra    d0,5b
199                 jmp     (a4)
200 2:              nega    d1      ;       bra     0f
201 2:              nega    d1      ;       bra     0b
202 ror_l:          adroff          ;       move.w  (a5),d0 ;       bra 6f
203 ror_z:          mov     (sp)+,d0
204 6:              ble     e_oddz  ;       move.l  d7,d2
205 7:              asr.l   #1,d0   ;       dbcs    d2,7b
206                 bcs     e_oddz  ;       sub.l   #1,d0
207                 mov     (sp)+,d1
208                 bmi     2b
209 0:              move.l  sp,a0
210 8:              mov     (a0),d2 ;       rotr    d1,d2
211                 mov     d2,(a0)+;       dbra    d0,8b
212                 jmp     (a4)
213
214 !-----------------------------------------------------------------------------
215 !               SET GROUP
216 !------------------------------------------------------------------------------
217
218 set_s0:         clr.w   d0      ;       move.b  (a3)+,d0
219 0:              ble     e_oddz  ;       move.l  #0,d1
220                 mov     (sp)+,d1;       move.l  d0,d2
221                 move.l  d7,d3
222 1:              asr.l   #1,d2   ;       dbcs    d3,1b
223                 bcs     e_oddz  ;       sub.l   #1,d2
224 2:              cl      -(sp)   ;       dbra    d2,2b
225                 move.l  sp,a0   ;       move.l  d1,d2
226                 asr.l   #3,d2   ;       cmp.l   d0,d2           !d2 byte number
227                 bmi     3f      ;       bsr     e_set
228                 jmp     (a4)
229 3:
230 #ifdef lword
231                 bchg    #1,d2                                   !0->3,1->2
232 #endif
233                 bchg    #0,d2   ;       add.l   d2,a0
234                 bset    d1,(a0) ;       jmp     (a4)    !d1 mod 8 bit set
235 set_l:          adroff          ;       move.w  (a5),d0 ;       bra 0b
236 set_z:          mov     (sp)+,d0;       bra     0b
237
238 !----------------------------------------------------------------------------
239
240 inn_s0:         clr.w   d0      ;       move.b  (a3)+,d0
241 0:              ble     e_oddz
242                 move.l  d6,d1   ;       mov     (sp)+,d1
243                 btst    #0,d0   ;       bne     e_oddz
244 #ifdef lword
245                 btst    #1,d0   ;       bne     e_oddz
246 #endif
247                 move.l  sp,a0   ;       add.l   d0,sp
248                 move.l  d1,d2   ;       asri    #3,d2
249                 comp    d2,d0   ;       bhi     3f
250                 cl      -(sp)
251 !#if test
252 !               bsr     e_set
253 !#endif
254                 jmp     (a4)
255 3:
256 #ifdef  lword
257                 bchg    #1,d2
258 #else
259                 ext.l   d2
260 #endif
261                 bchg    #0,d2   ;       add.l   d2,a0
262                 btst    d1,(a0) ;       beq     7f
263                 mov     #1,-(sp);       jmp     (a4)
264 7:              cl      -(sp)   ;       jmp     (a4)
265 inn_l:          adroff          ;       move.w  (a5),d0 ;       bra 0b
266 inn_z:          mov     (sp)+,d0;       bra     0b
267
268