* Use FxHashMap instead of HashMap for better performance
* Replace the binary search in the coalescing pass with a FxHashMap
This speeds up coalescing by up to 16% and overall compilation by 9%
* Generate debug symbols in optimized builds.
This allows profiling tools to provide more accurate information,
especially details about inlined functions.
* Rewrite and optimize partition_slice
This improves the performance of the register allocation passes
which use LiveValueTracker.
With new versions of cretonne-codegen:
- Non-colocated calls are emitted as a movabs with an indirect call.
This uses an Abs8 relocation.
- Colocated calls are emitted as direct calls, but the "+ 4"
adjustment is now folded into the addend, so we don't need to
handle it explicitly in the X86PCRel4 code anymore.
The wasm function index space consists of the index space of the
imported functions concatenated with the index space of the defined
functions. When iterating through function definitions, it's necessary
to adjust the index when a function-index-space index is needed.
Include the name of the variable when diagnosing uses and defs of
undeclared variables. And, add an assert to def_var to check that the
declared type of a variable matches the value type of the def.
With this change, `Variable` implementations must now implement `Debug`.
* added wip translate_module fuzzer
* use local binaryen-rs fork (with shim) for fuzzing
* minor doc cleanup
* check fuzzer integration via CI
* switch back to upstream binaryen-rs; add forgotten integration test directive
* Start adding the load_complex and store_complex instructions.
N.b.:
The text format is not correct yet. Requires changes to the lexer and parser.
I'm not sure why I needed to change the RuntimeError to Exception yet. Will fix.
* Get first few encodings of load_complex working. Still needs var args type checking.
* Clean up ModRM helper functions in binemit.
* Implement 32-bit displace for load_complex
* Use encoding helpers instead of doing them all by hand
* Initial implementation of store_complex
* Parse value list for load/store_complex with + as delimiter. Looks nice.
* Add sign/zero-extension and size variants for load_complex.
* Add size variants of store_complex.
* Add asm helper lines to load/store complex bin tests.
* Example of length-checking the instruction ValueList for an encoding. Extremely questionable implementation.
* Fix Python linting issues
* First draft of postopt pass to fold adds and loads into load_complex. Just simple loads for now.
* Optimization pass now works with all types of loads.
* Add store+add -> store_complex to postopt pass
* Put complex address optimization behind ISA flag.
* Add load/store complex for f32 and f64
* Fixes changes to lexer that broke NaN parsing.
Abstracts away the repeated checks for whether or not the characters
following a + or - are going to be parsed as a number or not.
* Fix formatting issues
* Fix register restrictions for complex addresses.
* Encoding tests for x86-32.
* Add documentation for newly added instructions, recipes, and cdsl changes.
* Fix python formatting again
* Apply value-list length predicates to all LoadComplex and StoreComplex instructions.
* Add predicate types to new encoding helpers for mypy.
* Import FieldPredicate to satisfy mypy.
* Add and fix some "asm" strings in the encoding tests.
* Line-up 'bin' comments in x86/binary64 test
* Test parsing of offset-less store_complex instruction.
* 'sNaN' not 'sNan'
* Bounds check the lookup for polymorphic typevar operand.
* Fix encodings for istore16_complex.
* initial set of work for windows fastcall (x64) call convention
- call conventions: rename `fastcall` to `windows_fastcall`
- add initial set of filetests
- ensure arguments are written after the shadow space/store (offset-wise)
The shadow space available before the arguments (range 0..32)
is not used as spill space yet.
* address review feedback
* x86 recipes: emit StackOverflow trap for all sp-relative loads and stores
* x86 recipes: emit StackOverflow trap for push and pop
* x86 binary filetests: add stk_ovf trap annotations
* Remove the mypy version constraint and set strict_optional to False.
* Add type annotations for `ISA` variables.
mypy 0.600 seems to require explicit annotations here.
* Annotate the ISA variables in the defs.py files too.
* cretonne-faerie: add a translation mechanism for LibCalls
* cretonne-faerie: docs for libcall_names, rustfmt
* cretonne-faerie: switch libcall naming to use a closure
* travis: debug mypy version
* travis: pin mypy to 0.521
mypy released 0.600 today and even with `--no-strict-optional` flag
passed to it (in lib/codegen/meta/check.sh) it fails to infer the type
of values that did not need type annotations in the past
* faerie-backend: fix swapped nearbyint functions
* cretonne-faerie: move boxing out of FaerieBuilder
@steffengy noticed that the code to round allocation sizes up to the
neareset page size was incorrect. It was masking off the low bits rather
than the high bits.
Also, while here, add more comments to `Memory`'s implementation.
The dbg! macro expands to nothing in no_std mode, so variables that are
only used for debugging prompt unused variable warnings.
Also, allow unstable_features in no_std builds, since they use
feature(alloc), which is an unstable feature.
* test-no_std: use cargo +nightly
assume folks have rustup set to use stable by default
* cretonne-module, -faerie, -simplejit: use new ModuleError enum
CtonError is not really appropriate for use in the module system.
Instead, create a new enum ModuleError, which implements failure::Fail
(works with no_std). Translate existing panics and unimplemented
error cases to return ModuleErrors.
* cretonne-faerie: export FaerieProduct
* cretonne-module: expose FuncOrDataId, and Module::get_name to lookup
This is helpful for looking up a name that has already been declared.
Also, implement FuncOrDataId -> ExternalName conversion.
* cretonne-faerie: depend on faerie 0.3.0
which has bugfix for data relocations
* cretonne-module: change InvalidDefinition to InvalidImportDefinition
per dan's code review. plus another typo fix
* cretonne-faerie: add optional manifest of all traps from codegen
* cretonne-module: provide more context in panics
* cretonne-faerie: updates to docs
* cretonne-faerie: return an Err instead of debug_assert when isa not pic
regmove, regfill, and regspill have immediates which aren't value
operands, so they aren't in the set of things that can be described by
the existing constraint system. Consequently, constraints saying that
the non-REX encodings only support registers that don't need REX
prefixes don't work. Fow now, just remove the non-REX encodings, so
that they don't get selected when they aren't valid.
This fixes the last known issue with instruction shrinking, so it can
be re-enabled.