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

« back to all changes in this revision

Viewing changes to lib/hipe/rtl/hipe_rtl_guardops.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
 
%% -*- erlang-indent-level: 2 -*-
2
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3
 
%% Copyright (c) 2001 by Erik Johansson.  All Rights Reserved 
4
 
%% Time-stamp: <02/05/13 16:09:13 happi>
5
 
%% ====================================================================
6
 
%%  Filename :  hipe_rtl_guardops.erl
7
 
%%  Module   :  hipe_rtl_guardops
8
 
%%  Purpose  :  
9
 
%%  Notes    : 
10
 
%%  History  :  * 2001-04-10 Erik Johansson (happi@csd.uu.se): 
11
 
%%               Created.
12
 
%%  CVS      :
13
 
%%              $Author: happi $
14
 
%%              $Date: 2002/05/13 16:51:08 $
15
 
%%              $Revision: 1.13 $
16
 
%% ====================================================================
17
 
%%  Exports  :
18
 
%%
19
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
20
 
 
21
 
-module(hipe_rtl_guardops).
22
 
-export([gen_guardop/3]).
23
 
%%-------------------------------------------------------------------------
24
 
 
25
 
-include("../main/hipe.hrl").
26
 
-include("hipe_icode2rtl.hrl").
27
 
-include("hipe_literals.hrl").
28
 
 
29
 
%%-------------------------------------------------------------------------
30
 
 
31
 
%%
32
 
%% Generate code for guardops. This is mostly a dispatch function
33
 
%%
34
 
gen_guardop(GOp, VarMap, ConstTab) ->
35
 
  Op = hipe_icode:call_fun(GOp),
36
 
  {Dst, VarMap0} = 
37
 
    case hipe_icode:call_dst(GOp) of
38
 
      [] -> 
39
 
        {hipe_rtl:mk_new_var(),VarMap};
40
 
      Dsts ->
41
 
        hipe_rtl_varmap:ivs2rvs(Dsts, VarMap)
42
 
    end,
43
 
  {Args, VarMap1} = hipe_rtl_varmap:ivs2rvs(hipe_icode:call_args(GOp), VarMap0),
44
 
  {TrueLbl, VarMap2} =
45
 
    hipe_rtl_varmap:icode_label2rtl_label(hipe_icode:call_continuation(GOp), VarMap1),
46
 
  {FalseLbl, VarMap3} =
47
 
    hipe_rtl_varmap:icode_label2rtl_label(hipe_icode:call_fail(GOp), VarMap2),
48
 
  TrueLblName = hipe_rtl:label_name(TrueLbl),
49
 
  FalseLblName = hipe_rtl:label_name(FalseLbl),
50
 
 
51
 
  %% Annot = hipe_icode:info(GOp),
52
 
 
53
 
  case Op of
54
 
    {hipe_bs_primop, BsOP} ->
55
 
      case get(hipe_inline_bs) of
56
 
        true ->
57
 
          {Code, NewTab} =
58
 
            hipe_rtl_inline_bs_ops:gen_rtl(BsOP,Args, Dst,TrueLblName,
59
 
                                FalseLblName, ConstTab);
60
 
        _ ->
61
 
          {Code, NewTab} =
62
 
            hipe_rtl_bs_ops:gen_rtl(BsOP,Args, Dst,TrueLblName,
63
 
                                FalseLblName, ConstTab)
64
 
      end,
65
 
      {Code, VarMap3, NewTab};
66
 
    _ ->
67
 
      Code = 
68
 
        case Op of
69
 
          '+' ->
70
 
            gen_guard_add_sub_2(Dst, Args, Op, add, TrueLblName, FalseLblName);
71
 
          '-' ->
72
 
            gen_guard_add_sub_2(Dst, Args, Op, sub, TrueLblName, FalseLblName);
73
 
          'band' ->
74
 
            gen_guard_bitop_2(Dst, Args, Op, 'and', TrueLblName, FalseLblName);
75
 
          'bor' ->
76
 
            gen_guard_bitop_2(Dst, Args, Op, 'or',  TrueLblName, FalseLblName);
77
 
          'bxor' ->
78
 
            gen_guard_bitop_2(Dst, Args, Op, 'xor', TrueLblName, FalseLblName);
79
 
          'bnot' ->
80
 
            gen_guard_bnot_2(Dst, Args, Op, TrueLblName, FalseLblName);
81
 
 
82
 
          element ->
83
 
            [Dst1] = Dst,
84
 
            [Index, Tuple] = Args,
85
 
            gen_guard_element_2(Dst1, Index, Tuple, TrueLblName, FalseLblName);
86
 
 
87
 
          get_msg ->
88
 
            ?EXIT({not_allowed_in_guards,Op});
89
 
          next_msg ->
90
 
            ?EXIT({not_allowed_in_guards,Op});
