Commit Graph

2829 Commits

Author SHA1 Message Date
Morgan Phillips
125b79c06a Add additional test cases 2016-08-24 13:13:31 -07:00
Jakob Stoklund Olesen
586fbbc797 Add RISC-V arithmetic w/immediate operand encodings.
Add new instruction predicates to support the 'I' encoding recipe: IsSignedInt,
IsUnsignedInt used to test that an immediate operand is in the allowed range.
2016-08-24 08:53:44 -07:00
Jakob Stoklund Olesen
b8509c6273 Add bitwise operations with an immediate operand. 2016-08-24 08:41:05 -07:00
Jakob Stoklund Olesen
077c5ce1f6 Create format fields for immediate operands.
Each InstructionFormat instance gets data members corresponding to its immediate
operands, so the can be referred to as BinaryImm.imm, for example.

This will be used to construct instruction predicates.
2016-08-24 08:40:51 -07:00
Jakob Stoklund Olesen
9c5637902c Track the default member name for immediate operands.
Usually an instruction firmat has only a single immediate operand called 'imm',
or 'cond' if it is one of the condigtion codes. Add a 'default_member' field to
ImmediateKind to keep track of this default member name in the InstructionData
struct.
2016-08-24 08:40:51 -07:00
Jakob Stoklund Olesen
2f322e3d0e Add script for Python 3 compat checks. 2016-08-24 08:40:51 -07:00
Jakob Stoklund Olesen
9da6847805 Python 3 compat.
Try to keep our Python sources compatible with both Python 2.7 and 3.

Check with 'pylint --py3k' and 'python -3'.
2016-08-23 16:35:58 -07:00
Morgan Phillips
c0a9a4fe46 Move dominator tree test cases to their own folder. 2016-08-23 15:42:31 -07:00
Morgan Phillips
bdefbdeccc rustfmt changes 2016-08-23 13:37:04 -07:00
Morgan Phillips
d8c587a1bf Synchronize regex versions 2016-08-23 13:34:40 -07:00
Morgan Phillips
a9e302e861 Modify the dominator tree's intersect method to interact with Basic Blocks
Corresponding changes to test cases are also included.
2016-08-23 13:34:40 -07:00
Jakob Stoklund Olesen
96b648056d Upgrade to rustfmt 0.6.0 2016-08-23 11:01:08 -07:00
Jakob Stoklund Olesen
24870f0db9 Add RISC-V encodings for imediate shifts.
Also add the 32-bit shift instructions for RV64.
2016-08-19 15:56:09 -07:00
Jakob Stoklund Olesen
08168e9d50 Add rotate and shift instructions with immediate amounts. 2016-08-19 15:56:09 -07:00
Morgan Phillips
202088837b Merge branch 'master' of github.com:stoklund/cretonne 2016-08-18 14:39:02 -07:00
Morgan Phillips
9b8d2a04fb Add basic block information to the dominator tree.
To be complete the dominator tree must represent idoms as Ebb, Inst pairs, i.e.
bais blocks.
2016-08-18 14:37:32 -07:00
Jakob Stoklund Olesen
f9850b1405 Use shared quadratic probing for settings. 2016-08-18 13:45:50 -07:00
Jakob Stoklund Olesen
722a3a6ae6 Add a generic implementation of quadratic hash table probing.
We have multiple pre-computed constant hash tables that all use the same
quadratic probing algorithm.

Add a constant_hash Rust module to match the meta/constant_hash.py module.

Move the simple_hash() function into constant_hash. Its Python equivalent is in
the constant_hash.py module.
2016-08-18 13:44:17 -07:00
Jakob Stoklund Olesen
f17ea61593 Move ir::Function into a sub-module.
Keep the top-level ir module free of implementation details that are
inadvertently exposed to sub-modules.
2016-08-12 16:46:44 -07:00
Jakob Stoklund Olesen
f4258ae293 Use an EntityMap for stack slots.
Delete the StackSlots iterator and move the remaining StackSlotData into its
own module.
2016-08-12 16:44:39 -07:00
Jakob Stoklund Olesen
b266c28767 Re-export common types in the cretonne::ir module.
Clients should not have to navigate the ir sub-modules to find commonly used
types.
2016-08-12 16:11:38 -07:00
Jakob Stoklund Olesen
9d6e30df92 Remove tests/lib.rs to avoid running tests twice.
The 'cargo test' command simply compiles each 'tests/*.rs' and runs the
enclosed tests. The 'lib.rs' source would get run as an individual test.
2016-08-12 11:05:29 -07:00
Jakob Stoklund Olesen
f7f157fb71 Move integration tests into src/tools/tests.
The integration tests use both libcretonne and libreader, so moving them avoids
the circular dev-dependency.

Also go back to building everything under src/tools/target to avoid rebuilding
the libraries when cargo is invoked in different subdirectories. This speeds up
test-all.sh quite a bit.

Finally, skip the pure debug build. We build "cargo test" and "cargo build
--release" which should cover everything we need.
2016-08-12 10:43:10 -07:00
Jakob Stoklund Olesen
c998c79fe8 Generate code to precompute predicates.
Each ISA predicate is assigned a bit the the Flags struct, and a corresponding
method is generated.
2016-08-12 10:13:50 -07:00
Jakob Stoklund Olesen
13d33d5a7a Introduce predicates.
Predcates are boolean functions. There will be ISA predicates and instruction
predicates.

The ISA predicates will be turned into member functions on the generated Flags
structs.
2016-08-11 16:40:54 -07:00
Jakob Stoklund Olesen
1087aa67f0 Implement the machinery to create a TargetIsa.
Add an isa::lookup() function which serves as a target registry for creating
Box<TargetIsa> trait objects.

