mirror of
https://github.com/irmen/prog8.git
synced 2024-11-29 17:50:35 +00:00
vm: remove BNER opcode -> CMP + BSTNE
This commit is contained in:
parent
36e8f10d2b
commit
1da0c59182
@ -1120,13 +1120,14 @@ class IRCodeGen(
|
|||||||
var useCmp = false
|
var useCmp = false
|
||||||
when (condition.operator) {
|
when (condition.operator) {
|
||||||
"==" -> {
|
"==" -> {
|
||||||
opcode = Opcode.BSTEQ
|
|
||||||
useCmp = true
|
useCmp = true
|
||||||
|
opcode = Opcode.BSTEQ
|
||||||
firstReg = leftTr.resultReg
|
firstReg = leftTr.resultReg
|
||||||
secondReg = rightTr.resultReg
|
secondReg = rightTr.resultReg
|
||||||
}
|
}
|
||||||
"!=" -> {
|
"!=" -> {
|
||||||
opcode = Opcode.BNER
|
useCmp = true
|
||||||
|
opcode = Opcode.BSTNE
|
||||||
firstReg = leftTr.resultReg
|
firstReg = leftTr.resultReg
|
||||||
secondReg = rightTr.resultReg
|
secondReg = rightTr.resultReg
|
||||||
}
|
}
|
||||||
@ -1405,7 +1406,8 @@ class IRCodeGen(
|
|||||||
addToResult(result, rightTr, rightTr.resultReg, -1)
|
addToResult(result, rightTr, rightTr.resultReg, -1)
|
||||||
when (condition.operator) {
|
when (condition.operator) {
|
||||||
"==" -> {
|
"==" -> {
|
||||||
elseBranch = Opcode.BNER
|
useCmp = true
|
||||||
|
elseBranch = Opcode.BSTNE
|
||||||
elseBranchFirstReg = leftTr.resultReg
|
elseBranchFirstReg = leftTr.resultReg
|
||||||
elseBranchSecondReg = rightTr.resultReg
|
elseBranchSecondReg = rightTr.resultReg
|
||||||
}
|
}
|
||||||
|
@ -83,7 +83,6 @@ bstpos address - branch to location if Status bit Negat
|
|||||||
bstneg address - branch to location if Status bit Negative is set
|
bstneg address - branch to location if Status bit Negative is set
|
||||||
bstvc address - branch to location if Status bit Overflow is clear
|
bstvc address - branch to location if Status bit Overflow is clear
|
||||||
bstvs address - branch to location if Status bit Overflow is set
|
bstvs address - branch to location if Status bit Overflow is set
|
||||||
bner reg1, reg2, address - jump to location in program given by location, if reg1 != reg2
|
|
||||||
bgt reg1, value, address - jump to location in program given by location, if reg1 > immediate value (unsigned)
|
bgt reg1, value, address - jump to location in program given by location, if reg1 > immediate value (unsigned)
|
||||||
bgts reg1, value, address - jump to location in program given by location, if reg1 > immediate value (signed)
|
bgts reg1, value, address - jump to location in program given by location, if reg1 > immediate value (signed)
|
||||||
bgtr reg1, reg2, address - jump to location in program given by location, if reg1 > reg2 (unsigned)
|
bgtr reg1, reg2, address - jump to location in program given by location, if reg1 > reg2 (unsigned)
|
||||||
@ -258,7 +257,6 @@ enum class Opcode {
|
|||||||
BSTPOS,
|
BSTPOS,
|
||||||
BSTVC,
|
BSTVC,
|
||||||
BSTVS,
|
BSTVS,
|
||||||
BNER,
|
|
||||||
BGTR,
|
BGTR,
|
||||||
BGT,
|
BGT,
|
||||||
BLT,
|
BLT,
|
||||||
@ -401,7 +399,6 @@ val OpcodesThatBranch = setOf(
|
|||||||
Opcode.BSTPOS,
|
Opcode.BSTPOS,
|
||||||
Opcode.BSTVC,
|
Opcode.BSTVC,
|
||||||
Opcode.BSTVS,
|
Opcode.BSTVS,
|
||||||
Opcode.BNER,
|
|
||||||
Opcode.BGTR,
|
Opcode.BGTR,
|
||||||
Opcode.BGT,
|
Opcode.BGT,
|
||||||
Opcode.BLT,
|
Opcode.BLT,
|
||||||
@ -549,7 +546,6 @@ val instructionFormats = mutableMapOf(
|
|||||||
Opcode.BSTPOS to InstructionFormat.from("N,<a"),
|
Opcode.BSTPOS to InstructionFormat.from("N,<a"),
|
||||||
Opcode.BSTVC to InstructionFormat.from("N,<a"),
|
Opcode.BSTVC to InstructionFormat.from("N,<a"),
|
||||||
Opcode.BSTVS to InstructionFormat.from("N,<a"),
|
Opcode.BSTVS to InstructionFormat.from("N,<a"),
|
||||||
Opcode.BNER to InstructionFormat.from("BW,<r1,<r2,<a"),
|
|
||||||
Opcode.BGTR to InstructionFormat.from("BW,<r1,<r2,<a"),
|
Opcode.BGTR to InstructionFormat.from("BW,<r1,<r2,<a"),
|
||||||
Opcode.BGT to InstructionFormat.from("BW,<r1,<i,<a"),
|
Opcode.BGT to InstructionFormat.from("BW,<r1,<i,<a"),
|
||||||
Opcode.BLT to InstructionFormat.from("BW,<r1,<i,<a"),
|
Opcode.BLT to InstructionFormat.from("BW,<r1,<i,<a"),
|
||||||
|
@ -191,7 +191,6 @@ class VirtualMachine(irProgram: IRProgram) {
|
|||||||
Opcode.BSTNEG -> InsBSTNEG(ins)
|
Opcode.BSTNEG -> InsBSTNEG(ins)
|
||||||
Opcode.BSTPOS -> InsBSTPOS(ins)
|
Opcode.BSTPOS -> InsBSTPOS(ins)
|
||||||
Opcode.BSTVC, Opcode.BSTVS -> TODO("overflow status flag not yet supported in VM (BSTVC,BSTVS)")
|
Opcode.BSTVC, Opcode.BSTVS -> TODO("overflow status flag not yet supported in VM (BSTVC,BSTVS)")
|
||||||
Opcode.BNER -> InsBNER(ins)
|
|
||||||
Opcode.BGTR -> InsBGTR(ins)
|
Opcode.BGTR -> InsBGTR(ins)
|
||||||
Opcode.BGTSR -> InsBGTSR(ins)
|
Opcode.BGTSR -> InsBGTSR(ins)
|
||||||
Opcode.BGER -> InsBGER(ins)
|
Opcode.BGER -> InsBGER(ins)
|
||||||
@ -668,14 +667,6 @@ class VirtualMachine(irProgram: IRProgram) {
|
|||||||
nextPc()
|
nextPc()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun InsBNER(i: IRInstruction) {
|
|
||||||
val (left: Int, right: Int) = getBranchOperands(i)
|
|
||||||
if(left!=right)
|
|
||||||
branchTo(i)
|
|
||||||
else
|
|
||||||
nextPc()
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun InsBGTR(i: IRInstruction) {
|
private fun InsBGTR(i: IRInstruction) {
|
||||||
val (left: UInt, right: UInt) = getBranchOperandsU(i)
|
val (left: UInt, right: UInt) = getBranchOperandsU(i)
|
||||||
if(left>right)
|
if(left>right)
|
||||||
|
Loading…
Reference in New Issue
Block a user