aboutsummaryrefslogtreecommitdiff
path: root/src/arch/wasm/CodeGen.zig
AgeCommit message (Collapse)Author
2022-10-21stage2: Add `.save_err_return_trace_index` AIR opCody Tapscott
This is encoded as a primitive AIR instruction to resolve one corner case: A function may include a `catch { ... }` or `else |err| { ... }` block but not call any errorable fn. In that case, there is no error return trace to save the index of and codegen needs to avoid interacting with the non-existing error trace. By using a primitive AIR op, we can depend on Liveness to mark this unused in this corner case.
2022-10-16wasm: rename 'self' to more explanatory nameLuuk de Gram
'Self' isn't a very good name to describe what it does. This commit changes the type name into `CodeGen` and the parameter to `func` as we're generating code for a function. With this change, the backend's coding style is in line with the self-hosted Wasm-linker.
2022-10-16wasm: re-use operandsLuuk de Gram
When we return an operand directly as a result, we must call `reuseOperand`. This commit ensures it's done for all currently- implemented AIR instructions.
2022-10-16wasm: allow merging single branchesLuuk de Gram
Rather than accepting a canonical branch and a target branch we allow to directly merge a branch into the parent branch. This is possible as there's no overlapping and we have infinite registers to our availability. This makes merging a lot simpler.
2022-10-16wasm: correctly get the type of a local for freeLuuk de Gram
When determining the type of a local (read: register), we would previously subtract the stack locals also. However, this locals are also within the same `locals` list, meaning the type of the local we were retrieving was off by 2. This could create a validation error when we re-use a local of a different type.
2022-10-16wasm: implement branchingLuuk de Gram
Upon a branch, we only allow locals to be freed which were allocated within the same branch as where they die. This ensures that when two or more branches target the same operand we do not try to free it more than once. This does however not implement freeing the local upon branch merging yet.
2022-10-16wasm: de -and increment reference count localsLuuk de Gram
When reusing an operand it increases the reference count, then when an operand dies it will only decrease the reference count. When this reaches 0, the local will be virtually freed, meaning it can be re-used for a new local.
2022-10-16wasm: reference count localsLuuk de Gram
By reference counting the locals, we can ensure that when we free a local, no local will be reused while it still has references pointing to it. This prevents misscompilations. The compiler will also panic if we free a local more than we reference it, introducing extra safety to ensure they match up.
2022-10-16wasm: use liveness analysis for localsLuuk de Gram
This hooks reusal of locals into liveness analysis. Meaning that when an operand dies, and is a local, it will automatically be freed so it can be re-used when a new local is required. The result of this, is a lower allocation required for locals. Having less locals means smaller binary size, as well as faster compilation speed when loaded by the runtime.
2022-10-12stage2: add @addrSpaceCast builtinRobin Voetter
2022-10-12codegen: add support for lowering .field_ptr on a slicejacobly0
Closes #13068
2022-09-07wasm: fix memory leakLuuk de Gram
2022-08-30test/link: add test for extern resolutionLuuk de Gram
Adds a linker tests to verify extern/undefined symbols representing non-functions are being resolved correctly.
2022-08-30wasm: create relocations for extern declsLuuk de Gram
This also fixes performing relocations for data symbols of which the target symbol exists in an external object file. We do this by checking if the target symbol was discarded, and if so: get the new location so that we can find the corresponding atom that belongs to said new location. Previously it would always assume the symbol would live in the same file as the atom/symbol that is doing the relocation.
2022-08-18wasm: fix callInstrinsic return valueLuuk de Gram
Rather than storing it in a local and returning that, we now keep this on the stack as all internal functions expect it to be on the stack already and therefore were generating extra `local.set` instructions.
2022-08-12stage2: generate a switch for `@errSetCast` safetyVeikka Tuominen
2022-08-11wasm: free unused localsLuuk de Gram
When a local is no longer referenced or used, free it so the local can be re-used by another instruction. This means we generate less locals. Freeing this local is a manual action and must only be used on temporaries or where we are sure the local is not referenced by a different AIR instruction, as that creates UB. We now also no longer store a `WValue` when its tag is set to `none` as those may never be referenced by any AIR instruction. An assertion is done to make sure we never store a reference to a `stack` value in our resolved instructions.
2022-08-11wasm: keep `load` values on the stackLuuk de Gram
We internally use a lot of `load`'s that used to put the result in a newly created local. For instance, when is considered byRef or when we need a specific field/element/bytes from a larger type. However, sometimes we want to directly use this value and then forget about it, which means storing it in a local first is wasted instructions as well as wasted locals that shouldn't be generated in the first place. With this change it's explicit and requires the usage of `toLocal`.
2022-08-11wasm: leave `signedAbsValue` values on the stackLuuk de Gram
2022-08-11wasm: `wrapOperand` - leave value on the stackLuuk de Gram
This also does it for `wrapBinOp` which internally uses the already refactored `binOp` and `wrapOperand` heavily simplifying this function and not duplicate the logic from `binOp`
2022-08-11wasm: Keep `intcast` values on stackLuuk de Gram
2022-08-11wasm: keep result of `cmp` on the stackLuuk de Gram
By keeping the result on the stack, we prevent codegen from generating unneccesary locals when we have subsequent instructions that do not have to be re-used.
2022-08-11wasm: `binOp` leave value on stackLuuk de Gram
Rather than always creating a new local and storing the result of a binary operation into said local, we now leave it on top of the stack. This allows for better codegen as we need less instructions, as well as less total amount of locals.
2022-08-11wasm: Use free-lists for unused localsLuuk de Gram
When a local is no longer needed (for instance, it was used as a temporary during arithmetic), it can be appended to one of the typed freelists. This allows us to re-use locals and therefore require less locals, reducing the binary size, as well as runtime initialization.
2022-08-05stage2: add runtime safety for invalid enum valuesVeikka Tuominen
2022-08-01Removed param_names from Fn inside Module.zigantlilja
Removed the copy of param_names inside of Fn and changed to implementation of getParamName to fetch to parameter name from the ZIR. The signature of getParamName was also changed to take an additional *Module argument.
2022-07-31wasm: fix typo in CodeGen.zigIkko Ashimine
occured -> occurred
2022-07-27std.fmt: add more invalid format string errorsr00ster91
2022-07-25wasm: pass correct abi-size for scalar valuesLuuk de Gram
When returning an aggregate type that contains a scalar value (nested), its abi-size is passed by bits, rather than bytes to `buildOpcode`.
2022-07-23stage2: implement `@setFloatMode`Veikka Tuominen
2022-06-30stage2: lower float negation explicitlyAndrew Kelley
Rather than lowering float negation as `0.0 - x`. * Add AIR instruction for float negation. * Add compiler-rt functions for f128, f80 negation closes #11853
2022-06-24wasm: more f16 support and cleanup of intrinsicsLuuk de Gram
`genFunctype` now accepts calling convention, param types, and return type as part of its function signature rather than `fnData`. This means we no longer have to create a dummy for our intrinsic call abstraction. This also adds support for f16 division and builtins such as `@ceil` & more.
2022-06-24wasm: Implement `@mulAdd` for f16Luuk de Gram
Implements `@mulAdd` for floats with bitsize 16, where it generates a call into compiler-rt's `fmaf` function. Note that arguments for fmaf are different in order than `@mulAdd`.
2022-06-24wasm: Implement basic f16 supportLuuk de Gram
This implements binary operations and comparisons for floats with bitsize 16. It does this by calling into compiler-rt to first extend the float to 32 bits, perform the operation, and then finally truncate back to 16 bits. When loading and storing the f16, we do this as an unsigned 16bit integer.
2022-06-24link: Implement API to get global symbol indexLuuk de Gram
2022-06-24wasm: Create compiler-rt symbols and loweringLuuk de Gram
Implements the creation of an undefined symbol for a compiler-rt intrinsic. Also implements the building of the function call to said compiler-rt intrinsic.
2022-06-19wasm: fixes for signed saturationLuuk de Gram
2022-06-19wasm: saturating shift-left for signed integersLuuk de Gram
2022-06-19wasm: saturating shift-left for unsigned integersLuuk de Gram
2022-06-19wasm: saturating add and sub for signed integersLuuk de Gram
2022-06-19wasm: implement saturating add, sub for unsignedLuuk de Gram
Implements +| and -| for unsigned integers <= 64 bits.
2022-06-12Merge pull request #11837 from Vexu/stage2Andrew Kelley
Fix (nearly) all stage2 crashes when testing stdlib
2022-06-11stage2: make `error{}` the same size as `anyerror`Veikka Tuominen
Having `error{}` be a zero bit type causes issues when it interracts with empty inferred error sets which are the same size as `anyerror`.
2022-06-11wasm: implement `@ceil`, `@floor` and `@trunc`Luuk de Gram
2022-06-11wasm: optimize & simplify sign extensionLuuk de Gram
Rather than storing all the shifts in temporaries, we perform the correct shifting without temporaries. This makes the runtime code more performant and also the backend code is simplified as we have a singular abstraction.
2022-06-11wasm: implement `@divFloor` for signed integersLuuk de Gram
2022-06-11wasm: signed integer division (non-floor)Luuk de Gram
Implements the non-floor variants of signed integer division.
2022-06-11wasm: support all `@div{trunc/floor/exact}` opsLuuk de Gram
This does however not support floats of bitsizes different than 32 or 64. f16, f80, f126 will require support for compiler-rt and are out-of-scope for this commit. Signed integers are currently not supported either.
2022-06-11wasm:`@byteSwap` for 24 bit integersLuuk de Gram
2022-06-11wasm: implement `@byteSwap` for 16/32bit integersLuuk de Gram