1%%% -*- erlang-indent-level: 2 -*-
2%%%
3%%% Licensed under the Apache License, Version 2.0 (the "License");
4%%% you may not use this file except in compliance with the License.
5%%% You may obtain a copy of the License at
6%%%
7%%%     http://www.apache.org/licenses/LICENSE-2.0
8%%%
9%%% Unless required by applicable law or agreed to in writing, software
10%%% distributed under the License is distributed on an "AS IS" BASIS,
11%%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12%%% See the License for the specific language governing permissions and
13%%% limitations under the License.
14%%%
15%%% Encode symbolic SPARC instructions to binary form.
16%%% Copyright (C) 2007-2008  Mikael Pettersson
17
18-module(hipe_sparc_encode).
19
20-export([insn_encode/2]).
21
22%%-define(TESTING,1).
23-ifdef(TESTING).
24-export([dotest/0, dotest/1]).
25-endif.
26
27-define(ASSERT(G),
28	if G -> [];
29	   true -> exit({assertion_failed,?MODULE,?LINE,??G})
30	end).
31
32bf(LeftBit, RightBit, Value) ->
33  ?ASSERT(32 > LeftBit),
34  ?ASSERT(LeftBit >= RightBit),
35  ?ASSERT(RightBit >= 0),
36  ?ASSERT(Value >= 0),
37  ?ASSERT(Value < (1 bsl ((LeftBit - RightBit) + 1))),
38  Value bsl RightBit.
39
40-define(BF(LB,RB,V), bf(LB,RB,V)).
41-define(BIT(Pos,Val), ?BF(Pos,Pos,Val)).
42%%-define(BITS(N,Val), ?BF(N,0,Val)).
43
44%%%
45%%% Instruction Formats
46%%%
47
48format1(Disp30) ->
49  ?BIT(30,1) bor ?BF(29,0,Disp30).
50
51format2a(Rd, Op2, Imm22) ->
52  ?BF(29,25,Rd) bor ?BF(24,22,Op2) bor ?BF(21,0,Imm22).
53
54format2b(A, Cond, Op2, Disp22) ->
55  ?BIT(29,A) bor ?BF(28,25,Cond) bor ?BF(24,22,Op2) bor ?BF(21,0,Disp22).
56
57format2c(A, Cond, Op2, CC1, CC0, P, Disp19) ->
58  ?BIT(29,A) bor ?BF(28,25,Cond) bor ?BF(24,22,Op2) bor ?BIT(21,CC1)
59  bor ?BIT(20,CC0) bor ?BIT(19,P) bor ?BF(18,0,Disp19).
60
61format2d(A, RCond, Op2, P, Rs1, Disp16) ->
62  D16Hi = Disp16 bsr 14,
63  D16Lo = Disp16 band 16#3FFF,
64  ?BIT(29,A) bor ?BF(27,25,RCond) bor ?BF(24,22,Op2) bor ?BF(21,20,D16Hi)
65  bor ?BIT(19,P) bor ?BF(18,14,Rs1) bor ?BF(13,0,D16Lo).
66
67format3common(Op, Rd, Op3, Rs1) ->	% format 3, bits 31..14
68  ?BF(31,30,Op) bor ?BF(29,25,Rd) bor ?BF(24,19,Op3) bor ?BF(18,14,Rs1).
69
70format3a(Op, Rd, Op3, Rs1, Rs2) ->
71  format3common(Op, Rd, Op3, Rs1) bor ?BF(4,0,Rs2).
72
73format3ax(Op, Rd, Op3, Rs1, Rs2) ->
74  format3a(Op, Rd, Op3, Rs1, Rs2) bor ?BIT(12,1).
75
76format3b(Op, Rd, Op3, Rs1, Simm13) ->
77  format3common(Op, Rd, Op3, Rs1) bor ?BIT(13,1) bor ?BF(12,0,Simm13).
78
79format3b32(Op, Rd, Op3, Rs1, Shcnt32) ->
80  format3a(Op, Rd, Op3, Rs1, Shcnt32) bor ?BIT(13,1).
81
82format3b64(Op, Rd, Op3, Rs1, Shcnt64) ->
83  format3common(Op, Rd, Op3, Rs1) bor ?BIT(13,1) bor ?BF(5,0,Shcnt64).
84
85format3ab(Op, {r,Rd}, Op3, {r,Rs1}, Src2) ->
86  case Src2 of
87    {r,Rs2} ->
88      format3a(Op, Rd, Op3, Rs1, Rs2);
89    {simm13,Simm13} ->
90      format3b(Op, Rd, Op3, Rs1, Simm13)
91  end.
92
93format3ab({Rs1,Src2,Rd}, Op3, Op) -> format3ab(Op, Rd, Op3, Rs1, Src2).
94
95-ifdef(notdef).
96format3c(Op, Rd, Op3, Rs1, Opf, Rs2) ->
97  format3h(Op, Rd, Op3, Rs1) bor (Opf bsl 5) bor Rs2.
98
99format3d(Op, Rd, Op3, Rs1, I, Rs2) ->
100  format3h(Op, Rd, Op3, Rs1) bor (I bsl 13) bor Rs2.
101-endif.
102
103%%%
104%%% Instruction Operands
105%%%
106
107'cond'(Cond) ->
108  case Cond of
109    'n'		-> 2#0000;
110    'e'		-> 2#0001;
111    'le'	-> 2#0010;
112    'l'		-> 2#0011;
113    'leu'	-> 2#0100;
114    'lu'	-> 2#0101;	% a.k.a. 'cs'
115    'neg'	-> 2#0110;
116    'vs'	-> 2#0111;
117    'a'		-> 2#1000;
118    'ne'	-> 2#1001;
119    'g'		-> 2#1010;
120    'ge'	-> 2#1011;
121    'gu'	-> 2#1100;
122    'geu'	-> 2#1101;	% a.k.a. 'cc'
123    'pos'	-> 2#1110;
124    'vc'	-> 2#1111
125  end.
126
127rcond(RCond) ->
128  case RCond of
129    'z'		-> 2#001;
130    'lez'	-> 2#010;
131    'lz'	-> 2#011;
132    'nz'	-> 2#101;
133    'gz'	-> 2#110;
134    'gez'	-> 2#111
135  end.
136
137pred(Pred) ->
138  case Pred of
139    'pt'	-> 1;
140    'pn'	-> 0
141  end.
142
143%%%
144%%% Branch Instructions
145%%%
146
147call({disp30,Disp30}) ->
148  format1(Disp30).
149
150ba({disp22,Disp22}) ->	% V7 Bicc, only used for unconditional branches
151  format2b(0, 'cond'('a'), 2#010, Disp22).
152
153bp({{'cond',Cond},{pred,Pred},{disp19,Disp19}}) ->
154  %% XXX: sparc64 will need CC1=1 here
155  format2c(0, 'cond'(Cond), 2#001, 0, 0, pred(Pred), Disp19).
156
157br({{rcond,RCond},{pred,Pred},{r,Rs1},{disp16,Disp16}}) ->
158  format2d(0, rcond(RCond), 2#011, pred(Pred), Rs1, Disp16).
159
160%%%
161%%% Integer Arithmetic Instructions
162%%%
163
164alu(Opnds, Op3) -> format3ab(Opnds, Op3, 2#10).
165
166add(Opnds)	-> alu(Opnds, 2#000000).
167addcc(Opnds)	-> alu(Opnds, 2#010000).
168%%addc(Opnds)	-> alu(Opnds, 2#001000).
169%%addccc(Opnds)	-> alu(Opnds, 2#011000).
170
171sub(Opnds)	-> alu(Opnds, 2#000100).
172subcc(Opnds)	-> alu(Opnds, 2#010100).
173%%subc(Opnds)	-> alu(Opnds, 2#001100). % XXX: hipe_sparc_op has bug here
174%%subccc(Opnds)	-> alu(Opnds, 2#011100). % XXX: hipe_sparc_op has bug here
175
176%%taddcc(Opnds)	-> alu(Opnds, 2#100000).
177%%taddcctv(Opnds)	-> alu(Opnds, 2#100010).
178
179%%tsubcc(Opnds)	-> alu(Opnds, 2#100001).
180%%tsubcctv(Opnds)	-> alu(Opnds, 2#100011).
181
182mulx(Opnds)	-> alu(Opnds, 2#001001).
183%%sdivx(Opnds)	-> alu(Opnds, 2#101101).
184%%udivx(Opnds)	-> alu(Opnds, 2#001101).
185
186%%umul(Opnds)	-> alu(Opnds, 2#001010).
187smul(Opnds)	-> alu(Opnds, 2#001011).
188%%umulcc(Opnds)	-> alu(Opnds, 2#011010).
189%%smulcc(Opnds)	-> alu(Opnds, 2#011011).
190
191'and'(Opnds)	-> alu(Opnds, 2#000001).
192andcc(Opnds)	-> alu(Opnds, 2#010001).
193%%andn(Opnds)	-> alu(Opnds, 2#000101).
194%%andncc(Opnds)	-> alu(Opnds, 2#010101).
195
196'or'(Opnds)	-> alu(Opnds, 2#000010).
197orcc(Opnds)	-> alu(Opnds, 2#010010).
198%%orn(Opnds)	-> alu(Opnds, 2#000110).
199%%orncc(Opnds)	-> alu(Opnds, 2#010110).
200
201'xor'(Opnds)	-> alu(Opnds, 2#000011).
202xorcc(Opnds)	-> alu(Opnds, 2#010011).
203%%xnor(Opnds)	-> alu(Opnds, 2#000111).
204%%xnorcc(Opnds)	-> alu(Opnds, 2#010111).
205
206shift32({{r,Rs1},Src2,{r,Rd}}, Op3) ->
207  case Src2 of
208    {r,Rs2} ->
209      format3a(2#10, Rd, Op3, Rs1, Rs2);
210    {uimm5,Shcnt32} ->
211      format3b32(2#10, Rd, Op3, Rs1, Shcnt32)
212  end.
213
214shift64({{r,Rs1},Src2,{r,Rd}}, Op3) ->
215  case Src2 of
216    {r,Rs2} ->
217      format3ax(2#10, Rd, Op3, Rs1, Rs2);
218    {uimm6,Shcnt64} ->
219      format3b64(2#10, Rd, Op3, Rs1, Shcnt64)
220  end.
221
222sll(Opnds)	-> shift32(Opnds, 2#100101).
223sllx(Opnds)	-> shift64(Opnds, 2#100101).
224srl(Opnds)	-> shift32(Opnds, 2#100110).
225srlx(Opnds)	-> shift64(Opnds, 2#100110).
226sra(Opnds)	-> shift32(Opnds, 2#100111).
227srax(Opnds)	-> shift64(Opnds, 2#100111).
228
229jmpl(Opnds)	-> alu(Opnds, 2#111000).
230
231rd({y,{r,Rd}})	-> format3a(2#10, Rd, 2#101000, 0, 0).
232
233sethi({{uimm22,UImm22},{r,Rd}}) -> format2a(Rd, 2#100, UImm22).
234
235ld(Opnds, Op3) -> format3ab(Opnds, Op3, 2#11).
236
237ldsb(Opnds)	-> ld(Opnds, 2#001001).
238ldsh(Opnds)	-> ld(Opnds, 2#001010).
239ldsw(Opnds)	-> ld(Opnds, 2#001000).
240ldub(Opnds)	-> ld(Opnds, 2#000001).
241lduh(Opnds)	-> ld(Opnds, 2#000010).
242lduw(Opnds)	-> ld(Opnds, 2#000000).
243ldx(Opnds)	-> ld(Opnds, 2#001011).
244%%ldd(Opnds)	-> ld(Opnds, 2#000011).
245
246st({Rd,Rs1,Src2}, Op3) -> format3ab(2#11, Rd, Op3, Rs1, Src2).
247
248stb(Opnds)	-> st(Opnds, 2#000101).
249%%sth(Opnds)	-> st(Opnds, 2#000110).
250stw(Opnds)	-> st(Opnds, 2#000100).
251stx(Opnds)	-> st(Opnds, 2#001110).
252%%std(Opnds)	-> st(Opnds, 2#000111).
253
254%%%
255%%% Floating-Point Instructions
256%%%
257
258format3f(Rd, Rs1, Opf, Rs2) ->
259  format3a(2#10, Rd, 2#110100, Rs1, Rs2) bor ?BF(13,5,Opf).
260
261fpop1binary(Opf, {{fr,Rs1},{fr,Rs2},{fr,Rd}}) ->
262  format3f(Rd, Rs1, Opf, Rs2).
263
264faddd(Opnds) ->		fpop1binary(2#001000010, Opnds).
265fdivd(Opnds) ->		fpop1binary(2#001001110, Opnds).
266fmuld(Opnds) ->		fpop1binary(2#001001010, Opnds).
267fsubd(Opnds) ->		fpop1binary(2#001000110, Opnds).
268
269fpop1unary(Opf, {{fr,Rs2},{fr,Rd}}) ->
270  format3f(Rd, 0, Opf, Rs2).
271
272fitod(Opnds) ->		fpop1unary(2#011001000, Opnds).
273fmovd(Opnds) ->		fpop1unary(2#000000010, Opnds).
274fnegd(Opnds) ->		fpop1unary(2#000000110, Opnds).
275
276ldf({{r,Rs1},{simm13,Simm13},{fr,Rd}}) ->
277  format3b(2#11, Rd, 2#100000, Rs1, Simm13).
278
279stf({{fr,Rd},{r,Rs1},{simm13,Simm13}}) ->
280  format3b(2#11, Rd, 2#100100, Rs1, Simm13).
281
282-ifdef(notdef).
283fpop1(Rs1,Opf,Rs2,Rd) ->        format3a(2#10, Rd, 2#110100, Rs1, Opf, Rs2).
284%% fpop2(Rs1,Opf,Rs2,Rd) ->        format3a(2#10, Rd, 2#110101, Rs1, Opf, Rs2).
285
286%% fxtos(Rs2, Rd) ->               fpop1(0,2#010000100,Rs2,Rd).
287%% fxtod(Rs2, Rd) ->               fpop1(0,2#010001000,Rs2,Rd).
288%% fxtoq(Rs2, Rd) ->               fpop1(0,2#010001100,Rs2,Rd).
289fitos(Rs2, Rd) ->               fpop1(0,2#011000100,Rs2,Rd).
290fitoq(Rs2, Rd) ->               fpop1(0,2#011001100,Rs2,Rd).
291
292%% fstox(Rs2, Rd) ->               fpop1(0,2#010000001,Rs2,Rd).
293%% fdtox(Rs2, Rd) ->               fpop1(0,2#010000010,Rs2,Rd).
294%% fqtox(Rs2, Rd) ->               fpop1(0,2#010000011,Rs2,Rd).
295%% fstoi(Rs2, Rd) ->               fpop1(0,2#011010001,Rs2,Rd).
296%% fdtoi(Rs2, Rd) ->               fpop1(0,2#011010010,Rs2,Rd).
297%% fqtoi(Rs2, Rd) ->               fpop1(0,2#011010011,Rs2,Rd).
298
299%% fstod(Rs2, Rd) ->               fpop1(0,2#011001001,Rs2,Rd).
300%% fstoq(Rs2, Rd) ->               fpop1(0,2#011001101,Rs2,Rd).
301%% fdtos(Rs2, Rd) ->               fpop1(0,2#011000110,Rs2,Rd).
302%% fdtoq(Rs2, Rd) ->               fpop1(0,2#011001110,Rs2,Rd).
303%% fqtos(Rs2, Rd) ->               fpop1(0,2#011000111,Rs2,Rd).
304%% fqtod(Rs2, Rd) ->               fpop1(0,2#011001011,Rs2,Rd).
305
306fmovs(Rs2, Rd) ->               fpop1(0,2#000000001,Rs2,Rd).
307fnegs(Rs2, Rd) ->               fpop1(0,2#000000101,Rs2,Rd).
308fabss(Rs2, Rd) ->               fpop1(0,2#000001001,Rs2,Rd).
309fabsd(Rs2, Rd) ->               fpop1(0,2#000001010,Rs2,Rd).
310fmovq(Rs2, Rd) ->               fpop1(0,2#000000011,Rs2,Rd).
311fnegq(Rs2, Rd) ->               fpop1(0,2#000000111,Rs2,Rd).
312fabsq(Rs2, Rd) ->               fpop1(0,2#000001011,Rs2,Rd).
313
314%% fsqrts(Rs2, Rd) ->              fpop1(0,2#000101001,Rs2,Rd).
315%% fsqrtd(Rs2, Rd) ->              fpop1(0,2#000101010,Rs2,Rd).
316%% fsqrtq(Rs2, Rd) ->              fpop1(0,2#000101011,Rs2,Rd).
317
318fadds(Rs1, Rs2, Rd) ->          fpop1(Rs1,2#001000001,Rs2,Rd).
319faddq(Rs1, Rs2, Rd) ->          fpop1(Rs1,2#001000011,Rs2,Rd).
320fsubs(Rs1, Rs2, Rd) ->          fpop1(Rs1,2#001000101,Rs2,Rd).
321fsubq(Rs1, Rs2, Rd) ->          fpop1(Rs1,2#001000111,Rs2,Rd).
322
323fmuls(Rs1, Rs2, Rd) ->          fpop1(Rs1,2#001001001,Rs2,Rd).
324fmulq(Rs1, Rs2, Rd) ->          fpop1(Rs1,2#001001011,Rs2,Rd).
325%% fsmuld(Rs1, Rs2, Rd) ->         fpop1(Rs1,2#001101001,Rs2,Rd).
326%% fdmulq(Rs1, Rs2, Rd) ->         fpop1(Rs1,2#001101110,Rs2,Rd).
327fdivs(Rs1, Rs2, Rd) ->          fpop1(Rs1,2#001001101,Rs2,Rd).
328fdivq(Rs1, Rs2, Rd) ->          fpop1(Rs1,2#001001111,Rs2,Rd).
329
330%% Uses fcc0
331%% fcmps(Rs1, Rs2) ->              fpop2(Rs1,2#001010001,Rs2,0).
332%% fcmpd(Rs1, Rs2) ->              fpop2(Rs1,2#001010010,Rs2,0).
333%% fcmpq(Rs1, Rs2) ->              fpop2(Rs1,2#001010011,Rs2,0).
334%% fcmpes(Rs1, Rs2) ->             fpop2(Rs1,2#001010101,Rs2,0).
335%% fcmped(Rs1, Rs2) ->             fpop2(Rs1,2#001010110,Rs2,0).
336%% fcmpeq(Rs1, Rs2) ->             fpop2(Rs1,2#001010111,Rs2,0).
337
338%% fcmps(N, Rs1, Rs2) ->           fpcn(N,2#001010001,Rs1,Rs2).
339%% fcmpd(N, Rs1, Rs2) ->           fpcn(N,2#001010010,Rs1,Rs2).
340%% fcmpq(N, Rs1, Rs2) ->           fpcn(N,2#001010011,Rs1,Rs2).
341%% fcmpes(N, Rs1, Rs2) ->          fpcn(N,2#001010101,Rs1,Rs2).
342%% fcmped(N, Rs1, Rs2) ->          fpcn(N,2#001010110,Rs1,Rs2).
343%% fcmpeq(N, Rs1, Rs2) ->          fpcn(N,2#001010111,Rs1,Rs2).
344
345stfi(Rd, Rs1, Offset) ->        format3b(2#11, Rd, 2#100100, Rs1, Offset).
346stdf(Rd, Rs1, Rs2) ->           format3a(2#11, Rd, 2#100111, Rs1, 0, Rs2).
347stdfi(Rd, Rs1, Offset) ->       format3b(2#11, Rd, 2#100111, Rs1, Offset).
348stqf(Rd, Rs1, Rs2) ->           format3a(2#11, Rd, 2#100110, Rs1, 0, Rs2).
349stqfi(Rd, Rs1, Offset) ->       format3b(2#11, Rd, 2#100110, Rs1, Offset).
350%% stfsr(Rd, Rs1, Rs2) ->          format3a(2#11, Rd, 2#100101, Rs1, 0, Rs2).
351%% stfsri(Rd, Rs1, Offset) ->      format3b(2#11, Rd, 2#100101, Rs1, Offset).
352
353ldfi(Rd, Rs1, Offset) ->        format3b(2#11, Rd, 2#100000, Rs1, Offset).
354lddf(Rd, Rs1, Rs2) ->           format3a(2#11, Rd, 2#100011, Rs1, 0, Rs2).
355lddfi(Rd, Rs1, Offset) ->       format3b(2#11, Rd, 2#100011, Rs1, Offset).
356ldqf(Rd, Rs1, Rs2) ->           format3a(2#11, Rd, 2#100010, Rs1, 0, Rs2).
357ldqfi(Rd, Rs1, Offset) ->       format3b(2#11, Rd, 2#100010, Rs1, Offset).
358%% ldxfsr(Rs1, Rs2) ->             format3a(2#11,  1, 2#100001, Rs1, 0, Rs2).
359%% ldxfsri(Rs1, Offset) ->         format3b(2#11,  1, 2#100001, Rs1, Offset).
360
361%% fpcn(N, Opf, Rs1, Rs2) ->
362%%   case N of
363%%     0 -> fpc0(Opf, Rs1, Rs2);
364%%     1 -> fpc1(Opf, Rs1, Rs2);
365%%     2 -> fpc2(Opf, Rs1, Rs2);
366%%     3 -> fpc3(Opf, Rs1, Rs2)
367%%   end.
368
369%% fpc0(Opf, Rs1, Rs2) ->          format3c(2#10, 2#00000, 2#110101, Rs1, Opf, Rs2).
370%% fpc1(Opf, Rs1, Rs2) ->          format3c(2#10, 2#00001, 2#110101, Rs1, Opf, Rs2).
371%% fpc2(Opf, Rs1, Rs2) ->          format3c(2#10, 2#00010, 2#110101, Rs1, Opf, Rs2).
372%% fpc3(Opf, Rs1, Rs2) ->          format3c(2#10, 2#00011, 2#110101, Rs1, Opf, Rs2).
373-endif.	% FP insns
374
375%%%
376%%% Main Encode Dispatch
377%%%
378
379insn_encode(Op, Opnds) ->
380  case Op of
381    'add' -> add(Opnds);
382    'addcc' -> addcc(Opnds);
383    'and' -> 'and'(Opnds);
384    'andcc' -> andcc(Opnds);
385    'ba' -> ba(Opnds);
386    'bp' -> bp(Opnds);
387    'br' -> br(Opnds);
388    'call' -> call(Opnds);
389    'jmpl' -> jmpl(Opnds);
390    'ldsb' -> ldsb(Opnds);
391    'ldsh' -> ldsh(Opnds);
392    'ldsw' -> ldsw(Opnds);
393    'ldub' -> ldub(Opnds);
394    'lduh' -> lduh(Opnds);
395    'lduw' -> lduw(Opnds);
396    'ldx' -> ldx(Opnds);
397    'mulx' -> mulx(Opnds);
398    'or' -> 'or'(Opnds);
399    'orcc' -> orcc(Opnds);
400    'rd' -> rd(Opnds);
401    'sethi' -> sethi(Opnds);
402    'sll' -> sll(Opnds);
403    'sllx' -> sllx(Opnds);
404    'smul' -> smul(Opnds);
405    'sra' -> sra(Opnds);
406    'srax' -> srax(Opnds);
407    'srl' -> srl(Opnds);
408    'srlx' -> srlx(Opnds);
409    'stb' -> stb(Opnds);
410    'stw' -> stw(Opnds);
411    'stx' -> stx(Opnds);
412    'sub' -> sub(Opnds);
413    'subcc' -> subcc(Opnds);
414    'xor' -> 'xor'(Opnds);
415    'xorcc' -> xorcc(Opnds);
416    'faddd' -> faddd(Opnds);
417    'fdivd' -> fdivd(Opnds);
418    'fmuld' -> fmuld(Opnds);
419    'fsubd' -> fsubd(Opnds);
420    'fitod' -> fitod(Opnds);
421    'fmovd' -> fmovd(Opnds);
422    'fnegd' -> fnegd(Opnds);
423    'ldf' -> ldf(Opnds);
424    'stf' -> stf(Opnds);
425    _ -> exit({?MODULE,insn_encode,Op})
426  end.
427
428%%%
429%%% Testing Interface
430%%%
431
432-ifdef(TESTING).
433
434say(OS, Str) ->
435  file:write(OS, Str).
436
437hex_digit(Dig0) ->
438  Dig = Dig0 band 16#F,
439  if Dig >= 16#A -> $A + (Dig - 16#A);
440     true -> $0 + Dig
441  end.
442
443say_byte(OS, Byte) ->
444  say(OS, [hex_digit(Byte bsr 4)]),
445  say(OS, [hex_digit(Byte)]).
446
447say_word(OS, Word) ->
448  say(OS, "0x"),
449  say_byte(OS, Word bsr 24),
450  say_byte(OS, Word bsr 16),
451  say_byte(OS, Word bsr 8),
452  say_byte(OS, Word).
453
454t(OS, Op, Opnds) ->
455  Word = insn_encode(Op, Opnds),
456  say(OS, "\t.long "),
457  say_word(OS, Word),
458  say(OS, "\n").
459
460dotest1(OS) ->
461  say(OS, "\t.text\n\t.align 4\n"),
462  [].
463
464dotest() -> dotest1(group_leader()).
465
466dotest(File) ->
467  {ok,OS} = file:open(File, [write]),
468  dotest1(OS),
469  file:close(OS).
470
471-endif.
472