mirror of
https://github.com/irmen/prog8.git
synced 2025-02-16 22:30:46 +00:00
optimize @( &thing )) in ast into just thing
This commit is contained in:
parent
c71b78dee6
commit
5497de4234
@ -69,7 +69,7 @@ class IntermediateProgram(val name: String, var loadAddress: Int, val heap: Heap
|
|||||||
optimizeMultipleSequentialLineInstrs()
|
optimizeMultipleSequentialLineInstrs()
|
||||||
optimizeCallReturnIntoJump()
|
optimizeCallReturnIntoJump()
|
||||||
optimizeConditionalBranches()
|
optimizeConditionalBranches()
|
||||||
// todo: add more optimizations to stackvm code
|
// todo: add more optimizations to intermediate code! such as: pop X + push X -> peek X (might require new opcodes)
|
||||||
|
|
||||||
optimizeRemoveNops() // must be done as the last step
|
optimizeRemoveNops() // must be done as the last step
|
||||||
optimizeMultipleSequentialLineInstrs() // once more
|
optimizeMultipleSequentialLineInstrs() // once more
|
||||||
|
@ -339,7 +339,7 @@ private fun builtinLen(args: List<IExpression>, position: Position, namespace:IN
|
|||||||
var argument = args[0].constValue(namespace, heap)
|
var argument = args[0].constValue(namespace, heap)
|
||||||
if(argument==null) {
|
if(argument==null) {
|
||||||
if(args[0] !is IdentifierReference)
|
if(args[0] !is IdentifierReference)
|
||||||
throw SyntaxError("len over weird argument ${args[0]}", position)
|
throw SyntaxError("len argument should be an identifier, but is ${args[0]}", position)
|
||||||
val target = (args[0] as IdentifierReference).targetStatement(namespace)
|
val target = (args[0] as IdentifierReference).targetStatement(namespace)
|
||||||
val argValue = (target as? VarDecl)?.value
|
val argValue = (target as? VarDecl)?.value
|
||||||
argument = argValue?.constValue(namespace, heap)
|
argument = argValue?.constValue(namespace, heap)
|
||||||
|
@ -173,6 +173,21 @@ class ConstantFolding(private val namespace: INameScope, private val heap: HeapV
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun process(memread: DirectMemoryRead): IExpression {
|
||||||
|
// @( &thing ) --> thing
|
||||||
|
val addrOf = memread.addressExpression as? AddressOf
|
||||||
|
if(addrOf!=null)
|
||||||
|
return super.process(addrOf.identifier)
|
||||||
|
return super.process(memread)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun process(memwrite: DirectMemoryWrite): IExpression {
|
||||||
|
// @( &thing ) --> thing
|
||||||
|
val addrOf = memwrite.addressExpression as? AddressOf
|
||||||
|
if(addrOf!=null)
|
||||||
|
return super.process(addrOf.identifier)
|
||||||
|
return super.process(memwrite)
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Try to process a unary prefix expression.
|
* Try to process a unary prefix expression.
|
||||||
@ -673,5 +688,3 @@ class ConstantFolding(private val namespace: INameScope, private val heap: HeapV
|
|||||||
return assignment
|
return assignment
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -18,6 +18,22 @@ class SimplifyExpressions(private val namespace: INameScope, private val heap: H
|
|||||||
return super.process(assignment)
|
return super.process(assignment)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun process(memread: DirectMemoryRead): IExpression {
|
||||||
|
// @( &thing ) --> thing
|
||||||
|
val addrOf = memread.addressExpression as? AddressOf
|
||||||
|
if(addrOf!=null)
|
||||||
|
return super.process(addrOf.identifier)
|
||||||
|
return super.process(memread)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun process(memwrite: DirectMemoryWrite): IExpression {
|
||||||
|
// @( &thing ) --> thing
|
||||||
|
val addrOf = memwrite.addressExpression as? AddressOf
|
||||||
|
if(addrOf!=null)
|
||||||
|
return super.process(addrOf.identifier)
|
||||||
|
return super.process(memwrite)
|
||||||
|
}
|
||||||
|
|
||||||
override fun process(expr: PrefixExpression): IExpression {
|
override fun process(expr: PrefixExpression): IExpression {
|
||||||
if (expr.operator == "+") {
|
if (expr.operator == "+") {
|
||||||
// +X --> X
|
// +X --> X
|
||||||
|
@ -1,89 +1,16 @@
|
|||||||
%zeropage basicsafe
|
%zeropage basicsafe
|
||||||
%option enable_floats
|
|
||||||
|
|
||||||
%import c64flt
|
|
||||||
|
|
||||||
|
|
||||||
~ main {
|
~ main {
|
||||||
|
|
||||||
sub start() {
|
sub start() {
|
||||||
|
|
||||||
ubyte[3] array1
|
ubyte[3] array1
|
||||||
ubyte[3] array2
|
str string1="hello"
|
||||||
ubyte[3] array3
|
|
||||||
|
|
||||||
str string1="hello"
|
uword x = &array1
|
||||||
str string2="bye"
|
|
||||||
|
|
||||||
uword pointer = &array1
|
word sl = len(@( &string1 ))
|
||||||
uword pointer2
|
|
||||||
uword pointer3
|
|
||||||
byte bt
|
|
||||||
|
|
||||||
pointer2 = &array2
|
|
||||||
pointer3 = &string1
|
|
||||||
|
|
||||||
uword[4] pointers = [&array1, &array2, &string1, &string2]
|
|
||||||
|
|
||||||
|
|
||||||
ptrsubasm("moet werken")
|
|
||||||
pointersub("moet werken")
|
|
||||||
myprintasm(string1)
|
|
||||||
myprintasm(string2)
|
|
||||||
myprintasm("moet werken3")
|
|
||||||
myprintasm("moet werken3")
|
|
||||||
myprintasm("moet werken4")
|
|
||||||
|
|
||||||
c64scr.print("this print must work\n")
|
|
||||||
c64.CHROUT('\n')
|
|
||||||
|
|
||||||
ptrsubasm(&array1)
|
|
||||||
ptrsubasm(&array2)
|
|
||||||
ptrsubasm(&string1)
|
|
||||||
ptrsubasm(&string2)
|
|
||||||
pointersub(&array1)
|
|
||||||
pointersub(&array2)
|
|
||||||
pointersub(&string1)
|
|
||||||
pointersub(&string2)
|
|
||||||
c64scr.print_uwhex(1, pointers[0])
|
|
||||||
c64.CHROUT(',')
|
|
||||||
c64scr.print_uwhex(1, pointers[1])
|
|
||||||
c64.CHROUT(',')
|
|
||||||
c64scr.print_uwhex(1, pointers[2])
|
|
||||||
c64.CHROUT(',')
|
|
||||||
c64scr.print_uwhex(1, pointers[3])
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
sub pointersub(uword arg) {
|
|
||||||
c64scr.print_uwhex(1, arg)
|
|
||||||
c64.CHROUT('\n')
|
|
||||||
}
|
|
||||||
|
|
||||||
asmsub ptrsubasm(uword arg @ AY) -> clobbers() -> () {
|
|
||||||
%asm {{
|
|
||||||
sec
|
|
||||||
jsr c64scr.print_uwhex
|
|
||||||
lda #13
|
|
||||||
jmp c64.CHROUT
|
|
||||||
}}
|
|
||||||
}
|
|
||||||
|
|
||||||
asmsub myprintasm(str arg @ AY) -> clobbers() -> () {
|
|
||||||
%asm {{
|
|
||||||
sec
|
|
||||||
jsr c64scr.print_uwhex
|
|
||||||
lda #13
|
|
||||||
jmp c64.CHROUT
|
|
||||||
}}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
~ test {
|
|
||||||
|
|
||||||
sub testsub() {
|
|
||||||
uword[4] pointers = [&main.start.array1, &main.start.array2, &main.start.string1, &main.start.string2] ; @todo make it possible to initialize array with pointers
|
|
||||||
|
|
||||||
|
c64scr.print_w(sl) ; should be 5
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user