Ajla 0.1.0
[ajla.git] / newlib / compiler / common / gvn.ajla
blobb07502af0b101c180d3a3baab75670d3fe49dd0a
1 {*
2  * Copyright (C) 2024 Mikulas Patocka
3  *
4  * This file is part of Ajla.
5  *
6  * Ajla is free software: you can redistribute it and/or modify it under the
7  * terms of the GNU General Public License as published by the Free Software
8  * Foundation, either version 3 of the License, or (at your option) any later
9  * version.
10  *
11  * Ajla is distributed in the hope that it will be useful, but WITHOUT ANY
12  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
13  * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License along with
16  * Ajla. If not, see <https://www.gnu.org/licenses/>.
17  *}
19 private unit compiler.common.gvn;
21 uses pcode;
23 fn gvn_encode(value_list : list(pcode_t)) : int
25         var value_number : int := 0;
26         //var str := "";
27         var bit_pos := 0;
28         for i := 0 to len(value_list) do [
29                 var up : pcode_t := value_list[i];
30                 var up2 : int;
31                 var bits : int;
32                 if up >= -3 and up < 16 - 3 then [
33                         up2 := up;
34                         up2 and= #f;
35                         up2 shl= 1;
36                         bits := 5;
37                 ] else if up >= -32 and up < 512 - 32 then [
38                         up2 := up;
39                         up2 and= #1ff;
40                         up2 shl= 2;
41                         up2 or= 1;
42                         bits := 11;
43                 ] else [
44                         up2 := up;
45                         up2 and= #ffffffff;
46                         up2 shl= 2;
47                         up2 or= 3;
48                         bits := 34;
49                 ]
50                 value_number or= up2 shl bit_pos;
51                 bit_pos += bits;
52                 //str += " " + ntos(up2);
53         ]
54         //eval debug(str);
55         return value_number;