adding pointer edgecase
This commit is contained in:
parent
f1e715e9bd
commit
4ec88e3397
|
@ -2936,7 +2936,15 @@ impl<'a> Codegen<'a> {
|
|||
self.implicit_unwrap(right.pos(), &mut rhs);
|
||||
let (ty, aclass) = self.binop_ty(pos, &mut lhs, &mut rhs, 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() {
|
||||
} else {
|
||||
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);
|
||||
let prev_err_len = self.errors.borrow().len();
|
||||
|
||||
log::info!("{}", self.ast_display(expr));
|
||||
|
||||
let &Expr::Closure { body, args, pos, .. } = expr else {
|
||||
unreachable!("{}", self.ast_display(expr))
|
||||
};
|
||||
|
|
|
@ -584,14 +584,19 @@ impl TokenKind {
|
|||
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]
|
||||
}
|
||||
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]
|
||||
}
|
||||
Self::Number if (src.is_unsigned() || src == ty::Id::BOOL) && dst.is_integer() => [
|
||||
|a, b| instrs::andi(a, b, 0xff),
|
||||
|a, b| instrs::andi(a, b, 0xffff),
|
||||
|a, b| instrs::andi(a, b, 0xffffffff),
|
||||
][src_idx],
|
||||
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, 0xffff),
|
||||
|a, b| instrs::andi(a, b, 0xffffffff),
|
||||
][src_idx]
|
||||
}
|
||||
Self::Float if dst.is_float() && src.is_float() => {
|
||||
[instrs::fc32t64, |a, b| instrs::fc64t32(a, b, 1)][src_idx - 2]
|
||||
}
|
||||
|
|
|
@ -1,21 +1,20 @@
|
|||
main:
|
||||
LI64 r2, 8d
|
||||
ECA
|
||||
LI64 r11, 6d
|
||||
LI64 r10, 6d
|
||||
LRA r6, r0, :gb
|
||||
LI64 r9, 0d
|
||||
LD r10, r6, 0a, 8h
|
||||
CMPU r12, r10, r9
|
||||
LD r11, r6, 0a, 8h
|
||||
CMPU r12, r11, r9
|
||||
CMPUI r12, r12, 0d
|
||||
ANDI r2, r12, 255d
|
||||
OR r4, r2, r9
|
||||
ANDI r4, r4, 255d
|
||||
JNE r4, r0, :0
|
||||
CP r9, r11
|
||||
ORI r2, r12, 0d
|
||||
ANDI r2, r2, 255d
|
||||
JNE r2, r0, :0
|
||||
CP r7, r10
|
||||
JMP :1
|
||||
0: LI64 r9, 1d
|
||||
1: SUB64 r1, r9, r11
|
||||
0: LI64 r7, 1d
|
||||
1: SUB64 r1, r7, r10
|
||||
JALA r0, r31, 0a
|
||||
code size: 146
|
||||
code size: 142
|
||||
ret: 0
|
||||
status: Ok(())
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
main:
|
||||
ADDI64 r254, r254, -138d
|
||||
ST r31, r254, 26a, 112h
|
||||
ADDI64 r254, r254, -122d
|
||||
ST r31, r254, 26a, 96h
|
||||
JAL r31, r0, :returner_fn
|
||||
CP r32, r1
|
||||
ADDI64 r1, r254, 2d
|
||||
|
@ -9,28 +9,25 @@ main:
|
|||
JAL r31, r0, :returner_cn
|
||||
ST r1, r254, 0a, 2h
|
||||
LI8 r34, 0b
|
||||
LI8 r35, 0b
|
||||
LD r36, r254, 2a, 1h
|
||||
CP r1, r32
|
||||
CMPU r35, r1, r34
|
||||
CMPUI r35, r35, 0d
|
||||
LI8 r36, 0b
|
||||
LD r37, r254, 2a, 1h
|
||||
ANDI r38, r35, 255d
|
||||
CMPU r32, r37, r36
|
||||
CMPUI r32, r32, 0d
|
||||
AND r39, r32, r38
|
||||
LD r40, r254, 0a, 1h
|
||||
ANDI r41, r39, 255d
|
||||
CMPU r42, r40, r36
|
||||
CMPUI r42, r42, 0d
|
||||
AND r43, r42, r41
|
||||
ANDI r44, r43, 255d
|
||||
ANDI r44, r44, 255d
|
||||
JNE r44, r0, :0
|
||||
CMPU r37, r1, r34
|
||||
CMPUI r37, r37, 0d
|
||||
CMPU r38, r36, r35
|
||||
CMPUI r38, r38, 0d
|
||||
LD r39, r254, 0a, 1h
|
||||
AND r40, r38, r37
|
||||
CMPU r41, r39, r35
|
||||
CMPUI r41, r41, 0d
|
||||
AND r42, r41, r40
|
||||
ANDI r42, r42, 255d
|
||||
JNE r42, r0, :0
|
||||
LI64 r1, 0d
|
||||
JMP :1
|
||||
0: LI64 r1, 1d
|
||||
1: LD r31, r254, 26a, 112h
|
||||
ADDI64 r254, r254, 138d
|
||||
1: LD r31, r254, 26a, 96h
|
||||
ADDI64 r254, r254, 122d
|
||||
JALA r0, r31, 0a
|
||||
returner_bn:
|
||||
ADDI64 r254, r254, -24d
|
||||
|
@ -57,6 +54,6 @@ returner_fn:
|
|||
LD r1, r254, 0a, 0h
|
||||
ORI r1, r1, 128d
|
||||
JALA r0, r31, 0a
|
||||
code size: 513
|
||||
code size: 480
|
||||
ret: 1
|
||||
status: Ok(())
|
||||
|
|
|
@ -1,31 +1,29 @@
|
|||
main:
|
||||
ADDI64 r254, r254, -1d
|
||||
LI64 r7, 0d
|
||||
LI64 r5, 255d
|
||||
LI8 r4, 1b
|
||||
LI8 r6, 0b
|
||||
ST r6, r254, 0a, 1h
|
||||
LI64 r6, 255d
|
||||
LI8 r2, 1b
|
||||
LI8 r4, 0b
|
||||
ST r4, r254, 0a, 1h
|
||||
2: LD r9, r254, 0a, 1h
|
||||
AND r12, r9, r5
|
||||
CMPU r2, r12, r5
|
||||
CMPUI r2, r2, 0d
|
||||
NOT r2, r2
|
||||
CMPU r6, r12, r7
|
||||
CMPUI r6, r6, 0d
|
||||
NOT r6, r6
|
||||
AND r8, r2, r5
|
||||
AND r10, r6, r5
|
||||
OR r11, r10, r8
|
||||
ANDI r11, r11, 255d
|
||||
JNE r11, r0, :0
|
||||
ANDI r11, r9, 255d
|
||||
CMPU r3, r11, r6
|
||||
CMPUI r3, r3, 0d
|
||||
NOT r3, r3
|
||||
CMPU r5, r11, r7
|
||||
CMPUI r5, r5, 0d
|
||||
NOT r5, r5
|
||||
OR r8, r5, r3
|
||||
ANDI r8, r8, 255d
|
||||
JNE r8, r0, :0
|
||||
JMP :1
|
||||
0: SUB8 r4, r0, r4
|
||||
1: ADD8 r8, r9, r4
|
||||
ST r8, r254, 0a, 1h
|
||||
0: SUB8 r2, r0, r2
|
||||
1: ADD8 r4, r9, r2
|
||||
ST r4, r254, 0a, 1h
|
||||
JMP :2
|
||||
ADDI64 r254, r254, 1d
|
||||
JALA r0, r31, 0a
|
||||
timed out
|
||||
code size: 192
|
||||
code size: 191
|
||||
ret: 0
|
||||
status: Ok(())
|
||||
|
|
Loading…
Reference in a new issue