better naming of the optimized math mult routines

This commit is contained in:
Irmen de Jong
2020-09-09 22:16:37 +02:00
parent 40071b1431
commit e21aa2c8f0
5 changed files with 62 additions and 47 deletions

View File

@@ -308,7 +308,7 @@ _seed .word $2c9e
.pend
mul_byte_3 .proc
stack_mul_byte_3 .proc
; X + X*2
lda P8ESTACK_LO+1,x
asl a
@@ -318,7 +318,7 @@ mul_byte_3 .proc
rts
.pend
mul_word_3 .proc
stack_mul_word_3 .proc
; W*2 + W
lda P8ESTACK_HI+1,x
sta P8ZP_SCRATCH_REG
@@ -335,7 +335,7 @@ mul_word_3 .proc
.pend
mul_byte_5 .proc
stack_mul_byte_5 .proc
; X*4 + X
lda P8ESTACK_LO+1,x
asl a
@@ -346,7 +346,7 @@ mul_byte_5 .proc
rts
.pend
mul_word_5 .proc
stack_mul_word_5 .proc
; W*4 + W
lda P8ESTACK_HI+1,x
sta P8ZP_SCRATCH_REG
@@ -365,7 +365,7 @@ mul_word_5 .proc
.pend
mul_byte_6 .proc
stack_mul_byte_6 .proc
; (X*2 + X)*2
lda P8ESTACK_LO+1,x
asl a
@@ -376,7 +376,7 @@ mul_byte_6 .proc
rts
.pend
mul_word_6 .proc
stack_mul_word_6 .proc
; (W*2 + W)*2
lda P8ESTACK_HI+1,x
sta P8ZP_SCRATCH_REG
@@ -394,7 +394,7 @@ mul_word_6 .proc
rts
.pend
mul_byte_7 .proc
stack_mul_byte_7 .proc
; X*8 - X
lda P8ESTACK_LO+1,x
asl a
@@ -406,7 +406,7 @@ mul_byte_7 .proc
rts
.pend
mul_word_7 .proc
stack_mul_word_7 .proc
; W*8 - W
lda P8ESTACK_HI+1,x
sta P8ZP_SCRATCH_REG
@@ -426,7 +426,7 @@ mul_word_7 .proc
rts
.pend
mul_byte_9 .proc
stack_mul_byte_9 .proc
; X*8 + X
lda P8ESTACK_LO+1,x
asl a
@@ -438,7 +438,7 @@ mul_byte_9 .proc
rts
.pend
mul_word_9 .proc
stack_mul_word_9 .proc
; W*8 + W
lda P8ESTACK_HI+1,x
sta P8ZP_SCRATCH_REG
@@ -458,7 +458,7 @@ mul_word_9 .proc
rts
.pend
mul_byte_10 .proc
stack_mul_byte_10 .proc
; (X*4 + X)*2
lda P8ESTACK_LO+1,x
asl a
@@ -470,7 +470,7 @@ mul_byte_10 .proc
rts
.pend
mul_word_10 .proc
stack_mul_word_10 .proc
; (W*4 + W)*2
lda P8ESTACK_HI+1,x
sta P8ZP_SCRATCH_REG
@@ -490,7 +490,7 @@ mul_word_10 .proc
rts
.pend
mul_byte_11 .proc
stack_mul_byte_11 .proc
; (X*2 + X)*4 - X
lda P8ESTACK_LO+1,x
asl a
@@ -506,7 +506,7 @@ mul_byte_11 .proc
; mul_word_11 is skipped (too much code)
mul_byte_12 .proc
stack_mul_byte_12 .proc
; (X*2 + X)*4
lda P8ESTACK_LO+1,x
asl a
@@ -518,7 +518,7 @@ mul_byte_12 .proc
rts
.pend
mul_word_12 .proc
stack_mul_word_12 .proc
; (W*2 + W)*4
lda P8ESTACK_HI+1,x
sta P8ZP_SCRATCH_REG
@@ -538,7 +538,7 @@ mul_word_12 .proc
rts
.pend
mul_byte_13 .proc
stack_mul_byte_13 .proc
; (X*2 + X)*4 + X
lda P8ESTACK_LO+1,x
asl a
@@ -554,7 +554,7 @@ mul_byte_13 .proc
; mul_word_13 is skipped (too much code)
mul_byte_14 .proc
stack_mul_byte_14 .proc
; (X*8 - X)*2
lda P8ESTACK_LO+1,x
asl a
@@ -569,7 +569,7 @@ mul_byte_14 .proc
; mul_word_14 is skipped (too much code)
mul_byte_15 .proc
stack_mul_byte_15 .proc
; X*16 - X
lda P8ESTACK_LO+1,x
asl a
@@ -582,7 +582,7 @@ mul_byte_15 .proc
rts
.pend
mul_word_15 .proc
stack_mul_word_15 .proc
; W*16 - W
lda P8ESTACK_HI+1,x
sta P8ZP_SCRATCH_REG
@@ -604,7 +604,7 @@ mul_word_15 .proc
rts
.pend
mul_byte_20 .proc
stack_mul_byte_20 .proc
; (X*4 + X)*4
lda P8ESTACK_LO+1,x
asl a
@@ -617,7 +617,7 @@ mul_byte_20 .proc
rts
.pend
mul_word_20 .proc
stack_mul_word_20 .proc
; (W*4 + W)*4
lda P8ESTACK_HI+1,x
sta P8ZP_SCRATCH_REG
@@ -639,7 +639,7 @@ mul_word_20 .proc
rts
.pend
mul_byte_25 .proc
stack_mul_byte_25 .proc
; (X*2 + X)*8 + X
lda P8ESTACK_LO+1,x
asl a
@@ -654,7 +654,7 @@ mul_byte_25 .proc
rts
.pend
mul_word_25 .proc
stack_mul_word_25 .proc
; W + W*8 + W*16
lda P8ESTACK_HI+1,x
sta P8ZP_SCRATCH_W1+1
@@ -684,7 +684,7 @@ mul_word_25 .proc
rts
.pend
mul_byte_40 .proc
stack_mul_byte_40 .proc
; (X*4 + X)*8
lda P8ESTACK_LO+1,x
asl a
@@ -698,7 +698,7 @@ mul_byte_40 .proc
rts
.pend
mul_word_40 .proc
stack_mul_word_40 .proc
; (W*4 + W)*8
lda P8ESTACK_HI+1,x
sta P8ZP_SCRATCH_REG

