mirror of
https://github.com/KarolS/millfork.git
synced 2025-04-10 16:39:59 +00:00
Add more binary operators for constants in assembly
This commit is contained in:
parent
748aa0cf19
commit
a527eea0fc
26
src/main/scala/millfork/env/Environment.scala
vendored
26
src/main/scala/millfork/env/Environment.scala
vendored
@ -901,10 +901,24 @@ class Environment(val parent: Option[Environment], val prefix: String, val cpuFa
|
||||
constantOperationForAsm(MathOperator.Exor, params)
|
||||
case "||" | "|" =>
|
||||
constantOperationForAsm(MathOperator.Or, params)
|
||||
case "/" =>
|
||||
constantBinaryOperationForAsm("/", MathOperator.Divide, params)
|
||||
case "%%" =>
|
||||
constantBinaryOperationForAsm("%%", MathOperator.Modulo, params)
|
||||
case ">>" =>
|
||||
constantBinaryOperationForAsm(">>", MathOperator.Shr, params)
|
||||
case "<<" =>
|
||||
constantBinaryOperationForAsm("<<", MathOperator.Shl, params)
|
||||
case "hi" =>
|
||||
oneArgFunctionForAsm(_.hiByte, params)
|
||||
case "lo" =>
|
||||
oneArgFunctionForAsm(_.loByte, params)
|
||||
case ">>>>" | ">>'" | "<<'" | ">" | "<" =>
|
||||
log.error(s"Operator `$name` not supported in inline assembly", e.position)
|
||||
None
|
||||
case _ if name.endsWith("=") =>
|
||||
log.error(s"Operator `$name` not supported in inline assembly", e.position)
|
||||
None
|
||||
case "nonet" | "sin" | "cos" | "tan" =>
|
||||
log.error("Function not supported in inline assembly", e.position)
|
||||
None
|
||||
@ -914,6 +928,18 @@ class Environment(val parent: Option[Environment], val prefix: String, val cpuFa
|
||||
}
|
||||
}
|
||||
|
||||
private def constantBinaryOperationForAsm(symbol: String, op: MathOperator.Value, params: List[Expression]) = {
|
||||
if (params.length != 2) {
|
||||
log.error(s"Too many operands for the $symbol operator", params.head.position)
|
||||
}
|
||||
params.map(e => evalForAsm(e)).reduceLeft[Option[Constant]] { (oc, om) =>
|
||||
for {
|
||||
c <- oc
|
||||
m <- om
|
||||
} yield CompoundConstant(op, c, m)
|
||||
}
|
||||
}
|
||||
|
||||
private def constantOperationForAsm(op: MathOperator.Value, params: List[Expression]) = {
|
||||
params.map(e => evalForAsm(e)).reduceLeft[Option[Constant]] { (oc, om) =>
|
||||
for {
|
||||
|
Loading…
x
Reference in New Issue
Block a user