mirror of
https://github.com/irmen/prog8.git
synced 2024-12-24 16:29:21 +00:00
float init optimization in asm
This commit is contained in:
parent
9424387803
commit
76aeb06c97
@ -654,13 +654,13 @@ private class StatementTranslator(private val prog: IntermediateProgram,
|
||||
DataType.STR, DataType.STR_P, DataType.STR_S, DataType.STR_PS -> {
|
||||
if(lv.heapId==null)
|
||||
throw CompilerException("string should have been moved into heap ${lv.position}")
|
||||
prog.instr(Opcode.PUSH_ADDR_HEAPVAR, callLabel = "@todo-string-varname?") // XXX push address of string
|
||||
TODO("push address of string with PUSH_ADDR_HEAPVAR")
|
||||
}
|
||||
DataType.ARRAY_UB, DataType.ARRAY_UW, DataType.ARRAY_F,
|
||||
DataType.ARRAY_B, DataType.ARRAY_W -> {
|
||||
if(lv.heapId==null)
|
||||
throw CompilerException("array should have been moved into heap ${lv.position}")
|
||||
prog.instr(Opcode.PUSH_WORD, Value(lv.type, lv.heapId)) // XXX push address of array
|
||||
TODO("push address of array with PUSH_WORD")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -37,6 +37,7 @@ fun optimizeSameAssignments(linesByFourteen: List<List<IndexedValue<String>>>):
|
||||
|
||||
// optimize sequential assignments of the same value to various targets (bytes, words, floats)
|
||||
// the float one is the one that requires 2*7=14 lines of code to check...
|
||||
// @todo a better place to do this is in the Compiler instead and work on opcodes, and never even create the inefficient asm...
|
||||
|
||||
val removeLines = mutableListOf<Int>()
|
||||
for (pair in linesByFourteen) {
|
||||
@ -71,7 +72,28 @@ fun optimizeSameAssignments(linesByFourteen: List<List<IndexedValue<String>>>):
|
||||
}
|
||||
}
|
||||
|
||||
// @todo check float initializations.
|
||||
if(first.startsWith("lda") && second.startsWith("ldy") && third.startsWith("sta") && fourth.startsWith("sty") &&
|
||||
fifth.startsWith("lda") && sixth.startsWith("ldy") && seventh.startsWith("jsr c64flt.copy_float")) {
|
||||
|
||||
val nineth = pair[8].value.trimStart()
|
||||
val tenth = pair[9].value.trimStart()
|
||||
val eleventh = pair[10].value.trimStart()
|
||||
val twelveth = pair[11].value.trimStart()
|
||||
val thirteenth = pair[12].value.trimStart()
|
||||
val fourteenth = pair[13].value.trimStart()
|
||||
|
||||
if(eighth.startsWith("lda") && nineth.startsWith("ldy") && tenth.startsWith("sta") && eleventh.startsWith("sty") &&
|
||||
twelveth.startsWith("lda") && thirteenth.startsWith("ldy") && fourteenth.startsWith("jsr c64flt.copy_float")) {
|
||||
|
||||
if(first.substring(4) == eighth.substring(4) && second.substring(4)==nineth.substring(4)) {
|
||||
// identical float init
|
||||
removeLines.add(pair[7].index)
|
||||
removeLines.add(pair[8].index)
|
||||
removeLines.add(pair[9].index)
|
||||
removeLines.add(pair[10].index)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return removeLines
|
||||
}
|
||||
|
131
examples/test.p8
131
examples/test.p8
@ -5,37 +5,112 @@
|
||||
|
||||
sub start() {
|
||||
|
||||
ubyte ub
|
||||
byte b
|
||||
word w
|
||||
uword uw
|
||||
ubyte ub1
|
||||
ubyte ub2
|
||||
ubyte ub3
|
||||
ubyte ub4
|
||||
byte b1
|
||||
byte b2
|
||||
byte b3
|
||||
byte b4
|
||||
word w1
|
||||
word w2
|
||||
word w3
|
||||
word w4
|
||||
uword uw1
|
||||
uword uw2
|
||||
uword uw3
|
||||
uword uw4
|
||||
float f1
|
||||
float f2
|
||||
float f3
|
||||
float f4
|
||||
memory ubyte mub1 = $c000
|
||||
memory ubyte mub2 = $c000
|
||||
memory ubyte mub3 = $c000
|
||||
memory ubyte mub4 = $c000
|
||||
memory byte mb1 = $c000
|
||||
memory byte mb2 = $c000
|
||||
memory byte mb3 = $c000
|
||||
memory byte mb4 = $c000
|
||||
memory word mw1 = $c000
|
||||
memory word mw2 = $c000
|
||||
memory word mw3 = $c000
|
||||
memory word mw4 = $c000
|
||||
memory uword muw1 = $c000
|
||||
memory uword muw2 = $c000
|
||||
memory uword muw3 = $c000
|
||||
memory uword muw4 = $c000
|
||||
memory float mf1 = $c010
|
||||
memory float mf2 = $c020
|
||||
memory float mf3 = $c030
|
||||
memory float mf4 = $c040
|
||||
|
||||
ub1 = $11
|
||||
ub2 = $11
|
||||
ub3 = $11
|
||||
mub1 = $11
|
||||
mub2 = $11
|
||||
mub3 = $11
|
||||
ub4 = $44
|
||||
mub4 = $44
|
||||
|
||||
ubyte[2] uba
|
||||
byte[2] ba
|
||||
word[2] wa
|
||||
uword[2] uwa
|
||||
str s
|
||||
str_p sp
|
||||
str_s ss
|
||||
str_ps sps
|
||||
b1=$11
|
||||
b2=$11
|
||||
b3=$11
|
||||
mb1=$11
|
||||
mb2=$11
|
||||
mb3=$11
|
||||
b4=$44
|
||||
mb4=$44
|
||||
|
||||
s = ub as str
|
||||
sp = ub as str_p
|
||||
ss = ub as str_s
|
||||
sps = ub as str_ps
|
||||
s = b as str
|
||||
sp = b as str_p
|
||||
ss = b as str_s
|
||||
sps = b as str_ps
|
||||
s = w as str
|
||||
sp = w as str_p
|
||||
ss = w as str_s
|
||||
sps = w as str_ps
|
||||
s = uw as str
|
||||
sp = uw as str_p
|
||||
ss = uw as str_s
|
||||
sps = uw as str_ps
|
||||
w1=$1111
|
||||
w2=$1111
|
||||
w3=$1111
|
||||
mw1=$1111
|
||||
mw2=$1111
|
||||
mw3=$1111
|
||||
w4=$4444
|
||||
mw4=$4444
|
||||
|
||||
uw1=$1111
|
||||
uw2=$1111
|
||||
uw3=$1111
|
||||
muw1=$1111
|
||||
muw2=$1111
|
||||
muw3=$1111
|
||||
uw4=$4444
|
||||
muw4=$4444
|
||||
|
||||
f1 = 12.11
|
||||
f1 = 13.11
|
||||
f1 = 14.11
|
||||
f1 = 15.11
|
||||
f1 = 11.11
|
||||
f2 = 11.11
|
||||
f3 = 11.11
|
||||
mf1 = 11.11
|
||||
mf2 = 11.11
|
||||
mf3 = 11.11
|
||||
f4 = 44.44
|
||||
mf4 = 44.44
|
||||
|
||||
c64flt.print_f(f1)
|
||||
c64.CHROUT('\n')
|
||||
c64flt.print_f(f2)
|
||||
c64.CHROUT('\n')
|
||||
c64flt.print_f(f3)
|
||||
c64.CHROUT('\n')
|
||||
c64flt.print_f(f4)
|
||||
c64.CHROUT('\n')
|
||||
c64flt.print_f(mf1)
|
||||
c64.CHROUT('\n')
|
||||
c64flt.print_f(mf2)
|
||||
c64.CHROUT('\n')
|
||||
c64flt.print_f(mf3)
|
||||
c64.CHROUT('\n')
|
||||
c64flt.print_f(mf4)
|
||||
c64.CHROUT('\n')
|
||||
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user