mirror of
https://github.com/irmen/prog8.git
synced 2024-06-10 05:29:29 +00:00
fix signed word bitshift right (>8 shifts)
This commit is contained in:
parent
66a836d094
commit
e0de662f8e
|
@ -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 -> {
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -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()
|
||||
|
|
Loading…
Reference in New Issue
Block a user