summaryrefslogtreecommitdiff
path: root/gas/testsuite/gas/tic4x/addressing.s
blob: 256ad5de26d0ed9626ac0bea64fdb0b7641f2b91 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
        ;; 
        ;; test all addressing modes and register constraints
        ;; (types/classes is read from include/opcodes/tic4x.h)
        ;;
	.text
start:
        
        ;;
        ;; Type B - infix condition branch
        ;;
Type_BI:bu      Type_BI         ; Unconditional branch (00000)
        bc      Type_BI         ; Carry branch (00001)
        blo     Type_BI         ; Lower than branch (00001)
        bls     Type_BI         ; Lower than or same branch (00010)
        bhi     Type_BI         ; Higher than branch (00011)
        bhs     Type_BI         ; Higher than or same branch (00100)
        bnc     Type_BI         ; No carry branch (00100)
        beq     Type_BI         ; Equal to branch (00101)
        bz      Type_BI         ; Zero branch (00101)
        bne     Type_BI         ; Not equal to branch (00110)
        bnz     Type_BI         ; Not zero branch (00110)
        blt     Type_BI         ; Less than branch (00111)
        bn      Type_BI         ; Negative branch (00111)
        ble     Type_BI         ; Less than or equal to branch (01000)
        bgt     Type_BI         ; Greater than branch (01001)
        bp      Type_BI         ; Positive branch (01001)
        bge     Type_BI         ; Greater than or equal branch (01010)
        bnn     Type_BI         ; Nonnegative branch (01010)
        bnv     Type_BI         ; No overflow branch (01000)
        bv      Type_BI         ; Overflow branch (01101)
        bnuf    Type_BI         ; No underflow branch (01110)
        buf     Type_BI         ; Underflow branch (01111)
        bnlv    Type_BI         ; No latched overflow branch (10000)
        blv     Type_BI         ; Latched overflow branch (10001)
        bnluf   Type_BI         ; No latched FP underflow branch (10010)
        bluf    Type_BI         ; Latched FP underflow branch (10011)
        bzuf    Type_BI         ; Zero or FP underflow branch (10100)
        b       Type_BI         ; Unconditional branch (00000)

        ;;
        ;; Type C - infix condition load
        ;;
Type_CI:ldiu    R0,R0           ; Unconditional load (00000)
        ldic    R0,R0           ; Carry load (00001)
        ldilo   R0,R0           ; Lower than load (00001)
        ldils   R0,R0           ; Lower than or same load (00010)
        ldihi   R0,R0           ; Higher than load (00011)
        ldihs   R0,R0           ; Higher than or same load (00100)
        ldinc   R0,R0           ; No carry load (00100)
        ldieq   R0,R0           ; Equal to load (00101)
        ldiz    R0,R0           ; Zero load (00101)
        ldine   R0,R0           ; Not equal to load (00110)
        ldinz   R0,R0           ; Not zero load (00110)
        ldil    R0,R0           ; Less than load (00111)
        ldin    R0,R0           ; Negative load (00111)
        ldile   R0,R0           ; Less than or equal to load (01000)
        ldigt   R0,R0           ; Greater than load (01001)
        ldip    R0,R0           ; Positive load (01001)
        ldige   R0,R0           ; Greater than or equal load (01010)
        ldinn   R0,R0           ; Nonnegative load (01010)
        ldinv   R0,R0           ; No overflow load (01000)
        ldiv    R0,R0           ; Overflow load (01101)
        ldinuf  R0,R0           ; No underflow load (01110)
        ldiuf   R0,R0           ; Underflow load (01111)
        ldinlv  R0,R0           ; No latched overflow load (10000)
        ldilv   R0,R0           ; Latched overflow load (10001)
        ldinluf R0,R0           ; No latched FP underflow load (10010)
        ldiluf  R0,R0           ; Latched FP underflow load (10011)
        ldizuf  R0,R0           ; Zero or FP underflow load (10100)

        ;;
        ;; Type * - Indirect (full)
        ;;
Type_ind:       
        ldi     *AR0,R0         ; Indirect addressing (G=10)
        ldi     *+AR0(5),R0     ;   with predisplacement add
        ldi     *-AR0(5),R0     ;   with predisplacement subtract
        ldi     *++AR0(5),R0    ;   with predisplacement add and modify
        ldi     *--AR0(5),R0    ;   with predisplacement subtract and modify
        ldi     *AR0++(5),R0    ;   with postdisplacement add and modify
        ldi     *AR0--(5),R0    ;   with postdisplacement subtract and modify
        ldi     *AR0++(5)%,R0   ;   with postdisplacement add and circular modify
        ldi     *AR0--(5)%,R0   ;   with postdisplacement subtract and circular modify
        ldi     *+AR0(IR0),R0   ;   with predisplacement add
        ldi     *-AR0(IR0),R0   ;   with predisplacement subtract
        ldi     *++AR0(IR0),R0  ;   with predisplacement add and modify
        ldi     *--AR0(IR0),R0  ;   with predisplacement subtract and modify
        ldi     *AR0++(IR0),R0  ;   with postdisplacement add and modify
        ldi     *AR0--(IR0),R0  ;   with postdisplacement subtract and modify
        ldi     *AR0++(IR0)%,R0 ;   with postdisplacement add and circular modify
        ldi     *AR0--(IR0)%,R0 ;   with postdisplacement subtract and circular modify
        ldi     *AR0++(IR0)B,R0 ;   with postincrement add and bit-reversed modify
        ldi     *AR0++,R0       ; Same as *AR0++(1)

        ;;
        ;; Type # - Direct for ldp
        ;;
