Skip to content

Commit 3be2a13

Browse files
authored
Merge pull request #451 from boriel/bugfix/SHR_SHL_0_value
Fix SHL and SHR for 0 rotations
2 parents 2812a15 + 42d65f4 commit 3be2a13

3 files changed

Lines changed: 33 additions & 7 deletions

File tree

src/arch/zx48k/backend/__16bit.py

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -892,7 +892,7 @@ def _abs16(ins):
892892

893893

894894
def _shru16(ins):
895-
''' Logical right shift 16bit unsigned integer.
895+
""" Logical right shift 16bit unsigned integer.
896896
The result is pushed onto the stack.
897897
898898
Optimizations:
@@ -901,7 +901,7 @@ def _shru16(ins):
901901
902902
* If 2nd op is 1
903903
Shift Right Arithmetic
904-
'''
904+
"""
905905
op1, op2 = tuple(ins.quad[2:])
906906
if is_int(op2):
907907
op = int16(op2)
@@ -922,16 +922,20 @@ def _shru16(ins):
922922
output.extend(_16bit_oper(op1))
923923

924924
label = tmp_label()
925+
label2 = tmp_label()
926+
output.append('or a')
927+
output.append('jr z, %s' % label2)
925928
output.append('%s:' % label)
926929
output.append('srl h')
927930
output.append('rr l')
928931
output.append('djnz %s' % label)
932+
output.append('%s:' % label2)
929933
output.append('push hl')
930934
return output
931935

932936

933937
def _shri16(ins):
934-
''' Arithmetical right shift 16bit signed integer.
938+
""" Arithmetical right shift 16bit signed integer.
935939
The result is pushed onto the stack.
936940
937941
Optimizations:
@@ -940,7 +944,7 @@ def _shri16(ins):
940944
941945
* If 2nd op is 1
942946
Shift Right Arithmetic
943-
'''
947+
"""
944948
op1, op2 = tuple(ins.quad[2:])
945949
if is_int(op2):
946950
op = int16(op2)
@@ -961,16 +965,20 @@ def _shri16(ins):
961965
output.extend(_16bit_oper(op1))
962966

963967
label = tmp_label()
968+
label2 = tmp_label()
969+
output.append('or a')
970+
output.append('jr z, %s' % label2)
964971
output.append('%s:' % label)
965972
output.append('sra h')
966973
output.append('rr l')
967974
output.append('djnz %s' % label)
975+
output.append('%s:' % label2)
968976
output.append('push hl')
969977
return output
970978

971979

972980
def _shl16(ins):
973-
''' Logical/aritmetical left shift 16bit (un)signed integer.
981+
""" Logical/aritmetical left shift 16bit (un)signed integer.
974982
The result is pushed onto the stack.
975983
976984
Optimizations:
@@ -979,7 +987,7 @@ def _shl16(ins):
979987
980988
* If 2nd op is lower than 6
981989
unroll lop
982-
'''
990+
"""
983991
op1, op2 = tuple(ins.quad[2:])
984992
if is_int(op2):
985993
op = int16(op2)
@@ -999,8 +1007,12 @@ def _shl16(ins):
9991007
output.extend(_16bit_oper(op1))
10001008

10011009
label = tmp_label()
1010+
label2 = tmp_label()
1011+
output.append('or a')
1012+
output.append('jr z, %s' % label2)
10021013
output.append('%s:' % label)
10031014
output.append('add hl, hl')
10041015
output.append('djnz %s' % label)
1016+
output.append('%s:' % label2)
10051017
output.append('push hl')
10061018
return output

src/arch/zx48k/backend/__32bit.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -769,9 +769,13 @@ def _shru32(ins):
769769
output.append('ld b, a')
770770
output.extend(_32bit_oper(op1))
771771
label = tmp_label()
772+
label2 = tmp_label()
773+
output.append('or a')
774+
output.append('jr z, %s' % label2)
772775
output.append('%s:' % label)
773776
output.append('call __SHRL32')
774777
output.append('djnz %s' % label)
778+
output.append('%s:' % label2)
775779
output.append('push de')
776780
output.append('push hl')
777781
REQUIRES.add('shrl32.asm')
@@ -814,9 +818,13 @@ def _shri32(ins):
814818
output.append('ld b, a')
815819
output.extend(_32bit_oper(op1))
816820
label = tmp_label()
821+
label2 = tmp_label()
822+
output.append('or a')
823+
output.append('jr z, %s' % label2)
817824
output.append('%s:' % label)
818825
output.append('call __SHRA32')
819826
output.append('djnz %s' % label)
827+
output.append('%s:' % label2)
820828
output.append('push de')
821829
output.append('push hl')
822830
REQUIRES.add('shra32.asm')
@@ -859,9 +867,13 @@ def _shl32(ins):
859867
output.append('ld b, a')
860868
output.extend(_32bit_oper(op1))
861869
label = tmp_label()
870+
label2 = tmp_label()
871+
output.append('or a')
872+
output.append('jr z, %s' % label2)
862873
output.append('%s:' % label)
863874
output.append('call __SHL32')
864875
output.append('djnz %s' % label)
876+
output.append('%s:' % label2)
865877
output.append('push de')
866878
output.append('push hl')
867879
REQUIRES.add('shl32.asm')

tests/runtime/test_all

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
#!/bin/bash
22

3-
parallel ./test_case ::: cases/*.bas
3+
for i in cases/*.bas; do ./test_case $i; done
4+
5+
# parallel ./test_case -- cases/*.bas
46

0 commit comments

Comments
 (0)