Commit Graph

348 Commits

Author SHA1 Message Date
Jakob Stoklund Olesen
67abb2d2f6 Create a phantom workspace manifest for all crates.
Share a single Cargo.lock and target directory at the repo top-level.
2016-10-10 10:52:48 -07:00
Jakob Stoklund Olesen
a460a637dd Add legalization patterns. 2016-10-07 14:18:36 -07:00
Jakob Stoklund Olesen
7c91bacafe Define AST nodes and instruction transformations.
Enable syntax: iadd(x, y) which creates an Apply node.
Enable syntax: z << iadd(x, y) which creates a Def node.

Add an XForm class which represents source and destination patterns as
RTL lists.
2016-10-07 14:18:36 -07:00
Jakob Stoklund Olesen
29c449f117 Add legalization helper instructions.
The isplit_lohi instruction breaks an integer into two halves. This will
typically be used to get the two halves of an `i64` value on 32-bit
CPUs.

The iconcat_lohi is the reverse operation. It reconstructs the `i64`
from the low and high bits.
2016-09-27 16:22:32 -07:00
Jakob Stoklund Olesen
2a2871e739 Expand OpcodeConstraints to 32 bits.
Make room for 255 different type sets and 2^16 entries in the operand
constraints table.
2016-09-27 16:09:26 -07:00
Jakob Stoklund Olesen
60b2257331 Add HalfWidth and DoubleWidth type variable functions.
These functions compute types with half or double the number of bits in
each lane.
2016-09-27 15:39:54 -07:00
Jakob Stoklund Olesen
65caf2d9a1 In-place intersection of type sets. 2016-09-27 14:54:44 -07:00
Jakob Stoklund Olesen
470507dd9b Add some Python tests for TypeSet. 2016-09-27 14:54:44 -07:00
Jakob Stoklund Olesen
d7e9d4dade Run Python unittests and doctests.
Add a meta/check.sh script that runs unit tests before the syntax
linters.

Add unittest converters for the existing doctests.
2016-09-27 13:45:05 -07:00
Jakob Stoklund Olesen
d45b011fa2 Represent type sets with ranges.
Allow limits on the smallest and largest integer type in the set, the
highest and lowest number of lanes etc.
2016-09-27 13:31:31 -07:00
Jakob Stoklund Olesen
b06668aa8a Move TypeVar and TypeSet into their own Python package.
These classes are not very entangled with the rest of __init__, and
we'll be expanding them a bit.
2016-09-27 10:53:53 -07:00
Jakob Stoklund Olesen
d915718526 Add documentation links to all existing instructions. 2016-09-23 16:53:48 -07:00
Jakob Stoklund Olesen
686aa4ec1d Add an autoinstgroup Sphinx directive.
This directive documents an instruction group and lists all instructions
contained in the group, whether they have been documented or not.
2016-09-23 16:53:47 -07:00
Jakob Stoklund Olesen
f66d84fd95 Integer subtraction with borrow flags.
This is the x86-style of borrow flags. ARM uses subtract-with-carry
which inverts the sense of the carry flag.
2016-09-23 15:47:39 -07:00
Jakob Stoklund Olesen
9cb3451432 Integer add with carry instructions.
Integer addition with carry in/out/both.
2016-09-23 13:42:00 -07:00
Jakob Stoklund Olesen
7ec54a5a01 Add a Cretonne testing guide.
Describe the basics of Rust-level tests, and go into more detail about
the file-level tests.
2016-09-23 11:37:40 -07:00
Jakob Stoklund Olesen
0dd16a360d Basic *.cton syntax mode for Vim. 2016-09-23 10:41:35 -07:00
Jakob Stoklund Olesen
65f69fb088 Add a 'test legaliser' filetest command.
This test command sends each function through legalize_function() and
then filecheck.
2016-09-21 17:36:06 -07:00
Jakob Stoklund Olesen
6a71613d92 Write out encoding annotations on instructions.
All instructions with associated encodings are now annotated with
encoding information in a column before the code.