Type_ldp:       
        ldp     12
        ldp     @start
        ldp     start

        ;;
        ;; Type @ - Direct
        ;;
Type_dir:       
        ldi     @start,R0
        ldi     start,R0
        ldi     @16,R0
        ldi     @65535,R0

        ;;
        ;; Type A - Address register
        ;;
Type_A: dbc     AR0,R0
        dbc     AR2,R0
        dbc     AR7,R0

        ;;
        ;; Type B - Unsigned integer (PC)
        ;;
Type_B: br      start
        br      0x809800

        ;;
        ;; Type C - Indirect
        ;;
        .ifdef TEST_C4X
Type_C: addc3   *+AR0(5),R0,R0
        .endif

        ;;
        ;; Type E - Register (all)
        ;;
Type_E: andn3   R0,R0,R0
        andn3   AR0,R0,R0
        addc3   DP,R0,R0
        andn3   R7,R0,R0

        ;;
        ;; Type e - Register (0-11)
        ;;
Type_ee:subf3   R7,R0,R0
        addf3   R0,R0,R0
        addf3   R7,R0,R0
        cmpf3   R7,R0
        .ifdef TEST_C4X
        addf3   R11,R0,R0
        .endif
        
        ;;
        ;; Type F - Short float immediate
        ;;
Type_F: ldf     0,R0
        ldf     3.5,R0
        ldf     -3.5,R0
        ldf     0e-3.5e-1,R0

        ;;
        ;; Type G - Register (all)
        ;;
Type_G: andn3   R0,AR0,R0
        addc3   R0,DP,R0
        addc3   R0,R0,R0
        andn3   R0,R7,R0

        ;;
        ;; Type g - Register (0-11)
        ;; 
Type_gg:subf3   R0,R7,R0
        addf3   R0,R0,R0
        addf3   R0,R7,R0
        cmpf3   R0,R7
        .ifdef  TEST_C4X
        addf3   R0,R11,R0
        .endif
        
        ;;
        ;; Type H - Register (0-7)
        ;;
Type_H: stf     R0,*AR0 &|| stf R0,*AR0
        stf     R0,*AR0 &|| stf R2,*AR0
        stf     R0,*AR0 &|| stf R7,*AR0

        ;;
        ;; Type I - Indirect
        ;;
Type_I: addf3   *AR0,R0,R0      ; Indirect addressing (G=10)
        addf3   *+AR0(1),R0,R0  ;   with predisplacement add
        addf3   *-AR0(1),R0,R0  ;   with predisplacement subtract
        addf3   *++AR0(1),R0,R0 ;   with predisplacement add and modify
        addf3   *--AR0(1),R0,R0 ;   with predisplacement subtract and modify
        addf3   *AR0++(1),R0,R0 ;   with postdisplacement add and modify
        addf3   *AR0--(1),R0,R0 ;   with postdisplacement subtract and modify
        addf3   *AR0++(1)%,R0,R0;   with postdisplacement add and circular modify
        addf3   *AR0--(1)%,R0,R0;   with postdisplacement subtract and circular modify
        addf3   *+AR0(IR0),R0,R0;   with predisplacement add
        addf3   *-AR0(IR0),R0,R0;   with predisplacement subtract
        addf3   *++AR0(IR0),R0,R0;  with predisplacement add and modify
        addf3   *--AR0(IR0),R0,R0;  with predisplacement subtract and modify
        addf3   *AR0++(IR0),R0,R0;  with postdisplacement add and modify
        addf3   *AR0--(IR0),R0,R0;  with postdisplacement subtract and modify
        addf3   *AR0++(IR0)%,R0,R0; with postdisplacement add and circular modify
        addf3   *AR0--(IR0)%,R0,R0; with postdisplacement subtract and circular modify
        addf3   *AR0++(IR0)B,R0,R0; with postincrement add and bit-reversed modify
        addf3   *AR0++,R0,R0    ; Same as *AR0++(1)

        ;;
        ;; Type J - Indirect
        ;;
