This would add two new instructions to cranelift, bextr and bmak. They provide a easy to optimize, and easy to generate mechanism for bitfield manipulation.
bextr
a = bextr target, size, offset
bextr will extract a n bit large field at the provided offset, and return it in a, shifted so that the LSB of the field is also the LSB of a.
a's type is inferred from target
Visual example
offset = 4
size = 4
typeof target = i8
xxxx ****
\__/----V
0000 xxxx
bmak
a = bmak target, size, offset
bmak will fill a n bit large field at the provided offset with 1s, the rest with 0. The generated field will then be applied to target using a bitwise AND, and the result will be returned in a.
a's type is inferred from target
bmak is designed so that you can simply use a bitwise or to combine the fields.
Visual Example
offset = 2
size = 4
typeof target = i8
xx0101xx
\__/
/ \
00010100
This would add two new instructions to cranelift,
bextrandbmak. They provide a easy to optimize, and easy to generate mechanism for bitfield manipulation.bextr
bextr will extract a n bit large field at the provided offset, and return it in
a, shifted so that the LSB of the field is also the LSB ofa.a's type is inferred fromtargetVisual example
bmak
bmak will fill a n bit large field at the provided offset with 1s, the rest with 0. The generated field will then be applied to
targetusing a bitwise AND, and the result will be returned ina.a's type is inferred fromtargetbmak is designed so that you can simply use a bitwise or to combine the fields.
Visual Example