When write_function() is givan a TargetIsa reference, the annotations use
ISA-specific names. Otherwise everything is numeric.
2016-09-21 17:36:05 -07:00
Jakob Stoklund Olesen
ea901653da Print encodings as [R#10c] instead of [R/10c].
The # is a more conventional prefix for hexadecimal, and when ISA
information is not available, there may be a decimal number in front
which would be confusing.

So prefer [1#10c] for the ISA-less encoding format. Here '1' is decimal
and '#10c' is hexadecimal.
2016-09-21 17:24:41 -07:00
Jakob Stoklund Olesen
1c4eb44ef7 Expose Vec::get() in EntityMap. 2016-09-21 17:24:41 -07:00
Jakob Stoklund Olesen
7587a51bd7 Pass flags and target ISAs to filetests.
Add a `needs_isa()` method to the SubTest trait, and pass a TargetIsa
trait object to those sub-tests that request it.

When multiple sub-tests and ISAs are specified, test the cross product.

If a sub-test requires an ISA, but none are specified, fail the test. In
the future, it may be a good idea to generate a default set of ISAs and
test against those.
2016-09-21 12:56:40 -07:00
Jakob Stoklund Olesen
36b143df99 Parse ISA specifications between test commands and functions.
Some tests are only applicable to specific ISAs. This can be indicated
with an ISA specification:

    test legalizer
    isa riscv
    function foo() {
        ....
    }

The ISA specifications have the same format as the test lines: The name
of the ISA following by optional settings until the end of the line.

Also parse `set` commands mixed in with the `isa` commands. These are
used to set ISA-independent settings as defined in
meta/cretonne/settings.py.
2016-09-21 09:25:24 -07:00
Jakob Stoklund Olesen
83adf341ec Allow settings::Builder to be reused.
When constructing the Flags object from the Builder, don't consume it,
but take a reference instead.

This makes it possible for the parser to accept multiple 'set' lines and
apply them to different ISA specifications.
2016-09-20 16:11:39 -07:00
Jakob Stoklund Olesen
26332f6f91 Share split_entity_name between lexer and sourcemap.
There's only one way of parsing entity names correctly.
2016-09-20 13:20:33 -07:00
Jakob Stoklund Olesen
64490a3587 Don't have keywords in the lexer and parser.
Instead of recognizing "function" as a keyword, simply match it as a
context-sensitive keyword in the parser outside functions.
2016-09-20 13:00:37 -07:00
Jakob Stoklund Olesen
fab16941c8 Add a stub implementation of the legalizer.
This basic version only fills in the encoding of already-legal
instructions. It doesn't have any way of transforming the illegal
instructions yet.
2016-09-20 10:53:05 -07:00
Jakob Stoklund Olesen
1d0ab91136 Store instruction encodings in Function.
This is a side-table of ISA-dependent information that will initially be
filled out by the legalizer.
2016-09-20 10:17:16 -07:00
Jakob Stoklund Olesen
57b6967ddd Add clear, is_empty, and resize methods to EntityMap.
These are simply forwards from the underlying Vec.
2016-09-20 10:00:30 -07:00
Jakob Stoklund Olesen
af29fee5d2 Wrap FunctionName in a newtype struct.
Function names display differently than normal strings since they need
quotes and escaping.

Move the FunctionName type into its own module.
2016-09-19 15:09:25 -07:00
Jakob Stoklund Olesen
43aa6f66d9 Add a TargetIsa::display_enc() method.
The interpretation of an encoding depends on the target ISA, and so does
the proper printing of the encoding.
2016-09-19 13:45:22 -07:00
Jakob Stoklund Olesen
59c404ed29 Move 'Encoding' into its own module. 2016-09-19 13:07:58 -07:00
Jakob Stoklund Olesen
ce6a463267 Rename 'encoding' modules to 'enc_tables'.
These modules contain encoding tables, not the 'Encoding' struct.
2016-09-19 13:00:16 -07:00
Jakob Stoklund Olesen
622006ecc5 Remove the inst_locs vector in the parser.
Use the source map to track instruction locations instead.

The rewrite methods now take an AnyEntity argument as the location to
use for errors. This means that bad EBB references in jump tables are
now reported correctly.
2016-09-19 11:47:57 -07:00
Jakob Stoklund Olesen
d0f9f92317 Also record locations for tracked entities. 2016-09-19 11:29:55 -07:00
Jakob Stoklund Olesen
dd8e7df8ba Add an internal MutableSourceMap trait.
Use the SourceMap for mapping during parsing too.
2016-09-19 11:13:11 -07:00
Jakob Stoklund Olesen
feef2ecf3f Extract Result and Error into their own module.
Also include the err! macro and make it usable outside the module.
2016-09-19 10:23:51 -07:00
Jakob Stoklund Olesen
17c2b5213a Print out a report of slow-running tests.
The slow tests are computed as those that would be printed as outliers
on a boxplot of all the test runtimes. These are more than 1.5
inter-quartile range away from the 75% quartile.
2016-09-18 11:35:10 -07:00
Jakob Stoklund Olesen
5cb5110330 Add --verbose flag to cton-util test. 2016-09-17 17:11:17 -07:00
Jakob Stoklund Olesen
b1468ee0bc Simplify with unwrap_or_else(). 2016-09-17 12:36:35 -07:00
Jakob Stoklund Olesen
aa1da4d871 Record the location of parsed functions.
Remember the location of the 'function' keyword that starts every
function. This can be useful for reporting test failures etc.
2016-09-17 11:42:08 -07:00
Jakob Stoklund Olesen
951ff3e6fc Tell Travis to cache Cargo intermediate build products.
The CI builds were using a lot of time downloading and building crates.
2016-09-17 11:29:52 -07:00
Jakob Stoklund Olesen
1c1ae524aa Run tests concurrently.
Spin up one worker thread per cpu, and run filetests on all of them. Use
a reorder buffer in Runner to make sure results are still reported in
order.

Individual test files given as command line arguments are still run
synchronously for easier debugging. Only directories are run on worker
threads. The recursive directory traversal is still happening on the
main thread.

Use a heartbeat thread to send ticks on the reply channel every second,
and use the ticks to detect tests that are stuck. When
Receiver::recv_timeout() is stabilized, we can probably get rid of the
heartbeat thread.

Catch panics on the worker threads and report them as test failures.
2016-09-17 10:58:53 -07:00
Jakob Stoklund Olesen
356e05d225 Simplify job queue.
Always keep PathBufs for every entry in the test list. When concurrent
testing is enabled, we'll want to clone the path for the worker threads.

Remove the Job struct for the same reason.
2016-09-16 21:50:15 -07:00
Jakob Stoklund Olesen
c04b2fa793 Move the code to run test into its own module.
Loading a file and running the test in it can be separated from the
mechanics of running multiple tests and scanning directories for test
files.
2016-09-16 21:09:37 -07:00
Jakob Stoklund Olesen
30009356a6 Move subtest::new() into the parent module.
This saves on importing of all the sub-modules that implement new test
commands, and it provides a nice overview of what 'cton-util test' can
do.
2016-09-16 17:00:55 -07:00
Jakob Stoklund Olesen
7f1f4175ac cargo update. 2016-09-16 16:41:04 -07:00
Jakob Stoklund Olesen
d2e5059ab9 Remove unnecessary external dependencies.
The main libcretonne crate should not have any external dependencies if
at all possible. Use simple substring matching instead of regular
expressions in the verifier tests to achieve this.

The tools crate no longer depends directly on glob and regex. It still
has an indirect dependency on regex through libfilecheck.
2016-09-16 16:34:50 -07:00
Jakob Stoklund Olesen
b5b1ee23b5 Add a 'test verifier' sub-test.
This test runs the verifier on each function and matches the resulting
verifier error against the "error:" annotation.

Move the existing verifier test into filetests/verifier/ and use the new
syntex.
2016-09-16 16:25:36 -07:00
Jakob Stoklund Olesen
c3afc1f2be Add a location to verifier error messages.
The verifier reports the 'location' of an error message as a reference
to the entity that has a problem. This uses the 'AnyEntity' type to
refer to instructions/values/ebbs etc.

Also add an err! macro similar to the one used by the parser.
2016-09-16 15:35:37 -07:00