Implementation
class Helper:
def __init__(self, XLEN):
self.XLEN = XLEN
def EXTSXL(self, value, bits):
bits = min(bits, self.XLEN) # strangely this is redundant
return SelectableInt(exts(value.value, bits), self.XLEN)
Table
func | pcode | |
---|---|---|
extsb | RA <- EXTSX(RS, 8) | |
extsh | RA <- EXTSX(RS, 16) | |
extsw | RA <- EXTSX(RS, 32) |
Examples in tabular form
these should contain desired and expected answers, not what the code says "this is the answer if you run this code on these values". They are also CSV files which the openpower-isa unit tests can run to confirm the implementation is correct.
0xA000000090000A93
func | XLEN=64 | XLEN=32 | XLEN=16 | XLEN=8 |
---|---|---|---|---|
extsb | 0xFFFFFFFFFFFFFF93 | 0xFFFFFF93 | 0xFF93 | 0x93 |
extsh | 0x0000000000000A93 | 0x00000A93 | 0x0A93 | 0x93 |
extsw | 0xFFFFFFFF90000A93 | 0x90000A93 | 0x0A93 | 0x93 |
0x0000000090000A93
func | XLEN=64 | XLEN=32 | XLEN=16 | XLEN=8 |
---|---|---|---|---|
extsb | 0xFFFFFFFFFFFFFF93 | 0xFFFFFF93 | 0xFF93 | 0x93 |
extsh | 0x0000000000000A93 | 0x00000A93 | 0x0A93 | 0x93 |
extsw | 0xFFFFFFFF90000A93 | 0x90000A93 | 0x0A93 | 0x93 |
0x000000000000F074
func | XLEN=64 | XLEN=32 | XLEN=16 | XLEN=8 |
---|---|---|---|---|
extsb | 0x0000000000000074 | 0x00000074 | 0x0074 | 0x74 |
extsh | 0xFFFFFFFFFFFFF074 | 0xFFFFF074 | 0xF074 | 0x74 |
extsw | 0x000000000000F074 | 0x0000F074 | 0xF074 | 0x74 |
0x0000000000000091
func | XLEN=64 | XLEN=32 | XLEN=16 | XLEN=8 |
---|---|---|---|---|
extsb | 0xFFFFFFFFFFFFFF91 | 0xFFFFFF91 | 0xFF91 | 0x91 |
extsh | 0x0000000000000091 | 0x00000091 | 0x0091 | 0x91 |
extsw | 0x0000000000000091 | 0x00000091 | 0x0091 | 0x91 |
0x9999999999999999
func | XLEN=64 | XLEN=32 | XLEN=16 | XLEN=8 |
---|---|---|---|---|
extsb | 0xFFFFFFFFFFFFFF99 | 0xFFFFFF99 | 0xFF99 | 0x99 |
extsh | 0xFFFFFFFFFFFF9999 | 0xFFFF9999 | 0x9999 | 0x99 |
extsw | 0xFFFFFFFF99999999 | 0x99999999 | 0x9999 | 0x99 |
0x1111111111111111
func | XLEN=64 | XLEN=32 | XLEN=16 | XLEN=8 |
---|---|---|---|---|
extsb | 0x0000000000000011 | 0x00000011 | 0x0011 | 0x11 |
extsh | 0x0000000000001111 | 0x00001111 | 0x1111 | 0x11 |
extsw | 0x0000000011111111 | 0x11111111 | 0x1111 | 0x11 |
Examples
for xlen in (8, 16, 32, 64):
helper = Helper(xlen)
REG = lambda v: SelectableInt(v, xlen)
assert helper.EXTSXL(REG(0xA000000090000A93), 64) == REG(0xA000000090000a93)
assert helper.EXTSXL(REG(0x0000000090000A93), 32) == REG(0xffffffff90000a93)
assert helper.EXTSXL(REG(0x000000000000F074), 16) == REG(0xfffffffffffff074)
assert helper.EXTSXL(REG(0x0000000000000091), 8) == REG(0xffffffffffffff91)
assert helper.EXTSXL(REG(0x7000000090000A93), 64) == REG(0x7000000090000a93)
assert helper.EXTSXL(REG(0x0000000050000A93), 32) == REG(0x50000a93)
assert helper.EXTSXL(REG(0x0000000000001074), 16) == REG(0x1074)
assert helper.EXTSXL(REG(0x0000000000000031), 8) == REG(0x31)
assert helper.EXTSXL(REG(0xA000000090000A93), 64) == REG(0xA000000090000a93)
assert helper.EXTSXL(REG(0x0000000090000A93), 64) == REG(0x90000a93)
assert helper.EXTSXL(REG(0x000000000000F074), 32) == REG(0xf074)
assert helper.EXTSXL(REG(0x0000000000000091), 16) == REG(0x91)
assert helper.EXTSXL(REG(0x9999999999999999), 64) == REG(0x9999999999999999)
assert helper.EXTSXL(REG(0x9999999999999999), 32) == REG(0xFFFFFFFF99999999)
assert helper.EXTSXL(REG(0x9999999999999999), 16) == REG(0xFFFFFFFFFFFF9999)
assert helper.EXTSXL(REG(0x9999999999999999), 8) == REG(0xFFFFFFFFFFFFFF99)