mirror of
https://github.com/irmen/prog8.git
synced 2024-09-30 15:57:06 +00:00
func(x>>1) no longer uses slow stack eval
This commit is contained in:
parent
8f3aaf77a1
commit
836a2700f2
@ -622,6 +622,58 @@ internal class AssignmentAsmGen(private val program: Program,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if(expr.operator=="<<" || expr.operator==">>") {
|
||||||
|
val shifts = expr.right.constValue(program)?.number?.toInt()
|
||||||
|
if(shifts!=null) {
|
||||||
|
val dt = expr.left.inferType(program)
|
||||||
|
if(dt.isBytes && shifts in 0..7) {
|
||||||
|
val signed = dt istype DataType.BYTE
|
||||||
|
assignExpressionToRegister(expr.left, RegisterOrPair.A, signed)
|
||||||
|
if(expr.operator=="<<") {
|
||||||
|
repeat(shifts) {
|
||||||
|
asmgen.out(" asl a")
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if(signed && shifts>0) {
|
||||||
|
asmgen.out(" ldy #$shifts | jsr math.lsr_byte_A")
|
||||||
|
} else {
|
||||||
|
repeat(shifts) {
|
||||||
|
asmgen.out(" lsr a")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
assignRegisterByte(assign.target, CpuRegister.A)
|
||||||
|
return true
|
||||||
|
} else if(dt.isWords && shifts in 0..7) {
|
||||||
|
val signed = dt istype DataType.WORD
|
||||||
|
assignExpressionToRegister(expr.left, RegisterOrPair.AY, signed)
|
||||||
|
if(expr.operator=="<<") {
|
||||||
|
if(shifts>0) {
|
||||||
|
asmgen.out(" sty P8ZP_SCRATCH_B1")
|
||||||
|
repeat(shifts) {
|
||||||
|
asmgen.out(" asl a | rol P8ZP_SCRATCH_B1")
|
||||||
|
}
|
||||||
|
asmgen.out(" ldy P8ZP_SCRATCH_B1")
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if(signed) {
|
||||||
|
// TODO("shift AY >> $shifts signed")
|
||||||
|
return false
|
||||||
|
} else {
|
||||||
|
if(shifts>0) {
|
||||||
|
asmgen.out(" sty P8ZP_SCRATCH_B1")
|
||||||
|
repeat(shifts) {
|
||||||
|
asmgen.out(" lsr P8ZP_SCRATCH_B1 | ror a")
|
||||||
|
}
|
||||||
|
asmgen.out(" ldy P8ZP_SCRATCH_B1")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
assignRegisterpairWord(assign.target, RegisterOrPair.AY)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,8 +3,9 @@ TODO
|
|||||||
|
|
||||||
For next release
|
For next release
|
||||||
^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^
|
||||||
- why is func(x&15) fast, but func(x>>4) using stack eval for the arg?
|
- word << 12 is suddenly an uword
|
||||||
- ir/vm: allow label in block scope
|
- ir/vm: allow label in block scope
|
||||||
|
- regression test the various projects
|
||||||
- 6502 codegen: make it possible to use cpu opcodes such as 'nop' as variable names by prefixing all asm vars with something such as ``p8v_``? Or not worth it (most 3 letter opcodes as variables are nonsensical anyway)
|
- 6502 codegen: make it possible to use cpu opcodes such as 'nop' as variable names by prefixing all asm vars with something such as ``p8v_``? Or not worth it (most 3 letter opcodes as variables are nonsensical anyway)
|
||||||
then we can get rid of the instruction lists in the machinedefinitions as well. This is already no problem at all in the IR codegen.
|
then we can get rid of the instruction lists in the machinedefinitions as well. This is already no problem at all in the IR codegen.
|
||||||
- create BSS section in output program and put StStaticVariables in there with bss=true. Don't forget to add init code to zero out everything that was put in bss. If array in bss->only zero ONCE! So requires self-modifying code
|
- create BSS section in output program and put StStaticVariables in there with bss=true. Don't forget to add init code to zero out everything that was put in bss. If array in bss->only zero ONCE! So requires self-modifying code
|
||||||
|
@ -23,8 +23,7 @@ main {
|
|||||||
adpcm.decode_nibble(nibble & 15)
|
adpcm.decode_nibble(nibble & 15)
|
||||||
txt.print_w(adpcm.predict as word)
|
txt.print_w(adpcm.predict as word)
|
||||||
txt.spc()
|
txt.spc()
|
||||||
nibble >>= 4
|
adpcm.decode_nibble(nibble>>4)
|
||||||
adpcm.decode_nibble(nibble)
|
|
||||||
txt.print_w(adpcm.predict as word)
|
txt.print_w(adpcm.predict as word)
|
||||||
txt.spc()
|
txt.spc()
|
||||||
nibblesptr++
|
nibblesptr++
|
||||||
|
Loading…
Reference in New Issue
Block a user