~ubuntu-branches/debian/squeeze/erlang/squeeze

« back to all changes in this revision

Viewing changes to lib/hipe/rtl/hipe_rtl_bs_ops.erl

  • Committer: Bazaar Package Importer
  • Author(s): Erlang Packagers, Sergei Golovan
  • Date: 2006-12-03 17:07:44 UTC
  • mfrom: (2.1.11 feisty)
  • Revision ID: james.westby@ubuntu.com-20061203170744-rghjwupacqlzs6kv
Tags: 1:11.b.2-4
[ Sergei Golovan ]
Fixed erlang-base and erlang-base-hipe prerm scripts.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
%% -*- erlang-indent-level: 2 -*-
2
2
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3
3
%% Copyright (c) 2001 by Erik Johansson.  All Rights Reserved 
4
 
%% Time-stamp: <02/05/13 14:53:23 happi>
 
4
%% Time-stamp: <2004-01-14 14:02:12 richardc>
5
5
%% ====================================================================
6
6
%%  Filename :  hipe_rtl_bs_ops.erl
7
7
%%  Module   :  hipe_rtl_bs_ops
10
10
%%  History  :  * 2001-06-14 Erik Johansson (happi@csd.uu.se): 
11
11
%%               Created.
12
12
%%  CVS      :
13
 
%%              $Author: pergu $
14
 
%%              $Date: 2003/04/14 08:49:20 $
15
 
%%              $Revision: 1.11 $
 
13
%%              $Author: mikpe $
 
14
%%              $Date: 2004/06/17 21:35:17 $
 
15
%%              $Revision: 1.18 $
16
16
%% ====================================================================
17
17
%%  Exports  :
18
18
%%
20
20
 
21
21
-module(hipe_rtl_bs_ops).
22
22
-export([gen_rtl/6]).
 
23
 
23
24
%%-------------------------------------------------------------------------
24
25
 
25
26
-include("../main/hipe.hrl").
26
 
-include("hipe_icode2rtl.hrl").
27
27
-include("hipe_literals.hrl").
28
28
 
29
29
%% -------------------------------------------------------------------------
36
36
    {bs_put_string, String, SizeInBytes} ->
37
37
      Tmp1 = hipe_rtl:mk_new_reg(),
38
38
      Tmp2 = hipe_rtl:mk_new_reg(),
39
 
      {NewTab, Label} = 
40
 
        hipe_consttab:insert_block(ConstTab, 4, byte, String),
 
39
      {NewTab, Label} =
 
40
        hipe_consttab:insert_block(ConstTab, byte, String),
41
41
 
