mirror of
https://github.com/irmen/prog8.git
synced 2024-10-25 00:24:16 +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
|
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 -> {
|
||||||
|
@ -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)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -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()
|
||||||
|
Loading…
Reference in New Issue
Block a user