extsxl implementation and examples
[libreriscv.git] / openpower / sv / svp64 / extsxl.mdwn
1 # Implementation
2
3 class Helper:
4 def __init__(self, XLEN):
5 self.XLEN = XLEN
6
7 def EXTSXL(self, value, bits):
8 bits = min(bits, self.XLEN)
9 return SelectableInt(exts(value.value, bits) & ((1 << self.XLEN)-1), self.XLEN)
10
11 # Table
12
13 [[!table data="""
14 func |pcode |
15 extsb|RA <- EXTSX(RS, 8) |
16 extsh|RA <- EXTSX(RS, 16)|
17 extsw|RA <- EXTSX(RS, 32)|
18 """]]
19
20 # Examples
21
22 for xlen in (8, 16, 32, 64):
23 helper = Helper(xlen)
24 REG = lambda v: SelectableInt(v, xlen)
25
26 assert helper.EXTSXL(REG(0xA000000090000A93), 64) == REG(0xA000000090000a93)
27 assert helper.EXTSXL(REG(0x0000000090000A93), 32) == REG(0xffffffff90000a93)
28 assert helper.EXTSXL(REG(0x000000000000F074), 16) == REG(0xfffffffffffff074)
29 assert helper.EXTSXL(REG(0x0000000000000091), 8) == REG(0xffffffffffffff91)
30
31 assert helper.EXTSXL(REG(0x7000000090000A93), 64) == REG(0x7000000090000a93)
32 assert helper.EXTSXL(REG(0x0000000050000A93), 32) == REG(0x50000a93)
33 assert helper.EXTSXL(REG(0x0000000000001074), 16) == REG(0x1074)
34 assert helper.EXTSXL(REG(0x0000000000000031), 8) == REG(0x31)
35
36 assert helper.EXTSXL(REG(0xA000000090000A93), 64) == REG(0xA000000090000a93)
37 assert helper.EXTSXL(REG(0x0000000090000A93), 64) == REG(0x90000a93)
38 assert helper.EXTSXL(REG(0x000000000000F074), 32) == REG(0xf074)
39 assert helper.EXTSXL(REG(0x0000000000000091), 16) == REG(0x91)
40
41 assert helper.EXTSXL(REG(0x9999999999999999), 64) == REG(0x9999999999999999)
42 assert helper.EXTSXL(REG(0x9999999999999999), 32) == REG(0xFFFFFFFF99999999)
43 assert helper.EXTSXL(REG(0x9999999999999999), 16) == REG(0xFFFFFFFFFFFF9999)
44 assert helper.EXTSXL(REG(0x9999999999999999), 8) == REG(0xFFFFFFFFFFFFFF99)