42
42
      {[hipe_rtl:mk_load_address(Tmp1, Label, constant),
43
43
        hipe_rtl:mk_move(Tmp2, hipe_rtl:mk_imm(SizeInBytes)),
48
48
    _ -> 
49
49
      Code = 
50
50
        case BsOP of
51
 
          bs_init ->
52
 
            [hipe_rtl:mk_call([], bs_init, [], c, TrueLblName, [])];
 
51
          {bs_init, _Size, _Flags} ->
 
52
            [hipe_rtl:mk_call([], bs_init, [], TrueLblName, [], not_remote)];
53
53
          bs_start_match ->
54
54
            gen_test_sideffect_bs_call(bs_start_match,
55
55
                                       Args, TrueLblName, FalseLblName);
72
72
                                             TrueLblName,FalseLblName)
73
73
 
74
74
            end;
75
 
 
 
75
          
76
76
          {bs_put_float, Size, Flags, ConstInfo} ->    
77
77
            SizeReg = hipe_rtl:mk_new_reg(),
78
78
            FlagsReg = hipe_rtl:mk_new_reg(),
79
 
            case ConstInfo of
80
 
              fail ->
81
 
                [hipe_rtl:mk_goto(FalseLblName)];
82
 
              _ ->
83
 
                case Args of
84
 
                  [Src] -> 
85
 
                    case ConstInfo of
86
 
                      pass ->
87
 
                        [hipe_rtl:mk_move(SizeReg, hipe_rtl:mk_imm(Size)),
88
 
                         hipe_rtl:mk_move(FlagsReg, hipe_rtl:mk_imm(Flags)),
89
 
                         hipe_rtl:mk_call([],bs_put_float,
90
 
                                          [Src, SizeReg, FlagsReg], c,
91
 
                                          TrueLblName,[])];
92
 
                      var ->
93
 
                        [hipe_rtl:mk_move(SizeReg, hipe_rtl:mk_imm(Size)),
94
 
                         hipe_rtl:mk_move(FlagsReg, hipe_rtl:mk_imm(Flags)),
95
 
                         gen_test_sideffect_bs_call(bs_put_float,
 
79
            case Args of
 
80
              [Src] -> 
 
81
                case ConstInfo of
 
82
                  pass ->
 
83
                    [hipe_rtl:mk_move(SizeReg, hipe_rtl:mk_imm(Size)),
 
84
                     hipe_rtl:mk_move(FlagsReg, hipe_rtl:mk_imm(Flags)),
 
85
                     hipe_rtl:mk_call([],bs_put_float,
 
86
                                      [Src, SizeReg, FlagsReg],
 
87
                                      TrueLblName,[],not_remote)];
 
88
                  var ->
 
89
                    [hipe_rtl:mk_move(SizeReg, hipe_rtl:mk_imm(Size)),
 
90
                     hipe_rtl:mk_move(FlagsReg, hipe_rtl:mk_imm(Flags)),
 
91
                     gen_test_sideffect_bs_call(bs_put_float,
 
92
                                                [Src,SizeReg,FlagsReg],
 
93
                                                TrueLblName,FalseLblName)];
 
94
                  fail ->
 
95
                    [hipe_rtl:mk_move(SizeReg, hipe_rtl:mk_imm(Size)),
 
96
                     hipe_rtl:mk_move(FlagsReg, hipe_rtl:mk_imm(Flags)),
 
97
                     gen_test_sideffect_bs_call(bs_put_float,
 
98
                                                [Src,SizeReg,FlagsReg],
 
99
                                                TrueLblName,FalseLblName)]
 
100
                end;
 
101
              [Src, Bits] -> 
 
102
                [gen_make_size(SizeReg, Size, Bits, FalseLblName),
 
103
                 hipe_rtl:mk_move(FlagsReg, hipe_rtl:mk_imm(Flags)),
 
104
                 gen_test_sideffect_bs_call( bs_put_float,
96
105
                                             [Src,SizeReg,FlagsReg],
97
106
                                             TrueLblName,FalseLblName)]
98
 
                    end;
99
 
                  [Src, Bits] -> 
100
 
                    [gen_make_size(SizeReg, Size, Bits, FalseLblName),
101
 
                     hipe_rtl:mk_move(FlagsReg, hipe_rtl:mk_imm(Flags)),
102
 
                     gen_test_sideffect_bs_call( bs_put_float,
103
 
                                                 [Src,SizeReg,FlagsReg],
104
 
                                                 TrueLblName,FalseLblName)]
105
 
                end
106
107
            end;
107
 
 
108
 
         
109
 
 
 
108
    
110
109
          {bs_put_integer, Size, Flags, ConstInfo} ->
111
110
            SizeReg = hipe_rtl:mk_new_reg(),
112
111
            FlagsReg = hipe_rtl:mk_new_reg(),
121
120
                        [hipe_rtl:mk_move(SizeReg, hipe_rtl:mk_imm(Size)),
122
121
                         hipe_rtl:mk_move(FlagsReg, hipe_rtl:mk_imm(Flags)),
123
122
                         hipe_rtl:mk_call([],bs_put_integer,
124
 
                                          [Src, SizeReg, FlagsReg], c,
125
 
                                          TrueLblName,[])];
 
123
                                          [Src, SizeReg, FlagsReg],
 
124
                                          TrueLblName,[],not_remote)];
126
125
                      var ->
127
126
                        [hipe_rtl:mk_move(SizeReg, hipe_rtl:mk_imm(Size)),
128
127
                         hipe_rtl:mk_move(FlagsReg, hipe_rtl:mk_imm(Flags)),
139
138
                end
140
139
            end;
141
140
    
142
 
 
143
 
 
144
141
          {bs_skip_bits_all, Flags} ->
145
142
            case (Flags band ?BSF_ALIGNED) of
146
143
              1 -> %% This can't fail.
147
 
                [hipe_rtl:mk_call([], bs_skip_bits_all, [], c,
148
 
                                  TrueLblName,[])];
 
144
                [hipe_rtl:mk_call([], bs_skip_bits_all, [],
 
145
                                  TrueLblName,[],not_remote)];
149
146
              _ -> 
150
147
                gen_test_sideffect_bs_call(bs_skip_bits_all,
151
148
                                           [], 
166
163
                  gen_test_sideffect_bs_call(bs_skip_bits,
167
164
                                             [Tmp1], 
168
165
                                             TrueLblName,FalseLblName)
 
166
            end;
169
167
 
170
 
            end;
171
168
          {bs_get_integer,Size,Flag} ->
172
169
            Tmp1 = hipe_rtl:mk_new_reg(),
173
170
            Tmp2 = hipe_rtl:mk_new_reg(),
210
207
                             TrueLblName,FalseLblName)]
211
208
            end;
212
209
 
213
 
 
214
 
 
215
210
          {bs_get_binary_all, _Flags} -> 
216
211
            [Dst1] = Dst, 
217
212
            gen_bs_call(bs_get_binary_all,
245
240
          {bs_restore, Index} ->
246
241
            Tmp1 = hipe_rtl:mk_new_reg(),
247
242
            [hipe_rtl:mk_move(Tmp1, hipe_rtl:mk_imm(Index)),
248
 
             hipe_rtl:mk_call([],bs_restore,[Tmp1],c, TrueLblName,[])];
 
243
             hipe_rtl:mk_call([],bs_restore,[Tmp1],TrueLblName,[],not_remote)];
249
244
 
250
245
          {bs_save, Index} ->
251
246
            Tmp1 = hipe_rtl:mk_new_reg(),
252
247
            [hipe_rtl:mk_move(Tmp1, hipe_rtl:mk_imm(Index)),
253
 
             hipe_rtl:mk_call([],bs_save,[Tmp1],c, TrueLblName,[])];
254
 
 
 
248
             hipe_rtl:mk_call([],bs_save,[Tmp1],TrueLblName,[],not_remote)];
