Commit Graph

2437 Commits

Author SHA1 Message Date
Jakob Stoklund Olesen
853e995c99 Implement From<i64> for Imm64.
This makes it possible to use literal integers as arguments to
InstBuilder methods.
2016-10-21 10:43:33 -07:00
Jakob Stoklund Olesen
6aa3e4594a Move the 'ins' method to DataFlowGraph.
This given us better symmetry between the replace and insert builder operations:

    dfg.replace(inst).iadd(x, y)
    dfg.ins(cursor).imul(x, y)
2016-10-21 09:46:17 -07:00
Jakob Stoklund Olesen
84172ddf98 Define live range splitting instructions.
The copy/spill/fill instructions will be used by the register allocator
for splitting live ranges. The copy instruction is also useful when
rewriting values:

If a primary value is rewritten as a secondary result, a copy
instruction can be used instead:

  a = foo x
=>
  t, vx1 = call ...
  a = copy vx1

Since a primary value must be the first value of an instruction, this
doesn't work:

  a = foo x
=>
  t, a = call ...
2016-10-20 15:34:16 -07:00
Jakob Stoklund Olesen
bb0bb1e91c Add a ReplaceBuilder instruction builder.
The DataFlowGraph::replace(inst) method returns an instruction builder
that will replace an instruction in-place.

This will be used when transforming instructions, replacing an old
instruction with a new (legal) way of computing its primary value. Since
primary result values are essentially instruction pointers, this is the
only way of replacing the definition of a value.

If secondary result values match the old instruction in both number and
types, they can be reused. If not, added a detach_secondary_results()
method for detaching old secondary values.
2016-10-20 13:33:49 -07:00
Jakob Stoklund Olesen
634de93337 Rename Builder to InsertBuilder.
This instruction builder inserts an instruction at the cursor position.
We'll add other kinds of builders shortly.
2016-10-20 11:16:58 -07:00
Jakob Stoklund Olesen
6db94bb980 Switch InstrBuilder to the one-shot builder pattern.
All the InstrBuilder methods now consume the builder, and the non-leaf
methods return the dfg mutable reference they were holding.

This makes it possible to construct instruction builders that are only
safe to use once because they are doing more advanced value rewriting.
2016-10-19 19:33:48 -07:00
Jakob Stoklund Olesen
ab910b3f58 Add a Cursor::ins() method which constructs a Builder.
Rewrite Builder uses in test cases to use this method and construct a
new builder for each instruction. This pattern allows us to change the
InstBuilder trait to a one-shot implementation that can only create a
single instruction.

Don't re-export the Builder struct, it is less important than the
InstBuilder trait, and we may get more implementations.
2016-10-19 19:33:19 -07:00
Jakob Stoklund Olesen
368b12e7cd Use more precise lifetimes for Builder.
Distinguish the lifetime of the Cursor and its referenced function
layout.

Use two separate function lifetimes: 'fc and 'fd. The borrow checker
seems to get confused if we don't.
2016-10-19 19:32:57 -07:00
Jakob Stoklund Olesen
58168bcd07 Generate an InstBuilder trait.
All of the instruction format an opcode methods are emitted as an
InstBuilder trait instead of adding them to the Bulder struct directly.
The methods only make use of the InstBuilderBase methods to create new
instructions.

