Commit Graph

2437 Commits

Author SHA1 Message Date
Jakob Stoklund Olesen
1e631fdbd6 Verify restrictions on polymorphism.
Add a typevar_operand argument to the InstructionFormat constructor which
determines the operand used for inferring the controlling type variable.

Identify polymorphic instructions when they are created, determine if the
controlling type variable can be inferred from the typevar_operand, and verify
the use of type variables in the other operands.

Generate type variable summary in the documentation, including how the
controlling type variable is inferred.
2016-05-19 14:59:46 -07:00
Jakob Stoklund Olesen
210139c4bd Add a BinaryOverflow instruction format.
This will eventualy be used for add-with-carry and add-with-overflow type
instructions. For now it only serves as a representative of instruction formats
that have multiple_results=True and boxed_storage=False at the same time.
2016-05-19 10:43:14 -07:00
Jakob Stoklund Olesen
2ce5f05bed Auto-generate boilerplate for 'impl InstructionData'.
Accessors for shared fields and multiple results can be generated automatically.

Add a 'boxed_storage' flag to the instruction format definitions to enable
generated code to access 'data'.
2016-05-19 10:16:40 -07:00
Jakob Stoklund Olesen
ebe224a912 Define control flow instructions.
Rename 'br' to 'jump'. We'll use jump/br to mean unconditional/conditional
control transfer respectively.
2016-05-19 09:01:40 -07:00
Jakob Stoklund Olesen
d85fda0346 Add entity references as a new operand kind.
Define known entities in the cretonne.entities module.
2016-05-18 15:31:02 -07:00
Jakob Stoklund Olesen
1dcac579fb Parse basic blocks and instructions.
Create map entries for ebbs and values as they are defined, but leave ebb and
value operands unresolved on instructions as they are parsed. Instruction
operands can refer to ebbs and values that may not have been defined yet.

Don't infer or check result types yet.
2016-05-18 12:27:12 -07:00
Jakob Stoklund Olesen
2dc15b78ae Add restrictions on polymorphism.
Also introduce the concept of a derived type variable, and provide two
methods for deriving type vars: lane() and as_bool().
2016-05-18 12:27:12 -07:00
Jakob Stoklund Olesen
bd221af412 Reorganize meta language reference.
Separate instruction descriptions from instruction formats which deal with the
Rust representation.

Add type class restrictions to type variables.
2016-05-18 12:27:12 -07:00
Jakob Stoklund Olesen
9838a4040e Implement write_instruction and write_ebb.
Use the new iterators to write out the contents of a function.
2016-05-14 11:33:07 -07:00
Jakob Stoklund Olesen
5e0e923464 Track instruction order in an EBB.
Place instructions in a doubly linked list and point to the first and last
instruction in an EBB.

Provide an iterator for all the EBBs too. This doesn't reflect the layout
order, but simply the order blocks were created.
2016-05-13 17:58:55 -07:00
Jakob Stoklund Olesen
3670f57c40 Synchronize InstructionFormat and InstructionData.
These two enums must have identical variants. One is generated from the
instruction formats in meta/cretonne/formats.py, the other defines the contents
of an instruction.

Emit a conversion from InstructionData to InstructionFormat which also serves
to verify the correspondence. Rustc will error is the match is not complete.
2016-05-13 14:29:14 -07:00
Jakob Stoklund Olesen
9c9be1cb58 Break entity references and instruction info out into new modules.
Avoid gathering too much code in repr.rs.

