Commit Graph

11145 Commits

Author SHA1 Message Date
Denis Merigoux
b74723cb68 Added Intel x86-64 encodings for 64bit loads and store instructions (#127)
* Added Intel x86-64 encodings for 64bit loads and store instructions

* Using GPR registers instead of ABCD for istore8 with REX prefix
Fixed testing of 64bit intel encoding

* Emit REX and REX-less encodings for optional REX prefix
Value renumbering in binary64.cton
2017-07-31 14:52:39 -07:00
Jakob Stoklund Olesen
54534e2147 Add Intel legalization for division and multiplication.
These operations need custom legalization in order to use Intel's div
and idiv instructions.
2017-07-28 16:41:59 -07:00
Jakob Stoklund Olesen
be8331d0a0 Add Intel legalization for division and multiplication.
These operations need custom legalization in order to use Intel's div
and idiv instructions.
2017-07-28 16:41:59 -07:00
Jakob Stoklund Olesen
99d34cbbd7 Try to depend only on the ir module being in scope.
Generated code should used qualified names assuming that `ir` is in
scope, not everything else.
2017-07-28 16:33:02 -07:00
Jakob Stoklund Olesen
6609d7baf4 Try to depend only on the ir module being in scope.
Generated code should used qualified names assuming that `ir` is in
scope, not everything else.
2017-07-28 16:33:02 -07:00
Jakob Stoklund Olesen
542bad0758 Evaluate instruction predicates during legalization.
The generated legalization code needs to evaluate any instruction
patterns on the input pattern being matched.

Emit predicate checking code inside the InstructionFormat pattern match
where all the instruction's immediate fields are available to the
predicate code.

Also make sure an `args` array is available for any type predicates to
evaluate correctly.
2017-07-28 15:22:53 -07:00
Jakob Stoklund Olesen
1968ebad58 Evaluate instruction predicates during legalization.
The generated legalization code needs to evaluate any instruction
patterns on the input pattern being matched.

Emit predicate checking code inside the InstructionFormat pattern match
where all the instruction's immediate fields are available to the
predicate code.

Also make sure an `args` array is available for any type predicates to
evaluate correctly.
2017-07-28 15:22:53 -07:00
Jakob Stoklund Olesen
b1508d8588 Include bound typevars in the instruction predicate.
We already do this for the encoding tables, but the instruction
predicates computed by Apply.inst_predicate() did not include them.

Make sure we don't duplicate the type check in the Encoding constructor
when passed an Apply AST node.
2017-07-28 14:56:45 -07:00
Jakob Stoklund Olesen
e2bf4f8981 Include bound typevars in the instruction predicate.
We already do this for the encoding tables, but the instruction
predicates computed by Apply.inst_predicate() did not include them.

Make sure we don't duplicate the type check in the Encoding constructor
when passed an Apply AST node.
2017-07-28 14:56:45 -07:00
Jakob Stoklund Olesen
939f188e27 Add an inst.all_typevars() method.
Get all type variables controlling an instruction, whether it is
polymorphic or not.
2017-07-28 14:45:56 -07:00
Jakob Stoklund Olesen
9df0b09301 Add an inst.all_typevars() method.
Get all type variables controlling an instruction, whether it is
polymorphic or not.
2017-07-28 14:45:56 -07:00
Jakob Stoklund Olesen
1f02d1f880 Allow for multiple legalization patterns for the same opcode.
Each input pattern can have a predicate in addition to an opcode being
matched. When an opcode has multiple patterns, execute the first pattern
with a true predicate.

The predicates can be type checks or instruction predicates checking
immediate fields.
2017-07-28 13:54:25 -07:00
Jakob Stoklund Olesen
dd5bbc298e Allow for multiple legalization patterns for the same opcode.
Each input pattern can have a predicate in addition to an opcode being
matched. When an opcode has multiple patterns, execute the first pattern
with a true predicate.

The predicates can be type checks or instruction predicates checking
immediate fields.
2017-07-28 13:54:25 -07:00
Jakob Stoklund Olesen
b5076108c1 Support constant integers in AST expressions.
Make it possible to write AST nodes: iconst.i32(imm64(0)).
2017-07-28 13:54:25 -07:00
Jakob Stoklund Olesen
222ccae4b2 Support constant integers in AST expressions.
Make it possible to write AST nodes: iconst.i32(imm64(0)).
2017-07-28 13:54:25 -07:00
Dimo
ede02e0f97 Cleanup, typechecking and documentation nits 2017-07-28 10:47:08 -07:00
Dimo
a324d60ccc Cleanup, typechecking and documentation nits 2017-07-28 10:47:08 -07:00
Dimo
1bbe644080 Add semantics for several more iadd with carry; Add xform_correct() and doc cleanup 2017-07-28 10:47:08 -07:00
Dimo
9767654dd7 Add semantics for several more iadd with carry; Add xform_correct() and doc cleanup 2017-07-28 10:47:08 -07:00
Dimo
b5e1e4d454 Add smtlib.py 2017-07-28 10:47:08 -07:00
Dimo
c3092d680f Add smtlib.py 2017-07-28 10:47:08 -07:00
Dimo
eadb4cd39a Fix broken test_elaborate tests after the moving of is_concrete/cleanup_concrete_rtl 2017-07-28 10:47:08 -07:00
Dimo
59e204cec2 Fix broken test_elaborate tests after the moving of is_concrete/cleanup_concrete_rtl 2017-07-28 10:47:08 -07:00
Dimo
42e0476cf4 Add primitive bvult, bvzeroext; Add semantics for bextend, icmp (partial - only for <) iadd_cout 2017-07-28 10:47:08 -07:00
Dimo
e346bd50c8 Add primitive bvult, bvzeroext; Add semantics for bextend, icmp (partial - only for <) iadd_cout 2017-07-28 10:47:08 -07:00
Dimo
51ee47f01e Add Rtl.free_vars() 2017-07-28 10:47:08 -07:00
Dimo
3fd43fd006 Add Rtl.free_vars() 2017-07-28 10:47:08 -07:00
Dimo
1ddee38895 cleanup_semantics() should remove repeated prim_from_bv(x) 2017-07-28 10:47:08 -07:00
Dimo
ec9e9bd1ca cleanup_semantics() should remove repeated prim_from_bv(x) 2017-07-28 10:47:08 -07:00
Dimo
11014ec544 Nit: Make elaborate return a new Rtl instead of modifying the existing rtl inplace 2017-07-28 10:47:08 -07:00
Dimo
93b57a5209 Nit: Make elaborate return a new Rtl instead of modifying the existing rtl inplace 2017-07-28 10:47:08 -07:00
Dimo
ef4ca676a4 Move apply() -> Xform.apply(); is_concrete_rtl() -> Rtl.is_concrete(); cleanup_concrete_rtl() -> Rtl.cleanup_concrete_rtl(). Documnetation nits in semantics.elaborate 2017-07-28 10:47:08 -07:00
Dimo
80a42fdeaa Move apply() -> Xform.apply(); is_concrete_rtl() -> Rtl.is_concrete(); cleanup_concrete_rtl() -> Rtl.cleanup_concrete_rtl(). Documnetation nits in semantics.elaborate 2017-07-28 10:47:08 -07:00
Dimo
71f1646675 With multiple semantic transforms mentioning Enumerators, it may be possible for there not to be a substitution from the concrete rtl to some of the transforms. This is not an error - just a case where a given semantic transform doesnt apply. (e.g. icmp being described by different transforms with concrete intcc condition codes) 2017-07-28 10:47:08 -07:00
Dimo
a92021ebce With multiple semantic transforms mentioning Enumerators, it may be possible for there not to be a substitution from the concrete rtl to some of the transforms. This is not an error - just a case where a given semantic transform doesnt apply. (e.g. icmp being described by different transforms with concrete intcc condition codes) 2017-07-28 10:47:08 -07:00
Dimo
5f77369053 Fix up a couple of test changed by unifying control tv first 2017-07-28 10:47:08 -07:00
Dimo
a2b60108fd Fix up a couple of test changed by unifying control tv first 2017-07-28 10:47:08 -07:00
Dimo
100fbe94dd When doing ti on a polymorphic definition first unify the control variable, then the rest. 2017-07-28 10:47:08 -07:00
Dimo
7d1a9c7d81 When doing ti on a polymorphic definition first unify the control variable, then the rest. 2017-07-28 10:47:08 -07:00
Dimo
d5ca31a6fd bextend/breduce need constraints 2017-07-28 10:47:08 -07:00
Dimo
2387745847 bextend/breduce need constraints 2017-07-28 10:47:08 -07:00
Jakob Stoklund Olesen
2aca35a9aa Return a function pointer from TargetIsa::encode().
Replace the isa::Legalize enumeration with a function pointer. This
allows an ISA to define its own specific legalization actions instead of
relying on the default two.

Generate a LEGALIZE_ACTIONS table for each ISA which contains
legalization function pointers indexed by the legalization codes that
are already in the encoding tables. Include this table in
isa/*/enc_tables.rs.

Give the `Encodings` iterator a reference to the action table and change
its `legalize()` method to return a function pointer instead of an
ISA-specific code.

The Result<> returned from TargetIsa::encode() no longer implements
Debug, so eliminate uses of unwrap and expect on that type.
2017-07-27 17:08:00 -07:00
Jakob Stoklund Olesen
b04a2c30d2 Return a function pointer from TargetIsa::encode().
Replace the isa::Legalize enumeration with a function pointer. This
allows an ISA to define its own specific legalization actions instead of
relying on the default two.

Generate a LEGALIZE_ACTIONS table for each ISA which contains
legalization function pointers indexed by the legalization codes that
are already in the encoding tables. Include this table in
isa/*/enc_tables.rs.

Give the `Encodings` iterator a reference to the action table and change
its `legalize()` method to return a function pointer instead of an
ISA-specific code.

The Result<> returned from TargetIsa::encode() no longer implements
Debug, so eliminate uses of unwrap and expect on that type.
2017-07-27 17:08:00 -07:00
Jakob Stoklund Olesen
d1353bba05 Assign legalization codes early.
Make sure legalization codes are assigned by TargetIsa::finish() such
that they can be accessed by multiple gen_* drivers.
2017-07-27 17:08:00 -07:00
Jakob Stoklund Olesen
1bbc06e2d6 Assign legalization codes early.
Make sure legalization codes are assigned by TargetIsa::finish() such
that they can be accessed by multiple gen_* drivers.
2017-07-27 17:08:00 -07:00
Denis Merigoux
b547b78683 Bugfix: encode function wasn't calling legalize function properly 2017-07-27 16:49:09 -07:00
Denis Merigoux
f6af7be205 Bugfix: encode function wasn't calling legalize function properly 2017-07-27 16:49:09 -07:00
Jakob Stoklund Olesen
051aaed43e Add Intel encodings for more conversion instructions.
The following instructions have simple encodings:

- bitcast.f32.i32
- bitcast.i32.f32
- bitcast.f64.i64
- bitcast.i64.f64
- fpromote.f64.f32
- fdemote.f32.f64

Also add helper functions enc_flt() and enc_i32_i64 to
intel.encodings.py for generating the common set of encodings for an
instruction: I32, I64 w/REX, I64 w/o REX.
2017-07-27 11:08:41 -07:00
Jakob Stoklund Olesen
ebf5c80959 Add Intel encodings for more conversion instructions.
The following instructions have simple encodings:

- bitcast.f32.i32
- bitcast.i32.f32
- bitcast.f64.i64
- bitcast.i64.f64
- fpromote.f64.f32
- fdemote.f32.f64

Also add helper functions enc_flt() and enc_i32_i64 to
intel.encodings.py for generating the common set of encodings for an
instruction: I32, I64 w/REX, I64 w/o REX.
2017-07-27 11:08:41 -07:00
Jakob Stoklund Olesen
4cffb7fe53 Add support for type variable wildcards in bound instructions.
Instructions will multiple type variables can now use `any` to indicate
encodings that don't care about the value of a secondary type variable:

    ishl.i32.any instead of ishl.i32.i32

This is only allowed for secondary type variables (which are converted
to instruction predicates). The controlling type variable must still be
fully specified because it is used to key the encoding tables.
2017-07-26 14:55:26 -07:00