It seems odd to have the chopn_s_ic and not a chopn_s_i op, this
patch adds this, and simillar ops (+ tests!) for shr and shl.
I don't know if these count as new features or not...
Also, string_chopn was not checking for OOB values for n, this is fixed
and the (currenlty skipped) jump test in basic.t expected the wrong output.
Alex Gough
--
History teaches us that men and nations behave wisely
once they have exhausted all other alternatives.
######
diff -urN clean/parrot/basic_opcodes.ops parrot/basic_opcodes.ops
--- clean/parrot/basic_opcodes.ops Wed Sep 26 20:00:00 2001
+++ parrot/basic_opcodes.ops Sat Sep 29 13:20:25 2001
@@ -452,6 +452,11 @@
string_chopn(STR_REG(P1), P2);
}
+/* CHOPN Sx, Ix */
+AUTO_OP chopn_s_i {
+ string_chopn(STR_REG(P1), INT_REG(P2));
+}
+
/* SUBSTR Sx, Sx, Ix, Ix */
AUTO_OP substr_s_s_i {
STRING *s = string_substr(STR_REG(P2), INT_REG(P3), INT_REG(P4), &STR_REG(P1));
@@ -690,9 +695,19 @@
INT_REG(P1) = INT_REG(P2) << P3;
}
+/* SHL_i_i */
+AUTO_OP shl_i_i {
+ INT_REG(P1) = INT_REG(P2) << INT_REG(P3);
+}
+
/* SHR_i_ic */
AUTO_OP shr_i_ic {
INT_REG(P1) = INT_REG(P2) >> P3;
+}
+
+/* SHR_i_i */
+AUTO_OP shr_i_i {
+ INT_REG(P1) = INT_REG(P2) >> INT_REG(P3);
}
/* XOR_i */
diff -urN clean/parrot/opcode_table parrot/opcode_table
--- clean/parrot/opcode_table Mon Sep 24 20:00:01 2001
+++ parrot/opcode_table Sat Sep 29 13:22:17 2001
@@ -61,6 +61,7 @@
print_sc 1 s
length_i_s 2 I S
chopn_s_ic 2 S i
+chopn_s_i 2 S I
substr_s_s_i 4 S S I I
concat_s 2 S S
@@ -178,6 +179,8 @@
not_i 2 I I
or_i 3 I I I
shl_i_ic 3 I I i
+shl_i_i 3 I I I
shr_i_ic 3 I I i
+shr_i_i 3 I I I
xor_i 3 I I I
diff -urN clean/parrot/string.c parrot/string.c
--- clean/parrot/string.c Mon Sep 24 20:00:01 2001
+++ parrot/string.c Sat Sep 29 12:54:31 2001
@@ -143,6 +143,7 @@
if (n > s->strlen) {
n = s->strlen;
}
+ if (n < 0) n = 0;
return (ENC_VTABLE(s)->chopn)(s, n);
}
diff -urN clean/parrot/t/op/basic.t parrot/t/op/basic.t
--- clean/parrot/t/op/basic.t Tue Sep 25 14:00:01 2001
+++ parrot/t/op/basic.t Sat Sep 29 12:45:35 2001
@@ -29,7 +29,7 @@
SKIP: {
skip( "label constants unimplemented in assembler", 1 );
-output_is( <<'CODE', <<OUTPUT, "jump" );
+output_is( <<'CODE', '42', "jump" );
set I4, 42
set I5, HERE
jump I5
@@ -38,6 +38,4 @@
print I4
end
CODE
-I reg 4 is 42
-OUTPUT
}
diff -urN clean/parrot/t/op/bitwise.t parrot/t/op/bitwise.t
--- clean/parrot/t/op/bitwise.t Wed Sep 26 08:00:01 2001
+++ parrot/t/op/bitwise.t Sat Sep 29 13:23:24 2001
@@ -1,6 +1,6 @@
#! perl -w
-use Parrot::Test tests => 4;
+use Parrot::Test tests => 5;
output_is(<<'CODE', <<'OUTPUT', "shr_i_ic (>>)");
set I0, 0b001100
@@ -20,6 +20,26 @@
12
OUTPUT
+output_is(<<'CODE', <<'OUTPUT', "shr_i_i (>>)");
+ set I0, 0b001100
+ set I1, 0b010100
+ set I4, 1
+ set I5, 2
+ shr I2, I0, I4
+ shr I1, I1, I5
+ print I2
+ print "\n"
+ print I1
+ print "\n"
+ print I0
+ print "\n"
+ end
+CODE
+6
+5
+12
+OUTPUT
+
output_is(<<'CODE', <<'OUTPUT', "xor_i");
set I0, 0b001100
set I1, 0b100110
@@ -78,3 +98,6 @@
12
OUTPUT
1;
+
+
+
diff -urN clean/parrot/t/op/string.t parrot/t/op/string.t
--- clean/parrot/t/op/string.t Tue Sep 25 14:00:02 2001
+++ parrot/t/op/string.t Sat Sep 29 13:24:27 2001
@@ -1,6 +1,6 @@
#! perl -w
-use Parrot::Test tests => 10;
+use Parrot::Test tests => 13;
output_is( <<'CODE', <<OUTPUT, "set_s_sc" );
set S4, "JAPH\n"
@@ -10,11 +10,15 @@
JAPH
OUTPUT
-output_is( <<'CODE', '4', "length_i_s" );
+output_is( <<'CODE', '40', "length_i_s" );
set I4, 0
+ set I5, 1
set S4, "JAPH"
+ set S5, ""
length I4, S4
+ length I5, S5
print I4
+ print I5
end
CODE
@@ -33,6 +37,51 @@
CODE
JAPH
japh
+OUTPUT
+
+output_is(<<'CODE', <<'OUTPUT', "chop_s_ic - len>len(s)");
+ set S0, "String of length 19"
+ print S0
+ chopn S0, 99
+ print S0
+ print "\n"
+ end
+CODE
+String of length 19
+OUTPUT
+
+output_is(<<'CODE', <<'OUTPUT', "chop_s_i");
+ set S0, "String of length 19"
+ set I0, 10
+ chopn S0, I0
+ print S0
+ print "\n"
+ set I0, -1
+ chopn S0, I0
+ print S0
+ print "\n"
+ set I0, 99
+ chopn S0, I0
+ print S0
+ print "\n"
+ end
+CODE
+String of
+String of
+
+OUTPUT
+
+output_is(<<'CODE', <<'OUTPUT', "chop_s_ic - -ve len");
+ set S0, "String of length 19"
+ print S0
+ print "\n"
+ chopn S0, -1
+ print S0
+ print "\n"
+ end
+CODE
+String of length 19
+String of length 19
OUTPUT
output_is( <<'CODE', 'JAPH', "substr_s_s_i_i" );