The `entities` module contains entity reference types, and the `instructions`
module contains instruction opcodes and formats.
2016-05-13 14:02:04 -07:00
Jakob Stoklund Olesen
e3927e205e Generate an InstructionFormat enum.
This is a no-payload enum which will have the same variants as InstructionData.
This makes it possible to talk about the format of an instruction without
actually creating an InstructionData instance.
2016-05-13 11:54:05 -07:00
Jakob Stoklund Olesen
3909cdbc2d Generate recursive meta language dependencies.
Cargo doesn't scan a directory for changed dependencies recursively, so do that
as part of the build.py script.
2016-05-13 10:00:38 -07:00
Jakob Stoklund Olesen
ef04f4fc40 Add an InstructionFormat class to the meta language.
Define all known instruction formats in the cretonne.formats module.
2016-05-13 09:12:06 -07:00
Jakob Stoklund Olesen
814231245c Add OperandKind to the meta language.
We have a two-level type system: OperandKinds and ValueTypes. The value types
only apply to value operands, but there are many more kinds of operands:
immediate numbers, condition codes, basic block references, etc.
2016-05-12 15:59:40 -07:00
Jakob Stoklund Olesen
f1e2dffa81 PEP8 formatting. 2016-05-12 13:37:03 -07:00
Jakob Stoklund Olesen
21b0eae044 Fix build. 2016-05-02 16:04:21 -07:00
Jakob Stoklund Olesen
1d768ff734 Implement value lists.
Values that are defined together are represented as a singly linked list. These
lists appear in:

- Instructions with multiple result values. The first result value is special, and the
  following results form a linked list of Def extended_value table entries.

- EBB arguments are represented as a linked list of Argument extended_value
  table entries. The EbbData struct has pointers to the first and last argument
  to allow fast insertion at both ends.

Add a Values iterator type whicih can enumerate both kinds of value lists.
2016-05-02 15:36:54 -07:00
Jakob Stoklund Olesen
e026b36db4 Implement Index<Inst/StackSlot> for Function.
When Function serves as a container for IL entities, use the Index trait to
translate a reference class to a Data object.

Works for:

- StackSlot -> StackSlotData
- Inst -> InstructionData
2016-05-02 12:13:24 -07:00
Jakob Stoklund Olesen
e414ce6315 Exit test script on errors. 2016-04-29 15:45:48 -07:00
Jakob Stoklund Olesen
3c0e2f6e9d Build status badge. 2016-04-29 15:33:24 -07:00
Jakob Stoklund Olesen
4e4c634666 Set up Travis CI 2016-04-29 15:31:25 -07:00
Jakob Stoklund Olesen
d34ced5437 Rename the 'cretonne' binary.
It soome that 'cargo doc' gets confused when there is both a library crate
and a binary called 'cretonne'.
2016-04-29 15:15:45 -07:00
Jakob Stoklund Olesen
810a90e322 Rename libraries
libctonfile -> libreader.

This library will only provide .cton file reading/parsing services which are
not needed after deployment.

Code for writing .cton files lives in the main cretonne library because it is
fairly small, and because it is useful for extracting test cases from a
deployed library.
2016-04-29 15:00:16 -07:00
Jakob Stoklund Olesen
ddea422ceb Add a write.rs module.
Convert a function to text.
2016-04-29 13:53:14 -07:00
Jakob Stoklund Olesen
5c4f3d01e2 Use x.to_string() instead of format!("{}", x).
Both use the Display trait.
2016-04-29 11:55:40 -07:00
Jakob Stoklund Olesen
88931983a8 Parse stack slot decls.
Add a stack slot array to repr::Function, use repr::StackSlot to reference them.

Parse stack slot declarations in the function preamble, add them to the
function.

Add a new `Context` struct which keeps track of mappings between identifiers
used in the file and real references.
2016-04-28 17:35:01 -07:00
Jakob Stoklund Olesen
021bde1191 Add FunctionName, Signature to repr::Function.
Simplify the uses in parser.rs to avoid too many module qualifiers.
2016-04-28 14:54:17 -07:00
Jakob Stoklund Olesen
41d95c0342 Tests for signature parser. 2016-04-28 14:39:47 -07:00
Jakob Stoklund Olesen
42364fda59 Add top-level productions to language reference. 2016-04-28 14:39:42 -07:00
Jakob Stoklund Olesen
cda7943b0b Fix documentation badge. 2016-04-28 09:09:34 -07:00
Jakob Stoklund Olesen
07afc6e8da Begin parser unit tests, add public interface.
The main entry point is Parser::parse().
2016-04-28 09:05:11 -07:00
Jakob Stoklund Olesen
8d0311b642 Simplify parser.
Use 'if let' instead of 'match' where it makes sense.