View File

@@ -35,6 +35,10 @@ internal class AsmGen(private val program: Program,
val options: CompilationOptions,
private val outputDir: Path): IAssemblyGenerator {
// for expressions and augmented assignments:
val optimizedByteMultiplications = setOf(3,5,6,7,9,10,11,12,13,14,15,20,25,40)
val optimizedWordMultiplications = setOf(3,5,6,7,9,10,12,15,20,25,40)
private val assemblyLines = mutableListOf<String>()
private val globalFloatConsts = mutableMapOf<Double, String>() // all float values in the entire program (value -> varname)
private val allocatedZeropageVariables = mutableMapOf<String, Pair<Int, DataType>>()

View File

@@ -207,9 +207,6 @@ internal class ExpressionsAsmGen(private val program: Program, private val asmge
}
}
private val optimizedByteMultiplications = setOf(3,5,6,7,9,10,11,12,13,14,15,20,25,40)
private val optimizedWordMultiplications = setOf(3,5,6,7,9,10,12,15,20,25,40)
private fun translateExpression(expr: BinaryExpression) {
val leftIDt = expr.left.inferType(program)
val rightIDt = expr.right.inferType(program)
@@ -303,40 +300,40 @@ internal class ExpressionsAsmGen(private val program: Program, private val asmge
val amount = value.number.toInt()
when(rightDt) {
DataType.UBYTE -> {
if(amount in optimizedByteMultiplications) {
if(amount in asmgen.optimizedByteMultiplications) {
translateExpression(expr.left)
asmgen.out(" jsr math.mul_byte_$amount")
asmgen.out(" jsr math.stack_mul_byte_$amount")
return
}
}
DataType.BYTE -> {
if(amount in optimizedByteMultiplications) {
if(amount in asmgen.optimizedByteMultiplications) {
translateExpression(expr.left)
asmgen.out(" jsr math.mul_byte_$amount")
asmgen.out(" jsr math.stack_mul_byte_$amount")
return
}
if(amount.absoluteValue in optimizedByteMultiplications) {
if(amount.absoluteValue in asmgen.optimizedByteMultiplications) {
translateExpression(expr.left)
asmgen.out(" jsr prog8_lib.neg_b | jsr math.mul_byte_${amount.absoluteValue}")
asmgen.out(" jsr prog8_lib.neg_b | jsr math.stack_mul_byte_${amount.absoluteValue}")
return
}
}
DataType.UWORD -> {
if(amount in optimizedWordMultiplications) {
if(amount in asmgen.optimizedWordMultiplications) {
translateExpression(expr.left)
asmgen.out(" jsr math.mul_word_$amount")
asmgen.out(" jsr math.stack_mul_word_$amount")
return
}
}
DataType.WORD -> {
if(amount in optimizedWordMultiplications) {
if(amount in asmgen.optimizedWordMultiplications) {
translateExpression(expr.left)
asmgen.out(" jsr math.mul_word_$amount")
asmgen.out(" jsr math.stack_mul_word_$amount")
return
}
if(amount.absoluteValue in optimizedWordMultiplications) {
if(amount.absoluteValue in asmgen.optimizedWordMultiplications) {
translateExpression(expr.left)
asmgen.out(" jsr prog8_lib.neg_w | jsr math.mul_word_${amount.absoluteValue}")
asmgen.out(" jsr prog8_lib.neg_w | jsr math.stack_mul_word_${amount.absoluteValue}")
return
}
}

View File

@@ -250,7 +250,9 @@ internal class AugmentableAssignmentAsmGen(private val program: Program,
else
asmgen.out(" sta (P8ZP_SCRATCH_W1),y")
}
"*" -> TODO("mul mem byte")// asmgen.out(" jsr prog8_lib.mul_byte") // the optimized routines should have been checked earlier
"*" -> {
TODO("mul mem byte")// asmgen.out(" jsr prog8_lib.mul_byte")
}
"/" -> TODO("div mem byte")// asmgen.out(if(types==DataType.UBYTE) " jsr prog8_lib.idiv_ub" else " jsr prog8_lib.idiv_b")
"%" -> {
TODO("mem byte remainder")
@@ -309,7 +311,9 @@ internal class AugmentableAssignmentAsmGen(private val program: Program,
else
asmgen.out(" sta (P8ZP_SCRATCH_W1),y")
}
"*" -> TODO("mem mul")// asmgen.out(" jsr prog8_lib.mul_byte") // the optimized routines should have been checked earlier
"*" -> {
TODO("mem mul")// asmgen.out(" jsr prog8_lib.mul_byte")
}
"/" -> TODO("mem div")// asmgen.out(if(types==DataType.UBYTE) " jsr prog8_lib.idiv_ub" else " jsr prog8_lib.idiv_b")
"%" -> {
TODO("mem byte remainder")
@@ -367,8 +371,11 @@ internal class AugmentableAssignmentAsmGen(private val program: Program,
asmgen.out(" sta (P8ZP_SCRATCH_W1),y")
}
"*" -> {
// make sure to check for optimized routines first:
//asmgen.optimizedByteMultiplications
//asmgen.optimizedWordMultiplications
TODO("mem mul byte litval")
// asmgen.out(" jsr prog8_lib.mul_byte") // the optimized routines should have been checked earlier
// asmgen.out(" jsr prog8_lib.mul_byte")
}
"/" -> {
if(value==0)
@@ -443,7 +450,7 @@ internal class AugmentableAssignmentAsmGen(private val program: Program,
"-" -> asmgen.out(" lda $name | sec | sbc P8ESTACK_LO+1,x | sta $name")
"*" -> {
TODO("var mul byte expr")
// asmgen.out(" jsr prog8_lib.mul_byte") // the optimized routines should have been checked earlier
// asmgen.out(" jsr prog8_lib.mul_byte")
}
"/" -> {
TODO("var div byte expr")// asmgen.out(if(types==DataType.UBYTE) " jsr prog8_lib.idiv_ub" else " jsr prog8_lib.idiv_b")
@@ -572,9 +579,11 @@ internal class AugmentableAssignmentAsmGen(private val program: Program,
"+" -> asmgen.out(" lda $name | clc | adc #$value | sta $name")
"-" -> asmgen.out(" lda $name | sec | sbc #$value | sta $name")
"*" -> {
// TODO what about the optimized mul_5 etc routines?
// make sure to check for optimized routines first:
//asmgen.optimizedByteMultiplications
//asmgen.optimizedWordMultiplications
TODO("var byte mul litval")
// asmgen.out(" jsr prog8_lib.mul_byte") // the optimized routines should have been checked earlier
// asmgen.out(" jsr prog8_lib.mul_byte")
}
"/" -> {
if (dt == DataType.UBYTE) {
@@ -669,7 +678,9 @@ internal class AugmentableAssignmentAsmGen(private val program: Program,
}
}
"*" -> {
// TODO what about the optimized mul_5 etc routines?
// TODO make sure to check for optimized routines first:
//asmgen.optimizedByteMultiplications
//asmgen.optimizedWordMultiplications
asmgen.out("""
lda $name
sta P8ZP_SCRATCH_W1
@@ -1250,6 +1261,7 @@ internal class AugmentableAssignmentAsmGen(private val program: Program,
""")
}
"*" -> {
// assume that code optimization is already done on the AST level for special cases such as 0, 1, 2...
asmgen.out("""
lda #<$name
ldy #>$name

View File

@@ -3,6 +3,8 @@
;%option enable_floats
; %zeropage kernalsafe
; TODO add a directive to set the compiler target
main {