move mask_extend function to utils
[openpower-isa.git] / src / openpower / util.py
1 from openpower.consts import FastRegsEnum
2 from openpower.decoder.power_enums import SPRfull as SPR, spr_dict
3
4 # note that we can get away with using SPRfull here because the values
5 # (numerical values) are what is used for lookup.
6 spr_to_fast = { SPR.CTR: FastRegsEnum.CTR,
7 SPR.LR: FastRegsEnum.LR,
8 SPR.TAR: FastRegsEnum.TAR,
9 SPR.SRR0: FastRegsEnum.SRR0,
10 SPR.SRR1: FastRegsEnum.SRR1,
11 SPR.XER: FastRegsEnum.XER,
12 SPR.DEC: FastRegsEnum.DEC,
13 SPR.TB: FastRegsEnum.TB,
14 }
15
16 sprstr_to_fast = {}
17 fast_to_spr = {}
18 for (k, v) in spr_to_fast.items():
19 sprstr_to_fast[k.name] = v
20 fast_to_spr[v] = k
21
22 def fast_reg_to_spr(spr_num):
23 return fast_to_spr[spr_num].value
24
25
26 def spr_to_fast_reg(spr_num):
27 if not isinstance(spr_num, str):
28 spr_num = spr_dict[spr_num].SPR
29 return sprstr_to_fast.get(spr_num, None)
30
31
32 def slow_reg_to_spr(slow_reg):
33 for i, x in enumerate(SPR):
34 if slow_reg == i:
35 return x.value
36
37
38 def spr_to_slow_reg(spr_num):
39 for i, x in enumerate(SPR):
40 if spr_num == x.value:
41 return i
42
43
44 # TODO: make this a util routine (somewhere)
45 def mask_extend(x, nbits, repeat):
46 res = 0
47 extended = (1<<repeat)-1
48 for i in range(nbits):
49 if x & (1<<i):
50 res |= extended << (i*repeat)
51 return res
52
53