Use EBNF notation for the grammar rules. This simplifies repetition a lot.
2016-04-28 08:06:30 -07:00
Jakob Stoklund Olesen
f1a4b28d3f Parser for .cton files.
Recursive descent parser, although with this simple grammar there won't be any
recursion.
2016-04-27 17:11:05 -07:00
Jakob Stoklund Olesen
c712ddc776 Handle value type names in the lexer. 2016-04-27 17:07:54 -07:00
Jakob Stoklund Olesen
ab74770ffe Begin lexer implementation.
Add a lexer module which implements the lexical analysis of .cton files.
2016-04-27 17:07:54 -07:00
Jakob Stoklund Olesen
9e00ce5081 Type::by() returns an Optional<Type>.
Don't use assertions to enforce the limits on SIMD lanes in a type, Type is too
fundamental for that. Instead, the Vector-forming by() method returns an
Optional<Type>, and None if the requested SIMD vector is not valid.

Same for Type::half_vector().
2016-04-27 17:07:54 -07:00
Jakob Stoklund Olesen
04d3b10564 Add function signatures.
Describe function argument and return value types along with flags for passing
values in an ABI-compliant way.
2016-04-27 17:07:54 -07:00
Jakob Stoklund Olesen
6a1f74125f Implement FromStr for Imm64, Ieee32, Ieee64.
These are bitwise exact conversions from string to immediates, implementing the
inverse of the Display trait.

Only accept hexadecimal floating point numbers to avoid issues with rounding
when converting decimal numbers to binary.
2016-04-27 17:07:46 -07:00
Jakob Stoklund Olesen
f1d43652ad Migrate to readthedocs.io 2016-04-27 17:05:02 -07:00
Jakob Stoklund Olesen
4f40a2ae79 Add some scaffolding for building more crates.
The src/tools directory contains the cretonne-tools crate which will build
binaries for testing cretonne.

The src/libctonfile directory contains the ctonfile library crate which
provides reading and writing of .cton files.
2016-04-08 12:55:29 -07:00
Jakob Stoklund Olesen
49ae98a1e9 Implement std::str::FromStr for matching opcodes.
Replace the home-grown from_str function.
2016-04-08 11:06:33 -07:00
Jakob Stoklund Olesen
66778dc23c Typo. 2016-04-08 10:31:14 -07:00
Jakob Stoklund Olesen
24e0828d20 Generate a constant hash table for recognizing opcodes.
Use a simple quadratically probed, open addressed hash table. We could use a
parfect hash function, but it would take longer to compute in Python, and this
is not in the critical path performancewise.
2016-04-07 20:24:21 -07:00
Jakob Stoklund Olesen
3dcd2f8e58 Generate an opcode_name() function.
This function returning a &'static str is more primitive that the Display
implementation. It allows the opcode strings to be reused by the parser.
2016-04-07 13:49:35 -07:00
Jakob Stoklund Olesen
3a570e8b21 Add repr.rs module containing the representation of functions.
A function owns instructions and extended basic blocks. References to these
entities are implemented as opaque structs indexing into the functions internal
tables. This avoids fighting Rust's ownership checking and it also makes
references 4 bytes on all platforms.

SSA values are identified similarly, but with an optimization for the first
value produced by an instruction. Very few instructions will produce more than
one value, and there is an extended value table for those.
2016-04-07 11:53:37 -07:00
Jakob Stoklund Olesen
d650d551a0 Include generated Opcode enum in the immediates module.
Generate nice doc comments for the Opcode enum variants that 'cargo doc'
will pick up.

Include a `Display` trait implementation that prints the lower
snake-case version of the opcode name.
2016-04-06 14:55:21 -07:00
Jakob Stoklund Olesen
15f39c776c Begin source generation.
Start out easy by emiting an opcodes.rs file containing an opcode enumeration.
2016-04-06 12:22:56 -07:00
Jakob Stoklund Olesen
7bf4570ba1 Add a RISC-V target.
Flesh out the directory structure for defining target instruction set
architectures. Use RISC-V as a startgin point because it is so simple.
2016-04-06 12:00:35 -07:00