255
249
 
256
250
          bs_final ->
257
251
            [hipe_rtl_arch:call_bif(Dst, bs_final, [],
263
257
  end.
264
258
 
265
259
 
266
 
 
267
 
 
268
 
 
269
 
 
270
 
 
271
260
%% ____________________________________________________________________
272
261
%% 
273
262
gen_bs_call(Name,Args,DstVar,TrueLblName,FalseLblName) ->
288
277
  Tmp1 = hipe_rtl:mk_new_reg(),
289
278
  RetLabel =  hipe_rtl:mk_new_label(),
290
279
 
291
 
  [hipe_rtl:mk_call([Tmp1], Name, Args,  c,
292
 
                    hipe_rtl:label_name(RetLabel),[]),
 
280
  [hipe_rtl:mk_call([Tmp1], Name, Args,
 
281
                    hipe_rtl:label_name(RetLabel),[],not_remote),
293
282
   RetLabel,
294
283
   hipe_rtl:mk_branch(Tmp1, eq, hipe_rtl:mk_imm(0), 
295
284
                      FalseLblName, TrueLblName, 0.01)].
305
294
  ZeroConst = hipe_rtl:mk_imm(hipe_tagscheme:mk_fixnum(0)),
306
295
  UnitConst = hipe_rtl:mk_imm(hipe_tagscheme:mk_fixnum(UnitImm)),
307
296
  [hipe_rtl:mk_move(UnitVar, UnitConst),  
308
 
   hipe_rtl:mk_call([TmpVar], '*', [BitsVar, UnitVar], c,
 
297
   hipe_rtl:mk_call([TmpVar], '*', [BitsVar, UnitVar],
309
298
                         hipe_rtl:label_name(MulDoneLabel),
310
 
                         FalseLblName),
 
299
                         FalseLblName, not_remote),
311
300
   MulDoneLabel,
312
301
   hipe_tagscheme:test_fixnum(TmpVar, hipe_rtl:label_name(MulOkLabel), 
313
302
                              FalseLblName, 0.99),
317
306
   PosNumOkLabel,
318
307
   hipe_tagscheme:untag_fixnum(DstReg, TmpVar)].
319
308
 
320