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