| # Copyright (C) 2015-2017 Apple Inc. All rights reserved. |
| # |
| # Redistribution and use in source and binary forms, with or without |
| # modification, are permitted provided that the following conditions |
| # are met: |
| # 1. Redistributions of source code must retain the above copyright |
| # notice, this list of conditions and the following disclaimer. |
| # 2. Redistributions in binary form must reproduce the above copyright |
| # notice, this list of conditions and the following disclaimer in the |
| # documentation and/or other materials provided with the distribution. |
| # |
| # THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' |
| # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, |
| # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
| # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS |
| # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
| # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
| # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
| # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF |
| # THE POSSIBILITY OF SUCH DAMAGE. |
| |
| # Syllabus: |
| # |
| # Examples of some roles, types, and widths: |
| # U:G:32 => use of the low 32 bits of a general-purpose register or value |
| # D:G:32 => def of the low 32 bits of a general-purpose register or value |
| # UD:G:32 => use and def of the low 32 bits of a general-purpose register or value |
| # U:G:64 => use of the low 64 bits of a general-purpose register or value |
| # ZD:G:32 => def of all bits of a general-purpose register, where all but the low 32 bits are guaranteed to be zeroed. |
| # UA:G:Ptr => UseAddr (see comment in Arg.h) |
| # U:F:32 => use of a float register or value |
| # U:F:64 => use of a double register or value |
| # D:F:32 => def of a float register or value |
| # UD:F:32 => use and def of a float register or value |
| # S:F:32 => scratch float register. |
| # |
| # Argument kinds: |
| # Tmp => temporary or register |
| # Imm => 32-bit immediate int |
| # BigImm => TrustedImm64 |
| # Addr => address as temporary/register+offset |
| # Index => BaseIndex address |
| # Abs => AbsoluteAddress |
| # |
| # The parser views these things as keywords, and understands that they fall into two distinct classes |
| # of things. So, although this file uses a particular indentation style, none of the whitespace or |
| # even newlines are meaningful to the parser. For example, you could write: |
| # |
| # Foo42 U:G:32, UD:F:32 Imm, Tmp Addr, Tmp |
| # |
| # And the parser would know that this is the same as: |
| # |
| # Foo42 U:G:32, UD:F:32 |
| # Imm, Tmp |
| # Addr, Tmp |
| # |
| # I.e. a two-form instruction that uses a GPR or an int immediate and uses+defs a float register. |
| # |
| # Any opcode or opcode form can be preceded with an architecture list, which restricts the opcode to the |
| # union of those architectures. For example, if this is the only overload of the opcode, then it makes the |
| # opcode only available on x86_64: |
| # |
| # x86_64: Fuzz UD:G:64, D:G:64 |
| # Tmp, Tmp |
| # Tmp, Addr |
| # |
| # But this only restricts the two-operand form, the other form is allowed on all architectures: |
| # |
| # x86_64: Fuzz UD:G:64, D:G:64 |
| # Tmp, Tmp |
| # Tmp, Addr |
| # Fuzz UD:G:Ptr, D:G:Ptr, U:F:Ptr |
| # Tmp, Tmp, Tmp |
| # Tmp, Addr, Tmp |
| # |
| # And you can also restrict individual forms: |
| # |
| # Thingy UD:G:32, D:G:32 |
| # Tmp, Tmp |
| # arm64: Tmp, Addr |
| # |
| # Additionally, you can have an intersection between the architectures of the opcode overload and the |
| # form. In this example, the version that takes an address is only available on armv7 while the other |
| # versions are available on armv7 or x86_64: |
| # |
| # x86_64 armv7: Buzz U:G:32, UD:F:32 |
| # Tmp, Tmp |
| # Imm, Tmp |
| # armv7: Addr, Tmp |
| # |
| # Finally, you can specify architectures using helpful architecture groups. Here are all of the |
| # architecture keywords that we support: |
| # |
| # x86: means x86-32 or x86-64. |
| # x86_32: means just x86-32. |
| # x86_64: means just x86-64. |
| # arm: means armv7 or arm64. |
| # armv7: means just armv7. |
| # arm64: means just arm64. |
| # 32: means x86-32 or armv7. |
| # 64: means x86-64 or arm64. |
| |
| # Note that the opcodes here have a leading capital (Add32) but must correspond to MacroAssembler |
| # API that has a leading lower-case (add32). |
| |
| Nop |
| |
| Add32 U:G:32, U:G:32, ZD:G:32 |
| Imm, Tmp, Tmp |
| Tmp, Tmp, Tmp |
| |
| Add32 U:G:32, UZD:G:32 |
| Tmp, Tmp |
| x86: Imm, Addr |
| x86: Imm, Index |
| Imm, Tmp |
| x86: Addr, Tmp |
| x86: Index, Tmp |
| x86: Tmp, Addr |
| x86: Tmp, Index |
| |
| x86: Add8 U:G:8, UD:G:8 |
| Imm, Addr |
| Imm, Index |
| Tmp, Addr |
| Tmp, Index |
| |
| x86: Add16 U:G:16, UD:G:16 |
| Imm, Addr |
| Imm, Index |
| Tmp, Addr |
| Tmp, Index |
| |
| 64: Add64 U:G:64, UD:G:64 |
| Tmp, Tmp |
| x86: Imm, Addr |
| x86: Imm, Index |
| Imm, Tmp |
| x86: Addr, Tmp |
| x86: Index, Tmp |
| x86: Tmp, Addr |
| x86: Tmp, Index |
| |
| 64: Add64 U:G:64, U:G:64, D:G:64 |
| Imm, Tmp, Tmp |
| Tmp, Tmp, Tmp |
| |
| AddDouble U:F:64, U:F:64, D:F:64 |
| Tmp, Tmp, Tmp |
| x86: Addr, Tmp, Tmp |
| x86: Tmp, Addr, Tmp |
| x86: Index, Tmp, Tmp |
| |
| x86: AddDouble U:F:64, UD:F:64 |
| Tmp, Tmp |
| Addr, Tmp |
| |
| AddFloat U:F:32, U:F:32, D:F:32 |
| Tmp, Tmp, Tmp |
| x86: Addr, Tmp, Tmp |
| x86: Tmp, Addr, Tmp |
| x86: Index, Tmp, Tmp |
| |
| x86: AddFloat U:F:32, UD:F:32 |
| Tmp, Tmp |
| Addr, Tmp |
| |
| Sub32 U:G:32, UZD:G:32 |
| Tmp, Tmp |
| x86: Imm, Addr |
| x86: Imm, Index |
| Imm, Tmp |
| x86: Addr, Tmp |
| x86: Index, Tmp |
| x86: Tmp, Addr |
| x86: Tmp, Index |
| |
| arm64: Sub32 U:G:32, U:G:32, D:G:32 |
| Tmp, Tmp, Tmp |
| |
| 64: Sub64 U:G:64, UD:G:64 |
| Tmp, Tmp |
| x86: Imm, Addr |
| x86: Imm, Index |
| Imm, Tmp |
| x86: Addr, Tmp |
| x86: Index, Tmp |
| x86: Tmp, Addr |
| x86: Tmp, Index |
| |
| arm64: Sub64 U:G:64, U:G:64, D:G:64 |
| Tmp, Tmp, Tmp |
| |
| SubDouble U:F:64, U:F:64, D:F:64 |
| arm64: Tmp, Tmp, Tmp |
| x86: Tmp, Addr, Tmp |
| x86: Tmp, Index, Tmp |
| |
| x86: SubDouble U:F:64, UD:F:64 |
| Tmp, Tmp |
| Addr, Tmp |
| |
| SubFloat U:F:32, U:F:32, D:F:32 |
| arm64: Tmp, Tmp, Tmp |
| x86: Tmp, Addr, Tmp |
| x86: Tmp, Index, Tmp |
| |
| x86: SubFloat U:F:32, UD:F:32 |
| Tmp, Tmp |
| Addr, Tmp |
| |
| Neg32 UZD:G:32 |
| Tmp |
| x86: Addr |
| x86: Index |
| |
| 64: Neg64 UD:G:64 |
| Tmp |
| x86: Addr |
| x86: Index |
| |
| arm64: NegateDouble U:F:64, D:F:64 |
| Tmp, Tmp |
| |
| arm64: NegateFloat U:F:32, D:F:32 |
| Tmp, Tmp |
| |
| Mul32 U:G:32, UZD:G:32 |
| Tmp, Tmp |
| x86: Addr, Tmp |
| |
| Mul32 U:G:32, U:G:32, ZD:G:32 |
| Tmp, Tmp, Tmp |
| x86: Addr, Tmp, Tmp |
| x86: Tmp, Addr, Tmp |
| x86: Imm, Tmp, Tmp |
| |
| 64: Mul64 U:G:64, UD:G:64 |
| Tmp, Tmp |
| |
| Mul64 U:G:64, U:G:64, D:G:64 |
| Tmp, Tmp, Tmp |
| |
| arm64: MultiplyAdd32 U:G:32, U:G:32, U:G:32, ZD:G:32 |
| Tmp, Tmp, Tmp, Tmp |
| |
| arm64: MultiplyAdd64 U:G:64, U:G:64, U:G:64, D:G:64 |
| Tmp, Tmp, Tmp, Tmp |
| |
| arm64: MultiplySub32 U:G:32, U:G:32, U:G:32, ZD:G:32 |
| Tmp, Tmp, Tmp, Tmp |
| |
| arm64: MultiplySub64 U:G:64, U:G:64, U:G:64, D:G:64 |
| Tmp, Tmp, Tmp, Tmp |
| |
| arm64: MultiplyNeg32 U:G:32, U:G:32, ZD:G:32 |
| Tmp, Tmp, Tmp |
| |
| arm64: MultiplyNeg64 U:G:64, U:G:64, ZD:G:64 |
| Tmp, Tmp, Tmp |
| |
| arm64: Div32 U:G:32, U:G:32, ZD:G:32 |
| Tmp, Tmp, Tmp |
| |
| arm64: UDiv32 U:G:32, U:G:32, ZD:G:32 |
| Tmp, Tmp, Tmp |
| |
| arm64: Div64 U:G:64, U:G:64, D:G:64 |
| Tmp, Tmp, Tmp |
| |
| arm64: UDiv64 U:G:64, U:G:64, D:G:64 |
| Tmp, Tmp, Tmp |
| |
| MulDouble U:F:64, U:F:64, D:F:64 |
| Tmp, Tmp, Tmp |
| x86: Addr, Tmp, Tmp |
| x86: Tmp, Addr, Tmp |
| x86: Index, Tmp, Tmp |
| |
| x86: MulDouble U:F:64, UD:F:64 |
| Tmp, Tmp |
| Addr, Tmp |
| |
| MulFloat U:F:32, U:F:32, D:F:32 |
| Tmp, Tmp, Tmp |
| x86: Addr, Tmp, Tmp |
| x86: Tmp, Addr, Tmp |
| x86: Index, Tmp, Tmp |
| |
| x86: MulFloat U:F:32, UD:F:32 |
| Tmp, Tmp |
| Addr, Tmp |
| |
| arm64: DivDouble U:F:64, U:F:32, D:F:64 |
| Tmp, Tmp, Tmp |
| |
| x86: DivDouble U:F:64, UD:F:64 |
| Tmp, Tmp |
| Addr, Tmp |
| |
| arm64: DivFloat U:F:32, U:F:32, D:F:32 |
| Tmp, Tmp, Tmp |
| |
| x86: DivFloat U:F:32, UD:F:32 |
| Tmp, Tmp |
| Addr, Tmp |
| |
| x86: X86ConvertToDoubleWord32 U:G:32, ZD:G:32 |
| Tmp*, Tmp* |
| |
| x86_64: X86ConvertToQuadWord64 U:G:64, D:G:64 |
| Tmp*, Tmp* |
| |
| x86: X86Div32 UZD:G:32, UZD:G:32, U:G:32 |
| Tmp*, Tmp*, Tmp |
| |
| x86: X86UDiv32 UZD:G:32, UZD:G:32, U:G:32 |
| Tmp*, Tmp*, Tmp |
| |
| x86_64: X86Div64 UZD:G:64, UZD:G:64, U:G:64 |
| Tmp*, Tmp*, Tmp |
| |
| x86_64: X86UDiv64 UZD:G:64, UZD:G:64, U:G:64 |
| Tmp*, Tmp*, Tmp |
| |
| # If we add other things like Lea that are UA, we may need to lower |
| # them on arm64 similarly to how we do for Lea. In lowerStackArgs, |
| # we lower Lea to add on arm64. |
| Lea32 UA:G:32, D:G:32 |
| Addr, Tmp |
| x86: Index, Tmp as x86Lea32 |
| |
| Lea64 UA:G:64, D:G:64 |
| Addr, Tmp |
| x86: Index, Tmp as x86Lea64 |
| |
| And32 U:G:32, U:G:32, ZD:G:32 |
| Tmp, Tmp, Tmp |
| arm64: BitImm, Tmp, Tmp |
| x86: Tmp, Addr, Tmp |
| x86: Addr, Tmp, Tmp |
| |
| And32 U:G:32, UZD:G:32 |
| Tmp, Tmp |
| x86: Imm, Tmp |
| x86: Tmp, Addr |
| x86: Tmp, Index |
| x86: Addr, Tmp |
| x86: Index, Tmp |
| x86: Imm, Addr |
| x86: Imm, Index |
| |
| 64: And64 U:G:64, U:G:64, D:G:64 |
| Tmp, Tmp, Tmp |
| arm64: BitImm64, Tmp, Tmp |
| |
| x86_64: And64 U:G:64, UD:G:64 |
| Tmp, Tmp |
| Imm, Tmp |
| Imm, Addr |
| Imm, Index |
| Tmp, Addr |
| Tmp, Index |
| Addr, Tmp |
| Index, Tmp |
| |
| AndDouble U:F:64, U:F:64, D:F:64 |
| Tmp, Tmp, Tmp |
| |
| x86: AndDouble U:F:64, UD:F:64 |
| Tmp, Tmp |
| |
| AndFloat U:F:32, U:F:32, D:F:32 |
| Tmp, Tmp, Tmp |
| |
| x86: AndFloat U:F:32, UD:F:32 |
| Tmp, Tmp |
| |
| OrDouble U:F:64, U:F:64, D:F:64 |
| Tmp, Tmp, Tmp |
| |
| x86: OrDouble U:F:64, UD:F:64 |
| Tmp, Tmp |
| |
| OrFloat U:F:32, U:F:32, D:F:32 |
| Tmp, Tmp, Tmp |
| |
| x86: OrFloat U:F:32, UD:F:32 |
| Tmp, Tmp |
| |
| x86: XorDouble U:F:64, U:F:64, D:F:64 |
| Tmp, Tmp, Tmp |
| |
| x86: XorDouble U:F:64, UD:F:64 |
| Tmp, Tmp |
| |
| x86: XorFloat U:F:32, U:F:32, D:F:32 |
| Tmp, Tmp, Tmp |
| |
| x86: XorFloat U:F:32, UD:F:32 |
| Tmp, Tmp |
| |
| arm64: Lshift32 U:G:32, U:G:32, ZD:G:32 |
| Tmp, Tmp, Tmp |
| Tmp, Imm, Tmp |
| |
| x86:Lshift32 U:G:32, UZD:G:32 |
| Tmp*, Tmp |
| Imm, Tmp |
| |
| arm64: Lshift64 U:G:64, U:G:64, D:G:64 |
| Tmp, Tmp, Tmp |
| Tmp, Imm, Tmp |
| |
| x86_64: Lshift64 U:G:64, UD:G:64 |
| Tmp*, Tmp |
| Imm, Tmp |
| |
| arm64: Rshift32 U:G:32, U:G:32, ZD:G:32 |
| Tmp, Tmp, Tmp |
| Tmp, Imm, Tmp |
| |
| x86: Rshift32 U:G:32, UZD:G:32 |
| Tmp*, Tmp |
| Imm, Tmp |
| |
| arm64: Rshift64 U:G:64, U:G:64, D:G:64 |
| Tmp, Tmp, Tmp |
| Tmp, Imm, Tmp |
| |
| x86_64: Rshift64 U:G:64, UD:G:64 |
| Tmp*, Tmp |
| Imm, Tmp |
| |
| arm64: Urshift32 U:G:32, U:G:32, ZD:G:32 |
| Tmp, Tmp, Tmp |
| Tmp, Imm, Tmp |
| |
| x86: Urshift32 U:G:32, UZD:G:32 |
| Tmp*, Tmp |
| Imm, Tmp |
| |
| arm64: Urshift64 U:G:64, U:G:64, D:G:64 |
| Tmp, Tmp, Tmp |
| Tmp, Imm, Tmp |
| |
| x86_64: Urshift64 U:G:64, UD:G:64 |
| Tmp*, Tmp |
| Imm, Tmp |
| |
| x86_64: RotateRight32 U:G:32, UZD:G:32 |
| Tmp*, Tmp |
| Imm, Tmp |
| |
| arm64: RotateRight32 U:G:32, U:G:32, ZD:G:32 |
| Tmp, Tmp, Tmp |
| Tmp, Imm, Tmp |
| |
| x86_64: RotateRight64 U:G:64, UD:G:64 |
| Tmp*, Tmp |
| Imm, Tmp |
| |
| arm64: RotateRight64 U:G:64, U:G:64, D:G:64 |
| Tmp, Tmp, Tmp |
| Tmp, Imm, Tmp |
| |
| x86_64: RotateLeft32 U:G:32, UZD:G:32 |
| Tmp*, Tmp |
| Imm, Tmp |
| |
| x86_64: RotateLeft64 U:G:64, UD:G:64 |
| Tmp*, Tmp |
| Imm, Tmp |
| |
| Or32 U:G:32, U:G:32, ZD:G:32 |
| Tmp, Tmp, Tmp |
| arm64: BitImm, Tmp, Tmp |
| x86: Tmp, Addr, Tmp |
| x86: Addr, Tmp, Tmp |
| |
| Or32 U:G:32, UZD:G:32 |
| Tmp, Tmp |
| x86: Imm, Tmp |
| x86: Tmp, Addr |
| x86: Tmp, Index |
| x86: Addr, Tmp |
| x86: Index, Tmp |
| x86: Imm, Addr |
| x86: Imm, Index |
| |
| 64: Or64 U:G:64, U:G:64, D:G:64 |
| Tmp, Tmp, Tmp |
| arm64: BitImm64, Tmp, Tmp |
| |
| 64: Or64 U:G:64, UD:G:64 |
| Tmp, Tmp |
| x86: Imm, Tmp |
| x86: Imm, Addr |
| x86: Imm, Index |
| x86: Tmp, Addr |
| x86: Tmp, Index |
| x86: Addr, Tmp |
| x86: Index, Tmp |
| |
| Xor32 U:G:32, U:G:32, ZD:G:32 |
| Tmp, Tmp, Tmp |
| arm64: BitImm, Tmp, Tmp |
| x86: Tmp, Addr, Tmp |
| x86: Addr, Tmp, Tmp |
| |
| Xor32 U:G:32, UZD:G:32 |
| Tmp, Tmp |
| x86: Imm, Tmp |
| x86: Tmp, Addr |
| x86: Tmp, Index |
| x86: Addr, Tmp |
| x86: Index, Tmp |
| x86: Imm, Addr |
| x86: Imm, Index |
| |
| 64: Xor64 U:G:64, U:G:64, D:G:64 |
| Tmp, Tmp, Tmp |
| arm64: BitImm64, Tmp, Tmp |
| |
| 64: Xor64 U:G:64, UD:G:64 |
| Tmp, Tmp |
| x86: Tmp, Addr |
| x86: Tmp, Index |
| x86: Addr, Tmp |
| x86: Index, Tmp |
| x86: Imm, Addr |
| x86: Imm, Index |
| x86: Imm, Tmp |
| |
| arm64: Not32 U:G:32, ZD:G:32 |
| Tmp, Tmp |
| |
| x86: Not32 UZD:G:32 |
| Tmp |
| Addr |
| Index |
| |
| arm64: Not64 U:G:64, D:G:64 |
| Tmp, Tmp |
| |
| x86_64: Not64 UD:G:64 |
| Tmp |
| Addr |
| Index |
| |
| arm64: AbsDouble U:F:64, D:F:64 |
| Tmp, Tmp |
| |
| arm64: AbsFloat U:F:32, D:F:32 |
| Tmp, Tmp |
| |
| CeilDouble U:F:64, D:F:64 |
| Tmp, Tmp |
| x86: Addr, Tmp |
| |
| CeilFloat U:F:32, D:F:32 |
| Tmp, Tmp |
| x86: Addr, Tmp |
| |
| FloorDouble U:F:64, D:F:64 |
| Tmp, Tmp |
| x86: Addr, Tmp |
| |
| FloorFloat U:F:32, D:F:32 |
| Tmp, Tmp |
| x86: Addr, Tmp |
| |
| SqrtDouble U:F:64, D:F:64 |
| Tmp, Tmp |
| x86: Addr, Tmp |
| |
| SqrtFloat U:F:32, D:F:32 |
| Tmp, Tmp |
| x86: Addr, Tmp |
| |
| ConvertInt32ToDouble U:G:32, D:F:64 |
| Tmp, Tmp |
| x86: Addr, Tmp |
| |
| 64: ConvertInt64ToDouble U:G:64, D:F:64 |
| Tmp, Tmp |
| x86_64: Addr, Tmp |
| |
| ConvertInt32ToFloat U:G:32, D:F:32 |
| Tmp, Tmp |
| x86: Addr, Tmp |
| |
| 64: ConvertInt64ToFloat U:G:64, D:F:32 |
| Tmp, Tmp |
| x86_64: Addr, Tmp |
| |
| CountLeadingZeros32 U:G:32, ZD:G:32 |
| Tmp, Tmp |
| x86: Addr, Tmp |
| |
| 64: CountLeadingZeros64 U:G:64, D:G:64 |
| Tmp, Tmp |
| x86: Addr, Tmp |
| |
| ConvertDoubleToFloat U:F:64, D:F:32 |
| Tmp, Tmp |
| x86: Addr, Tmp |
| |
| ConvertFloatToDouble U:F:32, D:F:64 |
| Tmp, Tmp |
| x86: Addr, Tmp |
| |
| # Note that Move operates over the full register size, which is either 32-bit or 64-bit depending on |
| # the platform. I'm not entirely sure that this is a good thing; it might be better to just have a |
| # Move64 instruction. OTOH, our MacroAssemblers already have this notion of "move()" that basically |
| # means movePtr. |
| Move U:G:Ptr, D:G:Ptr |
| Tmp, Tmp |
| Imm, Tmp as signExtend32ToPtr |
| BigImm, Tmp |
| Addr, Tmp as loadPtr # This means that "Move Addr, Tmp" is code-generated as "load" not "move". |
| Index, Tmp as loadPtr |
| Tmp, Addr as storePtr |
| Tmp, Index as storePtr |
| x86: Imm, Addr as storePtr |
| |
| # This is for moving between spill slots. |
| Move U:G:Ptr, D:G:Ptr, S:G:Ptr |
| Addr, Addr, Tmp |
| |
| x86: Swap32 UD:G:32, UD:G:32 |
| Tmp, Tmp |
| Tmp, Addr |
| |
| x86_64: Swap64 UD:G:64, UD:G:64 |
| Tmp, Tmp |
| Tmp, Addr |
| |
| Move32 U:G:32, ZD:G:32 |
| Tmp, Tmp as zeroExtend32ToPtr |
| Addr, Tmp as load32 |
| Index, Tmp as load32 |
| Tmp, Addr as store32 |
| Tmp, Index as store32 |
| x86: Imm, Tmp as zeroExtend32ToPtr |
| x86: Imm, Addr as store32 |
| x86: Imm, Index as store32 |
| |
| # This is for moving between spill slots. |
| Move32 U:G:32, ZD:G:32, S:G:32 |
| Addr, Addr, Tmp |
| |
| # FIXME: StoreZero32 and StoreZero64 are hacks on ARM64, we can do better: https://bugs.webkit.org/show_bug.cgi?id=174821 |
| StoreZero32 D:G:32 |
| Addr |
| Index |
| |
| 64: StoreZero64 D:G:64 |
| Addr |
| Index |
| |
| SignExtend32ToPtr U:G:32, D:G:Ptr |
| Tmp, Tmp |
| |
| ZeroExtend8To32 U:G:8, ZD:G:32 |
| Tmp, Tmp |
| x86: Addr, Tmp as load8 |
| x86: Index, Tmp as load8 |
| |
| SignExtend8To32 U:G:8, ZD:G:32 |
| Tmp, Tmp |
| x86: Addr, Tmp as load8SignedExtendTo32 |
| x86: Index, Tmp as load8SignedExtendTo32 |
| |
| ZeroExtend16To32 U:G:16, ZD:G:32 |
| Tmp, Tmp |
| x86: Addr, Tmp as load16 |
| x86: Index, Tmp as load16 |
| |
| SignExtend16To32 U:G:16, ZD:G:32 |
| Tmp, Tmp |
| x86: Addr, Tmp as load16SignedExtendTo32 |
| x86: Index, Tmp as load16SignedExtendTo32 |
| |
| MoveFloat U:F:32, D:F:32 |
| Tmp, Tmp as moveDouble |
| Addr, Tmp as loadFloat |
| Index, Tmp as loadFloat |
| Tmp, Addr as storeFloat |
| Tmp, Index as storeFloat |
| |
| MoveFloat U:F:32, D:F:32, S:F:32 |
| Addr, Addr, Tmp |
| |
| MoveDouble U:F:64, D:F:64 |
| Tmp, Tmp |
| Addr, Tmp as loadDouble |
| Index, Tmp as loadDouble |
| Tmp, Addr as storeDouble |
| Tmp, Index as storeDouble |
| |
| MoveDouble U:F:64, D:F:64, S:F:64 |
| Addr, Addr, Tmp |
| |
| MoveZeroToDouble D:F:64 |
| Tmp |
| |
| 64: Move64ToDouble U:G:64, D:F:64 |
| Tmp, Tmp |
| x86: Addr, Tmp as loadDouble |
| Index, Tmp as loadDouble |
| |
| Move32ToFloat U:G:32, D:F:32 |
| Tmp, Tmp |
| x86: Addr, Tmp as loadFloat |
| Index, Tmp as loadFloat |
| |
| 64: MoveDoubleTo64 U:F:64, D:G:64 |
| Tmp, Tmp |
| Addr, Tmp as load64 |
| Index, Tmp as load64 |
| |
| MoveFloatTo32 U:F:32, D:G:32 |
| Tmp, Tmp |
| Addr, Tmp as load32 |
| Index, Tmp as load32 |
| |
| Load8 U:G:8, ZD:G:32 |
| Addr, Tmp |
| Index, Tmp |
| |
| arm: LoadAcq8 U:G:8, ZD:G:32 /effects |
| SimpleAddr, Tmp |
| |
| Store8 U:G:8, D:G:8 |
| Tmp, Index |
| Tmp, Addr |
| x86: Imm, Index |
| x86: Imm, Addr |
| |
| arm: StoreRel8 U:G:8, D:G:8 /effects |
| Tmp, SimpleAddr |
| |
| Load8SignedExtendTo32 U:G:8, ZD:G:32 |
| Addr, Tmp |
| Index, Tmp |
| |
| arm: LoadAcq8SignedExtendTo32 U:G:8, ZD:G:32 /effects |
| SimpleAddr, Tmp |
| |
| Load16 U:G:16, ZD:G:32 |
| Addr, Tmp |
| Index, Tmp |
| |
| arm: LoadAcq16 U:G:16, ZD:G:32 /effects |
| SimpleAddr, Tmp |
| |
| Load16SignedExtendTo32 U:G:16, ZD:G:32 |
| Addr, Tmp |
| Index, Tmp |
| |
| arm: LoadAcq16SignedExtendTo32 U:G:16, ZD:G:32 /effects |
| SimpleAddr, Tmp |
| |
| Store16 U:G:16, D:G:16 |
| Tmp, Index |
| Tmp, Addr |
| x86: Imm, Index |
| x86: Imm, Addr |
| |
| arm: StoreRel16 U:G:16, D:G:16 /effects |
| Tmp, SimpleAddr |
| |
| arm: LoadAcq32 U:G:32, ZD:G:32 /effects |
| SimpleAddr, Tmp |
| |
| arm: StoreRel32 U:G:32, ZD:G:32 /effects |
| Tmp, SimpleAddr |
| |
| arm64: LoadAcq64 U:G:64, ZD:G:64 /effects |
| SimpleAddr, Tmp |
| |
| arm64: StoreRel64 U:G:64, ZD:G:64 /effects |
| Tmp, SimpleAddr |
| |
| x86: Xchg8 UD:G:8, UD:G:8 /effects |
| Tmp, Addr |
| Tmp, Index |
| |
| x86: Xchg16 UD:G:16, UD:G:16 /effects |
| Tmp, Addr |
| Tmp, Index |
| |
| x86: Xchg32 UD:G:32, UD:G:32 /effects |
| Tmp, Addr |
| Tmp, Index |
| |
| x86_64: Xchg64 UD:G:64, UD:G:64 /effects |
| Tmp, Addr |
| Tmp, Index |
| |
| # The first operand is rax. |
| # FIXME: This formulation means that the boolean result cannot be put in eax, even though all users |
| # of this would be OK with that. |
| # https://bugs.webkit.org/show_bug.cgi?id=169254 |
| x86: AtomicStrongCAS8 U:G:32, UD:G:8, U:G:8, UD:G:8, ZD:G:8 /effects |
| StatusCond, Tmp*, Tmp, Addr, Tmp |
| StatusCond, Tmp*, Tmp, Index, Tmp |
| |
| x86: AtomicStrongCAS16 U:G:32, UD:G:16, U:G:32, UD:G:16, ZD:G:8 /effects |
| StatusCond, Tmp*, Tmp, Addr, Tmp |
| StatusCond, Tmp*, Tmp, Index, Tmp |
| |
| x86: AtomicStrongCAS32 U:G:32, UD:G:32, U:G:32, UD:G:32, ZD:G:8 /effects |
| StatusCond, Tmp*, Tmp, Addr, Tmp |
| StatusCond, Tmp*, Tmp, Index, Tmp |
| |
| x86_64: AtomicStrongCAS64 U:G:32, UD:G:64, U:G:64, UD:G:64, ZD:G:8 /effects |
| StatusCond, Tmp*, Tmp, Addr, Tmp |
| StatusCond, Tmp*, Tmp, Index, Tmp |
| |
| x86: AtomicStrongCAS8 UD:G:8, U:G:8, UD:G:8 /effects |
| Tmp*, Tmp, Addr |
| Tmp*, Tmp, Index |
| |
| x86: AtomicStrongCAS16 UD:G:16, U:G:32, UD:G:16 /effects |
| Tmp*, Tmp, Addr |
| Tmp*, Tmp, Index |
| |
| x86: AtomicStrongCAS32 UD:G:32, U:G:32, UD:G:32 /effects |
| Tmp*, Tmp, Addr |
| Tmp*, Tmp, Index |
| |
| x86_64: AtomicStrongCAS64 UD:G:64, U:G:64, UD:G:64 /effects |
| Tmp*, Tmp, Addr |
| Tmp*, Tmp, Index |
| |
| x86: BranchAtomicStrongCAS8 U:G:32, UD:G:8, U:G:8, UD:G:8 /branch /effects |
| StatusCond, Tmp*, Tmp, Addr |
| StatusCond, Tmp*, Tmp, Index |
| |
| x86: BranchAtomicStrongCAS16 U:G:32, UD:G:16, U:G:32, UD:G:16 /branch /effects |
| StatusCond, Tmp*, Tmp, Addr |
| StatusCond, Tmp*, Tmp, Index |
| |
| x86: BranchAtomicStrongCAS32 U:G:32, UD:G:32, U:G:32, UD:G:32 /branch /effects |
| StatusCond, Tmp*, Tmp, Addr |
| StatusCond, Tmp*, Tmp, Index |
| |
| x86_64: BranchAtomicStrongCAS64 U:G:32, UD:G:64, U:G:64, UD:G:64 /branch /effects |
| StatusCond, Tmp*, Tmp, Addr |
| StatusCond, Tmp*, Tmp, Index |
| |
| x86: AtomicAdd8 U:G:8, UD:G:8 /effects |
| Imm, Addr |
| Imm, Index |
| Tmp, Addr |
| Tmp, Index |
| |
| x86: AtomicAdd16 U:G:16, UD:G:16 /effects |
| Imm, Addr |
| Imm, Index |
| Tmp, Addr |
| Tmp, Index |
| |
| x86: AtomicAdd32 U:G:32, UD:G:32 /effects |
| Imm, Addr |
| Imm, Index |
| Tmp, Addr |
| Tmp, Index |
| |
| x86_64: AtomicAdd64 U:G:64, UD:G:64 /effects |
| Imm, Addr |
| Imm, Index |
| Tmp, Addr |
| Tmp, Index |
| |
| x86: AtomicSub8 U:G:8, UD:G:8 /effects |
| Imm, Addr |
| Imm, Index |
| Tmp, Addr |
| Tmp, Index |
| |
| x86: AtomicSub16 U:G:16, UD:G:16 /effects |
| Imm, Addr |
| Imm, Index |
| Tmp, Addr |
| Tmp, Index |
| |
| x86: AtomicSub32 U:G:32, UD:G:32 /effects |
| Imm, Addr |
| Imm, Index |
| Tmp, Addr |
| Tmp, Index |
| |
| x86_64: AtomicSub64 U:G:64, UD:G:64 /effects |
| Imm, Addr |
| Imm, Index |
| Tmp, Addr |
| Tmp, Index |
| |
| x86: AtomicAnd8 U:G:8, UD:G:8 /effects |
| Imm, Addr |
| Imm, Index |
| Tmp, Addr |
| Tmp, Index |
| |
| x86: AtomicAnd16 U:G:16, UD:G:16 /effects |
| Imm, Addr |
| Imm, Index |
| Tmp, Addr |
| Tmp, Index |
| |
| x86: AtomicAnd32 U:G:32, UD:G:32 /effects |
| Imm, Addr |
| Imm, Index |
| Tmp, Addr |
| Tmp, Index |
| |
| x86_64: AtomicAnd64 U:G:64, UD:G:64 /effects |
| Imm, Addr |
| Imm, Index |
| Tmp, Addr |
| Tmp, Index |
| |
| x86: AtomicOr8 U:G:8, UD:G:8 /effects |
| Imm, Addr |
| Imm, Index |
| Tmp, Addr |
| Tmp, Index |
| |
| x86: AtomicOr16 U:G:16, UD:G:16 /effects |
| Imm, Addr |
| Imm, Index |
| Tmp, Addr |
| Tmp, Index |
| |
| x86: AtomicOr32 U:G:32, UD:G:32 /effects |
| Imm, Addr |
| Imm, Index |
| Tmp, Addr |
| Tmp, Index |
| |
| x86_64: AtomicOr64 U:G:64, UD:G:64 /effects |
| Imm, Addr |
| Imm, Index |
| Tmp, Addr |
| Tmp, Index |
| |
| x86: AtomicXor8 U:G:8, UD:G:8 /effects |
| Imm, Addr |
| Imm, Index |
| Tmp, Addr |
| Tmp, Index |
| |
| x86: AtomicXor16 U:G:16, UD:G:16 /effects |
| Imm, Addr |
| Imm, Index |
| Tmp, Addr |
| Tmp, Index |
| |
| x86: AtomicXor32 U:G:32, UD:G:32 /effects |
| Imm, Addr |
| Imm, Index |
| Tmp, Addr |
| Tmp, Index |
| |
| x86_64: AtomicXor64 U:G:64, UD:G:64 /effects |
| Imm, Addr |
| Imm, Index |
| Tmp, Addr |
| Tmp, Index |
| |
| x86: AtomicNeg8 UD:G:8 /effects |
| Addr |
| Index |
| |
| x86: AtomicNeg16 UD:G:16 /effects |
| Addr |
| Index |
| |
| x86: AtomicNeg32 UD:G:32 /effects |
| Addr |
| Index |
| |
| x86_64: AtomicNeg64 UD:G:64 /effects |
| Addr |
| Index |
| |
| x86: AtomicNot8 UD:G:8 /effects |
| Addr |
| Index |
| |
| x86: AtomicNot16 UD:G:16 /effects |
| Addr |
| Index |
| |
| x86: AtomicNot32 UD:G:32 /effects |
| Addr |
| Index |
| |
| x86_64: AtomicNot64 UD:G:64 /effects |
| Addr |
| Index |
| |
| x86: AtomicXchgAdd8 UD:G:8, UD:G:8 /effects |
| Tmp, Addr |
| Tmp, Index |
| |
| x86: AtomicXchgAdd16 UD:G:16, UD:G:16 /effects |
| Tmp, Addr |
| Tmp, Index |
| |
| x86: AtomicXchgAdd32 UD:G:32, UD:G:32 /effects |
| Tmp, Addr |
| Tmp, Index |
| |
| x86_64: AtomicXchgAdd64 UD:G:64, UD:G:64 /effects |
| Tmp, Addr |
| Tmp, Index |
| |
| x86: AtomicXchg8 UD:G:8, UD:G:8 /effects |
| Tmp, Addr |
| Tmp, Index |
| |
| x86: AtomicXchg16 UD:G:16, UD:G:16 /effects |
| Tmp, Addr |
| Tmp, Index |
| |
| x86: AtomicXchg32 UD:G:32, UD:G:32 /effects |
| Tmp, Addr |
| Tmp, Index |
| |
| x86_64: AtomicXchg64 UD:G:64, UD:G:64 /effects |
| Tmp, Addr |
| Tmp, Index |
| |
| arm64: LoadLink8 U:G:8, ZD:G:8 /effects |
| SimpleAddr, Tmp |
| |
| arm64: LoadLinkAcq8 U:G:8, ZD:G:8 /effects |
| SimpleAddr, Tmp |
| |
| # Super confusing fact: this returns 0 to mean success, 1 to mean failure. |
| arm64: StoreCond8 U:G:8, D:G:8, EZD:G:8 /effects |
| Tmp, SimpleAddr, Tmp |
| |
| arm64: StoreCondRel8 U:G:8, D:G:8, EZD:G:8 /effects |
| Tmp, SimpleAddr, Tmp |
| |
| arm64: LoadLink16 U:G:16, ZD:G:16 /effects |
| SimpleAddr, Tmp |
| |
| arm64: LoadLinkAcq16 U:G:16, ZD:G:16 /effects |
| SimpleAddr, Tmp |
| |
| arm64: StoreCond16 U:G:16, D:G:16, EZD:G:8 /effects |
| Tmp, SimpleAddr, Tmp |
| |
| arm64: StoreCondRel16 U:G:16, D:G:16, EZD:G:8 /effects |
| Tmp, SimpleAddr, Tmp |
| |
| arm64: LoadLink32 U:G:32, ZD:G:32 /effects |
| SimpleAddr, Tmp |
| |
| arm64: LoadLinkAcq32 U:G:32, ZD:G:32 /effects |
| SimpleAddr, Tmp |
| |
| arm64: StoreCond32 U:G:32, D:G:32, EZD:G:8 /effects |
| Tmp, SimpleAddr, Tmp |
| |
| arm64: StoreCondRel32 U:G:32, D:G:32, EZD:G:8 /effects |
| Tmp, SimpleAddr, Tmp |
| |
| arm64: LoadLink64 U:G:64, ZD:G:64 /effects |
| SimpleAddr, Tmp |
| |
| arm64: LoadLinkAcq64 U:G:64, ZD:G:64 /effects |
| SimpleAddr, Tmp |
| |
| arm64: StoreCond64 U:G:64, D:G:64, EZD:G:8 /effects |
| Tmp, SimpleAddr, Tmp |
| |
| arm64: StoreCondRel64 U:G:64, D:G:64, EZD:G:8 /effects |
| Tmp, SimpleAddr, Tmp |
| |
| arm64: Depend32 U:G:32, ZD:G:32 |
| Tmp, Tmp |
| |
| arm64: Depend64 U:G:64, ZD:G:64 |
| Tmp, Tmp |
| |
| Compare32 U:G:32, U:G:32, U:G:32, ZD:G:32 |
| RelCond, Tmp, Tmp, Tmp |
| RelCond, Tmp, Imm, Tmp |
| |
| 64: Compare64 U:G:32, U:G:64, U:G:64, ZD:G:32 |
| RelCond, Tmp, Tmp, Tmp |
| x86: RelCond, Tmp, Imm, Tmp |
| |
| Test32 U:G:32, U:G:32, U:G:32, ZD:G:32 |
| x86: ResCond, Addr, Imm, Tmp |
| ResCond, Tmp, Tmp, Tmp |
| ResCond, Tmp, BitImm, Tmp |
| |
| 64: Test64 U:G:32, U:G:64, U:G:64, ZD:G:32 |
| x86: ResCond, Tmp, Imm, Tmp |
| ResCond, Tmp, Tmp, Tmp |
| |
| CompareDouble U:G:32, U:F:64, U:F:64, ZD:G:32 |
| DoubleCond, Tmp, Tmp, Tmp |
| |
| CompareFloat U:G:32, U:F:32, U:F:32, ZD:G:32 |
| DoubleCond, Tmp, Tmp, Tmp |
| |
| # Note that branches have some logic in AirOptimizeBlockOrder.cpp. If you add new branches, please make sure |
| # you opt them into the block order optimizations. |
| |
| Branch8 U:G:32, U:G:8, U:G:8 /branch |
| x86: RelCond, Addr, Imm |
| x86: RelCond, Index, Imm |
| |
| Branch32 U:G:32, U:G:32, U:G:32 /branch |
| x86: RelCond, Addr, Imm |
| RelCond, Tmp, Tmp |
| RelCond, Tmp, Imm |
| x86: RelCond, Tmp, Addr |
| x86: RelCond, Addr, Tmp |
| x86: RelCond, Index, Imm |
| |
| 64: Branch64 U:G:32, U:G:64, U:G:64 /branch |
| RelCond, Tmp, Tmp |
| RelCond, Tmp, Imm |
| x86: RelCond, Tmp, Addr |
| x86: RelCond, Addr, Tmp |
| x86: RelCond, Addr, Imm |
| x86: RelCond, Index, Tmp |
| |
| BranchTest8 U:G:32, U:G:8, U:G:8 /branch |
| x86: ResCond, Addr, BitImm |
| x86: ResCond, Index, BitImm |
| |
| BranchTest32 U:G:32, U:G:32, U:G:32 /branch |
| ResCond, Tmp, Tmp |
| ResCond, Tmp, BitImm |
| x86: ResCond, Addr, BitImm |
| x86: ResCond, Index, BitImm |
| |
| # Warning: forms that take an immediate will sign-extend their immediate. You probably want |
| # BranchTest32 in most cases where you use an immediate. |
| 64: BranchTest64 U:G:32, U:G:64, U:G:64 /branch |
| ResCond, Tmp, Tmp |
| arm64: ResCond, Tmp, BitImm64 |
| x86: ResCond, Tmp, BitImm |
| x86: ResCond, Addr, BitImm |
| x86: ResCond, Addr, Tmp |
| x86: ResCond, Index, BitImm |
| |
| BranchDouble U:G:32, U:F:64, U:F:64 /branch |
| DoubleCond, Tmp, Tmp |
| |
| BranchFloat U:G:32, U:F:32, U:F:32 /branch |
| DoubleCond, Tmp, Tmp |
| |
| BranchAdd32 U:G:32, U:G:32, U:G:32, ZD:G:32 /branch |
| ResCond, Tmp, Tmp, Tmp |
| x86:ResCond, Tmp, Addr, Tmp |
| x86:ResCond, Addr, Tmp, Tmp |
| |
| BranchAdd32 U:G:32, U:G:32, UZD:G:32 /branch |
| ResCond, Tmp, Tmp |
| ResCond, Imm, Tmp |
| x86: ResCond, Imm, Addr |
| x86: ResCond, Tmp, Addr |
| x86: ResCond, Addr, Tmp |
| |
| BranchAdd64 U:G:32, U:G:64, U:G:64, ZD:G:64 /branch |
| ResCond, Tmp, Tmp, Tmp |
| x86:ResCond, Tmp, Addr, Tmp |
| x86:ResCond, Addr, Tmp, Tmp |
| |
| 64: BranchAdd64 U:G:32, U:G:64, UD:G:64 /branch |
| ResCond, Imm, Tmp |
| ResCond, Tmp, Tmp |
| x86:ResCond, Addr, Tmp |
| |
| x86: BranchMul32 U:G:32, U:G:32, UZD:G:32 /branch |
| ResCond, Tmp, Tmp |
| ResCond, Addr, Tmp |
| |
| x86: BranchMul32 U:G:32, U:G:32, U:G:32, ZD:G:32 /branch |
| ResCond, Tmp, Imm, Tmp |
| |
| arm64: BranchMul32 U:G:32, U:G:32, U:G:32, S:G:32, S:G:32, ZD:G:32 /branch |
| ResCond, Tmp, Tmp, Tmp, Tmp, Tmp |
| |
| x86_64: BranchMul64 U:G:32, U:G:64, UZD:G:64 /branch |
| ResCond, Tmp, Tmp |
| |
| arm64: BranchMul64 U:G:32, U:G:64, U:G:64, S:G:64, S:G:64, ZD:G:64 /branch |
| ResCond, Tmp, Tmp, Tmp, Tmp, Tmp |
| |
| BranchSub32 U:G:32, U:G:32, UZD:G:32 /branch |
| ResCond, Tmp, Tmp |
| ResCond, Imm, Tmp |
| x86: ResCond, Imm, Addr |
| x86: ResCond, Tmp, Addr |
| x86: ResCond, Addr, Tmp |
| |
| 64: BranchSub64 U:G:32, U:G:64, UD:G:64 /branch |
| ResCond, Imm, Tmp |
| ResCond, Tmp, Tmp |
| |
| BranchNeg32 U:G:32, UZD:G:32 /branch |
| ResCond, Tmp |
| |
| 64: BranchNeg64 U:G:32, UZD:G:64 /branch |
| ResCond, Tmp |
| |
| MoveConditionally32 U:G:32, U:G:32, U:G:32, U:G:Ptr, UD:G:Ptr |
| RelCond, Tmp, Tmp, Tmp, Tmp |
| |
| MoveConditionally32 U:G:32, U:G:32, U:G:32, U:G:Ptr, U:G:Ptr, D:G:Ptr |
| RelCond, Tmp, Tmp, Tmp, Tmp, Tmp |
| RelCond, Tmp, Imm, Tmp, Tmp, Tmp |
| |
| 64: MoveConditionally64 U:G:32, U:G:64, U:G:64, U:G:Ptr, UD:G:Ptr |
| RelCond, Tmp, Tmp, Tmp, Tmp |
| |
| 64: MoveConditionally64 U:G:32, U:G:64, U:G:64, U:G:Ptr, U:G:Ptr, D:G:Ptr |
| RelCond, Tmp, Tmp, Tmp, Tmp, Tmp |
| RelCond, Tmp, Imm, Tmp, Tmp, Tmp |
| |
| MoveConditionallyTest32 U:G:32, U:G:32, U:G:32, U:G:Ptr, UD:G:Ptr |
| ResCond, Tmp, Tmp, Tmp, Tmp |
| x86: ResCond, Tmp, Imm, Tmp, Tmp |
| |
| MoveConditionallyTest32 U:G:32, U:G:32, U:G:32, U:G:Ptr, U:G:Ptr, D:G:Ptr |
| ResCond, Tmp, Tmp, Tmp, Tmp, Tmp |
| ResCond, Tmp, BitImm, Tmp, Tmp, Tmp |
| |
| 64: MoveConditionallyTest64 U:G:32, U:G:64, U:G:64, U:G:Ptr, UD:G:Ptr |
| ResCond, Tmp, Tmp, Tmp, Tmp |
| x86: ResCond, Tmp, Imm, Tmp, Tmp |
| |
| 64: MoveConditionallyTest64 U:G:32, U:G:32, U:G:32, U:G:Ptr, U:G:Ptr, D:G:Ptr |
| ResCond, Tmp, Tmp, Tmp, Tmp, Tmp |
| x86_64: ResCond, Tmp, Imm, Tmp, Tmp, Tmp |
| |
| MoveConditionallyDouble U:G:32, U:F:64, U:F:64, U:G:Ptr, U:G:Ptr, D:G:Ptr |
| DoubleCond, Tmp, Tmp, Tmp, Tmp, Tmp |
| |
| MoveConditionallyDouble U:G:32, U:F:64, U:F:64, U:G:Ptr, UD:G:Ptr |
| DoubleCond, Tmp, Tmp, Tmp, Tmp |
| |
| MoveConditionallyFloat U:G:32, U:F:32, U:F:32, U:G:Ptr, U:G:Ptr, D:G:Ptr |
| DoubleCond, Tmp, Tmp, Tmp, Tmp, Tmp |
| |
| MoveConditionallyFloat U:G:32, U:F:32, U:F:32, U:G:Ptr, UD:G:Ptr |
| DoubleCond, Tmp, Tmp, Tmp, Tmp |
| |
| MoveDoubleConditionally32 U:G:32, U:G:32, U:G:32, U:F:64, U:F:64, D:F:64 |
| RelCond, Tmp, Tmp, Tmp, Tmp, Tmp |
| RelCond, Tmp, Imm, Tmp, Tmp, Tmp |
| x86: RelCond, Addr, Imm, Tmp, Tmp, Tmp |
| x86: RelCond, Tmp, Addr, Tmp, Tmp, Tmp |
| x86: RelCond, Addr, Tmp, Tmp, Tmp, Tmp |
| x86: RelCond, Index, Imm, Tmp, Tmp, Tmp |
| |
| 64: MoveDoubleConditionally64 U:G:32, U:G:64, U:G:64, U:F:64, U:F:64, D:F:64 |
| RelCond, Tmp, Tmp, Tmp, Tmp, Tmp |
| RelCond, Tmp, Imm, Tmp, Tmp, Tmp |
| x86_64: RelCond, Tmp, Addr, Tmp, Tmp, Tmp |
| x86_64: RelCond, Addr, Tmp, Tmp, Tmp, Tmp |
| x86_64: RelCond, Addr, Imm, Tmp, Tmp, Tmp |
| x86_64: RelCond, Index, Tmp, Tmp, Tmp, Tmp |
| |
| MoveDoubleConditionallyTest32 U:G:32, U:G:32, U:G:32, U:F:64, U:F:64, D:F:64 |
| ResCond, Tmp, Tmp, Tmp, Tmp, Tmp |
| ResCond, Tmp, BitImm, Tmp, Tmp, Tmp |
| x86: ResCond, Addr, Imm, Tmp, Tmp, Tmp |
| x86: ResCond, Index, Imm, Tmp, Tmp, Tmp |
| |
| # Warning: forms that take an immediate will sign-extend their immediate. You probably want |
| # MoveDoubleConditionallyTest32 in most cases where you use an immediate. |
| 64: MoveDoubleConditionallyTest64 U:G:32, U:G:64, U:G:64, U:F:64, U:F:64, D:F:64 |
| ResCond, Tmp, Tmp, Tmp, Tmp, Tmp |
| x86_64: ResCond, Tmp, Imm, Tmp, Tmp, Tmp |
| x86_64: ResCond, Addr, Imm, Tmp, Tmp, Tmp |
| x86_64: ResCond, Addr, Tmp, Tmp, Tmp, Tmp |
| x86_64: ResCond, Index, Imm, Tmp, Tmp, Tmp |
| |
| MoveDoubleConditionallyDouble U:G:32, U:F:64, U:F:64, U:F:64, U:F:64, D:F:64 |
| DoubleCond, Tmp, Tmp, Tmp, Tmp, Tmp |
| |
| MoveDoubleConditionallyFloat U:G:32, U:F:32, U:F:32, U:F:64, U:F:64, D:F:64 |
| DoubleCond, Tmp, Tmp, Tmp, Tmp, Tmp |
| |
| MemoryFence /effects |
| StoreFence /effects |
| LoadFence /effects |
| |
| Jump /branch |
| |
| RetVoid /return |
| |
| Ret32 U:G:32 /return |
| Tmp |
| |
| 64: Ret64 U:G:64 /return |
| Tmp |
| |
| RetFloat U:F:32 /return |
| Tmp |
| |
| RetDouble U:F:64 /return |
| Tmp |
| |
| Oops /terminal |
| |
| # This is a terminal but we express it as a Custom because we don't want it to have a code |
| # generator. |
| custom EntrySwitch |
| |
| # A Shuffle is a multi-source, multi-destination move. It simultaneously does multiple moves at once. |
| # The moves are specified as triplets of src, dst, and width. For example you can request a swap this |
| # way: |
| # Shuffle %tmp1, %tmp2, 64, %tmp2, %tmp1, 64 |
| custom Shuffle |
| |
| # Air allows for exotic behavior. A Patch's behavior is determined entirely by the Special operand, |
| # which must be the first operand. |
| custom Patch |
| |
| # Instructions used for lowering C calls. These don't make it to Air generation. They get lowered to |
| # something else first. The origin Value must be a CCallValue. |
| custom CCall |
| custom ColdCCall |
| |
| # This is a special wasm opcode that branches to a trap handler. This uses the generator located to Air::Code |
| # to produce the side-exit code. |
| custom WasmBoundsCheck |
| |