fixing wide register returns
This commit is contained in:
parent
4f9d4f2e71
commit
3c01a40ef2
|
@ -1,3 +1,10 @@
|
||||||
[workspace]
|
[workspace]
|
||||||
resolver = "2"
|
resolver = "2"
|
||||||
members = ["hbbytecode", "hbvm", "hbxrt", "xtask", "hblang", "hbjit"]
|
members = ["hbbytecode", "hbvm", "hbxrt", "xtask", "hblang", "hbjit"]
|
||||||
|
|
||||||
|
[profile.small]
|
||||||
|
inherits = "release"
|
||||||
|
opt-level = "z"
|
||||||
|
strip = true
|
||||||
|
lto = true
|
||||||
|
codegen-units = 1
|
||||||
|
|
|
@ -448,7 +448,6 @@ main := fn(): int {
|
||||||
|
|
||||||
#### different_types
|
#### different_types
|
||||||
```hb
|
```hb
|
||||||
|
|
||||||
Color := struct {
|
Color := struct {
|
||||||
r: u8,
|
r: u8,
|
||||||
g: u8,
|
g: u8,
|
||||||
|
@ -494,3 +493,17 @@ main := fn(): int {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
#### struct_return_from_module_function
|
||||||
|
```hb
|
||||||
|
bar := @use("bar.hb");
|
||||||
|
|
||||||
|
main := fn(): int {
|
||||||
|
return 7 - bar.foo().x - bar.foo().y - bar.foo().z;
|
||||||
|
}
|
||||||
|
|
||||||
|
// in module: bar.hb
|
||||||
|
|
||||||
|
foo := fn(): struct { x: int, y: u32, z: u32 } {
|
||||||
|
return .{ x: 3, y: 2, z: 2 };
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
|
@ -2592,6 +2592,16 @@ impl Codegen {
|
||||||
(&Loc::Ct { value }, lpat!(false, reg, 0, None)) => {
|
(&Loc::Ct { value }, lpat!(false, reg, 0, None)) => {
|
||||||
self.output.emit(li64(reg.get(), u64::from_ne_bytes(value)))
|
self.output.emit(li64(reg.get(), u64::from_ne_bytes(value)))
|
||||||
}
|
}
|
||||||
|
(&Loc::Ct { value }, lpat!(false, reg, 8, None)) if reg.get() == 1 && size == 8 => {
|
||||||
|
self.output.emit(li64(reg.get() + 1, u64::from_ne_bytes(value)));
|
||||||
|
}
|
||||||
|
(&Loc::Ct { value }, lpat!(false, reg, off, None)) if reg.get() == 1 => {
|
||||||
|
let freg = reg.get() + (off / 8) as u8;
|
||||||
|
let mask = !(((1u64 << (8 * size)) - 1) << (8 * (off % 8)));
|
||||||
|
self.output.emit(andi(freg, freg, mask));
|
||||||
|
let value = u64::from_ne_bytes(value) << (8 * (off % 8));
|
||||||
|
self.output.emit(ori(freg, freg, value));
|
||||||
|
}
|
||||||
(lpat!(true, src, soff, ref ssta), lpat!(true, dst, doff, ref dsta)) => {
|
(lpat!(true, src, soff, ref ssta), lpat!(true, dst, doff, ref dsta)) => {
|
||||||
// TODO: some oportuinies to ellit more optimal code
|
// TODO: some oportuinies to ellit more optimal code
|
||||||
let src_off = self.ci.regs.allocate();
|
let src_off = self.ci.regs.allocate();
|
||||||
|
@ -3131,5 +3141,6 @@ mod tests {
|
||||||
c_strings => README;
|
c_strings => README;
|
||||||
struct_patterns => README;
|
struct_patterns => README;
|
||||||
arrays => README;
|
arrays => README;
|
||||||
|
struct_return_from_module_function => README;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
code size: 330
|
||||||
|
ret: 0
|
||||||
|
status: Ok(())
|
Loading…
Reference in a new issue