Type_J: addf3   R0,*AR0,R0      ; Indirect addressing (G=10)
        addf3   R0,*+AR0(1),R0  ;   with predisplacement add
        addf3   R0,*-AR0(1),R0  ;   with predisplacement subtract
        addf3   R0,*++AR0(1),R0 ;   with predisplacement add and modify
        addf3   R0,*--AR0(1),R0 ;   with predisplacement subtract and modify
        addf3   R0,*AR0++(1),R0 ;   with postdisplacement add and modify
        addf3   R0,*AR0--(1),R0 ;   with postdisplacement subtract and modify
        addf3   R0,*AR0++(1)%,R0;   with postdisplacement add and circular modify
        addf3   R0,*AR0--(1)%,R0;   with postdisplacement subtract and circular modify
        addf3   R0,*+AR0(IR0),R0;   with predisplacement add
        addf3   R0,*-AR0(IR0),R0;   with predisplacement subtract
        addf3   R0,*++AR0(IR0),R0;  with predisplacement add and modify
        addf3   R0,*--AR0(IR0),R0;  with predisplacement subtract and modify
        addf3   R0,*AR0++(IR0),R0;  with postdisplacement add and modify
        addf3   R0,*AR0--(IR0),R0;  with postdisplacement subtract and modify
        addf3   R0,*AR0++(IR0)%,R0; with postdisplacement add and circular modify
        addf3   R0,*AR0--(IR0)%,R0; with postdisplacement subtract and circular modify
        addf3   R0,*AR0++(IR0)B,R0; with postincrement add and bit-reversed modify
        addf3   R0,*AR0++,R0    ; Same as *AR0++(1)

        ;;
        ;; Type K - Register (0-7)
        ;;
Type_K: ldf     *AR0,R0 &|| ldf *AR0,R1
        ldf     *AR0,R0 &|| ldf *AR0,R2
        ldf     *AR0,R0 &|| ldf *AR0,R7

        ;;
        ;; Type L - Register (0-7)
        ;;
Type_L: stf     R0,*AR0 &|| stf R0,*AR0
        stf     R2,*AR0 &|| stf R0,*AR0
        stf     R7,*AR0 &|| stf R0,*AR0

        ;;
        ;; Type M - Register (2-3)
        ;; 
Type_M: mpyf3   *AR0,*AR0,R0 &|| addf3 R0,R0,R2
        mpyf3   *AR0,*AR0,R0 &|| addf3 R0,R0,R3
        
        ;;
        ;; Type N - Register (0-1)
        ;;
Type_N: mpyf3   *AR0,*AR0,R0 &|| addf3 R0,R0,R2
        mpyf3   *AR0,*AR0,R1 &|| addf3 R0,R0,R2

        ;;
        ;; Type O - Indirect
        ;;
        .ifdef TEST_C4X
Type_O: addc3   *+AR0(5),*+AR0(5),R0
        .endif
        
        ;;
        ;; Type P - Displacement (PC rel)
        ;; 
Type_P: callc   start
        callc   1

        ;;
        ;; Type Q - Register (all)
        ;;
Type_Q: ldi     R0,R0
        ldi     AR0,R0
        ldi     DP,R0
        ldi     SP,R0

        ;;
        ;; Type q - Register (0-11)
        ;;
Type_qq:fix     R0,R0
        fix     R7,R0
        .ifdef  TEST_C4X
        fix     R11,R0
        absf    R11,R0
        .endif

        ;;
        ;; Type R - Register (all)
        ;;
Type_R: ldi     R0,R0
        ldi     R0,AR0
        ldi     R0,DP
        ldi     R0,SP

        ;;
        ;; Type r - Register (0-11)
        ;;
Type_rr:ldf     R0,R0
        ldf     R0,R7
        .ifdef  TEST_C4X
        ldf     R0,R11
        .endif

        ;;
        ;; Type S - Signed immediate
        ;;
Type_S: ldi     0,R0
        ldi     -123,R0
        ldi     6543,R0
        ldi     -32768, R0

        ;;
        ;; Type T - Integer
        ;;
        .ifdef  TEST_C4X
Type_T: stik    0,*AR0
        stik    12,*AR0
        stik    -5,*AR0
        .endif

        ;;
        ;; Type U - Unsigned integer
        ;;
Type_U: and     0,R0
        and     256,R0
        and     65535,R0

        ;;
        ;; Type V - Vector
        ;;
Type_V: trapu   12
        trapu   0
        trapu   31
        .ifdef  TEST_C4X
        trapu   511
        .endif

        ;;
        ;; Type W - Short int
        ;;
        .ifdef  TEST_C4X
Type_W: addc3   -3,R0,R0
        addc3   5,R0,R0
        .endif

        ;;
        ;; Type X - Expansion register
        ;;
        .ifdef  TEST_C4X
Type_X: ldep    IVTP,R0
        ldep    TVTP,R0
        .endif
        
        ;;
        ;; Type Y - Address register
        ;;
        .ifdef  TEST_C4X
Type_Y: lda     R0,AR0
        lda     R0,DP
        lda     R0,SP
        lda     R0,IR0
        .endif

        ;;
        ;; Type Z - Expansion register
        ;;
        .ifdef  TEST_C4X
Type_Z: ldpe    R0,IVTP
        ldpe    R0,TVTP
        .endif