This makes it possible to reuse the InstBuilder trait for different ways
of inserting instructions.
2016-10-19 18:21:17 -07:00
Jakob Stoklund Olesen
c8f28e5902 Rename lifetimes in layout.rs to 'f
These lifetimes all represent the lifetime of the Function.
2016-10-19 16:23:08 -07:00
Jakob Stoklund Olesen
cba5cdd22e Also rebuild if build.rs itself changes.
We already have all the meta/**.py as dependencies.
2016-10-19 12:03:50 -07:00
Jakob Stoklund Olesen
b068bace9d Add more expansion patterns.
RISC-V does not have a flags register, and thus no add-with-carry
instructions. Neither does MIPS.

Add expansions of these instructions in terms of iadd and icmp.
2016-10-19 11:24:08 -07:00
Jakob Stoklund Olesen
0b674fb28b Bump filecheck version to 0.0.1, allow publication. 2016-10-18 13:33:39 -07:00
Jakob Stoklund Olesen
d85225c537 Parse signature and function declarations.
Also add support for parsing call and call_indirect instructions.
2016-10-18 13:19:24 -07:00
Jakob Stoklund Olesen
7d7a7875d5 Add result values to call instructions too.
The make_inst_results() method now understands direct and indirect
calls, and can allocate result values matching the return types of the
function call.
2016-10-18 13:08:50 -07:00
Jakob Stoklund Olesen
c961e89fdc Add signatures and ext_funcs tables to DataFlowGraph.
These two tables are used to keep track of type signatures of function
calls as well as external function references used in direct function
calls.

Also add an ExtFuncData struct representing an external function that
can be called directly.
2016-10-18 11:28:03 -07:00
Jakob Stoklund Olesen
e4e1c30f87 Add call and call_indirect instructions.
Add a new IndirectCall instruction format which has a value callee as
well as the call arguments.

Define call and call_indirect instructions.
2016-10-18 10:04:06 -07:00
Jakob Stoklund Olesen
8055ac681c Track signatures and function references in the source map. 2016-10-18 09:43:20 -07:00
Jakob Stoklund Olesen
45cf655ce4 Generalize def_inst() to def_entity().
Use this source map method for assigning a location to any entity whose
source number is not exposed. This could be

- Instructions.
- Signatures defined implicitly by function decls.

These entities only appear in the location map, not the entity number
maps.
2016-10-18 09:38:05 -07:00
Jakob Stoklund Olesen
a8a79df620 Promote the src/tools crate to the top-level workspace.
The 'src' and 'tests' top-level directories now contain tools sources
and integration tests for any of the library crates.
2016-10-17 15:04:29 -07:00
Jakob Stoklund Olesen
0764df28b5 Move library crates under 'lib/'.
Give these crates each a more standard directory layout with sources in
a 'src' sub-sirectory and Cargo.toml in the top lib/foo directory.

Add license and description fields to each.

The build script for the cretonne crate now lives in
'lib/cretonne/build.rs' separating it from the normal library sources
under 'lib/cretonne/src'.
2016-10-17 14:44:43 -07:00
Jakob Stoklund Olesen
e7f30a40b4 Move the 'meta' dir to 'lib/cretonne/meta'.
The 'lib/cretonne' directory will be the new root of a stand-alone
cretonne crate containg both Python and Rust sources.

This is in preparation for publishing crates on crates.io.
2016-10-17 14:19:23 -07:00
Jakob Stoklund Olesen
8480879f3e Remove test_utils.
These test utilities have been subsumed by ir::Builder.
2016-10-14 15:17:34 -07:00
Jakob Stoklund Olesen
af8f8d98e6 Switch domtree tests to using Builder. 2016-10-14 15:16:29 -07:00
Jakob Stoklund Olesen
d4197ca731 Give Builder a Cursor.
The Builder keeps track of a position in the layout and inserts new
instructions there.

Add insert_ebb() and ebb() methods to Builder.

Use Builder in the cfg tests.
2016-10-14 15:02:58 -07:00
Jakob Stoklund Olesen
eb5cea7c6a Add Cursor::insert_ebb() method.
Insert an EBB at the current position and switch to inserting
instructions there. Call the relevant Layout methods to do so.
2016-10-14 14:01:49 -07:00
Jakob Stoklund Olesen
8592979fc9 Add Layout::insert_ebb_after() method.
Symmetrical with the existing insert_ebb().
2016-10-14 13:54:26 -07:00
Jakob Stoklund Olesen
10c579e0cd Add Layout::split_ebb().
This method splits an EBB in two and moves trailing instructions to a
new EBB.
2016-10-14 12:33:54 -07:00
Jakob Stoklund Olesen
6f68673e8a Add Cursor::insert_inst().
Insert an instruction at thecurrent cursor position.
2016-10-14 10:09:57 -07:00
Jakob Stoklund Olesen
d650d30b88 Add a LAyout Cursor data structure.
A layout cursor can be used instead of an iterator to keep track of a
position in a basic block *and* permitting instructions to be
manipulated.
2016-10-13 14:36:34 -07:00
Jakob Stoklund Olesen
8ca970ba5c Generate a Builder data type. WIP.
The Builder provides a convenient interface for inserting instructions
into an extended basic block.

The bulk of the builder methods are generated automatically from the
meta language instruction descriptions.

Still TODO: Keep track of an insertion position.
2016-10-12 16:47:11 -07:00
Jakob Stoklund Olesen
5a2f8cbdf8 Move second_result outside boxed storage.
In instruction formats that have multiple results AND boxed storage,
place the second_result field outside the boxed storage. The 16-byte
instruction format has room for opcode, type, second_result in the first
8 bytes, and the boxed pointer in the last 8 bytes.

This provides a simpler implementation of the second_result() and
second_result_mut() InstructionData methods.
2016-10-12 16:01:06 -07:00
Jakob Stoklund Olesen
f78baf9c0b Capture the Rust type used to represent an operand kind.
The Rust type is usually the camel-cased name of the operand kind, but
there are variations, so allow an explicit rust_type='IntCC' when
defining operand kinds.
2016-10-12 15:51:50 -07:00
Jakob Stoklund Olesen
b8a537bb13 Add simple Uimm8 and ImmVector immediate types.
Implement the boxed storage of the UnaryImmVector instruction format.
2016-10-12 15:51:22 -07:00
Jakob Stoklund Olesen
7cf25a073b Add FuncRef and SigRef entity references.
These refer to external functions and function signatures declared in
the preamble. Since we're already using the type names 'Signature' and
'Function', these entity references don't folow the usual EntityData /
Entity naming convention.
2016-10-12 15:20:46 -07:00
Jakob Stoklund Olesen
b42d85ae24 Move signatures into new ir::extfunc module.
This new module will gain more data types dealing with external function
calls.
2016-10-12 13:56:26 -07:00
Jakob Stoklund Olesen
b258644d07 Use 'varargs' consistently for VariableArgs members.
The meta code generators need to be able to infer these too.
2016-10-12 13:56:26 -07:00
Jakob Stoklund Olesen
2372486ec5 Track InstructionData member names.
Entity references in instruction format operands also have member names
in the InstructionData struct. Track them the same way we track immediate operand member names.

Value operands still go in the arg / args members.
2016-10-12 13:56:26 -07:00
Jakob Stoklund Olesen
02eae6afd0 Upgrade to rustfmt 0.6.2 2016-10-12 13:56:26 -07:00
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