91
 
          select_msg ->
92
 
            ?EXIT({not_allowed_in_guards,Op});
93
 
          set_timeout ->
94
 
            ?EXIT({not_allowed_in_guards,Op});
95
 
 
96
 
          _ ->
97
 
            %% TODO: Check if the bif is alloed in a guard.
98
 
            %%  {Mod,BifName,Arity} = Op,
99
 
            %%  Fails = hipe_bif:fails(Arity,BifName),
100
 
            %%  if Fails =:= true ->
101
 
            gen_general_guard_op(Dst, Args,  Op, 
102
 
                                 TrueLblName, FalseLblName)
103
 
            %%     true ->
104
 
            %%      [hipe_rtl:mk_call(Dst, Op, Args, c, TrueLblName,[])]
105
 
            %%  end
106
 
        end,
107
 
      {Code, VarMap3, ConstTab}
108
 
  end.
109
 
 
110
 
%%
111
 
%% Generate a call to a guard operator (with inlined fail test)
112
 
%%
113
 
 
114
 
gen_general_guard_op(Res, Args, Op, TrueLbl,FalseLbl) ->
115
 
  %%  RetLabel =  hipe_rtl:mk_new_label(),
116
 
  [hipe_rtl:mk_call(Res, Op, Args, c, TrueLbl,FalseLbl)].
117
 
%%                  hipe_rtl:label_name(RetLabel), []),
118
 
%%   RetLabel,
119
 
%%   test_bif_result(Res, TrueLbl, FalseLbl)].
120
 
 
121
 
%% Test the result of a bifcall.
122
 
%% test_bif_result(Result, Continuation, Fail) ->
123
 
%%   [hipe_rtl:mk_branch(Result, eq, hipe_rtl:mk_imm(0), Fail, Continuation, 0.01)].
124
 
 
125
 
 
126
 
%% ____________________________________________________________________
127
 
%% 
128
 
 
129
 
gen_guard_add_sub_2([Res], Args, Op, AluOp,SuccLabel,FailLabel) ->
130
 
  [Arg1, Arg2] = Args,
131
 
  GenCaseLabel = hipe_rtl:mk_new_label(),
132
 
  [hipe_tagscheme:test_two_fixnums(Arg1, Arg2,
133
 
                                   hipe_rtl:label_name(GenCaseLabel)),
134
 
   hipe_tagscheme:fixnum_addsub(AluOp, Arg1, Arg2, Res, GenCaseLabel)|
135
 
   gen_guardop_general_case(Res, Op, Args, SuccLabel, FailLabel, 
136
 
                            GenCaseLabel)].
137
 
 
138
 
gen_guardop_general_case(Res, Op, Args, SuccLabel, FailLabel, GenCaseLabel) ->
139
 
  [hipe_rtl:mk_goto(SuccLabel),
140
 
   GenCaseLabel,
141
 
   gen_general_guard_op([Res], Args, Op, SuccLabel, FailLabel)].
142
 
 
143
 
 
144
 
gen_guard_bitop_2([Res], Args, Op, BitOp, EndLabel, FailLabel) ->
145
 
  [Arg1, Arg2] = Args,
146
 
  OtherLabel = hipe_rtl:mk_new_label(),
147
 
  [hipe_tagscheme:test_two_fixnums(Arg1,Arg2, hipe_rtl:label_name(OtherLabel)),
148
 
   hipe_tagscheme:fixnum_andorxor(BitOp, Arg1, Arg2, Res),
149
 
   gen_guardop_general_case(Res, Op, Args, EndLabel, FailLabel, OtherLabel)].
150
 
 
151
 
%%
152
 
%% Inline guard 'not'.
153
 
%%
154
 
 
155
 
gen_guard_bnot_2([Res], Args, Op, EndLabel, FailLabel) ->
156
 
  [Arg] = Args,
157
 
  FixLabel = hipe_rtl:mk_new_label(),
158
 
  OtherLabel = hipe_rtl:mk_new_label(),
159
 
  [hipe_tagscheme:test_fixnum(Arg, hipe_rtl:label_name(FixLabel),
160
 
                              hipe_rtl:label_name(OtherLabel), 0.99),
161
 
   FixLabel,
162
 
   hipe_tagscheme:fixnum_not(Arg, Res),
163
 
   gen_guardop_general_case(Res, Op, Args, EndLabel, FailLabel, OtherLabel)].
164
 
 
165
 
%%
166
 
%% guard element
167
 
%%
168
 
gen_guard_element_2(Dst1, Index, Tuple, TrueLblName, FailLbl) ->
169
 
  [hipe_tagscheme:element(Dst1, Index, Tuple,
170
 
                         hipe_rtl:mk_label(FailLbl), [], []),
171
 
   hipe_rtl:mk_goto(TrueLblName)].