fix: only push one item to stack on comparisons

This commit is contained in:
Gleb Koval 2025-02-26 20:00:42 +00:00
parent 631f9ddca5
commit 2cf18a47a8
Signed by: cyclane
GPG Key ID: 15E168A8B332382C
3 changed files with 14 additions and 13 deletions

View File

@ -317,12 +317,12 @@ object asmGenerator {
chain += stack.drop() chain += stack.drop()
chain += stack.push(RDX) chain += stack.push(RDX)
case BinaryOperator.Eq => chain ++= generateComparison(x, y, Cond.Equal) case BinaryOperator.Eq => chain ++= generateComparison(Cond.Equal)
case BinaryOperator.Neq => chain ++= generateComparison(x, y, Cond.NotEqual) case BinaryOperator.Neq => chain ++= generateComparison(Cond.NotEqual)
case BinaryOperator.Greater => chain ++= generateComparison(x, y, Cond.Greater) case BinaryOperator.Greater => chain ++= generateComparison(Cond.Greater)
case BinaryOperator.GreaterEq => chain ++= generateComparison(x, y, Cond.GreaterEqual) case BinaryOperator.GreaterEq => chain ++= generateComparison(Cond.GreaterEqual)
case BinaryOperator.Less => chain ++= generateComparison(x, y, Cond.Less) case BinaryOperator.Less => chain ++= generateComparison(Cond.Less)
case BinaryOperator.LessEq => chain ++= generateComparison(x, y, Cond.LessEqual) case BinaryOperator.LessEq => chain ++= generateComparison(Cond.LessEqual)
case BinaryOperator.And => chain += And(stack.head(SizeDir.DWord), EAX) case BinaryOperator.And => chain += And(stack.head(SizeDir.DWord), EAX)
case BinaryOperator.Or => chain += Or(stack.head(SizeDir.DWord), EAX) case BinaryOperator.Or => chain += Or(stack.head(SizeDir.DWord), EAX)
} }
@ -367,18 +367,14 @@ object asmGenerator {
chain chain
} }
def generateComparison(x: Expr, y: Expr, cond: Cond)(using def generateComparison(cond: Cond)(using
stack: Stack, stack: Stack,
strings: ListBuffer[String], strings: ListBuffer[String],
labelGenerator: LabelGenerator labelGenerator: LabelGenerator
): Chain[AsmLine] = { ): Chain[AsmLine] = {
var chain = Chain.empty[AsmLine] var chain = Chain.empty[AsmLine]
chain ++= evalExprOntoStack(x) chain += Compare(EAX, stack.head(SizeDir.DWord))
chain ++= evalExprOntoStack(y)
chain += stack.pop(RAX)
chain += Compare(stack.head(SizeDir.DWord), EAX)
chain += Set(Register(RegSize.Byte, RegName.AL), cond) chain += Set(Register(RegSize.Byte, RegName.AL), cond)
chain += And(RAX, ImmediateVal(_8_BIT_MASK)) chain += And(RAX, ImmediateVal(_8_BIT_MASK))
chain += stack.drop() chain += stack.drop()

View File

@ -126,6 +126,11 @@ object assemblyIR {
override def toString = s"$name:" override def toString = s"$name:"
} }
case class Comment(comment: String) extends AsmLine {
override def toString =
comment.split("\n").map(line => s"# ${line}").mkString("\n")
}
enum Cond { enum Cond {
case Equal, case Equal,
NotEqual, NotEqual,

View File

@ -102,7 +102,7 @@ class ParallelExamplesSpec extends AnyFlatSpec with BeforeAndAfterAll {
"^.*wacc-examples/valid/scope.*$", "^.*wacc-examples/valid/scope.*$",
// "^.*wacc-examples/valid/sequence.*$", // "^.*wacc-examples/valid/sequence.*$",
// "^.*wacc-examples/valid/variables.*$", // "^.*wacc-examples/valid/variables.*$",
"^.*wacc-examples/valid/while.*$", // "^.*wacc-examples/valid/while.*$",
// format: on // format: on
).find(filename.matches).isDefined ).find(filename.matches).isDefined
} }