fix signed word bitshift right (>8 shifts)

This commit is contained in:
Irmen de Jong 2024-01-16 01:08:16 +01:00
parent 66a836d094
commit e0de662f8e
3 changed files with 16 additions and 66 deletions

View File

@ -836,14 +836,15 @@ class ExpressionSimplifier(private val program: Program,
return null return null
} }
else if(amount == 8) { else if(amount == 8) {
// shift right by 8 bits is just a byte operation: msb(X) as byte // shift right by 8 bits is just a byte operation: msb(X) as byte (will get converted to word later)
val msb = FunctionCallExpression(IdentifierReference(listOf("msb"), expr.position), mutableListOf(expr.left), expr.position) val msb = FunctionCallExpression(IdentifierReference(listOf("msb"), expr.position), mutableListOf(expr.left), expr.position)
return TypecastExpression(msb, DataType.BYTE, true, expr.position) return TypecastExpression(msb, DataType.BYTE, true, expr.position)
} }
else if(amount > 8) { else if(amount > 8) {
// same as above but with residual shifts. // same as above but with residual shifts. Take care to do signed shift.
val msb = FunctionCallExpression(IdentifierReference(listOf("msb"), expr.position), mutableListOf(expr.left), expr.position) val msb = FunctionCallExpression(IdentifierReference(listOf("msb"), expr.position), mutableListOf(expr.left), expr.position)
return TypecastExpression(BinaryExpression(msb, ">>", NumericLiteral.optimalInteger(amount - 8, expr.position), expr.position), DataType.BYTE, true, expr.position) val signed = TypecastExpression(msb, DataType.BYTE, true, expr.position)
return BinaryExpression(signed, ">>", NumericLiteral.optimalInteger(amount - 8, expr.position), expr.position)
} }
} }
else -> { else -> {

View File

@ -376,12 +376,6 @@ main {
sw = shiftrsw15() sw = shiftrsw15()
txt.print_uwbin(sw as uword, true) txt.print_uwbin(sw as uword, true)
txt.chrout('\n') txt.chrout('\n')
sw = shiftrsw16()
txt.print_uwbin(sw as uword, true)
txt.chrout('\n')
sw = shiftrsw17()
txt.print_uwbin(sw as uword, true)
txt.chrout('\n')
} }
@ -555,16 +549,6 @@ main {
return (q >> 15) return (q >> 15)
} }
sub shiftrsw16() -> word {
word @shared q = -12345
return (q >> 16)
}
sub shiftrsw17() -> word {
word @shared q = -12345
return (q >> 17)
}

View File

@ -4,9 +4,20 @@
main { main {
sub start() { sub start() {
word @shared q = -12345
txt.print_w(q)
txt.nl()
txt.print_uwbin(q as uword, true)
txt.nl()
q >>=9
txt.print_w(q)
txt.nl()
txt.print_uwbin(q as uword, true)
txt.nl()
; mem() ; mem()
; bytes() ; bytes()
words() ; words()
} }
sub mem() { sub mem() {
@ -29,11 +40,6 @@ main {
sub bytes() { sub bytes() {
ubyte[] wa = [$1a, $2b, $3c] ubyte[] wa = [$1a, $2b, $3c]
txt.print_ub(all(wa))
txt.spc()
txt.print_ub(any(wa))
txt.nl()
txt.print_ubbin(wa[2], true) txt.print_ubbin(wa[2], true)
txt.nl() txt.nl()
rol(wa[2]) rol(wa[2])
@ -54,47 +60,6 @@ main {
sub words() { sub words() {
uword[] wa = [$11aa, $22bb, $33cc] uword[] wa = [$11aa, $22bb, $33cc]
uword[] @split swa = [$11aa, $22bb, $33cc] uword[] @split swa = [$11aa, $22bb, $33cc]
uword[] waone = [$0000, $3300, $0000]
uword[] wazero = [$0000, $0000, $0000]
uword[] @split swaone = [$0000, $3300, $0000]
uword[] @split swazero = [$0000, $0000, $0000]
reverse(wa)
for cx16.r9 in wa {
txt.print_uwhex(cx16.r9, true)
txt.nl()
}
txt.nl()
reverse(swa)
for cx16.r9 in swa {
txt.print_uwhex(cx16.r9, true)
txt.nl()
}
txt.print_ub(all(wa)) ; 1
txt.spc()
txt.print_ub(any(wa)) ; 1
txt.nl()
txt.print_ub(all(waone)) ; 0
txt.spc()
txt.print_ub(any(waone)) ; 1
txt.nl()
; txt.print_ub(all(swaone)) ; 0
; txt.spc()
txt.print_ub(any(swaone)) ; 1
txt.nl()
; txt.print_ub(all(swa)) ; 1
; txt.spc()
txt.print_ub(any(swa)) ; 1
txt.nl()
txt.print_ub(all(wazero)) ; 0
txt.spc()
txt.print_ub(any(wazero)) ; 0
txt.nl()
; txt.print_ub(all(swazero)) ; 0
; txt.spc()
txt.print_ub(any(swazero)) ; 0
txt.nl()
txt.print_uwbin(wa[2], true) txt.print_uwbin(wa[2], true)
txt.nl() txt.nl()