aboutsummaryrefslogtreecommitdiff
path: root/src/arch/wasm/CodeGen.zig
AgeCommit message (Collapse)Author
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
2022-06-09introduce std.debug.TraceAndrew Kelley
And use it to debug a LazySrcLoc in stage2 that is set to a bogus value. The actual fix in this commit is: ```diff - try sema.emitBackwardBranch(&child_block, call_src); + try sema.emitBackwardBranch(block, call_src); ```
2022-06-06Merge pull request #11783 from ziglang/stage2-tryAndrew Kelley
introduce a "try" ZIR and AIR instruction
2022-06-06dwarf: fix incorrect type reloc for unionsJakub Konka
Split type relocs into two kinds: local and global. Global relocs use a global type resolver and calculate offset to the existing definition of a type abbreviation. Local relocs use offset in the abbrev section of the containing atom plus addend to generate a local relocation.
2022-06-05wasm: Implement `try` instructionLuuk de Gram
2022-06-05stage2: implement the new "try" ZIR/AIR instructionAndrew Kelley
Implements semantic analysis for the new try/try_inline ZIR instruction. Adds the new try/try_ptr AIR instructions and implements them for the LLVM backend. Fixes not calling rvalue() for tryExpr in AstGen. This is part of an effort to implement #11772.
2022-05-27math: make `cast` return optional instead of an errorAli Chraghi
2022-05-24stage2: fixes for error unions, optionals, errorsAndrew Kelley
* `?E` where E is an error set with only one field now lowers the same as `bool`. * Fix implementation of errUnionErrOffset and errUnionPayloadOffset to properly compute the offset of each field. Also name them the same as the corresponding LLVM functions and have the same function signature, to avoid confusion. This fixes a bug where wasm was passing the error union type instead of the payload type. * Fix C backend handling of optionals with zero-bit payload types. * C backend: separate out airOptionalPayload and airOptionalPayloadPtr which reduces branching and cleans up control flow. * Make Type.isNoReturn return true for error sets with no fields. * Make `?error{}` have only one possible value (null).
2022-05-24wasm: use errUnionPayloadOffset and errUnionErrOffset from codegen.zigJakub Konka
2022-05-24stage2: make `?anyerror` represented the same as `anyerror`Andrew Kelley
I was able to get the backend implementation working on LLVM and the C backend, but I'm going to ask for some help on the other backends.
2022-05-24wasm: Fixes for error union semanticsLuuk de Gram
2022-05-17stage2: fix pointer arithmetic result typeAndrew Kelley
This makes it so the result of doing pointer arithmetic creates a new pointer type that has adjusted alignment.