aboutsummaryrefslogtreecommitdiff
path: root/risugen
diff options
context:
space:
mode:
authorClaudio Fontana <claudio.fontana@linaro.org>2013-11-19 16:52:37 +0100
committerPeter Maydell <peter.maydell@linaro.org>2014-04-25 13:19:58 +0100
commitbba330dddb29e6715e19a3824326d828394e7ee4 (patch)
tree314797dc36248da0e89821848a98ffefda21695b /risugen
parentad6f5c17e37f48bbf537c63b249a0d98f4b3a52c (diff)
risugen: add "--no-fp" cmdline flag to disable FP
This flag disables generation of floating point code for initialization of the FP/SIMD registers, and periodic randomization. This does not of course prevent an input risu file from generating floating point instructions. This is useful to be able to test before FP support is available. Signed-off-by: Claudio Fontana <claudio.fontana@linaro.org>
Diffstat (limited to 'risugen')
-rwxr-xr-xrisugen56
1 files changed, 37 insertions, 19 deletions
diff --git a/risugen b/risugen
index 5dd02c4..a8319bf 100755
--- a/risugen
+++ b/risugen
@@ -403,10 +403,11 @@ sub write_random_fpreg()
}
}
-sub write_random_arm_regdata()
+sub write_random_arm_regdata($)
{
+ my ($fp_enabled) = @_;
# TODO hardcoded, also no d16-d31 initialisation
- my $vfp = 2; # 0 : no vfp, 1 : vfpd16, 2 : vfpd32
+ my $vfp = $fp_enabled ? 2 : 0; # 0 : no vfp, 1 : vfpd16, 2 : vfpd32
write_switch_to_arm();
# initialise all registers
@@ -425,7 +426,7 @@ sub write_random_arm_regdata()
my $datalen = 14;
$datalen += (32 * $vfp);
insn32(0xea000000 + ($datalen-1)); # b next
- for (0..(($vfp * 16) - 1)) {
+ for (0..(($vfp * 16) - 1)) { # NB: never done for $vfp == 0
write_random_fpreg();
}
# .word [14 words of data for r0..r12,r14]
@@ -437,13 +438,8 @@ sub write_random_arm_regdata()
insn32(0xe32cf000);
}
-sub write_random_aarch64_regdata()
+sub write_random_aarch64_fpdata()
{
- # clear flags
- insn32(0xd53b4200); # mrs x0, nzcv
- insn32(0x52000000 | aarch64_limm(4, 4)); # eori w0, w0, 0xf0000000
- insn32(0xd51b4200); # msr nzcv, x0
-
# load floating point / SIMD registers
my $align = 16;
my $datalen = 32 * 16 + $align;
@@ -463,6 +459,20 @@ sub write_random_aarch64_regdata()
for (my $rt = 0; $rt <= 31; $rt += 4) {
insn32(0x4cdf2c00 | $rt); # ld1 {v0.2d-v3.2d}, [x0], #64
}
+}
+
+sub write_random_aarch64_regdata($)
+{
+ my ($fp_enabled) = @_;
+ # clear flags
+ insn32(0xd53b4200); # mrs x0, nzcv
+ insn32(0x52000000 | aarch64_limm(4, 4)); # eori w0, w0, 0xf0000000
+ insn32(0xd51b4200); # msr nzcv, x0
+
+ if ($fp_enabled) {
+ # load floating point / SIMD registers
+ write_random_aarch64_fpdata();
+ }
# general purpose registers
for (my $i = 0; $i <= 30; $i++) {
@@ -471,12 +481,14 @@ sub write_random_aarch64_regdata()
}
}
-sub write_random_register_data()
+sub write_random_register_data($)
{
+ my ($fp_enabled) = @_;
+
if ($is_aarch64) {
- write_random_aarch64_regdata();
+ write_random_aarch64_regdata($fp_enabled);
} else {
- write_random_arm_regdata();
+ write_random_arm_regdata($fp_enabled);
}
write_risuop($OP_COMPARE);
@@ -919,9 +931,9 @@ sub progress_end()
$| = 0;
}
-sub write_test_code($$$)
+sub write_test_code($$$$)
{
- my ($condprob, $fpscr, $numinsns) = @_;
+ my ($condprob, $fpscr, $numinsns, $fp_enabled) = @_;
# convert from probability that insn will be conditional to
# probability of forcing insn to unconditional
$condprob = 1 - $condprob;
@@ -942,13 +954,15 @@ sub write_test_code($$$)
print "Generating code using patterns: @keys...\n";
progress_start(78, $numinsns);
- write_set_fpscr($fpscr);
+ if ($fp_enabled) {
+ write_set_fpscr($fpscr);
+ }
if (grep { defined($insn_details{$_}->{blocks}->{"memory"}) } @keys) {
write_memblock_setup();
}
# memblock setup doesn't clean its registers, so this must come afterwards.
- write_random_register_data();
+ write_random_register_data($fp_enabled);
write_switch_to_test_mode();
for my $i (1..$numinsns) {
@@ -960,7 +974,7 @@ sub write_test_code($$$)
# Rewrite the registers periodically. This avoids the tendency
# for the VFP registers to decay to NaNs and zeroes.
if ($periodic_reg_random && ($i % 100) == 0) {
- write_random_register_data();
+ write_random_register_data($fp_enabled);
write_switch_to_test_mode();
}
progress_update($i);
@@ -1193,13 +1207,15 @@ and outputfile is the generated raw binary file.
Valid options:
--numinsns n : generate n instructions (default is 10000)
--fpscr n : set initial FPSCR (arm) or FPCR (aarch64) value (default is 0)
- --condprob p : make instructions conditional with probability p
+ --condprob p : [ARM only] make instructions conditional with probability p
(default is 0, ie all instructions are always executed)
--pattern re[,re...] : only use instructions matching regular expression
Each re must match a full word (that is, we match on
the perl regex '\\b((re)|(re))\\b'). This means that
'VMULL' will match 'VMULL A1' and 'VMULL A2' but not
'VMULL_scalar A1'. This is generally what you wanted.
+ --no-fp : disable floating point: no fp init, randomization etc.
+ Useful to test before support for FP is available.
--help : print this message
EOT
}
@@ -1209,6 +1225,7 @@ sub main()
my $numinsns = 10000;
my $condprob = 0;
my $fpscr = 0;
+ my $fp_enabled = 1;
my ($infile, $outfile);
GetOptions( "help" => sub { usage(); exit(0); },
@@ -1221,6 +1238,7 @@ sub main()
die "Value \"$condprob\" invalid for option condprob (must be between 0 and 1)\n";
}
},
+ "no-fp" => sub { $fp_enabled = 0; },
) or return 1;
# allow "--pattern re,re" and "--pattern re --pattern re"
@pattern_re = split(/,/,join(',',@pattern_re));
@@ -1236,7 +1254,7 @@ sub main()
parse_config_file($infile);
open_bin($outfile);
- write_test_code($condprob, $fpscr, $numinsns);
+ write_test_code($condprob, $fpscr, $numinsns, $fp_enabled);
close_bin();
return 0;
}