mirror of
https://github.com/irmen/prog8.git
synced 2024-10-19 07:23:56 +00:00
optimize assignment with literal value; const-convert value to target datatype literal if possible
This commit is contained in:
parent
18c6165325
commit
34fb82969c
@ -1,53 +1,26 @@
|
|||||||
|
%option enable_floats
|
||||||
|
|
||||||
~ main {
|
~ main {
|
||||||
|
|
||||||
|
|
||||||
sub start() {
|
sub start() {
|
||||||
|
|
||||||
byte[10] barray1
|
byte bvar = 128
|
||||||
byte[10] barray2 = 11
|
word wvar = 128
|
||||||
byte[10] barray3 = [1,2,3,4,5,6,7,8,9,255]
|
float fvar = 128
|
||||||
|
|
||||||
word[10] warray1
|
bvar = 1
|
||||||
word[10] warray2 = 112233
|
bvar = 2.0
|
||||||
word[10] warray3 = [1,2000,3000,4,5,6,7,8,9, 65535]
|
;bvar = 2.w ; @todo don't crash
|
||||||
|
wvar = 1 ; @todo optimize byte literal to word literal
|
||||||
byte[4,5] mvar1
|
wvar = 2.w
|
||||||
byte[4,5] mvar2 = 22
|
wvar = 2.0
|
||||||
byte[2,3] mvar3 = [1,2,3,4,5,6]
|
wvar = bvar
|
||||||
|
fvar = 1 ; @todo optimize byte literal to float literal
|
||||||
float[3] farray1
|
fvar = 2.w ; @todo optimize word literal to float literal
|
||||||
float[3] farray2 = 33.44
|
fvar = 22.33
|
||||||
float[3] farray2b = 33
|
fvar = bvar
|
||||||
float[3] farray3 = [1,2,3]
|
fvar = wvar
|
||||||
float[3] farray4 = [1,2,35566]
|
|
||||||
float[3] farray5 = [1,2.22334,3.1415]
|
|
||||||
|
|
||||||
str name = "irmen"
|
|
||||||
|
|
||||||
byte i
|
|
||||||
word w
|
|
||||||
|
|
||||||
_vm_write_str(name)
|
|
||||||
_vm_write_char('\n')
|
|
||||||
name[2] = '@'
|
|
||||||
_vm_write_str(name)
|
|
||||||
_vm_write_char('\n')
|
|
||||||
|
|
||||||
for i in barray3 {
|
|
||||||
_vm_write_num(i)
|
|
||||||
_vm_write_char('\n')
|
|
||||||
}
|
|
||||||
|
|
||||||
for w in warray3 {
|
|
||||||
_vm_write_num(w)
|
|
||||||
_vm_write_char('\n')
|
|
||||||
}
|
|
||||||
|
|
||||||
for i in name {
|
|
||||||
_vm_write_num(i)
|
|
||||||
_vm_write_char('\n')
|
|
||||||
}
|
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
@ -5,6 +5,7 @@ import prog8.compiler.HeapValues
|
|||||||
import prog8.compiler.target.c64.FLOAT_MAX_NEGATIVE
|
import prog8.compiler.target.c64.FLOAT_MAX_NEGATIVE
|
||||||
import prog8.compiler.target.c64.FLOAT_MAX_POSITIVE
|
import prog8.compiler.target.c64.FLOAT_MAX_POSITIVE
|
||||||
import prog8.compiler.target.c64.Petscii
|
import prog8.compiler.target.c64.Petscii
|
||||||
|
import kotlin.math.floor
|
||||||
|
|
||||||
|
|
||||||
class ConstantFolding(private val namespace: INameScope, private val heap: HeapValues) : IAstProcessor {
|
class ConstantFolding(private val namespace: INameScope, private val heap: HeapValues) : IAstProcessor {
|
||||||
@ -382,6 +383,43 @@ class ConstantFolding(private val namespace: INameScope, private val heap: HeapV
|
|||||||
}
|
}
|
||||||
return super.process(arrayIndexedExpression)
|
return super.process(arrayIndexedExpression)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun process(assignment: Assignment): IStatement {
|
||||||
|
super.process(assignment)
|
||||||
|
val lv = assignment.value as? LiteralValue
|
||||||
|
if(lv!=null) {
|
||||||
|
val targetDt = assignment.target.determineDatatype(namespace, heap, assignment)
|
||||||
|
// see if we can promote/convert a literal value to the required datatype
|
||||||
|
when(targetDt) {
|
||||||
|
DataType.WORD -> {
|
||||||
|
if(lv.type==DataType.BYTE)
|
||||||
|
assignment.value = LiteralValue(DataType.WORD, wordvalue = lv.asIntegerValue, position=lv.position)
|
||||||
|
else if(lv.type==DataType.FLOAT) {
|
||||||
|
val d = lv.floatvalue!!
|
||||||
|
if(floor(d)==d && d in 0..65535) {
|
||||||
|
assignment.value = LiteralValue(DataType.WORD, wordvalue=floor(d).toInt(), position=lv.position)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DataType.FLOAT -> {
|
||||||
|
if(lv.isNumeric)
|
||||||
|
assignment.value = LiteralValue(DataType.FLOAT, floatvalue= lv.asNumericValue?.toDouble(), position=lv.position)
|
||||||
|
}
|
||||||
|
DataType.BYTE -> {
|
||||||
|
if(lv.type==DataType.WORD && lv.asIntegerValue in 0..255) {
|
||||||
|
assignment.value = LiteralValue(DataType.BYTE, lv.asIntegerValue?.toShort(), position=lv.position)
|
||||||
|
} else if(lv.type==DataType.FLOAT) {
|
||||||
|
val d = lv.floatvalue!!
|
||||||
|
if(floor(d)==d && d in 0..255) {
|
||||||
|
assignment.value = LiteralValue(DataType.BYTE, floor(d).toShort(), position=lv.position)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else -> {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return assignment
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user