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
}
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)
return TypecastExpression(msb, DataType.BYTE, true, expr.position)
}
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)
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 -> {

View File

@ -376,12 +376,6 @@ main {
sw = shiftrsw15()
txt.print_uwbin(sw as uword, true)
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)
}
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 {
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()
; bytes()
words()
; words()
}
sub mem() {
@ -29,11 +40,6 @@ main {
sub bytes() {
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.nl()
rol(wa[2])
@ -54,47 +60,6 @@ main {
sub words() {
uword[] wa = [$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.nl()