mirror of
https://github.com/KarolS/millfork.git
synced 2024-07-10 10:28:55 +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)
|
constantOperationForAsm(MathOperator.Exor, params)
|
||||||
case "||" | "|" =>
|
case "||" | "|" =>
|
||||||
constantOperationForAsm(MathOperator.Or, params)
|
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" =>
|
case "hi" =>
|
||||||
oneArgFunctionForAsm(_.hiByte, params)
|
oneArgFunctionForAsm(_.hiByte, params)
|
||||||
case "lo" =>
|
case "lo" =>
|
||||||
oneArgFunctionForAsm(_.loByte, params)
|
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" =>
|
case "nonet" | "sin" | "cos" | "tan" =>
|
||||||
log.error("Function not supported in inline assembly", e.position)
|
log.error("Function not supported in inline assembly", e.position)
|
||||||
None
|
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]) = {
|
private def constantOperationForAsm(op: MathOperator.Value, params: List[Expression]) = {
|
||||||
params.map(e => evalForAsm(e)).reduceLeft[Option[Constant]] { (oc, om) =>
|
params.map(e => evalForAsm(e)).reduceLeft[Option[Constant]] { (oc, om) =>
|
||||||
for {
|
for {
|
||||||
|
Loading…
Reference in New Issue
Block a user