mirror of
https://gitlab.com/camelot/kickc.git
synced 2025-02-09 18:31:23 +00:00
Added tests for duplicate assignment right side optimization.
This commit is contained in:
parent
c1213f4d55
commit
2c808e59d6
@ -109,6 +109,19 @@ public class Pass2DuplicateRValueIdentification extends Pass2SsaOptimization {
|
||||
private boolean isTrivial() {
|
||||
if(operator == null) return true;
|
||||
if(operator instanceof OperatorCast) return true;
|
||||
if(operator.equals(Operators.PLUS)) return true;
|
||||
if(operator.equals(Operators.MINUS)) return true;
|
||||
if(operator.equals(Operators.BOOL_AND)) return true;
|
||||
if(operator.equals(Operators.BOOL_OR)) return true;
|
||||
if(operator.equals(Operators.BOOL_XOR)) return true;
|
||||
if(operator.equals(Operators.BOOL_NOT)) return true;
|
||||
if(operator.equals(Operators.LE)) return true;
|
||||
if(operator.equals(Operators.LT)) return true;
|
||||
if(operator.equals(Operators.GE)) return true;
|
||||
if(operator.equals(Operators.GT)) return true;
|
||||
if(operator.equals(Operators.EQ)) return true;
|
||||
if(operator.equals(Operators.NEQ)) return true;
|
||||
if(operator.equals(Operators.LOGIC_NOT)) return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -63,6 +63,11 @@ public class TestPrograms {
|
||||
|
||||
*/
|
||||
|
||||
@Test
|
||||
public void testSubExprOptimize1() throws IOException, URISyntaxException {
|
||||
compileAndCompare("subexpr-optimize-1");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSubExprOptimize0() throws IOException, URISyntaxException {
|
||||
compileAndCompare("subexpr-optimize-0");
|
||||
|
@ -3,8 +3,8 @@
|
||||
void main() {
|
||||
byte* screen = 0x400;
|
||||
for( byte i: 0..2) {
|
||||
*screen++ = i+1;
|
||||
*screen++ = i+1;
|
||||
*screen++ = i*2;
|
||||
*screen++ = i*2;
|
||||
}
|
||||
}
|
||||
|
||||
|
12
src/test/kc/subexpr-optimize-1.kc
Normal file
12
src/test/kc/subexpr-optimize-1.kc
Normal file
@ -0,0 +1,12 @@
|
||||
// A sub-expression that should not be optimized (+1 to a pointer)
|
||||
|
||||
void main() {
|
||||
byte* SCREEN = 0x0400;
|
||||
for(byte i: 0..38) {
|
||||
SCREEN[i] = SCREEN[i+1];
|
||||
(SCREEN+40)[i] = (SCREEN+40)[i+1];
|
||||
(SCREEN+80)[i] = (SCREEN+80)[i+1];
|
||||
(SCREEN+120)[i] = (SCREEN+120)[i+1];
|
||||
}
|
||||
|
||||
}
|
@ -1412,22 +1412,19 @@ render_init: {
|
||||
sta li_1
|
||||
lda #>PLAYFIELD_SCREEN_1+2*$28+$10
|
||||
sta li_1+1
|
||||
ldx #0
|
||||
ldy #0
|
||||
b1:
|
||||
txa
|
||||
tya
|
||||
asl
|
||||
tay
|
||||
tax
|
||||
lda li_1
|
||||
sta screen_lines_1,y
|
||||
sta screen_lines_1,x
|
||||
lda li_1+1
|
||||
sta screen_lines_1+1,y
|
||||
txa
|
||||
asl
|
||||
tay
|
||||
sta screen_lines_1+1,x
|
||||
lda li_2
|
||||
sta screen_lines_2,y
|
||||
sta screen_lines_2,x
|
||||
lda li_2+1
|
||||
sta screen_lines_2+1,y
|
||||
sta screen_lines_2+1,x
|
||||
lda #$28
|
||||
clc
|
||||
adc li_1
|
||||
@ -1442,8 +1439,8 @@ render_init: {
|
||||
bcc !+
|
||||
inc li_2+1
|
||||
!:
|
||||
inx
|
||||
cpx #PLAYFIELD_LINES-1+1
|
||||
iny
|
||||
cpy #PLAYFIELD_LINES-1+1
|
||||
bne b1
|
||||
rts
|
||||
}
|
||||
|
@ -244,42 +244,35 @@ mulf_init: {
|
||||
sta add
|
||||
lda #0
|
||||
sta add+1
|
||||
tax
|
||||
tay
|
||||
sta sqr
|
||||
sta sqr+1
|
||||
b1:
|
||||
lda sqr+1
|
||||
sta val
|
||||
sta mulf_sqr1,y
|
||||
sta mulf_sqr1+$100,y
|
||||
tya
|
||||
eor #$ff
|
||||
tax
|
||||
inx
|
||||
lda val
|
||||
sta mulf_sqr1,x
|
||||
sta mulf_sqr1+$100,x
|
||||
txa
|
||||
sta mulf_sqr2+1,y
|
||||
sta mulf_sqr2+$100+1,y
|
||||
tya
|
||||
eor #$ff
|
||||
tay
|
||||
iny
|
||||
tax
|
||||
axs #1+1
|
||||
lda val
|
||||
sta mulf_sqr1,y
|
||||
txa
|
||||
sta mulf_sqr2,x
|
||||
tya
|
||||
eor #$ff
|
||||
tay
|
||||
iny
|
||||
tax
|
||||
axs #1+1
|
||||
lda val
|
||||
sta mulf_sqr1+$100,y
|
||||
sta mulf_sqr2+1,x
|
||||
sta mulf_sqr2+$100+1,x
|
||||
txa
|
||||
eor #$ff
|
||||
clc
|
||||
adc #1+1
|
||||
tay
|
||||
lda val
|
||||
sta mulf_sqr2,y
|
||||
txa
|
||||
eor #$ff
|
||||
clc
|
||||
adc #1+1
|
||||
tay
|
||||
lda val
|
||||
sta mulf_sqr2+$100,y
|
||||
sta mulf_sqr2+$100,x
|
||||
lda sqr
|
||||
clc
|
||||
adc add
|
||||
@ -294,8 +287,8 @@ mulf_init: {
|
||||
bcc !+
|
||||
inc add+1
|
||||
!:
|
||||
inx
|
||||
cpx #$81
|
||||
iny
|
||||
cpy #$81
|
||||
bne b1
|
||||
rts
|
||||
}
|
||||
|
@ -120,17 +120,13 @@ plexShowSprite: {
|
||||
ldx plex_sprite_idx
|
||||
sta PLEX_SCREEN_PTR,x
|
||||
ldy plex_show_idx
|
||||
ldx PLEX_SORTED_IDX,y
|
||||
txa
|
||||
lda PLEX_SORTED_IDX,y
|
||||
asl
|
||||
tay
|
||||
lda PLEX_XPOS,y
|
||||
tax
|
||||
lda PLEX_XPOS,x
|
||||
ldy plex_sprite_idx2
|
||||
sta SPRITES_XPOS,y
|
||||
txa
|
||||
asl
|
||||
tay
|
||||
lda PLEX_XPOS+1,y
|
||||
lda PLEX_XPOS+1,x
|
||||
cmp #0
|
||||
bne b1
|
||||
lda #$ff
|
||||
|
@ -127,17 +127,14 @@ point_init: {
|
||||
.label x_diff = 9
|
||||
lda point_idx
|
||||
asl
|
||||
tay
|
||||
lda x_end,y
|
||||
tax
|
||||
lda x_end,x
|
||||
sta _0
|
||||
lda x_end+1,y
|
||||
lda x_end+1,x
|
||||
sta _0+1
|
||||
lda point_idx
|
||||
asl
|
||||
tay
|
||||
lda x_start,y
|
||||
lda x_start,x
|
||||
sta _1
|
||||
lda x_start+1,y
|
||||
lda x_start+1,x
|
||||
sta _1+1
|
||||
lda x_diff
|
||||
sec
|
||||
@ -191,10 +188,10 @@ point_init: {
|
||||
b2:
|
||||
lda point_idx
|
||||
asl
|
||||
tay
|
||||
lda x_start,y
|
||||
tax
|
||||
lda x_start,x
|
||||
sta _9
|
||||
lda x_start+1,y
|
||||
lda x_start+1,x
|
||||
sta _9+1
|
||||
asl _9
|
||||
rol _9+1
|
||||
@ -204,13 +201,10 @@ point_init: {
|
||||
rol _9+1
|
||||
asl _9
|
||||
rol _9+1
|
||||
lda point_idx
|
||||
asl
|
||||
tay
|
||||
lda _9
|
||||
sta x_cur,y
|
||||
sta x_cur,x
|
||||
lda _9+1
|
||||
sta x_cur+1,y
|
||||
sta x_cur+1,x
|
||||
ldy point_idx
|
||||
lda y_start,y
|
||||
sta _10
|
||||
@ -224,15 +218,11 @@ point_init: {
|
||||
rol _11+1
|
||||
asl _11
|
||||
rol _11+1
|
||||
tya
|
||||
asl
|
||||
tay
|
||||
lda _11
|
||||
sta y_cur,y
|
||||
sta y_cur,x
|
||||
lda _11+1
|
||||
sta y_cur+1,y
|
||||
sta y_cur+1,x
|
||||
lda #DELAY
|
||||
ldy point_idx
|
||||
sta delay,y
|
||||
rts
|
||||
b1:
|
||||
|
@ -290,17 +290,13 @@ plexShowSprite: {
|
||||
ldx plex_sprite_idx
|
||||
sta PLEX_SCREEN_PTR,x
|
||||
ldy plex_show_idx
|
||||
ldx PLEX_SORTED_IDX,y
|
||||
txa
|
||||
lda PLEX_SORTED_IDX,y
|
||||
asl
|
||||
tay
|
||||
lda PLEX_XPOS,y
|
||||
tax
|
||||
lda PLEX_XPOS,x
|
||||
ldy plex_sprite_idx2
|
||||
sta SPRITES_XPOS,y
|
||||
txa
|
||||
asl
|
||||
tay
|
||||
lda PLEX_XPOS+1,y
|
||||
lda PLEX_XPOS+1,x
|
||||
cmp #0
|
||||
bne b1
|
||||
lda #$ff
|
||||
|
@ -37,9 +37,6 @@ position_sprite: {
|
||||
tay
|
||||
lda #y
|
||||
sta SPRITES_YPOS,y
|
||||
lda spriteno
|
||||
asl
|
||||
tay
|
||||
lda x
|
||||
sta SPRITES_XPOS,y
|
||||
lda x+1
|
||||
|
@ -4,6 +4,7 @@
|
||||
:BasicUpstart(main)
|
||||
.pc = $80d "Program"
|
||||
main: {
|
||||
.label _1 = 4
|
||||
.label screen = 2
|
||||
lda #<$400
|
||||
sta screen
|
||||
@ -12,19 +13,15 @@ main: {
|
||||
ldx #0
|
||||
b1:
|
||||
txa
|
||||
tay
|
||||
iny
|
||||
tya
|
||||
asl
|
||||
sta _1
|
||||
ldy #0
|
||||
sta (screen),y
|
||||
inc screen
|
||||
bne !+
|
||||
inc screen+1
|
||||
!:
|
||||
txa
|
||||
tay
|
||||
iny
|
||||
tya
|
||||
lda _1
|
||||
ldy #0
|
||||
sta (screen),y
|
||||
inc screen
|
||||
|
21
src/test/ref/subexpr-optimize-1.asm
Normal file
21
src/test/ref/subexpr-optimize-1.asm
Normal file
@ -0,0 +1,21 @@
|
||||
// A sub-expression that should not be optimized (+1 to a pointer)
|
||||
.pc = $801 "Basic"
|
||||
:BasicUpstart(main)
|
||||
.pc = $80d "Program"
|
||||
main: {
|
||||
.label SCREEN = $400
|
||||
ldx #0
|
||||
b1:
|
||||
lda SCREEN+1,x
|
||||
sta SCREEN,x
|
||||
lda SCREEN+$28+1,x
|
||||
sta SCREEN+$28,x
|
||||
lda SCREEN+$50+1,x
|
||||
sta SCREEN+$50,x
|
||||
lda SCREEN+$78+1,x
|
||||
sta SCREEN+$78,x
|
||||
inx
|
||||
cpx #$27
|
||||
bne b1
|
||||
rts
|
||||
}
|
@ -24,17 +24,14 @@ test_16s: {
|
||||
b1:
|
||||
lda i
|
||||
asl
|
||||
tay
|
||||
lda dividends,y
|
||||
tax
|
||||
lda dividends,x
|
||||
sta dividend
|
||||
lda dividends+1,y
|
||||
lda dividends+1,x
|
||||
sta dividend+1
|
||||
lda i
|
||||
asl
|
||||
tay
|
||||
lda divisors,y
|
||||
lda divisors,x
|
||||
sta divisor
|
||||
lda divisors+1,y
|
||||
lda divisors+1,x
|
||||
sta divisor+1
|
||||
jsr div16s
|
||||
lda print_line_cursor
|
||||
@ -76,9 +73,7 @@ test_16s: {
|
||||
inc i
|
||||
lda #6
|
||||
cmp i
|
||||
beq !b1+
|
||||
jmp b1
|
||||
!b1:
|
||||
bne b1
|
||||
rts
|
||||
dividends: .word $7fff, $7fff, -$7fff, -$7fff, $7fff, -$7fff
|
||||
divisors: .word 5, -7, $b, -$d, -$11, $13
|
||||
@ -539,17 +534,14 @@ test_16u: {
|
||||
b1:
|
||||
lda i
|
||||
asl
|
||||
tay
|
||||
lda dividends,y
|
||||
tax
|
||||
lda dividends,x
|
||||
sta dividend
|
||||
lda dividends+1,y
|
||||
lda dividends+1,x
|
||||
sta dividend+1
|
||||
lda i
|
||||
asl
|
||||
tay
|
||||
lda divisors,y
|
||||
lda divisors,x
|
||||
sta divisor
|
||||
lda divisors+1,y
|
||||
lda divisors+1,x
|
||||
sta divisor+1
|
||||
jsr div16u
|
||||
lda print_line_cursor
|
||||
|
Loading…
x
Reference in New Issue
Block a user