An isa::Builder makes it possible to confugure the trait object before it is
created.
2016-08-11 11:52:11 -07:00
Jakob Stoklund Olesen
1ae9a37796 Document ISA builder. 2016-08-10 15:48:19 -07:00
Jakob Stoklund Olesen
6e6ad1ef52 Add a settings::Builder data type.
- Move detail data structures into a settings::detail module to avoid polluting
  the settings namespace.

- Rename generated data types to 'Flags' in anticipation of computed predicate
  flags that can't be set. The Flags struct is immutable.

- Use a settings::Builder struct to manipulate settings, then pass it to
  Flags::new().
2016-08-10 15:47:06 -07:00
Jakob Stoklund Olesen
56cb249e13 Add support for enumerated settings.
The EnumSetting objects can take one of 256 named values.
2016-08-09 15:13:43 -07:00
Jakob Stoklund Olesen
530234ad32 Add settings::Stringwise.
This trait allows settings to be manipulated as strings, using descriptors and
constant hash-table lookups.

Amend gen_settings.py to generate the necessary constant tables.
2016-08-09 15:04:42 -07:00
Jakob Stoklund Olesen
24ec62d030 Move simple_hash into its own module. 2016-08-09 15:04:42 -07:00
Jakob Stoklund Olesen
4efb0efb44 Add ISA-dependent settings for RISC-V. 2016-08-05 16:19:46 -07:00
Jakob Stoklund Olesen
1925c1b2c2 Scaffolding for defining settings.
Settings can be defined globally or per-ISA. They are available to code through
a generated Settings struct with accessor methods per setting.
2016-08-05 15:50:57 -07:00
Jakob Stoklund Olesen
c679a2e746 Scaffold implementation of the TargetIsa trait.
More to come here.
2016-08-05 09:55:53 -07:00
Jakob Stoklund Olesen
1a4d07d437 Rename meta/target -> meta/isa.
Clarify terminology by always referring to a 'Target ISA' instead of just
'Target'. Use 'isa' as a module name instead of 'target' both in Rust and Python
code.

This is only to clarify terminology and not at all because Cargo insists on
using the 'target' sub-directory for build products. Oh, no. Not at all.
2016-08-04 11:50:19 -07:00
Jakob Stoklund Olesen
6d786113db Add an empty isa/riscv module scaffold.
Targeted ISAs will be defined as sub-modules of isa.
2016-08-04 11:39:25 -07:00
Jakob Stoklund Olesen
afdc4960d7 Don't sphinx-autobuild on Vim .swp file changes. 2016-08-04 11:28:38 -07:00
Jakob Stoklund Olesen
5a8293427d Verify that type variables have been fully bound.
The shift instructions have two type variables since the shift amount can be a
differently sized integer. Fix the RISC-V shift encodings to reflect this, and
allow i64 registers to be shifted by an i32 amount.
2016-08-04 10:21:48 -07:00
Jakob Stoklund Olesen
a1cc8af186 Use dot syntax to bind type variables on instructions.
Encodings need to refer to concrete instances of polymorphic instructions by
binding type variables. Allow dot syntax like iadd.i32 to do that.
2016-08-03 16:30:47 -07:00
Jakob Stoklund Olesen
4987282bbb Add an Encoding meta-language class.
Start adding some RISC-V encodings too as a way of testing the ergonomics.
2016-08-03 16:04:29 -07:00
Jakob Stoklund Olesen
66f14138bb Add an EncRecipe meta-language class.
Move the CPUMode reference from EncRecipe to the Encoding itself, allowing
EncRecipes to be shared between CPU modes. At least RISC-V should be able to
share some recipes between RV32 and RV64 modes.
2016-08-03 12:06:21 -07:00
Jakob Stoklund Olesen
eed6adb413 Add a CPUMode meta-language class. 2016-08-03 11:20:13 -07:00
Jakob Stoklund Olesen
a67ec211a4 Document binary encodings.
Describe the meta-language data structures that are built to represent
instruction encodings.

Begin a metaref glossary.
2016-08-02 16:02:20 -07:00
Jakob Stoklund Olesen
82a85961ff Add PrimaryEntityData marker trait.
Require this trait on the value type stored in an EntityMap to 'unlock' the
methods intended for primary entity maps that are allowed to create references
with the 'push method.

This prevents accidentally depending on these methods in secondary maps.
2016-08-01 19:52:57 -07:00
Morgan Phillips
4c0b59a947 Merge branch 'master' of github.com:stoklund/cretonne into cfg-fix 2016-08-01 18:06:59 -07:00
Morgan Phillips
283f3ea48e Remove uses of EntityMap::len. 2016-08-01 18:04:25 -07:00
Jakob Stoklund Olesen
11f65fff20 Remove the cfg::predecessors_iter() method and iterator.
This iterator enumerates all EBB references whether they are in the layout or
not. That is usually not what is needed when working with the CFG.

It is better to iterate over EBB referrences in layout order, or in reverse
post-order and then call the get_predecessors() method for each Ebb reference.

See the new implementation of print_cfg::cfg_connections().
2016-08-01 15:18:34 -07:00
Jakob Stoklund Olesen
bf24ae229c Print CFG edges from func.layout instead of cfg.predecessors_iter.
EBBs not in the layout should never be printed as part of the CFG.
2016-08-01 15:18:34 -07:00
Morgan Phillips
e22efd2748 Improve the structure and comments of the module. 2016-08-01 15:00:08 -07:00
Morgan Phillips
f2e9c88b45 Remove println\! 2016-08-01 12:15:08 -07:00