adding pointer edgecase

This commit is contained in:
Jakub Doka 2024-11-12 20:42:04 +01:00
parent f1e715e9bd
commit 4ec88e3397
No known key found for this signature in database
GPG key ID: C6E9A89936B8C143
5 changed files with 68 additions and 59 deletions

View file

@ -2936,7 +2936,15 @@ impl<'a> Codegen<'a> {
self.implicit_unwrap(right.pos(), &mut rhs); self.implicit_unwrap(right.pos(), &mut rhs);
let (ty, aclass) = self.binop_ty(pos, &mut lhs, &mut rhs, op); let (ty, aclass) = self.binop_ty(pos, &mut lhs, &mut rhs, op);
let fty = ty.bin_ret(op); let fty = ty.bin_ret(op);
if fty == ty::Id::BOOL { if matches!(
op,
TokenKind::Lt
| TokenKind::Gt
| TokenKind::Ge
| TokenKind::Le
| TokenKind::Ne
| TokenKind::Eq
) {
if lhs.ty.is_float() { if lhs.ty.is_float() {
} else { } else {
self.ci.nodes.lock(rhs.id); self.ci.nodes.lock(rhs.id);
@ -4236,6 +4244,8 @@ impl<'a> Codegen<'a> {
self.pool.push_ci(file, Some(sig.ret), 0, &mut self.ci); self.pool.push_ci(file, Some(sig.ret), 0, &mut self.ci);
let prev_err_len = self.errors.borrow().len(); let prev_err_len = self.errors.borrow().len();
log::info!("{}", self.ast_display(expr));
let &Expr::Closure { body, args, pos, .. } = expr else { let &Expr::Closure { body, args, pos, .. } = expr else {
unreachable!("{}", self.ast_display(expr)) unreachable!("{}", self.ast_display(expr))
}; };

View file

@ -584,14 +584,19 @@ impl TokenKind {
Self::Number if src.is_float() && dst.is_integer() => { Self::Number if src.is_float() && dst.is_integer() => {
[|a, b| instrs::fti32(a, b, 1), |a, b| instrs::fti64(a, b, 1)][src_idx - 2] [|a, b| instrs::fti32(a, b, 1), |a, b| instrs::fti64(a, b, 1)][src_idx - 2]
} }
Self::Number if src.is_signed() && dst.is_integer() => { Self::Number if src.is_signed() && (dst.is_integer() || dst.is_pointer()) => {
[instrs::sxt8, instrs::sxt16, instrs::sxt32][src_idx] [instrs::sxt8, instrs::sxt16, instrs::sxt32][src_idx]
} }
Self::Number if (src.is_unsigned() || src == ty::Id::BOOL) && dst.is_integer() => [ Self::Number
if (src.is_unsigned() || src == ty::Id::BOOL)
&& (dst.is_integer() || dst.is_pointer()) =>
{
[
|a, b| instrs::andi(a, b, 0xff), |a, b| instrs::andi(a, b, 0xff),
|a, b| instrs::andi(a, b, 0xffff), |a, b| instrs::andi(a, b, 0xffff),
|a, b| instrs::andi(a, b, 0xffffffff), |a, b| instrs::andi(a, b, 0xffffffff),
][src_idx], ][src_idx]
}
Self::Float if dst.is_float() && src.is_float() => { Self::Float if dst.is_float() && src.is_float() => {
[instrs::fc32t64, |a, b| instrs::fc64t32(a, b, 1)][src_idx - 2] [instrs::fc32t64, |a, b| instrs::fc64t32(a, b, 1)][src_idx - 2]
} }

View file

@ -1,21 +1,20 @@
main: main:
LI64 r2, 8d LI64 r2, 8d
ECA ECA
LI64 r11, 6d LI64 r10, 6d
LRA r6, r0, :gb LRA r6, r0, :gb
LI64 r9, 0d LI64 r9, 0d
LD r10, r6, 0a, 8h LD r11, r6, 0a, 8h
CMPU r12, r10, r9 CMPU r12, r11, r9
CMPUI r12, r12, 0d CMPUI r12, r12, 0d
ANDI r2, r12, 255d ORI r2, r12, 0d
OR r4, r2, r9 ANDI r2, r2, 255d
ANDI r4, r4, 255d JNE r2, r0, :0
JNE r4, r0, :0 CP r7, r10
CP r9, r11
JMP :1 JMP :1
0: LI64 r9, 1d 0: LI64 r7, 1d
1: SUB64 r1, r9, r11 1: SUB64 r1, r7, r10
JALA r0, r31, 0a JALA r0, r31, 0a
code size: 146 code size: 142
ret: 0 ret: 0
status: Ok(()) status: Ok(())

View file

@ -1,6 +1,6 @@
main: main:
ADDI64 r254, r254, -138d ADDI64 r254, r254, -122d
ST r31, r254, 26a, 112h ST r31, r254, 26a, 96h
JAL r31, r0, :returner_fn JAL r31, r0, :returner_fn
CP r32, r1 CP r32, r1
ADDI64 r1, r254, 2d ADDI64 r1, r254, 2d
@ -9,28 +9,25 @@ main:
JAL r31, r0, :returner_cn JAL r31, r0, :returner_cn
ST r1, r254, 0a, 2h ST r1, r254, 0a, 2h
LI8 r34, 0b LI8 r34, 0b
LI8 r35, 0b
LD r36, r254, 2a, 1h
CP r1, r32 CP r1, r32
CMPU r35, r1, r34 CMPU r37, r1, r34
CMPUI r35, r35, 0d CMPUI r37, r37, 0d
LI8 r36, 0b CMPU r38, r36, r35
LD r37, r254, 2a, 1h CMPUI r38, r38, 0d
ANDI r38, r35, 255d LD r39, r254, 0a, 1h
CMPU r32, r37, r36 AND r40, r38, r37
CMPUI r32, r32, 0d CMPU r41, r39, r35
AND r39, r32, r38 CMPUI r41, r41, 0d
LD r40, r254, 0a, 1h AND r42, r41, r40
ANDI r41, r39, 255d ANDI r42, r42, 255d
CMPU r42, r40, r36 JNE r42, r0, :0
CMPUI r42, r42, 0d
AND r43, r42, r41
ANDI r44, r43, 255d
ANDI r44, r44, 255d
JNE r44, r0, :0
LI64 r1, 0d LI64 r1, 0d
JMP :1 JMP :1
0: LI64 r1, 1d 0: LI64 r1, 1d
1: LD r31, r254, 26a, 112h 1: LD r31, r254, 26a, 96h
ADDI64 r254, r254, 138d ADDI64 r254, r254, 122d
JALA r0, r31, 0a JALA r0, r31, 0a
returner_bn: returner_bn:
ADDI64 r254, r254, -24d ADDI64 r254, r254, -24d
@ -57,6 +54,6 @@ returner_fn:
LD r1, r254, 0a, 0h LD r1, r254, 0a, 0h
ORI r1, r1, 128d ORI r1, r1, 128d
JALA r0, r31, 0a JALA r0, r31, 0a
code size: 513 code size: 480
ret: 1 ret: 1
status: Ok(()) status: Ok(())

View file

@ -1,31 +1,29 @@
main: main:
ADDI64 r254, r254, -1d ADDI64 r254, r254, -1d
LI64 r7, 0d LI64 r7, 0d
LI64 r5, 255d LI64 r6, 255d
LI8 r4, 1b LI8 r2, 1b
LI8 r6, 0b LI8 r4, 0b
ST r6, r254, 0a, 1h ST r4, r254, 0a, 1h
2: LD r9, r254, 0a, 1h 2: LD r9, r254, 0a, 1h
AND r12, r9, r5 ANDI r11, r9, 255d
CMPU r2, r12, r5 CMPU r3, r11, r6
CMPUI r2, r2, 0d CMPUI r3, r3, 0d
NOT r2, r2 NOT r3, r3
CMPU r6, r12, r7 CMPU r5, r11, r7
CMPUI r6, r6, 0d CMPUI r5, r5, 0d
NOT r6, r6 NOT r5, r5
AND r8, r2, r5 OR r8, r5, r3
AND r10, r6, r5 ANDI r8, r8, 255d
OR r11, r10, r8 JNE r8, r0, :0
ANDI r11, r11, 255d
JNE r11, r0, :0
JMP :1 JMP :1
0: SUB8 r4, r0, r4 0: SUB8 r2, r0, r2
1: ADD8 r8, r9, r4 1: ADD8 r4, r9, r2
ST r8, r254, 0a, 1h ST r4, r254, 0a, 1h
JMP :2 JMP :2
ADDI64 r254, r254, 1d ADDI64 r254, r254, 1d
JALA r0, r31, 0a JALA r0, r31, 0a
timed out timed out
code size: 192 code size: 191
ret: 0 ret: 0
status: Ok(()) status: Ok(())