more oportunities to reduce register copies

This commit is contained in:
mlokr 2024-09-10 12:13:01 +02:00
parent b51f964cae
commit d64fa7e1f9
No known key found for this signature in database
GPG key ID: DEA147DDEE644993
13 changed files with 80 additions and 89 deletions

View file

@ -2209,6 +2209,8 @@ impl Codegen {
}, },
left.loc, left.loc,
) )
} else if left.loc.is_ref() {
(self.loc_to_reg(&left.loc, lsize), dbg!(self.ci.regs.allocate()), left.loc)
} else { } else {
let lhs = self.loc_to_reg(left.loc, lsize); let lhs = self.loc_to_reg(left.loc, lsize);
(lhs.as_ref(), lhs, Loc::default()) (lhs.as_ref(), lhs, Loc::default())
@ -2295,7 +2297,7 @@ impl Codegen {
self.output.emit(op_fn(dst.get(), lhs.get(), rhs.get())); self.output.emit(op_fn(dst.get(), lhs.get(), rhs.get()));
self.output.emit(cmpui(dst.get(), dst.get(), against)); self.output.emit(cmpui(dst.get(), dst.get(), against));
if matches!(op, T::Eq | T::Lt | T::Gt) { if matches!(op, T::Eq | T::Lt | T::Gt) {
self.output.emit(not(lhs.get(), lhs.get())); self.output.emit(not(dst.get(), dst.get()));
} }
self.ci.regs.free(lhs); self.ci.regs.free(lhs);
@ -2690,7 +2692,7 @@ impl Codegen {
} }
def_op!(basic_op | a, b, c | a, b, c as _); def_op!(basic_op | a, b, c | a, b, c as _);
def_op!(sub_op | a, b, c | b, a, c.wrapping_neg() as _); def_op!(sub_op | a, b, c | a, b, c.wrapping_neg() as _);
let ops = match op { let ops = match op {
T::Add => basic_op!(addi8, addi16, addi32, addi64), T::Add => basic_op!(addi8, addi16, addi32, addi64),

View file

@ -6,6 +6,6 @@ main:
LD r31, r254, 0a, 16h LD r31, r254, 0a, 16h
ADDI64 r254, r254, 16d ADDI64 r254, r254, 16d
JALA r0, r31, 0a JALA r0, r31, 0a
code size: 239 code size: 236
ret: 50 ret: 50
status: Ok(()) status: Ok(())

View file

@ -34,21 +34,21 @@ main:
JMP :1 JMP :1
2: CP r33, r0 2: CP r33, r0
LD r33, r254, 4a, 4h LD r33, r254, 4a, 4h
CP r32, r0 CP r34, r0
LD r32, r254, 8a, 4h LD r34, r254, 8a, 4h
ADD32 r33, r33, r32 ADD32 r32, r33, r34
CP r32, r0 CP r34, r0
LD r32, r254, 0a, 1h LD r34, r254, 0a, 1h
ADD32 r33, r33, r32 ADD32 r32, r32, r34
CP r32, r0 CP r34, r0
LD r32, r254, 1a, 1h LD r34, r254, 1a, 1h
ADD32 r33, r33, r32 ADD32 r32, r32, r34
CP r32, r0 CP r34, r0
LD r32, r254, 2a, 1h LD r34, r254, 2a, 1h
ADD32 r33, r33, r32 ADD32 r32, r32, r34
CP r32, r0 CP r34, r0
LD r32, r254, 3a, 1h LD r34, r254, 3a, 1h
ADD32 r1, r33, r32 ADD32 r1, r32, r34
1: LD r31, r254, 12a, 32h 1: LD r31, r254, 12a, 32h
ADDI64 r254, r254, 44d ADDI64 r254, r254, 44d
JALA r0, r31, 0a JALA r0, r31, 0a

View file

@ -18,19 +18,19 @@ main:
ADDI64 r254, r254, 48d ADDI64 r254, r254, 48d
JALA r0, r31, 0a JALA r0, r31, 0a
deinit: deinit:
ADDI64 r254, r254, -24d ADDI64 r254, r254, -32d
ST r31, r254, 0a, 24h ST r31, r254, 0a, 32h
CP r32, r2 CP r32, r2
LD r2, r32, 0a, 8h LD r2, r32, 0a, 8h
LD r33, r32, 16a, 8h LD r33, r32, 16a, 8h
MULI64 r33, r33, 8d MULI64 r34, r33, 8d
CP r3, r33 CP r3, r34
LI64 r4, 8d LI64 r4, 8d
JAL r31, r0, :free JAL r31, r0, :free
CP r1, r32 CP r1, r32
JAL r31, r0, :new JAL r31, r0, :new
LD r31, r254, 0a, 24h LD r31, r254, 0a, 32h
ADDI64 r254, r254, 24d ADDI64 r254, r254, 32d
JALA r0, r31, 0a JALA r0, r31, 0a
free: free:
ADDI64 r254, r254, -40d ADDI64 r254, r254, -40d
@ -62,10 +62,10 @@ push:
ST r34, r32, 16a, 8h ST r34, r32, 16a, 8h
JMP :2 JMP :2
1: LD r34, r32, 16a, 8h 1: LD r34, r32, 16a, 8h
MULI64 r34, r34, 2d MULI64 r35, r34, 2d
ST r34, r32, 16a, 8h ST r35, r32, 16a, 8h
2: LD r34, r32, 16a, 8h 2: LD r35, r32, 16a, 8h
MULI64 r34, r34, 8d MULI64 r34, r35, 8d
CP r2, r34 CP r2, r34
LI64 r3, 8d LI64 r3, 8d
JAL r31, r0, :malloc JAL r31, r0, :malloc
@ -77,37 +77,37 @@ push:
3: LD r35, r32, 0a, 8h 3: LD r35, r32, 0a, 8h
CP r36, r34 CP r36, r34
LD r37, r32, 0a, 8h LD r37, r32, 0a, 8h
LD r38, r32, 8a, 8h LD r39, r32, 8a, 8h
MULI64 r38, r38, 8d MULI64 r39, r39, 8d
ADD64 r37, r37, r38 ADD64 r38, r37, r39
7: JNE r35, r37, :5 7: JNE r35, r38, :5
JMP :6 JMP :6
5: CP r38, r36 5: CP r39, r36
CP r39, r35 CP r37, r35
BMC r39, r38, 8h BMC r37, r39, 8h
ADDI64 r35, r35, 8d ADDI64 r35, r35, 8d
ADDI64 r36, r36, 8d ADDI64 r36, r36, 8d
JMP :7 JMP :7
6: LD r38, r32, 8a, 8h 6: LD r39, r32, 8a, 8h
LI64 r39, 0d LI64 r37, 0d
JEQ r38, r39, :8 JEQ r39, r37, :8
LD r2, r32, 0a, 8h LD r2, r32, 0a, 8h
LD r39, r32, 8a, 8h LD r37, r32, 8a, 8h
MULI64 r39, r39, 8d MULI64 r39, r37, 8d
CP r3, r39 CP r3, r39
LI64 r4, 8d LI64 r4, 8d
JAL r31, r0, :free JAL r31, r0, :free
8: ST r34, r32, 0a, 8h 8: ST r34, r32, 0a, 8h
0: LD r34, r32, 0a, 8h 0: LD r34, r32, 0a, 8h
LD r39, r32, 8a, 8h LD r37, r32, 8a, 8h
MULI64 r39, r39, 8d MULI64 r37, r37, 8d
ADD64 r34, r34, r39 ADD64 r39, r34, r37
CP r39, r34 CP r37, r39
ST r33, r39, 0a, 8h ST r33, r37, 0a, 8h
LD r39, r32, 8a, 8h LD r37, r32, 8a, 8h
ADDI64 r39, r39, 1d ADDI64 r37, r37, 1d
ST r39, r32, 8a, 8h ST r37, r32, 8a, 8h
CP r1, r34 CP r1, r39
4: LD r31, r254, 0a, 72h 4: LD r31, r254, 0a, 72h
ADDI64 r254, r254, 72d ADDI64 r254, r254, 72d
JALA r0, r31, 0a JALA r0, r31, 0a

View file

@ -11,6 +11,6 @@ main:
LD r31, r254, 0a, 32h LD r31, r254, 0a, 32h
ADDI64 r254, r254, 32d ADDI64 r254, r254, 32d
JALA r0, r31, 0a JALA r0, r31, 0a
code size: 299 code size: 296
ret: 55 ret: 55
status: Ok(()) status: Ok(())

View file

@ -14,8 +14,7 @@ fib:
JGTS r32, r33, :0 JGTS r32, r33, :0
LI64 r1, 1d LI64 r1, 1d
JMP :1 JMP :1
0: CP r33, r32 0: ADDI64 r33, r32, -1d
ADDI64 r33, r33, -1d
CP r2, r33 CP r2, r33
JAL r31, r0, :fib JAL r31, r0, :fib
CP r33, r1 CP r33, r1
@ -27,6 +26,6 @@ fib:
1: LD r31, r254, 0a, 24h 1: LD r31, r254, 0a, 24h
ADDI64 r254, r254, 24d ADDI64 r254, r254, 24d
JALA r0, r31, 0a JALA r0, r31, 0a
code size: 231 code size: 228
ret: 55 ret: 55
status: Ok(()) status: Ok(())

View file

@ -4,7 +4,7 @@ main:
LI64 r33, 1d LI64 r33, 1d
ADDI64 r33, r33, 2d ADDI64 r33, r33, 2d
ADDI64 r32, r33, 3d ADDI64 r32, r33, 3d
ADDI64 r32, r1, -6d ADDI64 r1, r32, -6d
LD r31, r254, 0a, 24h LD r31, r254, 0a, 24h
ADDI64 r254, r254, 24d ADDI64 r254, r254, 24d
JALA r0, r31, 0a JALA r0, r31, 0a

View file

@ -57,11 +57,10 @@ example:
CMPUI r35, r35, 0d CMPUI r35, r35, 0d
OR r34, r34, r35 OR r34, r34, r35
JEQ r34, r0, :0 JEQ r34, r0, :0
CP r34, r33
LI64 r35, 1024d LI64 r35, 1024d
ADDI64 r35, r35, 0d ADDI64 r35, r35, 0d
ADDI64 r35, r35, 1d ADDI64 r35, r35, 1d
DIRS64 r0, r34, r34, r35 DIRS64 r0, r34, r33, r35
ADDI64 r32, r34, 0d ADDI64 r32, r34, 0d
JMP :1 JMP :1
0: CP r32, r33 0: CP r32, r33
@ -83,20 +82,17 @@ integer:
LI64 r3, 4d LI64 r3, 4d
ECA ECA
CP r34, r1 CP r34, r1
CP r35, r32
LI64 r36, 0d LI64 r36, 0d
CMPS r35, r35, r36 CMPS r35, r32, r36
CMPUI r35, r35, 0d CMPUI r35, r35, 0d
CP r36, r33
LI64 r37, 0d LI64 r37, 0d
CMPS r36, r36, r37 CMPS r36, r33, r37
CMPUI r36, r36, 0d CMPUI r36, r36, 0d
OR r35, r35, r36 OR r35, r35, r36
JEQ r35, r0, :0 JEQ r35, r0, :0
CP r35, r34
SUB64 r33, r33, r32 SUB64 r33, r33, r32
ADDI64 r33, r33, 1d ADDI64 r33, r33, 1d
DIRS64 r0, r35, r35, r33 DIRS64 r0, r35, r34, r33
ADD64 r1, r35, r32 ADD64 r1, r35, r32
JMP :1 JMP :1
0: CP r1, r34 0: CP r1, r34
@ -118,16 +114,16 @@ rect_line:
0: LD r34, r254, 8a, 8h 0: LD r34, r254, 8a, 8h
LD r35, r254, 0a, 8h LD r35, r254, 0a, 8h
4: LD r36, r254, 8a, 8h 4: LD r36, r254, 8a, 8h
LD r37, r254, 16a, 8h LD r38, r254, 16a, 8h
ADD64 r36, r36, r37 ADD64 r37, r36, r38
JNE r34, r36, :2 JNE r34, r37, :2
JMP :3 JMP :3
2: LI64 r36, 1d 2: LI64 r37, 1d
LI64 r37, 10d LI64 r38, 10d
ADD64 r36, r36, r37 ADD64 r37, r37, r38
LI64 r37, 1d LI64 r38, 1d
LI64 r38, 2d LI64 r36, 2d
ADD64 r36, r37, r38 ADD64 r37, r38, r36
ADDI64 r34, r34, 1d ADDI64 r34, r34, 1d
JMP :4 JMP :4
3: ADDI64 r33, r33, 1d 3: ADDI64 r33, r33, 1d
@ -156,6 +152,6 @@ line:
2: LD r31, r254, 48a, 32h 2: LD r31, r254, 48a, 32h
ADDI64 r254, r254, 80d ADDI64 r254, r254, 80d
JALA r0, r31, 0a JALA r0, r31, 0a
code size: 1416 code size: 1404
ret: 0 ret: 0
status: Ok(()) status: Ok(())

View file

@ -16,14 +16,13 @@ integer_range:
LI64 r2, 3d LI64 r2, 3d
LI64 r3, 4d LI64 r3, 4d
ECA ECA
CP r34, r1
SUB64 r33, r33, r32 SUB64 r33, r33, r32
ADDI64 r33, r33, 1d ADDI64 r33, r33, 1d
DIRU64 r0, r34, r34, r33 DIRU64 r0, r34, r1, r33
ADD64 r1, r34, r32 ADD64 r1, r34, r32
LD r31, r254, 0a, 32h LD r31, r254, 0a, 32h
ADDI64 r254, r254, 32d ADDI64 r254, r254, 32d
JALA r0, r31, 0a JALA r0, r31, 0a
code size: 214 code size: 211
ret: 42 ret: 42
status: Ok(()) status: Ok(())

View file

@ -15,8 +15,7 @@ fib:
2: LI64 r35, 0d 2: LI64 r35, 0d
JNE r32, r35, :0 JNE r32, r35, :0
JMP :1 JMP :1
0: CP r35, r33 0: ADD64 r35, r33, r34
ADD64 r35, r35, r34
CP r33, r34 CP r33, r34
CP r34, r35 CP r34, r35
ADDI64 r32, r32, -1d ADDI64 r32, r32, -1d
@ -25,6 +24,6 @@ fib:
LD r31, r254, 0a, 40h LD r31, r254, 0a, 40h
ADDI64 r254, r254, 40d ADDI64 r254, r254, 40d
JALA r0, r31, 0a JALA r0, r31, 0a
code size: 218 code size: 215
ret: 55 ret: 55
status: Ok(()) status: Ok(())

View file

@ -10,7 +10,7 @@ main:
JAL r31, r0, :drop JAL r31, r0, :drop
LI64 r33, 0d LI64 r33, 0d
LD r34, r32, 0a, 8h LD r34, r32, 0a, 8h
ADDI64 r34, r1, -2d ADDI64 r1, r34, -2d
LD r31, r254, 8a, 32h LD r31, r254, 8a, 32h
ADDI64 r254, r254, 40d ADDI64 r254, r254, 40d
JALA r0, r31, 0a JALA r0, r31, 0a

View file

@ -43,8 +43,7 @@ request_page:
ST r31, r254, 0a, 32h ST r31, r254, 0a, 32h
CP r32, r2 CP r32, r2
LRA r33, r0, :"\0\u{1}xxxxxxxx" LRA r33, r0, :"\0\u{1}xxxxxxxx"
CP r34, r33 ADDI64 r34, r33, 1d
ADDI64 r34, r34, 1d
ST r32, r34, 0a, 1h ST r32, r34, 0a, 1h
LI64 r2, 3d LI64 r2, 3d
LI64 r3, 2d LI64 r3, 2d
@ -54,6 +53,6 @@ request_page:
LD r31, r254, 0a, 32h LD r31, r254, 0a, 32h
ADDI64 r254, r254, 32d ADDI64 r254, r254, 32d
JALA r0, r31, 0a JALA r0, r31, 0a
code size: 443 code size: 440
ret: 42 ret: 42
status: Ok(()) status: Ok(())

View file

@ -28,8 +28,7 @@ fib_iter:
2: LI64 r35, 0d 2: LI64 r35, 0d
JNE r32, r35, :0 JNE r32, r35, :0
JMP :1 JMP :1
0: CP r35, r33 0: ADD64 r35, r33, r34
ADD64 r35, r35, r34
CP r33, r34 CP r33, r34
CP r34, r35 CP r34, r35
ADDI64 r32, r32, -1d ADDI64 r32, r32, -1d
@ -44,13 +43,11 @@ fib:
CP r32, r2 CP r32, r2
LI64 r33, 2d LI64 r33, 2d
JLTS r32, r33, :0 JLTS r32, r33, :0
CP r33, r32 ADDI64 r33, r32, -1d
ADDI64 r33, r33, -1d
CP r2, r33 CP r2, r33
JAL r31, r0, :fib JAL r31, r0, :fib
CP r33, r1 CP r33, r1
CP r34, r32 ADDI64 r34, r32, -2d
ADDI64 r34, r34, -2d
CP r2, r34 CP r2, r34
JAL r31, r0, :fib JAL r31, r0, :fib
CP r34, r1 CP r34, r1
@ -60,6 +57,6 @@ fib:
1: LD r31, r254, 0a, 32h 1: LD r31, r254, 0a, 32h
ADDI64 r254, r254, 32d ADDI64 r254, r254, 32d
JALA r0, r31, 0a JALA r0, r31, 0a
code size: 464 code size: 455
ret: 0 ret: 0
status: Ok(()) status: Ok(())