fixing messed up flag calculation

This commit is contained in:
Jakub Doka 2024-11-07 16:39:15 +01:00
parent f535ea7b0a
commit 9d2f419140
No known key found for this signature in database
GPG key ID: C6E9A89936B8C143
4 changed files with 45 additions and 3 deletions

View file

@ -624,6 +624,25 @@ main := fn(): uint {
### Purely Testing Examples
#### nullable_structure
```hb
Structure := struct {}
returner_fn := fn(): ?Structure {
structure := Structure.()
return structure
}
main := fn(): int {
ret := returner_fn()
if ret != null {
return 1
}
return 0
}
```
#### needless_unwrap
```hb
main := fn(): uint {

View file

@ -4267,10 +4267,11 @@ impl<'a> Codegen<'a> {
match oty.loc(self.tys) {
Loc::Reg => {
std::println!("{} {} {}", self.ty_display(oty), flag_offset, self.tys.size_of(oty));
self.strip_ptr(val);
// registers have inverted offsets so that accessing the inner type is a noop
let flag_offset = self.tys.size_of(oty) - flag_offset - 1;
let fill = self.ci.nodes.new_const(oty, 1i64 << (flag_offset * 8 - 1));
let flag_offset = self.tys.size_of(oty) * 8 - flag_offset * 8 - 1;
let fill = self.ci.nodes.new_const(oty, 1i64 << flag_offset);
val.id = self
.ci
.nodes
@ -4595,6 +4596,7 @@ mod tests {
fb_driver;
// Purely Testing Examples;
nullable_structure;
needless_unwrap;
inlining_issues;
null_check_test;

View file

@ -0,0 +1,21 @@
main:
ADDI64 r254, r254, -16d
ST r31, r254, 0a, 16h
JAL r31, r0, :returner_fn
LI8 r32, 0b
ANDI r1, r1, 255d
ANDI r32, r32, 255d
JEQ r1, r32, :0
LI64 r1, 1d
JMP :1
0: LI64 r1, 0d
1: LD r31, r254, 0a, 16h
ADDI64 r254, r254, 16d
JALA r0, r31, 0a
returner_fn:
LD r1, r254, 0a, 0h
ORI r1, r1, 128d
JALA r0, r31, 0a
code size: 164
ret: 1
status: Ok(())

View file

@ -38,7 +38,7 @@ main:
JNE r1, r0, :7
CP r39, r38
JMP :8
7: LI32 r39, 8388609w
7: LI32 r39, 2147483649w
8: ANDI r39, r39, 4294967295d
ANDI r38, r38, 4294967295d
JNE r39, r38, :9